ngx-kit 6.0.1 → 6.1.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 (42) hide show
  1. package/angle-selector/README.md +11 -11
  2. package/box-shadow/README.md +10 -10
  3. package/color-picker/README.md +20 -23
  4. package/data-table/README.md +34 -41
  5. package/date-picker/README.md +21 -26
  6. package/dialog/README.md +31 -33
  7. package/drawer-menu/README.md +51 -50
  8. package/dropzone/README.md +395 -32
  9. package/fesm2022/ngx-kit-box-shadow.mjs +2 -2
  10. package/fesm2022/ngx-kit-box-shadow.mjs.map +1 -1
  11. package/fesm2022/ngx-kit-color-picker.mjs +2 -2
  12. package/fesm2022/ngx-kit-color-picker.mjs.map +1 -1
  13. package/fesm2022/ngx-kit-data-table.mjs +68 -26
  14. package/fesm2022/ngx-kit-data-table.mjs.map +1 -1
  15. package/fesm2022/ngx-kit-dropzone.mjs +274 -29
  16. package/fesm2022/ngx-kit-dropzone.mjs.map +1 -1
  17. package/fesm2022/ngx-kit-form-field.mjs +129 -64
  18. package/fesm2022/ngx-kit-form-field.mjs.map +1 -1
  19. package/fesm2022/ngx-kit-gallery.mjs +2 -2
  20. package/fesm2022/ngx-kit-gallery.mjs.map +1 -1
  21. package/fesm2022/ngx-kit-gradient-picker.mjs +2 -2
  22. package/fesm2022/ngx-kit-gradient-picker.mjs.map +1 -1
  23. package/fesm2022/ngx-kit-image-editor.mjs +33 -10
  24. package/fesm2022/ngx-kit-image-editor.mjs.map +1 -1
  25. package/fesm2022/ngx-kit-message.mjs +5 -0
  26. package/fesm2022/ngx-kit-message.mjs.map +1 -1
  27. package/fesm2022/ngx-kit-time-picker.mjs +17 -4
  28. package/fesm2022/ngx-kit-time-picker.mjs.map +1 -1
  29. package/gallery/README.md +29 -29
  30. package/gradient-picker/README.md +16 -16
  31. package/image-editor/README.md +19 -19
  32. package/menu/README.md +27 -27
  33. package/message/README.md +34 -34
  34. package/notify/README.md +25 -23
  35. package/package.json +1 -1
  36. package/shared/README.md +32 -32
  37. package/time-picker/README.md +95 -0
  38. package/types/ngx-kit-data-table.d.ts +25 -5
  39. package/types/ngx-kit-dropzone.d.ts +129 -18
  40. package/types/ngx-kit-form-field.d.ts +65 -27
  41. package/types/ngx-kit-image-editor.d.ts +23 -3
  42. package/types/ngx-kit-time-picker.d.ts +19 -14
@@ -0,0 +1,95 @@
1
+ # ngx-kit/time-picker
2
+
3
+ An analog clock time picker (MUI-style), usable either inline or as a popup attached to a text input, with 12h/24h format support and a configurable minute step.
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ npm install ngx-kit
9
+ ```
10
+
11
+ ## Setup (optional)
12
+
13
+ ```ts
14
+ // app.config.ts
15
+ import { provideTimePicker } from 'ngx-kit/time-picker';
16
+
17
+ export const appConfig: ApplicationConfig = {
18
+ providers: [
19
+ provideTimePicker({
20
+ format: '24',
21
+ minuteStep: 5,
22
+ confirmButtonText: 'Done',
23
+ }),
24
+ ],
25
+ };
26
+ ```
27
+
28
+ `provideTimePicker` only needs the fields you want to override — everything else falls back to the defaults (`confirmButtonText: 'Ok'`, `cancelButtonText: 'Cancel'`, `amText: 'AM'`, `pmText: 'PM'`, `format: '12'`, `minuteStep: 1`, `autoSwitchToMinute: true`).
29
+
30
+ ## Usage — popup attached to an input
31
+
32
+ ```html
33
+ <input
34
+ type="text"
35
+ formControlName="time"
36
+ ngxInputTimePicker
37
+ #dp="ngxInputTimePicker"
38
+ />
39
+ <button (click)="dp.toggle()">Open</button>
40
+ ```
41
+
42
+ `[ngxInputTimePicker]` is a full `ControlValueAccessor` + `Validator`, so it works with `ngModel`/`formControl`/`formControlName`. The value is always a string in `HH:MM` (24h) form, e.g. `'14:35'`.
43
+
44
+ If the typed text isn't a valid time, the control gets a `{ invalid: true }` error (in addition to whatever built-in validators like `Validators.required` you add yourself):
45
+
46
+ ```html
47
+ @if (form.get('time')?.hasError('invalid')) {
48
+ <div class="text-danger">Invalid time</div>
49
+ }
50
+ @if (form.get('time')?.hasError('required')) {
51
+ <div class="text-danger">Time is required</div>
52
+ }
53
+ ```
54
+
55
+ ## Usage — inline (always visible)
56
+
57
+ ```html
58
+ <ngx-time-picker format="24" [(value)]="time" (change)="onTimeChange($event)"></ngx-time-picker>
59
+ ```
60
+
61
+ ## API
62
+
63
+ ### `[ngxInputTimePicker]`
64
+
65
+ | Input | Type | Default | Description |
66
+ | --- | --- | --- | --- |
67
+ | `openOnCLick` | `boolean` | `true` | Open the popup when the input itself is clicked |
68
+ | `format` | `'12' \| '24'` | from config | |
69
+
70
+ | Output | Type | Description |
71
+ | --- | --- | --- |
72
+ | `change` | `EventEmitter<string \| null>` | Emitted when the user confirms a time |
73
+
74
+ | Member | Description |
75
+ | --- | --- |
76
+ | `toggle()` | Opens the popup if closed, closes it if open |
77
+
78
+ ### `<ngx-time-picker>`
79
+
80
+ | Input | Type | Default | Description |
81
+ | --- | --- | --- | --- |
82
+ | `value` (model, two-way) | `string` | `'12:00'` | Bind with `[(value)]` |
83
+ | `format` | `'12' \| '24'` | from config | |
84
+ | `minuteStep` | `number` | from config | |
85
+ | `disabled` | `boolean` | `false` | |
86
+ | `autoSwitchToMinute` | `boolean` | from config | Switch to minute-selection mode right after picking the hour |
87
+
88
+ | Output | Type | Description |
89
+ | --- | --- | --- |
90
+ | `change` | `EventEmitter<string \| null>` | Emitted when "OK" is pressed |
91
+ | `cancel` | `EventEmitter<void>` | Emitted when "Cancel" is pressed |
92
+
93
+ ## Dark mode and RTL
94
+
95
+ Supported automatically.
@@ -21,7 +21,8 @@ interface PageState {
21
21
  }
22
22
  /** هر بار سرور باید صفحه‌ی جدید را (در حالت lazy) واکشی کند، امیت می‌شود. */
23
23
  interface LazyLoadEvent<T> extends PageState {
24
- sorts: SortMeta<T>[];
24
+ sorts?: SortMeta<T>[];
25
+ sorting?: string;
25
26
  }
26
27
 
27
28
  interface PaginationLabel {
@@ -59,7 +60,7 @@ type RendererExtraInputs<C extends Type<any>> = {
59
60
  [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
  };
61
62
  type ColumnAlign = 'start' | 'center' | 'end';
62
- type TableCellFormatter<T extends object = object> = (value: unknown, row: T, field: TableFieldBase<T>) => unknown;
63
+ type TableCellFormatter<T extends object = object> = (value: any, row: T, field: TableFieldBase<T>) => any;
63
64
  interface CellTemplateContext<T extends object> {
64
65
  $implicit: T;
65
66
  row: T;
@@ -71,7 +72,14 @@ interface CellTemplateContext<T extends object> {
71
72
  interface TableFieldBase<T extends object> {
72
73
  column: Extract<keyof T, string>;
73
74
  title: string;
74
- width?: number;
75
+ /**
76
+ * عرضِ این ستون. عدد یعنی پیکسل (`160` = `160px`)؛ رشته یعنی هر مقدار
77
+ * معتبرِ CSS length برای flex-basis (`'20%'`, `'12rem'`, ...). اگه اصلاً
78
+ * ندید، این ستون flex می‌شه (`flex: 1 1 0`) و فضای باقی‌مونده‌ی جدول رو پر
79
+ * می‌کنه — دقیقاً برخلافِ ستون‌هایی که width دارن (که `flex: 0 0 <width>`
80
+ * می‌گیرن و ثابت می‌مونن).
81
+ */
82
+ width?: number | string;
75
83
  minWidth?: number;
76
84
  maxWidth?: number;
77
85
  resizable?: boolean;
@@ -144,6 +152,7 @@ type ResolvedTableOptions = Required<Omit<NgxTableOptions, 'labels' | 'renderers
144
152
  labels: Required<TableLabels>;
145
153
  renderers: RendererRegistry;
146
154
  formatters: Readonly<Record<string, TableCellFormatter<any>>>;
155
+ lazy: boolean;
147
156
  };
148
157
 
149
158
  declare const NGX_TABLE_CONFIG_DEFAULT: ResolvedTableOptions;
@@ -210,6 +219,7 @@ declare class ColumnResize {
210
219
  readonly direction: _angular_core.InputSignal<"ltr" | "rtl">;
211
220
  readonly resizing: _angular_core.OutputEmitterRef<number>;
212
221
  readonly resizeEnd: _angular_core.OutputEmitterRef<number>;
222
+ private readonly elementRef;
213
223
  private dragging;
214
224
  private startX;
215
225
  private baseWidth;
@@ -248,9 +258,12 @@ declare class NgxTable<T extends object> implements OnInit, AfterContentInit {
248
258
  readonly operationWidth: _angular_core.InputSignal<number>;
249
259
  readonly numWidth: _angular_core.InputSignal<number>;
250
260
  readonly pageSize: _angular_core.InputSignal<number>;
261
+ readonly page: _angular_core.InputSignal<number>;
262
+ readonly pageChange: _angular_core.OutputEmitterRef<number>;
251
263
  readonly loading: _angular_core.InputSignal<boolean>;
252
264
  readonly multiSort: _angular_core.InputSignal<boolean | undefined>;
253
265
  readonly lazy: _angular_core.InputSignal<boolean>;
266
+ readonly resizable: _angular_core.InputSignal<boolean>;
254
267
  /** پیش‌فرض بر اساس ایندکس؛ برای جلوگیری از گم‌شدن state سطرها هنگام سورت،
255
268
  * یک شناسه‌ی یکتا بدهید: [trackBy]="(i, row) => row.id" */
256
269
  readonly trackBy: _angular_core.InputSignal<(index: number, row: T) => unknown>;
@@ -260,7 +273,7 @@ declare class NgxTable<T extends object> implements OnInit, AfterContentInit {
260
273
  field: string;
261
274
  width: number;
262
275
  }>;
263
- protected readonly page: _angular_core.WritableSignal<number>;
276
+ protected readonly pageIndex: _angular_core.WritableSignal<number>;
264
277
  protected readonly pageSizeS: _angular_core.WritableSignal<number>;
265
278
  protected readonly sorts: _angular_core.WritableSignal<SortMeta<T>[]>;
266
279
  protected readonly widths: _angular_core.WritableSignal<Record<string, number>>;
@@ -287,6 +300,13 @@ declare class NgxTable<T extends object> implements OnInit, AfterContentInit {
287
300
  protected onPaginate(event: PageEvent): void;
288
301
  private emitLazyIfNeeded;
289
302
  protected columnWidth(column: string): number;
303
+ /**
304
+ * مقدار CSS `flex` واقعیِ این ستون:
305
+ * - اگه دستی ریسایز شده یا width عددی داره → `0 0 <px>` (ثابت، بدون رشد/کوچک‌شدن)
306
+ * - اگه width رشته‌ای داره (مثلاً '20%') → `0 0 <رشته>` (ثابت، هر واحد CSS معتبری)
307
+ * - اگه اصلاً width نداره → `1 1 0` (رشد می‌کنه تا فضای باقی‌مونده‌ی جدول رو پر کنه)
308
+ */
309
+ protected columnFlex(field: TableField<T, any>): string;
290
310
  protected columnMin(field: TableField<T, any>): number;
291
311
  protected columnMax(field: TableField<T, any>): number;
292
312
  protected isResizable(field: TableField<T, any>): boolean;
@@ -302,7 +322,7 @@ declare class NgxTable<T extends object> implements OnInit, AfterContentInit {
302
322
  * شود (مثلاً بعد از عوض‌شدن صفحه)، entry آن هم خودکار پاک می‌شود. */
303
323
  protected getRendererInputs(row: T, field: TableField<T, any>): Record<string, unknown>;
304
324
  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>;
325
+ 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; }; "page": { "alias": "page"; "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; }; "resizable": { "alias": "resizable"; "required": false; "isSignal": true; }; "trackBy": { "alias": "trackBy"; "required": false; "isSignal": true; }; }, { "pageChange": "pageChange"; "lazyLoad": "lazyLoad"; "sortChange": "sortChange"; "columnResize": "columnResize"; }, ["cellTemplates"], never, true, never>;
306
326
  }
307
327
 
308
328
  declare class NgxPagination {
@@ -1,13 +1,22 @@
1
1
  import * as _angular_core from '@angular/core';
2
- import { OnDestroy } from '@angular/core';
2
+ import { OnDestroy, InjectionToken } from '@angular/core';
3
+ import { HttpHeaders } from '@angular/common/http';
4
+ import { Observable } from 'rxjs';
3
5
 
4
- interface NgxDropzoneFile {
6
+ type NgxDropzoneFileStatus = 'pending' | 'accepted' | 'uploading' | 'uploaded' | 'error' | 'canceled';
7
+ interface NgxDropzoneFile<TResponse = unknown> {
5
8
  /** شناسه‌ی یکتا برای track کردن توی @for و امکان حذف تکی */
6
9
  id: string;
7
10
  file: File;
8
11
  /** فقط برای فایل‌های تصویری پر می‌شه (object URL) */
9
12
  previewUrl?: string;
10
- status: 'pending' | 'accepted' | 'rejected';
13
+ status: NgxDropzoneFileStatus;
14
+ /** Upload progress, from 0 to 100. */
15
+ progress: number;
16
+ /** Response returned by the upload adapter. */
17
+ response?: TResponse;
18
+ /** Upload error, if the request failed. */
19
+ error?: unknown;
11
20
  /** در صورت رد شدن، دلیلش */
12
21
  rejectionReason?: NgxDropzoneRejectionReason;
13
22
  }
@@ -17,19 +26,57 @@ interface NgxDropzoneRejectedFile {
17
26
  reason: NgxDropzoneRejectionReason;
18
27
  }
19
28
 
29
+ interface NgxDropzoneUploadRequest {
30
+ /** Target endpoint. */
31
+ url: string;
32
+ /** Multipart form field name used for the file. */
33
+ alias: string;
34
+ file: File;
35
+ /** Optional additional multipart fields. */
36
+ data?: Record<string, string | Blob | number | boolean>;
37
+ /** Optional request headers. */
38
+ headers?: HttpHeaders | Record<string, string | string[]>;
39
+ /** Send cookies/auth information for cross-origin requests. */
40
+ withCredentials?: boolean;
41
+ }
42
+ type NgxDropzoneUploadEvent<TResponse = unknown> = {
43
+ type: 'progress';
44
+ loaded: number;
45
+ total?: number;
46
+ percent: number;
47
+ } | {
48
+ type: 'response';
49
+ response: TResponse;
50
+ status: number;
51
+ headers?: HttpHeaders;
52
+ };
20
53
  /**
21
- * ناحیه‌ی درگ‌اند‌دراپِ فایل — کاملاً مستقل (بدون وابستگی به هیچ lib
22
- * دیگه‌ای، حتی shared)، signal-based و OnPush.
54
+ * Upload adapter used by ngx-dropzone.
23
55
  *
24
- * ویژگی‌های مهمی که معمولاً پیاده‌سازی‌های ساده‌ی dropzone ندارن:
25
- * - شمارنده‌ی dragenter/dragleave: چون dragleave برای فرزندهای داخل
26
- * dropzone هم شلیک می‌شه، پیاده‌سازی‌های ساده موقع درگ‌کردن روی متن/آیکون
27
- * داخل ناحیه، حالت "درگ" رو اشتباهی خاموش می‌کنن (چشمک‌زدن). این‌جا با
28
- * شمارنده حل شده.
29
- * - پیمایش بازگشتیِ پوشه‌ها (وقتی کاربر یه پوشه رو درگ کنه، نه فقط فایل).
30
- * - قابل‌دسترسی با کیبورد (focusable + Enter/Space).
31
- * - پاک‌سازی object URL پیش‌نمایش‌ها روی حذف/destroy (وگرنه نشتی حافظه‌ست).
56
+ * Implement this interface when the default HttpClient implementation is not
57
+ * suitable (for example, when the host application uses Axios, fetch, tus,
58
+ * S3 multipart upload, etc.).
59
+ */
60
+ interface NgxDropzoneUploadService {
61
+ upload<TResponse = unknown>(request: NgxDropzoneUploadRequest): Observable<NgxDropzoneUploadEvent<TResponse>>;
62
+ }
63
+ interface NgxDropzoneUploadProgressEvent {
64
+ item: NgxDropzoneFileLike;
65
+ loaded: number;
66
+ total?: number;
67
+ percent: number;
68
+ }
69
+ /**
70
+ * Deliberately small structural type so consumers do not have to depend on a
71
+ * concrete response type.
32
72
  */
73
+ interface NgxDropzoneFileLike {
74
+ id: string;
75
+ file: File;
76
+ progress: number;
77
+ }
78
+
79
+ type NgxDropzoneUploadMode = 'all' | 'single';
33
80
  declare class NgxDropzoneComponent implements OnDestroy {
34
81
  /** الگوی accept مثل input[type=file]: "image/*", ".pdf,.docx" و ... */
35
82
  accept: _angular_core.InputSignal<string>;
@@ -41,16 +88,55 @@ declare class NgxDropzoneComponent implements OnDestroy {
41
88
  disabled: _angular_core.InputSignal<boolean>;
42
89
  /** نمایش لیست/پیش‌نمایش فایل‌های انتخاب‌شده داخل خودِ کامپوننت */
43
90
  showFileList: _angular_core.InputSignal<boolean>;
91
+ /** Upload endpoint. */
92
+ uploadUrl: _angular_core.InputSignal<string>;
93
+ /** Multipart form-data field name. */
94
+ uploadAlias: _angular_core.InputSignal<string>;
95
+ /** Automatically enqueue newly accepted files for upload. */
96
+ autoUpload: _angular_core.InputSignal<boolean>;
97
+ /** Maximum number of simultaneous uploads. */
98
+ maxParallel: _angular_core.InputSignal<number>;
99
+ /**
100
+ * Manual upload behavior:
101
+ * - all: one "Upload all" action uploads all pending files.
102
+ * - single: every pending row gets its own Upload button.
103
+ */
104
+ uploadMode: _angular_core.InputSignal<NgxDropzoneUploadMode>;
105
+ /** Extra multipart form fields sent with every file. */
106
+ uploadData: _angular_core.InputSignal<Record<string, string | number | boolean | Blob>>;
107
+ /** Optional request headers. */
108
+ uploadHeaders: _angular_core.InputSignal<Record<string, string | string[]>>;
109
+ /** Send credentials/cookies with the upload request. */
110
+ uploadWithCredentials: _angular_core.InputSignal<boolean>;
44
111
  filesAdded: _angular_core.OutputEmitterRef<File[]>;
45
112
  filesRejected: _angular_core.OutputEmitterRef<NgxDropzoneRejectedFile[]>;
46
- /** کل لیست فعلی (بعد از هر تغییر) — برای binding راحت‌تر */
47
113
  filesChange: _angular_core.OutputEmitterRef<File[]>;
48
- protected readonly files: _angular_core.WritableSignal<NgxDropzoneFile[]>;
114
+ /** Emitted when an individual upload starts. */
115
+ uploadStarted: _angular_core.OutputEmitterRef<NgxDropzoneFile<unknown>>;
116
+ /** Emitted for every upload progress update. */
117
+ uploadProgress: _angular_core.OutputEmitterRef<NgxDropzoneUploadProgressEvent>;
118
+ /** Emitted after a file is successfully uploaded. */
119
+ uploadSuccess: _angular_core.OutputEmitterRef<NgxDropzoneFile<unknown>>;
120
+ /** Emitted when an upload fails. */
121
+ uploadError: _angular_core.OutputEmitterRef<{
122
+ item: NgxDropzoneFile;
123
+ error: unknown;
124
+ }>;
125
+ protected readonly files: _angular_core.WritableSignal<NgxDropzoneFile<unknown>[]>;
49
126
  protected readonly isDragging: _angular_core.WritableSignal<boolean>;
50
127
  private dragCounter;
128
+ private readonly uploadService;
51
129
  private readonly fileInput;
130
+ private readonly uploadSubscriptions;
131
+ private readonly uploadQueue;
132
+ private activeUploads;
133
+ private readonly activeUploadIds;
134
+ protected readonly pendingCount: _angular_core.Signal<number>;
135
+ protected readonly hasUploadConfiguration: _angular_core.Signal<boolean>;
52
136
  protected readonly hint: _angular_core.Signal<string>;
53
137
  protected formatSize(bytes: number): string;
138
+ protected isPending(item: NgxDropzoneFile): boolean;
139
+ protected trackById(_index: number, item: NgxDropzoneFile): string;
54
140
  ngOnDestroy(): void;
55
141
  protected onDragEnter(ev: DragEvent): void;
56
142
  protected onDragOver(ev: DragEvent): void;
@@ -60,12 +146,37 @@ declare class NgxDropzoneComponent implements OnDestroy {
60
146
  protected onKeydown(ev: KeyboardEvent): void;
61
147
  protected onFileInputChange(ev: Event): void;
62
148
  protected removeFile(id: string): void;
149
+ protected uploadAll(): void;
150
+ protected uploadSingle(id: string): void;
151
+ protected retryUpload(id: string): void;
63
152
  private handleIncomingFiles;
153
+ private enqueueUploads;
154
+ private pumpQueue;
155
+ private startUpload;
156
+ private markUploadError;
157
+ private finishUpload;
158
+ private updateFile;
64
159
  private emitCurrentFiles;
65
160
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<NgxDropzoneComponent, never>;
66
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<NgxDropzoneComponent, "ngx-dropzone", never, { "accept": { "alias": "accept"; "required": false; "isSignal": true; }; "multiple": { "alias": "multiple"; "required": false; "isSignal": true; }; "maxFileSize": { "alias": "maxFileSize"; "required": false; "isSignal": true; }; "maxFiles": { "alias": "maxFiles"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "showFileList": { "alias": "showFileList"; "required": false; "isSignal": true; }; }, { "filesAdded": "filesAdded"; "filesRejected": "filesRejected"; "filesChange": "filesChange"; }, never, ["[dropzone-icon]", "*"], true, never>;
161
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<NgxDropzoneComponent, "ngx-dropzone", never, { "accept": { "alias": "accept"; "required": false; "isSignal": true; }; "multiple": { "alias": "multiple"; "required": false; "isSignal": true; }; "maxFileSize": { "alias": "maxFileSize"; "required": false; "isSignal": true; }; "maxFiles": { "alias": "maxFiles"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "showFileList": { "alias": "showFileList"; "required": false; "isSignal": true; }; "uploadUrl": { "alias": "uploadUrl"; "required": false; "isSignal": true; }; "uploadAlias": { "alias": "uploadAlias"; "required": false; "isSignal": true; }; "autoUpload": { "alias": "autoUpload"; "required": false; "isSignal": true; }; "maxParallel": { "alias": "maxParallel"; "required": false; "isSignal": true; }; "uploadMode": { "alias": "uploadMode"; "required": false; "isSignal": true; }; "uploadData": { "alias": "uploadData"; "required": false; "isSignal": true; }; "uploadHeaders": { "alias": "uploadHeaders"; "required": false; "isSignal": true; }; "uploadWithCredentials": { "alias": "uploadWithCredentials"; "required": false; "isSignal": true; }; }, { "filesAdded": "filesAdded"; "filesRejected": "filesRejected"; "filesChange": "filesChange"; "uploadStarted": "uploadStarted"; "uploadProgress": "uploadProgress"; "uploadSuccess": "uploadSuccess"; "uploadError": "uploadError"; }, never, ["[dropzone-icon]", "*"], true, never>;
162
+ }
163
+
164
+ declare class NgxDropzoneHttpUploadService implements NgxDropzoneUploadService {
165
+ private readonly http;
166
+ upload<TResponse = unknown>(request: NgxDropzoneUploadRequest): Observable<NgxDropzoneUploadEvent<TResponse>>;
167
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NgxDropzoneHttpUploadService, never>;
168
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<NgxDropzoneHttpUploadService>;
67
169
  }
68
170
 
171
+ /**
172
+ * Upload adapter used by ngx-dropzone.
173
+ *
174
+ * Default: Angular HttpClient.
175
+ * Override this token at application/component level to use Axios or any
176
+ * other upload implementation.
177
+ */
178
+ declare const NGX_DROPZONE_UPLOAD_SERVICE: InjectionToken<NgxDropzoneUploadService>;
179
+
69
180
  /**
70
181
  * چک می‌کنه یه فایل با pattern رشته‌ای accept (مثل input[type=file])
71
182
  * مطابقت داره یا نه. پشتیبانی می‌شه از:
@@ -80,5 +191,5 @@ declare function formatBytes(bytes: number): string;
80
191
  /** استخراج فایل‌های واقعی از یک DataTransfer، شامل پیمایش بازگشتیِ پوشه‌ها (وقتی مرورگر پشتیبانی کنه) */
81
192
  declare function extractFilesFromDataTransfer(dataTransfer: DataTransfer): Promise<File[]>;
82
193
 
83
- export { NgxDropzoneComponent, extractFilesFromDataTransfer, formatBytes, matchesAccept };
84
- export type { NgxDropzoneFile, NgxDropzoneRejectedFile, NgxDropzoneRejectionReason };
194
+ export { NGX_DROPZONE_UPLOAD_SERVICE, NgxDropzoneComponent, NgxDropzoneHttpUploadService, extractFilesFromDataTransfer, formatBytes, matchesAccept };
195
+ export type { NgxDropzoneFile, NgxDropzoneFileLike, NgxDropzoneFileStatus, NgxDropzoneRejectedFile, NgxDropzoneRejectionReason, NgxDropzoneUploadEvent, NgxDropzoneUploadMode, NgxDropzoneUploadProgressEvent, NgxDropzoneUploadRequest, NgxDropzoneUploadService };
@@ -1,31 +1,69 @@
1
- import * as _angular_core from '@angular/core';
2
-
3
- type NgxFormFieldType = 'text' | 'password' | 'email' | 'number' | 'tel' | 'url' | 'search' | 'textarea';
1
+ import * as i0 from '@angular/core';
2
+ import { AfterViewInit, ElementRef, InjectionToken } from '@angular/core';
3
+ import * as ngx_kit_form_field from 'ngx-kit/form-field';
4
4
 
5
5
  declare class NgxFormField {
6
- readonly value: _angular_core.ModelSignal<string | number>;
7
- readonly label: _angular_core.InputSignal<string>;
8
- readonly type: _angular_core.InputSignal<NgxFormFieldType>;
9
- readonly placeholder: _angular_core.InputSignal<string>;
10
- readonly required: _angular_core.InputSignal<boolean>;
11
- readonly disabled: _angular_core.InputSignal<boolean>;
12
- readonly readonly: _angular_core.InputSignal<boolean>;
13
- readonly float: _angular_core.InputSignal<boolean>;
14
- readonly name: _angular_core.InputSignal<string | null>;
15
- readonly autocomplete: _angular_core.InputSignal<string | null>;
16
- readonly rows: _angular_core.InputSignal<number>;
17
- readonly hint: _angular_core.InputSignal<string>;
18
- readonly errorMessages: _angular_core.InputSignal<string[]>;
19
- readonly dir: _angular_core.InputSignal<"" | "ltr" | "rtl">;
20
- readonly id: _angular_core.InputSignal<string>;
21
- readonly focused: _angular_core.OutputEmitterRef<void>;
22
- readonly blurred: _angular_core.OutputEmitterRef<void>;
23
- readonly hasValue: _angular_core.Signal<boolean>;
24
- onInput(event: Event): void;
25
- onFocus(): void;
26
- onBlur(): void;
27
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<NgxFormField, never>;
28
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<NgxFormField, "ngx-form-field", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": true; "isSignal": true; }; "type": { "alias": "type"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "float": { "alias": "float"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "autocomplete": { "alias": "autocomplete"; "required": false; "isSignal": true; }; "rows": { "alias": "rows"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "errorMessages": { "alias": "errorMessages"; "required": false; "isSignal": true; }; "dir": { "alias": "dir"; "required": false; "isSignal": true; }; "id": { "alias": "id"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "focused": "focused"; "blurred": "blurred"; }, never, never, true, never>;
6
+ protected readonly ref: ngx_kit_form_field.MgxFormFieldRef;
7
+ readonly label: i0.InputSignal<string>;
8
+ /**
9
+ * Forces the label to float even when the control is empty.
10
+ * Similar to Material's floatLabel behavior.
11
+ */
12
+ readonly float: i0.InputSignal<boolean>;
13
+ /**
14
+ * Explicit state overrides are useful when the projected control
15
+ * is managed by Angular Forms.
16
+ */
17
+ readonly invalid: i0.InputSignal<boolean>;
18
+ readonly required: i0.InputSignal<boolean>;
19
+ readonly disabled: i0.InputSignal<boolean>;
20
+ readonly readonly: i0.InputSignal<boolean>;
21
+ readonly hintVisible: i0.Signal<boolean>;
22
+ readonly errorVisible: i0.Signal<boolean>;
23
+ static ɵfac: i0.ɵɵFactoryDeclaration<NgxFormField, never>;
24
+ static ɵcmp: i0.ɵɵComponentDeclaration<NgxFormField, "ngx-form-field", never, { "label": { "alias": "label"; "required": true; "isSignal": true; }; "float": { "alias": "float"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; }, {}, never, ["[ngxPrefix],ngx-prefix", "[ngxInput],ngx-input", "[ngxSuffix],ngx-suffix", "[ngxHint],ngx-hint", "[ngxError],ngx-error"], true, never>;
25
+ }
26
+
27
+ declare class NgxInput implements AfterViewInit {
28
+ private readonly el;
29
+ private readonly ref;
30
+ readonly hasValue: i0.WritableSignal<boolean>;
31
+ ngAfterViewInit(): void;
32
+ protected onInput(): void;
33
+ protected onChange(): void;
34
+ protected onBlur(): void;
35
+ private syncValue;
36
+ static ɵfac: i0.ɵɵFactoryDeclaration<NgxInput, never>;
37
+ static ɵdir: i0.ɵɵDirectiveDeclaration<NgxInput, "[ngxInput],ngx-input", never, {}, {}, never, never, true, never>;
38
+ }
39
+
40
+ declare class NgxError {
41
+ readonly el: ElementRef<HTMLElement>;
42
+ static ɵfac: i0.ɵɵFactoryDeclaration<NgxError, never>;
43
+ static ɵdir: i0.ɵɵDirectiveDeclaration<NgxError, "[ngxError],ngx-error", never, {}, {}, never, never, true, never>;
44
+ }
45
+
46
+ declare class NgxHint {
47
+ readonly el: ElementRef<HTMLElement>;
48
+ static ɵfac: i0.ɵɵFactoryDeclaration<NgxHint, never>;
49
+ static ɵdir: i0.ɵɵDirectiveDeclaration<NgxHint, "[ngxHint],ngx-hint", never, {}, {}, never, never, true, never>;
50
+ }
51
+
52
+ declare class NgxPrefix {
53
+ readonly el: ElementRef<HTMLElement>;
54
+ static ɵfac: i0.ɵɵFactoryDeclaration<NgxPrefix, never>;
55
+ static ɵdir: i0.ɵɵDirectiveDeclaration<NgxPrefix, "[ngxPrefix],ngx-prefix", never, {}, {}, never, never, true, never>;
56
+ }
57
+
58
+ declare class NgxSuffix {
59
+ readonly el: ElementRef<HTMLElement>;
60
+ static ɵfac: i0.ɵɵFactoryDeclaration<NgxSuffix, never>;
61
+ static ɵdir: i0.ɵɵDirectiveDeclaration<NgxSuffix, "[ngxSuffix],ngx-suffix", never, {}, {}, never, never, true, never>;
62
+ }
63
+
64
+ declare const MX_FORM_FIELD: InjectionToken<MgxFormFieldRef>;
65
+ declare class MgxFormFieldRef {
66
+ readonly value: i0.WritableSignal<string>;
29
67
  }
30
68
 
31
- export { NgxFormField };
69
+ export { MX_FORM_FIELD, MgxFormFieldRef, NgxError, NgxFormField, NgxHint, NgxInput, NgxPrefix, NgxSuffix };
@@ -53,6 +53,24 @@ declare class NgxPointerDragDirective {
53
53
  }
54
54
 
55
55
  type Corner = 'nw' | 'ne' | 'sw' | 'se';
56
+
57
+ declare class NgxImageEditorLocalization {
58
+ LoadingImage: string;
59
+ Rotation: string;
60
+ Brightness: string;
61
+ Contrast: string;
62
+ Saturation: string;
63
+ Filter: string;
64
+ None: string;
65
+ Grayscale: string;
66
+ Sepia: string;
67
+ Invert: string;
68
+ Cartoon: string;
69
+ Cancel: string;
70
+ Save: string;
71
+ Saving: string;
72
+ }
73
+
56
74
  /**
57
75
  * ویرایشگر تصویر: کراپ + چرخش + روشنایی/کنتراست/اشباع + فیلترهای آماده
58
76
  * (سیاه‌وسفید، سپیا، معکوس، کارتونی) + فشرده‌سازی خروجی. کاملاً روی Canvas
@@ -65,7 +83,7 @@ type Corner = 'nw' | 'ne' | 'sw' | 'se';
65
83
  * save()، رندر نهایی از روی تصویر اصلیِ کامل انجام می‌شه.
66
84
  */
67
85
  declare class NgxImageEditorComponent {
68
- source: _angular_core.InputSignal<string | Blob | File | null>;
86
+ source: _angular_core.InputSignal<string | File | Blob | null>;
69
87
  /** قفل نسبتِ کراپ (مثلاً ۱ برای آواتار مربعی)؛ undefined یعنی آزاد */
70
88
  aspectRatio: _angular_core.InputSignal<number | undefined>;
71
89
  outputMaxWidth: _angular_core.InputSignal<number | undefined>;
@@ -73,6 +91,9 @@ declare class NgxImageEditorComponent {
73
91
  outputType: _angular_core.InputSignal<"image/jpeg" | "image/png" | "image/webp">;
74
92
  /** حداکثر عرض نمایشِ ناحیه‌ی کراپ روی صفحه (پیکسل) */
75
93
  displayMaxWidth: _angular_core.InputSignal<number>;
94
+ quality: _angular_core.InputSignal<number>;
95
+ defaultLocalization: NgxImageEditorLocalization;
96
+ localize: _angular_core.InputSignal<NgxImageEditorLocalization>;
76
97
  saved: _angular_core.OutputEmitterRef<NgxImageEditorResult>;
77
98
  cancelled: _angular_core.OutputEmitterRef<void>;
78
99
  protected readonly loading: _angular_core.WritableSignal<boolean>;
@@ -85,7 +106,6 @@ declare class NgxImageEditorComponent {
85
106
  protected readonly contrast: _angular_core.WritableSignal<number>;
86
107
  protected readonly saturation: _angular_core.WritableSignal<number>;
87
108
  protected readonly filterPreset: _angular_core.WritableSignal<NgxImageFilterPreset>;
88
- protected readonly quality: _angular_core.WritableSignal<number>;
89
109
  protected readonly crop: _angular_core.WritableSignal<NgxCropRect>;
90
110
  protected readonly adjustments: _angular_core.Signal<NgxImageEditorAdjustments>;
91
111
  /** تصویرِ (کوچیک‌شده‌یِ) چرخیده — پایه‌ی نمایش صحنه‌ی کراپ */
@@ -117,7 +137,7 @@ declare class NgxImageEditorComponent {
117
137
  protected cancel(): void;
118
138
  save(): Promise<void>;
119
139
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<NgxImageEditorComponent, never>;
120
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<NgxImageEditorComponent, "ngx-image-editor", never, { "source": { "alias": "source"; "required": false; "isSignal": true; }; "aspectRatio": { "alias": "aspectRatio"; "required": false; "isSignal": true; }; "outputMaxWidth": { "alias": "outputMaxWidth"; "required": false; "isSignal": true; }; "outputMaxHeight": { "alias": "outputMaxHeight"; "required": false; "isSignal": true; }; "outputType": { "alias": "outputType"; "required": false; "isSignal": true; }; "displayMaxWidth": { "alias": "displayMaxWidth"; "required": false; "isSignal": true; }; }, { "saved": "saved"; "cancelled": "cancelled"; }, never, never, true, never>;
140
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<NgxImageEditorComponent, "ngx-image-editor", never, { "source": { "alias": "source"; "required": false; "isSignal": true; }; "aspectRatio": { "alias": "aspectRatio"; "required": false; "isSignal": true; }; "outputMaxWidth": { "alias": "outputMaxWidth"; "required": false; "isSignal": true; }; "outputMaxHeight": { "alias": "outputMaxHeight"; "required": false; "isSignal": true; }; "outputType": { "alias": "outputType"; "required": false; "isSignal": true; }; "displayMaxWidth": { "alias": "displayMaxWidth"; "required": false; "isSignal": true; }; "quality": { "alias": "quality"; "required": false; "isSignal": true; }; "localize": { "alias": "localize"; "required": false; "isSignal": true; }; }, { "saved": "saved"; "cancelled": "cancelled"; }, never, never, true, never>;
121
141
  }
122
142
 
123
143
  /** یه File/Blob/data-URL/URL رو به یک HTMLImageElement بارگذاری‌شده تبدیل می‌کنه */
@@ -1,25 +1,16 @@
1
+ import * as ngx_kit_time_picker from 'ngx-kit/time-picker';
1
2
  import * as _angular_core from '@angular/core';
2
- import { OnInit, ElementRef } from '@angular/core';
3
+ import { OnInit, ElementRef, InjectionToken, Provider } from '@angular/core';
3
4
  import { BrowserService } from 'ngx-kit/shared';
4
5
  import { ControlValueAccessor, Validator, AbstractControl, ValidationErrors } from '@angular/forms';
5
6
 
6
- declare class NgxTimePickerConfig {
7
- cancelButtonText: string;
8
- confirmButtonText: string;
9
- amText: string;
10
- pmText: string;
11
- format: '12' | '24';
12
- minuteStep: number;
13
- autoSwitchToMinute: boolean;
14
- }
15
-
16
7
  declare type NgxTimePickerMode = 'hour' | 'minute';
17
8
 
18
9
  declare class NgxInputTimePickerComponent implements ControlValueAccessor, Validator, OnInit {
19
10
  protected readonly browserService: BrowserService;
20
11
  readonly change: _angular_core.OutputEmitterRef<string | null>;
21
12
  readonly cancel: _angular_core.OutputEmitterRef<void>;
22
- protected readonly config: NgxTimePickerConfig;
13
+ protected readonly config: ngx_kit_time_picker.NgxTimePickerConfig;
23
14
  isDisabled: boolean;
24
15
  /**
25
16
  * Time value.
@@ -113,7 +104,7 @@ declare class NgxInputTimePickerComponent implements ControlValueAccessor, Valid
113
104
 
114
105
  declare class NgxInputTimePicker implements ControlValueAccessor, Validator {
115
106
  private el;
116
- protected readonly config: NgxTimePickerConfig;
107
+ protected readonly config: ngx_kit_time_picker.NgxTimePickerConfig;
117
108
  openOnCLick: _angular_core.InputSignal<boolean>;
118
109
  readonly change: _angular_core.OutputEmitterRef<string | null>;
119
110
  protected readonly value: _angular_core.WritableSignal<string>;
@@ -145,5 +136,19 @@ declare class NgxInputTimePicker implements ControlValueAccessor, Validator {
145
136
  static ɵdir: _angular_core.ɵɵDirectiveDeclaration<NgxInputTimePicker, "[ngxInputTimePicker]", ["ngxInputTimePicker"], { "openOnCLick": { "alias": "openOnCLick"; "required": false; "isSignal": true; }; "format": { "alias": "format"; "required": false; "isSignal": true; }; }, { "change": "change"; }, never, never, true, never>;
146
137
  }
147
138
 
148
- export { NgxInputTimePicker, NgxInputTimePickerComponent };
139
+ declare class NgxTimePickerConfig {
140
+ cancelButtonText: string;
141
+ confirmButtonText: string;
142
+ amText: string;
143
+ pmText: string;
144
+ format: '12' | '24';
145
+ minuteStep: number;
146
+ autoSwitchToMinute: boolean;
147
+ }
148
+ declare const DEFAULT_TIME_PICKER_CONFIG: NgxTimePickerConfig;
149
+ declare const NGX_TIME_PICKER_CONFIG: InjectionToken<NgxTimePickerConfig>;
150
+
151
+ declare function provideTimePicker(config: Partial<NgxTimePickerConfig>): Provider[];
152
+
153
+ export { DEFAULT_TIME_PICKER_CONFIG, NGX_TIME_PICKER_CONFIG, NgxInputTimePicker, NgxInputTimePickerComponent, NgxTimePickerConfig, provideTimePicker };
149
154
  export type { NgxTimePickerMode };