@es.framework/ng.ui.core 2.0.65 → 2.0.66
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 +108 -108
- 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 +8 -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 +14 -3
- 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 +19 -3
- package/fesm2022/es.framework-ng.ui.core-generic-report.mjs.map +1 -1
- package/fesm2022/es.framework-ng.ui.core-generic-search-advanced.mjs +442 -442
- 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 +16 -8
- 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-button.d.ts +3 -1
- package/types/es.framework-ng.ui.core-generic-crud-table.d.ts +1 -0
- package/types/es.framework-ng.ui.core-generic-report.d.ts +1 -0
- package/types/es.framework-ng.ui.core-generic-table.d.ts +1 -1
- 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\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"] }] });
|
|
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\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=\"\u0627\u0633\u062D\u0628 \u0627\u0644\u0645\u0644\u0641\u0627\u062A \u0623\u0648 \u0627\u0646\u0642\u0631 \u0644\u0644\u0625\u0631\u0641\u0627\u0642\"\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=\"\u062D\u0630\u0641\"\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=\"\u062A\u062D\u0645\u064A\u0644\"\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=\"\u0623\u0636\u0641 \u0648\u0635\u0641\u0627\u064B\"\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\">\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>\r\n </div>\r\n }\r\n </ng-template>\r\n</p-fileUpload>\r\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\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" }]
|
|
209
|
+
], providers: [MessageService], template: "<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=\"\u0627\u0633\u062D\u0628 \u0627\u0644\u0645\u0644\u0641\u0627\u062A \u0623\u0648 \u0627\u0646\u0642\u0631 \u0644\u0644\u0625\u0631\u0641\u0627\u0642\"\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=\"\u062D\u0630\u0641\"\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=\"\u062A\u062D\u0645\u064A\u0644\"\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=\"\u0623\u0636\u0641 \u0648\u0635\u0641\u0627\u064B\"\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\">\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>\r\n </div>\r\n }\r\n </ng-template>\r\n</p-fileUpload>\r\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';\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
|
+
{"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 +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';\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":"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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';\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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"}
|