@devhouse.int/angular-reusable-components 0.0.0-stage → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"devhouse.int-angular-reusable-components.mjs","sources":["../../src/lib/app-border-wrapper/app-border-wrapper.component.ts","../../src/lib/app-border-wrapper/app-border-wrapper.component.html","../../src/lib/app-smart-lookup/smart-lookup-host.service.ts","../../src/lib/app-smart-lookup/app-smart-lookup.component.ts","../../src/lib/app-smart-lookup/app-smart-lookup.component.html","../../src/lib/app-toolbar/app-toolbar-item.component.ts","../../src/lib/app-toolbar/app-toolbar-item.component.html","../../src/lib/app-toolbar/app-toolbar.component.ts","../../src/lib/app-toolbar/app-toolbar.component.html","../../src/lib/dx-date-box-range/dx-date-box-range.component.ts","../../src/lib/dx-date-box-range/dx-date-box-range.component.html","../../src/lib/form-navigator/form-navigator-adapter.ts","../../src/lib/reusable-components.config.ts","../../src/lib/form-navigator/navigator-localize.pipe.ts","../../src/lib/info-popup/info-user-provider.ts","../../src/lib/info-popup/info-popup.component.ts","../../src/lib/info-popup/info-popup.component.html","../../src/lib/lookup-grid-provider.ts","../../src/lib/lookup-dynamic-grid/lookup-dynamic-grid.component.ts","../../src/lib/lookup-dynamic-grid/lookup-dynamic-grid.component.html","../../src/lib/lookup-popup/lookup-popup.component.ts","../../src/lib/lookup-popup/lookup-popup.component.html","../../src/lib/subscribe-button/record-subscription-provider.ts","../../src/lib/form-navigator/fn-icon/fn-icon.component.ts","../../src/lib/subscribe-button/subscribe-button.component.ts","../../src/lib/subscribe-button/subscribe-button.component.html","../../src/lib/form-navigator/form-navigator.component.ts","../../src/lib/form-navigator/form-navigator.component.html","../../src/lib/edit-form-button/edit-form-buttons.component.ts","../../src/lib/edit-form-button/edit-form-buttons.component.html","../../src/lib/embedded-form/embedded-form-host.ts","../../src/lib/embedded-form/popup-full-screen-toggle.ts","../../src/lib/embedded-form/app-popup-full-screen.directive.ts","../../src/lib/equation-editor/equation-editor.component.ts","../../src/lib/equation-editor/equation-editor.component.html","../../src/lib/file-edit/file-edit.component.ts","../../src/lib/file-edit/file-edit.component.html","../../src/lib/file-manager/file-manager-provider.ts","../../src/lib/file-manager/file-manager.component.ts","../../src/lib/file-manager/file-manager.component.html","../../src/lib/filter-panel/dx-form-items-outlet.directive.ts","../../src/lib/grid-lookup/grid-lookup.component.ts","../../src/lib/grid-lookup/grid-lookup.component.html","../../src/lib/lookup-data-provider.ts","../../src/lib/lookup-edit/lookup-edit.component.ts","../../src/lib/lookup-edit/lookup-edit.component.html","../../src/lib/filter-panel/range-validation.helper.ts","../../src/lib/filter-panel/filter-panel.component.ts","../../src/lib/filter-panel/filter-panel.component.html","../../src/lib/financial-dimension-values/financial-dimension-values-provider.ts","../../src/lib/financial-dimension-values/financial-dimension-values.component.ts","../../src/lib/financial-dimension-values/financial-dimension-values.component.html","../../src/lib/financial-dimensions-popup/financial-dimensions-provider.ts","../../src/lib/financial-dimensions-popup/financial-dimensions-popup.component.ts","../../src/lib/financial-dimensions-popup/financial-dimensions-popup.component.html","../../src/lib/grouping-level/grouping-level.component.ts","../../src/lib/grouping-level/grouping-level.component.html","../../src/lib/image-edit/image-edit.component.ts","../../src/lib/image-edit/image-edit.component.html","../../src/lib/journal-entry-viewer/journal-entry-viewer-provider.ts","../../src/lib/journal-entry-viewer/journal-entry-viewer.component.ts","../../src/lib/journal-entry-viewer/journal-entry-viewer.component.html","../../src/lib/map-location-picker/map-location-picker.component.ts","../../src/lib/map-location-picker/map-location-picker.component.html","../../src/lib/message-content-popup/message-content-popup.component.ts","../../src/lib/message-content-popup/message-content-popup.component.html","../../src/lib/permission-selector/permission.models.ts","../../src/lib/permission-selector-item/permission-selector-item.component.ts","../../src/lib/permission-selector-item/permission-selector-item.component.html","../../src/lib/record-change-log-popup/record-change-log-provider.ts","../../src/lib/record-change-log-popup/record-change-log-popup.component.ts","../../src/lib/record-change-log-popup/record-change-log-popup.component.html","../../src/lib/permission-selector/permission-selector.component.ts","../../src/lib/permission-selector/permission-selector.component.html","../../src/lib/query-actions-toolbar/query-actions-toolbar.component.ts","../../src/lib/query-actions-toolbar/query-actions-toolbar.component.html","../../src/lib/receipt-preview/receipt-codes.ts","../../src/lib/receipt-preview/receipt-preview.component.ts","../../src/lib/receipt-preview/receipt-preview.component.html","../../src/lib/report-workflow-actions/report-workflow-actions.component.ts","../../src/lib/report-workflow-actions/report-workflow-actions.component.html","../../src/lib/reversal-date-popup/reversal-date-popup.component.ts","../../src/lib/reversal-date-popup/reversal-date-popup.component.html","../../src/lib/save-only-buttons/save-only-buttons.component.ts","../../src/lib/save-only-buttons/save-only-buttons.component.html","../../src/lib/select-box-with-link/select-box-with-link.component.ts","../../src/lib/select-box-with-link/select-box-with-link.component.html","../../src/lib/workflow-actions/workflow-actions-provider.ts","../../src/lib/workflow-confirm-dialog/workflow-confirm-dialog.component.ts","../../src/lib/workflow-confirm-dialog/workflow-confirm-dialog.component.html","../../src/lib/workflow-actions/workflow-actions.component.ts","../../src/lib/workflow-actions/workflow-actions.component.html","../../src/lib/workflow-toolbar/workflow-toolbar-provider.ts","../../src/lib/workflow-toolbar/workflow-toolbar.component.ts","../../src/lib/workflow-toolbar/workflow-toolbar.component.html","../../src/devhouse.int-angular-reusable-components.ts"],"sourcesContent":["import { Component } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'app-border-wrapper',\r\n standalone: true,\r\n imports: [],\r\n templateUrl: './app-border-wrapper.component.html',\r\n styleUrl: './app-border-wrapper.component.scss',\r\n})\r\nexport class AppBorderWrapperComponent {}\r\n","<div class=\"border border-border bg-card p-3 mb-3\">\r\n <ng-content></ng-content>\r\n</div>\r\n","import { Injectable } from '@angular/core';\r\nimport { Subject } from 'rxjs';\r\n\r\n@Injectable()\r\nexport class SmartLookupHostService {\r\n private _saved = new Subject<any>();\r\n private _error = new Subject<string>();\r\n\r\n readonly saved$ = this._saved.asObservable();\r\n readonly error$ = this._error.asObservable();\r\n\r\n notifySaved(item: any): void {\r\n this._saved.next(item);\r\n }\r\n\r\n notifyError(message: string): void {\r\n this._error.next(message);\r\n }\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport {\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n ContentChild,\r\n EventEmitter,\r\n Input,\r\n OnChanges,\r\n OnDestroy,\r\n OnInit,\r\n Output,\r\n SimpleChanges,\r\n TemplateRef,\r\n ViewChild,\r\n} from '@angular/core';\r\nimport { Subscription } from 'rxjs';\r\n\r\nimport {\r\n DxButtonModule,\r\n DxFormComponent,\r\n DxFormModule,\r\n DxLoadPanelModule,\r\n DxPopupModule,\r\n DxSelectBoxModule,\r\n} from 'devextreme-angular';\r\nimport { SmartLookupHostService } from './smart-lookup-host.service';\r\n\r\nexport type LoadFn<TItem> = () => Promise<TItem[]>;\r\n\r\nexport type CreateFn<TCreate, TCreated> = (\r\n payload: TCreate,\r\n) => Promise<TCreated>;\r\n\r\n@Component({\r\n selector: 'app-smart-lookup',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n DxSelectBoxModule,\r\n DxButtonModule,\r\n DxPopupModule,\r\n DxFormModule,\r\n DxLoadPanelModule,\r\n ],\r\n templateUrl: './app-smart-lookup.component.html',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n providers: [SmartLookupHostService],\r\n})\r\nexport class AppSmartLookupComponent<\r\n TItem extends Record<string, any>,\r\n TCreate extends Record<string, any>,\r\n> implements OnInit, OnChanges, OnDestroy {\r\n\r\n private _hostSub = new Subscription();\r\n\r\n constructor(\r\n private cdr: ChangeDetectorRef,\r\n private hostService: SmartLookupHostService,\r\n ) {}\r\n // UI\r\n @Input() label = '';\r\n @Input() placeholder = 'Select...';\r\n @Input() readOnly = false;\r\n @Input() disabled = false;\r\n\r\n // Lookup mapping\r\n @Input() valueExpr: string = 'id';\r\n @Input() displayExpr: string | ((item: any) => string) = 'name';\r\n /** Set this when displayExpr is a function so the SelectBox can still search by a field. */\r\n @Input() searchExpr: string | null = null;\r\n\r\n // Selected value (two-way)\r\n @Input() value: any = null;\r\n @Output() valueChange = new EventEmitter<any>();\r\n\r\n // Data hooks\r\n @Input({ required: true }) loadFn!: LoadFn<TItem>;\r\n @Input() createFn?: CreateFn<TCreate, TItem>;\r\n\r\n @Input() createMode: 'form' | 'content' = 'form';\r\n\r\n // Create popup\r\n @Input() allowAdd = true;\r\n @Input() addButtonHint = 'Add new';\r\n @Input() createPopupTitle = 'Add new item';\r\n @Input() cancelText = 'إلغاء';\r\n @Input() saveText = 'حفظ';\r\n @Input() createFormItems: any[] = []; // DevExtreme dxForm items\r\n @Input() createInitialModel: Partial<TCreate> = {};\r\n\r\n // Popup sizing\r\n @Input() popupWidth: string | number = 'auto';\r\n @Input() popupHeight: string | number = 'auto';\r\n\r\n /**\r\n * Lets the user resize the create popup by dragging its edges.\r\n * dxPopup defaults `resizeEnabled` to false, so without this the popup is\r\n * locked to `popupWidth`/`popupHeight` — which is unusable for `createMode=\"content\"`\r\n * hosts that project a whole grid screen (e.g. the timezones screen on the\r\n * Countries form). Enabled by default; opt out per host if a fixed size is required.\r\n */\r\n @Input() popupResizeEnabled = true;\r\n\r\n // Resize boundaries (honoured by dxPopup only while resizing)\r\n @Input() popupMinWidth: string | number = 360;\r\n @Input() popupMinHeight: string | number = 240;\r\n @Input() popupMaxWidth: string | number = '98vw';\r\n @Input() popupMaxHeight: string | number = '95vh';\r\n\r\n @Output() created = new EventEmitter<TItem>();\r\n\r\n // Lazy content: render only when popup opens (avoids loading child components upfront)\r\n @ContentChild('smartLookupContent') contentTemplate?: TemplateRef<any>;\r\n\r\n @ViewChild('createFormRef', { static: false })\r\n createFormRef?: DxFormComponent;\r\n\r\n items: TItem[] = [];\r\n isLoading = false;\r\n\r\n popupVisible = false;\r\n saving = false;\r\n\r\n createModel: TCreate = {} as TCreate;\r\n createError: string | null = null;\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['value']) {\r\n this.cdr.markForCheck();\r\n }\r\n }\r\n\r\n async ngOnInit(): Promise<void> {\r\n this._hostSub.add(\r\n this.hostService.saved$.subscribe((item) => this.onExternalSaved(item)),\r\n );\r\n this._hostSub.add(\r\n this.hostService.error$.subscribe((msg) => this.onExternalError(msg)),\r\n );\r\n await this.reload();\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this._hostSub.unsubscribe();\r\n }\r\n\r\n async reload(): Promise<void> {\r\n if (!this.loadFn) return;\r\n\r\n this.isLoading = true;\r\n this.createError = null;\r\n\r\n try {\r\n this.items = await this.loadFn();\r\n } catch (e: any) {\r\n this.createError = 'Failed to load lookup data.';\r\n } finally {\r\n this.isLoading = false;\r\n this.cdr.markForCheck();\r\n }\r\n }\r\n\r\n onValueChanged(e: any): void {\r\n this.value = e?.value ?? null;\r\n this.valueChange.emit(this.value);\r\n }\r\n\r\n openCreatePopup(): void {\r\n if (!this.allowAdd || this.disabled || this.readOnly) return;\r\n\r\n this.createError = null;\r\n\r\n if (this.createMode === 'form') {\r\n this.createModel = { ...(this.createInitialModel as any) } as TCreate;\r\n }\r\n\r\n this.popupVisible = true;\r\n }\r\n\r\n closeCreatePopup(): void {\r\n this.popupVisible = false;\r\n this.createError = null;\r\n }\r\n\r\n private isFormValid(): boolean {\r\n const formInstance = this.createFormRef?.instance;\r\n if (!formInstance) return true;\r\n\r\n const result = formInstance.validate();\r\n return result?.isValid ?? true;\r\n }\r\n\r\n async saveNew(): Promise<void> {\r\n if (this.saving) return;\r\n\r\n this.createError = null;\r\n\r\n if (!this.isFormValid()) {\r\n this.createError = 'Please fill required fields.';\r\n return;\r\n }\r\n\r\n this.saving = true;\r\n\r\n try {\r\n if (!this.createFn) {\r\n this.createError = 'Create function is not provided.';\r\n return;\r\n }\r\n\r\n const createdItem = await this.createFn(this.createModel);\r\n\r\n // Refresh list to guarantee correct sorting/filters from server\r\n await this.reload();\r\n\r\n // Select the new item\r\n const createdId = createdItem?.[this.valueExpr];\r\n this.value = createdId;\r\n this.valueChange.emit(createdId);\r\n\r\n this.created.emit(createdItem);\r\n this.popupVisible = false;\r\n } catch (e: any) {\r\n // If backend returns validation message, show it if available\r\n const msg = e?.error?.message || e?.message || 'Failed to save item.';\r\n this.createError = msg;\r\n } finally {\r\n this.saving = false;\r\n }\r\n }\r\n public async onExternalSaved(createdItem: any): Promise<void> {\r\n // Refresh list to guarantee correct sorting/filters from server\r\n await this.reload();\r\n\r\n const createdId = createdItem?.[this.valueExpr];\r\n this.value = createdId;\r\n this.valueChange.emit(createdId);\r\n\r\n this.created.emit(createdItem);\r\n this.popupVisible = false;\r\n }\r\n\r\n public onExternalError(message: string): void {\r\n this.createError = message || 'Failed to save item.';\r\n }\r\n}\r\n","<div class=\"smart-lookup\">\r\n <div class=\"flex items-end gap-2\">\r\n <div class=\"flex-1\">\r\n <label class=\"block mb-1 text-sm font-medium\" *ngIf=\"label\">\r\n {{ label }}\r\n </label>\r\n\r\n <dx-select-box\r\n [dataSource]=\"items\"\r\n [value]=\"value\"\r\n [valueExpr]=\"valueExpr\"\r\n [displayExpr]=\"displayExpr\"\r\n [searchExpr]=\"searchExpr ?? displayExpr\"\r\n [searchEnabled]=\"true\"\r\n [showClearButton]=\"true\"\r\n [placeholder]=\"placeholder\"\r\n [disabled]=\"disabled\"\r\n [readOnly]=\"readOnly\"\r\n (onValueChanged)=\"onValueChanged($event)\"\r\n >\r\n </dx-select-box>\r\n </div>\r\n\r\n <dx-button\r\n *ngIf=\"allowAdd\"\r\n icon=\"plus\"\r\n [hint]=\"addButtonHint\"\r\n [disabled]=\"disabled || readOnly\"\r\n stylingMode=\"outlined\"\r\n type=\"default\"\r\n (onClick)=\"openCreatePopup()\"\r\n >\r\n </dx-button>\r\n </div>\r\n\r\n <dx-load-panel\r\n [visible]=\"isLoading\"\r\n [showIndicator]=\"true\"\r\n [showPane]=\"true\"\r\n [shading]=\"true\"\r\n ></dx-load-panel>\r\n\r\n<dx-popup\r\n [(visible)]=\"popupVisible\"\r\n [title]=\"createPopupTitle\"\r\n [width]=\"popupWidth\"\r\n [height]=\"popupHeight\"\r\n [minWidth]=\"popupMinWidth\"\r\n [minHeight]=\"popupMinHeight\"\r\n [maxWidth]=\"popupMaxWidth\"\r\n [maxHeight]=\"popupMaxHeight\"\r\n [dragEnabled]=\"true\"\r\n [resizeEnabled]=\"popupResizeEnabled\"\r\n [hideOnOutsideClick]=\"false\"\r\n (onHiding)=\"closeCreatePopup()\"\r\n>\r\n <div class=\"p-3 h-full overflow-auto\">\r\n <ng-container *ngIf=\"createMode === 'content'\">\r\n <ng-container\r\n *ngIf=\"popupVisible && contentTemplate\"\r\n [ngTemplateOutlet]=\"contentTemplate\"\r\n ></ng-container>\r\n <div *ngIf=\"createError\" class=\"mt-3 text-sm\" style=\"color:#b91c1c;\">\r\n {{ createError }}\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"createMode === 'form'\">\r\n <dx-form\r\n #createFormRef\r\n [(formData)]=\"createModel\"\r\n [colCount]=\"1\"\r\n [showColonAfterLabel]=\"false\"\r\n [items]=\"createFormItems\"\r\n ></dx-form>\r\n\r\n <div *ngIf=\"createError\" class=\"mt-3 text-sm\" style=\"color:#b91c1c;\">\r\n {{ createError }}\r\n </div>\r\n\r\n <div class=\"mt-4 flex justify-end gap-2\">\r\n <dx-button\r\n [text]=\"cancelText\"\r\n stylingMode=\"outlined\"\r\n (onClick)=\"closeCreatePopup()\"\r\n ></dx-button>\r\n\r\n <dx-button\r\n [text]=\"saveText\"\r\n type=\"default\"\r\n [disabled]=\"saving\"\r\n (onClick)=\"saveNew()\"\r\n ></dx-button>\r\n </div>\r\n </ng-container>\r\n\r\n </div>\r\n</dx-popup>\r\n\r\n</div>\r\n","import { CommonModule } from '@angular/common';\r\nimport {\r\n ChangeDetectionStrategy,\r\n Component,\r\n ContentChild,\r\n Input,\r\n TemplateRef,\r\n ViewChild,\r\n} from '@angular/core';\r\nimport { DxButtonModule, DxDropDownButtonModule, DxSelectBoxModule } from 'devextreme-angular';\r\nimport type { AppToolbarItemLocation } from './app-toolbar.component';\r\n\r\n@Component({\r\n selector: 'app-toolbar-item',\r\n standalone: true,\r\n imports: [CommonModule, DxButtonModule, DxSelectBoxModule, DxDropDownButtonModule],\r\n templateUrl: './app-toolbar-item.component.html',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class AppToolbarItemComponent {\r\n @Input() location: AppToolbarItemLocation = 'before';\r\n @Input() widget?: string;\r\n @Input() options: any;\r\n\r\n @ContentChild(TemplateRef) projectedTemplate?: TemplateRef<unknown>;\r\n\r\n /**\r\n * CSS class(es) applied to the button via `options.cssClass` (or `options.class`)\r\n * — style it in your own component SCSS exactly like a normal button.\r\n */\r\n get buttonCssClass(): string {\r\n return this.options?.cssClass ?? this.options?.class ?? '';\r\n }\r\n\r\n @ViewChild('itemTemplate', { static: true })\r\n itemTemplate!: TemplateRef<unknown>;\r\n\r\n onButtonClick = (e: any) => {\r\n this.options?.onClick?.(e);\r\n };\r\n\r\n onSelectValueChanged = (e: any) => {\r\n this.options?.onValueChanged?.(e);\r\n };\r\n\r\n onSelectCustomItemCreating = (e: any) => {\r\n this.options?.onCustomItemCreating?.(e);\r\n };\r\n\r\n onDropDownItemClick = (e: any) => {\r\n this.options?.onItemClick?.(e);\r\n };\r\n}\r\n","<ng-template #itemTemplate>\r\n @switch (widget) { @case ('dxButton') {\r\n <dx-button\r\n [ngClass]=\"buttonCssClass\"\r\n [text]=\"options?.text\"\r\n [type]=\"options?.type\"\r\n [stylingMode]=\"options?.stylingMode\"\r\n [icon]=\"options?.icon\"\r\n [hint]=\"options?.hint\"\r\n [disabled]=\"options?.disabled\"\r\n [visible]=\"options?.visible ?? true\"\r\n [elementAttr]=\"options?.elementAttr\"\r\n (onClick)=\"onButtonClick($event)\"\r\n ></dx-button>\r\n } @case ('dxDropDownButton') {\r\n <dx-drop-down-button\r\n [text]=\"options?.text\"\r\n [icon]=\"options?.icon\"\r\n [hint]=\"options?.hint\"\r\n [disabled]=\"options?.disabled\"\r\n [items]=\"options?.items\"\r\n [keyExpr]=\"options?.keyExpr\"\r\n [displayExpr]=\"options?.displayExpr\"\r\n [splitButton]=\"options?.splitButton ?? false\"\r\n [showArrowIcon]=\"options?.showArrowIcon ?? true\"\r\n [dropDownOptions]=\"options?.dropDownOptions\"\r\n (onItemClick)=\"onDropDownItemClick($event)\"\r\n ></dx-drop-down-button>\r\n } @case ('dxSelectBox') {\r\n <dx-select-box\r\n [dataSource]=\"options?.dataSource\"\r\n [displayExpr]=\"options?.displayExpr\"\r\n [valueExpr]=\"options?.valueExpr\"\r\n [placeholder]=\"options?.placeholder\"\r\n [searchEnabled]=\"options?.searchEnabled\"\r\n [acceptCustomValue]=\"options?.acceptCustomValue\"\r\n [showClearButton]=\"options?.showClearButton\"\r\n [width]=\"options?.width\"\r\n [value]=\"options?.value\"\r\n (onValueChanged)=\"onSelectValueChanged($event)\"\r\n (onCustomItemCreating)=\"onSelectCustomItemCreating($event)\"\r\n ></dx-select-box>\r\n } @default {\r\n <ng-container *ngIf=\"projectedTemplate; else projectedContent\">\r\n <ng-container [ngTemplateOutlet]=\"projectedTemplate\"></ng-container>\r\n </ng-container>\r\n <ng-template #projectedContent>\r\n <ng-content></ng-content>\r\n </ng-template>\r\n } }\r\n</ng-template>\r\n","import { CommonModule } from '@angular/common';\r\nimport {\r\n AfterContentInit,\r\n ChangeDetectionStrategy,\r\n Component,\r\n ContentChildren,\r\n Input,\r\n QueryList,\r\n} from '@angular/core';\r\nimport { AppToolbarItemComponent } from './app-toolbar-item.component';\r\n\r\nexport type AppToolbarItemLocation = 'before' | 'after' | 'center';\r\n\r\n@Component({\r\n selector: 'app-toolbar',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './app-toolbar.component.html',\r\n styleUrl: './app-toolbar.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class AppToolbarComponent implements AfterContentInit {\r\n @Input() containerClass = '';\r\n\r\n @ContentChildren(AppToolbarItemComponent)\r\n private readonly projectedItems!: QueryList<AppToolbarItemComponent>;\r\n\r\n items: AppToolbarItemComponent[] = [];\r\n\r\n ngAfterContentInit(): void {\r\n const sync = () => {\r\n this.items = (this.projectedItems?.toArray() ?? []).filter(Boolean);\r\n };\r\n\r\n sync();\r\n this.projectedItems.changes.subscribe(sync);\r\n }\r\n\r\n get beforeItems(): AppToolbarItemComponent[] {\r\n return this.items.filter((x) => (x.location ?? 'before') === 'before');\r\n }\r\n\r\n get centerItems(): AppToolbarItemComponent[] {\r\n return this.items.filter((x) => x.location === 'center');\r\n }\r\n\r\n get afterItems(): AppToolbarItemComponent[] {\r\n return this.items.filter((x) => x.location === 'after');\r\n }\r\n}\r\n","<div class=\"fx-toolbar\" [ngClass]=\"containerClass\">\r\n <div class=\"fx-toolbar__group fx-toolbar__group--before\">\r\n @for (item of beforeItems; track item) {\r\n <ng-container [ngTemplateOutlet]=\"item.itemTemplate\"></ng-container>\r\n }\r\n </div>\r\n\r\n @if (centerItems.length) {\r\n <div class=\"fx-toolbar__group fx-toolbar__group--center\">\r\n @for (item of centerItems; track item) {\r\n <ng-container [ngTemplateOutlet]=\"item.itemTemplate\"></ng-container>\r\n }\r\n </div>\r\n }\r\n\r\n <div class=\"fx-toolbar__group fx-toolbar__group--after\">\r\n @for (item of afterItems; track item) {\r\n <ng-container [ngTemplateOutlet]=\"item.itemTemplate\"></ng-container>\r\n }\r\n </div>\r\n</div>\r\n","import { Component, Input } from '@angular/core';\r\nimport { DxDateBoxModule } from 'devextreme-angular';\r\n\r\n@Component({\r\n selector: 'app-dx-date-box-range',\r\n standalone: true,\r\n imports: [DxDateBoxModule],\r\n templateUrl: './dx-date-box-range.component.html',\r\n styleUrl: './dx-date-box-range.component.scss',\r\n})\r\nexport class DxDateBoxRangeComponent {\r\n @Input() label: string = 'التاريخ';\r\n @Input() fromDate: Date | null = null;\r\n @Input() toDate: Date | null = null;\r\n\r\n // @Output() rangeChanged = new EventEmitter<{ from: Date | null; to: Date | null }>();\r\n\r\n onDateChange() {\r\n // this.rangeChanged.emit({ from: this.fromDate, to: this.toDate });\r\n }\r\n}\r\n","<!-- <p>dx-date-box-range works!</p> -->\r\n<div class=\"date-range-container\">\r\n <!-- <label class=\"main-label\">{{ label }}</label> -->\r\n\r\n <div class=\"date-inputs\">\r\n <dx-date-box\r\n [(value)]=\"toDate\"\r\n type=\"date\"\r\n (onValueChanged)=\"onDateChange()\"\r\n >\r\n </dx-date-box>\r\n\r\n <span class=\"separator\">إلى</span>\r\n\r\n <dx-date-box\r\n [(value)]=\"fromDate\"\r\n type=\"date\"\r\n (onValueChanged)=\"onDateChange()\"\r\n >\r\n </dx-date-box>\r\n </div>\r\n</div>\r\n","import { InjectionToken } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\n\r\nexport interface FormNavigatorPermissions {\r\n canInsert?: boolean; canUpdate?: boolean; canOpen?: boolean; canDelete?: boolean; canPrint?: boolean;\r\n canExecute?: boolean; canExport?: boolean; canImport?: boolean; canQuery?: boolean;\r\n canPrintreport?: boolean; canDesignreport?: boolean; canAssign?: boolean; canShare?: boolean;\r\n canBrowse?: boolean; canLogin?: boolean;\r\n}\r\nexport interface FormNavigatorMessages {\r\n Load_Data_ERROR: string; NOT_FOUND: string; NO_PERMISSION: string; SAVE_ERROR: string;\r\n SAVE_SUCCESS: string; DELETE_ERROR: string; DUPLICATE_ERROR: string;\r\n DUPLICATE_SUCCESS: string; VALIDATION_REQUIRED: string;\r\n}\r\n\r\nexport interface FormNavigatorAdapter {\r\n permissions$: Observable<FormNavigatorPermissions | null>;\r\n loadPermissions(): void;\r\n translate(key: string, fallback: string): string;\r\n /** Optional UI language hint for host components that need localized sample content. */\r\n isArabic?(): boolean;\r\n messages: Readonly<FormNavigatorMessages>;\r\n notify(type: 'success' | 'error' | 'info' | 'warning', message: string): void;\r\n confirm(type: 'delete' | 'duplicate' | 'unsaved'): Promise<boolean>;\r\n beginRecordLoad(): number;\r\n waitForLookups(loadId: number): Promise<void>;\r\n isRecordLoadActive(loadId: number): boolean;\r\n /**\r\n * Optional: lets a lookup editor register an in-flight value resolution with the record\r\n * load so the host can wait for lookups to settle. Returns a completion callback.\r\n */\r\n trackLookup?(): (() => void) | null;\r\n showLoading(message: string): void;\r\n hideLoading(): void;\r\n}\r\n\r\nexport const FORM_NAVIGATOR_ADAPTER = new InjectionToken<FormNavigatorAdapter>('FORM_NAVIGATOR_ADAPTER');\r\n","import { InjectionToken, Provider } from '@angular/core';\r\n\r\nexport interface ReusableComponentsConfig {\r\n apiUrl?: string;\r\n /** Optional app-wide translation hook. Components fall back to the supplied text. */\r\n translate?: (key: string, fallback: string) => string;\r\n /** Optional culture hint used only when content has no language-specific text. */\r\n isArabic?: () => boolean;\r\n}\r\n\r\nexport const REUSABLE_COMPONENTS_CONFIG =\r\n new InjectionToken<ReusableComponentsConfig>('REUSABLE_COMPONENTS_CONFIG');\r\n\r\nexport function provideReusableComponents(\r\n config: ReusableComponentsConfig,\r\n): Provider {\r\n return { provide: REUSABLE_COMPONENTS_CONFIG, useValue: config };\r\n}\r\n","import { Inject, Optional, Pipe, PipeTransform } from '@angular/core';\r\nimport { FORM_NAVIGATOR_ADAPTER, FormNavigatorAdapter } from './form-navigator-adapter';\r\nimport { REUSABLE_COMPONENTS_CONFIG, ReusableComponentsConfig } from '../reusable-components.config';\r\n\r\n/**\r\n * Shared `localize` pipe for every component in the library.\r\n *\r\n * Resolution order: the app-wide `REUSABLE_COMPONENTS_CONFIG.translate` hook, then the\r\n * `FORM_NAVIGATOR_ADAPTER.translate` (so hosts that only wired the navigator keep working),\r\n * then the supplied fallback. Extra arguments replace `{0}`, `{1}`… placeholders.\r\n */\r\n@Pipe({ name: 'localize', standalone: true })\r\nexport class NavigatorLocalizePipe implements PipeTransform {\r\n constructor(\r\n @Optional() @Inject(REUSABLE_COMPONENTS_CONFIG) private config: ReusableComponentsConfig | null,\r\n @Optional() @Inject(FORM_NAVIGATOR_ADAPTER) private adapter: FormNavigatorAdapter | null,\r\n ) {}\r\n\r\n transform(key: string, fallback: string, ...args: unknown[]): string {\r\n let text = this.config?.translate?.(key, fallback) ?? this.adapter?.translate(key, fallback) ?? fallback;\r\n args.forEach((value, index) => {\r\n text = text.split(`{${index}}`).join(String(value ?? ''));\r\n });\r\n return text;\r\n }\r\n}\r\n","import { InjectionToken } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\n\r\nexport interface InfoUserProvider {\r\n getById(id: unknown): Observable<unknown> | Promise<unknown>;\r\n}\r\n\r\nexport const INFO_USER_PROVIDER = new InjectionToken<InfoUserProvider>('INFO_USER_PROVIDER');\r\n","import { CommonModule } from '@angular/common';\r\nimport {\r\n ChangeDetectorRef,\r\n Component,\r\n HostListener,\r\n Inject,\r\n Input,\r\n OnInit,\r\n} from '@angular/core';\r\nimport {\r\n DxButtonModule,\r\n DxDateBoxModule,\r\n DxPopupModule,\r\n DxTextBoxModule,\r\n} from 'devextreme-angular';\r\nimport { firstValueFrom } from 'rxjs';\r\nimport { INFO_USER_PROVIDER, InfoUserProvider } from './info-user-provider';\r\n\r\ninterface InfoDTO {\r\n label?: string;\r\n userName?: string;\r\n date?: any;\r\n}\r\n\r\n@Component({\r\n selector: 'app-info-popup',\r\n standalone: true,\r\n imports: [\r\n DxTextBoxModule,\r\n DxDateBoxModule,\r\n DxPopupModule,\r\n DxButtonModule,\r\n CommonModule,\r\n ],\r\n templateUrl: './info-popup.component.html',\r\n styleUrl: './info-popup.component.scss',\r\n})\r\nexport class InfoPopupComponent implements OnInit {\r\n showInfo = false;\r\n // @Input() creatorId!: number;\r\n // @Input() LastModifierIdId!: number;\r\n // @Input() creationTime?: any;\r\n // @Input() lastModificationTime?: any;\r\n\r\n // Identity boxes (row id / table name) shown at the top of the popup.\r\n // These are populated internally (no @Input) — `rowId` is derived from the\r\n // record handed to `currentObject`; `tableName` is set by the caller that\r\n // opens the popup (e.g. the grid info-button handler in BaseComponent).\r\n showSecuredInfo = false;\r\n rowId: any;\r\n tableName: string = '';\r\n\r\n infoList: InfoDTO[] = [];\r\n popupTitle = 'معلومات السجل';\r\n popupWidth: number | string = 640;\r\n popupHeight: number | string = 'auto';\r\n popupMaxWidth: number | string = 780;\r\n popupMaxHeight: number | string = 560;\r\n popupMinWidth = 360;\r\n popupMinHeight = 260;\r\n isPopupFullScreen = false;\r\n private layoutInitialized = false;\r\n\r\n @Input() set currentObject(dto: any) {\r\n this.ensureLayoutReady();\r\n this.rowId = this.resolveRowId(dto);\r\n this.buildInfoList(dto).then((list) => {\r\n this.infoList = list;\r\n this.showInfo = true;\r\n this.cdr.detectChanges();\r\n });\r\n }\r\n\r\n creatorIdUserName: string = '';\r\n LastModifierIdUserName: string = '';\r\n\r\n constructor(\r\n @Inject(INFO_USER_PROVIDER) private userService: InfoUserProvider,\r\n private cdr: ChangeDetectorRef,\r\n ) {}\r\n\r\n ngOnInit(): void {\r\n this.ensureLayoutReady();\r\n }\r\n\r\n @HostListener('window:resize')\r\n onWindowResize(): void {\r\n this.updatePopupLayout();\r\n }\r\n\r\n getUserNameById(id: any): Promise<string> {\r\n if (!id) {\r\n return Promise.resolve('');\r\n }\r\n const request = this.userService.getById(id);\r\n const result = request instanceof Promise ? request : firstValueFrom(request);\r\n return result\r\n .then((user: any) => user?.userName ?? '')\r\n .catch(() => '');\r\n }\r\n\r\n open() {\r\n this.ensureLayoutReady();\r\n if (!this.showInfo) this.showInfo = true;\r\n }\r\n close() {\r\n if (this.showInfo) this.showInfo = false;\r\n }\r\n onPopupHiding() {\r\n this.showInfo = false;\r\n }\r\n\r\n trackByLabel(index: number, item: InfoDTO): string {\r\n return item.label ?? String(index);\r\n }\r\n\r\n private resolveRowId(dto: any): any {\r\n if (!dto) {\r\n return '';\r\n }\r\n // Prefer a conventional `id` field, then any *_Id / *Id key.\r\n if (dto.id != null) {\r\n return dto.id;\r\n }\r\n const idKey = Object.keys(dto).find((k) => /(^id$|_id$|Id$)/i.test(k));\r\n return idKey ? dto[idKey] : '';\r\n }\r\n\r\n private buildInfoList(dto: any): Promise<InfoDTO[]> {\r\n if (!dto) {\r\n return Promise.resolve([]);\r\n }\r\n\r\n const labelMap: { [key: string]: string } = {\r\n created_By: 'مدخل بواسطة',\r\n created_On: 'تاريخ الإدخال',\r\n modified_By: 'معدل بواسطة',\r\n modified_On: 'تاريخ التعديل',\r\n assigned_By: 'مخصص بواسطة',\r\n assigned_On: 'تاريخ التخصيص',\r\n deleted_By: 'محذوف بواسطة',\r\n deleted_On: 'تاريخ الحذف',\r\n };\r\n\r\n const promises: Promise<InfoDTO>[] = [];\r\n\r\n for (const key of Object.keys(dto)) {\r\n if (labelMap[key]) {\r\n if (key.endsWith('_By')) {\r\n const promise = this.getUserNameById(dto[key]).then((username) => {\r\n return { userName: username, label: labelMap[key] };\r\n });\r\n promises.push(promise);\r\n } else if (key.endsWith('_On')) {\r\n promises.push(\r\n Promise.resolve({ date: dto[key], label: labelMap[key] }),\r\n );\r\n }\r\n }\r\n }\r\n\r\n return Promise.all(promises);\r\n }\r\n\r\n private ensureLayoutReady(): void {\r\n if (!this.layoutInitialized) {\r\n this.updatePopupLayout();\r\n }\r\n }\r\n\r\n private updatePopupLayout(): void {\r\n const viewportWidth =\r\n typeof window === 'undefined' ? 1280 : window.innerWidth;\r\n this.isPopupFullScreen = viewportWidth <= 640;\r\n this.popupWidth = this.isPopupFullScreen ? '94vw' : 640;\r\n this.popupHeight = this.isPopupFullScreen ? 'auto' : 'auto';\r\n this.popupMaxWidth = this.isPopupFullScreen ? '96vw' : 820;\r\n this.popupMaxHeight = this.isPopupFullScreen ? '90vh' : 560;\r\n this.popupMinWidth = this.isPopupFullScreen ? 280 : 360;\r\n this.popupMinHeight = this.isPopupFullScreen ? 220 : 260;\r\n this.layoutInitialized = true;\r\n }\r\n}\r\n","<dx-popup\r\n [(visible)]=\"showInfo\"\r\n [showTitle]=\"true\"\r\n [title]=\"popupTitle\"\r\n [width]=\"popupWidth\"\r\n [height]=\"popupHeight\"\r\n [maxWidth]=\"popupMaxWidth\"\r\n [maxHeight]=\"popupMaxHeight\"\r\n [minWidth]=\"popupMinWidth\"\r\n [minHeight]=\"popupMinHeight\"\r\n [dragEnabled]=\"!isPopupFullScreen\"\r\n [resizeEnabled]=\"!isPopupFullScreen\"\r\n [hideOnOutsideClick]=\"false\"\r\n [showCloseButton]=\"true\"\r\n [shading]=\"true\"\r\n [shadingColor]=\"'var(--overlay-shading-soft)'\"\r\n [wrapperAttr]=\"{ class: 'info-popup' }\"\r\n (onHiding)=\"onPopupHiding()\"\r\n>\r\n <div class=\"info-popup__content\" *ngIf=\"infoList?.length; else emptyState\">\r\n <div class=\"info-popup__grid\" *ngIf=\"showSecuredInfo\">\r\n <div class=\"info-popup__item\">\r\n <span class=\"info-popup__label\">رقم السجل</span>\r\n <dx-text-box\r\n [value]=\"rowId ?? ''\"\r\n [readOnly]=\"true\"\r\n [width]=\"'100%'\"\r\n class=\"info-popup__input\"\r\n >\r\n </dx-text-box>\r\n </div>\r\n\r\n <div class=\"info-popup__item\">\r\n <span class=\"info-popup__label\">اسم الجدول</span>\r\n <dx-text-box\r\n [value]=\"tableName\"\r\n [readOnly]=\"true\"\r\n [width]=\"'100%'\"\r\n class=\"info-popup__input\"\r\n >\r\n </dx-text-box>\r\n </div>\r\n </div>\r\n\r\n <div class=\"info-popup__grid\">\r\n <div\r\n class=\"info-popup__item\"\r\n *ngFor=\"let item of infoList; trackBy: trackByLabel\"\r\n >\r\n <span class=\"info-popup__label\">{{ item.label }}</span>\r\n\r\n @if (item.date) {\r\n <dx-date-box\r\n [value]=\"item.date\"\r\n [readOnly]=\"true\"\r\n [width]=\"'100%'\"\r\n class=\"info-popup__input\"\r\n >\r\n </dx-date-box>\r\n } @else {\r\n <dx-text-box\r\n [value]=\"item.userName ?? ''\"\r\n [readOnly]=\"true\"\r\n [width]=\"'100%'\"\r\n class=\"info-popup__input\"\r\n >\r\n </dx-text-box>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <ng-template #emptyState>\r\n <div class=\"info-popup__empty\">لا توجد بيانات متاحة للعرض.</div>\r\n </ng-template>\r\n</dx-popup>\r\n","import { InjectionToken } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\n\r\nexport interface LookupGridProvider {\r\n getSysLookup(id: any): Observable<any>;\r\n createDataSource(...args: any[]): Promise<any>;\r\n toCamelCase(value: string): string;\r\n createGridColumns(...args: any[]): any[];\r\n}\r\nexport const LOOKUP_GRID_PROVIDER = new InjectionToken<LookupGridProvider>('LOOKUP_GRID_PROVIDER');\r\n\r\nexport enum LookupValueType {\r\n String = 1, Int32 = 2, Int16 = 3, Int64 = 4, Boolean = 5, Byte = 6,\r\n Char = 7, Guid = 8, DateTime = 9, Decimal = 10, Double = 11, Array = 12,\r\n}\r\nexport const LINQ_SELECT_COMMAND_TYPE = 2;\r\n\r\nexport function lookupValueToArray(value: any, valueType?: number): any[] {\r\n if (value == null || value === '') return [];\r\n if (Array.isArray(value)) return value;\r\n if (valueType === LookupValueType.Array) return value;\r\n return typeof value === 'string' && value.includes(',') ? value.split(',').map(x => x.trim()) : [value];\r\n}\r\n","import {\r\n Component,\r\n enableProdMode,\r\n EventEmitter,\r\n Input,\r\n Inject,\r\n Optional,\r\n OnChanges,\r\n OnInit,\r\n Output,\r\n SimpleChanges,\r\n ViewChild,\r\n} from '@angular/core';\r\nimport { DxTemplateModule } from 'devextreme-angular';\r\nimport {\r\n DxDataGridComponent,\r\n DxDataGridModule,\r\n DxDataGridTypes,\r\n} from 'devextreme-angular/ui/data-grid';\r\nimport dxDataGrid from 'devextreme/ui/data_grid';\r\nimport { firstValueFrom } from 'rxjs';\r\nimport { LINQ_SELECT_COMMAND_TYPE, LOOKUP_GRID_PROVIDER, LookupGridProvider } from '../lookup-grid-provider';\r\nimport { REUSABLE_COMPONENTS_CONFIG, ReusableComponentsConfig } from '../reusable-components.config';\r\ntype SysLookupNavigationDto = any;\r\n\r\nif (!/localhost/.test(document.location.host)) {\r\n enableProdMode();\r\n}\r\n\r\nlet modulePrefix = '';\r\n// @ts-ignore\r\nif (window && window.config?.packageConfigPaths) {\r\n modulePrefix = '/app';\r\n}\r\n\r\n@Component({\r\n selector: 'app-lookup-dynamic-grid',\r\n standalone: true,\r\n imports: [DxDataGridModule, DxTemplateModule],\r\n templateUrl: './lookup-dynamic-grid.component.html',\r\n styleUrls: ['./lookup-dynamic-grid.component.scss'], // ✅ تصحيح\r\n})\r\nexport class LookupDynamicGridComponent implements OnInit, OnChanges {\r\n selectedValue: any[] = []; // ✅ تهيئة\r\n columns: any[] = [];\r\n summary: any;\r\n remoteOperations = true;\r\n keyField!: string;\r\n returnField!: string;\r\n gridDataSource: any;\r\n isMultiSelectMode: 'single' | 'multiple' = 'single';\r\n relativeWidth = false;\r\n summaryColumn: string | null = null;\r\n navigationActions: SysLookupNavigationDto[] = [];\r\n\r\n @Input() focusedValue: any = null;\r\n private _focusAppliedOnce = false;\r\n\r\n @Input() isMultiSelect = false;\r\n @Input() lookupId!: string;\r\n @Input() value: any;\r\n @Output() valueChange = new EventEmitter<any>();\r\n @Output() rowDataSelected = new EventEmitter<any>();\r\n @Input() gridTitle?: string;\r\n @Output() gridTitleChange = new EventEmitter<string>();\r\n @Output() exporting = new EventEmitter<DxDataGridTypes.ExportingEvent>();\r\n @Input() applyFilterOnEnter = true;\r\n @Input() dateFormat = 'yyyy-MM-dd';\r\n /** Opt-in: pick the English column fields/titles when the UI is English. Default false keeps Arabic-only. */\r\n @Input() languageAware = false;\r\n @Input() lookupParameterSource: string | number | null = null;\r\n @Input() lookupParameters: string | null = null;\r\n @Input() selectParametersCallback?: () => Record<string, any>;\r\n\r\n @ViewChild('dataGrid', { static: false }) dataGrid?: DxDataGridComponent; // ✅ نوع أدق\r\n\r\n private _initialized = false;\r\n private _dateColumnsResolved = false;\r\n\r\n constructor(\r\n @Inject(LOOKUP_GRID_PROVIDER) private sysLookupService: LookupGridProvider,\r\n @Optional() @Inject(REUSABLE_COMPONENTS_CONFIG) private config?: ReusableComponentsConfig,\r\n ) {}\r\n\r\n onEditorPreparing(e: any): void {\r\n if (!this.applyFilterOnEnter) return;\r\n if (e?.parentType !== 'filterRow') return;\r\n\r\n e.editorOptions = e.editorOptions || {};\r\n // 'change' commits on blur (not on every keystroke); Enter is handled explicitly below.\r\n e.editorOptions.valueChangeEvent = 'change';\r\n\r\n const baseOnEnterKey = e.editorOptions.onEnterKey;\r\n e.editorOptions.onEnterKey = (args: any) => {\r\n // Commit the currently typed text → applies the filter for this column.\r\n e.setValue(args?.component?.option('text'));\r\n baseOnEnterKey?.(args);\r\n };\r\n }\r\n\r\n async ngOnInit(): Promise<void> {\r\n this.isMultiSelectMode = this.isMultiSelect ? 'multiple' : 'single';\r\n if (this.lookupId) {\r\n await this.initGrid();\r\n this._initialized = true;\r\n }\r\n }\r\n\r\n async ngOnChanges(changes: SimpleChanges): Promise<void> {\r\n if (changes['isMultiSelect'] && !changes['isMultiSelect'].firstChange) {\r\n this.isMultiSelectMode = this.isMultiSelect ? 'multiple' : 'single';\r\n }\r\n\r\n if (!this._initialized) return;\r\n\r\n if (\r\n changes['lookupId'] &&\r\n !changes['lookupId'].firstChange &&\r\n changes['lookupId'].currentValue\r\n ) {\r\n await this.initGrid();\r\n }\r\n\r\n // if ((changes['focusedValue'] && !changes['focusedValue'].firstChange)) {\r\n\r\n // setTimeout(() => this.applyFocusByValue(), 0);\r\n // }\r\n\r\n // if (changes['selectParametersCallback'] && !changes['selectParametersCallback'].firstChange) {\r\n // await this.refreshGrid();\r\n // }\r\n }\r\n\r\n private async initGrid(): Promise<void> {\r\n this._dateColumnsResolved = false;\r\n await this.prepareProperties();\r\n\r\n this.gridDataSource = await this.sysLookupService.createDataSource(\r\n this.lookupId,\r\n this.keyField,\r\n true,\r\n this.lookupParameterSource,\r\n this.selectParametersCallback,\r\n this.lookupParameters,\r\n );\r\n }\r\n\r\n onSelectionChanged(_: any) {\r\n const grid = this.dataGrid?.instance as dxDataGrid | undefined;\r\n if (!grid) return;\r\n\r\n const index = grid.option('focusedRowIndex') as number;\r\n if (index === -1) {\r\n return;\r\n }\r\n\r\n const row = grid.getVisibleRows()[index]?.data;\r\n if (row) {\r\n const selectedString = row[this.returnField.trim()];\r\n this.value = selectedString;\r\n this.valueChange.emit(selectedString);\r\n this.rowDataSelected.emit(row);\r\n }\r\n }\r\n\r\n async refreshGrid() {\r\n await this.dataGrid?.instance?.refresh();\r\n }\r\n\r\n clearSelection(): void {\r\n this.selectedValue = [];\r\n this.value = '';\r\n this.valueChange.emit('');\r\n\r\n if (this.dataGrid?.instance) {\r\n this.dataGrid.instance.clearSelection();\r\n this.dataGrid.instance.option('focusedRowIndex', -1);\r\n }\r\n }\r\n\r\n onExporting(e: DxDataGridTypes.ExportingEvent) {\r\n this.exporting.emit(e);\r\n }\r\n\r\n private async prepareProperties(): Promise<void> {\r\n const sysLookup = await firstValueFrom(\r\n this.sysLookupService.getSysLookup(this.lookupId as any),\r\n );\r\n if (!sysLookup) {\r\n this.columns = [];\r\n this.summary = { totalItems: [], groupItems: [] };\r\n this.remoteOperations = false;\r\n return;\r\n }\r\n\r\n const isLinq = sysLookup.select_Command_Type === LINQ_SELECT_COMMAND_TYPE;\r\n // const normalize = (s?: string) => !isLinq ? this.sysLookupService.toCamelCase(s ?? '') : s ?? '';\r\n const normalize = (s?: string) =>\r\n this.sysLookupService.toCamelCase(s ?? '');\r\n\r\n this.keyField = normalize(sysLookup.key_Fields);\r\n this.returnField = normalize(sysLookup.return_Field);\r\n\r\n const useEn = this.languageAware && !(this.config?.isArabic?.() ?? true);\r\n const pick = (en?: string | null, ar?: string | null) =>\r\n (useEn ? (en && en.trim() ? en : ar) : ar) ?? '';\r\n\r\n this.gridTitle = pick(sysLookup.title_En, sysLookup.title_Ar);\r\n this.gridTitleChange.emit(this.gridTitle);\r\n\r\n this.remoteOperations = isLinq;\r\n console.log('Remote Operations: ', this.remoteOperations);\r\n this.navigationActions = sysLookup.navigationActions ?? [];\r\n\r\n this.columns = this.sysLookupService.createGridColumns(\r\n pick(sysLookup.column_Fields_En, sysLookup.column_Fields_Ar),\r\n pick(sysLookup.column_Titles_En, sysLookup.column_Titles_Ar),\r\n sysLookup.column_Widths ?? '',\r\n sysLookup.select_Command_Type,\r\n this.relativeWidth,\r\n );\r\n\r\n // Mark columns that have a navigation action so the template renders them as links.\r\n if (this.navigationActions.length) {\r\n const clickableFields = new Set(\r\n this.navigationActions.map((a) =>\r\n this.sysLookupService.toCamelCase(a.clickable_Field_Name),\r\n ),\r\n );\r\n this.columns = this.columns.map((col) =>\r\n clickableFields.has(col.dataField)\r\n ? { ...col, cellTemplate: 'navigableCell' }\r\n : col,\r\n );\r\n }\r\n\r\n console.log('Columns : ', this.columns);\r\n\r\n const countColumn =\r\n this.columns?.[1]?.dataField ?? this.columns?.[0]?.dataField ?? 'id';\r\n this.summary = {\r\n totalItems: [\r\n {\r\n column: countColumn,\r\n summaryType: 'count',\r\n displayFormat: 'العدد: {0}',\r\n },\r\n ],\r\n groupItems: [\r\n {\r\n column: 'id',\r\n summaryType: 'count',\r\n displayFormat: 'العدد: {0}',\r\n },\r\n ],\r\n };\r\n }\r\n\r\n async onContentReady() {\r\n const grid = this.dataGrid?.instance as dxDataGrid | undefined;\r\n\r\n // DEBUG: every reload prints the actual filterRow option vs. what we expect, plus the current\r\n // filter — so we can see whether applyFilter is really 'onClick' and whether each keystroke loads.\r\n console.log('[lookup-debug] onContentReady', {\r\n remoteOperations: grid?.option('remoteOperations'),\r\n filterRow_applyFilter: grid?.option('filterRow.applyFilter'),\r\n filterRow_visible: grid?.option('filterRow.visible'),\r\n applyFilterOnEnter: this.applyFilterOnEnter,\r\n currentFilterValue: grid?.option('filterValue'),\r\n currentFilter: grid?.option('filter'),\r\n });\r\n\r\n this.resolveDateColumns(grid);\r\n\r\n if (!grid || this.focusedValue == null) {\r\n return;\r\n }\r\n\r\n grid.option('focusedRowKey', this.focusedValue);\r\n }\r\n\r\n private resolveDateColumns(grid?: dxDataGrid): void {\r\n if (this._dateColumnsResolved || !grid) return;\r\n\r\n const rows = grid.getVisibleRows?.() ?? [];\r\n const dataRows = rows.filter((r) => r?.rowType === 'data' && r?.data);\r\n\r\n const isoDateString = /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}/;\r\n const dateFieldName = /date$/i;\r\n\r\n for (const col of this.columns) {\r\n if (col.dataType || !col.dataField) continue;\r\n\r\n const sample = dataRows\r\n .map((r) => r.data[col.dataField])\r\n .find((v) => v != null && v !== '');\r\n\r\n const sampleIsDate =\r\n typeof sample === 'string' && isoDateString.test(sample);\r\n const isDate =\r\n sampleIsDate || (dateFieldName.test(col.dataField) && sample == null);\r\n\r\n if (isDate) {\r\n col.dataType = 'date';\r\n col.format = this.dateFormat;\r\n grid.columnOption(col.dataField, {\r\n dataType: 'date',\r\n format: this.dateFormat,\r\n });\r\n }\r\n }\r\n\r\n // Lock in only once we've actually seen data, so sample-based columns get a fair chance.\r\n if (dataRows.length) this._dateColumnsResolved = true;\r\n }\r\n\r\n private async focusByValue() {\r\n const grid = this.dataGrid?.instance as dxDataGrid | undefined;\r\n if (!grid || this.focusedValue == null) {\r\n await this.resetToFirstPage();\r\n return;\r\n }\r\n\r\n const field = this.returnField as string;\r\n const ds: any = grid.getDataSource();\r\n if (!ds) return;\r\n\r\n const store: any = ds.store?.() ?? ds;\r\n const loader = store?.load ? store : ds;\r\n\r\n loader\r\n .load({ filter: [field, '=', this.focusedValue], take: 1 })\r\n .then(async (items: any[]) => {\r\n if (!items?.length) return;\r\n const row = items[0];\r\n const keyVal = row[this.keyField];\r\n if (keyVal === undefined) return;\r\n\r\n // 3️⃣ Compute which page that record is in and jump to it\r\n const totalCount = (await ds.totalCount?.()) ?? 0;\r\n const rowIndex = await grid.getRowIndexByKey(keyVal);\r\n\r\n if (rowIndex >= 0 && totalCount > 0) {\r\n const pageSize = ds.pageSize?.() ?? 20;\r\n const targetPage = Math.floor(rowIndex / pageSize);\r\n\r\n if (typeof ds.pageIndex === 'function') {\r\n ds.pageIndex(targetPage);\r\n await ds.reload();\r\n }\r\n }\r\n\r\n // 4️⃣ Focus and navigate after reload\r\n this.focusAndNavigateWhenReady(keyVal);\r\n })\r\n .catch(() => {});\r\n }\r\n\r\n private focusAndNavigateWhenReady(keyVal: any) {\r\n const grid = this.dataGrid?.instance!;\r\n const ds: any = grid.getDataSource();\r\n\r\n grid.option('focusedRowKey', keyVal);\r\n //grid.navigateToRow(keyVal);\r\n const doNavigate = () => {\r\n grid.navigateToRow(keyVal);\r\n //grid.selectRows([keyVal], false);\r\n //this.selectedValue = [keyVal];\r\n };\r\n\r\n if (ds?.isLoading?.()) {\r\n const handler = () => {\r\n ds.off?.('changed', handler);\r\n setTimeout(doNavigate, 0);\r\n };\r\n ds.on?.('changed', handler);\r\n } else {\r\n setTimeout(doNavigate, 0);\r\n }\r\n }\r\n\r\n private async resetToFirstPage() {\r\n const grid = this.dataGrid?.instance as dxDataGrid | undefined;\r\n const ds: any = grid?.getDataSource?.();\r\n if (!ds || typeof ds.pageIndex !== 'function') return;\r\n\r\n if (ds.pageIndex() !== 0) {\r\n ds.pageIndex(0);\r\n await ds.reload();\r\n }\r\n\r\n grid?.option?.('focusedRowKey', null);\r\n this.selectedValue = [];\r\n }\r\n\r\n getNavigationActionForField(\r\n dataField: string,\r\n ): SysLookupNavigationDto | null {\r\n return (\r\n this.navigationActions.find(\r\n (a) =>\r\n this.sysLookupService.toCamelCase(a.clickable_Field_Name) ===\r\n dataField,\r\n ) ?? null\r\n );\r\n }\r\n\r\n openNavigationAction(\r\n action: SysLookupNavigationDto | null,\r\n rowData: any,\r\n ): void {\r\n if (!action?.url_Template || !rowData) return;\r\n\r\n const keyField = this.sysLookupService.toCamelCase(action.key_Field_Name);\r\n const fallbackKeyValue = rowData?.[keyField];\r\n\r\n const url = action.url_Template.replace(/\\{(\\w+)\\}/g, (match: string, field: string) => {\r\n if (field === 'key') {\r\n return fallbackKeyValue != null\r\n ? encodeURIComponent(String(fallbackKeyValue))\r\n : match;\r\n }\r\n const camelField = this.sysLookupService.toCamelCase(field);\r\n const value = rowData?.[camelField] ?? rowData?.[field];\r\n return value != null ? encodeURIComponent(String(value)) : match;\r\n });\r\n\r\n if (action.open_Mode === 'sameTab') {\r\n window.location.href = url;\r\n return;\r\n }\r\n window.open(url, '_blank', 'noopener,noreferrer');\r\n }\r\n\r\n /*\r\n private async applyFocusByValue() {\r\n const grid = this.dataGrid?.instance as dxDataGrid | undefined;\r\n if (!grid) return;\r\n\r\n const ds: any = grid.getDataSource?.();\r\n if (!ds) return;\r\n\r\n const field = this.returnField as string;\r\n\r\n // If there's no focused value => always reset to page 1\r\n if (!this.focusedValue || this.focusedValue === '') {\r\n await this.resetToFirstPage();\r\n return;\r\n }\r\n\r\n // 1️⃣ Try visible rows first\r\n const visible = grid.getVisibleRows();\r\n const idx = visible.findIndex(r => r?.data?.[field] === this.focusedValue);\r\n if (idx >= 0) {\r\n const keyVal = visible[idx].data?.[this.keyField];\r\n if (keyVal !== undefined) {\r\n await this.goToKeyPage(keyVal);\r\n return;\r\n }\r\n }\r\n\r\n // 2️⃣ Not visible → load the record by filter and jump to its page\r\n const store: any = ds.store?.() ?? ds;\r\n const loader = store?.load ? store : ds;\r\n\r\n try {\r\n const items = await loader.load({\r\n filter: [field, '=', this.focusedValue],\r\n take: 1,\r\n requireTotalCount: false\r\n });\r\n\r\n const row = items?.[0];\r\n const keyVal = row?.[this.keyField];\r\n\r\n if (keyVal === undefined) {\r\n // not found — open page 1\r\n await this.resetToFirstPage();\r\n return;\r\n }\r\n\r\n await this.goToKeyPage(keyVal);\r\n } catch {\r\n // On any error, just go to page 1\r\n await this.resetToFirstPage();\r\n }\r\n }\r\n\r\n private async goToKeyPage(keyVal: any) {\r\n const grid = this.dataGrid?.instance!;\r\n const ds: any = grid.getDataSource();\r\n if (!ds) return;\r\n\r\n const rowIndex = await grid.getRowIndexByKey(keyVal);\r\n const pageSize = ds.pageSize?.() ?? 9; // match <dxo-paging [pageSize]=\"9\">\r\n const targetPage = Math.floor((rowIndex >= 0 ? rowIndex : 0) / pageSize);\r\n\r\n if (typeof ds.pageIndex === 'function') {\r\n ds.pageIndex(targetPage);\r\n await ds.reload();\r\n }\r\n\r\n // Focus and highlight row after reload\r\n grid.option('focusedRowKey', keyVal);\r\n grid.navigateToRow(keyVal);\r\n grid.selectRows([keyVal], false);\r\n this.selectedValue = [keyVal];\r\n }*/\r\n}\r\n","<!-- [wordWrapEnabled]=\"true\" -->\r\n<dx-data-grid\r\n #dataGrid\r\n [width]=\"'100%'\"\r\n [dataSource]=\"gridDataSource\"\r\n [columns]=\"columns\"\r\n [summary]=\"summary\"\r\n title=\"gridTitle\"\r\n [showBorders]=\"true\"\r\n [remoteOperations]=\"true\"\r\n [hoverStateEnabled]=\"true\"\r\n [allowColumnResizing]=\"true\"\r\n columnResizingMode=\"widget\"\r\n [keyExpr]=\"keyField\"\r\n [focusedRowEnabled]=\"true\"\r\n [autoNavigateToFocusedRow]=\"true\"\r\n (onEditorPreparing)=\"onEditorPreparing($event)\"\r\n (onContentReady)=\"onContentReady()\"\r\n (onSelectionChanged)=\"onSelectionChanged($event)\"\r\n [(selectedRowKeys)]=\"selectedValue\"\r\n (onExporting)=\"onExporting($event)\"\r\n [export]=\"{\r\n enabled: true,\r\n formats: ['xlsx', 'pdf'],\r\n allowExportSelectedData: true,\r\n }\"\r\n>\r\n <dxo-toolbar>\r\n <dxi-item name=\"exportButton\" location=\"after\"></dxi-item>\r\n <dxi-item name=\"searchPanel\" location=\"after\"></dxi-item>\r\n <dxi-item\r\n location=\"after\"\r\n widget=\"dxButton\"\r\n [options]=\"{\r\n icon: 'refresh',\r\n hint: 'تحديث البيانات',\r\n onClick: refreshGrid,\r\n }\"\r\n ></dxi-item>\r\n </dxo-toolbar>\r\n <dxo-filter-row [visible]=\"true\"></dxo-filter-row>\r\n <dxo-header-filter [visible]=\"false\"></dxo-header-filter>\r\n <dxo-paging [pageSize]=\"5\"></dxo-paging>\r\n <dxo-selection [mode]=\"isMultiSelectMode\"></dxo-selection>\r\n\r\n <dxo-export\r\n [enabled]=\"true\"\r\n [formats]=\"['pdf', 'excel']\"\r\n [allowExportSelectedData]=\"true\"\r\n ></dxo-export>\r\n\r\n <div *dxTemplate=\"let cell of 'navigableCell'\">\r\n <a\r\n href=\"javascript:void(0)\"\r\n (click)=\"\r\n openNavigationAction(\r\n getNavigationActionForField(cell.column.dataField),\r\n cell.data\r\n )\r\n \"\r\n style=\"\r\n color: var(--bs-link-color, #0d6efd);\r\n cursor: pointer;\r\n text-decoration: underline;\r\n \"\r\n >{{ cell.value }}</a\r\n >\r\n </div>\r\n</dx-data-grid>\r\n","import {\r\n ChangeDetectorRef,\r\n Component,\r\n EventEmitter,\r\n Output,\r\n ViewChild,\r\n} from '@angular/core';\r\nimport {\r\n DxButtonModule,\r\n DxDataGridModule,\r\n DxPopupModule,\r\n DxTemplateModule,\r\n DxToolbarModule,\r\n} from 'devextreme-angular';\r\nimport { Guid } from 'devextreme/common';\r\nimport { LookupDynamicGridComponent } from '../lookup-dynamic-grid/lookup-dynamic-grid.component';\r\n\r\n/**\r\n * Faithful port of Flexora's original lookup popup: a thin shell around\r\n * LookupDynamicGridComponent, which supplies the full search experience\r\n * (search panel, filter row, metadata-driven columns/widths, paging,\r\n * focused-value navigation, double-click selection). An earlier library\r\n * rewrite replaced this with a bare dx-data-grid fed by LOOKUP_DATA_PROVIDER\r\n * — losing the filter row, the metadata column widths, and the full-width\r\n * layout — which is why the popup suddenly looked degraded on every screen.\r\n */\r\n@Component({\r\n selector: 'lookup-popup, app-lookup-popup',\r\n standalone: true,\r\n imports: [\r\n LookupDynamicGridComponent,\r\n DxDataGridModule,\r\n DxPopupModule,\r\n DxButtonModule,\r\n DxTemplateModule,\r\n DxToolbarModule,\r\n ],\r\n templateUrl: './lookup-popup.component.html',\r\n styleUrl: './lookup-popup.component.scss',\r\n})\r\nexport class LookupPopupComponent {\r\n lookupId: any;\r\n selectParameters: any;\r\n popupVisible!: boolean;\r\n selectedValue: any;\r\n selectedRowData: any = null;\r\n popupTitle: string = 'tilte';\r\n @Output() lookupPopupVisibleChange = new EventEmitter<boolean>();\r\n @Output() selectedValueChanged = new EventEmitter<boolean>();\r\n /** Forwarded to the popup grid: pick English columns/titles when the UI is English.\r\n * Set by the host (e.g. app-lookup-edit); default false = legacy Arabic behavior. */\r\n languageAware = false;\r\n focusedValue?: any;\r\n getResultCallback!: (result: any) => void;\r\n lookupParameterSource: string | number | null = null;\r\n lookupParameters: string | null = null;\r\n selectParametersCallback?: () => Record<string, any>;\r\n\r\n closeButtonOptions: Record<string, unknown>;\r\n showButtonOptions: Record<string, unknown>;\r\n\r\n @ViewChild(LookupDynamicGridComponent)\r\n dynamicGrid!: LookupDynamicGridComponent;\r\n\r\n constructor(private cdr: ChangeDetectorRef) {\r\n // Stable option objects — inline template objects would be recreated on\r\n // every change-detection cycle and DevExtreme would rebuild the buttons.\r\n this.closeButtonOptions = {\r\n text: 'خروج',\r\n stylingMode: 'outlined',\r\n type: 'normal',\r\n onClick: this.closePopup.bind(this),\r\n };\r\n\r\n this.showButtonOptions = {\r\n text: 'عرض',\r\n stylingMode: 'outlined',\r\n type: 'normal',\r\n onClick: this.onShowClick.bind(this),\r\n };\r\n }\r\n\r\n openLookupPopup(\r\n lookupId: Guid,\r\n getResultCallback: (result: any) => void,\r\n lookupParameterSource: string | number | null = null,\r\n lookupParameters: string | null = null,\r\n selectParametersCallback?: () => Record<string, any>,\r\n valueToFocus: any = null,\r\n ): void {\r\n this.lookupId = lookupId;\r\n this.lookupParameterSource = lookupParameterSource;\r\n this.lookupParameters = lookupParameters;\r\n this.selectParametersCallback = selectParametersCallback;\r\n this.getResultCallback = getResultCallback;\r\n\r\n this.focusedValue = valueToFocus;\r\n\r\n this.popupVisible = true;\r\n this.lookupPopupVisibleChange.emit(this.popupVisible);\r\n this.cdr.detectChanges();\r\n }\r\n\r\n closePopup(): void {\r\n this.selectedValue = '';\r\n this.selectedRowData = null;\r\n if (this.dynamicGrid) {\r\n this.dynamicGrid.clearSelection();\r\n }\r\n\r\n this.popupVisible = false;\r\n this.lookupPopupVisibleChange.emit(this.popupVisible);\r\n }\r\n\r\n onPopupShown(): void {\r\n if (this.dynamicGrid) {\r\n this.dynamicGrid.refreshGrid();\r\n }\r\n }\r\n\r\n onShowClick(): void {\r\n const result = {\r\n selectedValue: this.selectedValue,\r\n selectedRowData: this.selectedRowData,\r\n type: 'input',\r\n };\r\n\r\n if (this.getResultCallback) {\r\n this.getResultCallback(result);\r\n }\r\n\r\n this.closePopup();\r\n }\r\n}\r\n","<dx-popup\r\n [(visible)]=\"popupVisible\"\r\n [width]=\"900\"\r\n [height]=\"650\"\r\n [resizeEnabled]=\"true\"\r\n [showTitle]=\"true\"\r\n [dragEnabled]=\"true\"\r\n [hideOnOutsideClick]=\"true\"\r\n (onHiding)=\"closePopup()\"\r\n (onShown)=\"onPopupShown()\"\r\n>\r\n <div *dxTemplate=\"let data of 'content'\" style=\"width: 100%; height: 100%\">\r\n <app-lookup-dynamic-grid\r\n [lookupId]=\"lookupId\"\r\n [lookupParameterSource]=\"lookupParameterSource\"\r\n [lookupParameters]=\"lookupParameters\"\r\n [selectParametersCallback]=\"selectParametersCallback\"\r\n [isMultiSelect]=\"false\"\r\n [(value)]=\"selectedValue\"\r\n (rowDataSelected)=\"selectedRowData=$event\"\r\n [focusedValue]=\"focusedValue\"\r\n [languageAware]=\"languageAware\"\r\n [(gridTitle)]=\"popupTitle\"\r\n ></app-lookup-dynamic-grid>\r\n </div>\r\n\r\n <dxi-popup-toolbar-item toolbar=\"top\">\r\n <div class=\"popup-title-center\">\r\n {{ popupTitle }}\r\n </div>\r\n </dxi-popup-toolbar-item>\r\n <dxi-popup-toolbar-item\r\n widget=\"dxButton\"\r\n toolbar=\"bottom\"\r\n location=\"after\"\r\n [options]=\"showButtonOptions\"\r\n >\r\n </dxi-popup-toolbar-item>\r\n <dxi-popup-toolbar-item\r\n widget=\"dxButton\"\r\n toolbar=\"bottom\"\r\n location=\"after\"\r\n [options]=\"closeButtonOptions\"\r\n >\r\n </dxi-popup-toolbar-item>\r\n</dx-popup>\r\n","import { InjectionToken } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\n\r\nexport interface SubscriptionPrefs {\r\n notifyOnUpdate: boolean; notifyOnStatusChange: boolean; notifyOnDelete: boolean;\r\n channelInApp: boolean; channelEmail: boolean; channelWhatsapp: boolean; channelSms: boolean;\r\n}\r\nexport interface RecordSubscriptionItem {\r\n record_Id: string; notify_On_Update: boolean; notify_On_Status_Change: boolean; notify_On_Delete: boolean;\r\n channel_In_App: boolean; channel_Email: boolean; channel_Whatsapp: boolean; channel_Sms: boolean;\r\n}\r\nexport interface RecordSubscriptionProvider {\r\n isSubscribed(recordId: string): Observable<boolean>;\r\n getMine(): Observable<RecordSubscriptionItem[]>;\r\n subscribe(recordId: string, prefs: SubscriptionPrefs): Observable<unknown>;\r\n unsubscribe(recordId: string): Observable<unknown>;\r\n}\r\nexport const RECORD_SUBSCRIPTION_PROVIDER = new InjectionToken<RecordSubscriptionProvider>('RECORD_SUBSCRIPTION_PROVIDER');\r\n","import { ChangeDetectionStrategy, Component, Input } from '@angular/core';\r\n\r\n/**\r\n * Icon name supported by {@link FnIconComponent}.\r\n * Mirrors the FormNavigator toolbar actions.\r\n */\r\nexport type FnIconName =\r\n | 'first'\r\n | 'prev'\r\n | 'next'\r\n | 'last'\r\n | 'new'\r\n | 'save'\r\n | 'delete'\r\n | 'search'\r\n | 'duplicate'\r\n | 'cancel'\r\n | 'refresh'\r\n | 'info'\r\n | 'print'\r\n | 'bell'\r\n | 'bell-outline';\r\n\r\n/** Semantic accent. Drives which theme token tints the soft-3D gradient. */\r\nexport type FnIconAccent =\r\n | 'primary'\r\n | 'success'\r\n | 'danger'\r\n | 'warning'\r\n | 'neutral';\r\n\r\n/**\r\n * Soft-3D, theme-tinted icon used by the FormNavigator toolbar.\r\n *\r\n * Rendering technique (all in SCSS, zero runtime cost):\r\n * - the glyph silhouette is a CSS `mask` (a data-URI SVG, one per `name`);\r\n * - the visible fill is a vertical `linear-gradient` built from the active\r\n * theme tokens (`--color-primary` / `--color-success` / `--color-danger`),\r\n * so it recolors automatically with every preset and with dark mode;\r\n * - depth comes from a top highlight + bottom drop-shadow.\r\n *\r\n * Because the colors are derived from CSS variables, nothing here needs to know\r\n * about the current preset — switching `data-app-theme` or `.dark` just works.\r\n */\r\n@Component({\r\n selector: 'app-fn-icon',\r\n standalone: true,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n template: `<span\r\n class=\"fn-icon i-{{ name }} accent-{{ accent }}\"\r\n [class.directional]=\"directional\"\r\n aria-hidden=\"true\"\r\n ></span>`,\r\n styleUrl: './fn-icon.component.scss',\r\n})\r\nexport class FnIconComponent {\r\n /** Which glyph to render. */\r\n @Input({ required: true }) name!: FnIconName;\r\n\r\n /** Semantic tint. Defaults to the brand primary. */\r\n @Input() accent: FnIconAccent = 'primary';\r\n\r\n /**\r\n * When true the glyph is horizontally mirrored under `[dir=\"rtl\"]`.\r\n * Used by the navigation arrows (first/prev/next/last) so they keep pointing\r\n * toward the logical start/end in right-to-left layouts.\r\n */\r\n @Input() directional = false;\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport {\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n Input,\r\n OnChanges,\r\n SimpleChanges,\r\n inject,\r\n} from '@angular/core';\r\nimport {\r\n DxButtonModule,\r\n DxCheckBoxModule,\r\n DxLoadIndicatorModule,\r\n DxPopupModule,\r\n} from 'devextreme-angular';\r\n\r\nimport { NavigatorLocalizePipe } from '../form-navigator/navigator-localize.pipe';\r\nimport { RECORD_SUBSCRIPTION_PROVIDER, RecordSubscriptionProvider, SubscriptionPrefs } from './record-subscription-provider';\r\nimport { FnIconComponent } from '../form-navigator/fn-icon/fn-icon.component';\r\n\r\nconst defaultPrefs = (): SubscriptionPrefs => ({\r\n notifyOnUpdate: true,\r\n notifyOnStatusChange: true,\r\n notifyOnDelete: true,\r\n channelInApp: true,\r\n channelEmail: false,\r\n channelWhatsapp: false,\r\n channelSms: false,\r\n});\r\n\r\n@Component({\r\n selector: 'app-subscribe-button',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n DxButtonModule,\r\n DxPopupModule,\r\n DxCheckBoxModule,\r\n DxLoadIndicatorModule,\r\n NavigatorLocalizePipe,\r\n FnIconComponent,\r\n ],\r\n templateUrl: './subscribe-button.component.html',\r\n styleUrls: ['./subscribe-button.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class SubscribeButtonComponent implements OnChanges {\r\n @Input() recordId!: string;\r\n /** Hide the \"تغيير الحالة\" checkbox when the entity has no status workflow */\r\n @Input() showStatusChange: boolean = true;\r\n\r\n isSubscribed = false;\r\n loading = false;\r\n showPopup = false;\r\n popupLoading = false;\r\n validationError: string | null = null;\r\n\r\n prefs: SubscriptionPrefs = defaultPrefs();\r\n\r\n private readonly svc = inject(RECORD_SUBSCRIPTION_PROVIDER);\r\n private readonly cdr = inject(ChangeDetectorRef);\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['recordId'] && this.recordId) {\r\n this.refresh();\r\n }\r\n }\r\n\r\n private refresh(): void {\r\n this.loading = true;\r\n\r\n this.svc.isSubscribed(this.recordId).subscribe({\r\n next: (v) => {\r\n this.isSubscribed = !!v;\r\n this.loading = false;\r\n this.cdr.markForCheck();\r\n },\r\n error: () => {\r\n this.loading = false;\r\n this.cdr.markForCheck();\r\n },\r\n });\r\n }\r\n\r\n onBellClick(): void {\r\n if (!this.recordId || this.loading) return;\r\n\r\n this.validationError = null;\r\n\r\n if (this.isSubscribed) {\r\n this.popupLoading = true;\r\n this.showPopup = true;\r\n this.cdr.markForCheck();\r\n\r\n this.svc.getMine().subscribe({\r\n next: (subs) => {\r\n const found = subs.find((s) => s.record_Id === this.recordId);\r\n\r\n this.prefs = found\r\n ? {\r\n notifyOnUpdate: found.notify_On_Update,\r\n notifyOnStatusChange: this.showStatusChange ? found.notify_On_Status_Change : false,\r\n notifyOnDelete: found.notify_On_Delete,\r\n channelInApp: found.channel_In_App,\r\n channelEmail: found.channel_Email,\r\n channelWhatsapp: found.channel_Whatsapp,\r\n channelSms: found.channel_Sms,\r\n }\r\n : defaultPrefs();\r\n\r\n this.popupLoading = false;\r\n this.cdr.markForCheck();\r\n },\r\n error: () => {\r\n this.prefs = defaultPrefs();\r\n this.popupLoading = false;\r\n this.cdr.markForCheck();\r\n },\r\n });\r\n } else {\r\n this.prefs = defaultPrefs();\r\n this.showPopup = true;\r\n this.cdr.markForCheck();\r\n }\r\n }\r\n\r\n onConfirmSubscribe(): void {\r\n this.validationError = null;\r\n\r\n // Always clear status-change flag when the entity has no status workflow\r\n if (!this.showStatusChange) {\r\n this.prefs.notifyOnStatusChange = false;\r\n }\r\n\r\n const hasEvent =\r\n this.prefs.notifyOnUpdate ||\r\n this.prefs.notifyOnStatusChange ||\r\n this.prefs.notifyOnDelete;\r\n\r\n const hasChannel =\r\n this.prefs.channelInApp ||\r\n this.prefs.channelEmail ||\r\n this.prefs.channelWhatsapp ||\r\n this.prefs.channelSms;\r\n\r\n if (!hasEvent) {\r\n this.validationError = 'يجب تحديد حدث واحد على الأقل للإشعار';\r\n this.cdr.markForCheck();\r\n return;\r\n }\r\n\r\n if (!hasChannel) {\r\n this.validationError = 'يجب تحديد قناة إشعار واحدة على الأقل';\r\n this.cdr.markForCheck();\r\n return;\r\n }\r\n\r\n this.loading = true;\r\n\r\n this.svc.subscribe(this.recordId, this.prefs).subscribe({\r\n next: () => {\r\n this.isSubscribed = true;\r\n this.loading = false;\r\n this.showPopup = false;\r\n this.cdr.markForCheck();\r\n },\r\n error: () => {\r\n this.loading = false;\r\n this.cdr.markForCheck();\r\n },\r\n });\r\n }\r\n\r\n onUnsubscribe(): void {\r\n this.loading = true;\r\n\r\n this.svc.unsubscribe(this.recordId).subscribe({\r\n next: () => {\r\n this.isSubscribed = false;\r\n this.loading = false;\r\n this.showPopup = false;\r\n this.prefs = defaultPrefs();\r\n this.cdr.markForCheck();\r\n },\r\n error: () => {\r\n this.loading = false;\r\n this.cdr.markForCheck();\r\n },\r\n });\r\n }\r\n\r\n triggerOpen(recordId: string): void {\r\n if (this.loading) return;\r\n\r\n this.recordId = recordId;\r\n this.validationError = null;\r\n this.cdr.markForCheck();\r\n\r\n this.loading = true;\r\n\r\n this.svc.isSubscribed(recordId).subscribe({\r\n next: (subscribed) => {\r\n this.isSubscribed = subscribed;\r\n this.loading = false;\r\n this.cdr.markForCheck();\r\n this.onBellClick();\r\n },\r\n error: () => {\r\n this.isSubscribed = false;\r\n this.loading = false;\r\n this.cdr.markForCheck();\r\n this.onBellClick();\r\n },\r\n });\r\n }\r\n}\r\n","<ng-container *ngIf=\"recordId\">\r\n <!-- Bare tool; when subscribed the bell takes the warning (amber) tone through `type`\r\n (the icon is currentColor now — the button paints it). -->\r\n <dx-button\r\n stylingMode=\"text\"\r\n [type]=\"isSubscribed ? 'warning' : 'normal'\"\r\n [elementAttr]=\"{\r\n class: (isSubscribed ? 'sub-btn-active' : 'sub-btn-idle') + ' fx-round'\r\n }\"\r\n [hint]=\"\r\n isSubscribed\r\n ? ('subscription.settings' | localize: 'إعدادات الاشتراك')\r\n : ('subscription.subscribe' | localize: 'اشترك لتصلك التحديثات')\r\n \"\r\n [disabled]=\"loading\"\r\n (onClick)=\"onBellClick()\"\r\n >\r\n <!-- Always the primary (preset-adaptive) gradient; subscribed vs idle is\r\n conveyed by the filled vs outline glyph, not by color. -->\r\n <app-fn-icon\r\n [name]=\"isSubscribed ? 'bell' : 'bell-outline'\"\r\n accent=\"warning\"\r\n ></app-fn-icon>\r\n </dx-button>\r\n\r\n <dx-popup\r\n [(visible)]=\"showPopup\"\r\n [title]=\"\r\n isSubscribed\r\n ? ('subscription.settings' | localize: 'إعدادات الاشتراك')\r\n : ('subscription.new' | localize: 'اشتراك جديد')\r\n \"\r\n [width]=\"340\"\r\n [height]=\"'auto'\"\r\n [showCloseButton]=\"true\"\r\n [dragEnabled]=\"false\"\r\n [shading]=\"true\"\r\n >\r\n <div *dxTemplate=\"let _ of 'content'\" class=\"sub-content\">\r\n <div *ngIf=\"popupLoading\" class=\"sub-loading\">\r\n <dx-load-indicator [visible]=\"true\"></dx-load-indicator>\r\n </div>\r\n\r\n <ng-container *ngIf=\"!popupLoading\">\r\n <div class=\"sub-group\">\r\n <div class=\"sub-group-title\">\r\n {{ 'subscription.notifyOn' | localize: 'إشعار عند' }}\r\n </div>\r\n\r\n <dx-check-box\r\n [(value)]=\"prefs.notifyOnUpdate\"\r\n [text]=\"'subscription.update' | localize: 'التعديل'\"\r\n ></dx-check-box>\r\n\r\n <dx-check-box\r\n *ngIf=\"showStatusChange\"\r\n [(value)]=\"prefs.notifyOnStatusChange\"\r\n [text]=\"'subscription.statusChange' | localize: 'تغيير الحالة'\"\r\n ></dx-check-box>\r\n\r\n <dx-check-box\r\n [(value)]=\"prefs.notifyOnDelete\"\r\n [text]=\"'subscription.delete' | localize: 'الحذف'\"\r\n ></dx-check-box>\r\n </div>\r\n\r\n <div class=\"sub-group\">\r\n <div class=\"sub-group-title\">\r\n {{ 'subscription.channel' | localize: 'قناة الإشعار' }}\r\n </div>\r\n\r\n <dx-check-box\r\n [(value)]=\"prefs.channelInApp\"\r\n [text]=\"'subscription.inApp' | localize: 'داخل التطبيق'\"\r\n ></dx-check-box>\r\n\r\n <dx-check-box\r\n [(value)]=\"prefs.channelEmail\"\r\n [text]=\"'subscription.email' | localize: 'البريد الإلكتروني'\"\r\n ></dx-check-box>\r\n\r\n <dx-check-box\r\n [(value)]=\"prefs.channelWhatsapp\"\r\n [text]=\"'subscription.whatsapp' | localize: 'واتساب'\"\r\n ></dx-check-box>\r\n\r\n <dx-check-box\r\n [(value)]=\"prefs.channelSms\"\r\n [text]=\"'subscription.sms' | localize: 'رسالة نصية'\"\r\n ></dx-check-box>\r\n </div>\r\n\r\n <div *ngIf=\"validationError\" class=\"sub-error\">\r\n {{ validationError }}\r\n </div>\r\n\r\n <div class=\"sub-actions\">\r\n <dx-button\r\n type=\"default\"\r\n [disabled]=\"loading\"\r\n [text]=\"\r\n isSubscribed\r\n ? ('common.update' | localize: 'تحديث')\r\n : ('loc.subscribeButton.1' | localize: 'اشترك')\r\n \"\r\n (onClick)=\"onConfirmSubscribe()\"\r\n ></dx-button>\r\n\r\n <dx-button\r\n *ngIf=\"isSubscribed\"\r\n type=\"danger\"\r\n stylingMode=\"outlined\"\r\n [disabled]=\"loading\"\r\n [text]=\"'subscription.unsubscribe' | localize: 'إلغاء الاشتراك'\"\r\n (onClick)=\"onUnsubscribe()\"\r\n ></dx-button>\r\n\r\n <dx-button\r\n [text]=\"'common.cancel' | localize: 'إلغاء'\"\r\n (onClick)=\"showPopup = false\"\r\n ></dx-button>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </dx-popup>\r\n</ng-container>","import { CommonModule, Location } from '@angular/common';\r\nimport {\r\n AfterViewInit,\r\n ChangeDetectorRef,\r\n Component,\r\n DestroyRef,\r\n ElementRef,\r\n EventEmitter,\r\n HostListener,\r\n Input,\r\n NgZone,\r\n OnDestroy,\r\n OnInit,\r\n Output,\r\n Renderer2,\r\n ViewChild,\r\n inject,\r\n} from '@angular/core';\r\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\r\nimport { ActivatedRoute, Router } from '@angular/router';\r\nimport {\r\n DxButtonModule,\r\n DxDropDownButtonModule,\r\n DxLoadPanelModule,\r\n DxPopupModule,\r\n DxToolbarModule,\r\n} from 'devextreme-angular';\r\nimport { Guid } from 'devextreme/common';\r\nimport validationEngine from 'devextreme/ui/validation_engine';\r\nimport { filter, shareReplay, take, tap } from 'rxjs/operators';\r\nimport { FORM_NAVIGATOR_ADAPTER, FormNavigatorAdapter, FormNavigatorMessages, FormNavigatorPermissions } from './form-navigator-adapter';\r\nimport { NavigatorLocalizePipe } from './navigator-localize.pipe';\r\nimport { InfoPopupComponent } from '../info-popup/info-popup.component';\r\nimport { LookupPopupComponent } from '../lookup-popup/lookup-popup.component';\r\nimport { SubscribeButtonComponent } from '../subscribe-button/subscribe-button.component';\r\nimport { FnIconComponent } from './fn-icon/fn-icon.component';\r\nexport enum FormModeEnum {\r\n Edit = 1,\r\n Insert = 2,\r\n}\r\ntype FormNavigatorCommand =\r\n | 'first'\r\n | 'previous'\r\n | 'next'\r\n | 'last'\r\n | 'new'\r\n | 'save'\r\n | 'delete'\r\n | 'search'\r\n | 'duplicate'\r\n | 'cancel'\r\n | 'refresh'\r\n | 'info'\r\n | 'print';\r\n\r\ninterface FormNavigatorShortcut {\r\n code: string;\r\n run: () => void | Promise<void>;\r\n}\r\n\r\ntype ReportModelsDto = any;\r\ntype ReportConfigurationDto = any;\r\nconst ReportModeEnum = { FormReport: 1 } as const;\r\nconst ROW_TABLE_NAME_KEY = '__tableName';\r\n// داخل الكلاس\r\n\r\n@Component({\r\n selector: 'app-form-navigator',\r\n standalone: true,\r\n imports: [\r\n ReactiveFormsModule,\r\n FormsModule,\r\n CommonModule,\r\n LookupPopupComponent,\r\n DxButtonModule,\r\n InfoPopupComponent,\r\n NavigatorLocalizePipe,\r\n DxToolbarModule,\r\n DxLoadPanelModule,\r\n DxDropDownButtonModule,\r\n DxPopupModule,\r\n SubscribeButtonComponent,\r\n FnIconComponent,\r\n ],\r\n templateUrl: './form-navigator.component.html',\r\n styleUrl: './form-navigator.component.scss',\r\n})\r\nexport class FormNavigatorComponent<T = any> implements OnInit, OnDestroy, AfterViewInit\r\n{\r\n // ========= Position tracking =========\r\n private sidebarObserver: MutationObserver | null = null;\r\n private resizeObserver: ResizeObserver | null = null;\r\n private directionObserver: MutationObserver | null = null;\r\n private readonly renderer = inject(Renderer2);\r\n private readonly ngZone = inject(NgZone);\r\n private readonly elementRef = inject(ElementRef);\r\n\r\n // ========= Inputs عامة =========\r\n @Input() lookupID: Guid = '0';\r\n @Input() currentObject: T | null = null;\r\n /** Physical DB table name shown in the info popup (fallback when the loaded\r\n * record isn't stamped with `__tableName` by the data service). */\r\n @Input() tableName?: string;\r\n\r\n // ========= Inputs: Data retrieval =========\r\n @Input() getByIndexCallback?: (\r\n index: number,\r\n ) => Promise<{ item: T; tableName?: string } | null>;\r\n @Input() getByKeyCallback?: (key: string) => Promise<{\r\n item: T;\r\n index?: number;\r\n tableName?: string;\r\n } | null>;\r\n @Input() getCountCallback?: () => Promise<number>;\r\n\r\n // ========= Inputs: CRUD =========\r\n @Input() insertCallback?: (data: T) => Promise<T>;\r\n\r\n @Input() updateCallback?: (id: any, data: T) => Promise<T | void>;\r\n @Input() removeCallback?: (id: any) => Promise<void>; // delete\r\n @Input() duplicateCallback?: (item: T) => Promise<T>;\r\n //refresh\r\n @Input() refreshCallback?: (id: any) => Promise<T>;\r\n\r\n // ========= Inputs: Hooks =========\r\n @Input() onLoadDataSuccess?: (data: T) => void | Promise<void>;\r\n @Input() onLoadDataFailure?: (error: any) => void;\r\n @Input() onLoadDataComplete?: () => void;\r\n\r\n @Input() onInsertSuccess?: (data: T) => void;\r\n @Input() onInsertFailure?: (error: any) => void;\r\n @Input() onInsertComplete?: () => void;\r\n\r\n @Input() onUpdateSuccess?: (data: T) => void;\r\n @Input() onUpdateFailure?: (error: any) => void;\r\n @Input() onUpdateComplete?: () => void;\r\n\r\n @Input() onDeleteSuccess?: () => void;\r\n @Input() onDeleteFailure?: (error: any) => void;\r\n @Input() onDeleteComplete?: () => void;\r\n\r\n // @Input() onDuplicateSuccess?: () => void;\r\n @Input() onDuplicateFailure?: (error: any) => void;\r\n @Input() onDuplicateComplete?: () => void;\r\n\r\n @Input() onSaveSuccess?: () => void;\r\n @Input() onSaveFailure?: (error: any) => void;\r\n @Input() onSaveCompleted?: () => void;\r\n\r\n @Input() onCancelSuccess?: () => void;\r\n @Input() onNew?: () => void;\r\n @Input() onFormModeChanged?: (\r\n lastFormMode: FormModeEnum,\r\n newFormMode: FormModeEnum,\r\n ) => void;\r\n @Input() onDataChanged?: (data: T) => void;\r\n @Input() lookupParameterSource: string | number | null = null;\r\n @Input() lookupParameters: string | null = null;\r\n @Input() selectParametersCallback?: () => Record<string, any>;\r\n\r\n //refresh\r\n @Input() onRefreshSuccess?: (fresh: any) => void | Promise<void>;\r\n @Input() onRefreshFailure?: (error: any) => void;\r\n\r\n @Input() allowSearch: boolean = true;\r\n @Input() allowPrint: boolean = true;\r\n @Input() allowDuplicate: boolean = true;\r\n @Input() allowDelete: boolean = true;\r\n @Input() allowUpdate: boolean = true;\r\n @Input() allowInsert: boolean = true;\r\n @Input() allowNavigate: boolean = true;\r\n /** Host resolved a workflow or business rule that locks editing for this record. */\r\n @Input() editingLocked = false;\r\n /** Host resolved a workflow or business rule that locks deletion for this record. */\r\n @Input() deleteLocked = false;\r\n /** Set false to disable the Alt+key keyboard shortcuts on this navigator. */\r\n @Input() shortcutsEnabled: boolean = true;\r\n @Input() allowSubscribe: boolean = false;\r\n\r\n // ========= Outputs =========\r\n @Output() onPrint = new EventEmitter<void>();\r\n\r\n // ========= View refs =========\r\n @ViewChild(LookupPopupComponent) lookupPopupComponent!: LookupPopupComponent;\r\n @ViewChild('infoPopup') infoPopupComponent!: InfoPopupComponent;\r\n @ViewChild('toolbarRef', { static: false })\r\n toolbarRef!: ElementRef<HTMLElement>;\r\n\r\n @Input() formGroup?: import('@angular/forms').FormGroup;\r\n @Input() validateBeforeSave?: () => boolean | Promise<boolean>;\r\n @Input() confirmBeforeSave?: () => Promise<boolean>;\r\n @Input() codeFieldName: any;\r\n @Input() idFieldName: any;\r\n @Input() reportModels: ReportModelsDto[] = [];\r\n\r\n //onst isSaving = false;\r\n isSaving: boolean = false;\r\n public isDuplicating = false;\r\n\r\n // ========= Snapshot-based dirty detection =========\r\n @Input() isLoading: boolean = false;\r\n private cleanSnapshot: string | null = null;\r\n\r\n // ========= حالة داخلية =========\r\n count = 0;\r\n index = 1;\r\n code: string | null = null;\r\n formMode: FormModeEnum = FormModeEnum.Insert;\r\n isFormDirty = false;\r\n isRefreshing = false;\r\n suppressDirty = false;\r\n isNavigating = false;\r\n private navigationSequence = 0;\r\n\r\n // ========= أزرار =========\r\n isBtnFirstDisabled = false;\r\n isBtnPreviousDisabled = false;\r\n isBtnNextDisabled = false;\r\n isBtnLastDisabled = false;\r\n isBtnNewDisabled = false;\r\n isBtnDeleteDisabled = false;\r\n isBtnDuplicateDisabled = false;\r\n isBtnInfoDisabled = false;\r\n isBtnCancelDisabled = true;\r\n isBtnPrintDisabled = false;\r\n isBtnRefreshDisabled = false;\r\n\r\n // ========= UI =========\r\n direction: 'rtl' | 'ltr' = 'ltr';\r\n icons = { first: '', prev: '', next: '', last: '' };\r\n private readonly shortcuts: Record<\r\n FormNavigatorCommand,\r\n FormNavigatorShortcut\r\n > = {\r\n first: { code: 'Home', run: () => this.first() },\r\n previous: { code: 'ArrowLeft', run: () => this.prev() },\r\n next: { code: 'ArrowRight', run: () => this.next() },\r\n last: { code: 'End', run: () => this.last() },\r\n new: { code: 'KeyA', run: () => this.triggerNew() },\r\n save: { code: 'KeyS', run: () => this.triggerSave() },\r\n delete: { code: 'KeyD', run: () => this.triggerDelete() },\r\n search: { code: 'KeyF', run: () => this.triggerOpenPopup() },\r\n duplicate: { code: 'KeyU', run: () => this.triggerDuplicate() },\r\n cancel: { code: 'KeyC', run: () => this.triggerCancel() },\r\n info: { code: 'KeyI', run: () => this.triggerInfo() },\r\n print: { code: 'KeyP', run: () => this.triggerPrint() },\r\n refresh: { code: 'KeyR', run: () => this.triggerRefresh() },\r\n };\r\n\r\n toolbarItems = [\r\n { location: 'center', template: 'firstTpl', cssClass: 'fn-nav-start-item' },\r\n { location: 'center', template: 'prevTpl' },\r\n { location: 'center', template: 'nextTpl' },\r\n { location: 'center', template: 'lastTpl' },\r\n { location: 'center', template: 'gapTpl' },\r\n { location: 'center', template: 'newTpl' },\r\n { location: 'center', template: 'saveTpl' },\r\n { location: 'center', template: 'deleteTpl' },\r\n { location: 'center', template: 'gapTpl' },\r\n\r\n { location: 'center', template: 'searchTpl' },\r\n { location: 'center', template: 'duplicateTpl' },\r\n\r\n { location: 'center', template: 'gapTpl' },\r\n { location: 'center', template: 'cancelTpl' },\r\n { location: 'center', template: 'refreshTpl' },\r\n { location: 'center', template: 'infoTpl' },\r\n\r\n { location: 'center', template: 'subscribeTpl' },\r\n { location: 'center', template: 'gapEndTpl' },\r\n { location: 'center', template: 'printerTpl' },\r\n ];\r\n\r\n protected readonly adapter = inject(FORM_NAVIGATOR_ADAPTER);\r\n protected readonly destroyRef = inject(DestroyRef);\r\n public pagePermissions?: FormNavigatorPermissions;\r\n\r\n // ✅ observable هنستخدمه في القالب لضمان جاهزية الصلاحيات قبل الريندر\r\n public readonly permissionsReady$ = this.adapter.permissions$.pipe(\r\n filter(\r\n (p): p is FormNavigatorPermissions =>\r\n !!p &&\r\n (p.canOpen !== undefined ||\r\n p.canInsert !== undefined ||\r\n p.canUpdate !== undefined ||\r\n p.canDelete !== undefined ||\r\n p.canPrint !== undefined ||\r\n p.canExecute !== undefined ||\r\n p.canExport !== undefined ||\r\n p.canImport !== undefined ||\r\n p.canQuery !== undefined ||\r\n p.canPrintreport !== undefined ||\r\n p.canDesignreport !== undefined ||\r\n p.canAssign !== undefined ||\r\n p.canShare !== undefined ||\r\n p.canBrowse !== undefined ||\r\n p.canLogin !== undefined),\r\n ),\r\n tap((p) => (this.pagePermissions = p)),\r\n take(1),\r\n shareReplay(1),\r\n );\r\n\r\n constructor(\r\n private cdr: ChangeDetectorRef,\r\n private activatedRoute: ActivatedRoute,\r\n private router: Router,\r\n private location: Location,\r\n ) {}\r\n\r\n get messages(): Readonly<FormNavigatorMessages> { return this.adapter.messages; }\r\n protected notifySuccess(message: string): void { this.adapter.notify('success', message); }\r\n protected notifyError(message: string): void { this.adapter.notify('error', message); }\r\n protected notifyInfo(message: string): void { this.adapter.notify('info', message); }\r\n protected notifyWarning(message: string): void { this.adapter.notify('warning', message); }\r\n protected confirmDelete(): Promise<boolean> { return this.adapter.confirm('delete'); }\r\n protected confirmDuplicate(): Promise<boolean> { return this.adapter.confirm('duplicate'); }\r\n protected confirmUnsavedChanges(): Promise<boolean> { return this.adapter.confirm('unsaved'); }\r\n\r\n private updateQueryParams(params: Record<string, unknown> | null): void {\r\n const path = this.location.path().split('?')[0];\r\n const query = params\r\n ? new URLSearchParams(Object.entries(params).filter(([, value]) => value != null).map(([key, value]) => [key, String(value)])).toString()\r\n : '';\r\n this.location.replaceState(path, query);\r\n }\r\n\r\n get isEditMode(): boolean {\r\n return this.formMode === FormModeEnum.Edit;\r\n }\r\n\r\n get currentRecordId(): string | undefined {\r\n return (this.currentObject as any)?.id;\r\n }\r\n\r\n /** Auto-detect: show status-change subscription option only when the record has a status_id field.\r\n * Case-insensitive so it catches status_id, status_Id, Status_Id, etc. */\r\n get hasStatusField(): boolean {\r\n if (this.currentObject == null) return false;\r\n return Object.keys(this.currentObject as object).some(\r\n (k) => k.toLowerCase() === 'status_id',\r\n );\r\n }\r\n\r\n get modeResolved(): boolean {\r\n return (\r\n this.formMode === FormModeEnum.Insert ||\r\n this.formMode === FormModeEnum.Edit\r\n );\r\n }\r\n\r\n get canSave(): boolean {\r\n // const p = this.pagePermissions;\r\n // return (\r\n // (this.formMode === FormModeEnum.Insert && !!p?.canInsert) ||\r\n // (this.formMode === FormModeEnum.Edit && !!p?.canUpdate)\r\n // );\r\n const p = this.pagePermissions ?? {};\r\n return (\r\n !this.editingLocked &&\r\n ((this.formMode === FormModeEnum.Insert &&\r\n (p as any).canInsert === true) ||\r\n (this.formMode === FormModeEnum.Edit && (p as any).canUpdate === true))\r\n );\r\n }\r\n\r\n get canDelete(): boolean {\r\n const p = this.pagePermissions ?? {};\r\n return (\r\n !this.editingLocked &&\r\n !this.deleteLocked &&\r\n !this.isBtnDeleteDisabled &&\r\n (p as any).canDelete === true &&\r\n this.allowDelete\r\n );\r\n }\r\n\r\n async ngOnInit() {\r\n this.adapter.loadPermissions();\r\n this.setupDirection();\r\n this.setupDirectionObserver(); // Watch for RTL/LTR changes\r\n await this.loadInitialCount();\r\n this.handleRouteParams();\r\n this.isPrintDisabled = this.computeIsPrintDisabled();\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n // ✅ انتظر لحد ما الصلاحيات تبقى جاهزة فعلاً\r\n this.permissionsReady$.pipe(take(1)).subscribe(() => {\r\n this.cdr.detectChanges();\r\n });\r\n\r\n // Setup dynamic positioning based on sidebar and content area\r\n this.setupPositionTracking();\r\n }\r\n\r\n ngOnDestroy(): void {\r\n // Cleanup observers\r\n this.cleanupPositionTracking();\r\n this.cleanupDirectionObserver();\r\n }\r\n\r\n /**\r\n * Setup observers to track sidebar toggle and window resize\r\n */\r\n private setupPositionTracking(): void {\r\n // Initial position update\r\n this.updatePosition();\r\n\r\n // Listen for window resize\r\n this.ngZone.runOutsideAngular(() => {\r\n window.addEventListener('resize', this.onWindowResize);\r\n });\r\n\r\n // Observe sidebar for class changes (collapse/expand)\r\n const sidebar = document.getElementById('sidebar');\r\n if (sidebar) {\r\n this.sidebarObserver = new MutationObserver(() => {\r\n this.updatePosition();\r\n });\r\n this.sidebarObserver.observe(sidebar, {\r\n attributes: true,\r\n attributeFilter: ['class', 'style'],\r\n });\r\n }\r\n\r\n // Observe content container for size changes\r\n const contentContainer = document.querySelector('.content-container');\r\n if (contentContainer) {\r\n this.resizeObserver = new ResizeObserver(() => {\r\n this.updatePosition();\r\n });\r\n this.resizeObserver.observe(contentContainer);\r\n }\r\n }\r\n\r\n /**\r\n * Cleanup observers on destroy\r\n */\r\n private cleanupPositionTracking(): void {\r\n window.removeEventListener('resize', this.onWindowResize);\r\n\r\n if (this.sidebarObserver) {\r\n this.sidebarObserver.disconnect();\r\n this.sidebarObserver = null;\r\n }\r\n\r\n if (this.resizeObserver) {\r\n this.resizeObserver.disconnect();\r\n this.resizeObserver = null;\r\n }\r\n }\r\n\r\n /**\r\n * Handle window resize\r\n */\r\n private onWindowResize = (): void => {\r\n this.updatePosition();\r\n };\r\n\r\n /**\r\n * Update the position of the form navigator based on content area\r\n */\r\n private updatePosition(): void {\r\n const hostElement = this.elementRef.nativeElement as HTMLElement;\r\n const contentContainer = document.querySelector(\r\n '.content-container',\r\n ) as HTMLElement;\r\n\r\n if (contentContainer && hostElement) {\r\n const contentRect = contentContainer.getBoundingClientRect();\r\n\r\n // Calculate center position of content area\r\n const contentCenterX = contentRect.left + contentRect.width / 2;\r\n\r\n // Set the CSS custom property for the center position\r\n this.renderer.setStyle(hostElement, 'left', `${contentRect.left}px`);\r\n this.renderer.setStyle(hostElement, 'width', `${contentRect.width}px`);\r\n // Remove right constraint - let width handle it\r\n this.renderer.removeStyle(hostElement, 'right');\r\n }\r\n }\r\n\r\n /*ngOnChanges(_changes: SimpleChanges): void {\r\n // async ngOnChanges(_changes: SimpleChanges): Promise<void> {\r\n if (this.formMode === FormModeEnum.Insert) {\r\n\r\n // if (this.count === 0) {\r\n\r\n // await this.loadInitialCount();\r\n // }\r\n\r\n this.index = this.count + 1;\r\n }\r\n this.updateButtonStates();\r\n }*/\r\n\r\n // ==================== INIT ====================\r\n private async loadInitialCount(): Promise<void> {\r\n if (this.getCountCallback) {\r\n try {\r\n this.count = await this.getCountCallback();\r\n } catch {\r\n this.count = 0;\r\n }\r\n }\r\n }\r\n\r\n private setupDirection(): void {\r\n this.direction =\r\n (document.body.getAttribute('dir') as 'rtl' | 'ltr') || 'ltr';\r\n const isRTL = this.direction === 'rtl';\r\n this.icons = {\r\n first: isRTL ? 'ki-double-right' : 'ki-double-left',\r\n prev: isRTL ? 'ki-right' : 'ki-left',\r\n next: isRTL ? 'ki-left' : 'ki-right',\r\n last: isRTL ? 'ki-double-left' : 'ki-double-right',\r\n };\r\n }\r\n\r\n /**\r\n * Setup observer to track direction (RTL/LTR) changes on body element\r\n */\r\n private setupDirectionObserver(): void {\r\n this.directionObserver = new MutationObserver((mutations) => {\r\n for (const mutation of mutations) {\r\n if (\r\n mutation.type === 'attributes' &&\r\n mutation.attributeName === 'dir'\r\n ) {\r\n this.ngZone.run(() => {\r\n this.setupDirection();\r\n this.cdr.detectChanges();\r\n });\r\n break;\r\n }\r\n }\r\n });\r\n\r\n this.directionObserver.observe(document.body, {\r\n attributes: true,\r\n attributeFilter: ['dir'],\r\n });\r\n }\r\n\r\n /**\r\n * Cleanup direction observer\r\n */\r\n private cleanupDirectionObserver(): void {\r\n if (this.directionObserver) {\r\n this.directionObserver.disconnect();\r\n this.directionObserver = null;\r\n }\r\n }\r\n\r\n public codeValueChanged = (e: any): void => {\r\n if (!e?.event) return; // مهم لو بتستخدم valueChangeEvent='change'\r\n if (this.formMode !== FormModeEnum.Insert) {\r\n this.markFormDirty();\r\n const val = (e?.value ?? '').toString().trim();\r\n if (val) this.navigateTo(0, val);\r\n }\r\n };\r\n\r\n private handleRouteParams(): void {\r\n this.activatedRoute.queryParams.subscribe((params) => {\r\n const idxRaw = params['index'];\r\n const idxNum = Number(idxRaw);\r\n this.index = Number.isFinite(idxNum) && idxNum > 0 ? idxNum : 0; // ✅ تحويل آمن\r\n\r\n // const codeRaw = params['code'];\r\n const codeRaw = params['key'];\r\n this.code = (typeof codeRaw === 'string' ? codeRaw.trim() : null) || null;\r\n\r\n if (this.index) {\r\n this.navigateTo(this.index);\r\n } else if (this.code) {\r\n this.navigateTo(0, this.code);\r\n } else {\r\n this.triggerNew();\r\n }\r\n\r\n this.updateButtonStates();\r\n });\r\n }\r\n\r\n async navigateTo(index: number, code: string | null = null): Promise<void> {\r\n const navigationId = ++this.navigationSequence;\r\n if (this.hasRealUnsavedChanges()) {\r\n const confirmed = await this.confirmUnsavedChanges();\r\n if (!confirmed || navigationId !== this.navigationSequence) return;\r\n this.isFormDirty = false;\r\n }\r\n const recordLoadId = this.adapter.beginRecordLoad();\r\n this.isNavigating = true;\r\n try {\r\n if ((index == null || index < 1) && !code) {\r\n const lastFormMode = this.formMode;\r\n this.formMode = FormModeEnum.Insert;\r\n this.onFormModeChanged?.(lastFormMode, this.formMode);\r\n\r\n this.currentObject = null;\r\n this.updateUrl(true); // clear query params\r\n this.updateButtonStates();\r\n this.cdr.detectChanges();\r\n return;\r\n }\r\n if (index === 0 && code) {\r\n await this.loadByCode(code, navigationId);\r\n } else {\r\n await this.loadByIndex(index, navigationId);\r\n }\r\n } catch (error) {\r\n this.notifyError(this.messages.Load_Data_ERROR);\r\n this.onLoadDataFailure?.(error);\r\n } finally {\r\n await this.adapter.waitForLookups(recordLoadId);\r\n if (this.adapter.isRecordLoadActive(recordLoadId)) {\r\n this.isNavigating = false;\r\n }\r\n this.onLoadDataComplete?.();\r\n\r\n this.updateButtonStates();\r\n this.cdr.detectChanges();\r\n }\r\n }\r\n\r\n private async loadByCode(code: string, navigationId: number): Promise<void> {\r\n if (!this.getByKeyCallback) {\r\n this.notifyError(this.messages.Load_Data_ERROR);\r\n return;\r\n }\r\n\r\n try {\r\n const result = await this.getByKeyCallback(code);\r\n if (navigationId !== this.navigationSequence) return;\r\n\r\n // لو الخدمة رجّعت null/undefined → Not found\r\n if (!result) {\r\n this.notifyWarning(this.messages.NOT_FOUND ?? this.adapter.translate('ui.ts.form-navigator.1', 'العنصر غير موجود.'));\r\n // ارجع لوضع الإدخال بدل ما تسيب الشاشة في وضع غامض\r\n\r\n const lastFormMode = this.formMode;\r\n this.formMode = FormModeEnum.Insert;\r\n this.onFormModeChanged?.(lastFormMode, this.formMode);\r\n\r\n this.currentObject = null;\r\n this.updateUrl(true);\r\n return;\r\n }\r\n\r\n this.index = result.index ?? this.index ?? 1;\r\n this.currentObject = result.item;\r\n this.stampTableName(result.item, result.tableName);\r\n\r\n const lastFormMode = this.formMode;\r\n this.formMode = FormModeEnum.Edit;\r\n this.onFormModeChanged?.(lastFormMode, this.formMode);\r\n\r\n this.suppressDirty = true;\r\n try {\r\n await this.onLoadDataSuccess?.(result.item!);\r\n if (navigationId !== this.navigationSequence) return;\r\n this.onDataChanged?.(result.item!);\r\n } finally {\r\n await this.finishProgrammaticChange();\r\n }\r\n this.updateUrl(false, code);\r\n } catch (err: any) {\r\n const status =\r\n err?.status ?? err?.response?.status ?? err?.error?.statusCode;\r\n if (status === 404) {\r\n this.notifyWarning(this.messages.NOT_FOUND ?? this.adapter.translate('ui.ts.form-navigator.1', 'العنصر غير موجود.'));\r\n\r\n const lastFormMode = this.formMode;\r\n this.formMode = FormModeEnum.Insert;\r\n this.onFormModeChanged?.(lastFormMode, this.formMode);\r\n\r\n this.currentObject = null;\r\n this.updateUrl(true);\r\n } else {\r\n this.notifyError(this.messages.Load_Data_ERROR);\r\n this.onLoadDataFailure?.(err);\r\n }\r\n }\r\n }\r\n\r\n private async loadByIndex(\r\n index: number,\r\n navigationId: number,\r\n ): Promise<void> {\r\n if (!this.getByIndexCallback) {\r\n this.notifyError(this.messages.Load_Data_ERROR);\r\n return;\r\n }\r\n\r\n const result = await this.getByIndexCallback(index);\r\n if (navigationId !== this.navigationSequence) return;\r\n\r\n if (!result?.item) {\r\n this.notifyError(this.messages.NOT_FOUND);\r\n this.onLoadDataFailure?.(this.messages.NOT_FOUND);\r\n return;\r\n }\r\n\r\n // ✅ مهم جداً: ثبّت الـ index الفعلي\r\n this.index = (result as any)?.index ?? index;\r\n\r\n this.currentObject = result.item;\r\n this.stampTableName(result.item, result.tableName);\r\n\r\n const lastFormMode = this.formMode;\r\n this.formMode = FormModeEnum.Edit;\r\n this.onFormModeChanged?.(lastFormMode, this.formMode);\r\n\r\n this.suppressDirty = true;\r\n try {\r\n await this.onLoadDataSuccess?.(result.item);\r\n if (navigationId !== this.navigationSequence) return;\r\n this.onDataChanged?.(result.item);\r\n } finally {\r\n await this.finishProgrammaticChange();\r\n }\r\n\r\n const itemCode =\r\n (result.item as any)?.[this.codeFieldName] ??\r\n (result.item as any)?.code ??\r\n null;\r\n\r\n this.updateUrl(false, itemCode);\r\n }\r\n\r\n first(): void {\r\n this.navigateTo(1);\r\n }\r\n\r\n prev(): void {\r\n if (this.index > 1) {\r\n this.navigateTo(this.index - 1);\r\n }\r\n this.updateButtonStates();\r\n }\r\n\r\n next(): void {\r\n if (this.index < this.count) {\r\n this.navigateTo(this.index + 1);\r\n }\r\n this.updateButtonStates();\r\n }\r\n\r\n last(): void {\r\n this.navigateTo(this.count);\r\n }\r\n\r\n // ==================== CRUD ====================\r\n async triggerNew(): Promise<void> {\r\n if (this.hasRealUnsavedChanges()) {\r\n const confirmed = await this.confirmUnsavedChanges();\r\n if (!confirmed) return;\r\n }\r\n\r\n const lastFormMode = this.formMode;\r\n this.formMode = FormModeEnum.Insert;\r\n this.onFormModeChanged?.(lastFormMode, this.formMode);\r\n\r\n this.currentObject = null;\r\n this.isFormDirty = false;\r\n\r\n await this.loadInitialCount();\r\n\r\n this.index = this.count + 1;\r\n\r\n this.suppressDirty = true;\r\n try {\r\n await this.onNew?.();\r\n } finally {\r\n await this.finishProgrammaticChange();\r\n }\r\n\r\n this.removeSearchParams();\r\n }\r\n\r\n async triggerSave(): Promise<void> {\r\n if (this.editingLocked) return;\r\n if (!this.canSave) {\r\n this.notifyWarning(this.messages.NO_PERMISSION);\r\n // this.onSaveFailure?.(this.messages.NO_PERMISSION);\r\n return;\r\n }\r\n\r\n // const valid = await this.runPreSaveValidation();\r\n // if (!valid) return;\r\n if (this.validateBeforeSave) {\r\n const ok = await this.validateBeforeSave();\r\n if (!ok) return;\r\n }\r\n const validationGroup = validationEngine.getGroupConfig('validationGroup1');\r\n\r\n if (validationGroup) {\r\n const validationResult =\r\n validationEngine.validateGroup('validationGroup1');\r\n if (!validationResult.isValid) {\r\n return;\r\n }\r\n }\r\n\r\n if (this.confirmBeforeSave && !(await this.confirmBeforeSave())) return;\r\n\r\n this.isSaving = true;\r\n // The panel itself is the shared one in app.component: the save callback and the\r\n // HTTP interceptor inside it both raise the same counter, so exactly one appears.\r\n this.adapter.showLoading(this.adapter.translate('ui.ts.form-navigator.2', 'جاري الحفظ...'));\r\n this.cdr.detectChanges();\r\n try {\r\n if (this.formMode === FormModeEnum.Insert) {\r\n await this.handleInsert();\r\n } else {\r\n await this.handleUpdate();\r\n }\r\n } catch (err) {\r\n // this.notifyError(this.messages.SAVE_ERROR);\r\n this.onSaveFailure?.(err);\r\n this.notifyError((err as any)?.message ?? this.messages.SAVE_ERROR);\r\n throw err;\r\n } finally {\r\n this.isSaving = false;\r\n this.adapter.hideLoading();\r\n this.onSaveCompleted?.();\r\n this.cdr.detectChanges();\r\n }\r\n }\r\n\r\n private async handleInsert(): Promise<void> {\r\n if (!this.insertCallback || !this.currentObject) {\r\n this.notifyError(this.messages.SAVE_ERROR);\r\n this.onSaveFailure?.(this.messages.SAVE_ERROR);\r\n return;\r\n }\r\n\r\n try {\r\n const inserted =\r\n (await this.insertCallback(this.currentObject)) ?? this.currentObject;\r\n const itemCode =\r\n (inserted as any)?.[this.codeFieldName] ??\r\n (inserted as any)?.code ??\r\n null;\r\n\r\n await this.refreshCount();\r\n\r\n this.isFormDirty = false;\r\n\r\n if (itemCode) {\r\n await this.navigateTo(0, itemCode);\r\n } else {\r\n this.currentObject = inserted;\r\n\r\n const lastFormMode = this.formMode;\r\n this.formMode = FormModeEnum.Edit;\r\n this.onFormModeChanged?.(lastFormMode, this.formMode);\r\n\r\n await this.onLoadDataSuccess?.(inserted);\r\n this.onDataChanged?.(inserted);\r\n this.captureCleanSnapshot();\r\n this.updateUrl(false, null);\r\n this.updateButtonStates();\r\n this.cdr.detectChanges();\r\n }\r\n\r\n this.onInsertSuccess?.(inserted);\r\n this.onSaveSuccess?.();\r\n\r\n // Show our OWN success toast only when the host did not provide onSaveSuccess. A host that\r\n // does (e.g. the dynamic accordion, which shows its own توست inside onSaveSuccess) would\r\n // otherwise get TWO \"تم الحفظ بنجاح\" messages for a single save.\r\n if (!this.onSaveSuccess) this.notifySuccess(this.messages.SAVE_SUCCESS);\r\n } catch (error) {\r\n this.onInsertFailure?.(error);\r\n this.onSaveFailure?.(error);\r\n // this.notifyError((error as any).message);\r\n throw error; // عشان triggerSave يعرف إن فيه خطأ\r\n // ✅ Toast خطأ واضح\r\n // this.notifyError(this.messages.SAVE_ERROR);\r\n } finally {\r\n this.onInsertComplete?.();\r\n }\r\n }\r\n\r\n private async handleUpdate(): Promise<void> {\r\n if (!this.updateCallback || !this.currentObject) {\r\n this.notifyWarning(this.messages.SAVE_ERROR);\r\n this.onSaveFailure?.(this.messages.SAVE_ERROR);\r\n return;\r\n }\r\n\r\n try {\r\n const currentObject = this.currentObject;\r\n const id = (currentObject as any).id;\r\n const result = await this.updateCallback(id, currentObject);\r\n const updatedObject: T = (result ?? currentObject) as T;\r\n this.onUpdateSuccess?.(updatedObject);\r\n\r\n // ✅ Navigate by code (unique key) to always return to the same record\r\n const itemCode =\r\n (this.currentObject as any)?.[this.codeFieldName] ??\r\n (this.currentObject as any)?.code ??\r\n null;\r\n\r\n if (itemCode) {\r\n this.isFormDirty = false;\r\n await this.navigateTo(0, itemCode);\r\n } else {\r\n this.isFormDirty = false;\r\n await this.navigateTo(this.index);\r\n }\r\n\r\n this.onSaveSuccess?.();\r\n\r\n // See handleInsert: skip our own toast when the host owns onSaveSuccess, to avoid a\r\n // duplicate \"تم الحفظ بنجاح\" per save.\r\n if (!this.onSaveSuccess) this.notifySuccess(this.messages.SAVE_SUCCESS);\r\n } catch (error) {\r\n this.onUpdateFailure?.((error as any).message);\r\n this.onSaveFailure?.(error);\r\n\r\n \r\n // this.notifyError((error as any).message);\r\n throw error;\r\n } finally {\r\n // this.onUpdateComplete?.();\r\n }\r\n }\r\n\r\n async triggerDelete(): Promise<void> {\r\n if (this.editingLocked || this.deleteLocked) return;\r\n if (this.formMode !== FormModeEnum.Edit || !this.currentObject) return;\r\n if (!this.removeCallback) {\r\n this.notifyError(this.messages.DELETE_ERROR);\r\n this.onDeleteFailure?.(this.messages.DELETE_ERROR);\r\n return;\r\n }\r\n\r\n try {\r\n const id = (this.currentObject as any).id;\r\n if (!(await this.confirmDelete())) return;\r\n\r\n await this.removeCallback(id);\r\n\r\n // this.notifySuccess(this.messages.DELETE_SUCCESS);\r\n this.onDeleteSuccess?.();\r\n\r\n await this.refreshCount();\r\n this.index = Math.min(this.index, this.count);\r\n await this.navigateTo(this.index);\r\n } catch (error: any) {\r\n this.onDeleteFailure?.(error.message);\r\n this.notifyError(error.message);\r\n } finally {\r\n this.onDeleteComplete?.();\r\n }\r\n }\r\n\r\n async triggerDuplicate(): Promise<void> {\r\n // (اختياري) تحقّق من الصلاحية\r\n // const p = this.pagePermissions;\r\n // if (!p?.canInsert) { this.notifyWarning(this.messages.DUPLICATE_ERROR); return; }\r\n\r\n if (!this.duplicateCallback || !this.currentObject || this.isDuplicating) {\r\n if (!this.duplicateCallback || !this.currentObject) {\r\n this.notifyError(this.messages.DUPLICATE_ERROR);\r\n this.onDuplicateFailure?.(this.messages.DUPLICATE_ERROR);\r\n }\r\n return;\r\n }\r\n\r\n if (!(await this.confirmDuplicate())) return;\r\n\r\n this.isDuplicating = true;\r\n this.cdr.detectChanges();\r\n\r\n try {\r\n const newItem = await this.duplicateCallback(this.currentObject);\r\n\r\n if (!newItem) {\r\n // خدمة الازدواج لم تُرجع عنصرًا\r\n this.notifyError(this.messages.DUPLICATE_ERROR);\r\n this.onDuplicateFailure?.('Duplicate callback returned empty result.');\r\n return;\r\n }\r\n\r\n const newCode =\r\n (newItem as any)?.[this.codeFieldName] ??\r\n (newItem as any)?.code ??\r\n null;\r\n\r\n // منع التنقّل على نفس الكود الحالي بالخطأ\r\n const currentCode =\r\n (this.currentObject as any)?.[this.codeFieldName] ??\r\n (this.currentObject as any)?.code ??\r\n null;\r\n\r\n await this.refreshCount();\r\n\r\n this.isFormDirty = false;\r\n\r\n if (newCode && newCode !== currentCode) {\r\n await this.navigateTo(0, newCode);\r\n } else {\r\n // Fallback لو مفيش code أو نفس الكود\r\n this.currentObject = newItem;\r\n\r\n const lastFormMode = this.formMode;\r\n this.formMode = FormModeEnum.Edit;\r\n this.onFormModeChanged?.(lastFormMode, this.formMode);\r\n\r\n this.onDataChanged?.(newItem);\r\n await this.onLoadDataSuccess?.(newItem);\r\n this.captureCleanSnapshot();\r\n this.updateUrl(false, null);\r\n this.updateButtonStates();\r\n this.cdr.detectChanges();\r\n }\r\n\r\n this.notifySuccess(this.messages.DUPLICATE_SUCCESS);\r\n } catch (error) {\r\n this.onDuplicateFailure?.(error);\r\n // The server's reason when it sent one (a plan limit reached, a business rule), the\r\n // generic text only when it did not.\r\n const serverMessage = (error as any)?.message;\r\n this.notifyError(\r\n typeof serverMessage === 'string' && serverMessage.trim() ? serverMessage : this.messages.DUPLICATE_ERROR,\r\n );\r\n } finally {\r\n this.onDuplicateComplete?.();\r\n this.isDuplicating = false;\r\n this.cdr.detectChanges();\r\n }\r\n }\r\n\r\n triggerCancel(): void {\r\n this.isFormDirty = false;\r\n\r\n this.onCancelSuccess?.();\r\n\r\n if (this.formMode === FormModeEnum.Insert) {\r\n const lastFormMode = this.formMode;\r\n this.formMode = FormModeEnum.Edit;\r\n this.onFormModeChanged?.(lastFormMode, this.formMode);\r\n\r\n this.index = this.count;\r\n }\r\n\r\n this.navigateTo(this.index);\r\n this.updateButtonStates();\r\n }\r\n\r\n //Refresh btn\r\n async triggerRefresh() {\r\n // console.log('Refresh');\r\n const id = (this.currentObject as any).id;\r\n if (!id || !this.refreshCallback) {\r\n return;\r\n }\r\n this.isRefreshing = true;\r\n this.suppressDirty = true;\r\n this.cdr.detectChanges();\r\n try {\r\n const refreshedItem = await this.refreshCallback(id);\r\n this.currentObject = refreshedItem as any;\r\n await this.onRefreshSuccess?.(refreshedItem);\r\n } catch (error) {\r\n console.log('Error refreshing data:', error);\r\n this.onRefreshFailure?.(error);\r\n } finally {\r\n this.isRefreshing = false;\r\n await this.finishProgrammaticChange();\r\n }\r\n }\r\n // ==================== Helpers ====================\r\n private async refreshCount(): Promise<void> {\r\n if (this.getCountCallback) {\r\n this.count = await this.getCountCallback();\r\n }\r\n }\r\n\r\n hasRealUnsavedChanges(): boolean {\r\n if (!this.isFormDirty) return false;\r\n\r\n const source = this.currentObject;\r\n if (!source || this.cleanSnapshot === null) return this.isFormDirty;\r\n\r\n const currentSnapshot = this.normalizeSnapshot(source);\r\n const hasRealChanges = currentSnapshot !== this.cleanSnapshot;\r\n // if (hasRealChanges) {\r\n // console.group('SNAPSHOT REAL DIFF');\r\n\r\n // console.log('Clean Snapshot String:', this.cleanSnapshot);\r\n // console.log('Current Snapshot String:', currentSnapshot);\r\n\r\n // try {\r\n // const cleanObj = this.cleanSnapshot\r\n // ? JSON.parse(this.cleanSnapshot)\r\n // : {};\r\n // const currentObj = currentSnapshot ? JSON.parse(currentSnapshot) : {};\r\n\r\n // const allKeys = Array.from(\r\n // new Set([\r\n // ...Object.keys(cleanObj || {}),\r\n // ...Object.keys(currentObj || {}),\r\n // ]),\r\n // );\r\n\r\n // const diffs = allKeys\r\n // .filter((key) => {\r\n // return (\r\n // JSON.stringify(cleanObj?.[key]) !==\r\n // JSON.stringify(currentObj?.[key])\r\n // );\r\n // })\r\n // .map((key) => ({\r\n // field: key,\r\n // clean: cleanObj?.[key],\r\n // current: currentObj?.[key],\r\n // }));\r\n\r\n // console.table(diffs);\r\n // } catch (err) {\r\n // console.error('Snapshot diff parse error', err);\r\n // }\r\n\r\n // console.groupEnd();\r\n // }\r\n if (!hasRealChanges) {\r\n this.isFormDirty = false;\r\n this.updateButtonStates();\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n captureCleanSnapshot(): void {\r\n this.isFormDirty = false;\r\n this.updateButtonStates();\r\n const source = this.currentObject;\r\n this.cleanSnapshot = source ? this.normalizeSnapshot(source) : null;\r\n }\r\n\r\n private normalizeSnapshot(value: any): string {\r\n return JSON.stringify(this.sortObject(value), (_key, val) => {\r\n if (val === undefined) return null;\r\n if (val instanceof Date) return val.toISOString();\r\n return val;\r\n });\r\n }\r\n\r\n private sortObject(value: any): any {\r\n if (Array.isArray(value)) {\r\n return value.map((x) => this.sortObject(x));\r\n }\r\n\r\n if (\r\n value !== null &&\r\n typeof value === 'object' &&\r\n !(value instanceof Date)\r\n ) {\r\n return Object.keys(value)\r\n .sort()\r\n .reduce((result: any, key) => {\r\n result[key] = this.sortObject(value[key]);\r\n return result;\r\n }, {});\r\n }\r\n\r\n return value;\r\n }\r\n\r\n private waitForUiFrame(): Promise<void> {\r\n return new Promise((resolve) => {\r\n requestAnimationFrame(() => {\r\n requestAnimationFrame(() => resolve());\r\n });\r\n });\r\n }\r\n\r\n private async finishProgrammaticChange(): Promise<void> {\r\n await this.waitForUiFrame();\r\n\r\n this.captureCleanSnapshot();\r\n this.suppressDirty = false;\r\n this.updateButtonStates();\r\n this.cdr.detectChanges();\r\n }\r\n\r\n /**\r\n * يشغّل عمليةً برمجية تُبدّل بيانات النموذج من المضيف (ترحيل / عكس / حفظ مخصّص من زر خاص…)\r\n * بحيث لا تُوسم كتعديل مستخدم غير محفوظ. يطبّق نفس بركت التغيير البرمجي الذي يستخدمه\r\n * المتصفّح داخليًا في التحميل و«جديد»: يكبت الـ dirty أثناء التبديل، ثم ينتظر إطار الواجهة\r\n * ويعيد التقاط الحالة النظيفة — فتصير النتيجة المحفوظة هي خطَّ الأساس ولا يظهر تحذير\r\n * «تغييرات غير محفوظة» عند المغادرة.\r\n *\r\n * حلٌّ عام: أي شاشة فيها عملية حفظ برمجية (ترحيل/عكس/…) تستدعيه بدل تكرار المعالجة في كل\r\n * مكوّن على حدة.\r\n */\r\n async runProgrammaticChange(mutate: () => void | Promise<void>): Promise<void> {\r\n this.suppressDirty = true;\r\n try {\r\n await mutate();\r\n } finally {\r\n await this.finishProgrammaticChange();\r\n }\r\n }\r\n\r\n markFormDirty(): void {\r\n if (this.suppressDirty || this.isLoading) return;\r\n this.isFormDirty = true;\r\n this.updateButtonStates();\r\n }\r\n\r\n updateButtonStates(): void {\r\n this.isBtnFirstDisabled = this.index <= 1;\r\n this.isBtnPreviousDisabled = this.index <= 1;\r\n this.isBtnNextDisabled =\r\n this.index >= this.count || this.formMode === FormModeEnum.Insert;\r\n this.isBtnLastDisabled =\r\n this.index >= this.count || this.formMode === FormModeEnum.Insert;\r\n this.isBtnNewDisabled = this.formMode === FormModeEnum.Insert;\r\n this.isBtnDeleteDisabled = this.formMode === FormModeEnum.Insert;\r\n this.isBtnDuplicateDisabled = this.formMode === FormModeEnum.Insert;\r\n this.isBtnInfoDisabled = this.formMode === FormModeEnum.Insert;\r\n // this.isBtnCancelDisabled = !this.isFormDirty;\r\n this.isBtnCancelDisabled =\r\n this.formMode !== FormModeEnum.Insert &&\r\n this.formMode !== FormModeEnum.Edit;\r\n\r\n this.isBtnPrintDisabled =\r\n this.formMode === FormModeEnum.Insert || this.index <= 0;\r\n this.isBtnRefreshDisabled =\r\n this.formMode === FormModeEnum.Insert || this.index <= 0;\r\n }\r\n\r\n // URL\r\n updateUrl(clear: boolean = false, code: string | null = null): void {\r\n if (clear) {\r\n this.updateQueryParams(null);\r\n return;\r\n }\r\n const allParams: Record<string, string | null> = {};\r\n\r\n if (code) {\r\n // allParams['code'] = code;\r\n allParams['key'] = code;\r\n }\r\n if (this.selectParametersCallback) {\r\n try {\r\n const extraParams = this.selectParametersCallback();\r\n\r\n if (extraParams && typeof extraParams === 'object') {\r\n Object.entries(extraParams).forEach(([key, value]) => {\r\n if (value != null && value !== '') {\r\n allParams[key] = String(value);\r\n }\r\n });\r\n }\r\n } catch (error) {\r\n throw error;\r\n }\r\n }\r\n\r\n this.updateQueryParams(allParams);\r\n }\r\n // updateUrl(clear: boolean = false, code: string | null = null): void {\r\n // //console.log(\"updateUrl code:\", code);\r\n // if (clear) this.updateQueryParam('code', null);\r\n // else this.updateQueryParam('code', code);\r\n // this.updateButtonStates();\r\n // }\r\n\r\n // private updateQueryParam(paramName: string, value: string | null): void {\r\n // const queryParams = { ...this.activatedRoute.snapshot.queryParams };\r\n // if (value === null || value === undefined) delete queryParams[paramName];\r\n // else queryParams[paramName] = value;\r\n\r\n // const queryString = Object.keys(queryParams)\r\n // .map((key) => `${encodeURIComponent(key)}=${encodeURIComponent(queryParams[key])}`)\r\n // .join('&');\r\n\r\n // const path = this.location.path().split('?')[0];\r\n // this.location.replaceState(path, queryString);\r\n // }\r\n\r\n private removeSearchParams(): void {\r\n this.router.navigate([], {\r\n relativeTo: this.activatedRoute,\r\n queryParams: {},\r\n queryParamsHandling: '',\r\n replaceUrl: true,\r\n });\r\n }\r\n\r\n //Popup / Info / Print\r\n triggerOpenPopup(): void {\r\n this.lookupPopupComponent?.openLookupPopup(\r\n this.lookupID,\r\n this.handlePopupResult.bind(this),\r\n this.lookupParameterSource,\r\n this.lookupParameters,\r\n this.selectParametersCallback,\r\n (this.currentObject as any)[this.idFieldName] ??\r\n (this.currentObject as any)?.id ??\r\n null,\r\n );\r\n }\r\n\r\n async handlePopupResult(result: any): Promise<void> {\r\n if (result?.selectedValue) {\r\n await this.navigateTo(0, result.selectedValue);\r\n }\r\n }\r\n\r\n private _lastLoadedTableName: string | null = null;\r\n\r\n private stampTableName(\r\n item: T | null,\r\n tableName: string | null | undefined,\r\n ): void {\r\n this._lastLoadedTableName = tableName ?? null;\r\n if (item && typeof item === 'object' && tableName) {\r\n Object.defineProperty(item, ROW_TABLE_NAME_KEY, {\r\n value: tableName,\r\n enumerable: false,\r\n configurable: true,\r\n writable: true,\r\n });\r\n }\r\n }\r\n\r\n triggerInfo(): void {\r\n if (this.infoPopupComponent && this.currentObject) {\r\n const tableName =\r\n (this.currentObject as any)?.['__tableName'] ??\r\n this._lastLoadedTableName ??\r\n this.tableName ??\r\n '';\r\n this.infoPopupComponent.tableName = tableName;\r\n this.infoPopupComponent.showSecuredInfo = true;\r\n this.infoPopupComponent.currentObject = this.currentObject;\r\n this.infoPopupComponent.open();\r\n }\r\n }\r\n\r\n triggerPrint(): void {\r\n this.onPrint.emit();\r\n }\r\n\r\n getShortcut(command: FormNavigatorCommand): string {\r\n const effectiveCommand = this.getDirectionalCommandForDisplay(command);\r\n return `Alt+${this.formatShortcutCode(this.shortcuts[effectiveCommand].code)}`;\r\n }\r\n\r\n // ==================== Keyboard ====================\r\n @HostListener('document:keydown', ['$event'])\r\n handleKeyboardEvent(event: KeyboardEvent): void {\r\n if (\r\n !this.shortcutsEnabled ||\r\n event.defaultPrevented ||\r\n event.repeat ||\r\n event.isComposing ||\r\n event.getModifierState('AltGraph') ||\r\n !event.altKey ||\r\n event.ctrlKey ||\r\n event.shiftKey ||\r\n event.metaKey\r\n ) {\r\n return;\r\n }\r\n\r\n const command = this.resolveShortcutCommand(event);\r\n if (!command) return;\r\n\r\n // Keep known application shortcuts from falling through to the browser\r\n // when their actions are currently disabled.\r\n event.preventDefault();\r\n\r\n if (!this.canExecuteCommand(command)) return;\r\n void this.shortcuts[command].run();\r\n }\r\n\r\n canExecuteCommand(command: FormNavigatorCommand): boolean {\r\n const permissions = this.pagePermissions;\r\n\r\n switch (command) {\r\n case 'first':\r\n return (\r\n !this.isBtnFirstDisabled &&\r\n permissions?.canOpen === true &&\r\n this.allowNavigate\r\n );\r\n case 'previous':\r\n return (\r\n !this.isBtnPreviousDisabled &&\r\n permissions?.canOpen === true &&\r\n this.allowNavigate\r\n );\r\n case 'next':\r\n return (\r\n !this.isBtnNextDisabled &&\r\n permissions?.canOpen === true &&\r\n this.allowNavigate\r\n );\r\n case 'last':\r\n return (\r\n !this.isBtnLastDisabled &&\r\n permissions?.canOpen === true &&\r\n this.allowNavigate\r\n );\r\n case 'new':\r\n return (\r\n !this.isBtnNewDisabled &&\r\n permissions?.canInsert === true &&\r\n this.allowInsert\r\n );\r\n case 'save':\r\n return (\r\n !this.editingLocked &&\r\n this.modeResolved &&\r\n this.canSave &&\r\n !this.isSaving &&\r\n this.isFormDirty\r\n );\r\n case 'delete':\r\n return (\r\n !this.editingLocked &&\r\n !this.deleteLocked &&\r\n !this.isBtnDeleteDisabled &&\r\n permissions?.canDelete === true &&\r\n this.allowDelete\r\n );\r\n case 'search':\r\n return permissions?.canOpen === true && this.allowSearch;\r\n case 'duplicate':\r\n return (\r\n !this.isBtnDuplicateDisabled &&\r\n permissions?.canInsert === true &&\r\n this.allowDuplicate &&\r\n !this.isDuplicating\r\n );\r\n case 'cancel':\r\n return !this.isBtnCancelDisabled && permissions?.canUpdate === true;\r\n case 'refresh':\r\n return (\r\n !this.isBtnRefreshDisabled &&\r\n permissions?.canOpen === true &&\r\n !this.isRefreshing\r\n );\r\n case 'info':\r\n return !this.isBtnInfoDisabled && permissions?.canOpen === true;\r\n case 'print':\r\n return (\r\n !this.isBtnPrintDisabled &&\r\n permissions?.canPrint === true &&\r\n this.allowPrint\r\n );\r\n }\r\n }\r\n\r\n private resolveShortcutCommand(\r\n event: KeyboardEvent,\r\n ): FormNavigatorCommand | undefined {\r\n const code = this.resolveEventCode(event);\r\n\r\n if (code === 'ArrowLeft') return this.getLogicalDirection('left');\r\n if (code === 'ArrowRight') return this.getLogicalDirection('right');\r\n\r\n return Object.entries(this.shortcuts).find(\r\n ([, shortcut]) => shortcut.code === code,\r\n )?.[0] as FormNavigatorCommand | undefined;\r\n }\r\n\r\n private resolveEventCode(event: KeyboardEvent): string {\r\n // Home/End may come from the numeric keypad. With NumLock off, `key`\r\n // carries the logical navigation key while `code` stays Numpad7/Numpad1.\r\n if (event.key === 'Home' || event.code === 'Numpad7') return 'Home';\r\n if (event.key === 'End' || event.code === 'Numpad1') return 'End';\r\n\r\n if (event.code) return event.code;\r\n if (/^[a-z]$/i.test(event.key)) return `Key${event.key.toUpperCase()}`;\r\n return event.key;\r\n }\r\n\r\n private getDirectionalCommandForDisplay(\r\n command: FormNavigatorCommand,\r\n ): FormNavigatorCommand {\r\n if (this.direction !== 'rtl') return command;\r\n if (command === 'previous') return 'next';\r\n if (command === 'next') return 'previous';\r\n return command;\r\n }\r\n\r\n private formatShortcutCode(code: string): string {\r\n if (code.startsWith('Key')) return code.slice(3);\r\n if (code.startsWith('Arrow')) return code.slice(5);\r\n return code;\r\n }\r\n\r\n private getLogicalDirection(\r\n key: 'left' | 'right',\r\n ): 'previous' | 'next' {\r\n const isRTL = this.direction === 'rtl';\r\n if (key === 'left') return isRTL ? 'next' : 'previous';\r\n return isRTL ? 'previous' : 'next';\r\n }\r\n\r\n // ==================== Fixed Toolbar ====================\r\n // ==================== Pre-Save Validation ====================\r\n private async runPreSaveValidation(): Promise<boolean> {\r\n if (this.validateBeforeSave) {\r\n try {\r\n const ok = await this.validateBeforeSave();\r\n if (!ok)\r\n this.notifyWarning(\r\n this.messages.VALIDATION_REQUIRED ??\r\n this.adapter.translate('ui.ts.form-navigator.3', 'من فضلك أكمل الحقول المطلوبة.'),\r\n );\r\n return !!ok;\r\n } catch {\r\n this.notifyWarning(\r\n this.messages.VALIDATION_REQUIRED ?? this.adapter.translate('ui.ts.form-navigator.3', 'من فضلك أكمل الحقول المطلوبة.'),\r\n );\r\n return false;\r\n }\r\n }\r\n\r\n if (this.formGroup) {\r\n this.formGroup.markAllAsTouched();\r\n this.formGroup.updateValueAndValidity({\r\n onlySelf: false,\r\n emitEvent: true,\r\n });\r\n const ok = this.formGroup.valid === true;\r\n if (!ok) {\r\n this.notifyWarning(\r\n this.messages.VALIDATION_REQUIRED ?? this.adapter.translate('ui.ts.form-navigator.3', 'من فضلك أكمل الحقول المطلوبة.'),\r\n );\r\n this.focusFirstInvalidControl();\r\n }\r\n return ok;\r\n }\r\n\r\n this.notifyWarning(\r\n this.messages.VALIDATION_REQUIRED ?? this.adapter.translate('ui.ts.form-navigator.3', 'من فضلك أكمل الحقول المطلوبة.'),\r\n );\r\n return false;\r\n }\r\n\r\n private focusFirstInvalidControl(): void {\r\n try {\r\n const el: HTMLElement | null =\r\n (document.querySelector(\r\n '[formControlName].ng-invalid',\r\n ) as HTMLElement) ??\r\n (document.querySelector('.ng-invalid') as HTMLElement);\r\n if (el) {\r\n el.scrollIntoView({ behavior: 'smooth', block: 'center' });\r\n setTimeout(() => el.focus(), 0);\r\n }\r\n } catch {\r\n /* no-op */\r\n }\r\n }\r\n\r\n // ==================== Print Options ====================\r\n\r\n isPrintDisabled = true;\r\n\r\n private computeIsPrintDisabled(): boolean {\r\n if (!this.reportModels) return true;\r\n\r\n if (this.reportModels.length === 0) return true;\r\n\r\n const hasValidItem = this.reportModels.some(\r\n (o) => o && Object.keys(o).length > 0,\r\n );\r\n\r\n return !hasValidItem;\r\n }\r\n\r\n onPrintOptionClick(e: any) {\r\n const reportmodel = e.itemData as ReportModelsDto;\r\n const reportName = reportmodel.reportName;\r\n const text = reportmodel.text;\r\n const idValue =\r\n (this.currentObject as any)[this.idFieldName] ??\r\n (this.currentObject as any)?.id ??\r\n null;\r\n\r\n let reportConfigurationDto: ReportConfigurationDto = {\r\n reportName: reportName,\r\n idValue: idValue,\r\n reportMode: ReportModeEnum.FormReport,\r\n groups: [],\r\n reportTitle: text,\r\n isViewDetails: true,\r\n isViewTerms: true,\r\n };\r\n\r\n // const uniqueKey = `Report-${Date.now()}`;\r\n const uniqueKey = `${reportName}`;\r\n\r\n sessionStorage.setItem(uniqueKey, JSON.stringify(reportConfigurationDto));\r\n\r\n window.open(`/xtra-report/report?key=${uniqueKey}`, '_blank');\r\n this.onPrint.emit();\r\n }\r\n}\r\n","@let perms = permissionsReady$ | async;\r\n@if (perms) {\r\n <div class=\"form-navigator-toolbar\" [class.fn-print-hidden]=\"isPrintDisabled\">\r\n <dx-load-panel\r\n [visible]=\"isNavigating\"\r\n [showIndicator]=\"true\"\r\n [showPane]=\"true\"\r\n [shading]=\"true\"\r\n [position]=\"{ of: 'body' }\"\r\n ></dx-load-panel>\r\n <!-- The save indicator is the shared panel in app.component (raised from\r\n triggerSave via LoadingService) — a second one here painted two overlapping\r\n shades on every save. -->\r\n <dx-toolbar\r\n #toolbarRef\r\n [items]=\"toolbarItems\"\r\n [elementAttr]=\"{ class: 'fn-toolbar' }\"\r\n >\r\n <div *dxTemplate=\"let _ of 'firstTpl'\">\r\n <dx-button\r\n [hint]=\"\r\n ('formNavigator.first' | localize: 'first') +\r\n ' (' +\r\n getShortcut('first') +\r\n ')'\r\n \"\r\n [disabled]=\"!canExecuteCommand('first')\"\r\n (onClick)=\"first()\"\r\n cssClass=\"btn-navigator-icon\"\r\n >\r\n <app-fn-icon name=\"first\" [directional]=\"true\"></app-fn-icon>\r\n </dx-button>\r\n </div>\r\n\r\n <div *dxTemplate=\"let _ of 'prevTpl'\">\r\n <dx-button\r\n (onClick)=\"prev()\"\r\n [disabled]=\"!canExecuteCommand('previous')\"\r\n hint=\"{{ 'formNavigator.previous' | localize: 'previous' }} ({{\r\n getShortcut('previous')\r\n }})\"\r\n cssClass=\"btn-navigator-icon\"\r\n >\r\n <app-fn-icon name=\"prev\" [directional]=\"true\"></app-fn-icon>\r\n </dx-button>\r\n </div>\r\n\r\n <div *dxTemplate=\"let _ of 'nextTpl'\">\r\n <dx-button\r\n (onClick)=\"next()\"\r\n [disabled]=\"!canExecuteCommand('next')\"\r\n hint=\"{{ 'formNavigator.next' | localize: 'next' }} ({{\r\n getShortcut('next')\r\n }})\"\r\n cssClass=\"btn-navigator-icon\"\r\n >\r\n <app-fn-icon name=\"next\" [directional]=\"true\"></app-fn-icon>\r\n </dx-button>\r\n </div>\r\n\r\n <div *dxTemplate=\"let _ of 'lastTpl'\">\r\n <dx-button\r\n (onClick)=\"last()\"\r\n [disabled]=\"!canExecuteCommand('last')\"\r\n hint=\"{{ 'formNavigator.last' | localize: 'last' }} ({{\r\n getShortcut('last')\r\n }})\"\r\n cssClass=\"btn-navigator-icon\"\r\n >\r\n <app-fn-icon name=\"last\" [directional]=\"true\"></app-fn-icon>\r\n </dx-button>\r\n </div>\r\n\r\n <div *dxTemplate=\"let _ of 'newTpl'\">\r\n <dx-button\r\n (onClick)=\"triggerNew()\"\r\n [disabled]=\"!canExecuteCommand('new')\"\r\n hint=\"{{ 'formNavigator.new' | localize: 'new' }} ({{\r\n getShortcut('new')\r\n }})\"\r\n cssClass=\"btn-new-icon\"\r\n >\r\n <app-fn-icon name=\"new\"></app-fn-icon>\r\n </dx-button>\r\n </div>\r\n\r\n <div *dxTemplate=\"let _ of 'saveTpl'\">\r\n <dx-button\r\n (onClick)=\"triggerSave()\"\r\n [disabled]=\"!canExecuteCommand('save')\"\r\n hint=\"{{ 'loc.formNavigator.1' | localize: 'save' }} ({{\r\n getShortcut('save')\r\n }})\"\r\n cssClass=\"btn-save-icon\"\r\n >\r\n <app-fn-icon name=\"save\" accent=\"success\"></app-fn-icon>\r\n </dx-button>\r\n </div>\r\n\r\n <div *dxTemplate=\"let _ of 'deleteTpl'\">\r\n <dx-button\r\n (onClick)=\"triggerDelete()\"\r\n [disabled]=\"!canExecuteCommand('delete')\"\r\n hint=\"{{ 'formNavigator.delete' | localize: 'delete' }} ({{\r\n getShortcut('delete')\r\n }})\"\r\n [elementAttr]=\"{ class: 'btn-delete-icon' }\"\r\n >\r\n <app-fn-icon name=\"delete\" accent=\"danger\"></app-fn-icon>\r\n </dx-button>\r\n </div>\r\n\r\n <div *dxTemplate=\"let _ of 'searchTpl'\">\r\n <dx-button\r\n (onClick)=\"triggerOpenPopup()\"\r\n [disabled]=\"!canExecuteCommand('search')\"\r\n hint=\"{{ 'formNavigator.search' | localize: 'search' }} ({{\r\n getShortcut('search')\r\n }})\"\r\n cssClass=\"btn-search-icon\"\r\n >\r\n <app-fn-icon name=\"search\"></app-fn-icon>\r\n </dx-button>\r\n </div>\r\n\r\n <div *dxTemplate=\"let _ of 'duplicateTpl'\">\r\n <dx-button\r\n (onClick)=\"triggerDuplicate()\"\r\n [disabled]=\"!canExecuteCommand('duplicate')\"\r\n hint=\"{{ 'formNavigator.duplicate' | localize: 'duplicate' }} ({{\r\n getShortcut('duplicate')\r\n }})\"\r\n cssClass=\"btn-duplicate-icon\"\r\n >\r\n <app-fn-icon name=\"duplicate\"></app-fn-icon>\r\n </dx-button>\r\n </div>\r\n\r\n <div *dxTemplate=\"let _ of 'cancelTpl'\">\r\n <dx-button\r\n (onClick)=\"triggerCancel()\"\r\n [disabled]=\"!canExecuteCommand('cancel')\"\r\n hint=\"{{ 'formNavigator.cancel' | localize: 'cancel' }} ({{\r\n getShortcut('cancel')\r\n }})\"\r\n cssClass=\"btn-cancel-icon\"\r\n >\r\n <app-fn-icon name=\"cancel\" accent=\"danger\"></app-fn-icon>\r\n </dx-button>\r\n </div>\r\n\r\n <!-- Refresh btn -->\r\n <div *dxTemplate=\"let _ of 'refreshTpl'\">\r\n <dx-button\r\n (onClick)=\"triggerRefresh()\"\r\n [disabled]=\"!canExecuteCommand('refresh')\"\r\n hint=\"{{ 'formNavigator.refresh' | localize: 'refresh' }} ({{\r\n getShortcut('refresh')\r\n }})\"\r\n cssClass=\"btn-refresh-icon\"\r\n >\r\n <app-fn-icon name=\"refresh\"></app-fn-icon>\r\n </dx-button>\r\n </div>\r\n <div *dxTemplate=\"let _ of 'infoTpl'\">\r\n <dx-button\r\n (onClick)=\"triggerInfo()\"\r\n [disabled]=\"!canExecuteCommand('info')\"\r\n hint=\"{{ 'formNavigator.info' | localize: 'info' }} ({{\r\n getShortcut('info')\r\n }})\"\r\n cssClass=\"btn-info-icon\"\r\n >\r\n <app-fn-icon name=\"info\"></app-fn-icon>\r\n </dx-button>\r\n </div>\r\n\r\n <!-- <div *dxTemplate=\"let _ of 'printerTpl'\">\r\n <dx-button\r\n (onClick)=\"triggerPrint()\"\r\n [disabled]=\"isBtnPrintDisabled || perms?.canPrint !== true\"\r\n hint=\"{{ 'formNavigator.print' | localize : 'print' }} ({{\r\n getShortcut('print')\r\n }})\"\r\n >\r\n <i class=\"ki-outline ki-printer fs-2 text-dark\"></i>\r\n </dx-button>\r\n </div> -->\r\n\r\n <div *dxTemplate=\"let _ of 'subscribeTpl'\">\r\n @if (allowSubscribe && isEditMode && currentRecordId) {\r\n <app-subscribe-button\r\n [recordId]=\"currentRecordId\"\r\n [showStatusChange]=\"hasStatusField\"\r\n ></app-subscribe-button>\r\n }\r\n </div>\r\n\r\n <div *dxTemplate=\"let _ of 'printerTpl'\">\r\n @if (!isPrintDisabled) {\r\n <dx-drop-down-button\r\n [items]=\"reportModels\"\r\n displayExpr=\"text\"\r\n keyExpr=\"reportName\"\r\n [disabled]=\"!canExecuteCommand('print')\"\r\n [hint]=\"\r\n ('formNavigator.print' | localize: 'print') +\r\n ' (' +\r\n getShortcut('print') +\r\n ')'\r\n \"\r\n (onItemClick)=\"onPrintOptionClick($event)\"\r\n stylingMode=\"text\"\r\n [showArrowIcon]=\"false\"\r\n [template]=\"'printBtnTpl'\"\r\n [elementAttr]=\"{ class: 'fn-print-dropdown' }\"\r\n cssClass=\"btn-print-icon\"\r\n [dropDownOptions]=\"{\r\n width: '200px',\r\n }\"\r\n >\r\n <div *dxTemplate=\"let _ of 'printBtnTpl'\">\r\n <app-fn-icon name=\"print\"></app-fn-icon>\r\n </div>\r\n </dx-drop-down-button>\r\n }\r\n </div>\r\n\r\n <div *dxTemplate=\"let _ of 'gapTpl'\">\r\n <span class=\"fn-gap\" aria-hidden=\"true\"></span>\r\n </div>\r\n\r\n <!-- Trailing group separator before the print button. Collapses when the\r\n print button is absent so it doesn't leave a dangling edge gap\r\n (visible as an asymmetric space, notably in RTL). -->\r\n <div *dxTemplate=\"let _ of 'gapEndTpl'\">\r\n <span class=\"fn-gap fn-gap-end\" aria-hidden=\"true\"></span>\r\n </div>\r\n </dx-toolbar>\r\n </div>\r\n}\r\n\r\n<app-lookup-popup></app-lookup-popup>\r\n<app-info-popup #infoPopup></app-info-popup>\r\n","import {\r\n ChangeDetectorRef,\r\n Component,\r\n EventEmitter,\r\n inject,\r\n Input,\r\n OnInit,\r\n Output,\r\n} from '@angular/core';\r\nimport { ActivatedRoute, Router } from '@angular/router';\r\nimport { DxButtonModule, DxToolbarModule } from 'devextreme-angular';\r\nimport { Guid } from 'devextreme/common';\r\nimport validationEngine from 'devextreme/ui/validation_engine';\r\nimport { FORM_NAVIGATOR_ADAPTER } from '../form-navigator/form-navigator-adapter';\r\nimport { FormModeEnum } from '../form-navigator/form-navigator.component';\r\nimport { NavigatorLocalizePipe } from '../form-navigator/navigator-localize.pipe';\r\n\r\n@Component({\r\n selector: 'app-edit-form-buttons',\r\n imports: [DxButtonModule, DxToolbarModule, NavigatorLocalizePipe],\r\n templateUrl: './edit-form-buttons.component.html',\r\n styleUrl: './edit-form-buttons.component.scss',\r\n})\r\nexport class EditFormButtonsComponent<T = any> implements OnInit {\r\n private readonly adapter = inject(FORM_NAVIGATOR_ADAPTER);\r\n constructor(\r\n private cdr: ChangeDetectorRef,\r\n private activatedRoute: ActivatedRoute,\r\n private router: Router,\r\n private route: ActivatedRoute,\r\n ) {}\r\n get messages() { return this.adapter.messages; }\r\n private notifyError(message: string): void { this.adapter.notify('error', message); }\r\n private notifyWarning(message: string): void { this.adapter.notify('warning', message); }\r\n // Rail order: Save · Save & return at the start, Cancel at the end — `after` is\r\n // logical so the layout mirrors correctly in RTL.\r\n toolbarItems = [\r\n { location: 'after', template: 'saveTpl' },\r\n { location: 'after', template: 'saveAndReturnTpl' },\r\n { location: 'after', template: 'closeTpl' },\r\n ];\r\n\r\n @Input() saveText: string = 'Save';\r\n @Input() closeText: string = 'Close';\r\n @Input() saveAndReturnText: string = 'Save and Return';\r\n @Input() saveIcon: string = 'save';\r\n @Input() closeIcon: string = 'close';\r\n @Input() saveAndReturnIcon: string = 'check';\r\n\r\n @Input() currentObject: T | null = null;\r\n @Input() idFieldName: any;\r\n\r\n @Input() getById?: (id: Guid) => Promise<{ item: T } | null>;\r\n\r\n @Input() onNew?: () => void;\r\n @Input() onDataChanged?: (data: T) => void;\r\n\r\n @Input() onFormModeChanged?: (\r\n lastFormMode: FormModeEnum,\r\n newFormMode: FormModeEnum,\r\n ) => void;\r\n\r\n @Input() onLoadDataSuccess?: (data: T) => void;\r\n @Input() onLoadDataFailure?: (error: any) => void;\r\n @Input() onLoadDataComplete?: () => void;\r\n\r\n @Input() insertCallback?: (data: T) => Promise<T>;\r\n @Input() onInsertSuccess?: (data: T) => void;\r\n @Input() onInsertFailure?: (error: any) => void;\r\n @Input() onInsertComplete?: () => void;\r\n\r\n @Input() updateCallback?: (id: any, data: T) => Promise<T>;\r\n @Input() onUpdateSuccess?: (data: T) => void;\r\n @Input() onUpdateFailure?: (error: any) => void;\r\n @Input() onUpdateComplete?: () => void;\r\n\r\n @Input() onSaveSuccess?: () => void;\r\n @Input() onSaveFailure?: (error: any) => void;\r\n @Input() onSaveCompleted?: () => void;\r\n /**\r\n * Workflow allow_edit lock. While true both save buttons are disabled and runSave()\r\n * refuses, so the user sees the lock before the round-trip.\r\n */\r\n @Input() editingLocked = false;\r\n /** Runs after validation passed; resolving false cancels the save silently. */\r\n @Input() confirmBeforeSave?: () => Promise<boolean>;\r\n\r\n /**\r\n * Pre-save validation gate (same contract as FormNavigator). Returns false when the\r\n * form is invalid; the host shows its own inline field messages, so we just stop\r\n * silently — no error toast. Runs BEFORE insert/update, so a validation failure never\r\n * reaches the save path (and never produces the generic \"Validation failed\" rejection).\r\n */\r\n @Input() validateBeforeSave?: () => Promise<boolean>;\r\n\r\n // ── Embedded (popup) host mode ─────────────────────────────────────────────\r\n // This component is the ONLY place where the external edit-form screens touch the\r\n // browser tab and the URL: it reads mode/id from the query string, rewrites the URL from\r\n // `new` to `edit` after the first save, and ends the screen with `window.close()` plus a\r\n // `postMessage` back to the opener. That is exactly what has to change for the screen to\r\n // live in a popup over its grid instead of in a tab of its own — so every host screen\r\n // gets the whole conversion by forwarding these three inputs.\r\n //\r\n // Route mode is untouched: no input set means the component behaves exactly as before.\r\n @Input() embedded = false;\r\n @Input() embeddedMode: 'new' | 'edit' = 'new';\r\n @Input() embeddedId: string | null = null;\r\n\r\n @Output() saved = new EventEmitter<void>();\r\n @Output() closed = new EventEmitter<void>();\r\n\r\n isSaving = false;\r\n formMode: FormModeEnum = FormModeEnum.Insert;\r\n id: any;\r\n\r\n async ngOnInit() {\r\n // Embedded, the parameters arrive once as inputs. There is nothing to subscribe to —\r\n // the URL belongs to the grid behind the popup and carries no mode/id at all — and the\r\n // popup host recreates this component for every open, which is what the subscription\r\n // used to cover in route mode (Angular reuses the component across query-param changes).\r\n if (this.embedded) {\r\n await this.applyFormMode(this.embeddedMode, this.embeddedId);\r\n return;\r\n }\r\n\r\n this.activatedRoute.queryParamMap.subscribe(async (q) => {\r\n await this.applyFormMode(q.get('mode'), q.get('id'));\r\n });\r\n }\r\n\r\n private async applyFormMode(\r\n mode: string | null,\r\n id: string | null,\r\n ): Promise<void> {\r\n const normalized = (mode ?? 'new').toLowerCase();\r\n\r\n this.id = id;\r\n\r\n const lastFormMode = this.formMode;\r\n this.formMode =\r\n normalized === 'edit' ? FormModeEnum.Edit : FormModeEnum.Insert;\r\n this.onFormModeChanged?.(lastFormMode, this.formMode);\r\n\r\n if (this.formMode === FormModeEnum.Edit && this.id) {\r\n await this.getObjectById();\r\n } else {\r\n this.triggerNew();\r\n }\r\n }\r\n\r\n /**\r\n * Keeps the URL in step with the record in route mode (so a refresh reopens the same\r\n * one). Embedded there is no URL of ours to keep in step, and writing `id`/`mode` onto\r\n * the grid's URL would be wrong.\r\n */\r\n private syncQueryParams(\r\n queryParams: Record<string, unknown>,\r\n replaceUrl = false,\r\n ): void {\r\n if (this.embedded) return;\r\n this.router.navigate([], {\r\n relativeTo: this.route,\r\n queryParams,\r\n queryParamsHandling: 'merge',\r\n replaceUrl,\r\n });\r\n }\r\n\r\n async getObjectById(): Promise<void> {\r\n const result = await this.getById?.(this.id);\r\n\r\n if (!result?.item) {\r\n this.notifyError(this.messages.NOT_FOUND);\r\n this.onLoadDataFailure?.(this.messages.NOT_FOUND);\r\n return;\r\n }\r\n this.onLoadDataSuccess?.(result?.item as T);\r\n this.onDataChanged?.(result.item!);\r\n }\r\n\r\n triggerNew() {\r\n this.currentObject = null;\r\n this.onNew?.();\r\n }\r\n\r\n triggerClose(): void {\r\n if (this.embedded) {\r\n this.closed.emit();\r\n return;\r\n }\r\n window.close();\r\n }\r\n\r\n /** Host contract: the popup's own close button routes through the normal close path. */\r\n requestClose(): void {\r\n this.triggerClose();\r\n }\r\n\r\n /**\r\n * Tells the tab that opened this one to refresh its grid. Embedded there is no opener —\r\n * the host is listening to `saved` instead, in the same document.\r\n */\r\n private notifyOpenerSaved(): void {\r\n if (this.embedded) {\r\n this.saved.emit();\r\n return;\r\n }\r\n window.opener?.postMessage(\r\n { type: 'EXTERNAL_FORM_SAVED' },\r\n window.location.origin,\r\n );\r\n }\r\n\r\n async triggerSaveAndReturn(): Promise<void> {\r\n await this.runSave(TriggerSaveModeEnum.SaveAndReturn);\r\n }\r\n\r\n async triggerSave(): Promise<void> {\r\n await this.runSave(TriggerSaveModeEnum.Save);\r\n }\r\n\r\n /**\r\n * Pull the human-readable text out of whatever the save path rejected with: the\r\n * ErrorInterceptor rethrows an `Error` carrying the backend message, but a plain string\r\n * is possible too, so both shapes are handled before falling back.\r\n */\r\n private notifySaveError(err: any): void {\r\n const msg =\r\n (typeof err === 'string' ? err : err?.message) ??\r\n this.messages.SAVE_ERROR;\r\n this.notifyError(msg);\r\n }\r\n\r\n /**\r\n * One save attempt, from the click until the load panel comes back down.\r\n *\r\n * 1. `panelRaised` is a LOCAL of this invocation, so every run releases exactly the raise\r\n * it took (a shared field made overlapping runs leave the panel up forever).\r\n * 2. `isSaving` is set BEFORE the first `await`, so a second click during an in-flight\r\n * save is dropped instead of posting the same record twice.\r\n */\r\n private async runSave(triggerSaveMode: TriggerSaveModeEnum): Promise<void> {\r\n if (this.isSaving || this.editingLocked) return;\r\n this.isSaving = true;\r\n\r\n let panelRaised = false;\r\n try {\r\n if (!(await this.passesPreSaveValidation())) return;\r\n if (this.confirmBeforeSave && !(await this.confirmBeforeSave())) return;\r\n\r\n // Shared panel in app.component — see FormNavigator.triggerSave.\r\n this.adapter.showLoading(\r\n this.adapter.translate('ui.ts.edit-form-buttons.1', 'جاري الحفظ...'),\r\n );\r\n panelRaised = true;\r\n\r\n if (this.formMode === FormModeEnum.Insert) {\r\n await this.handleInsert(triggerSaveMode);\r\n } else {\r\n await this.handleUpdate(triggerSaveMode);\r\n }\r\n } catch (err) {\r\n this.notifySaveError(err);\r\n console.error('Save failed:', err);\r\n } finally {\r\n if (panelRaised) this.adapter.hideLoading();\r\n this.isSaving = false;\r\n this.onSaveCompleted?.();\r\n }\r\n }\r\n\r\n /**\r\n * Pre-save validation gate (mirrors FormNavigator). Failure is silent on purpose — the\r\n * form already shows inline field messages, so no error toast is needed and the save path\r\n * (insert/update) is never reached.\r\n */\r\n private async passesPreSaveValidation(): Promise<boolean> {\r\n if (this.validateBeforeSave && !(await this.validateBeforeSave())) {\r\n return false;\r\n }\r\n\r\n const validationGroup = validationEngine.getGroupConfig('validationGroup1');\r\n if (validationGroup) {\r\n return !!validationEngine.validateGroup('validationGroup1').isValid;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n private async handleInsert(\r\n triggerSaveMode: TriggerSaveModeEnum,\r\n ): Promise<void> {\r\n if (!this.insertCallback || !this.currentObject) {\r\n this.notifyError(this.messages.SAVE_ERROR);\r\n this.onSaveFailure?.(this.messages.SAVE_ERROR);\r\n return;\r\n }\r\n\r\n try {\r\n const inserted = await this.insertCallback(this.currentObject);\r\n if (triggerSaveMode === TriggerSaveModeEnum.Save) {\r\n const id = (inserted as any)[this.idFieldName];\r\n this.id = id;\r\n this.syncQueryParams({ mode: 'edit', id: id, someOtherParam: null });\r\n\r\n const lastFormMode = this.formMode;\r\n this.formMode = FormModeEnum.Edit;\r\n this.onFormModeChanged?.(lastFormMode, this.formMode);\r\n\r\n this.onLoadDataSuccess?.(inserted);\r\n this.onSaveSuccess?.();\r\n this.saved.emit();\r\n } else if (triggerSaveMode === TriggerSaveModeEnum.SaveAndReturn) {\r\n this.notifyOpenerSaved();\r\n this.triggerClose();\r\n }\r\n } catch (err) {\r\n // A local validation block rejects with the literal English 'Validation\r\n // failed'. It is NOT a real save error — the form already shows inline field\r\n // feedback — so surface the LOCALIZED required-fields message (ar/en) and stop,\r\n // without propagating it. Real save errors keep their own localized handling.\r\n if (err === 'Validation failed') {\r\n this.notifyError(this.messages.VALIDATION_REQUIRED);\r\n return;\r\n }\r\n // Reached only for REAL save errors — validation is stopped earlier by the\r\n // passesPreSaveValidation gate. Report once here; the outer catch only logs.\r\n this.onSaveFailure?.(err);\r\n throw err;\r\n } finally {\r\n }\r\n }\r\n\r\n private async handleUpdate(\r\n triggerSaveMode: TriggerSaveModeEnum,\r\n ): Promise<void> {\r\n if (!this.updateCallback || !this.currentObject) {\r\n this.notifyWarning(this.messages.SAVE_ERROR);\r\n this.onSaveFailure?.(this.messages.SAVE_ERROR);\r\n return;\r\n }\r\n\r\n try {\r\n //const id = //(this.currentObject as any).id;\r\n\r\n const updated = await this.updateCallback(this.id, this.currentObject);\r\n if (triggerSaveMode === TriggerSaveModeEnum.Save) {\r\n this.onLoadDataSuccess?.(updated);\r\n this.onSaveSuccess?.();\r\n this.saved.emit();\r\n } else if (triggerSaveMode === TriggerSaveModeEnum.SaveAndReturn) {\r\n this.notifyOpenerSaved();\r\n this.triggerClose();\r\n }\r\n } catch (err) {\r\n if (err === 'Validation failed') {\r\n this.notifyError(this.messages.VALIDATION_REQUIRED);\r\n return;\r\n }\r\n // Reached only for REAL save errors — validation is stopped earlier by the\r\n // passesPreSaveValidation gate. Report once here; the outer catch only logs.\r\n this.onSaveFailure?.(err);\r\n throw err;\r\n } finally {\r\n }\r\n }\r\n\r\n /** Currently unused (no caller in the app), kept working in both modes. */\r\n setEditMode(id: string) {\r\n if (this.embedded) {\r\n // Route mode gets this for free: the navigation re-fires the queryParamMap\r\n // subscription, which switches the mode and reloads the record.\r\n void this.applyFormMode('edit', id);\r\n return;\r\n }\r\n this.syncQueryParams({ mode: 'edit', id }, true);\r\n }\r\n}\r\n\r\nexport enum TriggerSaveModeEnum {\r\n Save = 1,\r\n SaveAndReturn = 2,\r\n}\r\n","<!--\r\n Commit rail (DESIGN.html §6): sticks to the bottom of the form card so «حفظ» never\r\n scrolls out of reach, and carries a strict order — Save = the ONE brand Fill,\r\n Save & return = Tint, Cancel = Bare in the opposite corner. The weights come from\r\n stylingMode/type through flexora-buttons.scss; no colour is written here.\r\n The save indicator is the shared panel in app.component — see runSave().\r\n-->\r\n<div class=\"edit-form-buttons-toolbar fx-rail\">\r\n <dx-toolbar\r\n #toolbarRef\r\n [items]=\"toolbarItems\"\r\n [elementAttr]=\"{ class: 'fn-toolbar fx-rail-toolbar' }\"\r\n >\r\n <div *dxTemplate=\"let _ of 'saveTpl'\">\r\n <dx-button\r\n [text]=\"'editform.save' | localize: 'حفظ'\"\r\n [icon]=\"saveIcon\"\r\n [hint]=\"('editform.save' | localize: 'حفظ') + ' (Ctrl+S)'\"\r\n [disabled]=\"isSaving || editingLocked\"\r\n type=\"default\"\r\n stylingMode=\"contained\"\r\n [elementAttr]=\"{ class: isSaving ? 'fx-loading' : '' }\"\r\n (onClick)=\"triggerSave()\"\r\n ></dx-button>\r\n </div>\r\n <div *dxTemplate=\"let _ of 'saveAndReturnTpl'\">\r\n <dx-button\r\n [text]=\"'editform.saveAndReturn' | localize: 'حفظ و رجوع'\"\r\n [icon]=\"saveAndReturnIcon\"\r\n [disabled]=\"isSaving || editingLocked\"\r\n type=\"default\"\r\n stylingMode=\"contained\"\r\n [elementAttr]=\"{ class: 'fx-tint' }\"\r\n (onClick)=\"triggerSaveAndReturn()\"\r\n ></dx-button>\r\n </div>\r\n <div *dxTemplate=\"let _ of 'closeTpl'\">\r\n <dx-button\r\n [text]=\"'editform.close' | localize: 'إغلاق'\"\r\n [icon]=\"closeIcon\"\r\n stylingMode=\"text\"\r\n (onClick)=\"triggerClose()\"\r\n ></dx-button>\r\n </div>\r\n </dx-toolbar>\r\n</div>\r\n","import { EventEmitter } from '@angular/core';\r\n\r\n/**\r\n * Contract a *form screen* implements so it can be hosted inside a popup on top of the grid\r\n * it belongs to, instead of being opened at its own `…/form` route in a second browser tab.\r\n *\r\n * Why a contract and not a base class: the form screens have nothing else in common — some\r\n * are metadata-driven (DynamicForm/DynamicFormAccordion), some are hand-written\r\n * (AddBranch, DashboardForm) — and they already extend different bases. All the host needs\r\n * is to hand over three parameters and be told when the screen is finished.\r\n *\r\n * Anything that does NOT implement this stays on the old behaviour: DynamicGridComponent\r\n * checks with `isEmbeddedFormHost()` before creating the component and falls back to\r\n * `window.open` when the check fails, so an unconverted screen keeps working untouched.\r\n */\r\nexport interface EmbeddedFormHost {\r\n /** True while hosted in a popup. Route mode must behave exactly as it did before. */\r\n embedded: boolean;\r\n embeddedMode: 'new' | 'edit';\r\n embeddedId: string | null;\r\n /**\r\n * The `sys_job` id of the FORM (`…/form` has a job row of its own, separate from the\r\n * grid's). Metadata-driven screens resolve their `dynamic_form` from it; screens that\r\n * do not use it leave the property out.\r\n */\r\n embeddedJobId?: string | null;\r\n\r\n /** Raised after every successful save, so the host can consider its list stale. */\r\n saved?: EventEmitter<void>;\r\n /** Raised when the screen is finished — the host closes the popup. */\r\n closed: EventEmitter<void>;\r\n\r\n /**\r\n * The host calls this for the popup's own close button, so closing from outside goes\r\n * through the screen's normal close path (including any unsaved-changes prompt it has)\r\n * instead of pulling the component out from underneath it.\r\n */\r\n requestClose(): void | Promise<void>;\r\n}\r\n\r\nexport function isEmbeddedFormHost(value: unknown): value is EmbeddedFormHost {\r\n const candidate = value as Partial<EmbeddedFormHost> | null;\r\n return (\r\n !!candidate &&\r\n typeof candidate.requestClose === 'function' &&\r\n candidate.closed instanceof EventEmitter\r\n );\r\n}\r\n","/**\r\n * Full-screen toggle for the popup that hosts an embedded add/edit form (see\r\n * EmbeddedFormHost). One class for every host so the button, its icon/hint and the\r\n * reset-on-close rule cannot drift between screens.\r\n *\r\n * Template (inside the host's <dx-popup>):\r\n * [fullScreen]=\"fullScreen.active\"\r\n * <dxi-popup-toolbar-item toolbar=\"top\" location=\"after\" widget=\"dxButton\"\r\n * [options]=\"fullScreen.buttonOptions\"></dxi-popup-toolbar-item>\r\n *\r\n * `buttonOptions` is a STORED object, rebuilt only when the state flips: a new options\r\n * reference on every change-detection pass makes DevExtreme re-create the button each time.\r\n */\r\nexport class PopupFullScreenToggle {\r\n active = false;\r\n buttonOptions: Record<string, unknown>;\r\n\r\n constructor(\r\n private readonly t: (key: string, fallback?: string) => string,\r\n private readonly onChange?: () => void,\r\n ) {\r\n this.buttonOptions = this.build();\r\n }\r\n\r\n set(value: boolean): void {\r\n if (this.active === value) return;\r\n this.active = value;\r\n this.buttonOptions = this.build();\r\n this.onChange?.();\r\n }\r\n\r\n /** Call from the popup's onHidden so every opening starts at the normal size. */\r\n reset(): void {\r\n this.set(false);\r\n }\r\n\r\n private build(): Record<string, unknown> {\r\n const on = this.active;\r\n return {\r\n icon: on ? 'collapse' : 'fullscreen',\r\n stylingMode: 'text',\r\n hint: on\r\n ? this.t('loc.dynamicGrid.exitFullScreen', 'تصغير')\r\n : this.t('loc.dynamicGrid.fullScreen', 'ملء الشاشة'),\r\n onClick: () => this.set(!this.active),\r\n };\r\n }\r\n}\r\n","import { Directive, OnInit, inject } from '@angular/core';\r\nimport { DxPopupComponent } from 'devextreme-angular';\r\nimport { REUSABLE_COMPONENTS_CONFIG } from '../reusable-components.config';\r\nimport { PopupFullScreenToggle } from './popup-full-screen-toggle';\r\n\r\n/** Marks OUR toolbar item so it can be found again even if DevExtreme stores a copy. */\r\nconst TOGGLE_ITEM_CLASS = 'app-popup-full-screen-toggle';\r\n\r\n/**\r\n * Opt-in full-screen toggle for a hand-written edit popup:\r\n *\r\n * <dx-popup appPopupFullScreen [(visible)]=\"…\" …>\r\n *\r\n * For the screens whose add/edit form is their own <dx-popup> (not the grid's popup edit\r\n * form — that one is covered by AppPopupEditFullScreenDirective). Opt-in, not a\r\n * `dx-popup` selector, on purpose: confirmation, lookup and attachment popups must not get it.\r\n *\r\n * - The button goes in the title bar, APPENDED to whatever toolbar items the popup already\r\n * has (these screens keep Save/Cancel inside their content, so nothing is replaced).\r\n * - Every opening starts at the normal size; drag/resize are off while full screen and are\r\n * restored to the screen's own values afterwards.\r\n */\r\n@Directive({\r\n selector: 'dx-popup[appPopupFullScreen]',\r\n standalone: true,\r\n})\r\nexport class AppPopupFullScreenDirective implements OnInit {\r\n private readonly popup = inject(DxPopupComponent, { self: true });\r\n private readonly config = inject(REUSABLE_COMPONENTS_CONFIG, { optional: true });\r\n private readonly t = (key: string, fallback: string): string =>\r\n this.config?.translate?.(key, fallback) ?? fallback;\r\n private readonly toggle = new PopupFullScreenToggle(this.t, () => this.apply());\r\n\r\n private instance: any;\r\n private originalsCaptured = false;\r\n private originalDrag?: boolean;\r\n private originalResize?: boolean;\r\n\r\n ngOnInit(): void {\r\n const attach = (instance: any) => {\r\n if (!instance || this.instance) return;\r\n this.instance = instance;\r\n instance.on('showing', () => this.onShowing());\r\n instance.on('hidden', () => this.toggle.reset());\r\n };\r\n\r\n const existing = (this.popup as any).instance;\r\n if (existing) attach(existing);\r\n else this.popup.onInitialized.subscribe((e: any) => attach(e?.component));\r\n }\r\n\r\n private onShowing(): void {\r\n const i = this.instance;\r\n if (!this.originalsCaptured) {\r\n // Read before this directive has changed anything.\r\n this.originalDrag = i.option('dragEnabled');\r\n this.originalResize = i.option('resizeEnabled');\r\n this.originalsCaptured = true;\r\n }\r\n // Normal size on every opening; apply() also (re)installs the button, since a\r\n // re-bound toolbarItems from the template would have dropped it.\r\n this.toggle.set(false);\r\n this.apply();\r\n }\r\n\r\n private apply(): void {\r\n const i = this.instance;\r\n if (!i) return;\r\n const active = this.toggle.active;\r\n\r\n i.option('fullScreen', active);\r\n i.option('dragEnabled', active ? false : (this.originalDrag ?? false));\r\n i.option('resizeEnabled', active ? false : (this.originalResize ?? false));\r\n\r\n const others = ((i.option('toolbarItems') as any[]) ?? []).filter(\r\n (item) => item?.cssClass !== TOGGLE_ITEM_CLASS,\r\n );\r\n i.option('toolbarItems', [\r\n ...others,\r\n {\r\n toolbar: 'top',\r\n location: 'after',\r\n widget: 'dxButton',\r\n cssClass: TOGGLE_ITEM_CLASS,\r\n options: this.toggle.buttonOptions,\r\n },\r\n ]);\r\n }\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport { AppPopupFullScreenDirective } from '../embedded-form/app-popup-full-screen.directive';\r\nimport {\r\n Component,\r\n EventEmitter,\r\n Input,\r\n OnChanges,\r\n Output,\r\n SimpleChanges,\r\n ViewChild,\r\n} from '@angular/core';\r\nimport {\r\n DxButtonModule,\r\n DxListComponent,\r\n DxListModule,\r\n DxPopupModule,\r\n} from 'devextreme-angular';\r\n\r\n/** سطر تحليل متاح للإشارة إليه داخل المعادلة. */\r\nexport interface EquationLine {\r\n line_No: number;\r\n label: string;\r\n}\r\n\r\n/** رمز واحد داخل المعادلة (مرجع سطر / عامل). */\r\ntype Token =\r\n | { kind: 'ref'; lineNo: number }\r\n | { kind: 'op'; value: '+' | '-' | '*' | '/' };\r\n\r\n/**\r\n * محرّر معادلات لسطور التحليل المالي (نوع السطر = FORMULA / SUBTOTAL).\r\n *\r\n * يبني المعادلة كقائمة رموز (Tokens) مرتبة بدل نص حر، فيمنع بنيوياً أي إدخال\r\n * غير صالح. المخرَج مقيَّد **تماماً** بقواعد الـ backend\r\n * (`FinancialAnalysisLineService.ValidFormulaPattern`):\r\n * `^\\s*-?\\s*\\[\\d+\\]\\s*([+\\-*\\/]\\s*\\[\\d+\\]\\s*)*$`\r\n * أي: إشارة سالبة اختيارية في البداية، ثم مرجع سطر `[n]`، ثم صفر أو أكثر من\r\n * (عامل `+ - * /` ثم مرجع `[n]`). **لا أقواس ولا أرقام ثابتة** — المُعامَلات\r\n * دائماً مراجع سطور، وإلا رفض الـ backend المعادلة.\r\n */\r\n@Component({\r\n selector: 'app-equation-editor',\r\n standalone: true,\r\n imports: [CommonModule, AppPopupFullScreenDirective, DxPopupModule, DxButtonModule, DxListModule],\r\n templateUrl: './equation-editor.component.html',\r\n styleUrl: './equation-editor.component.scss',\r\n})\r\nexport class EquationEditorComponent implements OnChanges {\r\n /** Optional host translation function; falls back to the supplied text. */\r\n @Input() translate: (key: string, fallback: string) => string = (\r\n _key,\r\n fallback,\r\n ) => fallback;\r\n\r\n protected t(key: string, fallback: string): string {\r\n return this.translate(key, fallback);\r\n }\r\n /** السطور المتاحة للإشارة إليها (تُمرَّر محدَّثة عند كل فتح). */\r\n @Input() lines: EquationLine[] = [];\r\n /** رقم السطر الحالي — يُستبعد من قائمة الاختيار لمنع الإشارة الذاتية. */\r\n @Input() currentLineNo: number | null = null;\r\n /** المعادلة الحالية (لوضع التعديل). */\r\n @Input() value: string | null = null;\r\n /** إظهار الضرب/القسمة (× ÷) بجانب الجمع/الطرح. */\r\n @Input() allowMultiplyDivide = true;\r\n /** إظهار/إخفاء البوب أب. */\r\n @Input() visible = false;\r\n\r\n /** يُطلق عند الحفظ حاملاً نص المعادلة `[1]+[2]`. */\r\n @Output() save = new EventEmitter<string>();\r\n /** يُطلق عند الإلغاء/الإغلاق. */\r\n @Output() closed = new EventEmitter<void>();\r\n\r\n @ViewChild('lineList') lineList?: DxListComponent;\r\n\r\n tokens: Token[] = [];\r\n /**\r\n * Keep the dxList data source reference stable between change-detection passes.\r\n * Returning `lines.filter(...)` from a template-bound getter makes DevExtreme\r\n * replace/re-render its items while a pointer interaction is in progress,\r\n * which can prevent `onItemClick` from being raised.\r\n */\r\n pickableLines: EquationLine[] = [];\r\n\r\n /** بعد ظهور البوب أب فعلاً: أعِد رسم القائمة لتصحيح أبعاد التمرير/النقر\r\n * (القائمة تُنشأ أحياناً قبل قياس البوب أب فيتعطّل التمرير والاختيار). */\r\n onPopupShown(): void {\r\n this.lineList?.instance?.repaint();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['lines'] || changes['currentLineNo']) {\r\n this.pickableLines = (this.lines ?? []).filter(\r\n (line) => line.line_No !== this.currentLineNo,\r\n );\r\n }\r\n\r\n // عند فتح البوب أب: أعِد بناء الرموز من المعادلة المخزَّنة.\r\n if (changes['visible'] && this.visible) {\r\n this.tokens = this.parse(this.value ?? '');\r\n }\r\n }\r\n\r\n // ─── قواعد النحو: ماذا يُسمح بعد آخر رمز ──────────────────────────────────\r\n private get lastKind(): Token['kind'] | null {\r\n return this.tokens.length ? this.tokens[this.tokens.length - 1].kind : null;\r\n }\r\n\r\n /** يُسمح بمُعامَل (مرجع سطر) بعد: البداية أو عامل. */\r\n get allowsOperand(): boolean {\r\n const k = this.lastKind;\r\n return k === null || k === 'op';\r\n }\r\n\r\n /** يُسمح بعامل بعد: مرجع سطر. الاستثناء: سالب واحد في البداية فقط. */\r\n get allowsOperator(): boolean {\r\n return this.lastKind === 'ref';\r\n }\r\n\r\n /** هل يُسمح بهذا العامل تحديداً الآن؟ (يشمل السالب الأوّلي). */\r\n canAddOp(value: '+' | '-' | '*' | '/'): boolean {\r\n return this.allowsOperator || (this.tokens.length === 0 && value === '-');\r\n }\r\n\r\n // ─── الإدراج ──────────────────────────────────────────────────────────────\r\n addRef(lineNo: number): void {\r\n if (!this.allowsOperand) return;\r\n this.tokens = [...this.tokens, { kind: 'ref', lineNo }];\r\n }\r\n\r\n addOp(value: '+' | '-' | '*' | '/'): void {\r\n if (!this.canAddOp(value)) return;\r\n this.tokens = [...this.tokens, { kind: 'op', value }];\r\n }\r\n\r\n backspace(): void {\r\n this.tokens = this.tokens.slice(0, -1);\r\n }\r\n\r\n clearAll(): void {\r\n this.tokens = [];\r\n }\r\n\r\n // ─── العرض ────────────────────────────────────────────────────────────────\r\n /** نص الرمز كما يظهر في شريط المعادلة. */\r\n tokenChip(t: Token): string {\r\n if (t.kind === 'ref') {\r\n const line = this.lines.find((l) => l.line_No === t.lineNo);\r\n return line ? `${t.lineNo} · ${line.label}` : `[${t.lineNo}]`;\r\n }\r\n return this.opSymbol(t.value);\r\n }\r\n\r\n opSymbol(v: string): string {\r\n return { '+': '+', '-': '−', '*': '×', '/': '÷' }[v] ?? v;\r\n }\r\n\r\n /** معاينة مقروءة (بأسماء السطور بدل `[n]`). */\r\n get preview(): string {\r\n if (!this.tokens.length) return '—';\r\n return this.tokens\r\n .map((t) => {\r\n if (t.kind === 'ref') {\r\n const line = this.lines.find((l) => l.line_No === t.lineNo);\r\n return `(${line ? line.label : t.lineNo})`;\r\n }\r\n return ` ${this.opSymbol(t.value)} `;\r\n })\r\n .join('')\r\n .replace(/\\s+/g, ' ')\r\n .trim();\r\n }\r\n\r\n // ─── التحقق ───────────────────────────────────────────────────────────────\r\n get hasReference(): boolean {\r\n return this.tokens.some((t) => t.kind === 'ref');\r\n }\r\n\r\n /** صحيحة عندما: بها مرجع واحد على الأقل وتنتهي بمرجع (لا عامل معلّق). */\r\n get isValid(): boolean {\r\n return this.tokens.length > 0 && this.hasReference && this.allowsOperator;\r\n }\r\n\r\n get validationMessage(): string {\r\n if (!this.tokens.length) return '';\r\n if (!this.allowsOperator)\r\n return this.t(\r\n 'equationEditor.endWithLine',\r\n 'أكمل المعادلة بسطر بعد العامل',\r\n );\r\n if (!this.hasReference)\r\n return this.t(\r\n 'equationEditor.needReference',\r\n 'يجب أن تشير المعادلة إلى سطر واحد على الأقل',\r\n );\r\n return '';\r\n }\r\n\r\n // ─── التسلسل/التحليل ──────────────────────────────────────────────────────\r\n private serialize(): string {\r\n return this.tokens\r\n .map((t) => (t.kind === 'ref' ? `[${t.lineNo}]` : t.value))\r\n .join('');\r\n }\r\n\r\n private parse(expr: string): Token[] {\r\n const out: Token[] = [];\r\n if (!expr) return out;\r\n // يقرأ فقط المراجع والعوامل — أي رموز أخرى (أقواس/أرقام قديمة) تُتجاهَل.\r\n const re = /\\[(\\d+)\\]|[+\\-*/]/g;\r\n let m: RegExpExecArray | null;\r\n while ((m = re.exec(expr)) !== null) {\r\n if (m[1] !== undefined) {\r\n out.push({ kind: 'ref', lineNo: parseInt(m[1], 10) });\r\n } else {\r\n out.push({ kind: 'op', value: m[0] as '+' | '-' | '*' | '/' });\r\n }\r\n }\r\n return out;\r\n }\r\n\r\n // ─── الأزرار السفلية ──────────────────────────────────────────────────────\r\n onSave(): void {\r\n if (!this.isValid) return;\r\n this.save.emit(this.serialize());\r\n }\r\n\r\n onCancel(): void {\r\n this.closed.emit();\r\n }\r\n\r\n onPopupHiding(): void {\r\n this.closed.emit();\r\n }\r\n}\r\n","<dx-popup\r\n appPopupFullScreen\r\n [visible]=\"visible\"\r\n [showTitle]=\"true\"\r\n [title]=\"t('equationEditor.title', 'محرّر المعادلة')\"\r\n [width]=\"640\"\r\n [height]=\"'auto'\"\r\n [maxHeight]=\"'90vh'\"\r\n [dragEnabled]=\"true\"\r\n [resizeEnabled]=\"true\"\r\n [hideOnOutsideClick]=\"false\"\r\n (onHiding)=\"onPopupHiding()\"\r\n (onShown)=\"onPopupShown()\"\r\n>\r\n <div *dxTemplate=\"let data of 'content'\" class=\"eq-editor\">\r\n <section class=\"eq-section eq-section--expression\">\r\n <!-- شريط المعادلة -->\r\n <div class=\"eq-label\">{{ t('equationEditor.expression', 'المعادلة') }}</div>\r\n <div class=\"eq-strip\" dir=\"ltr\">\r\n <ng-container *ngIf=\"tokens.length; else emptyStrip\">\r\n <span\r\n *ngFor=\"let tk of tokens\"\r\n class=\"eq-chip\"\r\n [class.eq-chip--ref]=\"tk.kind === 'ref'\"\r\n [class.eq-chip--op]=\"tk.kind !== 'ref'\"\r\n >\r\n {{ tokenChip(tk) }}\r\n </span>\r\n </ng-container>\r\n <ng-template #emptyStrip>\r\n <span class=\"eq-hint\">{{\r\n t('equationEditor.startHint', 'اختر سطراً للبدء')\r\n }}</span>\r\n </ng-template>\r\n </div>\r\n\r\n <!-- حالة التحقق -->\r\n <div class=\"eq-status\" [class.eq-status--ok]=\"isValid\">\r\n <ng-container *ngIf=\"tokens.length\">\r\n <i\r\n class=\"dx-icon\"\r\n [class.dx-icon-check]=\"isValid\"\r\n [class.dx-icon-warning]=\"!isValid\"\r\n ></i>\r\n <span>{{\r\n isValid\r\n ? t('equationEditor.valid', 'معادلة صحيحة')\r\n : validationMessage\r\n }}</span>\r\n </ng-container>\r\n </div>\r\n </section>\r\n\r\n <section class=\"eq-section\">\r\n <!-- السطور المتاحة -->\r\n <div class=\"eq-label\">\r\n {{ t('equationEditor.availableLines', 'السطور المتاحة') }}\r\n </div>\r\n <dx-list\r\n #lineList\r\n class=\"eq-list\"\r\n [class.eq-list--muted]=\"!allowsOperand\"\r\n [dataSource]=\"pickableLines\"\r\n keyExpr=\"line_No\"\r\n [height]=\"180\"\r\n [useNativeScrolling]=\"true\"\r\n [searchEnabled]=\"true\"\r\n [searchExpr]=\"['line_No', 'label']\"\r\n searchMode=\"contains\"\r\n [searchEditorOptions]=\"{\r\n placeholder: t('equationEditor.searchLine', 'ابحث برقم السطر أو الاسم'),\r\n showClearButton: true,\r\n }\"\r\n selectionMode=\"none\"\r\n [noDataText]=\"t('equationEditor.noLines', 'لا توجد سطور متاحة')\"\r\n >\r\n <button\r\n *dxTemplate=\"let ln of 'item'\"\r\n type=\"button\"\r\n class=\"eq-list-item\"\r\n [disabled]=\"!allowsOperand\"\r\n (click)=\"addRef(ln.line_No)\"\r\n >\r\n <span class=\"eq-list-item__no\">{{ ln.line_No }}</span>\r\n <span class=\"eq-list-item__label\">{{ ln.label }}</span>\r\n </button>\r\n </dx-list>\r\n </section>\r\n\r\n <section class=\"eq-section\">\r\n <!-- العوامل -->\r\n <div class=\"eq-label\">{{ t('equationEditor.operators', 'العوامل') }}</div>\r\n <div class=\"eq-palette\">\r\n <button\r\n type=\"button\"\r\n class=\"eq-btn eq-btn--op\"\r\n [disabled]=\"!canAddOp('+')\"\r\n (click)=\"addOp('+')\"\r\n >\r\n +\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"eq-btn eq-btn--op\"\r\n [disabled]=\"!canAddOp('-')\"\r\n (click)=\"addOp('-')\"\r\n >\r\n −\r\n </button>\r\n <button\r\n *ngIf=\"allowMultiplyDivide\"\r\n type=\"button\"\r\n class=\"eq-btn eq-btn--op\"\r\n [disabled]=\"!canAddOp('*')\"\r\n (click)=\"addOp('*')\"\r\n >\r\n ×\r\n </button>\r\n <button\r\n *ngIf=\"allowMultiplyDivide\"\r\n type=\"button\"\r\n class=\"eq-btn eq-btn--op\"\r\n [disabled]=\"!canAddOp('/')\"\r\n (click)=\"addOp('/')\"\r\n >\r\n ÷\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"eq-btn eq-btn--util\"\r\n [disabled]=\"!tokens.length\"\r\n (click)=\"backspace()\"\r\n >\r\n <i class=\"dx-icon dx-icon-clearsquare\"></i>\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"eq-btn eq-btn--util\"\r\n [disabled]=\"!tokens.length\"\r\n (click)=\"clearAll()\"\r\n >\r\n {{ t('equationEditor.clear', 'مسح الكل') }}\r\n </button>\r\n </div>\r\n\r\n <!-- ملاحظة: المُعامَلات دائماً مراجع سطور — لا أرقام ثابتة ولا أقواس -->\r\n <div class=\"eq-note\">\r\n {{\r\n t(\r\n 'equationEditor.refsOnlyNote',\r\n 'المعادلة تجمع سطوراً فقط عبر + − × ÷ (بدون أرقام ثابتة أو أقواس).'\r\n )\r\n }}\r\n </div>\r\n </section>\r\n\r\n <section class=\"eq-section\">\r\n <!-- المعاينة -->\r\n <div class=\"eq-label\">{{ t('equationEditor.preview', 'المعاينة') }}</div>\r\n <div class=\"eq-preview\" dir=\"ltr\">{{ preview }}</div>\r\n </section>\r\n\r\n <!-- أزرار الحفظ/الإلغاء -->\r\n <div class=\"eq-footer\">\r\n <dx-button\r\n [text]=\"t('General.cancel', 'إلغاء')\"\r\n stylingMode=\"outlined\"\r\n (onClick)=\"onCancel()\"\r\n ></dx-button>\r\n <dx-button\r\n [text]=\"t('General.save', 'حفظ')\"\r\n type=\"default\"\r\n stylingMode=\"contained\"\r\n [disabled]=\"!isValid\"\r\n (onClick)=\"onSave()\"\r\n ></dx-button>\r\n </div>\r\n </div>\r\n</dx-popup>\r\n","import { HttpClient } from '@angular/common/http';\r\nimport {\r\n Component,\r\n EventEmitter,\r\n forwardRef,\r\n Inject,\r\n Input,\r\n Optional,\r\n Output,\r\n} from '@angular/core';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { firstValueFrom } from 'rxjs';\r\nimport { NavigatorLocalizePipe } from '../form-navigator/navigator-localize.pipe';\r\nimport {\r\n REUSABLE_COMPONENTS_CONFIG,\r\n ReusableComponentsConfig,\r\n} from '../reusable-components.config';\r\n\r\n// Real server-side storage: value is the relative disk path returned by\r\n// POST {api}/{apiEntityPath}/{recordId}/import-file, written straight onto\r\n// the bound field via ControlValueAccessor. No base64 in the record — the\r\n// server validates extension/magic-bytes/size and streams the file back on\r\n// download. Requires a saved record (recordId) before a file can be attached.\r\n@Component({\r\n selector: 'app-file-edit',\r\n standalone: true,\r\n imports: [NavigatorLocalizePipe],\r\n templateUrl: './file-edit.component.html',\r\n styleUrl: './file-edit.component.scss',\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => FileEditComponent),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class FileEditComponent implements ControlValueAccessor {\r\n fileName: string | null = null;\r\n uploading = false;\r\n importing = false;\r\n\r\n /** Host translation hook (REUSABLE_COMPONENTS_CONFIG.translate); falls back to the supplied text. */\r\n private t(key: string, fallback: string): string {\r\n return this.libraryConfig?.translate?.(key, fallback) ?? fallback;\r\n }\r\n errorMessage: string | null = null;\r\n successMessage: string | null = null;\r\n\r\n /** القراءة فقط — تمنع أي تفاعل (رفع/مسح/تنزيل) */\r\n @Input() readOnly: boolean = false;\r\n\r\n /** قائمة الامتدادات المسموحة للاختيار في نافذة الملفات (المرشح الحقيقي على الخادم) */\r\n @Input() accept: string = '*/*';\r\n\r\n /** الحد الأقصى لحجم الملف بالبايت (اختياري) */\r\n @Input() maxFileSizeBytes?: number;\r\n\r\n /** معرف السجل الحالي (formData.id) — null يعني سجل جديد غير محفوظ بعد */\r\n @Input() recordId: string | null = null;\r\n\r\n /** المسار الأساسي للكيان في الـ API، مثل 'bank-statement' (بدون /@id) */\r\n @Input() apiEntityPath: string = '';\r\n\r\n /** Optional per-instance override; otherwise uses REUSABLE_COMPONENTS_CONFIG. */\r\n @Input() apiBaseUrl = '';\r\n\r\n @Output() Changed = new EventEmitter<void>();\r\n @Output() Upload = new EventEmitter<void>();\r\n @Output() Clear = new EventEmitter<void>();\r\n @Output() Imported = new EventEmitter<number>();\r\n\r\n /**\r\n * اسم حقل شقيق يملؤه الخادم في رده على الرفع (من `lookup_parameters`).\r\n * لو رد الرفع احتوى مفتاحًا بنفس الاسم، تُبَثّ قيمته ليكتبها النموذج في الحقل.\r\n * مثال: مصدر الاستيراد الذي يشتقه الخادم من الملف نفسه.\r\n *\r\n * ويعمل كذلك كبوابة لزر «استيراد الأسطر»: وجود حقل مصدر استيراد هو بعينه معنى\r\n * «هذا الملف هو ما نقرأه». الشاشات التي ترفع الملف كمستند إثبات فقط — مثل مرفق\r\n * كشف الحساب في التسوية البنكية — لا تُعرّفه، فيختفي الزر بدل أن يَعِد بقراءة\r\n * ملف لا يُقرأ أصلًا (الأسطر هناك تأتي من كشف الحساب المرتبط).\r\n */\r\n @Input() syncFieldName: string | null = null;\r\n @Input() contextFieldNames: string[] = [];\r\n @Input() contextValues: Record<string, any> | null = null;\r\n\r\n /** القيمة التي أعادها الخادم للحقل الشقيق بعد رفع ناجح */\r\n @Output() SyncFieldValue = new EventEmitter<any>();\r\n\r\n private onChange: (value: string | null) => void = () => {};\r\n private onTouched: () => void = () => {};\r\n\r\n constructor(\r\n private http: HttpClient,\r\n @Optional()\r\n @Inject(REUSABLE_COMPONENTS_CONFIG)\r\n private readonly libraryConfig: ReusableComponentsConfig | null,\r\n ) {}\r\n\r\n get canInteract(): boolean {\r\n return !this.readOnly && !this.uploading && !!this.recordId;\r\n }\r\n\r\n get canUpload(): boolean {\r\n return this.canInteract;\r\n }\r\n\r\n private get apiUrl(): string {\r\n const apiUrl = (this.apiBaseUrl || this.libraryConfig?.apiUrl || '').replace(\r\n /\\/+$/,\r\n '',\r\n );\r\n if (!apiUrl) {\r\n throw new Error('Configuration not loaded or apiUrl not found');\r\n }\r\n\r\n return apiUrl;\r\n }\r\n\r\n private get importResourceUrl(): string {\r\n const entityPath = this.apiEntityPath.replace(/^\\/+|\\/+$/g, '');\r\n const recordId = encodeURIComponent(this.recordId ?? '');\r\n\r\n return `${this.apiUrl}/${entityPath}/${recordId}`;\r\n }\r\n\r\n private get importFileUrl(): string {\r\n return `${this.importResourceUrl}/import-file`;\r\n }\r\n\r\n private get importFileAndLinesUrl(): string {\r\n return `${this.importResourceUrl}/import-file-and-lines`;\r\n }\r\n\r\n private get importLinesUrl(): string {\r\n return `${this.importResourceUrl}/import-lines`;\r\n }\r\n\r\n writeValue(value: string | null): void {\r\n this.errorMessage = null;\r\n this.successMessage = null;\r\n\r\n if (!value) {\r\n this.fileName = null;\r\n return;\r\n }\r\n\r\n const lastSlash = value.lastIndexOf('/');\r\n const rawName = lastSlash >= 0 ? value.substring(lastSlash + 1) : value;\r\n const underscoreIndex = rawName.indexOf('_');\r\n this.fileName =\r\n underscoreIndex >= 0 ? rawName.substring(underscoreIndex + 1) : rawName;\r\n }\r\n\r\n registerOnChange(fn: any): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: any): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState?(isDisabled: boolean): void {\r\n if (isDisabled) {\r\n this.readOnly = true;\r\n }\r\n }\r\n\r\n async onFileSelected(event: Event): Promise<void> {\r\n const input = event.target as HTMLInputElement;\r\n const file = input?.files?.[0];\r\n if (!file) return;\r\n\r\n if (this.readOnly) {\r\n input.value = '';\r\n return;\r\n }\r\n\r\n if (!this.recordId) {\r\n this.errorMessage = this.t('ui.ts.file-edit.1', 'يجب حفظ السجل أولاً قبل إرفاق الملف');\r\n input.value = '';\r\n return;\r\n }\r\n\r\n if (this.maxFileSizeBytes && file.size > this.maxFileSizeBytes) {\r\n this.errorMessage = this.t('ui.ts.file-edit.2', 'حجم الملف أكبر من الحد المسموح به');\r\n input.value = '';\r\n return;\r\n }\r\n\r\n this.errorMessage = null;\r\n this.successMessage = null;\r\n this.uploading = true;\r\n\r\n const formData = new FormData();\r\n formData.append('file', file, file.name);\r\n for (const [name, value] of this.contextEntries()) {\r\n formData.append(name, value == null ? '' : String(value));\r\n }\r\n\r\n // Screens that import lines (syncFieldName set) upload and import in ONE request:\r\n // the server replaces the statement's file and lines only if the file parses, so a\r\n // bad file leaves the previous file and lines as they were. Attachment-only screens\r\n // keep the plain upload.\r\n const importsLines = !!this.syncFieldName;\r\n if (importsLines) this.importing = true;\r\n\r\n try {\r\n const res: any = await firstValueFrom(\r\n this.http.post(importsLines ? this.importFileAndLinesUrl : this.importFileUrl, formData),\r\n );\r\n\r\n this.fileName = file.name;\r\n this.onChange(res?.path ?? null);\r\n this.onTouched();\r\n\r\n // The server may have derived a sibling value from the file (e.g. the import\r\n // source). Push it back so the form shows what was actually stored.\r\n if (this.syncFieldName && res?.[this.syncFieldName] != null) {\r\n this.SyncFieldValue.emit(res[this.syncFieldName]);\r\n }\r\n\r\n this.Upload.emit();\r\n this.Changed.emit();\r\n\r\n if (importsLines) {\r\n const count = res?.count ?? 0;\r\n this.successMessage = this.t('ui.ts.file-edit.5', 'تم استيراد {0} سطر بنجاح').replace('{0}', String(count));\r\n this.Imported.emit(count);\r\n }\r\n } catch (err: any) {\r\n // Nothing changed on the server — the previous file (if any) is still the one shown.\r\n this.errorMessage = err?.message || this.t('ui.ts.file-edit.3', 'تعذر رفع الملف');\r\n } finally {\r\n this.uploading = false;\r\n this.importing = false;\r\n input.value = '';\r\n }\r\n }\r\n\r\n async downloadFile(): Promise<void> {\r\n if (!this.recordId || !this.fileName) return;\r\n\r\n try {\r\n const blob = await firstValueFrom(\r\n this.http.get(this.importFileUrl, { responseType: 'blob' }),\r\n );\r\n\r\n const url = window.URL.createObjectURL(blob);\r\n const link = document.createElement('a');\r\n link.href = url;\r\n link.download = this.fileName;\r\n link.click();\r\n window.URL.revokeObjectURL(url);\r\n } catch (err: any) {\r\n this.errorMessage = err?.error?.error?.message || this.t('ui.ts.file-edit.4', 'تعذر تنزيل الملف');\r\n }\r\n }\r\n\r\n async importLines(): Promise<void> {\r\n if (!this.recordId || !this.fileName || this.importing) return;\r\n\r\n this.errorMessage = null;\r\n this.successMessage = null;\r\n this.importing = true;\r\n\r\n try {\r\n const res: any = await firstValueFrom(\r\n this.http.post(this.importLinesUrl, this.contextBody()),\r\n );\r\n\r\n const count = res?.count ?? 0;\r\n this.successMessage = this.t('ui.ts.file-edit.5', 'تم استيراد {0} سطر بنجاح').replace('{0}', String(count));\r\n this.Imported.emit(count);\r\n } catch (err: any) {\r\n console.log('err: ', err);\r\n this.errorMessage = err?.message || this.t('ui.ts.file-edit.6', 'تعذر استيراد الأسطر');\r\n } finally {\r\n this.importing = false;\r\n }\r\n }\r\n\r\n private contextEntries(): Array<[string, any]> {\r\n const values = this.contextValues ?? {};\r\n return this.contextFieldNames.filter(Boolean).map((name) => [name, values[name] ?? null]);\r\n }\r\n\r\n private contextBody(): Record<string, any> {\r\n const body: Record<string, any> = {};\r\n for (const [name, value] of this.contextEntries()) { body[name] = value; body[`${name}_Sent`] = true; }\r\n return body;\r\n }\r\n\r\n async clearFile(): Promise<void> {\r\n if (this.readOnly || !this.recordId || !this.fileName) return;\r\n\r\n try {\r\n const res: any = await firstValueFrom(\r\n this.http.delete(this.importFileUrl),\r\n );\r\n\r\n // Removing the file can change the sibling field too (the source falls back to\r\n // manual entry). Without this the form keeps showing the old value until the\r\n // record is reloaded, even though the server already changed it.\r\n if (this.syncFieldName && res?.[this.syncFieldName] != null) {\r\n this.SyncFieldValue.emit(res[this.syncFieldName]);\r\n }\r\n\r\n this.fileName = null;\r\n this.errorMessage = null;\r\n this.successMessage = null;\r\n\r\n this.onChange(null);\r\n this.onTouched();\r\n\r\n this.Clear.emit();\r\n this.Changed.emit();\r\n } catch (err: any) {\r\n this.errorMessage = err?.error?.error?.message || this.t('ui.ts.file-edit.7', 'تعذر حذف الملف');\r\n }\r\n }\r\n}\r\n","<div class=\"file-edit-box\">\r\n <div class=\"file-area\" [class.placeholder]=\"!fileName\">\r\n @if (uploading) {\r\n <div class=\"file-info\">\r\n <i class=\"dx-icon-refresh file-icon spinning\"></i>\r\n <span class=\"file-name\">{{ 'ui.file-edit.1' | localize: 'جارِ الرفع...' }}</span>\r\n </div>\r\n } @else if (fileName) {\r\n <div class=\"file-info\">\r\n <i class=\"dx-icon-doc file-icon\"></i>\r\n <span class=\"file-name\" [attr.title]=\"fileName\">{{ fileName }}</span>\r\n </div>\r\n } @else if (!recordId) {\r\n <div class=\"placeholder-text\">\r\n <span>{{ 'ui.file-edit.2' | localize: 'احفظ السجل أولاً لتتمكن من إرفاق الملف' }}</span>\r\n </div>\r\n } @else {\r\n <div class=\"placeholder-text\">\r\n <i class=\"dx-icon-upload placeholder-icon\"></i>\r\n <span>{{ 'ui.file-edit.3' | localize: 'اسحب الملف هنا أو اضغط للاختيار' }}</span>\r\n </div>\r\n }\r\n </div>\r\n\r\n @if (errorMessage) {\r\n <div class=\"error-message\">{{ errorMessage }}</div>\r\n }\r\n\r\n @if (successMessage) {\r\n <div class=\"success-message\">{{ successMessage }}</div>\r\n }\r\n\r\n <div class=\"action-bar\">\r\n @if (!readOnly && recordId) {\r\n <label\r\n class=\"action-icon\"\r\n [class.disabled]=\"!canUpload\"\r\n [attr.aria-disabled]=\"!canUpload\"\r\n [attr.title]=\"('ui.file-edit.4' | localize: 'رفع ملف')\"\r\n >\r\n <input\r\n type=\"file\"\r\n [accept]=\"accept\"\r\n (change)=\"onFileSelected($event)\"\r\n [disabled]=\"!canUpload\"\r\n hidden\r\n />\r\n <i class=\"dx-icon-folder\"></i>\r\n </label>\r\n }\r\n\r\n @if (fileName && recordId) {\r\n <button\r\n type=\"button\"\r\n class=\"action-icon\"\r\n (click)=\"downloadFile()\"\r\n [title]=\"'ui.file-edit.5' | localize: 'تنزيل'\"\r\n >\r\n <i class=\"dx-icon-download\"></i>\r\n </button>\r\n }\r\n\r\n @if (fileName && canInteract) {\r\n <button\r\n type=\"button\"\r\n class=\"action-icon\"\r\n (click)=\"clearFile()\"\r\n [title]=\"'ui.file-edit.6' | localize: 'إزالة'\"\r\n >\r\n <i class=\"dx-icon-close\"></i>\r\n </button>\r\n }\r\n\r\n @if (fileName && canInteract && syncFieldName) {\r\n <button\r\n type=\"button\"\r\n class=\"action-icon import-icon\"\r\n [disabled]=\"importing\"\r\n (click)=\"importLines()\"\r\n [title]=\"'ui.file-edit.7' | localize: 'استيراد الأسطر من هذا الملف'\"\r\n >\r\n @if (importing) {\r\n <i class=\"dx-icon-refresh spinning\"></i>\r\n } @else {\r\n <i class=\"dx-icon-import\"></i>\r\n }\r\n </button>\r\n }\r\n </div>\r\n</div>\r\n","import { InjectionToken } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\n\r\n/**\r\n * Host-supplied backend for the file manager component (attachments per\r\n * entity: folders, files, links, tags). The host adapter typically wraps its\r\n * file-manager API service, its attachment-tags lookup, and its tenant\r\n * identity headers.\r\n */\r\nexport interface FileManagerProvider {\r\n /**\r\n * Endpoint URL for DevExtreme's `RemoteFileSystemProvider`\r\n * (the file-system command endpoint scoped to source + entity).\r\n */\r\n getFileSystemEndpoint(attachmentSourceId: any, entityKey: string): string;\r\n\r\n /**\r\n * Extra headers for the RemoteFileSystemProvider's own AJAX transport. This\r\n * method is called before each request, so hosts can supply a refreshed bearer\r\n * token together with tenant identity headers.\r\n * It bypasses Angular's HttpClient interceptors, so identity headers\r\n * (e.g. X-Tenant-Domain) must be supplied here explicitly.\r\n */\r\n fileSystemRequestHeaders(): Record<string, string>;\r\n\r\n /**\r\n * DataSource/CustomStore for the attachment-tags tag box ({ id, name_Ar }).\r\n * May return the store directly or a promise of it (the component awaits it).\r\n */\r\n createTagsStore(): any;\r\n\r\n addURL(data: {\r\n name: string;\r\n attachmentTypeId: any;\r\n attachmentSourceID: any;\r\n entityKey: any;\r\n url: string;\r\n issueDate?: Date | null;\r\n expireDate?: Date | null;\r\n attachmentCode?: string | null;\r\n tags?: string[];\r\n }): Observable<unknown>;\r\n\r\n uploadManual(\r\n formData: FormData,\r\n attachmentSourceId: any,\r\n entityKey: string,\r\n issueDate?: string | null,\r\n expireDate?: string | null,\r\n attachmentCode?: string | null,\r\n tags?: string[],\r\n currentDirectoryKey?: string,\r\n currentDirectoryName?: string,\r\n fileName?: string,\r\n fileSize?: number,\r\n ): Observable<any>;\r\n\r\n updateFileMetadataWithFile(\r\n key: string,\r\n name: string,\r\n attachmentSourceId: any,\r\n entityKey: string,\r\n newFile?: File,\r\n url?: string | null,\r\n issueDate?: string | null,\r\n expireDate?: string | null,\r\n attachmentCode?: string | null,\r\n tags?: string[],\r\n isLink?: boolean,\r\n ): Observable<any>;\r\n\r\n /**\r\n * Optional: called when an upload or delete may have changed the used storage (or the\r\n * quota was hit), so the host can refresh a storage banner/meter.\r\n */\r\n onStorageChanged?(): void;\r\n\r\n downloadFile(fileId: string): Observable<Blob>;\r\n\r\n getAttachmentTags(attachmentId: string): Observable<any[]>;\r\n\r\n setAttachmentTagsById(\r\n attachmentId: string,\r\n tags: string[],\r\n ): Observable<unknown>;\r\n}\r\n\r\nexport const FILE_MANAGER_PROVIDER = new InjectionToken<FileManagerProvider>(\r\n 'FILE_MANAGER_PROVIDER',\r\n);\r\n","import {\r\n ChangeDetectorRef,\r\n Component,\r\n Inject,\r\n inject,\r\n Input,\r\n NgZone,\r\n OnChanges,\r\n OnInit,\r\n SimpleChanges,\r\n ViewChild,\r\n} from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nimport {\r\n DxButtonModule,\r\n DxDateBoxModule,\r\n DxFormModule,\r\n DxPopupModule,\r\n DxTagBoxModule,\r\n} from 'devextreme-angular';\r\nimport {\r\n DxFileManagerComponent,\r\n DxFileManagerModule,\r\n DxFileManagerTypes,\r\n} from 'devextreme-angular/ui/file-manager';\r\nimport RemoteFileSystemProvider from 'devextreme/file_management/remote_provider';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ElementRef } from '@angular/core';\r\nimport { Guid } from 'devextreme/common';\r\nimport { firstValueFrom } from 'rxjs';\r\nimport { FORM_NAVIGATOR_ADAPTER } from '../form-navigator/form-navigator-adapter';\r\nimport { NavigatorLocalizePipe } from '../form-navigator/navigator-localize.pipe';\r\nimport {\r\n FILE_MANAGER_PROVIDER,\r\n FileManagerProvider,\r\n} from './file-manager-provider';\r\n\r\ntype FMItem = {\r\n name?: string;\r\n isDirectory?: boolean;\r\n key?: string;\r\n dataItem?: any;\r\n};\r\n\r\n@Component({\r\n selector: 'app-file-manager',\r\n standalone: true,\r\n imports: [\r\n DxFileManagerModule,\r\n DxPopupModule,\r\n DxButtonModule,\r\n DxTagBoxModule,\r\n FormsModule,\r\n CommonModule,\r\n DxFormModule,\r\n DxDateBoxModule,\r\n NavigatorLocalizePipe,\r\n ],\r\n templateUrl: './file-manager.component.html',\r\n styleUrl: './file-manager.component.scss',\r\n})\r\nexport class FileManagerComponent implements OnChanges, OnInit {\r\n @Input() attachmentSourceId!: Guid;\r\n @Input() entityKey!: Guid | undefined | string;\r\n @Input() IsEnabled: boolean = true;\r\n @Input() AllowAdd: boolean = true;\r\n @Input() AllowModify: boolean = true;\r\n @Input() AllowDelete: boolean = true;\r\n\r\n @ViewChild('fileManager', { static: false })\r\n fileManager!: DxFileManagerComponent;\r\n\r\n @ViewChild('fileInput', { static: false })\r\n fileInput!: ElementRef<HTMLInputElement>;\r\n\r\n private readonly adapter = inject(FORM_NAVIGATOR_ADAPTER);\r\n protected readonly t = (key: string, fallback: string): string =>\r\n this.adapter.translate(key, fallback);\r\n\r\n /** Bilingual lookup rows: show the UI language, falling back to the other one. */\r\n private pickLocalized(ar: unknown, en: unknown): string {\r\n const arabic = this.adapter.isArabic?.() ?? true;\r\n const first = arabic ? ar : en;\r\n const second = arabic ? en : ar;\r\n const has = (v: unknown) => v != null && String(v).trim() !== '';\r\n return has(first) ? String(first) : has(second) ? String(second) : '';\r\n }\r\n\r\n /** name_Ar / name_En by the active language (was hard-wired to name_Ar). */\r\n readonly localizedNameExpr = (item: any): string =>\r\n item ? this.pickLocalized(item['name_Ar'], item['name_En']) : '';\r\n readonly nameExpr = this.localizedNameExpr;\r\n /** A function displayExpr gives the DataSource no field to search: name the UI-language column. */\r\n get nameSearchExpr(): string {\r\n return (this.adapter.isArabic?.() ?? true) ? 'name_Ar' : 'name_En';\r\n }\r\n\r\n /** Tell the host that used storage may have changed (upload / delete / quota hit). */\r\n notifyStorageChanged(): void {\r\n this.fileProvider.onStorageChanged?.();\r\n }\r\n\r\n linkForm: {\r\n linkName: string;\r\n linkUrl: string;\r\n attachmentCode: string;\r\n linkIssueDate: Date | null;\r\n linkExpireDate: Date | null;\r\n } = {\r\n linkName: '',\r\n linkUrl: '',\r\n attachmentCode: '',\r\n linkIssueDate: null,\r\n linkExpireDate: null,\r\n };\r\n\r\n fileForm: {\r\n attachmentCode: string;\r\n selectedTags: string[];\r\n fileIssueDate: Date | null;\r\n fileExpireDate: Date | null;\r\n } = {\r\n attachmentCode: '',\r\n selectedTags: [],\r\n fileIssueDate: null,\r\n fileExpireDate: null,\r\n };\r\n\r\n isDirectory = true;\r\n isInDirectory = false;\r\n isSingleItemSelected = true;\r\n isDownloadDisabled = false;\r\n linkpopupVisible = false;\r\n filepopupVisible = false;\r\n\r\n selectedFile: File | null = null;\r\n formatter: any;\r\n manualSelectedFile: File | null = null;\r\n attachmentCode: string | null = null;\r\n\r\n dsAttachmentTags: any;\r\n\r\n selectedTags: any[] = [];\r\n\r\n focusedItemTags: any[] = [];\r\n\r\n remoteProvider!: RemoteFileSystemProvider;\r\n imageItemToDisplay = {} as DxFileManagerTypes.SelectedFileOpenedEvent['file'];\r\n\r\n // TagBox state (focused row)\r\n showTagBox = false;\r\n focusedItem: FMItem | null = null;\r\n savingTags = false;\r\n\r\n constructor(\r\n @Inject(FILE_MANAGER_PROVIDER)\r\n private fileProvider: FileManagerProvider,\r\n private ngZone: NgZone,\r\n private cdr: ChangeDetectorRef,\r\n ) {}\r\n\r\n //?\r\n editMode = false;\r\n editModel: {\r\n key?: string;\r\n id?: string;\r\n name?: string | null;\r\n url?: string | null;\r\n attachmentCode?: string | null;\r\n tags?: string[];\r\n issueDate?: Date | null;\r\n expireDate?: Date | null;\r\n isLink?: boolean;\r\n } = {\r\n name: null,\r\n url: null,\r\n attachmentCode: null,\r\n tags: [],\r\n issueDate: null,\r\n expireDate: null,\r\n isLink: false,\r\n };\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['attachmentSourceId'] || changes['entityKey']) {\r\n this.initRemoteProvider();\r\n }\r\n }\r\n\r\n async ngOnInit() {\r\n await this.loadAllTags();\r\n this.initRemoteProvider();\r\n }\r\n\r\n private async loadAllTags() {\r\n this.dsAttachmentTags = await this.fileProvider.createTagsStore();\r\n }\r\n\r\n private async loadTagForSelected(attachmentId: string) {\r\n try {\r\n const tags = await firstValueFrom(\r\n this.fileProvider.getAttachmentTags(attachmentId),\r\n );\r\n\r\n const tagIds = (tags ?? []).map((t: any) => t.id).filter(Boolean);\r\n\r\n this.selectedTags = tagIds;\r\n this.focusedItemTags = tagIds;\r\n\r\n this.cdr.detectChanges();\r\n } catch (error) {\r\n this.selectedTags = [];\r\n this.focusedItemTags = [];\r\n }\r\n }\r\n\r\n private initRemoteProvider(): void {\r\n if (this.attachmentSourceId && this.entityKey) {\r\n this.remoteProvider = new RemoteFileSystemProvider({\r\n endpointUrl: this.fileProvider.getFileSystemEndpoint(\r\n this.attachmentSourceId,\r\n String(this.entityKey),\r\n ),\r\n // RemoteFileSystemProvider issues its own AJAX calls, so none of the Angular\r\n // interceptors run for them — the identity headers the host's interceptors\r\n // normally add have to be attached here, or the backend resolves the API host\r\n // instead of the tenant and answers 503.\r\n beforeAjaxSend: ({ headers }) => {\r\n Object.assign(headers, this.fileProvider.fileSystemRequestHeaders());\r\n },\r\n });\r\n }\r\n }\r\n\r\n openSelectedItem(e: any) {\r\n const item = e?.file?.dataItem;\r\n if (item?.isLink && item?.url) {\r\n window.open(this.normalizeUrl(item.url), '_blank', 'noopener,noreferrer');\r\n return;\r\n }\r\n\r\n // لو عندك منطق الصور الحالي، اتركه هنا\r\n if (item?.url) {\r\n window.open(item.url, '_blank');\r\n }\r\n }\r\n\r\n normalizeUrl(url: string | null | undefined): string {\r\n if (!url) return '';\r\n const trimmed = url.trim();\r\n return /^https?:\\/\\//i.test(trimmed) ? trimmed : `https://${trimmed}`;\r\n }\r\n\r\n private openLinkPopup(): void {\r\n this.ngZone.run(() => {\r\n //?\r\n this.editMode = false;\r\n this.resetEditModel();\r\n //?\r\n this.linkpopupVisible = true;\r\n this.cdr.detectChanges();\r\n });\r\n }\r\n\r\n private openFilePopup(): void {\r\n this.ngZone.run(() => {\r\n this.editMode = false;\r\n this.resetEditModel();\r\n this.filepopupVisible = true;\r\n this.cdr.detectChanges();\r\n });\r\n }\r\n\r\n // ? Add resetEditModel method\r\n private resetEditModel() {\r\n this.editModel = {\r\n name: null,\r\n url: null,\r\n attachmentCode: null,\r\n tags: [],\r\n issueDate: null,\r\n expireDate: null,\r\n isLink: false,\r\n };\r\n }\r\n\r\n showInfo(): void {\r\n this.openLinkPopup();\r\n }\r\n showFileInfo(): void {\r\n this.openFilePopup();\r\n }\r\n\r\n newFileMenuOptions = {\r\n items: [\r\n {\r\n id: 'uploadLink',\r\n text: this.t('FileManager.UploadLink', 'رفع رابط'),\r\n icon: 'link',\r\n },\r\n {\r\n id: 'uploadFile',\r\n text: this.t('loc.fileManager.3', 'رفع ملف'),\r\n icon: 'file',\r\n },\r\n ],\r\n onItemClick: (e: any) => {\r\n if (e.itemData?.id === 'uploadLink') {\r\n this.openLinkPopup();\r\n } else if (e.itemData?.id === 'uploadFile') {\r\n this.openFilePopup();\r\n }\r\n },\r\n };\r\n\r\n isReplacingFile = false;\r\n replacementFile: File | null = null;\r\n\r\n onFileSelected(event: any): void {\r\n const file = event.target.files[0];\r\n this.selectedFile = file || null;\r\n\r\n // If we're in edit mode, this is a replacement file\r\n if (this.editMode && file) {\r\n this.replacementFile = file;\r\n this.isReplacingFile = true;\r\n }\r\n }\r\n\r\n triggerUpload() {\r\n const uploaderInput = document.querySelector(\r\n '#fileManager .dx-filemanager-toolbar .dx-fileuploader input[type=\"file\"]',\r\n ) as HTMLElement;\r\n\r\n if (this.isDirectory) {\r\n uploaderInput.click(); // فتح نافذة اختيار الملفات\r\n } else {\r\n alert(\r\n this.t('ui.ts.file-manager.1', '⚠️ لا يمكن رفع الملفات. تأكد أنك داخل مجلد (وليس في الجذر) ويمكنك الرفع.'),\r\n );\r\n }\r\n }\r\n\r\n addLink() {\r\n const currentDirKey =\r\n this.fileManager.instance.getCurrentDirectory()?.key ||\r\n this.fileManager.selectedItemKeys[0];\r\n\r\n const data = {\r\n name: this.linkForm.linkName,\r\n attachmentTypeId: currentDirKey?.substring(1),\r\n attachmentSourceID: this.attachmentSourceId,\r\n entityKey: this.entityKey,\r\n url: this.linkForm.linkUrl,\r\n issueDate: this.linkForm.linkIssueDate,\r\n expireDate: this.linkForm.linkExpireDate,\r\n attachmentCode: this.linkForm.attachmentCode,\r\n };\r\n\r\n this.fileProvider.addURL(data).subscribe({\r\n next: () => {\r\n this.linkForm = {\r\n linkName: '',\r\n linkUrl: '',\r\n attachmentCode: '',\r\n linkIssueDate: null,\r\n linkExpireDate: null,\r\n };\r\n this.linkpopupVisible = false;\r\n this.fileManager.instance.refresh();\r\n },\r\n });\r\n }\r\n\r\n uploadManualFile() {\r\n if (!this.selectedFile || !this.attachmentSourceId || !this.entityKey) {\r\n return;\r\n }\r\n\r\n const formData = new FormData();\r\n formData.append('file', this.selectedFile);\r\n\r\n const formattedIssueDate = this.fileForm.fileIssueDate\r\n ? this.fileForm.fileIssueDate.toISOString().slice(0, 10)\r\n : null;\r\n const formattedExpireDate = this.fileForm.fileExpireDate\r\n ? this.fileForm.fileExpireDate.toISOString().slice(0, 10)\r\n : null;\r\n\r\n const attachmentCode = this.fileForm.attachmentCode || null;\r\n\r\n // ✅ استخراج بيانات المجلد والملف\r\n const currentDir = this.fileManager.instance.getCurrentDirectory();\r\n const currentDirectoryKey = currentDir?.key ?? '';\r\n const currentDirectoryName = currentDir?.name ?? '';\r\n\r\n if (!currentDirectoryKey) {\r\n this.ngZone.run(() => {\r\n this.filepopupVisible = false;\r\n this.cdr.detectChanges();\r\n });\r\n alert(this.t('FileManager.SelectFolder', 'يرجى الدخول إلى مجلد أولاً قبل رفع الملف'));\r\n return;\r\n }\r\n const fileName = this.selectedFile?.name ?? '';\r\n const fileSize = this.selectedFile?.size ?? 0;\r\n\r\n // Add tags to form data\r\n this.selectedTags.forEach((tag) => {\r\n formData.append('tags', tag);\r\n });\r\n // ✅ استدعاء الخدمة مع كل البيانات لتوليد arguments\r\n this.fileProvider\r\n .uploadManual(\r\n formData,\r\n this.attachmentSourceId,\r\n this.entityKey!.toString(),\r\n formattedIssueDate,\r\n formattedExpireDate,\r\n attachmentCode,\r\n this.selectedTags,\r\n currentDirectoryKey,\r\n currentDirectoryName,\r\n fileName,\r\n fileSize,\r\n )\r\n .subscribe({\r\n next: (res: any) => {\r\n // DevExtreme's command processor answers a REJECTED upload with HTTP 200 and\r\n // { success: false, errorCode, errorText } in the body — not with an error status.\r\n // Treating any 200 as success is why a rejected file reported \"تم رفع الملف\" and then\r\n // never appeared in the list.\r\n if (res && res.success === false) {\r\n this.ngZone.run(() => {\r\n this.adapter.notify(\r\n 'error',\r\n this.describeUploadError(res.errorCode, res.errorText),\r\n );\r\n this.cdr.detectChanges();\r\n });\r\n return; // keep the popup open so another file can be picked straight away\r\n }\r\n\r\n this.filepopupVisible = false;\r\n\r\n this.ngZone.run(() => {\r\n this.resetFileForm();\r\n this.fileManager.instance.refresh();\r\n this.cdr.detectChanges();\r\n });\r\n },\r\n error: (err) => {\r\n console.error('Upload failed status:', err.status);\r\n console.error('Upload failed error:', err.error);\r\n console.error('Upload failed:', err);\r\n\r\n this.ngZone.run(() => {\r\n this.adapter.notify(\r\n 'error',\r\n this.t(\r\n 'FileManager.UploadFailed',\r\n 'تعذّر رفع الملف. تحقّق من الاتصال ثم أعد المحاولة.',\r\n ),\r\n );\r\n this.cdr.detectChanges();\r\n });\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Turns DevExtreme's FileSystemErrorCode into a sentence the user can act on.\r\n *\r\n * The server cannot localize these itself: this path returns through the file-manager command\r\n * result, never through the API exception middleware, so `errorText` carries only the raw\r\n * values (pipe-separated) and the wording belongs here.\r\n */\r\n private describeUploadError(errorCode: number, errorText?: string): string {\r\n const parts = (errorText ?? '')\r\n .split('|')\r\n .map((p) => p.trim())\r\n .filter((p) => p.length > 0);\r\n\r\n switch (errorCode) {\r\n case 0: // NoAccess\r\n return this.t(\r\n 'FileManager.Error.NoAccess',\r\n 'لا تملك صلاحية الرفع في هذا المجلد.',\r\n );\r\n\r\n case 1: // FileExists\r\n return this.t('FileManager.Error.FileExists', 'يوجد ملف بنفس الاسم بالفعل.');\r\n\r\n case 4: // DirectoryNotFound\r\n return this.t(\r\n 'FileManager.Error.DirectoryNotFound',\r\n 'تعذّر تحديد المجلد الذي سيُرفع إليه الملف. حدّث الصفحة ثم أعد المحاولة.',\r\n );\r\n\r\n case 5: {\r\n // WrongFileExtension — errorText = \"<الامتداد المرفوض> | <قائمة المسموح>\"\r\n const base = this.t(\r\n 'FileManager.Error.WrongFileExtension',\r\n 'نوع الملف غير مسموح به.',\r\n );\r\n const rejected = parts[0] ? ` (${parts[0]})` : '';\r\n const allowed = parts[1]\r\n ? ` ${this.t('FileManager.Error.AllowedExtensions', 'الأنواع المسموحة:')} ${parts[1]}`\r\n : '';\r\n return `${base}${rejected}${allowed}`;\r\n }\r\n\r\n case 6: {\r\n // MaxFileSizeExceeded — errorText = \"<حجم الملف بالكيلوبايت> | <الحد بالكيلوبايت>\"\r\n const base = this.t(\r\n 'FileManager.Error.MaxFileSizeExceeded',\r\n 'حجم الملف أكبر من الحد المسموح به.',\r\n );\r\n const detail =\r\n parts.length >= 2\r\n ? ` (${parts[0]} KB / ${this.t('FileManager.Error.SizeLimit', 'الحد')}: ${parts[1]} KB)`\r\n : '';\r\n return `${base}${detail}`;\r\n }\r\n\r\n case 7: // InvalidSymbols\r\n return this.t(\r\n 'FileManager.Error.InvalidSymbols',\r\n 'اسم الملف يحتوي على رموز غير مسموح بها.',\r\n );\r\n\r\n default: {\r\n // Subscription storage quota: \"STORAGE_QUOTA | used GB | quota GB | file MB\".\r\n if (parts[0] === 'STORAGE_QUOTA') {\r\n this.notifyStorageChanged();\r\n return this.fmt(\r\n this.t(\r\n 'SubscriptionStorageLimitReachedException',\r\n 'مساحة التخزين في خطتك ممتلئة: آخر حساب للاستخدام {0} جيجابايت من {1}. لا يمكن رفع ملفات جديدة حتى تتم ترقية الخطة.',\r\n ),\r\n parts.slice(1),\r\n );\r\n }\r\n const base = this.t('FileManager.UploadFailed', 'تعذّر رفع الملف.');\r\n return errorText ? `${base} ${errorText}` : base;\r\n }\r\n }\r\n }\r\n\r\n /** Replaces {0}, {1}… with the given values (the same placeholders the server message uses). */\r\n private fmt(template: string, args: string[]): string {\r\n return template.replace(/\\{(\\d+)\\}/g, (m, i) => args[Number(i)] ?? m);\r\n }\r\n\r\n private resetFileInput(): void {\r\n if (this.fileInput?.nativeElement) {\r\n this.fileInput.nativeElement.value = '';\r\n }\r\n }\r\n\r\n resetFileForm() {\r\n this.manualSelectedFile = null;\r\n this.selectedFile = null;\r\n this.replacementFile = null;\r\n this.isReplacingFile = false;\r\n this.fileForm.fileIssueDate = null;\r\n this.fileForm.fileExpireDate = null;\r\n this.attachmentCode = '';\r\n this.selectedTags = [];\r\n this.resetFileInput();\r\n }\r\n\r\n onContextMenuShowing(e: any) {\r\n if (!e.fileSystemItem) {\r\n this.isDirectory = true;\r\n this.isSingleItemSelected = false;\r\n this.isDownloadDisabled = true;\r\n e.component.option('contextMenu.items', [\r\n {\r\n name: 'refresh',\r\n text: this.t('FileManager.Refresh', 'تحديث'),\r\n icon: 'refresh',\r\n },\r\n ]);\r\n return;\r\n }\r\n\r\n this.isDirectory = e.fileSystemItem.isDirectory;\r\n const isLink = e.fileSystemItem.dataItem?.isLink;\r\n\r\n const contextMenuItems: any[] = [];\r\n if (this.isDirectory) {\r\n contextMenuItems.push({\r\n name: 'upload',\r\n text: this.t('loc.fileManager.1', 'رفع ملفات'),\r\n icon: 'upload',\r\n });\r\n } else {\r\n if (this.isSingleItemSelected)\r\n contextMenuItems.push({\r\n name: 'rename',\r\n text: this.t('FileManager.Rename', 'إعادة تسمية'),\r\n icon: 'rename',\r\n });\r\n contextMenuItems.push({\r\n name: 'delete',\r\n text: this.t('FileManager.Delete', 'حذف'),\r\n icon: 'trash',\r\n });\r\n }\r\n contextMenuItems.push({\r\n name: 'refresh',\r\n text: this.t('FileManager.Refresh', 'تحديث'),\r\n icon: 'refresh',\r\n });\r\n if (!isLink)\r\n contextMenuItems.push({\r\n name: 'download',\r\n text: this.t('FileManager.Download', 'تحميل'),\r\n icon: 'download',\r\n });\r\n\r\n e.component.option('contextMenu.items', contextMenuItems);\r\n }\r\n\r\n onSelectionChanged(e: any) {\r\n const selectedItems = e.selectedItems;\r\n this.isSingleItemSelected = selectedItems.length === 1;\r\n\r\n const currentDirKey =\r\n this.fileManager.instance.getCurrentDirectory()?.key || '';\r\n this.isDirectory = currentDirKey === '';\r\n\r\n this.isDownloadDisabled = selectedItems.some(\r\n (item: any) => item.dataItem?.isLink,\r\n );\r\n }\r\n\r\n onCurrentDirectoryChanged(e: any) {\r\n this.isInDirectory =\r\n !!e.directory?.isDirectory &&\r\n !!e.directory?.key &&\r\n e.directory.key !== '';\r\n this.hideParentDirRow();\r\n }\r\n\r\n displayImagePopup(e: any) {\r\n const url = e.file?.dataItem?.url;\r\n if (url) {\r\n window.open(this.normalizeUrl(url), '_blank', 'noopener,noreferrer');\r\n }\r\n }\r\n openUrl(url: string) {\r\n window.open(this.normalizeUrl(url), '_blank', 'noopener,noreferrer');\r\n }\r\n truncateUrl(url: string): string {\r\n if (!url) return '';\r\n return url.length > 30 ? url.slice(0, 30) + '...' : url;\r\n }\r\n\r\n download(id: string, fileName: string) {\r\n this.fileProvider.downloadFile(id).subscribe((blob: Blob) => {\r\n if (blob != null) {\r\n const url = window.URL.createObjectURL(blob);\r\n const a = document.createElement('a');\r\n a.href = url;\r\n a.download = fileName;\r\n document.body.appendChild(a);\r\n a.click();\r\n document.body.removeChild(a);\r\n }\r\n });\r\n }\r\n\r\n formatDateOnly(value: any): string {\r\n if (!value) return '';\r\n\r\n const date = new Date(value);\r\n\r\n if (isNaN(date.getTime())) return '';\r\n\r\n const pad = (n: number) => n.toString().padStart(2, '0');\r\n return `${date.getUTCFullYear()}-${pad(date.getUTCMonth() + 1)}-${pad(\r\n date.getUTCDate(),\r\n )}`;\r\n }\r\n\r\n //end\r\n\r\n // ?\r\n editRow(rowData: any) {\r\n this.editMode = true;\r\n this.editModel = {\r\n key: rowData.key,\r\n name: rowData.name || '',\r\n url: rowData.dataItem?.url || null,\r\n attachmentCode: rowData.dataItem?.attachmentCode || null,\r\n tags: rowData.dataItem?.tags || [],\r\n issueDate: this.parseDate(rowData.dataItem?.issueDate),\r\n expireDate: this.parseDate(rowData.dataItem?.expireDate),\r\n isLink: !!rowData.dataItem?.isLink,\r\n };\r\n\r\n if (this.editModel.isLink) {\r\n this.linkForm.linkName = this.editModel.name ?? '';\r\n this.linkForm.linkUrl = this.editModel.url ?? '';\r\n this.linkForm.attachmentCode = this.editModel.attachmentCode ?? '';\r\n this.linkForm.linkIssueDate = this.editModel.issueDate ?? null;\r\n this.linkForm.linkExpireDate = this.editModel.expireDate ?? null;\r\n this.loadTagForSelected(this.editModel.key || '');\r\n this.linkpopupVisible = true;\r\n } else {\r\n this.fileForm.attachmentCode = this.editModel.attachmentCode ?? '';\r\n this.loadTagForSelected(this.editModel.key || '');\r\n this.fileForm.fileIssueDate = this.editModel.issueDate ?? null;\r\n this.fileForm.fileExpireDate = this.editModel.expireDate ?? null;\r\n\r\n this.filepopupVisible = true;\r\n }\r\n this.cdr.detectChanges();\r\n }\r\n // ? Helper method to parse dates properly\r\n private parseDate(dateValue: any): Date | null {\r\n if (!dateValue) return null;\r\n\r\n const date = new Date(dateValue);\r\n return isNaN(date.getTime()) ? null : date;\r\n }\r\n\r\n async saveEdit() {\r\n if (!this.editMode || !this.editModel.key) return;\r\n\r\n let name: string,\r\n url: string | null,\r\n attachmentCode: string | null,\r\n tags: string[] | null,\r\n issueDate: Date | null,\r\n expireDate: Date | null;\r\n\r\n if (this.editModel.isLink) {\r\n name = this.linkForm.linkName || this.editModel.name || '';\r\n url = this.linkForm.linkUrl || this.editModel.url || null;\r\n attachmentCode =\r\n this.attachmentCode || this.editModel.attachmentCode || null;\r\n tags = this.selectedTags.length ? this.selectedTags : null;\r\n issueDate =\r\n this.linkForm.linkIssueDate || this.editModel.issueDate || null;\r\n expireDate =\r\n this.linkForm.linkExpireDate || this.editModel.expireDate || null;\r\n } else {\r\n name = this.editModel.name || '';\r\n url = null;\r\n attachmentCode =\r\n this.attachmentCode || this.editModel.attachmentCode || null;\r\n tags = this.selectedTags.length ? this.selectedTags : null;\r\n issueDate =\r\n this.fileForm.fileIssueDate || this.editModel.issueDate || null;\r\n expireDate =\r\n this.fileForm.fileExpireDate || this.editModel.expireDate || null;\r\n }\r\n\r\n try {\r\n await firstValueFrom(\r\n this.fileProvider.updateFileMetadataWithFile(\r\n this.editModel.key,\r\n name,\r\n this.attachmentSourceId,\r\n String(this.entityKey),\r\n this.selectedFile ?? undefined,\r\n url ?? undefined,\r\n issueDate ? this.formatDateOnly(issueDate) : null,\r\n expireDate ? this.formatDateOnly(expireDate) : null,\r\n attachmentCode ?? undefined,\r\n this.selectedTags.length ? this.selectedTags : undefined,\r\n this.editModel.isLink,\r\n ),\r\n );\r\n\r\n this.closeEdit();\r\n this.fileManager.instance.refresh();\r\n } catch (error) {\r\n // console.error('Update failed:', error);\r\n }\r\n }\r\n\r\n closeEdit() {\r\n this.editMode = false;\r\n this.isReplacingFile = false;\r\n this.replacementFile = null;\r\n this.linkpopupVisible = false;\r\n this.filepopupVisible = false;\r\n this.resetEditModel();\r\n this.linkForm.linkName = '';\r\n this.linkForm.linkUrl = '';\r\n this.linkForm.linkIssueDate = null;\r\n this.linkForm.linkExpireDate = null;\r\n this.manualSelectedFile = null;\r\n this.selectedFile = null;\r\n this.fileForm.fileIssueDate = null;\r\n this.fileForm.fileExpireDate = null;\r\n this.attachmentCode = null;\r\n this.selectedTags = [];\r\n this.resetFileInput();\r\n }\r\n editSelected = () => {\r\n const selected = this.fileManager.instance.getSelectedItems?.() ?? [];\r\n if (!selected.length) return;\r\n this.editRow(selected[0]);\r\n };\r\n\r\n onCustomTagCreating(e: any) {\r\n const text = (e?.text ?? '').trim();\r\n if (!text) {\r\n e.customItem = null;\r\n return;\r\n }\r\n\r\n if (!this.selectedTags.includes(text)) {\r\n this.selectedTags = [...this.selectedTags, text];\r\n }\r\n\r\n e.customItem = text;\r\n }\r\n\r\n async onFocusedItemChanged(e: DxFileManagerTypes.FocusedItemChangedEvent) {\r\n const item = e.item as any as FMItem;\r\n this.focusedItem = item;\r\n\r\n if (item && !item.isDirectory) {\r\n this.showTagBox = true;\r\n\r\n const attachmentId = ((item.dataItem?.id ?? item.key ?? '') as string)\r\n .toString()\r\n .replace(/^#/, '');\r\n\r\n try {\r\n const tags = await firstValueFrom(\r\n this.fileProvider.getAttachmentTags(attachmentId),\r\n );\r\n\r\n this.focusedItemTags = (tags ?? [])\r\n .map((t: any) => t.id)\r\n .filter(Boolean);\r\n } catch {\r\n this.focusedItemTags = [];\r\n }\r\n } else {\r\n this.showTagBox = false;\r\n this.focusedItemTags = [];\r\n }\r\n\r\n this.cdr.detectChanges();\r\n }\r\n\r\n hideTagBox() {\r\n this.showTagBox = false;\r\n }\r\n\r\n onTagsChanged(e: any) {\r\n this.focusedItemTags = e.value ?? [];\r\n }\r\n\r\n async saveFocusedItemTags() {\r\n if (!this.focusedItem) return;\r\n\r\n const id = (this.focusedItem.dataItem?.id ?? this.focusedItem.key ?? '')\r\n .toString()\r\n .replace(/^#/, '');\r\n\r\n try {\r\n this.savingTags = true;\r\n await firstValueFrom(\r\n this.fileProvider.setAttachmentTagsById(id, this.focusedItemTags),\r\n );\r\n } finally {\r\n this.savingTags = false;\r\n this.cdr.detectChanges();\r\n }\r\n }\r\n\r\n cancelTagChanges() {\r\n this.hideTagBox();\r\n }\r\n\r\n hideParentDirRow(): void {\r\n // Run multiple times with increasing delays to catch late renders\r\n [0, 100, 300, 500].forEach((delay) => {\r\n setTimeout(() => {\r\n const nameSpans = document.querySelectorAll(\r\n '#fileManager .dx-filemanager-details-item-name',\r\n );\r\n nameSpans.forEach((span) => {\r\n if (span.textContent?.trim() === '..') {\r\n const row = span.closest('.dx-row');\r\n if (row) {\r\n (row as HTMLElement).style.display = 'none';\r\n }\r\n }\r\n });\r\n }, delay);\r\n });\r\n }\r\n}\r\n","<div\r\n *ngIf=\"!attachmentSourceId\"\r\n class=\"alert alert-danger mt-4 text-center fs-5 fw-bold\"\r\n>\r\n ⚠️ File Manager requires both <strong>attachmentSourceId</strong> and\r\n <!-- <strong>entityKey</strong> -->\r\n to function correctly.\r\n</div>\r\n\r\n<div *ngIf=\"attachmentSourceId\">\r\n <dx-file-manager\r\n #fileManager\r\n id=\"fileManager\"\r\n [fileSystemProvider]=\"remoteProvider\"\r\n currentPath=\"Widescreen\"\r\n (onSelectedFileOpened)=\"displayImagePopup($event)\"\r\n (onSelectionChanged)=\"onSelectionChanged($event)\"\r\n (onCurrentDirectoryChanged)=\"onCurrentDirectoryChanged($event)\"\r\n (onContextMenuShowing)=\"onContextMenuShowing($event)\"\r\n (onFocusedItemChanged)=\"onFocusedItemChanged($event)\"\r\n (onContentReady)=\"hideParentDirRow()\"\r\n (onFileUploaded)=\"notifyStorageChanged()\"\r\n (onItemDeleted)=\"notifyStorageChanged()\"\r\n [itemView]=\"{ mode: 'details' }\"\r\n [rootFolderName]=\"' '\"\r\n >\r\n <!-- 📎 Toolbar -->\r\n <dxo-toolbar>\r\n <dxi-item\r\n name=\"showNavPane\"\r\n [visible]=\"true\"\r\n [options]=\"{\r\n hint: ('FileManager.showNavPane' | localize: 'عرض جزء التنقل'),\r\n }\"\r\n ></dxi-item>\r\n <dxi-item name=\"separator\"></dxi-item>\r\n <dxi-item\r\n name=\"refresh\"\r\n [options]=\"{\r\n hint: ('FileManager.Refresh' | localize: 'تحديث'),\r\n }\"\r\n ></dxi-item>\r\n <dxi-item name=\"separator\" location=\"after\"></dxi-item>\r\n <dxi-item\r\n name=\"switchView\"\r\n [options]=\"{\r\n hint: ('FileManager.switchView' | localize: 'طريقة العرض'),\r\n }\"\r\n ></dxi-item>\r\n\r\n <!-- ➕ Upload & Link (Folder) -->\r\n <!-- <dxi-item name=\"upload\" [visible]=\"IsEnabled && AllowAdd && isInDirectory\"></dxi-item> -->\r\n <dxi-item\r\n [visible]=\"IsEnabled && AllowAdd && isInDirectory\"\r\n widget=\"dxMenu\"\r\n location=\"before\"\r\n [options]=\"newFileMenuOptions\"\r\n >\r\n </dxi-item>\r\n\r\n <!-- 📂 Upload & Link (Selection) -->\r\n <dxi-file-selection-item\r\n name=\"upload\"\r\n [visible]=\"IsEnabled && AllowAdd && isDirectory && isSingleItemSelected\"\r\n >\r\n </dxi-file-selection-item>\r\n\r\n <dxi-file-selection-item\r\n [visible]=\"IsEnabled && AllowAdd && isDirectory && isSingleItemSelected\"\r\n widget=\"dxMenu\"\r\n location=\"before\"\r\n [options]=\"newFileMenuOptions\"\r\n >\r\n </dxi-file-selection-item>\r\n\r\n <!-- 🛠️ Edit/Delete Actions -->\r\n <!-- <dxi-file-selection-item name=\"separator\"></dxi-file-selection-item> -->\r\n <!-- <dxi-file-selection-item\r\n name=\"rename\"\r\n [visible]=\"\r\n IsEnabled && AllowModify && !isDirectory && isSingleItemSelected\r\n \"\r\n >\r\n </dxi-file-selection-item> -->\r\n <!-- <dxi-file-selection-item name=\"separator\"></dxi-file-selection-item>\r\n <dxi-file-selection-item\r\n name=\"delete\"\r\n [visible]=\"IsEnabled && AllowDelete && !isDirectory\"\r\n >\r\n </dxi-file-selection-item> -->\r\n <dxi-file-selection-item name=\"separator\"></dxi-file-selection-item>\r\n\r\n <dxi-file-selection-item\r\n widget=\"dxButton\"\r\n [visible]=\"\r\n IsEnabled && AllowModify && isSingleItemSelected && !isDirectory\r\n \"\r\n [options]=\"{\r\n icon: 'edit',\r\n hint: ('FileManager.Edit' | localize: 'تعديل'),\r\n text: ('FileManager.Edit' | localize: 'تعديل'),\r\n onClick: editSelected,\r\n }\"\r\n >\r\n </dxi-file-selection-item>\r\n\r\n <dxi-file-selection-item name=\"separator\"></dxi-file-selection-item>\r\n <dxi-file-selection-item\r\n name=\"delete\"\r\n [visible]=\"IsEnabled && AllowDelete && !isDirectory\"\r\n [options]=\"{\r\n text: ('1838' | localize: 'حذف'),\r\n hint: ('1838' | localize: 'حذف'),\r\n }\"\r\n >\r\n </dxi-file-selection-item>\r\n <dxi-file-selection-item name=\"separator\"></dxi-file-selection-item>\r\n\r\n <!-- 📥 Download & Refresh -->\r\n <dxi-file-selection-item\r\n name=\"download\"\r\n [visible]=\"!isDownloadDisabled && !isDirectory\"\r\n [options]=\"{\r\n text: ('FileManager.Download' | localize: 'تحميل'),\r\n hint: ('FileManager.Download' | localize: 'تحميل'),\r\n }\"\r\n >\r\n </dxi-file-selection-item>\r\n <dxi-file-selection-item name=\"separator\"></dxi-file-selection-item>\r\n <dxi-file-selection-item\r\n name=\"refresh\"\r\n [options]=\"{\r\n text: ('FileManager.Refresh' | localize: 'تحديث'),\r\n hint: ('FileManager.Refresh' | localize: 'تحديث'),\r\n }\"\r\n ></dxi-file-selection-item>\r\n <dxi-file-selection-item\r\n name=\"clearSelection\"\r\n [options]=\"{\r\n text: ('FileManager.ClearSelection' | localize: 'إلغاء التحديد'),\r\n hint: ('FileManager.ClearSelection' | localize: 'إلغاء التحديد'),\r\n }\"\r\n ></dxi-file-selection-item>\r\n </dxo-toolbar>\r\n\r\n <dxo-permissions\r\n [create]=\"false\"\r\n [copy]=\"false\"\r\n [move]=\"false\"\r\n [delete]=\"IsEnabled && AllowDelete\"\r\n [rename]=\"IsEnabled && AllowModify\"\r\n [upload]=\"IsEnabled && AllowAdd\"\r\n [download]=\"true\"\r\n >\r\n </dxo-permissions>\r\n <dxo-item-view mode=\"details\">\r\n <dxo-details>\r\n <dxi-column\r\n dataField=\"name\"\r\n [caption]=\"'ui.file-manager.1' | localize: 'الاسم'\"\r\n width=\"170\"\r\n visibleIndex=\"0\"\r\n >\r\n </dxi-column>\r\n\r\n <dxi-column\r\n dataField=\"dateModified\"\r\n [caption]=\"'ui.file-manager.2' | localize: 'تاريخ التعديل'\"\r\n dataType=\"date\"\r\n width=\"120\"\r\n visibleIndex=\"1\"\r\n >\r\n </dxi-column>\r\n\r\n <dxi-column\r\n dataField=\"size\"\r\n [caption]=\"'ui.file-manager.3' | localize: 'حجم الملف'\"\r\n dataType=\"number\"\r\n width=\"100\"\r\n visibleIndex=\"2\"\r\n >\r\n </dxi-column>\r\n <dxi-column\r\n dataField=\"attachmentCode\"\r\n dataType=\"text\"\r\n [caption]=\"'ui.file-manager.4' | localize: 'رقم المرجع'\"\r\n width=\"100\"\r\n visibleIndex=\"3\"\r\n >\r\n </dxi-column>\r\n\r\n <dxi-column\r\n dataField=\"issueDate\"\r\n dataType=\"date\"\r\n [caption]=\"'ui.file-manager.5' | localize: 'تاريخ الإصدار'\"\r\n width=\"120\"\r\n visibleIndex=\"4\"\r\n ></dxi-column>\r\n <dxi-column\r\n dataField=\"expireDate\"\r\n dataType=\"date\"\r\n [caption]=\"'ui.file-manager.6' | localize: 'تاريخ الانتهاء'\"\r\n width=\"120\"\r\n visibleIndex=\"5\"\r\n ></dxi-column>\r\n <dxi-column\r\n dataField=\"url\"\r\n [caption]=\"'ui.file-manager.7' | localize: 'الرابط'\"\r\n width=\"220\"\r\n cssClass=\"url-column\"\r\n [visible]=\"false\"\r\n >\r\n </dxi-column>\r\n </dxo-details>\r\n </dxo-item-view>\r\n </dx-file-manager>\r\n\r\n <!-- 🏷️ TagBox for focused (non-directory) item -->\r\n <div\r\n *ngIf=\"showTagBox && focusedItem && !focusedItem.isDirectory\"\r\n class=\"tag-box-container mt-3 p-3 border rounded bg-light\"\r\n >\r\n <div class=\"d-flex align-items-center justify-content-between mb-2\">\r\n <h6 class=\"mb-0\">\r\n <i class=\"dx-icon-tags me-2\"></i>\r\n {{ 'ui.file-manager.8' | localize: 'الوسوم -' }} {{ focusedItem.name }}\r\n </h6>\r\n <button\r\n type=\"button\"\r\n class=\"btn-close btn-sm\"\r\n (click)=\"hideTagBox()\"\r\n [attr.aria-label]=\"'ui.file-manager.9' | localize: 'إغلاق'\"\r\n ></button>\r\n </div>\r\n\r\n <dx-tag-box\r\n [dataSource]=\"dsAttachmentTags\"\r\n [(value)]=\"focusedItemTags\"\r\n valueExpr=\"id\"\r\n [displayExpr]=\"nameExpr\"\r\n [searchExpr]=\"nameSearchExpr\"\r\n [searchEnabled]=\"true\"\r\n [hideSelectedItems]=\"true\"\r\n [acceptCustomValue]=\"false\"\r\n [placeholder]=\"'ui.file-manager.10' | localize: 'إضافة أو تحديد الوسوم...'\"\r\n (onValueChanged)=\"onTagsChanged($event)\"\r\n [disabled]=\"!IsEnabled || !AllowModify\"\r\n >\r\n </dx-tag-box>\r\n <div class=\"mt-2 text-end\">\r\n <dx-button\r\n [text]=\"'ui.file-manager.11' | localize: 'حفظ الوسوم'\"\r\n type=\"success\"\r\n icon=\"save\"\r\n [disabled]=\"!IsEnabled || !AllowModify || savingTags\"\r\n (onClick)=\"saveFocusedItemTags()\"\r\n class=\"me-2\"\r\n ></dx-button>\r\n <dx-button\r\n [text]=\"'ui.file-manager.12' | localize: 'إلغاء'\"\r\n type=\"normal\"\r\n stylingMode=\"outlined\"\r\n (onClick)=\"cancelTagChanges()\"\r\n >\r\n </dx-button>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<!-- 🔗 Upload Link Popup -->\r\n<dx-popup\r\n #linkPopup\r\n [(visible)]=\"linkpopupVisible\"\r\n [width]=\"700\"\r\n [height]=\"'auto'\"\r\n [showTitle]=\"true\"\r\n [title]=\"editMode ? ('ui.file-manager.13' | localize: 'تعديل رابط') : ('ui.file-manager.14' | localize: 'رفع رابط')\"\r\n [dragEnabled]=\"false\"\r\n [hideOnOutsideClick]=\"true\"\r\n [showCloseButton]=\"true\"\r\n [resizeEnabled]=\"true\"\r\n>\r\n <div *dxTemplate=\"let data of 'content'\">\r\n <dx-form [formData]=\"linkForm\" [colCount]=\"2\">\r\n <dxi-item\r\n dataField=\"linkName\"\r\n editorType=\"dxTextBox\"\r\n [label]=\"{ text: ('ui.file-manager.1' | localize: 'الاسم') }\"\r\n >\r\n </dxi-item>\r\n\r\n <dxi-item\r\n dataField=\"linkUrl\"\r\n editorType=\"dxTextBox\"\r\n [label]=\"{ text: ('ui.file-manager.7' | localize: 'الرابط') }\"\r\n >\r\n </dxi-item>\r\n\r\n <!-- <dxi-item\r\n dataField=\"selectedTags\"\r\n editorType=\"dxTagBox\"\r\n [label]=\"{ text: 'الوسوم' }\"\r\n [editorOptions]=\"linkTagBoxOptions\"\r\n >\r\n </dxi-item> -->\r\n\r\n <!-- ================================== -->\r\n <!-- <dxi-item\r\n dataField=\"selectedTags\"\r\n editorType=\"dxTagBox\"\r\n [editorOptions]=\"{\r\n dataSource: dsAttachmentTags,\r\n valueExpr: 'id',\r\n displayExpr: localizedNameExpr,\r\n showSelectionControls: true,\r\n applyValueMode: 'instantly',\r\n }\"\r\n ></dxi-item> -->\r\n\r\n <dxi-item\r\n dataField=\"linkIssueDate\"\r\n editorType=\"dxDateBox\"\r\n [label]=\"{ text: ('ui.file-manager.5' | localize: 'تاريخ الإصدار') }\"\r\n >\r\n </dxi-item>\r\n\r\n <dxi-item\r\n dataField=\"linkExpireDate\"\r\n editorType=\"dxDateBox\"\r\n [label]=\"{ text: ('ui.file-manager.6' | localize: 'تاريخ الانتهاء') }\"\r\n >\r\n </dxi-item>\r\n <dxi-item\r\n dataField=\"attachmentCode\"\r\n editorType=\"dxTextBox\"\r\n [label]=\"{ text: ('ui.file-manager.4' | localize: 'رقم المرجع') }\"\r\n >\r\n </dxi-item>\r\n\r\n <dxi-item></dxi-item>\r\n\r\n <dxi-item [colSpan]=\"2\" template=\"buttonsTemplate\"> </dxi-item>\r\n\r\n <div *dxTemplate=\"let d of 'buttonsTemplate'\" class=\"text-end mt-4\">\r\n <dx-button\r\n *ngIf=\"!editMode\"\r\n icon=\"upload\"\r\n [text]=\"'FileManager.Upload' | localize: 'رفع'\"\r\n type=\"success\"\r\n (onClick)=\"addLink()\"\r\n >\r\n </dx-button>\r\n\r\n <dx-button\r\n *ngIf=\"editMode\"\r\n icon=\"save\"\r\n [text]=\"'ui.file-manager.15' | localize: 'حفظ'\"\r\n type=\"success\"\r\n (onClick)=\"saveEdit()\"\r\n >\r\n </dx-button>\r\n\r\n <dx-button\r\n [text]=\"'ui.file-manager.12' | localize: 'إلغاء'\"\r\n stylingMode=\"outlined\"\r\n (onClick)=\"closeEdit()\"\r\n class=\"ms-2\"\r\n >\r\n </dx-button>\r\n </div>\r\n </dx-form>\r\n </div>\r\n</dx-popup>\r\n\r\n<!-- File popup -->\r\n<dx-popup\r\n #filePopup\r\n [(visible)]=\"filepopupVisible\"\r\n [width]=\"700\"\r\n [height]=\"'auto'\"\r\n [showTitle]=\"true\"\r\n [title]=\"editMode ? ('ui.file-manager.16' | localize: 'تعديل ملف') : ('ui.file-manager.17' | localize: 'رفع ملف')\"\r\n [dragEnabled]=\"false\"\r\n [hideOnOutsideClick]=\"true\"\r\n [showCloseButton]=\"true\"\r\n [resizeEnabled]=\"true\"\r\n>\r\n <div *dxTemplate=\"let data of 'content'\">\r\n <dx-form [formData]=\"fileForm\" [colCount]=\"2\">\r\n <!-- اختيار الملف -->\r\n <dxi-item [colSpan]=\"2\" template=\"fileSelectorTemplate\"> </dxi-item>\r\n\r\n <dxi-item\r\n dataField=\"fileIssueDate\"\r\n editorType=\"dxDateBox\"\r\n [label]=\"{ text: ('ui.file-manager.5' | localize: 'تاريخ الإصدار') }\"\r\n [editorOptions]=\"{ type: 'date' }\"\r\n >\r\n </dxi-item>\r\n\r\n <dxi-item\r\n dataField=\"fileExpireDate\"\r\n editorType=\"dxDateBox\"\r\n [label]=\"{ text: ('ui.file-manager.6' | localize: 'تاريخ الانتهاء') }\"\r\n [editorOptions]=\"{ type: 'date' }\"\r\n >\r\n </dxi-item>\r\n\r\n <!-- الكود -->\r\n <dxi-item\r\n dataField=\"attachmentCode\"\r\n editorType=\"dxTextBox\"\r\n [label]=\"{ text: ('ui.file-manager.4' | localize: 'رقم المرجع') }\"\r\n >\r\n </dxi-item>\r\n\r\n \r\n <dxi-item [colSpan]=\"2\" template=\"fileButtonsTemplate\"> </dxi-item>\r\n\r\n <div *dxTemplate=\"let d of 'fileSelectorTemplate'\" class=\"mt-2\">\r\n <input\r\n #fileInput\r\n type=\"file\"\r\n style=\"display: none !important\"\r\n (change)=\"onFileSelected($event)\"\r\n />\r\n <div class=\"d-flex align-items-center gap-2\">\r\n <dx-button\r\n icon=\"folder\"\r\n [text]=\"\r\n editMode\r\n ? ('FileManager.ReplaceFile' | localize: 'استبدال بملف جديد')\r\n : ('FileManager.ChooseFile' | localize: 'اختر ملف')\r\n \"\r\n type=\"normal\"\r\n stylingMode=\"outlined\"\r\n (onClick)=\"fileInput.click()\"\r\n ></dx-button>\r\n <span *ngIf=\"!editMode\" class=\"text-danger\">*</span>\r\n <span class=\"text-muted\">\r\n {{\r\n selectedFile\r\n ? selectedFile.name\r\n : (\"FileManager.NoFileChosen\" | localize: \"لم يتم اختيار ملف\")\r\n }}\r\n </span>\r\n </div>\r\n <div *ngIf=\"editMode && editModel.name\" class=\"mt-2\">\r\n <small class=\"text-muted\">\r\n {{ 'ui.file-manager.18' | localize: '📄 الملف الحالي:' }} {{ editModel.name }}\r\n </small>\r\n </div>\r\n\r\n <div\r\n *ngIf=\"editMode && isReplacingFile && replacementFile\"\r\n class=\"mt-2\"\r\n >\r\n <small class=\"text-success\">\r\n {{ 'ui.file-manager.19' | localize: '✅ سيتم استبدال الملف بـ:' }} {{ replacementFile.name }}\r\n </small>\r\n </div>\r\n </div>\r\n\r\n <!-- Template: Buttons -->\r\n <div *dxTemplate=\"let d of 'fileButtonsTemplate'\" class=\"text-end mt-3\">\r\n <dx-button\r\n *ngIf=\"!editMode\"\r\n icon=\"upload\"\r\n [text]=\"'loc.fileManager.2' | localize: 'رفع'\"\r\n type=\"success\"\r\n (onClick)=\"uploadManualFile()\"\r\n >\r\n </dx-button>\r\n\r\n <dx-button\r\n *ngIf=\"editMode\"\r\n icon=\"save\"\r\n [text]=\"'ui.file-manager.15' | localize: 'حفظ'\"\r\n type=\"success\"\r\n (onClick)=\"saveEdit()\"\r\n >\r\n </dx-button>\r\n\r\n <dx-button\r\n [text]=\"'ui.file-manager.12' | localize: 'إلغاء'\"\r\n type=\"normal\"\r\n stylingMode=\"outlined\"\r\n (onClick)=\"closeEdit()\"\r\n class=\"ms-2\"\r\n >\r\n </dx-button>\r\n </div>\r\n </dx-form>\r\n </div>\r\n</dx-popup>\r\n","import {\r\n Directive,\r\n Input,\r\n OnChanges,\r\n SimpleChanges,\r\n TemplateRef,\r\n ViewContainerRef,\r\n} from '@angular/core';\r\n\r\n@Directive({\r\n selector: '[appDxFormItemsOutlet]',\r\n standalone: true,\r\n})\r\nexport class DxFormItemsOutletDirective implements OnChanges {\r\n @Input('appDxFormItemsOutlet') template: TemplateRef<unknown> | null = null;\r\n\r\n constructor(private readonly viewContainerRef: ViewContainerRef) {}\r\n\r\n ngOnChanges(_changes: SimpleChanges): void {\r\n this.viewContainerRef.clear();\r\n\r\n if (!this.template) {\r\n return;\r\n }\r\n\r\n this.viewContainerRef.createEmbeddedView(\r\n this.template,\r\n {},\r\n {\r\n injector: this.viewContainerRef.injector,\r\n }\r\n );\r\n }\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport {\r\n ChangeDetectorRef,\r\n Component,\r\n enableProdMode,\r\n EventEmitter,\r\n Input,\r\n Inject,\r\n Optional,\r\n OnChanges,\r\n OnInit,\r\n Output,\r\n SimpleChanges,\r\n ViewChild,\r\n} from '@angular/core';\r\nimport {\r\n DxDataGridComponent,\r\n DxDataGridModule,\r\n DxDropDownBoxModule,\r\n DxNumberBoxModule,\r\n DxValidatorModule,\r\n} from 'devextreme-angular';\r\nimport { Guid } from 'devextreme/common';\r\nimport { firstValueFrom } from 'rxjs';\r\nimport { REUSABLE_COMPONENTS_CONFIG, ReusableComponentsConfig } from '../reusable-components.config';\r\nimport { LINQ_SELECT_COMMAND_TYPE, LOOKUP_GRID_PROVIDER, LookupGridProvider, LookupValueType, lookupValueToArray } from '../lookup-grid-provider';\r\n\r\nif (!/localhost/.test(document.location.host)) {\r\n enableProdMode();\r\n}\r\n\r\nlet modulePrefix = '';\r\n// @ts-ignore\r\nif (window && window.config?.packageConfigPaths) {\r\n modulePrefix = '/app';\r\n}\r\n\r\n@Component({\r\n selector: 'app-grid-lookup',\r\n standalone: true,\r\n imports: [\r\n DxDataGridModule,\r\n DxDropDownBoxModule,\r\n CommonModule,\r\n DxNumberBoxModule,\r\n DxValidatorModule,\r\n ],\r\n templateUrl: './grid-lookup.component.html',\r\n styleUrl: './grid-lookup.component.scss',\r\n})\r\nexport class GridLookupComponent implements OnInit, OnChanges {\r\n columns: any[] = [];\r\n remoteOperations = true;\r\n valueExpr: any;\r\n displayExpr: any;\r\n gridDataSource: any;\r\n\r\n selectedValue: any[] = [];\r\n isMultiSelectMode: 'none' | 'single' | 'multiple' = 'single';\r\n selectedItems: any[] = [];\r\n\r\n @Input() lookupId!: Guid;\r\n @Input() width: number | string = '100%';\r\n @Input() lookupParameterSource: string | number | null = null;\r\n @Input() lookupParameters: string | null = null;\r\n @Input() selectParametersCallback?: () => Record<string, any>;\r\n @Input() caption: string = 'GridLookUp Caption';\r\n @Input() fieldName!: string;\r\n @Input() gridId!: string;\r\n @Input() name!: string;\r\n text: string | null = null;\r\n\r\n @Input() valueType!: LookupValueType | number;\r\n @Input() isMultiSelect = false;\r\n @Input() isCode = false;\r\n @Input() useCommaSeparatedValues!: boolean;\r\n @Input() value: any | string | Guid | null | undefined;\r\n @Output() valueChange = new EventEmitter<any>();\r\n\r\n // ✅ جديد: دعم القراءة فقط\r\n @Input() readOnly = false;\r\n @Input() disabled = false;\r\n\r\n /**\r\n * ارتفاع القائمة المنسدلة (اختياري). بدونه تأخذ DropDownBox المساحة المتبقية تحت الحقل،\r\n * فحقلٌ قرب أسفل الشاشة (داخل نافذة مثلاً) تنكمش شبكته إلى صفر صفوف. مع قيمة ثابتة\r\n * تنقلب القائمة فوق الحقل عند الحاجة والشبكة تملؤها.\r\n */\r\n @Input() dropDownHeight: number | string | null = null;\r\n @Input() dropDownWidth: number | string = 'auto';\r\n\r\n get dropDownOptions(): Record<string, any> {\r\n const key = `${this.dropDownWidth}|${this.dropDownHeight}`;\r\n if (this._dropDownOptionsKey !== key) {\r\n this._dropDownOptionsKey = key;\r\n this._dropDownOptions =\r\n this.dropDownHeight == null\r\n ? { width: this.dropDownWidth }\r\n : { width: this.dropDownWidth, height: this.dropDownHeight };\r\n }\r\n return this._dropDownOptions;\r\n }\r\n private _dropDownOptionsKey = '';\r\n private _dropDownOptions: Record<string, any> = {};\r\n\r\n @ViewChild(DxDataGridComponent, { static: false })\r\n dataGrid!: DxDataGridComponent;\r\n\r\n @ViewChild('dropDown', { static: false }) dropDownRef: any;\r\n\r\n id: string = '';\r\n code: string = '';\r\n\r\n @Input() required = false;\r\n @Input() requiredMessage = 'This field is required';\r\n @Input() validationGroup: string = 'validationGroup1';\r\n\r\n constructor(\r\n @Inject(LOOKUP_GRID_PROVIDER) private sysLookupService: LookupGridProvider,\r\n private cdr: ChangeDetectorRef,\r\n @Optional() @Inject(REUSABLE_COMPONENTS_CONFIG) private readonly libraryConfig: ReusableComponentsConfig | null,\r\n ) {}\r\n\r\n /**\r\n * \"Search on Enter\" for the inner grid's filter row. This component doesn't import\r\n * AppGridDefaultsDirective (it would impose all the grid defaults on the compact dropdown grid),\r\n * so we wire the shared editor-deferral directly. The Arabic-aware matching itself is handled\r\n * server-side via the sys-lookup data source.\r\n */\r\n onEditorPreparing(e: any): void {\r\n if (e?.parentType !== 'filterRow') return;\r\n e.editorOptions = e.editorOptions || {};\r\n e.editorOptions.valueChangeEvent = 'change';\r\n }\r\n\r\n async ngOnInit(): Promise<void> {\r\n await this.prepareProperties();\r\n\r\n this.gridDataSource = await this.sysLookupService.createDataSource(\r\n this.lookupId,\r\n this.valueExpr,\r\n true,\r\n this.lookupParameterSource,\r\n this.selectParametersCallback,\r\n this.lookupParameters,\r\n );\r\n\r\n this.isMultiSelectMode = this.isMultiSelect ? 'multiple' : 'single';\r\n if (this.readOnly) this.isMultiSelectMode = 'none';\r\n\r\n // مزامنة selectedValue من value الابتدائية لو متاحة\r\n if (typeof this.value !== 'undefined') {\r\n this.selectedValue = lookupValueToArray(this.value, this.valueType);\r\n }\r\n }\r\n\r\n onDropDownOpened(): void {\r\n if (!this.selectParametersCallback) return;\r\n\r\n this.gridDataSource?.reload?.();\r\n }\r\n\r\n async ngOnChanges(changes: SimpleChanges) {\r\n // لما يتغير باراميتر الاختيار\r\n if (\r\n changes['selectParametersCallback'] &&\r\n !changes['selectParametersCallback'].firstChange\r\n ) {\r\n this.selectedValue = [];\r\n this.gridDataSource = await this.sysLookupService.createDataSource(\r\n this.lookupId,\r\n this.valueExpr,\r\n true,\r\n this.lookupParameterSource,\r\n this.selectParametersCallback,\r\n this.lookupParameters,\r\n );\r\n }\r\n\r\n // لما تتغير القيمة القادمة من الأب\r\n if (changes['value']) {\r\n if (typeof this.value !== 'undefined') {\r\n this.selectedValue = lookupValueToArray(this.value, this.valueType);\r\n } else {\r\n this.selectedValue = [];\r\n }\r\n }\r\n\r\n // لو اتغير وضع القراءة فقط أثناء التشغيل\r\n if (changes['readOnly'] && !changes['readOnly'].firstChange) {\r\n this.isMultiSelectMode = this.readOnly\r\n ? 'none'\r\n : this.isMultiSelect\r\n ? 'multiple'\r\n : 'single';\r\n if (this.dataGrid?.instance) {\r\n this.dataGrid.instance.option('focusedRowEnabled', !this.readOnly);\r\n this.dataGrid.instance.option('hoverStateEnabled', !this.readOnly);\r\n }\r\n this.cdr.detectChanges();\r\n }\r\n }\r\n\r\n onValueChanged(e: any) {\r\n // في وضع القراءة فقط: لا تغيّر ولا تمسح\r\n if (this.readOnly) return;\r\n\r\n if (e?.value == null && e?.previousValue != null) {\r\n this.clearFocusedRowInGrid();\r\n this.cdr.detectChanges();\r\n }\r\n }\r\n\r\n clearFocusedRowInGrid(): void {\r\n if (this.readOnly) return; // حماية إضافية\r\n this.text = null;\r\n this.value = null;\r\n this.valueChange.emit(this.value);\r\n\r\n if (this.dataGrid?.instance) {\r\n this.dataGrid.instance.clearSelection();\r\n this.dataGrid.instance.option('focusedRowIndex', -1);\r\n }\r\n }\r\n\r\n onSelectionChanged(event: any) {\r\n if (this.readOnly) return; // لا تسمح بالاختيار\r\n\r\n this.selectedItems = event.selectedRowsData || [];\r\n const dropText = this.getSelectedDisplayTexts();\r\n this.text = dropText.join(', ');\r\n\r\n let selectedString: any;\r\n\r\n if (this.isMultiSelect) {\r\n selectedString =\r\n this.useCommaSeparatedValues == true\r\n ? (this.selectedValue ?? []).join(',')\r\n : this.selectedValue;\r\n } else {\r\n switch (this.valueType) {\r\n case LookupValueType.Int16:\r\n case LookupValueType.Int32:\r\n case LookupValueType.Int64:\r\n case LookupValueType.Byte:\r\n selectedString = parseInt(this.selectedValue[0], 10);\r\n break;\r\n case LookupValueType.Boolean:\r\n selectedString = this.selectedValue[0].toLowerCase() === 'true';\r\n break;\r\n case LookupValueType.Char:\r\n selectedString = this.selectedValue[0].charAt(0);\r\n break;\r\n case LookupValueType.Guid:\r\n case LookupValueType.String:\r\n default:\r\n selectedString = this.selectedValue[0];\r\n }\r\n }\r\n\r\n this.value = selectedString;\r\n this.valueChange.emit(this.value);\r\n this.cdr.detectChanges();\r\n\r\n // Single select: picking a row is the whole interaction, so close the drop-down (the\r\n // pattern DevExtreme documents for a DropDownBox hosting a single-selection DataGrid).\r\n // Multi select stays open so several rows can be ticked.\r\n if (!this.isMultiSelect && event.currentSelectedRowKeys?.length) {\r\n this.dropDownRef?.instance?.close();\r\n }\r\n }\r\n\r\n getSelectedDisplayTexts(): string[] {\r\n return (this.selectedItems || []).map(\r\n (item) =>\r\n (typeof this.displayExpr === 'function'\r\n ? this.displayExpr(item)\r\n : item?.[this.displayExpr]) ?? '',\r\n );\r\n }\r\n\r\n async prepareProperties(): Promise<void> {\r\n const sysLookup = await firstValueFrom(\r\n this.sysLookupService.getSysLookup(this.lookupId as any),\r\n );\r\n\r\n if (!sysLookup) {\r\n this.columns = [];\r\n this.remoteOperations = false;\r\n return;\r\n }\r\n\r\n // this.isMultiSelect = sysLookup.multi_Select ?? false;\r\n this.valueType = this.valueType ?? sysLookup.value_Type;\r\n\r\n const isLinq = sysLookup.select_Command_Type === LINQ_SELECT_COMMAND_TYPE;\r\n\r\n // if (!isLinq) {\r\n // this.valueExpr = this.sysLookupService.toCamelCase(\r\n // sysLookup.key_Fields ?? ''\r\n // );\r\n // this.displayExpr = this.sysLookupService.toCamelCase(\r\n // sysLookup.return_Fields_Ar ?? ''\r\n // );\r\n // } else {\r\n // this.valueExpr = sysLookup.value_Field_Name ?? '';\r\n // this.displayExpr = sysLookup.text_Field_Name_Ar ?? '';\r\n // }\r\n\r\n this.valueExpr = this.sysLookupService.toCamelCase(\r\n sysLookup.key_Fields ?? '',\r\n );\r\n // English UI: the English metadata, falling back to the Arabic side whenever the English\r\n // one is blank or does not line up with it. Rows carry both languages (bilingual\r\n // lookups), so a cell whose English value is empty still shows the Arabic one.\r\n const english = !(this.libraryConfig?.isArabic?.() ?? true);\r\n const camel = (v?: string | null) => this.sysLookupService.toCamelCase(v ?? '');\r\n\r\n const returnAr = camel(sysLookup.return_Fields_Ar);\r\n const returnEn = camel(sysLookup.return_Fields_En);\r\n const singleField = (f: string) => !!f && !/[|,]/.test(f);\r\n this.displayExpr =\r\n english && singleField(returnAr) && singleField(returnEn) && returnAr !== returnEn\r\n ? (item: any): string => {\r\n if (!item) return '';\r\n const en = item[returnEn];\r\n const ar = item[returnAr];\r\n const has = (v: unknown) => v != null && String(v).trim() !== '';\r\n return has(en) ? String(en) : has(ar) ? String(ar) : '';\r\n }\r\n : returnAr;\r\n\r\n this.remoteOperations = isLinq;\r\n\r\n const count = (v?: string | null) => (v ?? '').split('|').length;\r\n const fieldsAr = sysLookup.column_Fields_Ar ?? '';\r\n const useEnFields =\r\n english && !!sysLookup.column_Fields_En?.trim() &&\r\n count(sysLookup.column_Fields_En) === count(fieldsAr);\r\n const fields = useEnFields ? sysLookup.column_Fields_En! : fieldsAr;\r\n const titles =\r\n english && !!sysLookup.column_Titles_En?.trim() &&\r\n count(sysLookup.column_Titles_En) === count(fieldsAr)\r\n ? sysLookup.column_Titles_En!\r\n : (sysLookup.column_Titles_Ar ?? '');\r\n\r\n this.columns = this.sysLookupService.createGridColumns(\r\n fields,\r\n titles,\r\n sysLookup.column_Widths ?? '',\r\n sysLookup.select_Command_Type,\r\n );\r\n\r\n if (useEnFields) {\r\n // Display-only fallback: filtering and sorting still run on the English dataField.\r\n const arFields = fieldsAr.split('|').map((f: string) => camel(f));\r\n this.columns.forEach((col: any, i: number) => {\r\n const ar = arFields[i];\r\n if (ar && ar !== col.dataField) {\r\n col.calculateDisplayValue = (row: any) => row?.[col.dataField] || row?.[ar];\r\n }\r\n });\r\n }\r\n }\r\n\r\n requiredValidationCallback = (e: any): boolean => {\r\n const v = e?.value;\r\n\r\n // هنا value للـ dx-drop-down-box هي selectedValue (Array)\r\n if (Array.isArray(v)) return v.length > 0;\r\n\r\n return v !== null && v !== undefined && v !== '';\r\n };\r\n}\r\n","<!-- [label]=\"caption\" -->\r\n<dx-drop-down-box\r\n #dropDown\r\n labelMode=\"outside\"\r\n [(value)]=\"selectedValue\"\r\n [dataSource]=\"gridDataSource\"\r\n [displayExpr]=\"displayExpr\"\r\n [valueExpr]=\"valueExpr\"\r\n [showClearButton]=\"!readOnly\"\r\n [readOnly]=\"readOnly\"\r\n [disabled]=\"disabled\"\r\n [width]=\"width\"\r\n [dropDownOptions]=\"dropDownOptions\"\r\n (onValueChanged)=\"onValueChanged($event)\"\r\n (onOpened)=\"onDropDownOpened()\"\r\n>\r\n @if (required) {\r\n <dx-validator [validationGroup]=\"validationGroup\">\r\n <dxi-validation-rule\r\n type=\"custom\"\r\n [message]=\"requiredMessage\"\r\n [validationCallback]=\"requiredValidationCallback\"\r\n ></dxi-validation-rule>\r\n </dx-validator>\r\n }\r\n\r\n <div *dxTemplate=\"let data of 'content'\">\r\n <dx-data-grid\r\n [dataSource]=\"gridDataSource\"\r\n [columns]=\"columns\"\r\n [showBorders]=\"true\"\r\n [height]=\"dropDownHeight == null ? undefined : '100%'\"\r\n [columnAutoWidth]=\"true\"\r\n [remoteOperations]=\"true\"\r\n [focusedRowEnabled]=\"!readOnly\"\r\n [hoverStateEnabled]=\"!readOnly\"\r\n (onEditorPreparing)=\"onEditorPreparing($event)\"\r\n (onSelectionChanged)=\"onSelectionChanged($event)\"\r\n [(selectedRowKeys)]=\"selectedValue\"\r\n >\r\n <dxo-filter-row [visible]=\"true\"></dxo-filter-row>\r\n <dxo-header-filter [visible]=\"true\"></dxo-header-filter>\r\n <dxo-paging [pageSize]=\"20\"></dxo-paging>\r\n <dxo-selection [mode]=\"isMultiSelectMode\"></dxo-selection>\r\n <!-- none/single/multiple -->\r\n </dx-data-grid>\r\n </div>\r\n</dx-drop-down-box>\r\n","import { InjectionToken, Provider } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport { LookupContext, LookupItem, LookupKey, LookupSearchResult } from './lookup.models';\r\n\r\nexport type LookupAsync<T> = Promise<T> | Observable<T> | T;\r\n\r\nexport interface LookupDataProvider {\r\n resolve(context: LookupContext, key: LookupKey): LookupAsync<LookupItem | null>;\r\n search(context: LookupContext, query: string): LookupAsync<LookupSearchResult>;\r\n}\r\n\r\nexport const LOOKUP_DATA_PROVIDER = new InjectionToken<LookupDataProvider>(\r\n 'LOOKUP_DATA_PROVIDER',\r\n);\r\n\r\nexport function provideLookup(provider: LookupDataProvider): Provider {\r\n return { provide: LOOKUP_DATA_PROVIDER, useValue: provider };\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport { AfterViewInit, ChangeDetectorRef, Component, EventEmitter, Inject, inject, Input, OnChanges, Output, SimpleChanges, ViewChild } from '@angular/core';\r\nimport { DxButtonModule, DxTextBoxModule, DxValidatorModule } from 'devextreme-angular';\r\nimport { Guid } from 'devextreme/common';\r\nimport { firstValueFrom, isObservable } from 'rxjs';\r\nimport { FORM_NAVIGATOR_ADAPTER } from '../form-navigator/form-navigator-adapter';\r\nimport { NavigatorLocalizePipe } from '../form-navigator/navigator-localize.pipe';\r\nimport { LOOKUP_DATA_PROVIDER, LookupAsync, LookupDataProvider } from '../lookup-data-provider';\r\nimport { LOOKUP_GRID_PROVIDER } from '../lookup-grid-provider';\r\nimport { REUSABLE_COMPONENTS_CONFIG } from '../reusable-components.config';\r\nimport { LookupItem, LookupKey } from '../lookup.models';\r\nimport { LookupPopupComponent } from '../lookup-popup/lookup-popup.component';\r\n\r\n@Component({\r\n selector: 'lookup-edit, app-lookup-edit',\r\n standalone: true,\r\n imports: [CommonModule, DxButtonModule, DxTextBoxModule, DxValidatorModule, LookupPopupComponent, NavigatorLocalizePipe],\r\n templateUrl: './lookup-edit.component.html',\r\n styleUrl: './lookup-edit.component.scss',\r\n})\r\nexport class LookupEditComponent implements OnChanges, AfterViewInit {\r\n @Input({ required: true }) lookupId: Guid | string | number | null = null;\r\n @Input() parameters?: Readonly<Record<string, unknown>>;\r\n @Input() selectParameters?: Readonly<Record<string, unknown>> | null = null;\r\n @Input() selectParametersCallback?: () => Record<string, unknown>;\r\n @Input() lookupParameterSource: string | number | null = null;\r\n @Input() lookupParameters: string | null = null;\r\n @Input() caption = '';\r\n @Input() fieldName = '';\r\n @Input() gridId = '';\r\n @Input() name = '';\r\n @Input() valueType: unknown;\r\n @Input() width: number | string = 260;\r\n @Input() placeholder = '';\r\n @Input() idValue: LookupKey = null;\r\n @Input() readOnly = false;\r\n @Input() allowManualInput = true;\r\n @Input() required = false;\r\n @Input() languageAware = false;\r\n @Input() editorWidth: number | string = 160;\r\n @Output() idValueChange = new EventEmitter<LookupKey>();\r\n /** Fired when an item is picked from the popup: the id plus the full row. */\r\n @Output() resultSelected = new EventEmitter<LookupItem>();\r\n @Output() labelChange = new EventEmitter<string>();\r\n @Output() lookupError = new EventEmitter<unknown>();\r\n\r\n value: any = '';\r\n label = '';\r\n loading = false;\r\n selectedRowData: any = null;\r\n /** Navigation actions of the sys_lookup metadata (optional: needs LOOKUP_GRID_PROVIDER). */\r\n navigationActions: any[] = [];\r\n /** Set while a resolution this component started is pending, so the echoed [idValue] isn't resolved twice. */\r\n triggerFlag = false;\r\n private textFieldNameAr: string | null = null;\r\n private textFieldNameEn: string | null = null;\r\n private readonly adapter = inject(FORM_NAVIGATOR_ADAPTER, { optional: true });\r\n private readonly gridProvider = inject(LOOKUP_GRID_PROVIDER, { optional: true });\r\n private readonly hostConfig = inject(REUSABLE_COMPONENTS_CONFIG, { optional: true });\r\n private readonly cdr = inject(ChangeDetectorRef);\r\n validationMessage: string | null = null;\r\n private requestVersion = 0;\r\n\r\n /**\r\n * MUST be a stable class field, never an inline object in the template.\r\n * An inline `[options]=\"{ ..., onClick: openPopup.bind(this) }\"` creates a\r\n * new object (and a new onClick reference) on every change-detection cycle;\r\n * DevExtreme then re-renders the action button each cycle, so the DOM node\r\n * under the pointer is replaced between pointerdown and pointerup and\r\n * dxclick never fires — the search button looks enabled but is dead.\r\n */\r\n searchButtonOptions: Record<string, unknown> = {\r\n icon: 'search',\r\n stylingMode: 'text',\r\n disabled: false,\r\n onClick: () => this.openPopup(),\r\n };\r\n\r\n /** «Open in a new tab» button shown after the label when the lookup declares a navigation action. */\r\n openDetailsButton: Record<string, unknown> = {\r\n stylingMode: 'text',\r\n icon: 'export',\r\n hint: 'فتح في تبويب جديد',\r\n visible: false,\r\n onClick: () => this.openLookupNavigation(this.defaultNavigationAction),\r\n };\r\n\r\n get defaultNavigationAction(): any | null {\r\n if (!this.navigationActions?.length) return null;\r\n return (\r\n this.navigationActions.find(\r\n (a) => a.clickable_Field_Name === 'name_ar' || a.clickable_Field_Name === 'name_en',\r\n ) ?? this.navigationActions[0]\r\n );\r\n }\r\n\r\n private syncOpenButton(): void {\r\n const visible = !!this.defaultNavigationAction && !!this.idValue;\r\n this.openDetailsButton = { ...this.openDetailsButton, visible };\r\n }\r\n\r\n private translate(key: string, fallback: string): string {\r\n return this.hostConfig?.translate?.(key, fallback) ?? this.adapter?.translate(key, fallback) ?? fallback;\r\n }\r\n\r\n private get uiIsArabic(): boolean {\r\n return this.hostConfig?.isArabic?.() ?? this.adapter?.isArabic?.() ?? true;\r\n }\r\n\r\n validateRequired = (): boolean =>\r\n this.idValue !== null && this.idValue !== undefined && this.idValue !== '';\r\n\r\n get requiredMessage(): string {\r\n return this.translate('ui.lookup-edit.1', 'هذا الحقل مطلوب');\r\n }\r\n\r\n @ViewChild(LookupPopupComponent)\r\n lookupPopupComponent!: LookupPopupComponent;\r\n\r\n @ViewChild('valueTextBox') valueTextBox?: {\r\n instance?: {\r\n element(): HTMLElement;\r\n focus(): void;\r\n option(name: string, value: unknown): void;\r\n };\r\n };\r\n\r\n get edtLookupLabel(): string {\r\n return this.label;\r\n }\r\n\r\n /** Read the report label without changing the selected ID or editor text. */\r\n getReportDisplayText(culture: string): string {\r\n const field = culture.toLowerCase().startsWith('ar') ? this.textFieldNameAr : this.textFieldNameEn;\r\n const row = this.selectedRowData;\r\n const normalize = (v: string) => v.replace(/_/g, '').toLowerCase();\r\n const key = row && field ? Object.keys(row).find((k) => normalize(k) === normalize(field)) : undefined;\r\n const text = key ? row[key] : null;\r\n return text != null && String(text).trim() ? String(text) : this.label || String(this.value ?? '');\r\n }\r\n\r\n /**\r\n * Programmatic read-only switch. `ngOnChanges` only fires for template bindings, so a\r\n * host that flips `readOnly` on the instance directly must go through here to keep the\r\n * search button in step with the editor.\r\n */\r\n setReadOnly(value: boolean): void {\r\n if (this.readOnly === value) return;\r\n this.readOnly = value;\r\n this.searchButtonOptions = { ...this.searchButtonOptions, disabled: value };\r\n this.cdr.detectChanges();\r\n }\r\n\r\n set edtLookupLabel(value: string) {\r\n this.label = value ?? '';\r\n }\r\n\r\n constructor(@Inject(LOOKUP_DATA_PROVIDER) private readonly provider: LookupDataProvider) {}\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['readOnly']) {\r\n // New reference only when readOnly actually changes (never per CD cycle).\r\n this.searchButtonOptions = {\r\n ...this.searchButtonOptions,\r\n disabled: this.readOnly,\r\n };\r\n }\r\n\r\n if (changes['lookupId'] && this.lookupId) {\r\n void this.loadNavigationActions();\r\n }\r\n\r\n if (changes['lookupId'] || changes['parameters']) {\r\n void this.resolve(this.idValue, false);\r\n } else if (!this.triggerFlag && changes['idValue']) {\r\n const previous = changes['idValue'].previousValue;\r\n const current = changes['idValue'].currentValue;\r\n const isEmpty = (v: unknown) => v === null || v === undefined || v === '';\r\n // Skip when nothing really changed; the echo of a value this component emitted is\r\n // skipped by triggerFlag. The parent supplied a stored value: resolve it for display\r\n // without echoing it back as if the user had changed it.\r\n if (!(isEmpty(previous) && isEmpty(current)) && previous !== current) {\r\n void this.resolve(current, false);\r\n }\r\n }\r\n\r\n this.triggerFlag = false;\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n void this.loadNavigationActions();\r\n }\r\n\r\n private async loadNavigationActions(): Promise<void> {\r\n if (!this.lookupId || !this.gridProvider) return;\r\n try {\r\n const lookup: any = await firstValueFrom(this.gridProvider.getSysLookup(this.lookupId));\r\n this.navigationActions = lookup?.navigationActions ?? [];\r\n this.textFieldNameAr = lookup?.text_Field_Name_Ar ?? null;\r\n this.textFieldNameEn = lookup?.text_Field_Name_En ?? null;\r\n this.syncOpenButton();\r\n this.cdr.detectChanges();\r\n } catch {\r\n // navigation metadata is optional; fail silently\r\n }\r\n }\r\n\r\n openLookupNavigation(action: any | null): void {\r\n if (!action?.url_Template) return;\r\n const rowData = this.selectedRowData;\r\n const toCamel = (s: string) => this.gridProvider?.toCamelCase(s) ?? s;\r\n const keyField = toCamel(action.key_Field_Name);\r\n const fallbackKeyValue = rowData?.[keyField] ?? this.idValue;\r\n\r\n const url = String(action.url_Template).replace(/\\{(\\w+)\\}/g, (match: string, field: string) => {\r\n if (field === 'key') {\r\n return fallbackKeyValue != null ? encodeURIComponent(String(fallbackKeyValue)) : match;\r\n }\r\n const value = rowData?.[toCamel(field)] ?? rowData?.[field];\r\n return value != null ? encodeURIComponent(String(value)) : match;\r\n });\r\n\r\n if (action.open_Mode === 'sameTab') {\r\n window.location.href = url;\r\n return;\r\n }\r\n window.open(url, '_blank', 'noopener,noreferrer');\r\n }\r\n\r\n /**\r\n * Opens the full lookup popup (LookupDynamicGridComponent inside):\r\n * search panel, filter row, metadata-driven columns/widths, paging and\r\n * focused-value navigation — same experience as the original component.\r\n */\r\n openPopup(): void {\r\n if (this.readOnly || this.lookupId == null || this.lookupId === '') return;\r\n if (this.lookupPopupComponent) this.lookupPopupComponent.languageAware = this.languageAware;\r\n this.lookupPopupComponent?.openLookupPopup(\r\n this.lookupId as Guid,\r\n this.handlePopupResult.bind(this),\r\n this.lookupParameterSource,\r\n this.lookupParameters,\r\n this.effectiveSelectParametersCallback,\r\n this.idValue,\r\n );\r\n }\r\n\r\n /** Merges the three parameter inputs into the single callback the grid expects. */\r\n private get effectiveSelectParametersCallback():\r\n | (() => Record<string, any>)\r\n | undefined {\r\n if (this.selectParametersCallback) {\r\n return this.selectParametersCallback as () => Record<string, any>;\r\n }\r\n const staticParams = this.selectParameters ?? this.parameters;\r\n return staticParams ? () => ({ ...staticParams }) : undefined;\r\n }\r\n\r\n private async handlePopupResult(result: {\r\n selectedValue?: LookupKey;\r\n selectedRowData?: Record<string, unknown> | null;\r\n }): Promise<void> {\r\n const selectedValue = result?.selectedValue ?? null;\r\n const rowData = result?.selectedRowData ?? null;\r\n // نفضّل row.id (GUID) على selectedValue (قد يكون code من returnField): resolving by the\r\n // return field alone returns the first row sharing a non-unique code.\r\n const id = (rowData as any)?.id ?? selectedValue;\r\n await this.resolve(id, true, true);\r\n\r\n if (selectedValue != null && selectedValue !== '') {\r\n this.selectedRowData = rowData;\r\n this.resultSelected.emit({\r\n id,\r\n value: this.value,\r\n label: this.label,\r\n rowData: rowData ?? {},\r\n });\r\n }\r\n }\r\n\r\n onValueChanged(event: { event?: Event; value?: LookupKey; component?: any }): void {\r\n if (!event.event || this.readOnly) return;\r\n if (!this.allowManualInput) {\r\n event.component?.option?.('value', this.value ?? '');\r\n return;\r\n }\r\n void this.resolve(event.value ?? null, true, true);\r\n }\r\n\r\n handleLookupTrigger(value?: LookupKey, emitValueChange = true, userTriggered = false): void {\r\n void this.resolve(value ?? null, emitValueChange, userTriggered);\r\n }\r\n\r\n markInvalid(message = this.requiredMessage): void {\r\n this.validationMessage = message;\r\n this.valueTextBox?.instance?.option('isValid', false);\r\n this.valueTextBox?.instance?.option('validationError', { message });\r\n }\r\n\r\n clearInvalid(): void {\r\n this.validationMessage = null;\r\n this.valueTextBox?.instance?.option('isValid', true);\r\n this.valueTextBox?.instance?.option('validationError', null);\r\n }\r\n\r\n focus(): void {\r\n const element = this.valueTextBox?.instance?.element();\r\n element?.scrollIntoView({ behavior: 'smooth', block: 'center' });\r\n this.valueTextBox?.instance?.focus();\r\n }\r\n\r\n private async resolve(key: LookupKey, emit: boolean, userTriggered = false): Promise<void> {\r\n this.triggerFlag = true;\r\n this.clearInvalid();\r\n const version = ++this.requestVersion;\r\n if (this.lookupId == null || this.lookupId === '' || key === null || key === undefined || key === '') {\r\n this.clear(emit);\r\n return;\r\n }\r\n const complete = this.adapter?.trackLookup?.() ?? null;\r\n this.loading = true;\r\n try {\r\n const item = await this.unwrap(this.provider.resolve(this.context, key));\r\n if (version !== this.requestVersion) return;\r\n item ? this.applyItem(item, emit) : this.handleNotFound(userTriggered);\r\n } catch (error) {\r\n if (version === this.requestVersion) {\r\n this.lookupError.emit(error);\r\n this.handleNotFound(userTriggered);\r\n }\r\n } finally {\r\n if (version === this.requestVersion) this.loading = false;\r\n complete?.();\r\n }\r\n }\r\n\r\n private applyItem(item: LookupItem, emit: boolean): void {\r\n this.idValue = item.id;\r\n this.value = item.value == null ? '' : String(item.value);\r\n this.label = item.label;\r\n this.selectedRowData = item.rowData ?? null;\r\n\r\n // languageAware (opt-in): prefer the lookup's English text field when the UI is English.\r\n if (this.languageAware && !this.uiIsArabic && this.textFieldNameEn && this.selectedRowData) {\r\n const raw = this.textFieldNameEn;\r\n const trueCamel = raw\r\n .replace(/_(.)/g, (_m, c: string) => c.toUpperCase())\r\n .replace(/^(.)/, (_m, c: string) => c.toLowerCase());\r\n for (const key of [raw, this.gridProvider?.toCamelCase(raw) ?? raw, trueCamel]) {\r\n const en = this.selectedRowData[key];\r\n if (en != null && String(en) !== '') {\r\n this.label = String(en);\r\n break;\r\n }\r\n }\r\n }\r\n\r\n this.syncOpenButton();\r\n if (emit) this.idValueChange.emit(item.id);\r\n this.labelChange.emit(this.label);\r\n this.cdr.detectChanges();\r\n }\r\n\r\n private handleNotFound(userTriggered: boolean): void {\r\n if (userTriggered) {\r\n // The user typed a code or picked from the popup and it wasn't found: clear and tell them.\r\n this.idValue = null;\r\n this.value = '';\r\n this.label = '';\r\n this.selectedRowData = null;\r\n this.syncOpenButton();\r\n this.idValueChange.emit(null);\r\n if (this.adapter) this.adapter.notify('error', this.adapter.messages.NOT_FOUND);\r\n } else {\r\n // A failed *label* lookup during a programmatic resolve must never wipe the *stored*\r\n // value: keep idValue and do NOT emit, otherwise the host form writes null into its\r\n // data and becomes dirty without any user edit. Only the display is cleared.\r\n this.label = '';\r\n this.value = '';\r\n this.selectedRowData = null;\r\n this.syncOpenButton();\r\n }\r\n this.cdr.detectChanges();\r\n }\r\n\r\n private clear(emit: boolean): void {\r\n this.idValue = null;\r\n this.value = '';\r\n this.label = '';\r\n this.selectedRowData = null;\r\n this.syncOpenButton();\r\n if (emit) this.idValueChange.emit(null);\r\n this.labelChange.emit('');\r\n this.cdr.detectChanges();\r\n }\r\n\r\n private get context() {\r\n return {\r\n lookupId: this.lookupId,\r\n parameters:\r\n this.selectParametersCallback?.() ??\r\n this.selectParameters ??\r\n this.parameters,\r\n lookupParameterSource: this.lookupParameterSource,\r\n lookupParameters: this.lookupParameters,\r\n };\r\n }\r\n\r\n private unwrap<T>(value: LookupAsync<T>): Promise<T> {\r\n return isObservable(value) ? firstValueFrom(value) : Promise.resolve(value);\r\n }\r\n}\r\n","<label *ngIf=\"caption && caption.trim()\" class=\"lookup-edit__caption\">{{ caption }}</label>\r\n<div style=\"display: flex; width: 100%\">\r\n <dx-text-box\r\n #valueTextBox\r\n [(value)]=\"value\"\r\n [inputAttr]=\"{ 'aria-label': 'Input Field' }\"\r\n mode=\"text\"\r\n [showClearButton]=\"false\"\r\n [hoverStateEnabled]=\"false\"\r\n [focusStateEnabled]=\"false\"\r\n [width]=\"editorWidth\"\r\n [readOnly]=\"readOnly\"\r\n [placeholder]=\"placeholder\"\r\n [valueChangeEvent]=\"'change'\"\r\n (onValueChanged)=\"onValueChanged($event)\"\r\n >\r\n <dx-validator [validationGroup]=\"'lookupEditValidation'\">\r\n <dxi-validation-rule\r\n *ngIf=\"required\"\r\n type=\"custom\"\r\n [validationCallback]=\"validateRequired\"\r\n [message]=\"requiredMessage\"\r\n ></dxi-validation-rule>\r\n </dx-validator>\r\n\r\n <dxi-button\r\n name=\"btnShowLookup\"\r\n location=\"after\"\r\n [options]=\"searchButtonOptions\"\r\n ></dxi-button>\r\n </dx-text-box>\r\n\r\n <dx-text-box\r\n width=\"100%\"\r\n [(value)]=\"edtLookupLabel\"\r\n [stylingMode]=\"'filled'\"\r\n [readOnly]=\"true\"\r\n [class]=\"'lookup-label'\"\r\n >\r\n <dxi-button\r\n name=\"btnOpenDetails\"\r\n location=\"after\"\r\n [options]=\"openDetailsButton\"\r\n ></dxi-button>\r\n </dx-text-box>\r\n</div>\r\n\r\n<div *ngIf=\"validationMessage\" class=\"dx-invalid-message-content\">\r\n {{ validationMessage }}\r\n</div>\r\n\r\n<lookup-popup></lookup-popup>\r\n","import Form from 'devextreme/ui/form';\r\nimport Validator from 'devextreme/ui/validator';\r\n/** Subset of the host's QueryConditionTypeEnum used by the range helpers (values must match). */\r\nenum QueryConditionTypeEnum {\r\n NumberBox = 3,\r\n NumberBoxRange = 4,\r\n DateBox = 6,\r\n DateBoxRange = 7,\r\n TimeBox = 8,\r\n TimeBoxRange = 9,\r\n TextBoxRange = 2,\r\n}\r\n\r\n/**\r\n * Shared «من / إلى» (From / To) range validation.\r\n *\r\n * One rule, one message, one way of drawing the error — used by the dynamic query\r\n * screens (dynamic-query / -tab / -accordion) and by the shared filter panel that the\r\n * dynamic grid's search filters render into. Every caller used to carry its own copy of\r\n * «compare the two ends», and the copies had drifted: numbers and dates only, text ranges\r\n * skipped, time ranges compared as full timestamps, a toast instead of an inline error.\r\n *\r\n * The rule: when BOTH ends have a value and «إلى» is before «من», both editors are marked\r\n * invalid with the same message. An empty end means an open range — never an error.\r\n */\r\n\r\nexport type RangeKind = 'number' | 'date' | 'datetime' | 'time' | 'text';\r\n\r\n/** Localization key + default of the message (already seeded for the query screens). */\r\nexport const RANGE_MESSAGE_KEY = 'loc.dynamicQueryTab.2';\r\nexport const RANGE_MESSAGE_DEFAULT =\r\n 'يجب أن تكون قيمة «إلى» أكبر من قيمة «من» أو مساوية لها.';\r\n\r\n/** Marker on the validation error, so clearing a range error never wipes a «required» one. */\r\nconst RANGE_ERROR_FLAG = '__rangeError';\r\n\r\n/**\r\n * Text ranges compare \"naturally\": numeric runs by value, the rest alphabetically — so\r\n * `10 → 5` is reversed while `JV-2 → JV-10` is not. A plain string compare gets both wrong\r\n * (that is why text ranges used to be skipped entirely).\r\n */\r\nconst naturalCollator = new Intl.Collator(undefined, {\r\n numeric: true,\r\n sensitivity: 'base',\r\n});\r\n\r\nexport function isEmptyRangeValue(value: unknown): boolean {\r\n if (value === null || value === undefined) return true;\r\n if (typeof value === 'string') return value.trim() === '';\r\n return false;\r\n}\r\n\r\n/** Maps a query/filter condition type to how its two ends are compared (null = not a range). */\r\nexport function rangeKindOfConditionType(\r\n conditionType: number | null | undefined,\r\n): RangeKind | null {\r\n switch (conditionType) {\r\n case QueryConditionTypeEnum.NumberBoxRange:\r\n return 'number';\r\n case QueryConditionTypeEnum.DateBoxRange:\r\n return 'date';\r\n case QueryConditionTypeEnum.TimeBoxRange:\r\n return 'time';\r\n case QueryConditionTypeEnum.TextBoxRange:\r\n return 'text';\r\n default:\r\n return null;\r\n }\r\n}\r\n\r\n/** Maps a DevExtreme editor (plus its dxDateBox `type`) to a comparison kind. */\r\nexport function rangeKindOfEditor(\r\n editorType: string | null | undefined,\r\n dateType?: string | null,\r\n): RangeKind | null {\r\n switch (editorType) {\r\n case 'dxNumberBox':\r\n return 'number';\r\n case 'dxDateBox':\r\n if (dateType === 'time') return 'time';\r\n if (dateType === 'datetime') return 'datetime';\r\n return 'date';\r\n case 'dxTextBox':\r\n return 'text';\r\n default:\r\n return null;\r\n }\r\n}\r\n\r\n/**\r\n * For a field that is the «from» end of a pair, the name of its «to» partner — the same name\r\n * with the `from` word swapped for `to`, case kept. Covers every convention in the app:\r\n * `from_Date` → `to_Date`, `journal_Date_From` → `journal_Date_To`, `dateFrom` → `dateTo`,\r\n * `fromDate` → `toDate`, `enteredFrom` → `enteredTo`. Null when the name has no `from` word\r\n * (so `fromage` or `toDate` itself return null).\r\n */\r\nexport function rangePartnerFieldName(\r\n fieldName: string | null | undefined,\r\n): string | null {\r\n if (!fieldName) return null;\r\n\r\n // snake_case token: from_Date · journal_Date_From · valid_FROM\r\n const parts = fieldName.split('_');\r\n const i = parts.findIndex((p) => p.toLowerCase() === 'from');\r\n if (i >= 0) {\r\n const token = parts[i];\r\n parts[i] =\r\n token === token.toUpperCase() ? 'TO' : token[0] === 'F' ? 'To' : 'to';\r\n return parts.join('_');\r\n }\r\n\r\n // camelCase: dateFrom · amountFrom (a «From» word at a word boundary)\r\n const camelWord = /([a-z0-9])From(?=[A-Z0-9]|$)/;\r\n if (camelWord.test(fieldName)) {\r\n return fieldName.replace(camelWord, '$1To');\r\n }\r\n // camelCase prefix: fromDate\r\n if (/^from(?=[A-Z0-9])/.test(fieldName)) {\r\n return fieldName.replace(/^from/, 'to');\r\n }\r\n return null;\r\n}\r\n\r\nfunction toDate(value: unknown): Date | null {\r\n if (value instanceof Date) return isNaN(value.getTime()) ? null : value;\r\n if (typeof value === 'number') return new Date(value);\r\n if (typeof value !== 'string') return null;\r\n\r\n const s = value.trim();\r\n // 'yyyy-MM-dd' is parsed by the JS engine as UTC midnight; read it as a local date so it\r\n // compares on the same calendar day as a Date coming straight from the editor.\r\n const dateOnly = /^(\\d{4})-(\\d{2})-(\\d{2})$/.exec(s);\r\n if (dateOnly) {\r\n return new Date(+dateOnly[1], +dateOnly[2] - 1, +dateOnly[3]);\r\n }\r\n const timeOnly = /^(\\d{1,2}):(\\d{2})(?::(\\d{2}))?$/.exec(s);\r\n if (timeOnly) {\r\n return new Date(2000, 0, 1, +timeOnly[1], +timeOnly[2], +(timeOnly[3] ?? 0));\r\n }\r\n const d = new Date(s);\r\n return isNaN(d.getTime()) ? null : d;\r\n}\r\n\r\nfunction toComparable(value: unknown, kind: RangeKind): number | string | null {\r\n if (isEmptyRangeValue(value)) return null;\r\n\r\n switch (kind) {\r\n case 'number': {\r\n const n = typeof value === 'number' ? value : Number(value);\r\n return Number.isFinite(n) ? n : null;\r\n }\r\n case 'date': {\r\n // Calendar day only: a time part must not make «20/08 → 20/08» look reversed.\r\n const d = toDate(value);\r\n return d ? d.getFullYear() * 10000 + (d.getMonth() + 1) * 100 + d.getDate() : null;\r\n }\r\n case 'datetime': {\r\n const d = toDate(value);\r\n return d ? d.getTime() : null;\r\n }\r\n case 'time': {\r\n // Time of day only: the date part a dxDateBox carries is meaningless here.\r\n const d = toDate(value);\r\n return d ? d.getHours() * 3600 + d.getMinutes() * 60 + d.getSeconds() : null;\r\n }\r\n case 'text':\r\n return String(value).trim();\r\n }\r\n}\r\n\r\n/**\r\n * Compares the two ends: < 0 ordered, 0 equal, > 0 reversed.\r\n * Returns null when either end is empty or not comparable — i.e. \"nothing to validate\".\r\n */\r\nexport function compareRangeValues(\r\n from: unknown,\r\n to: unknown,\r\n kind: RangeKind,\r\n): number | null {\r\n const a = toComparable(from, kind);\r\n const b = toComparable(to, kind);\r\n if (a === null || b === null) return null;\r\n\r\n if (typeof a === 'string' || typeof b === 'string') {\r\n return naturalCollator.compare(String(a), String(b));\r\n }\r\n return a - b;\r\n}\r\n\r\n/** True only when both ends have a value and «إلى» comes before «من». */\r\nexport function isRangeReversed(from: unknown, to: unknown, kind: RangeKind): boolean {\r\n return (compareRangeValues(from, to, kind) ?? 0) > 0;\r\n}\r\n\r\n/** «<caption>: <message>» — the caption tells the user WHICH range is wrong. */\r\nexport function buildRangeMessage(\r\n caption: string | null | undefined,\r\n message: string = RANGE_MESSAGE_DEFAULT,\r\n): string {\r\n const c = (caption ?? '').trim();\r\n return c ? `${c}: ${message}` : message;\r\n}\r\n\r\nfunction hasOnlyRangeErrors(instance: any): boolean {\r\n const errors = instance?.option?.('validationErrors');\r\n if (!Array.isArray(errors) || errors.length === 0) {\r\n // No explicit error list: only clear if the editor is actually flagged by us.\r\n return instance?.option?.('isValid') === false && !!instance?.[RANGE_ERROR_FLAG];\r\n }\r\n return errors.every((e: any) => e?.[RANGE_ERROR_FLAG] === true);\r\n}\r\n\r\n/**\r\n * Draws (or clears) the range error on DevExtreme editor instances.\r\n *\r\n * - `validationMessageMode: 'always'`: the editors are usually flagged without focus (from\r\n * «عرض» or from the partner's change). With the default 'auto' DevExtreme only renders the\r\n * message while the editor is focused, leaving a red icon with no text.\r\n * - Clearing only removes OUR error — an editor already invalid for another reason (e.g. a\r\n * «required» rule) keeps that error.\r\n */\r\nexport function setRangeError(instances: any[], message: string | null): void {\r\n for (const instance of instances) {\r\n if (!instance?.option) continue;\r\n\r\n if (message) {\r\n instance[RANGE_ERROR_FLAG] = true;\r\n instance.option({\r\n isValid: false,\r\n validationStatus: 'invalid',\r\n validationErrors: [{ message, [RANGE_ERROR_FLAG]: true }],\r\n validationMessageMode: 'always',\r\n });\r\n continue;\r\n }\r\n\r\n if (!hasOnlyRangeErrors(instance)) continue;\r\n instance[RANGE_ERROR_FLAG] = false;\r\n instance.option({\r\n isValid: true,\r\n validationStatus: 'valid',\r\n validationErrors: null,\r\n validationMessageMode: 'auto',\r\n });\r\n }\r\n}\r\n\r\n/**\r\n * `validationCallback` for the «إلى» column/item of a DataGrid edit form or a dx-form.\r\n * Put it on the «إلى» end as a `custom` rule with `[reevaluate]=\"true\"` (it compares with\r\n * another field, so a cached result would survive a change of «من»):\r\n *\r\n * validateValidTo = rangeEndValidator('valid_From', 'date');\r\n * <dxi-validation-rule type=\"custom\" [validationCallback]=\"validateValidTo\"\r\n * [reevaluate]=\"true\" [message]=\"'loc.dynamicQueryTab.2' | localize: '…'\">\r\n *\r\n * «من» is read from the row being edited (`e.data`, what DataGrid passes); a stand-alone\r\n * dx-form passes no row, so give `getFrom` instead.\r\n * `allowEqual: false` for ranges whose end must be strictly after the start.\r\n */\r\nexport function rangeEndValidator(\r\n fromField: string,\r\n kind: RangeKind,\r\n options?: { allowEqual?: boolean; getFrom?: (e: any) => unknown },\r\n): (e: any) => boolean {\r\n const allowEqual = options?.allowEqual ?? true;\r\n return (e: any): boolean => {\r\n const from = options?.getFrom ? options.getFrom(e) : e?.data?.[fromField];\r\n const cmp = compareRangeValues(from, e?.value, kind);\r\n if (cmp === null) return true;\r\n return allowEqual ? cmp <= 0 : cmp < 0;\r\n };\r\n}\r\n\r\n/**\r\n * Re-validates the other end of a range when one end changes inside a DataGrid edit form.\r\n *\r\n * Why it is needed: the rule lives on «إلى» but depends on «من». DevExtreme re-runs a rule\r\n * only when ITS editor is validated, so editing «من» leaves the old verdict on «إلى» — the\r\n * error stays after the range is fixed, or never appears when «من» is moved past «إلى».\r\n * `reevaluate` does not help: it only stops the cache when validation runs, it does not run it.\r\n *\r\n * Call from the grid's `onEditorPreparing`. It wraps the editor's `onValueChanged` (keeping\r\n * the grid's own handler) and, after the change is applied, validates the counterparts in\r\n * the same form: the name-derived partners (`x_From` ⇄ `x_To`, `min_x` ⇄ `max_x`, …) plus\r\n * any `extraTargets`. A counterpart is validated only when it has a value or is currently\r\n * invalid, so an untouched required «إلى» is not flagged early. Editors outside a dx-form\r\n * (row / cell / batch modes) are left to the grid's own save-time validation.\r\n */\r\nexport function hookRangeRevalidation(e: any, extraTargets: string[] = []): void {\r\n if (e?.parentType !== 'dataRow' || !e.dataField || !e.editorOptions) return;\r\n const targets = [\r\n ...new Set([...rangeCounterpartFieldNames(e.dataField), ...extraTargets]),\r\n ].filter((t) => t !== e.dataField);\r\n if (!targets.length) return;\r\n\r\n const original = e.editorOptions.onValueChanged;\r\n e.editorOptions.onValueChanged = (args: any) => {\r\n original?.(args);\r\n const host: Element | null = args?.element ?? e.editorElement ?? null;\r\n setTimeout(() => revalidateInEditForm(host, targets), 0);\r\n };\r\n}\r\n\r\nfunction revalidateInEditForm(host: Element | null, targets: string[]): void {\r\n const formEl = (host as any)?.closest?.('.dx-form') as Element | null;\r\n if (!formEl) return;\r\n for (const field of targets) {\r\n const validator = findFieldValidator(formEl, field);\r\n if (!validator) continue;\r\n const el: Element | undefined = validator.element?.();\r\n const value = validator.option('adapter')?.getValue?.();\r\n const invalid = el?.classList?.contains('dx-invalid');\r\n if (isEmptyRangeValue(value) && !invalid) continue;\r\n validator.validate();\r\n }\r\n}\r\n\r\n/**\r\n * The validator bound to `field` inside a form. A DataGrid edit form draws its editors itself,\r\n * so `form.getEditor()` knows none of them — its validators carry the column instead\r\n * (`dataGetter().column.dataField`). A stand-alone dx-form registers them, so fall back to it.\r\n */\r\nfunction findFieldValidator(formEl: Element, field: string): any {\r\n for (const el of Array.from(formEl.querySelectorAll('.dx-validator'))) {\r\n const v: any = Validator.getInstance(el);\r\n let dataField: string | undefined;\r\n try {\r\n dataField = v?.option?.('dataGetter')?.()?.column?.dataField;\r\n } catch {\r\n dataField = undefined;\r\n }\r\n if (dataField === field) return v;\r\n }\r\n const editor = (Form.getInstance(formEl) as any)?.getEditor?.(field);\r\n return editor ? Validator.getInstance(editor.element()) : null;\r\n}\r\n\r\n// ─── Dynamic forms / grids (validation_callback) ──────────────────────────────────────────\r\n\r\n/**\r\n * The record a `validation_callback` can see. The engines call callbacks with three host\r\n * shapes — a dxForm instance (live rule), the grid component (edit form) and a flat\r\n * `{ formData }` (validateBeforeSave, which is the path that actually blocks the save). A\r\n * checker that reads only one shape is blind on the others; this reads all three, then falls\r\n * back to the edited row (`e.data`) that DataGrid passes.\r\n */\r\nexport function readRuleFormData(e: any, host: any): Record<string, any> {\r\n const live =\r\n host?.getForm?.()?.option?.('formData') ??\r\n host?.option?.('formData') ??\r\n host?.formData ??\r\n null;\r\n return { ...(e?.data ?? {}), ...(live ?? {}) };\r\n}\r\n\r\nfunction ownRuleValue(\r\n e: any,\r\n data: Record<string, any>,\r\n ownField?: string,\r\n): unknown {\r\n if (e && Object.prototype.hasOwnProperty.call(e, 'value')) return e.value;\r\n return ownField ? data[ownField] : undefined;\r\n}\r\n\r\n/**\r\n * The shared checker behind every «إلى / الحد الأعلى / النهاية» rule of the dynamic screens.\r\n * Put on the END field: valid when either end is empty, or when end ≥ start\r\n * (`allowEqual: false` → end > start). Comparison by kind — calendar day for dates (so\r\n * `'2026-08-22'` and `'2026-08-22T00:00:00'` are the same day), numbers numerically, text\r\n * naturally.\r\n */\r\nexport function checkRangeEnd(\r\n e: any,\r\n host: any,\r\n startField: string,\r\n kind: RangeKind,\r\n options?: { allowEqual?: boolean; ownField?: string },\r\n): boolean {\r\n const data = readRuleFormData(e, host);\r\n const cmp = compareRangeValues(\r\n data[startField],\r\n ownRuleValue(e, data, options?.ownField),\r\n kind,\r\n );\r\n if (cmp === null) return true;\r\n return (options?.allowEqual ?? true) ? cmp <= 0 : cmp < 0;\r\n}\r\n\r\n/** Same rule placed on the START field (e.g. «الحد الأدنى» must not exceed «الحد الأعلى»). */\r\nexport function checkRangeStart(\r\n e: any,\r\n host: any,\r\n endField: string,\r\n kind: RangeKind,\r\n options?: { allowEqual?: boolean; ownField?: string },\r\n): boolean {\r\n const data = readRuleFormData(e, host);\r\n const cmp = compareRangeValues(\r\n ownRuleValue(e, data, options?.ownField),\r\n data[endField],\r\n kind,\r\n );\r\n if (cmp === null) return true;\r\n return (options?.allowEqual ?? true) ? cmp <= 0 : cmp < 0;\r\n}\r\n\r\n/**\r\n * Built-in metadata rule — no function file needed. In `validation_callback` of the END field:\r\n *\r\n * range:<startField>[:<kind>][:strict] e.g. range:opening_Time:time\r\n *\r\n * `kind` = number | date | datetime | time | text (default: inferred from the values);\r\n * `strict` = the end must be strictly after the start.\r\n */\r\nexport const RANGE_RULE_PREFIX = 'range:';\r\n\r\nexport interface RangeRuleSpec {\r\n startField: string;\r\n kind: RangeKind | null;\r\n strict: boolean;\r\n}\r\n\r\nconst RANGE_KINDS: RangeKind[] = ['number', 'date', 'datetime', 'time', 'text'];\r\n\r\nexport function parseRangeRule(\r\n name: string | null | undefined,\r\n): RangeRuleSpec | null {\r\n const s = (name ?? '').trim();\r\n if (!s.toLowerCase().startsWith(RANGE_RULE_PREFIX)) return null;\r\n const [startField, ...opts] = s\r\n .slice(RANGE_RULE_PREFIX.length)\r\n .split(':')\r\n .map((x) => x.trim());\r\n if (!startField) return null;\r\n const kind =\r\n (opts.find((o) => RANGE_KINDS.includes(o as RangeKind)) as RangeKind) ??\r\n null;\r\n return { startField, kind, strict: opts.includes('strict') };\r\n}\r\n\r\nfunction inferKind(a: unknown, b: unknown): RangeKind {\r\n const isNum = (v: unknown) => typeof v === 'number';\r\n if (isNum(a) || isNum(b)) return 'number';\r\n const isDateLike = (v: unknown) =>\r\n v instanceof Date || (typeof v === 'string' && /^\\d{4}-\\d{2}-\\d{2}/.test(v));\r\n if (isDateLike(a) || isDateLike(b)) return 'date';\r\n return 'text';\r\n}\r\n\r\n/** The validation handler for a `range:` rule, in the engines' `(e, host) => boolean` shape. */\r\nexport function createRangeRuleHandler(\r\n name: string | null | undefined,\r\n): ((e: any, host: any) => boolean) | null {\r\n const spec = parseRangeRule(name);\r\n if (!spec) return null;\r\n return (e: any, host: any) => {\r\n const data = readRuleFormData(e, host);\r\n const start = data[spec.startField];\r\n const end = ownRuleValue(e, data);\r\n const kind = spec.kind ?? inferKind(start, end);\r\n return checkRangeEnd(e, host, spec.startField, kind, {\r\n allowEqual: !spec.strict,\r\n });\r\n };\r\n}\r\n\r\n/**\r\n * Word pairs that name the two ends of a range in field names:\r\n * from/to · start/end · min/max · opening/closing · in/out (check_In → check_Out).\r\n */\r\nconst RANGE_WORD_PAIRS: [string, string][] = [\r\n ['from', 'to'],\r\n ['start', 'end'],\r\n ['min', 'max'],\r\n ['opening', 'closing'],\r\n ['in', 'out'],\r\n];\r\n\r\nfunction swapWord(fieldName: string, a: string, b: string): string | null {\r\n const parts = fieldName.split('_');\r\n const i = parts.findIndex((p) => p.toLowerCase() === a);\r\n if (i < 0) return null;\r\n const t = parts[i];\r\n parts[i] =\r\n t === t.toUpperCase()\r\n ? b.toUpperCase()\r\n : t[0] === t[0].toUpperCase()\r\n ? b[0].toUpperCase() + b.slice(1)\r\n : b;\r\n return parts.join('_');\r\n}\r\n\r\n/**\r\n * The other end of a range field, in either direction (`effective_From` ⇄ `effective_To`,\r\n * `min_Salary` ⇄ `max_Salary`, `check_In` ⇄ `check_Out`). Used to re-check the partner when\r\n * one end changes — without it a rule on «إلى» keeps its old result after «من» is edited.\r\n */\r\nexport function rangeCounterpartFieldNames(\r\n fieldName: string | null | undefined,\r\n): string[] {\r\n if (!fieldName) return [];\r\n const out: string[] = [];\r\n for (const [a, b] of RANGE_WORD_PAIRS) {\r\n const fwd = swapWord(fieldName, a, b);\r\n if (fwd) out.push(fwd);\r\n const back = swapWord(fieldName, b, a);\r\n if (back) out.push(back);\r\n }\r\n return out.filter((n) => n !== fieldName);\r\n}\r\n\r\n// ─── Dynamic query screens: two single conditions acting as one range ─────────────────────\r\n\r\n/** Comparison kind of a SINGLE (non-range) condition type that can be one end of a pair. */\r\nexport function rangeKindOfSingleConditionType(\r\n conditionType: number | null | undefined,\r\n): RangeKind | null {\r\n switch (conditionType) {\r\n case QueryConditionTypeEnum.NumberBox:\r\n return 'number';\r\n case QueryConditionTypeEnum.DateBox:\r\n return 'date';\r\n case QueryConditionTypeEnum.TimeBox:\r\n return 'time';\r\n default:\r\n return null;\r\n }\r\n}\r\n\r\nexport interface SingleConditionRangePair<T> {\r\n from: T;\r\n to: T;\r\n kind: RangeKind;\r\n}\r\n\r\n/**\r\n * Pairs of single conditions that form a range by name: `from_date` + `to_date`,\r\n * `date_From` + `date_To`, `fromDate` + `toDate` (see {@link rangePartnerFieldName}), both of\r\n * the same single type (DateBox / NumberBox / TimeBox).\r\n *\r\n * Why: a query whose parameters are two separate columns (QryTreasuryBalances,\r\n * QryTreasuryStatement — the SQL filters `from_date = …` and `to_date = …`) cannot use a\r\n * DateBoxRange, so the range guard keyed on `_From` / `_To` never saw them and a reversed\r\n * period ran silently, returning nothing.\r\n */\r\nexport function findSingleConditionRangePairs<\r\n T extends { field_Name?: string | null; condition_Type?: number | null },\r\n>(conditions: T[] | null | undefined): SingleConditionRangePair<T>[] {\r\n const list = (conditions ?? []).filter(\r\n (c) => !!c?.field_Name && !!rangeKindOfSingleConditionType(c.condition_Type),\r\n );\r\n const pairs: SingleConditionRangePair<T>[] = [];\r\n for (const from of list) {\r\n const toName = rangePartnerFieldName(from.field_Name);\r\n if (!toName) continue;\r\n const to = list.find(\r\n (c) => c.field_Name === toName && c.condition_Type === from.condition_Type,\r\n );\r\n if (to) {\r\n pairs.push({ from, to, kind: rangeKindOfSingleConditionType(from.condition_Type)! });\r\n }\r\n }\r\n return pairs;\r\n}\r\n\r\nexport interface RangePairArgs {\r\n /** DevExtreme widget instances (the `.instance` of the Angular wrapper). */\r\n from: any;\r\n to: any;\r\n kind: RangeKind;\r\n caption?: string | null;\r\n /** Localized base message; defaults to {@link RANGE_MESSAGE_DEFAULT}. */\r\n message?: string;\r\n /** Explicit values (e.g. the value just typed); otherwise read from the editors. */\r\n fromValue?: unknown;\r\n toValue?: unknown;\r\n}\r\n\r\n/**\r\n * Validates one From/To pair and draws the result on both editors.\r\n * Returns true when the pair is valid (ordered, or at least one end empty).\r\n */\r\nexport function validateRangePair(args: RangePairArgs): boolean {\r\n const fromValue =\r\n 'fromValue' in args ? args.fromValue : args.from?.option?.('value');\r\n const toValue = 'toValue' in args ? args.toValue : args.to?.option?.('value');\r\n\r\n const reversed = isRangeReversed(fromValue, toValue, args.kind);\r\n setRangeError(\r\n [args.from, args.to],\r\n reversed ? buildRangeMessage(args.caption, args.message) : null,\r\n );\r\n return !reversed;\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport {\r\n Component,\r\n EventEmitter,\r\n Input,\r\n OnChanges,\r\n Output,\r\n SimpleChanges,\r\n} from '@angular/core';\r\nimport {\r\n DxAutocompleteModule,\r\n DxButtonModule,\r\n DxCheckBoxModule,\r\n DxDateBoxModule,\r\n DxDateRangeBoxModule,\r\n DxFormModule,\r\n DxNumberBoxModule,\r\n DxSelectBoxModule,\r\n DxSwitchModule,\r\n DxTagBoxModule,\r\n DxTemplateModule,\r\n DxTextBoxModule,\r\n} from 'devextreme-angular';\r\n\r\nimport { AppBorderWrapperComponent } from '../app-border-wrapper/app-border-wrapper.component';\r\nimport { GridLookupComponent } from '../grid-lookup/grid-lookup.component';\r\nimport { LookupEditComponent } from '../lookup-edit/lookup-edit.component';\r\nimport {\r\n RANGE_MESSAGE_DEFAULT,\r\n RangeKind,\r\n rangeKindOfEditor,\r\n rangePartnerFieldName,\r\n validateRangePair,\r\n} from './range-validation.helper';\r\nimport { NavigatorLocalizePipe } from '../form-navigator/navigator-localize.pipe';\r\n\r\n/**\r\n * Marks a filter item as one end of a «من / إلى» pair. Put it on the item's `editorOptions`\r\n * (both ends share the same `key`); the panel then validates the pair on every change and\r\n * blocks «عرض» while «إلى» is before «من» — with the error drawn under both editors.\r\n */\r\nexport interface FilterRangePair {\r\n key: string;\r\n role: 'from' | 'to';\r\n kind: RangeKind;\r\n /** Caption of the range, prefixed to the message («تاريخ الإصدار: …»). */\r\n caption?: string | null;\r\n}\r\n\r\n/** One applied filter as shown in the count badge and the collapsed-state chips. */\r\nexport interface AppliedFilter {\r\n key: string;\r\n label: string;\r\n /** Empty when the value is an id (GUID) or a boolean — the label alone is shown. */\r\n display: string;\r\n}\r\n\r\n@Component({\r\n selector: 'app-filter-panel',\r\n standalone: true,\r\n imports: [\r\n NavigatorLocalizePipe,\r\n CommonModule,\r\n\r\n // ✅ DevExtreme editors used in templates\r\n DxButtonModule,\r\n DxFormModule,\r\n DxTemplateModule,\r\n DxTextBoxModule,\r\n DxNumberBoxModule,\r\n DxDateBoxModule,\r\n DxDateRangeBoxModule,\r\n DxCheckBoxModule,\r\n DxSwitchModule,\r\n DxSelectBoxModule,\r\n DxAutocompleteModule,\r\n DxTagBoxModule,\r\n\r\n // custom\r\n AppBorderWrapperComponent,\r\n LookupEditComponent,\r\n GridLookupComponent,\r\n ],\r\n templateUrl: './filter-panel.component.html',\r\n styleUrl: './filter-panel.component.scss',\r\n})\r\nexport class FilterPanelComponent implements OnChanges {\r\n @Input() title: string = 'فلاتر البحث';\r\n @Input() validationGroup?: string;\r\n\r\n // لو محتاجه Input بعدين خليه @Input()\r\n headerIcon: string = 'ki-filled ki-filter';\r\n\r\n @Input() applyButtonDisabled: boolean = false;\r\n @Input() applyButtonText: string = 'عرض';\r\n @Input() applyButtonIcon: string = 'search';\r\n /**\r\n * يُظهر «مسح الفلاتر» بعد أول «عرض» حتى لو لم يُملأ أي فلتر (سلوك شاشة قيود اليومية).\r\n * الافتراضي false: الزرّ يظهر فقط حين يكون هناك فلتر مُطبَّق بقيمة، كما كان.\r\n */\r\n @Input() showClearAfterApply = false;\r\n /** رُفع بعد أول «عرض». */\r\n hasApplied = false;\r\n @Input() clearButtonText: string = 'مسح الفلاتر';\r\n @Input() removeFilterText: string = 'إزالة';\r\n /** Localized «إلى must not be before من» message; defaults to the shared Arabic text. */\r\n @Input() rangeMessage: string = RANGE_MESSAGE_DEFAULT;\r\n\r\n /**\r\n * Snapshot of the filters that were in effect when «عرض» was last pressed. It is\r\n * read from `formData` AT APPLY TIME — editing a field without pressing apply does\r\n * not change the count or the chips (same decision as the posting-rules filter bar).\r\n */\r\n appliedFilters: AppliedFilter[] = [];\r\n private formInstance: any = null;\r\n /** Editor instances by dataField (only the editors that can be a range end register). */\r\n private readonly editors = new Map<string, any>();\r\n\r\n @Input() formData: Record<string, unknown> = {};\r\n @Input() items: any[] = [];\r\n\r\n @Input() colCountDesktop: number = 3;\r\n @Input() colCountMobile: number = 1;\r\n @Input() labelLocationDesktop: 'left' | 'right' | 'top' = 'top';\r\n @Input() labelLocationMobile: 'left' | 'right' | 'top' = 'top';\r\n @Input() showColonAfterLabel: boolean = false;\r\n\r\n @Input() mobileBreakpoint: number = 768;\r\n @Input() forceMobile: boolean | null = null;\r\n\r\n @Input() collapsed: boolean | null = null;\r\n @Input() autoCollapseByRequired: boolean = true;\r\n\r\n @Output() onApplyFilter = new EventEmitter<void>();\r\n @Output() onFieldDataChanged = new EventEmitter<any>();\r\n @Output() formInitialized = new EventEmitter<any>();\r\n\r\n isMobile = false;\r\n private initialCollapsedApplied = false;\r\n\r\n /**\r\n * What dx-form actually renders. Equals `items` (same reference) unless an item carries\r\n * `startNewRow: true`; then empty items fill the rest of the current row so it starts a\r\n * new one. dxForm has no \"new row\" option and silently DROPS a colSpan that overflows\r\n * the row (form.layout_manager `_prepareItemsWithMerging`), so padding is the only way.\r\n * Done here, not by the host, because only the panel knows the colCount in effect\r\n * (desktop vs mobile). Kept as a field, never a getter: a fresh array on every change\r\n * detection would make dx-form rebuild its editors.\r\n */\r\n layoutItems: any[] = [];\r\n\r\n get colCount(): number {\r\n return this.isMobile ? this.colCountMobile : this.colCountDesktop;\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['items'] || changes['colCountDesktop'] || changes['colCountMobile']) {\r\n this.refreshLayoutItems();\r\n }\r\n }\r\n\r\n private refreshLayoutItems(): void {\r\n this.layoutItems = this.padRowBreaks(this.items ?? [], this.colCount);\r\n }\r\n\r\n /** Top-level items only; hidden items take no cell so they don't count toward the row. */\r\n private padRowBreaks(items: any[], colCount: number): any[] {\r\n if (colCount <= 1 || !items.some((i) => i?.startNewRow === true)) return items;\r\n\r\n const result: any[] = [];\r\n let used = 0;\r\n for (const item of items) {\r\n if (!item || item.visible === false) {\r\n result.push(item);\r\n continue;\r\n }\r\n if (item.startNewRow === true && used > 0) {\r\n result.push({ itemType: 'empty', colSpan: colCount - used });\r\n used = 0;\r\n }\r\n const span = Math.min(item.colSpan ?? 1, colCount);\r\n result.push(span === item.colSpan ? item : { ...item, colSpan: span });\r\n used = (used + span) % colCount;\r\n }\r\n return result;\r\n }\r\n\r\n constructor() {\r\n this.syncIsMobile();\r\n window.addEventListener('resize', this.onResize, { passive: true });\r\n }\r\n\r\n ngOnDestroy(): void {\r\n window.removeEventListener('resize', this.onResize as any);\r\n }\r\n\r\n ngAfterContentInit(): void {\r\n this.applyInitialCollapsedFromItems();\r\n }\r\n\r\n private onResize = () => {\r\n const before = this.colCount;\r\n this.syncIsMobile();\r\n if (this.colCount !== before) this.refreshLayoutItems();\r\n };\r\n\r\n private syncIsMobile(): void {\r\n if (this.forceMobile !== null) {\r\n this.isMobile = this.forceMobile;\r\n return;\r\n }\r\n this.isMobile = window.innerWidth <= this.mobileBreakpoint;\r\n }\r\n\r\n private applyInitialCollapsedFromItems(): void {\r\n if (this.initialCollapsedApplied) return;\r\n if (!this.autoCollapseByRequired) return;\r\n if (this.collapsed !== null) return;\r\n\r\n if (Array.isArray(this.items) && this.items.length > 0) {\r\n const hasRequired = this.hasRequiredInItems(this.items);\r\n this.collapsed = !hasRequired;\r\n this.initialCollapsedApplied = true;\r\n }\r\n }\r\n\r\n private hasRequiredInItems(items: any[]): boolean {\r\n if (!Array.isArray(items)) return false;\r\n\r\n for (const item of items) {\r\n if (!item) continue;\r\n\r\n if (item.isRequired === true) return true;\r\n\r\n const rules = item.validationRules;\r\n if (\r\n Array.isArray(rules) &&\r\n rules.some((r: any) => r?.type === 'required')\r\n ) {\r\n return true;\r\n }\r\n\r\n if (Array.isArray(item.items) && this.hasRequiredInItems(item.items)) {\r\n return true;\r\n }\r\n\r\n if (Array.isArray(item.tabs)) {\r\n for (const tab of item.tabs) {\r\n if (Array.isArray(tab?.items) && this.hasRequiredInItems(tab.items)) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n toggleCollapse(): void {\r\n this.collapsed = !this.collapsed;\r\n }\r\n\r\n onApplyClick(e?: any): void {\r\n e?.event?.stopPropagation?.();\r\n if (!this.validateRangePairs()) return;\r\n this.appliedFilters = this.snapshotAppliedFilters();\r\n this.hasApplied = true;\r\n this.onApplyFilter.emit();\r\n }\r\n\r\n /** Clears every field, then applies immediately so the grid reflects the reset. */\r\n onClearClick(e?: any): void {\r\n e?.event?.stopPropagation?.();\r\n for (const f of this.appliedFilters) this.clearField(f.key);\r\n this.onApplyClick();\r\n }\r\n\r\n /** Removes ONE applied filter (chip ×) and re-applies. */\r\n removeAppliedFilter(f: AppliedFilter): void {\r\n this.clearField(f.key);\r\n this.onApplyClick();\r\n }\r\n\r\n private clearField(key: string): void {\r\n // updateData keeps the consumer's own cascade logic alive (it fires onFieldDataChanged\r\n // on the same formData object the host passed in); fall back to the object itself when\r\n // the form is projected content and there is no dxForm instance.\r\n if (this.formInstance?.updateData) this.formInstance.updateData(key, null);\r\n else if (this.formData) this.formData[key] = null;\r\n }\r\n\r\n private snapshotAppliedFilters(): AppliedFilter[] {\r\n const data = this.formData ?? {};\r\n const out: AppliedFilter[] = [];\r\n for (const key of Object.keys(data)) {\r\n const value = data[key];\r\n if (!this.hasValue(value)) continue;\r\n out.push({ key, label: this.labelFor(key), display: this.displayFor(value) });\r\n }\r\n return out;\r\n }\r\n\r\n private hasValue(v: unknown): boolean {\r\n if (v === null || v === undefined || v === '') return false;\r\n if (v === false) return false;\r\n if (Array.isArray(v)) return v.length > 0;\r\n return true;\r\n }\r\n\r\n /** Label = the form item's caption for that dataField; falls back to the key. */\r\n private labelFor(key: string): string {\r\n const item = this.findItem(this.items, key);\r\n return (\r\n item?.label?.text ??\r\n item?.caption ??\r\n item?.editorOptions?.caption ??\r\n key\r\n );\r\n }\r\n\r\n private findItem(items: any[] | undefined, key: string): any | null {\r\n if (!Array.isArray(items)) return null;\r\n for (const it of items) {\r\n if (!it) continue;\r\n if (it.dataField === key) return it;\r\n const nested =\r\n this.findItem(it.items, key) ??\r\n (Array.isArray(it.tabs)\r\n ? it.tabs.map((t: any) => this.findItem(t?.items, key)).find(Boolean)\r\n : null);\r\n if (nested) return nested;\r\n }\r\n return null;\r\n }\r\n\r\n /** Human text for the chip; ids (GUIDs) are not shown — the label alone is the message. */\r\n private displayFor(v: unknown): string {\r\n const guid = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\r\n if (v === true) return '';\r\n if (v instanceof Date) return v.toLocaleDateString();\r\n if (Array.isArray(v)) {\r\n const shown = v.filter((x) => typeof x !== 'object' && !guid.test(String(x)));\r\n return shown.length ? shown.join('، ') : `${v.length}`;\r\n }\r\n if (typeof v === 'object') return '';\r\n const s = String(v);\r\n return guid.test(s) ? '' : s;\r\n }\r\n\r\n onToggleClick(e?: MouseEvent): void {\r\n e?.stopPropagation?.();\r\n this.toggleCollapse();\r\n }\r\n\r\n onFormFieldDataChanged(e: any): void {\r\n this.onFieldDataChanged.emit(e);\r\n this.validateRangeOf(e?.dataField);\r\n }\r\n\r\n /** Called from the editor templates so a range end can be marked without focus. */\r\n registerEditor(dataField: string, instance: any): void {\r\n if (dataField && instance) this.editors.set(dataField, instance);\r\n }\r\n\r\n /**\r\n * Validates every tagged From/To pair and draws the result on both ends.\r\n * Returns false (and «عرض» does nothing) while any pair is reversed.\r\n */\r\n validateRangePairs(): boolean {\r\n let allValid = true;\r\n for (const { item, pair } of this.rangeItems()) {\r\n if (pair.role !== 'from') continue;\r\n if (!this.validatePairOf(item)) allValid = false;\r\n }\r\n return allValid;\r\n }\r\n\r\n private validateRangeOf(dataField: string | undefined): void {\r\n if (!dataField) return;\r\n const item = this.findItem(this.items, dataField);\r\n if (item) this.validatePairOf(item);\r\n }\r\n\r\n private validatePairOf(item: any): boolean {\r\n const all = this.rangeItems();\r\n const pair = all.find((x) => x.item === item)?.pair;\r\n if (!pair) return true;\r\n\r\n const endOf = (role: 'from' | 'to') =>\r\n all.find((x) => x.pair.key === pair.key && x.pair.role === role)?.item;\r\n const fromItem = endOf('from');\r\n const toItem = endOf('to');\r\n if (!fromItem || !toItem) return true;\r\n\r\n const data = this.formInstance?.option?.('formData') ?? this.formData ?? {};\r\n return validateRangePair({\r\n from: this.editorOf(fromItem.dataField),\r\n to: this.editorOf(toItem.dataField),\r\n kind: pair.kind,\r\n caption: pair.caption ?? fromItem.label?.text,\r\n message: this.rangeMessage,\r\n fromValue: data[fromItem.dataField],\r\n toValue: data[toItem.dataField],\r\n });\r\n }\r\n\r\n /** Template editors register themselves; native `editorType` editors come from the form. */\r\n private editorOf(dataField: string): any {\r\n return (\r\n this.editors.get(dataField) ?? this.formInstance?.getEditor?.(dataField)\r\n );\r\n }\r\n\r\n /**\r\n * Every From/To pair in the panel:\r\n * 1. items tagged explicitly with `editorOptions.rangePair` (the dynamic grid does this);\r\n * 2. otherwise detected by NAME + EDITOR — a text/number/date item whose dataField has a\r\n * `from` word and whose `to` partner (see rangePartnerFieldName) is an item of the same\r\n * editor kind. That is what makes every static screen using the panel validated with no\r\n * per-screen code: `dateFrom`/`dateTo`, `fromDate`/`toDate`, `journal_Date_From`/`_To`…\r\n * Lookups/select boxes never pair (من صندوق / إلى صندوق is not a range).\r\n */\r\n private rangeItems(): { item: any; pair: FilterRangePair }[] {\r\n const flat: any[] = [];\r\n const walk = (items: any[] | undefined) => {\r\n if (!Array.isArray(items)) return;\r\n for (const it of items) {\r\n if (!it) continue;\r\n if (it.dataField) flat.push(it);\r\n walk(it.items);\r\n if (Array.isArray(it.tabs)) it.tabs.forEach((t: any) => walk(t?.items));\r\n }\r\n };\r\n walk(this.items);\r\n\r\n const out: { item: any; pair: FilterRangePair }[] = [];\r\n const tagged = new Set<any>();\r\n for (const it of flat) {\r\n const pair = it.editorOptions?.rangePair;\r\n if (pair?.key) {\r\n out.push({ item: it, pair });\r\n tagged.add(it);\r\n }\r\n }\r\n\r\n for (const it of flat) {\r\n if (tagged.has(it)) continue;\r\n const kind = this.editorKindOf(it);\r\n const partnerName = rangePartnerFieldName(it.dataField);\r\n if (!kind || !partnerName) continue;\r\n\r\n const partner = flat.find(\r\n (x) => x.dataField === partnerName && !tagged.has(x),\r\n );\r\n if (!partner || this.editorKindOf(partner) !== kind) continue;\r\n\r\n // Each end already carries its own caption («من تاريخ» / «إلى تاريخ»), so the\r\n // message is shown without a prefix.\r\n out.push({ item: it, pair: { key: it.dataField, role: 'from', kind, caption: '' } });\r\n out.push({ item: partner, pair: { key: it.dataField, role: 'to', kind, caption: '' } });\r\n }\r\n return out;\r\n }\r\n\r\n private editorKindOf(item: any): RangeKind | null {\r\n const byTemplate: Record<string, string> = {\r\n dateBoxTemplate: 'dxDateBox',\r\n numberBoxTemplate: 'dxNumberBox',\r\n textBoxTemplate: 'dxTextBox',\r\n };\r\n const editorType = item.editorType ?? byTemplate[item.template];\r\n return rangeKindOfEditor(editorType, item.editorOptions?.type);\r\n }\r\n\r\n onFormInitialized(e: any): void {\r\n this.formInstance = e?.component ? e.component : e;\r\n this.formInitialized.emit(this.formInstance);\r\n }\r\n}\r\n","<app-border-wrapper>\r\n <div class=\"items-center\">\r\n <!-- Header (accordion trigger) -->\r\n <div\r\n class=\"flex items-center justify-between cursor-pointer select-none filter-panel-header\"\r\n (click)=\"toggleCollapse()\"\r\n >\r\n <div class=\"flex items-center gap-2 filter-panel-title-group\">\r\n <i [class]=\"headerIcon + ' text-xl filter-panel-title-icon'\"></i>\r\n <h2 class=\"text-md font-bold text-gray-800 dark:text-gray-100\">\r\n {{ title }}\r\n </h2>\r\n </div>\r\n\r\n <!-- Collapsed + filters applied: the active filters stay visible as chips, each\r\n removable, so the grid below never looks \"short\" for no visible reason\r\n (DESIGN.html §4). Computed from the APPLIED snapshot, not the live editors. -->\r\n @if (collapsed && appliedFilters.length) {\r\n <div class=\"fx-chips filter-panel-chips\" (click)=\"$event.stopPropagation()\">\r\n @for (f of appliedFilters; track f.key) {\r\n <span class=\"fx-chip\">\r\n <span>{{ f.display ? f.label + ': ' + f.display : f.label }}</span>\r\n <button\r\n type=\"button\"\r\n [attr.aria-label]=\"(removeFilterText || ('ui.filter-panel.1' | localize: 'إزالة')) + ' ' + f.label\"\r\n [title]=\"(removeFilterText || ('ui.filter-panel.1' | localize: 'إزالة')) + ' ' + f.label\"\r\n (click)=\"removeAppliedFilter(f)\"\r\n >\r\n <i class=\"dx-icon dx-icon-close\"></i>\r\n </button>\r\n </span>\r\n }\r\n </div>\r\n }\r\n\r\n <div class=\"flex items-center gap-2\">\r\n <button\r\n type=\"button\"\r\n class=\"fx-btn fx-btn--bare fx-btn--sm fx-btn--icon filter-panel-toggle\"\r\n (click)=\"onToggleClick($event)\"\r\n [attr.aria-expanded]=\"!collapsed\"\r\n aria-label=\"Toggle filters\"\r\n >\r\n <i\r\n class=\"ki-filled ki-down text-sm filter-panel-icon\"\r\n [class.collapsed]=\"collapsed\"\r\n ></i>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <!-- Collapsible Content -->\r\n <div class=\"filter-panel-content mt-1\" [class.collapsed]=\"collapsed\">\r\n <div class=\"filter-panel-body\">\r\n <!-- Content Projection Support -->\r\n <ng-content></ng-content>\r\n\r\n <!-- DxForm Mode (Standardized) -->\r\n <ng-container *ngIf=\"items && items.length > 0\">\r\n <br />\r\n <dx-form\r\n [formData]=\"formData\"\r\n [items]=\"layoutItems\"\r\n [colCount]=\"colCount\"\r\n[showColonAfterLabel]=\"showColonAfterLabel\"\r\n [validationGroup]=\"validationGroup\"\r\n (onInitialized)=\"onFormInitialized($event)\"\r\n (onFieldDataChanged)=\"onFormFieldDataChanged($event)\"\r\n >\r\n <!-- ========== Templates (Standard Editors) ========== -->\r\n\r\n <!-- TextBox -->\r\n <div *dxTemplate=\"let d of 'textBoxTemplate'\">\r\n <dx-text-box\r\n [value]=\"d.component.option('formData')[d.dataField]\"\r\n [placeholder]=\"d.editorOptions?.placeholder\"\r\n [showClearButton]=\"d.editorOptions?.showClearButton\"\r\n [disabled]=\"d.editorOptions?.disabled\"\r\n [readOnly]=\"d.editorOptions?.readOnly\"\r\n [maxLength]=\"d.editorOptions?.maxLength\"\r\n [mask]=\"d.editorOptions?.mask\"\r\n (onInitialized)=\"registerEditor(d.dataField, $event.component)\"\r\n (onValueChanged)=\"d.component.updateData(d.dataField, $event.value)\"\r\n ></dx-text-box>\r\n </div>\r\n\r\n <!-- NumberBox -->\r\n <div *dxTemplate=\"let d of 'numberBoxTemplate'\">\r\n <dx-number-box\r\n [value]=\"d.component.option('formData')[d.dataField]\"\r\n [placeholder]=\"d.editorOptions?.placeholder\"\r\n [showClearButton]=\"d.editorOptions?.showClearButton\"\r\n [disabled]=\"d.editorOptions?.disabled\"\r\n [readOnly]=\"d.editorOptions?.readOnly\"\r\n (onInitialized)=\"registerEditor(d.dataField, $event.component)\"\r\n (onValueChanged)=\"d.component.updateData(d.dataField, $event.value)\"\r\n ></dx-number-box>\r\n </div>\r\n\r\n <!-- DateBox -->\r\n <div *dxTemplate=\"let d of 'dateBoxTemplate'\">\r\n <dx-date-box\r\n [value]=\"d.component.option('formData')[d.dataField]\"\r\n type=\"date\"\r\n [displayFormat]=\"d.editorOptions?.displayFormat\"\r\n [useMaskBehavior]=\"d.editorOptions?.useMaskBehavior\"\r\n [showClearButton]=\"d.editorOptions?.showClearButton\"\r\n [disabled]=\"d.editorOptions?.disabled\"\r\n [readOnly]=\"d.editorOptions?.readOnly\"\r\n (onInitialized)=\"registerEditor(d.dataField, $event.component)\"\r\n (onValueChanged)=\"d.component.updateData(d.dataField, $event.value)\"\r\n ></dx-date-box>\r\n </div>\r\n\r\n <!-- ✅ DateRangeBox (NEW) -->\r\n <div *dxTemplate=\"let d of 'dateRangeBoxTemplate'\">\r\n <dx-date-range-box\r\n [value]=\"d.component.option('formData')[d.dataField]\"\r\n [startDate]=\"d.component.option('formData')[d.dataField]?.[0] ?? null\"\r\n [endDate]=\"d.component.option('formData')[d.dataField]?.[1] ?? null\"\r\n [displayFormat]=\"d.editorOptions?.displayFormat\"\r\n [useMaskBehavior]=\"d.editorOptions?.useMaskBehavior\"\r\n [showClearButton]=\"d.editorOptions?.showClearButton\"\r\n [disabled]=\"d.editorOptions?.disabled\"\r\n [readOnly]=\"d.editorOptions?.readOnly\"\r\n (onValueChanged)=\"d.component.updateData(d.dataField, $event.value)\"\r\n ></dx-date-range-box>\r\n </div>\r\n\r\n <!-- CheckBox -->\r\n <div *dxTemplate=\"let d of 'checkBoxTemplate'\">\r\n <dx-check-box\r\n [enableThreeStateBehavior]=\"\r\n d?.editorOptions?.allowUndeterminedState ?? false\"\r\n [value]=\"d.component.option('formData')[d.dataField]\"\r\n [text]=\"d.editorOptions?.caption || ''\"\r\n [disabled]=\"d.editorOptions?.disabled\"\r\n [readOnly]=\"d.editorOptions?.readOnly\"\r\n (onValueChanged)=\"d.component.updateData(d.dataField, $event.value)\"\r\n ></dx-check-box>\r\n </div>\r\n\r\n <!-- Switch -->\r\n <div *dxTemplate=\"let d of 'switchTemplate'\">\r\n <dx-switch\r\n [value]=\"d.component.option('formData')[d.dataField]\"\r\n [disabled]=\"d.editorOptions?.disabled\"\r\n [readOnly]=\"d.editorOptions?.readOnly\"\r\n (onValueChanged)=\"d.component.updateData(d.dataField, $event.value)\"\r\n ></dx-switch>\r\n </div>\r\n\r\n <!-- SelectBox -->\r\n <div *dxTemplate=\"let d of 'selectBoxTemplate'\">\r\n <dx-select-box\r\n [dataSource]=\"d.editorOptions?.dataSource\"\r\n [displayExpr]=\"d.editorOptions?.displayExpr\"\r\n [searchExpr]=\"d.editorOptions?.searchExpr\"\r\n [valueExpr]=\"d.editorOptions?.valueExpr\"\r\n [searchEnabled]=\"d.editorOptions?.searchEnabled\"\r\n [showClearButton]=\"d.editorOptions?.showClearButton\"\r\n [value]=\"d.component.option('formData')[d.dataField]\"\r\n [disabled]=\"d.editorOptions?.disabled\"\r\n [readOnly]=\"d.editorOptions?.readOnly\"\r\n (onValueChanged)=\"d.component.updateData(d.dataField, $event.value)\"\r\n ></dx-select-box>\r\n </div>\r\n\r\n <!-- AutoComplete (✅ removed the extra letter) -->\r\n <div *dxTemplate=\"let d of 'autoCompleteTemplate'\">\r\n <dx-autocomplete\r\n [dataSource]=\"d.editorOptions?.dataSource\"\r\n [value]=\"d.component.option('formData')[d.dataField]\"\r\n [disabled]=\"d.editorOptions?.disabled\"\r\n [readOnly]=\"d.editorOptions?.readOnly\"\r\n (onValueChanged)=\"d.component.updateData(d.dataField, $event.value)\"\r\n ></dx-autocomplete>\r\n </div>\r\n\r\n <!-- TagBox -->\r\n <div *dxTemplate=\"let d of 'tagBoxTemplate'\">\r\n <dx-tag-box\r\n [dataSource]=\"d.editorOptions?.dataSource\"\r\n [displayExpr]=\"d.editorOptions?.displayExpr\"\r\n [searchExpr]=\"d.editorOptions?.searchExpr\"\r\n [valueExpr]=\"d.editorOptions?.valueExpr\"\r\n [searchEnabled]=\"d.editorOptions?.searchEnabled\"\r\n [showSelectionControls]=\"d.editorOptions?.showSelectionControls\"\r\n [showClearButton]=\"d.editorOptions?.showClearButton\"\r\n [multiline]=\"d.editorOptions?.multiline\"\r\n [maxDisplayedTags]=\"d.editorOptions?.maxDisplayedTags\"\r\n [value]=\"d.component.option('formData')[d.dataField]\"\r\n [disabled]=\"d.editorOptions?.disabled\"\r\n [readOnly]=\"d.editorOptions?.readOnly\"\r\n (onValueChanged)=\"d.component.updateData(d.dataField, $event.value)\"\r\n ></dx-tag-box>\r\n </div>\r\n\r\n <!-- ========== Existing Custom Templates (keep) ========== -->\r\n\r\n <div *dxTemplate=\"let d of 'lookupEditTemplate'\">\r\n <app-lookup-edit\r\n [lookupId]=\"d.editorOptions.lookupId\"\r\n [lookupParameterSource]=\"d.editorOptions.lookupParameterSource\"\r\n [lookupParameters]=\"d.editorOptions.lookupParameters\"\r\n [caption]=\"d.editorOptions.caption || ' '\"\r\n [width]=\"d.editorOptions.width\"\r\n [selectParameters]=\"d.editorOptions.selectParameters\"\r\n [selectParametersCallback]=\"d.editorOptions.selectParametersCallback\"\r\n [readOnly]=\"d.editorOptions.readOnly\"\r\n [idValue]=\"d.component.option('formData')[d.dataField]\"\r\n (idValueChange)=\"d.component.updateData(d.dataField, $event)\"\r\n ></app-lookup-edit>\r\n </div>\r\n\r\n <div *dxTemplate=\"let d of 'gridLookupTemplate'\">\r\n <app-grid-lookup\r\n [lookupId]=\"d.editorOptions?.lookupId\"\r\n [lookupParameterSource]=\"d.editorOptions?.lookupParameterSource\"\r\n [lookupParameters]=\"d.editorOptions?.lookupParameters\"\r\n [fieldName]=\"d.dataField\"\r\n [isMultiSelect]=\"d.editorOptions?.isMultiSelect ?? true\"\r\n [useCommaSeparatedValues]=\"d.editorOptions?.useCommaSeparatedValues ?? true\"\r\n [value]=\"d.component.option('formData')[d.dataField]\"\r\n (valueChange)=\"d.component.updateData(d.dataField, $event)\"\r\n ></app-grid-lookup>\r\n </div>\r\n </dx-form>\r\n </ng-container>\r\n\r\n <!-- «عرض» is the filter panel's primary action → Fill with the brand colour\r\n (DESIGN.html §4 — `fx-fill` maps to the Fill tier; `type=\"default\"` keeps it brand,\r\n never a coloured fill). «مسح» is Bare and only exists while there is\r\n something to clear.\r\n\r\n The button deliberately does NOT carry `data-fx-count`: the shared\r\n `[data-fx-count]::after` badge in flexora-buttons.scss stays for the bulk-action\r\n toolbars (grid toolbar, my-approvals) where a *selection* count is the whole\r\n point, but on «عرض» the number was noise — the applied filters are already\r\n visible as chips on the collapsed header. Removed on request (2026-09-23). -->\r\n <div class=\"filter-panel-footer mt-4 pt-4 border-t border-gray-200 dark:border-slate-700 flex items-center gap-2\">\r\n <dx-button\r\n [text]=\"applyButtonText\"\r\n type=\"default\"\r\n [icon]=\"applyButtonIcon\"\r\n stylingMode=\"contained\"\r\n [elementAttr]=\"{ class: 'fx-fill' }\"\r\n [validationGroup]=\"validationGroup\"\r\n [useSubmitBehavior]=\"true\"\r\n (onClick)=\"onApplyClick($event)\"\r\n [disabled]=\"applyButtonDisabled\"\r\n ></dx-button>\r\n @if (appliedFilters.length || (showClearAfterApply && hasApplied)) {\r\n <dx-button\r\n [text]=\"clearButtonText\"\r\n icon=\"clear\"\r\n stylingMode=\"text\"\r\n (onClick)=\"onClearClick($event)\"\r\n ></dx-button>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</app-border-wrapper>\r\n","import { InjectionToken } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\n\r\nexport interface FinancialDimensionValuesProvider {\r\n dimensionLookupId: any;\r\n dimensionValueLookupId: any;\r\n fieldDataParameterSource: string | number;\r\n loadValues(options: any): Observable<any>;\r\n loadDimensions(options: any): Observable<any>;\r\n}\r\nexport const FINANCIAL_DIMENSION_VALUES_PROVIDER = new InjectionToken<FinancialDimensionValuesProvider>('FINANCIAL_DIMENSION_VALUES_PROVIDER');\r\n","import { CommonModule } from '@angular/common';\r\nimport {\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n EventEmitter,\r\n inject,\r\n Inject,\r\n Input,\r\n OnInit,\r\n Output,\r\n} from '@angular/core';\r\nimport {\r\n DxButtonModule,\r\n DxDataGridModule,\r\n DxFormModule,\r\n DxSelectBoxModule,\r\n} from 'devextreme-angular';\r\nimport { DataSource } from 'devextreme/common/data';\r\nimport { firstValueFrom } from 'rxjs';\r\nimport { LOOKUP_GRID_PROVIDER, LookupGridProvider, LookupValueType } from '../lookup-grid-provider';\r\nimport { NavigatorLocalizePipe } from '../form-navigator/navigator-localize.pipe';\r\nimport { FORM_NAVIGATOR_ADAPTER } from '../form-navigator/form-navigator-adapter';\r\nimport { REUSABLE_COMPONENTS_CONFIG } from '../reusable-components.config';\r\nimport { FINANCIAL_DIMENSION_VALUES_PROVIDER, FinancialDimensionValuesProvider } from './financial-dimension-values-provider';\r\n\r\nexport interface FinancialDimensionValueRow {\r\n dimensionId: string;\r\n dimensionName: string;\r\n dimensionNameEn?: string;\r\n dimensionValueId: string;\r\n dimensionValueName: string;\r\n dimensionValueNameEn?: string;\r\n}\r\n\r\n@Component({\r\n selector: 'app-financial-dimension-values',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n DxFormModule,\r\n DxSelectBoxModule,\r\n DxButtonModule,\r\n DxDataGridModule,\r\n NavigatorLocalizePipe,\r\n // AppGridToolbarDirective,\r\n ],\r\n templateUrl: './financial-dimension-values.component.html',\r\n styleUrls: ['./financial-dimension-values.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class FinancialDimensionValuesComponent implements OnInit {\r\n private readonly navigatorAdapter = inject(FORM_NAVIGATOR_ADAPTER);\r\n private readonly config = inject(REUSABLE_COMPONENTS_CONFIG, { optional: true });\r\n\r\n private get useArabic(): boolean {\r\n return this.config?.isArabic?.() ?? this.navigatorAdapter.isArabic?.() ?? true;\r\n }\r\n\r\n // Bilingual lookup rows: show the UI language, falling back to the other one.\r\n readonly nameExpr = (item: any): string => {\r\n if (!item) return '';\r\n return (this.useArabic ? item.name_Ar || item.name_En : item.name_En || item.name_Ar) ?? '';\r\n };\r\n get nameSearchExpr(): string {\r\n return this.useArabic ? 'name_Ar' : 'name_En';\r\n }\r\n /** Emits comma-separated value IDs whenever rows change. */\r\n @Input() value: string | null | undefined;\r\n @Output() valueChange = new EventEmitter<any>();\r\n @Input() valueType!: LookupValueType | number;\r\n @Input() caption: string = 'الأبعاد المالية';\r\n @Input() text: string | null | undefined;\r\n @Input() name!: string;\r\n @Input() fieldName!: string;\r\n @Input() gridId?: string;\r\n\r\n dsFinancialDimensions: DataSource | null = null;\r\n dsFinancialDimensionValues: DataSource | null = null;\r\n\r\n rows: FinancialDimensionValueRow[] = [];\r\n\r\n selectedDimensionId: string | null = null;\r\n selectedValueId: string | null = null;\r\n selectedDimensionItem: any = null;\r\n selectedValueItem: any = null;\r\n\r\n constructor(\r\n private cdr: ChangeDetectorRef,\r\n @Inject(LOOKUP_GRID_PROVIDER) private sysLookupService: LookupGridProvider,\r\n @Inject(FINANCIAL_DIMENSION_VALUES_PROVIDER) private provider: FinancialDimensionValuesProvider,\r\n ) {}\r\n\r\n async ngOnInit(): Promise<void> {\r\n this.dsFinancialDimensions = await this.sysLookupService.createDataSource(\r\n this.provider.dimensionLookupId,\r\n );\r\n\r\n this.dsFinancialDimensionValues =\r\n await this.sysLookupService.createDataSource(\r\n this.provider.dimensionValueLookupId,\r\n 'id',\r\n true,\r\n this.provider.fieldDataParameterSource,\r\n () => ({ dimension_Id: this.selectedDimensionId }),\r\n );\r\n\r\n this.cdr.markForCheck();\r\n }\r\n\r\n onDimensionChange(dimensionId: string | null): void {\r\n this.selectedDimensionId = dimensionId;\r\n this.selectedValueId = null;\r\n this.selectedValueItem = null;\r\n\r\n const ds = this.dsFinancialDimensionValues;\r\n if (ds) {\r\n const store: any = ds.store();\r\n store?.clearRawDataCache?.();\r\n ds.reload();\r\n }\r\n\r\n this.cdr.markForCheck();\r\n }\r\n\r\n onDimensionSelectionChanged(e: any): void {\r\n this.selectedDimensionItem = e?.selectedItem ?? null;\r\n }\r\n\r\n onValueSelectionChanged(e: any): void {\r\n this.selectedValueItem = e?.selectedItem ?? null;\r\n }\r\n\r\n get canAdd(): boolean {\r\n if (!this.selectedDimensionId || !this.selectedValueId) return false;\r\n // Prevent duplicates on the same dimension Value id.\r\n return !this.rows.some((r) => r.dimensionValueId === this.selectedValueId);\r\n }\r\n\r\n onAdd(): void {\r\n if (!this.canAdd) return;\r\n if (!this.selectedDimensionItem || !this.selectedValueItem) return;\r\n\r\n const row: FinancialDimensionValueRow = {\r\n dimensionId: this.selectedDimensionItem.id,\r\n dimensionName: this.selectedDimensionItem.name_Ar,\r\n dimensionNameEn: this.selectedDimensionItem.name_En,\r\n dimensionValueId: this.selectedValueItem.id,\r\n dimensionValueName: this.selectedValueItem.name_Ar,\r\n dimensionValueNameEn: this.selectedValueItem.name_En,\r\n };\r\n\r\n this.rows = [...this.rows, row];\r\n this.resetSelection();\r\n this.emitChange();\r\n this.cdr.markForCheck();\r\n }\r\n\r\n async onDelete(row: FinancialDimensionValueRow): Promise<void> {\r\n if (!(await this.navigatorAdapter.confirm('delete'))) return;\r\n this.rows = this.rows.filter(\r\n (r) => r.dimensionValueId !== row.dimensionValueId,\r\n );\r\n this.emitChange();\r\n this.cdr.markForCheck();\r\n }\r\n\r\n private resetSelection(): void {\r\n this.selectedDimensionId = null;\r\n this.selectedValueId = null;\r\n this.selectedDimensionItem = null;\r\n this.selectedValueItem = null;\r\n }\r\n\r\n private emitChange(): void {\r\n const dimIds = this.rows.map((r) => r.dimensionValueId).join(',');\r\n const txt = this.rows\r\n .map((r) => `${r.dimensionName} => ${r.dimensionValueName}`)\r\n .join(', ');\r\n this.text = txt;\r\n this.value = dimIds;\r\n this.valueChange.emit(dimIds);\r\n }\r\n\r\n getReportDisplayText(culture: string): string {\r\n const english = !culture.toLowerCase().startsWith('ar');\r\n return this.rows.map((row: any) => {\r\n const dimension = english && row.dimensionNameEn?.trim() ? row.dimensionNameEn : row.dimensionName;\r\n const value = english && row.dimensionValueNameEn?.trim() ? row.dimensionValueNameEn : row.dimensionValueName;\r\n return `${dimension} => ${value}`;\r\n }).join(', ');\r\n }\r\n\r\n /**\r\n * Drops every chosen pair. Needed because the control's state lives in `rows`, so the generic\r\n * \"control.value = null\" reset used for plain editors would leave the grid populated while\r\n * reporting an empty condition.\r\n */\r\n clear(): void {\r\n this.rows = [];\r\n this.resetSelection();\r\n this.emitChange();\r\n this.cdr.markForCheck();\r\n }\r\n\r\n async setSelectedValueIds(\r\n joinedValueIds: string | null | undefined,\r\n ): Promise<void> {\r\n const ids = (joinedValueIds ?? '')\r\n .split(',')\r\n .map((id) => id.trim())\r\n .filter((id) => !!id);\r\n\r\n if (!ids.length) {\r\n this.clear();\r\n return;\r\n }\r\n\r\n const valuesResult = await firstValueFrom(\r\n this.provider.loadValues({\r\n filter: this.buildIdFilter(ids),\r\n select: ['id', 'value', 'name_Ar', 'name_En', 'dimension_Id'],\r\n take: ids.length,\r\n }),\r\n );\r\n\r\n const values = valuesResult?.data ?? [];\r\n\r\n const dimensionIds = Array.from(\r\n new Set(\r\n values.map((v: any) => v.dimension_Id).filter((id: string) => !!id),\r\n ),\r\n );\r\n\r\n const dimensionNames = new Map<string, string>();\r\n const dimensionNamesEn = new Map<string, string>();\r\n\r\n if (dimensionIds.length) {\r\n const dimensionsResult = await firstValueFrom(\r\n this.provider.loadDimensions({\r\n filter: this.buildIdFilter(dimensionIds as string[]),\r\n select: ['id', 'name_Ar', 'name_En'],\r\n take: dimensionIds.length,\r\n }),\r\n );\r\n\r\n (dimensionsResult?.data ?? []).forEach((d: any) => {\r\n dimensionNames.set(d.id, d.name_Ar);\r\n dimensionNamesEn.set(d.id, d.name_En);\r\n });\r\n }\r\n const byId = new Map<string, any>(values.map((v: any) => [v.id, v]));\r\n\r\n this.rows = ids\r\n .map((id) => byId.get(id))\r\n .filter((v) => !!v)\r\n .map((v: any) => ({\r\n dimensionId: v.dimension_Id,\r\n dimensionName: dimensionNames.get(v.dimension_Id) ?? '',\r\n dimensionNameEn: dimensionNamesEn.get(v.dimension_Id),\r\n dimensionValueId: v.id,\r\n dimensionValueName: v.name_Ar,\r\n dimensionValueNameEn: v.name_En,\r\n }));\r\n\r\n this.resetSelection();\r\n this.emitChange();\r\n this.cdr.markForCheck();\r\n }\r\n\r\n /** DevExtreme filter expression matching any of the given ids. */\r\n private buildIdFilter(ids: string[]): any[] {\r\n if (ids.length === 1) return ['id', '=', ids[0]];\r\n\r\n return ids.reduce<any[]>((acc, id, index) => {\r\n if (index === 0) return [['id', '=', id]];\r\n return [...acc, 'or', ['id', '=', id]];\r\n }, []);\r\n }\r\n}\r\n","<dx-form [class.fdv-no-dimension]=\"!selectedDimensionId\">\r\n <dxi-item itemType=\"group\" [colCount]=\"1\">\r\n <dxi-item\r\n [dataField]=\"fieldName\"\r\n [label]=\"{ text: '539' | localize: 'البُعد المالي' }\"\r\n >\r\n <dx-select-box\r\n [dataSource]=\"dsFinancialDimensions\"\r\n [displayExpr]=\"nameExpr\"\r\n [searchExpr]=\"nameSearchExpr\"\r\n valueExpr=\"id\"\r\n [value]=\"selectedDimensionId\"\r\n (valueChange)=\"onDimensionChange($event)\"\r\n (onSelectionChanged)=\"onDimensionSelectionChanged($event)\"\r\n [showClearButton]=\"true\"\r\n [searchEnabled]=\"true\"\r\n [placeholder]=\"'539' | localize: 'البُعد المالي'\"\r\n stylingMode=\"outlined\"\r\n ></dx-select-box>\r\n </dxi-item>\r\n\r\n <!-- Hidden (CSS, not [visible]) until a dimension is picked: toggling an\r\n item's visible makes dx-form re-render and lose projected editors. -->\r\n <dxi-item\r\n dataField=\"financialDimensionValueId\"\r\n cssClass=\"fdv-when-dimension\"\r\n [label]=\"{ text: '568' | localize: 'قيمة البُعد المالي' }\"\r\n >\r\n <dx-select-box\r\n [dataSource]=\"dsFinancialDimensionValues\"\r\n [displayExpr]=\"nameExpr\"\r\n [searchExpr]=\"nameSearchExpr\"\r\n valueExpr=\"id\"\r\n [value]=\"selectedValueId\"\r\n (valueChange)=\"selectedValueId = $event\"\r\n (onSelectionChanged)=\"onValueSelectionChanged($event)\"\r\n [disabled]=\"!selectedDimensionId\"\r\n [showClearButton]=\"true\"\r\n [searchEnabled]=\"true\"\r\n [placeholder]=\"'568' | localize: 'قيمة البُعد المالي'\"\r\n stylingMode=\"outlined\"\r\n ></dx-select-box>\r\n </dxi-item>\r\n\r\n <dxi-item cssClass=\"fdv-when-dimension\">\r\n <dx-button\r\n [text]=\"'General.Add.Label' | localize: 'إضافة'\"\r\n type=\"default\"\r\n stylingMode=\"contained\"\r\n [disabled]=\"!canAdd\"\r\n (onClick)=\"onAdd()\"\r\n ></dx-button>\r\n </dxi-item>\r\n </dxi-item>\r\n\r\n <!-- <dxi-item itemType=\"group\" [colCount]=\"1\"\r\n ></dxi-item> -->\r\n</dx-form>\r\n@if (selectedDimensionId || rows.length) {\r\n<div class=\"grid-container\">\r\n <dx-data-grid\r\n [dataSource]=\"rows\"\r\n keyExpr=\"dimensionValueId\"\r\n [remoteOperations]=\"true\"\r\n [showBorders]=\"true\"\r\n [showColumnLines]=\"true\"\r\n [showRowLines]=\"true\"\r\n [columnAutoWidth]=\"true\"\r\n [allowColumnResizing]=\"true\"\r\n [focusedRowEnabled]=\"true\"\r\n [rowAlternationEnabled]=\"true\"\r\n [keyboardNavigation]=\"{ enabled: true }\"\r\n >\r\n <dxi-column\r\n caption=\"#\"\r\n [width]=\"100\"\r\n [allowSorting]=\"false\"\r\n cellTemplate=\"actionsTemplate\"\r\n ></dxi-column>\r\n <dxi-column\r\n dataField=\"dimensionName\"\r\n [caption]=\"'539' | localize: 'البُعد المالي'\"\r\n ></dxi-column>\r\n <dxi-column\r\n dataField=\"dimensionValueName\"\r\n [caption]=\"'568' | localize: 'قيمة البُعد المالي'\"\r\n ></dxi-column>\r\n <div *dxTemplate=\"let cell of 'actionsTemplate'\" class=\"fdv-actions\">\r\n <!-- <dx-button\r\n [text]=\"'General.Edit.Label' | localize: 'تعديل'\"\r\n stylingMode=\"text\"\r\n type=\"default\"\r\n (onClick)=\"onEdit(cell.data)\"\r\n ></dx-button> -->\r\n <dx-button\r\n [text]=\"'General.Delete.Label' | localize: 'حذف'\"\r\n stylingMode=\"text\"\r\n type=\"danger\"\r\n (onClick)=\"onDelete(cell.data)\"\r\n ></dx-button></div\r\n ></dx-data-grid>\r\n</div>\r\n}\r\n","import { InjectionToken } from '@angular/core';\r\n\r\nexport interface FinancialDimensionValueVm { id: string; code: string; name_Ar: string; name_En?: string; }\r\nexport interface FinancialDimensionVm {\r\n id: string; code: string; name_Ar: string; name_En?: string; position?: number;\r\n is_Required?: boolean; values: FinancialDimensionValueVm[];\r\n}\r\nexport type DimensionSelectionsMap = Record<string, string | null>;\r\nexport interface FinancialDimensionsProvider {\r\n getDimensionsByAccount(accountId: string, combinationId?: string | null): Promise<FinancialDimensionVm[]>;\r\n getAllDimensions(): Promise<FinancialDimensionVm[]>;\r\n getCombinationSelections(dimensions: FinancialDimensionVm[], combinationId: string): Promise<DimensionSelectionsMap>;\r\n buildPayload(dimensions: FinancialDimensionVm[], selections: DimensionSelectionsMap, accountId: string): any;\r\n createOrGetCombination(payload: any): Promise<{ id: string; display_Value: string }>;\r\n}\r\nexport const FINANCIAL_DIMENSIONS_PROVIDER = new InjectionToken<FinancialDimensionsProvider>('FINANCIAL_DIMENSIONS_PROVIDER');\r\n","import { CommonModule } from '@angular/common';\r\nimport {\r\n ChangeDetectorRef,\r\n Component,\r\n EventEmitter,\r\n Input,\r\n Output,\r\n inject,\r\n Inject,\r\n} from '@angular/core';\r\nimport {\r\n DxButtonModule,\r\n DxPopupModule,\r\n DxSelectBoxModule,\r\n DxSwitchModule,\r\n DxTemplateModule,\r\n} from 'devextreme-angular';\r\nimport { FormNavigatorAdapter, FORM_NAVIGATOR_ADAPTER } from '../form-navigator/form-navigator-adapter';\r\nimport { NavigatorLocalizePipe } from '../form-navigator/navigator-localize.pipe';\r\nimport { REUSABLE_COMPONENTS_CONFIG } from '../reusable-components.config';\r\nimport {\r\n DimensionSelectionsMap,\r\n FINANCIAL_DIMENSIONS_PROVIDER,\r\n FinancialDimensionsProvider,\r\n FinancialDimensionVm,\r\n} from './financial-dimensions-provider';\r\n\r\n/**\r\n * Picks (or creates) a financial-dimension combination for one main account and hands back its\r\n * id + display value. Stateless towards its host: it neither knows the grid nor the row — the\r\n * host decides where the result goes (toolbar → focused row, edit form → the row being edited).\r\n */\r\n@Component({\r\n selector: 'app-financial-dimensions-popup',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n DxPopupModule,\r\n DxSelectBoxModule,\r\n DxButtonModule,\r\n DxSwitchModule,\r\n DxTemplateModule,\r\n NavigatorLocalizePipe,\r\n ],\r\n templateUrl: './financial-dimensions-popup.component.html',\r\n styleUrl: './financial-dimensions-popup.component.scss',\r\n})\r\nexport class FinancialDimensionsPopupComponent {\r\n @Input() visible = false;\r\n @Output() visibleChange = new EventEmitter<boolean>();\r\n\r\n @Input() mainAccountId: string | null = null;\r\n @Input() existingCombinationId: string | null = null;\r\n @Input() reportMode = false;\r\n\r\n /**\r\n * SCR-09 — optional \"locked\" toggle, opt-in and off by default so the two other\r\n * consumers of this shared popup (financial-transactions-form, opening-balance-form)\r\n * are unaffected. A caller that needs it (accrual-schemes) sets `showLockToggle` and\r\n * owns the permission gate via `lockToggleDisabled` — this component has no notion\r\n * of permissions, only of whether the switch may be touched right now.\r\n */\r\n @Input() showLockToggle = false;\r\n @Input() locked = false;\r\n @Output() lockedChange = new EventEmitter<boolean>();\r\n @Input() lockToggleDisabled = false;\r\n\r\n @Output() saved = new EventEmitter<{\r\n combinationId: string;\r\n displayValue: string;\r\n selections?: DimensionSelectionsMap;\r\n locked?: boolean;\r\n }>();\r\n /** The user asked to drop the row's dimensions (only offered when one is already set). */\r\n @Output() cleared = new EventEmitter<void>();\r\n\r\n dimensions: FinancialDimensionVm[] = [];\r\n selections: DimensionSelectionsMap = {};\r\n isSaving = false;\r\n isLoading = false;\r\n validationError = '';\r\n invalidDimensionIds = new Set<string>();\r\n\r\n private readonly config = inject(REUSABLE_COMPONENTS_CONFIG, { optional: true });\r\n private readonly adapter = inject(FORM_NAVIGATOR_ADAPTER, { optional: true });\r\n private t(key: string, fallback: string): string {\r\n return this.config?.translate?.(key, fallback) ?? this.adapter?.translate(key, fallback) ?? fallback;\r\n }\r\n\r\n constructor(\r\n @Inject(FINANCIAL_DIMENSIONS_PROVIDER)\r\n private financialDimensionsFacadeService: FinancialDimensionsProvider,\r\n private cdr: ChangeDetectorRef,\r\n ) {}\r\n\r\n get isArabic(): boolean {\r\n return this.config?.isArabic?.() ?? this.adapter?.isArabic?.() ?? true;\r\n }\r\n\r\n /** Language-aware label with a fallback to the other side, so a row filled on one side only\r\n * never renders blank. */\r\n label(item: { name_Ar?: string; name_En?: string } | null | undefined): string {\r\n if (!item) return '';\r\n return this.isArabic\r\n ? item.name_Ar || item.name_En || ''\r\n : item.name_En || item.name_Ar || '';\r\n }\r\n\r\n /** dxSelectBox displayExpr — bound as a function so it follows the UI language. */\r\n readonly valueDisplayExpr = (item: any) => this.label(item);\r\n\r\n get canClear(): boolean {\r\n return !this.reportMode && !!this.existingCombinationId;\r\n }\r\n\r\n onShowing() {\r\n // Fires before the popup animation so the skeleton is there from the first frame.\r\n this.dimensions = [];\r\n this.selections = {};\r\n this.validationError = '';\r\n this.invalidDimensionIds.clear();\r\n this.isLoading = true;\r\n }\r\n\r\n async onShown() {\r\n try {\r\n if (this.reportMode) {\r\n this.dimensions =\r\n await this.financialDimensionsFacadeService.getAllDimensions();\r\n return;\r\n }\r\n\r\n if (!this.mainAccountId) return;\r\n\r\n this.dimensions =\r\n await this.financialDimensionsFacadeService.getDimensionsByAccount(\r\n this.mainAccountId,\r\n this.existingCombinationId,\r\n );\r\n\r\n if (this.existingCombinationId) {\r\n try {\r\n this.selections = {\r\n ...(await this.financialDimensionsFacadeService.getCombinationSelections(\r\n this.dimensions,\r\n this.existingCombinationId,\r\n )),\r\n };\r\n } catch (e) {\r\n console.warn('[FinancialDimensionsPopup] getCombinationSelections failed', e);\r\n this.selections = {};\r\n }\r\n }\r\n } finally {\r\n this.isLoading = false;\r\n this.cdr.detectChanges();\r\n }\r\n }\r\n\r\n async onSave() {\r\n this.validationError = '';\r\n const missingRequired = this.dimensions.filter(\r\n (dimension) =>\r\n dimension.is_Required && !this.selections[dimension.id],\r\n );\r\n if (missingRequired.length) {\r\n this.invalidDimensionIds = new Set(\r\n missingRequired.map((dimension) => dimension.id),\r\n );\r\n // Each missing field already shows an inline \"required\" hint (invalidDimensionIds), so the\r\n // banner is reserved for the one case the field cannot explain: a required dimension that has\r\n // no values to pick from at all.\r\n const missingSource = missingRequired.find(\r\n (dimension) => !dimension.values?.length,\r\n );\r\n this.validationError = missingSource\r\n ? this.t(\r\n 'FinancialDimensions.Popup.NoValuesForRequired',\r\n 'لا توجد قيم متاحة للبُعد المطلوب \"{0}\"؛ راجع إعدادات قيم الأبعاد',\r\n ).replace('{0}', this.label(missingSource))\r\n : '';\r\n return;\r\n }\r\n\r\n const hasValues = Object.values(this.selections).some((v) => !!v);\r\n if (!hasValues) return;\r\n\r\n if (this.reportMode) {\r\n this.saved.emit({\r\n combinationId: '',\r\n displayValue: '',\r\n selections: { ...this.selections },\r\n });\r\n this.close();\r\n return;\r\n }\r\n\r\n if (!this.mainAccountId) return;\r\n\r\n this.isSaving = true;\r\n try {\r\n const payload = this.financialDimensionsFacadeService.buildPayload(\r\n this.dimensions,\r\n this.selections,\r\n this.mainAccountId,\r\n );\r\n const combination =\r\n await this.financialDimensionsFacadeService.createOrGetCombination(\r\n payload,\r\n );\r\n\r\n this.saved.emit({\r\n combinationId: combination.id,\r\n displayValue: combination.display_Value,\r\n locked: this.showLockToggle ? this.locked : undefined,\r\n });\r\n\r\n this.close();\r\n } finally {\r\n this.isSaving = false;\r\n }\r\n }\r\n\r\n onClear() {\r\n this.cleared.emit();\r\n this.close();\r\n }\r\n\r\n onSelectionChanged(dimensionId: string, value: string | null): void {\r\n this.selections = { ...this.selections, [dimensionId]: value };\r\n if (value && this.invalidDimensionIds.has(dimensionId)) {\r\n this.invalidDimensionIds = new Set(\r\n [...this.invalidDimensionIds].filter((id) => id !== dimensionId),\r\n );\r\n }\r\n this.validationError = '';\r\n }\r\n\r\n onHiding() {\r\n this.close();\r\n }\r\n\r\n private close() {\r\n this.visible = false;\r\n this.visibleChange.emit(false);\r\n }\r\n}\r\n","<dx-popup\r\n [(visible)]=\"visible\"\r\n [showTitle]=\"true\"\r\n [title]=\"'1148' | localize: 'الأبعاد المالية'\"\r\n (onShowing)=\"onShowing()\"\r\n (onShown)=\"onShown()\"\r\n (onHiding)=\"onHiding()\"\r\n [width]=\"600\"\r\n [height]=\"'auto'\"\r\n [maxHeight]=\"600\"\r\n>\r\n <div *dxTemplate=\"let d of 'content'\" class=\"p-3\">\r\n <div *ngIf=\"isLoading\" class=\"dim-skeleton\">\r\n <div class=\"dim-skeleton__row\" *ngFor=\"let i of [1, 2, 3, 4]\">\r\n <div class=\"dim-skeleton__label\"></div>\r\n <div class=\"dim-skeleton__input\"></div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"!isLoading\">\r\n <div\r\n *ngFor=\"let dim of dimensions\"\r\n class=\"mb-3 dimension-field\"\r\n [class.dimension-field--invalid]=\"invalidDimensionIds.has(dim.id)\"\r\n >\r\n <label class=\"form-label block text-start mb-1\">\r\n {{ label(dim) }}{{ dim.is_Required ? ' *' : '' }}:\r\n </label>\r\n <dx-select-box\r\n [dataSource]=\"dim.values\"\r\n [displayExpr]=\"valueDisplayExpr\"\r\n valueExpr=\"id\"\r\n [value]=\"selections[dim.id]\"\r\n (valueChange)=\"onSelectionChanged(dim.id, $event)\"\r\n [showClearButton]=\"!dim.is_Required\"\r\n [searchEnabled]=\"true\"\r\n [searchExpr]=\"['name_Ar', 'name_En', 'value']\"\r\n [placeholder]=\"'common.selectPlaceholder' | localize: 'اختر...'\"\r\n [inputAttr]=\"{\r\n 'aria-label': label(dim),\r\n 'aria-required': dim.is_Required,\r\n 'aria-invalid': invalidDimensionIds.has(dim.id),\r\n }\"\r\n stylingMode=\"outlined\"\r\n ></dx-select-box>\r\n <div\r\n *ngIf=\"invalidDimensionIds.has(dim.id)\"\r\n class=\"dimension-field__error text-start\"\r\n role=\"alert\"\r\n >\r\n {{ 'FinancialDimensions.Popup.Required' | localize: 'هذا البعد مطلوب' }}\r\n </div>\r\n </div>\r\n\r\n <div\r\n *ngIf=\"validationError\"\r\n class=\"dimension-validation-summary text-start mb-2\"\r\n role=\"alert\"\r\n >\r\n {{ validationError }}\r\n </div>\r\n\r\n <!-- SCR-09: opt-in lock switch. Locked = this combination stays fixed and cannot be\r\n changed when the scheme runs. Editable only when the caller allows it\r\n (accrual-schemes gates this on its own permission 34 \"lock accrual scheme\r\n dimensions\", deliberately separate from \"approve\"). -->\r\n <div *ngIf=\"showLockToggle\" class=\"mb-3 flex items-center gap-2\">\r\n <span class=\"form-label mb-0\">{{ 'FinancialDimensions.Popup.Locked' | localize: 'مُقفل' }}</span>\r\n <dx-switch\r\n [value]=\"locked\"\r\n (valueChange)=\"lockedChange.emit($event)\"\r\n [disabled]=\"lockToggleDisabled\"\r\n ></dx-switch>\r\n </div>\r\n\r\n <div class=\"fx-popup-footer\">\r\n <dx-button\r\n *ngIf=\"canClear\"\r\n [text]=\"'FinancialDimensions.Popup.Clear' | localize: 'إزالة الأبعاد'\"\r\n type=\"danger\"\r\n stylingMode=\"text\"\r\n (onClick)=\"onClear()\"\r\n ></dx-button>\r\n <span class=\"fx-popup-footer-spacer\"></span>\r\n <dx-button\r\n [text]=\"'common.save' | localize: 'حفظ'\"\r\n type=\"default\"\r\n [disabled]=\"isSaving\"\r\n (onClick)=\"onSave()\"\r\n ></dx-button>\r\n <dx-button\r\n [text]=\"'common.cancel' | localize: 'إلغاء'\"\r\n stylingMode=\"outlined\"\r\n (onClick)=\"onHiding()\"\r\n ></dx-button>\r\n </div>\r\n </div>\r\n </div>\r\n</dx-popup>\r\n","import {\r\n ChangeDetectorRef,\r\n Component,\r\n EventEmitter,\r\n inject,\r\n Input,\r\n Output,\r\n} from '@angular/core';\r\nimport { DxCheckBoxModule, DxSelectBoxModule } from 'devextreme-angular';\r\nimport { FORM_NAVIGATOR_ADAPTER, FormNavigatorAdapter } from '../form-navigator/form-navigator-adapter';\r\nimport { NavigatorLocalizePipe } from '../form-navigator/navigator-localize.pipe';\r\n\r\nexport interface GroupingLevelValue { groupingFieldName?: string; isNewPage?: boolean; [key: string]: any; }\r\n\r\n@Component({\r\n selector: 'app-grouping-level',\r\n standalone: true,\r\n imports: [DxCheckBoxModule, DxSelectBoxModule, NavigatorLocalizePipe],\r\n templateUrl: './grouping-level.component.html',\r\n styleUrl: './grouping-level.component.scss',\r\n})\r\nexport class GroupingLevelComponent {\r\n @Input() group!: GroupingLevelValue;\r\n @Input() groupsData: any[] = [];\r\n // All grps to prevent sending duplicated grps in each level to the server\r\n @Input() allGroups: GroupingLevelValue[] = [];\r\n @Input() label?: string;\r\n @Output() groupingChanged = new EventEmitter<string>();\r\n @Output() newPageChanged = new EventEmitter<boolean>();\r\n\r\n private readonly cdr = inject(ChangeDetectorRef);\r\n private readonly adapter = inject(FORM_NAVIGATOR_ADAPTER);\r\n\r\n onGroupingChanged(e: any) {\r\n const selected = e.value;\r\n\r\n const isDuplicate =\r\n !!selected &&\r\n this.allGroups.some(\r\n (g) => g !== this.group && g.groupingFieldName === selected,\r\n );\r\n\r\n if (isDuplicate) {\r\n this.adapter.notify('error', this.adapter.translate('2509', 'لا يجوز اختيار نفس حقل التجميع في أكثر من مستوى تجميع'));\r\n setTimeout(() => {\r\n this.group.groupingFieldName = '';\r\n this.cdr.detectChanges();\r\n });\r\n\r\n return;\r\n }\r\n\r\n this.groupingChanged.emit(selected);\r\n }\r\n\r\n onNewPageChanged(e: any) {\r\n this.newPageChanged.emit(e.value);\r\n }\r\n\r\n getDisplayText = (item: any): string => {\r\n if (!item) return '';\r\n\r\n return (\r\n item.caption_Ar ??\r\n item.item_Name_Ar ??\r\n item.name_Ar ??\r\n item.title_Ar ??\r\n item.text ??\r\n item.name ??\r\n ''\r\n );\r\n };\r\n}\r\n","<!-- <div class=\"flex items-center gap-3\">\r\n <dx-select-box\r\n [dataSource]=\"groupsData\"\r\n displayExpr=\"title\"\r\n valueExpr=\"groupingFieldName\"\r\n [showClearButton]=\"true\"\r\n [(value)]=\"group.groupingFieldName\"\r\n (onValueChanged)=\"onGroupingChanged($event)\"\r\n >\r\n </dx-select-box>\r\n\r\n <dx-check-box\r\n text=\"صفحة جديدة\"\r\n [(value)]=\"group.isNewPage\"\r\n ></dx-check-box>\r\n</div> -->\r\n\r\n<div class=\"grouping-level\">\r\n <!-- wrapItemText: a long field title wraps inside the list instead of being cut to\r\n «مخ…» when the box is narrow (phones). -->\r\n <dx-select-box\r\n class=\"grouping-level__field\"\r\n [dataSource]=\"groupsData\"\r\n [displayExpr]=\"getDisplayText\"\r\n valueExpr=\"group_Expression\"\r\n [showClearButton]=\"true\"\r\n [wrapItemText]=\"true\"\r\n [(value)]=\"group.groupingFieldName\"\r\n (onValueChanged)=\"onGroupingChanged($event)\"\r\n [placeholder]=\"'groupsData.DisplayText' | localize: '-- بدون تجميع --'\"\r\n >\r\n </dx-select-box>\r\n\r\n <dx-check-box\r\n class=\"grouping-level__new-page\"\r\n [text]=\"'ui.grouping-level.1' | localize: 'صفحة جديدة'\"\r\n [(value)]=\"group.isNewPage\"\r\n (onValueChanged)=\"onNewPageChanged($event)\"\r\n ></dx-check-box>\r\n</div>\r\n","import {\r\n Component,\r\n EventEmitter,\r\n forwardRef,\r\n Input,\r\n Output,\r\n} from '@angular/core';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { DxButtonModule, DxLoadIndicatorModule } from 'devextreme-angular';\r\n\r\nconst IMAGE_TYPE = {\r\n BinaryImage: 1,\r\n ImageUrl: 2,\r\n Base64Image: 3,\r\n} as const;\r\n\r\n@Component({\r\n selector: 'app-image-edit',\r\n standalone: true,\r\n imports: [DxButtonModule, DxLoadIndicatorModule],\r\n templateUrl: './image-edit.component.html',\r\n styleUrl: './image-edit.component.scss',\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => ImageEditComponent),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class ImageEditComponent implements ControlValueAccessor {\r\n /**\r\n * Formats a canvas cannot re-encode without destroying the file: SVG would be rasterised and\r\n * lose its scalability, GIF would lose every frame but the first. They are passed through at\r\n * their original size instead.\r\n */\r\n private static readonly PASSTHROUGH_TYPES = ['image/svg+xml', 'image/gif'];\r\n\r\n imageSrc: string | null = null;\r\n\r\n /** True while the picked file is being read and downscaled — before any HTTP call happens. */\r\n processing = false;\r\n\r\n /** Set when a file is refused (too large, or not a readable image). */\r\n errorMessage: string | null = null;\r\n\r\n @Input() width: number = 150;\r\n @Input() height: number = 150;\r\n\r\n /** ✅ القراءة فقط — تمنع أي تفاعل (رفع/مسح/تغيير) */\r\n @Input() readOnly: boolean = false;\r\n\r\n @Input() attachmentsRelativePath!: string;\r\n @Input() imageType!: number;\r\n\r\n /**\r\n * Longest edge, in pixels, the picture is downscaled to before it is emitted.\r\n *\r\n * A phone photo is 3000-4000px wide and several megabytes; base64 adds another third, and the\r\n * whole thing travels inside the entity's own save request over the user's UPLOAD link — which\r\n * is what made saving take seconds regardless of the storage provider. Nothing in the app\r\n * displays an image larger than a few hundred pixels, so 1600 is already generous.\r\n *\r\n * Set to 0 to keep the original resolution.\r\n */\r\n @Input() maxDimension: number = 1600;\r\n\r\n /** JPEG quality used when re-encoding. 0.85 is visually lossless at these sizes. */\r\n @Input() quality: number = 0.85;\r\n\r\n /**\r\n * Refuse a file larger than this before reading it at all. The server enforces its own limit\r\n * from AttachmentSettings.FileSize; this only avoids spending seconds reading a file that would\r\n * be rejected anyway — or exceeding the request body limit, which surfaces as a bare 413.\r\n * Set to 0 to disable.\r\n */\r\n @Input() maxFileSizeMb: number = 25;\r\n\r\n @Input() base64!: string;\r\n @Output() base64Change = new EventEmitter<string>();\r\n\r\n @Input() fileName!: string;\r\n @Output() fileNameChange = new EventEmitter<string>();\r\n\r\n @Output() Changed = new EventEmitter<void>();\r\n @Output() Upload = new EventEmitter<void>();\r\n @Output() Clear = new EventEmitter<void>();\r\n\r\n /** Emitted with a human-readable reason when a picked file is refused. */\r\n @Output() Rejected = new EventEmitter<string>();\r\n\r\n get iconHeight(): number {\r\n return this.height * 0.25;\r\n }\r\n\r\n get imageHeight(): number {\r\n return this.height * 0.75;\r\n }\r\n\r\n get fontSize(): number {\r\n return this.height * 0.14;\r\n }\r\n\r\n private onChange: (value: string | null) => void = () => {};\r\n private onTouched: () => void = () => {};\r\n\r\n writeValue(value: string | null): void {\r\n if (typeof value === 'undefined' || value === null) {\r\n this.imageSrc = null;\r\n return;\r\n }\r\n\r\n if (this.imageType === IMAGE_TYPE.ImageUrl) {\r\n // A stored value is normally a provider-neutral storage key (\"2026/08/<guid>_x.png\")\r\n // that gets prefixed with the content base URL. It can also already be absolute — a\r\n // hyperlink attachment, or a data URL left over from a field that used to be Base64 —\r\n // in which case prefixing would corrupt it.\r\n this.imageSrc = value ? (this.isAbsolute(value) ? value : this.attachmentsRelativePath + value) : null;\r\n } else if (this.imageType === IMAGE_TYPE.BinaryImage) {\r\n this.imageSrc = value ? 'data:image/png;base64,' + value : null;\r\n } else {\r\n // Base64Image\r\n this.imageSrc = value || null;\r\n }\r\n }\r\n\r\n /** True for values the browser can already use unchanged (http/https/data URLs). */\r\n private isAbsolute(value: string): boolean {\r\n return /^(https?:\\/\\/|data:)/i.test(value);\r\n }\r\n\r\n registerOnChange(fn: any): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: any): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n /** ✅ احترام disabled من الـ FormControl إن وُجد */\r\n setDisabledState?(isDisabled: boolean): void {\r\n // لو الـ FormControl عمل disable، نعتبره ReadOnly إجبارًا\r\n if (isDisabled) {\r\n this.readOnly = true;\r\n }\r\n }\r\n\r\n /** رفع ملف جديد */\r\n async onFileSelected(event: Event): Promise<void> {\r\n if (this.readOnly || this.processing) return; // ✅ منع الرفع في وضع القراءة فقط\r\n\r\n const input = event.target as HTMLInputElement;\r\n const file = input?.files?.[0];\r\n\r\n // Cleared so picking the SAME file again still raises a change event.\r\n if (input) input.value = '';\r\n\r\n if (!file) return;\r\n\r\n this.errorMessage = null;\r\n\r\n if (this.maxFileSizeMb > 0 && file.size > this.maxFileSizeMb * 1024 * 1024) {\r\n this.reject(\r\n `حجم الملف ${(file.size / (1024 * 1024)).toFixed(1)} م.ب يتجاوز الحد المسموح ${this.maxFileSizeMb} م.ب`,\r\n );\r\n return;\r\n }\r\n\r\n this.processing = true;\r\n\r\n try {\r\n const originalDataUrl = await this.readAsDataUrl(file);\r\n\r\n const { dataUrl, mimeType } =\r\n ImageEditComponent.PASSTHROUGH_TYPES.includes(file.type) || this.maxDimension <= 0\r\n ? { dataUrl: originalDataUrl, mimeType: file.type }\r\n : await this.downscale(originalDataUrl);\r\n\r\n this.applyPickedImage(this.withExtension(file.name, mimeType), dataUrl);\r\n\r\n this.Upload.emit();\r\n this.Changed.emit();\r\n } catch {\r\n this.reject('تعذّر قراءة الملف. تأكّد أنه صورة صالحة.');\r\n } finally {\r\n this.processing = false;\r\n }\r\n }\r\n\r\n /**\r\n * Writes the picked image out in the shape the configured storage mode expects. All three modes\r\n * behave exactly as before — only the bytes are smaller.\r\n */\r\n private applyPickedImage(fileName: string, dataUrl: string): void {\r\n this.imageSrc = dataUrl;\r\n\r\n this.fileName = fileName;\r\n this.fileNameChange.emit(this.fileName);\r\n\r\n if (this.imageType === IMAGE_TYPE.BinaryImage) {\r\n // Mode 2 — the bytes live in the column itself: raw base64, no data-URL prefix.\r\n this.base64 = dataUrl.split(',')[1];\r\n this.base64Change.emit(this.base64);\r\n this.onChange(this.base64);\r\n } else if (this.imageType === IMAGE_TYPE.ImageUrl) {\r\n // Mode 1 — \"{fileName},{base64}\"; the server writes the file to the storage provider and\r\n // stores only the returned key. ImageHelper.SaveFileAsync recognises exactly this shape.\r\n this.base64 = fileName + ',' + dataUrl.split(',')[1];\r\n this.base64Change.emit(this.base64);\r\n this.onChange(this.base64);\r\n } else {\r\n // Mode 3 — Base64Image: the full data URL goes into a text column as-is.\r\n this.base64 = dataUrl;\r\n this.base64Change.emit(this.base64);\r\n this.onChange(this.imageSrc);\r\n }\r\n }\r\n\r\n private reject(message: string): void {\r\n this.errorMessage = message;\r\n this.Rejected.emit(message);\r\n }\r\n\r\n private readAsDataUrl(file: File): Promise<string> {\r\n return new Promise<string>((resolve, reject) => {\r\n const reader = new FileReader();\r\n reader.onload = () => resolve(reader.result as string);\r\n reader.onerror = () => reject(reader.error);\r\n reader.readAsDataURL(file);\r\n });\r\n }\r\n\r\n /**\r\n * Draws the picture onto a canvas at a bounded size and re-encodes it.\r\n *\r\n * Output format is decided rather than inherited:\r\n * <ul>\r\n * <li>BinaryImage mode always yields PNG, because reading that mode back builds a\r\n * <code>data:image/png;base64,</code> URL — emitting JPEG there would leave the column\r\n * and its declared type disagreeing.</li>\r\n * <li>Otherwise JPEG, unless the picture actually uses transparency, which JPEG cannot\r\n * represent and would turn into a black background.</li>\r\n * </ul>\r\n */\r\n private downscale(dataUrl: string): Promise<{ dataUrl: string; mimeType: string }> {\r\n return new Promise((resolve, reject) => {\r\n const image = new Image();\r\n\r\n image.onload = () => {\r\n const longestEdge = Math.max(image.width, image.height);\r\n const scale = longestEdge > this.maxDimension ? this.maxDimension / longestEdge : 1;\r\n\r\n const canvas = document.createElement('canvas');\r\n canvas.width = Math.max(1, Math.round(image.width * scale));\r\n canvas.height = Math.max(1, Math.round(image.height * scale));\r\n\r\n const context = canvas.getContext('2d');\r\n if (!context) {\r\n reject(new Error('canvas 2d context unavailable'));\r\n return;\r\n }\r\n\r\n context.drawImage(image, 0, 0, canvas.width, canvas.height);\r\n\r\n const mimeType =\r\n this.imageType === IMAGE_TYPE.BinaryImage || this.hasTransparency(context, canvas)\r\n ? 'image/png'\r\n : 'image/jpeg';\r\n\r\n resolve({\r\n dataUrl: canvas.toDataURL(mimeType, mimeType === 'image/jpeg' ? this.quality : undefined),\r\n mimeType,\r\n });\r\n };\r\n\r\n image.onerror = () => reject(new Error('not a decodable image'));\r\n image.src = dataUrl;\r\n });\r\n }\r\n\r\n /** Scans the alpha channel of the already-downscaled canvas; stops at the first transparent pixel. */\r\n private hasTransparency(context: CanvasRenderingContext2D, canvas: HTMLCanvasElement): boolean {\r\n const { data } = context.getImageData(0, 0, canvas.width, canvas.height);\r\n\r\n for (let i = 3; i < data.length; i += 4) {\r\n if (data[i] < 255) return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Re-encoding changes the format, so the name must follow. A file called <code>logo.png</code>\r\n * holding JPEG bytes would be stored under a misleading key and could be turned away by the\r\n * AllowedExtensions allow-list for a type it is not.\r\n */\r\n private withExtension(fileName: string, mimeType: string): string {\r\n const extension =\r\n mimeType === 'image/jpeg' ? '.jpg' : mimeType === 'image/png' ? '.png' : null;\r\n\r\n if (!extension) return fileName;\r\n\r\n const dot = fileName.lastIndexOf('.');\r\n const stem = dot > 0 ? fileName.slice(0, dot) : fileName;\r\n\r\n return stem + extension;\r\n }\r\n\r\n /** مسح الصورة (يحترم readOnly) */\r\n clearImage(): void {\r\n if (this.readOnly || this.processing) return; // ✅ منع المسح في وضع القراءة فقط\r\n this.clearImageInternal();\r\n }\r\n\r\n /**\r\n * The stored path resolved to a URL the browser could not load (e.g. a key copied from\r\n * another tenant's storage — the file does not exist here → 404). Fall back to the «No image»\r\n * placeholder instead of leaving a broken-image icon. Display-only: the bound value is left\r\n * untouched so a real save/clear still reflects the user's own action.\r\n */\r\n onImageError(): void {\r\n this.imageSrc = null;\r\n }\r\n\r\n /** مسح داخلي لا يراعي readOnly — يُستخدم داخليًا للـ writeValue(undefined) */\r\n private clearImageInternal(): void {\r\n this.imageSrc = null;\r\n this.base64 = '';\r\n this.fileName = '';\r\n this.errorMessage = null;\r\n\r\n this.onChange(null);\r\n this.base64Change.emit('');\r\n this.fileNameChange.emit('');\r\n\r\n this.Clear.emit();\r\n this.Changed.emit();\r\n }\r\n\r\n getBase64(byteArray: number[]): string {\r\n let binary = '';\r\n const bytes = new Uint8Array(byteArray);\r\n const len = bytes.byteLength;\r\n\r\n for (let i = 0; i < len; i++) {\r\n binary += String.fromCharCode(bytes[i]);\r\n }\r\n\r\n return window.btoa(binary);\r\n }\r\n}\r\n","<div class=\"image-edit-box\" [style.width.px]=\"width\">\r\n <div class=\"image-area\" [class.placeholder]=\"!imageSrc\" [style.height.px]=\"imageHeight\">\r\n @if (imageSrc && imageSrc !== 'undefined') {\r\n <img [src]=\"imageSrc\" [style.height.px]=\"height\" class=\"image-preview\" [attr.aria-readonly]=\"readOnly\" (error)=\"onImageError()\" />\r\n }\r\n @if (!imageSrc) {\r\n <div class=\"placeholder-text\">No image</div>\r\n }\r\n\r\n <!--\r\n Covers the gap the global HTTP load panel cannot: reading and downscaling the picked file\r\n happens entirely in the browser, before any request is made, and used to leave the screen\r\n looking frozen with nothing to explain it.\r\n -->\r\n @if (processing) {\r\n <div class=\"processing-overlay\">\r\n <dx-load-indicator [visible]=\"true\" [height]=\"24\" [width]=\"24\"></dx-load-indicator>\r\n <span class=\"processing-text\">جارٍ تجهيز الصورة…</span>\r\n </div>\r\n }\r\n </div>\r\n\r\n @if (errorMessage) {\r\n <div class=\"error-text\">{{ errorMessage }}</div>\r\n }\r\n\r\n @if (!readOnly) {\r\n <div class=\"upload-bar\" [style.height.px]=\"iconHeight\">\r\n <label class=\"upload-icon\" [class.disabled]=\"processing\">\r\n <input\r\n type=\"file\"\r\n accept=\"image/*\"\r\n (change)=\"onFileSelected($event)\"\r\n [disabled]=\"readOnly || processing\"\r\n hidden\r\n />\r\n <i class=\"dx-icon-folder\" [style.font-size.px]=\"fontSize\"></i>\r\n </label>\r\n\r\n @if (imageSrc) {\r\n <button\r\n type=\"button\"\r\n class=\"clear-button\"\r\n (click)=\"clearImage()\"\r\n [disabled]=\"readOnly || processing\"\r\n title=\"Clear\"\r\n >\r\n <i class=\"dx-icon-close clear-Icon\" [style.font-size.px]=\"fontSize\"></i>\r\n </button>\r\n }\r\n </div>\r\n }\r\n</div>\r\n","import { InjectionToken } from '@angular/core';\r\n\r\n/** Host-owned data and culture boundary for the journal entry viewer. */\r\nexport interface JournalEntryViewerProvider {\r\n getWithLines(entryId: string): Promise<any>;\r\n isArabic(): boolean;\r\n}\r\n\r\nexport const JOURNAL_ENTRY_VIEWER_PROVIDER = new InjectionToken<JournalEntryViewerProvider>(\r\n 'JOURNAL_ENTRY_VIEWER_PROVIDER',\r\n);\r\n","import { CommonModule } from '@angular/common';\r\nimport {\r\n Component,\r\n DoCheck,\r\n EventEmitter,\r\n Input,\r\n OnChanges,\r\n Output,\r\n SimpleChanges,\r\n} from '@angular/core';\r\nimport { DxDataGridModule } from 'devextreme-angular';\r\nimport { Inject } from '@angular/core';\r\nimport { NavigatorLocalizePipe } from '../form-navigator/navigator-localize.pipe';\r\nimport { JOURNAL_ENTRY_VIEWER_PROVIDER, JournalEntryViewerProvider } from './journal-entry-viewer-provider';\r\n\r\n\r\ninterface LoadedEntry {\r\n entry: any;\r\n isReversalRole: boolean;\r\n}\r\n\r\ninterface ViewerRow {\r\n id: string;\r\n entry_Id: string;\r\n entry_No: string;\r\n entry_Kind: string;\r\n journal_Name: string;\r\n line_No: number;\r\n main_Account_No: string;\r\n main_Account_Name: string;\r\n line_Nature_Name: string;\r\n line_Text: string;\r\n debit: number;\r\n credit: number;\r\n}\r\n\r\n\r\n@Component({\r\n selector: 'app-journal-entry-viewer',\r\n standalone: true,\r\n // الشبكة تأخذ البحث والتصدير وملخّص العدد والترقيم من الموجّه المشترك بمجرد\r\n // استيراده (مُحدِّده dx-data-grid)، فلا تُعلَن يدويًا.\r\n imports: [CommonModule, DxDataGridModule, NavigatorLocalizePipe],\r\n templateUrl: './journal-entry-viewer.component.html',\r\n // رقم القيد رابط (في الملخّص والشبكة) — نفس شكل روابط الشبكات في باقي الشاشات.\r\n styles: [\r\n `\r\n .jev-link {\r\n color: #1976d2;\r\n cursor: pointer;\r\n text-decoration: underline;\r\n }\r\n .jev-link:hover {\r\n opacity: 0.75;\r\n }\r\n `,\r\n ],\r\n})\r\nexport class JournalEntryViewerComponent implements OnChanges, DoCheck {\r\n @Input() entryId: string | null | undefined = null;\r\n /** Host route used when a user opens an entry from the viewer. */\r\n @Input() entryRoute = '/general-ledger/financial-transactions/form';\r\n\r\n @Input() gridHeight: number | string = 500;\r\n\r\n /** عدد سطور الصفحة في شبكة القيد. القيود الكبيرة (تشغيل إهلاك بسطرين لكل أصل) تحتاج ترقيماً. */\r\n @Input() pageSize = 10;\r\n\r\n\r\n\r\n @Input() set emptyText(value: string | null | undefined) {\r\n this._emptyText = value?.trim() || null;\r\n }\r\n get emptyText(): string | null {\r\n return this._emptyText;\r\n }\r\n private _emptyText: string | null = null;\r\n\r\n @Output() loaded = new EventEmitter<{\r\n transactionValue: number;\r\n netEffect: number;\r\n hasReversal: boolean;\r\n }>();\r\n\r\n isLoading = false;\r\n\r\n /** فشل تحميل قيد بعينه لا يمنع عرض الباقي — تُذكر أرقام المتعذّرة فقط. */\r\n failedCount = 0;\r\n\r\n /**\r\n * تُحفظ الـDTOs كما وصلت، والتحويل إلى صفوف يتم حسب اللغة الحالية وقت العرض.\r\n * لو ثُبِّتت اللغة وقت التحميل لظلّت أسماء اليومية والحسابات بلغتها القديمة بعد\r\n * تبديل لغة الواجهة والشاشة مفتوحة.\r\n */\r\n private loadedEntries: LoadedEntry[] = [];\r\n\r\n constructor(\r\n @Inject(JOURNAL_ENTRY_VIEWER_PROVIDER) private subledgerEntryService: JournalEntryViewerProvider,\r\n ) {}\r\n\r\n get isArabic(): boolean {\r\n return this.subledgerEntryService.isArabic();\r\n }\r\n\r\n /**\r\n * الصفوف والملخّص **خصائص لا getters**، تُبنى مرّة بعد وصول القيود.\r\n *\r\n * كـgetters كانت كل قراءة تُنشئ مصفوفة جديدة، فتقرأ DevExtreme مرجعًا مختلفًا في كل\r\n * دورة كشف تغيير وتفهم أن مصدر البيانات تبدّل فتبدأ تحميلًا جديدًا — فيعيد Angular\r\n * القراءة، وتدخل الشبكة دورة تحميل لا تنتهي رغم أن الطلبات ترجع 200.\r\n */\r\n rows: ViewerRow[] = [];\r\n summary: { entry_Id: string; entry_No: string; kind: string; isReversed: boolean }[] = [];\r\n\r\n /**\r\n * اللغة التي بُنيت بها الصفوف. تثبيت الصفوف يعني أن تبديل اللغة والشاشة مفتوحة لا\r\n * يُحدِّث أسماء اليومية والحسابات، فتُعاد البناء عند تغيّرها — مقارنة قيمة منطقية\r\n * واحدة في كل دورة، بلا إنشاء مصفوفات.\r\n */\r\n private builtForArabic: boolean | null = null;\r\n\r\n ngDoCheck(): void {\r\n if (this.builtForArabic !== null && this.builtForArabic !== this.isArabic) {\r\n this.rebuildView();\r\n }\r\n }\r\n\r\n private rebuildView(): void {\r\n const isAr = this.isArabic;\r\n\r\n this.summary = this.loadedEntries.map(({ entry, isReversalRole }) => ({\r\n entry_Id: entry.id,\r\n entry_No: entry.entry_No ?? '',\r\n kind: this.describe(isReversalRole, entry.is_Reversed ?? false, entry.is_Posted ?? true),\r\n isReversed: entry.is_Reversed ?? false,\r\n }));\r\n\r\n this.rows = this.loadedEntries.reduce<ViewerRow[]>((allRows, { entry, isReversalRole }) => {\r\n const kind = this.describe(isReversalRole, entry.is_Reversed ?? false, entry.is_Posted ?? true);\r\n const journalName =\r\n (isAr ? entry.journal_Name_Ar : entry.journal_Name_En) ??\r\n entry.journal_Name_Ar ??\r\n '';\r\n\r\n allRows.push(...(entry.lines ?? []).map((line) => ({\r\n id: line.id,\r\n entry_Id: entry.id,\r\n entry_No: entry.entry_No ?? '',\r\n entry_Kind: kind,\r\n journal_Name: journalName,\r\n line_No: line.line_No,\r\n main_Account_No: line.main_Account_No ?? '',\r\n main_Account_Name:\r\n (isAr ? line.main_Account_Name_Ar : line.main_Account_Name_En) ??\r\n line.main_Account_Name_Ar ??\r\n '',\r\n line_Nature_Name:\r\n (isAr ? line.line_Nature_Name_Ar : line.line_Nature_Name_En) ??\r\n line.line_Nature_Name_Ar ??\r\n '',\r\n line_Text:\r\n (isAr ? line.description_Ar : line.description_En) ??\r\n line.description_Ar ??\r\n '',\r\n debit: line.debit ?? 0,\r\n credit: line.credit ?? 0,\r\n })));\r\n return allRows;\r\n }, []);\r\n\r\n this.builtForArabic = isAr;\r\n }\r\n\r\n /** قيمة الحركة = مجموع مدين القيود الأصلية، من إجمالي الخادم لا بإعادة الجمع. */\r\n get transactionValue(): number {\r\n return this.loadedEntries\r\n .filter((e) => !e.isReversalRole)\r\n .reduce((total, e) => total + (e.entry.total_Debit ?? 0), 0);\r\n }\r\n\r\n /** الأصلي ناقص العكسي — يصير صفرًا بعد العكس، ومحسوب لا مكتوب. */\r\n get netEffect(): number {\r\n return this.loadedEntries.reduce(\r\n (total, e) =>\r\n e.isReversalRole\r\n ? total - (e.entry.total_Debit ?? 0)\r\n : total + (e.entry.total_Debit ?? 0),\r\n 0,\r\n );\r\n }\r\n\r\n get hasReversal(): boolean {\r\n return this.loadedEntries.some((e) => e.isReversalRole);\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['entryId']) void this.load();\r\n }\r\n\r\n /** يفتح القيد في شاشة القيود اليومية في تبويب جديد — نفس رابط كشف الحساب. */\r\n openEntry(entryId: string | null | undefined): void {\r\n if (!entryId) return;\r\n window.open(\r\n `${this.entryRoute}?mode=edit&id=${entryId}`,\r\n '_blank',\r\n );\r\n }\r\n\r\n /** تعيد التحميل بعد عملية غيّرت القيود (ترحيل أو عكس). */\r\n async reload(): Promise<void> {\r\n await this.load();\r\n }\r\n\r\n private async load(): Promise<void> {\r\n this.loadedEntries = [];\r\n this.rows = [];\r\n this.summary = [];\r\n this.failedCount = 0;\r\n\r\n if (!this.entryId) return;\r\n\r\n this.isLoading = true;\r\n\r\n const first = await this.fetch(this.entryId);\r\n\r\n if (!first) {\r\n this.isLoading = false;\r\n this.emitTotals();\r\n return;\r\n }\r\n\r\n if (first.is_Reversal && first.reverses_Entry_Id) {\r\n const original = await this.fetch(first.reverses_Entry_Id);\r\n if (original) this.loadedEntries.push({ entry: original, isReversalRole: false });\r\n\r\n this.loadedEntries.push({ entry: first, isReversalRole: true });\r\n } else {\r\n this.loadedEntries.push({ entry: first, isReversalRole: false });\r\n\r\n if (first.reversed_By_Entry_Id) {\r\n const reversal = await this.fetch(first.reversed_By_Entry_Id);\r\n if (reversal) this.loadedEntries.push({ entry: reversal, isReversalRole: true });\r\n }\r\n }\r\n\r\n this.rebuildView();\r\n this.isLoading = false;\r\n this.emitTotals();\r\n }\r\n\r\n private async fetch(\r\n id: string,\r\n ): Promise<any | null> {\r\n try {\r\n return await this.subledgerEntryService.getWithLines(id);\r\n } catch {\r\n this.failedCount++;\r\n return null;\r\n }\r\n }\r\n\r\n private emitTotals(): void {\r\n this.loaded.emit({\r\n transactionValue: this.transactionValue,\r\n netEffect: this.netEffect,\r\n hasReversal: this.hasReversal,\r\n });\r\n }\r\n\r\n /** «أصلي — معكوس» / «قيد عكسي — مرحّل»: النوع والحالة وجهان لوصف واحد. */\r\n // «معكوس» تغلب لأنها الحقيقة الأهم (أثر القيد أُلغي)، وإلا يُذكر هل وصل الأستاذ العام.\r\n // is_Posted الغائب (API أقدم لا يُرجعه) يُقرأ true فيبقى الوصف القديم كما كان.\r\n private describe(isReversalEntry: boolean, isReversedEntry: boolean, isPosted: boolean): string {\r\n const kind = isReversalEntry\r\n ? this.isArabic\r\n ? 'قيد عكسي'\r\n : 'Reversal'\r\n : this.isArabic\r\n ? 'أصلي'\r\n : 'Original';\r\n\r\n const state = isReversedEntry\r\n ? this.isArabic\r\n ? 'معكوس'\r\n : 'Reversed'\r\n : isPosted\r\n ? this.isArabic\r\n ? 'مرحّل'\r\n : 'Posted'\r\n : this.isArabic\r\n ? 'غير مرحّل'\r\n : 'Unposted';\r\n\r\n return `${kind} — ${state}`;\r\n }\r\n}\r\n","@if (isLoading) {\r\n <p class=\"text-muted text-center py-4\">\r\n {{ 'General.Loading' | localize: 'جارٍ التحميل...' }}\r\n </p>\r\n} @else if (failedCount > 0 && rows.length === 0) {\r\n <p class=\"text-danger text-center py-4\">\r\n {{ '2552' | localize: 'تعذّر تحميل قيد اليومية' }}\r\n </p>\r\n} @else if (rows.length === 0) {\r\n <p class=\"text-muted text-center py-4\">\r\n {{\r\n emptyText ||\r\n ('journalEntryViewer.empty' | localize: 'لا يوجد قيد محاسبي مرتبط بعد')\r\n }}\r\n </p>\r\n} @else {\r\n <!-- ملخّص: رقم كل قيد وصفته وحالته، بالترتيب الذي حُمِّل به. -->\r\n <div\r\n class=\"kt-card shadow-none flex items-center flex-row flex-wrap gap-4 p-2.5 rounded-lg bg-muted/70 mb-3\"\r\n >\r\n @for (item of summary; track item.entry_No) {\r\n <div class=\"flex items-center gap-1.5\">\r\n <span\r\n class=\"kt-badge kt-badge-sm kt-badge-secondary kt-badge-outline jev-link\"\r\n (click)=\"openEntry(item.entry_Id)\"\r\n >{{ item.entry_No }}</span\r\n >\r\n <span\r\n class=\"kt-badge kt-badge-sm kt-badge-outline\"\r\n [class.kt-badge-destructive]=\"item.isReversed\"\r\n [class.kt-badge-info]=\"!item.isReversed\"\r\n >{{ item.kind }}</span\r\n >\r\n </div>\r\n }\r\n </div>\r\n\r\n <!-- القيود في شبكة واحدة مسطّحة: رقم القيد وصفته واسم يوميته أعمدة في كل سطر،\r\n وإلا اختلطت سطور الأصلي بالعكسي بلا تمييز. -->\r\n <dx-data-grid\r\n [dataSource]=\"rows\"\r\n [showBorders]=\"true\"\r\n [showColumnLines]=\"true\"\r\n [rowAlternationEnabled]=\"true\"\r\n data-grid-name=\"JournalEntryViewerGrid\"\r\n keyExpr=\"id\"\r\n [columnAutoWidth]=\"true\"\r\n [allowColumnResizing]=\"true\"\r\n [columnResizingMode]=\"'widget'\"\r\n [width]=\"'100%'\"\r\n [height]=\"gridHeight\"\r\n >\r\n <dxo-paging [enabled]=\"true\" [pageSize]=\"pageSize\"></dxo-paging>\r\n <!-- أرقام الصفحات فقط: «العدد» في سطر الملخص يغني عن معلومات الصفحة،\r\n وحجم الصفحة تحدّده الشاشة المستضيفة (pageSize). -->\r\n <dxo-pager [visible]=\"true\" [showNavigationButtons]=\"true\"></dxo-pager>\r\n\r\n <dxi-column\r\n dataField=\"line_No\"\r\n [caption]=\"'846' | localize: '#'\"\r\n [width]=\"90\"\r\n ></dxi-column>\r\n <dxi-column\r\n dataField=\"entry_No\"\r\n [caption]=\"'2544' | localize: 'رقم القيد'\"\r\n [width]=\"190\"\r\n cellTemplate=\"entryNoLinkTemplate\"\r\n ></dxi-column>\r\n <!-- رقم القيد رابط يفتح القيد في شاشة القيود اليومية في تبويب جديد. -->\r\n <div *dxTemplate=\"let d of 'entryNoLinkTemplate'\">\r\n <span class=\"jev-link\" (click)=\"openEntry(d.data.entry_Id)\">{{ d.value }}</span>\r\n </div>\r\n <dxi-column\r\n dataField=\"entry_Kind\"\r\n [caption]=\"'2545' | localize: 'حالة القيد'\"\r\n [width]=\"170\"\r\n ></dxi-column>\r\n <dxi-column\r\n dataField=\"journal_Name\"\r\n [caption]=\"'2547' | localize: 'اسم اليومية'\"\r\n [width]=\"220\"\r\n ></dxi-column>\r\n <dxi-column\r\n dataField=\"main_Account_No\"\r\n [caption]=\"'847' | localize: 'رقم الحساب'\"\r\n [width]=\"150\"\r\n ></dxi-column>\r\n <dxi-column\r\n dataField=\"main_Account_Name\"\r\n [caption]=\"'857' | localize: 'اسم الحساب'\"\r\n [width]=\"180\"\r\n ></dxi-column>\r\n <dxi-column\r\n dataField=\"line_Nature_Name\"\r\n [caption]=\"'858' | localize: 'طبيعة'\"\r\n [width]=\"80\"\r\n ></dxi-column>\r\n <dxi-column\r\n dataField=\"line_Text\"\r\n [caption]=\"'848' | localize: 'البيان'\"\r\n ></dxi-column>\r\n <dxi-column\r\n dataField=\"debit\"\r\n [caption]=\"'849' | localize: 'مدين'\"\r\n dataType=\"number\"\r\n [format]=\"{ type: 'fixedPoint', precision: 2 }\"\r\n ></dxi-column>\r\n <dxi-column\r\n dataField=\"credit\"\r\n [caption]=\"'850' | localize: 'دائن'\"\r\n dataType=\"number\"\r\n [format]=\"{ type: 'fixedPoint', precision: 2 }\"\r\n ></dxi-column>\r\n\r\n <dxo-summary>\r\n <!-- العدد وبحث الشبكة والتصدير يضبطها AppGridDefaultsDirective، فلا تُعلن هنا.\r\n المذكور فقط ما يخصّ هذا العرض: إجمالي المدين والدائن. -->\r\n <dxi-total-item\r\n column=\"debit\"\r\n summaryType=\"sum\"\r\n [valueFormat]=\"{ type: 'fixedPoint', precision: 2 }\"\r\n displayFormat=\"{0}\"\r\n ></dxi-total-item>\r\n <dxi-total-item\r\n column=\"credit\"\r\n summaryType=\"sum\"\r\n [valueFormat]=\"{ type: 'fixedPoint', precision: 2 }\"\r\n displayFormat=\"{0}\"\r\n ></dxi-total-item>\r\n </dxo-summary>\r\n </dx-data-grid>\r\n\r\n <!-- مجموع المدين/الدائن أعلاه يقول إن القيود متوازنة، وقد يُقرأ خطأً على أن قيمة\r\n الحركة هي المجموع. هذا السطر يفصل الاثنين، والصافي محسوب من السطور. -->\r\n <div\r\n class=\"kt-card shadow-none flex items-center flex-row flex-wrap gap-4 p-2.5 rounded-lg bg-muted/70 mt-3\"\r\n >\r\n <div class=\"flex items-center gap-1.5\">\r\n <span class=\"text-muted-foreground\">{{\r\n '2548' | localize: 'قيمة الحركة'\r\n }}:</span>\r\n <span class=\"kt-badge kt-badge-sm kt-badge-secondary kt-badge-outline\">{{\r\n transactionValue | number: '1.2-2'\r\n }}</span>\r\n </div>\r\n @if (hasReversal) {\r\n <div class=\"flex items-center gap-1.5\">\r\n <span class=\"text-muted-foreground\">{{\r\n '2549' | localize: 'صافي أثر القيد والعكس'\r\n }}:</span>\r\n <span\r\n class=\"kt-badge kt-badge-sm kt-badge-outline\"\r\n [class.kt-badge-success]=\"netEffect === 0\"\r\n [class.kt-badge-destructive]=\"netEffect !== 0\"\r\n >{{ netEffect | number: '1.2-2' }}</span\r\n >\r\n </div>\r\n }\r\n </div>\r\n}\r\n","import {\r\n Component,\r\n EventEmitter,\r\n Input,\r\n OnDestroy,\r\n OnInit,\r\n Output,\r\n} from '@angular/core';\r\nimport {\r\n DxButtonModule,\r\n DxPopupModule,\r\n DxTextBoxModule,\r\n} from 'devextreme-angular';\r\n\r\nimport type * as LeafletNS from 'leaflet';\r\n\r\n@Component({\r\n selector: 'app-map-location-picker',\r\n imports: [DxTextBoxModule, DxPopupModule, DxButtonModule],\r\n templateUrl: './map-location-picker.component.html',\r\n styleUrl: './map-location-picker.component.scss',\r\n})\r\nexport class MapLocationPickerComponent implements OnInit, OnDestroy {\r\n // ============================================================\r\n // 🎯 الخصائص الأساسية (Inputs/Outputs)\r\n // ============================================================\r\n\r\n @Input() value: string | null | undefined = null;\r\n @Output() valueChange = new EventEmitter<string>();\r\n\r\n @Input() coordinates: string | null | undefined = null;\r\n @Output() coordinatesChange = new EventEmitter<string>();\r\n\r\n @Input() placeName: string | null | undefined = null;\r\n @Output() placeNameChange = new EventEmitter<string>();\r\n\r\n @Input() displayField: 'coordinates' | 'placeName' = 'coordinates';\r\n @Input() dataToSend: 'coordinates' | 'placeName' | 'both' = 'both';\r\n\r\n /** When no coordinates are saved, geocode this query (e.g. country name) to center the map */\r\n @Input() defaultSearchQuery?: string | null = null;\r\n\r\n /**\r\n * When true AND defaultSearchQuery resolves to an area, lock the map to that\r\n * area's bounds (pan + zoom + marker placement) so the user can't pick a point\r\n * outside it — e.g. restricting an address pin to the selected country. Opt-in:\r\n * defaults to false, so existing usages of this component are unaffected.\r\n */\r\n @Input() restrictToSearchArea = false;\r\n\r\n @Output() coordinatesSelected = new EventEmitter<string>();\r\n @Output() placeNameSelected = new EventEmitter<string>();\r\n @Output() locationSelected = new EventEmitter<\r\n string | { coordinates: string; placeName: string }\r\n >();\r\n\r\n // ============================================================\r\n // 🗺️ متغيرات الخريطة\r\n // ============================================================\r\n\r\n mapPopupVisible = false;\r\n\r\n // ✅ Leaflet loaded lazily\r\n private L?: typeof LeafletNS;\r\n\r\n private map?: LeafletNS.Map;\r\n private marker?: LeafletNS.Marker;\r\n private restrictBounds?: LeafletNS.LatLngBounds;\r\n private static iconsInitialized = false;\r\n\r\n mapButtonOptions: any;\r\n\r\n ngOnInit(): void {\r\n this.initializeValue();\r\n\r\n this.mapButtonOptions = {\r\n icon: 'map',\r\n hint: 'فتح الخريطة',\r\n stylingMode: 'text',\r\n onClick: () => {\r\n this.openPopup();\r\n },\r\n };\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.disposeMap();\r\n }\r\n\r\n private initializeValue(): void {\r\n if (this.displayField === 'coordinates' && this.coordinates) {\r\n this.value = this.coordinates;\r\n } else if (this.displayField === 'placeName' && this.placeName) {\r\n this.value = this.placeName;\r\n }\r\n }\r\n\r\n openPopup(): void {\r\n this.mapPopupVisible = true;\r\n }\r\n\r\n // ✅ load Leaflet when popup becomes visible / shown\r\n async onMapPopupShown(): Promise<void> {\r\n await this.ensureLeafletLoaded();\r\n\r\n setTimeout(async () => {\r\n const mapElement = document.getElementById('bp-map');\r\n if (!mapElement || !this.L) return;\r\n\r\n let lat = 30.0444;\r\n let lng = 31.2357;\r\n let zoom = 16;\r\n\r\n if (this.coordinates?.trim()) {\r\n const [ltStr, lnStr] = this.coordinates.split(',');\r\n const lt = parseFloat(ltStr);\r\n const ln = parseFloat(lnStr);\r\n if (!isNaN(lt) && !isNaN(ln)) {\r\n lat = lt;\r\n lng = ln;\r\n }\r\n }\r\n\r\n let boundingBox: number[] | null = null;\r\n if (!this.coordinates?.trim() && this.defaultSearchQuery?.trim()) {\r\n try {\r\n const url = `https://nominatim.openstreetmap.org/search?format=json&q=${encodeURIComponent(this.defaultSearchQuery)}&limit=1`;\r\n const res = await fetch(url, { credentials: 'omit' });\r\n const results: any[] = await res.json();\r\n if (results?.length) {\r\n const lt = parseFloat(results[0].lat);\r\n const ln = parseFloat(results[0].lon);\r\n if (!isNaN(lt) && !isNaN(ln)) {\r\n lat = lt;\r\n lng = ln;\r\n zoom = 6;\r\n }\r\n // Nominatim boundingbox = [south, north, west, east]\r\n const bb = (results[0].boundingbox ?? []).map((n: string) =>\r\n parseFloat(n),\r\n );\r\n if (bb.length === 4 && bb.every((n: number) => !isNaN(n))) {\r\n boundingBox = bb;\r\n }\r\n }\r\n } catch {\r\n // keep default coords on error\r\n }\r\n }\r\n\r\n this.disposeMap();\r\n mapElement.innerHTML = '';\r\n\r\n const L = this.L;\r\n\r\n this.map = L.map('bp-map', {\r\n center: [lat, lng],\r\n zoom,\r\n zoomControl: true,\r\n scrollWheelZoom: true,\r\n });\r\n\r\n L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {\r\n attribution: '© OpenStreetMap contributors',\r\n maxZoom: 19,\r\n }).addTo(this.map);\r\n\r\n // Lock the map to the searched area's bounds (opt-in) so the pin can't be\r\n // placed outside it — e.g. keep an address pin inside the selected country.\r\n this.restrictBounds = undefined;\r\n if (this.restrictToSearchArea && boundingBox) {\r\n const [south, north, west, east] = boundingBox;\r\n const bounds = L.latLngBounds([south, west], [north, east]);\r\n this.restrictBounds = bounds;\r\n this.map.fitBounds(bounds);\r\n this.map.setMaxBounds(bounds.pad(0.05));\r\n this.map.setMinZoom(this.map.getBoundsZoom(bounds));\r\n }\r\n\r\n this.marker = L.marker([lat, lng], { draggable: true }).addTo(this.map);\r\n\r\n this.map.on('click', (ev: any) => {\r\n // Reject clicks outside the locked area.\r\n if (this.restrictBounds && !this.restrictBounds.contains(ev.latlng)) {\r\n return;\r\n }\r\n this.marker!.setLatLng(ev.latlng);\r\n });\r\n\r\n this.marker.on('dragend', () => {\r\n // If dragged outside the locked area, snap the pin back inside it.\r\n if (\r\n this.restrictBounds &&\r\n this.marker &&\r\n !this.restrictBounds.contains(this.marker.getLatLng())\r\n ) {\r\n this.marker.setLatLng(this.restrictBounds.getCenter());\r\n }\r\n });\r\n\r\n setTimeout(() => this.map?.invalidateSize(), 100);\r\n setTimeout(() => this.map?.invalidateSize(), 300);\r\n }, 500);\r\n }\r\n\r\n saveSelectedLocation(): void {\r\n if (this.marker && this.L) {\r\n this.updateCoordinatesAndFetchPlaceName(this.marker.getLatLng());\r\n }\r\n this.mapPopupVisible = false;\r\n }\r\n\r\n onMapPopupHiding(): void {\r\n this.disposeMap();\r\n }\r\n\r\n onTextChanged(e: any): void {\r\n this.value = e.value;\r\n this.valueChange.emit(this.value ?? '');\r\n }\r\n\r\n private updateCoordinatesAndFetchPlaceName(latlng: LeafletNS.LatLng): void {\r\n const lat = latlng.lat.toFixed(6);\r\n const lng = latlng.lng.toFixed(6);\r\n const coords = `${lat},${lng}`;\r\n\r\n this.coordinates = coords;\r\n this.coordinatesChange.emit(coords);\r\n this.coordinatesSelected.emit(coords);\r\n\r\n if (this.dataToSend === 'both' || this.dataToSend === 'placeName') {\r\n this.fetchPlaceName(latlng, coords);\r\n } else {\r\n this.emitLocationSelected(\r\n coords,\r\n this.placeName ?? `موقع على الخريطة (${coords})`\r\n );\r\n }\r\n }\r\n\r\n private fetchPlaceName(latlng: LeafletNS.LatLng, coords: string): void {\r\n const url =\r\n `https://nominatim.openstreetmap.org/reverse?format=json&lat=${latlng.lat}` +\r\n `&lon=${latlng.lng}&zoom=18&addressdetails=1&accept-language=ar`;\r\n\r\n fetch(url, { credentials: 'omit' })\r\n .then((res) => res.json())\r\n .then((result) => {\r\n const placeName = this.extractPlaceName(result, coords);\r\n\r\n if (this.dataToSend === 'both' || this.dataToSend === 'placeName') {\r\n this.placeName = placeName;\r\n this.placeNameChange.emit(placeName);\r\n this.placeNameSelected.emit(placeName);\r\n }\r\n\r\n this.emitLocationSelected(coords, placeName);\r\n })\r\n .catch((err) => {\r\n console.warn('فشل في جلب اسم المكان:', err);\r\n const fallback = `موقع على الخريطة (${coords})`;\r\n\r\n this.placeName = fallback;\r\n this.placeNameChange.emit(fallback);\r\n this.placeNameSelected.emit(fallback);\r\n\r\n this.emitLocationSelected(coords, fallback);\r\n });\r\n }\r\n\r\n private extractPlaceName(result: any, coords: string): string {\r\n if (!result || !result.display_name) {\r\n return `موقع على الخريطة (${coords})`;\r\n }\r\n\r\n const addr = result.address;\r\n if (addr) {\r\n const parts = [\r\n addr.road,\r\n addr.neighbourhood || addr.suburb,\r\n addr.city_district,\r\n addr.city || addr.town || addr.village,\r\n addr.state || addr.country,\r\n ].filter(Boolean);\r\n\r\n const placeName = parts.join('، ') || result.display_name;\r\n return placeName.length >= 10\r\n ? placeName.trim()\r\n : `موقع على الخريطة (${coords})`;\r\n }\r\n\r\n return String(result.display_name).trim();\r\n }\r\n\r\n private emitLocationSelected(coords: string, placeName: string): void {\r\n if (this.dataToSend === 'coordinates') {\r\n this.locationSelected.emit(coords);\r\n } else if (this.dataToSend === 'placeName') {\r\n this.locationSelected.emit(placeName);\r\n } else {\r\n this.locationSelected.emit({ coordinates: coords, placeName });\r\n }\r\n }\r\n\r\n private disposeMap(): void {\r\n if (this.map) {\r\n this.map.remove();\r\n this.map = undefined;\r\n this.marker = undefined;\r\n }\r\n }\r\n\r\n // ============================================================\r\n // ✅ Leaflet lazy loading + icons init\r\n // ============================================================\r\n private async ensureLeafletLoaded(): Promise<void> {\r\n if (this.L) return;\r\n\r\n const leaflet = await import('leaflet');\r\n this.L = (leaflet as any).default ?? (leaflet as any);\r\n\r\n this.ensureLeafletIcons();\r\n }\r\n\r\n private ensureLeafletIcons(): void {\r\n if (!this.L) return;\r\n if (MapLocationPickerComponent.iconsInitialized) return;\r\n\r\n const L = this.L;\r\n\r\n delete (L.Icon.Default.prototype as any)._getIconUrl;\r\n // The marker images ship under assets/vendors/leaflet/images (NOT\r\n // assets/leaflet/images, which exists but is empty) — pointing at the wrong\r\n // path left the default red marker broken/invisible on the map.\r\n L.Icon.Default.mergeOptions({\r\n iconRetinaUrl: 'assets/vendors/leaflet/images/marker-icon-2x.png',\r\n iconUrl: 'assets/vendors/leaflet/images/marker-icon.png',\r\n shadowUrl: 'assets/vendors/leaflet/images/marker-shadow.png',\r\n });\r\n\r\n MapLocationPickerComponent.iconsInitialized = true;\r\n }\r\n}\r\n","<div class=\"map-location-picker\">\r\n <dx-text-box\r\n [value]=\"value ?? ''\"\r\n (onValueChanged)=\"onTextChanged($event)\"\r\n [stylingMode]=\"'filled'\"\r\n >\r\n <dxi-button name=\"map\" location=\"after\" [options]=\"mapButtonOptions\">\r\n </dxi-button>\r\n </dx-text-box>\r\n\r\n <dx-popup\r\n [(visible)]=\"mapPopupVisible\"\r\n [width]=\"900\"\r\n [height]=\"600\"\r\n [showTitle]=\"true\"\r\n [dragEnabled]=\"false\"\r\n [shading]=\"true\"\r\n [hideOnOutsideClick]=\"false\"\r\n title=\"تحديد الموقع على الخريطة\"\r\n (onShown)=\"onMapPopupShown()\"\r\n (onHiding)=\"onMapPopupHiding()\"\r\n >\r\n <dxo-position at=\"center\" my=\"center\"></dxo-position>\r\n\r\n <div\r\n *dxTemplate=\"let data of 'content'\"\r\n class=\"map-location-picker-popup-content\"\r\n >\r\n <div id=\"bp-map\" class=\"map-location-picker-map\"></div>\r\n\r\n <div\r\n class=\"map-location-picker-actions\"\r\n >\r\n <dx-button\r\n text=\"إلغاء\"\r\n icon=\"close\"\r\n (onClick)=\"mapPopupVisible = false\"\r\n ></dx-button>\r\n\r\n <dx-button\r\n text=\"حفظ الموقع\"\r\n type=\"success\"\r\n icon=\"check\"\r\n (onClick)=\"saveSelectedLocation()\"\r\n ></dx-button>\r\n </div>\r\n </div>\r\n </dx-popup>\r\n</div>\r\n","import { CommonModule } from '@angular/common';\r\nimport { ChangeDetectorRef, Component, Input, inject } from '@angular/core';\r\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\r\nimport { DxPopupModule } from 'devextreme-angular';\r\n\r\nexport interface MessageContentPopupData {\r\n title?: string | null;\r\n subject?: string | null;\r\n body?: string | null;\r\n isHtml?: boolean | null;\r\n}\r\n\r\n/**\r\n * Generic viewer for a subject + body (HTML or plain text) shown in a modal.\r\n * Kept out of DynamicGridComponent so the grid stays free of message-specific\r\n * presentation concerns; any caller opens it via the public `open()` method.\r\n */\r\n@Component({\r\n selector: 'app-message-content-popup',\r\n standalone: true,\r\n imports: [CommonModule, DxPopupModule],\r\n templateUrl: './message-content-popup.component.html',\r\n styleUrl: './message-content-popup.component.scss',\r\n})\r\nexport class MessageContentPopupComponent {\r\n private readonly sanitizer = inject(DomSanitizer);\r\n private readonly cdr = inject(ChangeDetectorRef);\r\n\r\n @Input() defaultTitle = 'محتوى الرسالة';\r\n @Input() defaultSubject = 'الرسالة';\r\n @Input() subjectLabel = 'الموضوع:';\r\n @Input() bodyLabel = 'نص الرسالة:';\r\n\r\n visible = false;\r\n title = '';\r\n subject = '';\r\n bodyText = '';\r\n safeBody: SafeHtml = '';\r\n isHtml = false;\r\n\r\n open(data: MessageContentPopupData): void {\r\n this.title = data.title?.trim() || this.defaultTitle;\r\n this.subject = data.subject || this.defaultSubject;\r\n this.isHtml = !!data.isHtml;\r\n\r\n const rawBody = data.body ?? '';\r\n if (this.isHtml && rawBody) {\r\n this.safeBody = this.sanitizer.bypassSecurityTrustHtml(rawBody);\r\n this.bodyText = '';\r\n } else {\r\n this.bodyText = rawBody;\r\n this.safeBody = '';\r\n }\r\n\r\n this.visible = true;\r\n this.cdr.detectChanges();\r\n }\r\n\r\n close(): void {\r\n this.visible = false;\r\n }\r\n}\r\n","<dx-popup\r\n [(visible)]=\"visible\"\r\n [width]=\"'min(720px, 96vw)'\"\r\n [height]=\"'auto'\"\r\n [maxHeight]=\"'88vh'\"\r\n [showTitle]=\"true\"\r\n [title]=\"title\"\r\n [dragEnabled]=\"true\"\r\n [resizeEnabled]=\"true\"\r\n [showCloseButton]=\"true\"\r\n>\r\n <div *dxTemplate=\"let d of 'content'\" class=\"msg-popup\">\r\n <div class=\"msg-popup__header\">\r\n <strong class=\"msg-popup__label\">\r\n {{ subjectLabel }}\r\n </strong>\r\n\r\n <p class=\"msg-popup__subject\">\r\n {{ subject }}\r\n </p>\r\n </div>\r\n\r\n <div class=\"msg-popup__body\">\r\n <strong class=\"msg-popup__label\">\r\n {{ bodyLabel }}\r\n </strong>\r\n\r\n <div\r\n *ngIf=\"isHtml\"\r\n class=\"msg-popup__content\"\r\n [innerHTML]=\"safeBody\"\r\n ></div>\r\n\r\n <div\r\n *ngIf=\"!isHtml\"\r\n class=\"msg-popup__content msg-popup__content--text\"\r\n >\r\n {{ bodyText }}\r\n </div>\r\n </div>\r\n </div>\r\n</dx-popup>\r\n","export enum PermissionType { Allowed = 'allowed', Denied = 'denied' }\r\nexport interface PermissionItem {\r\n id: number; name_Ar: string; name_En: string; display_Order?: number;\r\n is_Disabled: boolean; allow_Rule_Id: number; deny_Rule_Id: number;\r\n}\r\nexport interface SecurityRuleItem { id: Number; security_Rule_Ar: string | null; security_Rule_En: string | null; }\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, EventEmitter, Input, Output, inject } from '@angular/core';\r\nimport {\r\n DxBoxModule,\r\n DxButtonModule,\r\n DxListModule,\r\n DxSelectBoxModule,\r\n} from 'devextreme-angular';\r\nimport { PermissionType, SecurityRuleItem } from '../permission-selector/permission.models';\r\nimport { REUSABLE_COMPONENTS_CONFIG } from '../reusable-components.config';\r\nexport type RuleChangeEvent = {\r\n permissionId: number;\r\n kind: 'allow' | 'deny';\r\n ruleId: number | null;\r\n};\r\n@Component({\r\n selector: 'app-permission-selector-item',\r\n standalone: true,\r\n imports: [\r\n DxListModule,\r\n DxBoxModule,\r\n DxButtonModule,\r\n DxSelectBoxModule,\r\n CommonModule,\r\n ],\r\n templateUrl: './permission-selector-item.component.html',\r\n styleUrl: './permission-selector-item.component.scss',\r\n})\r\nexport class PermissionSelectorItemComponent {\r\n private readonly config = inject(REUSABLE_COMPONENTS_CONFIG, { optional: true });\r\n\r\n // Bilingual lookup rows: show the UI language, falling back to the other one.\r\n readonly securityRuleExpr = (item: SecurityRuleItem | null): string => {\r\n if (!item) return '';\r\n const ar = item.security_Rule_Ar;\r\n const en = item.security_Rule_En;\r\n const isArabic = this.config?.isArabic?.() ?? true;\r\n const [first, second] = isArabic ? [ar, en] : [en, ar];\r\n return first?.trim() ? first : (second ?? '');\r\n };\r\n readonly securityRuleSearchExpr = (): string =>\r\n (this.config?.isArabic?.() ?? true) ? 'security_Rule_Ar' : 'security_Rule_En';\r\n\r\n /** ثابت لقراءة enum داخل القالب */\r\n public PermissionType = PermissionType;\r\n\r\n private readonly ALL_RULE_ID = 8;\r\n // ----- Inputs -----\r\n @Input() permissionId!: number;\r\n @Input() permissionName!: string;\r\n @Input() type!: PermissionType;\r\n\r\n /** هل هذا الـ permission مختار؟ */\r\n @Input() selected = false;\r\n\r\n /** هل هذا الـ permission معطّل (متضارب مع الجهة الأخرى)؟ */\r\n @Input() disabled = false;\r\n\r\n /** قائمة قواعد الأمان */\r\n @Input() securityRules: SecurityRuleItem[] = [];\r\n\r\n /** القيم الحالية للقواعد لهذا الـ permission */\r\n @Input() allowRuleId: number | null = null;\r\n @Input() denyRuleId: number | null = null;\r\n\r\n // ----- Outputs -----\r\n /** تغيّر حالة الـ checkbox */\r\n @Output() toggle = new EventEmitter<{\r\n permissionId: number;\r\n selected: boolean;\r\n }>();\r\n /** تغيّر القاعدة */\r\n @Output() ruleChanged = new EventEmitter<RuleChangeEvent>();\r\n\r\n // onToggle(e: Event) {\r\n // debugger;\r\n // const checked = (e.target as HTMLInputElement).checked;\r\n // if (this.disabled) {\r\n // (e.target as HTMLInputElement).checked = !checked;\r\n // return;\r\n // }\r\n // this.toggle.emit({ permissionId: this.permissionId, selected: checked });\r\n // }\r\n onToggle(ev: Event) {\r\n const checked = (ev.target as HTMLInputElement).checked;\r\n\r\n this.toggle.emit({ permissionId: this.permissionId, selected: checked });\r\n if (this.disabled) return;\r\n\r\n const kind: 'allow' | 'deny' =\r\n this.type === PermissionType.Allowed ? 'allow' : 'deny';\r\n\r\n const current = kind === 'allow' ? this.allowRuleId : this.denyRuleId;\r\n\r\n if (checked) {\r\n // 2) Checked=true\r\n if (current !== this.ALL_RULE_ID) {\r\n this.ruleChanged.emit({\r\n permissionId: this.permissionId,\r\n kind,\r\n ruleId: this.ALL_RULE_ID,\r\n });\r\n }\r\n } else {\r\n // 3) Checked=false\r\n if (current != null) {\r\n this.ruleChanged.emit({\r\n permissionId: this.permissionId,\r\n kind,\r\n ruleId: null,\r\n });\r\n }\r\n }\r\n }\r\n\r\n onRuleChanged(kind: 'allow' | 'deny', value: any) {\r\n if (this.disabled) return;\r\n const ruleId = value == null ? null : Number(value);\r\n this.ruleChanged.emit({ permissionId: this.permissionId, kind, ruleId });\r\n }\r\n\r\n // get tooltip(): string {\r\n // return this.disabled\r\n // ? `هذه الصلاحية مختارة في ${this.type === PermissionType.Allowed ? 'قائمة المنع' : 'قائمة السماح'}`\r\n // : '';\r\n // }\r\n}\r\n","<div class=\"permission-item\">\r\n <div class=\"line\">\r\n <label class=\"chk\">\r\n <input\r\n type=\"checkbox\"\r\n class=\"form-check-input\"\r\n [checked]=\"selected\"\r\n [disabled]=\"disabled\"\r\n (change)=\"onToggle($event)\"\r\n />\r\n </label>\r\n <div class=\"name\">{{ permissionName }}</div>\r\n <dx-select-box\r\n class=\"rule\"\r\n [dataSource]=\"securityRules\"\r\n [displayExpr]=\"securityRuleExpr\"\r\n [searchExpr]=\"securityRuleSearchExpr()\"\r\n valueExpr=\"id\"\r\n [value]=\"type === PermissionType.Allowed ? allowRuleId : denyRuleId\"\r\n [searchEnabled]=\"true\"\r\n [showClearButton]=\"true\"\r\n [disabled]=\"!selected || disabled\"\r\n [placeholder]=\"\r\n type === PermissionType.Allowed\r\n ? 'اختر قاعدة السماح'\r\n : 'اختر قاعدة المنع'\r\n \"\r\n (onValueChanged)=\"\r\n onRuleChanged(\r\n type === PermissionType.Allowed ? 'allow' : 'deny',\r\n $event.value\r\n )\r\n \"\r\n >\r\n </dx-select-box>\r\n </div>\r\n\r\n <!-- <div class=\"conflict\" *ngIf=\"disabled\">\r\n <i class=\"fas fa-exclamation-triangle\"></i>\r\n مختارة في {{ type === PermissionType.Allowed ? 'قائمة المنع' : 'قائمة السماح' }}\r\n </div> -->\r\n</div>\r\n","import { InjectionToken } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\n\r\n/** One field-level change entry — mirror of Flexora's `RecordChangeEntry`. */\r\nexport interface RecordChangeEntry {\r\n column_Name: string;\r\n old_Value?: string | null;\r\n new_Value?: string | null;\r\n changed_On: string;\r\n changed_By?: string | null;\r\n}\r\n\r\n/** Full change log of one record — mirror of Flexora's `RecordChangeLogResult`. */\r\nexport interface RecordChangeLogResult {\r\n table_Name: string;\r\n record_Id: string;\r\n created_By?: string | null;\r\n created_On?: string | null;\r\n modified_By?: string | null;\r\n modified_On?: string | null;\r\n changes: RecordChangeEntry[];\r\n}\r\n\r\n/**\r\n * Host-supplied loader for the record change log popup. Shaped to match\r\n * Flexora's `RecordChangeLogService` structurally so the host can wire it with\r\n * `{ provide: RECORD_CHANGE_LOG_PROVIDER, useExisting: RecordChangeLogService }`.\r\n */\r\nexport interface RecordChangeLogProvider {\r\n getLog(tableName: string, recordId: string): Observable<RecordChangeLogResult>;\r\n}\r\n\r\nexport const RECORD_CHANGE_LOG_PROVIDER =\r\n new InjectionToken<RecordChangeLogProvider>('RECORD_CHANGE_LOG_PROVIDER');\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, Inject } from '@angular/core';\r\nimport { DxDataGridModule, DxPopupModule } from 'devextreme-angular';\r\nimport { firstValueFrom } from 'rxjs';\r\nimport { NavigatorLocalizePipe } from '../form-navigator/navigator-localize.pipe';\r\nimport {\r\n RECORD_CHANGE_LOG_PROVIDER,\r\n RecordChangeEntry,\r\n RecordChangeLogProvider,\r\n RecordChangeLogResult,\r\n} from './record-change-log-provider';\r\n\r\n@Component({\r\n selector: 'app-record-change-log-popup',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n DxPopupModule,\r\n DxDataGridModule,\r\n NavigatorLocalizePipe,\r\n ],\r\n templateUrl: './record-change-log-popup.component.html',\r\n styleUrl: './record-change-log-popup.component.scss',\r\n})\r\nexport class RecordChangeLogPopupComponent {\r\n visible = false;\r\n loading = false;\r\n displayId = '';\r\n result: RecordChangeLogResult | null = null;\r\n\r\n constructor(\r\n @Inject(RECORD_CHANGE_LOG_PROVIDER)\r\n private provider: RecordChangeLogProvider,\r\n ) {}\r\n\r\n get changes(): RecordChangeEntry[] {\r\n return this.result?.changes ?? [];\r\n }\r\n\r\n /**\r\n * @param tableName اسم جدول السجل (مثل cash_transfer)\r\n * @param recordId معرف السجل (id)\r\n * @param displayId معرف معروض في العنوان (الكود مثلًا) — اختياري\r\n */\r\n async open(\r\n tableName: string,\r\n recordId: string,\r\n displayId?: string,\r\n ): Promise<void> {\r\n this.displayId = displayId ?? recordId;\r\n this.result = null;\r\n this.visible = true;\r\n this.loading = true;\r\n try {\r\n this.result = await firstValueFrom(\r\n this.provider.getLog(tableName, recordId),\r\n );\r\n } finally {\r\n this.loading = false;\r\n }\r\n }\r\n\r\n close(): void {\r\n this.visible = false;\r\n }\r\n}\r\n","<dx-popup\r\n [(visible)]=\"visible\"\r\n [showTitle]=\"true\"\r\n [title]=\"\r\n ('recordChangeLog.title' | localize: 'سجل تغييرات السجل') +\r\n (displayId ? ' — ' + displayId : '')\r\n \"\r\n [width]=\"820\"\r\n [height]=\"'auto'\"\r\n [maxHeight]=\"'80vh'\"\r\n [dragEnabled]=\"true\"\r\n [hideOnOutsideClick]=\"true\"\r\n [showCloseButton]=\"true\"\r\n>\r\n <div *dxTemplate=\"let data of 'content'\">\r\n <div *ngIf=\"loading\" class=\"text-center p-5 opacity-70\">\r\n {{ 'workflow.loading' | localize: 'جارٍ التحميل…' }}\r\n </div>\r\n\r\n <ng-container *ngIf=\"!loading && result\">\r\n <!-- رأس التدقيق: الإنشاء وآخر تعديل -->\r\n <div\r\n class=\"grid grid-cols-1 md:grid-cols-2 gap-x-8 gap-y-1 rounded-md border border-gray-200 bg-slate-50 px-4 py-2.5 mb-3 text-[13px]\"\r\n >\r\n <span>\r\n <b>{{ 'recordChangeLog.createdBy' | localize: 'أنشئ بواسطة' }}:</b>\r\n {{ result.created_By || '—' }}\r\n </span>\r\n <span>\r\n <b>{{ 'recordChangeLog.createdOn' | localize: 'تاريخ الإنشاء' }}:</b>\r\n {{ result.created_On ? (result.created_On | date: 'dd-MM-yyyy HH:mm') : '—' }}\r\n </span>\r\n <span>\r\n <b>{{ 'recordChangeLog.modifiedBy' | localize: 'آخر تعديل بواسطة' }}:</b>\r\n {{ result.modified_By || '—' }}\r\n </span>\r\n <span>\r\n <b>{{ 'recordChangeLog.modifiedOn' | localize: 'تاريخ آخر تعديل' }}:</b>\r\n {{ result.modified_On ? (result.modified_On | date: 'dd-MM-yyyy HH:mm') : '—' }}\r\n </span>\r\n <span>\r\n <b>{{ 'recordChangeLog.recordId' | localize: 'معرف السجل' }}:</b>\r\n {{ result.record_Id }}\r\n </span>\r\n <span>\r\n <b>{{ 'recordChangeLog.table' | localize: 'الجدول' }}:</b>\r\n <code class=\"text-[12px]\" dir=\"ltr\">{{ result.table_Name }}</code>\r\n </span>\r\n </div>\r\n\r\n <!-- جدول التغييرات: عمود / قديم / جديد -->\r\n <dx-data-grid\r\n [dataSource]=\"changes\"\r\n [focusedRowEnabled]=\"false\"\r\n [showBorders]=\"true\"\r\n [showRowLines]=\"true\"\r\n [columnAutoWidth]=\"true\"\r\n [allowColumnResizing]=\"true\"\r\n [rowAlternationEnabled]=\"true\"\r\n [wordWrapEnabled]=\"true\"\r\n [noDataText]=\"\r\n 'recordChangeLog.noChanges' | localize: 'لا توجد تغييرات مسجلة لهذا السجل'\r\n \"\r\n [height]=\"'52vh'\"\r\n >\r\n <dxo-search-panel [visible]=\"true\"></dxo-search-panel>\r\n <dxi-column\r\n dataField=\"changed_By\"\r\n [caption]=\"'recordChangeLog.changedBy' | localize: 'عُدِّل بواسطة'\"\r\n [width]=\"140\"\r\n ></dxi-column>\r\n <dxi-column\r\n dataField=\"column_Name\"\r\n [caption]=\"'recordChangeLog.column' | localize: 'الحقل'\"\r\n [width]=\"180\"\r\n ></dxi-column>\r\n <dxi-column\r\n dataField=\"changed_On\"\r\n dataType=\"datetime\"\r\n format=\"dd-MM-yyyy HH:mm\"\r\n [caption]=\"'recordChangeLog.changedOn' | localize: 'تاريخ التعديل'\"\r\n [width]=\"140\"\r\n sortOrder=\"desc\"\r\n ></dxi-column>\r\n <dxi-column\r\n dataField=\"old_Value\"\r\n [caption]=\"'recordChangeLog.oldValue' | localize: 'القيمة القديمة'\"\r\n cellTemplate=\"oldValueTemplate\"\r\n ></dxi-column>\r\n <div *dxTemplate=\"let cell of 'oldValueTemplate'\">\r\n <span [class.opacity-40]=\"!cell.value\">{{ cell.value || '—' }}</span>\r\n </div>\r\n <dxi-column\r\n dataField=\"new_Value\"\r\n [caption]=\"'recordChangeLog.newValue' | localize: 'القيمة الجديدة'\"\r\n cellTemplate=\"newValueTemplate\"\r\n ></dxi-column>\r\n <div *dxTemplate=\"let cell of 'newValueTemplate'\">\r\n <span [class.opacity-40]=\"!cell.value\">{{ cell.value || '—' }}</span>\r\n </div>\r\n\r\n <dxo-paging [pageSize]=\"15\"></dxo-paging>\r\n </dx-data-grid>\r\n </ng-container>\r\n </div>\r\n</dx-popup>\r\n","import { CommonModule } from '@angular/common';\r\nimport {\r\n ChangeDetectorRef,\r\n Component,\r\n EventEmitter,\r\n Input,\r\n OnChanges,\r\n Output,\r\n SimpleChanges,\r\n} from '@angular/core';\r\nimport {\r\n DxBoxModule,\r\n DxButtonModule,\r\n DxListModule,\r\n DxSelectBoxModule,\r\n} from 'devextreme-angular';\r\nimport { PermissionItem, PermissionType, SecurityRuleItem } from './permission.models';\r\nimport {\r\n PermissionSelectorItemComponent,\r\n RuleChangeEvent,\r\n} from '../permission-selector-item/permission-selector-item.component';\r\n@Component({\r\n selector: 'app-permission-selector',\r\n standalone: true,\r\n imports: [\r\n DxListModule,\r\n DxBoxModule,\r\n DxButtonModule,\r\n PermissionSelectorItemComponent,\r\n DxSelectBoxModule,\r\n CommonModule,\r\n ],\r\n templateUrl: './permission-selector.component.html',\r\n styleUrl: './permission-selector.component.scss',\r\n})\r\nexport class PermissionSelectorComponent implements OnChanges {\r\n allowByPerm: any;\r\n denyByPerm: any;\r\n public PermissionType = PermissionType;\r\n constructor(private cd: ChangeDetectorRef) {}\r\n /**\r\n * Layout mode for permission items.\r\n * - 'list': normal stacked list\r\n * - 'grid': responsive grid (better when there are many permissions)\r\n */\r\n @Input() layout: 'list' | 'grid' = 'list';\r\n /** Minimum width for a grid item (px) when layout='grid' */\r\n @Input() gridMinItemWidth = 260;\r\n @Input() type!: PermissionType;\r\n @Input() permissions: PermissionItem[] = [];\r\n @Input() userPermissionIds: number[] = [];\r\n\r\n @Output() permissionsChanged = new EventEmitter<number[]>();\r\n @Input() conflictingPermissionIds: number[] = [];\r\n permissionsList: any[] = []; // علشان نعرض القيم الحالية للـ rules\r\n @Input() userPermissions: Array<{\r\n permission_Id: number;\r\n allow_Rule_Id: number | null;\r\n deny_Rule_Id: number | null;\r\n }> = [];\r\n @Input() securityRules: SecurityRuleItem[] = [];\r\n @Output() ruleChanged = new EventEmitter<RuleChangeEvent>();\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['permissions']) {\r\n this.updatePermissionsList();\r\n }\r\n if (changes['userPermissionIds'] || changes['conflictingPermissionIds']) {\r\n this.cd.detectChanges();\r\n }\r\n }\r\n\r\n private updatePermissionsList() {\r\n if (!this.permissions || !Array.isArray(this.permissions)) {\r\n this.permissionsList = [];\r\n return;\r\n }\r\n\r\n this.permissionsList = [...this.permissions];\r\n }\r\n\r\n // تتبع العناصر للأداء\r\n trackByPermissionId(index: number, item: PermissionItem): number {\r\n return item.id;\r\n }\r\n\r\n // حالة اختيار وتعطيل\r\n isSelected = (id: number) => this.userPermissionIds.includes(id);\r\n isDisabled = (id: number) => this.conflictingPermissionIds.includes(id);\r\n\r\n // إرجاع ruleId الحالي\r\n getRuleId(id: number, kind: 'allow' | 'deny'): number | null {\r\n const hit = this.userPermissions.find((x) => x.permission_Id === id);\r\n if (!hit) return null;\r\n return kind === 'allow'\r\n ? (hit.allow_Rule_Id ?? null)\r\n : (hit.deny_Rule_Id ?? null);\r\n }\r\n // استلام toggle من الابن\r\n onToggleItem(e: { permissionId: number; selected: boolean }) {\r\n const { permissionId, selected } = e;\r\n if (this.isDisabled(permissionId)) return;\r\n\r\n let next = [...this.userPermissionIds];\r\n if (selected) {\r\n if (!next.includes(permissionId)) next.push(permissionId);\r\n } else {\r\n next = next.filter((id) => id !== permissionId);\r\n }\r\n this.userPermissionIds = next;\r\n this.permissionsChanged.emit(next);\r\n\r\n setTimeout(() => this.cd.detectChanges(), 0);\r\n }\r\n\r\n // تمرير تغيير القاعدة للأب الأعلى كما هو\r\n onRuleChangedFromItem(e: RuleChangeEvent) {\r\n if (this.isDisabled(e.permissionId)) return;\r\n this.ruleChanged.emit(e);\r\n }\r\n}\r\n","<div class=\"permissions-container\">\r\n <div class=\"permissions-header mb-2\">\r\n <strong>{{ type === PermissionType.Allowed ? 'صلاحيات مسموحة' : 'صلاحيات محظورة' }}</strong>\r\n </div>\r\n\r\n <div\r\n class=\"permissions-list\"\r\n [class.permissions-grid]=\"layout === 'grid'\"\r\n [style.--perm-grid-min.px]=\"gridMinItemWidth\"\r\n >\r\n <app-permission-selector-item\r\n *ngFor=\"let p of permissionsList; trackBy: trackByPermissionId\"\r\n [permissionId]=\"p.id\"\r\n [permissionName]=\"p.name_Ar\"\r\n [type]=\"type\"\r\n [selected]=\"isSelected(p.id)\"\r\n [disabled]=\"isDisabled(p.id)\"\r\n [securityRules]=\"securityRules\"\r\n [allowRuleId]=\"getRuleId(p.id, 'allow')\"\r\n [denyRuleId]=\"getRuleId(p.id, 'deny')\"\r\n (toggle)=\"onToggleItem($event)\"\r\n (ruleChanged)=\"onRuleChangedFromItem($event)\">\r\n </app-permission-selector-item>\r\n </div>\r\n</div>\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n EventEmitter,\r\n Input,\r\n Output,\r\n} from '@angular/core';\r\nimport { NavigatorLocalizePipe } from '../form-navigator/navigator-localize.pipe';\r\nimport { AppToolbarComponent } from '../app-toolbar/app-toolbar.component';\r\nimport { AppToolbarItemComponent } from '../app-toolbar/app-toolbar-item.component';\r\n\r\n@Component({\r\n selector: 'app-query-actions-toolbar',\r\n standalone: true,\r\n imports: [AppToolbarComponent, AppToolbarItemComponent, NavigatorLocalizePipe],\r\n templateUrl: './query-actions-toolbar.component.html',\r\n styleUrl: './query-actions-toolbar.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class QueryActionsToolbarComponent {\r\n @Input() runDisabled = false;\r\n @Input() clearDisabled = false;\r\n @Input() printDisabled = false;\r\n @Input() saveDisabled = false;\r\n /** شاشة بلا «حفظ تقرير» (مثل قائمة التدفقات النقدية) تُخفي الزرّ بدل أن تتركه معطَّلاً دائماً. */\r\n @Input() showSave = true;\r\n\r\n @Output() run = new EventEmitter<void>();\r\n @Output() clear = new EventEmitter<void>();\r\n @Output() print = new EventEmitter<void>();\r\n @Output() save = new EventEmitter<void>();\r\n\r\n onRunClick = (): void => this.run.emit();\r\n onClearClick = (): void => this.clear.emit();\r\n onPrintClick = (): void => this.print.emit();\r\n onSaveClick = (): void => this.save.emit();\r\n}\r\n","<!--\r\n Query action rail (DESIGN.html §6) — the same rules as the form's commit rail, with\r\n the labels visible (an icon-only ring of four identical circles told the user nothing\r\n until hovered):\r\n تشغيل التقرير → Fill / brand (contained + default) — the ONE filled button\r\n عرض التقرير → Outline (outlined)\r\n حفظ التقرير → Outline (outlined)\r\n مسح الشروط → Bare / danger (text + danger), alone in the opposite corner\r\n Weight and colour come from stylingMode/type through flexora-buttons.scss — no\r\n screen CSS; the `qa-*` classes and their mixins are gone.\r\n On phones the rail is ONE row of compact icon squares (app-toolbar `fx-toolbar--compact`);\r\n «تشغيل التقرير» keeps its label while there is room.\r\n-->\r\n<app-toolbar containerClass=\"fx-toolbar--compact\">\r\n <app-toolbar-item\r\n location=\"before\"\r\n widget=\"dxButton\"\r\n [options]=\"{\r\n text: 'qry.action.run' | localize: 'تشغيل التقرير',\r\n hint: 'qry.action.run' | localize: 'تشغيل التقرير',\r\n icon: 'triangleright',\r\n type: 'default',\r\n stylingMode: 'contained',\r\n disabled: runDisabled,\r\n onClick: onRunClick,\r\n }\"\r\n ></app-toolbar-item>\r\n\r\n <app-toolbar-item\r\n location=\"before\"\r\n widget=\"dxButton\"\r\n [options]=\"{\r\n text: 'General.ViewReport.Label' | localize: 'عرض التقرير',\r\n hint: 'General.ViewReport.Label' | localize: 'عرض التقرير',\r\n icon: 'print',\r\n stylingMode: 'outlined',\r\n disabled: printDisabled,\r\n onClick: onPrintClick,\r\n }\"\r\n ></app-toolbar-item>\r\n\r\n @if (showSave) {\r\n <app-toolbar-item\r\n location=\"before\"\r\n widget=\"dxButton\"\r\n [options]=\"{\r\n text: 'qry.action.saveReport' | localize: 'حفظ التقرير',\r\n hint: 'qry.action.saveReport' | localize: 'حفظ التقرير',\r\n icon: 'save',\r\n stylingMode: 'outlined',\r\n disabled: saveDisabled,\r\n onClick: onSaveClick,\r\n }\"\r\n ></app-toolbar-item>\r\n }\r\n\r\n <app-toolbar-item\r\n location=\"after\"\r\n widget=\"dxButton\"\r\n [options]=\"{\r\n text: 'ds.action.clear' | localize: 'مسح الشروط',\r\n hint: 'ds.action.clear' | localize: 'مسح الشروط',\r\n icon: 'clear',\r\n type: 'danger',\r\n stylingMode: 'text',\r\n disabled: clearDisabled,\r\n onClick: onClearClick,\r\n }\"\r\n ></app-toolbar-item>\r\n</app-toolbar>\r\n","// Drawing helpers for the receipt preview — no dependency (the app ships no barcode/QR library).\r\n//\r\n// encodeCode128B: a real, scannable Code 128 (subset B) for the receipt number.\r\n// qrPlaceholderModules: NOT a QR code — a 25×25 picture laid out like one (finder squares,\r\n// timing lines, alignment square) so it reads as \"a QR goes here\". The real QR carries the\r\n// e-invoice data, which exists only once a sale is made.\r\n\r\n// Code 128 bar/space widths for symbol values 0–106 (each sums to 11 modules; stop = 13).\r\nconst CODE128_PATTERNS: readonly string[] = [\r\n '212222', '222122', '222221', '121223', '121322', '131222', '122213', '122312', '132212', '221213',\r\n '221312', '231212', '112232', '122132', '122231', '113222', '123122', '123221', '223211', '221132',\r\n '221231', '213212', '223112', '312131', '311222', '321122', '321221', '312212', '322112', '322211',\r\n '212123', '212321', '232121', '111323', '131123', '131321', '112313', '132113', '132311', '211313',\r\n '231113', '231311', '112133', '112331', '132131', '113123', '113321', '133121', '313121', '211331',\r\n '231131', '213113', '213311', '213131', '311123', '311321', '331121', '312113', '312311', '332111',\r\n '314111', '221411', '431111', '111224', '111422', '121124', '121421', '141122', '141221', '112214',\r\n '112412', '122114', '122411', '142112', '142211', '241211', '221114', '413111', '241112', '134111',\r\n '111242', '121142', '121241', '114212', '124112', '124211', '411212', '421112', '421211', '212141',\r\n '214121', '412121', '111143', '111341', '131141', '114113', '114311', '411113', '411311', '113141',\r\n '114131', '311141', '411131', '211412', '211214', '211232', '2331112',\r\n];\r\n\r\nconst START_B = 104;\r\nconst STOP = 106;\r\n/** Quiet zone each side, in modules (the standard asks for at least 10). */\r\nconst QUIET_ZONE = 10;\r\n\r\nexport interface BarRect {\r\n x: number;\r\n width: number;\r\n}\r\n\r\nexport interface Code128Drawing {\r\n /** Bars only, in module units from the left edge (quiet zones included in `totalWidth`). */\r\n bars: BarRect[];\r\n totalWidth: number;\r\n}\r\n\r\n/**\r\n * Code 128 subset B: printable ASCII 32–126. Value = char code − 32; checksum =\r\n * (start + Σ value × position) mod 103. Returns null for text outside subset B.\r\n */\r\nexport function encodeCode128B(text: string): Code128Drawing | null {\r\n const values: number[] = [];\r\n for (const ch of text) {\r\n const code = ch.charCodeAt(0);\r\n if (code < 32 || code > 126) return null;\r\n values.push(code - 32);\r\n }\r\n\r\n let checksum = START_B;\r\n values.forEach((v, i) => (checksum += v * (i + 1)));\r\n checksum %= 103;\r\n\r\n const symbols = [START_B, ...values, checksum, STOP];\r\n\r\n const bars: BarRect[] = [];\r\n let x = QUIET_ZONE;\r\n for (const symbol of symbols) {\r\n const pattern = CODE128_PATTERNS[symbol];\r\n for (let i = 0; i < pattern.length; i++) {\r\n const width = Number(pattern[i]);\r\n if (i % 2 === 0) bars.push({ x, width }); // even positions are bars, odd are spaces\r\n x += width;\r\n }\r\n }\r\n\r\n return { bars, totalWidth: x + QUIET_ZONE };\r\n}\r\n\r\nconst QR_SIZE = 25; // version 2\r\n\r\n/**\r\n * Dark-module coordinates of a QR-shaped placeholder: the three 7×7 finder squares with their\r\n * white separators, the timing lines on row/column 6, the 5×5 alignment square at (18,18), and a\r\n * deterministic scatter elsewhere (seeded from `seed`, so it never flickers between redraws).\r\n */\r\nexport function qrPlaceholderModules(seed: string): { size: number; dark: [number, number][] } {\r\n const reserved = new Set<string>();\r\n const dark: [number, number][] = [];\r\n const key = (r: number, c: number) => `${r},${c}`;\r\n\r\n const finder = (top: number, left: number) => {\r\n for (let r = -1; r <= 7; r++) {\r\n for (let c = -1; c <= 7; c++) {\r\n const rr = top + r;\r\n const cc = left + c;\r\n if (rr < 0 || cc < 0 || rr >= QR_SIZE || cc >= QR_SIZE) continue;\r\n reserved.add(key(rr, cc));\r\n const ring = r >= 0 && r <= 6 && c >= 0 && c <= 6 && (r === 0 || r === 6 || c === 0 || c === 6);\r\n const core = r >= 2 && r <= 4 && c >= 2 && c <= 4;\r\n if (ring || core) dark.push([rr, cc]);\r\n }\r\n }\r\n };\r\n finder(0, 0);\r\n finder(0, QR_SIZE - 7);\r\n finder(QR_SIZE - 7, 0);\r\n\r\n // Alignment pattern centred at (18,18).\r\n for (let r = -2; r <= 2; r++) {\r\n for (let c = -2; c <= 2; c++) {\r\n reserved.add(key(18 + r, 18 + c));\r\n if (Math.max(Math.abs(r), Math.abs(c)) !== 1) dark.push([18 + r, 18 + c]);\r\n }\r\n }\r\n\r\n // Timing patterns between the finders.\r\n for (let i = 8; i < QR_SIZE - 8; i++) {\r\n for (const [r, c] of [[6, i], [i, 6]] as [number, number][]) {\r\n reserved.add(key(r, c));\r\n if (i % 2 === 0) dark.push([r, c]);\r\n }\r\n }\r\n\r\n // Deterministic scatter (32-bit FNV-1a seed, then xorshift).\r\n let state = 2166136261;\r\n for (const ch of seed) state = Math.imul(state ^ ch.charCodeAt(0), 16777619) >>> 0;\r\n const next = () => {\r\n state ^= state << 13;\r\n state ^= state >>> 17;\r\n state ^= state << 5;\r\n return (state >>> 0) / 4294967296;\r\n };\r\n for (let r = 0; r < QR_SIZE; r++) {\r\n for (let c = 0; c < QR_SIZE; c++) {\r\n if (reserved.has(key(r, c))) continue;\r\n if (next() < 0.48) dark.push([r, c]);\r\n }\r\n }\r\n\r\n return { size: QR_SIZE, dark };\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, Input, Inject, Optional } from '@angular/core';\r\nimport { NavigatorLocalizePipe } from '../form-navigator/navigator-localize.pipe';\r\nimport { REUSABLE_COMPONENTS_CONFIG, ReusableComponentsConfig } from '../reusable-components.config';\r\nimport { encodeCode128B, qrPlaceholderModules } from './receipt-codes';\r\n\r\n/**\r\n * Live preview of a retail receipt template (قوالب الإيصالات — §2 «معاينة الإيصال»).\r\n *\r\n * Reads the template straight from the form's data object, which every accordion section\r\n * shares by reference, so it redraws on each edit with no event wiring.\r\n *\r\n * What it models, and why:\r\n * - Thermal printers print a fixed number of characters per line, set by the paper width.\r\n * The paper is drawn that many characters wide (`ch` units, app font — a monospace font\r\n * has no proper Arabic glyphs), and header/footer lines longer than that count are cut —\r\n * exactly what the printer will do (§4.2) — and flagged.\r\n * - The sale itself is fixed sample data (the template has no transaction behind it).\r\n * - A chosen advanced report replaces the whole layout (§5.7), so the preview is dimmed\r\n * under a notice rather than pretending to show what will print.\r\n */\r\n\r\ntype ReceiptLang = 'ar' | 'en';\r\n\r\ninterface SampleLine {\r\n name: string;\r\n amount: string;\r\n}\r\n\r\n// Characters per line for each supported paper width (font A on common thermal printers).\r\nconst CHARS_PER_LINE: Record<number, number> = { 58: 32, 80: 48, 112: 64 };\r\nconst DEFAULT_PAPER_MM = 80;\r\n\r\n// Store-neutral on purpose: the template may belong to any store (or to all of them), so the\r\n// sample must not carry one store's prefix. Latin/digit runs are rendered direction-isolated.\r\nconst SAMPLE_RECEIPT_NO = 'T01-004921';\r\nconst SAMPLE_DATE = '2026-08-06';\r\nconst SAMPLE_TIME = '19:42';\r\n\r\n// One self-consistent sample sale: 895.40 − 17.20 = 878.20 (VAT-inclusive at 14%:\r\n// base 770.35 + tax 107.85), paid 900.00 cash ⇒ change 21.80; 878 points earned on a 3,450 balance.\r\nconst SAMPLE: Record<ReceiptLang, {\r\n receiptLabel: string;\r\n cashierLabel: string;\r\n cashier: string;\r\n lines: SampleLine[];\r\n totals: SampleLine[];\r\n tax: SampleLine[];\r\n due: SampleLine;\r\n payment: string;\r\n loyalty: string[];\r\n qr: string;\r\n copyOf: (n: number, of: number) => string;\r\n logo: string;\r\n}> = {\r\n ar: {\r\n receiptLabel: 'إيصال',\r\n cashierLabel: 'كاشير:',\r\n cashier: 'أحمد سمير',\r\n lines: [\r\n { name: 'زيت عافية ذرة 1 لتر × 2', amount: '160.00' },\r\n { name: 'أرز مصري فاخر 5 كجم × 1', amount: '145.00' },\r\n { name: 'لحم بتلو مفروم 1.240 كجم', amount: '508.40' },\r\n { name: 'مياه معدنية 1.5 لتر × 4', amount: '82.00' },\r\n ],\r\n totals: [\r\n { name: 'الإجمالي قبل الخصم', amount: '895.40' },\r\n { name: 'الخصم', amount: '17.20' },\r\n ],\r\n tax: [\r\n { name: 'الوعاء الخاضع 14٪', amount: '770.35' },\r\n { name: 'ضريبة القيمة المضافة 14٪', amount: '107.85' },\r\n ],\r\n due: { name: 'الإجمالي المستحق', amount: '878.20 ج.م' },\r\n payment: 'نقدي 900.00 · الباقي 21.80',\r\n loyalty: ['نقاط الولاء المكتسبة: 878', 'الرصيد بعد الإضافة: 4,328 نقطة'],\r\n qr: 'رمز QR للفاتورة الإلكترونية',\r\n copyOf: (n, of) => `نسخة ${n} من ${of}`,\r\n logo: 'الشعار',\r\n },\r\n en: {\r\n receiptLabel: 'Receipt',\r\n cashierLabel: 'Cashier:',\r\n cashier: 'Ahmed Samir',\r\n lines: [\r\n { name: 'Afia corn oil 1 L × 2', amount: '160.00' },\r\n { name: 'Premium Egyptian rice 5 kg × 1', amount: '145.00' },\r\n { name: 'Minced veal 1.240 kg', amount: '508.40' },\r\n { name: 'Mineral water 1.5 L × 4', amount: '82.00' },\r\n ],\r\n totals: [\r\n { name: 'Subtotal', amount: '895.40' },\r\n { name: 'Discount', amount: '17.20' },\r\n ],\r\n tax: [\r\n { name: 'Taxable base 14%', amount: '770.35' },\r\n { name: 'VAT 14%', amount: '107.85' },\r\n ],\r\n due: { name: 'Total due', amount: 'EGP 878.20' },\r\n payment: 'Cash 900.00 · Change 21.80',\r\n loyalty: ['Loyalty points earned: 878', 'Balance after: 4,328 points'],\r\n qr: 'E-invoice QR code',\r\n copyOf: (n, of) => `Copy ${n} of ${of}`,\r\n logo: 'Logo',\r\n },\r\n};\r\n\r\n@Component({\r\n selector: 'app-receipt-preview',\r\n standalone: true,\r\n imports: [CommonModule, NavigatorLocalizePipe],\r\n templateUrl: './receipt-preview.component.html',\r\n styleUrls: ['./receipt-preview.component.scss'],\r\n})\r\nexport class ReceiptPreviewComponent {\r\n constructor(@Optional() @Inject(REUSABLE_COMPONENTS_CONFIG) private config: ReusableComponentsConfig | null) {}\r\n /** The template being edited (the form's shared data object). */\r\n @Input() values: Record<string, any> | null | undefined;\r\n\r\n private get v(): Record<string, any> {\r\n return this.values ?? {};\r\n }\r\n\r\n get paperMm(): number {\r\n const mm = Number(this.v['paper_Width_Mm']);\r\n return CHARS_PER_LINE[mm] ? mm : DEFAULT_PAPER_MM;\r\n }\r\n\r\n get charsPerLine(): number {\r\n return CHARS_PER_LINE[this.paperMm];\r\n }\r\n\r\n get copies(): number {\r\n const n = Number(this.v['copies_Count']);\r\n return Number.isInteger(n) && n >= 1 ? n : 1;\r\n }\r\n\r\n get hasReport(): boolean {\r\n return !!this.v['report_Id'];\r\n }\r\n\r\n get logoPath(): string | null {\r\n const p = String(this.v['logo_Path'] ?? '').trim();\r\n return p ? p : null;\r\n }\r\n\r\n /** Switches default to on — the table default — when a new record has not set them yet. */\r\n private flag(field: string): boolean {\r\n const value = this.v[field];\r\n return value === undefined || value === null ? true : !!value;\r\n }\r\n\r\n get showTax(): boolean {\r\n return this.flag('show_Tax_Breakdown');\r\n }\r\n get showQr(): boolean {\r\n return this.flag('show_Qr_Code');\r\n }\r\n get showLoyalty(): boolean {\r\n return this.flag('show_Loyalty_Balance');\r\n }\r\n get showBarcode(): boolean {\r\n return this.flag('show_Barcode');\r\n }\r\n\r\n /**\r\n * The receipt prints in one language (§6.2) and the template carries no language field,\r\n * so it is read from its own texts: Arabic letters ⇒ Arabic; only Latin ⇒ English;\r\n * no text yet ⇒ the user's interface language.\r\n */\r\n get lang(): ReceiptLang {\r\n const text = `${this.v['header_Text'] ?? ''}${this.v['footer_Text'] ?? ''}`;\r\n if (/[؀-ۿ]/.test(text)) return 'ar';\r\n if (/[A-Za-z]/.test(text)) return 'en';\r\n return this.config?.isArabic?.() ? 'ar' : 'en';\r\n }\r\n\r\n get dir(): 'rtl' | 'ltr' {\r\n return this.lang === 'ar' ? 'rtl' : 'ltr';\r\n }\r\n\r\n get sample() {\r\n return SAMPLE[this.lang];\r\n }\r\n\r\n readonly receiptNo = SAMPLE_RECEIPT_NO;\r\n readonly saleDate = SAMPLE_DATE;\r\n readonly saleTime = SAMPLE_TIME;\r\n /** Real Code 128 of the sample receipt number — scannable. Computed once: the number is fixed. */\r\n readonly barcode = encodeCode128B(SAMPLE_RECEIPT_NO);\r\n /** QR-shaped placeholder; the real QR holds e-invoice data that exists only after a sale. */\r\n readonly qr = qrPlaceholderModules(SAMPLE_RECEIPT_NO);\r\n\r\n get separator(): string {\r\n return '─'.repeat(this.charsPerLine);\r\n }\r\n\r\n get headerLines(): { text: string; cut: boolean }[] {\r\n return this.cutLines(this.v['header_Text']);\r\n }\r\n\r\n get footerLines(): { text: string; cut: boolean }[] {\r\n return this.cutLines(this.v['footer_Text']);\r\n }\r\n\r\n get cutCount(): number {\r\n return [...this.headerLines, ...this.footerLines].filter((l) => l.cut).length;\r\n }\r\n\r\n get copyLabels(): string[] {\r\n return this.copies > 1\r\n ? Array.from({ length: this.copies }, (_, i) => this.sample.copyOf(i + 1, this.copies))\r\n : [];\r\n }\r\n\r\n private cutLines(value: unknown): { text: string; cut: boolean }[] {\r\n const raw = String(value ?? '').replace(/\\r\\n?/g, '\\n');\r\n if (!raw.trim()) return [];\r\n const max = this.charsPerLine;\r\n return raw.split('\\n').map((line) => {\r\n // Array.from counts code points, so a combined character is not split in two.\r\n const chars = Array.from(line);\r\n return chars.length > max\r\n ? { text: chars.slice(0, max).join(''), cut: true }\r\n : { text: line, cut: false };\r\n });\r\n }\r\n}\r\n","<div class=\"rp-frame\">\r\n <div class=\"rp-caption\">\r\n {{\r\n 'receiptPreview.caption'\r\n | localize: 'معاينة تقريبية ببيانات نموذجية — عرض {0} مم · {1} حرفًا في السطر' : paperMm : charsPerLine\r\n }}\r\n @if (copies > 1) {\r\n · {{ 'receiptPreview.copies' | localize: 'يُطبع {0} نسخ' : copies }}\r\n }\r\n </div>\r\n\r\n @if (hasReport) {\r\n <div class=\"rp-notice rp-notice-info\">\r\n {{\r\n 'retailReceiptTemplate.reportOverridesWarning'\r\n | localize\r\n : 'تحديد نموذج طباعة متقدّم يجعل الإيصال كلّه من تصميمه: نصوص الترويسة والتذييل وعناصر الإظهار تُهمَل ولا تؤثّر في المطبوع'\r\n }}\r\n </div>\r\n }\r\n\r\n @if (cutCount > 0) {\r\n <div class=\"rp-notice rp-notice-warn\">\r\n {{\r\n 'receiptPreview.cutLines'\r\n | localize: '{0} من سطور الترويسة أو التذييل أطول من {1} حرفًا وستُقَصّ عند الطباعة' : cutCount : charsPerLine\r\n }}\r\n </div>\r\n }\r\n\r\n <div class=\"rp-stage\" [class.rp-dimmed]=\"hasReport\">\r\n <div class=\"rp-paper\" [attr.dir]=\"dir\" [style.width.ch]=\"charsPerLine\">\r\n @if (copyLabels.length) {\r\n <div class=\"rp-center rp-muted\">{{ copyLabels[0] }}</div>\r\n }\r\n\r\n @if (logoPath) {\r\n <div class=\"rp-logo\" [title]=\"logoPath\">[ {{ sample.logo }} ]</div>\r\n }\r\n\r\n @for (line of headerLines; track $index) {\r\n <div class=\"rp-center rp-strong rp-line\" [class.rp-cut]=\"line.cut\">{{ line.text }}</div>\r\n }\r\n\r\n <div class=\"rp-sep\">{{ separator }}</div>\r\n <div class=\"rp-center\">\r\n {{ sample.receiptLabel }} <bdi dir=\"ltr\">{{ receiptNo }}</bdi>\r\n </div>\r\n <div class=\"rp-center rp-muted\">\r\n <bdi dir=\"ltr\">{{ saleDate }}</bdi> · <bdi dir=\"ltr\">{{ saleTime }}</bdi> ·\r\n <span class=\"rp-nowrap\">{{ sample.cashierLabel }} {{ sample.cashier }}</span>\r\n </div>\r\n <div class=\"rp-sep\">{{ separator }}</div>\r\n\r\n @for (row of sample.lines; track $index) {\r\n <div class=\"rp-row\"><span class=\"rp-name\">{{ row.name }}</span><span>{{ row.amount }}</span></div>\r\n }\r\n\r\n <div class=\"rp-sep\">{{ separator }}</div>\r\n\r\n @for (row of sample.totals; track $index) {\r\n <div class=\"rp-row\"><span class=\"rp-name\">{{ row.name }}</span><span>{{ row.amount }}</span></div>\r\n }\r\n @if (showTax) {\r\n @for (row of sample.tax; track $index) {\r\n <div class=\"rp-row\"><span class=\"rp-name\">{{ row.name }}</span><span>{{ row.amount }}</span></div>\r\n }\r\n }\r\n <div class=\"rp-row rp-strong\">\r\n <span class=\"rp-name\">{{ sample.due.name }}</span><span>{{ sample.due.amount }}</span>\r\n </div>\r\n <div class=\"rp-center rp-muted\">{{ sample.payment }}</div>\r\n\r\n @if (showLoyalty) {\r\n <div class=\"rp-sep\">{{ separator }}</div>\r\n @for (text of sample.loyalty; track $index) {\r\n <div>{{ text }}</div>\r\n }\r\n }\r\n\r\n @if (showQr || showBarcode) {\r\n <div class=\"rp-sep\">{{ separator }}</div>\r\n }\r\n @if (showQr) {\r\n <svg\r\n class=\"rp-qr\"\r\n [attr.viewBox]=\"'-2 -2 ' + (qr.size + 4) + ' ' + (qr.size + 4)\"\r\n shape-rendering=\"crispEdges\"\r\n aria-hidden=\"true\"\r\n >\r\n @for (m of qr.dark; track $index) {\r\n <rect [attr.x]=\"m[1]\" [attr.y]=\"m[0]\" width=\"1\" height=\"1\" />\r\n }\r\n </svg>\r\n <div class=\"rp-center rp-muted rp-small\">{{ sample.qr }}</div>\r\n }\r\n @if (showBarcode && barcode) {\r\n <svg\r\n class=\"rp-barcode\"\r\n [attr.viewBox]=\"'0 0 ' + barcode.totalWidth + ' 40'\"\r\n preserveAspectRatio=\"none\"\r\n shape-rendering=\"crispEdges\"\r\n aria-hidden=\"true\"\r\n >\r\n @for (b of barcode.bars; track $index) {\r\n <rect [attr.x]=\"b.x\" y=\"0\" [attr.width]=\"b.width\" height=\"40\" />\r\n }\r\n </svg>\r\n <div class=\"rp-center rp-muted\" dir=\"ltr\">{{ receiptNo }}</div>\r\n }\r\n\r\n @if (footerLines.length) {\r\n <div class=\"rp-sep\">{{ separator }}</div>\r\n @for (line of footerLines; track $index) {\r\n <div class=\"rp-center rp-line\" [class.rp-cut]=\"line.cut\">{{ line.text }}</div>\r\n }\r\n }\r\n </div>\r\n </div>\r\n</div>\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n EventEmitter,\r\n Input,\r\n Output,\r\n} from '@angular/core';\r\nimport { DxButtonModule } from 'devextreme-angular';\r\nimport { NavigatorLocalizePipe } from '../form-navigator/navigator-localize.pipe';\r\n\r\n/**\r\n * أزرار سير عمل «التقارير المحفوظة»: اعتماد · إلغاء الاعتماد · أرشفة ·\r\n * إلغاء الأرشيف.\r\n *\r\n * تشترك فيه خمس شاشات (استخراج القوائم المالية · التحليل المالي · أرصدة\r\n * الحسابات · كشف الحساب · ميزان المراجعة). الأزرار **ثابتة ومرئية دائماً**\r\n * وتُعطَّل حين لا تنطبق على حالة الصفوف المحدَّدة — بدل شريط سير العمل\r\n * الديناميكي الذي كان يظهر ويختفي.\r\n *\r\n * ⚠ يُوضع **داخل** `*dxTemplate` الخاصّ بشريط أدوات الشبكة لا بدلاً منه:\r\n * DevExtreme يحلّ اسم القالب من الشبكة نفسها عبر `toolbarCustomItems`.\r\n *\r\n * قواعد التعطيل تسكن هنا لأنها **دالة خالصة** من الحالة والصلاحية، ومتطابقة\r\n * في الخمس شاشات. والتعطيل **للوضوح لا للحماية**: الخادم يتحقّق من صلاحية\r\n * الانتقال على نقطة `bulk-apply-workflow` نفسها.\r\n */\r\n@Component({\r\n selector: 'app-report-workflow-actions',\r\n standalone: true,\r\n imports: [DxButtonModule, NavigatorLocalizePipe],\r\n templateUrl: './report-workflow-actions.component.html',\r\n styleUrl: './report-workflow-actions.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class ReportWorkflowActionsComponent {\r\n /** حالة الصفوف المحدَّدة، أو `null` لو اختلفت أو لا تحديد. */\r\n @Input() statusId: string | null = null;\r\n\r\n /** صلاحية «اعتماد» (sys_permission 21) على وظيفة الشاشة. */\r\n @Input() canApprove = false;\r\n\r\n /** تحديد صالح: صفّ واحد على الأقل وكلها بنفس الحالة. */\r\n @Input() hasSelection = false;\r\n\r\n /** مُخرَج واحد يحمل معرّف الإجراء — الشاشة تعامل الأربعة بنفس المسار. */\r\n @Output() action = new EventEmitter<string>();\r\n\r\n /**\r\n * معرّفات الحالات والإجراءات تخصّ دورة عمل المستأجر فلا قيم افتراضية لها هنا — الشاشة\r\n * المستضيفة تمرّرها (في Flexora: `FinancialReportStatusEnum` / `FinancialReportWorkflowActionEnum`).\r\n * معرّف غير مُمرَّر يعطّل الزرّ المقابل بدل أن يطابق حالة فارغة أو يُرسل معرّفاً خاطئاً.\r\n */\r\n @Input() draftStatusId: string | null = null;\r\n @Input() approvedStatusId: string | null = null;\r\n @Input() archivedStatusId: string | null = null;\r\n @Input() approveActionId: string | null = null;\r\n @Input() unapproveActionId: string | null = null;\r\n @Input() archiveActionId: string | null = null;\r\n @Input() unarchiveActionId: string | null = null;\r\n\r\n private get enabled(): boolean {\r\n return this.canApprove && this.hasSelection;\r\n }\r\n\r\n private matches(target: string | null, actionId: string | null): boolean {\r\n return this.enabled && !!target && !!actionId && this.statusId === target;\r\n }\r\n\r\n get canApproveNow(): boolean {\r\n return this.matches(this.draftStatusId, this.approveActionId);\r\n }\r\n\r\n get canUnapproveNow(): boolean {\r\n return this.matches(this.approvedStatusId, this.unapproveActionId);\r\n }\r\n\r\n get canArchiveNow(): boolean {\r\n return this.matches(this.draftStatusId, this.archiveActionId);\r\n }\r\n\r\n get canUnarchiveNow(): boolean {\r\n return this.matches(this.archivedStatusId, this.unarchiveActionId);\r\n }\r\n\r\n /**\r\n * سبب التعطيل — يُعرض تلميحاً على الزرار المعطَّل بدل تكرار اسمه.\r\n * الترتيب: الصلاحية أولاً (حاجز ثابت) ثم التحديد ثم الحالة.\r\n * الترجمة في القالب عبر `localize` بالمفتاح والافتراض معاً.\r\n */\r\n get disabledReasonKey(): string {\r\n if (!this.canApprove) return 'General.Approve.NoPermissionHint';\r\n if (!this.hasSelection) return 'common.please_select_rows_first';\r\n return 'General.ActionNotAvailableForStatus.Label';\r\n }\r\n\r\n get disabledReasonDefault(): string {\r\n if (!this.canApprove) return 'لا تملك صلاحية «اعتماد» على هذه الشاشة';\r\n if (!this.hasSelection) return 'الرجاء اختيار صفوف أولاً';\r\n return 'الإجراء غير متاح لحالة التقرير الحالية';\r\n }\r\n\r\n emit(actionId: string | null): void {\r\n if (actionId) this.action.emit(actionId);\r\n }\r\n}\r\n","<!--\r\n لون كل زرار = لون شارة الحالة التي يُفضي إليها (اعتماد أخضر · أرشفة كهرماني ·\r\n الإلغاءان رماديان = مسودة). الوزن Tint للإجراءين المُثبِّتَين وOutline للإلغاءَين —\r\n يأتي كله من stylingMode/type عبر flexora-buttons.scss (DESIGN.html §3) بلا CSS خاصّ.\r\n التلميح يشرح سبب التعطيل بدل تكرار اسم الزرار — انظر disabledReason في الـTS.\r\n-->\r\n<dx-button\r\n [text]=\"'General.Approve.Label' | localize: 'اعتماد'\"\r\n icon=\"check\"\r\n type=\"success\"\r\n stylingMode=\"contained\"\r\n [disabled]=\"!canApproveNow\"\r\n [hint]=\"\r\n canApproveNow\r\n ? ('General.Approve.Label' | localize: 'اعتماد')\r\n : (disabledReasonKey | localize: disabledReasonDefault)\r\n \"\r\n (onClick)=\"emit(approveActionId)\"\r\n></dx-button>\r\n\r\n<dx-button\r\n [text]=\"'General.UnApprove.Label' | localize: 'إلغاء الاعتماد'\"\r\n icon=\"undo\"\r\n stylingMode=\"outlined\"\r\n [disabled]=\"!canUnapproveNow\"\r\n [hint]=\"\r\n canUnapproveNow\r\n ? ('General.UnApprove.Label' | localize: 'إلغاء الاعتماد')\r\n : (disabledReasonKey | localize: disabledReasonDefault)\r\n \"\r\n (onClick)=\"emit(unapproveActionId)\"\r\n></dx-button>\r\n\r\n<dx-button\r\n [text]=\"'General.Archive.Label' | localize: 'أرشفة'\"\r\n icon=\"box\"\r\n type=\"warning\"\r\n stylingMode=\"contained\"\r\n [disabled]=\"!canArchiveNow\"\r\n [hint]=\"\r\n canArchiveNow\r\n ? ('General.Archive.Label' | localize: 'أرشفة')\r\n : (disabledReasonKey | localize: disabledReasonDefault)\r\n \"\r\n (onClick)=\"emit(archiveActionId)\"\r\n></dx-button>\r\n\r\n<dx-button\r\n [text]=\"'General.Unarchive.Label' | localize: 'إلغاء الأرشيف'\"\r\n icon=\"revert\"\r\n stylingMode=\"outlined\"\r\n [disabled]=\"!canUnarchiveNow\"\r\n [hint]=\"\r\n canUnarchiveNow\r\n ? ('General.Unarchive.Label' | localize: 'إلغاء الأرشيف')\r\n : (disabledReasonKey | localize: disabledReasonDefault)\r\n \"\r\n (onClick)=\"emit(unarchiveActionId)\"\r\n></dx-button>\r\n","import { Component, EventEmitter, Input, Output, Inject, Optional } from '@angular/core';\r\nimport { DxDateBoxModule, DxPopupModule, DxTextAreaModule } from 'devextreme-angular';\r\n\r\nimport { NavigatorLocalizePipe } from '../form-navigator/navigator-localize.pipe';\r\nimport { REUSABLE_COMPONENTS_CONFIG, ReusableComponentsConfig } from '../reusable-components.config';\r\n\r\n/** سطر معلومة يُعرض فوق تاريخ العكس (مثلاً: عدد الأصول، رقم القيد الأصلي). */\r\nexport interface ReversalDetailItem {\r\n label: string;\r\n value: string | number | null | undefined;\r\n}\r\n\r\n/** ما يُرسَل عند التأكيد حين تُستخدم الخيارات الإضافية (السبب). */\r\nexport interface ReversalConfirmation {\r\n date: Date;\r\n reason: string;\r\n}\r\n\r\n@Component({\r\n selector: 'app-reversal-date-popup',\r\n standalone: true,\r\n imports: [DxPopupModule, DxDateBoxModule, DxTextAreaModule, NavigatorLocalizePipe],\r\n templateUrl: './reversal-date-popup.component.html',\r\n})\r\nexport class ReversalDatePopupComponent {\r\n constructor(@Optional() @Inject(REUSABLE_COMPONENTS_CONFIG) private config: ReusableComponentsConfig | null) {}\r\n private readonly t = (key: string, fallback: string): string => this.config?.translate?.(key, fallback) ?? fallback;\r\n\r\n @Input() set visible(value: boolean) {\r\n if (value === this.isVisible) return;\r\n\r\n this.isVisible = value;\r\n\r\n if (value) {\r\n this.reversalDate = this.defaultDate ? new Date(this.defaultDate) : new Date();\r\n this.reason = '';\r\n this.refreshConfirmButton();\r\n }\r\n }\r\n\r\n /** Disables the confirm button while the host is performing the reversal. */\r\n @Input() set busy(value: boolean) {\r\n if (value === this.isBusy) return;\r\n this.isBusy = value;\r\n this.refreshConfirmButton();\r\n }\r\n\r\n // ===== خيارات اختيارية — الشاشات القائمة (القيود، إيداع الشيكات) لا تمرّرها فلا يتغيّر سلوكها. =====\r\n\r\n /**\r\n * التاريخ المقترح عند الفتح (الافتراضي: اليوم). عكس الإهلاك يمرّر تاريخ التشغيل الأصلي.\r\n * يُطبَّق عند الفتح، وكذلك إن وصل بعد الفتح (ترتيب إسناد المدخلات غير مضمون).\r\n */\r\n @Input() set initialDate(value: Date | string | null | undefined) {\r\n this.defaultDate = value ? new Date(value) : null;\r\n if (this.isVisible && this.defaultDate) this.reversalDate = new Date(this.defaultDate);\r\n }\r\n\r\n /** أقدم تاريخ مسموح (تاريخ المستند الأصلي) — الخادم يتحقّق منه أيضاً. */\r\n @Input() minDate: Date | string | null | undefined = null;\r\n\r\n /** معلومات تُعرض فوق التاريخ (SRS الإهلاك §5.2: عدد الأصول، الإجمالي، رقم القيد، التاريخ). */\r\n @Input() details: ReversalDetailItem[] | null = null;\r\n\r\n /** نص تحذير يظهر فوق التاريخ. */\r\n @Input() warning: string | null = null;\r\n\r\n /** يُظهر حقل «سبب العكس». */\r\n @Input() showReason = false;\r\n\r\n /** السبب إلزامي: زر التأكيد معطَّل حتى يُكتب. */\r\n @Input() set reasonRequired(value: boolean) {\r\n this.isReasonRequired = value;\r\n this.refreshConfirmButton();\r\n }\r\n\r\n @Output() visibleChange = new EventEmitter<boolean>();\r\n\r\n /** The chosen accounting date. Raised only when the user confirms. */\r\n @Output() confirmed = new EventEmitter<Date>();\r\n\r\n /** نفس لحظة confirmed لكن مع السبب — للشاشات التي تستخدم showReason. */\r\n @Output() confirmedWithReason = new EventEmitter<ReversalConfirmation>();\r\n\r\n isVisible = false;\r\n isBusy = false;\r\n isReasonRequired = false;\r\n reversalDate: Date = new Date();\r\n reason = '';\r\n private defaultDate: Date | null = null;\r\n\r\n confirmButtonOptions: Record<string, unknown> = {\r\n text: this.t('635', 'قيد عكسي'),\r\n icon: 'revert',\r\n type: 'default',\r\n stylingMode: 'contained',\r\n onClick: () => this.confirm(),\r\n };\r\n\r\n readonly cancelButtonOptions = {\r\n text: this.t('btn.cancel', 'إلغاء'),\r\n stylingMode: 'outlined',\r\n onClick: () => this.close(),\r\n };\r\n\r\n private get missingReason(): boolean {\r\n return this.showReason && this.isReasonRequired && !this.reason.trim();\r\n }\r\n\r\n // A NEW object, not a mutated one: DevExtreme reads [options] by reference, so changing\r\n // `disabled` in place would never reach the widget. The reference changes only when the\r\n // state actually flips.\r\n private refreshConfirmButton(): void {\r\n const disabled = this.isBusy || this.missingReason;\r\n if (this.confirmButtonOptions['disabled'] === disabled) return;\r\n this.confirmButtonOptions = { ...this.confirmButtonOptions, disabled };\r\n }\r\n\r\n onReasonChanged(value: string | null | undefined): void {\r\n this.reason = value ?? '';\r\n this.refreshConfirmButton();\r\n }\r\n\r\n onVisibleChange(value: boolean): void {\r\n if (value === this.isVisible) return;\r\n this.isVisible = value;\r\n this.visibleChange.emit(value);\r\n }\r\n\r\n // Deliberately does NOT close: only the host knows whether the reversal succeeded. It used\r\n // to close here, so a refused reversal (closed period, already reversed, ...) left the user\r\n // with an error toast and no dialog - they had to reopen it and pick the date again. The\r\n // host closes it after a successful call and leaves it standing after a failure, with the\r\n // date the user chose still in place.\r\n confirm(): void {\r\n if (!this.reversalDate || this.isBusy || this.missingReason) return;\r\n this.confirmed.emit(this.reversalDate);\r\n this.confirmedWithReason.emit({ date: this.reversalDate, reason: this.reason.trim() });\r\n }\r\n\r\n close(): void {\r\n if (!this.isVisible) return;\r\n this.isVisible = false;\r\n this.visibleChange.emit(false);\r\n }\r\n}\r\n","<dx-popup\r\n [visible]=\"isVisible\"\r\n (visibleChange)=\"onVisibleChange($event)\"\r\n [showTitle]=\"true\"\r\n [title]=\"'636' | localize: 'إنشاء قيد عكسي'\"\r\n [width]=\"details?.length || showReason ? 520 : 420\"\r\n [height]=\"'auto'\"\r\n [showCloseButton]=\"true\"\r\n [dragEnabled]=\"true\"\r\n [hideOnOutsideClick]=\"false\"\r\n>\r\n <dxi-popup-toolbar-item\r\n toolbar=\"bottom\"\r\n location=\"after\"\r\n widget=\"dxButton\"\r\n [options]=\"confirmButtonOptions\"\r\n ></dxi-popup-toolbar-item>\r\n <dxi-popup-toolbar-item\r\n toolbar=\"bottom\"\r\n location=\"after\"\r\n widget=\"dxButton\"\r\n [options]=\"cancelButtonOptions\"\r\n ></dxi-popup-toolbar-item>\r\n\r\n <div *dxTemplate=\"let data of 'content'\" class=\"p-3\">\r\n @if (details?.length) {\r\n <div class=\"kt-card shadow-none grid grid-cols-2 gap-x-4 gap-y-2.5 p-3.5 mb-3 rounded-lg bg-muted/70\">\r\n @for (item of details; track item.label) {\r\n <div class=\"flex flex-col gap-0.5 min-w-0\">\r\n <span class=\"text-xs text-muted-foreground\">{{ item.label }}</span>\r\n <span class=\"text-sm font-semibold text-foreground break-words\">{{ item.value ?? '—' }}</span>\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n @if (warning) {\r\n <div class=\"kt-alert kt-alert-light kt-alert-warning kt-alert-sm mb-3\">\r\n <div class=\"kt-alert-icon\"><i class=\"ki-outline ki-information-5 text-lg\"></i></div>\r\n <div class=\"kt-alert-title\">{{ warning }}</div>\r\n </div>\r\n }\r\n\r\n <div class=\"dx-field\">\r\n <div class=\"dx-field-label\">\r\n {{ 'fa.dep.reversedOn' | localize: 'تاريخ العكس' }}\r\n </div>\r\n <div class=\"dx-field-value\">\r\n <dx-date-box\r\n [(value)]=\"reversalDate\"\r\n type=\"date\"\r\n displayFormat=\"dd/MM/yyyy\"\r\n [min]=\"minDate ?? undefined\"\r\n [openOnFieldClick]=\"true\"\r\n ></dx-date-box>\r\n </div>\r\n </div>\r\n\r\n <!-- سبب العكس (اختياري للشاشة) -->\r\n @if (showReason) {\r\n <div class=\"dx-field\">\r\n <div class=\"dx-field-label\">\r\n {{ 'fa.dep.reverseReason' | localize: 'سبب العكس' }}\r\n @if (isReasonRequired) {\r\n <span class=\"text-destructive\">*</span>\r\n }\r\n </div>\r\n <div class=\"dx-field-value\">\r\n <dx-text-area\r\n [value]=\"reason\"\r\n (onValueChanged)=\"onReasonChanged($event.value)\"\r\n valueChangeEvent=\"input\"\r\n [height]=\"70\"\r\n [maxLength]=\"500\"\r\n ></dx-text-area>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n</dx-popup>\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, EventEmitter, Input, Output } from '@angular/core';\r\nimport { DxButtonModule } from 'devextreme-angular';\r\nimport { NavigatorLocalizePipe } from '../form-navigator/navigator-localize.pipe';\r\n\r\n/** Presentational action bar for save-only forms. */\r\n@Component({\r\n selector: 'app-save-only-buttons',\r\n standalone: true,\r\n imports: [CommonModule, DxButtonModule, NavigatorLocalizePipe],\r\n templateUrl: './save-only-buttons.component.html',\r\n styleUrl: './save-only-buttons.component.scss',\r\n})\r\nexport class SaveOnlyButtonsComponent {\r\n @Input() saving = false;\r\n /** Defaults to true to preserve always-enabled behavior for hosts without change tracking. */\r\n @Input() hasChanges = true;\r\n /** Save button text; falls back to the localized \"حفظ\" when null. */\r\n @Input() saveText: string | null = null;\r\n @Input() showRestore = true;\r\n /** Restore button text; falls back to the localized default when null. */\r\n @Input() restoreText: string | null = null;\r\n\r\n @Output() save = new EventEmitter<void>();\r\n @Output() restore = new EventEmitter<void>();\r\n}\r\n","<div class=\"save-only-bar\">\r\n <dx-button\r\n [text]=\"saveText || ('699' | localize: 'حفظ')\"\r\n type=\"default\"\r\n icon=\"save\"\r\n [disabled]=\"saving || !hasChanges\"\r\n (onClick)=\"save.emit()\"\r\n ></dx-button>\r\n <dx-button\r\n *ngIf=\"showRestore\"\r\n [text]=\"restoreText || ('payrollParameters.restore' | localize: 'استعادة القيم المحفوظة')\"\r\n icon=\"revert\"\r\n [disabled]=\"saving || !hasChanges\"\r\n (onClick)=\"restore.emit()\"\r\n ></dx-button>\r\n</div>\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, Input, OnInit, forwardRef, inject } from '@angular/core';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { Router } from '@angular/router';\r\nimport { DxSelectBoxModule } from 'devextreme-angular';\r\n\r\n@Component({\r\n selector: 'app-select-box-with-link',\r\n standalone: true,\r\n imports: [CommonModule, DxSelectBoxModule],\r\n templateUrl: './select-box-with-link.component.html',\r\n styleUrl: './select-box-with-link.component.scss',\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => SelectBoxWithLinkComponent),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class SelectBoxWithLinkComponent implements ControlValueAccessor, OnInit {\r\n private readonly router = inject(Router);\r\n\r\n @Input() dataSource: any;\r\n @Input() displayExpr: string | ((item: unknown) => string) = 'name_Ar';\r\n @Input() valueExpr = 'id';\r\n @Input() searchEnabled = true;\r\n @Input() showClearButton = true;\r\n @Input() placeholder = '';\r\n @Input() linkRoute = '';\r\n @Input() linkHint = '';\r\n @Input() linkIcon = 'link';\r\n\r\n value: unknown;\r\n disabled = false;\r\n buttons: any[] = [];\r\n\r\n private onChange: (value: unknown) => void = () => {};\r\n private onTouched: () => void = () => {};\r\n\r\n ngOnInit(): void {\r\n this.buttons = [\r\n {\r\n name: 'openLinkScreen',\r\n location: 'after',\r\n options: {\r\n icon: this.linkIcon,\r\n stylingMode: 'text',\r\n hint: this.linkHint,\r\n onClick: this.openLinkScreen,\r\n },\r\n },\r\n 'clear',\r\n 'dropDown',\r\n ];\r\n }\r\n\r\n writeValue(value: unknown): void {\r\n this.value = value;\r\n }\r\n\r\n registerOnChange(fn: (value: unknown) => void): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this.disabled = isDisabled;\r\n }\r\n\r\n onValueChanged(event: { value?: unknown }): void {\r\n this.value = event.value;\r\n this.onChange(this.value);\r\n this.onTouched();\r\n }\r\n\r\n openLinkScreen = (): void => {\r\n if (!this.linkRoute) return;\r\n const url = this.router.serializeUrl(\r\n this.router.createUrlTree([this.linkRoute]),\r\n );\r\n window.open(url, '_blank', 'noopener,noreferrer');\r\n };\r\n}\r\n","<dx-select-box\r\n [dataSource]=\"dataSource\"\r\n [displayExpr]=\"displayExpr\"\r\n [valueExpr]=\"valueExpr\"\r\n [searchEnabled]=\"searchEnabled\"\r\n [showClearButton]=\"showClearButton\"\r\n [placeholder]=\"placeholder\"\r\n [value]=\"value\"\r\n [disabled]=\"disabled\"\r\n [buttons]=\"buttons\"\r\n (onValueChanged)=\"onValueChanged($event)\"\r\n></dx-select-box>\r\n","import { InjectionToken } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\n\r\n/** Mirror of Flexora's `AvailableTransitionDto` (structural — any compatible shape works). */\r\nexport interface WorkflowAvailableTransition {\r\n id: string;\r\n transition_Name_Ar: string;\r\n transition_Name_En?: string | null;\r\n transition_Type_Id: string;\r\n transition_Type_Code?: string | null;\r\n to_State_Id: string;\r\n to_State_Name_Ar?: string | null;\r\n to_State_Name_En?: string | null;\r\n require_Note: boolean;\r\n allow_From_Notification: boolean;\r\n icon?: string | null;\r\n can_Execute: boolean;\r\n disabled_Reason_Key?: string | null;\r\n}\r\n\r\n/** Mirror of Flexora's `WorkflowStateChainDto`. */\r\nexport interface WorkflowStateChain {\r\n state_Id: string;\r\n state_Name_Ar?: string | null;\r\n state_Name_En?: string | null;\r\n state_Type_Code?: string | null;\r\n display_Order?: number | null;\r\n is_Current: boolean;\r\n is_Passed: boolean;\r\n}\r\n\r\n/** Mirror of Flexora's `WorkflowInstanceResultDto`. */\r\nexport interface WorkflowInstanceResult {\r\n instance_Id: string;\r\n current_State_Id: string;\r\n current_State_Name_Ar?: string | null;\r\n current_State_Name_En?: string | null;\r\n current_State_Type_Code?: string | null;\r\n instance_Status_Id: string;\r\n state_Entered_On: string;\r\n due_On?: string | null;\r\n escalation_Level: number;\r\n completed_On?: string | null;\r\n /** حالة المستند نفسه (لا الدورة) — تغني الشاشة عن إعادة جلب المستند بعد الإجراء */\r\n document_Status_Id?: string | null;\r\n /** لا يوجد مسؤول مُسنَد للخطوة الحالية. */\r\n no_Responsible?: boolean;\r\n available_Transitions: WorkflowAvailableTransition[];\r\n states: WorkflowStateChain[];\r\n}\r\n\r\n/** Mirror of Flexora's `DocumentWorkflowContextDto`. */\r\nexport interface WorkflowDocumentContext {\r\n instance: WorkflowInstanceResult | null;\r\n can_Start?: boolean;\r\n document_Status_Name_Ar?: string | null;\r\n document_Status_Name_En?: string | null;\r\n}\r\n\r\n/** Mirror of Flexora's `ApplyTransitionInput`. */\r\nexport interface WorkflowApplyTransitionInput {\r\n transition_Id: string;\r\n notes?: string | null;\r\n expected_State_Id: string;\r\n}\r\n\r\nexport interface WorkflowUpdatedNotification {\r\n documentTypeId: string;\r\n documentId: string;\r\n}\r\n\r\n/**\r\n * Host-supplied services for the workflow actions bar (workflow v2 —\r\n * document context + transitions). The host adapter typically wraps its\r\n * workflow-instance API service, its cross-tab update channel, and its\r\n * language service.\r\n */\r\nexport interface WorkflowActionsProvider {\r\n /** Everything the bar needs in one call (always 200 — no 404). */\r\n getDocumentContext(\r\n documentTypeId: string,\r\n documentId: string,\r\n ): Observable<WorkflowDocumentContext>;\r\n\r\n applyTransition(\r\n instanceId: string,\r\n input: WorkflowApplyTransitionInput,\r\n ): Observable<WorkflowInstanceResult>;\r\n\r\n /** Fired when a workflow changed elsewhere (other tab/screen) so the bar reloads. */\r\n workflowUpdates$: Observable<WorkflowUpdatedNotification>;\r\n\r\n /** Whether the UI language is Arabic (drives Ar/En name selection). */\r\n isArabic(): boolean;\r\n\r\n /** Optional: light \"does this document type have an active cycle?\" probe (drives the loading hint). */\r\n hasActiveWorkflow?(documentTypeId: string): Observable<boolean>;\r\n\r\n /** Optional: bulk mode (grid selection) — required only when `documentIds` is used. */\r\n bulkApplyTransition?(input: {\r\n items: { instance_Id: string; transition_Id: string; expected_State_Id: string }[];\r\n notes?: string | null;\r\n }): Observable<{\r\n succeeded: number;\r\n failed: number;\r\n errors: { instance_Id: string; error_Key: string; message?: string | null }[];\r\n }>;\r\n\r\n /** Optional: translate a server error key to localized text (bulk error reasons). */\r\n translate?(key: string): string | null | undefined;\r\n}\r\n\r\nexport const WORKFLOW_ACTIONS_PROVIDER =\r\n new InjectionToken<WorkflowActionsProvider>('WORKFLOW_ACTIONS_PROVIDER');\r\n\r\n/** Row-level button color per transition type (APPROVE/REJECT/ESCALATE/default). */\r\nexport function workflowTransitionColor(code?: string | null): {\r\n row: string;\r\n bulk: string;\r\n} {\r\n switch (code) {\r\n case 'APPROVE':\r\n return { row: 'bg-green-700 hover:bg-green-800', bulk: '!bg-green-700' };\r\n case 'REJECT':\r\n return { row: 'bg-red-600 hover:bg-red-700', bulk: '!bg-red-600' };\r\n case 'ESCALATE':\r\n return { row: 'bg-orange-500 hover:bg-orange-600', bulk: '!bg-orange-500' };\r\n default:\r\n return { row: 'bg-blue-600 hover:bg-blue-700', bulk: '!bg-blue-600' };\r\n }\r\n}\r\n\r\nexport function workflowTransitionButtonClass(code?: string | null): string {\r\n const base =\r\n 'inline-block rounded-md px-3 py-0.5 text-white text-[11px] font-bold cursor-pointer whitespace-nowrap disabled:cursor-not-allowed disabled:opacity-50';\r\n return `${base} ${workflowTransitionColor(code).row}`;\r\n}\r\n\r\n/** DevExtreme `type` for the confirm / bulk buttons = the transition's consequence. */\r\nexport function workflowTransitionDxType(\r\n code?: string | null,\r\n): 'success' | 'danger' | 'warning' | 'default' {\r\n switch (code) {\r\n case 'APPROVE':\r\n return 'success';\r\n case 'REJECT':\r\n return 'danger';\r\n case 'ESCALATE':\r\n return 'warning';\r\n default:\r\n return 'default';\r\n }\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, EventEmitter, Input, Output } from '@angular/core';\r\nimport { DxButtonModule, DxPopupModule, DxTextAreaModule } from 'devextreme-angular';\r\nimport { NavigatorLocalizePipe } from '../form-navigator/navigator-localize.pipe';\r\n\r\n/**\r\n * نافذة تأكيد تنفيذ انتقال دورة عمل — مشتركة بين شريط الدورة على المستند\r\n * (workflow-actions) و«اعتماداتي» (فردي وجماعي)، فيبقى الشكل والسلوك واحدًا.\r\n *\r\n * الشكل: زر التنفيذ بلون نتيجة الانتقال (Tint) و«لا» نصّي بجانبه،\r\n * متجاوران في نهاية السطر (يسار في العربي).\r\n */\r\n@Component({\r\n selector: 'app-workflow-confirm-dialog',\r\n standalone: true,\r\n imports: [CommonModule, DxPopupModule, DxTextAreaModule, DxButtonModule, NavigatorLocalizePipe],\r\n templateUrl: './workflow-confirm-dialog.component.html',\r\n})\r\nexport class WorkflowConfirmDialogComponent {\r\n @Input() visible = false;\r\n @Output() visibleChange = new EventEmitter<boolean>();\r\n\r\n /** عنوان بديل (مثل «تنفيذ جماعي»)؛ الافتراضي «تأكيد الإجراء». */\r\n @Input() title?: string | null;\r\n\r\n /** اسم الانتقال المعروض. */\r\n @Input() actionName = '';\r\n\r\n /** رمز نوع الانتقال (APPROVE / REJECT / …) — يحدد لون زر التنفيذ. */\r\n @Input() transitionTypeCode?: string | null;\r\n\r\n /** رقم المستند في التنفيذ الفردي. */\r\n @Input() documentNumber?: string | null;\r\n\r\n /** عدد العناصر في التنفيذ الجماعي (يُقدَّم على documentNumber إن وُجد). */\r\n @Input() itemsCount?: number | null;\r\n\r\n @Input() noteRequired = false;\r\n\r\n @Input() note = '';\r\n @Output() noteChange = new EventEmitter<string>();\r\n\r\n @Input() executing = false;\r\n\r\n @Output() confirmed = new EventEmitter<void>();\r\n @Output() cancelled = new EventEmitter<void>();\r\n\r\n get isBulk(): boolean {\r\n return this.itemsCount != null;\r\n }\r\n\r\n get buttonType(): 'success' | 'danger' | 'warning' | 'default' {\r\n switch (this.transitionTypeCode) {\r\n case 'APPROVE': return 'success';\r\n case 'REJECT': return 'danger';\r\n case 'ESCALATE': return 'warning';\r\n default: return 'default';\r\n }\r\n }\r\n\r\n get canConfirm(): boolean {\r\n return !this.executing && (!this.noteRequired || (this.note ?? '').trim().length > 0);\r\n }\r\n\r\n onVisibleChange(value: boolean): void {\r\n this.visible = value;\r\n this.visibleChange.emit(value);\r\n }\r\n\r\n onNoteChange(value: string): void {\r\n this.note = value ?? '';\r\n this.noteChange.emit(this.note);\r\n }\r\n\r\n confirm(): void {\r\n if (this.canConfirm) this.confirmed.emit();\r\n }\r\n\r\n cancel(): void {\r\n this.cancelled.emit();\r\n }\r\n}\r\n","<dx-popup\r\n [visible]=\"visible\"\r\n (visibleChange)=\"onVisibleChange($event)\"\r\n [showTitle]=\"true\"\r\n [title]=\"title || ('workflow.confirmAction' | localize: 'تأكيد الإجراء')\"\r\n [width]=\"480\"\r\n [height]=\"'auto'\"\r\n [dragEnabled]=\"true\"\r\n [hideOnOutsideClick]=\"false\"\r\n [showCloseButton]=\"true\"\r\n>\r\n <div *dxTemplate=\"let data of 'content'\">\r\n <p class=\"mb-3 text-sm\">\r\n {{ 'workflow.confirmExecute' | localize: 'هل تريد بالتأكيد تنفيذ الإجراء' }}\r\n \"<b>{{ actionName }}</b>\"\r\n @if (isBulk) {\r\n {{ 'workflow.onItems' | localize: 'على {0} عنصر' : itemsCount }}؟\r\n } @else {\r\n @if (documentNumber) {\r\n {{ 'workflow.onDocument' | localize: 'على الوثيقة' }}\r\n <b>{{ documentNumber }}</b>؟\r\n } @else {\r\n {{ 'workflow.onThisDocument' | localize: 'على هذه الوثيقة' }}؟\r\n }\r\n }\r\n </p>\r\n\r\n <div class=\"mb-3\">\r\n <label class=\"mb-1 block text-xs font-bold\">\r\n @if (noteRequired) {\r\n {{ 'workflow.reasonNote' | localize: 'السبب / الملاحظة' }}\r\n <span class=\"text-red-600\">*</span>\r\n } @else {\r\n {{ 'workflow.optionalNote' | localize: 'ملاحظة (اختيارية)' }}\r\n }\r\n </label>\r\n <dx-text-area\r\n [value]=\"note\"\r\n (valueChange)=\"onNoteChange($event)\"\r\n valueChangeEvent=\"input\"\r\n [height]=\"70\"\r\n [placeholder]=\"noteRequired ? ('workflow.writeReason' | localize: 'اكتب سبب الإجراء…') : ''\"\r\n ></dx-text-area>\r\n </div>\r\n\r\n <!-- الأزرار متجاورة في نهاية السطر (يسار في العربي): التنفيذ بلون نتيجة الانتقال، ثم «لا» -->\r\n <div class=\"flex items-center justify-end gap-2\">\r\n <dx-button\r\n [text]=\"'workflow.yesExecute' | localize: 'نعم — تنفيذ'\"\r\n [type]=\"buttonType\"\r\n stylingMode=\"contained\"\r\n [elementAttr]=\"{ class: 'fx-tint' }\"\r\n [disabled]=\"!canConfirm\"\r\n (onClick)=\"confirm()\"\r\n ></dx-button>\r\n <dx-button\r\n [text]=\"'workflow.no' | localize: 'لا'\"\r\n stylingMode=\"text\"\r\n (onClick)=\"cancel()\"\r\n ></dx-button>\r\n </div>\r\n </div>\r\n</dx-popup>\r\n","import { CommonModule } from '@angular/common';\r\nimport {\r\n Component,\r\n EventEmitter,\r\n Inject,\r\n Input,\r\n OnChanges,\r\n OnDestroy,\r\n Output,\r\n SimpleChanges,\r\n} from '@angular/core';\r\nimport { DxButtonModule } from 'devextreme-angular';\r\nimport { firstValueFrom, forkJoin, of, Subscription } from 'rxjs';\r\nimport { catchError } from 'rxjs/operators';\r\nimport {\r\n FORM_NAVIGATOR_ADAPTER,\r\n FormNavigatorAdapter,\r\n} from '../form-navigator/form-navigator-adapter';\r\nimport { NavigatorLocalizePipe } from '../form-navigator/navigator-localize.pipe';\r\nimport { WorkflowConfirmDialogComponent } from '../workflow-confirm-dialog/workflow-confirm-dialog.component';\r\nimport {\r\n WORKFLOW_ACTIONS_PROVIDER,\r\n WorkflowActionsProvider,\r\n WorkflowAvailableTransition,\r\n WorkflowDocumentContext,\r\n WorkflowInstanceResult,\r\n WorkflowStateChain,\r\n workflowTransitionButtonClass,\r\n workflowTransitionDxType,\r\n} from './workflow-actions-provider';\r\n\r\n/** Bulk mode: one selected document and its running cycle (null = none). */\r\ninterface BulkDocument {\r\n documentId: string;\r\n instance: WorkflowInstanceResult | null;\r\n}\r\n\r\n/** Bulk mode: a transition executable on every selected document. */\r\ninterface BulkTransition {\r\n /** Representative row (first document's) — label, tone and icon come from it. */\r\n transition: WorkflowAvailableTransition;\r\n requireNote: boolean;\r\n /** Each document's own transition row: the same label is a different row per state. */\r\n byDocument: Map<string, WorkflowAvailableTransition>;\r\n}\r\n\r\n@Component({\r\n selector: 'app-workflow-actions',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n DxButtonModule,\r\n NavigatorLocalizePipe,\r\n WorkflowConfirmDialogComponent,\r\n ],\r\n templateUrl: './workflow-actions.component.html',\r\n styleUrl: './workflow-actions.component.scss',\r\n})\r\nexport class WorkflowActionsComponent implements OnChanges, OnDestroy {\r\n @Input() documentTypeId: string | null = null;\r\n @Input() documentId: string | null = null;\r\n @Input() documentNumber: string | null = null;\r\n /**\r\n * هل لنوع المستند دورة فعّالة في الكيان الحالي؟ الشاشات الديناميكية تمرّرها من\r\n * تعريف الشاشة (has_Active_Workflow). غير مُمرَّرة (شاشة استاتيك) ⟵ تُسأل الخدمة\r\n * بطلب خفيف واحد لكل نوع، بالتوازي مع context. تحدد مؤشر التحميل فقط؛ رد context\r\n * يبقى هو الحاكم لما يُعرض بعده.\r\n */\r\n @Input() hasWorkflow: boolean | null = null;\r\n\r\n /** إظهار «جارٍ تحميل دورة العمل…» أثناء loading. */\r\n showLoadingHint = false;\r\n @Input() containerClass = '';\r\n\r\n /**\r\n * Bulk mode — pass the grid's selected ids here instead of `documentId`. The component\r\n * then offers only the transitions executable on **every** selected document and runs\r\n * them through bulk-apply-transition. `null` (the default) keeps the single-document\r\n * mode every existing screen uses, untouched.\r\n */\r\n @Input() documentIds: string[] | null = null;\r\n /** Bulk mode only: raised after a run that changed at least one document. */\r\n @Output() bulkCompleted = new EventEmitter<void>();\r\n\r\n get isBulkMode(): boolean {\r\n return this.documentIds !== null;\r\n }\r\n\r\n get documentDisplayValue(): string {\r\n // Never the record's GUID: without a number the dialog names \"this document\".\r\n return this.documentNumber?.trim() || '';\r\n }\r\n\r\n\r\n @Output() changed = new EventEmitter<WorkflowInstanceResult | null>();\r\n // اختصار للشاشات البسيطة: حالة المستند فقط، وتُطلق عند توفرها — بعد كل انتقال\r\n // **وبعد التحميل الأول** أيضًا، لأن اسم عمود الحالة ميتاداتا لكل نوع مستند\r\n // (workflow_document_type.status_field_name — trade_document مثلًا يخزّنها في\r\n // workflow_status_id لا status_id) فالشاشة لا تعرف من أي حقل تقرأها، والمكوّن\r\n // يعرفها من الخادم. توصيلة قالب واحدة (statusChanged)=\"...\" تكفي.\r\n @Output() statusChanged = new EventEmitter<string>();\r\n\r\n loading = false;\r\n instance: WorkflowInstanceResult | null = null;\r\n transitions: WorkflowAvailableTransition[] = [];\r\n documentStatusName = '';\r\n\r\n confirmVisible = false;\r\n pendingTransition: WorkflowAvailableTransition | null = null;\r\n noteText = '';\r\n executing = false;\r\n // ─── bulk mode state ───\r\n bulkLoading = false;\r\n bulkTransitions: BulkTransition[] = [];\r\n pendingBulk: BulkTransition | null = null;\r\n private bulkDocs: BulkDocument[] = [];\r\n\r\n /**\r\n * How many selected documents have no workflow cycle (e.g. a «مرحّل» record that never\r\n * entered the cycle). Such a document has no actions, so it alone empties the shared\r\n * list — the message says so instead of a bare «no common action».\r\n */\r\n get bulkWithoutCycleCount(): number {\r\n return this.bulkDocs.filter((d) => !d.instance).length;\r\n }\r\n private bulkLoadSeq = 0;\r\n\r\n private loadPromise: Promise<void> | null = null;\r\n private activeLoadKey = '';\r\n private lastLoadedKey = '';\r\n private reloadRequested = false;\r\n private readonly workflowUpdateSubscription: Subscription;\r\n\r\n constructor(\r\n @Inject(WORKFLOW_ACTIONS_PROVIDER)\r\n private wfProvider: WorkflowActionsProvider,\r\n @Inject(FORM_NAVIGATOR_ADAPTER)\r\n private adapter: FormNavigatorAdapter,\r\n ) {\r\n this.workflowUpdateSubscription = this.wfProvider.workflowUpdates$.subscribe(\r\n (message) => {\r\n if (\r\n message.documentTypeId.toLowerCase() ===\r\n this.documentTypeId?.toLowerCase() &&\r\n message.documentId.toLowerCase() === this.documentId?.toLowerCase()\r\n ) {\r\n void this.load(true);\r\n }\r\n },\r\n );\r\n }\r\n\r\n get isAr(): boolean {\r\n return this.wfProvider.isArabic();\r\n }\r\n\r\n async ngOnChanges(changes: SimpleChanges): Promise<void> {\r\n if (this.isBulkMode) {\r\n if (changes['documentIds'] || changes['documentTypeId']) await this.loadBulk();\r\n return;\r\n }\r\n if (changes['documentId'] || changes['documentTypeId']) {\r\n await this.load(false);\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.workflowUpdateSubscription.unsubscribe();\r\n }\r\n\r\n async refresh(): Promise<void> {\r\n await this.load(true);\r\n }\r\n\r\n private async load(force = false): Promise<void> {\r\n if (!this.documentTypeId || !this.documentId) {\r\n this.instance = null;\r\n this.transitions = [];\r\n this.documentStatusName = '';\r\n this.activeLoadKey = '';\r\n this.lastLoadedKey = '';\r\n this.reloadRequested = false;\r\n return;\r\n }\r\n\r\n const loadKey = `${this.documentTypeId}:${this.documentId}`;\r\n const documentTypeId = this.documentTypeId;\r\n const documentId = this.documentId;\r\n\r\n if (!force && loadKey === this.lastLoadedKey) return;\r\n\r\n if (this.loadPromise) {\r\n if (force || loadKey !== this.activeLoadKey) {\r\n this.reloadRequested = true;\r\n }\r\n await this.loadPromise;\r\n if (this.reloadRequested) {\r\n this.reloadRequested = false;\r\n await this.load(true);\r\n }\r\n return;\r\n }\r\n\r\n this.activeLoadKey = loadKey;\r\n this.loadPromise = this.loadContext(loadKey, documentTypeId, documentId);\r\n try {\r\n await this.loadPromise;\r\n } finally {\r\n this.loadPromise = null;\r\n this.activeLoadKey = '';\r\n }\r\n\r\n if (this.reloadRequested) {\r\n this.reloadRequested = false;\r\n await this.load(true);\r\n }\r\n }\r\n private async loadContext(\r\n loadKey: string,\r\n documentTypeId: string,\r\n documentId: string,\r\n ): Promise<void> {\r\n this.instance = null;\r\n this.transitions = [];\r\n this.documentStatusName = '';\r\n\r\n this.resolveLoadingHint(documentTypeId);\r\n this.loading = true;\r\n try {\r\n const ctx = await firstValueFrom(\r\n this.wfProvider.getDocumentContext(documentTypeId, documentId),\r\n );\r\n this.instance = ctx.instance;\r\n this.transitions = ctx.instance?.available_Transitions ?? [];\r\n this.documentStatusName =\r\n (this.isAr\r\n ? ctx.document_Status_Name_Ar\r\n : ctx.document_Status_Name_En) ||\r\n ctx.document_Status_Name_Ar ||\r\n '';\r\n\r\n // قفل allow_edit في الشاشة يقرأ الحالة من هنا لا من formData (انظر تعليق statusChanged).\r\n const loadedStatusId = ctx.instance?.document_Status_Id;\r\n if (loadedStatusId) this.statusChanged.emit(loadedStatusId);\r\n } catch (err: unknown) {\r\n this.adapter.notify('error', this.extractError(err));\r\n } finally {\r\n this.loading = false;\r\n this.lastLoadedKey = loadKey;\r\n }\r\n }\r\n\r\n /** معروفة من الشاشة ⟵ فورًا؛ وإلا لا مؤشر حتى يصل الرد الخفيف (لا ننتظره قبل context). */\r\n private resolveLoadingHint(documentTypeId: string): void {\r\n if (this.hasWorkflow !== null) {\r\n this.showLoadingHint = this.hasWorkflow;\r\n return;\r\n }\r\n this.showLoadingHint = false;\r\n this.wfProvider.hasActiveWorkflow?.(documentTypeId)?.subscribe((has) => {\r\n if (documentTypeId === this.documentTypeId) this.showLoadingHint = has;\r\n });\r\n }\r\n\r\n onTransitionClick(tr: WorkflowAvailableTransition): void {\r\n // حارس ثانٍ بجوار [disabled]: النقر البرمجي لا يمرّ، والخادم يرفض على أي حال.\r\n if (!tr.can_Execute) return;\r\n\r\n this.pendingTransition = tr;\r\n this.noteText = '';\r\n this.confirmVisible = true;\r\n }\r\n\r\n get noteRequired(): boolean {\r\n return this.pendingBulk\r\n ? this.pendingBulk.requireNote\r\n : (this.pendingTransition?.require_Note ?? false);\r\n }\r\n\r\n get canConfirm(): boolean {\r\n return (\r\n !this.executing && (!this.noteRequired || this.noteText.trim().length > 0)\r\n );\r\n }\r\n\r\n async confirmExecute(): Promise<void> {\r\n if (this.pendingBulk) return this.confirmBulk(this.pendingBulk);\r\n if (!this.instance || !this.pendingTransition || !this.canConfirm) return;\r\n\r\n this.executing = true;\r\n try {\r\n const result = await firstValueFrom(\r\n this.wfProvider.applyTransition(this.instance.instance_Id, {\r\n transition_Id: this.pendingTransition.id,\r\n notes: this.noteText.trim() || null,\r\n expected_State_Id: this.instance.current_State_Id,\r\n }),\r\n );\r\n\r\n this.confirmVisible = false;\r\n this.instance = result;\r\n this.transitions = result.available_Transitions ?? [];\r\n this.adapter.notify('success', \r\n this.isAr ? 'تم تنفيذ الإجراء بنجاح' : 'Action executed successfully',\r\n );\r\n this.emitAfterChange();\r\n } catch (err: unknown) {\r\n const key = this.errorBody(err)?.details?.errorKey?.[0];\r\n if (key === 'WorkflowStateConflictException') {\r\n this.confirmVisible = false;\r\n await this.load(true);\r\n this.emitAfterChange();\r\n } else {\r\n this.adapter.notify('error', this.extractError(err));\r\n }\r\n } finally {\r\n this.executing = false;\r\n }\r\n }\r\n\r\n cancelConfirm(): void {\r\n this.confirmVisible = false;\r\n this.pendingTransition = null;\r\n this.pendingBulk = null;\r\n this.noteText = '';\r\n }\r\n\r\n // ─── Bulk mode ──────────────────────────────────────────────────────────\r\n\r\n onBulkTransitionClick(bulk: BulkTransition): void {\r\n this.pendingBulk = bulk;\r\n this.pendingTransition = bulk.transition; // drives the popup's label and tone\r\n this.noteText = '';\r\n this.confirmVisible = true;\r\n }\r\n\r\n /**\r\n * Reads each selected document's context (the same call the single mode makes, so a\r\n * draft's cycle starts lazily exactly as opening it would) and keeps the transitions\r\n * executable on all of them.\r\n */\r\n private async loadBulk(): Promise<void> {\r\n const seq = ++this.bulkLoadSeq;\r\n this.bulkTransitions = [];\r\n this.bulkDocs = [];\r\n\r\n const typeId = this.documentTypeId;\r\n const ids = [...new Set(this.documentIds ?? [])];\r\n if (!typeId || ids.length === 0) {\r\n this.bulkLoading = false;\r\n return;\r\n }\r\n\r\n this.bulkLoading = true;\r\n const contexts = await firstValueFrom(\r\n forkJoin(\r\n ids.map((id) =>\r\n this.wfProvider\r\n .getDocumentContext(typeId, id)\r\n .pipe(catchError(() => of(null as WorkflowDocumentContext | null))),\r\n ),\r\n ),\r\n );\r\n\r\n // A newer selection started while these were in flight — its load owns the result.\r\n if (seq !== this.bulkLoadSeq) return;\r\n\r\n this.bulkDocs = ids.map((id, i) => ({\r\n documentId: id,\r\n instance: contexts[i]?.instance ?? null,\r\n }));\r\n this.bulkTransitions = this.commonTransitions(this.bulkDocs);\r\n this.bulkLoading = false;\r\n }\r\n\r\n /**\r\n * Transitions executable on every selected document. Matched by name because the same\r\n * label is a different transition row per state («إلغاء» leaves both «مسودة» and «معتمد»).\r\n * A document with no running cycle makes the intersection empty.\r\n */\r\n private commonTransitions(docs: BulkDocument[]): BulkTransition[] {\r\n if (docs.length === 0 || docs.some((d) => !d.instance)) return [];\r\n\r\n const executable = (d: BulkDocument) =>\r\n (d.instance!.available_Transitions ?? []).filter((t) => t.can_Execute);\r\n\r\n const [first, ...rest] = docs;\r\n const result: BulkTransition[] = [];\r\n\r\n for (const t of executable(first)) {\r\n const byDocument = new Map<string, WorkflowAvailableTransition>([[first.documentId, t]]);\r\n const onAll = rest.every((d) => {\r\n const match = executable(d).find((x) => x.transition_Name_Ar === t.transition_Name_Ar);\r\n if (match) byDocument.set(d.documentId, match);\r\n return !!match;\r\n });\r\n if (!onAll) continue;\r\n\r\n result.push({\r\n transition: t,\r\n requireNote: [...byDocument.values()].some((x) => x.require_Note),\r\n byDocument,\r\n });\r\n }\r\n return result;\r\n }\r\n\r\n private async confirmBulk(bulk: BulkTransition): Promise<void> {\r\n if (!this.canConfirm) return;\r\n\r\n const items = this.bulkDocs\r\n .map((d) => {\r\n const own = bulk.byDocument.get(d.documentId);\r\n return own && d.instance\r\n ? {\r\n instance_Id: d.instance.instance_Id,\r\n transition_Id: own.id,\r\n expected_State_Id: d.instance.current_State_Id,\r\n }\r\n : null;\r\n })\r\n .filter((x): x is NonNullable<typeof x> => x !== null);\r\n\r\n if (!this.wfProvider.bulkApplyTransition) {\r\n this.adapter.notify('error', this.isAr ? 'التنفيذ الجماعي غير مدعوم من الـprovider' : 'Bulk apply is not supported by the provider');\r\n return;\r\n }\r\n this.executing = true;\r\n try {\r\n const res = await firstValueFrom(\r\n this.wfProvider.bulkApplyTransition({\r\n items,\r\n notes: this.noteText.trim() || null,\r\n }),\r\n );\r\n\r\n if (res.succeeded > 0) {\r\n this.adapter.notify('success', \r\n this.isAr\r\n ? `تم تنفيذ الإجراء على ${res.succeeded} عنصر`\r\n : `Action executed on ${res.succeeded} item(s)`,\r\n );\r\n }\r\n if (res.failed > 0) {\r\n const reason = this.bulkErrorText(res.errors[0]?.error_Key, res.errors[0]?.message);\r\n this.adapter.notify('error', \r\n this.isAr\r\n ? `تعذّر التنفيذ على ${res.failed} عنصر — ${reason}`\r\n : `Failed on ${res.failed} item(s) — ${reason}`,\r\n );\r\n }\r\n this.cancelConfirm();\r\n if (res.succeeded > 0) this.bulkCompleted.emit();\r\n else await this.loadBulk();\r\n } catch (err: unknown) {\r\n this.adapter.notify('error', this.extractError(err));\r\n } finally {\r\n this.executing = false;\r\n }\r\n }\r\n\r\n /**\r\n * bulk-apply-transition reports each failure as the exception's type name and raw\r\n * Message — for a business exception both are the localization key, not the text the\r\n * single path shows (that one is localized by ApiExceptionMiddleware).\r\n */\r\n private bulkErrorText(key?: string | null, message?: string | null): string {\r\n for (const k of [key, message]) {\r\n if (!k) continue;\r\n const normalized = k.trim().toLowerCase();\r\n const text = this.wfProvider.translate?.(normalized);\r\n if (text && text.toLowerCase() !== normalized) return text;\r\n }\r\n return message || key || '';\r\n }\r\n\r\n private emitAfterChange(): void {\r\n this.changed.emit(this.instance);\r\n const statusId = this.instance?.document_Status_Id;\r\n if (statusId) this.statusChanged.emit(statusId);\r\n }\r\nget isCompleted(): boolean {\r\n return !!this.instance?.completed_On;\r\n }\r\n\r\n get stateName(): string {\r\n return (\r\n (this.isAr\r\n ? this.instance?.current_State_Name_Ar\r\n : this.instance?.current_State_Name_En) ||\r\n this.instance?.current_State_Name_Ar ||\r\n ''\r\n );\r\n }\r\n\r\n\r\n get chainStates(): WorkflowStateChain[] {\r\n return this.instance?.states ?? [];\r\n }\r\n\r\n get pathStates(): WorkflowStateChain[] {\r\n const states = this.chainStates;\r\n const currentEnd = states.find(\r\n (s) => s.is_Current && s.state_Type_Code === 'END',\r\n );\r\n if (!currentEnd) return states.filter((s) => s.state_Type_Code !== 'END');\r\n return [\r\n ...states.filter(\r\n (s) => s.state_Type_Code !== 'END' && s.is_Passed && !s.is_Current,\r\n ),\r\n currentEnd,\r\n ];\r\n }\r\n\r\n chainStateName(s: WorkflowStateChain): string {\r\n return (\r\n (this.isAr ? s.state_Name_Ar : s.state_Name_En) || s.state_Name_Ar || ''\r\n );\r\n }\r\n\r\n /**\r\n * ثلاث حالات بصرية لا اثنتان:\r\n * الحالية → بارزة (زرقاء بإطار)\r\n * مرّ بها → مؤكَّدة لكن هادئة (خضراء باهتة)\r\n * لم يصلها → باهتة\r\n * و «مرّ بها» يحسبها الخادم من سجل الحركة، فالرجوع للخلف يُطفئ ما بعده.\r\n */\r\n chainStateClass(s: WorkflowStateChain): string {\r\n const base =\r\n 'inline-block whitespace-nowrap rounded-full border px-2.5 py-0.5 text-[11px]';\r\n\r\n if (s.is_Current)\r\n return `${base} border-blue-300 bg-blue-100 font-bold text-blue-700`;\r\n\r\n if (s.is_Passed)\r\n return `${base} border-green-200 bg-green-50 text-green-700`;\r\n\r\n return `${base} border-gray-200 bg-gray-50 text-gray-400`;\r\n }\r\n\r\n transitionName(tr: WorkflowAvailableTransition): string {\r\n return (\r\n (this.isAr ? tr.transition_Name_Ar : tr.transition_Name_En) ||\r\n tr.transition_Name_Ar\r\n );\r\n }\r\n\r\n transitionButtonClass(tr: WorkflowAvailableTransition): string {\r\n // Sits in the document strip above the form → strip height (DESIGN.html §5).\r\n return workflowTransitionButtonClass(tr.transition_Type_Code);\r\n }\r\n\r\n /** DevExtreme `type` of the confirm button = the pending transition's consequence. */\r\n get pendingTransitionType(): 'success' | 'danger' | 'warning' | 'default' {\r\n return workflowTransitionDxType(this.pendingTransition?.transition_Type_Code);\r\n }\r\n\r\n /**\r\n * مفتاح سبب التعطيل كما أرسله الخادم — نفس مفتاح الاستثناء الذي يردّه عند\r\n * محاولة التجاوز، فلا تفترق رسالة التلميح عن رسالة الرفض.\r\n */\r\n transitionDisabledKey(tr: WorkflowAvailableTransition): string {\r\n return tr.disabled_Reason_Key || 'WorkflowTransitionPermissionDeniedException';\r\n }\r\n\r\n /**\r\n * The API's `{ error: { message, details } }` body. ErrorInterceptor re-throws non-GET\r\n * failures as a plain `Error` (message = the server text) and keeps the HttpErrorResponse\r\n * on `.original`; GET failures and throttled ones arrive as the raw HttpErrorResponse.\r\n * Reading only `err.error.error` missed the first shape, so every rejected transition\r\n * showed the generic text instead of the server's reason.\r\n */\r\n private errorBody(\r\n err: unknown,\r\n ): { message?: string; details?: { errorKey?: string[] } } | undefined {\r\n const e = err as { original?: { error?: unknown }; error?: unknown };\r\n const body = (e?.original?.error ?? e?.error) as\r\n | { error?: { message?: string; details?: { errorKey?: string[] } } }\r\n | undefined;\r\n return body?.error;\r\n }\r\n\r\n private extractError(err: unknown): string {\r\n return (\r\n this.errorBody(err)?.message ||\r\n (err instanceof Error && err.message ? err.message : undefined) ||\r\n (this.isAr\r\n ? 'حدث خطأ أثناء تنفيذ العملية'\r\n : 'An error occurred while executing the operation')\r\n );\r\n }\r\n}\r\n","<div [ngClass]=\"containerClass\">\r\n @if (isBulkMode) {\r\n <!-- Bulk mode (grid selection): actions shared by every selected document -->\r\n @if (documentIds?.length) {\r\n <div class=\"flex flex-wrap items-center gap-2\">\r\n @if (bulkLoading) {\r\n <span class=\"text-[12px] text-gray-400\">\r\n {{ 'workflow.loading' | localize: 'جارٍ التحميل…' }}\r\n </span>\r\n } @else if (!bulkTransitions.length) {\r\n <span class=\"whitespace-nowrap text-[11px] text-gray-400\">\r\n @if (bulkWithoutCycleCount > 0) {\r\n {{ 'workflow.selectionWithoutCycle' | localize: 'عناصر محددة بدون دورة عمل:' }}\r\n {{ bulkWithoutCycleCount }}\r\n —\r\n {{ 'workflow.selectionWithoutCycleHint' | localize: 'حالتها لا تسمح بأي إجراء، ألغِ تحديدها' }}\r\n } @else if (documentIds?.length === 1) {\r\n {{ 'workflow.noAvailableAction' | localize: 'لا يوجد إجراء متاح للعنصر المحدد في حالته الحالية' }}\r\n } @else {\r\n {{ 'workflow.noCommonAction' | localize: 'لا يوجد إجراء مشترك بين العناصر المحددة' }}\r\n }\r\n </span>\r\n } @else {\r\n @for (b of bulkTransitions; track b.transition.transition_Name_Ar) {\r\n <button\r\n type=\"button\"\r\n [class]=\"transitionButtonClass(b.transition)\"\r\n [disabled]=\"executing\"\r\n (click)=\"onBulkTransitionClick(b)\"\r\n >\r\n {{ transitionName(b.transition) }}\r\n </button>\r\n }\r\n }\r\n </div>\r\n }\r\n } @else if (documentId) {\r\n @if (loading) {\r\n <!-- لا يظهر لنوع مستند بلا دورة فعّالة — انظر resolveLoadingHint -->\r\n @if (showLoadingHint) {\r\n <div class=\"flex items-center gap-2 px-1 py-2 text-[12px] text-gray-400\">\r\n <span class=\"wf-loading-spinner\" aria-hidden=\"true\"></span>\r\n {{ 'workflow.loadingBar' | localize: 'جارٍ تحميل دورة العمل…' }}\r\n </div>\r\n }\r\n } @else if (!instance) {\r\n \r\n @if (documentStatusName) {\r\n <div\r\n class=\"flex flex-wrap items-center gap-2 rounded-md border border-gray-200 bg-gray-50 px-3 py-2\"\r\n >\r\n <span class=\"text-[12px] text-gray-500\">\r\n {{ 'workflow.currentState' | localize: 'الحالة' }}:\r\n </span>\r\n <span\r\n class=\"inline-block rounded-full bg-gray-200 px-2.5 py-0.5 text-[11px] font-bold text-gray-700\"\r\n >\r\n {{ documentStatusName }}\r\n </span>\r\n </div>\r\n }\r\n } @else if (isCompleted) {\r\n <!--\r\n الدورة انتهت: يُعرض ما مرّ به المستند ثم النهاية التي وصلها (هي الحالة\r\n الحالية)، لا النتيجة وحدها ولا النهايات الأخرى التي لم تحدث.\r\n -->\r\n <div\r\n class=\"flex flex-wrap items-center gap-1.5 rounded-md border border-gray-200 bg-gray-50 px-3 py-2\"\r\n >\r\n @if (chainStates.length) {\r\n @for (s of pathStates; track s.state_Id; let last = $last) {\r\n <span [class]=\"chainStateClass(s)\">{{ chainStateName(s) }}</span>\r\n @if (!last) {\r\n <span class=\"text-[11px] text-gray-300\">←</span>\r\n }\r\n }\r\n } @else {\r\n <span class=\"text-[12px] text-gray-500\">\r\n {{ 'workflow.finalResult' | localize: 'نتيجة الدورة' }}:\r\n </span>\r\n <span\r\n class=\"inline-block rounded-full bg-green-100 px-2.5 py-0.5 text-[11px] font-bold text-green-700\"\r\n >\r\n {{ stateName }}\r\n </span>\r\n }\r\n </div>\r\n } @else {\r\n <!-- شريط المسار: كل مراحل الدورة، الملوَّن منها ما مرّ به الطلب فعلًا -->\r\n <div\r\n class=\"flex flex-wrap items-center gap-1.5 rounded-md border border-gray-200 bg-gray-50 px-3 py-2\"\r\n >\r\n @if (chainStates.length) {\r\n @for (s of pathStates; track s.state_Id; let last = $last) {\r\n <span [class]=\"chainStateClass(s)\">{{ chainStateName(s) }}</span>\r\n @if (!last) {\r\n <span class=\"text-[11px] text-gray-300\">←</span>\r\n }\r\n }\r\n } @else {\r\n <!-- دورة بلا حالات مسجَّلة: يبقى العرض القديم بالحالة الحالية وحدها -->\r\n <span class=\"text-[12px] text-gray-500\">\r\n {{ 'workflow.currentState' | localize: 'الحالة' }}:\r\n </span>\r\n <span\r\n class=\"inline-block rounded-full bg-blue-100 px-2.5 py-0.5 text-[11px] font-bold text-blue-700\"\r\n >\r\n {{ stateName }}\r\n </span>\r\n }\r\n\r\n <span class=\"flex-1\"></span>\r\n\r\n @for (tr of transitions; track tr.id) {\r\n <!--\r\n التلميح على الغلاف لا على الزر: المتصفّحات لا تُطلق أحداث المؤشّر على\r\n عنصر disabled، فـ title عليه قد لا يظهر إطلاقًا — والغلاف يستقبلها.\r\n -->\r\n <span\r\n class=\"inline-flex\"\r\n [title]=\"\r\n tr.can_Execute\r\n ? ''\r\n : (transitionDisabledKey(tr)\r\n | localize: 'لا تملك صلاحية تنفيذ هذا الإجراء.')\r\n \"\r\n >\r\n <button\r\n type=\"button\"\r\n [class]=\"transitionButtonClass(tr)\"\r\n [disabled]=\"!tr.can_Execute\"\r\n (click)=\"onTransitionClick(tr)\"\r\n >\r\n {{ transitionName(tr) }}\r\n </button>\r\n </span>\r\n }\r\n @if (!transitions.length) {\r\n @if (instance.no_Responsible) {\r\n <!-- المرحلة بلا مسؤول: الطلب واقف، فنقول لصاحبه يتواصل مع من يعالج الدورة -->\r\n <span class=\"text-[11px] font-semibold text-amber-600\">\r\n {{\r\n 'workflow.noResponsible'\r\n | localize\r\n : 'لا يوجد مسؤول لهذه المرحلة — يرجى التواصل مع مدير النظام أو الموارد البشرية أو من أعدّ دورة العمل'\r\n }}\r\n </span>\r\n } @else {\r\n <span class=\"text-[11px] text-gray-400\">\r\n {{ 'workflow.waitingOthers' | localize: 'بانتظار إجراء من مسؤول آخر' }}\r\n </span>\r\n }\r\n }\r\n </div>\r\n }\r\n }\r\n</div>\r\n<app-workflow-confirm-dialog\r\n [(visible)]=\"confirmVisible\"\r\n [actionName]=\"pendingTransition ? transitionName(pendingTransition) : ''\"\r\n [transitionTypeCode]=\"pendingTransition?.transition_Type_Code\"\r\n [documentNumber]=\"documentDisplayValue\"\r\n [itemsCount]=\"pendingBulk ? pendingBulk.byDocument.size : null\"\r\n [noteRequired]=\"noteRequired\"\r\n [(note)]=\"noteText\"\r\n [executing]=\"executing\"\r\n (confirmed)=\"confirmExecute()\"\r\n (cancelled)=\"cancelConfirm()\"\r\n></app-workflow-confirm-dialog>\r\n","import { InjectionToken } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\n\r\n/**\r\n * Host-supplied services for the workflow toolbar.\r\n *\r\n * Shaped to match Flexora's `WorkflowActionService` structurally so the host\r\n * can wire it with `{ provide: WORKFLOW_TOOLBAR_PROVIDER, useExisting: WorkflowActionService }`.\r\n * Other hosts implement the two methods however they load/map their workflow actions.\r\n */\r\nexport interface WorkflowToolbarProvider {\r\n /** Available actions for (workflowId, statusId). */\r\n getAvailableWorkflowActions(\r\n workflowId: any,\r\n statusId: any,\r\n ): Observable<any[]>;\r\n\r\n /**\r\n * Maps raw action DTOs to toolbar items ({ text, iconClass, btnClass, hint,\r\n * onClick, disabled?, visible? }). The callback executes one action.\r\n */\r\n mapWorkflowActionsItems(\r\n actions: any[],\r\n applyWorkflowCallback: (actionId: any) => Promise<void>,\r\n ): any[];\r\n}\r\n\r\nexport const WORKFLOW_TOOLBAR_PROVIDER =\r\n new InjectionToken<WorkflowToolbarProvider>('WORKFLOW_TOOLBAR_PROVIDER');\r\n","import { CommonModule } from '@angular/common';\r\nimport {\r\n Component,\r\n Inject,\r\n Input,\r\n OnChanges,\r\n SimpleChanges,\r\n} from '@angular/core';\r\nimport { Guid } from 'devextreme/common';\r\nimport { firstValueFrom } from 'rxjs';\r\nimport {\r\n FORM_NAVIGATOR_ADAPTER,\r\n FormNavigatorAdapter,\r\n} from '../form-navigator/form-navigator-adapter';\r\nimport {\r\n WORKFLOW_TOOLBAR_PROVIDER,\r\n WorkflowToolbarProvider,\r\n} from './workflow-toolbar-provider';\r\n\r\nexport interface WorkflowToolbarItem {\r\n text: string;\r\n iconClass?: string;\r\n btnClass?: string;\r\n hint?: string;\r\n onClick?: () => void;\r\n disabled?: boolean;\r\n visible?: boolean;\r\n}\r\n\r\n@Component({\r\n selector: 'app-workflow-toolbar',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './workflow-toolbar.component.html',\r\n styleUrls: ['./workflow-toolbar.component.scss'],\r\n})\r\nexport class WorkflowToolbarComponent implements OnChanges {\r\n @Input() containerClass: string = '';\r\n @Input() showEmpty: boolean = false;\r\n @Input() compact: boolean = false;\r\n\r\n @Input() workflowId?: Guid | null;\r\n @Input() statusId?: Guid | null;\r\n @Input() documentId?: Guid | null;\r\n\r\n @Input() applyWorkflowCallback?: (\r\n actionId: Guid,\r\n documentId: Guid | null,\r\n ) => Promise<any[]>;\r\n\r\n /**\r\n * Optional hook run AFTER a workflow action succeeds. The host (screen) uses\r\n * it to refresh its grid and return the affected record's NEW status id; the\r\n * toolbar then reloads its own buttons for that new status. This centralizes\r\n * the \"reload the buttons after any action\" behaviour here instead of each\r\n * screen re-implementing it. When not provided, the toolbar falls back to\r\n * mapping the actions returned by applyWorkflowCallback (single-record flows).\r\n */\r\n @Input() resolveStatusAfterApply?: () => Promise<Guid | null | undefined>;\r\n\r\n toolbarItems: WorkflowToolbarItem[] = [];\r\n\r\n constructor(\r\n @Inject(WORKFLOW_TOOLBAR_PROVIDER)\r\n private workflowProvider: WorkflowToolbarProvider,\r\n @Inject(FORM_NAVIGATOR_ADAPTER)\r\n private adapter: FormNavigatorAdapter,\r\n ) {}\r\n\r\n get visibleItems(): WorkflowToolbarItem[] {\r\n return (this.toolbarItems ?? []).filter((i) => i.visible !== false);\r\n }\r\n\r\n async ngOnChanges(changes: SimpleChanges): Promise<void> {\r\n if (!!changes['statusId'] || !!changes['workflowId']) {\r\n await this.loadWorkflowActions();\r\n }\r\n }\r\n\r\n private async loadWorkflowActions(): Promise<void> {\r\n if (!this.workflowId || !this.statusId) {\r\n this.toolbarItems = [];\r\n return;\r\n }\r\n\r\n const actions = await firstValueFrom(\r\n this.workflowProvider.getAvailableWorkflowActions(\r\n this.workflowId!,\r\n this.statusId!,\r\n ),\r\n );\r\n\r\n this.mapWorkflowActionsItems(actions);\r\n\r\n if (!this.showEmpty) {\r\n this.showEmpty = this.visibleItems.length === 0;\r\n }\r\n }\r\n\r\n private mapWorkflowActionsItems(actions: any[]): void {\r\n this.toolbarItems = this.workflowProvider.mapWorkflowActionsItems(\r\n actions,\r\n this.applyWorkflow.bind(this),\r\n ) as WorkflowToolbarItem[];\r\n }\r\n\r\n async applyWorkflow(actionId: Guid): Promise<void> {\r\n try {\r\n const resActions = await this.applyWorkflowCallback!(\r\n actionId,\r\n this.documentId ?? null,\r\n );\r\n\r\n // Centralized reload: resolve the record's NEW status after the action and\r\n // reload the buttons for it, so the correct actions come back automatically.\r\n if (this.resolveStatusAfterApply) {\r\n const newStatusId = await this.resolveStatusAfterApply();\r\n this.statusId = newStatusId ?? null;\r\n await this.loadWorkflowActions();\r\n return;\r\n }\r\n\r\n if (resActions) {\r\n this.mapWorkflowActionsItems(resActions);\r\n }\r\n } catch (err: any) {\r\n const msg =\r\n err?.error?.error?.detail?.exception?.[0] ||\r\n err?.error?.error?.message ||\r\n err?.error?.message ||\r\n err?.message ||\r\n 'حدث خطأ أثناء تنفيذ العملية';\r\n this.adapter.notify('error', msg);\r\n }\r\n }\r\n\r\n onItemClick(item: WorkflowToolbarItem): void {\r\n if (!item.disabled && item.onClick) item.onClick();\r\n }\r\n\r\n trackByFn(index: number, item: WorkflowToolbarItem): string {\r\n return item.text + index;\r\n }\r\n}\r\n","<!-- Workflow Actions Toolbar -->\r\n<!--\r\n visibleItems.length شرط ضروري: لو الشاشة بلا workflow يخرج loadWorkflowActions\r\n مبكرًا فلا يضبط showEmpty، وكانت الحاوية تُرسم فارغة (مربع رمادي) في وضع التعديل.\r\n-->\r\n<div\r\n [class.workflow-toolbar-container]=\"!compact\"\r\n [ngClass]=\"containerClass\"\r\n *ngIf=\"!showEmpty && visibleItems.length > 0\"\r\n>\r\n <div class=\"workflow-toolbar-buttons\">\r\n @for (\r\n item of visibleItems;\r\n track trackByFn($index, item);\r\n let isLast = $last\r\n ) {\r\n <button\r\n type=\"button\"\r\n class=\"workflow-action-btn\"\r\n [ngClass]=\"item.btnClass\"\r\n [class.disabled]=\"item.disabled\"\r\n [title]=\"item.hint || item.text\"\r\n [disabled]=\"item.disabled\"\r\n (click)=\"onItemClick(item)\"\r\n >\r\n @if (item.iconClass) {\r\n <i [class]=\"item.iconClass\"></i>\r\n }\r\n <span>{{ item.text }}</span>\r\n </button>\r\n @if (!isLast) {\r\n <span class=\"toolbar-separator\"></span>\r\n }\r\n }\r\n </div>\r\n</div>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.SmartLookupHostService","i2","i3","i1","modulePrefix","DxDataGridModule","i4","i5"],"mappings":"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"}