cloud-ide-element 0.0.1 → 1.0.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.
Files changed (50) hide show
  1. package/README.md +271 -24
  2. package/esm2022/lib/components/confirmation-modal/confirmation-modal.component.mjs +182 -0
  3. package/esm2022/lib/components/data-grid/data-grid.component.mjs +1363 -0
  4. package/esm2022/lib/components/data-grid/data-grid.types.mjs +37 -0
  5. package/esm2022/lib/components/dropdown/dropdown.component.mjs +396 -0
  6. package/esm2022/lib/components/global-notifications/global-notifications.component.mjs +30 -0
  7. package/esm2022/lib/components/json-editor/json-editor.component.mjs +521 -0
  8. package/esm2022/lib/components/skeleton-loader/skeleton-loader.component.mjs +33 -0
  9. package/esm2022/lib/components/toast-notification/toast-notification.component.mjs +152 -0
  10. package/esm2022/lib/elements/button/cide-ele-button.component.mjs +249 -0
  11. package/esm2022/lib/elements/file-input/file-input.component.mjs +83 -0
  12. package/esm2022/lib/elements/icon/icon.component.mjs +5 -3
  13. package/esm2022/lib/elements/input/input.component.mjs +34 -20
  14. package/esm2022/lib/elements/select/select.component.mjs +471 -0
  15. package/esm2022/lib/elements/tab/cide-ele-tab.component.mjs +74 -0
  16. package/esm2022/lib/elements/textarea/textarea.component.mjs +157 -0
  17. package/esm2022/lib/services/confirmation.service.mjs +151 -0
  18. package/esm2022/lib/services/dropdown-manager.service.mjs +93 -0
  19. package/esm2022/lib/services/notification.service.mjs +196 -0
  20. package/esm2022/lib/utils/directives/resizer/resizer.directive.mjs +231 -0
  21. package/esm2022/lib/utils/directives/tooltip/tooltip.directive.mjs +294 -0
  22. package/esm2022/lib/utils/services/elements/elements.service.mjs +9 -7
  23. package/esm2022/public-api.mjs +23 -2
  24. package/fesm2022/cloud-ide-element.mjs +4646 -47
  25. package/fesm2022/cloud-ide-element.mjs.map +1 -1
  26. package/lib/components/confirmation-modal/confirmation-modal.component.d.ts +16 -0
  27. package/lib/components/data-grid/data-grid.component.d.ts +244 -0
  28. package/lib/components/data-grid/data-grid.types.d.ts +146 -0
  29. package/lib/components/dropdown/dropdown.component.d.ts +75 -0
  30. package/lib/components/global-notifications/global-notifications.component.d.ts +5 -0
  31. package/lib/components/json-editor/json-editor.component.d.ts +116 -0
  32. package/lib/components/skeleton-loader/skeleton-loader.component.d.ts +11 -0
  33. package/lib/components/toast-notification/toast-notification.component.d.ts +13 -0
  34. package/lib/elements/button/cide-ele-button.component.d.ts +85 -0
  35. package/lib/elements/file-input/file-input.component.d.ts +25 -0
  36. package/lib/elements/input/input.component.d.ts +7 -4
  37. package/lib/elements/select/select.component.d.ts +91 -0
  38. package/lib/elements/tab/cide-ele-tab.component.d.ts +26 -0
  39. package/lib/elements/textarea/textarea.component.d.ts +47 -0
  40. package/lib/services/confirmation.service.d.ts +65 -0
  41. package/lib/services/dropdown-manager.service.d.ts +22 -0
  42. package/lib/services/notification.service.d.ts +81 -0
  43. package/lib/utils/directives/resizer/resizer.directive.d.ts +44 -0
  44. package/lib/utils/directives/tooltip/tooltip.directive.d.ts +43 -0
  45. package/package.json +32 -4
  46. package/public-api.d.ts +18 -1
  47. package/src/lib/assets/css/cide-ele-style.scss +85 -0
  48. package/src/lib/assets/css/cide-ele-variable.scss +336 -0
  49. package/esm2022/lib/elements/button/button.component.mjs +0 -60
  50. package/lib/elements/button/button.component.d.ts +0 -27
@@ -0,0 +1,74 @@
1
+ import { Component, Input, Output, EventEmitter, signal } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import * as i0 from "@angular/core";
4
+ export class CideEleTabComponent {
5
+ constructor() {
6
+ this.tabs = [];
7
+ this.size = 'md';
8
+ this.variant = 'default';
9
+ this.fullWidth = false;
10
+ this.disabled = false;
11
+ this.tabChange = new EventEmitter();
12
+ this.activeTab = signal('');
13
+ }
14
+ ngOnInit() {
15
+ // Set initial active tab
16
+ if (this.activeTabId) {
17
+ this.activeTab.set(this.activeTabId);
18
+ }
19
+ else if (this.tabs.length > 0) {
20
+ const firstEnabledTab = this.tabs.find(tab => !tab.disabled);
21
+ if (firstEnabledTab) {
22
+ this.activeTab.set(firstEnabledTab.id);
23
+ }
24
+ }
25
+ }
26
+ onTabClick(tab) {
27
+ if (tab.disabled || this.disabled)
28
+ return;
29
+ this.activeTab.set(tab.id);
30
+ this.tabChange.emit(tab);
31
+ }
32
+ isActive(tabId) {
33
+ return this.activeTab() === tabId;
34
+ }
35
+ getTabClasses(tab) {
36
+ const baseClasses = 'cide-tab-item';
37
+ const sizeClass = `cide-tab-${this.size}`;
38
+ const variantClass = `cide-tab-${this.variant}`;
39
+ const activeClass = this.isActive(tab.id) ? 'cide-tab-active' : '';
40
+ const disabledClass = (tab.disabled || this.disabled) ? 'cide-tab-disabled' : '';
41
+ return [baseClasses, sizeClass, variantClass, activeClass, disabledClass]
42
+ .filter(Boolean)
43
+ .join(' ');
44
+ }
45
+ getContainerClasses() {
46
+ const baseClasses = 'cide-tab-container';
47
+ const variantClass = `cide-tab-container-${this.variant}`;
48
+ const fullWidthClass = this.fullWidth ? 'cide-tab-full-width' : '';
49
+ return [baseClasses, variantClass, fullWidthClass]
50
+ .filter(Boolean)
51
+ .join(' ');
52
+ }
53
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: CideEleTabComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
54
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.7", type: CideEleTabComponent, isStandalone: true, selector: "cide-ele-tab", inputs: { tabs: "tabs", activeTabId: "activeTabId", size: "size", variant: "variant", fullWidth: "fullWidth", disabled: "disabled" }, outputs: { tabChange: "tabChange" }, ngImport: i0, template: "<div [class]=\"getContainerClasses()\">\r\n @for (tab of tabs; track tab.id) {\r\n <button\r\n type=\"button\"\r\n [class]=\"getTabClasses(tab)\"\r\n [disabled]=\"tab.disabled || disabled\"\r\n (click)=\"onTabClick(tab)\"\r\n [attr.aria-selected]=\"isActive(tab.id)\"\r\n [attr.aria-controls]=\"'panel-' + tab.id\"\r\n role=\"tab\">\r\n \r\n @if (tab.icon) {\r\n <span class=\"cide-tab-icon\">{{ tab.icon }}</span>\r\n }\r\n \r\n <span class=\"cide-tab-label\">{{ tab.label }}</span>\r\n \r\n @if (tab.badge) {\r\n <span class=\"cide-tab-badge\">{{ tab.badge }}</span>\r\n }\r\n </button>\r\n }\r\n</div> ", styles: [".cide-tab-container{display:flex;border-bottom:1px solid #e5e7eb;overflow-x:auto;scrollbar-width:none}.cide-tab-container::-webkit-scrollbar{display:none}.cide-tab-container.cide-tab-full-width .cide-tab-item{flex:1}.cide-tab-container.cide-tab-container-pills{border-bottom:none;gap:.25rem;padding:.25rem;background:#f9fafb;border-radius:.375rem}.cide-tab-container.cide-tab-container-underline{border-bottom:2px solid #e5e7eb}.cide-tab-item{display:inline-flex;align-items:center;gap:.375rem;border:none;background:none;cursor:pointer;transition:all .15s ease;font-weight:500;color:#6b7280;white-space:nowrap;outline:none}.cide-tab-item:hover:not(.cide-tab-disabled){color:#374151}.cide-tab-item:focus-visible{outline:2px solid var(--cide-theme-primary-color);outline-offset:2px}.cide-tab-item.cide-tab-active{color:var(--cide-theme-primary-color)}.cide-tab-item.cide-tab-disabled{opacity:.5;cursor:not-allowed}.cide-tab-sm{padding:.375rem .75rem;font-size:.875rem}.cide-tab-sm .cide-tab-icon{font-size:.75rem}.cide-tab-sm .cide-tab-badge{font-size:.625rem;padding:.125rem .375rem}.cide-tab-md{padding:.5rem 1rem;font-size:.875rem}.cide-tab-md .cide-tab-icon{font-size:.875rem}.cide-tab-md .cide-tab-badge{font-size:.75rem;padding:.125rem .5rem}.cide-tab-lg{padding:.75rem 1.25rem;font-size:1rem}.cide-tab-lg .cide-tab-icon{font-size:1rem}.cide-tab-lg .cide-tab-badge{font-size:.75rem;padding:.25rem .5rem}.cide-tab-default{border-bottom:2px solid transparent}.cide-tab-default.cide-tab-active{border-bottom-color:var(--cide-theme-primary-color)}.cide-tab-pills{border-radius:.25rem}.cide-tab-pills:hover:not(.cide-tab-disabled){background:#f3f4f6}.cide-tab-pills.cide-tab-active{background:#fff;color:#374151;box-shadow:0 1px 2px #0000000d}.cide-tab-underline{border-bottom:2px solid transparent;position:relative}.cide-tab-underline.cide-tab-active:after{content:\"\";position:absolute;bottom:-2px;left:0;right:0;height:2px;background:var(--cide-theme-primary-color);border-radius:1px 1px 0 0}.cide-tab-icon{display:inline-flex;align-items:center;flex-shrink:0}.cide-tab-label{display:inline-flex;align-items:center}.cide-tab-badge{display:inline-flex;align-items:center;justify-content:center;background:#dc2626;color:#fff;border-radius:9999px;font-weight:600;min-width:1.25rem;height:1.25rem;line-height:1}.cide-tab-active .cide-tab-badge{background:var(--cide-theme-primary-color)}@media (max-width: 640px){.cide-tab-container{gap:0}.cide-tab-item .cide-tab-label{display:none}.cide-tab-item:not(:has(.cide-tab-icon)) .cide-tab-label{display:inline-flex}.cide-tab-sm{padding:.25rem .5rem}.cide-tab-md{padding:.375rem .75rem}.cide-tab-lg{padding:.5rem 1rem}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }] }); }
55
+ }
56
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: CideEleTabComponent, decorators: [{
57
+ type: Component,
58
+ args: [{ selector: 'cide-ele-tab', standalone: true, imports: [CommonModule], template: "<div [class]=\"getContainerClasses()\">\r\n @for (tab of tabs; track tab.id) {\r\n <button\r\n type=\"button\"\r\n [class]=\"getTabClasses(tab)\"\r\n [disabled]=\"tab.disabled || disabled\"\r\n (click)=\"onTabClick(tab)\"\r\n [attr.aria-selected]=\"isActive(tab.id)\"\r\n [attr.aria-controls]=\"'panel-' + tab.id\"\r\n role=\"tab\">\r\n \r\n @if (tab.icon) {\r\n <span class=\"cide-tab-icon\">{{ tab.icon }}</span>\r\n }\r\n \r\n <span class=\"cide-tab-label\">{{ tab.label }}</span>\r\n \r\n @if (tab.badge) {\r\n <span class=\"cide-tab-badge\">{{ tab.badge }}</span>\r\n }\r\n </button>\r\n }\r\n</div> ", styles: [".cide-tab-container{display:flex;border-bottom:1px solid #e5e7eb;overflow-x:auto;scrollbar-width:none}.cide-tab-container::-webkit-scrollbar{display:none}.cide-tab-container.cide-tab-full-width .cide-tab-item{flex:1}.cide-tab-container.cide-tab-container-pills{border-bottom:none;gap:.25rem;padding:.25rem;background:#f9fafb;border-radius:.375rem}.cide-tab-container.cide-tab-container-underline{border-bottom:2px solid #e5e7eb}.cide-tab-item{display:inline-flex;align-items:center;gap:.375rem;border:none;background:none;cursor:pointer;transition:all .15s ease;font-weight:500;color:#6b7280;white-space:nowrap;outline:none}.cide-tab-item:hover:not(.cide-tab-disabled){color:#374151}.cide-tab-item:focus-visible{outline:2px solid var(--cide-theme-primary-color);outline-offset:2px}.cide-tab-item.cide-tab-active{color:var(--cide-theme-primary-color)}.cide-tab-item.cide-tab-disabled{opacity:.5;cursor:not-allowed}.cide-tab-sm{padding:.375rem .75rem;font-size:.875rem}.cide-tab-sm .cide-tab-icon{font-size:.75rem}.cide-tab-sm .cide-tab-badge{font-size:.625rem;padding:.125rem .375rem}.cide-tab-md{padding:.5rem 1rem;font-size:.875rem}.cide-tab-md .cide-tab-icon{font-size:.875rem}.cide-tab-md .cide-tab-badge{font-size:.75rem;padding:.125rem .5rem}.cide-tab-lg{padding:.75rem 1.25rem;font-size:1rem}.cide-tab-lg .cide-tab-icon{font-size:1rem}.cide-tab-lg .cide-tab-badge{font-size:.75rem;padding:.25rem .5rem}.cide-tab-default{border-bottom:2px solid transparent}.cide-tab-default.cide-tab-active{border-bottom-color:var(--cide-theme-primary-color)}.cide-tab-pills{border-radius:.25rem}.cide-tab-pills:hover:not(.cide-tab-disabled){background:#f3f4f6}.cide-tab-pills.cide-tab-active{background:#fff;color:#374151;box-shadow:0 1px 2px #0000000d}.cide-tab-underline{border-bottom:2px solid transparent;position:relative}.cide-tab-underline.cide-tab-active:after{content:\"\";position:absolute;bottom:-2px;left:0;right:0;height:2px;background:var(--cide-theme-primary-color);border-radius:1px 1px 0 0}.cide-tab-icon{display:inline-flex;align-items:center;flex-shrink:0}.cide-tab-label{display:inline-flex;align-items:center}.cide-tab-badge{display:inline-flex;align-items:center;justify-content:center;background:#dc2626;color:#fff;border-radius:9999px;font-weight:600;min-width:1.25rem;height:1.25rem;line-height:1}.cide-tab-active .cide-tab-badge{background:var(--cide-theme-primary-color)}@media (max-width: 640px){.cide-tab-container{gap:0}.cide-tab-item .cide-tab-label{display:none}.cide-tab-item:not(:has(.cide-tab-icon)) .cide-tab-label{display:inline-flex}.cide-tab-sm{padding:.25rem .5rem}.cide-tab-md{padding:.375rem .75rem}.cide-tab-lg{padding:.5rem 1rem}}\n"] }]
59
+ }], propDecorators: { tabs: [{
60
+ type: Input
61
+ }], activeTabId: [{
62
+ type: Input
63
+ }], size: [{
64
+ type: Input
65
+ }], variant: [{
66
+ type: Input
67
+ }], fullWidth: [{
68
+ type: Input
69
+ }], disabled: [{
70
+ type: Input
71
+ }], tabChange: [{
72
+ type: Output
73
+ }] } });
74
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2lkZS1lbGUtdGFiLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Nsb3VkLWlkZS1lbGVtZW50L3NyYy9saWIvZWxlbWVudHMvdGFiL2NpZGUtZWxlLXRhYi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jbG91ZC1pZGUtZWxlbWVudC9zcmMvbGliL2VsZW1lbnRzL3RhYi9jaWRlLWVsZS10YWIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFDdkYsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDOztBQWlCL0MsTUFBTSxPQUFPLG1CQUFtQjtJQVBoQztRQVFXLFNBQUksR0FBYyxFQUFFLENBQUM7UUFFckIsU0FBSSxHQUF1QixJQUFJLENBQUM7UUFDaEMsWUFBTyxHQUFzQyxTQUFTLENBQUM7UUFDdkQsY0FBUyxHQUFHLEtBQUssQ0FBQztRQUNsQixhQUFRLEdBQUcsS0FBSyxDQUFDO1FBRWhCLGNBQVMsR0FBRyxJQUFJLFlBQVksRUFBVyxDQUFDO1FBRWxELGNBQVMsR0FBRyxNQUFNLENBQVMsRUFBRSxDQUFDLENBQUM7S0E4Q2hDO0lBNUNDLFFBQVE7UUFDTix5QkFBeUI7UUFDekIsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDckIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3ZDLENBQUM7YUFBTSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ2hDLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDN0QsSUFBSSxlQUFlLEVBQUUsQ0FBQztnQkFDcEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3pDLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVELFVBQVUsQ0FBQyxHQUFZO1FBQ3JCLElBQUksR0FBRyxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsUUFBUTtZQUFFLE9BQU87UUFFMUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzNCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzNCLENBQUM7SUFFRCxRQUFRLENBQUMsS0FBYTtRQUNwQixPQUFPLElBQUksQ0FBQyxTQUFTLEVBQUUsS0FBSyxLQUFLLENBQUM7SUFDcEMsQ0FBQztJQUVELGFBQWEsQ0FBQyxHQUFZO1FBQ3hCLE1BQU0sV0FBVyxHQUFHLGVBQWUsQ0FBQztRQUNwQyxNQUFNLFNBQVMsR0FBRyxZQUFZLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUMxQyxNQUFNLFlBQVksR0FBRyxZQUFZLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNoRCxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNuRSxNQUFNLGFBQWEsR0FBRyxDQUFDLEdBQUcsQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBRWpGLE9BQU8sQ0FBQyxXQUFXLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUUsYUFBYSxDQUFDO2FBQ3RFLE1BQU0sQ0FBQyxPQUFPLENBQUM7YUFDZixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDZixDQUFDO0lBRUQsbUJBQW1CO1FBQ2pCLE1BQU0sV0FBVyxHQUFHLG9CQUFvQixDQUFDO1FBQ3pDLE1BQU0sWUFBWSxHQUFHLHNCQUFzQixJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDMUQsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUVuRSxPQUFPLENBQUMsV0FBVyxFQUFFLFlBQVksRUFBRSxjQUFjLENBQUM7YUFDL0MsTUFBTSxDQUFDLE9BQU8sQ0FBQzthQUNmLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNmLENBQUM7OEdBdkRVLG1CQUFtQjtrR0FBbkIsbUJBQW1CLG1QQ2xCaEMsZ3NCQXNCTyxtcUZEUkssWUFBWTs7MkZBSVgsbUJBQW1CO2tCQVAvQixTQUFTOytCQUNFLGNBQWMsY0FDWixJQUFJLFdBQ1AsQ0FBQyxZQUFZLENBQUM7OEJBS2QsSUFBSTtzQkFBWixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBRUksU0FBUztzQkFBbEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBzaWduYWwsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBUYWJJdGVtIHtcclxuICBpZDogc3RyaW5nO1xyXG4gIGxhYmVsOiBzdHJpbmc7XHJcbiAgZGlzYWJsZWQ/OiBib29sZWFuO1xyXG4gIGljb24/OiBzdHJpbmc7XHJcbiAgYmFkZ2U/OiBzdHJpbmcgfCBudW1iZXI7XHJcbn1cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnY2lkZS1lbGUtdGFiJyxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9jaWRlLWVsZS10YWIuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2NpZGUtZWxlLXRhYi5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDaWRlRWxlVGFiQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuICBASW5wdXQoKSB0YWJzOiBUYWJJdGVtW10gPSBbXTtcclxuICBASW5wdXQoKSBhY3RpdmVUYWJJZD86IHN0cmluZztcclxuICBASW5wdXQoKSBzaXplOiAnc20nIHwgJ21kJyB8ICdsZycgPSAnbWQnO1xyXG4gIEBJbnB1dCgpIHZhcmlhbnQ6ICdkZWZhdWx0JyB8ICdwaWxscycgfCAndW5kZXJsaW5lJyA9ICdkZWZhdWx0JztcclxuICBASW5wdXQoKSBmdWxsV2lkdGggPSBmYWxzZTtcclxuICBASW5wdXQoKSBkaXNhYmxlZCA9IGZhbHNlO1xyXG5cclxuICBAT3V0cHV0KCkgdGFiQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxUYWJJdGVtPigpO1xyXG5cclxuICBhY3RpdmVUYWIgPSBzaWduYWw8c3RyaW5nPignJyk7XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgLy8gU2V0IGluaXRpYWwgYWN0aXZlIHRhYlxyXG4gICAgaWYgKHRoaXMuYWN0aXZlVGFiSWQpIHtcclxuICAgICAgdGhpcy5hY3RpdmVUYWIuc2V0KHRoaXMuYWN0aXZlVGFiSWQpO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLnRhYnMubGVuZ3RoID4gMCkge1xyXG4gICAgICBjb25zdCBmaXJzdEVuYWJsZWRUYWIgPSB0aGlzLnRhYnMuZmluZCh0YWIgPT4gIXRhYi5kaXNhYmxlZCk7XHJcbiAgICAgIGlmIChmaXJzdEVuYWJsZWRUYWIpIHtcclxuICAgICAgICB0aGlzLmFjdGl2ZVRhYi5zZXQoZmlyc3RFbmFibGVkVGFiLmlkKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25UYWJDbGljayh0YWI6IFRhYkl0ZW0pIHtcclxuICAgIGlmICh0YWIuZGlzYWJsZWQgfHwgdGhpcy5kaXNhYmxlZCkgcmV0dXJuO1xyXG4gICAgXHJcbiAgICB0aGlzLmFjdGl2ZVRhYi5zZXQodGFiLmlkKTtcclxuICAgIHRoaXMudGFiQ2hhbmdlLmVtaXQodGFiKTtcclxuICB9XHJcblxyXG4gIGlzQWN0aXZlKHRhYklkOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmFjdGl2ZVRhYigpID09PSB0YWJJZDtcclxuICB9XHJcblxyXG4gIGdldFRhYkNsYXNzZXModGFiOiBUYWJJdGVtKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IGJhc2VDbGFzc2VzID0gJ2NpZGUtdGFiLWl0ZW0nO1xyXG4gICAgY29uc3Qgc2l6ZUNsYXNzID0gYGNpZGUtdGFiLSR7dGhpcy5zaXplfWA7XHJcbiAgICBjb25zdCB2YXJpYW50Q2xhc3MgPSBgY2lkZS10YWItJHt0aGlzLnZhcmlhbnR9YDtcclxuICAgIGNvbnN0IGFjdGl2ZUNsYXNzID0gdGhpcy5pc0FjdGl2ZSh0YWIuaWQpID8gJ2NpZGUtdGFiLWFjdGl2ZScgOiAnJztcclxuICAgIGNvbnN0IGRpc2FibGVkQ2xhc3MgPSAodGFiLmRpc2FibGVkIHx8IHRoaXMuZGlzYWJsZWQpID8gJ2NpZGUtdGFiLWRpc2FibGVkJyA6ICcnO1xyXG4gICAgXHJcbiAgICByZXR1cm4gW2Jhc2VDbGFzc2VzLCBzaXplQ2xhc3MsIHZhcmlhbnRDbGFzcywgYWN0aXZlQ2xhc3MsIGRpc2FibGVkQ2xhc3NdXHJcbiAgICAgIC5maWx0ZXIoQm9vbGVhbilcclxuICAgICAgLmpvaW4oJyAnKTtcclxuICB9XHJcblxyXG4gIGdldENvbnRhaW5lckNsYXNzZXMoKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IGJhc2VDbGFzc2VzID0gJ2NpZGUtdGFiLWNvbnRhaW5lcic7XHJcbiAgICBjb25zdCB2YXJpYW50Q2xhc3MgPSBgY2lkZS10YWItY29udGFpbmVyLSR7dGhpcy52YXJpYW50fWA7XHJcbiAgICBjb25zdCBmdWxsV2lkdGhDbGFzcyA9IHRoaXMuZnVsbFdpZHRoID8gJ2NpZGUtdGFiLWZ1bGwtd2lkdGgnIDogJyc7XHJcbiAgICBcclxuICAgIHJldHVybiBbYmFzZUNsYXNzZXMsIHZhcmlhbnRDbGFzcywgZnVsbFdpZHRoQ2xhc3NdXHJcbiAgICAgIC5maWx0ZXIoQm9vbGVhbilcclxuICAgICAgLmpvaW4oJyAnKTtcclxuICB9XHJcbn0gIiwiPGRpdiBbY2xhc3NdPVwiZ2V0Q29udGFpbmVyQ2xhc3NlcygpXCI+XHJcbiAgQGZvciAodGFiIG9mIHRhYnM7IHRyYWNrIHRhYi5pZCkge1xyXG4gICAgPGJ1dHRvblxyXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgW2NsYXNzXT1cImdldFRhYkNsYXNzZXModGFiKVwiXHJcbiAgICAgIFtkaXNhYmxlZF09XCJ0YWIuZGlzYWJsZWQgfHwgZGlzYWJsZWRcIlxyXG4gICAgICAoY2xpY2spPVwib25UYWJDbGljayh0YWIpXCJcclxuICAgICAgW2F0dHIuYXJpYS1zZWxlY3RlZF09XCJpc0FjdGl2ZSh0YWIuaWQpXCJcclxuICAgICAgW2F0dHIuYXJpYS1jb250cm9sc109XCIncGFuZWwtJyArIHRhYi5pZFwiXHJcbiAgICAgIHJvbGU9XCJ0YWJcIj5cclxuICAgICAgXHJcbiAgICAgIEBpZiAodGFiLmljb24pIHtcclxuICAgICAgICA8c3BhbiBjbGFzcz1cImNpZGUtdGFiLWljb25cIj57eyB0YWIuaWNvbiB9fTwvc3Bhbj5cclxuICAgICAgfVxyXG4gICAgICBcclxuICAgICAgPHNwYW4gY2xhc3M9XCJjaWRlLXRhYi1sYWJlbFwiPnt7IHRhYi5sYWJlbCB9fTwvc3Bhbj5cclxuICAgICAgXHJcbiAgICAgIEBpZiAodGFiLmJhZGdlKSB7XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJjaWRlLXRhYi1iYWRnZVwiPnt7IHRhYi5iYWRnZSB9fTwvc3Bhbj5cclxuICAgICAgfVxyXG4gICAgPC9idXR0b24+XHJcbiAgfVxyXG48L2Rpdj4gIl19
@@ -0,0 +1,157 @@
1
+ import { CommonModule } from '@angular/common';
2
+ import { Component, EventEmitter, Input, Output, forwardRef } from '@angular/core';
3
+ import { FormsModule, NG_VALIDATORS, NG_VALUE_ACCESSOR } from '@angular/forms';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "@angular/common";
6
+ import * as i2 from "@angular/forms";
7
+ export class CideTextareaComponent {
8
+ constructor() {
9
+ this.label = '';
10
+ this.labelHide = false;
11
+ this.placeholder = '';
12
+ this.helperText = '';
13
+ this.errorText = '';
14
+ this.required = false;
15
+ this.disabled = false;
16
+ this.minlength = 0;
17
+ this.maxlength = 0;
18
+ this.rows = 3;
19
+ this.id = '';
20
+ this.ngModel = '';
21
+ this.size = 'sm';
22
+ this.fill = 'outline';
23
+ this.labelPlacement = 'fixed';
24
+ this.labelDir = 'start';
25
+ this.leadingIcon = '';
26
+ this.trailingIcon = '';
27
+ this.clearInput = false;
28
+ this.trailingIconInternal = '';
29
+ this.isTrailingIconAllwedClick = false;
30
+ this.ngModelChange = new EventEmitter();
31
+ this.isTouched = false;
32
+ this.isValid = true;
33
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
34
+ this.onChange = (value) => { };
35
+ this.onTouched = () => { };
36
+ this.onValidate = () => { };
37
+ }
38
+ ngOnInit() {
39
+ this.validateValue(this.ngModel);
40
+ }
41
+ ngOnChanges(changes) {
42
+ if (changes['ngModel']) {
43
+ this.validateValue(this.ngModel);
44
+ }
45
+ }
46
+ writeValue(value) {
47
+ this.ngModel = value;
48
+ this.validateValue(value);
49
+ }
50
+ registerOnChange(fn) {
51
+ this.onChange = fn;
52
+ }
53
+ registerOnTouched(fn) {
54
+ this.onTouched = fn;
55
+ }
56
+ setDisabledState(isDisabled) {
57
+ this.disabled = isDisabled;
58
+ }
59
+ validate(control) {
60
+ return this.validateValue(control.value);
61
+ }
62
+ validateValue(value) {
63
+ console.log('validateValue', value);
64
+ this.isValid = true;
65
+ return null;
66
+ }
67
+ onInput(event) {
68
+ const value = event.target.value;
69
+ this.ngModel = value;
70
+ this.onChange(value);
71
+ this.ngModelChange.emit(value);
72
+ this.validateValue(value);
73
+ }
74
+ onBlur() {
75
+ this.isTouched = true;
76
+ this.onTouched();
77
+ }
78
+ ClearInputValue() {
79
+ this.ngModel = '';
80
+ this.onChange('');
81
+ this.ngModelChange.emit('');
82
+ this.validateValue('');
83
+ }
84
+ trailingIconClick() {
85
+ // For future extensibility (e.g., password visibility)
86
+ // For now, just emit event or toggle icon if needed
87
+ }
88
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: CideTextareaComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
89
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.7", type: CideTextareaComponent, isStandalone: true, selector: "cide-ele-textarea", inputs: { label: "label", labelHide: "labelHide", placeholder: "placeholder", helperText: "helperText", errorText: "errorText", required: "required", disabled: "disabled", minlength: "minlength", maxlength: "maxlength", rows: "rows", id: "id", ngModel: "ngModel", size: "size", fill: "fill", labelPlacement: "labelPlacement", labelDir: "labelDir", leadingIcon: "leadingIcon", trailingIcon: "trailingIcon", clearInput: "clearInput" }, outputs: { ngModelChange: "ngModelChange" }, providers: [
90
+ {
91
+ provide: NG_VALUE_ACCESSOR,
92
+ useExisting: forwardRef(() => CideTextareaComponent),
93
+ multi: true
94
+ },
95
+ {
96
+ provide: NG_VALIDATORS,
97
+ multi: true,
98
+ useExisting: forwardRef(() => CideTextareaComponent),
99
+ }
100
+ ], usesOnChanges: true, ngImport: i0, template: "<div class=\"cide-textarea\" [ngClass]=\"{\r\n 'cide-element-size-xxs': (size === '2xs'),\r\n 'cide-element-size-xs': (size === 'xs'),\r\n 'cide-element-size-sm': (size === 'sm'),\r\n 'cide-element-size-md': (size === 'md'),\r\n 'cide-element-size-lg': (size === 'lg'),\r\n 'cide-element-input-label-floating': (labelPlacement === 'floating'),\r\n 'cide-element-input-label-start': (labelDir === 'start'),\r\n 'cide-element-input-label-end': (labelDir === 'end'),\r\n 'cide-element-input-label-fixed': (labelPlacement === 'fixed'),\r\n 'cide-element-input-label-less': (!label || labelHide),\r\n 'cide-element-style-outline': (fill === 'outline'),\r\n 'cide-element-style-solid': (fill === 'solid'),\r\n 'cide-element-style-standard': (fill === 'standard'),\r\n}\">\r\n <label *ngIf=\"label && !labelHide\" [for]=\"id\" class=\"cide-textarea-label\">{{ label }}</label>\r\n <div class=\"cide-element-input-wrapper\">\r\n <!-- Leading Icon -->\r\n <span class=\"cide-input-leading-icon-wrapper\" *ngIf=\"leadingIcon\">\r\n <span class=\"cide-input-leading-icon material-symbols-outlined tw-text-center\">{{leadingIcon}}</span>\r\n </span>\r\n <!-- Trailing Icon -->\r\n <span class=\"tw-absolute cide-input-trailing-icon -tw-bottom-1 tw-select-none tw-right-0\"\r\n *ngIf=\"trailingIconInternal\">\r\n <span class=\"material-symbols-outlined tw-w-8 tw-text-center !tw-text-2xl\"\r\n [ngClass]=\"{'tw-cursor-pointer': isTrailingIconAllwedClick}\" [attr.tabindex]=\"false\"\r\n (click)=\"trailingIconClick()\" (keyup)=\"trailingIconClick()\">{{trailingIconInternal}}</span>\r\n </span>\r\n <!-- Clear -->\r\n <button class=\"cide-input-clear\" *ngIf=\"clearInput && ngModel\" (click)=\"ClearInputValue()\">\r\n <span class=\"cide-input-clear-icon material-symbols-outlined\">close</span>\r\n </button>\r\n <!-- Textarea -->\r\n <textarea [id]=\"id\" [attr.placeholder]=\"placeholder\" [attr.rows]=\"rows\"\r\n [attr.minlength]=\"minlength > 0 ? minlength : null\" [attr.maxlength]=\"maxlength > 0 ? maxlength : null\"\r\n [disabled]=\"disabled\" [(ngModel)]=\"ngModel\" (input)=\"onInput($event)\" (blur)=\"onBlur()\"\r\n [ngClass]=\"[((label && labelPlacement === 'fixed') ? 'tw-rounded-e-md tw-rounded-es-md' : 'tw-rounded-md '), (!leadingIcon ? 'tw-pl-1' : ''), (trailingIconInternal ? 'tw-pr-8': ''), (!trailingIconInternal ? 'tw-pr-1' : ''), ((size === 'md') ? 'tw-h-8 tw-pt-0.5 tw-pb-0' : (size === 'sm' ? '' : '')), (labelHide ? '!tw-mt-0' : '')]\"\r\n class=\"cide-textarea-input tw-m-0 tw-w-full tw-bg-transparent tw-overflow-hidden tw-border-solid tw-py-[1px] tw-outline-none\"></textarea>\r\n </div>\r\n <span *ngIf=\"(errorText || helperText) && !isValid\" class=\"cide-textarea-help-error-text\">{{ errorText || helperText\r\n }}</span>\r\n <span *ngIf=\"helperText && isValid\" class=\"cide-textarea-help-error-text\">{{ helperText }}</span>\r\n</div>", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] }); }
101
+ }
102
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: CideTextareaComponent, decorators: [{
103
+ type: Component,
104
+ args: [{ selector: 'cide-ele-textarea', standalone: true, imports: [CommonModule, FormsModule], providers: [
105
+ {
106
+ provide: NG_VALUE_ACCESSOR,
107
+ useExisting: forwardRef(() => CideTextareaComponent),
108
+ multi: true
109
+ },
110
+ {
111
+ provide: NG_VALIDATORS,
112
+ multi: true,
113
+ useExisting: forwardRef(() => CideTextareaComponent),
114
+ }
115
+ ], template: "<div class=\"cide-textarea\" [ngClass]=\"{\r\n 'cide-element-size-xxs': (size === '2xs'),\r\n 'cide-element-size-xs': (size === 'xs'),\r\n 'cide-element-size-sm': (size === 'sm'),\r\n 'cide-element-size-md': (size === 'md'),\r\n 'cide-element-size-lg': (size === 'lg'),\r\n 'cide-element-input-label-floating': (labelPlacement === 'floating'),\r\n 'cide-element-input-label-start': (labelDir === 'start'),\r\n 'cide-element-input-label-end': (labelDir === 'end'),\r\n 'cide-element-input-label-fixed': (labelPlacement === 'fixed'),\r\n 'cide-element-input-label-less': (!label || labelHide),\r\n 'cide-element-style-outline': (fill === 'outline'),\r\n 'cide-element-style-solid': (fill === 'solid'),\r\n 'cide-element-style-standard': (fill === 'standard'),\r\n}\">\r\n <label *ngIf=\"label && !labelHide\" [for]=\"id\" class=\"cide-textarea-label\">{{ label }}</label>\r\n <div class=\"cide-element-input-wrapper\">\r\n <!-- Leading Icon -->\r\n <span class=\"cide-input-leading-icon-wrapper\" *ngIf=\"leadingIcon\">\r\n <span class=\"cide-input-leading-icon material-symbols-outlined tw-text-center\">{{leadingIcon}}</span>\r\n </span>\r\n <!-- Trailing Icon -->\r\n <span class=\"tw-absolute cide-input-trailing-icon -tw-bottom-1 tw-select-none tw-right-0\"\r\n *ngIf=\"trailingIconInternal\">\r\n <span class=\"material-symbols-outlined tw-w-8 tw-text-center !tw-text-2xl\"\r\n [ngClass]=\"{'tw-cursor-pointer': isTrailingIconAllwedClick}\" [attr.tabindex]=\"false\"\r\n (click)=\"trailingIconClick()\" (keyup)=\"trailingIconClick()\">{{trailingIconInternal}}</span>\r\n </span>\r\n <!-- Clear -->\r\n <button class=\"cide-input-clear\" *ngIf=\"clearInput && ngModel\" (click)=\"ClearInputValue()\">\r\n <span class=\"cide-input-clear-icon material-symbols-outlined\">close</span>\r\n </button>\r\n <!-- Textarea -->\r\n <textarea [id]=\"id\" [attr.placeholder]=\"placeholder\" [attr.rows]=\"rows\"\r\n [attr.minlength]=\"minlength > 0 ? minlength : null\" [attr.maxlength]=\"maxlength > 0 ? maxlength : null\"\r\n [disabled]=\"disabled\" [(ngModel)]=\"ngModel\" (input)=\"onInput($event)\" (blur)=\"onBlur()\"\r\n [ngClass]=\"[((label && labelPlacement === 'fixed') ? 'tw-rounded-e-md tw-rounded-es-md' : 'tw-rounded-md '), (!leadingIcon ? 'tw-pl-1' : ''), (trailingIconInternal ? 'tw-pr-8': ''), (!trailingIconInternal ? 'tw-pr-1' : ''), ((size === 'md') ? 'tw-h-8 tw-pt-0.5 tw-pb-0' : (size === 'sm' ? '' : '')), (labelHide ? '!tw-mt-0' : '')]\"\r\n class=\"cide-textarea-input tw-m-0 tw-w-full tw-bg-transparent tw-overflow-hidden tw-border-solid tw-py-[1px] tw-outline-none\"></textarea>\r\n </div>\r\n <span *ngIf=\"(errorText || helperText) && !isValid\" class=\"cide-textarea-help-error-text\">{{ errorText || helperText\r\n }}</span>\r\n <span *ngIf=\"helperText && isValid\" class=\"cide-textarea-help-error-text\">{{ helperText }}</span>\r\n</div>" }]
116
+ }], propDecorators: { label: [{
117
+ type: Input
118
+ }], labelHide: [{
119
+ type: Input
120
+ }], placeholder: [{
121
+ type: Input
122
+ }], helperText: [{
123
+ type: Input
124
+ }], errorText: [{
125
+ type: Input
126
+ }], required: [{
127
+ type: Input
128
+ }], disabled: [{
129
+ type: Input
130
+ }], minlength: [{
131
+ type: Input
132
+ }], maxlength: [{
133
+ type: Input
134
+ }], rows: [{
135
+ type: Input
136
+ }], id: [{
137
+ type: Input
138
+ }], ngModel: [{
139
+ type: Input
140
+ }], size: [{
141
+ type: Input
142
+ }], fill: [{
143
+ type: Input
144
+ }], labelPlacement: [{
145
+ type: Input
146
+ }], labelDir: [{
147
+ type: Input
148
+ }], leadingIcon: [{
149
+ type: Input
150
+ }], trailingIcon: [{
151
+ type: Input
152
+ }], clearInput: [{
153
+ type: Input
154
+ }], ngModelChange: [{
155
+ type: Output
156
+ }] } });
157
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGV4dGFyZWEuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2xvdWQtaWRlLWVsZW1lbnQvc3JjL2xpYi9lbGVtZW50cy90ZXh0YXJlYS90ZXh0YXJlYS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jbG91ZC1pZGUtZWxlbWVudC9zcmMvbGliL2VsZW1lbnRzL3RleHRhcmVhL3RleHRhcmVhLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQXFCLE1BQU0sRUFBaUIsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3JILE9BQU8sRUFBeUMsV0FBVyxFQUFFLGFBQWEsRUFBRSxpQkFBaUIsRUFBK0IsTUFBTSxnQkFBZ0IsQ0FBQzs7OztBQXNCbkosTUFBTSxPQUFPLHFCQUFxQjtJQW5CbEM7UUFvQlcsVUFBSyxHQUFXLEVBQUUsQ0FBQztRQUNuQixjQUFTLEdBQVksS0FBSyxDQUFDO1FBQzNCLGdCQUFXLEdBQVcsRUFBRSxDQUFDO1FBQ3pCLGVBQVUsR0FBVyxFQUFFLENBQUM7UUFDeEIsY0FBUyxHQUFXLEVBQUUsQ0FBQztRQUN2QixhQUFRLEdBQVksS0FBSyxDQUFDO1FBQzFCLGFBQVEsR0FBWSxLQUFLLENBQUM7UUFDMUIsY0FBUyxHQUFXLENBQUMsQ0FBQztRQUN0QixjQUFTLEdBQVcsQ0FBQyxDQUFDO1FBQ3RCLFNBQUksR0FBb0IsQ0FBQyxDQUFDO1FBQzFCLE9BQUUsR0FBVyxFQUFFLENBQUM7UUFDaEIsWUFBTyxHQUFXLEVBQUUsQ0FBQztRQUNyQixTQUFJLEdBQWMsSUFBSSxDQUFDO1FBQ3ZCLFNBQUksR0FBcUIsU0FBUyxDQUFDO1FBQ25DLG1CQUFjLEdBQXVCLE9B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QUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUdJLGFBQWE7c0JBQXRCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkNoYW5nZXMsIE9uSW5pdCwgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzLCBmb3J3YXJkUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBYnN0cmFjdENvbnRyb2wsIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBGb3Jtc01vZHVsZSwgTkdfVkFMSURBVE9SUywgTkdfVkFMVUVfQUNDRVNTT1IsIFZhbGlkYXRpb25FcnJvcnMsIFZhbGlkYXRvciB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IHRoZW1lU2l6ZSwgZWxlbWVudFN0eWxlVHlwZSwgbGFiZWxQbGFjZW1lbnRUeXBlLCBsYWJlbERpclR5cGUgfSBmcm9tICdjbG91ZC1pZGUtbG1zLW1vZGVsJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY2lkZS1lbGUtdGV4dGFyZWEnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICB0ZW1wbGF0ZVVybDogJy4vdGV4dGFyZWEuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vdGV4dGFyZWEuY29tcG9uZW50LnNjc3MnLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBGb3Jtc01vZHVsZV0sXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gQ2lkZVRleHRhcmVhQ29tcG9uZW50KSxcbiAgICAgIG11bHRpOiB0cnVlXG4gICAgfSxcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxJREFUT1JTLFxuICAgICAgbXVsdGk6IHRydWUsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBDaWRlVGV4dGFyZWFDb21wb25lbnQpLFxuICAgIH1cbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBDaWRlVGV4dGFyZWFDb21wb25lbnQgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciwgVmFsaWRhdG9yLCBPbkluaXQsIE9uQ2hhbmdlcyB7XG4gIEBJbnB1dCgpIGxhYmVsOiBzdHJpbmcgPSAnJztcbiAgQElucHV0KCkgbGFiZWxIaWRlOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIHBsYWNlaG9sZGVyOiBzdHJpbmcgPSAnJztcbiAgQElucHV0KCkgaGVscGVyVGV4dDogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpIGVycm9yVGV4dDogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpIHJlcXVpcmVkOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGRpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIG1pbmxlbmd0aDogbnVtYmVyID0gMDtcbiAgQElucHV0KCkgbWF4bGVuZ3RoOiBudW1iZXIgPSAwO1xuICBASW5wdXQoKSByb3dzOiBudW1iZXIgfCBzdHJpbmcgPSAzO1xuICBASW5wdXQoKSBpZDogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpIG5nTW9kZWw6IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKSBzaXplOiB0aGVtZVNpemUgPSAnc20nO1xuICBASW5wdXQoKSBmaWxsOiBlbGVtZW50U3R5bGVUeXBlID0gJ291dGxpbmUnO1xuICBASW5wdXQoKSBsYWJlbFBsYWNlbWVudDogbGFiZWxQbGFjZW1lbnRUeXBlID0gJ2ZpeGVkJztcbiAgQElucHV0KCkgbGFiZWxEaXI6IGxhYmVsRGlyVHlwZSA9ICdzdGFydCc7XG4gIEBJbnB1dCgpIGxlYWRpbmdJY29uOiBzdHJpbmcgPSAnJztcbiAgQElucHV0KCkgdHJhaWxpbmdJY29uOiBzdHJpbmcgPSAnJztcbiAgQElucHV0KCkgY2xlYXJJbnB1dDogYm9vbGVhbiA9IGZhbHNlO1xuICB0cmFpbGluZ0ljb25JbnRlcm5hbDogc3RyaW5nID0gJyc7XG4gIGlzVHJhaWxpbmdJY29uQWxsd2VkQ2xpY2s6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQE91dHB1dCgpIG5nTW9kZWxDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcblxuICBpc1RvdWNoZWQgPSBmYWxzZTtcbiAgaXNWYWxpZCA9IHRydWU7XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICBvbkNoYW5nZSA9ICh2YWx1ZTogc3RyaW5nKSA9PiB7fTtcbiAgb25Ub3VjaGVkID0gKCkgPT4ge307XG4gIG9uVmFsaWRhdGUgPSAoKSA9PiB7fTtcblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnZhbGlkYXRlVmFsdWUodGhpcy5uZ01vZGVsKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1snbmdNb2RlbCddKSB7XG4gICAgICB0aGlzLnZhbGlkYXRlVmFsdWUodGhpcy5uZ01vZGVsKTtcbiAgICB9XG4gIH1cblxuICB3cml0ZVZhbHVlKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLm5nTW9kZWwgPSB2YWx1ZTtcbiAgICB0aGlzLnZhbGlkYXRlVmFsdWUodmFsdWUpO1xuICB9XG5cbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogKHZhbHVlOiBzdHJpbmcpID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLm9uQ2hhbmdlID0gZm47XG4gIH1cblxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMub25Ub3VjaGVkID0gZm47XG4gIH1cblxuICBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmRpc2FibGVkID0gaXNEaXNhYmxlZDtcbiAgfVxuXG4gIHZhbGlkYXRlKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy52YWxpZGF0ZVZhbHVlKGNvbnRyb2wudmFsdWUpO1xuICB9XG5cbiAgdmFsaWRhdGVWYWx1ZSh2YWx1ZTogc3RyaW5nKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwge1xuICAgIGNvbnNvbGUubG9nKCd2YWxpZGF0ZVZhbHVlJywgdmFsdWUpO1xuICAgIHRoaXMuaXNWYWxpZCA9IHRydWU7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBvbklucHV0KGV2ZW50OiBFdmVudCkge1xuICAgIGNvbnN0IHZhbHVlID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MVGV4dEFyZWFFbGVtZW50KS52YWx1ZTtcbiAgICB0aGlzLm5nTW9kZWwgPSB2YWx1ZTtcbiAgICB0aGlzLm9uQ2hhbmdlKHZhbHVlKTtcbiAgICB0aGlzLm5nTW9kZWxDaGFuZ2UuZW1pdCh2YWx1ZSk7XG4gICAgdGhpcy52YWxpZGF0ZVZhbHVlKHZhbHVlKTtcbiAgfVxuXG4gIG9uQmx1cigpIHtcbiAgICB0aGlzLmlzVG91Y2hlZCA9IHRydWU7XG4gICAgdGhpcy5vblRvdWNoZWQoKTtcbiAgfVxuXG4gIENsZWFySW5wdXRWYWx1ZSgpIHtcbiAgICB0aGlzLm5nTW9kZWwgPSAnJztcbiAgICB0aGlzLm9uQ2hhbmdlKCcnKTtcbiAgICB0aGlzLm5nTW9kZWxDaGFuZ2UuZW1pdCgnJyk7XG4gICAgdGhpcy52YWxpZGF0ZVZhbHVlKCcnKTtcbiAgfVxuXG4gIHRyYWlsaW5nSWNvbkNsaWNrKCkge1xuICAgIC8vIEZvciBmdXR1cmUgZXh0ZW5zaWJpbGl0eSAoZS5nLiwgcGFzc3dvcmQgdmlzaWJpbGl0eSlcbiAgICAvLyBGb3Igbm93LCBqdXN0IGVtaXQgZXZlbnQgb3IgdG9nZ2xlIGljb24gaWYgbmVlZGVkXG4gIH1cbn0gIiwiPGRpdiBjbGFzcz1cImNpZGUtdGV4dGFyZWFcIiBbbmdDbGFzc109XCJ7XHJcbiAgJ2NpZGUtZWxlbWVudC1zaXplLXh4cyc6IChzaXplID09PSAnMnhzJyksXHJcbiAgJ2NpZGUtZWxlbWVudC1zaXplLXhzJzogKHNpemUgPT09ICd4cycpLFxyXG4gICdjaWRlLWVsZW1lbnQtc2l6ZS1zbSc6IChzaXplID09PSAnc20nKSxcclxuICAnY2lkZS1lbGVtZW50LXNpemUtbWQnOiAoc2l6ZSA9PT0gJ21kJyksXHJcbiAgJ2NpZGUtZWxlbWVudC1zaXplLWxnJzogKHNpemUgPT09ICdsZycpLFxyXG4gICdjaWRlLWVsZW1lbnQtaW5wdXQtbGFiZWwtZmxvYXRpbmcnOiAobGFiZWxQbGFjZW1lbnQgPT09ICdmbG9hdGluZycpLFxyXG4gICdjaWRlLWVsZW1lbnQtaW5wdXQtbGFiZWwtc3RhcnQnOiAobGFiZWxEaXIgPT09ICdzdGFydCcpLFxyXG4gICdjaWRlLWVsZW1lbnQtaW5wdXQtbGFiZWwtZW5kJzogKGxhYmVsRGlyID09PSAnZW5kJyksXHJcbiAgJ2NpZGUtZWxlbWVudC1pbnB1dC1sYWJlbC1maXhlZCc6IChsYWJlbFBsYWNlbWVudCA9PT0gJ2ZpeGVkJyksXHJcbiAgJ2NpZGUtZWxlbWVudC1pbnB1dC1sYWJlbC1sZXNzJzogKCFsYWJlbCB8fCBsYWJlbEhpZGUpLFxyXG4gICdjaWRlLWVsZW1lbnQtc3R5bGUtb3V0bGluZSc6IChmaWxsID09PSAnb3V0bGluZScpLFxyXG4gICdjaWRlLWVsZW1lbnQtc3R5bGUtc29saWQnOiAoZmlsbCA9PT0gJ3NvbGlkJyksXHJcbiAgJ2NpZGUtZWxlbWVudC1zdHlsZS1zdGFuZGFyZCc6IChmaWxsID09PSAnc3RhbmRhcmQnKSxcclxufVwiPlxyXG4gIDxsYWJlbCAqbmdJZj1cImxhYmVsICYmICFsYWJlbEhpZGVcIiBbZm9yXT1cImlkXCIgY2xhc3M9XCJjaWRlLXRleHRhcmVhLWxhYmVsXCI+e3sgbGFiZWwgfX08L2xhYmVsPlxyXG4gIDxkaXYgY2xhc3M9XCJjaWRlLWVsZW1lbnQtaW5wdXQtd3JhcHBlclwiPlxyXG4gICAgPCEtLSBMZWFkaW5nIEljb24gLS0+XHJcbiAgICA8c3BhbiBjbGFzcz1cImNpZGUtaW5wdXQtbGVhZGluZy1pY29uLXdyYXBwZXJcIiAqbmdJZj1cImxlYWRpbmdJY29uXCI+XHJcbiAgICAgIDxzcGFuIGNsYXNzPVwiY2lkZS1pbnB1dC1sZWFkaW5nLWljb24gbWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZCB0dy10ZXh0LWNlbnRlclwiPnt7bGVhZGluZ0ljb259fTwvc3Bhbj5cclxuICAgIDwvc3Bhbj5cclxuICAgIDwhLS0gVHJhaWxpbmcgSWNvbiAtLT5cclxuICAgIDxzcGFuIGNsYXNzPVwidHctYWJzb2x1dGUgY2lkZS1pbnB1dC10cmFpbGluZy1pY29uIC10dy1ib3R0b20tMSB0dy1zZWxlY3Qtbm9uZSB0dy1yaWdodC0wXCJcclxuICAgICAgKm5nSWY9XCJ0cmFpbGluZ0ljb25JbnRlcm5hbFwiPlxyXG4gICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWQgdHctdy04IHR3LXRleHQtY2VudGVyICF0dy10ZXh0LTJ4bFwiXHJcbiAgICAgICAgW25nQ2xhc3NdPVwieyd0dy1jdXJzb3ItcG9pbnRlcic6IGlzVHJhaWxpbmdJY29uQWxsd2VkQ2xpY2t9XCIgW2F0dHIudGFiaW5kZXhdPVwiZmFsc2VcIlxyXG4gICAgICAgIChjbGljayk9XCJ0cmFpbGluZ0ljb25DbGljaygpXCIgKGtleXVwKT1cInRyYWlsaW5nSWNvbkNsaWNrKClcIj57e3RyYWlsaW5nSWNvbkludGVybmFsfX08L3NwYW4+XHJcbiAgICA8L3NwYW4+XHJcbiAgICA8IS0tIENsZWFyIC0tPlxyXG4gICAgPGJ1dHRvbiBjbGFzcz1cImNpZGUtaW5wdXQtY2xlYXJcIiAqbmdJZj1cImNsZWFySW5wdXQgJiYgbmdNb2RlbFwiIChjbGljayk9XCJDbGVhcklucHV0VmFsdWUoKVwiPlxyXG4gICAgICA8c3BhbiBjbGFzcz1cImNpZGUtaW5wdXQtY2xlYXItaWNvbiBtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCI+Y2xvc2U8L3NwYW4+XHJcbiAgICA8L2J1dHRvbj5cclxuICAgIDwhLS0gVGV4dGFyZWEgLS0+XHJcbiAgICA8dGV4dGFyZWEgW2lkXT1cImlkXCIgW2F0dHIucGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJcIiBbYXR0ci5yb3dzXT1cInJvd3NcIlxyXG4gICAgICBbYXR0ci5taW5sZW5ndGhdPVwibWlubGVuZ3RoID4gMCA/IG1pbmxlbmd0aCA6IG51bGxcIiBbYXR0ci5tYXhsZW5ndGhdPVwibWF4bGVuZ3RoID4gMCA/IG1heGxlbmd0aCA6IG51bGxcIlxyXG4gICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIiBbKG5nTW9kZWwpXT1cIm5nTW9kZWxcIiAoaW5wdXQpPVwib25JbnB1dCgkZXZlbnQpXCIgKGJsdXIpPVwib25CbHVyKClcIlxyXG4gICAgICBbbmdDbGFzc109XCJbKChsYWJlbCAmJiBsYWJlbFBsYWNlbWVudCA9PT0gJ2ZpeGVkJykgPyAndHctcm91bmRlZC1lLW1kIHR3LXJvdW5kZWQtZXMtbWQnIDogJ3R3LXJvdW5kZWQtbWQgJyksICghbGVhZGluZ0ljb24gPyAndHctcGwtMScgOiAnJyksICh0cmFpbGluZ0ljb25JbnRlcm5hbCA/ICd0dy1wci04JzogJycpLCAoIXRyYWlsaW5nSWNvbkludGVybmFsID8gJ3R3LXByLTEnIDogJycpLCAoKHNpemUgPT09ICdtZCcpID8gJ3R3LWgtOCB0dy1wdC0wLjUgdHctcGItMCcgOiAoc2l6ZSA9PT0gJ3NtJyA/ICcnIDogJycpKSwgKGxhYmVsSGlkZSA/ICchdHctbXQtMCcgOiAnJyldXCJcclxuICAgICAgY2xhc3M9XCJjaWRlLXRleHRhcmVhLWlucHV0IHR3LW0tMCB0dy13LWZ1bGwgdHctYmctdHJhbnNwYXJlbnQgdHctb3ZlcmZsb3ctaGlkZGVuIHR3LWJvcmRlci1zb2xpZCB0dy1weS1bMXB4XSB0dy1vdXRsaW5lLW5vbmVcIj48L3RleHRhcmVhPlxyXG4gIDwvZGl2PlxyXG4gIDxzcGFuICpuZ0lmPVwiKGVycm9yVGV4dCB8fCBoZWxwZXJUZXh0KSAmJiAhaXNWYWxpZFwiIGNsYXNzPVwiY2lkZS10ZXh0YXJlYS1oZWxwLWVycm9yLXRleHRcIj57eyBlcnJvclRleHQgfHwgaGVscGVyVGV4dFxyXG4gICAgfX08L3NwYW4+XHJcbiAgPHNwYW4gKm5nSWY9XCJoZWxwZXJUZXh0ICYmIGlzVmFsaWRcIiBjbGFzcz1cImNpZGUtdGV4dGFyZWEtaGVscC1lcnJvci10ZXh0XCI+e3sgaGVscGVyVGV4dCB9fTwvc3Bhbj5cclxuPC9kaXY+Il19
@@ -0,0 +1,151 @@
1
+ import { Injectable, signal, computed } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ export class ConfirmationService {
4
+ constructor() {
5
+ this.confirmationQueue = signal([]);
6
+ this.currentRequest = signal(null);
7
+ // Computed signals
8
+ this.hasActiveConfirmation = computed(() => this.currentRequest() !== null);
9
+ this.queueLength = computed(() => this.confirmationQueue().length);
10
+ }
11
+ /**
12
+ * Ask for confirmation with a simple yes/no dialog
13
+ */
14
+ ask(options) {
15
+ return new Promise((resolve, reject) => {
16
+ const request = {
17
+ id: this.generateId(),
18
+ title: options.title,
19
+ message: options.message,
20
+ type: options.type || 'warning',
21
+ icon: options.icon || this.getDefaultIcon(options.type || 'warning'),
22
+ confirmText: options.confirmText || 'Confirm',
23
+ cancelText: options.cancelText || 'Cancel',
24
+ resolve: (value) => resolve(value),
25
+ reject
26
+ };
27
+ this.addToQueue(request);
28
+ });
29
+ }
30
+ /**
31
+ * Ask for confirmation with custom template and return custom data
32
+ */
33
+ askWithTemplate(options) {
34
+ return new Promise((resolve, reject) => {
35
+ const request = {
36
+ id: this.generateId(),
37
+ title: options.title,
38
+ message: options.message,
39
+ type: options.type || 'info',
40
+ icon: options.icon || this.getDefaultIcon(options.type || 'info'),
41
+ confirmText: options.confirmText || 'Confirm',
42
+ cancelText: options.cancelText || 'Cancel',
43
+ customTemplate: options.customTemplate,
44
+ customData: options.customData,
45
+ resolve: (value) => resolve(value),
46
+ reject
47
+ };
48
+ // Cast to unknown for queue compatibility
49
+ this.addToQueue(request);
50
+ });
51
+ }
52
+ /**
53
+ * Quick confirmation for dangerous actions
54
+ */
55
+ confirmDelete(itemName) {
56
+ return this.ask({
57
+ title: 'Confirm Delete',
58
+ message: itemName ? `Are you sure you want to delete "${itemName}"? This action cannot be undone.` : 'Are you sure you want to delete this item? This action cannot be undone.',
59
+ type: 'danger',
60
+ icon: 'delete_forever',
61
+ confirmText: 'Delete',
62
+ cancelText: 'Cancel'
63
+ });
64
+ }
65
+ /**
66
+ * Quick confirmation for permanent actions
67
+ */
68
+ confirmPermanentAction(action, itemName) {
69
+ return this.ask({
70
+ title: `Confirm ${action}`,
71
+ message: itemName ? `Are you sure you want to ${action.toLowerCase()} "${itemName}"? This action cannot be undone.` : `Are you sure you want to ${action.toLowerCase()}? This action cannot be undone.`,
72
+ type: 'danger',
73
+ icon: 'warning',
74
+ confirmText: action,
75
+ cancelText: 'Cancel'
76
+ });
77
+ }
78
+ /**
79
+ * Quick confirmation for safe actions
80
+ */
81
+ confirmSafeAction(action, itemName) {
82
+ return this.ask({
83
+ title: `Confirm ${action}`,
84
+ message: itemName ? `Are you sure you want to ${action.toLowerCase()} "${itemName}"?` : `Are you sure you want to ${action.toLowerCase()}?`,
85
+ type: 'info',
86
+ icon: 'info',
87
+ confirmText: action,
88
+ cancelText: 'Cancel'
89
+ });
90
+ }
91
+ // Internal methods
92
+ addToQueue(request) {
93
+ this.confirmationQueue.update(queue => [...queue, request]);
94
+ this.processQueue();
95
+ }
96
+ processQueue() {
97
+ if (this.currentRequest() || this.confirmationQueue().length === 0) {
98
+ return;
99
+ }
100
+ const nextRequest = this.confirmationQueue()[0];
101
+ this.currentRequest.set(nextRequest);
102
+ }
103
+ confirmCurrentRequest(data) {
104
+ const request = this.currentRequest();
105
+ if (!request)
106
+ return;
107
+ request.resolve(data !== undefined ? data : true);
108
+ this.removeCurrentRequest();
109
+ }
110
+ cancelCurrentRequest() {
111
+ const request = this.currentRequest();
112
+ if (!request)
113
+ return;
114
+ request.reject(new Error('User cancelled'));
115
+ this.removeCurrentRequest();
116
+ }
117
+ removeCurrentRequest() {
118
+ this.confirmationQueue.update(queue => queue.slice(1));
119
+ this.currentRequest.set(null);
120
+ // Process next request if any
121
+ setTimeout(() => this.processQueue(), 100);
122
+ }
123
+ generateId() {
124
+ return `confirmation-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
125
+ }
126
+ getDefaultIcon(type) {
127
+ const iconMap = {
128
+ danger: 'error',
129
+ warning: 'warning',
130
+ info: 'info',
131
+ success: 'check_circle'
132
+ };
133
+ return iconMap[type];
134
+ }
135
+ // Public getters for components
136
+ getCurrentRequest() {
137
+ return this.currentRequest;
138
+ }
139
+ getHasActiveConfirmation() {
140
+ return this.hasActiveConfirmation;
141
+ }
142
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: ConfirmationService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
143
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: ConfirmationService, providedIn: 'root' }); }
144
+ }
145
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: ConfirmationService, decorators: [{
146
+ type: Injectable,
147
+ args: [{
148
+ providedIn: 'root'
149
+ }]
150
+ }], ctorParameters: () => [] });
151
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlybWF0aW9uLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jbG91ZC1pZGUtZWxlbWVudC9zcmMvbGliL3NlcnZpY2VzL2NvbmZpcm1hdGlvbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBZSxNQUFNLGVBQWUsQ0FBQzs7QUE4QjFFLE1BQU0sT0FBTyxtQkFBbUI7SUFROUI7UUFQUSxzQkFBaUIsR0FBRyxNQUFNLENBQWlDLEVBQUUsQ0FBQyxDQUFDO1FBQy9ELG1CQUFjLEdBQUcsTUFBTSxDQUFzQyxJQUFJLENBQUMsQ0FBQztRQUUzRSxtQkFBbUI7UUFDbkIsMEJBQXFCLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsS0FBSyxJQUFJLENBQUMsQ0FBQztRQUN2RSxnQkFBVyxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUUvQyxDQUFDO0lBRWhCOztPQUVHO0lBQ0gsR0FBRyxDQUFDLE9BQXFDO1FBQ3ZDLE9BQU8sSUFBSSxPQUFPLENBQVUsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7WUFDOUMsTUFBTSxPQUFPLEdBQWlDO2dCQUM1QyxFQUFFLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRTtnQkFDckIsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLO2dCQUNwQixPQUFPLEVBQUUsT0FBTyxDQUFDLE9BQU87Z0JBQ3hCLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSSxJQUFJLFNBQVM7Z0JBQy9CLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLElBQUksSUFBSSxTQUFTLENBQUM7Z0JBQ3BFLFdB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O1FBQzFCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdkQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFOUIsOEJBQThCO1FBQzlCLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVPLFVBQVU7UUFDaEIsT0FBTyxnQkFBZ0IsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQ2pGLENBQUM7SUFFTyxjQUFjLENBQUMsSUFBK0M7UUFDcEUsTUFBTSxPQUFPLEdBQUc7WUFDZCxNQUFNLEVBQUUsT0FBTztZQUNmLE9BQU8sRUFBRSxTQUFTO1lBQ2xCLElBQUksRUFBRSxNQUFNO1lBQ1osT0FBTyxFQUFFLGNBQWM7U0FDeEIsQ0FBQztRQUNGLE9BQU8sT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxnQ0FBZ0M7SUFDaEMsaUJBQWlCO1FBQ2YsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDO0lBQzdCLENBQUM7SUFFRCx3QkFBd0I7UUFDdEIsT0FBTyxJQUFJLENBQUMscUJBQXFCLENBQUM7SUFDcEMsQ0FBQzs4R0E3SlUsbUJBQW1CO2tIQUFuQixtQkFBbUIsY0FGbEIsTUFBTTs7MkZBRVAsbUJBQW1CO2tCQUgvQixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIHNpZ25hbCwgY29tcHV0ZWQsIFRlbXBsYXRlUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIENvbmZpcm1hdGlvblJlcXVlc3Q8VCA9IHVua25vd24+IHtcclxuICBpZDogc3RyaW5nO1xyXG4gIHRpdGxlOiBzdHJpbmc7XHJcbiAgbWVzc2FnZTogc3RyaW5nO1xyXG4gIHR5cGU6ICdkYW5nZXInIHwgJ3dhcm5pbmcnIHwgJ2luZm8nIHwgJ3N1Y2Nlc3MnO1xyXG4gIGljb24/OiBzdHJpbmc7XHJcbiAgY29uZmlybVRleHQ/OiBzdHJpbmc7XHJcbiAgY2FuY2VsVGV4dD86IHN0cmluZztcclxuICBjdXN0b21UZW1wbGF0ZT86IFRlbXBsYXRlUmVmPHVua25vd24+O1xyXG4gIGN1c3RvbURhdGE/OiBUO1xyXG4gIHJlc29sdmU6ICh2YWx1ZTogYm9vbGVhbiB8IFQpID0+IHZvaWQ7XHJcbiAgcmVqZWN0OiAocmVhc29uPzogdW5rbm93bikgPT4gdm9pZDtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBDb25maXJtYXRpb25PcHRpb25zPFQgPSB1bmtub3duPiB7XHJcbiAgdGl0bGU6IHN0cmluZztcclxuICBtZXNzYWdlOiBzdHJpbmc7XHJcbiAgdHlwZT86ICdkYW5nZXInIHwgJ3dhcm5pbmcnIHwgJ2luZm8nIHwgJ3N1Y2Nlc3MnO1xyXG4gIGljb24/OiBzdHJpbmc7XHJcbiAgY29uZmlybVRleHQ/OiBzdHJpbmc7XHJcbiAgY2FuY2VsVGV4dD86IHN0cmluZztcclxuICBjdXN0b21UZW1wbGF0ZT86IFRlbXBsYXRlUmVmPHVua25vd24+O1xyXG4gIGN1c3RvbURhdGE/OiBUO1xyXG59XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDb25maXJtYXRpb25TZXJ2aWNlIHtcclxuICBwcml2YXRlIGNvbmZpcm1hdGlvblF1ZXVlID0gc2lnbmFsPENvbmZpcm1hdGlvblJlcXVlc3Q8dW5rbm93bj5bXT4oW10pO1xyXG4gIHByaXZhdGUgY3VycmVudFJlcXVlc3QgPSBzaWduYWw8Q29uZmlybWF0aW9uUmVxdWVzdDx1bmtub3duPiB8IG51bGw+KG51bGwpO1xyXG4gIFxyXG4gIC8vIENvbXB1dGVkIHNpZ25hbHNcclxuICBoYXNBY3RpdmVDb25maXJtYXRpb24gPSBjb21wdXRlZCgoKSA9PiB0aGlzLmN1cnJlbnRSZXF1ZXN0KCkgIT09IG51bGwpO1xyXG4gIHF1ZXVlTGVuZ3RoID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5jb25maXJtYXRpb25RdWV1ZSgpLmxlbmd0aCk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkge31cclxuXHJcbiAgLyoqXHJcbiAgICogQXNrIGZvciBjb25maXJtYXRpb24gd2l0aCBhIHNpbXBsZSB5ZXMvbm8gZGlhbG9nXHJcbiAgICovXHJcbiAgYXNrKG9wdGlvbnM6IENvbmZpcm1hdGlvbk9wdGlvbnM8dW5rbm93bj4pOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZTxib29sZWFuPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIGNvbnN0IHJlcXVlc3Q6IENvbmZpcm1hdGlvblJlcXVlc3Q8dW5rbm93bj4gPSB7XHJcbiAgICAgICAgaWQ6IHRoaXMuZ2VuZXJhdGVJZCgpLFxyXG4gICAgICAgIHRpdGxlOiBvcHRpb25zLnRpdGxlLFxyXG4gICAgICAgIG1lc3NhZ2U6IG9wdGlvbnMubWVzc2FnZSxcclxuICAgICAgICB0eXBlOiBvcHRpb25zLnR5cGUgfHwgJ3dhcm5pbmcnLFxyXG4gICAgICAgIGljb246IG9wdGlvbnMuaWNvbiB8fCB0aGlzLmdldERlZmF1bHRJY29uKG9wdGlvbnMudHlwZSB8fCAnd2FybmluZycpLFxyXG4gICAgICAgIGNvbmZpcm1UZXh0OiBvcHRpb25zLmNvbmZpcm1UZXh0IHx8ICdDb25maXJtJyxcclxuICAgICAgICBjYW5jZWxUZXh0OiBvcHRpb25zLmNhbmNlbFRleHQgfHwgJ0NhbmNlbCcsXHJcbiAgICAgICAgcmVzb2x2ZTogKHZhbHVlOiBib29sZWFuIHwgdW5rbm93bikgPT4gcmVzb2x2ZSh2YWx1ZSBhcyBib29sZWFuKSxcclxuICAgICAgICByZWplY3RcclxuICAgICAgfTtcclxuXHJcbiAgICAgIHRoaXMuYWRkVG9RdWV1ZShyZXF1ZXN0KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQXNrIGZvciBjb25maXJtYXRpb24gd2l0aCBjdXN0b20gdGVtcGxhdGUgYW5kIHJldHVybiBjdXN0b20gZGF0YVxyXG4gICAqL1xyXG4gIGFza1dpdGhUZW1wbGF0ZTxUID0gdW5rbm93bj4ob3B0aW9uczogQ29uZmlybWF0aW9uT3B0aW9uczxUPiAmIHsgY3VzdG9tVGVtcGxhdGU6IFRlbXBsYXRlUmVmPHVua25vd24+IH0pOiBQcm9taXNlPFQ+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZTxUPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIGNvbnN0IHJlcXVlc3Q6IENvbmZpcm1hdGlvblJlcXVlc3Q8VD4gPSB7XHJcbiAgICAgICAgaWQ6IHRoaXMuZ2VuZXJhdGVJZCgpLFxyXG4gICAgICAgIHRpdGxlOiBvcHRpb25zLnRpdGxlLFxyXG4gICAgICAgIG1lc3NhZ2U6IG9wdGlvbnMubWVzc2FnZSxcclxuICAgICAgICB0eXBlOiBvcHRpb25zLnR5cGUgfHwgJ2luZm8nLFxyXG4gICAgICAgIGljb246IG9wdGlvbnMuaWNvbiB8fCB0aGlzLmdldERlZmF1bHRJY29uKG9wdGlvbnMudHlwZSB8fCAnaW5mbycpLFxyXG4gICAgICAgIGNvbmZpcm1UZXh0OiBvcHRpb25zLmNvbmZpcm1UZXh0IHx8ICdDb25maXJtJyxcclxuICAgICAgICBjYW5jZWxUZXh0OiBvcHRpb25zLmNhbmNlbFRleHQgfHwgJ0NhbmNlbCcsXHJcbiAgICAgICAgY3VzdG9tVGVtcGxhdGU6IG9wdGlvbnMuY3VzdG9tVGVtcGxhdGUsXHJcbiAgICAgICAgY3VzdG9tRGF0YTogb3B0aW9ucy5jdXN0b21EYXRhLFxyXG4gICAgICAgIHJlc29sdmU6ICh2YWx1ZTogYm9vbGVhbiB8IFQpID0+IHJlc29sdmUodmFsdWUgYXMgVCksXHJcbiAgICAgICAgcmVqZWN0XHJcbiAgICAgIH07XHJcblxyXG4gICAgICAvLyBDYXN0IHRvIHVua25vd24gZm9yIHF1ZXVlIGNvbXBhdGliaWxpdHlcclxuICAgICAgdGhpcy5hZGRUb1F1ZXVlKHJlcXVlc3QgYXMgQ29uZmlybWF0aW9uUmVxdWVzdDx1bmtub3duPik7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFF1aWNrIGNvbmZpcm1hdGlvbiBmb3IgZGFuZ2Vyb3VzIGFjdGlvbnNcclxuICAgKi9cclxuICBjb25maXJtRGVsZXRlKGl0ZW1OYW1lPzogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICByZXR1cm4gdGhpcy5hc2soe1xyXG4gICAgICB0aXRsZTogJ0NvbmZpcm0gRGVsZXRlJyxcclxuICAgICAgbWVzc2FnZTogaXRlbU5hbWUgPyBgQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSBcIiR7aXRlbU5hbWV9XCI/IFRoaXMgYWN0aW9uIGNhbm5vdCBiZSB1bmRvbmUuYCA6ICdBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlIHRoaXMgaXRlbT8gVGhpcyBhY3Rpb24gY2Fubm90IGJlIHVuZG9uZS4nLFxyXG4gICAgICB0eXBlOiAnZGFuZ2VyJyxcclxuICAgICAgaWNvbjogJ2RlbGV0ZV9mb3JldmVyJyxcclxuICAgICAgY29uZmlybVRleHQ6ICdEZWxldGUnLFxyXG4gICAgICBjYW5jZWxUZXh0OiAnQ2FuY2VsJ1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBRdWljayBjb25maXJtYXRpb24gZm9yIHBlcm1hbmVudCBhY3Rpb25zXHJcbiAgICovXHJcbiAgY29uZmlybVBlcm1hbmVudEFjdGlvbihhY3Rpb246IHN0cmluZywgaXRlbU5hbWU/OiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIHJldHVybiB0aGlzLmFzayh7XHJcbiAgICAgIHRpdGxlOiBgQ29uZmlybSAke2FjdGlvbn1gLFxyXG4gICAgICBtZXNzYWdlOiBpdGVtTmFtZSA/IGBBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gJHthY3Rpb24udG9Mb3dlckNhc2UoKX0gXCIke2l0ZW1OYW1lfVwiPyBUaGlzIGFjdGlvbiBjYW5ub3QgYmUgdW5kb25lLmAgOiBgQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvICR7YWN0aW9uLnRvTG93ZXJDYXNlKCl9PyBUaGlzIGFjdGlvbiBjYW5ub3QgYmUgdW5kb25lLmAsXHJcbiAgICAgIHR5cGU6ICdkYW5nZXInLFxyXG4gICAgICBpY29uOiAnd2FybmluZycsXHJcbiAgICAgIGNvbmZpcm1UZXh0OiBhY3Rpb24sXHJcbiAgICAgIGNhbmNlbFRleHQ6ICdDYW5jZWwnXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFF1aWNrIGNvbmZpcm1hdGlvbiBmb3Igc2FmZSBhY3Rpb25zXHJcbiAgICovXHJcbiAgY29uZmlybVNhZmVBY3Rpb24oYWN0aW9uOiBzdHJpbmcsIGl0ZW1OYW1lPzogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICByZXR1cm4gdGhpcy5hc2soe1xyXG4gICAgICB0aXRsZTogYENvbmZpcm0gJHthY3Rpb259YCxcclxuICAgICAgbWVzc2FnZTogaXRlbU5hbWUgPyBgQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvICR7YWN0aW9uLnRvTG93ZXJDYXNlKCl9IFwiJHtpdGVtTmFtZX1cIj9gIDogYEFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byAke2FjdGlvbi50b0xvd2VyQ2FzZSgpfT9gLFxyXG4gICAgICB0eXBlOiAnaW5mbycsXHJcbiAgICAgIGljb246ICdpbmZvJyxcclxuICAgICAgY29uZmlybVRleHQ6IGFjdGlvbixcclxuICAgICAgY2FuY2VsVGV4dDogJ0NhbmNlbCdcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLy8gSW50ZXJuYWwgbWV0aG9kc1xyXG4gIHByaXZhdGUgYWRkVG9RdWV1ZShyZXF1ZXN0OiBDb25maXJtYXRpb25SZXF1ZXN0PHVua25vd24+KTogdm9pZCB7XHJcbiAgICB0aGlzLmNvbmZpcm1hdGlvblF1ZXVlLnVwZGF0ZShxdWV1ZSA9PiBbLi4ucXVldWUsIHJlcXVlc3RdKTtcclxuICAgIHRoaXMucHJvY2Vzc1F1ZXVlKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHByb2Nlc3NRdWV1ZSgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmN1cnJlbnRSZXF1ZXN0KCkgfHwgdGhpcy5jb25maXJtYXRpb25RdWV1ZSgpLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgbmV4dFJlcXVlc3QgPSB0aGlzLmNvbmZpcm1hdGlvblF1ZXVlKClbMF07XHJcbiAgICB0aGlzLmN1cnJlbnRSZXF1ZXN0LnNldChuZXh0UmVxdWVzdCk7XHJcbiAgfVxyXG5cclxuICBjb25maXJtQ3VycmVudFJlcXVlc3QoZGF0YT86IHVua25vd24pOiB2b2lkIHtcclxuICAgIGNvbnN0IHJlcXVlc3QgPSB0aGlzLmN1cnJlbnRSZXF1ZXN0KCk7XHJcbiAgICBpZiAoIXJlcXVlc3QpIHJldHVybjtcclxuXHJcbiAgICByZXF1ZXN0LnJlc29sdmUoZGF0YSAhPT0gdW5kZWZpbmVkID8gZGF0YSA6IHRydWUpO1xyXG4gICAgdGhpcy5yZW1vdmVDdXJyZW50UmVxdWVzdCgpO1xyXG4gIH1cclxuXHJcbiAgY2FuY2VsQ3VycmVudFJlcXVlc3QoKTogdm9pZCB7XHJcbiAgICBjb25zdCByZXF1ZXN0ID0gdGhpcy5jdXJyZW50UmVxdWVzdCgpO1xyXG4gICAgaWYgKCFyZXF1ZXN0KSByZXR1cm47XHJcblxyXG4gICAgcmVxdWVzdC5yZWplY3QobmV3IEVycm9yKCdVc2VyIGNhbmNlbGxlZCcpKTtcclxuICAgIHRoaXMucmVtb3ZlQ3VycmVudFJlcXVlc3QoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVtb3ZlQ3VycmVudFJlcXVlc3QoKTogdm9pZCB7XHJcbiAgICB0aGlzLmNvbmZpcm1hdGlvblF1ZXVlLnVwZGF0ZShxdWV1ZSA9PiBxdWV1ZS5zbGljZSgxKSk7XHJcbiAgICB0aGlzLmN1cnJlbnRSZXF1ZXN0LnNldChudWxsKTtcclxuICAgIFxyXG4gICAgLy8gUHJvY2VzcyBuZXh0IHJlcXVlc3QgaWYgYW55XHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMucHJvY2Vzc1F1ZXVlKCksIDEwMCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdlbmVyYXRlSWQoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBgY29uZmlybWF0aW9uLSR7RGF0ZS5ub3coKX0tJHtNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHIoMiwgOSl9YDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0RGVmYXVsdEljb24odHlwZTogJ2RhbmdlcicgfCAnd2FybmluZycgfCAnaW5mbycgfCAnc3VjY2VzcycpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgaWNvbk1hcCA9IHtcclxuICAgICAgZGFuZ2VyOiAnZXJyb3InLFxyXG4gICAgICB3YXJuaW5nOiAnd2FybmluZycsXHJcbiAgICAgIGluZm86ICdpbmZvJyxcclxuICAgICAgc3VjY2VzczogJ2NoZWNrX2NpcmNsZSdcclxuICAgIH07XHJcbiAgICByZXR1cm4gaWNvbk1hcFt0eXBlXTtcclxuICB9XHJcblxyXG4gIC8vIFB1YmxpYyBnZXR0ZXJzIGZvciBjb21wb25lbnRzXHJcbiAgZ2V0Q3VycmVudFJlcXVlc3QoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5jdXJyZW50UmVxdWVzdDtcclxuICB9XHJcblxyXG4gIGdldEhhc0FjdGl2ZUNvbmZpcm1hdGlvbigpIHtcclxuICAgIHJldHVybiB0aGlzLmhhc0FjdGl2ZUNvbmZpcm1hdGlvbjtcclxuICB9XHJcbn1cclxuIl19
@@ -0,0 +1,93 @@
1
+ import { Injectable, signal } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ export class DropdownManagerService {
4
+ constructor() {
5
+ this.activeDropdowns = signal(new Map());
6
+ this.initializeGlobalListeners();
7
+ }
8
+ initializeGlobalListeners() {
9
+ // Global document click listener
10
+ this.documentClickListener = (event) => {
11
+ this.handleDocumentClick(event);
12
+ };
13
+ // Global escape key listener
14
+ this.escapeKeyListener = (event) => {
15
+ if (event.key === 'Escape') {
16
+ this.closeAllDropdowns();
17
+ }
18
+ };
19
+ // Add listeners
20
+ document.addEventListener('click', this.documentClickListener, true);
21
+ document.addEventListener('keydown', this.escapeKeyListener, true);
22
+ }
23
+ registerDropdown(dropdown) {
24
+ // Close any existing dropdowns before opening a new one
25
+ this.closeAllDropdowns();
26
+ this.activeDropdowns.update(map => {
27
+ const newMap = new Map(map);
28
+ newMap.set(dropdown.id, dropdown);
29
+ return newMap;
30
+ });
31
+ }
32
+ unregisterDropdown(id) {
33
+ this.activeDropdowns.update(map => {
34
+ const newMap = new Map(map);
35
+ newMap.delete(id);
36
+ return newMap;
37
+ });
38
+ }
39
+ closeAllDropdowns() {
40
+ const dropdowns = this.activeDropdowns();
41
+ dropdowns.forEach(dropdown => {
42
+ dropdown.close();
43
+ });
44
+ this.activeDropdowns.set(new Map());
45
+ }
46
+ closeDropdown(id) {
47
+ const dropdowns = this.activeDropdowns();
48
+ const dropdown = dropdowns.get(id);
49
+ if (dropdown) {
50
+ dropdown.close();
51
+ this.unregisterDropdown(id);
52
+ }
53
+ }
54
+ isDropdownOpen(id) {
55
+ return this.activeDropdowns().has(id);
56
+ }
57
+ handleDocumentClick(event) {
58
+ const dropdowns = this.activeDropdowns();
59
+ if (dropdowns.size === 0) {
60
+ return;
61
+ }
62
+ // Check if click is inside any open dropdown
63
+ const target = event.target;
64
+ let isClickInsideDropdown = false;
65
+ dropdowns.forEach(dropdown => {
66
+ if (dropdown.element && dropdown.element.contains(target)) {
67
+ isClickInsideDropdown = true;
68
+ }
69
+ });
70
+ // If click is outside all dropdowns, close them
71
+ if (!isClickInsideDropdown) {
72
+ this.closeAllDropdowns();
73
+ }
74
+ }
75
+ ngOnDestroy() {
76
+ // Clean up global listeners
77
+ if (this.documentClickListener) {
78
+ document.removeEventListener('click', this.documentClickListener, true);
79
+ }
80
+ if (this.escapeKeyListener) {
81
+ document.removeEventListener('keydown', this.escapeKeyListener, true);
82
+ }
83
+ }
84
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: DropdownManagerService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
85
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: DropdownManagerService, providedIn: 'root' }); }
86
+ }
87
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: DropdownManagerService, decorators: [{
88
+ type: Injectable,
89
+ args: [{
90
+ providedIn: 'root'
91
+ }]
92
+ }], ctorParameters: () => [] });
93
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJvcGRvd24tbWFuYWdlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2xvdWQtaWRlLWVsZW1lbnQvc3JjL2xpYi9zZXJ2aWNlcy9kcm9wZG93bi1tYW5hZ2VyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBV25ELE1BQU0sT0FBTyxzQkFBc0I7SUFLakM7UUFKUSxvQkFBZSxHQUFHLE1BQU0sQ0FBZ0MsSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBS3pFLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO0lBQ25DLENBQUM7SUFFTyx5QkFBeUI7UUFDL0IsaUNBQWlDO1FBQ2pDLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxDQUFDLEtBQVksRUFBRSxFQUFFO1lBQzVDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNsQyxDQUFDLENBQUM7UUFFRiw2QkFBNkI7UUFDN0IsSUFBSSxDQUFDLGlCQUFpQixHQUFHLENBQUMsS0FBb0IsRUFBRSxFQUFFO1lBQ2hELElBQUksS0FBSyxDQUFDLEdBQUcsS0FBSyxRQUFRLEVBQUUsQ0FBQztnQkFDM0IsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDM0IsQ0FBQztRQUNILENBQUMsQ0FBQztRQUVGLGdCQUFnQjtRQUNoQixRQUFRLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNyRSxRQUFRLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNyRSxDQUFDO0lBRUQsZ0JBQWdCLENBQUMsUUFBMEI7UUFDekMsd0RBQXdEO1FBQ3hELElBQUksQ0FBQyxpQkFBaUIsRUFB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QXNCLGNBRnJCLE1BQU07OzJGQUVQLHNCQUFzQjtrQkFIbEMsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBzaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgRHJvcGRvd25JbnN0YW5jZSB7XHJcbiAgaWQ6IHN0cmluZztcclxuICBjbG9zZTogKCkgPT4gdm9pZDtcclxuICBlbGVtZW50PzogRWxlbWVudDtcclxufVxyXG5cclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgRHJvcGRvd25NYW5hZ2VyU2VydmljZSB7XHJcbiAgcHJpdmF0ZSBhY3RpdmVEcm9wZG93bnMgPSBzaWduYWw8TWFwPHN0cmluZywgRHJvcGRvd25JbnN0YW5jZT4+KG5ldyBNYXAoKSk7XHJcbiAgcHJpdmF0ZSBkb2N1bWVudENsaWNrTGlzdGVuZXI/OiAoZXZlbnQ6IEV2ZW50KSA9PiB2b2lkO1xyXG4gIHByaXZhdGUgZXNjYXBlS2V5TGlzdGVuZXI/OiAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpID0+IHZvaWQ7XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgdGhpcy5pbml0aWFsaXplR2xvYmFsTGlzdGVuZXJzKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGluaXRpYWxpemVHbG9iYWxMaXN0ZW5lcnMoKTogdm9pZCB7XHJcbiAgICAvLyBHbG9iYWwgZG9jdW1lbnQgY2xpY2sgbGlzdGVuZXJcclxuICAgIHRoaXMuZG9jdW1lbnRDbGlja0xpc3RlbmVyID0gKGV2ZW50OiBFdmVudCkgPT4ge1xyXG4gICAgICB0aGlzLmhhbmRsZURvY3VtZW50Q2xpY2soZXZlbnQpO1xyXG4gICAgfTtcclxuXHJcbiAgICAvLyBHbG9iYWwgZXNjYXBlIGtleSBsaXN0ZW5lclxyXG4gICAgdGhpcy5lc2NhcGVLZXlMaXN0ZW5lciA9IChldmVudDogS2V5Ym9hcmRFdmVudCkgPT4ge1xyXG4gICAgICBpZiAoZXZlbnQua2V5ID09PSAnRXNjYXBlJykge1xyXG4gICAgICAgIHRoaXMuY2xvc2VBbGxEcm9wZG93bnMoKTtcclxuICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICAvLyBBZGQgbGlzdGVuZXJzXHJcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuZG9jdW1lbnRDbGlja0xpc3RlbmVyLCB0cnVlKTtcclxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLmVzY2FwZUtleUxpc3RlbmVyLCB0cnVlKTtcclxuICB9XHJcblxyXG4gIHJlZ2lzdGVyRHJvcGRvd24oZHJvcGRvd246IERyb3Bkb3duSW5zdGFuY2UpOiB2b2lkIHtcclxuICAgIC8vIENsb3NlIGFueSBleGlzdGluZyBkcm9wZG93bnMgYmVmb3JlIG9wZW5pbmcgYSBuZXcgb25lXHJcbiAgICB0aGlzLmNsb3NlQWxsRHJvcGRvd25zKCk7XHJcbiAgICBcclxuICAgIHRoaXMuYWN0aXZlRHJvcGRvd25zLnVwZGF0ZShtYXAgPT4ge1xyXG4gICAgICBjb25zdCBuZXdNYXAgPSBuZXcgTWFwKG1hcCk7XHJcbiAgICAgIG5ld01hcC5zZXQoZHJvcGRvd24uaWQsIGRyb3Bkb3duKTtcclxuICAgICAgcmV0dXJuIG5ld01hcDtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgdW5yZWdpc3RlckRyb3Bkb3duKGlkOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMuYWN0aXZlRHJvcGRvd25zLnVwZGF0ZShtYXAgPT4ge1xyXG4gICAgICBjb25zdCBuZXdNYXAgPSBuZXcgTWFwKG1hcCk7XHJcbiAgICAgIG5ld01hcC5kZWxldGUoaWQpO1xyXG4gICAgICByZXR1cm4gbmV3TWFwO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBjbG9zZUFsbERyb3Bkb3ducygpOiB2b2lkIHtcclxuICAgIGNvbnN0IGRyb3Bkb3ducyA9IHRoaXMuYWN0aXZlRHJvcGRvd25zKCk7XHJcbiAgICBkcm9wZG93bnMuZm9yRWFjaChkcm9wZG93biA9PiB7XHJcbiAgICAgIGRyb3Bkb3duLmNsb3NlKCk7XHJcbiAgICB9KTtcclxuICAgIHRoaXMuYWN0aXZlRHJvcGRvd25zLnNldChuZXcgTWFwKCkpO1xyXG4gIH1cclxuXHJcbiAgY2xvc2VEcm9wZG93bihpZDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBjb25zdCBkcm9wZG93bnMgPSB0aGlzLmFjdGl2ZURyb3Bkb3ducygpO1xyXG4gICAgY29uc3QgZHJvcGRvd24gPSBkcm9wZG93bnMuZ2V0KGlkKTtcclxuICAgIGlmIChkcm9wZG93bikge1xyXG4gICAgICBkcm9wZG93bi5jbG9zZSgpO1xyXG4gICAgICB0aGlzLnVucmVnaXN0ZXJEcm9wZG93bihpZCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBpc0Ryb3Bkb3duT3BlbihpZDogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5hY3RpdmVEcm9wZG93bnMoKS5oYXMoaWQpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBoYW5kbGVEb2N1bWVudENsaWNrKGV2ZW50OiBFdmVudCk6IHZvaWQge1xyXG4gICAgY29uc3QgZHJvcGRvd25zID0gdGhpcy5hY3RpdmVEcm9wZG93bnMoKTtcclxuICAgIFxyXG4gICAgaWYgKGRyb3Bkb3ducy5zaXplID09PSAwKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvLyBDaGVjayBpZiBjbGljayBpcyBpbnNpZGUgYW55IG9wZW4gZHJvcGRvd25cclxuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBFbGVtZW50O1xyXG4gICAgbGV0IGlzQ2xpY2tJbnNpZGVEcm9wZG93biA9IGZhbHNlO1xyXG5cclxuICAgIGRyb3Bkb3ducy5mb3JFYWNoKGRyb3Bkb3duID0+IHtcclxuICAgICAgaWYgKGRyb3Bkb3duLmVsZW1lbnQgJiYgZHJvcGRvd24uZWxlbWVudC5jb250YWlucyh0YXJnZXQpKSB7XHJcbiAgICAgICAgaXNDbGlja0luc2lkZURyb3Bkb3duID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gSWYgY2xpY2sgaXMgb3V0c2lkZSBhbGwgZHJvcGRvd25zLCBjbG9zZSB0aGVtXHJcbiAgICBpZiAoIWlzQ2xpY2tJbnNpZGVEcm9wZG93bikge1xyXG4gICAgICB0aGlzLmNsb3NlQWxsRHJvcGRvd25zKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIC8vIENsZWFuIHVwIGdsb2JhbCBsaXN0ZW5lcnNcclxuICAgIGlmICh0aGlzLmRvY3VtZW50Q2xpY2tMaXN0ZW5lcikge1xyXG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuZG9jdW1lbnRDbGlja0xpc3RlbmVyLCB0cnVlKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmVzY2FwZUtleUxpc3RlbmVyKSB7XHJcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLmVzY2FwZUtleUxpc3RlbmVyLCB0cnVlKTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIl19