@masterteam/components 0.0.164 → 0.0.166
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/assets/common.css +1 -1
- package/assets/i18n/ar.json +128 -0
- package/assets/i18n/en.json +128 -0
- package/fesm2022/masterteam-components-business-fields.mjs +40 -20
- package/fesm2022/masterteam-components-business-fields.mjs.map +1 -1
- package/fesm2022/masterteam-components-client-page.mjs +6 -4
- package/fesm2022/masterteam-components-client-page.mjs.map +1 -1
- package/fesm2022/masterteam-components-drawer.mjs +4 -2
- package/fesm2022/masterteam-components-drawer.mjs.map +1 -1
- package/fesm2022/masterteam-components-dynamic-drawer.mjs +9 -4
- package/fesm2022/masterteam-components-dynamic-drawer.mjs.map +1 -1
- package/fesm2022/masterteam-components-entities.mjs +19 -8
- package/fesm2022/masterteam-components-entities.mjs.map +1 -1
- package/fesm2022/masterteam-components-formula.mjs +52 -14
- package/fesm2022/masterteam-components-formula.mjs.map +1 -1
- package/fesm2022/masterteam-components-icon-field.mjs +4 -3
- package/fesm2022/masterteam-components-icon-field.mjs.map +1 -1
- package/fesm2022/masterteam-components-module-summary-card.mjs +4 -2
- package/fesm2022/masterteam-components-module-summary-card.mjs.map +1 -1
- package/fesm2022/masterteam-components-pick-list-field.mjs +5 -3
- package/fesm2022/masterteam-components-pick-list-field.mjs.map +1 -1
- package/fesm2022/masterteam-components-runtime-action.mjs +21 -13
- package/fesm2022/masterteam-components-runtime-action.mjs.map +1 -1
- package/fesm2022/masterteam-components-sidebar.mjs +3 -2
- package/fesm2022/masterteam-components-sidebar.mjs.map +1 -1
- package/fesm2022/masterteam-components-table.mjs +51 -16
- package/fesm2022/masterteam-components-table.mjs.map +1 -1
- package/fesm2022/masterteam-components-tabs.mjs +4 -2
- package/fesm2022/masterteam-components-tabs.mjs.map +1 -1
- package/fesm2022/masterteam-components-text-field.mjs +5 -1
- package/fesm2022/masterteam-components-text-field.mjs.map +1 -1
- package/fesm2022/masterteam-components-topbar.mjs +3 -2
- package/fesm2022/masterteam-components-topbar.mjs.map +1 -1
- package/fesm2022/masterteam-components-tree.mjs +14 -2
- package/fesm2022/masterteam-components-tree.mjs.map +1 -1
- package/fesm2022/masterteam-components-upload-field.mjs +4 -3
- package/fesm2022/masterteam-components-upload-field.mjs.map +1 -1
- package/fesm2022/masterteam-components-user-search-field.mjs +5 -6
- package/fesm2022/masterteam-components-user-search-field.mjs.map +1 -1
- package/package.json +1 -1
- package/types/masterteam-components-business-fields.d.ts +2 -0
- package/types/masterteam-components-client-page.d.ts +2 -1
- package/types/masterteam-components-drawer.d.ts +1 -0
- package/types/masterteam-components-dynamic-drawer.d.ts +2 -0
- package/types/masterteam-components-entities.d.ts +3 -0
- package/types/masterteam-components-formula.d.ts +7 -3
- package/types/masterteam-components-module-summary-card.d.ts +1 -0
- package/types/masterteam-components-pick-list-field.d.ts +1 -0
- package/types/masterteam-components-runtime-action.d.ts +2 -0
- package/types/masterteam-components-table.d.ts +15 -3
- package/types/masterteam-components-tabs.d.ts +1 -0
- package/types/masterteam-components-text-field.d.ts +2 -1
- package/types/masterteam-components-tree.d.ts +1 -0
- package/types/masterteam-components-upload-field.d.ts +1 -0
- package/types/masterteam-components-user-search-field.d.ts +0 -1
|
@@ -3,6 +3,7 @@ import { input, signal, inject, effect, ChangeDetectionStrategy, Component } fro
|
|
|
3
3
|
import * as i1 from '@angular/forms';
|
|
4
4
|
import { Validators, NgControl, FormsModule } from '@angular/forms';
|
|
5
5
|
import { Select } from 'primeng/select';
|
|
6
|
+
import { TranslocoPipe } from '@jsverse/transloco';
|
|
6
7
|
import * as mtIcons from '@masterteam/icons/assets/select-icons.json';
|
|
7
8
|
import { Icon } from '@masterteam/icons';
|
|
8
9
|
import { FieldValidation } from '@masterteam/components/field-validation';
|
|
@@ -46,13 +47,13 @@ class IconField {
|
|
|
46
47
|
return c.errors;
|
|
47
48
|
}
|
|
48
49
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: IconField, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
49
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.8", type: IconField, isStandalone: true, selector: "mt-icon-field", inputs: { label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, required: { classPropertyName: "required", publicName: "required", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "grid gap-1" }, ngImport: i0, template: "@if (label()) {\r\n <label\r\n (click)=\"dropdown.show(); dropdown.focus()\"\r\n [class.required]=\"ngControl?.control?.hasValidator(requiredValidator)\"\r\n [for]=\"ngControl?.name || label()\"\r\n >{{ label() }}</label\r\n >\r\n}\r\n<p-select\r\n #dropdown\r\n [options]=\"icons\"\r\n [filter]=\"false\"\r\n filterBy=\"name\"\r\n [inputId]=\"ngControl?.name ? ngControl?.name?.toString() : label()\"\r\n appendTo=\"body\"\r\n (onBlur)=\"onTouched()\"\r\n (ngModelChange)=\"onChangeIcon($event)\"\r\n [ngModel]=\"selectedIcon()\"\r\n [invalid]=\"isInvalid(ngControl?.control)\"\r\n placeholder=\"
|
|
50
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.8", type: IconField, isStandalone: true, selector: "mt-icon-field", inputs: { label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, required: { classPropertyName: "required", publicName: "required", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "grid gap-1" }, ngImport: i0, template: "@if (label()) {\r\n <label\r\n (click)=\"dropdown.show(); dropdown.focus()\"\r\n [class.required]=\"ngControl?.control?.hasValidator(requiredValidator)\"\r\n [for]=\"ngControl?.name || label()\"\r\n >{{ label() }}</label\r\n >\r\n}\r\n<p-select\r\n #dropdown\r\n [options]=\"icons\"\r\n [filter]=\"false\"\r\n filterBy=\"name\"\r\n [inputId]=\"ngControl?.name ? ngControl?.name?.toString() : label()\"\r\n appendTo=\"body\"\r\n (onBlur)=\"onTouched()\"\r\n (ngModelChange)=\"onChangeIcon($event)\"\r\n [ngModel]=\"selectedIcon()\"\r\n [invalid]=\"isInvalid(ngControl?.control)\"\r\n [placeholder]=\"'components.iconField.selectIcon' | transloco\"\r\n styleClass=\"w-full\"\r\n panelStyleClass=\"icon-select-panel\"\r\n>\r\n <ng-template let-icon #selectedItem>\r\n @if (icon) {\r\n <div class=\"flex items-center justify-center text-2xl\">\r\n <mt-icon [icon]=\"icon\" />\r\n </div>\r\n } @else {\r\n <div class=\"flex items-center justify-center\">\r\n {{ \"components.iconField.selectIcon\" | transloco }}\r\n </div>\r\n }\r\n </ng-template>\r\n <ng-template let-icon #item>\r\n <div class=\"w-full h-full flex items-center justify-center text-lg\">\r\n <mt-icon [icon]=\"icon\" />\r\n </div>\r\n </ng-template>\r\n</p-select>\r\n\r\n<mt-field-validation [control]=\"ngControl?.control\"></mt-field-validation>\r\n", styles: ["::ng-deep .icon-select-panel .p-select-list-container .p-select-list{display:grid;grid-template-columns:repeat(7,1fr);padding-inline:calc(var(--spacing) * 2);gap:.5rem}::ng-deep .icon-select-panel .p-select-list-container .p-select-list .p-select-option{padding:.25rem;border-radius:var(--p-select-option-border-radius);width:2.5rem;height:2.5rem}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: Select, selector: "p-select", inputs: ["id", "scrollHeight", "filter", "panelStyle", "styleClass", "panelStyleClass", "readonly", "editable", "tabindex", "placeholder", "loadingIcon", "filterPlaceholder", "filterLocale", "inputId", "dataKey", "filterBy", "filterFields", "autofocus", "resetFilterOnHide", "checkmark", "dropdownIcon", "loading", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "group", "showClear", "emptyFilterMessage", "emptyMessage", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "ariaLabel", "ariaLabelledBy", "filterMatchMode", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "focusOnHover", "selectOnFocus", "autoOptionFocus", "autofocusFilter", "filterValue", "options", "appendTo", "motionOptions"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear", "onLazyLoad"] }, { kind: "component", type: Icon, selector: "mt-icon", inputs: ["icon"] }, { kind: "component", type: FieldValidation, selector: "mt-field-validation", inputs: ["control", "touched"] }, { kind: "pipe", type: TranslocoPipe, name: "transloco" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
50
51
|
}
|
|
51
52
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: IconField, decorators: [{
|
|
52
53
|
type: Component,
|
|
53
|
-
args: [{ selector: 'mt-icon-field', imports: [FormsModule, Select, Icon, FieldValidation], changeDetection: ChangeDetectionStrategy.OnPush, host: {
|
|
54
|
+
args: [{ selector: 'mt-icon-field', imports: [FormsModule, Select, Icon, FieldValidation, TranslocoPipe], changeDetection: ChangeDetectionStrategy.OnPush, host: {
|
|
54
55
|
class: 'grid gap-1',
|
|
55
|
-
}, template: "@if (label()) {\r\n <label\r\n (click)=\"dropdown.show(); dropdown.focus()\"\r\n [class.required]=\"ngControl?.control?.hasValidator(requiredValidator)\"\r\n [for]=\"ngControl?.name || label()\"\r\n >{{ label() }}</label\r\n >\r\n}\r\n<p-select\r\n #dropdown\r\n [options]=\"icons\"\r\n [filter]=\"false\"\r\n filterBy=\"name\"\r\n [inputId]=\"ngControl?.name ? ngControl?.name?.toString() : label()\"\r\n appendTo=\"body\"\r\n (onBlur)=\"onTouched()\"\r\n (ngModelChange)=\"onChangeIcon($event)\"\r\n [ngModel]=\"selectedIcon()\"\r\n [invalid]=\"isInvalid(ngControl?.control)\"\r\n placeholder=\"
|
|
56
|
+
}, template: "@if (label()) {\r\n <label\r\n (click)=\"dropdown.show(); dropdown.focus()\"\r\n [class.required]=\"ngControl?.control?.hasValidator(requiredValidator)\"\r\n [for]=\"ngControl?.name || label()\"\r\n >{{ label() }}</label\r\n >\r\n}\r\n<p-select\r\n #dropdown\r\n [options]=\"icons\"\r\n [filter]=\"false\"\r\n filterBy=\"name\"\r\n [inputId]=\"ngControl?.name ? ngControl?.name?.toString() : label()\"\r\n appendTo=\"body\"\r\n (onBlur)=\"onTouched()\"\r\n (ngModelChange)=\"onChangeIcon($event)\"\r\n [ngModel]=\"selectedIcon()\"\r\n [invalid]=\"isInvalid(ngControl?.control)\"\r\n [placeholder]=\"'components.iconField.selectIcon' | transloco\"\r\n styleClass=\"w-full\"\r\n panelStyleClass=\"icon-select-panel\"\r\n>\r\n <ng-template let-icon #selectedItem>\r\n @if (icon) {\r\n <div class=\"flex items-center justify-center text-2xl\">\r\n <mt-icon [icon]=\"icon\" />\r\n </div>\r\n } @else {\r\n <div class=\"flex items-center justify-center\">\r\n {{ \"components.iconField.selectIcon\" | transloco }}\r\n </div>\r\n }\r\n </ng-template>\r\n <ng-template let-icon #item>\r\n <div class=\"w-full h-full flex items-center justify-center text-lg\">\r\n <mt-icon [icon]=\"icon\" />\r\n </div>\r\n </ng-template>\r\n</p-select>\r\n\r\n<mt-field-validation [control]=\"ngControl?.control\"></mt-field-validation>\r\n", styles: ["::ng-deep .icon-select-panel .p-select-list-container .p-select-list{display:grid;grid-template-columns:repeat(7,1fr);padding-inline:calc(var(--spacing) * 2);gap:.5rem}::ng-deep .icon-select-panel .p-select-list-container .p-select-list .p-select-option{padding:.25rem;border-radius:var(--p-select-option-border-radius);width:2.5rem;height:2.5rem}\n"] }]
|
|
56
57
|
}], ctorParameters: () => [], propDecorators: { label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], required: [{ type: i0.Input, args: [{ isSignal: true, alias: "required", required: false }] }] } });
|
|
57
58
|
|
|
58
59
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"masterteam-components-icon-field.mjs","sources":["../../../../packages/masterteam/components/icon-field/icon-field.ts","../../../../packages/masterteam/components/icon-field/icon-field.html","../../../../packages/masterteam/components/icon-field/masterteam-components-icon-field.ts"],"sourcesContent":["import {\r\n Component,\r\n signal,\r\n inject,\r\n input,\r\n ChangeDetectionStrategy,\r\n effect,\r\n} from '@angular/core';\r\nimport {\r\n ControlValueAccessor,\r\n FormControl,\r\n FormsModule,\r\n NgControl,\r\n Validators,\r\n} from '@angular/forms';\r\nimport { Select } from 'primeng/select';\r\nimport * as mtIcons from '@masterteam/icons/assets/select-icons.json';\r\nimport { Icon, MTIcon } from '@masterteam/icons';\r\nimport { FieldValidation } from '@masterteam/components/field-validation';\r\nimport { isInvalid } from '@masterteam/components';\r\n\r\n@Component({\r\n selector: 'mt-icon-field',\r\n imports: [FormsModule, Select, Icon, FieldValidation],\r\n templateUrl: './icon-field.html',\r\n styleUrls: ['./icon-field.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n host: {\r\n class: 'grid gap-1',\r\n },\r\n})\r\nexport class IconField implements ControlValueAccessor {\r\n readonly label = input<string>('');\r\n readonly required = input<boolean>(false);\r\n\r\n icons: MTIcon[] = (mtIcons?.regular as MTIcon[]) ?? [];\r\n selectedIcon = signal<string | null>(null);\r\n requiredValidator = Validators.required;\r\n\r\n public ngControl = inject(NgControl, { self: true });\r\n\r\n isInvalid = isInvalid;\r\n\r\n constructor() {\r\n if (this.ngControl) {\r\n this.ngControl.valueAccessor = this;\r\n }\r\n effect(() => {\r\n if (this.ngControl.control && this.required()) {\r\n this.ngControl.control.addValidators(Validators.required);\r\n this.ngControl.control.updateValueAndValidity();\r\n }\r\n });\r\n }\r\n\r\n protected onTouched: () => void = () => {};\r\n private onChange: (icon: string) => void = () => {};\r\n\r\n writeValue(value: string) {\r\n this.selectedIcon.set(value);\r\n }\r\n\r\n registerOnChange(fn: any) {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: any) {\r\n this.onTouched = fn;\r\n }\r\n\r\n onChangeIcon(icon: string) {\r\n this.selectedIcon.set(icon);\r\n this.onChange(icon);\r\n }\r\n\r\n public validate(c: FormControl) {\r\n return c.errors;\r\n }\r\n}\r\n","@if (label()) {\r\n <label\r\n (click)=\"dropdown.show(); dropdown.focus()\"\r\n [class.required]=\"ngControl?.control?.hasValidator(requiredValidator)\"\r\n [for]=\"ngControl?.name || label()\"\r\n >{{ label() }}</label\r\n >\r\n}\r\n<p-select\r\n #dropdown\r\n [options]=\"icons\"\r\n [filter]=\"false\"\r\n filterBy=\"name\"\r\n [inputId]=\"ngControl?.name ? ngControl?.name?.toString() : label()\"\r\n appendTo=\"body\"\r\n (onBlur)=\"onTouched()\"\r\n (ngModelChange)=\"onChangeIcon($event)\"\r\n [ngModel]=\"selectedIcon()\"\r\n [invalid]=\"isInvalid(ngControl?.control)\"\r\n placeholder=\"
|
|
1
|
+
{"version":3,"file":"masterteam-components-icon-field.mjs","sources":["../../../../packages/masterteam/components/icon-field/icon-field.ts","../../../../packages/masterteam/components/icon-field/icon-field.html","../../../../packages/masterteam/components/icon-field/masterteam-components-icon-field.ts"],"sourcesContent":["import {\r\n Component,\r\n signal,\r\n inject,\r\n input,\r\n ChangeDetectionStrategy,\r\n effect,\r\n} from '@angular/core';\r\nimport {\r\n ControlValueAccessor,\r\n FormControl,\r\n FormsModule,\r\n NgControl,\r\n Validators,\r\n} from '@angular/forms';\r\nimport { Select } from 'primeng/select';\r\nimport { TranslocoPipe } from '@jsverse/transloco';\r\nimport * as mtIcons from '@masterteam/icons/assets/select-icons.json';\r\nimport { Icon, MTIcon } from '@masterteam/icons';\r\nimport { FieldValidation } from '@masterteam/components/field-validation';\r\nimport { isInvalid } from '@masterteam/components';\r\n\r\n@Component({\r\n selector: 'mt-icon-field',\r\n imports: [FormsModule, Select, Icon, FieldValidation, TranslocoPipe],\r\n templateUrl: './icon-field.html',\r\n styleUrls: ['./icon-field.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n host: {\r\n class: 'grid gap-1',\r\n },\r\n})\r\nexport class IconField implements ControlValueAccessor {\r\n readonly label = input<string>('');\r\n readonly required = input<boolean>(false);\r\n\r\n icons: MTIcon[] = (mtIcons?.regular as MTIcon[]) ?? [];\r\n selectedIcon = signal<string | null>(null);\r\n requiredValidator = Validators.required;\r\n\r\n public ngControl = inject(NgControl, { self: true });\r\n\r\n isInvalid = isInvalid;\r\n\r\n constructor() {\r\n if (this.ngControl) {\r\n this.ngControl.valueAccessor = this;\r\n }\r\n effect(() => {\r\n if (this.ngControl.control && this.required()) {\r\n this.ngControl.control.addValidators(Validators.required);\r\n this.ngControl.control.updateValueAndValidity();\r\n }\r\n });\r\n }\r\n\r\n protected onTouched: () => void = () => {};\r\n private onChange: (icon: string) => void = () => {};\r\n\r\n writeValue(value: string) {\r\n this.selectedIcon.set(value);\r\n }\r\n\r\n registerOnChange(fn: any) {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: any) {\r\n this.onTouched = fn;\r\n }\r\n\r\n onChangeIcon(icon: string) {\r\n this.selectedIcon.set(icon);\r\n this.onChange(icon);\r\n }\r\n\r\n public validate(c: FormControl) {\r\n return c.errors;\r\n }\r\n}\r\n","@if (label()) {\r\n <label\r\n (click)=\"dropdown.show(); dropdown.focus()\"\r\n [class.required]=\"ngControl?.control?.hasValidator(requiredValidator)\"\r\n [for]=\"ngControl?.name || label()\"\r\n >{{ label() }}</label\r\n >\r\n}\r\n<p-select\r\n #dropdown\r\n [options]=\"icons\"\r\n [filter]=\"false\"\r\n filterBy=\"name\"\r\n [inputId]=\"ngControl?.name ? ngControl?.name?.toString() : label()\"\r\n appendTo=\"body\"\r\n (onBlur)=\"onTouched()\"\r\n (ngModelChange)=\"onChangeIcon($event)\"\r\n [ngModel]=\"selectedIcon()\"\r\n [invalid]=\"isInvalid(ngControl?.control)\"\r\n [placeholder]=\"'components.iconField.selectIcon' | transloco\"\r\n styleClass=\"w-full\"\r\n panelStyleClass=\"icon-select-panel\"\r\n>\r\n <ng-template let-icon #selectedItem>\r\n @if (icon) {\r\n <div class=\"flex items-center justify-center text-2xl\">\r\n <mt-icon [icon]=\"icon\" />\r\n </div>\r\n } @else {\r\n <div class=\"flex items-center justify-center\">\r\n {{ \"components.iconField.selectIcon\" | transloco }}\r\n </div>\r\n }\r\n </ng-template>\r\n <ng-template let-icon #item>\r\n <div class=\"w-full h-full flex items-center justify-center text-lg\">\r\n <mt-icon [icon]=\"icon\" />\r\n </div>\r\n </ng-template>\r\n</p-select>\r\n\r\n<mt-field-validation [control]=\"ngControl?.control\"></mt-field-validation>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { input, model, booleanAttribute, output, Component } from '@angular/core';
|
|
2
|
+
import { inject, input, model, booleanAttribute, output, Component } from '@angular/core';
|
|
3
|
+
import { TranslocoService } from '@jsverse/transloco';
|
|
3
4
|
import { Card } from '@masterteam/components/card';
|
|
4
5
|
import { ToggleField } from '@masterteam/components/toggle-field';
|
|
5
6
|
import { Button } from '@masterteam/components/button';
|
|
@@ -8,11 +9,12 @@ import * as i1 from '@angular/forms';
|
|
|
8
9
|
import { FormsModule } from '@angular/forms';
|
|
9
10
|
|
|
10
11
|
class ModuleSummaryCard {
|
|
12
|
+
transloco = inject(TranslocoService);
|
|
11
13
|
icon = input(...(ngDevMode ? [undefined, { debugName: "icon" }] : /* istanbul ignore next */ []));
|
|
12
14
|
title = input(...(ngDevMode ? [undefined, { debugName: "title" }] : /* istanbul ignore next */ []));
|
|
13
15
|
description = input(...(ngDevMode ? [undefined, { debugName: "description" }] : /* istanbul ignore next */ []));
|
|
14
16
|
active = model(false, ...(ngDevMode ? [{ debugName: "active" }] : /* istanbul ignore next */ []));
|
|
15
|
-
buttonLabel = input('
|
|
17
|
+
buttonLabel = input(this.transloco.translate('components.moduleSummaryCard.actionLabel'), ...(ngDevMode ? [{ debugName: "buttonLabel" }] : /* istanbul ignore next */ []));
|
|
16
18
|
showToggle = input(true, { ...(ngDevMode ? { debugName: "showToggle" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
17
19
|
showButton = input(true, { ...(ngDevMode ? { debugName: "showButton" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
18
20
|
onButtonClick = output();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"masterteam-components-module-summary-card.mjs","sources":["../../../../packages/masterteam/components/module-summary-card/module-summary-card.ts","../../../../packages/masterteam/components/module-summary-card/module-summary-card.html","../../../../packages/masterteam/components/module-summary-card/masterteam-components-module-summary-card.ts"],"sourcesContent":["import {\r\n Component,\r\n input,\r\n model,\r\n output,\r\n booleanAttribute,\r\n} from '@angular/core';\r\nimport { Card } from '@masterteam/components/card';\r\nimport { ToggleField } from '@masterteam/components/toggle-field';\r\nimport { Button } from '@masterteam/components/button';\r\nimport { Avatar } from '@masterteam/components/avatar';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { MTIcon } from '@masterteam/icons';\r\n\r\n@Component({\r\n selector: 'mt-module-summary-card',\r\n standalone: true,\r\n templateUrl: './module-summary-card.html',\r\n styleUrl: './module-summary-card.scss',\r\n imports: [Card, Button, Avatar, ToggleField, FormsModule],\r\n})\r\nexport class ModuleSummaryCard {\r\n readonly icon = input<MTIcon>();\r\n readonly title = input<string>();\r\n readonly description = input<string>();\r\n readonly active = model<boolean>(false);\r\n readonly buttonLabel = input<string>('
|
|
1
|
+
{"version":3,"file":"masterteam-components-module-summary-card.mjs","sources":["../../../../packages/masterteam/components/module-summary-card/module-summary-card.ts","../../../../packages/masterteam/components/module-summary-card/module-summary-card.html","../../../../packages/masterteam/components/module-summary-card/masterteam-components-module-summary-card.ts"],"sourcesContent":["import {\r\n Component,\r\n inject,\r\n input,\r\n model,\r\n output,\r\n booleanAttribute,\r\n} from '@angular/core';\r\nimport { TranslocoService } from '@jsverse/transloco';\r\nimport { Card } from '@masterteam/components/card';\r\nimport { ToggleField } from '@masterteam/components/toggle-field';\r\nimport { Button } from '@masterteam/components/button';\r\nimport { Avatar } from '@masterteam/components/avatar';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { MTIcon } from '@masterteam/icons';\r\n\r\n@Component({\r\n selector: 'mt-module-summary-card',\r\n standalone: true,\r\n templateUrl: './module-summary-card.html',\r\n styleUrl: './module-summary-card.scss',\r\n imports: [Card, Button, Avatar, ToggleField, FormsModule],\r\n})\r\nexport class ModuleSummaryCard {\r\n private readonly transloco = inject(TranslocoService);\r\n readonly icon = input<MTIcon>();\r\n readonly title = input<string>();\r\n readonly description = input<string>();\r\n readonly active = model<boolean>(false);\r\n readonly buttonLabel = input<string>(\r\n this.transloco.translate('components.moduleSummaryCard.actionLabel'),\r\n );\r\n readonly showToggle = input<boolean, unknown>(true, {\r\n transform: booleanAttribute,\r\n });\r\n readonly showButton = input<boolean, unknown>(true, {\r\n transform: booleanAttribute,\r\n });\r\n readonly onButtonClick = output<MouseEvent>();\r\n}\r\n","<mt-card headless class=\"h-full\">\r\n <div class=\"content flex flex-col gap-5 items-center text-center h-full\">\r\n @if (showToggle()) {\r\n <div class=\"flex justify-end w-full\">\r\n <mt-toggle-field [(ngModel)]=\"active\" />\r\n </div>\r\n }\r\n @if (icon()) {\r\n <mt-avatar\r\n style=\"\r\n --p-avatar-background: var(--p-primary-50);\r\n --p-avatar-color: var(--p-primary-color);\r\n \"\r\n [icon]=\"icon()\"\r\n size=\"large\"\r\n shape=\"square\"\r\n ></mt-avatar>\r\n }\r\n <div class=\"flex flex-col gap-1\">\r\n @if (title()) {\r\n <div class=\"title text-lg font-semibold\">\r\n {{ title() }}\r\n </div>\r\n }\r\n @if (description()) {\r\n <div\r\n class=\"description text-sm text-muted-foreground secondary text-surface-500\"\r\n >\r\n {{ description() }}\r\n </div>\r\n }\r\n </div>\r\n\r\n <div class=\"grow flex flex-col justify-end\">\r\n @if (showButton()) {\r\n <mt-button\r\n label=\"{{ buttonLabel() }}\"\r\n (onClick)=\"onButtonClick.emit($event)\"\r\n />\r\n }\r\n </div>\r\n </div>\r\n</mt-card>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
@@ -1,21 +1,23 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { input, signal,
|
|
2
|
+
import { inject, input, signal, effect, ViewChild, HostBinding, ChangeDetectionStrategy, Component } from '@angular/core';
|
|
3
3
|
import { Validators, NgControl } from '@angular/forms';
|
|
4
4
|
import * as i1 from 'primeng/picklist';
|
|
5
5
|
import { PickListModule } from 'primeng/picklist';
|
|
6
|
+
import { TranslocoService } from '@jsverse/transloco';
|
|
6
7
|
import { FieldValidation } from '@masterteam/components/field-validation';
|
|
7
8
|
import { isInvalid } from '@masterteam/components';
|
|
8
9
|
import * as i2 from 'primeng/api';
|
|
9
10
|
|
|
10
11
|
class PickListField {
|
|
12
|
+
transloco = inject(TranslocoService);
|
|
11
13
|
label = input(...(ngDevMode ? [undefined, { debugName: "label" }] : /* istanbul ignore next */ []));
|
|
12
14
|
class = input('', ...(ngDevMode ? [{ debugName: "class" }] : /* istanbul ignore next */ []));
|
|
13
15
|
readonly = input(false, ...(ngDevMode ? [{ debugName: "readonly" }] : /* istanbul ignore next */ []));
|
|
14
16
|
options = input([], ...(ngDevMode ? [{ debugName: "options" }] : /* istanbul ignore next */ []));
|
|
15
17
|
optionLabel = input('label', ...(ngDevMode ? [{ debugName: "optionLabel" }] : /* istanbul ignore next */ []));
|
|
16
18
|
optionValue = input('value', ...(ngDevMode ? [{ debugName: "optionValue" }] : /* istanbul ignore next */ []));
|
|
17
|
-
sourceHeader = input('
|
|
18
|
-
targetHeader = input('
|
|
19
|
+
sourceHeader = input(this.transloco.translate('components.pickListField.available'), ...(ngDevMode ? [{ debugName: "sourceHeader" }] : /* istanbul ignore next */ []));
|
|
20
|
+
targetHeader = input(this.transloco.translate('components.pickListField.selected'), ...(ngDevMode ? [{ debugName: "targetHeader" }] : /* istanbul ignore next */ []));
|
|
19
21
|
showSourceControls = input(true, ...(ngDevMode ? [{ debugName: "showSourceControls" }] : /* istanbul ignore next */ []));
|
|
20
22
|
showTargetControls = input(true, ...(ngDevMode ? [{ debugName: "showTargetControls" }] : /* istanbul ignore next */ []));
|
|
21
23
|
showSourceFilter = input(false, ...(ngDevMode ? [{ debugName: "showSourceFilter" }] : /* istanbul ignore next */ []));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"masterteam-components-pick-list-field.mjs","sources":["../../../../packages/masterteam/components/pick-list-field/pick-list-field.ts","../../../../packages/masterteam/components/pick-list-field/pick-list-field.html","../../../../packages/masterteam/components/pick-list-field/masterteam-components-pick-list-field.ts"],"sourcesContent":["import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n HostBinding,\r\n OnInit,\r\n ViewChild,\r\n effect,\r\n inject,\r\n input,\r\n signal,\r\n} from '@angular/core';\r\nimport { ControlValueAccessor, NgControl, Validators } from '@angular/forms';\r\nimport { PickList, PickListModule } from 'primeng/picklist';\r\nimport { FieldValidation } from '@masterteam/components/field-validation';\r\nimport { isInvalid } from '@masterteam/components';\r\n\r\n@Component({\r\n selector: 'mt-pick-list-field',\r\n templateUrl: './pick-list-field.html',\r\n styleUrls: ['./pick-list-field.scss'],\r\n imports: [PickListModule, FieldValidation],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n host: {\r\n class: 'grid gap-1',\r\n },\r\n})\r\nexport class PickListField implements ControlValueAccessor, OnInit {\r\n readonly label = input<string>();\r\n readonly class = input<string>('');\r\n readonly readonly = input<boolean>(false);\r\n readonly options = input<any[]>([]);\r\n readonly optionLabel = input<string>('label');\r\n readonly optionValue = input<string>('value');\r\n readonly sourceHeader = input<string>('Available');\r\n readonly targetHeader = input<string>('Selected');\r\n readonly showSourceControls = input<boolean>(true);\r\n readonly showTargetControls = input<boolean>(true);\r\n readonly showSourceFilter = input<boolean>(false);\r\n readonly showTargetFilter = input<boolean>(false);\r\n readonly filterBy = input<string>();\r\n readonly dataKey = input<string>();\r\n readonly filterLocale = input<string>();\r\n readonly filterMatchMode = input<\r\n | 'contains'\r\n | 'startsWith'\r\n | 'endsWith'\r\n | 'equals'\r\n | 'notEquals'\r\n | 'in'\r\n | 'lt'\r\n | 'lte'\r\n | 'gt'\r\n | 'gte'\r\n | string\r\n >('contains');\r\n readonly dragdrop = input<boolean>(false);\r\n readonly responsive = input<boolean>(true);\r\n readonly required = input<boolean>(false);\r\n\r\n @HostBinding('class') styleClass: string = '';\r\n\r\n requiredValidator = Validators.required;\r\n value = signal<any[]>([]);\r\n targetItems = signal<any[]>([]);\r\n sourceItems = signal<any[]>([]);\r\n disabled = signal<boolean>(false);\r\n\r\n private onTouched: () => void = () => {};\r\n private onModelChange: (value: any) => void = () => {};\r\n\r\n public ngControl = inject(NgControl, { self: true });\r\n\r\n isInvalid = isInvalid;\r\n\r\n private hasInitialized = false;\r\n\r\n @ViewChild('pickList') pickList?: PickList;\r\n\r\n constructor() {\r\n if (this.ngControl) {\r\n this.ngControl.valueAccessor = this;\r\n }\r\n effect(() => {\r\n if (this.ngControl?.control && this.required()) {\r\n this.ngControl.control.addValidators(Validators.required);\r\n this.ngControl.control.updateValueAndValidity();\r\n }\r\n });\r\n effect(() => {\r\n this.options();\r\n if (this.hasInitialized) {\r\n this.syncLists();\r\n }\r\n });\r\n }\r\n\r\n ngOnInit() {\r\n this.styleClass = this.class();\r\n this.syncLists();\r\n this.hasInitialized = true;\r\n }\r\n\r\n writeValue(value: any) {\r\n const nextValue = Array.isArray(value)\r\n ? [...value]\r\n : value === null || value === undefined\r\n ? []\r\n : [value];\r\n this.value.set(nextValue);\r\n this.syncLists();\r\n }\r\n\r\n registerOnChange(fn: any) {\r\n this.onModelChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: any) {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(disabled: boolean) {\r\n this.disabled.set(disabled);\r\n }\r\n\r\n onInteractiveChange() {\r\n this.syncFromPickList();\r\n }\r\n\r\n handleBlur() {\r\n this.onTouched();\r\n }\r\n\r\n displayLabel(item: any): string {\r\n if (item === null || item === undefined) {\r\n return '';\r\n }\r\n if (typeof item === 'string' || typeof item === 'number') {\r\n return String(item);\r\n }\r\n const labelKey = this.optionLabel();\r\n const nestedLabel =\r\n labelKey && labelKey.includes('.')\r\n ? this.getNestedValue(item, labelKey)\r\n : undefined;\r\n if (nestedLabel !== undefined) {\r\n return nestedLabel;\r\n }\r\n if (labelKey && item[labelKey] !== undefined) {\r\n return item[labelKey];\r\n }\r\n return JSON.stringify(item);\r\n }\r\n\r\n private getNestedValue(target: any, path: string): any {\r\n if (!target || !path) {\r\n return undefined;\r\n }\r\n return path\r\n .split('.')\r\n .reduce(\r\n (acc, key) =>\r\n acc !== null && acc !== undefined ? acc[key] : undefined,\r\n target,\r\n );\r\n }\r\n\r\n private syncLists() {\r\n const currentValue = this.value();\r\n const targetOptions = this.normalizeValueToOptions(currentValue);\r\n this.targetItems.set(targetOptions);\r\n this.updateSourceFromTarget(targetOptions);\r\n }\r\n\r\n private syncFromPickList() {\r\n const pickListInstance = this.pickList;\r\n if (!pickListInstance) {\r\n return;\r\n }\r\n const currentTarget = [...(pickListInstance.target() ?? [])];\r\n const currentSource = [...(pickListInstance.source() ?? [])];\r\n this.targetItems.set(currentTarget);\r\n this.sourceItems.set(currentSource);\r\n\r\n const newValue = this.extractValues(currentTarget);\r\n this.value.set(newValue);\r\n this.onModelChange(newValue);\r\n this.onTouched();\r\n }\r\n\r\n private normalizeValueToOptions(value: any[]): any[] {\r\n if (!Array.isArray(value)) {\r\n return [];\r\n }\r\n return value\r\n .map((entry) => this.findOption(entry) ?? entry)\r\n .filter((item) => item !== undefined && item !== null);\r\n }\r\n\r\n private extractValues(items: any[]): any[] {\r\n const optionValueKey = this.optionValue();\r\n if (!optionValueKey) {\r\n return items ?? [];\r\n }\r\n const values: any[] = [];\r\n (items ?? []).forEach((item) => {\r\n if (item && typeof item === 'object') {\r\n values.push(item[optionValueKey] ?? item);\r\n } else {\r\n values.push(item);\r\n }\r\n });\r\n return values;\r\n }\r\n\r\n private updateSourceFromTarget(targetItems: any[]) {\r\n const options = this.options() ?? [];\r\n const targetIds = new Set(\r\n (targetItems ?? []).map((item) => this.getIdentifier(item)),\r\n );\r\n const newSource = options.filter(\r\n (option) => !targetIds.has(this.getIdentifier(option)),\r\n );\r\n this.sourceItems.set(newSource);\r\n }\r\n\r\n private getIdentifier(item: any): any {\r\n if (item === null || item === undefined) {\r\n return item;\r\n }\r\n const optionValueKey = this.optionValue();\r\n if (!optionValueKey) {\r\n return item;\r\n }\r\n if (typeof item === 'object') {\r\n return item[optionValueKey];\r\n }\r\n return item;\r\n }\r\n\r\n private findOption(entry: any): any | undefined {\r\n const options = this.options() ?? [];\r\n const entryId = this.getIdentifier(entry);\r\n return options.find((option) => this.getIdentifier(option) === entryId);\r\n }\r\n}\r\n","@if (label()) {\r\n <label\r\n [class.required]=\"ngControl?.control?.hasValidator(requiredValidator)\"\r\n [for]=\"ngControl?.name || label()\"\r\n >{{ label() }}</label\r\n >\r\n}\r\n<p-pickList\r\n #pickList\r\n [source]=\"sourceItems()\"\r\n [target]=\"targetItems()\"\r\n (onMoveToTarget)=\"onInteractiveChange()\"\r\n (onMoveToSource)=\"onInteractiveChange()\"\r\n (onMoveAllToTarget)=\"onInteractiveChange()\"\r\n (onMoveAllToSource)=\"onInteractiveChange()\"\r\n (onTargetReorder)=\"onInteractiveChange()\"\r\n (onSourceReorder)=\"onInteractiveChange()\"\r\n (onBlur)=\"handleBlur()\"\r\n [filterBy]=\"filterBy() || optionLabel()\"\r\n [showSourceControls]=\"showSourceControls()\"\r\n [showTargetControls]=\"showTargetControls()\"\r\n [showSourceFilter]=\"showSourceFilter()\"\r\n [showTargetFilter]=\"showTargetFilter()\"\r\n [sourceHeader]=\"sourceHeader()\"\r\n [targetHeader]=\"targetHeader()\"\r\n [dragdrop]=\"dragdrop()\"\r\n [responsive]=\"responsive()\"\r\n [disabled]=\"disabled() || readonly()\"\r\n [styleClass]=\"'w-full relative'\"\r\n [class.p-invalid]=\"isInvalid(ngControl?.control)\"\r\n>\r\n <ng-template let-item pTemplate=\"item\">\r\n {{ displayLabel(item) }}\r\n </ng-template>\r\n</p-pickList>\r\n\r\n<mt-field-validation [control]=\"ngControl?.control\"></mt-field-validation>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"masterteam-components-pick-list-field.mjs","sources":["../../../../packages/masterteam/components/pick-list-field/pick-list-field.ts","../../../../packages/masterteam/components/pick-list-field/pick-list-field.html","../../../../packages/masterteam/components/pick-list-field/masterteam-components-pick-list-field.ts"],"sourcesContent":["import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n HostBinding,\r\n OnInit,\r\n ViewChild,\r\n effect,\r\n inject,\r\n input,\r\n signal,\r\n} from '@angular/core';\r\nimport { ControlValueAccessor, NgControl, Validators } from '@angular/forms';\r\nimport { PickList, PickListModule } from 'primeng/picklist';\r\nimport { TranslocoService } from '@jsverse/transloco';\r\nimport { FieldValidation } from '@masterteam/components/field-validation';\r\nimport { isInvalid } from '@masterteam/components';\r\n\r\n@Component({\r\n selector: 'mt-pick-list-field',\r\n templateUrl: './pick-list-field.html',\r\n styleUrls: ['./pick-list-field.scss'],\r\n imports: [PickListModule, FieldValidation],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n host: {\r\n class: 'grid gap-1',\r\n },\r\n})\r\nexport class PickListField implements ControlValueAccessor, OnInit {\r\n private readonly transloco = inject(TranslocoService);\r\n readonly label = input<string>();\r\n readonly class = input<string>('');\r\n readonly readonly = input<boolean>(false);\r\n readonly options = input<any[]>([]);\r\n readonly optionLabel = input<string>('label');\r\n readonly optionValue = input<string>('value');\r\n readonly sourceHeader = input<string>(\r\n this.transloco.translate('components.pickListField.available'),\r\n );\r\n readonly targetHeader = input<string>(\r\n this.transloco.translate('components.pickListField.selected'),\r\n );\r\n readonly showSourceControls = input<boolean>(true);\r\n readonly showTargetControls = input<boolean>(true);\r\n readonly showSourceFilter = input<boolean>(false);\r\n readonly showTargetFilter = input<boolean>(false);\r\n readonly filterBy = input<string>();\r\n readonly dataKey = input<string>();\r\n readonly filterLocale = input<string>();\r\n readonly filterMatchMode = input<\r\n | 'contains'\r\n | 'startsWith'\r\n | 'endsWith'\r\n | 'equals'\r\n | 'notEquals'\r\n | 'in'\r\n | 'lt'\r\n | 'lte'\r\n | 'gt'\r\n | 'gte'\r\n | string\r\n >('contains');\r\n readonly dragdrop = input<boolean>(false);\r\n readonly responsive = input<boolean>(true);\r\n readonly required = input<boolean>(false);\r\n\r\n @HostBinding('class') styleClass: string = '';\r\n\r\n requiredValidator = Validators.required;\r\n value = signal<any[]>([]);\r\n targetItems = signal<any[]>([]);\r\n sourceItems = signal<any[]>([]);\r\n disabled = signal<boolean>(false);\r\n\r\n private onTouched: () => void = () => {};\r\n private onModelChange: (value: any) => void = () => {};\r\n\r\n public ngControl = inject(NgControl, { self: true });\r\n\r\n isInvalid = isInvalid;\r\n\r\n private hasInitialized = false;\r\n\r\n @ViewChild('pickList') pickList?: PickList;\r\n\r\n constructor() {\r\n if (this.ngControl) {\r\n this.ngControl.valueAccessor = this;\r\n }\r\n effect(() => {\r\n if (this.ngControl?.control && this.required()) {\r\n this.ngControl.control.addValidators(Validators.required);\r\n this.ngControl.control.updateValueAndValidity();\r\n }\r\n });\r\n effect(() => {\r\n this.options();\r\n if (this.hasInitialized) {\r\n this.syncLists();\r\n }\r\n });\r\n }\r\n\r\n ngOnInit() {\r\n this.styleClass = this.class();\r\n this.syncLists();\r\n this.hasInitialized = true;\r\n }\r\n\r\n writeValue(value: any) {\r\n const nextValue = Array.isArray(value)\r\n ? [...value]\r\n : value === null || value === undefined\r\n ? []\r\n : [value];\r\n this.value.set(nextValue);\r\n this.syncLists();\r\n }\r\n\r\n registerOnChange(fn: any) {\r\n this.onModelChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: any) {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(disabled: boolean) {\r\n this.disabled.set(disabled);\r\n }\r\n\r\n onInteractiveChange() {\r\n this.syncFromPickList();\r\n }\r\n\r\n handleBlur() {\r\n this.onTouched();\r\n }\r\n\r\n displayLabel(item: any): string {\r\n if (item === null || item === undefined) {\r\n return '';\r\n }\r\n if (typeof item === 'string' || typeof item === 'number') {\r\n return String(item);\r\n }\r\n const labelKey = this.optionLabel();\r\n const nestedLabel =\r\n labelKey && labelKey.includes('.')\r\n ? this.getNestedValue(item, labelKey)\r\n : undefined;\r\n if (nestedLabel !== undefined) {\r\n return nestedLabel;\r\n }\r\n if (labelKey && item[labelKey] !== undefined) {\r\n return item[labelKey];\r\n }\r\n return JSON.stringify(item);\r\n }\r\n\r\n private getNestedValue(target: any, path: string): any {\r\n if (!target || !path) {\r\n return undefined;\r\n }\r\n return path\r\n .split('.')\r\n .reduce(\r\n (acc, key) =>\r\n acc !== null && acc !== undefined ? acc[key] : undefined,\r\n target,\r\n );\r\n }\r\n\r\n private syncLists() {\r\n const currentValue = this.value();\r\n const targetOptions = this.normalizeValueToOptions(currentValue);\r\n this.targetItems.set(targetOptions);\r\n this.updateSourceFromTarget(targetOptions);\r\n }\r\n\r\n private syncFromPickList() {\r\n const pickListInstance = this.pickList;\r\n if (!pickListInstance) {\r\n return;\r\n }\r\n const currentTarget = [...(pickListInstance.target() ?? [])];\r\n const currentSource = [...(pickListInstance.source() ?? [])];\r\n this.targetItems.set(currentTarget);\r\n this.sourceItems.set(currentSource);\r\n\r\n const newValue = this.extractValues(currentTarget);\r\n this.value.set(newValue);\r\n this.onModelChange(newValue);\r\n this.onTouched();\r\n }\r\n\r\n private normalizeValueToOptions(value: any[]): any[] {\r\n if (!Array.isArray(value)) {\r\n return [];\r\n }\r\n return value\r\n .map((entry) => this.findOption(entry) ?? entry)\r\n .filter((item) => item !== undefined && item !== null);\r\n }\r\n\r\n private extractValues(items: any[]): any[] {\r\n const optionValueKey = this.optionValue();\r\n if (!optionValueKey) {\r\n return items ?? [];\r\n }\r\n const values: any[] = [];\r\n (items ?? []).forEach((item) => {\r\n if (item && typeof item === 'object') {\r\n values.push(item[optionValueKey] ?? item);\r\n } else {\r\n values.push(item);\r\n }\r\n });\r\n return values;\r\n }\r\n\r\n private updateSourceFromTarget(targetItems: any[]) {\r\n const options = this.options() ?? [];\r\n const targetIds = new Set(\r\n (targetItems ?? []).map((item) => this.getIdentifier(item)),\r\n );\r\n const newSource = options.filter(\r\n (option) => !targetIds.has(this.getIdentifier(option)),\r\n );\r\n this.sourceItems.set(newSource);\r\n }\r\n\r\n private getIdentifier(item: any): any {\r\n if (item === null || item === undefined) {\r\n return item;\r\n }\r\n const optionValueKey = this.optionValue();\r\n if (!optionValueKey) {\r\n return item;\r\n }\r\n if (typeof item === 'object') {\r\n return item[optionValueKey];\r\n }\r\n return item;\r\n }\r\n\r\n private findOption(entry: any): any | undefined {\r\n const options = this.options() ?? [];\r\n const entryId = this.getIdentifier(entry);\r\n return options.find((option) => this.getIdentifier(option) === entryId);\r\n }\r\n}\r\n","@if (label()) {\r\n <label\r\n [class.required]=\"ngControl?.control?.hasValidator(requiredValidator)\"\r\n [for]=\"ngControl?.name || label()\"\r\n >{{ label() }}</label\r\n >\r\n}\r\n<p-pickList\r\n #pickList\r\n [source]=\"sourceItems()\"\r\n [target]=\"targetItems()\"\r\n (onMoveToTarget)=\"onInteractiveChange()\"\r\n (onMoveToSource)=\"onInteractiveChange()\"\r\n (onMoveAllToTarget)=\"onInteractiveChange()\"\r\n (onMoveAllToSource)=\"onInteractiveChange()\"\r\n (onTargetReorder)=\"onInteractiveChange()\"\r\n (onSourceReorder)=\"onInteractiveChange()\"\r\n (onBlur)=\"handleBlur()\"\r\n [filterBy]=\"filterBy() || optionLabel()\"\r\n [showSourceControls]=\"showSourceControls()\"\r\n [showTargetControls]=\"showTargetControls()\"\r\n [showSourceFilter]=\"showSourceFilter()\"\r\n [showTargetFilter]=\"showTargetFilter()\"\r\n [sourceHeader]=\"sourceHeader()\"\r\n [targetHeader]=\"targetHeader()\"\r\n [dragdrop]=\"dragdrop()\"\r\n [responsive]=\"responsive()\"\r\n [disabled]=\"disabled() || readonly()\"\r\n [styleClass]=\"'w-full relative'\"\r\n [class.p-invalid]=\"isInvalid(ngControl?.control)\"\r\n>\r\n <ng-template let-item pTemplate=\"item\">\r\n {{ displayLabel(item) }}\r\n </ng-template>\r\n</p-pickList>\r\n\r\n<mt-field-validation [control]=\"ngControl?.control\"></mt-field-validation>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
2
|
import { signal, Injectable, InjectionToken, inject } from '@angular/core';
|
|
3
3
|
import { HttpClient } from '@angular/common/http';
|
|
4
|
+
import { TranslocoService } from '@jsverse/transloco';
|
|
4
5
|
import { ConfirmationService } from '@masterteam/components/confirmation';
|
|
5
6
|
import { ModalService } from '@masterteam/components/modal';
|
|
6
7
|
import { ToastService } from '@masterteam/components/toast';
|
|
@@ -202,6 +203,7 @@ class RuntimeActionRunner {
|
|
|
202
203
|
confirmation = inject(ConfirmationService);
|
|
203
204
|
modal = inject(ModalService);
|
|
204
205
|
toast = inject(ToastService);
|
|
206
|
+
transloco = inject(TranslocoService);
|
|
205
207
|
confirmDialogClass = inject(RUNTIME_ACTION_CONFIRM_DIALOG, {
|
|
206
208
|
optional: true,
|
|
207
209
|
});
|
|
@@ -209,7 +211,7 @@ class RuntimeActionRunner {
|
|
|
209
211
|
const method = normalizeHttpMethod(action.httpMethod);
|
|
210
212
|
const url = action.url?.trim();
|
|
211
213
|
if (!method || !url || action.isAvailable === false) {
|
|
212
|
-
return cancelledOrError(action, 'error', new Error(notExecutableMessage(action)));
|
|
214
|
+
return cancelledOrError(action, 'error', new Error(this.notExecutableMessage(action)));
|
|
213
215
|
}
|
|
214
216
|
let formValue;
|
|
215
217
|
if (action.needConfirmation) {
|
|
@@ -229,7 +231,7 @@ class RuntimeActionRunner {
|
|
|
229
231
|
}
|
|
230
232
|
const missing = getMissingRequiredPayloadKeys(action, payload);
|
|
231
233
|
if (missing.length) {
|
|
232
|
-
const message =
|
|
234
|
+
const message = this.transloco.translate('components.runtimeAction.missingArgs', { action: resolveActionLabel(action), missing: missing.join(', ') });
|
|
233
235
|
if (!options.silent) {
|
|
234
236
|
this.toast.error(message);
|
|
235
237
|
}
|
|
@@ -262,7 +264,7 @@ class RuntimeActionRunner {
|
|
|
262
264
|
this.confirmation.confirm({
|
|
263
265
|
type: 'dialog',
|
|
264
266
|
header: label,
|
|
265
|
-
message:
|
|
267
|
+
message: this.transloco.translate('components.runtimeAction.confirmDefault', { action: label }),
|
|
266
268
|
acceptLabel: label,
|
|
267
269
|
icon: 'alert.alert-triangle',
|
|
268
270
|
accept: () => resolve(null),
|
|
@@ -271,7 +273,7 @@ class RuntimeActionRunner {
|
|
|
271
273
|
});
|
|
272
274
|
}
|
|
273
275
|
async run(action, method, url, payload, options) {
|
|
274
|
-
const fallbackErrorMessage =
|
|
276
|
+
const fallbackErrorMessage = this.transloco.translate('components.runtimeAction.executeFailed', { action: resolveActionLabel(action) });
|
|
275
277
|
try {
|
|
276
278
|
const response = await firstValueFrom(this.http
|
|
277
279
|
.request(method, url, buildRequestOptions(method, payload))
|
|
@@ -300,6 +302,21 @@ class RuntimeActionRunner {
|
|
|
300
302
|
};
|
|
301
303
|
}
|
|
302
304
|
}
|
|
305
|
+
notExecutableMessage(action) {
|
|
306
|
+
if (action.isAvailable === false) {
|
|
307
|
+
return this.transloco.translate('components.runtimeAction.notAvailable', {
|
|
308
|
+
action: action.actionKey,
|
|
309
|
+
});
|
|
310
|
+
}
|
|
311
|
+
if (!action.url) {
|
|
312
|
+
return this.transloco.translate('components.runtimeAction.noUrl', {
|
|
313
|
+
action: action.actionKey,
|
|
314
|
+
});
|
|
315
|
+
}
|
|
316
|
+
return this.transloco.translate('components.runtimeAction.noHttpMethod', {
|
|
317
|
+
action: action.actionKey,
|
|
318
|
+
});
|
|
319
|
+
}
|
|
303
320
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: RuntimeActionRunner, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
304
321
|
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: RuntimeActionRunner, providedIn: 'root' });
|
|
305
322
|
}
|
|
@@ -307,15 +324,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImpor
|
|
|
307
324
|
type: Injectable,
|
|
308
325
|
args: [{ providedIn: 'root' }]
|
|
309
326
|
}] });
|
|
310
|
-
function notExecutableMessage(action) {
|
|
311
|
-
if (action.isAvailable === false) {
|
|
312
|
-
return `Action ${action.actionKey} is not available.`;
|
|
313
|
-
}
|
|
314
|
-
if (!action.url) {
|
|
315
|
-
return `Action ${action.actionKey} has no url.`;
|
|
316
|
-
}
|
|
317
|
-
return `Action ${action.actionKey} has no http method.`;
|
|
318
|
-
}
|
|
319
327
|
function cancelledOrError(action, status, error) {
|
|
320
328
|
return {
|
|
321
329
|
status,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"masterteam-components-runtime-action.mjs","sources":["../../../../packages/masterteam/components/runtime-action/runtime-action.types.ts","../../../../packages/masterteam/components/runtime-action/payload-builder.ts","../../../../packages/masterteam/components/runtime-action/runtime-action-context.store.ts","../../../../packages/masterteam/components/runtime-action/runtime-action.runner.ts","../../../../packages/masterteam/components/runtime-action/masterteam-components-runtime-action.ts"],"sourcesContent":["export interface RuntimeActionTranslatable {\n display?: string;\n en?: string;\n ar?: string;\n}\n\nexport type RuntimeActionAfterSuccess = 'refresh' | 'close';\n\nexport interface RuntimeActionReason {\n source?: string;\n code?: string;\n message?: string;\n blocking?: boolean;\n details?: string | null;\n ruleKey?: string | null;\n requestId?: number | null;\n requestStatus?: string | null;\n requestSchemaId?: number | null;\n relatedRequestIds?: number[];\n}\n\nexport interface RuntimeAction {\n actionKey: string;\n actionName?: RuntimeActionTranslatable | string | null;\n httpMethod?: string | null;\n url?: string | null;\n isAvailable?: boolean;\n afterSuccess?: RuntimeActionAfterSuccess | null;\n stepIds?: Array<number | string>;\n needConfirmation?: boolean;\n payloadKeys?: string[];\n requiredPayloadKeys?: string[];\n payloadTemplate?: Record<string, unknown> | null;\n formId?: string | number | null;\n\n targetType?: string;\n targetId?: number;\n moduleKey?: string;\n operationKey?: string;\n primaryReasonCode?: string | null;\n reasons?: RuntimeActionReason[];\n}\n\nexport type RuntimeActionStatus = 'success' | 'error' | 'cancelled';\n\nexport interface RuntimeActionResult {\n status: RuntimeActionStatus;\n actionKey: string;\n afterSuccess: RuntimeActionAfterSuccess | null;\n response?: unknown;\n error?: unknown;\n}\n\nexport interface RuntimeActionExecuteOptions {\n externalPayloadResolvers?: Record<string, () => unknown>;\n defaultAfterSuccess?: RuntimeActionAfterSuccess;\n successMessage?: (response: unknown, action: RuntimeAction) => string;\n errorMessage?: (error: unknown, action: RuntimeAction) => string;\n transformPayload?: (\n payload: Record<string, unknown> | undefined,\n action: RuntimeAction,\n ) => Record<string, unknown> | undefined;\n silent?: boolean;\n}\n\nexport interface RuntimeActionFormValue {\n requestPropertyId?: number;\n propertyKey: string;\n value: unknown;\n}\n\nexport interface RuntimeActionFormSource {\n getSubmitValues(): RuntimeActionFormValue[] | undefined;\n}\n\nexport function resolveActionLabel(action: RuntimeAction): string {\n const name = action.actionName;\n if (typeof name === 'string') {\n return name || action.actionKey;\n }\n return name?.display || action.actionKey;\n}\n","import { RuntimeAction } from './runtime-action.types';\n\nexport function buildActionPayload(\n action: RuntimeAction,\n formValue: Record<string, unknown> | undefined,\n externalResolvers: Record<string, () => unknown> = {},\n): Record<string, unknown> | undefined {\n const templatePayload = buildTemplatePayload(\n action,\n formValue,\n externalResolvers,\n );\n if (templatePayload) {\n return templatePayload;\n }\n\n const payloadKeys = action.payloadKeys ?? [];\n if (!payloadKeys.length) {\n return undefined;\n }\n\n const payload: Record<string, unknown> = {};\n\n for (const key of payloadKeys) {\n const formFieldValue = formValue?.[key];\n if (formFieldValue !== undefined) {\n payload[key] = normalizePayloadValue(key, formFieldValue);\n continue;\n }\n\n const externalValue = resolveExternalPayloadValue(\n key,\n action,\n externalResolvers,\n );\n if (externalValue !== undefined) {\n payload[key] = externalValue;\n continue;\n }\n\n const defaultValue = resolveDefaultPayloadValue(key);\n if (defaultValue !== undefined) {\n payload[key] = defaultValue;\n }\n }\n\n return Object.keys(payload).length ? payload : undefined;\n}\n\nfunction buildTemplatePayload(\n action: RuntimeAction,\n formValue: Record<string, unknown> | undefined,\n externalResolvers: Record<string, () => unknown>,\n): Record<string, unknown> | null {\n const template = action.payloadTemplate as Record<string, unknown> | null;\n if (!template || typeof template !== 'object') {\n return null;\n }\n\n const payload: Record<string, unknown> = {};\n const payloadKeys = action.payloadKeys ?? Object.keys(template);\n\n for (const key of payloadKeys) {\n if (key === 'fields') {\n payload[key] = resolveTemplateFieldsValue(action, template, formValue);\n continue;\n }\n\n const formFieldValue = formValue?.[key];\n if (formFieldValue !== undefined) {\n payload[key] = normalizePayloadValue(key, formFieldValue);\n continue;\n }\n\n const externalValue = resolveExternalPayloadValue(\n key,\n action,\n externalResolvers,\n );\n if (externalValue !== undefined) {\n payload[key] = externalValue;\n continue;\n }\n\n if (template[key] !== undefined) {\n payload[key] = template[key];\n continue;\n }\n\n const defaultValue = resolveDefaultPayloadValue(key);\n if (defaultValue !== undefined) {\n payload[key] = defaultValue;\n }\n }\n\n return Object.keys(payload).length ? payload : null;\n}\n\nfunction resolveExternalPayloadValue(\n key: string,\n action: RuntimeAction,\n externalResolvers: Record<string, () => unknown>,\n): unknown {\n const resolver = externalResolvers[key];\n if (resolver) {\n return resolver();\n }\n\n if (key === 'stepId') {\n return action.stepIds?.[0];\n }\n\n return undefined;\n}\n\nexport function normalizePayloadValue(key: string, value: unknown): unknown {\n if (key === 'attachments') {\n if (value == null) {\n return [];\n }\n return Array.isArray(value) ? value : [value];\n }\n\n return value;\n}\n\nexport function resolveDefaultPayloadValue(key: string): unknown {\n switch (key) {\n case 'attachments':\n return [];\n case 'delegatedUser':\n case 'note':\n case 'reason':\n return null;\n case 'values':\n return [];\n default:\n return undefined;\n }\n}\n\nexport function getMissingRequiredPayloadKeys(\n action: RuntimeAction,\n payload: Record<string, unknown> | undefined,\n): string[] {\n return (action.requiredPayloadKeys ?? []).filter((key) =>\n isMissingPayloadValue(payload?.[key]),\n );\n}\n\nexport function isMissingPayloadValue(value: unknown): boolean {\n if (value == null) {\n return true;\n }\n\n if (typeof value === 'string') {\n return value.trim().length === 0;\n }\n\n if (Array.isArray(value)) {\n return value.length === 0;\n }\n\n return false;\n}\n\nexport function normalizeHttpMethod(\n value: string | null | undefined,\n): string | null {\n if (!value || typeof value !== 'string') {\n return null;\n }\n\n const method = value.trim().toUpperCase();\n return method.length ? method : null;\n}\n\nexport function methodSupportsBody(method: string): boolean {\n return ['POST', 'PUT', 'PATCH', 'DELETE'].includes(method);\n}\n\nexport function buildRequestOptions(\n method: string,\n payload: Record<string, unknown> | undefined,\n): Record<string, unknown> {\n if (!payload || !methodSupportsBody(method)) {\n return { observe: 'body' };\n }\n\n return {\n body: payload,\n observe: 'body',\n };\n}\n\nexport function hasActionFormFields(action: RuntimeAction): boolean {\n return (\n (action.payloadKeys ?? []).some((key) =>\n ['delegatedUser', 'reason', 'note', 'attachments'].includes(key),\n ) || hasProgressTemplateField(action)\n );\n}\n\nexport function hasProgressTemplateField(action: RuntimeAction): boolean {\n const fields = (action.payloadTemplate as { fields?: unknown } | null)\n ?.fields;\n return (\n Array.isArray(fields) &&\n fields.some(\n (field) =>\n !!field &&\n typeof field === 'object' &&\n (field as { propertyKey?: string }).propertyKey === 'Progress',\n )\n );\n}\n\nfunction resolveTemplateFieldsValue(\n action: RuntimeAction,\n template: Record<string, unknown>,\n formValue: Record<string, unknown> | undefined,\n): unknown {\n const templateFields = template['fields'];\n if (!Array.isArray(templateFields)) {\n return formValue?.['fields'] ?? templateFields;\n }\n\n if (!hasProgressTemplateField(action)) {\n return formValue?.['fields'] ?? templateFields;\n }\n\n return templateFields.map((field) => {\n if (\n !field ||\n typeof field !== 'object' ||\n (field as { propertyKey?: string }).propertyKey !== 'Progress'\n ) {\n return field;\n }\n\n return {\n ...(field as Record<string, unknown>),\n value: formValue?.['progress'] ?? (field as { value?: unknown }).value,\n };\n });\n}\n","import { Injectable, signal } from '@angular/core';\n\nimport {\n RuntimeActionFormSource,\n RuntimeActionFormValue,\n} from './runtime-action.types';\n\n@Injectable()\nexport class RuntimeActionContextStore {\n private readonly formSource = signal<RuntimeActionFormSource | null>(null);\n\n setFormSource(source: RuntimeActionFormSource | null): void {\n this.formSource.set(source);\n }\n\n resolveFormValues(): RuntimeActionFormValue[] {\n const values = this.formSource()?.getSubmitValues();\n return Array.isArray(values)\n ? values.map((value) => ({\n requestPropertyId: value.requestPropertyId,\n propertyKey: value.propertyKey,\n value: value.value,\n }))\n : [];\n }\n}\n","import { HttpClient } from '@angular/common/http';\nimport { Injectable, InjectionToken, Type, inject } from '@angular/core';\nimport { ConfirmationService } from '@masterteam/components/confirmation';\nimport { ModalService } from '@masterteam/components/modal';\nimport { ToastService } from '@masterteam/components/toast';\nimport { firstValueFrom, map } from 'rxjs';\n\nimport {\n buildActionPayload,\n buildRequestOptions,\n getMissingRequiredPayloadKeys,\n hasActionFormFields,\n normalizeHttpMethod,\n} from './payload-builder';\nimport {\n RuntimeAction,\n RuntimeActionAfterSuccess,\n RuntimeActionExecuteOptions,\n RuntimeActionResult,\n resolveActionLabel,\n} from './runtime-action.types';\n\nexport const RUNTIME_ACTION_CONFIRM_DIALOG = new InjectionToken<Type<unknown>>(\n 'RUNTIME_ACTION_CONFIRM_DIALOG',\n);\n\n@Injectable({ providedIn: 'root' })\nexport class RuntimeActionRunner {\n private readonly http = inject(HttpClient);\n private readonly confirmation = inject(ConfirmationService);\n private readonly modal = inject(ModalService);\n private readonly toast = inject(ToastService);\n private readonly confirmDialogClass = inject(RUNTIME_ACTION_CONFIRM_DIALOG, {\n optional: true,\n });\n\n async execute(\n action: RuntimeAction,\n options: RuntimeActionExecuteOptions = {},\n ): Promise<RuntimeActionResult> {\n const method = normalizeHttpMethod(action.httpMethod);\n const url = action.url?.trim();\n\n if (!method || !url || action.isAvailable === false) {\n return cancelledOrError(\n action,\n 'error',\n new Error(notExecutableMessage(action)),\n );\n }\n\n let formValue: Record<string, unknown> | undefined;\n\n if (action.needConfirmation) {\n const dialogResult = await this.confirm(action);\n if (dialogResult === 'cancelled') {\n return {\n status: 'cancelled',\n actionKey: action.actionKey,\n afterSuccess: null,\n };\n }\n formValue = dialogResult ?? undefined;\n }\n\n let payload = buildActionPayload(\n action,\n formValue,\n options.externalPayloadResolvers ?? {},\n );\n\n if (options.transformPayload) {\n payload = options.transformPayload(payload, action);\n }\n\n const missing = getMissingRequiredPayloadKeys(action, payload);\n if (missing.length) {\n const message = `Cannot execute ${resolveActionLabel(action)}. Missing: ${missing.join(', ')}.`;\n if (!options.silent) {\n this.toast.error(message);\n }\n return {\n status: 'error',\n actionKey: action.actionKey,\n afterSuccess: null,\n error: new Error(message),\n };\n }\n\n return this.run(action, method, url, payload, options);\n }\n\n private async confirm(\n action: RuntimeAction,\n ): Promise<'cancelled' | Record<string, unknown> | null> {\n if (hasActionFormFields(action) && this.confirmDialogClass) {\n const ref = this.modal.openModal(this.confirmDialogClass, 'dialog', {\n header: resolveActionLabel(action),\n width: '40rem',\n dismissableMask: true,\n inputValues: { action },\n });\n\n const value = await firstValueFrom(ref.onClose);\n const formValue = value as Record<string, unknown> | null | undefined;\n if (formValue == null) {\n return 'cancelled';\n }\n return formValue;\n }\n\n return new Promise((resolve) => {\n const label = resolveActionLabel(action);\n this.confirmation.confirm({\n type: 'dialog',\n header: label,\n message: `Confirm ${label} for this item.`,\n acceptLabel: label,\n icon: 'alert.alert-triangle',\n accept: () => resolve(null),\n reject: () => resolve('cancelled'),\n });\n });\n }\n\n private async run(\n action: RuntimeAction,\n method: string,\n url: string,\n payload: Record<string, unknown> | undefined,\n options: RuntimeActionExecuteOptions,\n ): Promise<RuntimeActionResult> {\n const fallbackErrorMessage = `Failed to execute ${resolveActionLabel(action)}.`;\n\n try {\n const response = await firstValueFrom(\n this.http\n .request<unknown>(method, url, buildRequestOptions(method, payload))\n .pipe(\n map((res) => ensureSuccessfulEnvelope(res, fallbackErrorMessage)),\n ),\n );\n\n if (options.successMessage && !options.silent) {\n this.toast.success(options.successMessage(response, action));\n }\n\n return {\n status: 'success',\n actionKey: action.actionKey,\n afterSuccess: resolveAfterSuccess(action, options.defaultAfterSuccess),\n response,\n };\n } catch (error) {\n const message =\n options.errorMessage?.(error, action) ??\n resolveHttpErrorMessage(error, fallbackErrorMessage);\n\n if (!options.silent) {\n this.toast.error(message);\n }\n\n return {\n status: 'error',\n actionKey: action.actionKey,\n afterSuccess: null,\n error,\n };\n }\n }\n}\n\nfunction notExecutableMessage(action: RuntimeAction): string {\n if (action.isAvailable === false) {\n return `Action ${action.actionKey} is not available.`;\n }\n if (!action.url) {\n return `Action ${action.actionKey} has no url.`;\n }\n return `Action ${action.actionKey} has no http method.`;\n}\n\nfunction cancelledOrError(\n action: RuntimeAction,\n status: 'error' | 'cancelled',\n error?: unknown,\n): RuntimeActionResult {\n return {\n status,\n actionKey: action.actionKey,\n afterSuccess: null,\n error,\n };\n}\n\nfunction resolveAfterSuccess(\n action: RuntimeAction,\n fallback: RuntimeActionAfterSuccess | undefined,\n): RuntimeActionAfterSuccess {\n if (action.afterSuccess === 'close' || action.afterSuccess === 'refresh') {\n return action.afterSuccess;\n }\n return fallback ?? 'refresh';\n}\n\nfunction ensureSuccessfulEnvelope(\n response: unknown,\n fallback: string,\n): unknown {\n if (!response || typeof response !== 'object') {\n return response;\n }\n\n const envelope = response as { code?: number };\n if (typeof envelope.code === 'number' && envelope.code !== 1) {\n throw new Error(resolveEnvelopeErrorMessage(response, fallback));\n }\n return response;\n}\n\nfunction resolveEnvelopeErrorMessage(\n response: unknown,\n fallback: string,\n): string {\n if (!response || typeof response !== 'object') {\n return fallback;\n }\n const envelope = response as {\n message?: string | null;\n errors?: { message?: string } | null;\n };\n return envelope.errors?.message ?? envelope.message ?? fallback;\n}\n\nfunction resolveHttpErrorMessage(error: unknown, fallback: string): string {\n if (!error || typeof error !== 'object') {\n return fallback;\n }\n const httpError = error as {\n message?: string;\n error?: { message?: string | null } | null;\n };\n return httpError.error?.message ?? httpError.message ?? fallback;\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"masterteam-components-runtime-action.mjs","sources":["../../../../packages/masterteam/components/runtime-action/runtime-action.types.ts","../../../../packages/masterteam/components/runtime-action/payload-builder.ts","../../../../packages/masterteam/components/runtime-action/runtime-action-context.store.ts","../../../../packages/masterteam/components/runtime-action/runtime-action.runner.ts","../../../../packages/masterteam/components/runtime-action/masterteam-components-runtime-action.ts"],"sourcesContent":["export interface RuntimeActionTranslatable {\n display?: string;\n en?: string;\n ar?: string;\n}\n\nexport type RuntimeActionAfterSuccess = 'refresh' | 'close';\n\nexport interface RuntimeActionReason {\n source?: string;\n code?: string;\n message?: string;\n blocking?: boolean;\n details?: string | null;\n ruleKey?: string | null;\n requestId?: number | null;\n requestStatus?: string | null;\n requestSchemaId?: number | null;\n relatedRequestIds?: number[];\n}\n\nexport interface RuntimeAction {\n actionKey: string;\n actionName?: RuntimeActionTranslatable | string | null;\n httpMethod?: string | null;\n url?: string | null;\n isAvailable?: boolean;\n afterSuccess?: RuntimeActionAfterSuccess | null;\n stepIds?: Array<number | string>;\n needConfirmation?: boolean;\n payloadKeys?: string[];\n requiredPayloadKeys?: string[];\n payloadTemplate?: Record<string, unknown> | null;\n formId?: string | number | null;\n\n targetType?: string;\n targetId?: number;\n moduleKey?: string;\n operationKey?: string;\n primaryReasonCode?: string | null;\n reasons?: RuntimeActionReason[];\n}\n\nexport type RuntimeActionStatus = 'success' | 'error' | 'cancelled';\n\nexport interface RuntimeActionResult {\n status: RuntimeActionStatus;\n actionKey: string;\n afterSuccess: RuntimeActionAfterSuccess | null;\n response?: unknown;\n error?: unknown;\n}\n\nexport interface RuntimeActionExecuteOptions {\n externalPayloadResolvers?: Record<string, () => unknown>;\n defaultAfterSuccess?: RuntimeActionAfterSuccess;\n successMessage?: (response: unknown, action: RuntimeAction) => string;\n errorMessage?: (error: unknown, action: RuntimeAction) => string;\n transformPayload?: (\n payload: Record<string, unknown> | undefined,\n action: RuntimeAction,\n ) => Record<string, unknown> | undefined;\n silent?: boolean;\n}\n\nexport interface RuntimeActionFormValue {\n requestPropertyId?: number;\n propertyKey: string;\n value: unknown;\n}\n\nexport interface RuntimeActionFormSource {\n getSubmitValues(): RuntimeActionFormValue[] | undefined;\n}\n\nexport function resolveActionLabel(action: RuntimeAction): string {\n const name = action.actionName;\n if (typeof name === 'string') {\n return name || action.actionKey;\n }\n return name?.display || action.actionKey;\n}\n","import { RuntimeAction } from './runtime-action.types';\n\nexport function buildActionPayload(\n action: RuntimeAction,\n formValue: Record<string, unknown> | undefined,\n externalResolvers: Record<string, () => unknown> = {},\n): Record<string, unknown> | undefined {\n const templatePayload = buildTemplatePayload(\n action,\n formValue,\n externalResolvers,\n );\n if (templatePayload) {\n return templatePayload;\n }\n\n const payloadKeys = action.payloadKeys ?? [];\n if (!payloadKeys.length) {\n return undefined;\n }\n\n const payload: Record<string, unknown> = {};\n\n for (const key of payloadKeys) {\n const formFieldValue = formValue?.[key];\n if (formFieldValue !== undefined) {\n payload[key] = normalizePayloadValue(key, formFieldValue);\n continue;\n }\n\n const externalValue = resolveExternalPayloadValue(\n key,\n action,\n externalResolvers,\n );\n if (externalValue !== undefined) {\n payload[key] = externalValue;\n continue;\n }\n\n const defaultValue = resolveDefaultPayloadValue(key);\n if (defaultValue !== undefined) {\n payload[key] = defaultValue;\n }\n }\n\n return Object.keys(payload).length ? payload : undefined;\n}\n\nfunction buildTemplatePayload(\n action: RuntimeAction,\n formValue: Record<string, unknown> | undefined,\n externalResolvers: Record<string, () => unknown>,\n): Record<string, unknown> | null {\n const template = action.payloadTemplate as Record<string, unknown> | null;\n if (!template || typeof template !== 'object') {\n return null;\n }\n\n const payload: Record<string, unknown> = {};\n const payloadKeys = action.payloadKeys ?? Object.keys(template);\n\n for (const key of payloadKeys) {\n if (key === 'fields') {\n payload[key] = resolveTemplateFieldsValue(action, template, formValue);\n continue;\n }\n\n const formFieldValue = formValue?.[key];\n if (formFieldValue !== undefined) {\n payload[key] = normalizePayloadValue(key, formFieldValue);\n continue;\n }\n\n const externalValue = resolveExternalPayloadValue(\n key,\n action,\n externalResolvers,\n );\n if (externalValue !== undefined) {\n payload[key] = externalValue;\n continue;\n }\n\n if (template[key] !== undefined) {\n payload[key] = template[key];\n continue;\n }\n\n const defaultValue = resolveDefaultPayloadValue(key);\n if (defaultValue !== undefined) {\n payload[key] = defaultValue;\n }\n }\n\n return Object.keys(payload).length ? payload : null;\n}\n\nfunction resolveExternalPayloadValue(\n key: string,\n action: RuntimeAction,\n externalResolvers: Record<string, () => unknown>,\n): unknown {\n const resolver = externalResolvers[key];\n if (resolver) {\n return resolver();\n }\n\n if (key === 'stepId') {\n return action.stepIds?.[0];\n }\n\n return undefined;\n}\n\nexport function normalizePayloadValue(key: string, value: unknown): unknown {\n if (key === 'attachments') {\n if (value == null) {\n return [];\n }\n return Array.isArray(value) ? value : [value];\n }\n\n return value;\n}\n\nexport function resolveDefaultPayloadValue(key: string): unknown {\n switch (key) {\n case 'attachments':\n return [];\n case 'delegatedUser':\n case 'note':\n case 'reason':\n return null;\n case 'values':\n return [];\n default:\n return undefined;\n }\n}\n\nexport function getMissingRequiredPayloadKeys(\n action: RuntimeAction,\n payload: Record<string, unknown> | undefined,\n): string[] {\n return (action.requiredPayloadKeys ?? []).filter((key) =>\n isMissingPayloadValue(payload?.[key]),\n );\n}\n\nexport function isMissingPayloadValue(value: unknown): boolean {\n if (value == null) {\n return true;\n }\n\n if (typeof value === 'string') {\n return value.trim().length === 0;\n }\n\n if (Array.isArray(value)) {\n return value.length === 0;\n }\n\n return false;\n}\n\nexport function normalizeHttpMethod(\n value: string | null | undefined,\n): string | null {\n if (!value || typeof value !== 'string') {\n return null;\n }\n\n const method = value.trim().toUpperCase();\n return method.length ? method : null;\n}\n\nexport function methodSupportsBody(method: string): boolean {\n return ['POST', 'PUT', 'PATCH', 'DELETE'].includes(method);\n}\n\nexport function buildRequestOptions(\n method: string,\n payload: Record<string, unknown> | undefined,\n): Record<string, unknown> {\n if (!payload || !methodSupportsBody(method)) {\n return { observe: 'body' };\n }\n\n return {\n body: payload,\n observe: 'body',\n };\n}\n\nexport function hasActionFormFields(action: RuntimeAction): boolean {\n return (\n (action.payloadKeys ?? []).some((key) =>\n ['delegatedUser', 'reason', 'note', 'attachments'].includes(key),\n ) || hasProgressTemplateField(action)\n );\n}\n\nexport function hasProgressTemplateField(action: RuntimeAction): boolean {\n const fields = (action.payloadTemplate as { fields?: unknown } | null)\n ?.fields;\n return (\n Array.isArray(fields) &&\n fields.some(\n (field) =>\n !!field &&\n typeof field === 'object' &&\n (field as { propertyKey?: string }).propertyKey === 'Progress',\n )\n );\n}\n\nfunction resolveTemplateFieldsValue(\n action: RuntimeAction,\n template: Record<string, unknown>,\n formValue: Record<string, unknown> | undefined,\n): unknown {\n const templateFields = template['fields'];\n if (!Array.isArray(templateFields)) {\n return formValue?.['fields'] ?? templateFields;\n }\n\n if (!hasProgressTemplateField(action)) {\n return formValue?.['fields'] ?? templateFields;\n }\n\n return templateFields.map((field) => {\n if (\n !field ||\n typeof field !== 'object' ||\n (field as { propertyKey?: string }).propertyKey !== 'Progress'\n ) {\n return field;\n }\n\n return {\n ...(field as Record<string, unknown>),\n value: formValue?.['progress'] ?? (field as { value?: unknown }).value,\n };\n });\n}\n","import { Injectable, signal } from '@angular/core';\n\nimport {\n RuntimeActionFormSource,\n RuntimeActionFormValue,\n} from './runtime-action.types';\n\n@Injectable()\nexport class RuntimeActionContextStore {\n private readonly formSource = signal<RuntimeActionFormSource | null>(null);\n\n setFormSource(source: RuntimeActionFormSource | null): void {\n this.formSource.set(source);\n }\n\n resolveFormValues(): RuntimeActionFormValue[] {\n const values = this.formSource()?.getSubmitValues();\n return Array.isArray(values)\n ? values.map((value) => ({\n requestPropertyId: value.requestPropertyId,\n propertyKey: value.propertyKey,\n value: value.value,\n }))\n : [];\n }\n}\n","import { HttpClient } from '@angular/common/http';\r\nimport { Injectable, InjectionToken, Type, inject } from '@angular/core';\r\nimport { TranslocoService } from '@jsverse/transloco';\r\nimport { ConfirmationService } from '@masterteam/components/confirmation';\r\nimport { ModalService } from '@masterteam/components/modal';\r\nimport { ToastService } from '@masterteam/components/toast';\r\nimport { firstValueFrom, map } from 'rxjs';\r\n\r\nimport {\r\n buildActionPayload,\r\n buildRequestOptions,\r\n getMissingRequiredPayloadKeys,\r\n hasActionFormFields,\r\n normalizeHttpMethod,\r\n} from './payload-builder';\r\nimport {\r\n RuntimeAction,\r\n RuntimeActionAfterSuccess,\r\n RuntimeActionExecuteOptions,\r\n RuntimeActionResult,\r\n resolveActionLabel,\r\n} from './runtime-action.types';\r\n\r\nexport const RUNTIME_ACTION_CONFIRM_DIALOG = new InjectionToken<Type<unknown>>(\r\n 'RUNTIME_ACTION_CONFIRM_DIALOG',\r\n);\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class RuntimeActionRunner {\r\n private readonly http = inject(HttpClient);\r\n private readonly confirmation = inject(ConfirmationService);\r\n private readonly modal = inject(ModalService);\r\n private readonly toast = inject(ToastService);\r\n private readonly transloco = inject(TranslocoService);\r\n private readonly confirmDialogClass = inject(RUNTIME_ACTION_CONFIRM_DIALOG, {\r\n optional: true,\r\n });\r\n\r\n async execute(\r\n action: RuntimeAction,\r\n options: RuntimeActionExecuteOptions = {},\r\n ): Promise<RuntimeActionResult> {\r\n const method = normalizeHttpMethod(action.httpMethod);\r\n const url = action.url?.trim();\r\n\r\n if (!method || !url || action.isAvailable === false) {\r\n return cancelledOrError(\r\n action,\r\n 'error',\r\n new Error(this.notExecutableMessage(action)),\r\n );\r\n }\r\n\r\n let formValue: Record<string, unknown> | undefined;\r\n\r\n if (action.needConfirmation) {\r\n const dialogResult = await this.confirm(action);\r\n if (dialogResult === 'cancelled') {\r\n return {\r\n status: 'cancelled',\r\n actionKey: action.actionKey,\r\n afterSuccess: null,\r\n };\r\n }\r\n formValue = dialogResult ?? undefined;\r\n }\r\n\r\n let payload = buildActionPayload(\r\n action,\r\n formValue,\r\n options.externalPayloadResolvers ?? {},\r\n );\r\n\r\n if (options.transformPayload) {\r\n payload = options.transformPayload(payload, action);\r\n }\r\n\r\n const missing = getMissingRequiredPayloadKeys(action, payload);\r\n if (missing.length) {\r\n const message = this.transloco.translate(\r\n 'components.runtimeAction.missingArgs',\r\n { action: resolveActionLabel(action), missing: missing.join(', ') },\r\n );\r\n if (!options.silent) {\r\n this.toast.error(message);\r\n }\r\n return {\r\n status: 'error',\r\n actionKey: action.actionKey,\r\n afterSuccess: null,\r\n error: new Error(message),\r\n };\r\n }\r\n\r\n return this.run(action, method, url, payload, options);\r\n }\r\n\r\n private async confirm(\r\n action: RuntimeAction,\r\n ): Promise<'cancelled' | Record<string, unknown> | null> {\r\n if (hasActionFormFields(action) && this.confirmDialogClass) {\r\n const ref = this.modal.openModal(this.confirmDialogClass, 'dialog', {\r\n header: resolveActionLabel(action),\r\n width: '40rem',\r\n dismissableMask: true,\r\n inputValues: { action },\r\n });\r\n\r\n const value = await firstValueFrom(ref.onClose);\r\n const formValue = value as Record<string, unknown> | null | undefined;\r\n if (formValue == null) {\r\n return 'cancelled';\r\n }\r\n return formValue;\r\n }\r\n\r\n return new Promise((resolve) => {\r\n const label = resolveActionLabel(action);\r\n this.confirmation.confirm({\r\n type: 'dialog',\r\n header: label,\r\n message: this.transloco.translate(\r\n 'components.runtimeAction.confirmDefault',\r\n { action: label },\r\n ),\r\n acceptLabel: label,\r\n icon: 'alert.alert-triangle',\r\n accept: () => resolve(null),\r\n reject: () => resolve('cancelled'),\r\n });\r\n });\r\n }\r\n\r\n private async run(\r\n action: RuntimeAction,\r\n method: string,\r\n url: string,\r\n payload: Record<string, unknown> | undefined,\r\n options: RuntimeActionExecuteOptions,\r\n ): Promise<RuntimeActionResult> {\r\n const fallbackErrorMessage = this.transloco.translate(\r\n 'components.runtimeAction.executeFailed',\r\n { action: resolveActionLabel(action) },\r\n );\r\n\r\n try {\r\n const response = await firstValueFrom(\r\n this.http\r\n .request<unknown>(method, url, buildRequestOptions(method, payload))\r\n .pipe(\r\n map((res) => ensureSuccessfulEnvelope(res, fallbackErrorMessage)),\r\n ),\r\n );\r\n\r\n if (options.successMessage && !options.silent) {\r\n this.toast.success(options.successMessage(response, action));\r\n }\r\n\r\n return {\r\n status: 'success',\r\n actionKey: action.actionKey,\r\n afterSuccess: resolveAfterSuccess(action, options.defaultAfterSuccess),\r\n response,\r\n };\r\n } catch (error) {\r\n const message =\r\n options.errorMessage?.(error, action) ??\r\n resolveHttpErrorMessage(error, fallbackErrorMessage);\r\n\r\n if (!options.silent) {\r\n this.toast.error(message);\r\n }\r\n\r\n return {\r\n status: 'error',\r\n actionKey: action.actionKey,\r\n afterSuccess: null,\r\n error,\r\n };\r\n }\r\n }\r\n\r\n private notExecutableMessage(action: RuntimeAction): string {\r\n if (action.isAvailable === false) {\r\n return this.transloco.translate('components.runtimeAction.notAvailable', {\r\n action: action.actionKey,\r\n });\r\n }\r\n if (!action.url) {\r\n return this.transloco.translate('components.runtimeAction.noUrl', {\r\n action: action.actionKey,\r\n });\r\n }\r\n return this.transloco.translate('components.runtimeAction.noHttpMethod', {\r\n action: action.actionKey,\r\n });\r\n }\r\n}\r\n\r\nfunction cancelledOrError(\r\n action: RuntimeAction,\r\n status: 'error' | 'cancelled',\r\n error?: unknown,\r\n): RuntimeActionResult {\r\n return {\r\n status,\r\n actionKey: action.actionKey,\r\n afterSuccess: null,\r\n error,\r\n };\r\n}\r\n\r\nfunction resolveAfterSuccess(\r\n action: RuntimeAction,\r\n fallback: RuntimeActionAfterSuccess | undefined,\r\n): RuntimeActionAfterSuccess {\r\n if (action.afterSuccess === 'close' || action.afterSuccess === 'refresh') {\r\n return action.afterSuccess;\r\n }\r\n return fallback ?? 'refresh';\r\n}\r\n\r\nfunction ensureSuccessfulEnvelope(\r\n response: unknown,\r\n fallback: string,\r\n): unknown {\r\n if (!response || typeof response !== 'object') {\r\n return response;\r\n }\r\n\r\n const envelope = response as { code?: number };\r\n if (typeof envelope.code === 'number' && envelope.code !== 1) {\r\n throw new Error(resolveEnvelopeErrorMessage(response, fallback));\r\n }\r\n return response;\r\n}\r\n\r\nfunction resolveEnvelopeErrorMessage(\r\n response: unknown,\r\n fallback: string,\r\n): string {\r\n if (!response || typeof response !== 'object') {\r\n return fallback;\r\n }\r\n const envelope = response as {\r\n message?: string | null;\r\n errors?: { message?: string } | null;\r\n };\r\n return envelope.errors?.message ?? envelope.message ?? fallback;\r\n}\r\n\r\nfunction resolveHttpErrorMessage(error: unknown, fallback: string): string {\r\n if (!error || typeof error !== 'object') {\r\n return fallback;\r\n }\r\n const httpError = error as {\r\n message?: string;\r\n error?: { message?: string | null } | null;\r\n };\r\n return httpError.error?.message ?? httpError.message ?? fallback;\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
2
|
import { input, booleanAttribute, signal, output, Component } from '@angular/core';
|
|
3
|
+
import { TranslocoPipe } from '@jsverse/transloco';
|
|
3
4
|
import { Icon } from '@masterteam/icons';
|
|
4
5
|
import { RouterLinkActive, RouterLink } from '@angular/router';
|
|
5
6
|
import { Tooltip } from '@masterteam/components/tooltip';
|
|
@@ -21,11 +22,11 @@ class Sidebar {
|
|
|
21
22
|
this.expandedChange.emit(this.expanded());
|
|
22
23
|
}
|
|
23
24
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: Sidebar, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
24
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.8", type: Sidebar, isStandalone: true, selector: "mt-sidebar", inputs: { items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: false, transformFunction: null }, logo: { classPropertyName: "logo", publicName: "logo", isSignal: true, isRequired: false, transformFunction: null }, logoLink: { classPropertyName: "logoLink", publicName: "logoLink", isSignal: true, isRequired: false, transformFunction: null }, title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, subTitle: { classPropertyName: "subTitle", publicName: "subTitle", isSignal: true, isRequired: false, transformFunction: null }, bgColor: { classPropertyName: "bgColor", publicName: "bgColor", isSignal: true, isRequired: false, transformFunction: null }, bgImage: { classPropertyName: "bgImage", publicName: "bgImage", isSignal: true, isRequired: false, transformFunction: null }, bgRepeat: { classPropertyName: "bgRepeat", publicName: "bgRepeat", isSignal: true, isRequired: false, transformFunction: null }, iconsColor: { classPropertyName: "iconsColor", publicName: "iconsColor", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { expandedChange: "expandedChange" }, ngImport: i0, template: "<div\r\n class=\"flex h-full min-h-0 flex-col overflow-hidden border-e-1 border-surface-300 bg-surface-200 transition-all duration-400 ease-in-out dark:bg-surface-800\"\r\n [style.width]=\"expanded() ? '18rem' : '4rem'\"\r\n>\r\n <div\r\n class=\"flex h-full min-h-0 flex-col gap-3 px-2 py-4\"\r\n [style.backgroundColor]=\"bgColor()\"\r\n [style.backgroundImage]=\"bgImage() ? 'url(' + bgImage() + ')' : null\"\r\n [style.backgroundSize]=\"bgImage() && !bgRepeat() ? 'cover' : null\"\r\n [style.backgroundPosition]=\"bgImage() && !bgRepeat() ? 'center' : null\"\r\n [class.bg-no-repeat]=\"!bgRepeat()\"\r\n [class.bg-repeat]=\"bgRepeat()\"\r\n >\r\n <!-- Toggle Button & Branding -->\r\n <div class=\"flex shrink-0 items-center gap-2\">\r\n <button\r\n type=\"button\"\r\n size=\"large\"\r\n class=\"flex items-center justify-center w-[47px] h-[40px] hover:bg-surface-100 dark:hover:bg-surface-900 transition-colors rounded-xl cursor-pointer shrink-0\"\r\n [style.color]=\"iconsColor()\"\r\n (click)=\"toggleSidebar()\"\r\n >\r\n <mt-icon\r\n icon=\"general.menu-01\"\r\n class=\"text-lg transition-transform duration-400 ease-in-out\"\r\n [class.rotate-180]=\"expanded()\"\r\n [style.--mt-icon-prev-width]=\"'20px'\"\r\n [style.--mt-icon-prev-height]=\"'20px'\"\r\n />\r\n </button>\r\n\r\n @if (logo() || title()) {\r\n <div\r\n class=\"flex items-center gap-2 overflow-hidden transition-all duration-400 ease-in-out\"\r\n [class.max-w-0]=\"!expanded()\"\r\n [class.opacity-0]=\"!expanded()\"\r\n [class.max-w-xs]=\"expanded()\"\r\n [class.opacity-100]=\"expanded()\"\r\n >\r\n @if (logo()) {\r\n <img\r\n [src]=\"logo()\"\r\n alt=\"
|
|
25
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.8", type: Sidebar, isStandalone: true, selector: "mt-sidebar", inputs: { items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: false, transformFunction: null }, logo: { classPropertyName: "logo", publicName: "logo", isSignal: true, isRequired: false, transformFunction: null }, logoLink: { classPropertyName: "logoLink", publicName: "logoLink", isSignal: true, isRequired: false, transformFunction: null }, title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, subTitle: { classPropertyName: "subTitle", publicName: "subTitle", isSignal: true, isRequired: false, transformFunction: null }, bgColor: { classPropertyName: "bgColor", publicName: "bgColor", isSignal: true, isRequired: false, transformFunction: null }, bgImage: { classPropertyName: "bgImage", publicName: "bgImage", isSignal: true, isRequired: false, transformFunction: null }, bgRepeat: { classPropertyName: "bgRepeat", publicName: "bgRepeat", isSignal: true, isRequired: false, transformFunction: null }, iconsColor: { classPropertyName: "iconsColor", publicName: "iconsColor", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { expandedChange: "expandedChange" }, ngImport: i0, template: "<div\r\n class=\"flex h-full min-h-0 flex-col overflow-hidden border-e-1 border-surface-300 bg-surface-200 transition-all duration-400 ease-in-out dark:bg-surface-800\"\r\n [style.width]=\"expanded() ? '18rem' : '4rem'\"\r\n>\r\n <div\r\n class=\"flex h-full min-h-0 flex-col gap-3 px-2 py-4\"\r\n [style.backgroundColor]=\"bgColor()\"\r\n [style.backgroundImage]=\"bgImage() ? 'url(' + bgImage() + ')' : null\"\r\n [style.backgroundSize]=\"bgImage() && !bgRepeat() ? 'cover' : null\"\r\n [style.backgroundPosition]=\"bgImage() && !bgRepeat() ? 'center' : null\"\r\n [class.bg-no-repeat]=\"!bgRepeat()\"\r\n [class.bg-repeat]=\"bgRepeat()\"\r\n >\r\n <!-- Toggle Button & Branding -->\r\n <div class=\"flex shrink-0 items-center gap-2\">\r\n <button\r\n type=\"button\"\r\n size=\"large\"\r\n class=\"flex items-center justify-center w-[47px] h-[40px] hover:bg-surface-100 dark:hover:bg-surface-900 transition-colors rounded-xl cursor-pointer shrink-0\"\r\n [style.color]=\"iconsColor()\"\r\n (click)=\"toggleSidebar()\"\r\n >\r\n <mt-icon\r\n icon=\"general.menu-01\"\r\n class=\"text-lg transition-transform duration-400 ease-in-out\"\r\n [class.rotate-180]=\"expanded()\"\r\n [style.--mt-icon-prev-width]=\"'20px'\"\r\n [style.--mt-icon-prev-height]=\"'20px'\"\r\n />\r\n </button>\r\n\r\n @if (logo() || title()) {\r\n <div\r\n class=\"flex items-center gap-2 overflow-hidden transition-all duration-400 ease-in-out\"\r\n [class.max-w-0]=\"!expanded()\"\r\n [class.opacity-0]=\"!expanded()\"\r\n [class.max-w-xs]=\"expanded()\"\r\n [class.opacity-100]=\"expanded()\"\r\n >\r\n @if (logo()) {\r\n <img\r\n [src]=\"logo()\"\r\n [alt]=\"'components.sidebar.logoAlt' | transloco\"\r\n class=\"h-8 shrink-0\"\r\n [routerLink]=\"logoLink()\"\r\n [class.cursor-pointer]=\"logoLink()\"\r\n />\r\n }\r\n @if (logo() && (title() || subTitle())) {\r\n <div\r\n class=\"h-6 w-[1px] bg-current opacity-30 shrink-0\"\r\n [style.color]=\"iconsColor()\"\r\n ></div>\r\n }\r\n @if (title() || subTitle()) {\r\n <div\r\n class=\"flex flex-col gap-0.5 min-w-0\"\r\n [style.color]=\"iconsColor()\"\r\n >\r\n <span class=\"text-sm font-semibold truncate\">{{ title() }}</span>\r\n @if (subTitle()) {\r\n <span class=\"text-xs opacity-70 truncate\">{{\r\n subTitle()\r\n }}</span>\r\n }\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n\r\n <div\r\n class=\"mt-sidebar-menu flex min-h-0 flex-1 flex-col gap-1 overflow-x-hidden overflow-y-auto overscroll-contain\"\r\n [class.mt-sidebar-menu-collapsed]=\"!expanded()\"\r\n [class.pr-1]=\"expanded()\"\r\n [class.pr-px]=\"!expanded()\"\r\n >\r\n @for (item of items(); track item.id) {\r\n <a\r\n [routerLink]=\"item.routerLink\"\r\n routerLinkActive=\"bg-primary-50 dark:bg-primary-900\"\r\n #rla=\"routerLinkActive\"\r\n class=\"flex items-center gap-3 h-[47px] min-w-[47px] shrink-0 dark:hover:bg-surface-900 hover:bg-primary-50 transition-colors rounded-md overflow-hidden\"\r\n mtTooltip=\"{{ item.title }}\"\r\n [style.color]=\"rla.isActive ? 'var(--p-primary-500)' : iconsColor()\"\r\n >\r\n <div class=\"px-4\">\r\n <mt-icon\r\n [icon]=\"item.icon\"\r\n class=\"shrink-0\"\r\n [style.--mt-icon-prev-width]=\"'20px'\"\r\n [style.--mt-icon-prev-height]=\"'20px'\"\r\n />\r\n </div>\r\n <div\r\n class=\"whitespace-nowrap text-sm font-medium transition-all duration-400 ease-in-out overflow-hidden\"\r\n [class.opacity-0]=\"!expanded()\"\r\n [class.max-w-xs]=\"expanded()\"\r\n [class.opacity-100]=\"expanded()\"\r\n >\r\n {{ item.title }}\r\n </div>\r\n </a>\r\n }\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [":host{display:block;height:100%;min-height:0}.mt-sidebar-menu{scrollbar-width:thin;scrollbar-color:var(--p-surface-400) transparent}.mt-sidebar-menu::-webkit-scrollbar{width:6px}.mt-sidebar-menu::-webkit-scrollbar-track{background:transparent}.mt-sidebar-menu::-webkit-scrollbar-thumb{border-radius:9999px;background:color-mix(in srgb,var(--p-surface-500) 58%,transparent)}.mt-sidebar-menu::-webkit-scrollbar-thumb:hover{background:color-mix(in srgb,var(--p-surface-600) 72%,transparent)}.mt-sidebar-menu-collapsed{scrollbar-color:var(--p-surface-500) transparent}.mt-sidebar-menu-collapsed::-webkit-scrollbar{width:2px}.mt-sidebar-menu-collapsed::-webkit-scrollbar-thumb{background:color-mix(in srgb,var(--p-surface-600) 82%,transparent)}\n"], dependencies: [{ kind: "directive", type: RouterLinkActive, selector: "[routerLinkActive]", inputs: ["routerLinkActiveOptions", "ariaCurrentWhenActive", "routerLinkActive"], outputs: ["isActiveChange"], exportAs: ["routerLinkActive"] }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: Icon, selector: "mt-icon", inputs: ["icon"] }, { kind: "directive", type: Tooltip, selector: "[mtTooltip]" }, { kind: "pipe", type: TranslocoPipe, name: "transloco" }] });
|
|
25
26
|
}
|
|
26
27
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: Sidebar, decorators: [{
|
|
27
28
|
type: Component,
|
|
28
|
-
args: [{ selector: 'mt-sidebar', standalone: true, imports: [RouterLinkActive, RouterLink, Icon, Tooltip], template: "<div\r\n class=\"flex h-full min-h-0 flex-col overflow-hidden border-e-1 border-surface-300 bg-surface-200 transition-all duration-400 ease-in-out dark:bg-surface-800\"\r\n [style.width]=\"expanded() ? '18rem' : '4rem'\"\r\n>\r\n <div\r\n class=\"flex h-full min-h-0 flex-col gap-3 px-2 py-4\"\r\n [style.backgroundColor]=\"bgColor()\"\r\n [style.backgroundImage]=\"bgImage() ? 'url(' + bgImage() + ')' : null\"\r\n [style.backgroundSize]=\"bgImage() && !bgRepeat() ? 'cover' : null\"\r\n [style.backgroundPosition]=\"bgImage() && !bgRepeat() ? 'center' : null\"\r\n [class.bg-no-repeat]=\"!bgRepeat()\"\r\n [class.bg-repeat]=\"bgRepeat()\"\r\n >\r\n <!-- Toggle Button & Branding -->\r\n <div class=\"flex shrink-0 items-center gap-2\">\r\n <button\r\n type=\"button\"\r\n size=\"large\"\r\n class=\"flex items-center justify-center w-[47px] h-[40px] hover:bg-surface-100 dark:hover:bg-surface-900 transition-colors rounded-xl cursor-pointer shrink-0\"\r\n [style.color]=\"iconsColor()\"\r\n (click)=\"toggleSidebar()\"\r\n >\r\n <mt-icon\r\n icon=\"general.menu-01\"\r\n class=\"text-lg transition-transform duration-400 ease-in-out\"\r\n [class.rotate-180]=\"expanded()\"\r\n [style.--mt-icon-prev-width]=\"'20px'\"\r\n [style.--mt-icon-prev-height]=\"'20px'\"\r\n />\r\n </button>\r\n\r\n @if (logo() || title()) {\r\n <div\r\n class=\"flex items-center gap-2 overflow-hidden transition-all duration-400 ease-in-out\"\r\n [class.max-w-0]=\"!expanded()\"\r\n [class.opacity-0]=\"!expanded()\"\r\n [class.max-w-xs]=\"expanded()\"\r\n [class.opacity-100]=\"expanded()\"\r\n >\r\n @if (logo()) {\r\n <img\r\n [src]=\"logo()\"\r\n alt=\"
|
|
29
|
+
args: [{ selector: 'mt-sidebar', standalone: true, imports: [RouterLinkActive, RouterLink, Icon, Tooltip, TranslocoPipe], template: "<div\r\n class=\"flex h-full min-h-0 flex-col overflow-hidden border-e-1 border-surface-300 bg-surface-200 transition-all duration-400 ease-in-out dark:bg-surface-800\"\r\n [style.width]=\"expanded() ? '18rem' : '4rem'\"\r\n>\r\n <div\r\n class=\"flex h-full min-h-0 flex-col gap-3 px-2 py-4\"\r\n [style.backgroundColor]=\"bgColor()\"\r\n [style.backgroundImage]=\"bgImage() ? 'url(' + bgImage() + ')' : null\"\r\n [style.backgroundSize]=\"bgImage() && !bgRepeat() ? 'cover' : null\"\r\n [style.backgroundPosition]=\"bgImage() && !bgRepeat() ? 'center' : null\"\r\n [class.bg-no-repeat]=\"!bgRepeat()\"\r\n [class.bg-repeat]=\"bgRepeat()\"\r\n >\r\n <!-- Toggle Button & Branding -->\r\n <div class=\"flex shrink-0 items-center gap-2\">\r\n <button\r\n type=\"button\"\r\n size=\"large\"\r\n class=\"flex items-center justify-center w-[47px] h-[40px] hover:bg-surface-100 dark:hover:bg-surface-900 transition-colors rounded-xl cursor-pointer shrink-0\"\r\n [style.color]=\"iconsColor()\"\r\n (click)=\"toggleSidebar()\"\r\n >\r\n <mt-icon\r\n icon=\"general.menu-01\"\r\n class=\"text-lg transition-transform duration-400 ease-in-out\"\r\n [class.rotate-180]=\"expanded()\"\r\n [style.--mt-icon-prev-width]=\"'20px'\"\r\n [style.--mt-icon-prev-height]=\"'20px'\"\r\n />\r\n </button>\r\n\r\n @if (logo() || title()) {\r\n <div\r\n class=\"flex items-center gap-2 overflow-hidden transition-all duration-400 ease-in-out\"\r\n [class.max-w-0]=\"!expanded()\"\r\n [class.opacity-0]=\"!expanded()\"\r\n [class.max-w-xs]=\"expanded()\"\r\n [class.opacity-100]=\"expanded()\"\r\n >\r\n @if (logo()) {\r\n <img\r\n [src]=\"logo()\"\r\n [alt]=\"'components.sidebar.logoAlt' | transloco\"\r\n class=\"h-8 shrink-0\"\r\n [routerLink]=\"logoLink()\"\r\n [class.cursor-pointer]=\"logoLink()\"\r\n />\r\n }\r\n @if (logo() && (title() || subTitle())) {\r\n <div\r\n class=\"h-6 w-[1px] bg-current opacity-30 shrink-0\"\r\n [style.color]=\"iconsColor()\"\r\n ></div>\r\n }\r\n @if (title() || subTitle()) {\r\n <div\r\n class=\"flex flex-col gap-0.5 min-w-0\"\r\n [style.color]=\"iconsColor()\"\r\n >\r\n <span class=\"text-sm font-semibold truncate\">{{ title() }}</span>\r\n @if (subTitle()) {\r\n <span class=\"text-xs opacity-70 truncate\">{{\r\n subTitle()\r\n }}</span>\r\n }\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n\r\n <div\r\n class=\"mt-sidebar-menu flex min-h-0 flex-1 flex-col gap-1 overflow-x-hidden overflow-y-auto overscroll-contain\"\r\n [class.mt-sidebar-menu-collapsed]=\"!expanded()\"\r\n [class.pr-1]=\"expanded()\"\r\n [class.pr-px]=\"!expanded()\"\r\n >\r\n @for (item of items(); track item.id) {\r\n <a\r\n [routerLink]=\"item.routerLink\"\r\n routerLinkActive=\"bg-primary-50 dark:bg-primary-900\"\r\n #rla=\"routerLinkActive\"\r\n class=\"flex items-center gap-3 h-[47px] min-w-[47px] shrink-0 dark:hover:bg-surface-900 hover:bg-primary-50 transition-colors rounded-md overflow-hidden\"\r\n mtTooltip=\"{{ item.title }}\"\r\n [style.color]=\"rla.isActive ? 'var(--p-primary-500)' : iconsColor()\"\r\n >\r\n <div class=\"px-4\">\r\n <mt-icon\r\n [icon]=\"item.icon\"\r\n class=\"shrink-0\"\r\n [style.--mt-icon-prev-width]=\"'20px'\"\r\n [style.--mt-icon-prev-height]=\"'20px'\"\r\n />\r\n </div>\r\n <div\r\n class=\"whitespace-nowrap text-sm font-medium transition-all duration-400 ease-in-out overflow-hidden\"\r\n [class.opacity-0]=\"!expanded()\"\r\n [class.max-w-xs]=\"expanded()\"\r\n [class.opacity-100]=\"expanded()\"\r\n >\r\n {{ item.title }}\r\n </div>\r\n </a>\r\n }\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [":host{display:block;height:100%;min-height:0}.mt-sidebar-menu{scrollbar-width:thin;scrollbar-color:var(--p-surface-400) transparent}.mt-sidebar-menu::-webkit-scrollbar{width:6px}.mt-sidebar-menu::-webkit-scrollbar-track{background:transparent}.mt-sidebar-menu::-webkit-scrollbar-thumb{border-radius:9999px;background:color-mix(in srgb,var(--p-surface-500) 58%,transparent)}.mt-sidebar-menu::-webkit-scrollbar-thumb:hover{background:color-mix(in srgb,var(--p-surface-600) 72%,transparent)}.mt-sidebar-menu-collapsed{scrollbar-color:var(--p-surface-500) transparent}.mt-sidebar-menu-collapsed::-webkit-scrollbar{width:2px}.mt-sidebar-menu-collapsed::-webkit-scrollbar-thumb{background:color-mix(in srgb,var(--p-surface-600) 82%,transparent)}\n"] }]
|
|
29
30
|
}], propDecorators: { items: [{ type: i0.Input, args: [{ isSignal: true, alias: "items", required: false }] }], logo: [{ type: i0.Input, args: [{ isSignal: true, alias: "logo", required: false }] }], logoLink: [{ type: i0.Input, args: [{ isSignal: true, alias: "logoLink", required: false }] }], title: [{ type: i0.Input, args: [{ isSignal: true, alias: "title", required: false }] }], subTitle: [{ type: i0.Input, args: [{ isSignal: true, alias: "subTitle", required: false }] }], bgColor: [{ type: i0.Input, args: [{ isSignal: true, alias: "bgColor", required: false }] }], bgImage: [{ type: i0.Input, args: [{ isSignal: true, alias: "bgImage", required: false }] }], bgRepeat: [{ type: i0.Input, args: [{ isSignal: true, alias: "bgRepeat", required: false }] }], iconsColor: [{ type: i0.Input, args: [{ isSignal: true, alias: "iconsColor", required: false }] }], expandedChange: [{ type: i0.Output, args: ["expandedChange"] }] } });
|
|
30
31
|
|
|
31
32
|
/**
|