@es.framework/ng.ui.core 2.0.66 → 2.0.67
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 -3
- package/attachments/README.md +3 -3
- package/base-crud/README.md +3 -3
- package/breadcrumb/README.md +3 -3
- package/checkbox/README.md +3 -3
- package/collapsible/README.md +3 -3
- package/color-picker/README.md +3 -3
- package/column-settings-popover/README.md +3 -3
- package/custom-switch/README.md +3 -3
- package/datepicker/README.md +3 -3
- package/deactivation-reason/README.md +3 -3
- package/excel-import/README.md +3 -3
- package/fesm2022/es.framework-ng.ui.core-attachments.mjs +2 -2
- package/fesm2022/es.framework-ng.ui.core-attachments.mjs.map +1 -1
- package/fesm2022/es.framework-ng.ui.core-base-crud.mjs.map +1 -1
- package/fesm2022/es.framework-ng.ui.core-breadcrumb.mjs +110 -109
- package/fesm2022/es.framework-ng.ui.core-breadcrumb.mjs.map +1 -1
- package/fesm2022/es.framework-ng.ui.core-checkbox.mjs +54 -54
- package/fesm2022/es.framework-ng.ui.core-checkbox.mjs.map +1 -1
- package/fesm2022/es.framework-ng.ui.core-collapsible.mjs.map +1 -1
- package/fesm2022/es.framework-ng.ui.core-color-picker.mjs +44 -44
- package/fesm2022/es.framework-ng.ui.core-color-picker.mjs.map +1 -1
- package/fesm2022/es.framework-ng.ui.core-column-settings-popover.mjs +2 -2
- package/fesm2022/es.framework-ng.ui.core-column-settings-popover.mjs.map +1 -1
- package/fesm2022/es.framework-ng.ui.core-custom-switch.mjs.map +1 -1
- package/fesm2022/es.framework-ng.ui.core-datepicker.mjs +178 -178
- package/fesm2022/es.framework-ng.ui.core-datepicker.mjs.map +1 -1
- package/fesm2022/es.framework-ng.ui.core-deactivation-reason.mjs +46 -46
- package/fesm2022/es.framework-ng.ui.core-deactivation-reason.mjs.map +1 -1
- package/fesm2022/es.framework-ng.ui.core-excel-import.mjs.map +1 -1
- package/fesm2022/es.framework-ng.ui.core-filter-templates.mjs +624 -624
- package/fesm2022/es.framework-ng.ui.core-filter-templates.mjs.map +1 -1
- package/fesm2022/es.framework-ng.ui.core-form-button.mjs.map +1 -1
- package/fesm2022/es.framework-ng.ui.core-form-field.mjs +80 -80
- package/fesm2022/es.framework-ng.ui.core-form-field.mjs.map +1 -1
- package/fesm2022/es.framework-ng.ui.core-form-template.mjs.map +1 -1
- package/fesm2022/es.framework-ng.ui.core-formly-avatar-image.mjs.map +1 -1
- package/fesm2022/es.framework-ng.ui.core-formly-avatar-label.mjs +44 -44
- package/fesm2022/es.framework-ng.ui.core-formly-avatar-label.mjs.map +1 -1
- package/fesm2022/es.framework-ng.ui.core-formly-button-selector.mjs +92 -92
- package/fesm2022/es.framework-ng.ui.core-formly-button-selector.mjs.map +1 -1
- package/fesm2022/es.framework-ng.ui.core-formly-button.mjs +24 -24
- package/fesm2022/es.framework-ng.ui.core-formly-button.mjs.map +1 -1
- package/fesm2022/es.framework-ng.ui.core-formly-presets.mjs.map +1 -1
- package/fesm2022/es.framework-ng.ui.core-formly-prime-icon-picker.mjs +366 -366
- package/fesm2022/es.framework-ng.ui.core-formly-prime-icon-picker.mjs.map +1 -1
- package/fesm2022/es.framework-ng.ui.core-formly-split-button.mjs +16 -16
- package/fesm2022/es.framework-ng.ui.core-formly-split-button.mjs.map +1 -1
- package/fesm2022/es.framework-ng.ui.core-formly-ui-all.mjs.map +1 -1
- package/fesm2022/es.framework-ng.ui.core-formly-ui.mjs.map +1 -1
- package/fesm2022/es.framework-ng.ui.core-formly-username-with-domain.mjs +16 -16
- package/fesm2022/es.framework-ng.ui.core-formly-username-with-domain.mjs.map +1 -1
- package/fesm2022/es.framework-ng.ui.core-generic-assets.mjs.map +1 -1
- package/fesm2022/es.framework-ng.ui.core-generic-autocomplete.mjs +38 -38
- package/fesm2022/es.framework-ng.ui.core-generic-autocomplete.mjs.map +1 -1
- package/fesm2022/es.framework-ng.ui.core-generic-button.mjs +2 -2
- package/fesm2022/es.framework-ng.ui.core-generic-button.mjs.map +1 -1
- package/fesm2022/es.framework-ng.ui.core-generic-card.mjs +2 -2
- package/fesm2022/es.framework-ng.ui.core-generic-card.mjs.map +1 -1
- package/fesm2022/es.framework-ng.ui.core-generic-crud-table.mjs +12 -5
- package/fesm2022/es.framework-ng.ui.core-generic-crud-table.mjs.map +1 -1
- package/fesm2022/es.framework-ng.ui.core-generic-dialog.mjs +2 -2
- package/fesm2022/es.framework-ng.ui.core-generic-dialog.mjs.map +1 -1
- package/fesm2022/es.framework-ng.ui.core-generic-errormessage.mjs +2 -2
- package/fesm2022/es.framework-ng.ui.core-generic-errormessage.mjs.map +1 -1
- package/fesm2022/es.framework-ng.ui.core-generic-formly-fields.mjs +2 -2
- package/fesm2022/es.framework-ng.ui.core-generic-formly-fields.mjs.map +1 -1
- package/fesm2022/es.framework-ng.ui.core-generic-listbox.mjs +64 -64
- package/fesm2022/es.framework-ng.ui.core-generic-listbox.mjs.map +1 -1
- package/fesm2022/es.framework-ng.ui.core-generic-loadingspinner.mjs +2 -2
- package/fesm2022/es.framework-ng.ui.core-generic-loadingspinner.mjs.map +1 -1
- package/fesm2022/es.framework-ng.ui.core-generic-report-tabs.mjs +68 -68
- package/fesm2022/es.framework-ng.ui.core-generic-report-tabs.mjs.map +1 -1
- package/fesm2022/es.framework-ng.ui.core-generic-report.mjs +4 -2
- package/fesm2022/es.framework-ng.ui.core-generic-report.mjs.map +1 -1
- package/fesm2022/es.framework-ng.ui.core-generic-search-advanced.mjs +518 -495
- package/fesm2022/es.framework-ng.ui.core-generic-search-advanced.mjs.map +1 -1
- package/fesm2022/es.framework-ng.ui.core-generic-search.mjs +2 -2
- package/fesm2022/es.framework-ng.ui.core-generic-search.mjs.map +1 -1
- package/fesm2022/es.framework-ng.ui.core-generic-selector.mjs.map +1 -1
- package/fesm2022/es.framework-ng.ui.core-generic-table.mjs +4 -4
- package/fesm2022/es.framework-ng.ui.core-generic-table.mjs.map +1 -1
- package/fesm2022/es.framework-ng.ui.core-generic-view.mjs +2 -2
- package/fesm2022/es.framework-ng.ui.core-generic-view.mjs.map +1 -1
- package/fesm2022/es.framework-ng.ui.core-header-wrapper.mjs +2 -2
- package/fesm2022/es.framework-ng.ui.core-header-wrapper.mjs.map +1 -1
- package/fesm2022/es.framework-ng.ui.core-icon-picker.mjs +106 -106
- package/fesm2022/es.framework-ng.ui.core-icon-picker.mjs.map +1 -1
- package/fesm2022/es.framework-ng.ui.core-input-switch.mjs +58 -58
- package/fesm2022/es.framework-ng.ui.core-input-switch.mjs.map +1 -1
- package/fesm2022/es.framework-ng.ui.core-input-with-icon.mjs +26 -26
- package/fesm2022/es.framework-ng.ui.core-input-with-icon.mjs.map +1 -1
- package/fesm2022/es.framework-ng.ui.core-input.mjs +64 -64
- package/fesm2022/es.framework-ng.ui.core-input.mjs.map +1 -1
- package/fesm2022/es.framework-ng.ui.core-label-type.mjs +16 -16
- package/fesm2022/es.framework-ng.ui.core-label-type.mjs.map +1 -1
- package/fesm2022/es.framework-ng.ui.core-loading-skeletons.mjs +22 -22
- package/fesm2022/es.framework-ng.ui.core-loading-skeletons.mjs.map +1 -1
- package/fesm2022/es.framework-ng.ui.core-odata-query-builder.mjs +2 -2
- package/fesm2022/es.framework-ng.ui.core-odata-query-builder.mjs.map +1 -1
- package/fesm2022/es.framework-ng.ui.core-query-type.mjs +14 -14
- package/fesm2022/es.framework-ng.ui.core-query-type.mjs.map +1 -1
- package/fesm2022/es.framework-ng.ui.core-radio.mjs +30 -30
- package/fesm2022/es.framework-ng.ui.core-radio.mjs.map +1 -1
- package/fesm2022/es.framework-ng.ui.core-repeat.mjs +354 -354
- package/fesm2022/es.framework-ng.ui.core-repeat.mjs.map +1 -1
- package/fesm2022/es.framework-ng.ui.core-select.mjs +84 -84
- package/fesm2022/es.framework-ng.ui.core-select.mjs.map +1 -1
- package/fesm2022/es.framework-ng.ui.core-sidebar-cards.mjs +2 -2
- package/fesm2022/es.framework-ng.ui.core-sidebar-cards.mjs.map +1 -1
- package/fesm2022/es.framework-ng.ui.core-sidebar-toggles.mjs +2 -2
- package/fesm2022/es.framework-ng.ui.core-sidebar-toggles.mjs.map +1 -1
- package/fesm2022/es.framework-ng.ui.core-tabs.mjs +14 -14
- package/fesm2022/es.framework-ng.ui.core-tabs.mjs.map +1 -1
- package/fesm2022/es.framework-ng.ui.core-tag-type.mjs +80 -80
- package/fesm2022/es.framework-ng.ui.core-tag-type.mjs.map +1 -1
- package/fesm2022/es.framework-ng.ui.core-text-editor.mjs.map +1 -1
- package/fesm2022/es.framework-ng.ui.core-textarea.mjs.map +1 -1
- package/fesm2022/es.framework-ng.ui.core-wrappers.mjs +118 -118
- package/fesm2022/es.framework-ng.ui.core-wrappers.mjs.map +1 -1
- package/fesm2022/es.framework-ng.ui.core.mjs +2 -2
- package/fesm2022/es.framework-ng.ui.core.mjs.map +1 -1
- package/filter-templates/README.md +3 -3
- package/form-button/README.md +3 -3
- package/form-field/README.md +3 -3
- package/form-template/README.md +3 -3
- package/formly-avatar-image/README.md +3 -3
- package/formly-avatar-label/README.md +3 -3
- package/formly-button/README.md +3 -3
- package/formly-button-selector/README.md +3 -3
- package/formly-presets/README.md +3 -3
- package/formly-prime-icon-picker/README.md +3 -3
- package/formly-split-button/README.md +3 -3
- package/formly-ui/README.md +3 -3
- package/formly-ui-all/README.md +3 -3
- package/formly-username-with-domain/README.md +3 -3
- package/generic-assets/README.md +3 -3
- package/generic-autocomplete/README.md +3 -3
- package/generic-button/README.md +3 -3
- package/generic-card/README.md +3 -3
- package/generic-crud-table/README.md +3 -3
- package/generic-dialog/README.md +3 -3
- package/generic-errormessage/README.md +3 -3
- package/generic-formly-fields/README.md +3 -3
- package/generic-loadingspinner/README.md +3 -3
- package/generic-report/README.md +3 -3
- package/generic-search/README.md +3 -3
- package/generic-search-advanced/README.md +3 -3
- package/generic-selector/README.md +3 -3
- package/generic-table/README.md +3 -3
- package/generic-view/README.md +3 -3
- package/header-wrapper/README.md +3 -3
- package/icon-picker/README.md +3 -3
- package/input/README.md +3 -3
- package/input-switch/README.md +3 -3
- package/input-with-icon/README.md +3 -3
- package/label-type/README.md +3 -3
- package/loading-skeletons/README.md +3 -3
- package/odata-query-builder/README.md +3 -3
- package/package.json +1 -1
- package/query-type/README.md +3 -3
- package/radio/README.md +3 -3
- package/repeat/README.md +3 -3
- package/select/README.md +3 -3
- package/sidebar-cards/README.md +3 -3
- package/sidebar-toggles/README.md +3 -3
- package/styles.css +0 -0
- package/tabs/README.md +3 -3
- package/tag-type/README.md +3 -3
- package/text-editor/README.md +3 -3
- package/textarea/README.md +3 -3
- package/types/es.framework-ng.ui.core-generic-crud-table.d.ts +1 -0
- package/types/es.framework-ng.ui.core-generic-search-advanced.d.ts +5 -2
- package/wrappers/README.md +3 -3
package/README.md
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
# ng.ui.core
|
|
2
|
-
|
|
3
|
-
This library was generated with [Nx](https://nx.dev).
|
|
1
|
+
# ng.ui.core
|
|
2
|
+
|
|
3
|
+
This library was generated with [Nx](https://nx.dev).
|
package/attachments/README.md
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
# @es.framework/ng.ui.core/attachments
|
|
2
|
-
|
|
3
|
-
Secondary entry point of `@es.framework/ng.ui.core`. It can be used by importing from `@es.framework/ng.ui.core/attachments`.
|
|
1
|
+
# @es.framework/ng.ui.core/attachments
|
|
2
|
+
|
|
3
|
+
Secondary entry point of `@es.framework/ng.ui.core`. It can be used by importing from `@es.framework/ng.ui.core/attachments`.
|
package/base-crud/README.md
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
# @es.framework/ng.ui.core/base-crud
|
|
2
|
-
|
|
3
|
-
Secondary entry point of `@es.framework/ng.ui.core`. It can be used by importing from `@es.framework/ng.ui.core/base-crud`.
|
|
1
|
+
# @es.framework/ng.ui.core/base-crud
|
|
2
|
+
|
|
3
|
+
Secondary entry point of `@es.framework/ng.ui.core`. It can be used by importing from `@es.framework/ng.ui.core/base-crud`.
|
package/breadcrumb/README.md
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
# @es.framework/ng.ui.core/breadcrumb
|
|
2
|
-
|
|
3
|
-
Secondary entry point of `@es.framework/ng.ui.core`. It can be used by importing from `@es.framework/ng.ui.core/breadcrumb`.
|
|
1
|
+
# @es.framework/ng.ui.core/breadcrumb
|
|
2
|
+
|
|
3
|
+
Secondary entry point of `@es.framework/ng.ui.core`. It can be used by importing from `@es.framework/ng.ui.core/breadcrumb`.
|
package/checkbox/README.md
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
# @es.framework/ng.ui.core/checkbox
|
|
2
|
-
|
|
3
|
-
Secondary entry point of `@es.framework/ng.ui.core`. It can be used by importing from `@es.framework/ng.ui.core/checkbox`.
|
|
1
|
+
# @es.framework/ng.ui.core/checkbox
|
|
2
|
+
|
|
3
|
+
Secondary entry point of `@es.framework/ng.ui.core`. It can be used by importing from `@es.framework/ng.ui.core/checkbox`.
|
package/collapsible/README.md
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
# @es.framework/ng.ui.core/collapsible
|
|
2
|
-
|
|
3
|
-
Secondary entry point of `@es.framework/ng.ui.core`. It can be used by importing from `@es.framework/ng.ui.core/collapsible`.
|
|
1
|
+
# @es.framework/ng.ui.core/collapsible
|
|
2
|
+
|
|
3
|
+
Secondary entry point of `@es.framework/ng.ui.core`. It can be used by importing from `@es.framework/ng.ui.core/collapsible`.
|
package/color-picker/README.md
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
# @es.framework/ng.ui.core/color-picker
|
|
2
|
-
|
|
3
|
-
Secondary entry point of `@es.framework/ng.ui.core`. It can be used by importing from `@es.framework/ng.ui.core/color-picker`.
|
|
1
|
+
# @es.framework/ng.ui.core/color-picker
|
|
2
|
+
|
|
3
|
+
Secondary entry point of `@es.framework/ng.ui.core`. It can be used by importing from `@es.framework/ng.ui.core/color-picker`.
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
# @es.framework/ng.ui.core/column-settings-popover
|
|
2
|
-
|
|
3
|
-
Secondary entry point of `@es.framework/ng.ui.core`. It can be used by importing from `@es.framework/ng.ui.core/column-settings-popover`.
|
|
1
|
+
# @es.framework/ng.ui.core/column-settings-popover
|
|
2
|
+
|
|
3
|
+
Secondary entry point of `@es.framework/ng.ui.core`. It can be used by importing from `@es.framework/ng.ui.core/column-settings-popover`.
|
package/custom-switch/README.md
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
# @es.framework/ng.ui.core/custom-switch
|
|
2
|
-
|
|
3
|
-
Secondary entry point of `@es.framework/ng.ui.core`. It can be used by importing from `@es.framework/ng.ui.core/custom-switch`.
|
|
1
|
+
# @es.framework/ng.ui.core/custom-switch
|
|
2
|
+
|
|
3
|
+
Secondary entry point of `@es.framework/ng.ui.core`. It can be used by importing from `@es.framework/ng.ui.core/custom-switch`.
|
package/datepicker/README.md
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
# @es.framework/ng.ui.core/datepicker
|
|
2
|
-
|
|
3
|
-
Secondary entry point of `@es.framework/ng.ui.core`. It can be used by importing from `@es.framework/ng.ui.core/datepicker`.
|
|
1
|
+
# @es.framework/ng.ui.core/datepicker
|
|
2
|
+
|
|
3
|
+
Secondary entry point of `@es.framework/ng.ui.core`. It can be used by importing from `@es.framework/ng.ui.core/datepicker`.
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
# @es.framework/ng.ui.core/deactivation-reason
|
|
2
|
-
|
|
3
|
-
Secondary entry point of `@es.framework/ng.ui.core`. It can be used by importing from `@es.framework/ng.ui.core/deactivation-reason`.
|
|
1
|
+
# @es.framework/ng.ui.core/deactivation-reason
|
|
2
|
+
|
|
3
|
+
Secondary entry point of `@es.framework/ng.ui.core`. It can be used by importing from `@es.framework/ng.ui.core/deactivation-reason`.
|
package/excel-import/README.md
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
# @es.framework/ng.ui.core/excel-import
|
|
2
|
-
|
|
3
|
-
Secondary entry point of `@es.framework/ng.ui.core`. It can be used by importing from `@es.framework/ng.ui.core/excel-import`.
|
|
1
|
+
# @es.framework/ng.ui.core/excel-import
|
|
2
|
+
|
|
3
|
+
Secondary entry point of `@es.framework/ng.ui.core`. It can be used by importing from `@es.framework/ng.ui.core/excel-import`.
|
|
@@ -195,7 +195,7 @@ class AttachmentTypeComponent extends FieldType {
|
|
|
195
195
|
return 'pi pi-file';
|
|
196
196
|
}
|
|
197
197
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: AttachmentTypeComponent, deps: [{ token: i1.MessageService }], target: i0.ɵɵFactoryTarget.Component });
|
|
198
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.3", type: AttachmentTypeComponent, isStandalone: true, selector: "attachment-type", providers: [MessageService], usesInheritance: true, ngImport: i0, template: "<p-fileUpload\
|
|
198
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.3", type: AttachmentTypeComponent, isStandalone: true, selector: "attachment-type", providers: [MessageService], usesInheritance: true, ngImport: i0, template: "<p-fileUpload\n name=\"file\"\n [customUpload]=\"true\"\n [auto]=\"true\"\n [multiple]=\"props['multiple'] !== false\"\n [maxFileSize]=\"maxFileSize\"\n [accept]=\"props['accept'] || defaultAcceptTypes\"\n (uploadHandler)=\"onUpload($event)\"\n chooseLabel=\"\u0627\u0633\u062D\u0628 \u0627\u0644\u0645\u0644\u0641\u0627\u062A \u0623\u0648 \u0627\u0646\u0642\u0631 \u0644\u0644\u0625\u0631\u0641\u0627\u0642\"\n class=\"w-full\"\n >\n <!-- Header Template -->\n <ng-template pTemplate=\"header\" let-chooseCallback=\"chooseCallback\">\n <div class=\"flex flex-wrap justify-content-between align-items-center flex-1 gap-2\">\n <div class=\"flex gap-2\">\n <p-button\n (click)=\"choose($event, chooseCallback)\"\n icon=\"pi pi-plus\"\n [rounded]=\"true\"\n [outlined]=\"true\"\n styleClass=\"border border-green-600 text-green-600 hover:bg-green-100 bg-white shadow-sm !rounded-full\"\n ></p-button>\n </div>\n </div>\n </ng-template>\n\n <!-- Content Template -->\n <ng-template pTemplate=\"content\">\n <!-- Multi mode -->\n <div class=\"p-2 flex flex-wrap gap-4\">\n @for (file of attachments; track file; let i = $index) {\n <div\n style=\"height: 7rem;\"\n class=\"relative w-24 h-28 bg-white border rounded-lg shadow-sm flex flex-col items-center justify-center\"\n >\n <!-- File type label -->\n <div\n class=\"absolute top-0 left-0 px-2 py-0.5 text-[10px] font-bold uppercase rounded-br-md shadow-sm text-white\"\n [ngClass]=\"getLabelClass(file.mimeType)\"\n >\n {{ getFileLabel(file.mimeType) }}\n </div>\n <!-- Remove button -->\n <button\n style=\"top: 3px;right: 3px;\"\n type=\"button\"\n class=\"absolute top-1 right-1 text-red-500 hover:text-red-700\"\n (click)=\"remove(i)\"\n title=\"\u062D\u0630\u0641\"\n >\n <i class=\"pi pi-times text-xs\"></i>\n </button>\n <!-- Center icon -->\n <i\n [class]=\"getFileIcon(file.mimeType)\"\n [ngClass]=\"getIconColor(file.mimeType)\"\n class=\"!text-4xl text-center mt-5\"\n ></i>\n <!-- File name -->\n <div style=\"max-width: 85%;\" class=\"mt-1 text-[11px] text-gray-600 truncate max-w-[85%] text-center\">\n <div class=\"truncate\">{{ file.fileName }}</div>\n </div>\n <!-- Download icon -->\n @if (file.binaryObjectId) {\n <a\n style=\"bottom: 3px;right: 3px;\"\n class=\"absolute bottom-1 right-1 text-gray-400 hover:text-blue-500\"\n [href]=\"url+'/' + file.binaryObjectId\"\n target=\"_blank\"\n download\n title=\"\u062A\u062D\u0645\u064A\u0644\"\n >\n <i class=\"pi pi-download text-xs\"></i>\n </a>\n }\n </div>\n }\n </div>\n\n <!-- Single mode -->\n @if (props['multiple'] === false && attachment) {\n <div>\n <div class=\"flex items-center justify-between p-2 border-b\">\n <span>{{ attachment.fileName }}</span>\n <p-button\n type=\"button\"\n icon=\"pi pi-times\"\n class=\"p-button-rounded p-button-text text-red-600\"\n (click)=\"remove(0)\"\n ></p-button>\n </div>\n <!-- Caption input if allowed -->\n @if (props['allowCaption']) {\n <div class=\"mt-1\">\n <input\n pInputText\n type=\"text\"\n class=\"w-full border rounded px-2 py-1 text-sm\"\n placeholder=\"\u0623\u0636\u0641 \u0648\u0635\u0641\u0627\u064B\"\n (change)=\"attachment = attachment\"\n [(ngModel)]=\"attachment.caption\"\n />\n </div>\n }\n </div>\n }\n </ng-template>\n\n <!-- Empty Template -->\n <ng-template pTemplate=\"empty\">\n @if ((props['multiple'] !== false && (!attachments || attachments.length === 0)) ||\n (props['multiple'] === false && !attachment)) {\n <div\n class=\"border-2 border-dashed rounded-md p-4 bg-gray-50 hover:bg-gray-100 transition flex align-items-center justify-content-center flex-column\"\n >\n <i class=\"pi pi-cloud-upload border-2 rounded p-5 text-8xl text-400 border-400\"></i>\n <p class=\"mt-4 mb-0\">\u0627\u0633\u062D\u0628 \u0648\u0623\u0641\u0644\u0650\u062A \u0627\u0644\u0645\u0644\u0641\u0627\u062A \u0647\u0646\u0627 \u0644\u0644\u062A\u062D\u0645\u064A\u0644.</p>\n </div>\n }\n </ng-template>\n</p-fileUpload>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: FileUploadModule }, { kind: "component", type: i4.FileUpload, selector: "p-fileupload, p-fileUpload", inputs: ["name", "url", "method", "multiple", "accept", "disabled", "auto", "withCredentials", "maxFileSize", "invalidFileSizeMessageSummary", "invalidFileSizeMessageDetail", "invalidFileTypeMessageSummary", "invalidFileTypeMessageDetail", "invalidFileLimitMessageDetail", "invalidFileLimitMessageSummary", "style", "styleClass", "previewWidth", "chooseLabel", "uploadLabel", "cancelLabel", "chooseIcon", "uploadIcon", "cancelIcon", "showUploadButton", "showCancelButton", "mode", "headers", "customUpload", "fileLimit", "uploadStyleClass", "cancelStyleClass", "removeStyleClass", "chooseStyleClass", "chooseButtonProps", "uploadButtonProps", "cancelButtonProps", "files"], outputs: ["onBeforeUpload", "onSend", "onUpload", "onError", "onClear", "onRemove", "onSelect", "onProgress", "uploadHandler", "onImageError", "onRemoveUploadedFile"] }, { kind: "directive", type: i1.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i5.Button, selector: "p-button", inputs: ["hostName", "type", "badge", "disabled", "raised", "rounded", "text", "plain", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "autofocus", "iconPos", "icon", "label", "loading", "loadingIcon", "severity", "buttonProps", "fluid"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "ngmodule", type: InputTextModule }, { kind: "directive", type: i6.InputText, selector: "[pInputText]", inputs: ["hostName", "ptInputText", "pSize", "variant", "fluid", "invalid"] }] });
|
|
199
199
|
}
|
|
200
200
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: AttachmentTypeComponent, decorators: [{
|
|
201
201
|
type: Component,
|
|
@@ -206,7 +206,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImpor
|
|
|
206
206
|
FileUploadModule,
|
|
207
207
|
ButtonModule,
|
|
208
208
|
InputTextModule
|
|
209
|
-
], providers: [MessageService], template: "<p-fileUpload\
|
|
209
|
+
], providers: [MessageService], template: "<p-fileUpload\n name=\"file\"\n [customUpload]=\"true\"\n [auto]=\"true\"\n [multiple]=\"props['multiple'] !== false\"\n [maxFileSize]=\"maxFileSize\"\n [accept]=\"props['accept'] || defaultAcceptTypes\"\n (uploadHandler)=\"onUpload($event)\"\n chooseLabel=\"\u0627\u0633\u062D\u0628 \u0627\u0644\u0645\u0644\u0641\u0627\u062A \u0623\u0648 \u0627\u0646\u0642\u0631 \u0644\u0644\u0625\u0631\u0641\u0627\u0642\"\n class=\"w-full\"\n >\n <!-- Header Template -->\n <ng-template pTemplate=\"header\" let-chooseCallback=\"chooseCallback\">\n <div class=\"flex flex-wrap justify-content-between align-items-center flex-1 gap-2\">\n <div class=\"flex gap-2\">\n <p-button\n (click)=\"choose($event, chooseCallback)\"\n icon=\"pi pi-plus\"\n [rounded]=\"true\"\n [outlined]=\"true\"\n styleClass=\"border border-green-600 text-green-600 hover:bg-green-100 bg-white shadow-sm !rounded-full\"\n ></p-button>\n </div>\n </div>\n </ng-template>\n\n <!-- Content Template -->\n <ng-template pTemplate=\"content\">\n <!-- Multi mode -->\n <div class=\"p-2 flex flex-wrap gap-4\">\n @for (file of attachments; track file; let i = $index) {\n <div\n style=\"height: 7rem;\"\n class=\"relative w-24 h-28 bg-white border rounded-lg shadow-sm flex flex-col items-center justify-center\"\n >\n <!-- File type label -->\n <div\n class=\"absolute top-0 left-0 px-2 py-0.5 text-[10px] font-bold uppercase rounded-br-md shadow-sm text-white\"\n [ngClass]=\"getLabelClass(file.mimeType)\"\n >\n {{ getFileLabel(file.mimeType) }}\n </div>\n <!-- Remove button -->\n <button\n style=\"top: 3px;right: 3px;\"\n type=\"button\"\n class=\"absolute top-1 right-1 text-red-500 hover:text-red-700\"\n (click)=\"remove(i)\"\n title=\"\u062D\u0630\u0641\"\n >\n <i class=\"pi pi-times text-xs\"></i>\n </button>\n <!-- Center icon -->\n <i\n [class]=\"getFileIcon(file.mimeType)\"\n [ngClass]=\"getIconColor(file.mimeType)\"\n class=\"!text-4xl text-center mt-5\"\n ></i>\n <!-- File name -->\n <div style=\"max-width: 85%;\" class=\"mt-1 text-[11px] text-gray-600 truncate max-w-[85%] text-center\">\n <div class=\"truncate\">{{ file.fileName }}</div>\n </div>\n <!-- Download icon -->\n @if (file.binaryObjectId) {\n <a\n style=\"bottom: 3px;right: 3px;\"\n class=\"absolute bottom-1 right-1 text-gray-400 hover:text-blue-500\"\n [href]=\"url+'/' + file.binaryObjectId\"\n target=\"_blank\"\n download\n title=\"\u062A\u062D\u0645\u064A\u0644\"\n >\n <i class=\"pi pi-download text-xs\"></i>\n </a>\n }\n </div>\n }\n </div>\n\n <!-- Single mode -->\n @if (props['multiple'] === false && attachment) {\n <div>\n <div class=\"flex items-center justify-between p-2 border-b\">\n <span>{{ attachment.fileName }}</span>\n <p-button\n type=\"button\"\n icon=\"pi pi-times\"\n class=\"p-button-rounded p-button-text text-red-600\"\n (click)=\"remove(0)\"\n ></p-button>\n </div>\n <!-- Caption input if allowed -->\n @if (props['allowCaption']) {\n <div class=\"mt-1\">\n <input\n pInputText\n type=\"text\"\n class=\"w-full border rounded px-2 py-1 text-sm\"\n placeholder=\"\u0623\u0636\u0641 \u0648\u0635\u0641\u0627\u064B\"\n (change)=\"attachment = attachment\"\n [(ngModel)]=\"attachment.caption\"\n />\n </div>\n }\n </div>\n }\n </ng-template>\n\n <!-- Empty Template -->\n <ng-template pTemplate=\"empty\">\n @if ((props['multiple'] !== false && (!attachments || attachments.length === 0)) ||\n (props['multiple'] === false && !attachment)) {\n <div\n class=\"border-2 border-dashed rounded-md p-4 bg-gray-50 hover:bg-gray-100 transition flex align-items-center justify-content-center flex-column\"\n >\n <i class=\"pi pi-cloud-upload border-2 rounded p-5 text-8xl text-400 border-400\"></i>\n <p class=\"mt-4 mb-0\">\u0627\u0633\u062D\u0628 \u0648\u0623\u0641\u0644\u0650\u062A \u0627\u0644\u0645\u0644\u0641\u0627\u062A \u0647\u0646\u0627 \u0644\u0644\u062A\u062D\u0645\u064A\u0644.</p>\n </div>\n }\n </ng-template>\n</p-fileUpload>\n" }]
|
|
210
210
|
}], ctorParameters: () => [{ type: i1.MessageService }] });
|
|
211
211
|
|
|
212
212
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"es.framework-ng.ui.core-attachments.mjs","sources":["../../../../libs/ng.ui.core/attachments/src/lib/attachments-module.ts","../../../../libs/ng.ui.core/attachments/src/lib/attachment-type.ts","../../../../libs/ng.ui.core/attachments/src/lib/attachment-type.html","../../../../libs/ng.ui.core/attachments/src/es.framework-ng.ui.core-attachments.ts"],"sourcesContent":["import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\n@NgModule({\r\n imports: [CommonModule],\r\n})\r\nexport class AttachmentsModule {}\r\n","import { Component, inject } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ReactiveFormsModule, FormsModule } from '@angular/forms';\r\n\r\nimport { FieldType } from '@ngx-formly/core';\r\n\r\nimport { FileUploadModule } from 'primeng/fileupload';\r\nimport { ButtonModule } from 'primeng/button';\r\nimport { MessageService } from 'primeng/api';\r\n\r\nimport { InputTextModule } from 'primeng/inputtext';\r\nimport { AttachmentDto } from '@es.framework/ng.core/models';\r\nimport { EnvironmentService } from '@es.framework/ng.core/services';\r\n\r\n\r\n@Component({\r\n selector: 'attachment-type',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n ReactiveFormsModule,\r\n FormsModule,\r\n FileUploadModule,\r\n ButtonModule,\r\n InputTextModule\r\n ],\r\n providers: [MessageService],\r\n templateUrl: './attachment-type.html',\r\n})\r\nexport class AttachmentTypeComponent extends FieldType {\r\n defaultAcceptTypes = '.pdf,application/pdf,image/*,.txt,text/plain,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.ms-excel';\r\n\r\n maxFileSize = 1 * 1024 * 1024; // 1 MB\r\n tenantId = 0;\r\n private env = inject(EnvironmentService);\r\n\r\n constructor(private messageService: MessageService) {\r\n super();\r\n\r\n }\r\n get url():string{\r\n return this.env.getEnvironment().apis.default.url + (this.props['apiUrl'] ?? '/api/files');\r\n }\r\n get attachments(): AttachmentDto[] {\r\n return Array.isArray(this.formControl.value)\r\n ? this.formControl.value\r\n : (this.formControl.value ? [this.formControl.value] : []);\r\n }\r\n\r\n set attachments(value: AttachmentDto[]) {\r\n if (this.props['multiple']) {\r\n this.formControl.setValue(value);\r\n } else {\r\n this.formControl.setValue(value?.[0] || null);\r\n }\r\n }\r\n\r\n get attachment(): AttachmentDto | null {\r\n return Array.isArray(this.formControl.value)\r\n ? (this.formControl.value[0] || null)\r\n : this.formControl.value || null;\r\n }\r\n\r\n\r\n set attachment(value: AttachmentDto | null) {\r\n if (this.props['multiple']) {\r\n const arr = Array.isArray(this.formControl.value)\r\n ? [...this.formControl.value]\r\n : (this.formControl.value ? [this.formControl.value] : []);\r\n if (value) arr.push(value);\r\n this.formControl.setValue(arr);\r\n } else {\r\n this.formControl.setValue(value);\r\n }\r\n }\r\n\r\n async onUpload(event: any) {\r\n const files: File[] = event.files;\r\n const isMultiple = this.props['multiple'] ?? true;\r\n const allowedTypes = (this.props['accept'] as string) || '';\r\n\r\n for (const file of files) {\r\n if (file.size > this.maxFileSize) {\r\n this.messageService.add({\r\n severity: 'error',\r\n summary: 'خطأ',\r\n detail: `الملف \"${file.name}\" يتجاوز الحد الأقصى (1MB)`,\r\n });\r\n continue;\r\n }\r\n\r\n if (allowedTypes && !this.isFileTypeAllowed(file, allowedTypes)) {\r\n this.messageService.add({\r\n severity: 'error',\r\n summary: 'نوع الملف غير مسموح',\r\n detail: `الملف \"${file.name}\" ليس من الأنواع المسموحة`,\r\n });\r\n continue;\r\n }\r\n\r\n if (isMultiple && this.attachments.some(a => a.fileName === file.name)) {\r\n continue;\r\n }\r\n\r\n const base64 = await this.fileToBase64(file);\r\n const attachment = new AttachmentDto();\r\n attachment.fileName = file.name;\r\n attachment.mimeType = file.type;\r\n attachment.base64 = base64;\r\n\r\n if (isMultiple) {\r\n this.attachments = [...this.attachments, attachment];\r\n } else {\r\n this.attachment = attachment;\r\n }\r\n }\r\n }\r\n\r\n remove(index: number) {\r\n const copy = [...this.attachments];\r\n copy.splice(index, 1);\r\n this.attachments = copy;\r\n }\r\n\r\n choose(event: any, callback: any) {\r\n callback();\r\n }\r\n\r\n private fileToBase64(file: File): Promise<string> {\r\n return new Promise((resolve, reject) => {\r\n const reader = new FileReader();\r\n reader.readAsDataURL(file);\r\n reader.onload = () => resolve((reader.result as string).split(',')[1]);\r\n reader.onerror = err => reject(err);\r\n });\r\n }\r\n\r\n private isFileTypeAllowed(file: File, allowedTypes: string): boolean {\r\n const accepted = allowedTypes.split(',').map(t => t.trim());\r\n return accepted.some(type => {\r\n if (type === '*/*') return true;\r\n if (type.endsWith('/*')) {\r\n return file.type.startsWith(type.split('/')[0] + '/');\r\n }\r\n return file.type === type;\r\n });\r\n }\r\n\r\n getFileLabel(mime: string): string {\r\n if (!mime) return 'FILE';\r\n if (mime.includes('pdf')) return 'PDF';\r\n if (mime.includes('excel') || mime.includes('spreadsheet')) return 'XLS';\r\n if (mime.includes('word')) return 'DOC';\r\n if (mime.includes('image')) return 'IMG';\r\n if (mime.includes('zip')) return 'ZIP';\r\n if (mime.includes('csv')) return 'CSV';\r\n if (mime.includes('text')) return 'TXT';\r\n return 'FILE';\r\n }\r\n\r\n getLabelClass(mime: string): string {\r\n if (mime.includes('pdf')) return 'bg-red-600 text-white';\r\n if (mime.includes('excel')) return 'bg-green-600 text-white';\r\n if (mime.includes('word')) return 'bg-blue-600 text-white';\r\n if (mime.includes('image')) return 'bg-yellow-500 text-white';\r\n if (mime.includes('zip')) return 'bg-pink-600 text-white';\r\n return 'bg-gray-400 text-white';\r\n }\r\n\r\n getIconColor(mime: string): string {\r\n if (mime.includes('pdf')) return 'text-red-400';\r\n if (mime.includes('excel')) return 'text-green-500';\r\n if (mime.includes('word')) return 'text-blue-500';\r\n if (mime.includes('image')) return 'text-yellow-500';\r\n if (mime.includes('zip')) return 'text-pink-500';\r\n return 'text-gray-400';\r\n }\r\n\r\n getFileIcon(mime: string): string {\r\n if (mime.includes('pdf')) return 'pi pi-file-pdf';\r\n if (mime.includes('excel') || mime.includes('spreadsheet')) return 'pi pi-file-excel';\r\n if (mime.includes('word')) return 'pi pi-file-word';\r\n if (mime.includes('image')) return 'pi pi-image';\r\n if (mime.includes('zip')) return 'pi pi-file-zip';\r\n return 'pi pi-file';\r\n }\r\n}\r\n","<p-fileUpload\r\n name=\"file\"\r\n [customUpload]=\"true\"\r\n [auto]=\"true\"\r\n [multiple]=\"props['multiple'] !== false\"\r\n [maxFileSize]=\"maxFileSize\"\r\n [accept]=\"props['accept'] || defaultAcceptTypes\"\r\n (uploadHandler)=\"onUpload($event)\"\r\n chooseLabel=\"اسحب الملفات أو انقر للإرفاق\"\r\n class=\"w-full\"\r\n >\r\n <!-- Header Template -->\r\n <ng-template pTemplate=\"header\" let-chooseCallback=\"chooseCallback\">\r\n <div class=\"flex flex-wrap justify-content-between align-items-center flex-1 gap-2\">\r\n <div class=\"flex gap-2\">\r\n <p-button\r\n (click)=\"choose($event, chooseCallback)\"\r\n icon=\"pi pi-plus\"\r\n [rounded]=\"true\"\r\n [outlined]=\"true\"\r\n styleClass=\"border border-green-600 text-green-600 hover:bg-green-100 bg-white shadow-sm !rounded-full\"\r\n ></p-button>\r\n </div>\r\n </div>\r\n </ng-template>\r\n\r\n <!-- Content Template -->\r\n <ng-template pTemplate=\"content\">\r\n <!-- Multi mode -->\r\n <div class=\"p-2 flex flex-wrap gap-4\">\r\n @for (file of attachments; track file; let i = $index) {\r\n <div\r\n style=\"height: 7rem;\"\r\n class=\"relative w-24 h-28 bg-white border rounded-lg shadow-sm flex flex-col items-center justify-center\"\r\n >\r\n <!-- File type label -->\r\n <div\r\n class=\"absolute top-0 left-0 px-2 py-0.5 text-[10px] font-bold uppercase rounded-br-md shadow-sm text-white\"\r\n [ngClass]=\"getLabelClass(file.mimeType)\"\r\n >\r\n {{ getFileLabel(file.mimeType) }}\r\n </div>\r\n <!-- Remove button -->\r\n <button\r\n style=\"top: 3px;right: 3px;\"\r\n type=\"button\"\r\n class=\"absolute top-1 right-1 text-red-500 hover:text-red-700\"\r\n (click)=\"remove(i)\"\r\n title=\"حذف\"\r\n >\r\n <i class=\"pi pi-times text-xs\"></i>\r\n </button>\r\n <!-- Center icon -->\r\n <i\r\n [class]=\"getFileIcon(file.mimeType)\"\r\n [ngClass]=\"getIconColor(file.mimeType)\"\r\n class=\"!text-4xl text-center mt-5\"\r\n ></i>\r\n <!-- File name -->\r\n <div style=\"max-width: 85%;\" class=\"mt-1 text-[11px] text-gray-600 truncate max-w-[85%] text-center\">\r\n <div class=\"truncate\">{{ file.fileName }}</div>\r\n </div>\r\n <!-- Download icon -->\r\n @if (file.binaryObjectId) {\r\n <a\r\n style=\"bottom: 3px;right: 3px;\"\r\n class=\"absolute bottom-1 right-1 text-gray-400 hover:text-blue-500\"\r\n [href]=\"url+'/' + file.binaryObjectId\"\r\n target=\"_blank\"\r\n download\r\n title=\"تحميل\"\r\n >\r\n <i class=\"pi pi-download text-xs\"></i>\r\n </a>\r\n }\r\n </div>\r\n }\r\n </div>\r\n\r\n <!-- Single mode -->\r\n @if (props['multiple'] === false && attachment) {\r\n <div>\r\n <div class=\"flex items-center justify-between p-2 border-b\">\r\n <span>{{ attachment.fileName }}</span>\r\n <p-button\r\n type=\"button\"\r\n icon=\"pi pi-times\"\r\n class=\"p-button-rounded p-button-text text-red-600\"\r\n (click)=\"remove(0)\"\r\n ></p-button>\r\n </div>\r\n <!-- Caption input if allowed -->\r\n @if (props['allowCaption']) {\r\n <div class=\"mt-1\">\r\n <input\r\n pInputText\r\n type=\"text\"\r\n class=\"w-full border rounded px-2 py-1 text-sm\"\r\n placeholder=\"أضف وصفاً\"\r\n (change)=\"attachment = attachment\"\r\n [(ngModel)]=\"attachment.caption\"\r\n />\r\n </div>\r\n }\r\n </div>\r\n }\r\n </ng-template>\r\n\r\n <!-- Empty Template -->\r\n <ng-template pTemplate=\"empty\">\r\n @if ((props['multiple'] !== false && (!attachments || attachments.length === 0)) ||\r\n (props['multiple'] === false && !attachment)) {\r\n <div\r\n class=\"border-2 border-dashed rounded-md p-4 bg-gray-50 hover:bg-gray-100 transition flex align-items-center justify-content-center flex-column\"\r\n >\r\n <i class=\"pi pi-cloud-upload border-2 rounded p-5 text-8xl text-400 border-400\"></i>\r\n <p class=\"mt-4 mb-0\">اسحب وأفلِت الملفات هنا للتحميل.</p>\r\n </div>\r\n }\r\n </ng-template>\r\n</p-fileUpload>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"es.framework-ng.ui.core-attachments.mjs","sources":["../../../../libs/ng.ui.core/attachments/src/lib/attachments-module.ts","../../../../libs/ng.ui.core/attachments/src/lib/attachment-type.ts","../../../../libs/ng.ui.core/attachments/src/lib/attachment-type.html","../../../../libs/ng.ui.core/attachments/src/es.framework-ng.ui.core-attachments.ts"],"sourcesContent":["import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\n@NgModule({\n imports: [CommonModule],\n})\nexport class AttachmentsModule {}\n","import { Component, inject } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule, FormsModule } from '@angular/forms';\n\nimport { FieldType } from '@ngx-formly/core';\n\nimport { FileUploadModule } from 'primeng/fileupload';\nimport { ButtonModule } from 'primeng/button';\nimport { MessageService } from 'primeng/api';\n\nimport { InputTextModule } from 'primeng/inputtext';\nimport { AttachmentDto } from '@es.framework/ng.core/models';\nimport { EnvironmentService } from '@es.framework/ng.core/services';\n\n\n@Component({\n selector: 'attachment-type',\n standalone: true,\n imports: [\n CommonModule,\n ReactiveFormsModule,\n FormsModule,\n FileUploadModule,\n ButtonModule,\n InputTextModule\n ],\n providers: [MessageService],\n templateUrl: './attachment-type.html',\n})\nexport class AttachmentTypeComponent extends FieldType {\n defaultAcceptTypes = '.pdf,application/pdf,image/*,.txt,text/plain,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.ms-excel';\n\n maxFileSize = 1 * 1024 * 1024; // 1 MB\n tenantId = 0;\n private env = inject(EnvironmentService);\n\n constructor(private messageService: MessageService) {\n super();\n\n }\n get url():string{\n return this.env.getEnvironment().apis.default.url + (this.props['apiUrl'] ?? '/api/files');\n }\n get attachments(): AttachmentDto[] {\n return Array.isArray(this.formControl.value)\n ? this.formControl.value\n : (this.formControl.value ? [this.formControl.value] : []);\n }\n\n set attachments(value: AttachmentDto[]) {\n if (this.props['multiple']) {\n this.formControl.setValue(value);\n } else {\n this.formControl.setValue(value?.[0] || null);\n }\n }\n\n get attachment(): AttachmentDto | null {\n return Array.isArray(this.formControl.value)\n ? (this.formControl.value[0] || null)\n : this.formControl.value || null;\n }\n\n\n set attachment(value: AttachmentDto | null) {\n if (this.props['multiple']) {\n const arr = Array.isArray(this.formControl.value)\n ? [...this.formControl.value]\n : (this.formControl.value ? [this.formControl.value] : []);\n if (value) arr.push(value);\n this.formControl.setValue(arr);\n } else {\n this.formControl.setValue(value);\n }\n }\n\n async onUpload(event: any) {\n const files: File[] = event.files;\n const isMultiple = this.props['multiple'] ?? true;\n const allowedTypes = (this.props['accept'] as string) || '';\n\n for (const file of files) {\n if (file.size > this.maxFileSize) {\n this.messageService.add({\n severity: 'error',\n summary: 'خطأ',\n detail: `الملف \"${file.name}\" يتجاوز الحد الأقصى (1MB)`,\n });\n continue;\n }\n\n if (allowedTypes && !this.isFileTypeAllowed(file, allowedTypes)) {\n this.messageService.add({\n severity: 'error',\n summary: 'نوع الملف غير مسموح',\n detail: `الملف \"${file.name}\" ليس من الأنواع المسموحة`,\n });\n continue;\n }\n\n if (isMultiple && this.attachments.some(a => a.fileName === file.name)) {\n continue;\n }\n\n const base64 = await this.fileToBase64(file);\n const attachment = new AttachmentDto();\n attachment.fileName = file.name;\n attachment.mimeType = file.type;\n attachment.base64 = base64;\n\n if (isMultiple) {\n this.attachments = [...this.attachments, attachment];\n } else {\n this.attachment = attachment;\n }\n }\n }\n\n remove(index: number) {\n const copy = [...this.attachments];\n copy.splice(index, 1);\n this.attachments = copy;\n }\n\n choose(event: any, callback: any) {\n callback();\n }\n\n private fileToBase64(file: File): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.readAsDataURL(file);\n reader.onload = () => resolve((reader.result as string).split(',')[1]);\n reader.onerror = err => reject(err);\n });\n }\n\n private isFileTypeAllowed(file: File, allowedTypes: string): boolean {\n const accepted = allowedTypes.split(',').map(t => t.trim());\n return accepted.some(type => {\n if (type === '*/*') return true;\n if (type.endsWith('/*')) {\n return file.type.startsWith(type.split('/')[0] + '/');\n }\n return file.type === type;\n });\n }\n\n getFileLabel(mime: string): string {\n if (!mime) return 'FILE';\n if (mime.includes('pdf')) return 'PDF';\n if (mime.includes('excel') || mime.includes('spreadsheet')) return 'XLS';\n if (mime.includes('word')) return 'DOC';\n if (mime.includes('image')) return 'IMG';\n if (mime.includes('zip')) return 'ZIP';\n if (mime.includes('csv')) return 'CSV';\n if (mime.includes('text')) return 'TXT';\n return 'FILE';\n }\n\n getLabelClass(mime: string): string {\n if (mime.includes('pdf')) return 'bg-red-600 text-white';\n if (mime.includes('excel')) return 'bg-green-600 text-white';\n if (mime.includes('word')) return 'bg-blue-600 text-white';\n if (mime.includes('image')) return 'bg-yellow-500 text-white';\n if (mime.includes('zip')) return 'bg-pink-600 text-white';\n return 'bg-gray-400 text-white';\n }\n\n getIconColor(mime: string): string {\n if (mime.includes('pdf')) return 'text-red-400';\n if (mime.includes('excel')) return 'text-green-500';\n if (mime.includes('word')) return 'text-blue-500';\n if (mime.includes('image')) return 'text-yellow-500';\n if (mime.includes('zip')) return 'text-pink-500';\n return 'text-gray-400';\n }\n\n getFileIcon(mime: string): string {\n if (mime.includes('pdf')) return 'pi pi-file-pdf';\n if (mime.includes('excel') || mime.includes('spreadsheet')) return 'pi pi-file-excel';\n if (mime.includes('word')) return 'pi pi-file-word';\n if (mime.includes('image')) return 'pi pi-image';\n if (mime.includes('zip')) return 'pi pi-file-zip';\n return 'pi pi-file';\n }\n}\n","<p-fileUpload\n name=\"file\"\n [customUpload]=\"true\"\n [auto]=\"true\"\n [multiple]=\"props['multiple'] !== false\"\n [maxFileSize]=\"maxFileSize\"\n [accept]=\"props['accept'] || defaultAcceptTypes\"\n (uploadHandler)=\"onUpload($event)\"\n chooseLabel=\"اسحب الملفات أو انقر للإرفاق\"\n class=\"w-full\"\n >\n <!-- Header Template -->\n <ng-template pTemplate=\"header\" let-chooseCallback=\"chooseCallback\">\n <div class=\"flex flex-wrap justify-content-between align-items-center flex-1 gap-2\">\n <div class=\"flex gap-2\">\n <p-button\n (click)=\"choose($event, chooseCallback)\"\n icon=\"pi pi-plus\"\n [rounded]=\"true\"\n [outlined]=\"true\"\n styleClass=\"border border-green-600 text-green-600 hover:bg-green-100 bg-white shadow-sm !rounded-full\"\n ></p-button>\n </div>\n </div>\n </ng-template>\n\n <!-- Content Template -->\n <ng-template pTemplate=\"content\">\n <!-- Multi mode -->\n <div class=\"p-2 flex flex-wrap gap-4\">\n @for (file of attachments; track file; let i = $index) {\n <div\n style=\"height: 7rem;\"\n class=\"relative w-24 h-28 bg-white border rounded-lg shadow-sm flex flex-col items-center justify-center\"\n >\n <!-- File type label -->\n <div\n class=\"absolute top-0 left-0 px-2 py-0.5 text-[10px] font-bold uppercase rounded-br-md shadow-sm text-white\"\n [ngClass]=\"getLabelClass(file.mimeType)\"\n >\n {{ getFileLabel(file.mimeType) }}\n </div>\n <!-- Remove button -->\n <button\n style=\"top: 3px;right: 3px;\"\n type=\"button\"\n class=\"absolute top-1 right-1 text-red-500 hover:text-red-700\"\n (click)=\"remove(i)\"\n title=\"حذف\"\n >\n <i class=\"pi pi-times text-xs\"></i>\n </button>\n <!-- Center icon -->\n <i\n [class]=\"getFileIcon(file.mimeType)\"\n [ngClass]=\"getIconColor(file.mimeType)\"\n class=\"!text-4xl text-center mt-5\"\n ></i>\n <!-- File name -->\n <div style=\"max-width: 85%;\" class=\"mt-1 text-[11px] text-gray-600 truncate max-w-[85%] text-center\">\n <div class=\"truncate\">{{ file.fileName }}</div>\n </div>\n <!-- Download icon -->\n @if (file.binaryObjectId) {\n <a\n style=\"bottom: 3px;right: 3px;\"\n class=\"absolute bottom-1 right-1 text-gray-400 hover:text-blue-500\"\n [href]=\"url+'/' + file.binaryObjectId\"\n target=\"_blank\"\n download\n title=\"تحميل\"\n >\n <i class=\"pi pi-download text-xs\"></i>\n </a>\n }\n </div>\n }\n </div>\n\n <!-- Single mode -->\n @if (props['multiple'] === false && attachment) {\n <div>\n <div class=\"flex items-center justify-between p-2 border-b\">\n <span>{{ attachment.fileName }}</span>\n <p-button\n type=\"button\"\n icon=\"pi pi-times\"\n class=\"p-button-rounded p-button-text text-red-600\"\n (click)=\"remove(0)\"\n ></p-button>\n </div>\n <!-- Caption input if allowed -->\n @if (props['allowCaption']) {\n <div class=\"mt-1\">\n <input\n pInputText\n type=\"text\"\n class=\"w-full border rounded px-2 py-1 text-sm\"\n placeholder=\"أضف وصفاً\"\n (change)=\"attachment = attachment\"\n [(ngModel)]=\"attachment.caption\"\n />\n </div>\n }\n </div>\n }\n </ng-template>\n\n <!-- Empty Template -->\n <ng-template pTemplate=\"empty\">\n @if ((props['multiple'] !== false && (!attachments || attachments.length === 0)) ||\n (props['multiple'] === false && !attachment)) {\n <div\n class=\"border-2 border-dashed rounded-md p-4 bg-gray-50 hover:bg-gray-100 transition flex align-items-center justify-content-center flex-column\"\n >\n <i class=\"pi pi-cloud-upload border-2 rounded p-5 text-8xl text-400 border-400\"></i>\n <p class=\"mt-4 mb-0\">اسحب وأفلِت الملفات هنا للتحميل.</p>\n </div>\n }\n </ng-template>\n</p-fileUpload>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"es.framework-ng.ui.core-base-crud.mjs","sources":["../../../../libs/ng.ui.core/base-crud/src/lib/base-crud-module.ts","../../../../libs/ng.ui.core/base-crud/src/lib/base-crud.ts","../../../../libs/ng.ui.core/base-crud/src/es.framework-ng.ui.core-base-crud.ts"],"sourcesContent":["import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\n@NgModule({\r\n imports: [CommonModule],\r\n})\r\nexport class BaseCrudModule {}\r\n","\r\n\r\nimport { Directive, inject } from '@angular/core';\r\nimport { DialogService, DynamicDialogRef } from 'primeng/dynamicdialog';\r\nimport { FormlyFieldConfig } from '@ngx-formly/core';\r\nimport { ActivatedRoute, Router } from '@angular/router';\r\nimport { BaseService, IdParserService, SwalService } from '@es.framework/ng.core/services';\r\nimport { ActionDef, PaginatedResult } from '@es.framework/ng.core/models';\r\nimport { DeactivationReasonFormComponent } from '@es.framework/ng.ui.core/deactivation-reason';\r\nimport { firstValueFrom } from 'rxjs';\r\n\r\n@Directive()\r\nexport abstract class BaseCrud<T, F = any> {\r\n list: T[] = [];\r\n paginator = true;\r\n canLoad = true;\r\n loading = false;\r\n errorMsg = '';\r\n first = 0;\r\n rows = 10;\r\n totalRecords = 0;\r\n searchGlobal = '';\r\n sort?: string;\r\n pageFilters: Partial<F> = {};\r\n currentFilters: Partial<F> = {};\r\n mode ='';\r\n scrollHeight ='400px';\r\n private swalService = inject(SwalService);\r\n\r\n protected dialogRef!: DynamicDialogRef;\r\n\r\n\r\n // abstract service: CrudService<T, F>;\r\n abstract service: BaseService;\r\n abstract dialogService: DialogService;\r\n // abstract dialogComponent: any;\r\n // abstract columns: ColumnDef<T>[];\r\n abstract actions: ActionDef<T>[];\r\n\r\n // for generic dialog:\r\n abstract formFields: FormlyFieldConfig[];\r\n abstract idField: string |any;\r\n // abstract idField: keyof T;\r\n dialogVisible = false;\r\n drawerVisible = false;\r\n selectedItem: T | any = null;\r\n defaultModel: T | any = null;\r\n // selectedItem: T | any = {};\r\n isViewMode = false;\r\n isEditMode = false;\r\n // حالة ظهور درج القوالب\r\n templateDrawerVisible = false;\r\n\r\n\r\n\r\n displayMode:\r\n | 'drawer' | 'dialog' | 'route'\r\n | Partial<Record<'add' | 'edit' | 'view', 'drawer' | 'dialog' | 'route'>>\r\n = 'drawer';\r\nprivate idParser= inject(IdParserService);\r\n public router= inject(Router);\r\n public route = inject(ActivatedRoute);\r\n\r\nloadPage(pageIndex: number, pageSize: number): void {\r\n if(this.canLoad){\r\n\r\n\r\n this.loading = true;\r\n const filters: Partial<F> = {\r\n maxResultCount:pageSize,\r\n skipCount:pageIndex,\r\n sorting:this.sort,\r\n ...this.currentFilters,\r\n ...this.pageFilters,\r\n ...(this.searchGlobal ? { filter: this.searchGlobal } : {}),\r\n };\r\n //\r\n //\r\n this.service.getList(filters)\r\n .subscribe({\r\n next: (res: PaginatedResult<T>) => {\r\n //\r\n this.list = res.items;\r\n this.totalRecords = res.totalCount;\r\n this.loading = false;\r\n },\r\n error: (err:any) => {\r\n this.errorMsg = err.error?.message || err.message || 'خطأ في التحميل';\r\n this.loading = false;\r\n }\r\n });\r\n }\r\n}\r\n\r\nonSearch(filters?: any): void {\r\n //\r\n if (filters && typeof filters === 'object' && !Array.isArray(filters)) {\r\n this.pageFilters = filters;\r\n } else {\r\n this.searchGlobal = filters;\r\n }\r\n\r\n this.loadPage(0, 10);\r\n}\r\n\r\n\r\nonPageChange(event: { first?: number; rows?: number; sort?: string; filters?: Record<string, any> }): void {\r\n // فك المتغيّرات مع قيمة افتراضية لفلاتر\r\n const {\r\n first = this.first,\r\n rows = this.rows,\r\n sort = this.sort,\r\n filters = {}\r\n } = event;\r\n\r\n this.first = first;\r\n this.rows = rows;\r\n this.sort = sort;\r\n\r\n // const pageIndex = Math.floor(first / rows);\r\n const skipCount = first;\r\n const pageIndex = skipCount;\r\n\r\n // الوصول للفلتر العام عبر الصيغة المربعة\r\n const globalValue = filters['global'];\r\n this.searchGlobal = typeof globalValue === 'string' ? globalValue : '';\r\n\r\n\r\n this.loadPage(pageIndex, rows);\r\n}\r\n\r\n\r\nprotected openEditor(item: T | null, mode: 'add' | 'edit' | 'view'): void {\r\n this.mode = mode;\r\n this.selectedItem = item ?? this.defaultModel ?? {};\r\n this.isEditMode = mode === 'edit';\r\n this.isViewMode = mode === 'view';\r\n // Auto-load details if edit or view and have ID\r\n const id = (item as any)?.[this.idField];\r\n if ((this.isEditMode || this.isViewMode) && id) {\r\n // this.loadDetail(id);\r\n // (async () => {\r\n // await this.loadDetail(id);\r\n // })();\r\n }\r\n // resolve displayMode (string or map)\r\n const modeConfig = typeof this.displayMode === 'string'\r\n ? this.displayMode\r\n : this.displayMode[mode] ?? 'drawer';\r\n\r\n switch (modeConfig) {\r\n case 'drawer':\r\n this.drawerVisible = true;\r\n break;\r\n\r\n case 'dialog':\r\n this.dialogVisible = true;\r\n break;\r\n\r\n case 'route':\r\n {\r\n\r\n\r\n const id = item ? (item as any)[this.idField] : 'new';\r\n\r\n if(mode === 'add'){\r\n this.router.navigate([mode], { relativeTo: this.route });\r\n }\r\n else{\r\n const commands = [id, mode];\r\n console.log('Commands:', commands);\r\n console.log('Current route:', this.route.snapshot.pathFromRoot.map(r => r.routeConfig?.path));\r\n\r\n const tree = this.router.createUrlTree(commands, { relativeTo: this.route });\r\n console.log('URL Tree:', tree.toString());\r\n\r\n this.router.navigate([id, mode], { relativeTo: this.route });\r\n }\r\n break;\r\n }\r\n }\r\n}\r\nprotected loadDetail(id: string | number) {\r\n\r\n return firstValueFrom(this.service.get(id as any)).then(res => {\r\n this.selectedItem = res;\r\n });\r\n}\r\nvisibleChange(value: boolean) {\r\n const modeConfig = typeof this.displayMode === 'string'\r\n ? this.displayMode\r\n : this.displayMode[this.mode as 'add' | 'edit' | 'view'] ?? 'drawer';\r\n\r\n if (modeConfig === 'dialog') {\r\n this.dialogVisible = value;\r\n } else if (modeConfig === 'drawer') {\r\n this.drawerVisible = value;\r\n } else {\r\n // route mode does not use drawer/dialog\r\n }\r\n}\r\n\r\n\r\n\r\nonTableAction(event: { name: string; row: T | null }): void {\r\n switch (event.name) {\r\n case 'add':\r\n case 'edit':\r\n case 'view':\r\n this.openEditor(event.row, event.name);\r\n break;\r\n case 'delete':\r\n this.onDelete(event.row!);\r\n break;\r\n case 'state':\r\n this.openDeactivationReason(event.row!);\r\n break;\r\n // 🟢 الحالة الجديدة للقوالب\r\n case 'openTemplates':\r\n this.templateDrawerVisible = true; // نفتح الدرج\r\n break;\r\n }\r\n}\r\n\r\n\r\nprotected openDrawer(item: T | null,mode:string): void {\r\n\r\n this.mode = mode;\r\n\r\n // this.drawerVisible = !this.drawerVisible;\r\n\r\n\r\n if (item == null) {\r\n\r\n this.selectedItem = this.defaultModel || {};\r\n }\r\n else{\r\n this.selectedItem = item;\r\n }\r\n\r\n if(mode == 'edit'){\r\n this.drawerVisible = true;\r\n this.isEditMode = true ;\r\n this.isViewMode = false ;\r\n // this.isEditMode = item !=null ;\r\n }\r\n if(mode == 'add'){\r\n this.drawerVisible = true;\r\n this.isViewMode = false ;\r\n this.isEditMode = false ;\r\n }\r\n if(mode == 'view'){\r\n // this.drawerVisible = true;\r\n this.dialogVisible = true;\r\n\r\n this.isViewMode = true ;\r\n this.isEditMode = false ;\r\n }\r\n}\r\n\r\n\r\nopenDeactivationReason(model: any) {\r\n\r\n this.selectedItem = model;\r\n if(this.selectedItem.isActive == true){\r\n\r\n\r\n const ref = this.dialogService.open(DeactivationReasonFormComponent, {\r\n header: 'السبب (في حال تم إيقافه)',\r\n width: '30vw',\r\n data: { model: { ...model },\r\n fields: this.formFields,\r\n service: this.service,\r\n idField: this.idField },\r\n });\r\n\r\n ref?.onClose.subscribe((result) => {\r\n if (result) {\r\n this.selectedItem.isActive = false;\r\n this.selectedItem.deactivationReason = result.deactivationReason;\r\n // Optionally: save model via API\r\n this.loadPage(this.first, this.rows);\r\n }\r\n });\r\n}\r\nelse{\r\n this.selectedItem.isActive = true;\r\n this.selectedItem.deactivationReason = \"\";\r\n const id = this.idParser.parseIds(this.selectedItem, this.idField);\r\n // const id = (this.selectedItem as any)[this.idField] ;\r\n this.service.update(id, this.selectedItem).subscribe({\r\n next: () => {\r\n this.loadPage(this.first, this.rows);\r\n // this.loadPage(0, 10);\r\n },\r\n error: (err:any) => {\r\n this.loading = false;\r\n\r\n }\r\n });\r\n}\r\n}\r\n\r\n\r\nonDelete(item: any): void {\r\n // const id = item[this.idField];\r\n const id = this.idParser.parseIds(item, this.idField);\r\n\r\n this.swalService.confirm(\r\n 'تأكيد الحذف',\r\n 'هل تريد حذف هذا السجل فعلاً؟',\r\n 'نعم، احذف',\r\n 'إلغاء'\r\n ).then((result) => {\r\n if (result.isConfirmed) {\r\n this.service.delete(id).subscribe({\r\n next: () => {\r\n this.loadPage(this.first, this.rows);\r\n this.swalService.success('تم الحذف بنجاح');\r\n },\r\n error: (err: any) => {\r\n this.loading = false;\r\n\r\n }\r\n });\r\n }\r\n });\r\n}\r\n\r\nget columnFormFields(): FormlyFieldConfig[] {\r\n type Col = FormlyFieldConfig & { order?: number };\r\n\r\n const flattenFields = (fields: FormlyFieldConfig[]): Col[] => {\r\n return fields.flatMap(field => {\r\n if (field.fieldGroup?.length) return flattenFields(field.fieldGroup);\r\n if (!field.props) return [];\r\n\r\n const tableConfig = field.props['table'] ?? {};\r\n const hideExpr = tableConfig.expressions?.hide;\r\n // if (tableConfig.hidden === false || (typeof hideExpr === 'function' && hideExpr() == false) || field.props.readonly ) return [];\r\n if (field.props.readonly || field.hide ) return [];\r\n\r\n const mergedProps = { ...field.props, ...(tableConfig.props ?? {}) };\r\n\r\n const order: number | undefined =\r\n (tableConfig.order as number | undefined) ??\r\n (tableConfig.props?.order as number | undefined) ??\r\n (mergedProps['order'] as number | undefined);\r\n\r\n return [{\r\n type: field.type,\r\n key: field.key,\r\n props: field.props,\r\n wrappers:['td'],\r\n expressions: field.expressions,\r\n order\r\n }];\r\n });\r\n };\r\n\r\n return flattenFields(this.formFields)\r\n .sort((a, b) => (a.order ?? Number.MAX_SAFE_INTEGER) - (b.order ?? Number.MAX_SAFE_INTEGER))\r\n .map(({ order, ...rest }) => rest as FormlyFieldConfig);\r\n}\r\n\r\nget columns(): FormlyFieldConfig[] {\r\n type Col = FormlyFieldConfig & { order?: number };\r\n\r\n const flattenFields = (fields: FormlyFieldConfig[]): Col[] => {\r\n return fields.flatMap(field => {\r\n if (field.fieldGroup?.length) return flattenFields(field.fieldGroup);\r\n if (!field.props) return [];\r\n\r\n const tableConfig = field.props['table'] ?? {};\r\n const hideExpr = tableConfig.expressions?.hide;\r\n if (tableConfig.hidden === true || (typeof hideExpr === 'function' && hideExpr())) return [];\r\n\r\n const tableType = tableConfig.type ?? 'label-type';\r\n const mergedProps = { ...field.props, ...(tableConfig.props ?? {}) };\r\n\r\n const order: number | undefined =\r\n (tableConfig.order as number | undefined) ??\r\n (tableConfig.props?.order as number | undefined) ??\r\n (mergedProps['order'] as number | undefined);\r\n\r\n return [{\r\n type: tableType,\r\n key: field.key,\r\n props: mergedProps,\r\n expressions: tableConfig.expressions,\r\n order\r\n }];\r\n });\r\n };\r\n\r\n return flattenFields(this.formFields)\r\n .sort((a, b) => (a.order ?? Number.MAX_SAFE_INTEGER) - (b.order ?? Number.MAX_SAFE_INTEGER))\r\n .map(({ order, ...rest }) => rest as FormlyFieldConfig);\r\n}\r\n\r\n\r\n\r\n\r\nget filters(): FormlyFieldConfig[] {\r\n const flattenForFilter = (fields: FormlyFieldConfig[]): FormlyFieldConfig[] => {\r\n return fields.flatMap(field => {\r\n if (field.fieldGroup?.length) {\r\n // Recursively handle nested panels/groups\r\n return flattenForFilter(field.fieldGroup);\r\n }\r\n\r\n // Skip fields with no props or filter.hidden === true\r\n if (!field.props /* || field.props['filter']?.hidden === true */) {\r\n return [];\r\n }\r\n\r\n // Merge base props with filter overrides\r\n const mergedProps = {\r\n ...field.props,\r\n ...field.props['filter']?.props,\r\n };\r\n\r\n // Remove disabled and required props\r\n delete mergedProps['disabled'];\r\n delete mergedProps['required'];\r\n delete mergedProps['loadDefault'];\r\n delete mergedProps['canAdd'];\r\n\r\n\r\n return [{\r\n type: field.type,\r\n key: field.key, // always set key for table rendering\r\n props: mergedProps,\r\n // expressions: field.props['filter']?.expressions // uncomment if needed\r\n }];\r\n });\r\n };\r\n\r\n return flattenForFilter(this.formFields);\r\n}\r\n\r\n\r\n// 3. دالة فتح الدرج (Action)\r\nopenTemplatesAction() {\r\n this.templateDrawerVisible = true;\r\n}\r\n\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"es.framework-ng.ui.core-base-crud.mjs","sources":["../../../../libs/ng.ui.core/base-crud/src/lib/base-crud-module.ts","../../../../libs/ng.ui.core/base-crud/src/lib/base-crud.ts","../../../../libs/ng.ui.core/base-crud/src/es.framework-ng.ui.core-base-crud.ts"],"sourcesContent":["import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\n@NgModule({\n imports: [CommonModule],\n})\nexport class BaseCrudModule {}\n","\r\n\r\nimport { Directive, inject } from '@angular/core';\r\nimport { DialogService, DynamicDialogRef } from 'primeng/dynamicdialog';\r\nimport { FormlyFieldConfig } from '@ngx-formly/core';\r\nimport { ActivatedRoute, Router } from '@angular/router';\r\nimport { BaseService, IdParserService, SwalService } from '@es.framework/ng.core/services';\r\nimport { ActionDef, PaginatedResult } from '@es.framework/ng.core/models';\r\nimport { DeactivationReasonFormComponent } from '@es.framework/ng.ui.core/deactivation-reason';\r\nimport { firstValueFrom } from 'rxjs';\r\n\r\n@Directive()\r\nexport abstract class BaseCrud<T, F = any> {\r\n list: T[] = [];\r\n paginator = true;\r\n canLoad = true;\r\n loading = false;\r\n errorMsg = '';\r\n first = 0;\r\n rows = 10;\r\n totalRecords = 0;\r\n searchGlobal = '';\r\n sort?: string;\r\n pageFilters: Partial<F> = {};\r\n currentFilters: Partial<F> = {};\r\n mode ='';\r\n scrollHeight ='400px';\r\n private swalService = inject(SwalService);\r\n\r\n protected dialogRef!: DynamicDialogRef;\r\n\r\n\r\n // abstract service: CrudService<T, F>;\r\n abstract service: BaseService;\r\n abstract dialogService: DialogService;\r\n // abstract dialogComponent: any;\r\n // abstract columns: ColumnDef<T>[];\r\n abstract actions: ActionDef<T>[];\r\n\r\n // for generic dialog:\r\n abstract formFields: FormlyFieldConfig[];\r\n abstract idField: string |any;\r\n // abstract idField: keyof T;\r\n dialogVisible = false;\r\n drawerVisible = false;\r\n selectedItem: T | any = null;\r\n defaultModel: T | any = null;\r\n // selectedItem: T | any = {};\r\n isViewMode = false;\r\n isEditMode = false;\r\n // حالة ظهور درج القوالب\r\n templateDrawerVisible = false;\r\n\r\n\r\n\r\n displayMode:\r\n | 'drawer' | 'dialog' | 'route'\r\n | Partial<Record<'add' | 'edit' | 'view', 'drawer' | 'dialog' | 'route'>>\r\n = 'drawer';\r\nprivate idParser= inject(IdParserService);\r\n public router= inject(Router);\r\n public route = inject(ActivatedRoute);\r\n\r\nloadPage(pageIndex: number, pageSize: number): void {\r\n if(this.canLoad){\r\n\r\n\r\n this.loading = true;\r\n const filters: Partial<F> = {\r\n maxResultCount:pageSize,\r\n skipCount:pageIndex,\r\n sorting:this.sort,\r\n ...this.currentFilters,\r\n ...this.pageFilters,\r\n ...(this.searchGlobal ? { filter: this.searchGlobal } : {}),\r\n };\r\n //\r\n //\r\n this.service.getList(filters)\r\n .subscribe({\r\n next: (res: PaginatedResult<T>) => {\r\n //\r\n this.list = res.items;\r\n this.totalRecords = res.totalCount;\r\n this.loading = false;\r\n },\r\n error: (err:any) => {\r\n this.errorMsg = err.error?.message || err.message || 'خطأ في التحميل';\r\n this.loading = false;\r\n }\r\n });\r\n }\r\n}\r\n\r\nonSearch(filters?: any): void {\r\n //\r\n if (filters && typeof filters === 'object' && !Array.isArray(filters)) {\r\n this.pageFilters = filters;\r\n } else {\r\n this.searchGlobal = filters;\r\n }\r\n\r\n this.loadPage(0, 10);\r\n}\r\n\r\n\r\nonPageChange(event: { first?: number; rows?: number; sort?: string; filters?: Record<string, any> }): void {\r\n // فك المتغيّرات مع قيمة افتراضية لفلاتر\r\n const {\r\n first = this.first,\r\n rows = this.rows,\r\n sort = this.sort,\r\n filters = {}\r\n } = event;\r\n\r\n this.first = first;\r\n this.rows = rows;\r\n this.sort = sort;\r\n\r\n // const pageIndex = Math.floor(first / rows);\r\n const skipCount = first;\r\n const pageIndex = skipCount;\r\n\r\n // الوصول للفلتر العام عبر الصيغة المربعة\r\n const globalValue = filters['global'];\r\n this.searchGlobal = typeof globalValue === 'string' ? globalValue : '';\r\n\r\n\r\n this.loadPage(pageIndex, rows);\r\n}\r\n\r\n\r\nprotected openEditor(item: T | null, mode: 'add' | 'edit' | 'view'): void {\r\n this.mode = mode;\r\n this.selectedItem = item ?? this.defaultModel ?? {};\r\n this.isEditMode = mode === 'edit';\r\n this.isViewMode = mode === 'view';\r\n // Auto-load details if edit or view and have ID\r\n const id = (item as any)?.[this.idField];\r\n if ((this.isEditMode || this.isViewMode) && id) {\r\n // this.loadDetail(id);\r\n // (async () => {\r\n // await this.loadDetail(id);\r\n // })();\r\n }\r\n // resolve displayMode (string or map)\r\n const modeConfig = typeof this.displayMode === 'string'\r\n ? this.displayMode\r\n : this.displayMode[mode] ?? 'drawer';\r\n\r\n switch (modeConfig) {\r\n case 'drawer':\r\n this.drawerVisible = true;\r\n break;\r\n\r\n case 'dialog':\r\n this.dialogVisible = true;\r\n break;\r\n\r\n case 'route':\r\n {\r\n\r\n\r\n const id = item ? (item as any)[this.idField] : 'new';\r\n\r\n if(mode === 'add'){\r\n this.router.navigate([mode], { relativeTo: this.route });\r\n }\r\n else{\r\n const commands = [id, mode];\r\n console.log('Commands:', commands);\r\n console.log('Current route:', this.route.snapshot.pathFromRoot.map(r => r.routeConfig?.path));\r\n\r\n const tree = this.router.createUrlTree(commands, { relativeTo: this.route });\r\n console.log('URL Tree:', tree.toString());\r\n\r\n this.router.navigate([id, mode], { relativeTo: this.route });\r\n }\r\n break;\r\n }\r\n }\r\n}\r\nprotected loadDetail(id: string | number) {\r\n\r\n return firstValueFrom(this.service.get(id as any)).then(res => {\r\n this.selectedItem = res;\r\n });\r\n}\r\nvisibleChange(value: boolean) {\r\n const modeConfig = typeof this.displayMode === 'string'\r\n ? this.displayMode\r\n : this.displayMode[this.mode as 'add' | 'edit' | 'view'] ?? 'drawer';\r\n\r\n if (modeConfig === 'dialog') {\r\n this.dialogVisible = value;\r\n } else if (modeConfig === 'drawer') {\r\n this.drawerVisible = value;\r\n } else {\r\n // route mode does not use drawer/dialog\r\n }\r\n}\r\n\r\n\r\n\r\nonTableAction(event: { name: string; row: T | null }): void {\r\n switch (event.name) {\r\n case 'add':\r\n case 'edit':\r\n case 'view':\r\n this.openEditor(event.row, event.name);\r\n break;\r\n case 'delete':\r\n this.onDelete(event.row!);\r\n break;\r\n case 'state':\r\n this.openDeactivationReason(event.row!);\r\n break;\r\n // 🟢 الحالة الجديدة للقوالب\r\n case 'openTemplates':\r\n this.templateDrawerVisible = true; // نفتح الدرج\r\n break;\r\n }\r\n}\r\n\r\n\r\nprotected openDrawer(item: T | null,mode:string): void {\r\n\r\n this.mode = mode;\r\n\r\n // this.drawerVisible = !this.drawerVisible;\r\n\r\n\r\n if (item == null) {\r\n\r\n this.selectedItem = this.defaultModel || {};\r\n }\r\n else{\r\n this.selectedItem = item;\r\n }\r\n\r\n if(mode == 'edit'){\r\n this.drawerVisible = true;\r\n this.isEditMode = true ;\r\n this.isViewMode = false ;\r\n // this.isEditMode = item !=null ;\r\n }\r\n if(mode == 'add'){\r\n this.drawerVisible = true;\r\n this.isViewMode = false ;\r\n this.isEditMode = false ;\r\n }\r\n if(mode == 'view'){\r\n // this.drawerVisible = true;\r\n this.dialogVisible = true;\r\n\r\n this.isViewMode = true ;\r\n this.isEditMode = false ;\r\n }\r\n}\r\n\r\n\r\nopenDeactivationReason(model: any) {\r\n\r\n this.selectedItem = model;\r\n if(this.selectedItem.isActive == true){\r\n\r\n\r\n const ref = this.dialogService.open(DeactivationReasonFormComponent, {\r\n header: 'السبب (في حال تم إيقافه)',\r\n width: '30vw',\r\n data: { model: { ...model },\r\n fields: this.formFields,\r\n service: this.service,\r\n idField: this.idField },\r\n });\r\n\r\n ref?.onClose.subscribe((result) => {\r\n if (result) {\r\n this.selectedItem.isActive = false;\r\n this.selectedItem.deactivationReason = result.deactivationReason;\r\n // Optionally: save model via API\r\n this.loadPage(this.first, this.rows);\r\n }\r\n });\r\n}\r\nelse{\r\n this.selectedItem.isActive = true;\r\n this.selectedItem.deactivationReason = \"\";\r\n const id = this.idParser.parseIds(this.selectedItem, this.idField);\r\n // const id = (this.selectedItem as any)[this.idField] ;\r\n this.service.update(id, this.selectedItem).subscribe({\r\n next: () => {\r\n this.loadPage(this.first, this.rows);\r\n // this.loadPage(0, 10);\r\n },\r\n error: (err:any) => {\r\n this.loading = false;\r\n\r\n }\r\n });\r\n}\r\n}\r\n\r\n\r\nonDelete(item: any): void {\r\n // const id = item[this.idField];\r\n const id = this.idParser.parseIds(item, this.idField);\r\n\r\n this.swalService.confirm(\r\n 'تأكيد الحذف',\r\n 'هل تريد حذف هذا السجل فعلاً؟',\r\n 'نعم، احذف',\r\n 'إلغاء'\r\n ).then((result) => {\r\n if (result.isConfirmed) {\r\n this.service.delete(id).subscribe({\r\n next: () => {\r\n this.loadPage(this.first, this.rows);\r\n this.swalService.success('تم الحذف بنجاح');\r\n },\r\n error: (err: any) => {\r\n this.loading = false;\r\n\r\n }\r\n });\r\n }\r\n });\r\n}\r\n\r\nget columnFormFields(): FormlyFieldConfig[] {\r\n type Col = FormlyFieldConfig & { order?: number };\r\n\r\n const flattenFields = (fields: FormlyFieldConfig[]): Col[] => {\r\n return fields.flatMap(field => {\r\n if (field.fieldGroup?.length) return flattenFields(field.fieldGroup);\r\n if (!field.props) return [];\r\n\r\n const tableConfig = field.props['table'] ?? {};\r\n const hideExpr = tableConfig.expressions?.hide;\r\n // if (tableConfig.hidden === false || (typeof hideExpr === 'function' && hideExpr() == false) || field.props.readonly ) return [];\r\n if (field.props.readonly || field.hide ) return [];\r\n\r\n const mergedProps = { ...field.props, ...(tableConfig.props ?? {}) };\r\n\r\n const order: number | undefined =\r\n (tableConfig.order as number | undefined) ??\r\n (tableConfig.props?.order as number | undefined) ??\r\n (mergedProps['order'] as number | undefined);\r\n\r\n return [{\r\n type: field.type,\r\n key: field.key,\r\n props: field.props,\r\n wrappers:['td'],\r\n expressions: field.expressions,\r\n order\r\n }];\r\n });\r\n };\r\n\r\n return flattenFields(this.formFields)\r\n .sort((a, b) => (a.order ?? Number.MAX_SAFE_INTEGER) - (b.order ?? Number.MAX_SAFE_INTEGER))\r\n .map(({ order, ...rest }) => rest as FormlyFieldConfig);\r\n}\r\n\r\nget columns(): FormlyFieldConfig[] {\r\n type Col = FormlyFieldConfig & { order?: number };\r\n\r\n const flattenFields = (fields: FormlyFieldConfig[]): Col[] => {\r\n return fields.flatMap(field => {\r\n if (field.fieldGroup?.length) return flattenFields(field.fieldGroup);\r\n if (!field.props) return [];\r\n\r\n const tableConfig = field.props['table'] ?? {};\r\n const hideExpr = tableConfig.expressions?.hide;\r\n if (tableConfig.hidden === true || (typeof hideExpr === 'function' && hideExpr())) return [];\r\n\r\n const tableType = tableConfig.type ?? 'label-type';\r\n const mergedProps = { ...field.props, ...(tableConfig.props ?? {}) };\r\n\r\n const order: number | undefined =\r\n (tableConfig.order as number | undefined) ??\r\n (tableConfig.props?.order as number | undefined) ??\r\n (mergedProps['order'] as number | undefined);\r\n\r\n return [{\r\n type: tableType,\r\n key: field.key,\r\n props: mergedProps,\r\n expressions: tableConfig.expressions,\r\n order\r\n }];\r\n });\r\n };\r\n\r\n return flattenFields(this.formFields)\r\n .sort((a, b) => (a.order ?? Number.MAX_SAFE_INTEGER) - (b.order ?? Number.MAX_SAFE_INTEGER))\r\n .map(({ order, ...rest }) => rest as FormlyFieldConfig);\r\n}\r\n\r\n\r\n\r\n\r\nget filters(): FormlyFieldConfig[] {\r\n const flattenForFilter = (fields: FormlyFieldConfig[]): FormlyFieldConfig[] => {\r\n return fields.flatMap(field => {\r\n if (field.fieldGroup?.length) {\r\n // Recursively handle nested panels/groups\r\n return flattenForFilter(field.fieldGroup);\r\n }\r\n\r\n // Skip fields with no props or filter.hidden === true\r\n if (!field.props /* || field.props['filter']?.hidden === true */) {\r\n return [];\r\n }\r\n\r\n // Merge base props with filter overrides\r\n const mergedProps = {\r\n ...field.props,\r\n ...field.props['filter']?.props,\r\n };\r\n\r\n // Remove disabled and required props\r\n delete mergedProps['disabled'];\r\n delete mergedProps['required'];\r\n delete mergedProps['loadDefault'];\r\n delete mergedProps['canAdd'];\r\n\r\n\r\n return [{\r\n type: field.type,\r\n key: field.key, // always set key for table rendering\r\n props: mergedProps,\r\n // expressions: field.props['filter']?.expressions // uncomment if needed\r\n }];\r\n });\r\n };\r\n\r\n return flattenForFilter(this.formFields);\r\n}\r\n\r\n\r\n// 3. دالة فتح الدرج (Action)\r\nopenTemplatesAction() {\r\n this.templateDrawerVisible = true;\r\n}\r\n\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;;MAMa,cAAc,CAAA;uGAAd,cAAc,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA;AAAd,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,cAAc,YAFf,YAAY,CAAA,EAAA,CAAA;AAEX,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,cAAc,YAFf,YAAY,CAAA,EAAA,CAAA;;2FAEX,cAAc,EAAA,UAAA,EAAA,CAAA;kBAH1B,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;oBACR,OAAO,EAAE,CAAC,YAAY,CAAC;AACxB,iBAAA;;;MCOqB,QAAQ,CAAA;IAC5B,IAAI,GAAsB,EAAE;IAC5B,SAAS,GAAU,IAAI;IACvB,OAAO,GAAU,IAAI;IACrB,OAAO,GAAU,KAAK;IACtB,QAAQ,GAAU,EAAE;IACpB,KAAK,GAAa,CAAC;IACnB,IAAI,GAAc,EAAE;IACpB,YAAY,GAAM,CAAC;IACnB,YAAY,GAAM,EAAE;AACpB,IAAA,IAAI;IACJ,WAAW,GAAe,EAAE;IAC5B,cAAc,GAAe,EAAE;IAC/B,IAAI,GAAE,EAAE;IACR,YAAY,GAAE,OAAO;AACb,IAAA,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;AAE/B,IAAA,SAAS;;IAcnB,aAAa,GAAG,KAAK;IACrB,aAAa,GAAG,KAAK;IACrB,YAAY,GAAY,IAAI;IAC5B,YAAY,GAAY,IAAI;;IAE5B,UAAU,GAAG,KAAK;IAClB,UAAU,GAAG,KAAK;;IAElB,qBAAqB,GAAG,KAAK;IAI7B,WAAW,GAGT,QAAQ;AACJ,IAAA,QAAQ,GAAE,MAAM,CAAC,eAAe,CAAC;AAChC,IAAA,MAAM,GAAE,MAAM,CAAC,MAAM,CAAC;AACtB,IAAA,KAAK,GAAG,MAAM,CAAC,cAAc,CAAC;IAEvC,QAAQ,CAAC,SAAiB,EAAE,QAAgB,EAAA;AACxC,QAAA,IAAG,IAAI,CAAC,OAAO,EAAC;AAGhB,YAAA,IAAI,CAAC,OAAO,GAAG,IAAI;AACnB,YAAA,MAAM,OAAO,GAAe;AAC1B,gBAAA,cAAc,EAAC,QAAQ;AACvB,gBAAA,SAAS,EAAC,SAAS;gBACnB,OAAO,EAAC,IAAI,CAAC,IAAI;gBACnB,GAAG,IAAI,CAAC,cAAc;gBACtB,GAAG,IAAI,CAAC,WAAW;AACnB,gBAAA,IAAI,IAAI,CAAC,YAAY,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,GAAG,EAAE,CAAC;aAC1D;;;AAGD,YAAA,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO;AACzB,iBAAA,SAAS,CAAC;AACT,gBAAA,IAAI,EAAE,CAAC,GAAuB,KAAI;;AAEhC,oBAAA,IAAI,CAAC,IAAI,GAAW,GAAG,CAAC,KAAK;AAC7B,oBAAA,IAAI,CAAC,YAAY,GAAG,GAAG,CAAC,UAAU;AAClC,oBAAA,IAAI,CAAC,OAAO,GAAQ,KAAK;gBAC3B,CAAC;AACD,gBAAA,KAAK,EAAE,CAAC,GAAO,KAAI;AACjB,oBAAA,IAAI,CAAC,QAAQ,GAAO,GAAG,CAAC,KAAK,EAAE,OAAO,IAAI,GAAG,CAAC,OAAO,IAAI,gBAAgB;AACzE,oBAAA,IAAI,CAAC,OAAO,GAAQ,KAAK;gBAC3B;AACD,aAAA,CAAC;QACJ;IACJ;AAEA,IAAA,QAAQ,CAAC,OAAa,EAAA;;AAEpB,QAAA,IAAI,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;AACrE,YAAA,IAAI,CAAC,WAAW,GAAG,OAAO;QAC5B;aAAO;AACL,YAAA,IAAI,CAAC,YAAY,GAAG,OAAO;QAC7B;AAEA,QAAA,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC;IACtB;AAGA,IAAA,YAAY,CAAC,KAAsF,EAAA;;QAEjG,MAAM,EACJ,KAAK,GAAK,IAAI,CAAC,KAAK,EACpB,IAAI,GAAM,IAAI,CAAC,IAAI,EACnB,IAAI,GAAM,IAAI,CAAC,IAAI,EACnB,OAAO,GAAG,EAAE,EACb,GAAG,KAAK;AAET,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAClB,QAAA,IAAI,CAAC,IAAI,GAAI,IAAI;AACjB,QAAA,IAAI,CAAC,IAAI,GAAI,IAAI;;QAGjB,MAAM,SAAS,GAAG,KAAK;QACvB,MAAM,SAAS,GAAG,SAAS;;AAG3B,QAAA,MAAM,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC;AACrC,QAAA,IAAI,CAAC,YAAY,GAAG,OAAO,WAAW,KAAK,QAAQ,GAAG,WAAW,GAAG,EAAE;AAGtE,QAAA,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC;IAChC;IAGU,UAAU,CAAC,IAAc,EAAE,IAA6B,EAAA;AAChE,QAAA,IAAI,CAAC,IAAI,GAAG,IAAI;QAChB,IAAI,CAAC,YAAY,GAAG,IAAI,IAAI,IAAI,CAAC,YAAY,IAAI,EAAE;AACnD,QAAA,IAAI,CAAC,UAAU,GAAG,IAAI,KAAK,MAAM;AACjC,QAAA,IAAI,CAAC,UAAU,GAAG,IAAI,KAAK,MAAM;;QAEjC,MAAM,EAAE,GAAI,IAAY,GAAG,IAAI,CAAC,OAAO,CAAC;AACxC,QAAA,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,UAAU,KAAK,EAAE,EAAE;;;;;QAKhD;;AAEA,QAAA,MAAM,UAAU,GAAG,OAAO,IAAI,CAAC,WAAW,KAAK;cAC3C,IAAI,CAAC;cACL,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,QAAQ;QAEtC,QAAQ,UAAU;AAChB,YAAA,KAAK,QAAQ;AACX,gBAAA,IAAI,CAAC,aAAa,GAAG,IAAI;gBACzB;AAEF,YAAA,KAAK,QAAQ;AACX,gBAAA,IAAI,CAAC,aAAa,GAAG,IAAI;gBACzB;AAEF,YAAA,KAAK,OAAO;gBACV;AAGE,oBAAA,MAAM,EAAE,GAAG,IAAI,GAAI,IAAY,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,KAAK;AAEvD,oBAAA,IAAG,IAAI,KAAK,KAAK,EAAC;AAChB,wBAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,UAAU,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;oBAC1D;yBACI;AACF,wBAAA,MAAM,QAAQ,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC;AAC3B,wBAAA,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,QAAQ,CAAC;wBAClC,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;AAE7F,wBAAA,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,QAAQ,EAAE,EAAE,UAAU,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;wBAC5E,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;AAEzC,wBAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,UAAU,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;oBAC9D;oBACA;gBACA;;IAEN;AACU,IAAA,UAAU,CAAC,EAAmB,EAAA;AAEtC,QAAA,OAAO,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,IAAG;AAC5D,YAAA,IAAI,CAAC,YAAY,GAAG,GAAG;AACzB,QAAA,CAAC,CAAC;IACJ;AACA,IAAA,aAAa,CAAC,KAAc,EAAA;AAC1B,QAAA,MAAM,UAAU,GAAG,OAAO,IAAI,CAAC,WAAW,KAAK;cAC3C,IAAI,CAAC;cACL,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAA+B,CAAC,IAAI,QAAQ;AAEtE,QAAA,IAAI,UAAU,KAAK,QAAQ,EAAE;AAC3B,YAAA,IAAI,CAAC,aAAa,GAAG,KAAK;QAC5B;AAAO,aAAA,IAAI,UAAU,KAAK,QAAQ,EAAE;AAClC,YAAA,IAAI,CAAC,aAAa,GAAG,KAAK;QAC5B;aAAO;;QAEP;IACF;AAIA,IAAA,aAAa,CAAC,KAAsC,EAAA;AAClD,QAAA,QAAQ,KAAK,CAAC,IAAI;AAChB,YAAA,KAAK,KAAK;AACV,YAAA,KAAK,MAAM;AACX,YAAA,KAAK,MAAM;gBACT,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC;gBACtC;AACF,YAAA,KAAK,QAAQ;AACX,gBAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAI,CAAC;gBACzB;AACF,YAAA,KAAK,OAAO;AACV,gBAAA,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC,GAAI,CAAC;gBACvC;;AAEF,YAAA,KAAK,eAAe;AAClB,gBAAA,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC;gBAClC;;IAEN;IAGU,UAAU,CAAC,IAAc,EAAC,IAAW,EAAA;AAEzC,QAAA,IAAI,CAAC,IAAI,GAAG,IAAI;;AAKhB,QAAA,IAAI,IAAI,IAAI,IAAI,EAAE;YAEhB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,IAAI,EAAE;QAC7C;aACI;AACD,YAAA,IAAI,CAAC,YAAY,GAAG,IAAI;QAC3B;AAEA,QAAA,IAAG,IAAI,IAAI,MAAM,EAAC;AAChB,YAAA,IAAI,CAAC,aAAa,GAAG,IAAI;AACzB,YAAA,IAAI,CAAC,UAAU,GAAG,IAAI;AACtB,YAAA,IAAI,CAAC,UAAU,GAAG,KAAK;;QAEzB;AACA,QAAA,IAAG,IAAI,IAAI,KAAK,EAAC;AACd,YAAA,IAAI,CAAC,aAAa,GAAG,IAAI;AAC1B,YAAA,IAAI,CAAC,UAAU,GAAG,KAAK;AACvB,YAAA,IAAI,CAAC,UAAU,GAAG,KAAK;QACzB;AACA,QAAA,IAAG,IAAI,IAAI,MAAM,EAAC;;AAEhB,YAAA,IAAI,CAAC,aAAa,GAAG,IAAI;AAEzB,YAAA,IAAI,CAAC,UAAU,GAAG,IAAI;AACtB,YAAA,IAAI,CAAC,UAAU,GAAG,KAAK;QACzB;IACN;AAGA,IAAA,sBAAsB,CAAC,KAAU,EAAA;AAE/B,QAAA,IAAI,CAAC,YAAY,GAAG,KAAK;QACzB,IAAG,IAAI,CAAC,YAAY,CAAC,QAAQ,IAAI,IAAI,EAAC;YAGtC,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,+BAA+B,EAAE;AACnE,gBAAA,MAAM,EAAE,0BAA0B;AAClC,gBAAA,KAAK,EAAE,MAAM;AACb,gBAAA,IAAI,EAAE,EAAE,KAAK,EAAE,EAAE,GAAG,KAAK,EAAE;oBACvB,MAAM,EAAE,IAAI,CAAC,UAAU;oBACvB,OAAO,EAAE,IAAI,CAAC,OAAO;AACrB,oBAAA,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE;AAC5B,aAAA,CAAC;YAEF,GAAG,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC,MAAM,KAAI;gBAChC,IAAI,MAAM,EAAE;AACV,oBAAA,IAAI,CAAC,YAAY,CAAC,QAAQ,GAAG,KAAK;oBAClC,IAAI,CAAC,YAAY,CAAC,kBAAkB,GAAG,MAAM,CAAC,kBAAkB;;oBAEpE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC;gBAClC;AACF,YAAA,CAAC,CAAC;QACJ;aACI;AACD,YAAA,IAAI,CAAC,YAAY,CAAC,QAAQ,GAAG,IAAI;AACjC,YAAA,IAAI,CAAC,YAAY,CAAC,kBAAkB,GAAG,EAAE;AACzC,YAAA,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,OAAO,CAAC;;AAEjE,YAAA,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC;gBAC9C,IAAI,EAAE,MAAK;oBACR,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC;;gBAEvC,CAAC;AACD,gBAAA,KAAK,EAAE,CAAC,GAAO,KAAI;AACjB,oBAAA,IAAI,CAAC,OAAO,GAAG,KAAK;gBAEtB;AACD,aAAA,CAAC;QACX;IACA;AAGA,IAAA,QAAQ,CAAC,IAAS,EAAA;;AAEhB,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC;AAErD,QAAA,IAAI,CAAC,WAAW,CAAC,OAAO,CACtB,aAAa,EACb,8BAA8B,EAC9B,WAAW,EACX,OAAO,CACR,CAAC,IAAI,CAAC,CAAC,MAAM,KAAI;AAChB,YAAA,IAAI,MAAM,CAAC,WAAW,EAAE;gBACtB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC;oBAChC,IAAI,EAAE,MAAK;wBACT,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC;AACpC,wBAAA,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,gBAAgB,CAAC;oBAC5C,CAAC;AACD,oBAAA,KAAK,EAAE,CAAC,GAAQ,KAAI;AAClB,wBAAA,IAAI,CAAC,OAAO,GAAG,KAAK;oBAEtB;AACD,iBAAA,CAAC;YACJ;AACF,QAAA,CAAC,CAAC;IACJ;AAEA,IAAA,IAAI,gBAAgB,GAAA;AAGlB,QAAA,MAAM,aAAa,GAAG,CAAC,MAA2B,KAAW;AAC3D,YAAA,OAAO,MAAM,CAAC,OAAO,CAAC,KAAK,IAAG;AAC5B,gBAAA,IAAI,KAAK,CAAC,UAAU,EAAE,MAAM;AAAE,oBAAA,OAAO,aAAa,CAAC,KAAK,CAAC,UAAU,CAAC;gBACpE,IAAI,CAAC,KAAK,CAAC,KAAK;AAAE,oBAAA,OAAO,EAAE;gBAE3B,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE;AAC9C,gBAAA,MAAM,QAAQ,GAAG,WAAW,CAAC,WAAW,EAAE,IAAI;;gBAE9C,IAAI,KAAK,CAAC,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,IAAI;AAAG,oBAAA,OAAO,EAAE;AAElD,gBAAA,MAAM,WAAW,GAAG,EAAE,GAAG,KAAK,CAAC,KAAK,EAAE,IAAI,WAAW,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE;AAEpE,gBAAA,MAAM,KAAK,GACR,WAAW,CAAC,KAA4B;oBACxC,WAAW,CAAC,KAAK,EAAE,KAA4B;oBAC/C,WAAW,CAAC,OAAO,CAAwB;AAE9C,gBAAA,OAAO,CAAC;wBACN,IAAI,EAAE,KAAK,CAAC,IAAI;wBAChB,GAAG,EAAE,KAAK,CAAC,GAAG;wBACd,KAAK,EAAE,KAAK,CAAC,KAAK;wBAClB,QAAQ,EAAC,CAAC,IAAI,CAAC;wBACf,WAAW,EAAE,KAAK,CAAC,WAAW;wBAC9B;AACD,qBAAA,CAAC;AACJ,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC;AAED,QAAA,OAAO,aAAa,CAAC,IAAI,CAAC,UAAU;aACjC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,MAAM,CAAC,gBAAgB,KAAK,CAAC,CAAC,KAAK,IAAI,MAAM,CAAC,gBAAgB,CAAC;AAC1F,aAAA,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,IAAI,EAAE,KAAK,IAAyB,CAAC;IAC3D;AAEA,IAAA,IAAI,OAAO,GAAA;AAGT,QAAA,MAAM,aAAa,GAAG,CAAC,MAA2B,KAAW;AAC3D,YAAA,OAAO,MAAM,CAAC,OAAO,CAAC,KAAK,IAAG;AAC5B,gBAAA,IAAI,KAAK,CAAC,UAAU,EAAE,MAAM;AAAE,oBAAA,OAAO,aAAa,CAAC,KAAK,CAAC,UAAU,CAAC;gBACpE,IAAI,CAAC,KAAK,CAAC,KAAK;AAAE,oBAAA,OAAO,EAAE;gBAE3B,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE;AAC9C,gBAAA,MAAM,QAAQ,GAAG,WAAW,CAAC,WAAW,EAAE,IAAI;AAC9C,gBAAA,IAAI,WAAW,CAAC,MAAM,KAAK,IAAI,KAAK,OAAO,QAAQ,KAAK,UAAU,IAAI,QAAQ,EAAE,CAAC;AAAE,oBAAA,OAAO,EAAE;AAE5F,gBAAA,MAAM,SAAS,GAAG,WAAW,CAAC,IAAI,IAAI,YAAY;AAClD,gBAAA,MAAM,WAAW,GAAG,EAAE,GAAG,KAAK,CAAC,KAAK,EAAE,IAAI,WAAW,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE;AAEpE,gBAAA,MAAM,KAAK,GACR,WAAW,CAAC,KAA4B;oBACxC,WAAW,CAAC,KAAK,EAAE,KAA4B;oBAC/C,WAAW,CAAC,OAAO,CAAwB;AAE9C,gBAAA,OAAO,CAAC;AACN,wBAAA,IAAI,EAAE,SAAS;wBACf,GAAG,EAAE,KAAK,CAAC,GAAG;AACd,wBAAA,KAAK,EAAE,WAAW;wBAClB,WAAW,EAAE,WAAW,CAAC,WAAW;wBACpC;AACD,qBAAA,CAAC;AACJ,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC;AAED,QAAA,OAAO,aAAa,CAAC,IAAI,CAAC,UAAU;aACjC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,MAAM,CAAC,gBAAgB,KAAK,CAAC,CAAC,KAAK,IAAI,MAAM,CAAC,gBAAgB,CAAC;AAC1F,aAAA,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,IAAI,EAAE,KAAK,IAAyB,CAAC;IAC3D;AAKA,IAAA,IAAI,OAAO,GAAA;AACT,QAAA,MAAM,gBAAgB,GAAG,CAAC,MAA2B,KAAyB;AAC5E,YAAA,OAAO,MAAM,CAAC,OAAO,CAAC,KAAK,IAAG;AAC5B,gBAAA,IAAI,KAAK,CAAC,UAAU,EAAE,MAAM,EAAE;;AAE5B,oBAAA,OAAO,gBAAgB,CAAC,KAAK,CAAC,UAAU,CAAC;gBAC3C;;AAGA,gBAAA,IAAI,CAAC,KAAK,CAAC,KAAK,kDAAkD;AAChE,oBAAA,OAAO,EAAE;gBACX;;AAGA,gBAAA,MAAM,WAAW,GAAG;oBAClB,GAAG,KAAK,CAAC,KAAK;AACd,oBAAA,GAAG,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,KAAK;iBAChC;;AAGD,gBAAA,OAAO,WAAW,CAAC,UAAU,CAAC;AAC9B,gBAAA,OAAO,WAAW,CAAC,UAAU,CAAC;AAC9B,gBAAA,OAAO,WAAW,CAAC,aAAa,CAAC;AACjC,gBAAA,OAAO,WAAW,CAAC,QAAQ,CAAC;AAG5B,gBAAA,OAAO,CAAC;wBACN,IAAI,EAAE,KAAK,CAAC,IAAI;AAChB,wBAAA,GAAG,EAAE,KAAK,CAAC,GAAG;AACd,wBAAA,KAAK,EAAE,WAAW;;AAEnB,qBAAA,CAAC;AACJ,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC;AAED,QAAA,OAAO,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC;IAC1C;;IAIA,mBAAmB,GAAA;AACjB,QAAA,IAAI,CAAC,qBAAqB,GAAG,IAAI;IACnC;uGAjbsB,QAAQ,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAR,QAAQ,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAAR,QAAQ,EAAA,UAAA,EAAA,CAAA;kBAD7B;;;ACXD;;AAEG;;;;"}
|