ngx-kit 4.0.0 → 6.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.
Files changed (68) hide show
  1. package/README.md +3 -2
  2. package/angle-selector/README.md +34 -0
  3. package/box-shadow/README.md +33 -0
  4. package/color-picker/README.md +52 -0
  5. package/data-table/README.md +120 -0
  6. package/date-picker/README.md +74 -0
  7. package/dialog/README.md +94 -169
  8. package/drawer-menu/README.md +76 -0
  9. package/dropzone/README.md +59 -0
  10. package/fesm2022/ngx-kit-angle-selector.mjs +2 -2
  11. package/fesm2022/ngx-kit-angle-selector.mjs.map +1 -1
  12. package/fesm2022/ngx-kit-box-shadow.mjs +28 -27
  13. package/fesm2022/ngx-kit-box-shadow.mjs.map +1 -1
  14. package/fesm2022/ngx-kit-color-picker.mjs +173 -43
  15. package/fesm2022/ngx-kit-color-picker.mjs.map +1 -1
  16. package/fesm2022/ngx-kit-data-table.mjs +446 -191
  17. package/fesm2022/ngx-kit-data-table.mjs.map +1 -1
  18. package/fesm2022/ngx-kit-date-picker.mjs +120 -86
  19. package/fesm2022/ngx-kit-date-picker.mjs.map +1 -1
  20. package/fesm2022/ngx-kit-dialog.mjs +38 -7
  21. package/fesm2022/ngx-kit-dialog.mjs.map +1 -1
  22. package/fesm2022/ngx-kit-drawer-menu.mjs +190 -0
  23. package/fesm2022/ngx-kit-drawer-menu.mjs.map +1 -0
  24. package/fesm2022/ngx-kit-dropzone.mjs +272 -0
  25. package/fesm2022/ngx-kit-dropzone.mjs.map +1 -0
  26. package/fesm2022/ngx-kit-form-field.mjs +87 -0
  27. package/fesm2022/ngx-kit-form-field.mjs.map +1 -0
  28. package/fesm2022/ngx-kit-gallery.mjs +419 -0
  29. package/fesm2022/ngx-kit-gallery.mjs.map +1 -0
  30. package/fesm2022/ngx-kit-gradient-picker.mjs +12 -4
  31. package/fesm2022/ngx-kit-gradient-picker.mjs.map +1 -1
  32. package/fesm2022/ngx-kit-image-editor.mjs +501 -0
  33. package/fesm2022/ngx-kit-image-editor.mjs.map +1 -0
  34. package/fesm2022/ngx-kit-menu.mjs +9 -4
  35. package/fesm2022/ngx-kit-menu.mjs.map +1 -1
  36. package/fesm2022/ngx-kit-message.mjs +58 -24
  37. package/fesm2022/ngx-kit-message.mjs.map +1 -1
  38. package/fesm2022/ngx-kit-notify.mjs +10 -4
  39. package/fesm2022/ngx-kit-notify.mjs.map +1 -1
  40. package/fesm2022/ngx-kit-shared.mjs +184 -88
  41. package/fesm2022/ngx-kit-shared.mjs.map +1 -1
  42. package/fesm2022/ngx-kit-time-picker.mjs +562 -0
  43. package/fesm2022/ngx-kit-time-picker.mjs.map +1 -0
  44. package/fesm2022/ngx-kit.mjs.map +1 -1
  45. package/gallery/README.md +71 -0
  46. package/gradient-picker/README.md +41 -0
  47. package/image-editor/README.md +44 -0
  48. package/menu/README.md +85 -0
  49. package/message/README.md +70 -0
  50. package/notify/README.md +56 -0
  51. package/package.json +25 -1
  52. package/shared/README.md +117 -0
  53. package/styles/all.css +27 -0
  54. package/styles/image-viewer.css +12 -0
  55. package/types/ngx-kit-box-shadow.d.ts +1 -2
  56. package/types/ngx-kit-data-table.d.ts +290 -147
  57. package/types/ngx-kit-date-picker.d.ts +1 -1
  58. package/types/ngx-kit-dialog.d.ts +1 -0
  59. package/types/ngx-kit-drawer-menu.d.ts +101 -0
  60. package/types/ngx-kit-dropzone.d.ts +84 -0
  61. package/types/ngx-kit-form-field.d.ts +31 -0
  62. package/types/ngx-kit-gallery.d.ts +168 -0
  63. package/types/ngx-kit-image-editor.d.ts +175 -0
  64. package/types/ngx-kit-menu.d.ts +1 -0
  65. package/types/ngx-kit-message.d.ts +14 -3
  66. package/types/ngx-kit-notify.d.ts +2 -1
  67. package/types/ngx-kit-shared.d.ts +70 -15
  68. package/types/ngx-kit-time-picker.d.ts +150 -0
package/styles/all.css CHANGED
@@ -1,3 +1,17 @@
1
+ :root {
2
+ color-scheme: light dark;
3
+ }
4
+
5
+ :root[data-ngx-theme=light],
6
+ [data-ngx-theme=light] {
7
+ color-scheme: only light;
8
+ }
9
+
10
+ :root[data-ngx-theme=dark],
11
+ [data-ngx-theme=dark] {
12
+ color-scheme: only dark;
13
+ }
14
+
1
15
  dialog.ngx-ui-overlay::backdrop {
2
16
  background: transparent;
3
17
  }
@@ -20,6 +34,19 @@ dialog.ngx-ui-overlay::backdrop {
20
34
  opacity: 0;
21
35
  }
22
36
  }
37
+ dialog.ngx-image-viewer-dialog {
38
+ border: none;
39
+ padding: 1rem;
40
+ max-inline-size: 96vw;
41
+ max-block-size: 96vh;
42
+ inline-size: min(900px, 96vw);
43
+ background: light-dark(#ffffff, #1c1c20);
44
+ border-radius: 12px;
45
+ }
46
+ dialog.ngx-image-viewer-dialog::backdrop {
47
+ background: rgba(0, 0, 0, 0.75);
48
+ }
49
+
23
50
  /* ---------- confetti (success only) ---------- */
24
51
  .confetti {
25
52
  position: absolute;
@@ -0,0 +1,12 @@
1
+ dialog.ngx-image-viewer-dialog {
2
+ border: none;
3
+ padding: 1rem;
4
+ max-inline-size: 96vw;
5
+ max-block-size: 96vh;
6
+ inline-size: min(900px, 96vw);
7
+ background: light-dark(#ffffff, #1c1c20);
8
+ border-radius: 12px;
9
+ }
10
+ dialog.ngx-image-viewer-dialog::backdrop {
11
+ background: rgba(0, 0, 0, 0.75);
12
+ }
@@ -36,6 +36,7 @@ declare class NgxBoxShadowComponent implements OnInit, AfterViewInit, OnDestroy,
36
36
  protected _onChange: (value: string) => void;
37
37
  protected _onTouched: () => void;
38
38
  _onValidateChange: () => void;
39
+ private stopDrag?;
39
40
  pad: ElementRef<HTMLDivElement>;
40
41
  thumb: ElementRef<HTMLDivElement>;
41
42
  browserService: BrowserService;
@@ -53,9 +54,7 @@ declare class NgxBoxShadowComponent implements OnInit, AfterViewInit, OnDestroy,
53
54
  private updateRects;
54
55
  private resetPosition;
55
56
  onResize(): void;
56
- onDrag(ev: MouseEvent | TouchEvent): void;
57
57
  private updatePosition;
58
- onDragEnd(ev: MouseEvent | TouchEvent): void;
59
58
  setValueByPosition(thumbRec: DOMRect, padRec: DOMRect): void;
60
59
  onChangeValue(): void;
61
60
  private convertValueToPosition;
@@ -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,303 @@ 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
+ private readonly destroyRef;
274
+ protected readonly resolvedDirection: _angular_core.Signal<ngx_kit_shared.Direction>;
275
+ constructor();
276
+ ngOnInit(): void;
277
+ ngAfterContentInit(): void;
278
+ private syncTemplateMap;
279
+ protected readonly sortedData: _angular_core.Signal<readonly T[]>;
280
+ protected readonly totalCount: _angular_core.Signal<number>;
281
+ protected readonly pagedData: _angular_core.Signal<readonly T[]>;
282
+ private compare;
283
+ /** بدون mutation روی داده‌ی ورودی: شماره‌ی ردیف صرفاً از روی page/pageSize/rowIndex محاسبه می‌شود. */
284
+ protected recordNumber(rowIndex: number): number;
285
+ protected sortDirectionFor(column: string): SortDirection | null;
286
+ protected onHeaderClick(field: TableField<T, any>, event: MouseEvent): void;
287
+ protected onPaginate(event: PageEvent): void;
288
+ private emitLazyIfNeeded;
289
+ protected columnWidth(column: string): number;
290
+ protected columnMin(field: TableField<T, any>): number;
291
+ protected columnMax(field: TableField<T, any>): number;
292
+ protected isResizable(field: TableField<T, any>): boolean;
293
+ protected onColumnResizing(column: string, width: number): void;
294
+ protected onColumnResizeEnd(column: string, width: number): void;
295
+ protected getTemplate(column: string): TemplateRef<CellTemplateContext<T>> | null;
296
+ protected getRenderer(field: TableField<T, any>): Type<CellRendererComponent> | null;
297
+ protected getCellValue(row: T, field: TableField<T, any>): unknown;
298
+ protected formatCellValue(row: T, field: TableField<T, any>): string;
299
+ private stringify;
300
+ /** ورودی‌های renderer را به‌ازای هر (field, row) کش می‌کند تا هر Change
301
+ * Detection یک آبجکت جدید ساخته نشود؛ با WeakMap، وقتی row از حافظه خارج
302
+ * شود (مثلاً بعد از عوض‌شدن صفحه)، entry آن هم خودکار پاک می‌شود. */
303
+ protected getRendererInputs(row: T, field: TableField<T, any>): Record<string, unknown>;
304
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NgxTable<any>, never>;
305
+ 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>;
306
+ }
307
+
308
+ declare class NgxPagination {
309
+ protected readonly config: ngx_kit_data_table.NgxPaginationOptions;
310
+ readonly total: _angular_core.InputSignal<number>;
311
+ readonly page: _angular_core.ModelSignal<number>;
312
+ readonly pageSize: _angular_core.ModelSignal<number>;
313
+ readonly pageSizeOptions: _angular_core.InputSignal<number[]>;
314
+ readonly labels: _angular_core.InputSignal<ngx_kit_data_table.PaginationLabel>;
315
+ readonly siblingCount: _angular_core.InputSignal<number>;
316
+ readonly boundaryCount: _angular_core.InputSignal<number>;
317
+ readonly paginate: _angular_core.OutputEmitterRef<PageEvent>;
318
+ protected readonly totalPages: _angular_core.Signal<number>;
319
+ protected readonly firstItem: _angular_core.Signal<number>;
320
+ protected readonly lastItem: _angular_core.Signal<number>;
321
+ protected readonly pages: _angular_core.Signal<(string | number)[]>;
322
+ constructor();
323
+ private buildPages;
324
+ protected next(): void;
325
+ protected previous(): void;
326
+ protected first(): void;
327
+ protected last(): void;
328
+ protected goto(page: number): void;
329
+ protected onPageSizeChange(value: number): void;
330
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NgxPagination, never>;
331
+ 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>;
332
+ }
190
333
 
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 };
334
+ export { ColumnResize, NGX_PAGINATION_CONFIG, NGX_PAGINATION_CONFIG_DEFAULT, NGX_TABLE_CONFIG, NGX_TABLE_CONFIG_DEFAULT, NgxPagination, NgxTable, TableCell, defineFields, defineRenderers, providePagination, provideTable };
335
+ export type { CellRendererComponent, CellTemplateContext, ColumnAlign, ColumnSizingConfig, LazyLoadEvent, NgxPaginationOptions, NgxTableOptions, PageEvent, PageState, PaginationLabel, PlainTableField, RenderedTableField, RendererExtraInputs, RendererRegistry, ResolvedTableOptions, SortDirection, SortMeta, TableCellFormatter, TableField, TableFieldBase, TableLabels };
@@ -285,7 +285,7 @@ declare class NgxInputDatePickerComponent extends NgxDatePickerBase implements C
285
285
  clear(): void;
286
286
  stopPagination(ev: Event): void;
287
287
  static ɵfac: i0.ɵɵFactoryDeclaration<NgxInputDatePickerComponent, never>;
288
- static ɵcmp: i0.ɵɵComponentDeclaration<NgxInputDatePickerComponent, "ngx-datepicker", never, { "setTheme": { "alias": "theme"; "required": false; }; "setConfig": { "alias": "config"; "required": false; }; "locale": { "alias": "locale"; "required": false; }; "setMin": { "alias": "min"; "required": false; }; "setMax": { "alias": "max"; "required": false; }; "view": { "alias": "view"; "required": false; }; }, { "change": "change"; }, never, never, true, never>;
288
+ static ɵcmp: i0.ɵɵComponentDeclaration<NgxInputDatePickerComponent, "ngx-date-picker", never, { "setTheme": { "alias": "theme"; "required": false; }; "setConfig": { "alias": "config"; "required": false; }; "locale": { "alias": "locale"; "required": false; }; "setMin": { "alias": "min"; "required": false; }; "setMax": { "alias": "max"; "required": false; }; "view": { "alias": "view"; "required": false; }; }, { "change": "change"; }, never, never, true, never>;
289
289
  }
290
290
 
291
291
  declare function provideDateAdapters(...additional: DateAdapterRegistration[]): Provider[];
@@ -121,6 +121,7 @@ declare class NgxDialogBodyDirective implements AfterViewInit {
121
121
  }
122
122
 
123
123
  declare class NgxDialogModule {
124
+ private readonly platformId;
124
125
  constructor(parentModule: NgxDialogModule | null, service: NgxOverlayService);
125
126
  static ɵfac: i0.ɵɵFactoryDeclaration<NgxDialogModule, [{ optional: true; skipSelf: true; }, null]>;
126
127
  static ɵmod: i0.ɵɵNgModuleDeclaration<NgxDialogModule, [typeof NgxDialogComponent, typeof NgxDialogHeaderDirective, typeof NgxDialogFooterDirective, typeof NgxDialogBodyDirective], [typeof i5.CommonModule], [typeof NgxDialogComponent, typeof NgxDialogHeaderDirective, typeof NgxDialogFooterDirective, typeof NgxDialogBodyDirective]>;