ngx-kit 4.0.0 → 5.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,150 +1,29 @@
1
1
  import * as _angular_core from '@angular/core';
2
- import { Type, TemplateRef, OnInit, AfterContentInit, ElementRef, EventEmitter, QueryList, InjectionToken, EnvironmentProviders, InputSignal } from '@angular/core';
2
+ import { InputSignal, Type, TemplateRef, InjectionToken, EnvironmentProviders, OnInit, AfterContentInit } from '@angular/core';
3
+ import * as ngx_kit_shared from 'ngx-kit/shared';
3
4
  import * as ngx_kit_data_table from 'ngx-kit/data-table';
4
5
 
5
- interface PageEvent {
6
- page: number;
7
- pageSize: number;
8
- }
9
-
10
- declare class NgxPagination {
11
- protected readonly config: ngx_kit_data_table.NgxPaginationOptions;
12
- readonly total: _angular_core.InputSignal<number>;
13
- readonly page: _angular_core.ModelSignal<number>;
14
- readonly pageSize: _angular_core.ModelSignal<number>;
15
- readonly pageSizeOptions: _angular_core.InputSignal<number[]>;
16
- readonly labels: _angular_core.InputSignal<ngx_kit_data_table.PaginationLabel>;
17
- readonly siblingCount: _angular_core.InputSignal<number>;
18
- readonly boundaryCount: _angular_core.InputSignal<number>;
19
- readonly paginate: _angular_core.OutputEmitterRef<PageEvent>;
20
- readonly totalPages: _angular_core.Signal<number>;
21
- readonly firstItem: _angular_core.Signal<number>;
22
- readonly lastItem: _angular_core.Signal<number>;
23
- readonly pages: _angular_core.Signal<(string | number)[]>;
24
- constructor();
25
- private buildPages;
26
- next(): void;
27
- previous(): void;
28
- first(): void;
29
- last(): void;
30
- goto(page: number): void;
31
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<NgxPagination, never>;
32
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<NgxPagination, "ngx-pagination", never, { "total": { "alias": "total"; "required": true; "isSignal": true; }; "page": { "alias": "page"; "required": false; "isSignal": true; }; "pageSize": { "alias": "pageSize"; "required": false; "isSignal": true; }; "pageSizeOptions": { "alias": "pageSizeOptions"; "required": false; "isSignal": true; }; "labels": { "alias": "labels"; "required": false; "isSignal": true; }; "siblingCount": { "alias": "siblingCount"; "required": false; "isSignal": true; }; "boundaryCount": { "alias": "boundaryCount"; "required": false; "isSignal": true; }; }, { "page": "pageChange"; "pageSize": "pageSizeChange"; "paginate": "paginate"; }, never, never, true, never>;
33
- }
34
-
35
- type TableRendererRegistry = Readonly<Record<string, Type<unknown>>>;
36
- type TableCellFormatter = (value: unknown, row: object, field: FieldsType<object>) => unknown;
37
- interface NgxTableOptions {
38
- showRecordNumber?: boolean;
39
- labels: TableLable;
40
- /** Enable multi-column sort by default (Ctrl/Shift + click) unless a table overrides it. */
41
- multiSort?: boolean;
42
- resizable?: boolean;
43
- stripedRows?: boolean;
44
- hoverable?: boolean;
45
- stickyHeader?: boolean;
46
- renderers?: TableRendererRegistry;
47
- formatters?: Readonly<Record<string, TableCellFormatter>>;
48
- }
49
- interface TableLable {
50
- operation?: string;
51
- noData?: string;
52
- loading?: string;
53
- }
54
-
55
- declare class FieldsType<T extends Object> {
56
- title: string;
57
- column: Extract<keyof T, string>;
58
- dataType?: 'text' | 'image' | 'profilePicture' | 'date' | 'time' | 'dateTime' | 'yesNo' | 'boolean' | 'number' | 'localize' | 'template' | 'enum' | 'html' | 'userAgent' | undefined;
59
- width?: number;
60
- wrap?: boolean;
61
- prefix?: string;
62
- /**
63
- * نام renderer ثبت‌شده در provideTable
64
- */
65
- renderer?: string;
66
- /**
67
- * ورودی‌های اضافه برای renderer
68
- */
69
- rendererInputs?: Record<string, unknown>;
70
- /**
71
- * نام formatter سراسری یا تابع اختصاصی
72
- */
73
- formatter?: string | TableCellFormatter;
74
- }
75
- declare class SortEvent {
76
- field: string;
77
- direction: 'asc' | 'desc';
78
- }
79
-
80
- declare class TableCellDirective {
81
- readonly column: _angular_core.InputSignal<string>;
82
- readonly template: TemplateRef<any>;
83
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<TableCellDirective, never>;
84
- static ɵdir: _angular_core.ɵɵDirectiveDeclaration<TableCellDirective, "ng-template[ngxTableCell]", never, { "column": { "alias": "ngxTableCell"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
85
- }
86
-
87
6
  type SortDirection = 'asc' | 'desc';
88
7
  interface SortMeta<T> {
89
8
  field: Extract<keyof T, string>;
90
9
  direction: SortDirection;
91
10
  }
11
+
12
+ interface PageEvent {
13
+ page: number;
14
+ pageSize: number;
15
+ }
92
16
  interface PageState {
93
17
  pageIndex: number;
94
18
  pageSize: number;
95
- /** Zero-based offset of the first row on the current page (pageIndex * pageSize). */
19
+ /** آفست صفر-پایه‌ی اولین ردیف صفحه‌ی جاری. */
96
20
  first: number;
97
21
  }
98
- /** Emitted by the table whenever the server needs to (re)fetch a page in lazy mode. */
22
+ /** هر بار سرور باید صفحه‌ی جدید را (در حالت lazy) واکشی کند، امیت می‌شود. */
99
23
  interface LazyLoadEvent<T> extends PageState {
100
24
  sorts: SortMeta<T>[];
101
25
  }
102
26
 
103
- declare class NgxTable<T extends object> implements OnInit, AfterContentInit {
104
- protected readonly config: ngx_kit_data_table.NgxTableOptions;
105
- protected readonly paginationConfig: ngx_kit_data_table.NgxPaginationOptions;
106
- readonly fields: _angular_core.InputSignal<FieldsType<T>[]>;
107
- readonly data: _angular_core.InputSignal<T[]>;
108
- readonly totalRecords: _angular_core.InputSignal<number>;
109
- readonly showRecordNumber: _angular_core.InputSignal<boolean | undefined>;
110
- list: _angular_core.WritableSignal<readonly T[]>;
111
- readonly operations: _angular_core.InputSignal<TemplateRef<any> | undefined>;
112
- readonly operationWidth: _angular_core.InputSignal<number>;
113
- readonly numWidth: _angular_core.InputSignal<number>;
114
- readonly pageSize: _angular_core.InputSignal<number>;
115
- readonly loading: _angular_core.InputSignal<boolean>;
116
- readonly multiSort: _angular_core.InputSignal<boolean | undefined>;
117
- readonly lazy: _angular_core.InputSignal<boolean>;
118
- readonly lazyLoad: _angular_core.OutputEmitterRef<LazyLoadEvent<T>>;
119
- sortField: string;
120
- sortDirection: 'asc' | 'desc';
121
- tableContainer: _angular_core.Signal<ElementRef<HTMLDivElement> | undefined>;
122
- sortChange: EventEmitter<SortEvent>;
123
- cellTemplates: QueryList<TableCellDirective>;
124
- templateMap: Map<string, TemplateRef<any>>;
125
- page: number;
126
- constructor();
127
- ngOnInit(): void;
128
- ngAfterContentInit(): void;
129
- private loadClientPage;
130
- onSortChange(item: FieldsType<T>): void;
131
- protected getTemplate(column: Extract<keyof T, string>): TemplateRef<unknown> | null;
132
- sortList(): void;
133
- getRecordNumber(item: T): any;
134
- onPageChange(event: PageEvent): void;
135
- /**
136
- * اگر بدنه جدول اسکرول شد هدر جدول نیز منطبق شود
137
- */
138
- private adjustScroll;
139
- protected getRenderer(field: FieldsType<T>): Type<unknown> | null;
140
- protected getCellValue(row: T, field: FieldsType<T>): unknown;
141
- protected formatCellValue(row: T, field: FieldsType<T>): string;
142
- private stringify;
143
- protected getRendererInputs(row: T, field: FieldsType<T>): Record<string, unknown>;
144
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<NgxTable<any>, never>;
145
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<NgxTable<any>, "ngx-table", never, { "fields": { "alias": "fields"; "required": true; "isSignal": true; }; "data": { "alias": "data"; "required": true; "isSignal": true; }; "totalRecords": { "alias": "totalRecords"; "required": true; "isSignal": true; }; "showRecordNumber": { "alias": "showRecordNumber"; "required": false; "isSignal": true; }; "operations": { "alias": "operations"; "required": false; "isSignal": true; }; "operationWidth": { "alias": "operationWidth"; "required": false; "isSignal": true; }; "numWidth": { "alias": "numWidth"; "required": false; "isSignal": true; }; "pageSize": { "alias": "pageSize"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "multiSort": { "alias": "multiSort"; "required": false; "isSignal": true; }; "lazy": { "alias": "lazy"; "required": false; "isSignal": true; }; }, { "lazyLoad": "lazyLoad"; "sortChange": "sortChange"; }, ["cellTemplates"], never, true, never>;
146
- }
147
-
148
27
  interface PaginationLabel {
149
28
  first: string;
150
29
  last: string;
@@ -154,39 +33,302 @@ interface PaginationLabel {
154
33
  to: string;
155
34
  of: string;
156
35
  results: string;
157
- perPage: string;
158
36
  pageSize: string;
159
37
  }
160
-
161
38
  interface NgxPaginationOptions {
162
39
  labels: PaginationLabel;
163
40
  pageSizeOptions: number[];
164
41
  defaultPageSize: number;
165
42
  }
166
43
 
167
- declare const NGX_PAGINATION_CONFIG: InjectionToken<NgxPaginationOptions>;
168
- declare const NGX_PAGINATION_CONFIG_DEFAULT: NgxPaginationOptions;
44
+ interface CellRendererComponent<TValue = unknown, TRow extends object = object> {
45
+ value: InputSignal<TValue>;
46
+ row: InputSignal<TRow>;
47
+ field: InputSignal<TableFieldBase<TRow>>;
48
+ }
49
+ type RendererRegistry = Readonly<Record<string, Type<CellRendererComponent<any, any>>>>;
50
+ /**
51
+ * Identity helper: یک رجیستری رندرر را با inference کامل تعریف می‌کند.
52
+ * همین آبجکت باید هم در provideTable({ renderers }) و هم در defineFields(renderers, ...)
53
+ * استفاده شود تا کلیدها (و ورودی‌های اضافه‌ی هر رندرر) در کل پروژه type-check شوند.
54
+ */
55
+ declare function defineRenderers<R extends RendererRegistry>(registry: R): R;
56
+ type InstanceOf<C> = C extends Type<infer I> ? I : never;
57
+ type UnwrapSignal<S> = S extends () => infer V ? V : never;
58
+ type RendererExtraInputs<C extends Type<any>> = {
59
+ [K in keyof InstanceOf<C> as K extends 'value' | 'row' | 'field' ? never : InstanceOf<C>[K] extends () => any ? K : never]?: UnwrapSignal<InstanceOf<C>[K]>;
60
+ };
61
+ type ColumnAlign = 'start' | 'center' | 'end';
62
+ type TableCellFormatter<T extends object = object> = (value: unknown, row: T, field: TableFieldBase<T>) => unknown;
63
+ interface CellTemplateContext<T extends object> {
64
+ $implicit: T;
65
+ row: T;
66
+ value: unknown;
67
+ rowIndex: number;
68
+ field: TableFieldBase<T>;
69
+ }
70
+ /** شکل پایه‌ای مشترک بین همه‌ی ستون‌ها، صرف‌نظر از این‌که renderer دارند یا نه. */
71
+ interface TableFieldBase<T extends object> {
72
+ column: Extract<keyof T, string>;
73
+ title: string;
74
+ width?: number;
75
+ minWidth?: number;
76
+ maxWidth?: number;
77
+ resizable?: boolean;
78
+ sortable?: boolean;
79
+ wrap?: boolean;
80
+ align?: ColumnAlign;
81
+ prefix?: string;
82
+ formatter?: string | TableCellFormatter<T>;
83
+ }
84
+ /** ستون بدون renderer (متن ساده / formatter / cellTemplate دستی). */
85
+ interface PlainTableField<T extends object> extends TableFieldBase<T> {
86
+ renderer?: undefined;
87
+ rendererInputs?: undefined;
88
+ cellTemplate?: TemplateRef<CellTemplateContext<T>>;
89
+ }
90
+ /** ستونی که یک renderer از رجیستری R انتخاب کرده؛ rendererInputs دقیقاً همان
91
+ * ورودی‌های اضافه‌ی همان renderer است — نه یک Record<string, unknown> آزاد. */
92
+ type RenderedTableField<T extends object, R extends RendererRegistry> = {
93
+ [K in keyof R]: TableFieldBase<T> & {
94
+ renderer: K;
95
+ rendererInputs?: RendererExtraInputs<R[K]>;
96
+ cellTemplate?: undefined;
97
+ };
98
+ }[keyof R];
99
+ type TableField<T extends object, R extends RendererRegistry = {}> = PlainTableField<T> | RenderedTableField<T, R>;
100
+ /**
101
+ * Identity helper برای تعریف ستون‌های یک جدول با inference و type-check کامل
102
+ * نسبت به هم مدل داده (T) و هم رجیستری رندررها (R).
103
+ *
104
+ * @example
105
+ * const renderers = defineRenderers({ avatar: AvatarCellRenderer, boolean: BooleanCellRenderer });
106
+ *
107
+ * const fields = defineFields<Tenant, typeof renderers>(renderers, [
108
+ * { column: 'avatarUrl', title: 'کاربر', renderer: 'avatar', rendererInputs: { showName: true } }, // ✅
109
+ * { column: 'avatarUrl', title: 'کاربر', renderer: 'avatar', rendererInputs: { showName: 'x' } }, // ❌ باید boolean باشد
110
+ * { column: 'isActive', title: 'فعال', renderer: 'bool' }, // ❌ کلید رجیستری نیست
111
+ * { column: 'ageXYZ', title: '...' }, // ❌ فیلد Tenant نیست
112
+ * ]);
113
+ */
114
+ declare function defineFields<T extends object, R extends RendererRegistry = {}>(_renderers: R, fields: TableField<T, R>[]): TableField<T, R>[];
169
115
 
170
- /** Injected into every ngx-table instance. Populate via provideTable(). */
171
- declare const NGX_TABLE_CONFIG: InjectionToken<NgxTableOptions>;
172
- declare const NGX_TABLE_CONFIG_DEFAULT: NgxTableOptions;
116
+ interface TableLabels {
117
+ operation?: string;
118
+ noData?: string;
119
+ loading?: string;
120
+ }
121
+ interface ColumnSizingConfig {
122
+ /** حداقل عرض (px) که برای همه‌ی ستون‌های resizable اعمال می‌شود مگر این‌که ستون خودش override کند. */
123
+ minWidth: number;
124
+ /** حداکثر عرض (px). */
125
+ maxWidth: number;
126
+ /** عرض پیش‌فرض وقتی ستون width مشخص نکرده و کاربر هم دستی ریسایز نکرده. */
127
+ defaultWidth: number;
128
+ }
129
+ interface NgxTableOptions {
130
+ showRecordNumber?: boolean;
131
+ labels?: TableLabels;
132
+ /** فعال‌سازی سورت چندستونه با Ctrl/Shift+Click. */
133
+ multiSort?: boolean;
134
+ resizable?: boolean;
135
+ stripedRows?: boolean;
136
+ hoverable?: boolean;
137
+ stickyHeader?: boolean;
138
+ column?: ColumnSizingConfig;
139
+ /** رجیستری رندررهای سراسری. با defineRenderers({...}) بسازید. */
140
+ renderers?: RendererRegistry;
141
+ formatters?: Readonly<Record<string, TableCellFormatter<any>>>;
142
+ }
143
+ type ResolvedTableOptions = Required<Omit<NgxTableOptions, 'labels' | 'renderers' | 'formatters'>> & {
144
+ labels: Required<TableLabels>;
145
+ renderers: RendererRegistry;
146
+ formatters: Readonly<Record<string, TableCellFormatter<any>>>;
147
+ };
173
148
 
174
- declare function providePagination(options?: NgxPaginationOptions): EnvironmentProviders;
149
+ declare const NGX_TABLE_CONFIG_DEFAULT: ResolvedTableOptions;
150
+ /** به هر نمونه‌ی ngx-table تزریق می‌شود. با provideTable() مقداردهی کنید. */
151
+ declare const NGX_TABLE_CONFIG: InjectionToken<ResolvedTableOptions>;
175
152
 
153
+ declare const NGX_PAGINATION_CONFIG_DEFAULT: NgxPaginationOptions;
154
+ declare const NGX_PAGINATION_CONFIG: InjectionToken<NgxPaginationOptions>;
155
+
156
+ /**
157
+ * کانفیگ سراسری <ngx-table>: جهت پیش‌فرض، حداقل/حداکثر عرض ستون، فعال بودن
158
+ * پیش‌فرض سورت چندستونه، و از همه مهم‌تر رجیستری رندررها.
159
+ *
160
+ * @example
161
+ * provideTable({
162
+ * renderers: defineRenderers({ avatar: AvatarCellRenderer, boolean: BooleanCellRenderer }),
163
+ * column: { minWidth: 80, maxWidth: 480, defaultWidth: 160 },
164
+ * })
165
+ */
176
166
  declare function provideTable(options?: NgxTableOptions): EnvironmentProviders;
177
167
 
168
+ declare function providePagination(options?: Partial<NgxPaginationOptions>): EnvironmentProviders;
169
+
170
+ /**
171
+ * برای projection قالب سفارشی یک ستون بدون این‌که مجبور باشید cellTemplate را
172
+ * از طریق ViewChild به آبجکت ستون وصل کنید:
173
+ *
174
+ * <ngx-table [fields]="fields" [data]="rows()">
175
+ * <ng-template ngxTableCell="userName" let-row let-value="value">
176
+ * <strong>{{ value }}</strong>
177
+ * </ng-template>
178
+ * </ngx-table>
179
+ *
180
+ * مهم: چون این دایرکتیو در تمپلیت *کامپوننت مصرف‌کننده* (نه ngx-table) استفاده
181
+ * می‌شود، باید آن را در آرایه‌ی imports همان کامپوننت (standalone) وارد کنید:
182
+ * imports: [NgxTable, TableCell]
183
+ *
184
+ * محدودیت شناخته‌شده: context این تمپلیت (row/value) از نوع T دقیق نیست
185
+ * (چون TemplateRef اینجا به‌صورت پویا از ContentChildren جمع‌آوری می‌شود و
186
+ * اطلاعات جنریک T در آن نقطه از بین می‌رود). برای type-safety کامل روی
187
+ * row/value، از field.cellTemplate به همراه @ViewChild استفاده کنید (به README
188
+ * بخش «Cell Template کاملاً Type-Safe» مراجعه کنید).
189
+ */
190
+ declare class TableCell<T extends object = object> {
191
+ readonly column: _angular_core.InputSignal<string>;
192
+ readonly templateRef: TemplateRef<any>;
193
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<TableCell<any>, never>;
194
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<TableCell<any>, "ng-template[ngxTableCell]", never, { "column": { "alias": "ngxTableCell"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
195
+ }
196
+
178
197
  /**
179
- * used in render implements
198
+ * دستگیره‌ی درگ برای ریسایز ستون. روی لبه‌ی «انتهای منطقی» (inline-end) قرار
199
+ * می‌گیرد، یعنی خودش زیر [dir="rtl"] جابه‌جا می‌شود؛ فقط جهت محاسبه‌ی دلتا هم
200
+ * برعکس می‌شود تا حس درگ همیشه طبیعی باشد.
201
+ *
202
+ * مقدار نهایی توسط جدول در یک Map از عرض‌ها ذخیره می‌شود (نه در استایل مستقیم
203
+ * ستون)، به همراه علامت‌گذاری «دستی ریسایز شده» — یعنی بعد از این، هیچ
204
+ * re-render یا تغییر داده‌ای این عرض را از بین نمی‌برد.
180
205
  */
181
- interface TableCellRendererComponent<TValue = unknown, TRow extends object = object> {
182
- value: TValue | InputSignal<TValue>;
183
- row: TRow | InputSignal<TRow>;
184
- field: FieldsType<TRow> | InputSignal<FieldsType<TRow>>;
206
+ declare class ColumnResize {
207
+ readonly startWidth: _angular_core.InputSignal<number>;
208
+ readonly minWidth: _angular_core.InputSignal<number>;
209
+ readonly maxWidth: _angular_core.InputSignal<number>;
210
+ readonly direction: _angular_core.InputSignal<"ltr" | "rtl">;
211
+ readonly resizing: _angular_core.OutputEmitterRef<number>;
212
+ readonly resizeEnd: _angular_core.OutputEmitterRef<number>;
213
+ private dragging;
214
+ private startX;
215
+ private baseWidth;
216
+ onPointerDown(event: PointerEvent): void;
217
+ onPointerMove(event: PointerEvent): void;
218
+ onPointerUp(event: PointerEvent): void;
219
+ private computeWidth;
220
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ColumnResize, never>;
221
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<ColumnResize, "[ngxColumnResize]", never, { "startWidth": { "alias": "ngxColumnResizeWidth"; "required": true; "isSignal": true; }; "minWidth": { "alias": "ngxColumnResizeMin"; "required": false; "isSignal": true; }; "maxWidth": { "alias": "ngxColumnResizeMax"; "required": false; "isSignal": true; }; "direction": { "alias": "ngxColumnResizeDir"; "required": false; "isSignal": true; }; }, { "resizing": "resizing"; "resizeEnd": "resizeEnd"; }, never, never, true, never>;
185
222
  }
223
+
186
224
  /**
187
- * used in registry
225
+ * جدول داده‌ی جنریک و Type-Safe.
226
+ *
227
+ * `T` از روی چیزی که به [data] بایند می‌کنید استنتاج می‌شود؛ `field.column` در
228
+ * `TableField<T, R>` محدود به `keyof T` است، و اگر از defineFields(renderers, ...)
229
+ * استفاده کنید، `field.renderer` محدود به کلیدهای رجیستری و `rendererInputs`
230
+ * دقیقاً همان ورودی‌های اضافه‌ی همان renderer است.
231
+ *
232
+ * دو حالت:
233
+ * - کلاینت‌ساید (پیش‌فرض): [data] کل آرایه است؛ سورت/صفحه‌بندی داخلی و روی
234
+ * یک computed خالص انجام می‌شود (بدون mutation روی آبجکت‌های شما).
235
+ * - lazy: [lazy]="true" + [totalRecords]؛ [data] فقط صفحه‌ی جاری است؛ به
236
+ * (lazyLoad) گوش بدهید.
188
237
  */
189
- type TableCellRendererType<TValue = unknown, TRow extends object = object> = Type<TableCellRendererComponent<TValue, TRow>>;
238
+ declare class NgxTable<T extends object> implements OnInit, AfterContentInit {
239
+ protected readonly config: ngx_kit_data_table.ResolvedTableOptions;
240
+ protected readonly paginationConfig: ngx_kit_data_table.NgxPaginationOptions;
241
+ readonly fields: _angular_core.InputSignal<TableField<T, any>[]>;
242
+ readonly data: _angular_core.InputSignal<readonly T[]>;
243
+ readonly totalRecords: _angular_core.InputSignal<number>;
244
+ readonly showRecordNumber: _angular_core.InputSignal<boolean>;
245
+ readonly operations: _angular_core.InputSignal<TemplateRef<{
246
+ $implicit: T;
247
+ }> | undefined>;
248
+ readonly operationWidth: _angular_core.InputSignal<number>;
249
+ readonly numWidth: _angular_core.InputSignal<number>;
250
+ readonly pageSize: _angular_core.InputSignal<number>;
251
+ readonly loading: _angular_core.InputSignal<boolean>;
252
+ readonly multiSort: _angular_core.InputSignal<boolean | undefined>;
253
+ readonly lazy: _angular_core.InputSignal<boolean>;
254
+ /** پیش‌فرض بر اساس ایندکس؛ برای جلوگیری از گم‌شدن state سطرها هنگام سورت،
255
+ * یک شناسه‌ی یکتا بدهید: [trackBy]="(i, row) => row.id" */
256
+ readonly trackBy: _angular_core.InputSignal<(index: number, row: T) => unknown>;
257
+ readonly lazyLoad: _angular_core.OutputEmitterRef<LazyLoadEvent<T>>;
258
+ readonly sortChange: _angular_core.OutputEmitterRef<SortMeta<T>[]>;
259
+ readonly columnResize: _angular_core.OutputEmitterRef<{
260
+ field: string;
261
+ width: number;
262
+ }>;
263
+ protected readonly page: _angular_core.WritableSignal<number>;
264
+ protected readonly pageSizeS: _angular_core.WritableSignal<number>;
265
+ protected readonly sorts: _angular_core.WritableSignal<SortMeta<T>[]>;
266
+ protected readonly widths: _angular_core.WritableSignal<Record<string, number>>;
267
+ private readonly manuallyResized;
268
+ private readonly rendererInputsCache;
269
+ private cellTemplates;
270
+ private templateMap;
271
+ protected readonly resolvedMultiSort: _angular_core.Signal<boolean>;
272
+ private readonly directionService;
273
+ protected readonly resolvedDirection: _angular_core.Signal<ngx_kit_shared.Direction>;
274
+ constructor();
275
+ ngOnInit(): void;
276
+ ngAfterContentInit(): void;
277
+ private syncTemplateMap;
278
+ protected readonly sortedData: _angular_core.Signal<readonly T[]>;
279
+ protected readonly totalCount: _angular_core.Signal<number>;
280
+ protected readonly pagedData: _angular_core.Signal<readonly T[]>;
281
+ private compare;
282
+ /** بدون mutation روی داده‌ی ورودی: شماره‌ی ردیف صرفاً از روی page/pageSize/rowIndex محاسبه می‌شود. */
283
+ protected recordNumber(rowIndex: number): number;
284
+ protected sortDirectionFor(column: string): SortDirection | null;
285
+ protected onHeaderClick(field: TableField<T, any>, event: MouseEvent): void;
286
+ protected onPaginate(event: PageEvent): void;
287
+ private emitLazyIfNeeded;
288
+ protected columnWidth(column: string): number;
289
+ protected columnMin(field: TableField<T, any>): number;
290
+ protected columnMax(field: TableField<T, any>): number;
291
+ protected isResizable(field: TableField<T, any>): boolean;
292
+ protected onColumnResizing(column: string, width: number): void;
293
+ protected onColumnResizeEnd(column: string, width: number): void;
294
+ protected getTemplate(column: string): TemplateRef<CellTemplateContext<T>> | null;
295
+ protected getRenderer(field: TableField<T, any>): Type<CellRendererComponent> | null;
296
+ protected getCellValue(row: T, field: TableField<T, any>): unknown;
297
+ protected formatCellValue(row: T, field: TableField<T, any>): string;
298
+ private stringify;
299
+ /** ورودی‌های renderer را به‌ازای هر (field, row) کش می‌کند تا هر Change
300
+ * Detection یک آبجکت جدید ساخته نشود؛ با WeakMap، وقتی row از حافظه خارج
301
+ * شود (مثلاً بعد از عوض‌شدن صفحه)، entry آن هم خودکار پاک می‌شود. */
302
+ protected getRendererInputs(row: T, field: TableField<T, any>): Record<string, unknown>;
303
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NgxTable<any>, never>;
304
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<NgxTable<any>, "ngx-table", never, { "fields": { "alias": "fields"; "required": true; "isSignal": true; }; "data": { "alias": "data"; "required": true; "isSignal": true; }; "totalRecords": { "alias": "totalRecords"; "required": true; "isSignal": true; }; "showRecordNumber": { "alias": "showRecordNumber"; "required": false; "isSignal": true; }; "operations": { "alias": "operations"; "required": false; "isSignal": true; }; "operationWidth": { "alias": "operationWidth"; "required": false; "isSignal": true; }; "numWidth": { "alias": "numWidth"; "required": false; "isSignal": true; }; "pageSize": { "alias": "pageSize"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "multiSort": { "alias": "multiSort"; "required": false; "isSignal": true; }; "lazy": { "alias": "lazy"; "required": false; "isSignal": true; }; "trackBy": { "alias": "trackBy"; "required": false; "isSignal": true; }; }, { "lazyLoad": "lazyLoad"; "sortChange": "sortChange"; "columnResize": "columnResize"; }, ["cellTemplates"], never, true, never>;
305
+ }
306
+
307
+ declare class NgxPagination {
308
+ protected readonly config: ngx_kit_data_table.NgxPaginationOptions;
309
+ readonly total: _angular_core.InputSignal<number>;
310
+ readonly page: _angular_core.ModelSignal<number>;
311
+ readonly pageSize: _angular_core.ModelSignal<number>;
312
+ readonly pageSizeOptions: _angular_core.InputSignal<number[]>;
313
+ readonly labels: _angular_core.InputSignal<ngx_kit_data_table.PaginationLabel>;
314
+ readonly siblingCount: _angular_core.InputSignal<number>;
315
+ readonly boundaryCount: _angular_core.InputSignal<number>;
316
+ readonly paginate: _angular_core.OutputEmitterRef<PageEvent>;
317
+ protected readonly totalPages: _angular_core.Signal<number>;
318
+ protected readonly firstItem: _angular_core.Signal<number>;
319
+ protected readonly lastItem: _angular_core.Signal<number>;
320
+ protected readonly pages: _angular_core.Signal<(string | number)[]>;
321
+ constructor();
322
+ private buildPages;
323
+ protected next(): void;
324
+ protected previous(): void;
325
+ protected first(): void;
326
+ protected last(): void;
327
+ protected goto(page: number): void;
328
+ protected onPageSizeChange(value: number): void;
329
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NgxPagination, never>;
330
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<NgxPagination, "ngx-pagination", never, { "total": { "alias": "total"; "required": true; "isSignal": true; }; "page": { "alias": "page"; "required": false; "isSignal": true; }; "pageSize": { "alias": "pageSize"; "required": false; "isSignal": true; }; "pageSizeOptions": { "alias": "pageSizeOptions"; "required": false; "isSignal": true; }; "labels": { "alias": "labels"; "required": false; "isSignal": true; }; "siblingCount": { "alias": "siblingCount"; "required": false; "isSignal": true; }; "boundaryCount": { "alias": "boundaryCount"; "required": false; "isSignal": true; }; }, { "page": "pageChange"; "pageSize": "pageSizeChange"; "paginate": "paginate"; }, never, never, true, never>;
331
+ }
190
332
 
191
- export { FieldsType, NGX_PAGINATION_CONFIG, NGX_PAGINATION_CONFIG_DEFAULT, NGX_TABLE_CONFIG, NGX_TABLE_CONFIG_DEFAULT, NgxPagination, NgxTable, SortEvent, providePagination, provideTable };
192
- export type { LazyLoadEvent, NgxPaginationOptions, NgxTableOptions, PageEvent, PageState, PaginationLabel, SortDirection, SortMeta, TableCellFormatter, TableCellRendererComponent, TableCellRendererType, TableLable, TableRendererRegistry };
333
+ export { ColumnResize, NGX_PAGINATION_CONFIG, NGX_PAGINATION_CONFIG_DEFAULT, NGX_TABLE_CONFIG, NGX_TABLE_CONFIG_DEFAULT, NgxPagination, NgxTable, TableCell, defineFields, defineRenderers, providePagination, provideTable };
334
+ export type { CellRendererComponent, CellTemplateContext, ColumnAlign, ColumnSizingConfig, LazyLoadEvent, NgxPaginationOptions, NgxTableOptions, PageEvent, PageState, PaginationLabel, PlainTableField, RenderedTableField, RendererExtraInputs, RendererRegistry, ResolvedTableOptions, SortDirection, SortMeta, TableCellFormatter, TableField, TableFieldBase, TableLabels };
@@ -173,6 +173,7 @@ declare class MSG {
173
173
  static success(title: string, text?: string, options?: IMessageOptions): ngx_kit_message.MessageOutput<any>;
174
174
  static warning(title: string, text?: string, options?: IMessageOptions): ngx_kit_message.MessageOutput<any>;
175
175
  static error(title: string, text?: string, options?: IMessageOptions): ngx_kit_message.MessageOutput<any>;
176
+ static question(title: string, text?: string, options?: IMessageOptions): ngx_kit_message.MessageOutput<any>;
176
177
  static loading(title: string, text?: string, options?: IMessageOptions): ngx_kit_message.MessageOutput<any>;
177
178
  }
178
179
 
@@ -12,6 +12,7 @@ interface NgxNotifyPayload {
12
12
  options: NgxNotifyOptions;
13
13
  onClose: EventEmitter<INotifyEnd>;
14
14
  onFinish: EventEmitter<INotifyEnd>;
15
+ close: () => void;
15
16
  }
16
17
  interface INotifyEnd {
17
18
  id: string;
@@ -129,6 +130,7 @@ declare class NgxNotifyService {
129
130
  configureContainer(position: NgxNotifyOptions['position'], containerClass: string): void;
130
131
  show(message: string, description?: string, type?: NgxNotifyType, options?: NgxNotifyOptions): NgxNotifyPayload;
131
132
  private _createAndShow;
133
+ private close;
132
134
  private removeNode;
133
135
  private removeEl;
134
136
  private _showNextIfPossible;
@@ -176,8 +176,6 @@ declare const WINDOW: InjectionToken<Window | null>;
176
176
 
177
177
  declare function randomStrnig(extraLength?: number, useNumeric?: boolean): string;
178
178
 
179
- declare function IsRtl(doc: Document): boolean;
180
-
181
179
  declare function makeConfetti(doc: Document, wrap: HTMLElement): void;
182
180
 
183
181
  declare class BrowserService {
@@ -189,6 +187,31 @@ declare class BrowserService {
189
187
  static ɵprov: i0.ɵɵInjectableDeclaration<BrowserService>;
190
188
  }
191
189
 
190
+ type Direction = 'ltr' | 'rtl';
191
+ /**
192
+ * جهت صفحه را به‌صورت خودکار و زنده تشخیص می‌دهد — بدون این‌که کاربرِ این
193
+ * سرویس مجبور باشد چیزی به آن بدهد. هر تغییری در attribute های dir/class
194
+ * روی <html> یا <body> (چه از طریق Angular، چه با یک تم‌سوییچر خارج از
195
+ * Angular) بلافاصله signal را آپدیت می‌کند.
196
+ *
197
+ * نکته: effect() اینجا جواب نمی‌دهد چون هیچ‌کدام از این مقادیر (attribute
198
+ * روی DOM) یک Signal نیستند؛ effect فقط به تغییر Signalها reactive است، نه
199
+ * به تغییرات دلخواه DOM. برای گوش‌دادن به تغییرات DOM باید از MutationObserver
200
+ * استفاده کرد و مقدار را دستی داخل یک Signal نوشت (که دقیقاً کاری است که
201
+ * این سرویس انجام می‌دهد).
202
+ */
203
+ declare class DirectionService {
204
+ private readonly doc;
205
+ private readonly destroyRef;
206
+ private readonly _direction;
207
+ /** جهت جاری، به‌صورت Signal فقط-خواندنی. */
208
+ readonly direction: i0.Signal<Direction>;
209
+ readonly isRtl: i0.Signal<boolean>;
210
+ constructor();
211
+ static ɵfac: i0.ɵɵFactoryDeclaration<DirectionService, never>;
212
+ static ɵprov: i0.ɵɵInjectableDeclaration<DirectionService>;
213
+ }
214
+
192
215
  declare class OverlayRef<T> {
193
216
  private readonly dialogEl;
194
217
  private readonly teardownFn;
@@ -236,6 +259,7 @@ declare class OverlayService implements OnDestroy {
236
259
  private resizeRafPending;
237
260
  private readonly doc;
238
261
  private readonly abortController;
262
+ private readonly directionService;
239
263
  ngOnDestroy(): void;
240
264
  open<T>(options: OverlayOptions<T>): OverlayRef<T>;
241
265
  openTemplate(options: TemplateOptions): OverlayRef<any>;
@@ -276,5 +300,5 @@ interface OverlayInstance {
276
300
  cleanup: () => void;
277
301
  }
278
302
 
279
- export { BrowserService, DIALOG_OVERLAY_CLASSNAME, FOCUSABLE_SELECTOR, IsRtl, OverlayRef, OverlayService, RangeSliderComponent, SaturationComponent, SliderComponent, ValueModel, WINDOW, getOffsetPosition, makeConfetti, mergeConfig, randomStrnig };
280
- export type { Alignment, BaseOverlayOptions, IPosition, IValue, OverlayInstance, OverlayOptions, Placement, Point, TemplateOptions };
303
+ export { BrowserService, DIALOG_OVERLAY_CLASSNAME, DirectionService, FOCUSABLE_SELECTOR, OverlayRef, OverlayService, RangeSliderComponent, SaturationComponent, SliderComponent, ValueModel, WINDOW, getOffsetPosition, makeConfetti, mergeConfig, randomStrnig };
304
+ export type { Alignment, BaseOverlayOptions, Direction, IPosition, IValue, OverlayInstance, OverlayOptions, Placement, Point, TemplateOptions };