@raintonic/formaui 0.2.1 → 0.3.1
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/CHANGELOG.md +100 -3
- package/LICENSE +21 -0
- package/README.md +80 -26
- package/fesm2022/raintonic-formaui-components-accordion.mjs +2 -2
- package/fesm2022/raintonic-formaui-components-accordion.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-alert.mjs +24 -5
- package/fesm2022/raintonic-formaui-components-alert.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-autocomplete.mjs +38 -9
- package/fesm2022/raintonic-formaui-components-autocomplete.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-badge.mjs +45 -31
- package/fesm2022/raintonic-formaui-components-badge.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-big-menu.mjs +23 -5
- package/fesm2022/raintonic-formaui-components-big-menu.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-breadcrumb.mjs +24 -7
- package/fesm2022/raintonic-formaui-components-breadcrumb.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-button-group.mjs +6 -6
- package/fesm2022/raintonic-formaui-components-button-group.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-button.mjs +63 -17
- package/fesm2022/raintonic-formaui-components-button.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-card.mjs +8 -8
- package/fesm2022/raintonic-formaui-components-card.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-checkbox.mjs +2 -2
- package/fesm2022/raintonic-formaui-components-checkbox.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-data-table.mjs +67 -9
- package/fesm2022/raintonic-formaui-components-data-table.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-date-picker.mjs +63 -16
- package/fesm2022/raintonic-formaui-components-date-picker.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-drawer.mjs +19 -4
- package/fesm2022/raintonic-formaui-components-drawer.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-file-upload.mjs +25 -5
- package/fesm2022/raintonic-formaui-components-file-upload.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-form-field.mjs +21 -6
- package/fesm2022/raintonic-formaui-components-form-field.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-icon.mjs +2 -2
- package/fesm2022/raintonic-formaui-components-icon.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-input.mjs +1 -1
- package/fesm2022/raintonic-formaui-components-input.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-list.mjs +4 -4
- package/fesm2022/raintonic-formaui-components-list.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-menu.mjs +4 -4
- package/fesm2022/raintonic-formaui-components-menu.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-number-input.mjs +20 -5
- package/fesm2022/raintonic-formaui-components-number-input.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-paginator.mjs +27 -7
- package/fesm2022/raintonic-formaui-components-paginator.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-password-input.mjs +23 -5
- package/fesm2022/raintonic-formaui-components-password-input.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-popover.mjs +2 -2
- package/fesm2022/raintonic-formaui-components-popover.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-progressbar.mjs +32 -7
- package/fesm2022/raintonic-formaui-components-progressbar.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-radio.mjs +6 -5
- package/fesm2022/raintonic-formaui-components-radio.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-select.mjs +19 -4
- package/fesm2022/raintonic-formaui-components-select.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-side-panel.mjs +19 -4
- package/fesm2022/raintonic-formaui-components-side-panel.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-sidebar.mjs +23 -5
- package/fesm2022/raintonic-formaui-components-sidebar.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-skeleton.mjs +2 -2
- package/fesm2022/raintonic-formaui-components-skeleton.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-slider.mjs +23 -5
- package/fesm2022/raintonic-formaui-components-slider.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-spinner.mjs +24 -7
- package/fesm2022/raintonic-formaui-components-spinner.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-stepper.mjs +2 -2
- package/fesm2022/raintonic-formaui-components-stepper.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-tab.mjs +2 -2
- package/fesm2022/raintonic-formaui-components-tab.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-tag.mjs +21 -4
- package/fesm2022/raintonic-formaui-components-tag.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-time-picker.mjs +26 -7
- package/fesm2022/raintonic-formaui-components-time-picker.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-toggle.mjs +2 -2
- package/fesm2022/raintonic-formaui-components-toggle.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-toolbar.mjs +41 -7
- package/fesm2022/raintonic-formaui-components-toolbar.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-tooltip.mjs +2 -2
- package/fesm2022/raintonic-formaui-components-tooltip.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-tree-table.mjs +35 -6
- package/fesm2022/raintonic-formaui-components-tree-table.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-tree.mjs +23 -5
- package/fesm2022/raintonic-formaui-components-tree.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-core.mjs +25 -1
- package/fesm2022/raintonic-formaui-core.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-services-dialog.mjs +3 -3
- package/fesm2022/raintonic-formaui-services-dialog.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-services-notification.mjs +2 -2
- package/fesm2022/raintonic-formaui-services-notification.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-services-theme.mjs +3 -3
- package/fesm2022/raintonic-formaui-services-theme.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-test-utils.mjs +21 -16
- package/fesm2022/raintonic-formaui-test-utils.mjs.map +1 -1
- package/fesm2022/raintonic-formaui.mjs +1 -1
- package/fesm2022/raintonic-formaui.mjs.map +1 -1
- package/llms-full.txt +34 -25
- package/llms.txt +1 -2
- package/package.json +1 -5
- package/styles/index.scss +2 -2
- package/styles/partials/_motion.scss +25 -0
- package/styles/partials/_theme.scss +6 -5
- package/styles/partials/components/_button.scss +361 -367
- package/styles/partials/themes/_dark.scss +14 -0
- package/styles/partials/themes/_light.scss +14 -0
- package/types/raintonic-formaui-components-alert.d.ts +11 -1
- package/types/raintonic-formaui-components-alert.d.ts.map +1 -1
- package/types/raintonic-formaui-components-autocomplete.d.ts +25 -7
- package/types/raintonic-formaui-components-autocomplete.d.ts.map +1 -1
- package/types/raintonic-formaui-components-badge.d.ts +20 -9
- package/types/raintonic-formaui-components-badge.d.ts.map +1 -1
- package/types/raintonic-formaui-components-big-menu.d.ts +12 -1
- package/types/raintonic-formaui-components-big-menu.d.ts.map +1 -1
- package/types/raintonic-formaui-components-breadcrumb.d.ts +11 -2
- package/types/raintonic-formaui-components-breadcrumb.d.ts.map +1 -1
- package/types/raintonic-formaui-components-button-group.d.ts +6 -6
- package/types/raintonic-formaui-components-button.d.ts +9 -7
- package/types/raintonic-formaui-components-button.d.ts.map +1 -1
- package/types/raintonic-formaui-components-card.d.ts +4 -4
- package/types/raintonic-formaui-components-checkbox.d.ts +1 -1
- package/types/raintonic-formaui-components-data-table.d.ts +56 -16
- package/types/raintonic-formaui-components-data-table.d.ts.map +1 -1
- package/types/raintonic-formaui-components-date-picker.d.ts +32 -4
- package/types/raintonic-formaui-components-date-picker.d.ts.map +1 -1
- package/types/raintonic-formaui-components-drawer.d.ts +10 -1
- package/types/raintonic-formaui-components-drawer.d.ts.map +1 -1
- package/types/raintonic-formaui-components-file-upload.d.ts +12 -1
- package/types/raintonic-formaui-components-file-upload.d.ts.map +1 -1
- package/types/raintonic-formaui-components-form-field.d.ts +12 -2
- package/types/raintonic-formaui-components-form-field.d.ts.map +1 -1
- package/types/raintonic-formaui-components-input.d.ts +1 -1
- package/types/raintonic-formaui-components-number-input.d.ts +11 -2
- package/types/raintonic-formaui-components-number-input.d.ts.map +1 -1
- package/types/raintonic-formaui-components-paginator.d.ts +13 -1
- package/types/raintonic-formaui-components-paginator.d.ts.map +1 -1
- package/types/raintonic-formaui-components-password-input.d.ts +12 -2
- package/types/raintonic-formaui-components-password-input.d.ts.map +1 -1
- package/types/raintonic-formaui-components-progressbar.d.ts +14 -1
- package/types/raintonic-formaui-components-progressbar.d.ts.map +1 -1
- package/types/raintonic-formaui-components-radio.d.ts +2 -1
- package/types/raintonic-formaui-components-radio.d.ts.map +1 -1
- package/types/raintonic-formaui-components-select.d.ts.map +1 -1
- package/types/raintonic-formaui-components-side-panel.d.ts +10 -1
- package/types/raintonic-formaui-components-side-panel.d.ts.map +1 -1
- package/types/raintonic-formaui-components-sidebar.d.ts +12 -1
- package/types/raintonic-formaui-components-sidebar.d.ts.map +1 -1
- package/types/raintonic-formaui-components-slider.d.ts +12 -1
- package/types/raintonic-formaui-components-slider.d.ts.map +1 -1
- package/types/raintonic-formaui-components-spinner.d.ts +12 -2
- package/types/raintonic-formaui-components-spinner.d.ts.map +1 -1
- package/types/raintonic-formaui-components-tag.d.ts +10 -1
- package/types/raintonic-formaui-components-tag.d.ts.map +1 -1
- package/types/raintonic-formaui-components-time-picker.d.ts +14 -2
- package/types/raintonic-formaui-components-time-picker.d.ts.map +1 -1
- package/types/raintonic-formaui-components-toggle.d.ts +1 -1
- package/types/raintonic-formaui-components-toolbar.d.ts +22 -4
- package/types/raintonic-formaui-components-toolbar.d.ts.map +1 -1
- package/types/raintonic-formaui-components-tree-table.d.ts +29 -4
- package/types/raintonic-formaui-components-tree-table.d.ts.map +1 -1
- package/types/raintonic-formaui-components-tree.d.ts +12 -1
- package/types/raintonic-formaui-components-tree.d.ts.map +1 -1
- package/types/raintonic-formaui-core.d.ts +19 -2
- package/types/raintonic-formaui-core.d.ts.map +1 -1
- package/types/raintonic-formaui-services-dialog.d.ts +1 -1
- package/types/raintonic-formaui-services-theme.d.ts +3 -3
- package/types/raintonic-formaui-test-utils.d.ts +15 -2
- package/types/raintonic-formaui-test-utils.d.ts.map +1 -1
- package/types/raintonic-formaui.d.ts +1 -1
- package/fesm2022/raintonic-formaui-components-dynamic-form.mjs +0 -266
- package/fesm2022/raintonic-formaui-components-dynamic-form.mjs.map +0 -1
- package/types/raintonic-formaui-components-dynamic-form.d.ts +0 -412
- package/types/raintonic-formaui-components-dynamic-form.d.ts.map +0 -1
|
@@ -1,12 +1,30 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { input, output, ViewEncapsulation, ChangeDetectionStrategy, Component, signal, computed } from '@angular/core';
|
|
2
|
+
import { Injectable, inject, ChangeDetectorRef, input, output, ViewEncapsulation, ChangeDetectionStrategy, Component, signal, computed } from '@angular/core';
|
|
3
3
|
import { take } from 'rxjs';
|
|
4
|
+
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
4
5
|
import { NgTemplateOutlet } from '@angular/common';
|
|
5
6
|
import { FuiIconComponent } from '@raintonic/formaui/components/icon';
|
|
6
7
|
import { FuiCheckboxComponent } from '@raintonic/formaui/components/checkbox';
|
|
8
|
+
import { FuiIntlBase } from '@raintonic/formaui/core';
|
|
7
9
|
import { FuiVirtualScrollViewportComponent, FuiVirtualForDirective } from '@raintonic/formaui/cdk/virtual-scroll';
|
|
8
10
|
|
|
11
|
+
class FuiTreeIntl extends FuiIntlBase {
|
|
12
|
+
collapseAriaLabel = 'Collapse';
|
|
13
|
+
expandAriaLabel = 'Expand';
|
|
14
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: FuiTreeIntl, deps: null, target: i0.ɵɵFactoryTarget.Injectable });
|
|
15
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: FuiTreeIntl, providedIn: 'root' });
|
|
16
|
+
}
|
|
17
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: FuiTreeIntl, decorators: [{
|
|
18
|
+
type: Injectable,
|
|
19
|
+
args: [{ providedIn: 'root' }]
|
|
20
|
+
}] });
|
|
21
|
+
|
|
9
22
|
class FuiTreeNodeComponent {
|
|
23
|
+
intl = inject(FuiTreeIntl);
|
|
24
|
+
_cdr = inject(ChangeDetectorRef);
|
|
25
|
+
constructor() {
|
|
26
|
+
this.intl.changes.pipe(takeUntilDestroyed()).subscribe(() => { this._cdr.markForCheck(); });
|
|
27
|
+
}
|
|
10
28
|
flatNode = input.required(...(ngDevMode ? [{ debugName: "flatNode" }] : /* istanbul ignore next */ []));
|
|
11
29
|
selectionMode = input('none', ...(ngDevMode ? [{ debugName: "selectionMode" }] : /* istanbul ignore next */ []));
|
|
12
30
|
nodeTemplate = input(null, ...(ngDevMode ? [{ debugName: "nodeTemplate" }] : /* istanbul ignore next */ []));
|
|
@@ -17,7 +35,7 @@ class FuiTreeNodeComponent {
|
|
|
17
35
|
checkboxChange = output();
|
|
18
36
|
indentPx = 24;
|
|
19
37
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: FuiTreeNodeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
20
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.6", type: FuiTreeNodeComponent, isStandalone: true, selector: "fui-tree-node", inputs: { flatNode: { classPropertyName: "flatNode", publicName: "flatNode", isSignal: true, isRequired: true, transformFunction: null }, selectionMode: { classPropertyName: "selectionMode", publicName: "selectionMode", isSignal: true, isRequired: false, transformFunction: null }, nodeTemplate: { classPropertyName: "nodeTemplate", publicName: "nodeTemplate", isSignal: true, isRequired: false, transformFunction: null }, checkboxState: { classPropertyName: "checkboxState", publicName: "checkboxState", isSignal: true, isRequired: false, transformFunction: null }, focused: { classPropertyName: "focused", publicName: "focused", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { toggle: "toggle", select: "select", checkboxChange: "checkboxChange" }, host: { attributes: { "role": "treeitem" }, properties: { "attr.aria-level": "flatNode().level + 1", "attr.aria-expanded": "flatNode().expandable ? flatNode().expanded : null", "attr.aria-selected": "flatNode().selected", "class.fui-tree-node--focused": "focused()", "class.fui-tree-node--selected": "flatNode().selected", "class.fui-tree-node--disabled": "flatNode().disabled", "style.padding-left.px": "flatNode().level * indentPx" }, classAttribute: "fui-tree-node" }, ngImport: i0, template: "<div class=\"fui-tree-node__content\">\r\n <!-- Expand/collapse toggle -->\r\n <button\r\n class=\"fui-tree-node__toggle\"\r\n [class.fui-tree-node__toggle--hidden]=\"!flatNode().expandable\"\r\n (click)=\"toggle.emit(); $event.stopPropagation()\"\r\n [attr.aria-label]=\"flatNode().expanded ?
|
|
38
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.6", type: FuiTreeNodeComponent, isStandalone: true, selector: "fui-tree-node", inputs: { flatNode: { classPropertyName: "flatNode", publicName: "flatNode", isSignal: true, isRequired: true, transformFunction: null }, selectionMode: { classPropertyName: "selectionMode", publicName: "selectionMode", isSignal: true, isRequired: false, transformFunction: null }, nodeTemplate: { classPropertyName: "nodeTemplate", publicName: "nodeTemplate", isSignal: true, isRequired: false, transformFunction: null }, checkboxState: { classPropertyName: "checkboxState", publicName: "checkboxState", isSignal: true, isRequired: false, transformFunction: null }, focused: { classPropertyName: "focused", publicName: "focused", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { toggle: "toggle", select: "select", checkboxChange: "checkboxChange" }, host: { attributes: { "role": "treeitem" }, properties: { "attr.aria-level": "flatNode().level + 1", "attr.aria-expanded": "flatNode().expandable ? flatNode().expanded : null", "attr.aria-selected": "flatNode().selected", "class.fui-tree-node--focused": "focused()", "class.fui-tree-node--selected": "flatNode().selected", "class.fui-tree-node--disabled": "flatNode().disabled", "style.padding-left.px": "flatNode().level * indentPx" }, classAttribute: "fui-tree-node" }, ngImport: i0, template: "<div class=\"fui-tree-node__content\">\r\n <!-- Expand/collapse toggle -->\r\n <button\r\n class=\"fui-tree-node__toggle\"\r\n [class.fui-tree-node__toggle--hidden]=\"!flatNode().expandable\"\r\n (click)=\"toggle.emit(); $event.stopPropagation()\"\r\n [attr.aria-label]=\"flatNode().expanded ? intl.collapseAriaLabel : intl.expandAriaLabel\"\r\n tabindex=\"-1\"\r\n type=\"button\"\r\n >\r\n @if (flatNode().loading) {\r\n <fui-icon name=\"spinner\" [spin]=\"true\" size=\"sm\"></fui-icon>\r\n } @else {\r\n <fui-icon [name]=\"flatNode().expanded ? 'caret-down' : 'caret-right'\" size=\"sm\"></fui-icon>\r\n }\r\n </button>\r\n\r\n <!-- Checkbox (only in checkbox mode) -->\r\n @if (selectionMode() === 'checkbox') {\r\n <fui-checkbox\r\n [checked]=\"checkboxState() === 'checked'\"\r\n [indeterminate]=\"checkboxState() === 'indeterminate'\"\r\n [disabled]=\"flatNode().disabled\"\r\n (change)=\"checkboxChange.emit()\"\r\n >\r\n </fui-checkbox>\r\n }\r\n\r\n <!-- Node content -->\r\n <div class=\"fui-tree-node__label\" (click)=\"select.emit()\" (dblclick)=\"toggle.emit()\">\r\n @if (nodeTemplate()) {\r\n <ng-container *ngTemplateOutlet=\"nodeTemplate()!; context: { $implicit: flatNode().origin, node: flatNode() }\">\r\n </ng-container>\r\n } @else {\r\n {{ flatNode().origin.data }}\r\n }\r\n </div>\r\n</div>\r\n", styles: [".fui-tree-node{display:flex;align-items:center;cursor:pointer;transition:background-color var(--fui-duration-moderate-01) var(--fui-ease-standard)}.fui-tree-node:hover{background-color:var(--fui-surface-hover, var(--fui-black-5))}.fui-tree-node--focused{outline:2px solid var(--fui-primary-60);outline-offset:-2px}.fui-tree-node--selected{background-color:var(--fui-primary-10)}.fui-tree-node--disabled{opacity:.5;pointer-events:none}.fui-tree-node__content{display:flex;align-items:center;width:100%;min-height:32px;padding:4px 8px;gap:4px}.fui-tree-node__toggle{all:unset;display:flex;align-items:center;justify-content:center;width:20px;height:20px;flex-shrink:0;border-radius:var(--fui-border-radius-sm);cursor:pointer}.fui-tree-node__toggle--hidden{visibility:hidden}.fui-tree-node__toggle:hover{background-color:var(--fui-surface-hover, var(--fui-black-10))}.fui-tree-node__label{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: FuiIconComponent, selector: "fui-icon", inputs: ["name", "size", "weight", "color", "ariaLabel", "spin", "pulse"] }, { kind: "component", type: FuiCheckboxComponent, selector: "fui-checkbox", inputs: ["readonly", "checked", "disabled", "indeterminate", "required", "labelPosition", "name", "value", "aria-label", "aria-labelledby", "aria-describedby", "disableRipple", "tabIndex", "errorStateMatcher"], outputs: ["change", "indeterminateChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
21
39
|
}
|
|
22
40
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: FuiTreeNodeComponent, decorators: [{
|
|
23
41
|
type: Component,
|
|
@@ -31,8 +49,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.6", ngImpor
|
|
|
31
49
|
'[class.fui-tree-node--selected]': 'flatNode().selected',
|
|
32
50
|
'[class.fui-tree-node--disabled]': 'flatNode().disabled',
|
|
33
51
|
'[style.padding-left.px]': 'flatNode().level * indentPx',
|
|
34
|
-
}, template: "<div class=\"fui-tree-node__content\">\r\n <!-- Expand/collapse toggle -->\r\n <button\r\n class=\"fui-tree-node__toggle\"\r\n [class.fui-tree-node__toggle--hidden]=\"!flatNode().expandable\"\r\n (click)=\"toggle.emit(); $event.stopPropagation()\"\r\n [attr.aria-label]=\"flatNode().expanded ?
|
|
35
|
-
}], propDecorators: { flatNode: [{ type: i0.Input, args: [{ isSignal: true, alias: "flatNode", required: true }] }], selectionMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectionMode", required: false }] }], nodeTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "nodeTemplate", required: false }] }], checkboxState: [{ type: i0.Input, args: [{ isSignal: true, alias: "checkboxState", required: false }] }], focused: [{ type: i0.Input, args: [{ isSignal: true, alias: "focused", required: false }] }], toggle: [{ type: i0.Output, args: ["toggle"] }], select: [{ type: i0.Output, args: ["select"] }], checkboxChange: [{ type: i0.Output, args: ["checkboxChange"] }] } });
|
|
52
|
+
}, template: "<div class=\"fui-tree-node__content\">\r\n <!-- Expand/collapse toggle -->\r\n <button\r\n class=\"fui-tree-node__toggle\"\r\n [class.fui-tree-node__toggle--hidden]=\"!flatNode().expandable\"\r\n (click)=\"toggle.emit(); $event.stopPropagation()\"\r\n [attr.aria-label]=\"flatNode().expanded ? intl.collapseAriaLabel : intl.expandAriaLabel\"\r\n tabindex=\"-1\"\r\n type=\"button\"\r\n >\r\n @if (flatNode().loading) {\r\n <fui-icon name=\"spinner\" [spin]=\"true\" size=\"sm\"></fui-icon>\r\n } @else {\r\n <fui-icon [name]=\"flatNode().expanded ? 'caret-down' : 'caret-right'\" size=\"sm\"></fui-icon>\r\n }\r\n </button>\r\n\r\n <!-- Checkbox (only in checkbox mode) -->\r\n @if (selectionMode() === 'checkbox') {\r\n <fui-checkbox\r\n [checked]=\"checkboxState() === 'checked'\"\r\n [indeterminate]=\"checkboxState() === 'indeterminate'\"\r\n [disabled]=\"flatNode().disabled\"\r\n (change)=\"checkboxChange.emit()\"\r\n >\r\n </fui-checkbox>\r\n }\r\n\r\n <!-- Node content -->\r\n <div class=\"fui-tree-node__label\" (click)=\"select.emit()\" (dblclick)=\"toggle.emit()\">\r\n @if (nodeTemplate()) {\r\n <ng-container *ngTemplateOutlet=\"nodeTemplate()!; context: { $implicit: flatNode().origin, node: flatNode() }\">\r\n </ng-container>\r\n } @else {\r\n {{ flatNode().origin.data }}\r\n }\r\n </div>\r\n</div>\r\n", styles: [".fui-tree-node{display:flex;align-items:center;cursor:pointer;transition:background-color var(--fui-duration-moderate-01) var(--fui-ease-standard)}.fui-tree-node:hover{background-color:var(--fui-surface-hover, var(--fui-black-5))}.fui-tree-node--focused{outline:2px solid var(--fui-primary-60);outline-offset:-2px}.fui-tree-node--selected{background-color:var(--fui-primary-10)}.fui-tree-node--disabled{opacity:.5;pointer-events:none}.fui-tree-node__content{display:flex;align-items:center;width:100%;min-height:32px;padding:4px 8px;gap:4px}.fui-tree-node__toggle{all:unset;display:flex;align-items:center;justify-content:center;width:20px;height:20px;flex-shrink:0;border-radius:var(--fui-border-radius-sm);cursor:pointer}.fui-tree-node__toggle--hidden{visibility:hidden}.fui-tree-node__toggle:hover{background-color:var(--fui-surface-hover, var(--fui-black-10))}.fui-tree-node__label{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n"] }]
|
|
53
|
+
}], ctorParameters: () => [], propDecorators: { flatNode: [{ type: i0.Input, args: [{ isSignal: true, alias: "flatNode", required: true }] }], selectionMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectionMode", required: false }] }], nodeTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "nodeTemplate", required: false }] }], checkboxState: [{ type: i0.Input, args: [{ isSignal: true, alias: "checkboxState", required: false }] }], focused: [{ type: i0.Input, args: [{ isSignal: true, alias: "focused", required: false }] }], toggle: [{ type: i0.Output, args: ["toggle"] }], select: [{ type: i0.Output, args: ["select"] }], checkboxChange: [{ type: i0.Output, args: ["checkboxChange"] }] } });
|
|
36
54
|
|
|
37
55
|
class FuiTreeFlattener {
|
|
38
56
|
flatten(nodes, hasLoadChildren = false) {
|
|
@@ -426,5 +444,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.6", ngImpor
|
|
|
426
444
|
* Generated bundle index. Do not edit.
|
|
427
445
|
*/
|
|
428
446
|
|
|
429
|
-
export { FuiTreeComponent, FuiTreeFlattener, FuiTreeNodeComponent };
|
|
447
|
+
export { FuiTreeComponent, FuiTreeFlattener, FuiTreeIntl, FuiTreeNodeComponent };
|
|
430
448
|
//# sourceMappingURL=raintonic-formaui-components-tree.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"raintonic-formaui-components-tree.mjs","sources":["../../../lib/components/tree/fui-tree-node.component.ts","../../../lib/components/tree/fui-tree-node.component.html","../../../lib/components/tree/tree-flattener.ts","../../../lib/components/tree/fui-tree.component.ts","../../../lib/components/tree/fui-tree.component.html","../../../lib/components/tree/raintonic-formaui-components-tree.ts"],"sourcesContent":["import { Component, ChangeDetectionStrategy, ViewEncapsulation, input, output, TemplateRef } from '@angular/core';\r\nimport { NgTemplateOutlet } from '@angular/common';\r\nimport { FuiIconComponent } from '@raintonic/formaui/components/icon';\r\nimport { FuiCheckboxComponent } from '@raintonic/formaui/components/checkbox';\r\nimport { FuiFlatTreeNode, FuiTreeSelectionMode } from './tree.types';\r\n\r\n@Component({\r\n selector: 'fui-tree-node',\r\n standalone: true,\r\n imports: [NgTemplateOutlet, FuiIconComponent, FuiCheckboxComponent],\r\n templateUrl: './fui-tree-node.component.html',\r\n styleUrl: './fui-tree-node.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n host: {\r\n class: 'fui-tree-node',\r\n role: 'treeitem',\r\n '[attr.aria-level]': 'flatNode().level + 1',\r\n '[attr.aria-expanded]': 'flatNode().expandable ? flatNode().expanded : null',\r\n '[attr.aria-selected]': 'flatNode().selected',\r\n '[class.fui-tree-node--focused]': 'focused()',\r\n '[class.fui-tree-node--selected]': 'flatNode().selected',\r\n '[class.fui-tree-node--disabled]': 'flatNode().disabled',\r\n '[style.padding-left.px]': 'flatNode().level * indentPx',\r\n },\r\n})\r\nexport class FuiTreeNodeComponent {\r\n readonly flatNode = input.required<FuiFlatTreeNode>();\r\n readonly selectionMode = input<FuiTreeSelectionMode>('none');\r\n readonly nodeTemplate = input<TemplateRef<any> | null>(null);\r\n readonly checkboxState = input<'checked' | 'unchecked' | 'indeterminate'>('unchecked');\r\n readonly focused = input(false);\r\n\r\n readonly toggle = output();\r\n readonly select = output();\r\n readonly checkboxChange = output();\r\n\r\n readonly indentPx = 24;\r\n}\r\n","<div class=\"fui-tree-node__content\">\r\n <!-- Expand/collapse toggle -->\r\n <button\r\n class=\"fui-tree-node__toggle\"\r\n [class.fui-tree-node__toggle--hidden]=\"!flatNode().expandable\"\r\n (click)=\"toggle.emit(); $event.stopPropagation()\"\r\n [attr.aria-label]=\"flatNode().expanded ? 'Collapse' : 'Expand'\"\r\n tabindex=\"-1\"\r\n type=\"button\"\r\n >\r\n @if (flatNode().loading) {\r\n <fui-icon name=\"spinner\" [spin]=\"true\" size=\"sm\"></fui-icon>\r\n } @else {\r\n <fui-icon [name]=\"flatNode().expanded ? 'caret-down' : 'caret-right'\" size=\"sm\"></fui-icon>\r\n }\r\n </button>\r\n\r\n <!-- Checkbox (only in checkbox mode) -->\r\n @if (selectionMode() === 'checkbox') {\r\n <fui-checkbox\r\n [checked]=\"checkboxState() === 'checked'\"\r\n [indeterminate]=\"checkboxState() === 'indeterminate'\"\r\n [disabled]=\"flatNode().disabled\"\r\n (change)=\"checkboxChange.emit()\"\r\n >\r\n </fui-checkbox>\r\n }\r\n\r\n <!-- Node content -->\r\n <div class=\"fui-tree-node__label\" (click)=\"select.emit()\" (dblclick)=\"toggle.emit()\">\r\n @if (nodeTemplate()) {\r\n <ng-container *ngTemplateOutlet=\"nodeTemplate()!; context: { $implicit: flatNode().origin, node: flatNode() }\">\r\n </ng-container>\r\n } @else {\r\n {{ flatNode().origin.data }}\r\n }\r\n </div>\r\n</div>\r\n","import { FuiFlatTreeNode, FuiTreeNode } from './tree.types';\r\n\r\nexport class FuiTreeFlattener<T = any> {\r\n flatten(nodes: FuiTreeNode<T>[], hasLoadChildren = false): FuiFlatTreeNode<T>[] {\r\n const result: FuiFlatTreeNode<T>[] = [];\r\n let flatIndex = 0;\r\n\r\n const recurse = (nodeList: FuiTreeNode<T>[], level: number, parentVisible: boolean): void => {\r\n for (const node of nodeList) {\r\n const visible = parentVisible;\r\n const hasChildren = node.children != null && node.children.length > 0;\r\n const expandable = !node.leaf && (hasChildren || (hasLoadChildren && node.children == null));\r\n\r\n result.push({\r\n origin: node,\r\n level,\r\n expandable,\r\n expanded: node.expanded ?? false,\r\n selected: node.selected ?? false,\r\n disabled: node.disabled ?? false,\r\n visible,\r\n loading: false,\r\n _flatIndex: flatIndex++,\r\n });\r\n\r\n if (node.expanded && node.children != null) {\r\n recurse(node.children, level + 1, visible);\r\n }\r\n }\r\n };\r\n\r\n recurse(nodes, 0, true);\r\n return result;\r\n }\r\n\r\n calculateCheckboxStates(nodes: FuiTreeNode<T>[]): Map<FuiTreeNode<T>, 'checked' | 'unchecked' | 'indeterminate'> {\r\n const states = new Map<FuiTreeNode<T>, 'checked' | 'unchecked' | 'indeterminate'>();\r\n\r\n const recurse = (nodeList: FuiTreeNode<T>[]): { total: number; checked: number } => {\r\n let total = 0;\r\n let checked = 0;\r\n\r\n for (const node of nodeList) {\r\n if (node.children != null && node.children.length > 0) {\r\n const childResult = recurse(node.children);\r\n total += childResult.total;\r\n checked += childResult.checked;\r\n\r\n if (childResult.checked === 0) {\r\n states.set(node, node.selected ? 'checked' : 'unchecked');\r\n } else if (childResult.checked === childResult.total) {\r\n states.set(node, 'checked');\r\n } else {\r\n states.set(node, 'indeterminate');\r\n }\r\n } else {\r\n total++;\r\n if (node.selected) checked++;\r\n states.set(node, node.selected ? 'checked' : 'unchecked');\r\n }\r\n }\r\n\r\n return { total, checked };\r\n };\r\n\r\n recurse(nodes);\r\n return states;\r\n }\r\n}\r\n","import {\r\n Component,\r\n ChangeDetectionStrategy,\r\n ViewEncapsulation,\r\n input,\r\n output,\r\n signal,\r\n computed,\r\n OnDestroy,\r\n TemplateRef,\r\n} from '@angular/core';\r\nimport { Observable, Subscription, take } from 'rxjs';\r\nimport { FuiTreeNodeComponent } from './fui-tree-node.component';\r\nimport { FuiVirtualScrollViewportComponent, FuiVirtualForDirective } from '@raintonic/formaui/cdk/virtual-scroll';\r\nimport { FuiTreeFlattener } from './tree-flattener';\r\nimport {\r\n FuiTreeNode,\r\n FuiFlatTreeNode,\r\n FuiTreeSelectionMode,\r\n FuiTreeNodeEvent,\r\n FuiTreeDragDropEvent,\r\n} from './tree.types';\r\n\r\n@Component({\r\n selector: 'fui-tree',\r\n standalone: true,\r\n imports: [FuiTreeNodeComponent, FuiVirtualScrollViewportComponent, FuiVirtualForDirective],\r\n templateUrl: './fui-tree.component.html',\r\n styleUrl: './fui-tree.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n host: {\r\n class: 'fui-tree',\r\n role: 'tree',\r\n '[attr.tabindex]': '0',\r\n '(keydown)': '_onKeydown($event)',\r\n },\r\n})\r\nexport class FuiTreeComponent<T = any> implements OnDestroy {\r\n readonly nodes = input.required<FuiTreeNode<T>[]>();\r\n readonly selectionMode = input<FuiTreeSelectionMode>('none');\r\n readonly loadChildren = input<((node: FuiTreeNode<T>) => Observable<FuiTreeNode<T>[]>) | null>(null);\r\n readonly nodeTemplate = input<TemplateRef<any> | null>(null);\r\n readonly draggable = input(false);\r\n readonly virtualScroll = input(false);\r\n readonly virtualItemSize = input(32);\r\n readonly filter = input('');\r\n\r\n readonly nodeSelect = output<FuiTreeNodeEvent<T>>();\r\n readonly nodeUnselect = output<FuiTreeNodeEvent<T>>();\r\n readonly nodeExpand = output<FuiTreeNodeEvent<T>>();\r\n readonly nodeCollapse = output<FuiTreeNodeEvent<T>>();\r\n readonly nodeDrop = output<FuiTreeDragDropEvent<T>>();\r\n readonly filterChange = output<string>();\r\n\r\n private readonly _flattener = new FuiTreeFlattener<T>();\r\n private readonly _subscriptions: Subscription[] = [];\r\n\r\n /** Refresh counter to trigger re-flatten after mutations */\r\n private readonly _refreshCounter = signal(0);\r\n\r\n readonly flatNodes = computed(() => {\r\n this._refreshCounter();\r\n const nodes = this.nodes();\r\n const filterStr = this.filter();\r\n let processedNodes = nodes;\r\n if (filterStr) {\r\n processedNodes = this._filterNodes(nodes, filterStr);\r\n }\r\n return this._flattener.flatten(processedNodes, this.loadChildren() != null);\r\n });\r\n\r\n readonly checkboxStates = computed(() => {\r\n this._refreshCounter();\r\n if (this.selectionMode() !== 'checkbox') {\r\n return new Map<FuiTreeNode<T>, 'checked' | 'unchecked' | 'indeterminate'>();\r\n }\r\n return this._flattener.calculateCheckboxStates(this.nodes());\r\n });\r\n\r\n readonly focusedIndex = signal(0);\r\n\r\n ngOnDestroy(): void {\r\n for (const sub of this._subscriptions) {\r\n sub.unsubscribe();\r\n }\r\n }\r\n\r\n // --- Public API ---\r\n\r\n expandAll(): void {\r\n this._setExpandedRecursive(this.nodes(), true);\r\n this._refreshCounter.update((c) => c + 1);\r\n }\r\n\r\n collapseAll(): void {\r\n this._setExpandedRecursive(this.nodes(), false);\r\n this._refreshCounter.update((c) => c + 1);\r\n }\r\n\r\n selectNode(node: FuiTreeNode<T>): void {\r\n const mode = this.selectionMode();\r\n if (mode === 'none') return;\r\n\r\n if (mode === 'single') {\r\n this._clearSelectionRecursive(this.nodes());\r\n node.selected = true;\r\n } else if (mode === 'multi' || mode === 'checkbox') {\r\n node.selected = true;\r\n }\r\n this._refreshCounter.update((c) => c + 1);\r\n }\r\n\r\n getSelectedNodes(): FuiTreeNode<T>[] {\r\n const selected: FuiTreeNode<T>[] = [];\r\n this._collectSelectedRecursive(this.nodes(), selected);\r\n return selected;\r\n }\r\n\r\n // --- Event handlers ---\r\n\r\n onNodeToggle(flatNode: FuiFlatTreeNode<T>): void {\r\n const node = flatNode.origin;\r\n\r\n if (flatNode.expanded) {\r\n node.expanded = false;\r\n this.nodeCollapse.emit({ node, flatNode });\r\n } else {\r\n const loadChildrenFn = this.loadChildren();\r\n if (loadChildrenFn && node.children == null) {\r\n // Lazy load children\r\n this._refreshCounter.update((c) => c + 1);\r\n\r\n const sub = loadChildrenFn(node)\r\n .pipe(take(1))\r\n .subscribe({\r\n next: (children) => {\r\n node.children = children;\r\n node.expanded = true;\r\n this._refreshCounter.update((c) => c + 1);\r\n this.nodeExpand.emit({ node, flatNode });\r\n },\r\n error: () => {\r\n this._refreshCounter.update((c) => c + 1);\r\n },\r\n });\r\n this._subscriptions.push(sub);\r\n return;\r\n } else {\r\n node.expanded = true;\r\n this.nodeExpand.emit({ node, flatNode });\r\n }\r\n }\r\n this._refreshCounter.update((c) => c + 1);\r\n }\r\n\r\n onNodeSelect(flatNode: FuiFlatTreeNode<T>): void {\r\n const node = flatNode.origin;\r\n const mode = this.selectionMode();\r\n\r\n if (mode === 'none' || flatNode.disabled) return;\r\n\r\n if (mode === 'single') {\r\n const wasSelected = node.selected;\r\n this._clearSelectionRecursive(this.nodes());\r\n if (!wasSelected) {\r\n node.selected = true;\r\n this.nodeSelect.emit({ node, flatNode });\r\n } else {\r\n this.nodeUnselect.emit({ node, flatNode });\r\n }\r\n } else if (mode === 'multi') {\r\n node.selected = !node.selected;\r\n if (node.selected) {\r\n this.nodeSelect.emit({ node, flatNode });\r\n } else {\r\n this.nodeUnselect.emit({ node, flatNode });\r\n }\r\n }\r\n\r\n this._refreshCounter.update((c) => c + 1);\r\n }\r\n\r\n onCheckboxChange(flatNode: FuiFlatTreeNode<T>): void {\r\n const node = flatNode.origin;\r\n if (flatNode.disabled) return;\r\n\r\n node.selected = !node.selected;\r\n\r\n // Propagate to children\r\n if (node.children != null) {\r\n this._setSelectedRecursive(node.children, node.selected);\r\n }\r\n\r\n if (node.selected) {\r\n this.nodeSelect.emit({ node, flatNode });\r\n } else {\r\n this.nodeUnselect.emit({ node, flatNode });\r\n }\r\n\r\n this._refreshCounter.update((c) => c + 1);\r\n }\r\n\r\n // --- Keyboard navigation ---\r\n\r\n _onKeydown(event: KeyboardEvent): void {\r\n const visibleNodes = this.flatNodes().filter((n) => n.visible);\r\n if (visibleNodes.length === 0) return;\r\n\r\n const currentIndex = this.focusedIndex();\r\n const currentNode = visibleNodes.find((n) => n._flatIndex === currentIndex);\r\n\r\n switch (event.key) {\r\n case 'ArrowDown': {\r\n event.preventDefault();\r\n const currentVisIdx = visibleNodes.findIndex((n) => n._flatIndex === currentIndex);\r\n if (currentVisIdx < visibleNodes.length - 1) {\r\n this.focusedIndex.set(visibleNodes[currentVisIdx + 1]._flatIndex);\r\n }\r\n break;\r\n }\r\n\r\n case 'ArrowUp': {\r\n event.preventDefault();\r\n const currentVisIdx = visibleNodes.findIndex((n) => n._flatIndex === currentIndex);\r\n if (currentVisIdx > 0) {\r\n this.focusedIndex.set(visibleNodes[currentVisIdx - 1]._flatIndex);\r\n }\r\n break;\r\n }\r\n\r\n case 'ArrowRight': {\r\n event.preventDefault();\r\n if (currentNode?.expandable) {\r\n if (!currentNode.expanded) {\r\n this.onNodeToggle(currentNode);\r\n } else {\r\n // Move to first child\r\n const currentVisIdx = visibleNodes.findIndex((n) => n._flatIndex === currentIndex);\r\n if (currentVisIdx < visibleNodes.length - 1) {\r\n this.focusedIndex.set(visibleNodes[currentVisIdx + 1]._flatIndex);\r\n }\r\n }\r\n }\r\n break;\r\n }\r\n\r\n case 'ArrowLeft': {\r\n event.preventDefault();\r\n if (currentNode && currentNode.expanded && currentNode.expandable) {\r\n this.onNodeToggle(currentNode);\r\n } else if (currentNode && currentNode.level > 0) {\r\n // Move to parent - search backwards for closest node at parent level\r\n for (let i = visibleNodes.length - 1; i >= 0; i--) {\r\n if (visibleNodes[i]._flatIndex < currentIndex && visibleNodes[i].level === currentNode.level - 1) {\r\n this.focusedIndex.set(visibleNodes[i]._flatIndex);\r\n break;\r\n }\r\n }\r\n }\r\n break;\r\n }\r\n\r\n case 'Home': {\r\n event.preventDefault();\r\n if (visibleNodes.length > 0) {\r\n this.focusedIndex.set(visibleNodes[0]._flatIndex);\r\n }\r\n break;\r\n }\r\n\r\n case 'End': {\r\n event.preventDefault();\r\n if (visibleNodes.length > 0) {\r\n this.focusedIndex.set(visibleNodes[visibleNodes.length - 1]._flatIndex);\r\n }\r\n break;\r\n }\r\n\r\n case 'Enter':\r\n case ' ': {\r\n event.preventDefault();\r\n if (currentNode) {\r\n if (this.selectionMode() === 'checkbox') {\r\n this.onCheckboxChange(currentNode);\r\n } else {\r\n this.onNodeSelect(currentNode);\r\n }\r\n }\r\n break;\r\n }\r\n\r\n case '*': {\r\n event.preventDefault();\r\n // Expand all siblings at the same level\r\n if (currentNode) {\r\n for (const node of visibleNodes) {\r\n if (node.level === currentNode.level && node.expandable && !node.expanded) {\r\n node.origin.expanded = true;\r\n }\r\n }\r\n this._refreshCounter.update((c) => c + 1);\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n\r\n // --- Private helpers ---\r\n\r\n private _filterNodes(nodes: FuiTreeNode<T>[], filterStr: string): FuiTreeNode<T>[] {\r\n const lowerFilter = filterStr.toLowerCase();\r\n const result: FuiTreeNode<T>[] = [];\r\n\r\n for (const node of nodes) {\r\n const matches = this._nodeMatchesFilter(node, lowerFilter);\r\n const filteredChildren = node.children != null ? this._filterNodes(node.children, filterStr) : [];\r\n\r\n if (matches || filteredChildren.length > 0) {\r\n const cloned: FuiTreeNode<T> = {\r\n ...node,\r\n children: filteredChildren.length > 0 ? filteredChildren : node.children,\r\n expanded: filteredChildren.length > 0 ? true : node.expanded,\r\n };\r\n result.push(cloned);\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n private _nodeMatchesFilter(node: FuiTreeNode<T>, lowerFilter: string): boolean {\r\n const data = node.data as any;\r\n if (typeof data === 'string') {\r\n return data.toLowerCase().includes(lowerFilter);\r\n }\r\n if (data != null && typeof data === 'object') {\r\n if ('name' in data && typeof data.name === 'string') {\r\n return data.name.toLowerCase().includes(lowerFilter);\r\n }\r\n if ('label' in data && typeof data.label === 'string') {\r\n return data.label.toLowerCase().includes(lowerFilter);\r\n }\r\n }\r\n return String(data).toLowerCase().includes(lowerFilter);\r\n }\r\n\r\n private _setExpandedRecursive(nodes: FuiTreeNode<T>[], expanded: boolean): void {\r\n for (const node of nodes) {\r\n node.expanded = expanded;\r\n if (node.children != null) {\r\n this._setExpandedRecursive(node.children, expanded);\r\n }\r\n }\r\n }\r\n\r\n private _clearSelectionRecursive(nodes: FuiTreeNode<T>[]): void {\r\n for (const node of nodes) {\r\n node.selected = false;\r\n if (node.children != null) {\r\n this._clearSelectionRecursive(node.children);\r\n }\r\n }\r\n }\r\n\r\n private _setSelectedRecursive(nodes: FuiTreeNode<T>[], selected: boolean): void {\r\n for (const node of nodes) {\r\n node.selected = selected;\r\n if (node.children != null) {\r\n this._setSelectedRecursive(node.children, selected);\r\n }\r\n }\r\n }\r\n\r\n private _collectSelectedRecursive(nodes: FuiTreeNode<T>[], result: FuiTreeNode<T>[]): void {\r\n for (const node of nodes) {\r\n if (node.selected) {\r\n result.push(node);\r\n }\r\n if (node.children != null) {\r\n this._collectSelectedRecursive(node.children, result);\r\n }\r\n }\r\n }\r\n}\r\n","@if (!virtualScroll()) {\r\n @for (flatNode of flatNodes(); track flatNode._flatIndex) {\r\n <fui-tree-node\r\n [flatNode]=\"flatNode\"\r\n [selectionMode]=\"selectionMode()\"\r\n [nodeTemplate]=\"nodeTemplate()\"\r\n [checkboxState]=\"checkboxStates().get(flatNode.origin) ?? 'unchecked'\"\r\n [focused]=\"focusedIndex() === flatNode._flatIndex\"\r\n (toggle)=\"onNodeToggle(flatNode)\"\r\n (select)=\"onNodeSelect(flatNode)\"\r\n (checkboxChange)=\"onCheckboxChange(flatNode)\"\r\n >\r\n </fui-tree-node>\r\n }\r\n}\r\n\r\n@if (virtualScroll()) {\r\n <fui-virtual-scroll-viewport [itemSize]=\"virtualItemSize()\" style=\"height: 100%\">\r\n <fui-tree-node\r\n *fuiVirtualFor=\"let flatNode of flatNodes()\"\r\n [flatNode]=\"flatNode\"\r\n [selectionMode]=\"selectionMode()\"\r\n [nodeTemplate]=\"nodeTemplate()\"\r\n [checkboxState]=\"checkboxStates().get(flatNode.origin) ?? 'unchecked'\"\r\n [focused]=\"focusedIndex() === flatNode._flatIndex\"\r\n (toggle)=\"onNodeToggle(flatNode)\"\r\n (select)=\"onNodeSelect(flatNode)\"\r\n (checkboxChange)=\"onCheckboxChange(flatNode)\"\r\n >\r\n </fui-tree-node>\r\n </fui-virtual-scroll-viewport>\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"raintonic-formaui-components-tree.mjs","sources":["../../../lib/components/tree/tree.intl.ts","../../../lib/components/tree/fui-tree-node.component.ts","../../../lib/components/tree/fui-tree-node.component.html","../../../lib/components/tree/tree-flattener.ts","../../../lib/components/tree/fui-tree.component.ts","../../../lib/components/tree/fui-tree.component.html","../../../lib/components/tree/raintonic-formaui-components-tree.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\r\nimport { FuiIntlBase } from '@raintonic/formaui/core';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class FuiTreeIntl extends FuiIntlBase {\r\n collapseAriaLabel = 'Collapse';\r\n expandAriaLabel = 'Expand';\r\n}\r\n","import {\r\n Component,\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n ViewEncapsulation,\r\n inject,\r\n input,\r\n output,\r\n TemplateRef,\r\n} from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { NgTemplateOutlet } from '@angular/common';\r\nimport { FuiIconComponent } from '@raintonic/formaui/components/icon';\r\nimport { FuiCheckboxComponent } from '@raintonic/formaui/components/checkbox';\r\nimport { FuiFlatTreeNode, FuiTreeSelectionMode } from './tree.types';\r\nimport { FuiTreeIntl } from './tree.intl';\r\n\r\n@Component({\r\n selector: 'fui-tree-node',\r\n standalone: true,\r\n imports: [NgTemplateOutlet, FuiIconComponent, FuiCheckboxComponent],\r\n templateUrl: './fui-tree-node.component.html',\r\n styleUrl: './fui-tree-node.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n host: {\r\n class: 'fui-tree-node',\r\n role: 'treeitem',\r\n '[attr.aria-level]': 'flatNode().level + 1',\r\n '[attr.aria-expanded]': 'flatNode().expandable ? flatNode().expanded : null',\r\n '[attr.aria-selected]': 'flatNode().selected',\r\n '[class.fui-tree-node--focused]': 'focused()',\r\n '[class.fui-tree-node--selected]': 'flatNode().selected',\r\n '[class.fui-tree-node--disabled]': 'flatNode().disabled',\r\n '[style.padding-left.px]': 'flatNode().level * indentPx',\r\n },\r\n})\r\nexport class FuiTreeNodeComponent {\r\n readonly intl = inject(FuiTreeIntl);\r\n private readonly _cdr = inject(ChangeDetectorRef);\r\n\r\n constructor() {\r\n this.intl.changes.pipe(takeUntilDestroyed()).subscribe(() => { this._cdr.markForCheck(); });\r\n }\r\n\r\n readonly flatNode = input.required<FuiFlatTreeNode>();\r\n readonly selectionMode = input<FuiTreeSelectionMode>('none');\r\n readonly nodeTemplate = input<TemplateRef<any> | null>(null);\r\n readonly checkboxState = input<'checked' | 'unchecked' | 'indeterminate'>('unchecked');\r\n readonly focused = input(false);\r\n\r\n readonly toggle = output();\r\n readonly select = output();\r\n readonly checkboxChange = output();\r\n\r\n readonly indentPx = 24;\r\n}\r\n","<div class=\"fui-tree-node__content\">\r\n <!-- Expand/collapse toggle -->\r\n <button\r\n class=\"fui-tree-node__toggle\"\r\n [class.fui-tree-node__toggle--hidden]=\"!flatNode().expandable\"\r\n (click)=\"toggle.emit(); $event.stopPropagation()\"\r\n [attr.aria-label]=\"flatNode().expanded ? intl.collapseAriaLabel : intl.expandAriaLabel\"\r\n tabindex=\"-1\"\r\n type=\"button\"\r\n >\r\n @if (flatNode().loading) {\r\n <fui-icon name=\"spinner\" [spin]=\"true\" size=\"sm\"></fui-icon>\r\n } @else {\r\n <fui-icon [name]=\"flatNode().expanded ? 'caret-down' : 'caret-right'\" size=\"sm\"></fui-icon>\r\n }\r\n </button>\r\n\r\n <!-- Checkbox (only in checkbox mode) -->\r\n @if (selectionMode() === 'checkbox') {\r\n <fui-checkbox\r\n [checked]=\"checkboxState() === 'checked'\"\r\n [indeterminate]=\"checkboxState() === 'indeterminate'\"\r\n [disabled]=\"flatNode().disabled\"\r\n (change)=\"checkboxChange.emit()\"\r\n >\r\n </fui-checkbox>\r\n }\r\n\r\n <!-- Node content -->\r\n <div class=\"fui-tree-node__label\" (click)=\"select.emit()\" (dblclick)=\"toggle.emit()\">\r\n @if (nodeTemplate()) {\r\n <ng-container *ngTemplateOutlet=\"nodeTemplate()!; context: { $implicit: flatNode().origin, node: flatNode() }\">\r\n </ng-container>\r\n } @else {\r\n {{ flatNode().origin.data }}\r\n }\r\n </div>\r\n</div>\r\n","import { FuiFlatTreeNode, FuiTreeNode } from './tree.types';\r\n\r\nexport class FuiTreeFlattener<T = any> {\r\n flatten(nodes: FuiTreeNode<T>[], hasLoadChildren = false): FuiFlatTreeNode<T>[] {\r\n const result: FuiFlatTreeNode<T>[] = [];\r\n let flatIndex = 0;\r\n\r\n const recurse = (nodeList: FuiTreeNode<T>[], level: number, parentVisible: boolean): void => {\r\n for (const node of nodeList) {\r\n const visible = parentVisible;\r\n const hasChildren = node.children != null && node.children.length > 0;\r\n const expandable = !node.leaf && (hasChildren || (hasLoadChildren && node.children == null));\r\n\r\n result.push({\r\n origin: node,\r\n level,\r\n expandable,\r\n expanded: node.expanded ?? false,\r\n selected: node.selected ?? false,\r\n disabled: node.disabled ?? false,\r\n visible,\r\n loading: false,\r\n _flatIndex: flatIndex++,\r\n });\r\n\r\n if (node.expanded && node.children != null) {\r\n recurse(node.children, level + 1, visible);\r\n }\r\n }\r\n };\r\n\r\n recurse(nodes, 0, true);\r\n return result;\r\n }\r\n\r\n calculateCheckboxStates(nodes: FuiTreeNode<T>[]): Map<FuiTreeNode<T>, 'checked' | 'unchecked' | 'indeterminate'> {\r\n const states = new Map<FuiTreeNode<T>, 'checked' | 'unchecked' | 'indeterminate'>();\r\n\r\n const recurse = (nodeList: FuiTreeNode<T>[]): { total: number; checked: number } => {\r\n let total = 0;\r\n let checked = 0;\r\n\r\n for (const node of nodeList) {\r\n if (node.children != null && node.children.length > 0) {\r\n const childResult = recurse(node.children);\r\n total += childResult.total;\r\n checked += childResult.checked;\r\n\r\n if (childResult.checked === 0) {\r\n states.set(node, node.selected ? 'checked' : 'unchecked');\r\n } else if (childResult.checked === childResult.total) {\r\n states.set(node, 'checked');\r\n } else {\r\n states.set(node, 'indeterminate');\r\n }\r\n } else {\r\n total++;\r\n if (node.selected) checked++;\r\n states.set(node, node.selected ? 'checked' : 'unchecked');\r\n }\r\n }\r\n\r\n return { total, checked };\r\n };\r\n\r\n recurse(nodes);\r\n return states;\r\n }\r\n}\r\n","import {\r\n Component,\r\n ChangeDetectionStrategy,\r\n ViewEncapsulation,\r\n input,\r\n output,\r\n signal,\r\n computed,\r\n OnDestroy,\r\n TemplateRef,\r\n} from '@angular/core';\r\nimport { Observable, Subscription, take } from 'rxjs';\r\nimport { FuiTreeNodeComponent } from './fui-tree-node.component';\r\nimport { FuiVirtualScrollViewportComponent, FuiVirtualForDirective } from '@raintonic/formaui/cdk/virtual-scroll';\r\nimport { FuiTreeFlattener } from './tree-flattener';\r\nimport {\r\n FuiTreeNode,\r\n FuiFlatTreeNode,\r\n FuiTreeSelectionMode,\r\n FuiTreeNodeEvent,\r\n FuiTreeDragDropEvent,\r\n} from './tree.types';\r\n\r\n@Component({\r\n selector: 'fui-tree',\r\n standalone: true,\r\n imports: [FuiTreeNodeComponent, FuiVirtualScrollViewportComponent, FuiVirtualForDirective],\r\n templateUrl: './fui-tree.component.html',\r\n styleUrl: './fui-tree.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n host: {\r\n class: 'fui-tree',\r\n role: 'tree',\r\n '[attr.tabindex]': '0',\r\n '(keydown)': '_onKeydown($event)',\r\n },\r\n})\r\nexport class FuiTreeComponent<T = any> implements OnDestroy {\r\n readonly nodes = input.required<FuiTreeNode<T>[]>();\r\n readonly selectionMode = input<FuiTreeSelectionMode>('none');\r\n readonly loadChildren = input<((node: FuiTreeNode<T>) => Observable<FuiTreeNode<T>[]>) | null>(null);\r\n readonly nodeTemplate = input<TemplateRef<any> | null>(null);\r\n readonly draggable = input(false);\r\n readonly virtualScroll = input(false);\r\n readonly virtualItemSize = input(32);\r\n readonly filter = input('');\r\n\r\n readonly nodeSelect = output<FuiTreeNodeEvent<T>>();\r\n readonly nodeUnselect = output<FuiTreeNodeEvent<T>>();\r\n readonly nodeExpand = output<FuiTreeNodeEvent<T>>();\r\n readonly nodeCollapse = output<FuiTreeNodeEvent<T>>();\r\n readonly nodeDrop = output<FuiTreeDragDropEvent<T>>();\r\n readonly filterChange = output<string>();\r\n\r\n private readonly _flattener = new FuiTreeFlattener<T>();\r\n private readonly _subscriptions: Subscription[] = [];\r\n\r\n /** Refresh counter to trigger re-flatten after mutations */\r\n private readonly _refreshCounter = signal(0);\r\n\r\n readonly flatNodes = computed(() => {\r\n this._refreshCounter();\r\n const nodes = this.nodes();\r\n const filterStr = this.filter();\r\n let processedNodes = nodes;\r\n if (filterStr) {\r\n processedNodes = this._filterNodes(nodes, filterStr);\r\n }\r\n return this._flattener.flatten(processedNodes, this.loadChildren() != null);\r\n });\r\n\r\n readonly checkboxStates = computed(() => {\r\n this._refreshCounter();\r\n if (this.selectionMode() !== 'checkbox') {\r\n return new Map<FuiTreeNode<T>, 'checked' | 'unchecked' | 'indeterminate'>();\r\n }\r\n return this._flattener.calculateCheckboxStates(this.nodes());\r\n });\r\n\r\n readonly focusedIndex = signal(0);\r\n\r\n ngOnDestroy(): void {\r\n for (const sub of this._subscriptions) {\r\n sub.unsubscribe();\r\n }\r\n }\r\n\r\n // --- Public API ---\r\n\r\n expandAll(): void {\r\n this._setExpandedRecursive(this.nodes(), true);\r\n this._refreshCounter.update((c) => c + 1);\r\n }\r\n\r\n collapseAll(): void {\r\n this._setExpandedRecursive(this.nodes(), false);\r\n this._refreshCounter.update((c) => c + 1);\r\n }\r\n\r\n selectNode(node: FuiTreeNode<T>): void {\r\n const mode = this.selectionMode();\r\n if (mode === 'none') return;\r\n\r\n if (mode === 'single') {\r\n this._clearSelectionRecursive(this.nodes());\r\n node.selected = true;\r\n } else if (mode === 'multi' || mode === 'checkbox') {\r\n node.selected = true;\r\n }\r\n this._refreshCounter.update((c) => c + 1);\r\n }\r\n\r\n getSelectedNodes(): FuiTreeNode<T>[] {\r\n const selected: FuiTreeNode<T>[] = [];\r\n this._collectSelectedRecursive(this.nodes(), selected);\r\n return selected;\r\n }\r\n\r\n // --- Event handlers ---\r\n\r\n onNodeToggle(flatNode: FuiFlatTreeNode<T>): void {\r\n const node = flatNode.origin;\r\n\r\n if (flatNode.expanded) {\r\n node.expanded = false;\r\n this.nodeCollapse.emit({ node, flatNode });\r\n } else {\r\n const loadChildrenFn = this.loadChildren();\r\n if (loadChildrenFn && node.children == null) {\r\n // Lazy load children\r\n this._refreshCounter.update((c) => c + 1);\r\n\r\n const sub = loadChildrenFn(node)\r\n .pipe(take(1))\r\n .subscribe({\r\n next: (children) => {\r\n node.children = children;\r\n node.expanded = true;\r\n this._refreshCounter.update((c) => c + 1);\r\n this.nodeExpand.emit({ node, flatNode });\r\n },\r\n error: () => {\r\n this._refreshCounter.update((c) => c + 1);\r\n },\r\n });\r\n this._subscriptions.push(sub);\r\n return;\r\n } else {\r\n node.expanded = true;\r\n this.nodeExpand.emit({ node, flatNode });\r\n }\r\n }\r\n this._refreshCounter.update((c) => c + 1);\r\n }\r\n\r\n onNodeSelect(flatNode: FuiFlatTreeNode<T>): void {\r\n const node = flatNode.origin;\r\n const mode = this.selectionMode();\r\n\r\n if (mode === 'none' || flatNode.disabled) return;\r\n\r\n if (mode === 'single') {\r\n const wasSelected = node.selected;\r\n this._clearSelectionRecursive(this.nodes());\r\n if (!wasSelected) {\r\n node.selected = true;\r\n this.nodeSelect.emit({ node, flatNode });\r\n } else {\r\n this.nodeUnselect.emit({ node, flatNode });\r\n }\r\n } else if (mode === 'multi') {\r\n node.selected = !node.selected;\r\n if (node.selected) {\r\n this.nodeSelect.emit({ node, flatNode });\r\n } else {\r\n this.nodeUnselect.emit({ node, flatNode });\r\n }\r\n }\r\n\r\n this._refreshCounter.update((c) => c + 1);\r\n }\r\n\r\n onCheckboxChange(flatNode: FuiFlatTreeNode<T>): void {\r\n const node = flatNode.origin;\r\n if (flatNode.disabled) return;\r\n\r\n node.selected = !node.selected;\r\n\r\n // Propagate to children\r\n if (node.children != null) {\r\n this._setSelectedRecursive(node.children, node.selected);\r\n }\r\n\r\n if (node.selected) {\r\n this.nodeSelect.emit({ node, flatNode });\r\n } else {\r\n this.nodeUnselect.emit({ node, flatNode });\r\n }\r\n\r\n this._refreshCounter.update((c) => c + 1);\r\n }\r\n\r\n // --- Keyboard navigation ---\r\n\r\n _onKeydown(event: KeyboardEvent): void {\r\n const visibleNodes = this.flatNodes().filter((n) => n.visible);\r\n if (visibleNodes.length === 0) return;\r\n\r\n const currentIndex = this.focusedIndex();\r\n const currentNode = visibleNodes.find((n) => n._flatIndex === currentIndex);\r\n\r\n switch (event.key) {\r\n case 'ArrowDown': {\r\n event.preventDefault();\r\n const currentVisIdx = visibleNodes.findIndex((n) => n._flatIndex === currentIndex);\r\n if (currentVisIdx < visibleNodes.length - 1) {\r\n this.focusedIndex.set(visibleNodes[currentVisIdx + 1]._flatIndex);\r\n }\r\n break;\r\n }\r\n\r\n case 'ArrowUp': {\r\n event.preventDefault();\r\n const currentVisIdx = visibleNodes.findIndex((n) => n._flatIndex === currentIndex);\r\n if (currentVisIdx > 0) {\r\n this.focusedIndex.set(visibleNodes[currentVisIdx - 1]._flatIndex);\r\n }\r\n break;\r\n }\r\n\r\n case 'ArrowRight': {\r\n event.preventDefault();\r\n if (currentNode?.expandable) {\r\n if (!currentNode.expanded) {\r\n this.onNodeToggle(currentNode);\r\n } else {\r\n // Move to first child\r\n const currentVisIdx = visibleNodes.findIndex((n) => n._flatIndex === currentIndex);\r\n if (currentVisIdx < visibleNodes.length - 1) {\r\n this.focusedIndex.set(visibleNodes[currentVisIdx + 1]._flatIndex);\r\n }\r\n }\r\n }\r\n break;\r\n }\r\n\r\n case 'ArrowLeft': {\r\n event.preventDefault();\r\n if (currentNode && currentNode.expanded && currentNode.expandable) {\r\n this.onNodeToggle(currentNode);\r\n } else if (currentNode && currentNode.level > 0) {\r\n // Move to parent - search backwards for closest node at parent level\r\n for (let i = visibleNodes.length - 1; i >= 0; i--) {\r\n if (visibleNodes[i]._flatIndex < currentIndex && visibleNodes[i].level === currentNode.level - 1) {\r\n this.focusedIndex.set(visibleNodes[i]._flatIndex);\r\n break;\r\n }\r\n }\r\n }\r\n break;\r\n }\r\n\r\n case 'Home': {\r\n event.preventDefault();\r\n if (visibleNodes.length > 0) {\r\n this.focusedIndex.set(visibleNodes[0]._flatIndex);\r\n }\r\n break;\r\n }\r\n\r\n case 'End': {\r\n event.preventDefault();\r\n if (visibleNodes.length > 0) {\r\n this.focusedIndex.set(visibleNodes[visibleNodes.length - 1]._flatIndex);\r\n }\r\n break;\r\n }\r\n\r\n case 'Enter':\r\n case ' ': {\r\n event.preventDefault();\r\n if (currentNode) {\r\n if (this.selectionMode() === 'checkbox') {\r\n this.onCheckboxChange(currentNode);\r\n } else {\r\n this.onNodeSelect(currentNode);\r\n }\r\n }\r\n break;\r\n }\r\n\r\n case '*': {\r\n event.preventDefault();\r\n // Expand all siblings at the same level\r\n if (currentNode) {\r\n for (const node of visibleNodes) {\r\n if (node.level === currentNode.level && node.expandable && !node.expanded) {\r\n node.origin.expanded = true;\r\n }\r\n }\r\n this._refreshCounter.update((c) => c + 1);\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n\r\n // --- Private helpers ---\r\n\r\n private _filterNodes(nodes: FuiTreeNode<T>[], filterStr: string): FuiTreeNode<T>[] {\r\n const lowerFilter = filterStr.toLowerCase();\r\n const result: FuiTreeNode<T>[] = [];\r\n\r\n for (const node of nodes) {\r\n const matches = this._nodeMatchesFilter(node, lowerFilter);\r\n const filteredChildren = node.children != null ? this._filterNodes(node.children, filterStr) : [];\r\n\r\n if (matches || filteredChildren.length > 0) {\r\n const cloned: FuiTreeNode<T> = {\r\n ...node,\r\n children: filteredChildren.length > 0 ? filteredChildren : node.children,\r\n expanded: filteredChildren.length > 0 ? true : node.expanded,\r\n };\r\n result.push(cloned);\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n private _nodeMatchesFilter(node: FuiTreeNode<T>, lowerFilter: string): boolean {\r\n const data = node.data as any;\r\n if (typeof data === 'string') {\r\n return data.toLowerCase().includes(lowerFilter);\r\n }\r\n if (data != null && typeof data === 'object') {\r\n if ('name' in data && typeof data.name === 'string') {\r\n return data.name.toLowerCase().includes(lowerFilter);\r\n }\r\n if ('label' in data && typeof data.label === 'string') {\r\n return data.label.toLowerCase().includes(lowerFilter);\r\n }\r\n }\r\n return String(data).toLowerCase().includes(lowerFilter);\r\n }\r\n\r\n private _setExpandedRecursive(nodes: FuiTreeNode<T>[], expanded: boolean): void {\r\n for (const node of nodes) {\r\n node.expanded = expanded;\r\n if (node.children != null) {\r\n this._setExpandedRecursive(node.children, expanded);\r\n }\r\n }\r\n }\r\n\r\n private _clearSelectionRecursive(nodes: FuiTreeNode<T>[]): void {\r\n for (const node of nodes) {\r\n node.selected = false;\r\n if (node.children != null) {\r\n this._clearSelectionRecursive(node.children);\r\n }\r\n }\r\n }\r\n\r\n private _setSelectedRecursive(nodes: FuiTreeNode<T>[], selected: boolean): void {\r\n for (const node of nodes) {\r\n node.selected = selected;\r\n if (node.children != null) {\r\n this._setSelectedRecursive(node.children, selected);\r\n }\r\n }\r\n }\r\n\r\n private _collectSelectedRecursive(nodes: FuiTreeNode<T>[], result: FuiTreeNode<T>[]): void {\r\n for (const node of nodes) {\r\n if (node.selected) {\r\n result.push(node);\r\n }\r\n if (node.children != null) {\r\n this._collectSelectedRecursive(node.children, result);\r\n }\r\n }\r\n }\r\n}\r\n","@if (!virtualScroll()) {\r\n @for (flatNode of flatNodes(); track flatNode._flatIndex) {\r\n <fui-tree-node\r\n [flatNode]=\"flatNode\"\r\n [selectionMode]=\"selectionMode()\"\r\n [nodeTemplate]=\"nodeTemplate()\"\r\n [checkboxState]=\"checkboxStates().get(flatNode.origin) ?? 'unchecked'\"\r\n [focused]=\"focusedIndex() === flatNode._flatIndex\"\r\n (toggle)=\"onNodeToggle(flatNode)\"\r\n (select)=\"onNodeSelect(flatNode)\"\r\n (checkboxChange)=\"onCheckboxChange(flatNode)\"\r\n >\r\n </fui-tree-node>\r\n }\r\n}\r\n\r\n@if (virtualScroll()) {\r\n <fui-virtual-scroll-viewport [itemSize]=\"virtualItemSize()\" style=\"height: 100%\">\r\n <fui-tree-node\r\n *fuiVirtualFor=\"let flatNode of flatNodes()\"\r\n [flatNode]=\"flatNode\"\r\n [selectionMode]=\"selectionMode()\"\r\n [nodeTemplate]=\"nodeTemplate()\"\r\n [checkboxState]=\"checkboxStates().get(flatNode.origin) ?? 'unchecked'\"\r\n [focused]=\"focusedIndex() === flatNode._flatIndex\"\r\n (toggle)=\"onNodeToggle(flatNode)\"\r\n (select)=\"onNodeSelect(flatNode)\"\r\n (checkboxChange)=\"onCheckboxChange(flatNode)\"\r\n >\r\n </fui-tree-node>\r\n </fui-virtual-scroll-viewport>\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -54,9 +54,33 @@ function mixinErrorState(base) {
|
|
|
54
54
|
};
|
|
55
55
|
}
|
|
56
56
|
|
|
57
|
+
/**
|
|
58
|
+
* Base class for every FormaUI component Intl service.
|
|
59
|
+
* Exposes a `changes` Subject so consumers that mutate strings at runtime
|
|
60
|
+
* can trigger a re-render in all components that subscribe.
|
|
61
|
+
*
|
|
62
|
+
* Consumers extend and override properties, OR provide a replacement class via DI.
|
|
63
|
+
*/
|
|
64
|
+
class FuiIntlBase {
|
|
65
|
+
/** Emits whenever the labels change. Components subscribe and mark for check. */
|
|
66
|
+
changes = new Subject();
|
|
67
|
+
/** Call after mutating properties to notify subscribers. */
|
|
68
|
+
notifyChanges() {
|
|
69
|
+
this.changes.next();
|
|
70
|
+
}
|
|
71
|
+
ngOnDestroy() {
|
|
72
|
+
this.changes.complete();
|
|
73
|
+
}
|
|
74
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: FuiIntlBase, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
75
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: FuiIntlBase });
|
|
76
|
+
}
|
|
77
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: FuiIntlBase, decorators: [{
|
|
78
|
+
type: Injectable
|
|
79
|
+
}] });
|
|
80
|
+
|
|
57
81
|
/**
|
|
58
82
|
* Generated bundle index. Do not edit.
|
|
59
83
|
*/
|
|
60
84
|
|
|
61
|
-
export { DefaultErrorStateMatcher, FUI_FORM_FIELD_CONTROL, mixinErrorState };
|
|
85
|
+
export { DefaultErrorStateMatcher, FUI_FORM_FIELD_CONTROL, FuiIntlBase, mixinErrorState };
|
|
62
86
|
//# sourceMappingURL=raintonic-formaui-core.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"raintonic-formaui-core.mjs","sources":["../../../lib/core/form-field-control.ts","../../../lib/core/error-state.ts","../../../lib/core/raintonic-formaui-core.ts"],"sourcesContent":["import { Observable } from 'rxjs';\r\nimport { NgControl } from '@angular/forms';\r\nimport { InjectionToken, Signal } from '@angular/core';\r\n\r\n/**\r\n * Interface for form field controls following Angular Material patterns\r\n * This interface should be implemented by any component that can be used inside fui-form-field\r\n */\r\nexport interface FuiFormFieldControl<T = unknown> {\r\n /**\r\n * Stream that emits whenever the state of the control changes\r\n */\r\n readonly stateChanges: Observable<void>;\r\n\r\n /**\r\n * The value of the control\r\n */\r\n readonly value: Signal<T | null>;\r\n\r\n /**\r\n * The placeholder for this control\r\n */\r\n readonly placeholder: Signal<string>;\r\n\r\n /**\r\n * The NgControl for this control (non-reactive)\r\n */\r\n readonly ngControl: NgControl | null;\r\n\r\n /**\r\n * Whether the control is focused\r\n */\r\n readonly focused: Signal<boolean>;\r\n\r\n /**\r\n * Whether the control is empty\r\n */\r\n readonly empty: Signal<boolean>;\r\n\r\n /**\r\n * Whether the control is required\r\n */\r\n readonly required: Signal<boolean>;\r\n\r\n /**\r\n * Whether the control is disabled\r\n */\r\n readonly disabled: Signal<boolean>;\r\n\r\n /**\r\n * Whether the control is in an error state\r\n */\r\n readonly errorState: Signal<boolean>;\r\n\r\n /**\r\n * The aria-describedby attribute on the control\r\n */\r\n readonly controlType?: string;\r\n\r\n /**\r\n * The element ID for the control\r\n */\r\n readonly id: string;\r\n\r\n /**\r\n * Handles a click on the control's container\r\n */\r\n onContainerClick(event: MouseEvent): void;\r\n\r\n /**\r\n * Sets the list of element IDs that describe the control\r\n */\r\n setDescribedByIds(ids: string[]): void;\r\n\r\n /**\r\n * Sets the read-only state of the control (propagated from form-field)\r\n */\r\n setReadOnly?(readOnly: boolean): void;\r\n}\r\n\r\n/**\r\n * Injection token used to provide the form field control to the form field\r\n */\r\nexport const FUI_FORM_FIELD_CONTROL = new InjectionToken<FuiFormFieldControl>('FuiFormFieldControl');\r\n","import { Injectable } from '@angular/core';\r\nimport { FormControl, FormGroupDirective, NgControl, NgForm } from '@angular/forms';\r\nimport { Subject } from 'rxjs';\r\n\r\n/**\r\n * Error state matcher that follows Angular Material patterns\r\n * Determines when to show error messages\r\n */\r\nexport interface ErrorStateMatcher {\r\n isErrorState(control: FormControl | null, form: FormGroupDirective | NgForm | null): boolean;\r\n}\r\n\r\n/**\r\n * Default error state matcher implementation\r\n * Shows errors when control is invalid and either touched or form is submitted\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class DefaultErrorStateMatcher implements ErrorStateMatcher {\r\n isErrorState(control: FormControl | null, form: FormGroupDirective | NgForm | null): boolean {\r\n const isSubmitted = form?.submitted;\r\n return !!(control && control.invalid && (control.touched || isSubmitted));\r\n }\r\n}\r\n\r\n/**\r\n * Interface for components that can display error state\r\n */\r\nexport interface CanUpdateErrorState {\r\n readonly stateChanges: Subject<void>;\r\n errorState: boolean;\r\n errorStateMatcher: ErrorStateMatcher | null;\r\n updateErrorState(): void;\r\n}\r\n\r\n/**\r\n * Mixin to add error state handling to a component\r\n */\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Mixin pattern requires any[] for constructor spread\r\nexport type Constructor<T = object> = new (...args: any[]) => T;\r\n\r\nexport interface HasErrorState {\r\n _defaultErrorStateMatcher: ErrorStateMatcher;\r\n _parentForm: NgForm | FormGroupDirective | null;\r\n _parentFormGroup: FormGroupDirective | null;\r\n ngControl: NgControl | null;\r\n}\r\n\r\n/**\r\n * Mixin that adds error state handling\r\n */\r\nexport function mixinErrorState<T extends Constructor<HasErrorState>>(base: T): Constructor<CanUpdateErrorState> & T {\r\n return class extends base implements CanUpdateErrorState {\r\n errorState = false;\r\n isErrorState = false;\r\n errorStateMatcher: ErrorStateMatcher | null = null;\r\n readonly stateChanges = new Subject<void>();\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-useless-constructor, @typescript-eslint/no-explicit-any -- Mixin pattern requires any[] for constructor spread\r\n constructor(...args: any[]) {\r\n super(...args);\r\n }\r\n\r\n updateErrorState(): void {\r\n this._updateErrorState();\r\n }\r\n\r\n _updateErrorState(): void {\r\n const isOldState = this.isErrorState;\r\n const parent = this._parentFormGroup ?? this._parentForm;\r\n const matcher = this.errorStateMatcher ?? this._defaultErrorStateMatcher;\r\n const control = this.ngControl ? (this.ngControl.control as FormControl) : null;\r\n const isNewState = matcher.isErrorState(control, parent);\r\n\r\n if (isNewState !== isOldState) {\r\n this.isErrorState = isNewState;\r\n this.errorState = isNewState;\r\n this.stateChanges.next();\r\n }\r\n }\r\n };\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;AAgFA;;AAEG;MACU,sBAAsB,GAAG,IAAI,cAAc,CAAsB,qBAAqB;;ACvEnG;;;AAGG;MAEU,wBAAwB,CAAA;IACnC,YAAY,CAAC,OAA2B,EAAE,IAAwC,EAAA;AAChF,QAAA,MAAM,WAAW,GAAG,IAAI,EAAE,SAAS;AACnC,QAAA,OAAO,CAAC,EAAE,OAAO,IAAI,OAAO,CAAC,OAAO,KAAK,OAAO,CAAC,OAAO,IAAI,WAAW,CAAC,CAAC;IAC3E;uGAJW,wBAAwB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAxB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,wBAAwB,cADX,MAAM,EAAA,CAAA;;2FACnB,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBADpC,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;AA+BlC;;AAEG;AACG,SAAU,eAAe,CAAuC,IAAO,EAAA;IAC3E,OAAO,cAAc,IAAI,CAAA;QACvB,UAAU,GAAG,KAAK;QAClB,YAAY,GAAG,KAAK;QACpB,iBAAiB,GAA6B,IAAI;AACzC,QAAA,YAAY,GAAG,IAAI,OAAO,EAAQ;;AAG3C,QAAA,WAAA,CAAY,GAAG,IAAW,EAAA;AACxB,YAAA,KAAK,CAAC,GAAG,IAAI,CAAC;QAChB;QAEA,gBAAgB,GAAA;YACd,IAAI,CAAC,iBAAiB,EAAE;QAC1B;QAEA,iBAAiB,GAAA;AACf,YAAA,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY;YACpC,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB,IAAI,IAAI,CAAC,WAAW;YACxD,MAAM,OAAO,GAAG,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC,yBAAyB;AACxE,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,GAAI,IAAI,CAAC,SAAS,CAAC,OAAuB,GAAG,IAAI;YAC/E,MAAM,UAAU,GAAG,OAAO,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC;AAExD,YAAA,IAAI,UAAU,KAAK,UAAU,EAAE;AAC7B,gBAAA,IAAI,CAAC,YAAY,GAAG,UAAU;AAC9B,gBAAA,IAAI,CAAC,UAAU,GAAG,UAAU;AAC5B,gBAAA,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE;YAC1B;QACF;KACD;AACH;;
|
|
1
|
+
{"version":3,"file":"raintonic-formaui-core.mjs","sources":["../../../lib/core/form-field-control.ts","../../../lib/core/error-state.ts","../../../lib/core/intl/fui-intl-base.ts","../../../lib/core/raintonic-formaui-core.ts"],"sourcesContent":["import { Observable } from 'rxjs';\r\nimport { NgControl } from '@angular/forms';\r\nimport { InjectionToken, Signal } from '@angular/core';\r\n\r\n/**\r\n * Interface for form field controls following Angular Material patterns\r\n * This interface should be implemented by any component that can be used inside fui-form-field\r\n */\r\nexport interface FuiFormFieldControl<T = unknown> {\r\n /**\r\n * Stream that emits whenever the state of the control changes\r\n */\r\n readonly stateChanges: Observable<void>;\r\n\r\n /**\r\n * The value of the control\r\n */\r\n readonly value: Signal<T | null>;\r\n\r\n /**\r\n * The placeholder for this control\r\n */\r\n readonly placeholder: Signal<string>;\r\n\r\n /**\r\n * The NgControl for this control (non-reactive)\r\n */\r\n readonly ngControl: NgControl | null;\r\n\r\n /**\r\n * Whether the control is focused\r\n */\r\n readonly focused: Signal<boolean>;\r\n\r\n /**\r\n * Whether the control is empty\r\n */\r\n readonly empty: Signal<boolean>;\r\n\r\n /**\r\n * Whether the control is required\r\n */\r\n readonly required: Signal<boolean>;\r\n\r\n /**\r\n * Whether the control is disabled\r\n */\r\n readonly disabled: Signal<boolean>;\r\n\r\n /**\r\n * Whether the control is in an error state\r\n */\r\n readonly errorState: Signal<boolean>;\r\n\r\n /**\r\n * The aria-describedby attribute on the control\r\n */\r\n readonly controlType?: string;\r\n\r\n /**\r\n * The element ID for the control\r\n */\r\n readonly id: string;\r\n\r\n /**\r\n * Handles a click on the control's container\r\n */\r\n onContainerClick(event: MouseEvent): void;\r\n\r\n /**\r\n * Sets the list of element IDs that describe the control\r\n */\r\n setDescribedByIds(ids: string[]): void;\r\n\r\n /**\r\n * Sets the read-only state of the control (propagated from form-field)\r\n */\r\n setReadOnly?(readOnly: boolean): void;\r\n}\r\n\r\n/**\r\n * Injection token used to provide the form field control to the form field\r\n */\r\nexport const FUI_FORM_FIELD_CONTROL = new InjectionToken<FuiFormFieldControl>('FuiFormFieldControl');\r\n","import { Injectable } from '@angular/core';\r\nimport { FormControl, FormGroupDirective, NgControl, NgForm } from '@angular/forms';\r\nimport { Subject } from 'rxjs';\r\n\r\n/**\r\n * Error state matcher that follows Angular Material patterns\r\n * Determines when to show error messages\r\n */\r\nexport interface ErrorStateMatcher {\r\n isErrorState(control: FormControl | null, form: FormGroupDirective | NgForm | null): boolean;\r\n}\r\n\r\n/**\r\n * Default error state matcher implementation\r\n * Shows errors when control is invalid and either touched or form is submitted\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class DefaultErrorStateMatcher implements ErrorStateMatcher {\r\n isErrorState(control: FormControl | null, form: FormGroupDirective | NgForm | null): boolean {\r\n const isSubmitted = form?.submitted;\r\n return !!(control && control.invalid && (control.touched || isSubmitted));\r\n }\r\n}\r\n\r\n/**\r\n * Interface for components that can display error state\r\n */\r\nexport interface CanUpdateErrorState {\r\n readonly stateChanges: Subject<void>;\r\n errorState: boolean;\r\n errorStateMatcher: ErrorStateMatcher | null;\r\n updateErrorState(): void;\r\n}\r\n\r\n/**\r\n * Mixin to add error state handling to a component\r\n */\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Mixin pattern requires any[] for constructor spread\r\nexport type Constructor<T = object> = new (...args: any[]) => T;\r\n\r\nexport interface HasErrorState {\r\n _defaultErrorStateMatcher: ErrorStateMatcher;\r\n _parentForm: NgForm | FormGroupDirective | null;\r\n _parentFormGroup: FormGroupDirective | null;\r\n ngControl: NgControl | null;\r\n}\r\n\r\n/**\r\n * Mixin that adds error state handling\r\n */\r\nexport function mixinErrorState<T extends Constructor<HasErrorState>>(base: T): Constructor<CanUpdateErrorState> & T {\r\n return class extends base implements CanUpdateErrorState {\r\n errorState = false;\r\n isErrorState = false;\r\n errorStateMatcher: ErrorStateMatcher | null = null;\r\n readonly stateChanges = new Subject<void>();\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-useless-constructor, @typescript-eslint/no-explicit-any -- Mixin pattern requires any[] for constructor spread\r\n constructor(...args: any[]) {\r\n super(...args);\r\n }\r\n\r\n updateErrorState(): void {\r\n this._updateErrorState();\r\n }\r\n\r\n _updateErrorState(): void {\r\n const isOldState = this.isErrorState;\r\n const parent = this._parentFormGroup ?? this._parentForm;\r\n const matcher = this.errorStateMatcher ?? this._defaultErrorStateMatcher;\r\n const control = this.ngControl ? (this.ngControl.control as FormControl) : null;\r\n const isNewState = matcher.isErrorState(control, parent);\r\n\r\n if (isNewState !== isOldState) {\r\n this.isErrorState = isNewState;\r\n this.errorState = isNewState;\r\n this.stateChanges.next();\r\n }\r\n }\r\n };\r\n}\r\n","import { Injectable, OnDestroy } from '@angular/core';\r\nimport { Subject } from 'rxjs';\r\n\r\n/**\r\n * Base class for every FormaUI component Intl service.\r\n * Exposes a `changes` Subject so consumers that mutate strings at runtime\r\n * can trigger a re-render in all components that subscribe.\r\n *\r\n * Consumers extend and override properties, OR provide a replacement class via DI.\r\n */\r\n@Injectable()\r\nexport abstract class FuiIntlBase implements OnDestroy {\r\n /** Emits whenever the labels change. Components subscribe and mark for check. */\r\n readonly changes = new Subject<void>();\r\n\r\n /** Call after mutating properties to notify subscribers. */\r\n notifyChanges(): void {\r\n this.changes.next();\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.changes.complete();\r\n }\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;AAgFA;;AAEG;MACU,sBAAsB,GAAG,IAAI,cAAc,CAAsB,qBAAqB;;ACvEnG;;;AAGG;MAEU,wBAAwB,CAAA;IACnC,YAAY,CAAC,OAA2B,EAAE,IAAwC,EAAA;AAChF,QAAA,MAAM,WAAW,GAAG,IAAI,EAAE,SAAS;AACnC,QAAA,OAAO,CAAC,EAAE,OAAO,IAAI,OAAO,CAAC,OAAO,KAAK,OAAO,CAAC,OAAO,IAAI,WAAW,CAAC,CAAC;IAC3E;uGAJW,wBAAwB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAxB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,wBAAwB,cADX,MAAM,EAAA,CAAA;;2FACnB,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBADpC,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;AA+BlC;;AAEG;AACG,SAAU,eAAe,CAAuC,IAAO,EAAA;IAC3E,OAAO,cAAc,IAAI,CAAA;QACvB,UAAU,GAAG,KAAK;QAClB,YAAY,GAAG,KAAK;QACpB,iBAAiB,GAA6B,IAAI;AACzC,QAAA,YAAY,GAAG,IAAI,OAAO,EAAQ;;AAG3C,QAAA,WAAA,CAAY,GAAG,IAAW,EAAA;AACxB,YAAA,KAAK,CAAC,GAAG,IAAI,CAAC;QAChB;QAEA,gBAAgB,GAAA;YACd,IAAI,CAAC,iBAAiB,EAAE;QAC1B;QAEA,iBAAiB,GAAA;AACf,YAAA,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY;YACpC,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB,IAAI,IAAI,CAAC,WAAW;YACxD,MAAM,OAAO,GAAG,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC,yBAAyB;AACxE,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,GAAI,IAAI,CAAC,SAAS,CAAC,OAAuB,GAAG,IAAI;YAC/E,MAAM,UAAU,GAAG,OAAO,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC;AAExD,YAAA,IAAI,UAAU,KAAK,UAAU,EAAE;AAC7B,gBAAA,IAAI,CAAC,YAAY,GAAG,UAAU;AAC9B,gBAAA,IAAI,CAAC,UAAU,GAAG,UAAU;AAC5B,gBAAA,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE;YAC1B;QACF;KACD;AACH;;AC7EA;;;;;;AAMG;MAEmB,WAAW,CAAA;;AAEtB,IAAA,OAAO,GAAG,IAAI,OAAO,EAAQ;;IAGtC,aAAa,GAAA;AACX,QAAA,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;IACrB;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE;IACzB;uGAXoB,WAAW,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;2GAAX,WAAW,EAAA,CAAA;;2FAAX,WAAW,EAAA,UAAA,EAAA,CAAA;kBADhC;;;ACVD;;AAEG;;;;"}
|
|
@@ -470,7 +470,7 @@ class FuiConfirmDialogComponent {
|
|
|
470
470
|
confirmButtonVariant = computed(() => {
|
|
471
471
|
switch (this.variant) {
|
|
472
472
|
case 'danger':
|
|
473
|
-
return '
|
|
473
|
+
return 'destructive';
|
|
474
474
|
case 'warning':
|
|
475
475
|
return 'primary';
|
|
476
476
|
default:
|
|
@@ -484,11 +484,11 @@ class FuiConfirmDialogComponent {
|
|
|
484
484
|
this.dialogRef.close(false);
|
|
485
485
|
}
|
|
486
486
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: FuiConfirmDialogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
487
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.6", type: FuiConfirmDialogComponent, isStandalone: true, selector: "fui-confirm-dialog", host: { classAttribute: "fui-confirm-dialog" }, ngImport: i0, template: "<div class=\"fui-confirm-dialog__header\">\r\n <fui-icon class=\"fui-confirm-dialog__icon fui-confirm-dialog__icon--{{ variant }}\" [name]=\"icon()\" size=\"lg\" />\r\n <h2 class=\"fui-confirm-dialog__title\" id=\"confirm-dialog-title\">{{ title }}</h2>\r\n</div>\r\n\r\n<div class=\"fui-confirm-dialog__body\" id=\"confirm-dialog-description\">\r\n <p class=\"fui-confirm-dialog__message\">{{ message }}</p>\r\n</div>\r\n\r\n<div class=\"fui-confirm-dialog__actions\">\r\n <button fuiButton variant=\"
|
|
487
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.6", type: FuiConfirmDialogComponent, isStandalone: true, selector: "fui-confirm-dialog", host: { classAttribute: "fui-confirm-dialog" }, ngImport: i0, template: "<div class=\"fui-confirm-dialog__header\">\r\n <fui-icon class=\"fui-confirm-dialog__icon fui-confirm-dialog__icon--{{ variant }}\" [name]=\"icon()\" size=\"lg\" />\r\n <h2 class=\"fui-confirm-dialog__title\" id=\"confirm-dialog-title\">{{ title }}</h2>\r\n</div>\r\n\r\n<div class=\"fui-confirm-dialog__body\" id=\"confirm-dialog-description\">\r\n <p class=\"fui-confirm-dialog__message\">{{ message }}</p>\r\n</div>\r\n\r\n<div class=\"fui-confirm-dialog__actions\">\r\n <button fuiButton variant=\"tertiary\" (click)=\"onCancel()\">{{ cancelText }}</button>\r\n <button fuiButton [variant]=\"confirmButtonVariant()\" (click)=\"onConfirm()\">{{ confirmText }}</button>\r\n</div>\r\n", styles: [".fui-confirm-dialog{display:flex;flex-direction:column;padding:var(--fui-padding-24, 1.5rem)}.fui-confirm-dialog__header{display:flex;align-items:center;gap:var(--fui-gap-12, .75rem);margin-bottom:var(--fui-gap-16, 1rem)}.fui-confirm-dialog__icon{flex-shrink:0}.fui-confirm-dialog__icon--info{color:var(--fui-info)}.fui-confirm-dialog__icon--warning{color:var(--fui-warning)}.fui-confirm-dialog__icon--danger{color:var(--fui-danger)}.fui-confirm-dialog__title{font-family:var(--fui-font-family-sans);font-size:var(--fui-font-size-04);font-weight:var(--fui-font-weight-semibold, 600);color:var(--fui-text-primary);margin:0}.fui-confirm-dialog__body{margin-bottom:var(--fui-padding-24, 1.5rem)}.fui-confirm-dialog__message{font-size:var(--fui-font-size-02);color:var(--fui-text-secondary);line-height:1.5;margin:0}.fui-confirm-dialog__actions{display:flex;justify-content:flex-end;gap:var(--fui-gap-8, .5rem)}\n"], dependencies: [{ kind: "component", type: FuiIconComponent, selector: "fui-icon", inputs: ["name", "size", "weight", "color", "ariaLabel", "spin", "pulse"] }, { kind: "directive", type: FuiButtonDirective, selector: "button[fuiButton], a[fuiButton]", inputs: ["variant", "size", "disabled", "fullWidth", "loading", "iconOnly", "aria-label", "type"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
488
488
|
}
|
|
489
489
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: FuiConfirmDialogComponent, decorators: [{
|
|
490
490
|
type: Component,
|
|
491
|
-
args: [{ selector: 'fui-confirm-dialog', standalone: true, imports: [FuiIconComponent, FuiButtonDirective], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, host: { class: 'fui-confirm-dialog' }, template: "<div class=\"fui-confirm-dialog__header\">\r\n <fui-icon class=\"fui-confirm-dialog__icon fui-confirm-dialog__icon--{{ variant }}\" [name]=\"icon()\" size=\"lg\" />\r\n <h2 class=\"fui-confirm-dialog__title\" id=\"confirm-dialog-title\">{{ title }}</h2>\r\n</div>\r\n\r\n<div class=\"fui-confirm-dialog__body\" id=\"confirm-dialog-description\">\r\n <p class=\"fui-confirm-dialog__message\">{{ message }}</p>\r\n</div>\r\n\r\n<div class=\"fui-confirm-dialog__actions\">\r\n <button fuiButton variant=\"
|
|
491
|
+
args: [{ selector: 'fui-confirm-dialog', standalone: true, imports: [FuiIconComponent, FuiButtonDirective], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, host: { class: 'fui-confirm-dialog' }, template: "<div class=\"fui-confirm-dialog__header\">\r\n <fui-icon class=\"fui-confirm-dialog__icon fui-confirm-dialog__icon--{{ variant }}\" [name]=\"icon()\" size=\"lg\" />\r\n <h2 class=\"fui-confirm-dialog__title\" id=\"confirm-dialog-title\">{{ title }}</h2>\r\n</div>\r\n\r\n<div class=\"fui-confirm-dialog__body\" id=\"confirm-dialog-description\">\r\n <p class=\"fui-confirm-dialog__message\">{{ message }}</p>\r\n</div>\r\n\r\n<div class=\"fui-confirm-dialog__actions\">\r\n <button fuiButton variant=\"tertiary\" (click)=\"onCancel()\">{{ cancelText }}</button>\r\n <button fuiButton [variant]=\"confirmButtonVariant()\" (click)=\"onConfirm()\">{{ confirmText }}</button>\r\n</div>\r\n", styles: [".fui-confirm-dialog{display:flex;flex-direction:column;padding:var(--fui-padding-24, 1.5rem)}.fui-confirm-dialog__header{display:flex;align-items:center;gap:var(--fui-gap-12, .75rem);margin-bottom:var(--fui-gap-16, 1rem)}.fui-confirm-dialog__icon{flex-shrink:0}.fui-confirm-dialog__icon--info{color:var(--fui-info)}.fui-confirm-dialog__icon--warning{color:var(--fui-warning)}.fui-confirm-dialog__icon--danger{color:var(--fui-danger)}.fui-confirm-dialog__title{font-family:var(--fui-font-family-sans);font-size:var(--fui-font-size-04);font-weight:var(--fui-font-weight-semibold, 600);color:var(--fui-text-primary);margin:0}.fui-confirm-dialog__body{margin-bottom:var(--fui-padding-24, 1.5rem)}.fui-confirm-dialog__message{font-size:var(--fui-font-size-02);color:var(--fui-text-secondary);line-height:1.5;margin:0}.fui-confirm-dialog__actions{display:flex;justify-content:flex-end;gap:var(--fui-gap-8, .5rem)}\n"] }]
|
|
492
492
|
}] });
|
|
493
493
|
|
|
494
494
|
/**
|