@es.framework/ng.ui.core 2.0.58
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 -0
- package/attachments/README.md +3 -0
- package/base-crud/README.md +3 -0
- package/breadcrumb/README.md +3 -0
- package/checkbox/README.md +3 -0
- package/collapsible/README.md +3 -0
- package/color-picker/README.md +3 -0
- package/column-settings-popover/README.md +3 -0
- package/custom-switch/README.md +3 -0
- package/datepicker/README.md +3 -0
- package/deactivation-reason/README.md +3 -0
- package/excel-import/README.md +3 -0
- package/fesm2022/es.framework-ng.ui.core-attachments.mjs +217 -0
- package/fesm2022/es.framework-ng.ui.core-attachments.mjs.map +1 -0
- package/fesm2022/es.framework-ng.ui.core-base-crud.mjs +370 -0
- package/fesm2022/es.framework-ng.ui.core-base-crud.mjs.map +1 -0
- package/fesm2022/es.framework-ng.ui.core-breadcrumb.mjs +145 -0
- package/fesm2022/es.framework-ng.ui.core-breadcrumb.mjs.map +1 -0
- package/fesm2022/es.framework-ng.ui.core-checkbox.mjs +131 -0
- package/fesm2022/es.framework-ng.ui.core-checkbox.mjs.map +1 -0
- package/fesm2022/es.framework-ng.ui.core-collapsible.mjs +90 -0
- package/fesm2022/es.framework-ng.ui.core-collapsible.mjs.map +1 -0
- package/fesm2022/es.framework-ng.ui.core-color-picker.mjs +87 -0
- package/fesm2022/es.framework-ng.ui.core-color-picker.mjs.map +1 -0
- package/fesm2022/es.framework-ng.ui.core-column-settings-popover.mjs +183 -0
- package/fesm2022/es.framework-ng.ui.core-column-settings-popover.mjs.map +1 -0
- package/fesm2022/es.framework-ng.ui.core-custom-switch.mjs +119 -0
- package/fesm2022/es.framework-ng.ui.core-custom-switch.mjs.map +1 -0
- package/fesm2022/es.framework-ng.ui.core-datepicker.mjs +519 -0
- package/fesm2022/es.framework-ng.ui.core-datepicker.mjs.map +1 -0
- package/fesm2022/es.framework-ng.ui.core-deactivation-reason.mjs +144 -0
- package/fesm2022/es.framework-ng.ui.core-deactivation-reason.mjs.map +1 -0
- package/fesm2022/es.framework-ng.ui.core-excel-import.mjs +566 -0
- package/fesm2022/es.framework-ng.ui.core-excel-import.mjs.map +1 -0
- package/fesm2022/es.framework-ng.ui.core-filter-templates.mjs +386 -0
- package/fesm2022/es.framework-ng.ui.core-filter-templates.mjs.map +1 -0
- package/fesm2022/es.framework-ng.ui.core-form-button.mjs +62 -0
- package/fesm2022/es.framework-ng.ui.core-form-button.mjs.map +1 -0
- package/fesm2022/es.framework-ng.ui.core-form-field.mjs +155 -0
- package/fesm2022/es.framework-ng.ui.core-form-field.mjs.map +1 -0
- package/fesm2022/es.framework-ng.ui.core-form-template.mjs +37 -0
- package/fesm2022/es.framework-ng.ui.core-form-template.mjs.map +1 -0
- package/fesm2022/es.framework-ng.ui.core-formly-avatar-image.mjs +132 -0
- package/fesm2022/es.framework-ng.ui.core-formly-avatar-image.mjs.map +1 -0
- package/fesm2022/es.framework-ng.ui.core-formly-avatar-label.mjs +89 -0
- package/fesm2022/es.framework-ng.ui.core-formly-avatar-label.mjs.map +1 -0
- package/fesm2022/es.framework-ng.ui.core-formly-button-selector.mjs +195 -0
- package/fesm2022/es.framework-ng.ui.core-formly-button-selector.mjs.map +1 -0
- package/fesm2022/es.framework-ng.ui.core-formly-button.mjs +73 -0
- package/fesm2022/es.framework-ng.ui.core-formly-button.mjs.map +1 -0
- package/fesm2022/es.framework-ng.ui.core-formly-presets.mjs +201 -0
- package/fesm2022/es.framework-ng.ui.core-formly-presets.mjs.map +1 -0
- package/fesm2022/es.framework-ng.ui.core-formly-prime-icon-picker.mjs +542 -0
- package/fesm2022/es.framework-ng.ui.core-formly-prime-icon-picker.mjs.map +1 -0
- package/fesm2022/es.framework-ng.ui.core-formly-split-button.mjs +62 -0
- package/fesm2022/es.framework-ng.ui.core-formly-split-button.mjs.map +1 -0
- package/fesm2022/es.framework-ng.ui.core-formly-ui-all.mjs +422 -0
- package/fesm2022/es.framework-ng.ui.core-formly-ui-all.mjs.map +1 -0
- package/fesm2022/es.framework-ng.ui.core-formly-ui.mjs +48 -0
- package/fesm2022/es.framework-ng.ui.core-formly-ui.mjs.map +1 -0
- package/fesm2022/es.framework-ng.ui.core-formly-username-with-domain.mjs +85 -0
- package/fesm2022/es.framework-ng.ui.core-formly-username-with-domain.mjs.map +1 -0
- package/fesm2022/es.framework-ng.ui.core-generic-assets.mjs +22 -0
- package/fesm2022/es.framework-ng.ui.core-generic-assets.mjs.map +1 -0
- package/fesm2022/es.framework-ng.ui.core-generic-autocomplete.mjs +173 -0
- package/fesm2022/es.framework-ng.ui.core-generic-autocomplete.mjs.map +1 -0
- package/fesm2022/es.framework-ng.ui.core-generic-button.mjs +150 -0
- package/fesm2022/es.framework-ng.ui.core-generic-button.mjs.map +1 -0
- package/fesm2022/es.framework-ng.ui.core-generic-card.mjs +218 -0
- package/fesm2022/es.framework-ng.ui.core-generic-card.mjs.map +1 -0
- package/fesm2022/es.framework-ng.ui.core-generic-crud-table.mjs +929 -0
- package/fesm2022/es.framework-ng.ui.core-generic-crud-table.mjs.map +1 -0
- package/fesm2022/es.framework-ng.ui.core-generic-dialog.mjs +321 -0
- package/fesm2022/es.framework-ng.ui.core-generic-dialog.mjs.map +1 -0
- package/fesm2022/es.framework-ng.ui.core-generic-errormessage.mjs +35 -0
- package/fesm2022/es.framework-ng.ui.core-generic-errormessage.mjs.map +1 -0
- package/fesm2022/es.framework-ng.ui.core-generic-formly-fields.mjs +63 -0
- package/fesm2022/es.framework-ng.ui.core-generic-formly-fields.mjs.map +1 -0
- package/fesm2022/es.framework-ng.ui.core-generic-loadingspinner.mjs +34 -0
- package/fesm2022/es.framework-ng.ui.core-generic-loadingspinner.mjs.map +1 -0
- package/fesm2022/es.framework-ng.ui.core-generic-report-tabs.mjs +196 -0
- package/fesm2022/es.framework-ng.ui.core-generic-report-tabs.mjs.map +1 -0
- package/fesm2022/es.framework-ng.ui.core-generic-report.mjs +556 -0
- package/fesm2022/es.framework-ng.ui.core-generic-report.mjs.map +1 -0
- package/fesm2022/es.framework-ng.ui.core-generic-search-advanced.mjs +2995 -0
- package/fesm2022/es.framework-ng.ui.core-generic-search-advanced.mjs.map +1 -0
- package/fesm2022/es.framework-ng.ui.core-generic-search.mjs +103 -0
- package/fesm2022/es.framework-ng.ui.core-generic-search.mjs.map +1 -0
- package/fesm2022/es.framework-ng.ui.core-generic-selector.mjs +684 -0
- package/fesm2022/es.framework-ng.ui.core-generic-selector.mjs.map +1 -0
- package/fesm2022/es.framework-ng.ui.core-generic-table.mjs +388 -0
- package/fesm2022/es.framework-ng.ui.core-generic-table.mjs.map +1 -0
- package/fesm2022/es.framework-ng.ui.core-generic-view.mjs +465 -0
- package/fesm2022/es.framework-ng.ui.core-generic-view.mjs.map +1 -0
- package/fesm2022/es.framework-ng.ui.core-header-wrapper.mjs +31 -0
- package/fesm2022/es.framework-ng.ui.core-header-wrapper.mjs.map +1 -0
- package/fesm2022/es.framework-ng.ui.core-icon-picker.mjs +205 -0
- package/fesm2022/es.framework-ng.ui.core-icon-picker.mjs.map +1 -0
- package/fesm2022/es.framework-ng.ui.core-input-switch.mjs +102 -0
- package/fesm2022/es.framework-ng.ui.core-input-switch.mjs.map +1 -0
- package/fesm2022/es.framework-ng.ui.core-input-with-icon.mjs +67 -0
- package/fesm2022/es.framework-ng.ui.core-input-with-icon.mjs.map +1 -0
- package/fesm2022/es.framework-ng.ui.core-input.mjs +250 -0
- package/fesm2022/es.framework-ng.ui.core-input.mjs.map +1 -0
- package/fesm2022/es.framework-ng.ui.core-label-type.mjs +184 -0
- package/fesm2022/es.framework-ng.ui.core-label-type.mjs.map +1 -0
- package/fesm2022/es.framework-ng.ui.core-loading-skeletons.mjs +66 -0
- package/fesm2022/es.framework-ng.ui.core-loading-skeletons.mjs.map +1 -0
- package/fesm2022/es.framework-ng.ui.core-odata-query-builder.mjs +307 -0
- package/fesm2022/es.framework-ng.ui.core-odata-query-builder.mjs.map +1 -0
- package/fesm2022/es.framework-ng.ui.core-query-type.mjs +162 -0
- package/fesm2022/es.framework-ng.ui.core-query-type.mjs.map +1 -0
- package/fesm2022/es.framework-ng.ui.core-radio.mjs +120 -0
- package/fesm2022/es.framework-ng.ui.core-radio.mjs.map +1 -0
- package/fesm2022/es.framework-ng.ui.core-repeat.mjs +290 -0
- package/fesm2022/es.framework-ng.ui.core-repeat.mjs.map +1 -0
- package/fesm2022/es.framework-ng.ui.core-select.mjs +179 -0
- package/fesm2022/es.framework-ng.ui.core-select.mjs.map +1 -0
- package/fesm2022/es.framework-ng.ui.core-sidebar-cards.mjs +52 -0
- package/fesm2022/es.framework-ng.ui.core-sidebar-cards.mjs.map +1 -0
- package/fesm2022/es.framework-ng.ui.core-sidebar-toggles.mjs +53 -0
- package/fesm2022/es.framework-ng.ui.core-sidebar-toggles.mjs.map +1 -0
- package/fesm2022/es.framework-ng.ui.core-tabs.mjs +57 -0
- package/fesm2022/es.framework-ng.ui.core-tabs.mjs.map +1 -0
- package/fesm2022/es.framework-ng.ui.core-tag-type.mjs +209 -0
- package/fesm2022/es.framework-ng.ui.core-tag-type.mjs.map +1 -0
- package/fesm2022/es.framework-ng.ui.core-text-editor.mjs +58 -0
- package/fesm2022/es.framework-ng.ui.core-text-editor.mjs.map +1 -0
- package/fesm2022/es.framework-ng.ui.core-textarea.mjs +93 -0
- package/fesm2022/es.framework-ng.ui.core-textarea.mjs.map +1 -0
- package/fesm2022/es.framework-ng.ui.core-wrappers.mjs +245 -0
- package/fesm2022/es.framework-ng.ui.core-wrappers.mjs.map +1 -0
- package/fesm2022/es.framework-ng.ui.core.mjs +20 -0
- package/fesm2022/es.framework-ng.ui.core.mjs.map +1 -0
- package/filter-templates/README.md +3 -0
- package/form-button/README.md +3 -0
- package/form-field/README.md +3 -0
- package/form-template/README.md +3 -0
- package/formly-avatar-image/README.md +3 -0
- package/formly-avatar-label/README.md +3 -0
- package/formly-button/README.md +3 -0
- package/formly-button-selector/README.md +3 -0
- package/formly-presets/README.md +3 -0
- package/formly-prime-icon-picker/README.md +3 -0
- package/formly-split-button/README.md +3 -0
- package/formly-ui/README.md +3 -0
- package/formly-ui-all/README.md +3 -0
- package/formly-username-with-domain/README.md +3 -0
- package/generic-assets/README.md +3 -0
- package/generic-autocomplete/README.md +3 -0
- package/generic-button/README.md +3 -0
- package/generic-card/README.md +3 -0
- package/generic-crud-table/README.md +3 -0
- package/generic-dialog/README.md +3 -0
- package/generic-errormessage/README.md +3 -0
- package/generic-formly-fields/README.md +3 -0
- package/generic-loadingspinner/README.md +3 -0
- package/generic-report/README.md +3 -0
- package/generic-report-tabs/README.md +0 -0
- package/generic-search/README.md +3 -0
- package/generic-search-advanced/README.md +3 -0
- package/generic-selector/README.md +3 -0
- package/generic-table/README.md +3 -0
- package/generic-view/README.md +3 -0
- package/header-wrapper/README.md +3 -0
- package/icon-picker/README.md +3 -0
- package/input/README.md +3 -0
- package/input-switch/README.md +3 -0
- package/input-with-icon/README.md +3 -0
- package/label-type/README.md +3 -0
- package/loading-skeletons/README.md +3 -0
- package/odata-query-builder/README.md +3 -0
- package/package.json +264 -0
- package/query-type/README.md +3 -0
- package/radio/README.md +3 -0
- package/repeat/README.md +3 -0
- package/select/README.md +3 -0
- package/sidebar-cards/README.md +3 -0
- package/sidebar-toggles/README.md +3 -0
- package/styles.css +2 -0
- package/tabs/README.md +3 -0
- package/tag-type/README.md +3 -0
- package/text-editor/README.md +3 -0
- package/textarea/README.md +3 -0
- package/types/es.framework-ng.ui.core-attachments.d.ts +38 -0
- package/types/es.framework-ng.ui.core-base-crud.d.ts +74 -0
- package/types/es.framework-ng.ui.core-breadcrumb.d.ts +17 -0
- package/types/es.framework-ng.ui.core-checkbox.d.ts +33 -0
- package/types/es.framework-ng.ui.core-collapsible.d.ts +18 -0
- package/types/es.framework-ng.ui.core-color-picker.d.ts +16 -0
- package/types/es.framework-ng.ui.core-column-settings-popover.d.ts +46 -0
- package/types/es.framework-ng.ui.core-custom-switch.d.ts +19 -0
- package/types/es.framework-ng.ui.core-datepicker.d.ts +23 -0
- package/types/es.framework-ng.ui.core-deactivation-reason.d.ts +32 -0
- package/types/es.framework-ng.ui.core-excel-import.d.ts +69 -0
- package/types/es.framework-ng.ui.core-filter-templates.d.ts +57 -0
- package/types/es.framework-ng.ui.core-form-button.d.ts +17 -0
- package/types/es.framework-ng.ui.core-form-field.d.ts +30 -0
- package/types/es.framework-ng.ui.core-form-template.d.ts +16 -0
- package/types/es.framework-ng.ui.core-formly-avatar-image.d.ts +18 -0
- package/types/es.framework-ng.ui.core-formly-avatar-label.d.ts +36 -0
- package/types/es.framework-ng.ui.core-formly-button-selector.d.ts +35 -0
- package/types/es.framework-ng.ui.core-formly-button.d.ts +20 -0
- package/types/es.framework-ng.ui.core-formly-presets.d.ts +37 -0
- package/types/es.framework-ng.ui.core-formly-prime-icon-picker.d.ts +45 -0
- package/types/es.framework-ng.ui.core-formly-split-button.d.ts +23 -0
- package/types/es.framework-ng.ui.core-formly-ui-all.d.ts +40 -0
- package/types/es.framework-ng.ui.core-formly-ui.d.ts +13 -0
- package/types/es.framework-ng.ui.core-formly-username-with-domain.d.ts +19 -0
- package/types/es.framework-ng.ui.core-generic-assets.d.ts +10 -0
- package/types/es.framework-ng.ui.core-generic-autocomplete.d.ts +41 -0
- package/types/es.framework-ng.ui.core-generic-button.d.ts +39 -0
- package/types/es.framework-ng.ui.core-generic-card.d.ts +93 -0
- package/types/es.framework-ng.ui.core-generic-crud-table.d.ts +293 -0
- package/types/es.framework-ng.ui.core-generic-dialog.d.ts +93 -0
- package/types/es.framework-ng.ui.core-generic-errormessage.d.ts +17 -0
- package/types/es.framework-ng.ui.core-generic-formly-fields.d.ts +26 -0
- package/types/es.framework-ng.ui.core-generic-loadingspinner.d.ts +16 -0
- package/types/es.framework-ng.ui.core-generic-report-tabs.d.ts +21 -0
- package/types/es.framework-ng.ui.core-generic-report.d.ts +121 -0
- package/types/es.framework-ng.ui.core-generic-search-advanced.d.ts +305 -0
- package/types/es.framework-ng.ui.core-generic-search.d.ts +36 -0
- package/types/es.framework-ng.ui.core-generic-selector.d.ts +99 -0
- package/types/es.framework-ng.ui.core-generic-table.d.ts +84 -0
- package/types/es.framework-ng.ui.core-generic-view.d.ts +97 -0
- package/types/es.framework-ng.ui.core-header-wrapper.d.ts +15 -0
- package/types/es.framework-ng.ui.core-icon-picker.d.ts +30 -0
- package/types/es.framework-ng.ui.core-input-switch.d.ts +16 -0
- package/types/es.framework-ng.ui.core-input-with-icon.d.ts +17 -0
- package/types/es.framework-ng.ui.core-input.d.ts +47 -0
- package/types/es.framework-ng.ui.core-label-type.d.ts +38 -0
- package/types/es.framework-ng.ui.core-loading-skeletons.d.ts +17 -0
- package/types/es.framework-ng.ui.core-odata-query-builder.d.ts +87 -0
- package/types/es.framework-ng.ui.core-query-type.d.ts +37 -0
- package/types/es.framework-ng.ui.core-radio.d.ts +38 -0
- package/types/es.framework-ng.ui.core-repeat.d.ts +31 -0
- package/types/es.framework-ng.ui.core-select.d.ts +42 -0
- package/types/es.framework-ng.ui.core-sidebar-cards.d.ts +25 -0
- package/types/es.framework-ng.ui.core-sidebar-toggles.d.ts +25 -0
- package/types/es.framework-ng.ui.core-tabs.d.ts +17 -0
- package/types/es.framework-ng.ui.core-tag-type.d.ts +34 -0
- package/types/es.framework-ng.ui.core-text-editor.d.ts +16 -0
- package/types/es.framework-ng.ui.core-textarea.d.ts +36 -0
- package/types/es.framework-ng.ui.core-wrappers.d.ts +36 -0
- package/types/es.framework-ng.ui.core.d.ts +8 -0
- package/wrappers/README.md +3 -0
|
@@ -0,0 +1,465 @@
|
|
|
1
|
+
import * as i7 from 'primeng/tooltip';
|
|
2
|
+
import { TooltipModule } from 'primeng/tooltip';
|
|
3
|
+
import * as i0 from '@angular/core';
|
|
4
|
+
import { inject, EventEmitter, Input, ViewChild, Output, Component, NgModule } from '@angular/core';
|
|
5
|
+
import * as i1 from '@angular/common';
|
|
6
|
+
import { Location, CommonModule } from '@angular/common';
|
|
7
|
+
import * as i2 from 'primeng/toolbar';
|
|
8
|
+
import { ToolbarModule } from 'primeng/toolbar';
|
|
9
|
+
import * as i4 from 'primeng/button';
|
|
10
|
+
import { ButtonModule } from 'primeng/button';
|
|
11
|
+
import { FormlyForm } from '@ngx-formly/core';
|
|
12
|
+
import * as i6 from '@angular/forms';
|
|
13
|
+
import { UntypedFormGroup, FormGroup, FormsModule, ReactiveFormsModule } from '@angular/forms';
|
|
14
|
+
import * as i5 from 'primeng/tabs';
|
|
15
|
+
import { TabsModule } from 'primeng/tabs';
|
|
16
|
+
import { TranslatePipe } from '@es.framework/ng.core/pipes';
|
|
17
|
+
import { BreadcrumbComponent } from '@es.framework/ng.ui.core/breadcrumb';
|
|
18
|
+
import { BaseService, SwalService } from '@es.framework/ng.core/services';
|
|
19
|
+
import { ActivatedRoute, Router } from '@angular/router';
|
|
20
|
+
import * as i8 from 'primeng/progressspinner';
|
|
21
|
+
import { ProgressSpinnerModule } from 'primeng/progressspinner';
|
|
22
|
+
import { GenericDialogComponent } from '@es.framework/ng.ui.core/generic-dialog';
|
|
23
|
+
import { GenericButton } from '@es.framework/ng.ui.core/generic-button';
|
|
24
|
+
import * as i3 from 'primeng/api';
|
|
25
|
+
|
|
26
|
+
class GenericViewComponent {
|
|
27
|
+
route = inject(ActivatedRoute);
|
|
28
|
+
router = inject(Router);
|
|
29
|
+
form = new UntypedFormGroup({});
|
|
30
|
+
title = '';
|
|
31
|
+
actions = [];
|
|
32
|
+
createEditActions = [];
|
|
33
|
+
actions_ = [];
|
|
34
|
+
tabs = [];
|
|
35
|
+
viewMode = true;
|
|
36
|
+
breadcrumb;
|
|
37
|
+
service = inject(BaseService);
|
|
38
|
+
formFields = [];
|
|
39
|
+
apiName = '';
|
|
40
|
+
moduleName = '';
|
|
41
|
+
idField = 'id';
|
|
42
|
+
standaloneMode = false;
|
|
43
|
+
isViewMode = true; // وضع المشاهدة فقط
|
|
44
|
+
isCreateMode = false; // وضع الاضافة فقط
|
|
45
|
+
isEditMode = false; // وضع التعديل
|
|
46
|
+
model = {};
|
|
47
|
+
displayMode = 'drawer';
|
|
48
|
+
mode = 'full';
|
|
49
|
+
action = new EventEmitter();
|
|
50
|
+
afterDelete = new EventEmitter();
|
|
51
|
+
dialog;
|
|
52
|
+
inlineForm;
|
|
53
|
+
tabs_ = [];
|
|
54
|
+
model_ = {};
|
|
55
|
+
currentId;
|
|
56
|
+
list = [];
|
|
57
|
+
totalRecords = 0;
|
|
58
|
+
loading = false;
|
|
59
|
+
// pagination state
|
|
60
|
+
pageSize = 10;
|
|
61
|
+
pageIndex = 0;
|
|
62
|
+
sort = '';
|
|
63
|
+
currentFilters = {};
|
|
64
|
+
pageFilters = {};
|
|
65
|
+
searchGlobal = '';
|
|
66
|
+
swalService = inject(SwalService);
|
|
67
|
+
_location = inject(Location);
|
|
68
|
+
ngOnInit() {
|
|
69
|
+
this.loading = true;
|
|
70
|
+
if (this.apiName) {
|
|
71
|
+
this.service.apiName = this.apiName;
|
|
72
|
+
this.service.moduleName = this.moduleName;
|
|
73
|
+
}
|
|
74
|
+
this.actions_ = this.actions.filter(c => c.name != 'view');
|
|
75
|
+
this.route.paramMap.subscribe(params => {
|
|
76
|
+
const id = params.get(this.idField);
|
|
77
|
+
if (id) {
|
|
78
|
+
this.currentId = id;
|
|
79
|
+
if (this.standaloneMode) {
|
|
80
|
+
this.loadList();
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
this.refresh();
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
refresh() {
|
|
87
|
+
// detect mode based on route
|
|
88
|
+
const url = this.router.url.toLowerCase();
|
|
89
|
+
this.isViewMode = url.includes('/view');
|
|
90
|
+
this.isEditMode = url.includes('/edit');
|
|
91
|
+
this.isCreateMode = url.includes('/create') || url.endsWith('/new') || url.endsWith('/add');
|
|
92
|
+
this.tabs_ = [];
|
|
93
|
+
for (let i = 0; i < this.tabs.length; i++) {
|
|
94
|
+
const t = this.tabs[i];
|
|
95
|
+
this.tabs_.push({
|
|
96
|
+
...t,
|
|
97
|
+
fields: [
|
|
98
|
+
{
|
|
99
|
+
props: { label: '' },
|
|
100
|
+
// fieldGroupClassName: 'grid grid-cols-1 md:grid-cols-2 gap-3', // TODO
|
|
101
|
+
fieldGroupClassName: '',
|
|
102
|
+
fieldGroup: this.isCreateMode || this.isEditMode
|
|
103
|
+
? this.getCreateEditFields(i == 0 ? this.formFields : t.fields)
|
|
104
|
+
: this.getViewFields(i == 0 ? this.formFields : t.fields),
|
|
105
|
+
},
|
|
106
|
+
],
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
this.loading = false;
|
|
110
|
+
}
|
|
111
|
+
// as form
|
|
112
|
+
getCreateEditFields(fields = []) {
|
|
113
|
+
return fields.map(f => ({
|
|
114
|
+
...f,
|
|
115
|
+
props: { ...f.props, readonly: this.viewMode, disabled: this.viewMode },
|
|
116
|
+
}));
|
|
117
|
+
}
|
|
118
|
+
getViewFields(fields = []) {
|
|
119
|
+
const flatten = (fields) => fields.flatMap((field) => {
|
|
120
|
+
/* 1. GROUP / PANEL / WRAPPER */
|
|
121
|
+
if (field.fieldGroup?.length) {
|
|
122
|
+
const children = flatten(field.fieldGroup);
|
|
123
|
+
if (!children.length)
|
|
124
|
+
return [];
|
|
125
|
+
return [{
|
|
126
|
+
...field,
|
|
127
|
+
wrappers: field.wrappers,
|
|
128
|
+
props: { ...field.props },
|
|
129
|
+
fieldGroupClassName: field.fieldGroupClassName,
|
|
130
|
+
fieldGroup: children
|
|
131
|
+
}];
|
|
132
|
+
}
|
|
133
|
+
/* 2. FIELD ARRAY (REPEAT / TABLE / MULTI) */
|
|
134
|
+
const fieldArrayConfig = typeof field.fieldArray === 'function'
|
|
135
|
+
? field.fieldArray(field)
|
|
136
|
+
: field.fieldArray;
|
|
137
|
+
if (field.fieldArray) {
|
|
138
|
+
if (field.props?.['view']?.hidden)
|
|
139
|
+
return [];
|
|
140
|
+
const children = flatten(fieldArrayConfig?.fieldGroup || []);
|
|
141
|
+
if (!children.length)
|
|
142
|
+
return [];
|
|
143
|
+
return [{
|
|
144
|
+
...field,
|
|
145
|
+
type: field.props?.['view']?.type || field.type,
|
|
146
|
+
readonly: this.viewMode,
|
|
147
|
+
disabled: this.viewMode,
|
|
148
|
+
fieldArray: {
|
|
149
|
+
...fieldArrayConfig,
|
|
150
|
+
fieldGroup: children
|
|
151
|
+
}
|
|
152
|
+
}];
|
|
153
|
+
}
|
|
154
|
+
/* 3. SINGLE FIELD */
|
|
155
|
+
if (!field.props || field.props['view']?.hidden)
|
|
156
|
+
return [];
|
|
157
|
+
const type = field.props['view']?.type ||
|
|
158
|
+
field.props['table']?.type ||
|
|
159
|
+
field.props['filter']?.type ||
|
|
160
|
+
'custom-label-type';
|
|
161
|
+
return [{
|
|
162
|
+
type,
|
|
163
|
+
key: field.key,
|
|
164
|
+
readonly: this.viewMode,
|
|
165
|
+
disabled: this.viewMode,
|
|
166
|
+
wrappers: field.wrappers ?? ['field-wrapper'],
|
|
167
|
+
className: field.className,
|
|
168
|
+
props: {
|
|
169
|
+
...field.props,
|
|
170
|
+
...(field.props['view']?.props ||
|
|
171
|
+
field.props['table']?.props ||
|
|
172
|
+
field.props['filter']?.props ||
|
|
173
|
+
{}),
|
|
174
|
+
},
|
|
175
|
+
expressions: field.props['view']?.expressions ||
|
|
176
|
+
field.props['table']?.expressions ||
|
|
177
|
+
field.props['filter']?.expressions
|
|
178
|
+
}];
|
|
179
|
+
});
|
|
180
|
+
return flatten(fields);
|
|
181
|
+
}
|
|
182
|
+
// getViewFields(fields: FormlyFieldConfig[] = []): FormlyFieldConfig[] {
|
|
183
|
+
// const flatten = (fields: FormlyFieldConfig[]): FormlyFieldConfig[] =>
|
|
184
|
+
// fields.flatMap(field => {
|
|
185
|
+
// if (field.fieldGroup?.length) return flatten(field.fieldGroup);
|
|
186
|
+
// if (!field.props
|
|
187
|
+
// || field.props['view']?.hidden
|
|
188
|
+
// // || field.props['table']?.hidden
|
|
189
|
+
// ) return [];
|
|
190
|
+
// const type = field.props['view']?.type || field.props['table']?.type || 'custom-label-type';
|
|
191
|
+
// return [{
|
|
192
|
+
// type,
|
|
193
|
+
// key: field['key'],
|
|
194
|
+
// readonly: this.viewMode,
|
|
195
|
+
// disabled: this.viewMode,
|
|
196
|
+
// wrappers: field.wrappers ?? ['field-wrapper'],
|
|
197
|
+
// props: {
|
|
198
|
+
// ...field.props,
|
|
199
|
+
// ...(field.props['view']?.props || field.props['table']?.props),
|
|
200
|
+
// },
|
|
201
|
+
// expressions: field.props['view']?.expressions || field.props['view']?.expressions,
|
|
202
|
+
// }];
|
|
203
|
+
// });
|
|
204
|
+
// return flatten(fields);
|
|
205
|
+
// }
|
|
206
|
+
// Use a map to store form groups for each row and column
|
|
207
|
+
cellForms = new Map();
|
|
208
|
+
getForm(rowIndex) {
|
|
209
|
+
const key = `${rowIndex}_`;
|
|
210
|
+
let form = this.cellForms.get(key);
|
|
211
|
+
if (!form) {
|
|
212
|
+
form = new FormGroup({});
|
|
213
|
+
this.cellForms.set(key, form);
|
|
214
|
+
}
|
|
215
|
+
return form;
|
|
216
|
+
}
|
|
217
|
+
async handleCreateEditAction(btn) {
|
|
218
|
+
try {
|
|
219
|
+
if (btn.action) {
|
|
220
|
+
// Execute the provided action
|
|
221
|
+
await btn.action(null); // You can pass row or context here
|
|
222
|
+
}
|
|
223
|
+
else {
|
|
224
|
+
// Fallback to emitting event
|
|
225
|
+
if (btn.actionName == 'cancel') {
|
|
226
|
+
this.back();
|
|
227
|
+
}
|
|
228
|
+
else {
|
|
229
|
+
this.action.emit({
|
|
230
|
+
name: btn.actionName ?? 'cancel',
|
|
231
|
+
row: null, // provide row if available
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
catch (err) {
|
|
237
|
+
console.error('Button action error', err);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
onAction(act, model) {
|
|
241
|
+
if (act.action) {
|
|
242
|
+
act.action(model);
|
|
243
|
+
}
|
|
244
|
+
else {
|
|
245
|
+
// this.action.emit({ name: act.name, row:model });
|
|
246
|
+
this.emitAction({ name: act.name, row: model });
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
emitAction(event) {
|
|
250
|
+
switch (event.name) {
|
|
251
|
+
case 'edit':
|
|
252
|
+
this.dialog.openForm("edit", event.row);
|
|
253
|
+
break;
|
|
254
|
+
case 'delete':
|
|
255
|
+
this.onDelete(event.row);
|
|
256
|
+
break;
|
|
257
|
+
default:
|
|
258
|
+
this.action.emit(event);
|
|
259
|
+
break;
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
onDelete(item) {
|
|
263
|
+
const id = item[this.idField];
|
|
264
|
+
this.swalService.confirm('تأكيد الحذف', 'هل تريد حذف هذا السجل فعلاً؟', 'نعم، احذف', 'إلغاء').then((result) => {
|
|
265
|
+
if (result.isConfirmed) {
|
|
266
|
+
this.service.delete(id).subscribe({
|
|
267
|
+
next: () => {
|
|
268
|
+
this.swalService.success('تم الحذف بنجاح');
|
|
269
|
+
this.back();
|
|
270
|
+
},
|
|
271
|
+
error: (err) => {
|
|
272
|
+
this.loading = false;
|
|
273
|
+
}
|
|
274
|
+
});
|
|
275
|
+
}
|
|
276
|
+
});
|
|
277
|
+
}
|
|
278
|
+
afterSave(event) {
|
|
279
|
+
this.model = event.response;
|
|
280
|
+
// set the id from backend response
|
|
281
|
+
this.currentId = event.response[this.idField];
|
|
282
|
+
if (this.isCreateMode) {
|
|
283
|
+
this.goToMode('view');
|
|
284
|
+
}
|
|
285
|
+
else if (this.isEditMode) {
|
|
286
|
+
this.goToMode('view');
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
goToMode(mode) {
|
|
290
|
+
const tree = this.router.parseUrl(this.router.url);
|
|
291
|
+
const segments = tree.root.children['primary']?.segments.map(s => s.path) ?? [];
|
|
292
|
+
let newSegments;
|
|
293
|
+
if (mode === 'create') {
|
|
294
|
+
// always navigate to "add"
|
|
295
|
+
newSegments = [
|
|
296
|
+
...segments.filter(s => !['view', 'edit', 'add'].includes(s)),
|
|
297
|
+
'add',
|
|
298
|
+
];
|
|
299
|
+
}
|
|
300
|
+
else {
|
|
301
|
+
// if in "add" mode, replace it with the new id
|
|
302
|
+
if (segments.includes('add')) {
|
|
303
|
+
newSegments = [
|
|
304
|
+
...segments.filter(s => s !== 'add'),
|
|
305
|
+
String(this.currentId),
|
|
306
|
+
mode,
|
|
307
|
+
];
|
|
308
|
+
}
|
|
309
|
+
else {
|
|
310
|
+
const idIndex = segments.findIndex(s => s === String(this.currentId));
|
|
311
|
+
if (idIndex === -1) {
|
|
312
|
+
newSegments = [...segments, String(this.currentId), mode];
|
|
313
|
+
}
|
|
314
|
+
else {
|
|
315
|
+
newSegments = segments.slice(0, idIndex + 1);
|
|
316
|
+
newSegments.push(mode);
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
this.router.navigate(newSegments);
|
|
321
|
+
this.refresh();
|
|
322
|
+
}
|
|
323
|
+
backToList() {
|
|
324
|
+
this.router.navigate(['../']);
|
|
325
|
+
}
|
|
326
|
+
back() {
|
|
327
|
+
// this.router.navigate(['..']);
|
|
328
|
+
this._location.back();
|
|
329
|
+
}
|
|
330
|
+
loadList() {
|
|
331
|
+
this.loading = true;
|
|
332
|
+
const filters = {
|
|
333
|
+
maxResultCount: this.pageSize,
|
|
334
|
+
skipCount: this.pageIndex * this.pageSize,
|
|
335
|
+
sorting: this.sort,
|
|
336
|
+
...this.currentFilters,
|
|
337
|
+
...this.pageFilters,
|
|
338
|
+
...(this.searchGlobal ? { filter: this.searchGlobal } : {}),
|
|
339
|
+
};
|
|
340
|
+
this.service.getList(filters).subscribe({
|
|
341
|
+
next: (res) => {
|
|
342
|
+
this.list = res.items;
|
|
343
|
+
this.totalRecords = res.totalCount;
|
|
344
|
+
this.loading = false;
|
|
345
|
+
// set model_ to current id item
|
|
346
|
+
const found = this.list.find(x => x[this.idField] == this.currentId);
|
|
347
|
+
if (found) {
|
|
348
|
+
this.model_ = found;
|
|
349
|
+
}
|
|
350
|
+
},
|
|
351
|
+
error: err => {
|
|
352
|
+
console.error('Error loading list', err);
|
|
353
|
+
this.loading = false;
|
|
354
|
+
}
|
|
355
|
+
});
|
|
356
|
+
}
|
|
357
|
+
next() {
|
|
358
|
+
if (!this.currentId)
|
|
359
|
+
return;
|
|
360
|
+
// increment currentId numerically
|
|
361
|
+
// const newId = Number(this.currentId) + 1;
|
|
362
|
+
// this.currentId = newId;
|
|
363
|
+
// use goToMode to navigate and keep mode
|
|
364
|
+
const currentMode = this.isEditMode ? 'edit' : 'view';
|
|
365
|
+
// this.goToMode(currentMode);
|
|
366
|
+
}
|
|
367
|
+
previous() {
|
|
368
|
+
if (!this.currentId)
|
|
369
|
+
return;
|
|
370
|
+
// decrement currentId numerically
|
|
371
|
+
// const newId = Number(this.currentId) - 1;
|
|
372
|
+
// if (newId <= 0) return;
|
|
373
|
+
// this.currentId = newId;
|
|
374
|
+
// use goToMode to navigate and keep mode
|
|
375
|
+
const currentMode = this.isEditMode ? 'edit' : 'view';
|
|
376
|
+
// this.goToMode(currentMode);
|
|
377
|
+
}
|
|
378
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: GenericViewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
379
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.3", type: GenericViewComponent, isStandalone: true, selector: "app-detail-view", inputs: { title: "title", actions: "actions", createEditActions: "createEditActions", tabs: "tabs", viewMode: "viewMode", breadcrumb: "breadcrumb", service: "service", formFields: "formFields", apiName: "apiName", moduleName: "moduleName", idField: "idField", standaloneMode: "standaloneMode", isViewMode: "isViewMode", isCreateMode: "isCreateMode", isEditMode: "isEditMode", model: "model", displayMode: "displayMode", mode: "mode", loading: "loading" }, outputs: { action: "action", afterDelete: "afterDelete" }, viewQueries: [{ propertyName: "dialog", first: true, predicate: ["dialog"], descendants: true }, { propertyName: "inlineForm", first: true, predicate: ["inlineForm"], descendants: true }], ngImport: i0, template: "\n@if (mode === 'detail') {\n <div class=\"w-full flex flex-col gap-3\">\n <!-- overlay -->\n @if (loading) {\n <div\n class=\"absolute inset-0 bg-white/70 flex items-center justify-center z-50\">\n <p-progress-spinner/>\n </div>\n }\n\n <!-- actual content -->\n <!-- Toolbar -->\n <p-toolbar style=\"background: transparent;border: 0px;box-shadow: none;\" class=\"bg-transparent shadow-none border-none rounded-md px-3\">\n <ng-template pTemplate=\"left\">\n <!-- <span class=\"font-semibold text-lg xs:hidden block\">{{ title }}</span> -->\n <app-breadcrumb class=\"xs:block\" [breadcrumb]=\"breadcrumb\"></app-breadcrumb> <!-- xs:block hidden -->\n </ng-template>\n <ng-template pTemplate=\"right\">\n <div class=\"flex gap-2\">\n\n <button\n pButton pRipple\n icon=\"pi pi-chevron-right\"\n class=\"p-button-text p-button-sm fd-btn\"\n pTooltip=\"\u0627\u0644\u062A\u0627\u0644\u064A\"\n (click)=\"next()\"\n ></button>\n <button\n pButton pRipple\n icon=\"pi pi-chevron-left\"\n class=\"p-button-text p-button-sm fd-btn\"\n pTooltip=\"\u0627\u0644\u0633\u0627\u0628\u0642\"\n (click)=\"previous()\"\n ></button>\n </div>\n </ng-template>\n </p-toolbar>\n <p-toolbar class=\"bg-white shadow rounded-md px-3\">\n\n <ng-template pTemplate=\"left\">\n @if (isViewMode) {\n <div class=\"flex gap-1\">\n @for (action of actions_; track $index) {\n <button\n pButton pRipple\n [icon]=\"action.icon ?? ''\"\n [label]=\"(action.label ?? '') | translate\"\n class=\"fd-btn\"\n (click)=\"onAction(action,model)\"\n ></button>\n }\n </div>\n }\n </ng-template>\n <ng-template pTemplate=\"right\">\n @if (isEditMode || isCreateMode) {\n <div class=\"flex gap-1\">\n @for (btn of createEditActions; track $index) {\n @if (!btn.visible || (btn.visible && btn.visible === true)) {\n @if (btn.type === 'submit' && inlineForm) {\n <lib-generic-button\n [type]=\"'submit'\"\n [loading]=\"inlineForm.loading\"\n [disabled]=\"inlineForm.loading || form.invalid\"\n [icon]=\"btn.icon\"\n [label]=\"btn.label | translate\"\n [variant]=\"btn.variant\"\n [severity]=\"btn.severity\"\n [size]=\"btn.size\"\n [model]=\"btn.splitActions\"\n [permission]=\"btn.permission\"\n (clicked)=\"inlineForm.onSubmit()\"\n ></lib-generic-button>\n }\n @else{\n <lib-generic-button\n [icon]=\"btn.icon\"\n [label]=\"btn.label | translate\"\n [variant]=\"btn.variant\"\n [severity]=\"btn.severity\"\n [size]=\"btn.size\"\n [model]=\"btn.splitActions\"\n [permission]=\"btn.permission\"\n (clicked)=\"handleCreateEditAction(btn)\"\n ></lib-generic-button>\n }\n }\n }\n </div>\n }\n </ng-template>\n\n </p-toolbar>\n\n <!-- Tabs -->\n <p-tabs value=\"0\">\n <p-tablist>\n @for (tab of tabs_; track $index) {\n <p-tab value=\"{{$index}}\">\n <i [class]=\"tab.icon\"></i>\n <span class=\"mr-1 ml-1\">{{ tab.header }}</span>\n </p-tab>\n }\n </p-tablist>\n <p-tabpanels>\n @for (tab of tabs_; track $index) {\n <p-tabpanel value=\"{{$index}}\">\n\n <!-- Formly fields -->\n <!-- border border-surface p-4-->\n <div class=\"\">\n @if (tab.fields.length && $index === 0) {\n\n @if (form) {\n <form [formGroup]=\"form\">\n @if (tab.fields.length && $index === 0 ) {\n @if (isEditMode || isCreateMode) {\n <app-generic-dialog\n #inlineForm\n [form]=\"form\"\n [model]=\"model\"\n [formFields]=\"formFields ?? []\"\n [apiName]=\"apiName\"\n [moduleName]=\"moduleName\"\n [idField]=\"idField ??'id'\"\n [displayMode]=\"'inline'\"\n [mode]=\"'form-only'\"\n [forceState]=\"isCreateMode ? 'create':'edit'\"\n (afterSave)=\"afterSave($event)\"\n >\n </app-generic-dialog>\n }\n @else if(isViewMode){\n <formly-form\n [form]=\"form\"\n [fields]=\"tab.fields\"\n [model]=\"model\"\n ></formly-form>\n }\n }\n </form>\n }\n\n }\n @if (tab.fields.length && $index > 0) {\n\n\n <formly-form\n [form]=\"getForm($index)\"\n [fields]=\"tab.fields\"\n [model]=\"tab.model || model\"\n ></formly-form>\n\n }\n\n <!-- Custom template -->\n @if (tab.content) {\n <ng-container\n *ngTemplateOutlet=\"tab.content; context: { model: model }\">\n </ng-container>\n }\n </div>\n </p-tabpanel>\n }\n </p-tabpanels>\n</p-tabs>\n</div>\n\n<!-- [model]=\"model\" -->\n<app-generic-dialog\n #dialog\n [formFields]=\"formFields ?? []\"\n [apiName]=\"apiName\"\n [moduleName]=\"moduleName\"\n [idField]=\"idField ??'id'\"\n [displayMode]=\"displayMode ?? 'dialog'\"\n (afterSave)=\"afterSave($event)\"\n >\n</app-generic-dialog>\n}\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: ToolbarModule }, { kind: "component", type: i2.Toolbar, selector: "p-toolbar", inputs: ["styleClass", "ariaLabelledBy"] }, { kind: "directive", type: i3.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "directive", type: i4.ButtonDirective, selector: "[pButton]", inputs: ["ptButtonDirective", "hostName", "text", "plain", "raised", "size", "outlined", "rounded", "iconPos", "loadingIcon", "fluid", "label", "icon", "loading", "buttonProps", "severity"] }, { kind: "ngmodule", type: TabsModule }, { kind: "component", type: i5.Tabs, selector: "p-tabs", inputs: ["value", "scrollable", "lazy", "selectOnFocus", "showNavigators", "tabindex"], outputs: ["valueChange"] }, { kind: "component", type: i5.TabPanels, selector: "p-tabpanels" }, { kind: "component", type: i5.TabPanel, selector: "p-tabpanel", inputs: ["lazy", "value"], outputs: ["valueChange"] }, { kind: "component", type: i5.TabList, selector: "p-tablist" }, { kind: "component", type: i5.Tab, selector: "p-tab", inputs: ["value", "disabled"], outputs: ["valueChange"] }, { kind: "component", type: FormlyForm, selector: "formly-form", inputs: ["form", "model", "fields", "options"], outputs: ["modelChange"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i6.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i6.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i6.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: BreadcrumbComponent, selector: "app-breadcrumb", inputs: ["breadcrumb"] }, { kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: i7.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions", "appendTo", "ptTooltip"] }, { kind: "component", type: GenericDialogComponent, selector: "app-generic-dialog", inputs: ["form", "service", "formFields", "model", "apiName", "moduleName", "idField", "dialogMaxWidth", "displayMode", "mode", "forceState", "drawerVisible", "dialogVisible", "isViewMode", "isEditMode", "useConfirmOnSave", "loading", "errorMsg", "errorMessage", "beforeSaveTransform", "hideTable", "autoShowForm"], outputs: ["action", "afterSave", "afterDelete", "beforeSave", "beforeDelete", "formCancel", "formInit", "dataLoaded", "selectionChange", "error", "visibleChange"] }, { kind: "component", type: GenericButton, selector: "lib-generic-button", inputs: ["model", "type", "icon", "label", "variant", "severity", "size", "iconPosition", "disabled", "loading", "ariaLabel", "extraClasses", "permission"], outputs: ["clicked", "itemClick"] }, { kind: "ngmodule", type: ProgressSpinnerModule }, { kind: "component", type: i8.ProgressSpinner, selector: "p-progressSpinner, p-progress-spinner, p-progressspinner", inputs: ["styleClass", "strokeWidth", "fill", "animationDuration", "ariaLabel"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }] });
|
|
380
|
+
}
|
|
381
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: GenericViewComponent, decorators: [{
|
|
382
|
+
type: Component,
|
|
383
|
+
args: [{ selector: 'app-detail-view', standalone: true, imports: [
|
|
384
|
+
CommonModule,
|
|
385
|
+
ToolbarModule,
|
|
386
|
+
ButtonModule,
|
|
387
|
+
TabsModule,
|
|
388
|
+
FormlyForm,
|
|
389
|
+
FormsModule,
|
|
390
|
+
ReactiveFormsModule,
|
|
391
|
+
TranslatePipe,
|
|
392
|
+
BreadcrumbComponent,
|
|
393
|
+
TooltipModule,
|
|
394
|
+
GenericDialogComponent,
|
|
395
|
+
GenericButton,
|
|
396
|
+
ProgressSpinnerModule
|
|
397
|
+
], template: "\n@if (mode === 'detail') {\n <div class=\"w-full flex flex-col gap-3\">\n <!-- overlay -->\n @if (loading) {\n <div\n class=\"absolute inset-0 bg-white/70 flex items-center justify-center z-50\">\n <p-progress-spinner/>\n </div>\n }\n\n <!-- actual content -->\n <!-- Toolbar -->\n <p-toolbar style=\"background: transparent;border: 0px;box-shadow: none;\" class=\"bg-transparent shadow-none border-none rounded-md px-3\">\n <ng-template pTemplate=\"left\">\n <!-- <span class=\"font-semibold text-lg xs:hidden block\">{{ title }}</span> -->\n <app-breadcrumb class=\"xs:block\" [breadcrumb]=\"breadcrumb\"></app-breadcrumb> <!-- xs:block hidden -->\n </ng-template>\n <ng-template pTemplate=\"right\">\n <div class=\"flex gap-2\">\n\n <button\n pButton pRipple\n icon=\"pi pi-chevron-right\"\n class=\"p-button-text p-button-sm fd-btn\"\n pTooltip=\"\u0627\u0644\u062A\u0627\u0644\u064A\"\n (click)=\"next()\"\n ></button>\n <button\n pButton pRipple\n icon=\"pi pi-chevron-left\"\n class=\"p-button-text p-button-sm fd-btn\"\n pTooltip=\"\u0627\u0644\u0633\u0627\u0628\u0642\"\n (click)=\"previous()\"\n ></button>\n </div>\n </ng-template>\n </p-toolbar>\n <p-toolbar class=\"bg-white shadow rounded-md px-3\">\n\n <ng-template pTemplate=\"left\">\n @if (isViewMode) {\n <div class=\"flex gap-1\">\n @for (action of actions_; track $index) {\n <button\n pButton pRipple\n [icon]=\"action.icon ?? ''\"\n [label]=\"(action.label ?? '') | translate\"\n class=\"fd-btn\"\n (click)=\"onAction(action,model)\"\n ></button>\n }\n </div>\n }\n </ng-template>\n <ng-template pTemplate=\"right\">\n @if (isEditMode || isCreateMode) {\n <div class=\"flex gap-1\">\n @for (btn of createEditActions; track $index) {\n @if (!btn.visible || (btn.visible && btn.visible === true)) {\n @if (btn.type === 'submit' && inlineForm) {\n <lib-generic-button\n [type]=\"'submit'\"\n [loading]=\"inlineForm.loading\"\n [disabled]=\"inlineForm.loading || form.invalid\"\n [icon]=\"btn.icon\"\n [label]=\"btn.label | translate\"\n [variant]=\"btn.variant\"\n [severity]=\"btn.severity\"\n [size]=\"btn.size\"\n [model]=\"btn.splitActions\"\n [permission]=\"btn.permission\"\n (clicked)=\"inlineForm.onSubmit()\"\n ></lib-generic-button>\n }\n @else{\n <lib-generic-button\n [icon]=\"btn.icon\"\n [label]=\"btn.label | translate\"\n [variant]=\"btn.variant\"\n [severity]=\"btn.severity\"\n [size]=\"btn.size\"\n [model]=\"btn.splitActions\"\n [permission]=\"btn.permission\"\n (clicked)=\"handleCreateEditAction(btn)\"\n ></lib-generic-button>\n }\n }\n }\n </div>\n }\n </ng-template>\n\n </p-toolbar>\n\n <!-- Tabs -->\n <p-tabs value=\"0\">\n <p-tablist>\n @for (tab of tabs_; track $index) {\n <p-tab value=\"{{$index}}\">\n <i [class]=\"tab.icon\"></i>\n <span class=\"mr-1 ml-1\">{{ tab.header }}</span>\n </p-tab>\n }\n </p-tablist>\n <p-tabpanels>\n @for (tab of tabs_; track $index) {\n <p-tabpanel value=\"{{$index}}\">\n\n <!-- Formly fields -->\n <!-- border border-surface p-4-->\n <div class=\"\">\n @if (tab.fields.length && $index === 0) {\n\n @if (form) {\n <form [formGroup]=\"form\">\n @if (tab.fields.length && $index === 0 ) {\n @if (isEditMode || isCreateMode) {\n <app-generic-dialog\n #inlineForm\n [form]=\"form\"\n [model]=\"model\"\n [formFields]=\"formFields ?? []\"\n [apiName]=\"apiName\"\n [moduleName]=\"moduleName\"\n [idField]=\"idField ??'id'\"\n [displayMode]=\"'inline'\"\n [mode]=\"'form-only'\"\n [forceState]=\"isCreateMode ? 'create':'edit'\"\n (afterSave)=\"afterSave($event)\"\n >\n </app-generic-dialog>\n }\n @else if(isViewMode){\n <formly-form\n [form]=\"form\"\n [fields]=\"tab.fields\"\n [model]=\"model\"\n ></formly-form>\n }\n }\n </form>\n }\n\n }\n @if (tab.fields.length && $index > 0) {\n\n\n <formly-form\n [form]=\"getForm($index)\"\n [fields]=\"tab.fields\"\n [model]=\"tab.model || model\"\n ></formly-form>\n\n }\n\n <!-- Custom template -->\n @if (tab.content) {\n <ng-container\n *ngTemplateOutlet=\"tab.content; context: { model: model }\">\n </ng-container>\n }\n </div>\n </p-tabpanel>\n }\n </p-tabpanels>\n</p-tabs>\n</div>\n\n<!-- [model]=\"model\" -->\n<app-generic-dialog\n #dialog\n [formFields]=\"formFields ?? []\"\n [apiName]=\"apiName\"\n [moduleName]=\"moduleName\"\n [idField]=\"idField ??'id'\"\n [displayMode]=\"displayMode ?? 'dialog'\"\n (afterSave)=\"afterSave($event)\"\n >\n</app-generic-dialog>\n}\n" }]
|
|
398
|
+
}], propDecorators: { title: [{
|
|
399
|
+
type: Input
|
|
400
|
+
}], actions: [{
|
|
401
|
+
type: Input
|
|
402
|
+
}], createEditActions: [{
|
|
403
|
+
type: Input
|
|
404
|
+
}], tabs: [{
|
|
405
|
+
type: Input
|
|
406
|
+
}], viewMode: [{
|
|
407
|
+
type: Input
|
|
408
|
+
}], breadcrumb: [{
|
|
409
|
+
type: Input
|
|
410
|
+
}], service: [{
|
|
411
|
+
type: Input
|
|
412
|
+
}], formFields: [{
|
|
413
|
+
type: Input
|
|
414
|
+
}], apiName: [{
|
|
415
|
+
type: Input
|
|
416
|
+
}], moduleName: [{
|
|
417
|
+
type: Input
|
|
418
|
+
}], idField: [{
|
|
419
|
+
type: Input
|
|
420
|
+
}], standaloneMode: [{
|
|
421
|
+
type: Input
|
|
422
|
+
}], isViewMode: [{
|
|
423
|
+
type: Input
|
|
424
|
+
}], isCreateMode: [{
|
|
425
|
+
type: Input
|
|
426
|
+
}], isEditMode: [{
|
|
427
|
+
type: Input
|
|
428
|
+
}], model: [{
|
|
429
|
+
type: Input
|
|
430
|
+
}], displayMode: [{
|
|
431
|
+
type: Input
|
|
432
|
+
}], mode: [{
|
|
433
|
+
type: Input
|
|
434
|
+
}], action: [{
|
|
435
|
+
type: Output
|
|
436
|
+
}], afterDelete: [{
|
|
437
|
+
type: Output
|
|
438
|
+
}], dialog: [{
|
|
439
|
+
type: ViewChild,
|
|
440
|
+
args: ['dialog']
|
|
441
|
+
}], inlineForm: [{
|
|
442
|
+
type: ViewChild,
|
|
443
|
+
args: ['inlineForm']
|
|
444
|
+
}], loading: [{
|
|
445
|
+
type: Input
|
|
446
|
+
}] } });
|
|
447
|
+
|
|
448
|
+
class GenericViewModule {
|
|
449
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: GenericViewModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
450
|
+
static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "21.1.3", ngImport: i0, type: GenericViewModule, imports: [CommonModule] });
|
|
451
|
+
static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: GenericViewModule, imports: [CommonModule] });
|
|
452
|
+
}
|
|
453
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: GenericViewModule, decorators: [{
|
|
454
|
+
type: NgModule,
|
|
455
|
+
args: [{
|
|
456
|
+
imports: [CommonModule],
|
|
457
|
+
}]
|
|
458
|
+
}] });
|
|
459
|
+
|
|
460
|
+
/**
|
|
461
|
+
* Generated bundle index. Do not edit.
|
|
462
|
+
*/
|
|
463
|
+
|
|
464
|
+
export { GenericViewComponent, GenericViewModule };
|
|
465
|
+
//# sourceMappingURL=es.framework-ng.ui.core-generic-view.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"es.framework-ng.ui.core-generic-view.mjs","sources":["../../../../libs/ng.ui.core/generic-view/src/lib/generic-view.ts","../../../../libs/ng.ui.core/generic-view/src/lib/generic-view.html","../../../../libs/ng.ui.core/generic-view/src/lib/generic-view-module.ts","../../../../libs/ng.ui.core/generic-view/src/es.framework-ng.ui.core-generic-view.ts"],"sourcesContent":["import { TooltipModule } from 'primeng/tooltip';\r\nimport { Component, EventEmitter, inject, Input, OnInit, Output, TemplateRef, ViewChild } from '@angular/core';\r\nimport { CommonModule, Location } from '@angular/common';\r\nimport { ToolbarModule } from 'primeng/toolbar';\r\nimport { ButtonModule } from 'primeng/button';\r\nimport { FormlyForm, FormlyFieldConfig } from '@ngx-formly/core';\r\nimport { FormGroup, FormsModule, ReactiveFormsModule, UntypedFormGroup } from '@angular/forms';\r\nimport { TabsModule } from 'primeng/tabs';\r\nimport { TranslatePipe } from '@es.framework/ng.core/pipes';\r\nimport { MenuItem } from 'primeng/api';\r\nimport { BreadcrumbComponent } from '@es.framework/ng.ui.core/breadcrumb';\r\nimport { BaseService, SwalService } from '@es.framework/ng.core/services';\r\nimport { ActivatedRoute, Router } from '@angular/router';\r\nimport { ActionDef, ButtonConfig, PaginatedResult } from '@es.framework/ng.core/models';\r\nimport { ProgressSpinnerModule } from 'primeng/progressspinner';\r\nimport { GenericDialogComponent } from '@es.framework/ng.ui.core/generic-dialog';\r\nimport { GenericButton } from '@es.framework/ng.ui.core/generic-button';\r\n\r\nexport interface DetailTab {\r\n header: string;\r\n icon?: string;\r\n fields: FormlyFieldConfig[];\r\n model?: any;\r\n content?: TemplateRef<any>;\r\n}\r\n\r\n@Component({\r\n selector: 'app-detail-view',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n ToolbarModule,\r\n ButtonModule,\r\n TabsModule,\r\n FormlyForm,\r\n FormsModule,\r\n ReactiveFormsModule,\r\n TranslatePipe,\r\n BreadcrumbComponent,\r\n TooltipModule,\r\n GenericDialogComponent,\r\n GenericButton,\r\n ProgressSpinnerModule\r\n ],\r\n templateUrl: './generic-view.html',\r\n})\r\nexport class GenericViewComponent implements OnInit {\r\n private route = inject(ActivatedRoute);\r\n private router = inject(Router);\r\n\r\n form = new UntypedFormGroup({});\r\n\r\n @Input() title = '';\r\n @Input() actions: ActionDef<any>[] = [];\r\n @Input() createEditActions: ButtonConfig[] = [];\r\n actions_: ActionDef<any>[] = [];\r\n @Input() tabs: DetailTab[] = [];\r\n @Input() viewMode = true;\r\n @Input() breadcrumb: MenuItem[] | undefined;\r\n @Input() service: BaseService = inject(BaseService);\r\n @Input() formFields: FormlyFieldConfig[] = [];\r\n @Input() apiName = '';\r\n @Input() moduleName = '';\r\n @Input() idField = 'id';\r\n @Input() standaloneMode = false;\r\n @Input() isViewMode = true; // وضع المشاهدة فقط\r\n @Input() isCreateMode = false; // وضع الاضافة فقط\r\n @Input() isEditMode = false; // وضع التعديل\r\n @Input() model = {};\r\n @Input() displayMode:\r\n | 'drawer'\r\n | 'dialog'\r\n | 'route'\r\n | 'inline'\r\n | Partial<\r\n Record<\r\n 'add' | 'edit' | 'view',\r\n 'drawer' | 'dialog' | 'route' | 'inline'\r\n >\r\n > = 'drawer';\r\n@Input() mode: 'full' | 'form-only' | 'table-only' | 'detail' = 'full';\r\n\r\n @Output() action = new EventEmitter<{ name: string; row: any }>();\r\n @Output() afterDelete = new EventEmitter<{ record: any; response?: any }>();\r\n\r\n @ViewChild('dialog') dialog!: GenericDialogComponent;\r\n @ViewChild('inlineForm') inlineForm!: GenericDialogComponent;\r\n\r\n tabs_: DetailTab[] = [];\r\n model_: any = {};\r\n\r\n currentId!: string | number;\r\n list: any[] = [];\r\n totalRecords = 0;\r\n @Input() loading = false;\r\n\r\n // pagination state\r\n pageSize = 10;\r\n pageIndex = 0;\r\n sort = '';\r\n currentFilters: any = {};\r\n pageFilters: any = {};\r\n searchGlobal = '';\r\n private swalService = inject(SwalService);\r\n\r\n _location: Location = inject(Location);\r\n\r\n ngOnInit() {\r\n this.loading = true;\r\n if (this.apiName) {\r\n this.service.apiName = this.apiName;\r\n this.service.moduleName = this.moduleName;\r\n }\r\n\r\n\r\n this.actions_ = this.actions.filter(c=>c.name != 'view');\r\n\r\n this.route.paramMap.subscribe(params => {\r\n const id = params.get(this.idField);\r\n if (id) {\r\n this.currentId = id;\r\n if(this.standaloneMode){\r\n this.loadList();\r\n }\r\n }\r\n\r\n this.refresh();\r\n\r\n });\r\n\r\n\r\n }\r\n\r\n refresh(){\r\n\r\n // detect mode based on route\r\n const url = this.router.url.toLowerCase();\r\n this.isViewMode = url.includes('/view');\r\n this.isEditMode = url.includes('/edit');\r\n this.isCreateMode = url.includes('/create') || url.endsWith('/new') || url.endsWith('/add');\r\n\r\n this.tabs_ = [];\r\nfor (let i = 0; i < this.tabs.length; i++) {\r\n const t = this.tabs[i];\r\n this.tabs_.push({\r\n ...t,\r\n fields: [\r\n {\r\n props: { label: '' },\r\n // fieldGroupClassName: 'grid grid-cols-1 md:grid-cols-2 gap-3', // TODO\r\n fieldGroupClassName: '',\r\n fieldGroup:\r\n this.isCreateMode || this.isEditMode\r\n ? this.getCreateEditFields(i == 0 ? this.formFields: t.fields)\r\n : this.getViewFields(i == 0 ? this.formFields : t.fields),\r\n },\r\n ],\r\n });\r\n}\r\nthis.loading = false;\r\n }\r\n // as form\r\n getCreateEditFields(fields: FormlyFieldConfig[] = []): FormlyFieldConfig[] {\r\n return fields.map(f => ({\r\n ...f,\r\n props: { ...f.props, readonly: this.viewMode, disabled: this.viewMode },\r\n }));\r\n }\r\n getViewFields(fields: FormlyFieldConfig[] = []): FormlyFieldConfig[] {\r\n const flatten = (fields: FormlyFieldConfig[]): FormlyFieldConfig[] =>\r\n fields.flatMap((field:any) => {\r\n\r\n /* 1. GROUP / PANEL / WRAPPER */\r\n if (field.fieldGroup?.length) {\r\n const children = flatten(field.fieldGroup);\r\n\r\n if (!children.length) return [];\r\n\r\n return [{\r\n ...field,\r\n wrappers: field.wrappers,\r\n props: { ...field.props },\r\n fieldGroupClassName: field.fieldGroupClassName,\r\n fieldGroup: children\r\n }];\r\n }\r\n\r\n /* 2. FIELD ARRAY (REPEAT / TABLE / MULTI) */\r\n const fieldArrayConfig =\r\n typeof field.fieldArray === 'function'\r\n ? field.fieldArray(field)\r\n : field.fieldArray;\r\n\r\n if (field.fieldArray) {\r\n\r\n if (field.props?.['view']?.hidden) return [];\r\n\r\n const children = flatten(fieldArrayConfig?.fieldGroup || []);\r\n\r\n if (!children.length) return [];\r\n\r\n return [{\r\n ...field,\r\n type: field.props?.['view']?.type || field.type,\r\n readonly: this.viewMode,\r\n disabled: this.viewMode,\r\n fieldArray: {\r\n ...fieldArrayConfig,\r\n fieldGroup: children\r\n }\r\n }];\r\n }\r\n\r\n /* 3. SINGLE FIELD */\r\n if (!field.props || field.props['view']?.hidden) return [];\r\n\r\n const type =\r\n field.props['view']?.type ||\r\n field.props['table']?.type ||\r\n field.props['filter']?.type ||\r\n 'custom-label-type';\r\n\r\n return [{\r\n type,\r\n key: field.key,\r\n readonly: this.viewMode,\r\n disabled: this.viewMode,\r\n wrappers: field.wrappers ?? ['field-wrapper'],\r\n className: field.className,\r\n props: {\r\n ...field.props,\r\n ...(field.props['view']?.props ||\r\n field.props['table']?.props ||\r\n field.props['filter']?.props ||\r\n {}),\r\n },\r\n expressions:\r\n field.props['view']?.expressions ||\r\n field.props['table']?.expressions ||\r\n field.props['filter']?.expressions\r\n }];\r\n });\r\n\r\n return flatten(fields);\r\n}\r\n\r\n // getViewFields(fields: FormlyFieldConfig[] = []): FormlyFieldConfig[] {\r\n // const flatten = (fields: FormlyFieldConfig[]): FormlyFieldConfig[] =>\r\n // fields.flatMap(field => {\r\n // if (field.fieldGroup?.length) return flatten(field.fieldGroup);\r\n // if (!field.props\r\n // || field.props['view']?.hidden\r\n // // || field.props['table']?.hidden\r\n // ) return [];\r\n\r\n // const type = field.props['view']?.type || field.props['table']?.type || 'custom-label-type';\r\n // return [{\r\n // type,\r\n // key: field['key'],\r\n // readonly: this.viewMode,\r\n // disabled: this.viewMode,\r\n // wrappers: field.wrappers ?? ['field-wrapper'],\r\n // props: {\r\n // ...field.props,\r\n // ...(field.props['view']?.props || field.props['table']?.props),\r\n // },\r\n // expressions: field.props['view']?.expressions || field.props['view']?.expressions,\r\n // }];\r\n // });\r\n\r\n // return flatten(fields);\r\n // }\r\n\r\n // Use a map to store form groups for each row and column\r\n private cellForms: Map<string, FormGroup> = new Map();\r\n getForm(rowIndex: number): FormGroup {\r\n const key = `${rowIndex}_`;\r\n let form = this.cellForms.get(key);\r\n\r\n if (!form) {\r\n form = new FormGroup({});\r\n this.cellForms.set(key, form);\r\n }\r\n return form;\r\n }\r\n\r\n\r\n async handleCreateEditAction(btn: ButtonConfig) {\r\n try {\r\n if (btn.action) {\r\n // Execute the provided action\r\n await btn.action(null); // You can pass row or context here\r\n } else {\r\n // Fallback to emitting event\r\n if(btn.actionName == 'cancel'){\r\n this.back();\r\n }\r\n else{\r\n this.action.emit({\r\n name: btn.actionName ?? 'cancel',\r\n row: null!, // provide row if available\r\n });\r\n }\r\n }\r\n } catch (err) {\r\n console.error('Button action error', err);\r\n }\r\n }\r\n\r\n\r\nonAction(act: ActionDef<any>, model: any) {\r\n if (act.action) {\r\n act.action(model);\r\n } else {\r\n // this.action.emit({ name: act.name, row:model });\r\n this.emitAction({ name: act.name, row:model });\r\n }\r\n }\r\n\r\n emitAction(event: { name: string; row: any | null }): void {\r\n switch (event.name) {\r\n case 'edit':\r\n this.dialog.openForm(\"edit\",event.row);\r\n break;\r\n case 'delete':\r\n this.onDelete(event.row!);\r\n break;\r\n default :\r\n this.action.emit(event);\r\n break;\r\n }\r\n}\r\n\r\nonDelete(item: any): void {\r\n const id = 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.swalService.success('تم الحذف بنجاح');\r\n this.back();\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 afterSave(event: any) {\r\n this.model = event.response;\r\n\r\n // set the id from backend response\r\n this.currentId = event.response[this.idField];\r\n\r\n if (this.isCreateMode) {\r\n this.goToMode('view');\r\n } else if (this.isEditMode) {\r\n this.goToMode('view');\r\n }\r\n}\r\n\r\n\r\n\r\ngoToMode(mode: 'view' | 'edit' | 'create') {\r\n const tree = this.router.parseUrl(this.router.url);\r\n const segments = tree.root.children['primary']?.segments.map(s => s.path) ?? [];\r\n\r\n let newSegments: string[];\r\n\r\n if (mode === 'create') {\r\n // always navigate to \"add\"\r\n newSegments = [\r\n ...segments.filter(s => !['view', 'edit', 'add'].includes(s)),\r\n 'add',\r\n ];\r\n } else {\r\n // if in \"add\" mode, replace it with the new id\r\n if (segments.includes('add')) {\r\n newSegments = [\r\n ...segments.filter(s => s !== 'add'),\r\n String(this.currentId),\r\n mode,\r\n ];\r\n } else {\r\n const idIndex = segments.findIndex(s => s === String(this.currentId));\r\n if (idIndex === -1) {\r\n newSegments = [...segments, String(this.currentId), mode];\r\n } else {\r\n newSegments = segments.slice(0, idIndex + 1);\r\n newSegments.push(mode);\r\n }\r\n }\r\n }\r\n\r\n this.router.navigate(newSegments);\r\n this.refresh();\r\n}\r\n\r\n\r\nbackToList(){\r\n this.router.navigate(['../']);\r\n }\r\nback(){\r\n // this.router.navigate(['..']);\r\n this._location.back()\r\n }\r\n loadList() {\r\n this.loading = true;\r\n const filters = {\r\n maxResultCount: this.pageSize,\r\n skipCount: this.pageIndex * this.pageSize,\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 this.service.getList(filters).subscribe({\r\n next: (res: PaginatedResult<any>) => {\r\n this.list = res.items;\r\n this.totalRecords = res.totalCount;\r\n this.loading = false;\r\n\r\n // set model_ to current id item\r\n const found = this.list.find(x => x[this.idField] == this.currentId);\r\n if (found) {\r\n this.model_ = found;\r\n }\r\n },\r\n error: err => {\r\n console.error('Error loading list', err);\r\n this.loading = false;\r\n }\r\n });\r\n }\r\n next() {\r\n if (!this.currentId) return;\r\n\r\n // increment currentId numerically\r\n // const newId = Number(this.currentId) + 1;\r\n // this.currentId = newId;\r\n // use goToMode to navigate and keep mode\r\n const currentMode = this.isEditMode ? 'edit' : 'view';\r\n // this.goToMode(currentMode);\r\n}\r\n\r\nprevious() {\r\n if (!this.currentId) return;\r\n\r\n // decrement currentId numerically\r\n // const newId = Number(this.currentId) - 1;\r\n // if (newId <= 0) return;\r\n\r\n // this.currentId = newId;\r\n\r\n // use goToMode to navigate and keep mode\r\n const currentMode = this.isEditMode ? 'edit' : 'view';\r\n // this.goToMode(currentMode);\r\n}\r\n\r\n\r\n // next() {\r\n // const idx = this.list.findIndex(x => x[this.idField] == this.currentId);\r\n // if (idx >= 0 && idx < this.list.length - 1) {\r\n // const newId = this.list[idx + 1][this.idField];\r\n // this.router.navigate(['../', newId], { relativeTo: this.route });\r\n // }\r\n // }\r\n\r\n // previous() {\r\n // const idx = this.list.findIndex(x => x[this.idField] == this.currentId);\r\n // if (idx > 0) {\r\n // const newId = this.list[idx - 1][this.idField];\r\n // this.router.navigate(['../', newId], { relativeTo: this.route });\r\n // }\r\n // }\r\n}\r\n\r\n","\n@if (mode === 'detail') {\n <div class=\"w-full flex flex-col gap-3\">\n <!-- overlay -->\n @if (loading) {\n <div\n class=\"absolute inset-0 bg-white/70 flex items-center justify-center z-50\">\n <p-progress-spinner/>\n </div>\n }\n\n <!-- actual content -->\n <!-- Toolbar -->\n <p-toolbar style=\"background: transparent;border: 0px;box-shadow: none;\" class=\"bg-transparent shadow-none border-none rounded-md px-3\">\n <ng-template pTemplate=\"left\">\n <!-- <span class=\"font-semibold text-lg xs:hidden block\">{{ title }}</span> -->\n <app-breadcrumb class=\"xs:block\" [breadcrumb]=\"breadcrumb\"></app-breadcrumb> <!-- xs:block hidden -->\n </ng-template>\n <ng-template pTemplate=\"right\">\n <div class=\"flex gap-2\">\n\n <button\n pButton pRipple\n icon=\"pi pi-chevron-right\"\n class=\"p-button-text p-button-sm fd-btn\"\n pTooltip=\"التالي\"\n (click)=\"next()\"\n ></button>\n <button\n pButton pRipple\n icon=\"pi pi-chevron-left\"\n class=\"p-button-text p-button-sm fd-btn\"\n pTooltip=\"السابق\"\n (click)=\"previous()\"\n ></button>\n </div>\n </ng-template>\n </p-toolbar>\n <p-toolbar class=\"bg-white shadow rounded-md px-3\">\n\n <ng-template pTemplate=\"left\">\n @if (isViewMode) {\n <div class=\"flex gap-1\">\n @for (action of actions_; track $index) {\n <button\n pButton pRipple\n [icon]=\"action.icon ?? ''\"\n [label]=\"(action.label ?? '') | translate\"\n class=\"fd-btn\"\n (click)=\"onAction(action,model)\"\n ></button>\n }\n </div>\n }\n </ng-template>\n <ng-template pTemplate=\"right\">\n @if (isEditMode || isCreateMode) {\n <div class=\"flex gap-1\">\n @for (btn of createEditActions; track $index) {\n @if (!btn.visible || (btn.visible && btn.visible === true)) {\n @if (btn.type === 'submit' && inlineForm) {\n <lib-generic-button\n [type]=\"'submit'\"\n [loading]=\"inlineForm.loading\"\n [disabled]=\"inlineForm.loading || form.invalid\"\n [icon]=\"btn.icon\"\n [label]=\"btn.label | translate\"\n [variant]=\"btn.variant\"\n [severity]=\"btn.severity\"\n [size]=\"btn.size\"\n [model]=\"btn.splitActions\"\n [permission]=\"btn.permission\"\n (clicked)=\"inlineForm.onSubmit()\"\n ></lib-generic-button>\n }\n @else{\n <lib-generic-button\n [icon]=\"btn.icon\"\n [label]=\"btn.label | translate\"\n [variant]=\"btn.variant\"\n [severity]=\"btn.severity\"\n [size]=\"btn.size\"\n [model]=\"btn.splitActions\"\n [permission]=\"btn.permission\"\n (clicked)=\"handleCreateEditAction(btn)\"\n ></lib-generic-button>\n }\n }\n }\n </div>\n }\n </ng-template>\n\n </p-toolbar>\n\n <!-- Tabs -->\n <p-tabs value=\"0\">\n <p-tablist>\n @for (tab of tabs_; track $index) {\n <p-tab value=\"{{$index}}\">\n <i [class]=\"tab.icon\"></i>\n <span class=\"mr-1 ml-1\">{{ tab.header }}</span>\n </p-tab>\n }\n </p-tablist>\n <p-tabpanels>\n @for (tab of tabs_; track $index) {\n <p-tabpanel value=\"{{$index}}\">\n\n <!-- Formly fields -->\n <!-- border border-surface p-4-->\n <div class=\"\">\n @if (tab.fields.length && $index === 0) {\n\n @if (form) {\n <form [formGroup]=\"form\">\n @if (tab.fields.length && $index === 0 ) {\n @if (isEditMode || isCreateMode) {\n <app-generic-dialog\n #inlineForm\n [form]=\"form\"\n [model]=\"model\"\n [formFields]=\"formFields ?? []\"\n [apiName]=\"apiName\"\n [moduleName]=\"moduleName\"\n [idField]=\"idField ??'id'\"\n [displayMode]=\"'inline'\"\n [mode]=\"'form-only'\"\n [forceState]=\"isCreateMode ? 'create':'edit'\"\n (afterSave)=\"afterSave($event)\"\n >\n </app-generic-dialog>\n }\n @else if(isViewMode){\n <formly-form\n [form]=\"form\"\n [fields]=\"tab.fields\"\n [model]=\"model\"\n ></formly-form>\n }\n }\n </form>\n }\n\n }\n @if (tab.fields.length && $index > 0) {\n\n\n <formly-form\n [form]=\"getForm($index)\"\n [fields]=\"tab.fields\"\n [model]=\"tab.model || model\"\n ></formly-form>\n\n }\n\n <!-- Custom template -->\n @if (tab.content) {\n <ng-container\n *ngTemplateOutlet=\"tab.content; context: { model: model }\">\n </ng-container>\n }\n </div>\n </p-tabpanel>\n }\n </p-tabpanels>\n</p-tabs>\n</div>\n\n<!-- [model]=\"model\" -->\n<app-generic-dialog\n #dialog\n [formFields]=\"formFields ?? []\"\n [apiName]=\"apiName\"\n [moduleName]=\"moduleName\"\n [idField]=\"idField ??'id'\"\n [displayMode]=\"displayMode ?? 'dialog'\"\n (afterSave)=\"afterSave($event)\"\n >\n</app-generic-dialog>\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\n@NgModule({\n imports: [CommonModule],\n})\nexport class GenericViewModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { NgModule, Component } from '@angular/core';
|
|
3
|
+
import { CommonModule } from '@angular/common';
|
|
4
|
+
|
|
5
|
+
class HeaderWrapperModule {
|
|
6
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: HeaderWrapperModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
7
|
+
static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "21.1.3", ngImport: i0, type: HeaderWrapperModule, imports: [CommonModule] });
|
|
8
|
+
static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: HeaderWrapperModule, imports: [CommonModule] });
|
|
9
|
+
}
|
|
10
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: HeaderWrapperModule, decorators: [{
|
|
11
|
+
type: NgModule,
|
|
12
|
+
args: [{
|
|
13
|
+
imports: [CommonModule],
|
|
14
|
+
}]
|
|
15
|
+
}] });
|
|
16
|
+
|
|
17
|
+
class HeaderWrapper {
|
|
18
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: HeaderWrapper, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
19
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.1.3", type: HeaderWrapper, isStandalone: true, selector: "lib-header-wrapper", ngImport: i0, template: "<p>header-wrapper works!</p>\n", styles: [""] });
|
|
20
|
+
}
|
|
21
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: HeaderWrapper, decorators: [{
|
|
22
|
+
type: Component,
|
|
23
|
+
args: [{ selector: 'lib-header-wrapper', imports: [], template: "<p>header-wrapper works!</p>\n" }]
|
|
24
|
+
}] });
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Generated bundle index. Do not edit.
|
|
28
|
+
*/
|
|
29
|
+
|
|
30
|
+
export { HeaderWrapper, HeaderWrapperModule };
|
|
31
|
+
//# sourceMappingURL=es.framework-ng.ui.core-header-wrapper.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"es.framework-ng.ui.core-header-wrapper.mjs","sources":["../../../../libs/ng.ui.core/header-wrapper/src/lib/header-wrapper-module.ts","../../../../libs/ng.ui.core/header-wrapper/src/lib/header-wrapper.ts","../../../../libs/ng.ui.core/header-wrapper/src/lib/header-wrapper.html","../../../../libs/ng.ui.core/header-wrapper/src/es.framework-ng.ui.core-header-wrapper.ts"],"sourcesContent":["import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\n@NgModule({\n imports: [CommonModule],\n})\nexport class HeaderWrapperModule {}\n","import { Component } from '@angular/core';\n\n@Component({\n selector: 'lib-header-wrapper',\n imports: [],\n templateUrl: './header-wrapper.html',\n styleUrl: './header-wrapper.css'\n})\nexport class HeaderWrapper {\n\n}\n","<p>header-wrapper works!</p>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;MAMa,mBAAmB,CAAA;uGAAnB,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA;AAAnB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,mBAAmB,YAFpB,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,mBAAmB,YAFpB,YAAY,CAAA,EAAA,CAAA;;2FAEX,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAH/B,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;oBACR,OAAO,EAAE,CAAC,YAAY,CAAC;AACxB,iBAAA;;;MCGY,aAAa,CAAA;uGAAb,aAAa,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAb,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,aAAa,8ECR1B,gCACA,EAAA,MAAA,EAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FDOa,aAAa,EAAA,UAAA,EAAA,CAAA;kBANzB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,oBAAoB,WACrB,EAAE,EAAA,QAAA,EAAA,gCAAA,EAAA;;;AEJb;;AAEG;;;;"}
|