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.
- package/README.md +3 -2
- package/angle-selector/README.md +34 -0
- package/box-shadow/README.md +33 -0
- package/color-picker/README.md +52 -0
- package/data-table/README.md +120 -0
- package/date-picker/README.md +74 -0
- package/dialog/README.md +94 -169
- package/drawer-menu/README.md +76 -0
- package/dropzone/README.md +59 -0
- package/fesm2022/ngx-kit-angle-selector.mjs +2 -2
- package/fesm2022/ngx-kit-angle-selector.mjs.map +1 -1
- package/fesm2022/ngx-kit-box-shadow.mjs +28 -27
- package/fesm2022/ngx-kit-box-shadow.mjs.map +1 -1
- package/fesm2022/ngx-kit-color-picker.mjs +173 -43
- package/fesm2022/ngx-kit-color-picker.mjs.map +1 -1
- package/fesm2022/ngx-kit-data-table.mjs +446 -191
- package/fesm2022/ngx-kit-data-table.mjs.map +1 -1
- package/fesm2022/ngx-kit-date-picker.mjs +120 -86
- package/fesm2022/ngx-kit-date-picker.mjs.map +1 -1
- package/fesm2022/ngx-kit-dialog.mjs +38 -7
- package/fesm2022/ngx-kit-dialog.mjs.map +1 -1
- package/fesm2022/ngx-kit-drawer-menu.mjs +190 -0
- package/fesm2022/ngx-kit-drawer-menu.mjs.map +1 -0
- package/fesm2022/ngx-kit-dropzone.mjs +272 -0
- package/fesm2022/ngx-kit-dropzone.mjs.map +1 -0
- package/fesm2022/ngx-kit-form-field.mjs +87 -0
- package/fesm2022/ngx-kit-form-field.mjs.map +1 -0
- package/fesm2022/ngx-kit-gallery.mjs +419 -0
- package/fesm2022/ngx-kit-gallery.mjs.map +1 -0
- package/fesm2022/ngx-kit-gradient-picker.mjs +12 -4
- package/fesm2022/ngx-kit-gradient-picker.mjs.map +1 -1
- package/fesm2022/ngx-kit-image-editor.mjs +501 -0
- package/fesm2022/ngx-kit-image-editor.mjs.map +1 -0
- package/fesm2022/ngx-kit-menu.mjs +9 -4
- package/fesm2022/ngx-kit-menu.mjs.map +1 -1
- package/fesm2022/ngx-kit-message.mjs +58 -24
- package/fesm2022/ngx-kit-message.mjs.map +1 -1
- package/fesm2022/ngx-kit-notify.mjs +10 -4
- package/fesm2022/ngx-kit-notify.mjs.map +1 -1
- package/fesm2022/ngx-kit-shared.mjs +184 -88
- package/fesm2022/ngx-kit-shared.mjs.map +1 -1
- package/fesm2022/ngx-kit-time-picker.mjs +562 -0
- package/fesm2022/ngx-kit-time-picker.mjs.map +1 -0
- package/fesm2022/ngx-kit.mjs.map +1 -1
- package/gallery/README.md +71 -0
- package/gradient-picker/README.md +41 -0
- package/image-editor/README.md +44 -0
- package/menu/README.md +85 -0
- package/message/README.md +70 -0
- package/notify/README.md +56 -0
- package/package.json +25 -1
- package/shared/README.md +117 -0
- package/styles/all.css +27 -0
- package/styles/image-viewer.css +12 -0
- package/types/ngx-kit-box-shadow.d.ts +1 -2
- package/types/ngx-kit-data-table.d.ts +290 -147
- package/types/ngx-kit-date-picker.d.ts +1 -1
- package/types/ngx-kit-dialog.d.ts +1 -0
- package/types/ngx-kit-drawer-menu.d.ts +101 -0
- package/types/ngx-kit-dropzone.d.ts +84 -0
- package/types/ngx-kit-form-field.d.ts +31 -0
- package/types/ngx-kit-gallery.d.ts +168 -0
- package/types/ngx-kit-image-editor.d.ts +175 -0
- package/types/ngx-kit-menu.d.ts +1 -0
- package/types/ngx-kit-message.d.ts +14 -3
- package/types/ngx-kit-notify.d.ts +2 -1
- package/types/ngx-kit-shared.d.ts +70 -15
- 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,
|
|
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
|
-
/**
|
|
19
|
+
/** آفست صفر-پایهی اولین ردیف صفحهی جاری. */
|
|
96
20
|
first: number;
|
|
97
21
|
}
|
|
98
|
-
/**
|
|
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
|
-
|
|
168
|
-
|
|
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
|
-
|
|
171
|
-
|
|
172
|
-
|
|
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
|
|
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
|
-
*
|
|
198
|
+
* دستگیرهی درگ برای ریسایز ستون. روی لبهی «انتهای منطقی» (inline-end) قرار
|
|
199
|
+
* میگیرد، یعنی خودش زیر [dir="rtl"] جابهجا میشود؛ فقط جهت محاسبهی دلتا هم
|
|
200
|
+
* برعکس میشود تا حس درگ همیشه طبیعی باشد.
|
|
201
|
+
*
|
|
202
|
+
* مقدار نهایی توسط جدول در یک Map از عرضها ذخیره میشود (نه در استایل مستقیم
|
|
203
|
+
* ستون)، به همراه علامتگذاری «دستی ریسایز شده» — یعنی بعد از این، هیچ
|
|
204
|
+
* re-render یا تغییر دادهای این عرض را از بین نمیبرد.
|
|
180
205
|
*/
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
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
|
-
*
|
|
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
|
-
|
|
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 {
|
|
192
|
-
export type { LazyLoadEvent, NgxPaginationOptions, NgxTableOptions, PageEvent, PageState, PaginationLabel, SortDirection, SortMeta, TableCellFormatter,
|
|
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-
|
|
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]>;
|