@masterteam/components 0.0.58 → 0.0.60
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/fesm2022/masterteam-components-avatar-text.mjs +16 -16
- package/fesm2022/masterteam-components-avatar-text.mjs.map +1 -1
- package/fesm2022/masterteam-components-avatar.mjs +14 -14
- package/fesm2022/masterteam-components-avatar.mjs.map +1 -1
- package/fesm2022/masterteam-components-breadcrumb.mjs +7 -7
- package/fesm2022/masterteam-components-breadcrumb.mjs.map +1 -1
- package/fesm2022/masterteam-components-button-group.mjs +3 -3
- package/fesm2022/masterteam-components-button.mjs +27 -47
- package/fesm2022/masterteam-components-button.mjs.map +1 -1
- package/fesm2022/masterteam-components-card.mjs +8 -10
- package/fesm2022/masterteam-components-card.mjs.map +1 -1
- package/fesm2022/masterteam-components-checkbox-field.mjs +13 -13
- package/fesm2022/masterteam-components-checkbox-field.mjs.map +1 -1
- package/fesm2022/masterteam-components-chip.mjs +10 -12
- package/fesm2022/masterteam-components-chip.mjs.map +1 -1
- package/fesm2022/masterteam-components-color-picker-field.mjs +13 -13
- package/fesm2022/masterteam-components-color-picker-field.mjs.map +1 -1
- package/fesm2022/masterteam-components-confirmation.mjs +7 -7
- package/fesm2022/masterteam-components-confirmation.mjs.map +1 -1
- package/fesm2022/masterteam-components-date-field.mjs +17 -17
- package/fesm2022/masterteam-components-date-field.mjs.map +1 -1
- package/fesm2022/masterteam-components-dialog.mjs +3 -3
- package/fesm2022/masterteam-components-drawer.mjs +15 -15
- package/fesm2022/masterteam-components-drawer.mjs.map +1 -1
- package/fesm2022/masterteam-components-dynamic-drawer.mjs +12 -12
- package/fesm2022/masterteam-components-dynamic-drawer.mjs.map +1 -1
- package/fesm2022/masterteam-components-editor-field.mjs +14 -14
- package/fesm2022/masterteam-components-editor-field.mjs.map +1 -1
- package/fesm2022/masterteam-components-field-validation.mjs +10 -12
- package/fesm2022/masterteam-components-field-validation.mjs.map +1 -1
- package/fesm2022/masterteam-components-formula-builder.mjs +12 -12
- package/fesm2022/masterteam-components-formula-builder.mjs.map +1 -1
- package/fesm2022/masterteam-components-icon-field.mjs +7 -7
- package/fesm2022/masterteam-components-icon-field.mjs.map +1 -1
- package/fesm2022/masterteam-components-list.mjs +9 -9
- package/fesm2022/masterteam-components-list.mjs.map +1 -1
- package/fesm2022/masterteam-components-menu.mjs +25 -29
- package/fesm2022/masterteam-components-menu.mjs.map +1 -1
- package/fesm2022/masterteam-components-modal.mjs +3 -3
- package/fesm2022/masterteam-components-module-summary-card.mjs +11 -15
- package/fesm2022/masterteam-components-module-summary-card.mjs.map +1 -1
- package/fesm2022/masterteam-components-multi-select-field.mjs +21 -21
- package/fesm2022/masterteam-components-multi-select-field.mjs.map +1 -1
- package/fesm2022/masterteam-components-number-field.mjs +17 -17
- package/fesm2022/masterteam-components-number-field.mjs.map +1 -1
- package/fesm2022/masterteam-components-page-header.mjs +17 -17
- package/fesm2022/masterteam-components-page-header.mjs.map +1 -1
- package/fesm2022/masterteam-components-page.mjs +17 -17
- package/fesm2022/masterteam-components-page.mjs.map +1 -1
- package/fesm2022/masterteam-components-paginator.mjs +14 -22
- package/fesm2022/masterteam-components-paginator.mjs.map +1 -1
- package/fesm2022/masterteam-components-pick-list-field.mjs +29 -29
- package/fesm2022/masterteam-components-pick-list-field.mjs.map +1 -1
- package/fesm2022/masterteam-components-radio-button-field.mjs +15 -15
- package/fesm2022/masterteam-components-radio-button-field.mjs.map +1 -1
- package/fesm2022/masterteam-components-radio-cards-field.mjs +13 -15
- package/fesm2022/masterteam-components-radio-cards-field.mjs.map +1 -1
- package/fesm2022/masterteam-components-radio-cards.mjs +15 -15
- package/fesm2022/masterteam-components-radio-cards.mjs.map +1 -1
- package/fesm2022/masterteam-components-select-field.mjs +22 -22
- package/fesm2022/masterteam-components-select-field.mjs.map +1 -1
- package/fesm2022/masterteam-components-sidebar.mjs +9 -9
- package/fesm2022/masterteam-components-sidebar.mjs.map +1 -1
- package/fesm2022/masterteam-components-slider-field.mjs +18 -22
- package/fesm2022/masterteam-components-slider-field.mjs.map +1 -1
- package/fesm2022/masterteam-components-table.mjs +39 -53
- package/fesm2022/masterteam-components-table.mjs.map +1 -1
- package/fesm2022/masterteam-components-tabs.mjs +11 -15
- package/fesm2022/masterteam-components-tabs.mjs.map +1 -1
- package/fesm2022/masterteam-components-text-field.mjs +18 -18
- package/fesm2022/masterteam-components-text-field.mjs.map +1 -1
- package/fesm2022/masterteam-components-textarea-field.mjs +15 -15
- package/fesm2022/masterteam-components-textarea-field.mjs.map +1 -1
- package/fesm2022/masterteam-components-toast.mjs +6 -6
- package/fesm2022/masterteam-components-toast.mjs.map +1 -1
- package/fesm2022/masterteam-components-toggle-field.mjs +13 -13
- package/fesm2022/masterteam-components-toggle-field.mjs.map +1 -1
- package/fesm2022/masterteam-components-tooltip.mjs +3 -3
- package/fesm2022/masterteam-components-topbar.mjs +12 -12
- package/fesm2022/masterteam-components-topbar.mjs.map +1 -1
- package/fesm2022/masterteam-components-upload-field.mjs +53 -53
- package/fesm2022/masterteam-components-upload-field.mjs.map +1 -1
- package/fesm2022/masterteam-components-user-search-field.mjs +21 -21
- package/fesm2022/masterteam-components-user-search-field.mjs.map +1 -1
- package/fesm2022/masterteam-components.mjs +254 -7
- package/fesm2022/masterteam-components.mjs.map +1 -1
- package/package.json +89 -89
- package/{dialog/index.d.ts → types/masterteam-components-dialog.d.ts} +1 -1
- package/{index.d.ts → types/masterteam-components.d.ts} +181 -26
- /package/{avatar-text/index.d.ts → types/masterteam-components-avatar-text.d.ts} +0 -0
- /package/{avatar/index.d.ts → types/masterteam-components-avatar.d.ts} +0 -0
- /package/{breadcrumb/index.d.ts → types/masterteam-components-breadcrumb.d.ts} +0 -0
- /package/{button-group/index.d.ts → types/masterteam-components-button-group.d.ts} +0 -0
- /package/{button/index.d.ts → types/masterteam-components-button.d.ts} +0 -0
- /package/{card/index.d.ts → types/masterteam-components-card.d.ts} +0 -0
- /package/{checkbox-field/index.d.ts → types/masterteam-components-checkbox-field.d.ts} +0 -0
- /package/{chip/index.d.ts → types/masterteam-components-chip.d.ts} +0 -0
- /package/{color-picker-field/index.d.ts → types/masterteam-components-color-picker-field.d.ts} +0 -0
- /package/{confirmation/index.d.ts → types/masterteam-components-confirmation.d.ts} +0 -0
- /package/{date-field/index.d.ts → types/masterteam-components-date-field.d.ts} +0 -0
- /package/{drawer/index.d.ts → types/masterteam-components-drawer.d.ts} +0 -0
- /package/{dynamic-drawer/index.d.ts → types/masterteam-components-dynamic-drawer.d.ts} +0 -0
- /package/{editor-field/index.d.ts → types/masterteam-components-editor-field.d.ts} +0 -0
- /package/{field-validation/index.d.ts → types/masterteam-components-field-validation.d.ts} +0 -0
- /package/{formula-builder/index.d.ts → types/masterteam-components-formula-builder.d.ts} +0 -0
- /package/{icon-field/index.d.ts → types/masterteam-components-icon-field.d.ts} +0 -0
- /package/{list/index.d.ts → types/masterteam-components-list.d.ts} +0 -0
- /package/{menu/index.d.ts → types/masterteam-components-menu.d.ts} +0 -0
- /package/{modal/index.d.ts → types/masterteam-components-modal.d.ts} +0 -0
- /package/{module-summary-card/index.d.ts → types/masterteam-components-module-summary-card.d.ts} +0 -0
- /package/{multi-select-field/index.d.ts → types/masterteam-components-multi-select-field.d.ts} +0 -0
- /package/{number-field/index.d.ts → types/masterteam-components-number-field.d.ts} +0 -0
- /package/{page-header/index.d.ts → types/masterteam-components-page-header.d.ts} +0 -0
- /package/{page/index.d.ts → types/masterteam-components-page.d.ts} +0 -0
- /package/{paginator/index.d.ts → types/masterteam-components-paginator.d.ts} +0 -0
- /package/{pick-list-field/index.d.ts → types/masterteam-components-pick-list-field.d.ts} +0 -0
- /package/{radio-button-field/index.d.ts → types/masterteam-components-radio-button-field.d.ts} +0 -0
- /package/{radio-cards-field/index.d.ts → types/masterteam-components-radio-cards-field.d.ts} +0 -0
- /package/{radio-cards/index.d.ts → types/masterteam-components-radio-cards.d.ts} +0 -0
- /package/{select-field/index.d.ts → types/masterteam-components-select-field.d.ts} +0 -0
- /package/{sidebar/index.d.ts → types/masterteam-components-sidebar.d.ts} +0 -0
- /package/{slider-field/index.d.ts → types/masterteam-components-slider-field.d.ts} +0 -0
- /package/{table/index.d.ts → types/masterteam-components-table.d.ts} +0 -0
- /package/{tabs/index.d.ts → types/masterteam-components-tabs.d.ts} +0 -0
- /package/{text-field/index.d.ts → types/masterteam-components-text-field.d.ts} +0 -0
- /package/{textarea-field/index.d.ts → types/masterteam-components-textarea-field.d.ts} +0 -0
- /package/{toast/index.d.ts → types/masterteam-components-toast.d.ts} +0 -0
- /package/{toggle-field/index.d.ts → types/masterteam-components-toggle-field.d.ts} +0 -0
- /package/{tooltip/index.d.ts → types/masterteam-components-tooltip.d.ts} +0 -0
- /package/{topbar/index.d.ts → types/masterteam-components-topbar.d.ts} +0 -0
- /package/{upload-field/index.d.ts → types/masterteam-components-upload-field.d.ts} +0 -0
- /package/{user-search-field/index.d.ts → types/masterteam-components-user-search-field.d.ts} +0 -0
|
@@ -19,25 +19,25 @@ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
|
19
19
|
import * as i3 from 'primeng/api';
|
|
20
20
|
|
|
21
21
|
class UserSearchField {
|
|
22
|
-
hint = input(...(ngDevMode ?
|
|
23
|
-
label = input(...(ngDevMode ?
|
|
24
|
-
placeholder = input(...(ngDevMode ?
|
|
25
|
-
class = input('', ...(ngDevMode ?
|
|
26
|
-
readonly = input(false, ...(ngDevMode ?
|
|
27
|
-
required = input(false, ...(ngDevMode ?
|
|
28
|
-
apiUrl = input.required(...(ngDevMode ?
|
|
29
|
-
dataKey = input('data', ...(ngDevMode ?
|
|
30
|
-
paramName = input('query', ...(ngDevMode ?
|
|
31
|
-
context = input(undefined, ...(ngDevMode ?
|
|
22
|
+
hint = input(undefined, { ...(ngDevMode ? { debugName: "hint" } : {}) });
|
|
23
|
+
label = input(undefined, { ...(ngDevMode ? { debugName: "label" } : {}) });
|
|
24
|
+
placeholder = input(undefined, { ...(ngDevMode ? { debugName: "placeholder" } : {}) });
|
|
25
|
+
class = input('', { ...(ngDevMode ? { debugName: "class" } : {}) });
|
|
26
|
+
readonly = input(false, { ...(ngDevMode ? { debugName: "readonly" } : {}) });
|
|
27
|
+
required = input(false, { ...(ngDevMode ? { debugName: "required" } : {}) });
|
|
28
|
+
apiUrl = input.required({ ...(ngDevMode ? { debugName: "apiUrl" } : {}) });
|
|
29
|
+
dataKey = input('data', { ...(ngDevMode ? { debugName: "dataKey" } : {}) });
|
|
30
|
+
paramName = input('query', { ...(ngDevMode ? { debugName: "paramName" } : {}) });
|
|
31
|
+
context = input(undefined, { ...(ngDevMode ? { debugName: "context" } : {}) });
|
|
32
32
|
styleClass;
|
|
33
33
|
requiredValidator = Validators.required;
|
|
34
|
-
value = signal(null, ...(ngDevMode ?
|
|
35
|
-
disabled = signal(false, ...(ngDevMode ?
|
|
36
|
-
loading = signal(false, ...(ngDevMode ?
|
|
37
|
-
size = input(...(ngDevMode ?
|
|
38
|
-
filteredUsers = signal([], ...(ngDevMode ?
|
|
34
|
+
value = signal(null, { ...(ngDevMode ? { debugName: "value" } : {}) });
|
|
35
|
+
disabled = signal(false, { ...(ngDevMode ? { debugName: "disabled" } : {}) });
|
|
36
|
+
loading = signal(false, { ...(ngDevMode ? { debugName: "loading" } : {}) });
|
|
37
|
+
size = input(undefined, { ...(ngDevMode ? { debugName: "size" } : {}) });
|
|
38
|
+
filteredUsers = signal([], { ...(ngDevMode ? { debugName: "filteredUsers" } : {}) });
|
|
39
39
|
searchTerms = new Subject();
|
|
40
|
-
autocomplete = viewChild('autocomplete', ...(ngDevMode ?
|
|
40
|
+
autocomplete = viewChild('autocomplete', { ...(ngDevMode ? { debugName: "autocomplete" } : {}) });
|
|
41
41
|
onTouched = () => { };
|
|
42
42
|
onModelChange = () => { };
|
|
43
43
|
ngControl = null;
|
|
@@ -123,10 +123,10 @@ class UserSearchField {
|
|
|
123
123
|
},
|
|
124
124
|
});
|
|
125
125
|
}
|
|
126
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
127
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "
|
|
126
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.1", ngImport: i0, type: UserSearchField, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
127
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.1", type: UserSearchField, isStandalone: true, selector: "mt-user-search-field", inputs: { hint: { classPropertyName: "hint", publicName: "hint", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, required: { classPropertyName: "required", publicName: "required", isSignal: true, isRequired: false, transformFunction: null }, apiUrl: { classPropertyName: "apiUrl", publicName: "apiUrl", isSignal: true, isRequired: true, transformFunction: null }, dataKey: { classPropertyName: "dataKey", publicName: "dataKey", isSignal: true, isRequired: false, transformFunction: null }, paramName: { classPropertyName: "paramName", publicName: "paramName", isSignal: true, isRequired: false, transformFunction: null }, context: { classPropertyName: "context", publicName: "context", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "this.styleClass" }, classAttribute: "grid gap-1" }, viewQueries: [{ propertyName: "autocomplete", first: true, predicate: ["autocomplete"], descendants: true, isSignal: true }], ngImport: i0, template: "@if (label()) {\n <label\n [class.required]=\"ngControl?.control?.hasValidator(requiredValidator)\"\n [for]=\"ngControl?.name || label()\"\n >\n {{ label() }}\n </label>\n}\n<div class=\"relative\">\n <p-inputgroup>\n <p-autoComplete\n #autocomplete=\"\"\n [suggestions]=\"filteredUsers()\"\n (completeMethod)=\"search($event)\"\n (onSelect)=\"onSelect($event)\"\n (onClear)=\"onClear()\"\n (onFocus)=\"onFocus()\"\n (onBlur)=\"onTouched()\"\n [ngModel]=\"value()?.displayName\"\n [disabled]=\"disabled() || readonly()\"\n [id]=\"ngControl?.name || label()\"\n [invalid]=\"isInvalid(ngControl?.control)\"\n [placeholder]=\"placeholder()\"\n class=\"w-full\"\n appendTo=\"body\"\n styleClass=\"w-full\"\n [dropdown]=\"false\"\n [size]=\"size()\"\n >\n <ng-template let-user pTemplate=\"item\">\n <div class=\"flex items-center gap-2\">\n <mt-avatar size=\"small\" icon=\"user.user-01\" />\n <div class=\"flex align-items-center gap-3\">\n <span class=\"font-medium\">{{ user.displayName }}</span>\n <medium class=\"text-gray-500\">{{ \"@\" + user.userName }}</medium>\n </div>\n </div>\n </ng-template>\n\n <!-- <ng-template let-user #pTemplate=\"selecteditem\">\n <div class=\"flex items-center gap-2\">\n <mt-avatar size=\"small\" icon=\"user.user-01\" />\n <div class=\"flex align-items-center gap-3\">\n <span class=\"font-medium\">{{ user.displayName }}</span>\n <medium class=\"text-gray-500\">{{ \"@\" + user.userName }}</medium>\n </div>\n </div>\n </ng-template> -->\n </p-autoComplete>\n @if (hint()) {\n <p-inputgroup-addon [mtTooltip]=\"hint()\" tooltipPosition=\"top\">\n <mt-icon icon=\"general.help-circle\" />\n </p-inputgroup-addon>\n } @else {\n <p-inputgroup-addon tooltipPosition=\"top\">\n <mt-icon icon=\"user.user-03\" />\n </p-inputgroup-addon>\n }\n </p-inputgroup>\n\n @if (loading()) {\n <mt-icon\n icon=\"general.loading-01\"\n class=\"animate-spin absolute right-3 bg-white top-1/2 -translate-y-1/2\"\n />\n }\n</div>\n<mt-field-validation [control]=\"ngControl?.control\"></mt-field-validation>\n", styles: [""], 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: "ngmodule", type: AutoCompleteModule }, { kind: "component", type: i2.AutoComplete, selector: "p-autoComplete, p-autocomplete, p-auto-complete", inputs: ["minLength", "minQueryLength", "delay", "panelStyle", "styleClass", "panelStyleClass", "inputStyle", "inputId", "inputStyleClass", "placeholder", "readonly", "scrollHeight", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "autoHighlight", "forceSelection", "type", "autoZIndex", "baseZIndex", "ariaLabel", "dropdownAriaLabel", "ariaLabelledBy", "dropdownIcon", "unique", "group", "completeOnFocus", "showClear", "dropdown", "showEmptyMessage", "dropdownMode", "multiple", "addOnTab", "tabindex", "dataKey", "emptyMessage", "showTransitionOptions", "hideTransitionOptions", "autofocus", "autocomplete", "optionGroupChildren", "optionGroupLabel", "overlayOptions", "suggestions", "optionLabel", "optionValue", "id", "searchMessage", "emptySelectionMessage", "selectionMessage", "autoOptionFocus", "selectOnFocus", "searchLocale", "optionDisabled", "focusOnHover", "typeahead", "addOnBlur", "separator", "appendTo", "motionOptions"], outputs: ["completeMethod", "onSelect", "onUnselect", "onAdd", "onFocus", "onBlur", "onDropdownClick", "onClear", "onInputKeydown", "onKeyUp", "onShow", "onHide", "onLazyLoad"] }, { kind: "directive", type: i3.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "directive", type: Tooltip, selector: "[mtTooltip]" }, { kind: "ngmodule", type: InputGroupModule }, { kind: "component", type: i4.InputGroup, selector: "p-inputgroup, p-inputGroup, p-input-group", inputs: ["styleClass"] }, { kind: "ngmodule", type: InputGroupAddonModule }, { kind: "component", type: i5.InputGroupAddon, selector: "p-inputgroup-addon, p-inputGroupAddon", inputs: ["style", "styleClass"] }, { kind: "component", type: FieldValidation, selector: "mt-field-validation", inputs: ["control", "touched"] }, { kind: "component", type: Icon, selector: "mt-icon", inputs: ["icon"] }, { kind: "component", type: Avatar, selector: "mt-avatar", inputs: ["label", "icon", "image", "styleClass", "size", "shape", "badge", "badgeSize", "badgeSeverity"], outputs: ["onImageError"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
128
128
|
}
|
|
129
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
129
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.1", ngImport: i0, type: UserSearchField, decorators: [{
|
|
130
130
|
type: Component,
|
|
131
131
|
args: [{ selector: 'mt-user-search-field', standalone: true, imports: [
|
|
132
132
|
FormsModule,
|
|
@@ -140,10 +140,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.3", ngImpor
|
|
|
140
140
|
], changeDetection: ChangeDetectionStrategy.OnPush, host: {
|
|
141
141
|
class: 'grid gap-1',
|
|
142
142
|
}, template: "@if (label()) {\n <label\n [class.required]=\"ngControl?.control?.hasValidator(requiredValidator)\"\n [for]=\"ngControl?.name || label()\"\n >\n {{ label() }}\n </label>\n}\n<div class=\"relative\">\n <p-inputgroup>\n <p-autoComplete\n #autocomplete=\"\"\n [suggestions]=\"filteredUsers()\"\n (completeMethod)=\"search($event)\"\n (onSelect)=\"onSelect($event)\"\n (onClear)=\"onClear()\"\n (onFocus)=\"onFocus()\"\n (onBlur)=\"onTouched()\"\n [ngModel]=\"value()?.displayName\"\n [disabled]=\"disabled() || readonly()\"\n [id]=\"ngControl?.name || label()\"\n [invalid]=\"isInvalid(ngControl?.control)\"\n [placeholder]=\"placeholder()\"\n class=\"w-full\"\n appendTo=\"body\"\n styleClass=\"w-full\"\n [dropdown]=\"false\"\n [size]=\"size()\"\n >\n <ng-template let-user pTemplate=\"item\">\n <div class=\"flex items-center gap-2\">\n <mt-avatar size=\"small\" icon=\"user.user-01\" />\n <div class=\"flex align-items-center gap-3\">\n <span class=\"font-medium\">{{ user.displayName }}</span>\n <medium class=\"text-gray-500\">{{ \"@\" + user.userName }}</medium>\n </div>\n </div>\n </ng-template>\n\n <!-- <ng-template let-user #pTemplate=\"selecteditem\">\n <div class=\"flex items-center gap-2\">\n <mt-avatar size=\"small\" icon=\"user.user-01\" />\n <div class=\"flex align-items-center gap-3\">\n <span class=\"font-medium\">{{ user.displayName }}</span>\n <medium class=\"text-gray-500\">{{ \"@\" + user.userName }}</medium>\n </div>\n </div>\n </ng-template> -->\n </p-autoComplete>\n @if (hint()) {\n <p-inputgroup-addon [mtTooltip]=\"hint()\" tooltipPosition=\"top\">\n <mt-icon icon=\"general.help-circle\" />\n </p-inputgroup-addon>\n } @else {\n <p-inputgroup-addon tooltipPosition=\"top\">\n <mt-icon icon=\"user.user-03\" />\n </p-inputgroup-addon>\n }\n </p-inputgroup>\n\n @if (loading()) {\n <mt-icon\n icon=\"general.loading-01\"\n class=\"animate-spin absolute right-3 bg-white top-1/2 -translate-y-1/2\"\n />\n }\n</div>\n<mt-field-validation [control]=\"ngControl?.control\"></mt-field-validation>\n" }]
|
|
143
|
-
}], ctorParameters: () => [], propDecorators: { styleClass: [{
|
|
143
|
+
}], ctorParameters: () => [], propDecorators: { hint: [{ type: i0.Input, args: [{ isSignal: true, alias: "hint", required: false }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], class: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }], readonly: [{ type: i0.Input, args: [{ isSignal: true, alias: "readonly", required: false }] }], required: [{ type: i0.Input, args: [{ isSignal: true, alias: "required", required: false }] }], apiUrl: [{ type: i0.Input, args: [{ isSignal: true, alias: "apiUrl", required: true }] }], dataKey: [{ type: i0.Input, args: [{ isSignal: true, alias: "dataKey", required: false }] }], paramName: [{ type: i0.Input, args: [{ isSignal: true, alias: "paramName", required: false }] }], context: [{ type: i0.Input, args: [{ isSignal: true, alias: "context", required: false }] }], styleClass: [{
|
|
144
144
|
type: HostBinding,
|
|
145
145
|
args: ['class']
|
|
146
|
-
}] } });
|
|
146
|
+
}], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], autocomplete: [{ type: i0.ViewChild, args: ['autocomplete', { isSignal: true }] }] } });
|
|
147
147
|
|
|
148
148
|
/**
|
|
149
149
|
* Generated bundle index. Do not edit.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"masterteam-components-user-search-field.mjs","sources":["../../../../packages/masterteam/components/user-search-field/user-search-field.ts","../../../../packages/masterteam/components/user-search-field/user-search-field.html","../../../../packages/masterteam/components/user-search-field/masterteam-components-user-search-field.ts"],"sourcesContent":["import {\n Component,\n HostBinding,\n signal,\n input,\n OnInit,\n inject,\n ChangeDetectionStrategy,\n effect,\n viewChild,\n} from '@angular/core';\nimport {\n ControlValueAccessor,\n FormsModule,\n NgControl,\n Validators,\n} from '@angular/forms';\nimport { AutoComplete, AutoCompleteModule } from 'primeng/autocomplete';\nimport { InputGroupModule } from 'primeng/inputgroup';\nimport { InputGroupAddonModule } from 'primeng/inputgroupaddon';\nimport { Tooltip } from '@masterteam/components/tooltip';\nimport { FieldValidation } from '@masterteam/components/field-validation';\nimport { isInvalid } from '@masterteam/components';\nimport { Icon } from '@masterteam/icons';\nimport {\n Subject,\n distinctUntilChanged,\n switchMap,\n tap,\n of,\n finalize,\n catchError,\n} from 'rxjs';\nimport { HttpClient, HttpContext, HttpParams } from '@angular/common/http';\nimport { Avatar } from '@masterteam/components/avatar';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\n\nexport interface User {\n isExternal: boolean;\n userId: string;\n displayName: string;\n userName: string;\n photo: string;\n}\n\n@Component({\n selector: 'mt-user-search-field',\n standalone: true,\n imports: [\n FormsModule,\n AutoCompleteModule,\n Tooltip,\n InputGroupModule,\n InputGroupAddonModule,\n FieldValidation,\n Icon,\n Avatar,\n ],\n templateUrl: './user-search-field.html',\n styleUrls: ['./user-search-field.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'grid gap-1',\n },\n})\nexport class UserSearchField implements ControlValueAccessor, OnInit {\n readonly hint = input<string>();\n readonly label = input<string>();\n readonly placeholder = input<string>();\n readonly class = input<string>('');\n readonly readonly = input<boolean>(false);\n readonly required = input<boolean>(false);\n readonly apiUrl = input.required<string>();\n readonly dataKey = input<string>('data');\n readonly paramName = input<string>('query');\n readonly context = input<HttpContext | undefined>(undefined);\n\n @HostBinding('class') styleClass: string;\n\n requiredValidator = Validators.required;\n value = signal<User | null>(null);\n disabled = signal<boolean>(false);\n loading = signal<boolean>(false);\n\n readonly size = input<'small' | 'large' | undefined>();\n\n filteredUsers = signal<User[]>([]);\n private searchTerms = new Subject<string>();\n\n readonly autocomplete = viewChild<AutoComplete>('autocomplete');\n\n onTouched: () => void = () => {};\n onModelChange: (value: any) => void = () => {};\n\n public ngControl: NgControl | null = null;\n private http = inject(HttpClient);\n\n isInvalid = isInvalid;\n\n constructor() {\n this.ngControl = inject(NgControl, { self: true, optional: true });\n if (this.ngControl) {\n this.ngControl.valueAccessor = this;\n }\n effect(() => {\n if (this.ngControl?.control && this.required()) {\n this.ngControl.control.addValidators(Validators.required);\n this.ngControl.control.updateValueAndValidity();\n }\n });\n this.getUsers();\n }\n\n ngOnInit() {\n this.styleClass = this.class();\n }\n\n search(event: { query: string }) {\n this.loading.set(true);\n this.searchTerms.next(event.query);\n }\n\n onFocus() {\n if (this.filteredUsers().length > 0 && this.autocomplete()) {\n this.autocomplete()?.show();\n }\n }\n\n onSelect(event: { originalEvent: Event; value: User }) {\n const selectedUser = event.value;\n this.value.set(selectedUser);\n this.onModelChange(selectedUser);\n this.onTouched();\n this.loading.set(false);\n this.filteredUsers.set([]);\n if (this.autocomplete()) {\n this.autocomplete()?.hide();\n }\n }\n\n onClear() {\n this.value.set(null);\n this.onModelChange(null);\n this.filteredUsers.set([]);\n this.loading.set(false);\n }\n\n writeValue(value: User | null): void {\n this.value.set(value);\n }\n\n registerOnChange(fn: (value: User | null) => void) {\n this.onModelChange = fn;\n }\n\n registerOnTouched(fn: any) {\n this.onTouched = fn;\n }\n\n setDisabledState(disabled: boolean) {\n this.disabled.set(disabled);\n }\n\n getUsers() {\n this.searchTerms\n .pipe(\n takeUntilDestroyed(),\n distinctUntilChanged(),\n tap(() => this.loading.set(true)),\n switchMap((term: string) => {\n if (!term) {\n this.filteredUsers.set([]);\n this.loading.set(false);\n return of([]);\n }\n const params = new HttpParams().set(this.paramName(), term);\n return this.http\n .get<any>(this.apiUrl(), {\n params,\n context: this.context(),\n })\n .pipe(\n finalize(() => this.loading.set(false)),\n catchError((err) => {\n console.error('API search failed:', err);\n this.filteredUsers.set([]);\n return of({ [this.dataKey()]: [] });\n }),\n );\n }),\n )\n .subscribe({\n next: (users) => {\n this.filteredUsers.set((users[this.dataKey()] ?? []) as User[]);\n },\n });\n }\n}\n","@if (label()) {\n <label\n [class.required]=\"ngControl?.control?.hasValidator(requiredValidator)\"\n [for]=\"ngControl?.name || label()\"\n >\n {{ label() }}\n </label>\n}\n<div class=\"relative\">\n <p-inputgroup>\n <p-autoComplete\n #autocomplete=\"\"\n [suggestions]=\"filteredUsers()\"\n (completeMethod)=\"search($event)\"\n (onSelect)=\"onSelect($event)\"\n (onClear)=\"onClear()\"\n (onFocus)=\"onFocus()\"\n (onBlur)=\"onTouched()\"\n [ngModel]=\"value()?.displayName\"\n [disabled]=\"disabled() || readonly()\"\n [id]=\"ngControl?.name || label()\"\n [invalid]=\"isInvalid(ngControl?.control)\"\n [placeholder]=\"placeholder()\"\n class=\"w-full\"\n appendTo=\"body\"\n styleClass=\"w-full\"\n [dropdown]=\"false\"\n [size]=\"size()\"\n >\n <ng-template let-user pTemplate=\"item\">\n <div class=\"flex items-center gap-2\">\n <mt-avatar size=\"small\" icon=\"user.user-01\" />\n <div class=\"flex align-items-center gap-3\">\n <span class=\"font-medium\">{{ user.displayName }}</span>\n <medium class=\"text-gray-500\">{{ \"@\" + user.userName }}</medium>\n </div>\n </div>\n </ng-template>\n\n <!-- <ng-template let-user #pTemplate=\"selecteditem\">\n <div class=\"flex items-center gap-2\">\n <mt-avatar size=\"small\" icon=\"user.user-01\" />\n <div class=\"flex align-items-center gap-3\">\n <span class=\"font-medium\">{{ user.displayName }}</span>\n <medium class=\"text-gray-500\">{{ \"@\" + user.userName }}</medium>\n </div>\n </div>\n </ng-template> -->\n </p-autoComplete>\n @if (hint()) {\n <p-inputgroup-addon [mtTooltip]=\"hint()\" tooltipPosition=\"top\">\n <mt-icon icon=\"general.help-circle\" />\n </p-inputgroup-addon>\n } @else {\n <p-inputgroup-addon tooltipPosition=\"top\">\n <mt-icon icon=\"user.user-03\" />\n </p-inputgroup-addon>\n }\n </p-inputgroup>\n\n @if (loading()) {\n <mt-icon\n icon=\"general.loading-01\"\n class=\"animate-spin absolute right-3 bg-white top-1/2 -translate-y-1/2\"\n />\n }\n</div>\n<mt-field-validation [control]=\"ngControl?.control\"></mt-field-validation>\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-user-search-field.mjs","sources":["../../../../packages/masterteam/components/user-search-field/user-search-field.ts","../../../../packages/masterteam/components/user-search-field/user-search-field.html","../../../../packages/masterteam/components/user-search-field/masterteam-components-user-search-field.ts"],"sourcesContent":["import {\n Component,\n HostBinding,\n signal,\n input,\n OnInit,\n inject,\n ChangeDetectionStrategy,\n effect,\n viewChild,\n} from '@angular/core';\nimport {\n ControlValueAccessor,\n FormsModule,\n NgControl,\n Validators,\n} from '@angular/forms';\nimport { AutoComplete, AutoCompleteModule } from 'primeng/autocomplete';\nimport { InputGroupModule } from 'primeng/inputgroup';\nimport { InputGroupAddonModule } from 'primeng/inputgroupaddon';\nimport { Tooltip } from '@masterteam/components/tooltip';\nimport { FieldValidation } from '@masterteam/components/field-validation';\nimport { isInvalid } from '@masterteam/components';\nimport { Icon } from '@masterteam/icons';\nimport {\n Subject,\n distinctUntilChanged,\n switchMap,\n tap,\n of,\n finalize,\n catchError,\n} from 'rxjs';\nimport { HttpClient, HttpContext, HttpParams } from '@angular/common/http';\nimport { Avatar } from '@masterteam/components/avatar';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\n\nexport interface User {\n isExternal: boolean;\n userId: string;\n displayName: string;\n userName: string;\n photo: string;\n}\n\n@Component({\n selector: 'mt-user-search-field',\n standalone: true,\n imports: [\n FormsModule,\n AutoCompleteModule,\n Tooltip,\n InputGroupModule,\n InputGroupAddonModule,\n FieldValidation,\n Icon,\n Avatar,\n ],\n templateUrl: './user-search-field.html',\n styleUrls: ['./user-search-field.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'grid gap-1',\n },\n})\nexport class UserSearchField implements ControlValueAccessor, OnInit {\n readonly hint = input<string>();\n readonly label = input<string>();\n readonly placeholder = input<string>();\n readonly class = input<string>('');\n readonly readonly = input<boolean>(false);\n readonly required = input<boolean>(false);\n readonly apiUrl = input.required<string>();\n readonly dataKey = input<string>('data');\n readonly paramName = input<string>('query');\n readonly context = input<HttpContext | undefined>(undefined);\n\n @HostBinding('class') styleClass: string;\n\n requiredValidator = Validators.required;\n value = signal<User | null>(null);\n disabled = signal<boolean>(false);\n loading = signal<boolean>(false);\n\n readonly size = input<'small' | 'large' | undefined>();\n\n filteredUsers = signal<User[]>([]);\n private searchTerms = new Subject<string>();\n\n readonly autocomplete = viewChild<AutoComplete>('autocomplete');\n\n onTouched: () => void = () => {};\n onModelChange: (value: any) => void = () => {};\n\n public ngControl: NgControl | null = null;\n private http = inject(HttpClient);\n\n isInvalid = isInvalid;\n\n constructor() {\n this.ngControl = inject(NgControl, { self: true, optional: true });\n if (this.ngControl) {\n this.ngControl.valueAccessor = this;\n }\n effect(() => {\n if (this.ngControl?.control && this.required()) {\n this.ngControl.control.addValidators(Validators.required);\n this.ngControl.control.updateValueAndValidity();\n }\n });\n this.getUsers();\n }\n\n ngOnInit() {\n this.styleClass = this.class();\n }\n\n search(event: { query: string }) {\n this.loading.set(true);\n this.searchTerms.next(event.query);\n }\n\n onFocus() {\n if (this.filteredUsers().length > 0 && this.autocomplete()) {\n this.autocomplete()?.show();\n }\n }\n\n onSelect(event: { originalEvent: Event; value: User }) {\n const selectedUser = event.value;\n this.value.set(selectedUser);\n this.onModelChange(selectedUser);\n this.onTouched();\n this.loading.set(false);\n this.filteredUsers.set([]);\n if (this.autocomplete()) {\n this.autocomplete()?.hide();\n }\n }\n\n onClear() {\n this.value.set(null);\n this.onModelChange(null);\n this.filteredUsers.set([]);\n this.loading.set(false);\n }\n\n writeValue(value: User | null): void {\n this.value.set(value);\n }\n\n registerOnChange(fn: (value: User | null) => void) {\n this.onModelChange = fn;\n }\n\n registerOnTouched(fn: any) {\n this.onTouched = fn;\n }\n\n setDisabledState(disabled: boolean) {\n this.disabled.set(disabled);\n }\n\n getUsers() {\n this.searchTerms\n .pipe(\n takeUntilDestroyed(),\n distinctUntilChanged(),\n tap(() => this.loading.set(true)),\n switchMap((term: string) => {\n if (!term) {\n this.filteredUsers.set([]);\n this.loading.set(false);\n return of([]);\n }\n const params = new HttpParams().set(this.paramName(), term);\n return this.http\n .get<any>(this.apiUrl(), {\n params,\n context: this.context(),\n })\n .pipe(\n finalize(() => this.loading.set(false)),\n catchError((err) => {\n console.error('API search failed:', err);\n this.filteredUsers.set([]);\n return of({ [this.dataKey()]: [] });\n }),\n );\n }),\n )\n .subscribe({\n next: (users) => {\n this.filteredUsers.set((users[this.dataKey()] ?? []) as User[]);\n },\n });\n }\n}\n","@if (label()) {\n <label\n [class.required]=\"ngControl?.control?.hasValidator(requiredValidator)\"\n [for]=\"ngControl?.name || label()\"\n >\n {{ label() }}\n </label>\n}\n<div class=\"relative\">\n <p-inputgroup>\n <p-autoComplete\n #autocomplete=\"\"\n [suggestions]=\"filteredUsers()\"\n (completeMethod)=\"search($event)\"\n (onSelect)=\"onSelect($event)\"\n (onClear)=\"onClear()\"\n (onFocus)=\"onFocus()\"\n (onBlur)=\"onTouched()\"\n [ngModel]=\"value()?.displayName\"\n [disabled]=\"disabled() || readonly()\"\n [id]=\"ngControl?.name || label()\"\n [invalid]=\"isInvalid(ngControl?.control)\"\n [placeholder]=\"placeholder()\"\n class=\"w-full\"\n appendTo=\"body\"\n styleClass=\"w-full\"\n [dropdown]=\"false\"\n [size]=\"size()\"\n >\n <ng-template let-user pTemplate=\"item\">\n <div class=\"flex items-center gap-2\">\n <mt-avatar size=\"small\" icon=\"user.user-01\" />\n <div class=\"flex align-items-center gap-3\">\n <span class=\"font-medium\">{{ user.displayName }}</span>\n <medium class=\"text-gray-500\">{{ \"@\" + user.userName }}</medium>\n </div>\n </div>\n </ng-template>\n\n <!-- <ng-template let-user #pTemplate=\"selecteditem\">\n <div class=\"flex items-center gap-2\">\n <mt-avatar size=\"small\" icon=\"user.user-01\" />\n <div class=\"flex align-items-center gap-3\">\n <span class=\"font-medium\">{{ user.displayName }}</span>\n <medium class=\"text-gray-500\">{{ \"@\" + user.userName }}</medium>\n </div>\n </div>\n </ng-template> -->\n </p-autoComplete>\n @if (hint()) {\n <p-inputgroup-addon [mtTooltip]=\"hint()\" tooltipPosition=\"top\">\n <mt-icon icon=\"general.help-circle\" />\n </p-inputgroup-addon>\n } @else {\n <p-inputgroup-addon tooltipPosition=\"top\">\n <mt-icon icon=\"user.user-03\" />\n </p-inputgroup-addon>\n }\n </p-inputgroup>\n\n @if (loading()) {\n <mt-icon\n icon=\"general.loading-01\"\n class=\"animate-spin absolute right-3 bg-white top-1/2 -translate-y-1/2\"\n />\n }\n</div>\n<mt-field-validation [control]=\"ngControl?.control\"></mt-field-validation>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
@@ -2,6 +2,9 @@ import { providePrimeNG } from 'primeng/config';
|
|
|
2
2
|
import Aura from '@primeuix/themes/aura';
|
|
3
3
|
import { updatePreset, definePreset } from '@primeuix/themes';
|
|
4
4
|
import { MessageService, ConfirmationService } from 'primeng/api';
|
|
5
|
+
import { computed } from '@angular/core';
|
|
6
|
+
import { of } from 'rxjs';
|
|
7
|
+
import { tap, catchError, finalize } from 'rxjs/operators';
|
|
5
8
|
|
|
6
9
|
/**
|
|
7
10
|
* Converts a hex color string to an HSL tuple.
|
|
@@ -447,12 +450,6 @@ function provideMTConfirmation() {
|
|
|
447
450
|
return ConfirmationService;
|
|
448
451
|
}
|
|
449
452
|
|
|
450
|
-
function isInvalid(control) {
|
|
451
|
-
if (!control)
|
|
452
|
-
return false;
|
|
453
|
-
return control && control?.invalid && control?.touched;
|
|
454
|
-
}
|
|
455
|
-
|
|
456
453
|
class ValidatorConfig {
|
|
457
454
|
type;
|
|
458
455
|
value;
|
|
@@ -902,13 +899,263 @@ function wrapValidatorWithMessage(validator, errorKey, message) {
|
|
|
902
899
|
// return new TextFieldConfig()
|
|
903
900
|
// }
|
|
904
901
|
|
|
902
|
+
/**
|
|
903
|
+
* Base facade with smart query selector factory
|
|
904
|
+
*/
|
|
905
|
+
class BaseFacade {
|
|
906
|
+
/**
|
|
907
|
+
* Creates a query object with separate signals for data, loading, and error states
|
|
908
|
+
* Each property is its own signal for granular reactivity
|
|
909
|
+
*
|
|
910
|
+
* @example
|
|
911
|
+
* readonly modulesQuery = this.query(
|
|
912
|
+
* 'getModulesLoading',
|
|
913
|
+
* (state) => state.allModules
|
|
914
|
+
* );
|
|
915
|
+
*
|
|
916
|
+
* // In template - each is a separate signal:
|
|
917
|
+
* @if (modulesQuery.isPending()) { Loading... }
|
|
918
|
+
* @if (modulesQuery.error(); as error) { Error: {{ error }} }
|
|
919
|
+
* @if (modulesQuery.data(); as modules) {
|
|
920
|
+
* <div *ngFor="let m of modules">{{ m.title }}</div>
|
|
921
|
+
* }
|
|
922
|
+
*/
|
|
923
|
+
query(loadingKey, dataSelector) {
|
|
924
|
+
const stateSignal = this.state();
|
|
925
|
+
const isPending = computed(() => {
|
|
926
|
+
const currentState = stateSignal();
|
|
927
|
+
return currentState.loadingActive?.includes(loadingKey) ?? false;
|
|
928
|
+
}, { ...(ngDevMode ? { debugName: "isPending" } : {}) });
|
|
929
|
+
const error = computed(() => {
|
|
930
|
+
const currentState = stateSignal();
|
|
931
|
+
return currentState.errors?.[loadingKey] ?? null;
|
|
932
|
+
}, { ...(ngDevMode ? { debugName: "error" } : {}) });
|
|
933
|
+
const data = computed(() => {
|
|
934
|
+
const currentState = stateSignal();
|
|
935
|
+
const hasError = currentState.errors?.[loadingKey];
|
|
936
|
+
return hasError ? null : dataSelector(currentState);
|
|
937
|
+
}, { ...(ngDevMode ? { debugName: "data" } : {}) });
|
|
938
|
+
const isSuccess = computed(() => !isPending() && !error() && data() !== null, { ...(ngDevMode ? { debugName: "isSuccess" } : {}) });
|
|
939
|
+
const isError = computed(() => !!error(), { ...(ngDevMode ? { debugName: "isError" } : {}) });
|
|
940
|
+
return {
|
|
941
|
+
data,
|
|
942
|
+
isPending,
|
|
943
|
+
isSuccess,
|
|
944
|
+
isError,
|
|
945
|
+
error,
|
|
946
|
+
};
|
|
947
|
+
}
|
|
948
|
+
/**
|
|
949
|
+
* Creates a loading signal for a specific operation
|
|
950
|
+
*/
|
|
951
|
+
loading(loadingKey) {
|
|
952
|
+
const stateSignal = this.state();
|
|
953
|
+
return computed(() => {
|
|
954
|
+
const currentState = stateSignal();
|
|
955
|
+
return currentState.loadingActive?.includes(loadingKey) ?? false;
|
|
956
|
+
});
|
|
957
|
+
}
|
|
958
|
+
/**
|
|
959
|
+
* Creates an error signal for a specific operation
|
|
960
|
+
*/
|
|
961
|
+
errorSignal(loadingKey) {
|
|
962
|
+
const stateSignal = this.state();
|
|
963
|
+
return computed(() => {
|
|
964
|
+
const currentState = stateSignal();
|
|
965
|
+
return currentState.errors?.[loadingKey] ?? null;
|
|
966
|
+
});
|
|
967
|
+
}
|
|
968
|
+
}
|
|
969
|
+
|
|
970
|
+
function createEntityAdapter() {
|
|
971
|
+
return {
|
|
972
|
+
addOne: (state, entity) => [...state, entity],
|
|
973
|
+
upsertOne: (state, entity, uniqueKey = 'id') => {
|
|
974
|
+
const key = entity[uniqueKey];
|
|
975
|
+
if (key == null)
|
|
976
|
+
return state;
|
|
977
|
+
const index = state.findIndex((e) => e[uniqueKey] === key);
|
|
978
|
+
if (index === -1) {
|
|
979
|
+
return [...state, entity];
|
|
980
|
+
}
|
|
981
|
+
const clone = [...state];
|
|
982
|
+
clone[index] = entity;
|
|
983
|
+
return clone;
|
|
984
|
+
},
|
|
985
|
+
updateOne: (state, id, changes, uniqueKey = 'id') => state.map((e) => (e[uniqueKey] === id ? { ...e, ...changes } : e)),
|
|
986
|
+
removeOne: (state, id, uniqueKey = 'id') => state.filter((e) => e[uniqueKey] !== id),
|
|
987
|
+
setAll: (_state, entities) => [...entities],
|
|
988
|
+
};
|
|
989
|
+
}
|
|
990
|
+
|
|
991
|
+
function startLoading(ctx, loadingName) {
|
|
992
|
+
const { loadingActive, errors } = ctx.getState();
|
|
993
|
+
if (!loadingActive.includes(loadingName)) {
|
|
994
|
+
ctx.patchState({
|
|
995
|
+
loadingActive: [...loadingActive, loadingName],
|
|
996
|
+
});
|
|
997
|
+
}
|
|
998
|
+
if (errors && errors[loadingName]) {
|
|
999
|
+
const { [loadingName]: _removed, ...rest } = errors;
|
|
1000
|
+
ctx.patchState({ errors: rest });
|
|
1001
|
+
}
|
|
1002
|
+
}
|
|
1003
|
+
function endLoading(ctx, loadingName) {
|
|
1004
|
+
const { loadingActive } = ctx.getState();
|
|
1005
|
+
ctx.patchState({
|
|
1006
|
+
loadingActive: loadingActive.filter((name) => name !== loadingName),
|
|
1007
|
+
});
|
|
1008
|
+
}
|
|
1009
|
+
function setLoadingError(ctx, loadingName, message) {
|
|
1010
|
+
const { errors } = ctx.getState();
|
|
1011
|
+
ctx.patchState({
|
|
1012
|
+
errors: { ...errors, [loadingName]: message },
|
|
1013
|
+
});
|
|
1014
|
+
}
|
|
1015
|
+
|
|
1016
|
+
function handleApiRequest(config) {
|
|
1017
|
+
const { ctx, key, request$, onSuccess, onError, errorMessage } = config;
|
|
1018
|
+
startLoading(ctx, key);
|
|
1019
|
+
return request$.pipe(tap((response) => {
|
|
1020
|
+
const state = ctx.getState();
|
|
1021
|
+
const patch = onSuccess(response, state);
|
|
1022
|
+
if (patch) {
|
|
1023
|
+
ctx.patchState(patch);
|
|
1024
|
+
}
|
|
1025
|
+
}), catchError((error) => {
|
|
1026
|
+
const state = ctx.getState();
|
|
1027
|
+
const message = error?.error?.message ?? error?.message ?? errorMessage;
|
|
1028
|
+
setLoadingError(ctx, key, message);
|
|
1029
|
+
// Call onError callback if provided
|
|
1030
|
+
if (onError) {
|
|
1031
|
+
const patch = onError(error, state);
|
|
1032
|
+
if (patch) {
|
|
1033
|
+
ctx.patchState(patch);
|
|
1034
|
+
}
|
|
1035
|
+
}
|
|
1036
|
+
return of(null);
|
|
1037
|
+
}), finalize(() => endLoading(ctx, key)));
|
|
1038
|
+
}
|
|
1039
|
+
|
|
1040
|
+
/**
|
|
1041
|
+
* T = entity type (Module, User, ...)
|
|
1042
|
+
* TState = full state model (must include LoadingStateShape)
|
|
1043
|
+
* TLoad = union type of loading keys for this feature
|
|
1044
|
+
*/
|
|
1045
|
+
class CrudStateBase {
|
|
1046
|
+
adapter = createEntityAdapter();
|
|
1047
|
+
/**
|
|
1048
|
+
* Helper to create default updateState function
|
|
1049
|
+
*/
|
|
1050
|
+
getDefaultUpdateState(stateProperty) {
|
|
1051
|
+
// Try to extract the property name from the stateProperty function
|
|
1052
|
+
const funcStr = stateProperty.toString();
|
|
1053
|
+
const match = funcStr.match(/\.([a-zA-Z_$][a-zA-Z0-9_$]*)/); // Match .propertyName
|
|
1054
|
+
const key = match ? match[1] : 'items';
|
|
1055
|
+
return (state, items) => ({ [key]: items });
|
|
1056
|
+
}
|
|
1057
|
+
/**
|
|
1058
|
+
* Load data (single item or array) with config object
|
|
1059
|
+
*/
|
|
1060
|
+
load(ctx, config) {
|
|
1061
|
+
return handleApiRequest({
|
|
1062
|
+
ctx,
|
|
1063
|
+
key: config.key,
|
|
1064
|
+
request$: config.request$,
|
|
1065
|
+
onSuccess: (response, state) => {
|
|
1066
|
+
const data = config.transform
|
|
1067
|
+
? config.transform(response.data)
|
|
1068
|
+
: response.data;
|
|
1069
|
+
// If stateProperty provided, use adapter for array operations
|
|
1070
|
+
if (config.stateProperty) {
|
|
1071
|
+
const items = this.adapter.setAll(config.stateProperty(state), data);
|
|
1072
|
+
const updateState = config.updateState ??
|
|
1073
|
+
this.getDefaultUpdateState(config.stateProperty);
|
|
1074
|
+
return updateState(state, items);
|
|
1075
|
+
}
|
|
1076
|
+
// Otherwise, use custom updateState directly
|
|
1077
|
+
if (config.updateState) {
|
|
1078
|
+
return config.updateState(state, data);
|
|
1079
|
+
}
|
|
1080
|
+
throw new Error('Either stateProperty or updateState must be provided');
|
|
1081
|
+
},
|
|
1082
|
+
onError: config.onError,
|
|
1083
|
+
errorMessage: config.errorMessage ?? 'Failed to load data',
|
|
1084
|
+
});
|
|
1085
|
+
}
|
|
1086
|
+
/**
|
|
1087
|
+
* Create one entity with config object
|
|
1088
|
+
*/
|
|
1089
|
+
create(ctx, config) {
|
|
1090
|
+
const updateState = config.updateState ?? this.getDefaultUpdateState(config.stateProperty);
|
|
1091
|
+
return handleApiRequest({
|
|
1092
|
+
ctx,
|
|
1093
|
+
key: config.key,
|
|
1094
|
+
request$: config.request$,
|
|
1095
|
+
onSuccess: (response, state) => {
|
|
1096
|
+
const entity = config.transform
|
|
1097
|
+
? config.transform(response.data)
|
|
1098
|
+
: response.data;
|
|
1099
|
+
const items = this.adapter.addOne(config.stateProperty(state), entity);
|
|
1100
|
+
return updateState(state, items);
|
|
1101
|
+
},
|
|
1102
|
+
onError: config.onError,
|
|
1103
|
+
errorMessage: config.errorMessage ?? 'Failed to create item',
|
|
1104
|
+
});
|
|
1105
|
+
}
|
|
1106
|
+
/**
|
|
1107
|
+
* Update one entity with config object
|
|
1108
|
+
*/
|
|
1109
|
+
update(ctx, config) {
|
|
1110
|
+
const updateState = config.updateState ?? this.getDefaultUpdateState(config.stateProperty);
|
|
1111
|
+
return handleApiRequest({
|
|
1112
|
+
ctx,
|
|
1113
|
+
key: config.key,
|
|
1114
|
+
request$: config.request$,
|
|
1115
|
+
onSuccess: (response, state) => {
|
|
1116
|
+
const entity = config.transform
|
|
1117
|
+
? config.transform(response.data)
|
|
1118
|
+
: response.data;
|
|
1119
|
+
const items = this.adapter.upsertOne(config.stateProperty(state), entity, config.uniqueKey);
|
|
1120
|
+
return updateState(state, items);
|
|
1121
|
+
},
|
|
1122
|
+
onError: config.onError,
|
|
1123
|
+
errorMessage: config.errorMessage ?? 'Failed to update item',
|
|
1124
|
+
});
|
|
1125
|
+
}
|
|
1126
|
+
/**
|
|
1127
|
+
* Delete one entity with config object
|
|
1128
|
+
*/
|
|
1129
|
+
delete(ctx, config) {
|
|
1130
|
+
const updateState = config.updateState ?? this.getDefaultUpdateState(config.stateProperty);
|
|
1131
|
+
return handleApiRequest({
|
|
1132
|
+
ctx,
|
|
1133
|
+
key: config.key,
|
|
1134
|
+
request$: config.request$,
|
|
1135
|
+
onSuccess: (_response, state) => {
|
|
1136
|
+
const items = this.adapter.removeOne(config.stateProperty(state), config.id, config.uniqueKey);
|
|
1137
|
+
return updateState(state, items);
|
|
1138
|
+
},
|
|
1139
|
+
onError: config.onError,
|
|
1140
|
+
errorMessage: config.errorMessage ?? 'Failed to delete item',
|
|
1141
|
+
});
|
|
1142
|
+
}
|
|
1143
|
+
}
|
|
1144
|
+
|
|
1145
|
+
function isInvalid(control) {
|
|
1146
|
+
if (!control)
|
|
1147
|
+
return false;
|
|
1148
|
+
return control && control?.invalid && control?.touched;
|
|
1149
|
+
}
|
|
1150
|
+
|
|
905
1151
|
/*
|
|
906
1152
|
* Public API Surface of components
|
|
907
1153
|
*/
|
|
1154
|
+
// Config
|
|
908
1155
|
|
|
909
1156
|
/**
|
|
910
1157
|
* Generated bundle index. Do not edit.
|
|
911
1158
|
*/
|
|
912
1159
|
|
|
913
|
-
export { BaseFieldConfig, CheckboxFieldConfig, ColorPickerFieldConfig, DateFieldConfig, EditorFieldConfig, IconFieldConfig, MultiSelectFieldConfig, NumberFieldConfig, PickListFieldConfig, RadioButtonFieldConfig, RadioCardsFieldConfig, SelectFieldConfig, SliderFieldConfig, SpacerFieldConfig, TextFieldConfig, TextareaFieldConfig, ToggleFieldConfig, UploadFileFieldConfig, UserSearchFieldConfig, ValidatorConfig, changeBackgroundColor, changePrimaryColor, changeTextColor, createCustomValidator, generateTailwindPalette, isInvalid, provideMTComponents, provideMTConfirmation, provideMTMessages, wrapValidatorWithMessage };
|
|
1160
|
+
export { BaseFacade, BaseFieldConfig, CheckboxFieldConfig, ColorPickerFieldConfig, CrudStateBase, DateFieldConfig, EditorFieldConfig, IconFieldConfig, MultiSelectFieldConfig, NumberFieldConfig, PickListFieldConfig, RadioButtonFieldConfig, RadioCardsFieldConfig, SelectFieldConfig, SliderFieldConfig, SpacerFieldConfig, TextFieldConfig, TextareaFieldConfig, ToggleFieldConfig, UploadFileFieldConfig, UserSearchFieldConfig, ValidatorConfig, changeBackgroundColor, changePrimaryColor, changeTextColor, createCustomValidator, createEntityAdapter, endLoading, generateTailwindPalette, handleApiRequest, isInvalid, provideMTComponents, provideMTConfirmation, provideMTMessages, setLoadingError, startLoading, wrapValidatorWithMessage };
|
|
914
1161
|
//# sourceMappingURL=masterteam-components.mjs.map
|