@masterteam/components 0.0.179 → 0.0.181
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/masterteam-components-confirmation.mjs +2 -2
- package/fesm2022/masterteam-components-confirmation.mjs.map +1 -1
- package/fesm2022/masterteam-components-field-validation.mjs +24 -4
- package/fesm2022/masterteam-components-field-validation.mjs.map +1 -1
- package/fesm2022/masterteam-components-modal.mjs +28 -5
- package/fesm2022/masterteam-components-modal.mjs.map +1 -1
- package/fesm2022/masterteam-components-table.mjs +21 -7
- package/fesm2022/masterteam-components-table.mjs.map +1 -1
- package/fesm2022/masterteam-components-tabs.mjs +2 -2
- package/fesm2022/masterteam-components-tabs.mjs.map +1 -1
- package/fesm2022/masterteam-components-user-search-field.mjs +34 -4
- package/fesm2022/masterteam-components-user-search-field.mjs.map +1 -1
- package/package.json +16 -16
- package/types/masterteam-components-field-validation.d.ts +8 -0
- package/types/masterteam-components-modal.d.ts +5 -1
- package/types/masterteam-components-table.d.ts +2 -0
- package/types/masterteam-components-user-search-field.d.ts +2 -0
|
@@ -78,11 +78,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImpor
|
|
|
78
78
|
|
|
79
79
|
class ConfirmationDialog {
|
|
80
80
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: ConfirmationDialog, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
81
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.8", type: ConfirmationDialog, isStandalone: true, selector: "mt-confirmation-dialog", ngImport: i0, template: "<ng-template #popupTemplate let-key=\"key\">\r\n <p-confirmpopup #cp [key]=\"key\">\r\n <ng-template #headless let-data>\r\n <div class=\"flex items-center gap-2 p-3 min-w-100\">\r\n <div class=\"text-3xl mb-2\">\r\n <mt-icon [icon]=\"data.icon\"></mt-icon>\r\n </div>\r\n <div class=\"whitespace-pre-line\">{{ data.message }}</div>\r\n </div>\r\n\r\n <div class=\"flex items-center justify-end gap-2 p-3 pt-0\">\r\n <mt-button\r\n [label]=\"data.
|
|
81
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.8", type: ConfirmationDialog, isStandalone: true, selector: "mt-confirmation-dialog", ngImport: i0, template: "<ng-template #popupTemplate let-key=\"key\">\r\n <p-confirmpopup #cp [key]=\"key\">\r\n <ng-template #headless let-data>\r\n <div class=\"flex items-center gap-2 p-3 min-w-100\">\r\n <div class=\"text-3xl mb-2\">\r\n <mt-icon [icon]=\"data.icon\"></mt-icon>\r\n </div>\r\n <div class=\"whitespace-pre-line\">{{ data.message }}</div>\r\n </div>\r\n\r\n <div class=\"flex items-center justify-end gap-2 p-3 pt-0\">\r\n <mt-button\r\n [label]=\"data.rejectLabel\"\r\n [severity]=\"data.rejectButton.severity\"\r\n [variant]=\"data.rejectButton.variant\"\r\n size=\"small\"\r\n (onClick)=\"cp.onReject()\"\r\n ></mt-button>\r\n <mt-button\r\n [label]=\"data.acceptLabel\"\r\n [styleClass]=\"data.acceptButtonStyleClass\"\r\n [severity]=\"data.acceptButton.severity\"\r\n [variant]=\"data.acceptButton.variant\"\r\n size=\"small\"\r\n (onClick)=\"cp.onAccept()\"\r\n ></mt-button>\r\n </div>\r\n </ng-template>\r\n </p-confirmpopup>\r\n</ng-template>\r\n\r\n<ng-container\r\n *ngTemplateOutlet=\"popupTemplate; context: { key: 'popup1' }\"\r\n></ng-container>\r\n<ng-container\r\n *ngTemplateOutlet=\"popupTemplate; context: { key: 'popup2' }\"\r\n></ng-container>\r\n\r\n<p-confirmdialog [key]=\"'dialog'\">\r\n <ng-template\r\n #headless\r\n let-data\r\n let-onAccept=\"onAccept\"\r\n let-onReject=\"onReject\"\r\n >\r\n <div\r\n class=\"flex items-center justify-between bg-surface-100 rounded-t-xl px-4 py-2\"\r\n >\r\n <div class=\"text-xl font-semibold\">{{ data.header }}</div>\r\n <mt-button\r\n [icon]=\"'general.x-close'\"\r\n variant=\"text\"\r\n severity=\"secondary\"\r\n styleClass=\"text-8xl\"\r\n size=\"large\"\r\n (onClick)=\"onReject()\"\r\n ></mt-button>\r\n </div>\r\n\r\n <div class=\"flex items-center gap-2 p-4 min-w-100\">\r\n <div class=\"text-3xl mb-2\">\r\n <mt-icon [icon]=\"data.icon\"></mt-icon>\r\n </div>\r\n <div class=\"whitespace-pre-line\">{{ data.message }}</div>\r\n </div>\r\n\r\n <div class=\"flex items-center justify-end gap-2 mt-2 p-4\">\r\n <mt-button\r\n [label]=\"data.rejectLabel\"\r\n [severity]=\"data.rejectButton.severity\"\r\n [variant]=\"data.rejectButton.variant\"\r\n (onClick)=\"onReject()\"\r\n ></mt-button>\r\n <mt-button\r\n [label]=\"data.acceptLabel\"\r\n [styleClass]=\"data.acceptButtonStyleClass\"\r\n [severity]=\"data.acceptButton.severity\"\r\n [variant]=\"data.acceptButton.variant\"\r\n (onClick)=\"onAccept()\"\r\n ></mt-button>\r\n </div>\r\n </ng-template>\r\n</p-confirmdialog>\r\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: ConfirmDialog, selector: "p-confirmDialog, p-confirmdialog, p-confirm-dialog", inputs: ["header", "icon", "message", "style", "styleClass", "maskStyleClass", "acceptIcon", "acceptLabel", "closeAriaLabel", "acceptAriaLabel", "acceptVisible", "rejectIcon", "rejectLabel", "rejectAriaLabel", "rejectVisible", "acceptButtonStyleClass", "rejectButtonStyleClass", "closeOnEscape", "dismissableMask", "blockScroll", "rtl", "closable", "appendTo", "key", "autoZIndex", "baseZIndex", "transitionOptions", "focusTrap", "defaultFocus", "breakpoints", "modal", "visible", "position", "draggable"], outputs: ["onHide"] }, { kind: "component", type: Button, selector: "mt-button", inputs: ["icon", "label", "tooltip", "class", "type", "styleClass", "severity", "badge", "variant", "badgeSeverity", "size", "iconPos", "autofocus", "fluid", "raised", "rounded", "text", "plain", "outlined", "link", "disabled", "loading", "pInputs"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "component", type: Icon, selector: "mt-icon", inputs: ["icon"] }, { kind: "component", type: ConfirmPopup, selector: "p-confirmpopup", inputs: ["key", "defaultFocus", "showTransitionOptions", "hideTransitionOptions", "autoZIndex", "baseZIndex", "style", "styleClass", "visible", "motionOptions", "appendTo"] }] });
|
|
82
82
|
}
|
|
83
83
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: ConfirmationDialog, decorators: [{
|
|
84
84
|
type: Component,
|
|
85
|
-
args: [{ selector: 'mt-confirmation-dialog', standalone: true, imports: [CommonModule, ConfirmDialog, Button, Icon, ConfirmPopup], template: "<ng-template #popupTemplate let-key=\"key\">\r\n <p-confirmpopup #cp [key]=\"key\">\r\n <ng-template #headless let-data>\r\n <div class=\"flex items-center gap-2 p-3 min-w-100\">\r\n <div class=\"text-3xl mb-2\">\r\n <mt-icon [icon]=\"data.icon\"></mt-icon>\r\n </div>\r\n <div class=\"whitespace-pre-line\">{{ data.message }}</div>\r\n </div>\r\n\r\n <div class=\"flex items-center justify-end gap-2 p-3 pt-0\">\r\n <mt-button\r\n [label]=\"data.
|
|
85
|
+
args: [{ selector: 'mt-confirmation-dialog', standalone: true, imports: [CommonModule, ConfirmDialog, Button, Icon, ConfirmPopup], template: "<ng-template #popupTemplate let-key=\"key\">\r\n <p-confirmpopup #cp [key]=\"key\">\r\n <ng-template #headless let-data>\r\n <div class=\"flex items-center gap-2 p-3 min-w-100\">\r\n <div class=\"text-3xl mb-2\">\r\n <mt-icon [icon]=\"data.icon\"></mt-icon>\r\n </div>\r\n <div class=\"whitespace-pre-line\">{{ data.message }}</div>\r\n </div>\r\n\r\n <div class=\"flex items-center justify-end gap-2 p-3 pt-0\">\r\n <mt-button\r\n [label]=\"data.rejectLabel\"\r\n [severity]=\"data.rejectButton.severity\"\r\n [variant]=\"data.rejectButton.variant\"\r\n size=\"small\"\r\n (onClick)=\"cp.onReject()\"\r\n ></mt-button>\r\n <mt-button\r\n [label]=\"data.acceptLabel\"\r\n [styleClass]=\"data.acceptButtonStyleClass\"\r\n [severity]=\"data.acceptButton.severity\"\r\n [variant]=\"data.acceptButton.variant\"\r\n size=\"small\"\r\n (onClick)=\"cp.onAccept()\"\r\n ></mt-button>\r\n </div>\r\n </ng-template>\r\n </p-confirmpopup>\r\n</ng-template>\r\n\r\n<ng-container\r\n *ngTemplateOutlet=\"popupTemplate; context: { key: 'popup1' }\"\r\n></ng-container>\r\n<ng-container\r\n *ngTemplateOutlet=\"popupTemplate; context: { key: 'popup2' }\"\r\n></ng-container>\r\n\r\n<p-confirmdialog [key]=\"'dialog'\">\r\n <ng-template\r\n #headless\r\n let-data\r\n let-onAccept=\"onAccept\"\r\n let-onReject=\"onReject\"\r\n >\r\n <div\r\n class=\"flex items-center justify-between bg-surface-100 rounded-t-xl px-4 py-2\"\r\n >\r\n <div class=\"text-xl font-semibold\">{{ data.header }}</div>\r\n <mt-button\r\n [icon]=\"'general.x-close'\"\r\n variant=\"text\"\r\n severity=\"secondary\"\r\n styleClass=\"text-8xl\"\r\n size=\"large\"\r\n (onClick)=\"onReject()\"\r\n ></mt-button>\r\n </div>\r\n\r\n <div class=\"flex items-center gap-2 p-4 min-w-100\">\r\n <div class=\"text-3xl mb-2\">\r\n <mt-icon [icon]=\"data.icon\"></mt-icon>\r\n </div>\r\n <div class=\"whitespace-pre-line\">{{ data.message }}</div>\r\n </div>\r\n\r\n <div class=\"flex items-center justify-end gap-2 mt-2 p-4\">\r\n <mt-button\r\n [label]=\"data.rejectLabel\"\r\n [severity]=\"data.rejectButton.severity\"\r\n [variant]=\"data.rejectButton.variant\"\r\n (onClick)=\"onReject()\"\r\n ></mt-button>\r\n <mt-button\r\n [label]=\"data.acceptLabel\"\r\n [styleClass]=\"data.acceptButtonStyleClass\"\r\n [severity]=\"data.acceptButton.severity\"\r\n [variant]=\"data.acceptButton.variant\"\r\n (onClick)=\"onAccept()\"\r\n ></mt-button>\r\n </div>\r\n </ng-template>\r\n</p-confirmdialog>\r\n" }]
|
|
86
86
|
}] });
|
|
87
87
|
|
|
88
88
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"masterteam-components-confirmation.mjs","sources":["../../../../packages/masterteam/components/confirmation/confirmation.ts","../../../../packages/masterteam/components/confirmation/confirmation-dialog.ts","../../../../packages/masterteam/components/confirmation/confirmation-dialog.html","../../../../packages/masterteam/components/confirmation/masterteam-components-confirmation.ts"],"sourcesContent":["import { inject, Injectable, signal } from '@angular/core';\r\nimport {\r\n ConfirmationService as PNConfirmationService,\r\n Confirmation,\r\n} from 'primeng/api';\r\nimport { TranslocoService } from '@jsverse/transloco';\r\n\r\ninterface ButtonConfig {\r\n severity?: string | undefined;\r\n variant?: string | undefined;\r\n}\r\ninterface BaseConfirmationConfig extends Confirmation {\r\n draggable?: boolean;\r\n acceptButton?: ButtonConfig;\r\n rejectButton?: ButtonConfig;\r\n confirmationType?: string;\r\n}\r\n\r\ninterface DialogConfirmationConfig extends BaseConfirmationConfig {\r\n type?: 'dialog' | undefined;\r\n event?: Event;\r\n}\r\n\r\ninterface PopupConfirmationConfig extends BaseConfirmationConfig {\r\n type: 'popup';\r\n event: Event;\r\n}\r\n\r\nexport type ConfirmationConfig =\r\n | DialogConfirmationConfig\r\n | PopupConfirmationConfig;\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class ConfirmationService {\r\n private confirmationService = inject(PNConfirmationService);\r\n private transloco = inject(TranslocoService);\r\n private defaultConfig: ConfirmationConfig = {\r\n header: this.transloco.translate('components.confirmation.header'),\r\n message: this.transloco.translate('components.confirmation.message'),\r\n icon: 'alert.alert-triangle',\r\n acceptLabel: this.transloco.translate('components.confirmation.yes'),\r\n rejectLabel: this.transloco.translate('components.confirmation.cancel'),\r\n acceptButton: {\r\n severity: 'primary',\r\n variant: undefined,\r\n },\r\n rejectButton: {\r\n severity: 'secondary',\r\n variant: 'text',\r\n },\r\n position: 'center',\r\n type: 'dialog',\r\n closeOnEscape: true,\r\n dismissableMask: true,\r\n draggable: false,\r\n };\r\n popupKey = signal<string | undefined>('');\r\n private lastTarget: EventTarget | null = null;\r\n\r\n confirm(config: ConfirmationConfig): void {\r\n const currentTarget = config?.event?.currentTarget;\r\n this.popupKey.update((prev) => {\r\n if (config.type === 'popup') {\r\n if (this.lastTarget === currentTarget) {\r\n return prev || 'popup1';\r\n }\r\n return prev === 'popup1' ? 'popup2' : 'popup1';\r\n }\r\n return config.type;\r\n });\r\n\r\n this.lastTarget = currentTarget ?? null;\r\n this.confirmationService.close();\r\n const mergedConfig: Confirmation = {\r\n ...this.defaultConfig,\r\n ...config,\r\n target: currentTarget as EventTarget,\r\n key: this.popupKey(),\r\n };\r\n this.confirmationService.confirm(mergedConfig);\r\n }\r\n\r\n confirmDelete(config: ConfirmationConfig): void {\r\n this.confirm({\r\n message: this.transloco.translate(\r\n 'components.confirmation.deleteMessage',\r\n ),\r\n header: this.transloco.translate('components.confirmation.deleteHeader'),\r\n icon: 'general.trash-01',\r\n acceptLabel: this.transloco.translate('components.confirmation.delete'),\r\n rejectLabel: this.transloco.translate('components.confirmation.cancel'),\r\n acceptButton: {\r\n severity: 'danger',\r\n },\r\n ...config,\r\n });\r\n }\r\n}\r\n","import { Component } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ConfirmDialog } from 'primeng/confirmdialog';\r\nimport { Button } from '@masterteam/components/button';\r\nimport { Icon } from '@masterteam/icons';\r\nimport { ConfirmPopup } from 'primeng/confirmpopup';\r\n\r\n@Component({\r\n selector: 'mt-confirmation-dialog',\r\n standalone: true,\r\n imports: [CommonModule, ConfirmDialog, Button, Icon, ConfirmPopup],\r\n templateUrl: './confirmation-dialog.html',\r\n styleUrl: './confirmation-dialog.scss',\r\n})\r\nexport class ConfirmationDialog {}\r\n","<ng-template #popupTemplate let-key=\"key\">\r\n <p-confirmpopup #cp [key]=\"key\">\r\n <ng-template #headless let-data>\r\n <div class=\"flex items-center gap-2 p-3 min-w-100\">\r\n <div class=\"text-3xl mb-2\">\r\n <mt-icon [icon]=\"data.icon\"></mt-icon>\r\n </div>\r\n <div class=\"whitespace-pre-line\">{{ data.message }}</div>\r\n </div>\r\n\r\n <div class=\"flex items-center justify-end gap-2 p-3 pt-0\">\r\n <mt-button\r\n [label]=\"data.acceptLabel\"\r\n [styleClass]=\"data.acceptButtonStyleClass\"\r\n [severity]=\"data.acceptButton.severity\"\r\n [variant]=\"data.acceptButton.variant\"\r\n size=\"small\"\r\n (onClick)=\"cp.onAccept()\"\r\n ></mt-button>\r\n <mt-button\r\n [label]=\"data.rejectLabel\"\r\n [severity]=\"data.rejectButton.severity\"\r\n [variant]=\"data.rejectButton.variant\"\r\n size=\"small\"\r\n (onClick)=\"cp.onReject()\"\r\n ></mt-button>\r\n </div>\r\n </ng-template>\r\n </p-confirmpopup>\r\n</ng-template>\r\n\r\n<ng-container\r\n *ngTemplateOutlet=\"popupTemplate; context: { key: 'popup1' }\"\r\n></ng-container>\r\n<ng-container\r\n *ngTemplateOutlet=\"popupTemplate; context: { key: 'popup2' }\"\r\n></ng-container>\r\n\r\n<p-confirmdialog [key]=\"'dialog'\">\r\n <ng-template\r\n #headless\r\n let-data\r\n let-onAccept=\"onAccept\"\r\n let-onReject=\"onReject\"\r\n >\r\n <div\r\n class=\"flex items-center justify-between bg-surface-100 rounded-t-xl px-4 py-2\"\r\n >\r\n <div class=\"text-xl font-semibold\">{{ data.header }}</div>\r\n <mt-button\r\n [icon]=\"'general.x-close'\"\r\n variant=\"text\"\r\n severity=\"secondary\"\r\n styleClass=\"text-8xl\"\r\n size=\"large\"\r\n (onClick)=\"onReject()\"\r\n ></mt-button>\r\n </div>\r\n\r\n <div class=\"flex items-center gap-2 p-4 min-w-100\">\r\n <div class=\"text-3xl mb-2\">\r\n <mt-icon [icon]=\"data.icon\"></mt-icon>\r\n </div>\r\n <div class=\"whitespace-pre-line\">{{ data.message }}</div>\r\n </div>\r\n\r\n <div class=\"flex items-center justify-end gap-2 mt-2 p-4\">\r\n <mt-button\r\n [label]=\"data.acceptLabel\"\r\n [styleClass]=\"data.acceptButtonStyleClass\"\r\n [severity]=\"data.acceptButton.severity\"\r\n [variant]=\"data.acceptButton.variant\"\r\n (onClick)=\"onAccept()\"\r\n ></mt-button>\r\n <mt-button\r\n [label]=\"data.rejectLabel\"\r\n [severity]=\"data.rejectButton.severity\"\r\n [variant]=\"data.rejectButton.variant\"\r\n (onClick)=\"onReject()\"\r\n ></mt-button>\r\n </div>\r\n </ng-template>\r\n</p-confirmdialog>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["PNConfirmationService"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"masterteam-components-confirmation.mjs","sources":["../../../../packages/masterteam/components/confirmation/confirmation.ts","../../../../packages/masterteam/components/confirmation/confirmation-dialog.ts","../../../../packages/masterteam/components/confirmation/confirmation-dialog.html","../../../../packages/masterteam/components/confirmation/masterteam-components-confirmation.ts"],"sourcesContent":["import { inject, Injectable, signal } from '@angular/core';\r\nimport {\r\n ConfirmationService as PNConfirmationService,\r\n Confirmation,\r\n} from 'primeng/api';\r\nimport { TranslocoService } from '@jsverse/transloco';\r\n\r\ninterface ButtonConfig {\r\n severity?: string | undefined;\r\n variant?: string | undefined;\r\n}\r\ninterface BaseConfirmationConfig extends Confirmation {\r\n draggable?: boolean;\r\n acceptButton?: ButtonConfig;\r\n rejectButton?: ButtonConfig;\r\n confirmationType?: string;\r\n}\r\n\r\ninterface DialogConfirmationConfig extends BaseConfirmationConfig {\r\n type?: 'dialog' | undefined;\r\n event?: Event;\r\n}\r\n\r\ninterface PopupConfirmationConfig extends BaseConfirmationConfig {\r\n type: 'popup';\r\n event: Event;\r\n}\r\n\r\nexport type ConfirmationConfig =\r\n | DialogConfirmationConfig\r\n | PopupConfirmationConfig;\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class ConfirmationService {\r\n private confirmationService = inject(PNConfirmationService);\r\n private transloco = inject(TranslocoService);\r\n private defaultConfig: ConfirmationConfig = {\r\n header: this.transloco.translate('components.confirmation.header'),\r\n message: this.transloco.translate('components.confirmation.message'),\r\n icon: 'alert.alert-triangle',\r\n acceptLabel: this.transloco.translate('components.confirmation.yes'),\r\n rejectLabel: this.transloco.translate('components.confirmation.cancel'),\r\n acceptButton: {\r\n severity: 'primary',\r\n variant: undefined,\r\n },\r\n rejectButton: {\r\n severity: 'secondary',\r\n variant: 'text',\r\n },\r\n position: 'center',\r\n type: 'dialog',\r\n closeOnEscape: true,\r\n dismissableMask: true,\r\n draggable: false,\r\n };\r\n popupKey = signal<string | undefined>('');\r\n private lastTarget: EventTarget | null = null;\r\n\r\n confirm(config: ConfirmationConfig): void {\r\n const currentTarget = config?.event?.currentTarget;\r\n this.popupKey.update((prev) => {\r\n if (config.type === 'popup') {\r\n if (this.lastTarget === currentTarget) {\r\n return prev || 'popup1';\r\n }\r\n return prev === 'popup1' ? 'popup2' : 'popup1';\r\n }\r\n return config.type;\r\n });\r\n\r\n this.lastTarget = currentTarget ?? null;\r\n this.confirmationService.close();\r\n const mergedConfig: Confirmation = {\r\n ...this.defaultConfig,\r\n ...config,\r\n target: currentTarget as EventTarget,\r\n key: this.popupKey(),\r\n };\r\n this.confirmationService.confirm(mergedConfig);\r\n }\r\n\r\n confirmDelete(config: ConfirmationConfig): void {\r\n this.confirm({\r\n message: this.transloco.translate(\r\n 'components.confirmation.deleteMessage',\r\n ),\r\n header: this.transloco.translate('components.confirmation.deleteHeader'),\r\n icon: 'general.trash-01',\r\n acceptLabel: this.transloco.translate('components.confirmation.delete'),\r\n rejectLabel: this.transloco.translate('components.confirmation.cancel'),\r\n acceptButton: {\r\n severity: 'danger',\r\n },\r\n ...config,\r\n });\r\n }\r\n}\r\n","import { Component } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ConfirmDialog } from 'primeng/confirmdialog';\r\nimport { Button } from '@masterteam/components/button';\r\nimport { Icon } from '@masterteam/icons';\r\nimport { ConfirmPopup } from 'primeng/confirmpopup';\r\n\r\n@Component({\r\n selector: 'mt-confirmation-dialog',\r\n standalone: true,\r\n imports: [CommonModule, ConfirmDialog, Button, Icon, ConfirmPopup],\r\n templateUrl: './confirmation-dialog.html',\r\n styleUrl: './confirmation-dialog.scss',\r\n})\r\nexport class ConfirmationDialog {}\r\n","<ng-template #popupTemplate let-key=\"key\">\r\n <p-confirmpopup #cp [key]=\"key\">\r\n <ng-template #headless let-data>\r\n <div class=\"flex items-center gap-2 p-3 min-w-100\">\r\n <div class=\"text-3xl mb-2\">\r\n <mt-icon [icon]=\"data.icon\"></mt-icon>\r\n </div>\r\n <div class=\"whitespace-pre-line\">{{ data.message }}</div>\r\n </div>\r\n\r\n <div class=\"flex items-center justify-end gap-2 p-3 pt-0\">\r\n <mt-button\r\n [label]=\"data.rejectLabel\"\r\n [severity]=\"data.rejectButton.severity\"\r\n [variant]=\"data.rejectButton.variant\"\r\n size=\"small\"\r\n (onClick)=\"cp.onReject()\"\r\n ></mt-button>\r\n <mt-button\r\n [label]=\"data.acceptLabel\"\r\n [styleClass]=\"data.acceptButtonStyleClass\"\r\n [severity]=\"data.acceptButton.severity\"\r\n [variant]=\"data.acceptButton.variant\"\r\n size=\"small\"\r\n (onClick)=\"cp.onAccept()\"\r\n ></mt-button>\r\n </div>\r\n </ng-template>\r\n </p-confirmpopup>\r\n</ng-template>\r\n\r\n<ng-container\r\n *ngTemplateOutlet=\"popupTemplate; context: { key: 'popup1' }\"\r\n></ng-container>\r\n<ng-container\r\n *ngTemplateOutlet=\"popupTemplate; context: { key: 'popup2' }\"\r\n></ng-container>\r\n\r\n<p-confirmdialog [key]=\"'dialog'\">\r\n <ng-template\r\n #headless\r\n let-data\r\n let-onAccept=\"onAccept\"\r\n let-onReject=\"onReject\"\r\n >\r\n <div\r\n class=\"flex items-center justify-between bg-surface-100 rounded-t-xl px-4 py-2\"\r\n >\r\n <div class=\"text-xl font-semibold\">{{ data.header }}</div>\r\n <mt-button\r\n [icon]=\"'general.x-close'\"\r\n variant=\"text\"\r\n severity=\"secondary\"\r\n styleClass=\"text-8xl\"\r\n size=\"large\"\r\n (onClick)=\"onReject()\"\r\n ></mt-button>\r\n </div>\r\n\r\n <div class=\"flex items-center gap-2 p-4 min-w-100\">\r\n <div class=\"text-3xl mb-2\">\r\n <mt-icon [icon]=\"data.icon\"></mt-icon>\r\n </div>\r\n <div class=\"whitespace-pre-line\">{{ data.message }}</div>\r\n </div>\r\n\r\n <div class=\"flex items-center justify-end gap-2 mt-2 p-4\">\r\n <mt-button\r\n [label]=\"data.rejectLabel\"\r\n [severity]=\"data.rejectButton.severity\"\r\n [variant]=\"data.rejectButton.variant\"\r\n (onClick)=\"onReject()\"\r\n ></mt-button>\r\n <mt-button\r\n [label]=\"data.acceptLabel\"\r\n [styleClass]=\"data.acceptButtonStyleClass\"\r\n [severity]=\"data.acceptButton.severity\"\r\n [variant]=\"data.acceptButton.variant\"\r\n (onClick)=\"onAccept()\"\r\n ></mt-button>\r\n </div>\r\n </ng-template>\r\n</p-confirmdialog>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["PNConfirmationService"],"mappings":"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"}
|
|
@@ -70,8 +70,24 @@ class FieldValidation {
|
|
|
70
70
|
control = input(null, ...(ngDevMode ? [{ debugName: "control" }] : /* istanbul ignore next */ []));
|
|
71
71
|
touched = input(false, { ...(ngDevMode ? { debugName: "touched" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
72
72
|
isInvalid = isInvalid;
|
|
73
|
+
/**
|
|
74
|
+
* Reserve the error-message line whenever the control can surface an error —
|
|
75
|
+
* i.e. it has sync/async validators, or is already showing one. This keeps the
|
|
76
|
+
* field's height constant so showing the error never pushes sibling fields or
|
|
77
|
+
* the content below the row. Re-evaluated each change-detection cycle, so it
|
|
78
|
+
* picks up validators that fields add asynchronously after init.
|
|
79
|
+
*/
|
|
80
|
+
shouldReserveSpace() {
|
|
81
|
+
const control = this.control();
|
|
82
|
+
if (!control) {
|
|
83
|
+
return false;
|
|
84
|
+
}
|
|
85
|
+
return (control.validator !== null ||
|
|
86
|
+
control.asyncValidator !== null ||
|
|
87
|
+
isInvalid(control));
|
|
88
|
+
}
|
|
73
89
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: FieldValidation, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
74
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.8", type: FieldValidation, isStandalone: true, selector: "mt-field-validation", inputs: { control: { classPropertyName: "control", publicName: "control", isSignal: true, isRequired: false, transformFunction: null }, touched: { classPropertyName: "touched", publicName: "touched", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class.
|
|
90
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.8", type: FieldValidation, isStandalone: true, selector: "mt-field-validation", inputs: { control: { classPropertyName: "control", publicName: "control", isSignal: true, isRequired: false, transformFunction: null }, touched: { classPropertyName: "touched", publicName: "touched", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class.mt-field-validation--reserved": "shouldReserveSpace()" }, classAttribute: "mt-field-validation" }, ngImport: i0, template: `
|
|
75
91
|
@if (isInvalid(control())) {
|
|
76
92
|
<p-message
|
|
77
93
|
severity="error"
|
|
@@ -81,7 +97,7 @@ class FieldValidation {
|
|
|
81
97
|
>
|
|
82
98
|
</p-message>
|
|
83
99
|
}
|
|
84
|
-
`, isInline: true, dependencies: [{ kind: "component", type: Message, selector: "p-message", inputs: ["severity", "text", "escape", "style", "styleClass", "closable", "icon", "closeIcon", "life", "showTransitionOptions", "hideTransitionOptions", "size", "variant", "motionOptions"], outputs: ["onClose"] }, { kind: "pipe", type: ErrorMessagePipe, name: "errorMessage" }] });
|
|
100
|
+
`, isInline: true, styles: [".mt-field-validation{display:none}.mt-field-validation--reserved{display:block;min-height:1.25rem}\n"], dependencies: [{ kind: "component", type: Message, selector: "p-message", inputs: ["severity", "text", "escape", "style", "styleClass", "closable", "icon", "closeIcon", "life", "showTransitionOptions", "hideTransitionOptions", "size", "variant", "motionOptions"], outputs: ["onClose"] }, { kind: "pipe", type: ErrorMessagePipe, name: "errorMessage" }] });
|
|
85
101
|
}
|
|
86
102
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: FieldValidation, decorators: [{
|
|
87
103
|
type: Component,
|
|
@@ -96,8 +112,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImpor
|
|
|
96
112
|
</p-message>
|
|
97
113
|
}
|
|
98
114
|
`, host: {
|
|
99
|
-
|
|
100
|
-
|
|
115
|
+
class: 'mt-field-validation',
|
|
116
|
+
// Reserve one line of space for fields that can produce an error so the
|
|
117
|
+
// message appears/disappears without shifting the field height (and the
|
|
118
|
+
// rest of the form). Fields with no validators stay compact.
|
|
119
|
+
'[class.mt-field-validation--reserved]': 'shouldReserveSpace()',
|
|
120
|
+
}, styles: [".mt-field-validation{display:none}.mt-field-validation--reserved{display:block;min-height:1.25rem}\n"] }]
|
|
101
121
|
}], propDecorators: { control: [{ type: i0.Input, args: [{ isSignal: true, alias: "control", required: false }] }], touched: [{ type: i0.Input, args: [{ isSignal: true, alias: "touched", required: false }] }] } });
|
|
102
122
|
|
|
103
123
|
const characterLimitValidator = (maxLength) => (control) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"masterteam-components-field-validation.mjs","sources":["../../../../packages/masterteam/components/field-validation/error-message.pipe.ts","../../../../packages/masterteam/components/field-validation/field-validation.ts","../../../../packages/masterteam/components/field-validation/character-limit.validator.ts","../../../../packages/masterteam/components/field-validation/masterteam-components-field-validation.ts"],"sourcesContent":["import { inject, Pipe, PipeTransform } from '@angular/core';\r\nimport { ValidationErrors } from '@angular/forms';\r\nimport { TranslocoService } from '@jsverse/transloco';\r\n\r\n@Pipe({\r\n name: 'errorMessage',\r\n standalone: true,\r\n pure: false,\r\n})\r\nexport class ErrorMessagePipe implements PipeTransform {\r\n private readonly translocoService = inject(TranslocoService);\r\n\r\n transform(errors: ValidationErrors | null): string {\r\n if (!errors) {\r\n return '';\r\n }\r\n\r\n const t = (key: string, params?: object) =>\r\n this.translocoService.translate(`components.validation.${key}`, params);\r\n\r\n if (errors['required']) {\r\n return t('required');\r\n }\r\n if (errors['email']) {\r\n return t('email');\r\n }\r\n if (errors['minlength']) {\r\n const { requiredLength } = errors['minlength'];\r\n return t('minLength', { requiredLength });\r\n }\r\n if (errors['maxlength']) {\r\n const { requiredLength } = errors['maxlength'];\r\n return t('maxLength', { requiredLength });\r\n }\r\n if (errors['characterLimit']) {\r\n const { requiredLength } = errors['characterLimit'];\r\n return t('maxLength', { requiredLength });\r\n }\r\n if (errors['min']) {\r\n const { min } = errors['min'];\r\n return t('min', { min });\r\n }\r\n if (errors['max']) {\r\n const { max } = errors['max'];\r\n return t('max', { max });\r\n }\r\n if (errors['pattern']) {\r\n return t('pattern');\r\n }\r\n if (errors['fileSizeLimited']) {\r\n return t('fileSizeLimited');\r\n }\r\n\r\n // Handle custom errors that provide their own message\r\n for (const key in errors) {\r\n const errorValue = errors[key];\r\n if (errorValue && typeof errorValue === 'object' && errorValue.message) {\r\n return errorValue.message;\r\n }\r\n }\r\n\r\n // Fallback for any other error\r\n const firstErrorKey = Object.keys(errors)[0];\r\n return t('invalid', { key: firstErrorKey });\r\n }\r\n}\r\n","import { booleanAttribute, Component, input } from '@angular/core';\r\nimport { Message } from 'primeng/message';\r\nimport { AbstractControl } from '@angular/forms';\r\nimport { ErrorMessagePipe } from './error-message.pipe';\r\nimport { isInvalid } from '@masterteam/components';\r\n\r\n@Component({\r\n selector: 'mt-field-validation',\r\n standalone: true,\r\n imports: [Message, ErrorMessagePipe],\r\n template: `\r\n @if (isInvalid(control())) {\r\n <p-message\r\n severity=\"error\"\r\n variant=\"simple\"\r\n size=\"small\"\r\n [text]=\"control().errors | errorMessage\"\r\n >\r\n </p-message>\r\n }\r\n `,\r\n host: {\r\n '[class.
|
|
1
|
+
{"version":3,"file":"masterteam-components-field-validation.mjs","sources":["../../../../packages/masterteam/components/field-validation/error-message.pipe.ts","../../../../packages/masterteam/components/field-validation/field-validation.ts","../../../../packages/masterteam/components/field-validation/character-limit.validator.ts","../../../../packages/masterteam/components/field-validation/masterteam-components-field-validation.ts"],"sourcesContent":["import { inject, Pipe, PipeTransform } from '@angular/core';\r\nimport { ValidationErrors } from '@angular/forms';\r\nimport { TranslocoService } from '@jsverse/transloco';\r\n\r\n@Pipe({\r\n name: 'errorMessage',\r\n standalone: true,\r\n pure: false,\r\n})\r\nexport class ErrorMessagePipe implements PipeTransform {\r\n private readonly translocoService = inject(TranslocoService);\r\n\r\n transform(errors: ValidationErrors | null): string {\r\n if (!errors) {\r\n return '';\r\n }\r\n\r\n const t = (key: string, params?: object) =>\r\n this.translocoService.translate(`components.validation.${key}`, params);\r\n\r\n if (errors['required']) {\r\n return t('required');\r\n }\r\n if (errors['email']) {\r\n return t('email');\r\n }\r\n if (errors['minlength']) {\r\n const { requiredLength } = errors['minlength'];\r\n return t('minLength', { requiredLength });\r\n }\r\n if (errors['maxlength']) {\r\n const { requiredLength } = errors['maxlength'];\r\n return t('maxLength', { requiredLength });\r\n }\r\n if (errors['characterLimit']) {\r\n const { requiredLength } = errors['characterLimit'];\r\n return t('maxLength', { requiredLength });\r\n }\r\n if (errors['min']) {\r\n const { min } = errors['min'];\r\n return t('min', { min });\r\n }\r\n if (errors['max']) {\r\n const { max } = errors['max'];\r\n return t('max', { max });\r\n }\r\n if (errors['pattern']) {\r\n return t('pattern');\r\n }\r\n if (errors['fileSizeLimited']) {\r\n return t('fileSizeLimited');\r\n }\r\n\r\n // Handle custom errors that provide their own message\r\n for (const key in errors) {\r\n const errorValue = errors[key];\r\n if (errorValue && typeof errorValue === 'object' && errorValue.message) {\r\n return errorValue.message;\r\n }\r\n }\r\n\r\n // Fallback for any other error\r\n const firstErrorKey = Object.keys(errors)[0];\r\n return t('invalid', { key: firstErrorKey });\r\n }\r\n}\r\n","import { booleanAttribute, Component, input } from '@angular/core';\r\nimport { Message } from 'primeng/message';\r\nimport { AbstractControl } from '@angular/forms';\r\nimport { ErrorMessagePipe } from './error-message.pipe';\r\nimport { isInvalid } from '@masterteam/components';\r\n\r\n@Component({\r\n selector: 'mt-field-validation',\r\n standalone: true,\r\n imports: [Message, ErrorMessagePipe],\r\n template: `\r\n @if (isInvalid(control())) {\r\n <p-message\r\n severity=\"error\"\r\n variant=\"simple\"\r\n size=\"small\"\r\n [text]=\"control().errors | errorMessage\"\r\n >\r\n </p-message>\r\n }\r\n `,\r\n host: {\r\n class: 'mt-field-validation',\r\n // Reserve one line of space for fields that can produce an error so the\r\n // message appears/disappears without shifting the field height (and the\r\n // rest of the form). Fields with no validators stay compact.\r\n '[class.mt-field-validation--reserved]': 'shouldReserveSpace()',\r\n },\r\n styles: `\r\n .mt-field-validation {\r\n display: none;\r\n }\r\n .mt-field-validation--reserved {\r\n display: block;\r\n min-height: 1.25rem;\r\n }\r\n `,\r\n})\r\nexport class FieldValidation {\r\n readonly control = input<AbstractControl | null>(null);\r\n readonly touched = input<boolean, unknown>(false, {\r\n transform: booleanAttribute,\r\n });\r\n\r\n isInvalid = isInvalid;\r\n\r\n /**\r\n * Reserve the error-message line whenever the control can surface an error —\r\n * i.e. it has sync/async validators, or is already showing one. This keeps the\r\n * field's height constant so showing the error never pushes sibling fields or\r\n * the content below the row. Re-evaluated each change-detection cycle, so it\r\n * picks up validators that fields add asynchronously after init.\r\n */\r\n shouldReserveSpace(): boolean {\r\n const control = this.control();\r\n if (!control) {\r\n return false;\r\n }\r\n return (\r\n control.validator !== null ||\r\n control.asyncValidator !== null ||\r\n isInvalid(control)\r\n );\r\n }\r\n}\r\n","import { AbstractControl, ValidationErrors, ValidatorFn } from '@angular/forms';\r\n\r\nexport const characterLimitValidator =\r\n (maxLength: number): ValidatorFn =>\r\n (control: AbstractControl): ValidationErrors | null => {\r\n const value = control.value;\r\n\r\n if (value === null || value === undefined) {\r\n return null;\r\n }\r\n\r\n const length = String(value).length;\r\n\r\n return length > maxLength\r\n ? {\r\n characterLimit: {\r\n requiredLength: maxLength,\r\n actualLength: length,\r\n },\r\n }\r\n : null;\r\n };\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { DrawerService } from '@masterteam/components/dynamic-drawer';
|
|
2
2
|
import { DialogService } from '@masterteam/components/dialog';
|
|
3
|
+
import { DOCUMENT } from '@angular/common';
|
|
3
4
|
import * as i0 from '@angular/core';
|
|
4
5
|
import { inject, Injectable } from '@angular/core';
|
|
5
|
-
import { Directionality } from '@angular/cdk/bidi';
|
|
6
6
|
|
|
7
7
|
class ModalService {
|
|
8
8
|
drawerService = inject(DrawerService);
|
|
9
9
|
dialogService = inject(DialogService);
|
|
10
|
-
|
|
10
|
+
doc = inject(DOCUMENT);
|
|
11
11
|
openRefs = new Set();
|
|
12
12
|
footerClass = 'mt-modal-footer';
|
|
13
13
|
contentClass = 'mt-modal-content';
|
|
@@ -16,7 +16,6 @@ class ModalService {
|
|
|
16
16
|
let ref;
|
|
17
17
|
if (modalType === 'drawer') {
|
|
18
18
|
config.position = this.handelStartEndPosition(config.position);
|
|
19
|
-
console.log('Opening drawer with config:', config);
|
|
20
19
|
ref = this.drawerService.open(component, config);
|
|
21
20
|
}
|
|
22
21
|
else {
|
|
@@ -43,16 +42,40 @@ class ModalService {
|
|
|
43
42
|
}
|
|
44
43
|
}
|
|
45
44
|
handelStartEndPosition(position) {
|
|
45
|
+
const direction = this.resolveCurrentDirection();
|
|
46
46
|
if (position === 'start') {
|
|
47
|
-
return
|
|
47
|
+
return direction === 'rtl' ? 'right' : 'left';
|
|
48
48
|
}
|
|
49
49
|
else if (position === 'end') {
|
|
50
|
-
return
|
|
50
|
+
return direction === 'rtl' ? 'left' : 'right';
|
|
51
51
|
}
|
|
52
52
|
else {
|
|
53
53
|
return position || 'right';
|
|
54
54
|
}
|
|
55
55
|
}
|
|
56
|
+
resolveCurrentDirection() {
|
|
57
|
+
const root = this.doc.documentElement;
|
|
58
|
+
return (this.readDirectionAttribute(root) ??
|
|
59
|
+
this.normalizeDirection(root?.dir) ??
|
|
60
|
+
this.readComputedDirection(root) ??
|
|
61
|
+
'ltr');
|
|
62
|
+
}
|
|
63
|
+
readDirectionAttribute(element) {
|
|
64
|
+
return this.normalizeDirection(element?.getAttribute('dir'));
|
|
65
|
+
}
|
|
66
|
+
readComputedDirection(element) {
|
|
67
|
+
if (!element || !this.doc.defaultView?.getComputedStyle) {
|
|
68
|
+
return null;
|
|
69
|
+
}
|
|
70
|
+
return this.normalizeDirection(this.doc.defaultView.getComputedStyle(element).direction);
|
|
71
|
+
}
|
|
72
|
+
normalizeDirection(value) {
|
|
73
|
+
return value?.toLowerCase() === 'rtl'
|
|
74
|
+
? 'rtl'
|
|
75
|
+
: value?.toLowerCase() === 'ltr'
|
|
76
|
+
? 'ltr'
|
|
77
|
+
: null;
|
|
78
|
+
}
|
|
56
79
|
trackRef(ref) {
|
|
57
80
|
if (!ref)
|
|
58
81
|
return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"masterteam-components-modal.mjs","sources":["../../../../packages/masterteam/components/modal/modal.ts","../../../../packages/masterteam/components/modal/masterteam-components-modal.ts"],"sourcesContent":["import {\r\n DynamicDrawerConfigInterface,\r\n DrawerService,\r\n} from '@masterteam/components/dynamic-drawer';\r\nimport {\r\n DynamicDialogConfig,\r\n DynamicDialogRef,\r\n DialogService,\r\n} from '@masterteam/components/dialog';\r\nimport {
|
|
1
|
+
{"version":3,"file":"masterteam-components-modal.mjs","sources":["../../../../packages/masterteam/components/modal/modal.ts","../../../../packages/masterteam/components/modal/masterteam-components-modal.ts"],"sourcesContent":["import {\r\n DynamicDrawerConfigInterface,\r\n DrawerService,\r\n} from '@masterteam/components/dynamic-drawer';\r\nimport {\r\n DynamicDialogConfig,\r\n DynamicDialogRef,\r\n DialogService,\r\n} from '@masterteam/components/dialog';\r\nimport { DOCUMENT } from '@angular/common';\r\nimport { inject, Injectable } from '@angular/core';\r\n\r\ntype LayoutDirection = 'ltr' | 'rtl';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class ModalService {\r\n readonly drawerService: DrawerService = inject(DrawerService);\r\n readonly dialogService: DialogService = inject(DialogService);\r\n private readonly doc = inject(DOCUMENT);\r\n\r\n private readonly openRefs = new Set<DynamicDialogRef>();\r\n\r\n footerClass: string = 'mt-modal-footer';\r\n contentClass: string = 'mt-modal-content';\r\n modalConfig: any;\r\n\r\n openModal(\r\n component: any,\r\n modalType: 'drawer' | 'dialog',\r\n config: DynamicDialogConfig | DynamicDrawerConfigInterface,\r\n ) {\r\n let ref: DynamicDialogRef;\r\n if (modalType === 'drawer') {\r\n config.position = this.handelStartEndPosition(config.position);\r\n ref = this.drawerService.open(component, config);\r\n } else {\r\n ref = this.dialogService.open(component, config) as DynamicDialogRef;\r\n }\r\n\r\n this.trackRef(ref);\r\n return ref;\r\n }\r\n\r\n /**\r\n * Closes every modal/drawer opened through this service.\r\n * Useful on session expiry, forced logout, or any global reset\r\n * where leftover popups would confuse the user.\r\n */\r\n closeAll(): void {\r\n const refs = Array.from(this.openRefs);\r\n this.openRefs.clear();\r\n for (const ref of refs) {\r\n try {\r\n ref?.close?.();\r\n } catch {\r\n // best-effort: ignore failures on individual refs\r\n }\r\n }\r\n }\r\n\r\n handelStartEndPosition(position: string | undefined): string {\r\n const direction = this.resolveCurrentDirection();\r\n\r\n if (position === 'start') {\r\n return direction === 'rtl' ? 'right' : 'left';\r\n } else if (position === 'end') {\r\n return direction === 'rtl' ? 'left' : 'right';\r\n } else {\r\n return position || 'right';\r\n }\r\n }\r\n\r\n private resolveCurrentDirection(): LayoutDirection {\r\n const root = this.doc.documentElement;\r\n\r\n return (\r\n this.readDirectionAttribute(root) ??\r\n this.normalizeDirection(root?.dir) ??\r\n this.readComputedDirection(root) ??\r\n 'ltr'\r\n );\r\n }\r\n\r\n private readDirectionAttribute(\r\n element: Element | null | undefined,\r\n ): LayoutDirection | null {\r\n return this.normalizeDirection(element?.getAttribute('dir'));\r\n }\r\n\r\n private readComputedDirection(\r\n element: Element | null | undefined,\r\n ): LayoutDirection | null {\r\n if (!element || !this.doc.defaultView?.getComputedStyle) {\r\n return null;\r\n }\r\n\r\n return this.normalizeDirection(\r\n this.doc.defaultView.getComputedStyle(element).direction,\r\n );\r\n }\r\n\r\n private normalizeDirection(\r\n value: string | null | undefined,\r\n ): LayoutDirection | null {\r\n return value?.toLowerCase() === 'rtl'\r\n ? 'rtl'\r\n : value?.toLowerCase() === 'ltr'\r\n ? 'ltr'\r\n : null;\r\n }\r\n\r\n private trackRef(ref: DynamicDialogRef | undefined | null): void {\r\n if (!ref) return;\r\n this.openRefs.add(ref);\r\n const cleanup = () => this.openRefs.delete(ref);\r\n ref.onClose?.subscribe({\r\n next: cleanup,\r\n error: cleanup,\r\n complete: cleanup,\r\n });\r\n ref.onDestroy?.subscribe({\r\n next: cleanup,\r\n error: cleanup,\r\n complete: cleanup,\r\n });\r\n }\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
@@ -1715,7 +1715,7 @@ class Table {
|
|
|
1715
1715
|
});
|
|
1716
1716
|
}
|
|
1717
1717
|
onFilterApplied(filters) {
|
|
1718
|
-
this.filters.set(filters);
|
|
1718
|
+
this.filters.set(this.withoutGeneralSearch(filters));
|
|
1719
1719
|
this.first.set(0);
|
|
1720
1720
|
this.currentPage.set(0);
|
|
1721
1721
|
if (this.lazy()) {
|
|
@@ -1844,11 +1844,6 @@ class Table {
|
|
|
1844
1844
|
this.first.set(0);
|
|
1845
1845
|
this.currentPage.set(0);
|
|
1846
1846
|
if (this.lazy() && !this.lazyLocalSearch()) {
|
|
1847
|
-
const trimmedSearchTerm = searchTerm.trim();
|
|
1848
|
-
this.filters.set({
|
|
1849
|
-
...this.filters(),
|
|
1850
|
-
generalSearch: trimmedSearchTerm,
|
|
1851
|
-
});
|
|
1852
1847
|
this.emitLazyLoad({});
|
|
1853
1848
|
}
|
|
1854
1849
|
}
|
|
@@ -1951,9 +1946,28 @@ class Table {
|
|
|
1951
1946
|
pageSize: this.pageSize(),
|
|
1952
1947
|
currentPage: this.currentPage() + 1,
|
|
1953
1948
|
first: this.first(),
|
|
1954
|
-
filters: this.
|
|
1949
|
+
filters: this.lazyLoadFilters(),
|
|
1955
1950
|
});
|
|
1956
1951
|
}
|
|
1952
|
+
lazyLoadFilters() {
|
|
1953
|
+
const filters = this.withoutGeneralSearch(this.filters());
|
|
1954
|
+
const searchTerm = this.filterTerm().trim();
|
|
1955
|
+
if (!searchTerm || this.lazyLocalSearch()) {
|
|
1956
|
+
return filters;
|
|
1957
|
+
}
|
|
1958
|
+
return {
|
|
1959
|
+
...filters,
|
|
1960
|
+
generalSearch: searchTerm,
|
|
1961
|
+
};
|
|
1962
|
+
}
|
|
1963
|
+
withoutGeneralSearch(filters) {
|
|
1964
|
+
if (!Object.prototype.hasOwnProperty.call(filters, 'generalSearch')) {
|
|
1965
|
+
return filters;
|
|
1966
|
+
}
|
|
1967
|
+
const next = { ...filters };
|
|
1968
|
+
delete next['generalSearch'];
|
|
1969
|
+
return next;
|
|
1970
|
+
}
|
|
1957
1971
|
exportExcel() {
|
|
1958
1972
|
if (this.loading()) {
|
|
1959
1973
|
return;
|