ngx-kit 5.0.0 → 6.0.1
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 +9 -2
- 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 +50 -24
- package/fesm2022/ngx-kit-message.mjs.map +1 -1
- package/fesm2022/ngx-kit-notify.mjs +1 -4
- package/fesm2022/ngx-kit-notify.mjs.map +1 -1
- package/fesm2022/ngx-kit-shared.mjs +126 -83
- package/fesm2022/ngx-kit-shared.mjs.map +1 -1
- package/fesm2022/ngx-kit-time-picker.mjs +602 -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 +1 -0
- 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 +13 -3
- package/types/ngx-kit-notify.d.ts +0 -1
- package/types/ngx-kit-shared.d.ts +44 -13
- package/types/ngx-kit-time-picker.d.ts +149 -0
package/README.md
CHANGED
|
@@ -1,2 +1,3 @@
|
|
|
1
|
-
# NgxInput
|
|
2
|
-
|
|
1
|
+
# NgxInput
|
|
2
|
+
|
|
3
|
+
## Comming Soon...
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# ngx-kit/angle-selector
|
|
2
|
+
|
|
3
|
+
انتخابگر زاویه (۰ تا ۳۶۰ درجه) با یه دستگیرهی قابلدرگِ دایرهای — برای تنظیمِ جهتِ گرادیان، چرخشِ سایه، یا هر مقدارِ زاویهای دیگه.
|
|
4
|
+
|
|
5
|
+
## نصب
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install ngx-kit
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## استفاده
|
|
12
|
+
|
|
13
|
+
```html
|
|
14
|
+
<ngx-input-angle [(ngModel)]="angle"></ngx-input-angle>
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
یا روی یه input معمولی:
|
|
18
|
+
|
|
19
|
+
```html
|
|
20
|
+
<input type="number" [ngxInputAngle]="angle" (change)="angle = $event" />
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## API
|
|
24
|
+
|
|
25
|
+
| ورودی | نوع | پیشفرض | توضیح |
|
|
26
|
+
| --------------------- | ----------------------------- | -------- | -------------------------- |
|
|
27
|
+
| `theme` | `'light' \| 'dark' \| 'auto'` | `'auto'` | تمِ کامپوننت |
|
|
28
|
+
| `change` _(دایرکتیو)_ | `EventEmitter<number>` | | زاویهی جدید (بر حسب درجه) |
|
|
29
|
+
|
|
30
|
+
مقدار همیشه یه عددِ بین `0` تا `360` هست.
|
|
31
|
+
|
|
32
|
+
## دارکمود و RTL
|
|
33
|
+
|
|
34
|
+
خودکار پشتیبانی میشه. دستگیره با RxJS (`switchMap` + `takeUntil` + `takeUntilDestroyed`) پیاده شده، پس listenerهای درگ فقط دقیقاً حین یه درگِ واقعی فعالن.
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# ngx-kit/box-shadow
|
|
2
|
+
|
|
3
|
+
ابزار بصریِ ساختِ `box-shadow`: جابهجاییِ سایه با درگِ ماوس/تاچ روی یه صفحهی دوبعدی، بههمراه کنترلِ بلور، پخش (spread)، و رنگ.
|
|
4
|
+
|
|
5
|
+
## نصب
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install ngx-kit
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## استفاده
|
|
12
|
+
|
|
13
|
+
```html
|
|
14
|
+
<ngx-box-shadow [(ngModel)]="shadowCss"></ngx-box-shadow>
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
یا روی یه input معمولی:
|
|
18
|
+
|
|
19
|
+
```html
|
|
20
|
+
<input type="text" [ngxInputBoxShadow]="shadowCss" (change)="shadowCss = $event" />
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
خروجی یه رشتهی معتبرِ CSS مثل `0px 4px 12px 0px rgba(0,0,0,0.25)` هست.
|
|
24
|
+
|
|
25
|
+
## API
|
|
26
|
+
|
|
27
|
+
| ورودی | نوع | پیشفرض | توضیح |
|
|
28
|
+
| --------------------------------- | --------- | ------- | ----------------------------------------- |
|
|
29
|
+
| `setInputBackground` _(دایرکتیو)_ | `boolean` | `true` | نمایش رنگِ سایه بهعنوان پسزمینهی input |
|
|
30
|
+
|
|
31
|
+
## دارکمود و RTL
|
|
32
|
+
|
|
33
|
+
خودکار پشتیبانی میشه. صفحهی درگِ سایه با Pointer Capture پیاده شده (بدون نیاز به listener سراسری روی document)، پس روی موبایل هم روون کار میکنه.
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# ngx-kit/color-picker
|
|
2
|
+
|
|
3
|
+
انتخابگر رنگ کامل: پیکر بصری (اشباع/فام)، ورودی RGB/HSL/CMYK/HEX، کانال آلفا، و پشتیبانی از EyeDropper API مرورگر برای برداشتن رنگ از هرجای صفحه.
|
|
4
|
+
|
|
5
|
+
## نصب
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install ngx-kit
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## استفاده بهعنوان کامپوننت
|
|
12
|
+
|
|
13
|
+
```html
|
|
14
|
+
<ngx-input-color
|
|
15
|
+
[(ngModel)]="color"
|
|
16
|
+
[outputType]="'HEX'"
|
|
17
|
+
[defaultInspector]="ColorInspector.Picker"></ngx-input-color>
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
`NgxInputColorComponent` یه `ControlValueAccessor` کامله، پس با `ngModel`، `formControl`، `formControlName` همه کار میکنه.
|
|
21
|
+
|
|
22
|
+
## استفاده بهعنوان دایرکتیو (روی یه input معمولی)
|
|
23
|
+
|
|
24
|
+
```html
|
|
25
|
+
<input type="text" [ngxInputColor]="color" (change)="color = $event" [outputType]="'RGB'" />
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## API
|
|
29
|
+
|
|
30
|
+
### `<ngx-input-color>` / `[ngxInputColor]`
|
|
31
|
+
|
|
32
|
+
| ورودی | نوع | پیشفرض | توضیح |
|
|
33
|
+
| ------------------------------------------ | ------------------------------------------------- | -------- | ----------------------------------------------------------- |
|
|
34
|
+
| `theme` | `'light' \| 'dark' \| 'auto'` | `'auto'` | `'auto'` یعنی از `prefers-color-scheme` مرورگر پیروی میکنه |
|
|
35
|
+
| `simpleMode` | `boolean` | `false` | حالت جمعوجورتر UI |
|
|
36
|
+
| `outputType` | `'HEX' \| 'RGB' \| 'HSL' \| 'HSV' \| 'CMYK'` | `'HEX'` | فرمتِ رشتهی خروجی |
|
|
37
|
+
| `defaultInspector` | `ColorInspector` (`Picker \| RGB \| HSL \| CMYK`) | `Picker` | تبِ پیشفرضِ باز |
|
|
38
|
+
| `useAlphaChannel` | `boolean` | `true` | نمایش/عدمنمایش کانال شفافیت |
|
|
39
|
+
| `setInputBackgroundColor` _(فقط دایرکتیو)_ | `boolean` | `true` | پسزمینهی خودِ input رو به رنگ انتخابشده تنظیم میکنه |
|
|
40
|
+
| `change` _(خروجی، فقط دایرکتیو)_ | `EventEmitter<string>` | | مقدار جدید هر بار که رنگ عوض بشه |
|
|
41
|
+
|
|
42
|
+
### فرمتهای ورودی/خروجی
|
|
43
|
+
|
|
44
|
+
مقدار میتونه هر کدوم از اینها باشه: `#rrggbb`, `#rrggbbaa` (شامل مخفف ۳ و ۴ کاراکتری با آلفا)، `rgb()`/`rgba()`، `hsl()`/`hsla()`.
|
|
45
|
+
|
|
46
|
+
## EyeDropper
|
|
47
|
+
|
|
48
|
+
اگه مرورگر کاربر از [EyeDropper API](https://developer.mozilla.org/en-US/docs/Web/API/EyeDropper) پشتیبانی کنه (کروم/اج جدید)، دکمهی قطرهچکان خودکار فعال میشه و کاربر میتونه رنگ رو از هرجای صفحه (حتی بیرون از مرورگر) بردارد. در مرورگرهایی که پشتیبانی نمیکنن، این دکمه مخفی میمونه.
|
|
49
|
+
|
|
50
|
+
## دارکمود و RTL
|
|
51
|
+
|
|
52
|
+
خودکار پشتیبانی میشه.
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
# ngx-kit/data-table
|
|
2
|
+
|
|
3
|
+
جدول دادهی سیگنالمحور با تایپسیفتیِ کامل: تعریف ستونها و رندررهای سفارشی طوری تایپ شدن که TypeScript خودش جلوی ستونهای نامعتبر یا `rendererInputs` غلط رو میگیره. سورت (تک/چندستونه)، صفحهبندی، حالت lazy (سمت سرور)، و ریسایز ستون با Pointer Capture.
|
|
4
|
+
|
|
5
|
+
## نصب
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install ngx-kit
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## راهاندازی رندررها (اختیاری، ولی توصیهشده)
|
|
12
|
+
|
|
13
|
+
```ts
|
|
14
|
+
// app.config.ts
|
|
15
|
+
import { provideTable, defineRenderers } from 'ngx-kit/data-table';
|
|
16
|
+
import { AvatarCellRenderer, BooleanCellRenderer } from './cell-renderers';
|
|
17
|
+
|
|
18
|
+
export const appConfig: ApplicationConfig = {
|
|
19
|
+
providers: [
|
|
20
|
+
provideTable({
|
|
21
|
+
renderers: defineRenderers({ avatar: AvatarCellRenderer, boolean: BooleanCellRenderer }),
|
|
22
|
+
column: { minWidth: 80, maxWidth: 480, defaultWidth: 160 },
|
|
23
|
+
}),
|
|
24
|
+
],
|
|
25
|
+
};
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## تعریفِ type-safe ستونها
|
|
29
|
+
|
|
30
|
+
```ts
|
|
31
|
+
interface Tenant {
|
|
32
|
+
avatarUrl: string;
|
|
33
|
+
name: string;
|
|
34
|
+
isActive: boolean;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
const renderers = defineRenderers({ avatar: AvatarCellRenderer, boolean: BooleanCellRenderer });
|
|
38
|
+
|
|
39
|
+
const fields = defineFields<Tenant, typeof renderers>(renderers, [
|
|
40
|
+
{ column: 'avatarUrl', title: 'کاربر', renderer: 'avatar', rendererInputs: { showName: true } }, // ✅ تایپچک میشه
|
|
41
|
+
{ column: 'name', title: 'نام', sortable: true },
|
|
42
|
+
{ column: 'isActive', title: 'فعال', renderer: 'boolean', align: 'center' },
|
|
43
|
+
]);
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
اگه `column` یه فیلدِ واقعیِ `Tenant` نباشه، یا `renderer` یه کلیدِ واقعیِ رجیستری نباشه، یا `rendererInputs` با ورودیهای واقعیِ اون رندرر همخونی نداشته باشه — کامپایل خطا میده، نه فقط runtime.
|
|
47
|
+
|
|
48
|
+
## استفاده در تمپلیت
|
|
49
|
+
|
|
50
|
+
```html
|
|
51
|
+
<ngx-table
|
|
52
|
+
[fields]="fields"
|
|
53
|
+
[data]="tenants"
|
|
54
|
+
[totalRecords]="tenants.length"
|
|
55
|
+
[pageSize]="20"
|
|
56
|
+
(sortChange)="onSortChange($event)"></ngx-table>
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
### حالت lazy (صفحهبندی/سورت سمت سرور)
|
|
60
|
+
|
|
61
|
+
```html
|
|
62
|
+
<ngx-table
|
|
63
|
+
[fields]="fields"
|
|
64
|
+
[data]="page"
|
|
65
|
+
[totalRecords]="total"
|
|
66
|
+
[lazy]="true"
|
|
67
|
+
(lazyLoad)="fetchPage($event)"></ngx-table>
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
```ts
|
|
71
|
+
fetchPage(ev: LazyLoadEvent<Tenant>) {
|
|
72
|
+
// ev.pageIndex, ev.pageSize, ev.first, ev.sorts
|
|
73
|
+
this.api.getTenants(ev).subscribe((res) => { this.page = res.data; this.total = res.total; });
|
|
74
|
+
}
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
## API
|
|
78
|
+
|
|
79
|
+
### ورودیهای `<ngx-table>`
|
|
80
|
+
|
|
81
|
+
| ورودی | نوع | توضیح |
|
|
82
|
+
| ------------------ | --------------------------------- | ------------------------------------------------------------- |
|
|
83
|
+
| `fields` | `TableField<T, R>[]` **(اجباری)** | تعریفِ ستونها (از `defineFields`) |
|
|
84
|
+
| `data` | `readonly T[]` **(اجباری)** | دیتای صفحهی جاری |
|
|
85
|
+
| `totalRecords` | `number` **(اجباری)** | تعداد کل ردیفها (برای صفحهبندی) |
|
|
86
|
+
| `pageSize` | `number` | پیشفرض از `provideTable` |
|
|
87
|
+
| `lazy` | `boolean` | اگه `true`، سورت/صفحهبندی رو خودِ اپ مدیریت میکنه (نه جدول) |
|
|
88
|
+
| `loading` | `boolean` | نمایش وضعیتِ بارگذاری |
|
|
89
|
+
| `showRecordNumber` | `boolean` | نمایش ستونِ شمارهی ردیف |
|
|
90
|
+
|
|
91
|
+
### خروجیها
|
|
92
|
+
|
|
93
|
+
| خروجی | نوع | توضیح |
|
|
94
|
+
| -------------- | ---------------------------------- | ----------------------------------------------------------------------------- |
|
|
95
|
+
| `sortChange` | `SortMeta<T>[]` | تغییرِ سورت (حالت غیر-lazy) |
|
|
96
|
+
| `lazyLoad` | `LazyLoadEvent<T>` | صفحه/سورتِ جدید (حالت lazy) — شاملِ `pageIndex`, `pageSize`, `first`, `sorts` |
|
|
97
|
+
| `columnResize` | `{ field: string; width: number }` | تغییرِ عرضِ ستون |
|
|
98
|
+
|
|
99
|
+
### تعریفِ یه رندررِ سفارشی
|
|
100
|
+
|
|
101
|
+
```ts
|
|
102
|
+
@Component({
|
|
103
|
+
standalone: true,
|
|
104
|
+
selector: 'app-avatar-cell',
|
|
105
|
+
template: `
|
|
106
|
+
<img [src]="value()" />
|
|
107
|
+
<span *ngIf="showName()">{{ row().name }}</span>
|
|
108
|
+
`,
|
|
109
|
+
})
|
|
110
|
+
export class AvatarCellRenderer implements CellRendererComponent<string, Tenant> {
|
|
111
|
+
value = input.required<string>();
|
|
112
|
+
row = input.required<Tenant>();
|
|
113
|
+
field = input.required<TableFieldBase<Tenant>>();
|
|
114
|
+
showName = input(false); // این خودکار به rendererInputs اضافه میشه
|
|
115
|
+
}
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
## دارکمود و RTL
|
|
119
|
+
|
|
120
|
+
خودکار پشتیبانی میشه.
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
# ngx-kit/date-picker
|
|
2
|
+
|
|
3
|
+
انتخابگر تاریخ با پشتیبانی از چهار تقویم: میلادی، جلالی (شمسی)، هجری قمری، و چینی — با یه معماریِ آداپترمحور که اضافهکردنِ تقویمهای دیگه رو هم ممکن میکنه. یه کامپوننتِ تقویمِ مستقل (`ngx-calendar`) هم داره که بدون input قابلاستفادهست.
|
|
4
|
+
|
|
5
|
+
## نصب
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install ngx-kit
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## راهاندازی
|
|
12
|
+
|
|
13
|
+
آداپترهای تقویم باید provide بشن (پیشفرض هر چهارتاش رو با هم میده؛ اگه فقط بعضیهاشون رو لازم دارید، bundle سبکتر میمونه چون هرکدوم لازی import میشن):
|
|
14
|
+
|
|
15
|
+
```ts
|
|
16
|
+
// app.config.ts
|
|
17
|
+
import { provideDateAdapters } from 'ngx-kit/date-picker';
|
|
18
|
+
|
|
19
|
+
export const appConfig: ApplicationConfig = {
|
|
20
|
+
providers: [provideDateAdapters()],
|
|
21
|
+
};
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## استفاده
|
|
25
|
+
|
|
26
|
+
```html
|
|
27
|
+
<input
|
|
28
|
+
type="text"
|
|
29
|
+
[ngxInputDatePicker]="date"
|
|
30
|
+
(change)="date = $event"
|
|
31
|
+
[locale]="'fa'"
|
|
32
|
+
[displayFormat]="'yyyy/MM/dd'" />
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
```html
|
|
36
|
+
<ngx-calendar [locale]="'fa'" [theme]="'auto'"></ngx-calendar>
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
## API
|
|
40
|
+
|
|
41
|
+
### `[ngxInputDatePicker]`
|
|
42
|
+
|
|
43
|
+
| ورودی | نوع | پیشفرض | توضیح |
|
|
44
|
+
| ------------------ | ----------------------------------------------------------------------- | -------------- | -------------------------------------------------------------------------------------- |
|
|
45
|
+
| `locale` | `string` (`'en'`, `'fa'`, `'hi'`, `'zh'`, یا هر لوکیلِ سفارشیِ ثبتشده) | `'en'` | تقویمی که استفاده میشه |
|
|
46
|
+
| `theme` | `'light' \| 'dark' \| 'auto'` | `'auto'` | |
|
|
47
|
+
| `displayFormat` | `string` | `'yyyy/MM/dd'` | فرمتِ نمایشِ متنیِ تاریخ |
|
|
48
|
+
| `min` / `max` | `Date` | | محدودهی مجاز |
|
|
49
|
+
| `config` | `NgxDatePickerConfig` | | نمایش/متنِ دکمههای «امروز»/«پاک کردن»، تمپلیتهای سفارشیِ آیکونها |
|
|
50
|
+
| `change` _(خروجی)_ | `EventEmitter<Date>` | | تاریخِ انتخابشده (همیشه یه شیءِ `Date` استاندارد جاوااسکریپت، مستقل از تقویمِ نمایشی) |
|
|
51
|
+
|
|
52
|
+
### `getLocals()`
|
|
53
|
+
|
|
54
|
+
لیستِ لوکیلهای فعلاً ثبتشده رو برمیگردونه (برای مثال برای پرکردنِ یه `<select>` انتخابِ زبان):
|
|
55
|
+
|
|
56
|
+
```ts
|
|
57
|
+
availableLocals = getLocals(); // ['en', 'fa', 'hi', 'zh']
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
### افزودن یه تقویمِ سفارشی
|
|
61
|
+
|
|
62
|
+
```ts
|
|
63
|
+
provideDateAdapters({ locale: 'ja', useClass: MyJapaneseAdapter });
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
`MyJapaneseAdapter` باید اینترفیس `IDateAdapter` رو پیاده کنه.
|
|
67
|
+
|
|
68
|
+
## نکتهی پرفورمنس
|
|
69
|
+
|
|
70
|
+
تقویمهای هجری و چینی (که جدولی/نجومیان، نه فرمولی مثلِ میلادی/جلالی) نتایجِ محاسباتشون رو داخلی cache میکنن — چون رندر یه ماهِ تقویم، برای هر خانهی روز جدا محاسبهی تاریخ رو صدا میزنه؛ بدون کش، این میتونست برای سالهای دور از امروز چند صد میلیثانیه طول بکشه.
|
|
71
|
+
|
|
72
|
+
## دارکمود و RTL
|
|
73
|
+
|
|
74
|
+
خودکار پشتیبانی میشه (تقویمِ جلالی/هجری بهطور طبیعی هم RTL هستن).
|
package/dialog/README.md
CHANGED
|
@@ -1,169 +1,94 @@
|
|
|
1
|
-
#
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
ok() {
|
|
96
|
-
alert('param=' + new JsonPipe().transform(this.data));
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
cancel() {
|
|
100
|
-
this.dialogRef.close(this.data);
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
openNewDialog() {
|
|
105
|
-
this.ngxDialog.open(ModalComponent, {
|
|
106
|
-
data: {
|
|
107
|
-
a: this.data.a + 1
|
|
108
|
-
}
|
|
109
|
-
}).afterClosed.subscribe((r: any) => {
|
|
110
|
-
console.log('child closed result=', r);
|
|
111
|
-
});
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
}
|
|
115
|
-
```
|
|
116
|
-
|
|
117
|
-
## Modal html
|
|
118
|
-
|
|
119
|
-
```
|
|
120
|
-
<div ngx-dialog-header [showCloseButton]="true">
|
|
121
|
-
header
|
|
122
|
-
</div>
|
|
123
|
-
<div ngx-dialog-body>
|
|
124
|
-
<p>modal works!</p>
|
|
125
|
-
{{data|json}}
|
|
126
|
-
</div>
|
|
127
|
-
<div ngx-dialog-footer [align]="'space-between'">
|
|
128
|
-
<div>
|
|
129
|
-
<button (click)="ok()" type="button" class="btn btn-primary mx-1">ok</button>
|
|
130
|
-
<button (click)="cancel()" type="button" class="btn btn-warning mx-1">cancel</button>
|
|
131
|
-
</div>
|
|
132
|
-
|
|
133
|
-
<button (click)="openNewDialog()" type="button" class="btn btn-info mx-1">open New Dialog</button>
|
|
134
|
-
</div>
|
|
135
|
-
```
|
|
136
|
-
|
|
137
|
-
## For create draggable dialog:
|
|
138
|
-
|
|
139
|
-
you can use NgxDragableResizable library
|
|
140
|
-
[🚀npm](https://www.npmjs.com/package/ngx-dragable-resizable)
|
|
141
|
-
and change dialog header to:
|
|
142
|
-
|
|
143
|
-
```
|
|
144
|
-
<div ngx-dialog-header [showCloseButton]="true" NgxDragableResizable [dragRootElement]="'.ngx-dialog'">
|
|
145
|
-
header
|
|
146
|
-
</div>
|
|
147
|
-
```
|
|
148
|
-
|
|
149
|
-
## Dialog config
|
|
150
|
-
|
|
151
|
-
| Name | Type | Default | Description |
|
|
152
|
-
| -------------------------- | ------- | ------- | ---------------------------------------------------------- |
|
|
153
|
-
| [data] | any | {} | Pass data to modal component |
|
|
154
|
-
| [allowCloseOnOutsideClick] | boolean | false | The user can close the modal by clicking outside the modal |
|
|
155
|
-
| [containerClass] | string | null | Css class name |
|
|
156
|
-
| [header] | string | null | Header config |
|
|
157
|
-
| [footer] | string | null | Footer config |
|
|
158
|
-
| [width] | string | "" | Width of dialog |
|
|
159
|
-
| [minWidth] | string | "" | Minimum width of dialog |
|
|
160
|
-
| [maxWidth] | string | "" | Maximum width of dialog |
|
|
161
|
-
| [height] | string | "" | Height of dialog |
|
|
162
|
-
| [minHeight] | string | "" | Minimum height of dialog |
|
|
163
|
-
| [maxHeight] | string | "" | Maximum height of dialog |
|
|
164
|
-
|
|
165
|
-
## Author
|
|
166
|
-
|
|
167
|
-
💻Mohammadreza samani | FrontEnd Developer
|
|
168
|
-
|
|
169
|
-
[❤️Buy me a coffee 😉](https://www.buymeacoffee.com/mrsamani/ngxdragableresizable)
|
|
1
|
+
# ngx-kit/dialog
|
|
2
|
+
|
|
3
|
+
مودال/دیالوگ روی پایهی `<dialog>` بومیِ مرورگر — بدون overlay دستی، بدون کتابخونهی جانبی.
|
|
4
|
+
|
|
5
|
+
> ⚠️ اگه نسخهی قبلیِ این README رو دیدید که از `DIALOG_REF` یا `ngx-dialog-header` یا پکیج جدای `ngx-dialog` حرف میزد — اون مال یه نسخهی خیلی قدیمیتر بوده و با API فعلی همخونی نداره. این نسخه بهروزه.
|
|
6
|
+
|
|
7
|
+
## نصب
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
npm install ngx-kit
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## راهاندازی
|
|
14
|
+
|
|
15
|
+
```ts
|
|
16
|
+
// app.config.ts
|
|
17
|
+
import { ApplicationConfig, importProvidersFrom } from '@angular/core';
|
|
18
|
+
import { NgxDialogModule } from 'ngx-kit/dialog';
|
|
19
|
+
|
|
20
|
+
export const appConfig: ApplicationConfig = {
|
|
21
|
+
providers: [importProvidersFrom(NgxDialogModule)],
|
|
22
|
+
};
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## باز کردن یه دیالوگ
|
|
26
|
+
|
|
27
|
+
با API استاتیک (بدون تزریق دستیِ سرویس):
|
|
28
|
+
|
|
29
|
+
```ts
|
|
30
|
+
import { Dialog } from 'ngx-kit/dialog';
|
|
31
|
+
|
|
32
|
+
const ref = Dialog.open(MyDialogComponent, {
|
|
33
|
+
data: { userId: 42 },
|
|
34
|
+
width: '480px',
|
|
35
|
+
allowCloseOnOutsideClick: true,
|
|
36
|
+
header: { enable: true, title: 'ویرایش کاربر', showCloseButton: true },
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
ref.afterClosed.subscribe((result) => console.log('نتیجه:', result));
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
داخل کامپوننتِ دیالوگ:
|
|
43
|
+
|
|
44
|
+
```ts
|
|
45
|
+
@Component({ ... })
|
|
46
|
+
export class MyDialogComponent {
|
|
47
|
+
private ref = inject(NgxDialogRef);
|
|
48
|
+
data = inject(NGX_DIALOG_DATA); // دیتایی که با config.data پاس داده شده
|
|
49
|
+
|
|
50
|
+
save() {
|
|
51
|
+
this.ref.close({ saved: true });
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
### دایرکتیوهای layout داخل دیالوگ
|
|
57
|
+
|
|
58
|
+
```html
|
|
59
|
+
<div *ngxDialogHeader>عنوانِ سفارشی</div>
|
|
60
|
+
<div *ngxDialogBody>محتوای اصلی</div>
|
|
61
|
+
<div *ngxDialogFooter>
|
|
62
|
+
<button (click)="save()">ذخیره</button>
|
|
63
|
+
</div>
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
## API
|
|
67
|
+
|
|
68
|
+
### `Dialog.open<T>(component, config?)`
|
|
69
|
+
|
|
70
|
+
| فیلدِ `config` | نوع | پیشفرض | توضیح |
|
|
71
|
+
| ----------------------------------------------------------- | ---------- | ----------- | -------------------------------------------------- |
|
|
72
|
+
| `data` | `T` | `{}` | دیتایی که به کامپوننتِ داخلِ دیالوگ پاس داده میشه |
|
|
73
|
+
| `allowCloseOnOutsideClick` | `boolean` | `false` | بستن با کلیک روی backdrop |
|
|
74
|
+
| `containerClass` | `string` | `'ngx-kit'` | کلاسِ اضافی روی container |
|
|
75
|
+
| `header.enable` / `header.title` / `header.showCloseButton` | | | تنظیمات هدرِ پیشفرض |
|
|
76
|
+
| `footer.enable` | `boolean` | | نمایش فوتر پیشفرض |
|
|
77
|
+
| `width` / `minWidth` / `maxWidth` | `string` | | ابعاد افقی |
|
|
78
|
+
| `height` / `minHeight` / `maxHeight` | `string` | | ابعاد عمودی |
|
|
79
|
+
| `injector` | `Injector` | | تزریقکنندهی سفارشی برای کامپوننتِ داخلی |
|
|
80
|
+
|
|
81
|
+
### `NgxDialogRef`
|
|
82
|
+
|
|
83
|
+
| عضو | توضیح |
|
|
84
|
+
| ------------------------------ | ----------------------------------------- |
|
|
85
|
+
| `close(result?)` | بستن دیالوگ، با ارسال یه نتیجهی اختیاری |
|
|
86
|
+
| `afterClosed: Observable<any>` | با `result` صدا زده میشه بعد از بستهشدن |
|
|
87
|
+
|
|
88
|
+
## نکتهی SSR
|
|
89
|
+
|
|
90
|
+
`Dialog.open(...)` یه API استاتیک/سراسریه که برای اپهای معمولیِ مرورگری کاملاً امنه. اگه از Angular SSR استفاده میکنید، این static instance بینِ درخواستهای همزمانِ سرور مشترکه — بهجای API استاتیک، مستقیماً `NgxOverlayService` رو تزریق و ازش استفاده کنید (که per-injector/per-request امنه).
|
|
91
|
+
|
|
92
|
+
## دارکمود و RTL
|
|
93
|
+
|
|
94
|
+
خودکار پشتیبانی میشه (`light-dark()` + CSS logical properties).
|