Files
tehran_taj/apps/api/src/modules/admin-table/table-query.dto.ts
T

105 lines
2.2 KiB
TypeScript

import { Type } from 'class-transformer';
import {
IsArray,
IsIn,
IsInt,
IsOptional,
IsString,
Max,
Min,
ValidateNested,
} from 'class-validator';
/**
* One row of the XTable filter bar.
*
* Mirrors the object legacy's XFilterRow pushed into `query.filters`:
* `{ id, field, op, value, value2? }`. `id` is a client-side react key
* (a random float) and is accepted but ignored.
*/
export class TableFilterDto {
@IsOptional()
id?: number | string;
@IsOptional()
@IsString()
field?: string;
/**
* Legacy operators, kept verbatim. `between` uses value + value2 and is what
* the date-range filter emits.
*/
@IsOptional()
@IsIn(['=', '!=', '>', '>=', '<', '<=', 'like', 'in', 'between', 'null', 'notnull'])
op?: string;
@IsOptional()
value?: unknown;
@IsOptional()
value2?: unknown;
}
/**
* The request body XTable POSTs, ported from its requestData():
*
* { ...query, select, titles, report_title, op? }
*
* where query = { search, filters, total, limit, page }.
*/
export class TableQueryDto {
@IsOptional()
@IsString()
search?: string;
@IsOptional()
@IsArray()
@ValidateNested({ each: true })
@Type(() => TableFilterDto)
filters?: TableFilterDto[];
@IsOptional()
@Type(() => Number)
@IsInt()
@Min(1)
page?: number;
@IsOptional()
@Type(() => Number)
@IsInt()
@Min(1)
@Max(500)
limit?: number;
/** Sort spec: '+field' ascending, '-field' descending (legacy `order`). */
@IsOptional()
@IsString()
order?: string;
/** Columns currently visible; drives the export payload. */
@IsOptional()
@IsArray()
select?: string[];
/** key -> Farsi column heading, used for export headers. */
@IsOptional()
titles?: Record<string, string>;
@IsOptional()
@IsString()
report_title?: string;
/**
* Export mode. Legacy expected `{ url }` back and did `window.open(data.url)`.
* Exports are not implemented yet; the controller rejects these explicitly
* rather than returning a broken url.
*/
@IsOptional()
@IsIn(['excel', 'json', 'print'])
op?: 'excel' | 'json' | 'print';
/** Echoed back inside `query`; the client owns this value. */
@IsOptional()
total?: number;
}