@koalarx/ui 21.1.6 → 21.1.8

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.
@@ -103,19 +103,19 @@ class DatatableFilter {
103
103
  constructor() {
104
104
  effect(() => {
105
105
  const filters = this._filters();
106
- if (filters.length === 0 && Object.keys(this.payload()).length > 0) {
107
- this._payload.set({});
106
+ const payload = this.payload();
107
+ if (filters.length === 0 && Object.keys(payload).length > 0) {
108
108
  this._clearFilter.set(true);
109
109
  setTimeout(() => this._clearFilter.set(false));
110
110
  return;
111
111
  }
112
+ });
113
+ effect(() => {
114
+ const filters = this._filters();
112
115
  this._payload.update(() => {
113
116
  const result = {};
114
117
  filters.forEach((filter) => {
115
- return {
116
- ...result,
117
- [filter.propName]: filter.value,
118
- };
118
+ result[filter.propName] = filter.value;
119
119
  });
120
120
  return result;
121
121
  });
@@ -202,11 +202,11 @@ class Filter {
202
202
  this.addFilter.emit(this.datatableFilter.filters());
203
203
  }
204
204
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: Filter, deps: [], target: i0.ɵɵFactoryTarget.Component });
205
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.6", type: Filter, isStandalone: true, selector: "kl-filter", inputs: { filter: { classPropertyName: "filter", publicName: "filter", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { payload: "payload", addFilter: "addFilter", clearFilter: "clearFilter" }, providers: [DatatableFilter], ngImport: i0, template: "@if (datatableFilter.filters().length > 0) {\n <div class=\"datatable-filter-container px-1 w-full flex items-center gap-3 text-neutral-500 dark:text-neutral-300\">\n\n <button class=\"hover:cursor-pointer\"\n [tooltip]=\"translations.clearFilterTooltip\"\n tooltipPosition=\"right\"\n (click)=\"datatableFilter.clearFilters()\">\n <i class=\"fa-solid fa-filter-circle-xmark text-sm\"></i>\n </button>\n\n <div class=\"flex items-center flex-wrap gap-1\">\n @for (item of datatableFilter.filters(); track $index) {\n <div class=\"badge badge-ghost text-xs\">\n <span>{{item.templateValue}}</span>\n <button class=\"hover:cursor-pointer\" (click)=\"datatableFilter.removeFilter(item.propName)\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n }\n </div>\n\n <button class=\"hover:cursor-pointer\"\n [tooltip]=\"translations.addFilterTooltip\"\n tooltipPosition=\"right\"\n (click)=\"add()\">\n <i class=\"fa-solid fa-circle-plus text-sm\"></i>\n </button>\n </div>\n}\n", dependencies: [{ kind: "directive", type: Tooltip, selector: "[tooltip]", inputs: ["tooltip", "tooltipPosition"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
205
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.6", type: Filter, isStandalone: true, selector: "kl-filter", inputs: { filter: { classPropertyName: "filter", publicName: "filter", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { payload: "payload", addFilter: "addFilter", clearFilter: "clearFilter" }, providers: [DatatableFilter], ngImport: i0, template: "@if (datatableFilter.filters().length > 0) {\n <div class=\"datatable-filter-container px-1 w-full flex items-center gap-3 text-neutral-500 dark:text-neutral-300\">\n\n <button class=\"hover:cursor-pointer\"\n [tooltip]=\"translations.clearFilterTooltip\"\n tooltipPosition=\"right\"\n (click)=\"datatableFilter.clearFilters()\">\n <i class=\"fa-solid fa-filter-circle-xmark text-sm\"></i>\n </button>\n\n <div class=\"flex items-center flex-wrap gap-1\">\n @for (item of datatableFilter.filters(); track $index) {\n <div class=\"badge badge-outline text-xs\">\n <span>{{item.templateValue}}</span>\n <button class=\"hover:cursor-pointer\" (click)=\"datatableFilter.removeFilter(item.propName)\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n }\n </div>\n\n <button class=\"hover:cursor-pointer\"\n [tooltip]=\"translations.addFilterTooltip\"\n tooltipPosition=\"right\"\n (click)=\"add()\">\n <i class=\"fa-solid fa-circle-plus text-sm\"></i>\n </button>\n </div>\n}\n", dependencies: [{ kind: "directive", type: Tooltip, selector: "[tooltip]", inputs: ["tooltip", "tooltipPosition"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
206
206
  }
207
207
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: Filter, decorators: [{
208
208
  type: Component,
209
- args: [{ selector: 'kl-filter', changeDetection: ChangeDetectionStrategy.OnPush, providers: [DatatableFilter], imports: [Tooltip], template: "@if (datatableFilter.filters().length > 0) {\n <div class=\"datatable-filter-container px-1 w-full flex items-center gap-3 text-neutral-500 dark:text-neutral-300\">\n\n <button class=\"hover:cursor-pointer\"\n [tooltip]=\"translations.clearFilterTooltip\"\n tooltipPosition=\"right\"\n (click)=\"datatableFilter.clearFilters()\">\n <i class=\"fa-solid fa-filter-circle-xmark text-sm\"></i>\n </button>\n\n <div class=\"flex items-center flex-wrap gap-1\">\n @for (item of datatableFilter.filters(); track $index) {\n <div class=\"badge badge-ghost text-xs\">\n <span>{{item.templateValue}}</span>\n <button class=\"hover:cursor-pointer\" (click)=\"datatableFilter.removeFilter(item.propName)\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n }\n </div>\n\n <button class=\"hover:cursor-pointer\"\n [tooltip]=\"translations.addFilterTooltip\"\n tooltipPosition=\"right\"\n (click)=\"add()\">\n <i class=\"fa-solid fa-circle-plus text-sm\"></i>\n </button>\n </div>\n}\n" }]
209
+ args: [{ selector: 'kl-filter', changeDetection: ChangeDetectionStrategy.OnPush, providers: [DatatableFilter], imports: [Tooltip], template: "@if (datatableFilter.filters().length > 0) {\n <div class=\"datatable-filter-container px-1 w-full flex items-center gap-3 text-neutral-500 dark:text-neutral-300\">\n\n <button class=\"hover:cursor-pointer\"\n [tooltip]=\"translations.clearFilterTooltip\"\n tooltipPosition=\"right\"\n (click)=\"datatableFilter.clearFilters()\">\n <i class=\"fa-solid fa-filter-circle-xmark text-sm\"></i>\n </button>\n\n <div class=\"flex items-center flex-wrap gap-1\">\n @for (item of datatableFilter.filters(); track $index) {\n <div class=\"badge badge-outline text-xs\">\n <span>{{item.templateValue}}</span>\n <button class=\"hover:cursor-pointer\" (click)=\"datatableFilter.removeFilter(item.propName)\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n }\n </div>\n\n <button class=\"hover:cursor-pointer\"\n [tooltip]=\"translations.addFilterTooltip\"\n tooltipPosition=\"right\"\n (click)=\"add()\">\n <i class=\"fa-solid fa-circle-plus text-sm\"></i>\n </button>\n </div>\n}\n" }]
210
210
  }], ctorParameters: () => [], propDecorators: { filter: [{ type: i0.Input, args: [{ isSignal: true, alias: "filter", required: false }] }], payload: [{ type: i0.Output, args: ["payload"] }], addFilter: [{ type: i0.Output, args: ["addFilter"] }], clearFilter: [{ type: i0.Output, args: ["clearFilter"] }] } });
211
211
 
212
212
  class Datatable {
@@ -265,11 +265,11 @@ class Datatable {
265
265
  });
266
266
  }
267
267
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: Datatable, deps: [], target: i0.ɵɵFactoryTarget.Component });
268
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.6", type: Datatable, isStandalone: true, selector: "kl-datatable", inputs: { config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: true, transformFunction: null }, colspan: { classPropertyName: "colspan", publicName: "colspan", isSignal: true, isRequired: true, transformFunction: null }, loadMoreBtnColor: { classPropertyName: "loadMoreBtnColor", publicName: "loadMoreBtnColor", isSignal: true, isRequired: false, transformFunction: null }, filterBtnColor: { classPropertyName: "filterBtnColor", publicName: "filterBtnColor", isSignal: true, isRequired: false, transformFunction: null }, componentFilter: { classPropertyName: "componentFilter", publicName: "componentFilter", isSignal: true, isRequired: false, transformFunction: null }, withPaginator: { classPropertyName: "withPaginator", publicName: "withPaginator", isSignal: true, isRequired: false, transformFunction: null }, pageSize: { classPropertyName: "pageSize", publicName: "pageSize", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { pageSize: "pageSizeChange", pageChange: "pageChange", pageSizeChange: "pageSizeChange", filterChange: "filterChange", reloadList: "reloadList", loadMore: "loadMore" }, ngImport: i0, template: "<div class=\"flex flex-col h-full\">\n <div class=\"datatable-menu-container pl-2 pr-4 w-full flex items-center justify-between gap-2 z-10\">\n <div class=\"datatable-menu flex items-center py-2 px-0.5 opacity-80 gap-2\">\n <div class=\"addicional-options-menu flex items-center opacity-80\">\n <ng-content select=\"[menu]\" />\n </div>\n\n <span class=\"datatable-separator-menu relative top-[-0.10rem] opacity-20\">|</span>\n\n @if (componentFilter()) {\n @if (hasFilter()) {\n <kl-filter\n [filter]=\"filter()\"\n (addFilter)=\"openFilter($event)\"\n (payload)=\"filterChange.emit($event)\"\n (clearFilter)=\"filter.set([])\"\n />\n\n <span class=\"relative top-[-0.10rem] opacity-20\">|</span>\n } @else {\n <button klButton\n size=\"extraSmall\"\n class=\"text-sm font-light\"\n [color]=\"filterBtnColor()\"\n (click)=\"openFilter()\">\n <i class=\"fa-solid fa-filter text-xs\"></i>\n {{translations.btnFilterLabel}}\n </button>\n }\n }\n\n <button class=\"btn btn-outline border-neutral-300 hover:border-neutral-500 dark:border-neutral-700 btn-xs text-sm font-light\"\n (click)=\"reloadList.emit()\">\n <i class=\"fa-solid fa-rotate-right text-xs\"></i>\n {{translations.reloadListTooltip}}\n </button>\n </div>\n\n @if (!withPaginator()) {\n <div class=\"flex items-center justify-end gap-3 text-sm\">\n <span class=\"flex items-center justify-end gap-1 opacity-60\">\n <span class=\"whitespace-nowrap\">{{translations.labelItemsPerPage}}:</span>\n\n <select class=\"select select-md p-0 pl-2 pr-8 h-6 w-auto\" [(ngModel)]=\"pageSize\">\n @for (item of pageSizes; track $index) {\n <option [value]=\"item\">{{ item }}</option>\n }\n </select>\n </span>\n <span class=\"opacity-60\">|</span>\n <span class=\"opacity-60 whitespace-nowrap\">{{totalItemsOnPage()}} de {{totalItems()}}</span>\n </div>\n }\n </div>\n\n <div class=\"datatable-table overflow-x-auto h-full bg-base-200\">\n <table class=\"table table-sm table-pin-rows\">\n <thead>\n <tr class=\"text-xs overflow-hidden bg-base-200\">\n <ng-content select=\"[head]\" />\n </tr>\n </thead>\n <tbody>\n @if (hasError()) {\n <tr>\n <td [attr.colspan]=\"colspan()\" class=\"text-center\">\n {{translations.errorLoadDataLabel}}\n </td>\n </tr>\n } @else {\n <ng-content select=\"[body]\" />\n\n @if (!withPaginator() && !isLoading() && totalItemsOnPage() < totalItems()) {\n <tr>\n <td [attr.colspan]=\"colspan()\">\n <button\n klButton\n outline\n [color]=\"loadMoreBtnColor()\"\n class=\"w-full\"\n (click)=\"loadMore.emit()\">\n {{translations.loadMoreBtnLabel}}\n </button>\n </td>\n </tr>\n }\n\n @if (isLoading()) {\n @for (row of skeletonRows(); track $index) {\n <tr>\n @for (col of skeletonCols(); track $index) {\n <td><span class=\"block skeleton w-full h-4\"></span></td>\n }\n </tr>\n }\n }\n }\n </tbody>\n </table>\n </div>\n\n @if (withPaginator()) {\n <div class=\"px-4 py-2 bg-base-200 border-t border-neutral-200 dark:border-neutral-700 w-full flex items-center justify-between\">\n <div class=\"flex items-center justify-end gap-3 text-xs\">\n <span class=\"flex items-center justify-end gap-1 opacity-60\">\n <span>{{translations.labelItemsPerPage}}:</span>\n\n <select class=\"select select-sm p-0 pl-2 pr-0 w-15 h-6\" [(ngModel)]=\"pageSize\">\n @for (item of pageSizes; track $index) {\n <option [value]=\"item\">{{ item }}</option>\n }\n </select>\n </span>\n <span class=\"opacity-60\">|</span>\n <span class=\"opacity-60\">{{totalItemsOnPage()}} de {{totalItems()}}</span>\n </div>\n\n <div class=\"flex items-center gap-8\">\n <span class=\"text-xs opacity-60\">{{translations.paginatorPagesFeedback(currentPage(), lastPage())}}</span>\n\n <div class=\"join flex items-center\">\n <button class=\"join-item btn btn-sm\"\n [disabled]=\"currentPage() === 1\"\n (click)=\"pageChange.emit(1)\">\n <i class=\"fa-solid fa-angles-left text-[0.6rem]\"></i>\n </button>\n\n <button class=\"join-item btn btn-sm\"\n [disabled]=\"currentPage() === 1\"\n (click)=\"pageChange.emit(currentPage() - 1)\">\n <i class=\"fa-solid fa-chevron-left text-[0.6rem]\"></i>\n </button>\n\n <button class=\"join-item btn btn-sm\"\n [disabled]=\"currentPage() === lastPage()\"\n (click)=\"pageChange.emit(currentPage() + 1)\">\n <i class=\"fa-solid fa-angle-right text-[0.6rem]\"></i>\n </button>\n\n <button class=\"join-item btn btn-sm\"\n [disabled]=\"currentPage() === lastPage()\"\n (click)=\"pageChange.emit(lastPage())\">\n <i class=\"fa-solid fa-angles-right text-[0.6rem]\"></i>\n </button>\n </div>\n </div>\n </div>\n }\n</div>\n", dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { 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: Filter, selector: "kl-filter", inputs: ["filter"], outputs: ["payload", "addFilter", "clearFilter"] }, { kind: "directive", type: Button, selector: "button[klButton], a[klButton]", inputs: ["color", "type", "circle", "outline", "soft", "showLoader", "disabled", "size"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
268
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.6", type: Datatable, isStandalone: true, selector: "kl-datatable", inputs: { config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: true, transformFunction: null }, colspan: { classPropertyName: "colspan", publicName: "colspan", isSignal: true, isRequired: true, transformFunction: null }, loadMoreBtnColor: { classPropertyName: "loadMoreBtnColor", publicName: "loadMoreBtnColor", isSignal: true, isRequired: false, transformFunction: null }, filterBtnColor: { classPropertyName: "filterBtnColor", publicName: "filterBtnColor", isSignal: true, isRequired: false, transformFunction: null }, componentFilter: { classPropertyName: "componentFilter", publicName: "componentFilter", isSignal: true, isRequired: false, transformFunction: null }, withPaginator: { classPropertyName: "withPaginator", publicName: "withPaginator", isSignal: true, isRequired: false, transformFunction: null }, pageSize: { classPropertyName: "pageSize", publicName: "pageSize", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { pageSize: "pageSizeChange", pageChange: "pageChange", pageSizeChange: "pageSizeChange", filterChange: "filterChange", reloadList: "reloadList", loadMore: "loadMore" }, ngImport: i0, template: "<div class=\"flex flex-col h-full\">\n <div class=\"datatable-menu-container pl-2 pr-4 w-full flex items-center justify-between gap-2 z-10\">\n <div class=\"datatable-menu flex items-center py-2 px-0.5 opacity-80 gap-2\">\n <div class=\"addicional-options-menu flex items-center opacity-80\">\n <ng-content select=\"[menu]\" />\n </div>\n\n <span class=\"datatable-separator-menu relative top-[-0.10rem] opacity-20\">|</span>\n\n @if (componentFilter()) {\n @if (hasFilter()) {\n <kl-filter\n [filter]=\"filter()\"\n (addFilter)=\"openFilter($event)\"\n (payload)=\"filterChange.emit($event)\"\n (clearFilter)=\"filter.set([])\"\n />\n\n <span class=\"relative top-[-0.10rem] opacity-20\">|</span>\n } @else {\n <button klButton\n size=\"extraSmall\"\n class=\"text-sm font-light\"\n [color]=\"filterBtnColor()\"\n (click)=\"openFilter()\">\n <i class=\"fa-solid fa-filter text-xs\"></i>\n {{translations.btnFilterLabel}}\n </button>\n }\n }\n\n <button class=\"btn btn-outline border-neutral-300 hover:border-neutral-500 dark:border-neutral-700 btn-xs text-sm font-light\"\n (click)=\"reloadList.emit()\">\n <i class=\"fa-solid fa-rotate-right text-xs\"></i>\n {{translations.reloadListTooltip}}\n </button>\n </div>\n\n @if (!withPaginator()) {\n <div class=\"flex items-center justify-end gap-3 text-sm\">\n <span class=\"flex items-center justify-end gap-1 opacity-60\">\n <span class=\"whitespace-nowrap\">{{translations.labelItemsPerPage}}:</span>\n\n <select class=\"select select-md p-0 pl-2 pr-8 h-6 w-auto\" [(ngModel)]=\"pageSize\">\n @for (item of pageSizes; track $index) {\n <option [value]=\"item\">{{ item }}</option>\n }\n </select>\n </span>\n <span class=\"opacity-60\">|</span>\n <span class=\"opacity-60 whitespace-nowrap\">{{totalItemsOnPage()}} de {{totalItems()}}</span>\n </div>\n }\n </div>\n\n <div class=\"datatable-table overflow-x-auto h-auto bg-base-200\">\n <table class=\"table table-sm table-pin-rows\">\n <thead>\n <tr class=\"text-xs overflow-hidden bg-base-200\">\n <ng-content select=\"[head]\" />\n </tr>\n </thead>\n <tbody>\n @if (hasError()) {\n <tr>\n <td [attr.colspan]=\"colspan()\" class=\"text-center\">\n {{translations.errorLoadDataLabel}}\n </td>\n </tr>\n } @else {\n <ng-content select=\"[body]\" />\n\n @if (!withPaginator() && !isLoading() && totalItemsOnPage() < totalItems()) {\n <tr>\n <td [attr.colspan]=\"colspan()\">\n <button\n klButton\n outline\n [color]=\"loadMoreBtnColor()\"\n class=\"w-full\"\n (click)=\"loadMore.emit()\">\n {{translations.loadMoreBtnLabel}}\n </button>\n </td>\n </tr>\n }\n\n @if (isLoading()) {\n @for (row of skeletonRows(); track $index) {\n <tr>\n @for (col of skeletonCols(); track $index) {\n <td><span class=\"block skeleton w-full h-4\"></span></td>\n }\n </tr>\n }\n }\n }\n </tbody>\n </table>\n </div>\n\n @if (withPaginator()) {\n <div class=\"px-4 py-2 bg-base-200 border-t border-neutral-200 dark:border-neutral-700 w-full flex items-center justify-between\">\n <div class=\"flex items-center justify-end gap-3 text-xs\">\n <span class=\"flex items-center justify-end gap-1 opacity-60\">\n <span>{{translations.labelItemsPerPage}}:</span>\n\n <select class=\"select select-sm p-0 pl-2 pr-0 w-15 h-6\" [(ngModel)]=\"pageSize\">\n @for (item of pageSizes; track $index) {\n <option [value]=\"item\">{{ item }}</option>\n }\n </select>\n </span>\n <span class=\"opacity-60\">|</span>\n <span class=\"opacity-60\">{{totalItemsOnPage()}} de {{totalItems()}}</span>\n </div>\n\n <div class=\"flex items-center gap-8\">\n <span class=\"text-xs opacity-60\">{{translations.paginatorPagesFeedback(currentPage(), lastPage())}}</span>\n\n <div class=\"join flex items-center\">\n <button class=\"join-item btn btn-sm\"\n [disabled]=\"currentPage() === 1\"\n (click)=\"pageChange.emit(1)\">\n <i class=\"fa-solid fa-angles-left text-[0.6rem]\"></i>\n </button>\n\n <button class=\"join-item btn btn-sm\"\n [disabled]=\"currentPage() === 1\"\n (click)=\"pageChange.emit(currentPage() - 1)\">\n <i class=\"fa-solid fa-chevron-left text-[0.6rem]\"></i>\n </button>\n\n <button class=\"join-item btn btn-sm\"\n [disabled]=\"currentPage() === lastPage()\"\n (click)=\"pageChange.emit(currentPage() + 1)\">\n <i class=\"fa-solid fa-angle-right text-[0.6rem]\"></i>\n </button>\n\n <button class=\"join-item btn btn-sm\"\n [disabled]=\"currentPage() === lastPage()\"\n (click)=\"pageChange.emit(lastPage())\">\n <i class=\"fa-solid fa-angles-right text-[0.6rem]\"></i>\n </button>\n </div>\n </div>\n </div>\n }\n</div>\n", dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { 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: Filter, selector: "kl-filter", inputs: ["filter"], outputs: ["payload", "addFilter", "clearFilter"] }, { kind: "directive", type: Button, selector: "button[klButton], a[klButton]", inputs: ["color", "type", "circle", "outline", "soft", "showLoader", "disabled", "size"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
269
269
  }
270
270
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: Datatable, decorators: [{
271
271
  type: Component,
272
- args: [{ selector: 'kl-datatable', changeDetection: ChangeDetectionStrategy.OnPush, imports: [FormsModule, Filter, Button], template: "<div class=\"flex flex-col h-full\">\n <div class=\"datatable-menu-container pl-2 pr-4 w-full flex items-center justify-between gap-2 z-10\">\n <div class=\"datatable-menu flex items-center py-2 px-0.5 opacity-80 gap-2\">\n <div class=\"addicional-options-menu flex items-center opacity-80\">\n <ng-content select=\"[menu]\" />\n </div>\n\n <span class=\"datatable-separator-menu relative top-[-0.10rem] opacity-20\">|</span>\n\n @if (componentFilter()) {\n @if (hasFilter()) {\n <kl-filter\n [filter]=\"filter()\"\n (addFilter)=\"openFilter($event)\"\n (payload)=\"filterChange.emit($event)\"\n (clearFilter)=\"filter.set([])\"\n />\n\n <span class=\"relative top-[-0.10rem] opacity-20\">|</span>\n } @else {\n <button klButton\n size=\"extraSmall\"\n class=\"text-sm font-light\"\n [color]=\"filterBtnColor()\"\n (click)=\"openFilter()\">\n <i class=\"fa-solid fa-filter text-xs\"></i>\n {{translations.btnFilterLabel}}\n </button>\n }\n }\n\n <button class=\"btn btn-outline border-neutral-300 hover:border-neutral-500 dark:border-neutral-700 btn-xs text-sm font-light\"\n (click)=\"reloadList.emit()\">\n <i class=\"fa-solid fa-rotate-right text-xs\"></i>\n {{translations.reloadListTooltip}}\n </button>\n </div>\n\n @if (!withPaginator()) {\n <div class=\"flex items-center justify-end gap-3 text-sm\">\n <span class=\"flex items-center justify-end gap-1 opacity-60\">\n <span class=\"whitespace-nowrap\">{{translations.labelItemsPerPage}}:</span>\n\n <select class=\"select select-md p-0 pl-2 pr-8 h-6 w-auto\" [(ngModel)]=\"pageSize\">\n @for (item of pageSizes; track $index) {\n <option [value]=\"item\">{{ item }}</option>\n }\n </select>\n </span>\n <span class=\"opacity-60\">|</span>\n <span class=\"opacity-60 whitespace-nowrap\">{{totalItemsOnPage()}} de {{totalItems()}}</span>\n </div>\n }\n </div>\n\n <div class=\"datatable-table overflow-x-auto h-full bg-base-200\">\n <table class=\"table table-sm table-pin-rows\">\n <thead>\n <tr class=\"text-xs overflow-hidden bg-base-200\">\n <ng-content select=\"[head]\" />\n </tr>\n </thead>\n <tbody>\n @if (hasError()) {\n <tr>\n <td [attr.colspan]=\"colspan()\" class=\"text-center\">\n {{translations.errorLoadDataLabel}}\n </td>\n </tr>\n } @else {\n <ng-content select=\"[body]\" />\n\n @if (!withPaginator() && !isLoading() && totalItemsOnPage() < totalItems()) {\n <tr>\n <td [attr.colspan]=\"colspan()\">\n <button\n klButton\n outline\n [color]=\"loadMoreBtnColor()\"\n class=\"w-full\"\n (click)=\"loadMore.emit()\">\n {{translations.loadMoreBtnLabel}}\n </button>\n </td>\n </tr>\n }\n\n @if (isLoading()) {\n @for (row of skeletonRows(); track $index) {\n <tr>\n @for (col of skeletonCols(); track $index) {\n <td><span class=\"block skeleton w-full h-4\"></span></td>\n }\n </tr>\n }\n }\n }\n </tbody>\n </table>\n </div>\n\n @if (withPaginator()) {\n <div class=\"px-4 py-2 bg-base-200 border-t border-neutral-200 dark:border-neutral-700 w-full flex items-center justify-between\">\n <div class=\"flex items-center justify-end gap-3 text-xs\">\n <span class=\"flex items-center justify-end gap-1 opacity-60\">\n <span>{{translations.labelItemsPerPage}}:</span>\n\n <select class=\"select select-sm p-0 pl-2 pr-0 w-15 h-6\" [(ngModel)]=\"pageSize\">\n @for (item of pageSizes; track $index) {\n <option [value]=\"item\">{{ item }}</option>\n }\n </select>\n </span>\n <span class=\"opacity-60\">|</span>\n <span class=\"opacity-60\">{{totalItemsOnPage()}} de {{totalItems()}}</span>\n </div>\n\n <div class=\"flex items-center gap-8\">\n <span class=\"text-xs opacity-60\">{{translations.paginatorPagesFeedback(currentPage(), lastPage())}}</span>\n\n <div class=\"join flex items-center\">\n <button class=\"join-item btn btn-sm\"\n [disabled]=\"currentPage() === 1\"\n (click)=\"pageChange.emit(1)\">\n <i class=\"fa-solid fa-angles-left text-[0.6rem]\"></i>\n </button>\n\n <button class=\"join-item btn btn-sm\"\n [disabled]=\"currentPage() === 1\"\n (click)=\"pageChange.emit(currentPage() - 1)\">\n <i class=\"fa-solid fa-chevron-left text-[0.6rem]\"></i>\n </button>\n\n <button class=\"join-item btn btn-sm\"\n [disabled]=\"currentPage() === lastPage()\"\n (click)=\"pageChange.emit(currentPage() + 1)\">\n <i class=\"fa-solid fa-angle-right text-[0.6rem]\"></i>\n </button>\n\n <button class=\"join-item btn btn-sm\"\n [disabled]=\"currentPage() === lastPage()\"\n (click)=\"pageChange.emit(lastPage())\">\n <i class=\"fa-solid fa-angles-right text-[0.6rem]\"></i>\n </button>\n </div>\n </div>\n </div>\n }\n</div>\n" }]
272
+ args: [{ selector: 'kl-datatable', changeDetection: ChangeDetectionStrategy.OnPush, imports: [FormsModule, Filter, Button], template: "<div class=\"flex flex-col h-full\">\n <div class=\"datatable-menu-container pl-2 pr-4 w-full flex items-center justify-between gap-2 z-10\">\n <div class=\"datatable-menu flex items-center py-2 px-0.5 opacity-80 gap-2\">\n <div class=\"addicional-options-menu flex items-center opacity-80\">\n <ng-content select=\"[menu]\" />\n </div>\n\n <span class=\"datatable-separator-menu relative top-[-0.10rem] opacity-20\">|</span>\n\n @if (componentFilter()) {\n @if (hasFilter()) {\n <kl-filter\n [filter]=\"filter()\"\n (addFilter)=\"openFilter($event)\"\n (payload)=\"filterChange.emit($event)\"\n (clearFilter)=\"filter.set([])\"\n />\n\n <span class=\"relative top-[-0.10rem] opacity-20\">|</span>\n } @else {\n <button klButton\n size=\"extraSmall\"\n class=\"text-sm font-light\"\n [color]=\"filterBtnColor()\"\n (click)=\"openFilter()\">\n <i class=\"fa-solid fa-filter text-xs\"></i>\n {{translations.btnFilterLabel}}\n </button>\n }\n }\n\n <button class=\"btn btn-outline border-neutral-300 hover:border-neutral-500 dark:border-neutral-700 btn-xs text-sm font-light\"\n (click)=\"reloadList.emit()\">\n <i class=\"fa-solid fa-rotate-right text-xs\"></i>\n {{translations.reloadListTooltip}}\n </button>\n </div>\n\n @if (!withPaginator()) {\n <div class=\"flex items-center justify-end gap-3 text-sm\">\n <span class=\"flex items-center justify-end gap-1 opacity-60\">\n <span class=\"whitespace-nowrap\">{{translations.labelItemsPerPage}}:</span>\n\n <select class=\"select select-md p-0 pl-2 pr-8 h-6 w-auto\" [(ngModel)]=\"pageSize\">\n @for (item of pageSizes; track $index) {\n <option [value]=\"item\">{{ item }}</option>\n }\n </select>\n </span>\n <span class=\"opacity-60\">|</span>\n <span class=\"opacity-60 whitespace-nowrap\">{{totalItemsOnPage()}} de {{totalItems()}}</span>\n </div>\n }\n </div>\n\n <div class=\"datatable-table overflow-x-auto h-auto bg-base-200\">\n <table class=\"table table-sm table-pin-rows\">\n <thead>\n <tr class=\"text-xs overflow-hidden bg-base-200\">\n <ng-content select=\"[head]\" />\n </tr>\n </thead>\n <tbody>\n @if (hasError()) {\n <tr>\n <td [attr.colspan]=\"colspan()\" class=\"text-center\">\n {{translations.errorLoadDataLabel}}\n </td>\n </tr>\n } @else {\n <ng-content select=\"[body]\" />\n\n @if (!withPaginator() && !isLoading() && totalItemsOnPage() < totalItems()) {\n <tr>\n <td [attr.colspan]=\"colspan()\">\n <button\n klButton\n outline\n [color]=\"loadMoreBtnColor()\"\n class=\"w-full\"\n (click)=\"loadMore.emit()\">\n {{translations.loadMoreBtnLabel}}\n </button>\n </td>\n </tr>\n }\n\n @if (isLoading()) {\n @for (row of skeletonRows(); track $index) {\n <tr>\n @for (col of skeletonCols(); track $index) {\n <td><span class=\"block skeleton w-full h-4\"></span></td>\n }\n </tr>\n }\n }\n }\n </tbody>\n </table>\n </div>\n\n @if (withPaginator()) {\n <div class=\"px-4 py-2 bg-base-200 border-t border-neutral-200 dark:border-neutral-700 w-full flex items-center justify-between\">\n <div class=\"flex items-center justify-end gap-3 text-xs\">\n <span class=\"flex items-center justify-end gap-1 opacity-60\">\n <span>{{translations.labelItemsPerPage}}:</span>\n\n <select class=\"select select-sm p-0 pl-2 pr-0 w-15 h-6\" [(ngModel)]=\"pageSize\">\n @for (item of pageSizes; track $index) {\n <option [value]=\"item\">{{ item }}</option>\n }\n </select>\n </span>\n <span class=\"opacity-60\">|</span>\n <span class=\"opacity-60\">{{totalItemsOnPage()}} de {{totalItems()}}</span>\n </div>\n\n <div class=\"flex items-center gap-8\">\n <span class=\"text-xs opacity-60\">{{translations.paginatorPagesFeedback(currentPage(), lastPage())}}</span>\n\n <div class=\"join flex items-center\">\n <button class=\"join-item btn btn-sm\"\n [disabled]=\"currentPage() === 1\"\n (click)=\"pageChange.emit(1)\">\n <i class=\"fa-solid fa-angles-left text-[0.6rem]\"></i>\n </button>\n\n <button class=\"join-item btn btn-sm\"\n [disabled]=\"currentPage() === 1\"\n (click)=\"pageChange.emit(currentPage() - 1)\">\n <i class=\"fa-solid fa-chevron-left text-[0.6rem]\"></i>\n </button>\n\n <button class=\"join-item btn btn-sm\"\n [disabled]=\"currentPage() === lastPage()\"\n (click)=\"pageChange.emit(currentPage() + 1)\">\n <i class=\"fa-solid fa-angle-right text-[0.6rem]\"></i>\n </button>\n\n <button class=\"join-item btn btn-sm\"\n [disabled]=\"currentPage() === lastPage()\"\n (click)=\"pageChange.emit(lastPage())\">\n <i class=\"fa-solid fa-angles-right text-[0.6rem]\"></i>\n </button>\n </div>\n </div>\n </div>\n }\n</div>\n" }]
273
273
  }], ctorParameters: () => [], propDecorators: { config: [{ type: i0.Input, args: [{ isSignal: true, alias: "config", required: true }] }], colspan: [{ type: i0.Input, args: [{ isSignal: true, alias: "colspan", required: true }] }], loadMoreBtnColor: [{ type: i0.Input, args: [{ isSignal: true, alias: "loadMoreBtnColor", required: false }] }], filterBtnColor: [{ type: i0.Input, args: [{ isSignal: true, alias: "filterBtnColor", required: false }] }], componentFilter: [{ type: i0.Input, args: [{ isSignal: true, alias: "componentFilter", required: false }] }], withPaginator: [{ type: i0.Input, args: [{ isSignal: true, alias: "withPaginator", required: false }] }], pageSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "pageSize", required: false }] }, { type: i0.Output, args: ["pageSizeChange"] }], pageChange: [{ type: i0.Output, args: ["pageChange"] }], pageSizeChange: [{ type: i0.Output, args: ["pageSizeChange"] }], filterChange: [{ type: i0.Output, args: ["filterChange"] }], reloadList: [{ type: i0.Output, args: ["reloadList"] }], loadMore: [{ type: i0.Output, args: ["loadMore"] }] } });
274
274
 
275
275
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"koalarx-ui-shared-components-datatable.mjs","sources":["../../projects/koala-ui/shared/components/datatable/sort-column/ordered-column.state.ts","../../projects/koala-ui/shared/components/datatable/sort-column/sort-header-column.ts","../../projects/koala-ui/shared/components/datatable/sort-column/sort-header-column.html","../../projects/koala-ui/shared/components/datatable/sort-column/sorted-item.ts","../../projects/koala-ui/shared/components/datatable/filter/datatable-filter.ts","../../projects/koala-ui/shared/components/datatable/filter/filter-factory.ts","../../projects/koala-ui/shared/components/datatable/filter/filter.ts","../../projects/koala-ui/shared/components/datatable/filter/filter.html","../../projects/koala-ui/shared/components/datatable/datatable.ts","../../projects/koala-ui/shared/components/datatable/datatable.html","../../projects/koala-ui/shared/components/datatable/koalarx-ui-shared-components-datatable.ts"],"sourcesContent":["import { SortHeaderColumn } from './sort-header-column';\r\n\r\nexport class OrderedColumnState {\r\n static current?: SortHeaderColumn;\r\n}\r\n","import {\n Component,\n effect,\n ElementRef,\n input,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport {\n QueryPaginationDirection,\n SortFilterType,\n} from '@koalarx/ui/core/models';\nimport { OrderedColumnState } from './ordered-column.state';\n\n@Component({\n selector: 'kl-sort-header-column',\n templateUrl: './sort-header-column.html',\n})\nexport class SortHeaderColumn {\n orderBy = input.required<string>();\n style = input('');\n defaultDirection = input<QueryPaginationDirection>();\n sortable = output<SortFilterType>();\n elOrderedColumn =\n viewChild<ElementRef<HTMLTableCellElement>>('orderedColumn');\n direction = signal<QueryPaginationDirection | null>(null);\n\n constructor() {\n effect(() => {\n const defaultDirection = this.defaultDirection();\n\n if (defaultDirection) {\n this.direction.set(defaultDirection);\n OrderedColumnState.current = this;\n this.toogleColumnStateOrder('set');\n }\n });\n }\n\n sort() {\n this.direction.update((current) => {\n if (\n OrderedColumnState.current &&\n OrderedColumnState.current.orderBy !== this.orderBy\n ) {\n OrderedColumnState.current.direction.set(null);\n OrderedColumnState.current.toogleColumnStateOrder('unset');\n }\n\n OrderedColumnState.current = this;\n\n let direction: QueryPaginationDirection;\n\n switch (current) {\n case 'asc':\n direction = 'desc';\n break;\n case 'desc':\n default:\n direction = 'asc';\n }\n\n this.toogleColumnStateOrder('set');\n\n this.sortable.emit({\n orderBy: this.orderBy(),\n direction,\n });\n\n return direction;\n });\n }\n\n async toogleColumnStateOrder(state: 'set' | 'unset') {\n const columnElement = this.elOrderedColumn()?.nativeElement.parentElement;\n\n if (!columnElement) {\n return;\n }\n\n if (state === 'set') {\n columnElement.classList.add('ordered-column');\n } else {\n columnElement.classList.remove('ordered-column');\n }\n }\n}\n","<div #orderedColumn [style]=\"style()\" class=\"flex items-center justify-start gap-1 py-2 px-3 cursor-pointer\"\n [class.not-ordered]=\"direction() === null\"\n [class.asc]=\"direction() === 'asc'\"\n [class.desc]=\"direction() === 'desc'\"\n (click)=\"sort()\">\n\n @switch (direction()) {\n @case ('asc') {\n <i class=\"fa-solid fa-arrow-down-short-wide\"></i>\n }\n @case ('desc') {\n <i class=\"fa-solid fa-arrow-down-wide-short\"></i>\n }\n @default {\n <i class=\"fa-solid fa-sort\"></i>\n }\n }\n\n <ng-content />\n</div>\n","import { Directive, effect, ElementRef, inject, input } from '@angular/core';\nimport { SortFilterType } from '@koalarx/ui/core/models';\n\n@Directive({ selector: 'td[klSortedItem]' })\nexport class SortedItem {\n private readonly elementRef = inject<ElementRef<HTMLTableCellElement>>(\n ElementRef<HTMLTableCellElement>\n );\n\n klSortedItem = input.required<SortFilterType | null>();\n sortedPropName = input.required<string>();\n\n constructor() {\n effect(() => {\n const isSorted = this.klSortedItem()?.orderBy === this.sortedPropName();\n\n this.elementRef.nativeElement.classList.toggle('sorted', isSorted);\n\n if (isSorted) {\n this.elementRef.nativeElement.setAttribute('aria-sort', 'ascending');\n } else {\n this.elementRef.nativeElement.setAttribute('aria-sort', 'descending');\n }\n });\n }\n}\n","import { effect, Injectable, signal } from '@angular/core';\n\nexport interface FilterData {\n templateValue: string;\n propName: string;\n value: any;\n}\n\n@Injectable()\nexport class DatatableFilter {\n private readonly _payload = signal<Record<string, any>>({});\n private readonly _filters = signal<FilterData[]>([]);\n private readonly _clearFilter = signal<boolean>(false);\n\n constructor() {\n effect(() => {\n const filters = this._filters();\n\n if (filters.length === 0 && Object.keys(this.payload()).length > 0) {\n this._payload.set({});\n this._clearFilter.set(true);\n setTimeout(() => this._clearFilter.set(false));\n return;\n }\n\n this._payload.update(() => {\n const result = {};\n\n filters.forEach((filter) => {\n return {\n ...result,\n [filter.propName]: filter.value,\n };\n });\n\n return result;\n });\n });\n }\n\n get payload() {\n return this._payload.asReadonly();\n }\n\n get filters() {\n return this._filters.asReadonly();\n }\n\n get clearFilter() {\n return this._clearFilter.asReadonly();\n }\n\n setFilters(filters: FilterData[]) {\n this._filters.set(filters);\n }\n\n removeFilter(propName: string) {\n this._filters.update((current) =>\n current.filter((filter) => filter.propName !== propName),\n );\n }\n\n clearFilters() {\n this._filters.set([]);\n this._payload.set({});\n\n this._clearFilter.set(true);\n setTimeout(() => this._clearFilter.set(false));\n }\n}\n","import { Injectable } from '@angular/core';\nimport { FilterData } from './datatable-filter';\n\n@Injectable()\nexport class FilterFactory {\n private readonly _filter: FilterData[] = [];\n\n get filter() {\n return [...this._filter];\n }\n\n setFilters<T>(\n filter: T,\n templateNameFn: (propName: keyof typeof filter, value: any) => string\n ) {\n const filterData = filter as Record<string, any>;\n\n Object.keys(filterData).forEach((propName) => {\n const value = filterData[propName];\n\n if (value === null || value === undefined || value === '') {\n return;\n }\n\n const templateValue = templateNameFn(propName as any, value);\n this.addFilter({ templateValue, propName, value });\n });\n\n return this._filter;\n }\n\n addFilter(filter: FilterData) {\n this._filter.push(filter);\n }\n\n toPayload(data: FilterData[]): Record<string, any> {\n return data.reduce((acc, curr) => {\n acc[curr.propName] = curr.value;\n return acc;\n }, {} as Record<string, any>);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n effect,\n inject,\n input,\n output,\n} from '@angular/core';\nimport { Tooltip } from '@koalarx/ui/shared/directives';\nimport { DatatableFilter, FilterData } from './datatable-filter';\nimport { AppConfig } from '@koalarx/ui/core/config';\n\n@Component({\n selector: 'kl-filter',\n templateUrl: './filter.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [DatatableFilter],\n imports: [Tooltip],\n})\nexport class Filter {\n readonly translations = inject(AppConfig).translation.datatable;\n\n datatableFilter = inject(DatatableFilter);\n filter = input<FilterData[]>([]);\n payload = output<Record<string, any>>();\n addFilter = output<FilterData[]>();\n clearFilter = output<void>();\n\n constructor() {\n effect(() => this.datatableFilter.setFilters(this.filter()));\n effect(() => this.payload.emit(this.datatableFilter.payload()));\n effect(() => {\n if (this.datatableFilter.clearFilter()) {\n this.clearFilter.emit();\n }\n });\n }\n\n add() {\n this.addFilter.emit(this.datatableFilter.filters());\n }\n}\n","@if (datatableFilter.filters().length > 0) {\n <div class=\"datatable-filter-container px-1 w-full flex items-center gap-3 text-neutral-500 dark:text-neutral-300\">\n\n <button class=\"hover:cursor-pointer\"\n [tooltip]=\"translations.clearFilterTooltip\"\n tooltipPosition=\"right\"\n (click)=\"datatableFilter.clearFilters()\">\n <i class=\"fa-solid fa-filter-circle-xmark text-sm\"></i>\n </button>\n\n <div class=\"flex items-center flex-wrap gap-1\">\n @for (item of datatableFilter.filters(); track $index) {\n <div class=\"badge badge-ghost text-xs\">\n <span>{{item.templateValue}}</span>\n <button class=\"hover:cursor-pointer\" (click)=\"datatableFilter.removeFilter(item.propName)\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n }\n </div>\n\n <button class=\"hover:cursor-pointer\"\n [tooltip]=\"translations.addFilterTooltip\"\n tooltipPosition=\"right\"\n (click)=\"add()\">\n <i class=\"fa-solid fa-circle-plus text-sm\"></i>\n </button>\n </div>\n}\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n inject,\n input,\n model,\n output,\n signal,\n Type,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { AppConfig } from '@koalarx/ui/core/config';\nimport { SideWindow } from '@koalarx/ui/shared/components/side-window';\nimport { Button, ButtonColor } from '@koalarx/ui/shared/directives';\nimport { DatatableConfig } from './datatable-config';\nimport { FilterData } from './filter/datatable-filter';\nimport { Filter } from './filter/filter';\n\n@Component({\n selector: 'kl-datatable',\n templateUrl: './datatable.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [FormsModule, Filter, Button],\n})\nexport class Datatable {\n private readonly sideWindow = inject(SideWindow);\n\n readonly translations = inject(AppConfig).translation.datatable;\n\n config = input.required<DatatableConfig>();\n colspan = input.required<number>();\n loadMoreBtnColor = input<ButtonColor>('accent');\n filterBtnColor = input<ButtonColor>('primary');\n componentFilter = input<Type<any>>();\n withPaginator = input(false, { transform: booleanAttribute });\n\n currentPage = computed(() => this.config().currentPage);\n totalItems = computed(() => this.config().totalItems);\n totalItemsOnPage = computed(() => this.config().totalItemsOnPage);\n currentPageSize = computed(() => this.config().currentPageSize);\n isLoading = computed(() => this.config().isLoading);\n hasError = computed(() => this.config().hasError);\n\n filter = signal<FilterData[]>([]);\n hasFilter = computed(() => {\n return this.filter().length > 0;\n });\n pageSize = model<number>(0);\n pageSizes = [10, 20, 30, 50, 100];\n\n skeletonRows = computed(() => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);\n skeletonCols = computed(() => {\n return Array.from({ length: this.colspan() }, (_, i) => i);\n });\n\n lastPage = computed(() => {\n const isLoading = this.isLoading();\n\n if (!isLoading) {\n return Math.ceil(this.totalItems() / this.currentPageSize());\n }\n\n return 1;\n });\n\n pageChange = output<number>();\n pageSizeChange = output<number>();\n filterChange = output<Record<string, any>>();\n reloadList = output<void>();\n loadMore = output<void>();\n\n constructor() {\n effect(() => this.pageSize.set(this.currentPageSize()));\n effect(() => this.pageSizeChange.emit(this.pageSize()));\n effect(() => this.pageChange.emit(this.currentPage()));\n }\n\n openFilter(data?: FilterData[]) {\n const component = this.componentFilter();\n\n if (!component) {\n return;\n }\n\n this.sideWindow.open(component, {\n data,\n afterClosed: {\n trigger: [],\n callback: (filters: FilterData[]) => this.filter.set(filters),\n },\n });\n }\n}\n","<div class=\"flex flex-col h-full\">\n <div class=\"datatable-menu-container pl-2 pr-4 w-full flex items-center justify-between gap-2 z-10\">\n <div class=\"datatable-menu flex items-center py-2 px-0.5 opacity-80 gap-2\">\n <div class=\"addicional-options-menu flex items-center opacity-80\">\n <ng-content select=\"[menu]\" />\n </div>\n\n <span class=\"datatable-separator-menu relative top-[-0.10rem] opacity-20\">|</span>\n\n @if (componentFilter()) {\n @if (hasFilter()) {\n <kl-filter\n [filter]=\"filter()\"\n (addFilter)=\"openFilter($event)\"\n (payload)=\"filterChange.emit($event)\"\n (clearFilter)=\"filter.set([])\"\n />\n\n <span class=\"relative top-[-0.10rem] opacity-20\">|</span>\n } @else {\n <button klButton\n size=\"extraSmall\"\n class=\"text-sm font-light\"\n [color]=\"filterBtnColor()\"\n (click)=\"openFilter()\">\n <i class=\"fa-solid fa-filter text-xs\"></i>\n {{translations.btnFilterLabel}}\n </button>\n }\n }\n\n <button class=\"btn btn-outline border-neutral-300 hover:border-neutral-500 dark:border-neutral-700 btn-xs text-sm font-light\"\n (click)=\"reloadList.emit()\">\n <i class=\"fa-solid fa-rotate-right text-xs\"></i>\n {{translations.reloadListTooltip}}\n </button>\n </div>\n\n @if (!withPaginator()) {\n <div class=\"flex items-center justify-end gap-3 text-sm\">\n <span class=\"flex items-center justify-end gap-1 opacity-60\">\n <span class=\"whitespace-nowrap\">{{translations.labelItemsPerPage}}:</span>\n\n <select class=\"select select-md p-0 pl-2 pr-8 h-6 w-auto\" [(ngModel)]=\"pageSize\">\n @for (item of pageSizes; track $index) {\n <option [value]=\"item\">{{ item }}</option>\n }\n </select>\n </span>\n <span class=\"opacity-60\">|</span>\n <span class=\"opacity-60 whitespace-nowrap\">{{totalItemsOnPage()}} de {{totalItems()}}</span>\n </div>\n }\n </div>\n\n <div class=\"datatable-table overflow-x-auto h-full bg-base-200\">\n <table class=\"table table-sm table-pin-rows\">\n <thead>\n <tr class=\"text-xs overflow-hidden bg-base-200\">\n <ng-content select=\"[head]\" />\n </tr>\n </thead>\n <tbody>\n @if (hasError()) {\n <tr>\n <td [attr.colspan]=\"colspan()\" class=\"text-center\">\n {{translations.errorLoadDataLabel}}\n </td>\n </tr>\n } @else {\n <ng-content select=\"[body]\" />\n\n @if (!withPaginator() && !isLoading() && totalItemsOnPage() < totalItems()) {\n <tr>\n <td [attr.colspan]=\"colspan()\">\n <button\n klButton\n outline\n [color]=\"loadMoreBtnColor()\"\n class=\"w-full\"\n (click)=\"loadMore.emit()\">\n {{translations.loadMoreBtnLabel}}\n </button>\n </td>\n </tr>\n }\n\n @if (isLoading()) {\n @for (row of skeletonRows(); track $index) {\n <tr>\n @for (col of skeletonCols(); track $index) {\n <td><span class=\"block skeleton w-full h-4\"></span></td>\n }\n </tr>\n }\n }\n }\n </tbody>\n </table>\n </div>\n\n @if (withPaginator()) {\n <div class=\"px-4 py-2 bg-base-200 border-t border-neutral-200 dark:border-neutral-700 w-full flex items-center justify-between\">\n <div class=\"flex items-center justify-end gap-3 text-xs\">\n <span class=\"flex items-center justify-end gap-1 opacity-60\">\n <span>{{translations.labelItemsPerPage}}:</span>\n\n <select class=\"select select-sm p-0 pl-2 pr-0 w-15 h-6\" [(ngModel)]=\"pageSize\">\n @for (item of pageSizes; track $index) {\n <option [value]=\"item\">{{ item }}</option>\n }\n </select>\n </span>\n <span class=\"opacity-60\">|</span>\n <span class=\"opacity-60\">{{totalItemsOnPage()}} de {{totalItems()}}</span>\n </div>\n\n <div class=\"flex items-center gap-8\">\n <span class=\"text-xs opacity-60\">{{translations.paginatorPagesFeedback(currentPage(), lastPage())}}</span>\n\n <div class=\"join flex items-center\">\n <button class=\"join-item btn btn-sm\"\n [disabled]=\"currentPage() === 1\"\n (click)=\"pageChange.emit(1)\">\n <i class=\"fa-solid fa-angles-left text-[0.6rem]\"></i>\n </button>\n\n <button class=\"join-item btn btn-sm\"\n [disabled]=\"currentPage() === 1\"\n (click)=\"pageChange.emit(currentPage() - 1)\">\n <i class=\"fa-solid fa-chevron-left text-[0.6rem]\"></i>\n </button>\n\n <button class=\"join-item btn btn-sm\"\n [disabled]=\"currentPage() === lastPage()\"\n (click)=\"pageChange.emit(currentPage() + 1)\">\n <i class=\"fa-solid fa-angle-right text-[0.6rem]\"></i>\n </button>\n\n <button class=\"join-item btn btn-sm\"\n [disabled]=\"currentPage() === lastPage()\"\n (click)=\"pageChange.emit(lastPage())\">\n <i class=\"fa-solid fa-angles-right text-[0.6rem]\"></i>\n </button>\n </div>\n </div>\n </div>\n }\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"koalarx-ui-shared-components-datatable.mjs","sources":["../../projects/koala-ui/shared/components/datatable/sort-column/ordered-column.state.ts","../../projects/koala-ui/shared/components/datatable/sort-column/sort-header-column.ts","../../projects/koala-ui/shared/components/datatable/sort-column/sort-header-column.html","../../projects/koala-ui/shared/components/datatable/sort-column/sorted-item.ts","../../projects/koala-ui/shared/components/datatable/filter/datatable-filter.ts","../../projects/koala-ui/shared/components/datatable/filter/filter-factory.ts","../../projects/koala-ui/shared/components/datatable/filter/filter.ts","../../projects/koala-ui/shared/components/datatable/filter/filter.html","../../projects/koala-ui/shared/components/datatable/datatable.ts","../../projects/koala-ui/shared/components/datatable/datatable.html","../../projects/koala-ui/shared/components/datatable/koalarx-ui-shared-components-datatable.ts"],"sourcesContent":["import { SortHeaderColumn } from './sort-header-column';\r\n\r\nexport class OrderedColumnState {\r\n static current?: SortHeaderColumn;\r\n}\r\n","import {\n Component,\n effect,\n ElementRef,\n input,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport {\n QueryPaginationDirection,\n SortFilterType,\n} from '@koalarx/ui/core/models';\nimport { OrderedColumnState } from './ordered-column.state';\n\n@Component({\n selector: 'kl-sort-header-column',\n templateUrl: './sort-header-column.html',\n})\nexport class SortHeaderColumn {\n orderBy = input.required<string>();\n style = input('');\n defaultDirection = input<QueryPaginationDirection>();\n sortable = output<SortFilterType>();\n elOrderedColumn =\n viewChild<ElementRef<HTMLTableCellElement>>('orderedColumn');\n direction = signal<QueryPaginationDirection | null>(null);\n\n constructor() {\n effect(() => {\n const defaultDirection = this.defaultDirection();\n\n if (defaultDirection) {\n this.direction.set(defaultDirection);\n OrderedColumnState.current = this;\n this.toogleColumnStateOrder('set');\n }\n });\n }\n\n sort() {\n this.direction.update((current) => {\n if (\n OrderedColumnState.current &&\n OrderedColumnState.current.orderBy !== this.orderBy\n ) {\n OrderedColumnState.current.direction.set(null);\n OrderedColumnState.current.toogleColumnStateOrder('unset');\n }\n\n OrderedColumnState.current = this;\n\n let direction: QueryPaginationDirection;\n\n switch (current) {\n case 'asc':\n direction = 'desc';\n break;\n case 'desc':\n default:\n direction = 'asc';\n }\n\n this.toogleColumnStateOrder('set');\n\n this.sortable.emit({\n orderBy: this.orderBy(),\n direction,\n });\n\n return direction;\n });\n }\n\n async toogleColumnStateOrder(state: 'set' | 'unset') {\n const columnElement = this.elOrderedColumn()?.nativeElement.parentElement;\n\n if (!columnElement) {\n return;\n }\n\n if (state === 'set') {\n columnElement.classList.add('ordered-column');\n } else {\n columnElement.classList.remove('ordered-column');\n }\n }\n}\n","<div #orderedColumn [style]=\"style()\" class=\"flex items-center justify-start gap-1 py-2 px-3 cursor-pointer\"\n [class.not-ordered]=\"direction() === null\"\n [class.asc]=\"direction() === 'asc'\"\n [class.desc]=\"direction() === 'desc'\"\n (click)=\"sort()\">\n\n @switch (direction()) {\n @case ('asc') {\n <i class=\"fa-solid fa-arrow-down-short-wide\"></i>\n }\n @case ('desc') {\n <i class=\"fa-solid fa-arrow-down-wide-short\"></i>\n }\n @default {\n <i class=\"fa-solid fa-sort\"></i>\n }\n }\n\n <ng-content />\n</div>\n","import { Directive, effect, ElementRef, inject, input } from '@angular/core';\nimport { SortFilterType } from '@koalarx/ui/core/models';\n\n@Directive({ selector: 'td[klSortedItem]' })\nexport class SortedItem {\n private readonly elementRef = inject<ElementRef<HTMLTableCellElement>>(\n ElementRef<HTMLTableCellElement>\n );\n\n klSortedItem = input.required<SortFilterType | null>();\n sortedPropName = input.required<string>();\n\n constructor() {\n effect(() => {\n const isSorted = this.klSortedItem()?.orderBy === this.sortedPropName();\n\n this.elementRef.nativeElement.classList.toggle('sorted', isSorted);\n\n if (isSorted) {\n this.elementRef.nativeElement.setAttribute('aria-sort', 'ascending');\n } else {\n this.elementRef.nativeElement.setAttribute('aria-sort', 'descending');\n }\n });\n }\n}\n","import { effect, Injectable, signal } from '@angular/core';\n\nexport interface FilterData {\n templateValue: string;\n propName: string;\n value: any;\n}\n\n@Injectable()\nexport class DatatableFilter {\n private readonly _payload = signal<Record<string, any>>({});\n private readonly _filters = signal<FilterData[]>([]);\n private readonly _clearFilter = signal<boolean>(false);\n\n constructor() {\n effect(() => {\n const filters = this._filters();\n const payload = this.payload();\n\n if (filters.length === 0 && Object.keys(payload).length > 0) {\n this._clearFilter.set(true);\n setTimeout(() => this._clearFilter.set(false));\n return;\n }\n });\n\n effect(() => {\n const filters = this._filters();\n\n this._payload.update(() => {\n const result: any = {};\n\n filters.forEach((filter) => {\n result[filter.propName] = filter.value;\n });\n\n return result;\n });\n });\n }\n\n get payload() {\n return this._payload.asReadonly();\n }\n\n get filters() {\n return this._filters.asReadonly();\n }\n\n get clearFilter() {\n return this._clearFilter.asReadonly();\n }\n\n setFilters(filters: FilterData[]) {\n this._filters.set(filters);\n }\n\n removeFilter(propName: string) {\n this._filters.update((current) =>\n current.filter((filter) => filter.propName !== propName),\n );\n }\n\n clearFilters() {\n this._filters.set([]);\n this._payload.set({});\n\n this._clearFilter.set(true);\n setTimeout(() => this._clearFilter.set(false));\n }\n}\n","import { Injectable } from '@angular/core';\nimport { FilterData } from './datatable-filter';\n\n@Injectable()\nexport class FilterFactory {\n private readonly _filter: FilterData[] = [];\n\n get filter() {\n return [...this._filter];\n }\n\n setFilters<T>(\n filter: T,\n templateNameFn: (propName: keyof typeof filter, value: any) => string\n ) {\n const filterData = filter as Record<string, any>;\n\n Object.keys(filterData).forEach((propName) => {\n const value = filterData[propName];\n\n if (value === null || value === undefined || value === '') {\n return;\n }\n\n const templateValue = templateNameFn(propName as any, value);\n this.addFilter({ templateValue, propName, value });\n });\n\n return this._filter;\n }\n\n addFilter(filter: FilterData) {\n this._filter.push(filter);\n }\n\n toPayload(data: FilterData[]): Record<string, any> {\n return data.reduce((acc, curr) => {\n acc[curr.propName] = curr.value;\n return acc;\n }, {} as Record<string, any>);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n effect,\n inject,\n input,\n output,\n} from '@angular/core';\nimport { Tooltip } from '@koalarx/ui/shared/directives';\nimport { DatatableFilter, FilterData } from './datatable-filter';\nimport { AppConfig } from '@koalarx/ui/core/config';\n\n@Component({\n selector: 'kl-filter',\n templateUrl: './filter.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [DatatableFilter],\n imports: [Tooltip],\n})\nexport class Filter {\n readonly translations = inject(AppConfig).translation.datatable;\n\n datatableFilter = inject(DatatableFilter);\n filter = input<FilterData[]>([]);\n payload = output<Record<string, any>>();\n addFilter = output<FilterData[]>();\n clearFilter = output<void>();\n\n constructor() {\n effect(() => this.datatableFilter.setFilters(this.filter()));\n effect(() => this.payload.emit(this.datatableFilter.payload()));\n effect(() => {\n if (this.datatableFilter.clearFilter()) {\n this.clearFilter.emit();\n }\n });\n }\n\n add() {\n this.addFilter.emit(this.datatableFilter.filters());\n }\n}\n","@if (datatableFilter.filters().length > 0) {\n <div class=\"datatable-filter-container px-1 w-full flex items-center gap-3 text-neutral-500 dark:text-neutral-300\">\n\n <button class=\"hover:cursor-pointer\"\n [tooltip]=\"translations.clearFilterTooltip\"\n tooltipPosition=\"right\"\n (click)=\"datatableFilter.clearFilters()\">\n <i class=\"fa-solid fa-filter-circle-xmark text-sm\"></i>\n </button>\n\n <div class=\"flex items-center flex-wrap gap-1\">\n @for (item of datatableFilter.filters(); track $index) {\n <div class=\"badge badge-outline text-xs\">\n <span>{{item.templateValue}}</span>\n <button class=\"hover:cursor-pointer\" (click)=\"datatableFilter.removeFilter(item.propName)\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n }\n </div>\n\n <button class=\"hover:cursor-pointer\"\n [tooltip]=\"translations.addFilterTooltip\"\n tooltipPosition=\"right\"\n (click)=\"add()\">\n <i class=\"fa-solid fa-circle-plus text-sm\"></i>\n </button>\n </div>\n}\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n inject,\n input,\n model,\n output,\n signal,\n Type,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { AppConfig } from '@koalarx/ui/core/config';\nimport { SideWindow } from '@koalarx/ui/shared/components/side-window';\nimport { Button, ButtonColor } from '@koalarx/ui/shared/directives';\nimport { DatatableConfig } from './datatable-config';\nimport { FilterData } from './filter/datatable-filter';\nimport { Filter } from './filter/filter';\n\n@Component({\n selector: 'kl-datatable',\n templateUrl: './datatable.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [FormsModule, Filter, Button],\n})\nexport class Datatable {\n private readonly sideWindow = inject(SideWindow);\n\n readonly translations = inject(AppConfig).translation.datatable;\n\n config = input.required<DatatableConfig>();\n colspan = input.required<number>();\n loadMoreBtnColor = input<ButtonColor>('accent');\n filterBtnColor = input<ButtonColor>('primary');\n componentFilter = input<Type<any>>();\n withPaginator = input(false, { transform: booleanAttribute });\n\n currentPage = computed(() => this.config().currentPage);\n totalItems = computed(() => this.config().totalItems);\n totalItemsOnPage = computed(() => this.config().totalItemsOnPage);\n currentPageSize = computed(() => this.config().currentPageSize);\n isLoading = computed(() => this.config().isLoading);\n hasError = computed(() => this.config().hasError);\n\n filter = signal<FilterData[]>([]);\n hasFilter = computed(() => {\n return this.filter().length > 0;\n });\n pageSize = model<number>(0);\n pageSizes = [10, 20, 30, 50, 100];\n\n skeletonRows = computed(() => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);\n skeletonCols = computed(() => {\n return Array.from({ length: this.colspan() }, (_, i) => i);\n });\n\n lastPage = computed(() => {\n const isLoading = this.isLoading();\n\n if (!isLoading) {\n return Math.ceil(this.totalItems() / this.currentPageSize());\n }\n\n return 1;\n });\n\n pageChange = output<number>();\n pageSizeChange = output<number>();\n filterChange = output<Record<string, any>>();\n reloadList = output<void>();\n loadMore = output<void>();\n\n constructor() {\n effect(() => this.pageSize.set(this.currentPageSize()));\n effect(() => this.pageSizeChange.emit(this.pageSize()));\n effect(() => this.pageChange.emit(this.currentPage()));\n }\n\n openFilter(data?: FilterData[]) {\n const component = this.componentFilter();\n\n if (!component) {\n return;\n }\n\n this.sideWindow.open(component, {\n data,\n afterClosed: {\n trigger: [],\n callback: (filters: FilterData[]) => this.filter.set(filters),\n },\n });\n }\n}\n","<div class=\"flex flex-col h-full\">\n <div class=\"datatable-menu-container pl-2 pr-4 w-full flex items-center justify-between gap-2 z-10\">\n <div class=\"datatable-menu flex items-center py-2 px-0.5 opacity-80 gap-2\">\n <div class=\"addicional-options-menu flex items-center opacity-80\">\n <ng-content select=\"[menu]\" />\n </div>\n\n <span class=\"datatable-separator-menu relative top-[-0.10rem] opacity-20\">|</span>\n\n @if (componentFilter()) {\n @if (hasFilter()) {\n <kl-filter\n [filter]=\"filter()\"\n (addFilter)=\"openFilter($event)\"\n (payload)=\"filterChange.emit($event)\"\n (clearFilter)=\"filter.set([])\"\n />\n\n <span class=\"relative top-[-0.10rem] opacity-20\">|</span>\n } @else {\n <button klButton\n size=\"extraSmall\"\n class=\"text-sm font-light\"\n [color]=\"filterBtnColor()\"\n (click)=\"openFilter()\">\n <i class=\"fa-solid fa-filter text-xs\"></i>\n {{translations.btnFilterLabel}}\n </button>\n }\n }\n\n <button class=\"btn btn-outline border-neutral-300 hover:border-neutral-500 dark:border-neutral-700 btn-xs text-sm font-light\"\n (click)=\"reloadList.emit()\">\n <i class=\"fa-solid fa-rotate-right text-xs\"></i>\n {{translations.reloadListTooltip}}\n </button>\n </div>\n\n @if (!withPaginator()) {\n <div class=\"flex items-center justify-end gap-3 text-sm\">\n <span class=\"flex items-center justify-end gap-1 opacity-60\">\n <span class=\"whitespace-nowrap\">{{translations.labelItemsPerPage}}:</span>\n\n <select class=\"select select-md p-0 pl-2 pr-8 h-6 w-auto\" [(ngModel)]=\"pageSize\">\n @for (item of pageSizes; track $index) {\n <option [value]=\"item\">{{ item }}</option>\n }\n </select>\n </span>\n <span class=\"opacity-60\">|</span>\n <span class=\"opacity-60 whitespace-nowrap\">{{totalItemsOnPage()}} de {{totalItems()}}</span>\n </div>\n }\n </div>\n\n <div class=\"datatable-table overflow-x-auto h-auto bg-base-200\">\n <table class=\"table table-sm table-pin-rows\">\n <thead>\n <tr class=\"text-xs overflow-hidden bg-base-200\">\n <ng-content select=\"[head]\" />\n </tr>\n </thead>\n <tbody>\n @if (hasError()) {\n <tr>\n <td [attr.colspan]=\"colspan()\" class=\"text-center\">\n {{translations.errorLoadDataLabel}}\n </td>\n </tr>\n } @else {\n <ng-content select=\"[body]\" />\n\n @if (!withPaginator() && !isLoading() && totalItemsOnPage() < totalItems()) {\n <tr>\n <td [attr.colspan]=\"colspan()\">\n <button\n klButton\n outline\n [color]=\"loadMoreBtnColor()\"\n class=\"w-full\"\n (click)=\"loadMore.emit()\">\n {{translations.loadMoreBtnLabel}}\n </button>\n </td>\n </tr>\n }\n\n @if (isLoading()) {\n @for (row of skeletonRows(); track $index) {\n <tr>\n @for (col of skeletonCols(); track $index) {\n <td><span class=\"block skeleton w-full h-4\"></span></td>\n }\n </tr>\n }\n }\n }\n </tbody>\n </table>\n </div>\n\n @if (withPaginator()) {\n <div class=\"px-4 py-2 bg-base-200 border-t border-neutral-200 dark:border-neutral-700 w-full flex items-center justify-between\">\n <div class=\"flex items-center justify-end gap-3 text-xs\">\n <span class=\"flex items-center justify-end gap-1 opacity-60\">\n <span>{{translations.labelItemsPerPage}}:</span>\n\n <select class=\"select select-sm p-0 pl-2 pr-0 w-15 h-6\" [(ngModel)]=\"pageSize\">\n @for (item of pageSizes; track $index) {\n <option [value]=\"item\">{{ item }}</option>\n }\n </select>\n </span>\n <span class=\"opacity-60\">|</span>\n <span class=\"opacity-60\">{{totalItemsOnPage()}} de {{totalItems()}}</span>\n </div>\n\n <div class=\"flex items-center gap-8\">\n <span class=\"text-xs opacity-60\">{{translations.paginatorPagesFeedback(currentPage(), lastPage())}}</span>\n\n <div class=\"join flex items-center\">\n <button class=\"join-item btn btn-sm\"\n [disabled]=\"currentPage() === 1\"\n (click)=\"pageChange.emit(1)\">\n <i class=\"fa-solid fa-angles-left text-[0.6rem]\"></i>\n </button>\n\n <button class=\"join-item btn btn-sm\"\n [disabled]=\"currentPage() === 1\"\n (click)=\"pageChange.emit(currentPage() - 1)\">\n <i class=\"fa-solid fa-chevron-left text-[0.6rem]\"></i>\n </button>\n\n <button class=\"join-item btn btn-sm\"\n [disabled]=\"currentPage() === lastPage()\"\n (click)=\"pageChange.emit(currentPage() + 1)\">\n <i class=\"fa-solid fa-angle-right text-[0.6rem]\"></i>\n </button>\n\n <button class=\"join-item btn btn-sm\"\n [disabled]=\"currentPage() === lastPage()\"\n (click)=\"pageChange.emit(lastPage())\">\n <i class=\"fa-solid fa-angles-right text-[0.6rem]\"></i>\n </button>\n </div>\n </div>\n </div>\n }\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -4,17 +4,23 @@ import * as i1 from '@angular/forms';
4
4
  import { ReactiveFormsModule, FormsModule } from '@angular/forms';
5
5
  import { FieldErrors } from '@koalarx/ui/shared/components/field-errors';
6
6
  import { InputFieldBase } from '@koalarx/ui/shared/components/input-field';
7
- import { InputCurrencyMask } from '@koalarx/ui/shared/directives';
7
+ import { InputCurrencyMask, HookChange } from '@koalarx/ui/shared/directives';
8
8
 
9
9
  class InputCurrency extends InputFieldBase {
10
10
  decimalCount = input(2, ...(ngDevMode ? [{ debugName: "decimalCount" }] : []));
11
- currentValue = linkedSignal(() => this.control().value, ...(ngDevMode ? [{ debugName: "currentValue" }] : []));
11
+ currentValue = linkedSignal(() => this.valueChange(), ...(ngDevMode ? [{ debugName: "currentValue" }] : []));
12
12
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: InputCurrency, deps: null, target: i0.ɵɵFactoryTarget.Component });
13
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.6", type: InputCurrency, isStandalone: true, selector: "kl-input-currency", inputs: { decimalCount: { classPropertyName: "decimalCount", publicName: "decimalCount", isSignal: true, isRequired: false, transformFunction: null } }, usesInheritance: true, ngImport: i0, template: "<label [attr.for]=\"fieldId\" class=\"floating-label input validator w-full rounded-sm\">\n @if (label(); as label) {\n <span>\n <ng-content select=\"[icon]\" />\n {{ label }} {{ isRequired() ? '*' : '' }}\n </span>\n }\n\n <input\n [id]=\"fieldId\"\n [formControl]=\"control()\"\n [placeholder]=\"label()\n ? label() + (isRequired() ? '*' : '')\n : placeholder()\"\n [required]=\"isRequired()\"\n type=\"tel\"\n currencyMask\n [decimalCount]=\"decimalCount()\"\n (currencyValue)=\"control().setValue($event)\"\n />\n\n <ng-content select=\"[suffix]\" />\n</label>\n\n@if (hint()) {\n <span class=\"hint-content\">{{hint()}}</span>\n}\n\n<kl-field-errors [field]=\"control()\">\n <ng-container errors>\n <ng-content select=\"[errors]\" />\n </ng-container>\n</kl-field-errors>\n", dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: InputCurrencyMask, selector: "input[currencyMask]", inputs: ["decimalCount"], outputs: ["currencyValue"] }, { kind: "component", type: FieldErrors, selector: "kl-field-errors", inputs: ["field"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
13
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.6", type: InputCurrency, isStandalone: true, selector: "kl-input-currency", inputs: { decimalCount: { classPropertyName: "decimalCount", publicName: "decimalCount", isSignal: true, isRequired: false, transformFunction: null } }, usesInheritance: true, ngImport: i0, template: "<label [attr.for]=\"fieldId\" class=\"floating-label input validator w-full rounded-sm\">\n @if (label(); as label) {\n <span>\n <ng-content select=\"[icon]\" />\n {{ label }} {{ isRequired() ? '*' : '' }}\n </span>\n }\n\n <input\n [id]=\"fieldId\"\n [formControl]=\"control()\"\n [placeholder]=\"label()\n ? label() + (isRequired() ? '*' : '')\n : placeholder()\"\n [required]=\"isRequired()\"\n type=\"tel\"\n currencyMask\n [decimalCount]=\"decimalCount()\"\n [hookChange]=\"valueChange()\"\n (currencyValue)=\"control().setValue($event)\"\n />\n\n <ng-content select=\"[suffix]\" />\n</label>\n\n@if (hint()) {\n <span class=\"hint-content\">{{hint()}}</span>\n}\n\n<kl-field-errors [field]=\"control()\">\n <ng-container errors>\n <ng-content select=\"[errors]\" />\n </ng-container>\n</kl-field-errors>\n", dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: InputCurrencyMask, selector: "input[currencyMask]", inputs: ["decimalCount"], outputs: ["currencyValue"] }, { kind: "component", type: FieldErrors, selector: "kl-field-errors", inputs: ["field"] }, { kind: "directive", type: HookChange, selector: "[hookChange]", inputs: ["hookChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
14
14
  }
15
15
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: InputCurrency, decorators: [{
16
16
  type: Component,
17
- args: [{ selector: 'kl-input-currency', imports: [ReactiveFormsModule, FormsModule, InputCurrencyMask, FieldErrors], changeDetection: ChangeDetectionStrategy.OnPush, template: "<label [attr.for]=\"fieldId\" class=\"floating-label input validator w-full rounded-sm\">\n @if (label(); as label) {\n <span>\n <ng-content select=\"[icon]\" />\n {{ label }} {{ isRequired() ? '*' : '' }}\n </span>\n }\n\n <input\n [id]=\"fieldId\"\n [formControl]=\"control()\"\n [placeholder]=\"label()\n ? label() + (isRequired() ? '*' : '')\n : placeholder()\"\n [required]=\"isRequired()\"\n type=\"tel\"\n currencyMask\n [decimalCount]=\"decimalCount()\"\n (currencyValue)=\"control().setValue($event)\"\n />\n\n <ng-content select=\"[suffix]\" />\n</label>\n\n@if (hint()) {\n <span class=\"hint-content\">{{hint()}}</span>\n}\n\n<kl-field-errors [field]=\"control()\">\n <ng-container errors>\n <ng-content select=\"[errors]\" />\n </ng-container>\n</kl-field-errors>\n" }]
17
+ args: [{ selector: 'kl-input-currency', imports: [
18
+ ReactiveFormsModule,
19
+ FormsModule,
20
+ InputCurrencyMask,
21
+ FieldErrors,
22
+ HookChange,
23
+ ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<label [attr.for]=\"fieldId\" class=\"floating-label input validator w-full rounded-sm\">\n @if (label(); as label) {\n <span>\n <ng-content select=\"[icon]\" />\n {{ label }} {{ isRequired() ? '*' : '' }}\n </span>\n }\n\n <input\n [id]=\"fieldId\"\n [formControl]=\"control()\"\n [placeholder]=\"label()\n ? label() + (isRequired() ? '*' : '')\n : placeholder()\"\n [required]=\"isRequired()\"\n type=\"tel\"\n currencyMask\n [decimalCount]=\"decimalCount()\"\n [hookChange]=\"valueChange()\"\n (currencyValue)=\"control().setValue($event)\"\n />\n\n <ng-content select=\"[suffix]\" />\n</label>\n\n@if (hint()) {\n <span class=\"hint-content\">{{hint()}}</span>\n}\n\n<kl-field-errors [field]=\"control()\">\n <ng-container errors>\n <ng-content select=\"[errors]\" />\n </ng-container>\n</kl-field-errors>\n" }]
18
24
  }], propDecorators: { decimalCount: [{ type: i0.Input, args: [{ isSignal: true, alias: "decimalCount", required: false }] }] } });
19
25
 
20
26
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"koalarx-ui-shared-components-input-field-input-currency.mjs","sources":["../../projects/koala-ui/shared/components/input-field/input-currency/input-currency.ts","../../projects/koala-ui/shared/components/input-field/input-currency/input-currency.html","../../projects/koala-ui/shared/components/input-field/input-currency/koalarx-ui-shared-components-input-field-input-currency.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n input,\n linkedSignal,\n} from '@angular/core';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { FieldErrors } from '@koalarx/ui/shared/components/field-errors';\nimport { InputFieldBase } from '@koalarx/ui/shared/components/input-field';\nimport { InputCurrencyMask } from '@koalarx/ui/shared/directives';\n\n@Component({\n selector: 'kl-input-currency',\n templateUrl: './input-currency.html',\n imports: [ReactiveFormsModule, FormsModule, InputCurrencyMask, FieldErrors],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class InputCurrency extends InputFieldBase {\n decimalCount = input<number>(2);\n currentValue = linkedSignal(() => this.control().value);\n}\n","<label [attr.for]=\"fieldId\" class=\"floating-label input validator w-full rounded-sm\">\n @if (label(); as label) {\n <span>\n <ng-content select=\"[icon]\" />\n {{ label }} {{ isRequired() ? '*' : '' }}\n </span>\n }\n\n <input\n [id]=\"fieldId\"\n [formControl]=\"control()\"\n [placeholder]=\"label()\n ? label() + (isRequired() ? '*' : '')\n : placeholder()\"\n [required]=\"isRequired()\"\n type=\"tel\"\n currencyMask\n [decimalCount]=\"decimalCount()\"\n (currencyValue)=\"control().setValue($event)\"\n />\n\n <ng-content select=\"[suffix]\" />\n</label>\n\n@if (hint()) {\n <span class=\"hint-content\">{{hint()}}</span>\n}\n\n<kl-field-errors [field]=\"control()\">\n <ng-container errors>\n <ng-content select=\"[errors]\" />\n </ng-container>\n</kl-field-errors>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;;AAiBM,MAAO,aAAc,SAAQ,cAAc,CAAA;AAC/C,IAAA,YAAY,GAAG,KAAK,CAAS,CAAC,wDAAC;AAC/B,IAAA,YAAY,GAAG,YAAY,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,wDAAC;uGAF5C,aAAa,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAb,aAAa,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECjB1B,y0BAiCA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDnBY,mBAAmB,syBAAE,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,iBAAiB,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,cAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,WAAW,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAG/D,aAAa,EAAA,UAAA,EAAA,CAAA;kBANzB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,mBAAmB,EAAA,OAAA,EAEpB,CAAC,mBAAmB,EAAE,WAAW,EAAE,iBAAiB,EAAE,WAAW,CAAC,EAAA,eAAA,EAC1D,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,y0BAAA,EAAA;;;AEfjD;;AAEG;;;;"}
1
+ {"version":3,"file":"koalarx-ui-shared-components-input-field-input-currency.mjs","sources":["../../projects/koala-ui/shared/components/input-field/input-currency/input-currency.ts","../../projects/koala-ui/shared/components/input-field/input-currency/input-currency.html","../../projects/koala-ui/shared/components/input-field/input-currency/koalarx-ui-shared-components-input-field-input-currency.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n input,\n linkedSignal,\n} from '@angular/core';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { FieldErrors } from '@koalarx/ui/shared/components/field-errors';\nimport { InputFieldBase } from '@koalarx/ui/shared/components/input-field';\nimport { HookChange, InputCurrencyMask } from '@koalarx/ui/shared/directives';\n\n@Component({\n selector: 'kl-input-currency',\n templateUrl: './input-currency.html',\n imports: [\n ReactiveFormsModule,\n FormsModule,\n InputCurrencyMask,\n FieldErrors,\n HookChange,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class InputCurrency extends InputFieldBase {\n decimalCount = input<number>(2);\n currentValue = linkedSignal(() => this.valueChange());\n}\n","<label [attr.for]=\"fieldId\" class=\"floating-label input validator w-full rounded-sm\">\n @if (label(); as label) {\n <span>\n <ng-content select=\"[icon]\" />\n {{ label }} {{ isRequired() ? '*' : '' }}\n </span>\n }\n\n <input\n [id]=\"fieldId\"\n [formControl]=\"control()\"\n [placeholder]=\"label()\n ? label() + (isRequired() ? '*' : '')\n : placeholder()\"\n [required]=\"isRequired()\"\n type=\"tel\"\n currencyMask\n [decimalCount]=\"decimalCount()\"\n [hookChange]=\"valueChange()\"\n (currencyValue)=\"control().setValue($event)\"\n />\n\n <ng-content select=\"[suffix]\" />\n</label>\n\n@if (hint()) {\n <span class=\"hint-content\">{{hint()}}</span>\n}\n\n<kl-field-errors [field]=\"control()\">\n <ng-container errors>\n <ng-content select=\"[errors]\" />\n </ng-container>\n</kl-field-errors>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;;AAuBM,MAAO,aAAc,SAAQ,cAAc,CAAA;AAC/C,IAAA,YAAY,GAAG,KAAK,CAAS,CAAC,wDAAC;IAC/B,YAAY,GAAG,YAAY,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,cAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAC;uGAF1C,aAAa,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAb,aAAa,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECvB1B,62BAkCA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDnBI,mBAAmB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,wIAAA,EAAA,MAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACnB,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACX,iBAAiB,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,cAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACjB,WAAW,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACX,UAAU,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,YAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAID,aAAa,EAAA,UAAA,EAAA,CAAA;kBAZzB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,mBAAmB,EAAA,OAAA,EAEpB;wBACP,mBAAmB;wBACnB,WAAW;wBACX,iBAAiB;wBACjB,WAAW;wBACX,UAAU;qBACX,EAAA,eAAA,EACgB,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,62BAAA,EAAA;;;AErBjD;;AAEG;;;;"}
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { afterRenderEffect, isSignal, runInInjectionContext, effect, ChangeDetectionStrategy, Component, createComponent, inject, ApplicationRef, DestroyRef, Injector, viewChild, signal, model, input, booleanAttribute, output, Injectable } from '@angular/core';
2
+ import { afterRenderEffect, isSignal, runInInjectionContext, effect, ChangeDetectionStrategy, Component, createComponent, inject, ApplicationRef, Injector, viewChild, signal, model, input, booleanAttribute, output, Injectable } from '@angular/core';
3
3
  import * as i1 from '@angular/forms';
4
4
  import { FormsModule, ReactiveFormsModule } from '@angular/forms';
5
5
  import { Loader } from '@koalarx/ui/core/components/loader';
@@ -246,11 +246,11 @@ class SelectOptionBadge {
246
246
  throw new Error('Remove callback not set');
247
247
  };
248
248
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: SelectOptionBadge, deps: [], target: i0.ɵɵFactoryTarget.Component });
249
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.0.6", type: SelectOptionBadge, isStandalone: true, selector: "kl-select-option-badge", ngImport: i0, template: "<span class=\"flex items-center badge badge-outline badge-primary badge-sm rounded-sm bg-primary/20 dark:text-neutral-300 dark:border-primary\">\n <ng-content />\n <i class=\"fa-solid fa-xmark text-neutral-500 hover:cursor-pointer\"\n (click)=\"removeCallback($event)\">\n </i>\n</span>\n", changeDetection: i0.ChangeDetectionStrategy.OnPush });
249
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.0.6", type: SelectOptionBadge, isStandalone: true, selector: "kl-select-option-badge", ngImport: i0, template: "<span class=\"flex items-center h-auto badge badge-outline badge-primary badge-sm rounded-sm bg-primary/20 dark:text-neutral-300 dark:border-primary\">\n <ng-content />\n <i class=\"fa-solid fa-xmark text-neutral-500 hover:cursor-pointer\"\n (click)=\"removeCallback($event)\">\n </i>\n</span>\n", changeDetection: i0.ChangeDetectionStrategy.OnPush });
250
250
  }
251
251
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: SelectOptionBadge, decorators: [{
252
252
  type: Component,
253
- args: [{ selector: 'kl-select-option-badge', changeDetection: ChangeDetectionStrategy.OnPush, template: "<span class=\"flex items-center badge badge-outline badge-primary badge-sm rounded-sm bg-primary/20 dark:text-neutral-300 dark:border-primary\">\n <ng-content />\n <i class=\"fa-solid fa-xmark text-neutral-500 hover:cursor-pointer\"\n (click)=\"removeCallback($event)\">\n </i>\n</span>\n" }]
253
+ args: [{ selector: 'kl-select-option-badge', changeDetection: ChangeDetectionStrategy.OnPush, template: "<span class=\"flex items-center h-auto badge badge-outline badge-primary badge-sm rounded-sm bg-primary/20 dark:text-neutral-300 dark:border-primary\">\n <ng-content />\n <i class=\"fa-solid fa-xmark text-neutral-500 hover:cursor-pointer\"\n (click)=\"removeCallback($event)\">\n </i>\n</span>\n" }]
254
254
  }] });
255
255
 
256
256
  function hasValue(value) {
@@ -336,7 +336,6 @@ async function setSelectedOptionContent(component) {
336
336
 
337
337
  class Select extends InputFieldBase {
338
338
  appRef = inject(ApplicationRef);
339
- destroyRef = inject(DestroyRef);
340
339
  injector = inject(Injector);
341
340
  selectField = viewChild('selectField', ...(ngDevMode ? [{ debugName: "selectField" }] : []));
342
341
  optionsResource = signal(null, ...(ngDevMode ? [{ debugName: "optionsResource" }] : []));
@@ -424,11 +423,11 @@ class Select extends InputFieldBase {
424
423
  inputValue.click();
425
424
  }
426
425
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: Select, deps: [], target: i0.ɵɵFactoryTarget.Component });
427
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.6", type: Select, isStandalone: true, selector: "kl-select", inputs: { filter: { classPropertyName: "filter", publicName: "filter", isSignal: true, isRequired: false, transformFunction: null }, options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: true, transformFunction: null }, internalFilter: { classPropertyName: "internalFilter", publicName: "internalFilter", isSignal: true, isRequired: false, transformFunction: null }, withoutFilter: { classPropertyName: "withoutFilter", publicName: "withoutFilter", isSignal: true, isRequired: false, transformFunction: null }, multiple: { classPropertyName: "multiple", publicName: "multiple", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { filter: "filterChange", selectedItem: "selectedItem" }, viewQueries: [{ propertyName: "selectField", first: true, predicate: ["selectField"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"kl-select-container relative w-full has-[select:disabled]:cursor-not-allowed\"\n [class.has-value]=\"hasValue()\">\n\n @if (label(); as label) {\n <label class=\"kl-select-label flex items-center gap-2 whitespace-nowrap text-neutral-900 dark:text-neutral-300\"\n [attr.for]=\"fieldId\">\n @if (isDisabled()) {\n <span class=\"text-neutral-200 dark:text-neutral-600\">\n {{ label }} {{ isRequired() ? '*' : '' }}\n </span>\n } @else {\n <span>{{ label }} {{ isRequired() ? '*' : '' }}</span>\n }\n </label>\n }\n\n @if (!isDisabled() && hasValue()) {\n <div class=\"flex items-center justify-center h-full absolute top-0 right-7 z-10 pr-2\">\n <button class=\"kl-select-clear-button text-neutral-400 hover:cursor-pointer text-sm focus:shadow-none!\"\n type=\"button\"\n (click)=\"clear($event)\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n }\n\n <div class=\"kl-select-content\" #selectField>\n <button type=\"button\" class=\"kl-select-button flex disabled:border-neutral-200! disabled:dark:border-neutral-800!\"\n [attr.popovertarget]=\"fieldId\"\n popovertargetaction=\"toggle\">\n\n <span class=\"selectcontent flex flex-wrap gap-1 items-center w-full h-full\" [class.py-3]=\"multiple()\"></span>\n\n <span class=\"picker\">\n @if (isLoading()) {\n <kl-loader size=\"small\" />\n } @else {\n <i class=\"fa-solid fa-caret-down\"></i>\n }\n </span>\n </button>\n\n <div [id]=\"fieldId\" popover class=\"kl-select-options-container with-popover relative flex flex-col overflow-hidden bg-base-100 dark:bg-base-300\">\n @if (!withoutFilter()) {\n <div class=\"kl-select-filter-container border-b border-neutral-700\">\n <label class=\"flex items-center text-sm\">\n <i class=\"fa-solid fa-magnifying-glass opacity-60 absolute top-3 left-4\"></i>\n <input class=\"w-full p-2 pr-3 pl-10 outline-none dark:placeholder:opacity-80\"\n #searchInput\n type=\"search\"\n [(ngModel)]=\"filter\"\n [placeholder]=\"translations.selectTypeSearch\"\n />\n </label>\n </div>\n }\n\n <div class=\"kl-select-options-content p-1 overflow-auto\">\n @for (item of optionList(); track $index) {\n @let optionLabelId = fieldId + '-' + item.value;\n\n <label class=\"kl-select-option-content relative py-1 px-2 pr-8 rounded-md text-neutral-900 dark:text-neutral-300 has-[input:checked]:bg-neutral-200 dark:has-[input:checked]:bg-neutral-700 hover:bg-neutral-300 dark:hover:bg-neutral-600 cursor-pointer\"\n [attr.for]=\"optionLabelId\"\n [attr.data-index]=\"$index\">\n <span class=\"w-full flex flex-col justify-center\">\n @let isChecked = multiple() ? (control().value || []).includes(item.value) : item.value === control().value;\n\n <input\n [type]=\"multiple() ? 'checkbox' : 'radio'\"\n [id]=\"optionLabelId\"\n [name]=\"fieldId\"\n [attr.value]=\"item.value\"\n [checked]=\"isChecked\"\n (change)=\"setValue($event)\"\n />\n <span>{{ item.label }}</span>\n <small class=\"empty:hidden opacity-60\">{{ item.description }}</small>\n </span>\n </label>\n }\n </div>\n </div>\n </div>\n</div>\n\n@if (hint()) {\n <span class=\"hint-content\"><i class=\"fa-regular fa-circle-question\"></i> {{hint()}}</span>\n}\n\n<kl-field-errors [field]=\"control()\">\n <ng-container errors>\n <ng-content select=\"[errors]\" />\n </ng-container>\n</kl-field-errors>\n", dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: 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: ReactiveFormsModule }, { kind: "component", type: FieldErrors, selector: "kl-field-errors", inputs: ["field"] }, { kind: "component", type: Loader, selector: "kl-loader", inputs: ["size"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
426
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.6", type: Select, isStandalone: true, selector: "kl-select", inputs: { filter: { classPropertyName: "filter", publicName: "filter", isSignal: true, isRequired: false, transformFunction: null }, options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: true, transformFunction: null }, internalFilter: { classPropertyName: "internalFilter", publicName: "internalFilter", isSignal: true, isRequired: false, transformFunction: null }, withoutFilter: { classPropertyName: "withoutFilter", publicName: "withoutFilter", isSignal: true, isRequired: false, transformFunction: null }, multiple: { classPropertyName: "multiple", publicName: "multiple", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { filter: "filterChange", selectedItem: "selectedItem" }, viewQueries: [{ propertyName: "selectField", first: true, predicate: ["selectField"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"kl-select-container relative w-full has-[select:disabled]:cursor-not-allowed\"\n [class.has-value]=\"hasValue()\">\n\n @if (label(); as label) {\n <label class=\"kl-select-label flex items-center gap-2 whitespace-nowrap text-neutral-900 dark:text-neutral-300\"\n [attr.for]=\"fieldId\">\n @if (isDisabled()) {\n <span class=\"text-neutral-200 dark:text-neutral-600\">\n {{ label }} {{ isRequired() ? '*' : '' }}\n </span>\n } @else {\n <span>{{ label }} {{ isRequired() ? '*' : '' }}</span>\n }\n </label>\n }\n\n @if (!isDisabled() && hasValue()) {\n <div class=\"flex items-center justify-center h-full absolute top-0 right-7 z-10 pr-2\">\n <button class=\"kl-select-clear-button text-neutral-400 hover:cursor-pointer text-sm focus:shadow-none!\"\n type=\"button\"\n (click)=\"clear($event)\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n }\n\n <div class=\"kl-select-content\" #selectField>\n <button type=\"button\" class=\"kl-select-button flex gap-4 disabled:border-neutral-200! disabled:dark:border-neutral-800!\"\n [attr.popovertarget]=\"fieldId\"\n popovertargetaction=\"toggle\">\n\n <span class=\"selectcontent flex flex-wrap gap-1 items-center w-[calc(100%-3rem)] h-full text-left py-1\" [class.py-3]=\"multiple()\"></span>\n\n <span class=\"picker\">\n @if (isLoading()) {\n <kl-loader size=\"small\" />\n } @else {\n <i class=\"fa-solid fa-caret-down\"></i>\n }\n </span>\n </button>\n\n <div [id]=\"fieldId\" popover class=\"kl-select-options-container with-popover relative flex flex-col overflow-hidden bg-base-100 dark:bg-base-300\">\n @if (!withoutFilter()) {\n <div class=\"kl-select-filter-container border-b border-neutral-700\">\n <label class=\"flex items-center text-sm\">\n <i class=\"fa-solid fa-magnifying-glass opacity-60 absolute top-3 left-4\"></i>\n <input class=\"w-full p-2 pr-3 pl-10 outline-none dark:placeholder:opacity-80\"\n #searchInput\n type=\"search\"\n [(ngModel)]=\"filter\"\n [placeholder]=\"translations.selectTypeSearch\"\n />\n </label>\n </div>\n }\n\n <div class=\"kl-select-options-content p-1 overflow-auto\">\n @for (item of optionList(); track $index) {\n @let optionLabelId = fieldId + '-' + item.value;\n\n <label class=\"kl-select-option-content relative py-1 px-2 pr-8 rounded-md text-neutral-900 dark:text-neutral-300 has-[input:checked]:bg-neutral-200 dark:has-[input:checked]:bg-neutral-700 hover:bg-neutral-300 dark:hover:bg-neutral-600 cursor-pointer\"\n [attr.for]=\"optionLabelId\"\n [attr.data-index]=\"$index\">\n <span class=\"w-full flex flex-col justify-center\">\n @let isChecked = multiple() ? (control().value || []).includes(item.value) : item.value === control().value;\n\n <input\n [type]=\"multiple() ? 'checkbox' : 'radio'\"\n [id]=\"optionLabelId\"\n [name]=\"fieldId\"\n [attr.value]=\"item.value\"\n [checked]=\"isChecked\"\n (change)=\"setValue($event)\"\n />\n <span>{{ item.label }}</span>\n <small class=\"empty:hidden opacity-60\">{{ item.description }}</small>\n </span>\n </label>\n }\n </div>\n </div>\n </div>\n</div>\n\n@if (hint()) {\n <span class=\"hint-content\">{{hint()}}</span>\n}\n\n<kl-field-errors [field]=\"control()\">\n <ng-container errors>\n <ng-content select=\"[errors]\" />\n </ng-container>\n</kl-field-errors>\n", dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: 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: ReactiveFormsModule }, { kind: "component", type: FieldErrors, selector: "kl-field-errors", inputs: ["field"] }, { kind: "component", type: Loader, selector: "kl-loader", inputs: ["size"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
428
427
  }
429
428
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: Select, decorators: [{
430
429
  type: Component,
431
- args: [{ selector: 'kl-select', imports: [FormsModule, ReactiveFormsModule, FieldErrors, Loader], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"kl-select-container relative w-full has-[select:disabled]:cursor-not-allowed\"\n [class.has-value]=\"hasValue()\">\n\n @if (label(); as label) {\n <label class=\"kl-select-label flex items-center gap-2 whitespace-nowrap text-neutral-900 dark:text-neutral-300\"\n [attr.for]=\"fieldId\">\n @if (isDisabled()) {\n <span class=\"text-neutral-200 dark:text-neutral-600\">\n {{ label }} {{ isRequired() ? '*' : '' }}\n </span>\n } @else {\n <span>{{ label }} {{ isRequired() ? '*' : '' }}</span>\n }\n </label>\n }\n\n @if (!isDisabled() && hasValue()) {\n <div class=\"flex items-center justify-center h-full absolute top-0 right-7 z-10 pr-2\">\n <button class=\"kl-select-clear-button text-neutral-400 hover:cursor-pointer text-sm focus:shadow-none!\"\n type=\"button\"\n (click)=\"clear($event)\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n }\n\n <div class=\"kl-select-content\" #selectField>\n <button type=\"button\" class=\"kl-select-button flex disabled:border-neutral-200! disabled:dark:border-neutral-800!\"\n [attr.popovertarget]=\"fieldId\"\n popovertargetaction=\"toggle\">\n\n <span class=\"selectcontent flex flex-wrap gap-1 items-center w-full h-full\" [class.py-3]=\"multiple()\"></span>\n\n <span class=\"picker\">\n @if (isLoading()) {\n <kl-loader size=\"small\" />\n } @else {\n <i class=\"fa-solid fa-caret-down\"></i>\n }\n </span>\n </button>\n\n <div [id]=\"fieldId\" popover class=\"kl-select-options-container with-popover relative flex flex-col overflow-hidden bg-base-100 dark:bg-base-300\">\n @if (!withoutFilter()) {\n <div class=\"kl-select-filter-container border-b border-neutral-700\">\n <label class=\"flex items-center text-sm\">\n <i class=\"fa-solid fa-magnifying-glass opacity-60 absolute top-3 left-4\"></i>\n <input class=\"w-full p-2 pr-3 pl-10 outline-none dark:placeholder:opacity-80\"\n #searchInput\n type=\"search\"\n [(ngModel)]=\"filter\"\n [placeholder]=\"translations.selectTypeSearch\"\n />\n </label>\n </div>\n }\n\n <div class=\"kl-select-options-content p-1 overflow-auto\">\n @for (item of optionList(); track $index) {\n @let optionLabelId = fieldId + '-' + item.value;\n\n <label class=\"kl-select-option-content relative py-1 px-2 pr-8 rounded-md text-neutral-900 dark:text-neutral-300 has-[input:checked]:bg-neutral-200 dark:has-[input:checked]:bg-neutral-700 hover:bg-neutral-300 dark:hover:bg-neutral-600 cursor-pointer\"\n [attr.for]=\"optionLabelId\"\n [attr.data-index]=\"$index\">\n <span class=\"w-full flex flex-col justify-center\">\n @let isChecked = multiple() ? (control().value || []).includes(item.value) : item.value === control().value;\n\n <input\n [type]=\"multiple() ? 'checkbox' : 'radio'\"\n [id]=\"optionLabelId\"\n [name]=\"fieldId\"\n [attr.value]=\"item.value\"\n [checked]=\"isChecked\"\n (change)=\"setValue($event)\"\n />\n <span>{{ item.label }}</span>\n <small class=\"empty:hidden opacity-60\">{{ item.description }}</small>\n </span>\n </label>\n }\n </div>\n </div>\n </div>\n</div>\n\n@if (hint()) {\n <span class=\"hint-content\"><i class=\"fa-regular fa-circle-question\"></i> {{hint()}}</span>\n}\n\n<kl-field-errors [field]=\"control()\">\n <ng-container errors>\n <ng-content select=\"[errors]\" />\n </ng-container>\n</kl-field-errors>\n" }]
430
+ args: [{ selector: 'kl-select', imports: [FormsModule, ReactiveFormsModule, FieldErrors, Loader], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"kl-select-container relative w-full has-[select:disabled]:cursor-not-allowed\"\n [class.has-value]=\"hasValue()\">\n\n @if (label(); as label) {\n <label class=\"kl-select-label flex items-center gap-2 whitespace-nowrap text-neutral-900 dark:text-neutral-300\"\n [attr.for]=\"fieldId\">\n @if (isDisabled()) {\n <span class=\"text-neutral-200 dark:text-neutral-600\">\n {{ label }} {{ isRequired() ? '*' : '' }}\n </span>\n } @else {\n <span>{{ label }} {{ isRequired() ? '*' : '' }}</span>\n }\n </label>\n }\n\n @if (!isDisabled() && hasValue()) {\n <div class=\"flex items-center justify-center h-full absolute top-0 right-7 z-10 pr-2\">\n <button class=\"kl-select-clear-button text-neutral-400 hover:cursor-pointer text-sm focus:shadow-none!\"\n type=\"button\"\n (click)=\"clear($event)\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n }\n\n <div class=\"kl-select-content\" #selectField>\n <button type=\"button\" class=\"kl-select-button flex gap-4 disabled:border-neutral-200! disabled:dark:border-neutral-800!\"\n [attr.popovertarget]=\"fieldId\"\n popovertargetaction=\"toggle\">\n\n <span class=\"selectcontent flex flex-wrap gap-1 items-center w-[calc(100%-3rem)] h-full text-left py-1\" [class.py-3]=\"multiple()\"></span>\n\n <span class=\"picker\">\n @if (isLoading()) {\n <kl-loader size=\"small\" />\n } @else {\n <i class=\"fa-solid fa-caret-down\"></i>\n }\n </span>\n </button>\n\n <div [id]=\"fieldId\" popover class=\"kl-select-options-container with-popover relative flex flex-col overflow-hidden bg-base-100 dark:bg-base-300\">\n @if (!withoutFilter()) {\n <div class=\"kl-select-filter-container border-b border-neutral-700\">\n <label class=\"flex items-center text-sm\">\n <i class=\"fa-solid fa-magnifying-glass opacity-60 absolute top-3 left-4\"></i>\n <input class=\"w-full p-2 pr-3 pl-10 outline-none dark:placeholder:opacity-80\"\n #searchInput\n type=\"search\"\n [(ngModel)]=\"filter\"\n [placeholder]=\"translations.selectTypeSearch\"\n />\n </label>\n </div>\n }\n\n <div class=\"kl-select-options-content p-1 overflow-auto\">\n @for (item of optionList(); track $index) {\n @let optionLabelId = fieldId + '-' + item.value;\n\n <label class=\"kl-select-option-content relative py-1 px-2 pr-8 rounded-md text-neutral-900 dark:text-neutral-300 has-[input:checked]:bg-neutral-200 dark:has-[input:checked]:bg-neutral-700 hover:bg-neutral-300 dark:hover:bg-neutral-600 cursor-pointer\"\n [attr.for]=\"optionLabelId\"\n [attr.data-index]=\"$index\">\n <span class=\"w-full flex flex-col justify-center\">\n @let isChecked = multiple() ? (control().value || []).includes(item.value) : item.value === control().value;\n\n <input\n [type]=\"multiple() ? 'checkbox' : 'radio'\"\n [id]=\"optionLabelId\"\n [name]=\"fieldId\"\n [attr.value]=\"item.value\"\n [checked]=\"isChecked\"\n (change)=\"setValue($event)\"\n />\n <span>{{ item.label }}</span>\n <small class=\"empty:hidden opacity-60\">{{ item.description }}</small>\n </span>\n </label>\n }\n </div>\n </div>\n </div>\n</div>\n\n@if (hint()) {\n <span class=\"hint-content\">{{hint()}}</span>\n}\n\n<kl-field-errors [field]=\"control()\">\n <ng-container errors>\n <ng-content select=\"[errors]\" />\n </ng-container>\n</kl-field-errors>\n" }]
432
431
  }], ctorParameters: () => [], propDecorators: { selectField: [{ type: i0.ViewChild, args: ['selectField', { isSignal: true }] }], filter: [{ type: i0.Input, args: [{ isSignal: true, alias: "filter", required: false }] }, { type: i0.Output, args: ["filterChange"] }], options: [{ type: i0.Input, args: [{ isSignal: true, alias: "options", required: true }] }], internalFilter: [{ type: i0.Input, args: [{ isSignal: true, alias: "internalFilter", required: false }] }], withoutFilter: [{ type: i0.Input, args: [{ isSignal: true, alias: "withoutFilter", required: false }] }], multiple: [{ type: i0.Input, args: [{ isSignal: true, alias: "multiple", required: false }] }], selectedItem: [{ type: i0.Output, args: ["selectedItem"] }] } });
433
432
 
434
433
  class SelectBuilder {
@@ -1 +1 @@
1
- {"version":3,"file":"koalarx-ui-shared-components-input-field-select.mjs","sources":["../../projects/koala-ui/shared/components/input-field/select/accessibility/utils/change-selected-option.ts","../../projects/koala-ui/shared/components/input-field/select/accessibility/utils/update-scroll-position.ts","../../projects/koala-ui/shared/components/input-field/select/accessibility/on-keydown.ts","../../projects/koala-ui/shared/components/input-field/select/accessibility/index.ts","../../projects/koala-ui/shared/components/input-field/select/utils/ajust-options-container-size.ts","../../projects/koala-ui/shared/components/input-field/select/utils/generate-options-resource.ts","../../projects/koala-ui/shared/components/input-field/select/utils/is-loading-feedback.ts","../../projects/koala-ui/shared/components/input-field/select/utils/on-server-filter.ts","../../projects/koala-ui/shared/components/input-field/select/utils/options-loader.ts","../../projects/koala-ui/shared/components/input-field/select/select-option-badge.ts","../../projects/koala-ui/shared/components/input-field/select/select-option-badge.html","../../projects/koala-ui/shared/components/input-field/select/utils/set-selected-option-content.ts","../../projects/koala-ui/shared/components/input-field/select/select.ts","../../projects/koala-ui/shared/components/input-field/select/select.html","../../projects/koala-ui/shared/components/input-field/select/services/select-builder.ts","../../projects/koala-ui/shared/components/input-field/select/koalarx-ui-shared-components-input-field-select.ts"],"sourcesContent":["import { Select } from '../../select';\nimport { ScrollDirection } from './update-scroll-position';\n\nexport function changeSelectedOption(\n component: Select,\n direction: ScrollDirection = 'down'\n) {\n if (!component.selectElement.classList.contains('opened')) {\n return;\n }\n\n const options: NodeListOf<HTMLOptionElement | HTMLLabelElement> =\n component.selectElement.querySelectorAll(\n 'option, .kl-select-options-content .kl-select-option-content'\n );\n\n const selectedOption: HTMLOptionElement | HTMLLabelElement =\n component.selectElement.querySelector('option:checked') ??\n component.selectElement.querySelector(\n 'label.kl-select-option-content:has(input:checked)'\n )!;\n\n let newIndex = 0;\n\n if (selectedOption) {\n const currentIndex = Array.from(options).indexOf(selectedOption);\n\n if (direction === 'down') {\n newIndex =\n currentIndex + 1 < options.length ? currentIndex + 1 : currentIndex;\n } else {\n newIndex = currentIndex - 1 >= 0 ? currentIndex - 1 : currentIndex;\n }\n }\n\n const option = options[newIndex];\n const event = new Event('change', { bubbles: true });\n\n if (option instanceof HTMLOptionElement) {\n option.selected = true;\n\n component.selectElement.dispatchEvent(event);\n } else {\n option.querySelector('input')!.checked = true;\n\n options.forEach((opt) => opt.classList.remove('active'));\n option.classList.toggle('active');\n\n option.querySelector('input')!.dispatchEvent(event);\n }\n}\n","import { Select } from '../../select';\n\nexport type ScrollDirection = 'down' | 'up';\n\nexport function updateScrollPosition(\n component: Select,\n direction: ScrollDirection = 'down'\n) {\n if (!component.selectElement.classList.contains('opened')) {\n return;\n }\n\n setTimeout(() => {\n const optionsContainer = component.selectElement.querySelector(\n '.kl-select-options-content'\n ) as HTMLDivElement;\n const focusedOptionElement =\n optionsContainer.querySelector('option:checked') ??\n component.selectElement.querySelector(\n 'label.kl-select-option-content:has(input:checked)'\n )!;\n\n if (focusedOptionElement) {\n optionsContainer.scrollTo({\n top:\n direction === 'down'\n ? optionsContainer.scrollTop +\n focusedOptionElement.getBoundingClientRect().height\n : optionsContainer.scrollTop -\n focusedOptionElement.getBoundingClientRect().height,\n });\n }\n }, 50);\n}\n","import { Select } from '../select';\nimport { changeSelectedOption } from './utils/change-selected-option';\nimport { updateScrollPosition } from './utils/update-scroll-position';\n\nexport function initOnKeyDownListener(component: Select) {\n function onKeyDown(event: KeyboardEvent) {\n switch (event.key) {\n case 'ArrowDown': {\n event.stopPropagation();\n event.preventDefault();\n\n changeSelectedOption(component, 'down');\n updateScrollPosition(component, 'down');\n break;\n }\n case 'ArrowUp': {\n event.stopPropagation();\n event.preventDefault();\n\n changeSelectedOption(component, 'up');\n updateScrollPosition(component, 'up');\n break;\n }\n }\n }\n\n addEventListener('keydown', onKeyDown);\n\n component.destroyRef.onDestroy(() => {\n removeEventListener('keydown', onKeyDown);\n });\n}\n","import { Select } from '../select';\nimport { initOnKeyDownListener } from './on-keydown';\n\nexport function assessibility(component: Select) {\n initOnKeyDownListener(component);\n}\n","import { afterRenderEffect } from '@angular/core';\nimport { Select } from '../select';\n\nexport function ajustOptionsContainerSize(component: Select) {\n afterRenderEffect(() => {\n const selectElement = component.selectElement;\n const optionsContainer = selectElement.parentElement?.querySelector(\n '.kl-select-options-container',\n ) as HTMLElement;\n\n function setMaxWidth() {\n const currentWidth = selectElement.offsetWidth;\n selectElement.style.setProperty('--select-width', `${currentWidth}px`);\n }\n\n function setMaxHeight() {\n const optionsRect = selectElement.getBoundingClientRect();\n const viewportHeight = window.innerHeight;\n const sizeDiscount = 16 + optionsRect.height;\n\n let availableHeight = viewportHeight - optionsRect.top - sizeDiscount;\n\n if (availableHeight < 150) {\n availableHeight =\n viewportHeight - (viewportHeight - optionsRect.bottom) - sizeDiscount;\n selectElement.style.setProperty('--select-position-area', 'top');\n } else {\n selectElement.style.setProperty('--select-position-area', 'bottom');\n }\n\n optionsContainer.style.maxHeight = `${availableHeight}px`;\n }\n\n function getFilterInput() {\n return optionsContainer.querySelector(\n '.kl-select-filter-container input',\n ) as HTMLInputElement | null;\n }\n\n function disableFilter() {\n const filterInput = getFilterInput();\n\n if (filterInput) {\n filterInput.disabled = true;\n }\n }\n\n function enableAndFocusFilter() {\n const filterInput = getFilterInput();\n\n if (filterInput) {\n filterInput.disabled = false;\n filterInput.focus();\n }\n }\n\n function touchControl() {\n component.control().markAsTouched();\n }\n\n const observer = new IntersectionObserver((entries) => {\n entries.forEach((entry) => {\n if (entry.isIntersecting) {\n component.selectElement.classList.add('opened');\n setMaxWidth();\n setMaxHeight();\n enableAndFocusFilter();\n touchControl();\n } else {\n component.selectElement.classList.remove('opened');\n disableFilter();\n }\n });\n });\n\n setMaxWidth();\n\n observer.observe(optionsContainer);\n component.destroyRef.onDestroy(() => observer.unobserve(optionsContainer));\n });\n}\n","import {\n isSignal,\n ResourceRef,\n runInInjectionContext,\n Signal,\n} from '@angular/core';\nimport { Select } from '../select';\nimport {\n OptionsResource,\n SelectDataOptionsFn,\n SelectList,\n} from '../select.type';\n\nexport function generateOptionsResource(component: Select) {\n const options = component.options();\n\n let optionsResource: OptionsResource;\n\n if (Object.hasOwn(options, 'value')) {\n optionsResource = { onServer: options as ResourceRef<SelectList> };\n } else if (isSignal(options)) {\n optionsResource = {\n inMemoryWithLoading: options as Signal<SelectList>,\n };\n } else if (typeof options === 'function') {\n const resourceFnOptions = options as SelectDataOptionsFn;\n\n optionsResource = {\n onDemand: runInInjectionContext(component.injector, () =>\n resourceFnOptions(component.requestOptionsParams)\n ),\n };\n } else {\n optionsResource = { inMemory: options as SelectList };\n }\n\n component.optionsResource.set(optionsResource);\n}\n","import { effect } from '@angular/core';\nimport { delay } from '@koalarx/utils/KlDelay';\nimport { Select } from '../select';\n\nexport function isLoadingFeedback(component: Select) {\n effect(async () => {\n const isLoading = component.isLoading();\n\n if (!isLoading) {\n while (!component.selectField()) {\n await delay(50);\n }\n\n const selectedContent = component.selectElement.querySelector(\n '.selectcontent'\n ) as HTMLElement;\n\n selectedContent.style.opacity = '0';\n\n if (!component.disabled()) {\n component.isDisabled.set(false);\n }\n\n await delay(1);\n\n selectedContent.style.opacity = '1';\n } else {\n component.isDisabled.set(true);\n }\n });\n}\n","import { effect } from '@angular/core';\nimport { takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop';\nimport { debounceTime } from 'rxjs/internal/operators/debounceTime';\nimport { Select } from '../select';\n\nexport function onServerFilter(component: Select) {\n toObservable(component.filter, { injector: component.injector })\n .pipe(debounceTime(300), takeUntilDestroyed(component.destroyRef))\n .subscribe((value) => component.filteredValue.set(value ?? null));\n\n effect(\n () => {\n if (component.optionsResource()?.onDemand) {\n component.requestOptionsParams.set({\n filter: component.filteredValue(),\n internalFilter: component.internalFilter(),\n currentValue: component.control().value,\n });\n }\n },\n { injector: component.injector }\n );\n}\n","import { effect } from '@angular/core';\nimport { Select } from '../select';\n\nexport function loadOptions(component: Select) {\n effect(() => {\n const options = component.optionsResource();\n\n if (!options) {\n return;\n }\n\n const { onDemand, onServer, inMemory, inMemoryWithLoading } = options;\n\n if (onDemand) {\n component.optionList.set(onDemand.value());\n component.isLoading.set(onDemand.isLoading());\n } else if (onServer) {\n component.optionList.set(component.applyFilter(onServer.value()));\n component.isLoading.set(onServer.isLoading());\n } else if (inMemory) {\n component.optionList.set(component.applyFilter(inMemory));\n component.isLoading.set(false);\n } else if (inMemoryWithLoading) {\n const optionsWithLoading = inMemoryWithLoading();\n component.optionList.set(component.applyFilter(optionsWithLoading ?? []));\n component.isLoading.set(!optionsWithLoading);\n }\n });\n}\n","import { ChangeDetectionStrategy, Component } from '@angular/core';\n\n@Component({\n selector: 'kl-select-option-badge',\n templateUrl: './select-option-badge.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SelectOptionBadge {\n removeCallback: (event: MouseEvent) => void = () => {\n throw new Error('Remove callback not set');\n };\n}\n","<span class=\"flex items-center badge badge-outline badge-primary badge-sm rounded-sm bg-primary/20 dark:text-neutral-300 dark:border-primary\">\n <ng-content />\n <i class=\"fa-solid fa-xmark text-neutral-500 hover:cursor-pointer\"\n (click)=\"removeCallback($event)\">\n </i>\n</span>\n","import { createComponent } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { isEmpty } from '@koalarx/ui/shared/utils';\nimport { delay } from '@koalarx/utils/KlDelay';\nimport { debounceTime } from 'rxjs/internal/operators/debounceTime';\nimport { Select } from '../select';\nimport { SelectOptionBadge } from '../select-option-badge';\n\nfunction hasValue(value: any) {\n return Array.isArray(value) ? value.length > 0 : !isEmpty(value);\n}\n\nfunction createBadgeElement(component: Select, content: Node, value: any) {\n const badgeComponent = createComponent(SelectOptionBadge, {\n environmentInjector: component.appRef.injector,\n projectableNodes: [[content]],\n });\n\n badgeComponent.instance.removeCallback = (event: MouseEvent) =>\n component.removeOption(event);\n\n const element: HTMLElement = badgeComponent.location.nativeElement;\n const spanElement = element.firstElementChild as HTMLSpanElement;\n\n spanElement.dataset['value'] = value;\n\n return element;\n}\n\nasync function appendSelectedOptionContent(component: Select, value: any) {\n while (component.isLoading()) {\n await delay(50);\n }\n\n const selectedContent = component.selectElement.querySelector(\n '.selectcontent'\n ) as HTMLElement;\n\n if (!Array.isArray(value)) {\n value = isEmpty(value) ? [] : [value];\n }\n\n if (!component.multiple()) {\n selectedContent.innerHTML = '';\n }\n\n selectedContent\n .querySelectorAll<HTMLSpanElement>('span[data-value]')\n .forEach((node) => {\n if (!value.map(String).includes(node.dataset['value'])) {\n node.parentElement!.remove();\n }\n });\n\n for (const v of value) {\n const optionData = component\n .selectedOptions()\n .find((item) => String(item.value) === String(v));\n\n if (!optionData) {\n continue;\n }\n\n const optionContent = document.createElement('span');\n optionContent.dataset['value'] = String(v);\n optionContent.innerHTML = optionData?.label ?? v;\n\n if (selectedContent.querySelector(`[data-value=\"${v}\"]`)) {\n continue;\n }\n\n const optionBadge = component.multiple()\n ? createBadgeElement(component, optionContent, v)\n : optionContent;\n\n selectedContent.appendChild(optionBadge);\n }\n\n component.hasValue.set(hasValue(value));\n\n component.selectElement\n .querySelectorAll<HTMLInputElement>('input[type=checkbox]')\n .forEach((input) => {\n input.checked = value.map(String).includes(input.value);\n });\n}\n\nfunction setSelectedOptionsOnComponent(component: Select, value: any) {\n component.selectedOptions.set(\n component\n .optionList()\n .filter((item) =>\n Array.isArray(value)\n ? value.map(String).includes(String(item.value))\n : String(item.value) === String(value)\n )\n );\n}\n\nexport async function setSelectedOptionContent(component: Select) {\n const value = component.control().value;\n\n component.hasValue.set(hasValue(value));\n\n while (component.isLoading()) {\n await delay(50);\n }\n\n setSelectedOptionsOnComponent(component, value);\n\n await appendSelectedOptionContent(component, value);\n\n component\n .control()\n .valueChanges.pipe(\n debounceTime(50),\n takeUntilDestroyed(component.destroyRef)\n )\n .subscribe((value) => {\n setSelectedOptionsOnComponent(component, value);\n appendSelectedOptionContent(component, value);\n });\n}\n","import {\n ApplicationRef,\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n ElementRef,\n inject,\n Injector,\n input,\n model,\n OnInit,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { Loader } from '@koalarx/ui/core/components/loader';\nimport { AppConfig } from '@koalarx/ui/core/config';\nimport { FieldErrors } from '@koalarx/ui/shared/components/field-errors';\nimport { InputFieldBase } from '@koalarx/ui/shared/components/input-field';\nimport { assessibility } from './accessibility';\nimport {\n OptionsResource,\n SelectDataOptions,\n SelectDataOptionsFnParams,\n SelectList,\n SelectValue,\n} from './select.type';\nimport { ajustOptionsContainerSize } from './utils/ajust-options-container-size';\nimport { generateOptionsResource } from './utils/generate-options-resource';\nimport { isLoadingFeedback } from './utils/is-loading-feedback';\nimport { onServerFilter } from './utils/on-server-filter';\nimport { loadOptions } from './utils/options-loader';\nimport { setSelectedOptionContent } from './utils/set-selected-option-content';\n\n@Component({\n selector: 'kl-select',\n templateUrl: './select.html',\n imports: [FormsModule, ReactiveFormsModule, FieldErrors, Loader],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class Select extends InputFieldBase implements OnInit {\n readonly appRef = inject(ApplicationRef);\n readonly destroyRef = inject(DestroyRef);\n readonly injector = inject(Injector);\n readonly selectField = viewChild<ElementRef<HTMLDivElement>>('selectField');\n\n readonly optionsResource = signal<OptionsResource | null>(null);\n readonly optionList = signal<SelectList>([]);\n readonly selectedOptions = signal<SelectList>([]);\n readonly isLoading = signal<boolean>(true);\n readonly requestOptionsParams = signal<SelectDataOptionsFnParams>({\n filter: null,\n currentValue: null,\n internalFilter: null,\n });\n readonly translations = inject(AppConfig).translation.form;\n readonly supportsExperimentalSelect = !CSS.supports(\n 'appearance',\n 'base-select',\n );\n readonly hasValue = signal<boolean>(false);\n\n filter = model<string>();\n filteredValue = signal<string | null>(null);\n\n options = input.required<SelectDataOptions>();\n internalFilter = input<string | null>(null);\n withoutFilter = input(false, { transform: booleanAttribute });\n multiple = input(false, { transform: booleanAttribute });\n selectedItem = output<any | null>();\n\n get selectElement() {\n const selectField = this.selectField();\n\n if (!selectField) {\n throw new Error('Select element not found');\n }\n\n return selectField.nativeElement;\n }\n\n constructor() {\n super();\n\n loadOptions(this);\n ajustOptionsContainerSize(this);\n isLoadingFeedback(this);\n assessibility(this);\n }\n\n ngOnInit() {\n onServerFilter(this);\n generateOptionsResource(this);\n setSelectedOptionContent(this);\n }\n\n applyFilter(options: SelectList) {\n const filter = this.filter() ?? '';\n\n return options.filter((option) =>\n option.label.toLowerCase().includes(filter.toLowerCase()),\n );\n }\n\n setValue(event: Event) {\n const select = event.target as HTMLInputElement;\n const value: SelectValue = select.value;\n\n if (this.multiple()) {\n const selectedOptionsElements = this.selectElement.querySelectorAll(\n '.kl-select-options-content input[type=\"checkbox\"]:checked',\n ) as NodeListOf<HTMLInputElement>;\n\n const values: string[] = [];\n\n selectedOptionsElements.forEach((option) => values.push(option.value));\n\n if (select.checked) {\n this.selectedOptions.update((current) => [\n ...current,\n this.optionList().find((item) => String(item.value) === value)!,\n ]);\n } else {\n this.selectedOptions.update((current) =>\n current.filter((item) => String(item.value) !== value),\n );\n }\n\n const selectedValues = this.selectedOptions().map((item) => item.value);\n\n this.control().setValue(selectedValues, { emitEvent: true });\n\n return;\n }\n\n const selectedOption = this.optionList().find(\n (item) => String(item.value) === value,\n );\n\n if (selectedOption) {\n this.selectedOptions.set([selectedOption]);\n this.control().setValue(selectedOption.value, { emitEvent: true });\n }\n\n this.selectedItem.emit(selectedOption?.data ?? null);\n\n document\n .querySelector<HTMLElement>(`#${this.fieldId}[popover]`)\n ?.hidePopover();\n }\n\n clear(event: MouseEvent) {\n event.preventDefault();\n this.selectedOptions.set([]);\n this.control().setValue(null);\n }\n\n removeOption(event: MouseEvent) {\n event.preventDefault();\n\n const target = event.target as HTMLSpanElement;\n const value = target.parentElement?.dataset['value'];\n\n const inputValue = this.selectElement.querySelector(\n `.kl-select-options-content input[value=\"${value}\"]`,\n ) as HTMLInputElement;\n\n inputValue.click();\n }\n}\n","<div class=\"kl-select-container relative w-full has-[select:disabled]:cursor-not-allowed\"\n [class.has-value]=\"hasValue()\">\n\n @if (label(); as label) {\n <label class=\"kl-select-label flex items-center gap-2 whitespace-nowrap text-neutral-900 dark:text-neutral-300\"\n [attr.for]=\"fieldId\">\n @if (isDisabled()) {\n <span class=\"text-neutral-200 dark:text-neutral-600\">\n {{ label }} {{ isRequired() ? '*' : '' }}\n </span>\n } @else {\n <span>{{ label }} {{ isRequired() ? '*' : '' }}</span>\n }\n </label>\n }\n\n @if (!isDisabled() && hasValue()) {\n <div class=\"flex items-center justify-center h-full absolute top-0 right-7 z-10 pr-2\">\n <button class=\"kl-select-clear-button text-neutral-400 hover:cursor-pointer text-sm focus:shadow-none!\"\n type=\"button\"\n (click)=\"clear($event)\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n }\n\n <div class=\"kl-select-content\" #selectField>\n <button type=\"button\" class=\"kl-select-button flex disabled:border-neutral-200! disabled:dark:border-neutral-800!\"\n [attr.popovertarget]=\"fieldId\"\n popovertargetaction=\"toggle\">\n\n <span class=\"selectcontent flex flex-wrap gap-1 items-center w-full h-full\" [class.py-3]=\"multiple()\"></span>\n\n <span class=\"picker\">\n @if (isLoading()) {\n <kl-loader size=\"small\" />\n } @else {\n <i class=\"fa-solid fa-caret-down\"></i>\n }\n </span>\n </button>\n\n <div [id]=\"fieldId\" popover class=\"kl-select-options-container with-popover relative flex flex-col overflow-hidden bg-base-100 dark:bg-base-300\">\n @if (!withoutFilter()) {\n <div class=\"kl-select-filter-container border-b border-neutral-700\">\n <label class=\"flex items-center text-sm\">\n <i class=\"fa-solid fa-magnifying-glass opacity-60 absolute top-3 left-4\"></i>\n <input class=\"w-full p-2 pr-3 pl-10 outline-none dark:placeholder:opacity-80\"\n #searchInput\n type=\"search\"\n [(ngModel)]=\"filter\"\n [placeholder]=\"translations.selectTypeSearch\"\n />\n </label>\n </div>\n }\n\n <div class=\"kl-select-options-content p-1 overflow-auto\">\n @for (item of optionList(); track $index) {\n @let optionLabelId = fieldId + '-' + item.value;\n\n <label class=\"kl-select-option-content relative py-1 px-2 pr-8 rounded-md text-neutral-900 dark:text-neutral-300 has-[input:checked]:bg-neutral-200 dark:has-[input:checked]:bg-neutral-700 hover:bg-neutral-300 dark:hover:bg-neutral-600 cursor-pointer\"\n [attr.for]=\"optionLabelId\"\n [attr.data-index]=\"$index\">\n <span class=\"w-full flex flex-col justify-center\">\n @let isChecked = multiple() ? (control().value || []).includes(item.value) : item.value === control().value;\n\n <input\n [type]=\"multiple() ? 'checkbox' : 'radio'\"\n [id]=\"optionLabelId\"\n [name]=\"fieldId\"\n [attr.value]=\"item.value\"\n [checked]=\"isChecked\"\n (change)=\"setValue($event)\"\n />\n <span>{{ item.label }}</span>\n <small class=\"empty:hidden opacity-60\">{{ item.description }}</small>\n </span>\n </label>\n }\n </div>\n </div>\n </div>\n</div>\n\n@if (hint()) {\n <span class=\"hint-content\"><i class=\"fa-regular fa-circle-question\"></i> {{hint()}}</span>\n}\n\n<kl-field-errors [field]=\"control()\">\n <ng-container errors>\n <ng-content select=\"[errors]\" />\n </ng-container>\n</kl-field-errors>\n","import { Injectable, ResourceRef, Signal } from '@angular/core';\nimport { SelectDataOptionsFn, SelectList } from '../select.type';\n\n@Injectable({ providedIn: 'root' })\nexport class SelectBuilder {\n onDemand(config: SelectDataOptionsFn) {\n return config;\n }\n\n onServer(config: ResourceRef<SelectList>) {\n return config;\n }\n\n inMemory(config: SelectList) {\n return config;\n }\n\n inMemoryWithLoading(config: Signal<SelectList>) {\n return config;\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;;;;;;;SAGgB,oBAAoB,CAClC,SAAiB,EACjB,YAA6B,MAAM,EAAA;AAEnC,IAAA,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE;QACzD;;IAGF,MAAM,OAAO,GACX,SAAS,CAAC,aAAa,CAAC,gBAAgB,CACtC,8DAA8D,CAC/D;IAEH,MAAM,cAAc,GAClB,SAAS,CAAC,aAAa,CAAC,aAAa,CAAC,gBAAgB,CAAC;AACvD,QAAA,SAAS,CAAC,aAAa,CAAC,aAAa,CACnC,mDAAmD,CACnD;IAEJ,IAAI,QAAQ,GAAG,CAAC;IAEhB,IAAI,cAAc,EAAE;AAClB,QAAA,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC;AAEhE,QAAA,IAAI,SAAS,KAAK,MAAM,EAAE;YACxB,QAAQ;AACN,gBAAA,YAAY,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,YAAY,GAAG,CAAC,GAAG,YAAY;;aAChE;AACL,YAAA,QAAQ,GAAG,YAAY,GAAG,CAAC,IAAI,CAAC,GAAG,YAAY,GAAG,CAAC,GAAG,YAAY;;;AAItE,IAAA,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;AAChC,IAAA,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAEpD,IAAA,IAAI,MAAM,YAAY,iBAAiB,EAAE;AACvC,QAAA,MAAM,CAAC,QAAQ,GAAG,IAAI;AAEtB,QAAA,SAAS,CAAC,aAAa,CAAC,aAAa,CAAC,KAAK,CAAC;;SACvC;QACL,MAAM,CAAC,aAAa,CAAC,OAAO,CAAE,CAAC,OAAO,GAAG,IAAI;AAE7C,QAAA,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;AACxD,QAAA,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC;QAEjC,MAAM,CAAC,aAAa,CAAC,OAAO,CAAE,CAAC,aAAa,CAAC,KAAK,CAAC;;AAEvD;;SC9CgB,oBAAoB,CAClC,SAAiB,EACjB,YAA6B,MAAM,EAAA;AAEnC,IAAA,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE;QACzD;;IAGF,UAAU,CAAC,MAAK;QACd,MAAM,gBAAgB,GAAG,SAAS,CAAC,aAAa,CAAC,aAAa,CAC5D,4BAA4B,CACX;AACnB,QAAA,MAAM,oBAAoB,GACxB,gBAAgB,CAAC,aAAa,CAAC,gBAAgB,CAAC;AAChD,YAAA,SAAS,CAAC,aAAa,CAAC,aAAa,CACnC,mDAAmD,CACnD;QAEJ,IAAI,oBAAoB,EAAE;YACxB,gBAAgB,CAAC,QAAQ,CAAC;gBACxB,GAAG,EACD,SAAS,KAAK;sBACV,gBAAgB,CAAC,SAAS;AAC1B,wBAAA,oBAAoB,CAAC,qBAAqB,EAAE,CAAC;sBAC7C,gBAAgB,CAAC,SAAS;AAC1B,wBAAA,oBAAoB,CAAC,qBAAqB,EAAE,CAAC,MAAM;AAC1D,aAAA,CAAC;;KAEL,EAAE,EAAE,CAAC;AACR;;AC7BM,SAAU,qBAAqB,CAAC,SAAiB,EAAA;IACrD,SAAS,SAAS,CAAC,KAAoB,EAAA;AACrC,QAAA,QAAQ,KAAK,CAAC,GAAG;YACf,KAAK,WAAW,EAAE;gBAChB,KAAK,CAAC,eAAe,EAAE;gBACvB,KAAK,CAAC,cAAc,EAAE;AAEtB,gBAAA,oBAAoB,CAAC,SAAS,EAAE,MAAM,CAAC;AACvC,gBAAA,oBAAoB,CAAC,SAAS,EAAE,MAAM,CAAC;gBACvC;;YAEF,KAAK,SAAS,EAAE;gBACd,KAAK,CAAC,eAAe,EAAE;gBACvB,KAAK,CAAC,cAAc,EAAE;AAEtB,gBAAA,oBAAoB,CAAC,SAAS,EAAE,IAAI,CAAC;AACrC,gBAAA,oBAAoB,CAAC,SAAS,EAAE,IAAI,CAAC;gBACrC;;;;AAKN,IAAA,gBAAgB,CAAC,SAAS,EAAE,SAAS,CAAC;AAEtC,IAAA,SAAS,CAAC,UAAU,CAAC,SAAS,CAAC,MAAK;AAClC,QAAA,mBAAmB,CAAC,SAAS,EAAE,SAAS,CAAC;AAC3C,KAAC,CAAC;AACJ;;AC5BM,SAAU,aAAa,CAAC,SAAiB,EAAA;IAC7C,qBAAqB,CAAC,SAAS,CAAC;AAClC;;ACFM,SAAU,yBAAyB,CAAC,SAAiB,EAAA;IACzD,iBAAiB,CAAC,MAAK;AACrB,QAAA,MAAM,aAAa,GAAG,SAAS,CAAC,aAAa;QAC7C,MAAM,gBAAgB,GAAG,aAAa,CAAC,aAAa,EAAE,aAAa,CACjE,8BAA8B,CAChB;AAEhB,QAAA,SAAS,WAAW,GAAA;AAClB,YAAA,MAAM,YAAY,GAAG,aAAa,CAAC,WAAW;YAC9C,aAAa,CAAC,KAAK,CAAC,WAAW,CAAC,gBAAgB,EAAE,CAAA,EAAG,YAAY,CAAA,EAAA,CAAI,CAAC;;AAGxE,QAAA,SAAS,YAAY,GAAA;AACnB,YAAA,MAAM,WAAW,GAAG,aAAa,CAAC,qBAAqB,EAAE;AACzD,YAAA,MAAM,cAAc,GAAG,MAAM,CAAC,WAAW;AACzC,YAAA,MAAM,YAAY,GAAG,EAAE,GAAG,WAAW,CAAC,MAAM;YAE5C,IAAI,eAAe,GAAG,cAAc,GAAG,WAAW,CAAC,GAAG,GAAG,YAAY;AAErE,YAAA,IAAI,eAAe,GAAG,GAAG,EAAE;gBACzB,eAAe;oBACb,cAAc,IAAI,cAAc,GAAG,WAAW,CAAC,MAAM,CAAC,GAAG,YAAY;gBACvE,aAAa,CAAC,KAAK,CAAC,WAAW,CAAC,wBAAwB,EAAE,KAAK,CAAC;;iBAC3D;gBACL,aAAa,CAAC,KAAK,CAAC,WAAW,CAAC,wBAAwB,EAAE,QAAQ,CAAC;;YAGrE,gBAAgB,CAAC,KAAK,CAAC,SAAS,GAAG,CAAA,EAAG,eAAe,IAAI;;AAG3D,QAAA,SAAS,cAAc,GAAA;AACrB,YAAA,OAAO,gBAAgB,CAAC,aAAa,CACnC,mCAAmC,CACT;;AAG9B,QAAA,SAAS,aAAa,GAAA;AACpB,YAAA,MAAM,WAAW,GAAG,cAAc,EAAE;YAEpC,IAAI,WAAW,EAAE;AACf,gBAAA,WAAW,CAAC,QAAQ,GAAG,IAAI;;;AAI/B,QAAA,SAAS,oBAAoB,GAAA;AAC3B,YAAA,MAAM,WAAW,GAAG,cAAc,EAAE;YAEpC,IAAI,WAAW,EAAE;AACf,gBAAA,WAAW,CAAC,QAAQ,GAAG,KAAK;gBAC5B,WAAW,CAAC,KAAK,EAAE;;;AAIvB,QAAA,SAAS,YAAY,GAAA;AACnB,YAAA,SAAS,CAAC,OAAO,EAAE,CAAC,aAAa,EAAE;;QAGrC,MAAM,QAAQ,GAAG,IAAI,oBAAoB,CAAC,CAAC,OAAO,KAAI;AACpD,YAAA,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,KAAI;AACxB,gBAAA,IAAI,KAAK,CAAC,cAAc,EAAE;oBACxB,SAAS,CAAC,aAAa,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC;AAC/C,oBAAA,WAAW,EAAE;AACb,oBAAA,YAAY,EAAE;AACd,oBAAA,oBAAoB,EAAE;AACtB,oBAAA,YAAY,EAAE;;qBACT;oBACL,SAAS,CAAC,aAAa,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC;AAClD,oBAAA,aAAa,EAAE;;AAEnB,aAAC,CAAC;AACJ,SAAC,CAAC;AAEF,QAAA,WAAW,EAAE;AAEb,QAAA,QAAQ,CAAC,OAAO,CAAC,gBAAgB,CAAC;AAClC,QAAA,SAAS,CAAC,UAAU,CAAC,SAAS,CAAC,MAAM,QAAQ,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;AAC5E,KAAC,CAAC;AACJ;;ACnEM,SAAU,uBAAuB,CAAC,SAAiB,EAAA;AACvD,IAAA,MAAM,OAAO,GAAG,SAAS,CAAC,OAAO,EAAE;AAEnC,IAAA,IAAI,eAAgC;IAEpC,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE;AACnC,QAAA,eAAe,GAAG,EAAE,QAAQ,EAAE,OAAkC,EAAE;;AAC7D,SAAA,IAAI,QAAQ,CAAC,OAAO,CAAC,EAAE;AAC5B,QAAA,eAAe,GAAG;AAChB,YAAA,mBAAmB,EAAE,OAA6B;SACnD;;AACI,SAAA,IAAI,OAAO,OAAO,KAAK,UAAU,EAAE;QACxC,MAAM,iBAAiB,GAAG,OAA8B;AAExD,QAAA,eAAe,GAAG;AAChB,YAAA,QAAQ,EAAE,qBAAqB,CAAC,SAAS,CAAC,QAAQ,EAAE,MAClD,iBAAiB,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAClD;SACF;;SACI;AACL,QAAA,eAAe,GAAG,EAAE,QAAQ,EAAE,OAAqB,EAAE;;AAGvD,IAAA,SAAS,CAAC,eAAe,CAAC,GAAG,CAAC,eAAe,CAAC;AAChD;;ACjCM,SAAU,iBAAiB,CAAC,SAAiB,EAAA;IACjD,MAAM,CAAC,YAAW;AAChB,QAAA,MAAM,SAAS,GAAG,SAAS,CAAC,SAAS,EAAE;QAEvC,IAAI,CAAC,SAAS,EAAE;AACd,YAAA,OAAO,CAAC,SAAS,CAAC,WAAW,EAAE,EAAE;AAC/B,gBAAA,MAAM,KAAK,CAAC,EAAE,CAAC;;YAGjB,MAAM,eAAe,GAAG,SAAS,CAAC,aAAa,CAAC,aAAa,CAC3D,gBAAgB,CACF;AAEhB,YAAA,eAAe,CAAC,KAAK,CAAC,OAAO,GAAG,GAAG;AAEnC,YAAA,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE;AACzB,gBAAA,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC;;AAGjC,YAAA,MAAM,KAAK,CAAC,CAAC,CAAC;AAEd,YAAA,eAAe,CAAC,KAAK,CAAC,OAAO,GAAG,GAAG;;aAC9B;AACL,YAAA,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC;;AAElC,KAAC,CAAC;AACJ;;ACzBM,SAAU,cAAc,CAAC,SAAiB,EAAA;AAC9C,IAAA,YAAY,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,SAAS,CAAC,QAAQ,EAAE;AAC5D,SAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,kBAAkB,CAAC,SAAS,CAAC,UAAU,CAAC;AAChE,SAAA,SAAS,CAAC,CAAC,KAAK,KAAK,SAAS,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC;IAEnE,MAAM,CACJ,MAAK;AACH,QAAA,IAAI,SAAS,CAAC,eAAe,EAAE,EAAE,QAAQ,EAAE;AACzC,YAAA,SAAS,CAAC,oBAAoB,CAAC,GAAG,CAAC;AACjC,gBAAA,MAAM,EAAE,SAAS,CAAC,aAAa,EAAE;AACjC,gBAAA,cAAc,EAAE,SAAS,CAAC,cAAc,EAAE;AAC1C,gBAAA,YAAY,EAAE,SAAS,CAAC,OAAO,EAAE,CAAC,KAAK;AACxC,aAAA,CAAC;;KAEL,EACD,EAAE,QAAQ,EAAE,SAAS,CAAC,QAAQ,EAAE,CACjC;AACH;;ACnBM,SAAU,WAAW,CAAC,SAAiB,EAAA;IAC3C,MAAM,CAAC,MAAK;AACV,QAAA,MAAM,OAAO,GAAG,SAAS,CAAC,eAAe,EAAE;QAE3C,IAAI,CAAC,OAAO,EAAE;YACZ;;QAGF,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,mBAAmB,EAAE,GAAG,OAAO;QAErE,IAAI,QAAQ,EAAE;YACZ,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;YAC1C,SAAS,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC;;aACxC,IAAI,QAAQ,EAAE;AACnB,YAAA,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;YACjE,SAAS,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC;;aACxC,IAAI,QAAQ,EAAE;AACnB,YAAA,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;AACzD,YAAA,SAAS,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;;aACzB,IAAI,mBAAmB,EAAE;AAC9B,YAAA,MAAM,kBAAkB,GAAG,mBAAmB,EAAE;AAChD,YAAA,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW,CAAC,kBAAkB,IAAI,EAAE,CAAC,CAAC;YACzE,SAAS,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,kBAAkB,CAAC;;AAEhD,KAAC,CAAC;AACJ;;MCrBa,iBAAiB,CAAA;IAC5B,cAAc,GAAgC,MAAK;AACjD,QAAA,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC;AAC5C,KAAC;uGAHU,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAjB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,iBAAiB,kFCP9B,wSAMA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FDCa,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAL7B,SAAS;+BACE,wBAAwB,EAAA,eAAA,EAEjB,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,wSAAA,EAAA;;;AEGjD,SAAS,QAAQ,CAAC,KAAU,EAAA;IAC1B,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC;AAClE;AAEA,SAAS,kBAAkB,CAAC,SAAiB,EAAE,OAAa,EAAE,KAAU,EAAA;AACtE,IAAA,MAAM,cAAc,GAAG,eAAe,CAAC,iBAAiB,EAAE;AACxD,QAAA,mBAAmB,EAAE,SAAS,CAAC,MAAM,CAAC,QAAQ;AAC9C,QAAA,gBAAgB,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;AAC9B,KAAA,CAAC;AAEF,IAAA,cAAc,CAAC,QAAQ,CAAC,cAAc,GAAG,CAAC,KAAiB,KACzD,SAAS,CAAC,YAAY,CAAC,KAAK,CAAC;AAE/B,IAAA,MAAM,OAAO,GAAgB,cAAc,CAAC,QAAQ,CAAC,aAAa;AAClE,IAAA,MAAM,WAAW,GAAG,OAAO,CAAC,iBAAoC;AAEhE,IAAA,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,KAAK;AAEpC,IAAA,OAAO,OAAO;AAChB;AAEA,eAAe,2BAA2B,CAAC,SAAiB,EAAE,KAAU,EAAA;AACtE,IAAA,OAAO,SAAS,CAAC,SAAS,EAAE,EAAE;AAC5B,QAAA,MAAM,KAAK,CAAC,EAAE,CAAC;;IAGjB,MAAM,eAAe,GAAG,SAAS,CAAC,aAAa,CAAC,aAAa,CAC3D,gBAAgB,CACF;IAEhB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;AACzB,QAAA,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,KAAK,CAAC;;AAGvC,IAAA,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE;AACzB,QAAA,eAAe,CAAC,SAAS,GAAG,EAAE;;IAGhC;SACG,gBAAgB,CAAkB,kBAAkB;AACpD,SAAA,OAAO,CAAC,CAAC,IAAI,KAAI;AAChB,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,EAAE;AACtD,YAAA,IAAI,CAAC,aAAc,CAAC,MAAM,EAAE;;AAEhC,KAAC,CAAC;AAEJ,IAAA,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE;QACrB,MAAM,UAAU,GAAG;AAChB,aAAA,eAAe;AACf,aAAA,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC;QAEnD,IAAI,CAAC,UAAU,EAAE;YACf;;QAGF,MAAM,aAAa,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC;QACpD,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;QAC1C,aAAa,CAAC,SAAS,GAAG,UAAU,EAAE,KAAK,IAAI,CAAC;QAEhD,IAAI,eAAe,CAAC,aAAa,CAAC,gBAAgB,CAAC,CAAA,EAAA,CAAI,CAAC,EAAE;YACxD;;AAGF,QAAA,MAAM,WAAW,GAAG,SAAS,CAAC,QAAQ;cAClC,kBAAkB,CAAC,SAAS,EAAE,aAAa,EAAE,CAAC;cAC9C,aAAa;AAEjB,QAAA,eAAe,CAAC,WAAW,CAAC,WAAW,CAAC;;IAG1C,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAEvC,IAAA,SAAS,CAAC;SACP,gBAAgB,CAAmB,sBAAsB;AACzD,SAAA,OAAO,CAAC,CAAC,KAAK,KAAI;AACjB,QAAA,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC;AACzD,KAAC,CAAC;AACN;AAEA,SAAS,6BAA6B,CAAC,SAAiB,EAAE,KAAU,EAAA;AAClE,IAAA,SAAS,CAAC,eAAe,CAAC,GAAG,CAC3B;AACG,SAAA,UAAU;SACV,MAAM,CAAC,CAAC,IAAI,KACX,KAAK,CAAC,OAAO,CAAC,KAAK;AACjB,UAAE,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;AAC/C,UAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,MAAM,CAAC,KAAK,CAAC,CACzC,CACJ;AACH;AAEO,eAAe,wBAAwB,CAAC,SAAiB,EAAA;IAC9D,MAAM,KAAK,GAAG,SAAS,CAAC,OAAO,EAAE,CAAC,KAAK;IAEvC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAEvC,IAAA,OAAO,SAAS,CAAC,SAAS,EAAE,EAAE;AAC5B,QAAA,MAAM,KAAK,CAAC,EAAE,CAAC;;AAGjB,IAAA,6BAA6B,CAAC,SAAS,EAAE,KAAK,CAAC;AAE/C,IAAA,MAAM,2BAA2B,CAAC,SAAS,EAAE,KAAK,CAAC;IAEnD;AACG,SAAA,OAAO;AACP,SAAA,YAAY,CAAC,IAAI,CAChB,YAAY,CAAC,EAAE,CAAC,EAChB,kBAAkB,CAAC,SAAS,CAAC,UAAU,CAAC;AAEzC,SAAA,SAAS,CAAC,CAAC,KAAK,KAAI;AACnB,QAAA,6BAA6B,CAAC,SAAS,EAAE,KAAK,CAAC;AAC/C,QAAA,2BAA2B,CAAC,SAAS,EAAE,KAAK,CAAC;AAC/C,KAAC,CAAC;AACN;;AChFM,MAAO,MAAO,SAAQ,cAAc,CAAA;AAC/B,IAAA,MAAM,GAAG,MAAM,CAAC,cAAc,CAAC;AAC/B,IAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AAC/B,IAAA,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;AAC3B,IAAA,WAAW,GAAG,SAAS,CAA6B,aAAa,uDAAC;AAElE,IAAA,eAAe,GAAG,MAAM,CAAyB,IAAI,2DAAC;AACtD,IAAA,UAAU,GAAG,MAAM,CAAa,EAAE,sDAAC;AACnC,IAAA,eAAe,GAAG,MAAM,CAAa,EAAE,2DAAC;AACxC,IAAA,SAAS,GAAG,MAAM,CAAU,IAAI,qDAAC;IACjC,oBAAoB,GAAG,MAAM,CAA4B;AAChE,QAAA,MAAM,EAAE,IAAI;AACZ,QAAA,YAAY,EAAE,IAAI;AAClB,QAAA,cAAc,EAAE,IAAI;AACrB,KAAA,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,sBAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAC;IACO,YAAY,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,WAAW,CAAC,IAAI;IACjD,0BAA0B,GAAG,CAAC,GAAG,CAAC,QAAQ,CACjD,YAAY,EACZ,aAAa,CACd;AACQ,IAAA,QAAQ,GAAG,MAAM,CAAU,KAAK,oDAAC;IAE1C,MAAM,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,QAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAU;AACxB,IAAA,aAAa,GAAG,MAAM,CAAgB,IAAI,yDAAC;AAE3C,IAAA,OAAO,GAAG,KAAK,CAAC,QAAQ,kDAAqB;AAC7C,IAAA,cAAc,GAAG,KAAK,CAAgB,IAAI,0DAAC;IAC3C,aAAa,GAAG,KAAK,CAAC,KAAK,0DAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;IAC7D,QAAQ,GAAG,KAAK,CAAC,KAAK,qDAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;IACxD,YAAY,GAAG,MAAM,EAAc;AAEnC,IAAA,IAAI,aAAa,GAAA;AACf,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,EAAE;QAEtC,IAAI,CAAC,WAAW,EAAE;AAChB,YAAA,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC;;QAG7C,OAAO,WAAW,CAAC,aAAa;;AAGlC,IAAA,WAAA,GAAA;AACE,QAAA,KAAK,EAAE;QAEP,WAAW,CAAC,IAAI,CAAC;QACjB,yBAAyB,CAAC,IAAI,CAAC;QAC/B,iBAAiB,CAAC,IAAI,CAAC;QACvB,aAAa,CAAC,IAAI,CAAC;;IAGrB,QAAQ,GAAA;QACN,cAAc,CAAC,IAAI,CAAC;QACpB,uBAAuB,CAAC,IAAI,CAAC;QAC7B,wBAAwB,CAAC,IAAI,CAAC;;AAGhC,IAAA,WAAW,CAAC,OAAmB,EAAA;QAC7B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE;QAElC,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,KAC3B,MAAM,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAC1D;;AAGH,IAAA,QAAQ,CAAC,KAAY,EAAA;AACnB,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAA0B;AAC/C,QAAA,MAAM,KAAK,GAAgB,MAAM,CAAC,KAAK;AAEvC,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE;YACnB,MAAM,uBAAuB,GAAG,IAAI,CAAC,aAAa,CAAC,gBAAgB,CACjE,2DAA2D,CAC5B;YAEjC,MAAM,MAAM,GAAa,EAAE;AAE3B,YAAA,uBAAuB,CAAC,OAAO,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAEtE,YAAA,IAAI,MAAM,CAAC,OAAO,EAAE;gBAClB,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,OAAO,KAAK;AACvC,oBAAA,GAAG,OAAO;AACV,oBAAA,IAAI,CAAC,UAAU,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,KAAK,CAAE;AAChE,iBAAA,CAAC;;iBACG;AACL,gBAAA,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,OAAO,KAClC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC,CACvD;;AAGH,YAAA,MAAM,cAAc,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,KAAK,CAAC;AAEvE,YAAA,IAAI,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,cAAc,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;YAE5D;;QAGF,MAAM,cAAc,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,IAAI,CAC3C,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,KAAK,CACvC;QAED,IAAI,cAAc,EAAE;YAClB,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,cAAc,CAAC,CAAC;AAC1C,YAAA,IAAI,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;;QAGpE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,IAAI,IAAI,CAAC;QAEpD;AACG,aAAA,aAAa,CAAc,CAAA,CAAA,EAAI,IAAI,CAAC,OAAO,WAAW;cACrD,WAAW,EAAE;;AAGnB,IAAA,KAAK,CAAC,KAAiB,EAAA;QACrB,KAAK,CAAC,cAAc,EAAE;AACtB,QAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC;QAC5B,IAAI,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC;;AAG/B,IAAA,YAAY,CAAC,KAAiB,EAAA;QAC5B,KAAK,CAAC,cAAc,EAAE;AAEtB,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAAyB;QAC9C,MAAM,KAAK,GAAG,MAAM,CAAC,aAAa,EAAE,OAAO,CAAC,OAAO,CAAC;AAEpD,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,aAAa,CACjD,CAAA,wCAAA,EAA2C,KAAK,CAAA,EAAA,CAAI,CACjC;QAErB,UAAU,CAAC,KAAK,EAAE;;uGA/HT,MAAM,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAN,MAAM,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,MAAA,EAAA,cAAA,EAAA,YAAA,EAAA,cAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,aAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,aAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC1CnB,kvHA8FA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDvDY,WAAW,8mBAAE,mBAAmB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,WAAW,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,MAAM,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,MAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAGpD,MAAM,EAAA,UAAA,EAAA,CAAA;kBANlB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,WAAW,EAAA,OAAA,EAEZ,CAAC,WAAW,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,CAAC,EAAA,eAAA,EAC/C,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,kvHAAA,EAAA;mGAMc,aAAa,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,QAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,cAAA,CAAA,EAAA,CAAA,EAAA,OAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,cAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,aAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,eAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,UAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,cAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;ME1C/D,aAAa,CAAA;AACxB,IAAA,QAAQ,CAAC,MAA2B,EAAA;AAClC,QAAA,OAAO,MAAM;;AAGf,IAAA,QAAQ,CAAC,MAA+B,EAAA;AACtC,QAAA,OAAO,MAAM;;AAGf,IAAA,QAAQ,CAAC,MAAkB,EAAA;AACzB,QAAA,OAAO,MAAM;;AAGf,IAAA,mBAAmB,CAAC,MAA0B,EAAA;AAC5C,QAAA,OAAO,MAAM;;uGAdJ,aAAa,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAb,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,aAAa,cADA,MAAM,EAAA,CAAA;;2FACnB,aAAa,EAAA,UAAA,EAAA,CAAA;kBADzB,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;ACHlC;;AAEG;;;;"}
1
+ {"version":3,"file":"koalarx-ui-shared-components-input-field-select.mjs","sources":["../../projects/koala-ui/shared/components/input-field/select/accessibility/utils/change-selected-option.ts","../../projects/koala-ui/shared/components/input-field/select/accessibility/utils/update-scroll-position.ts","../../projects/koala-ui/shared/components/input-field/select/accessibility/on-keydown.ts","../../projects/koala-ui/shared/components/input-field/select/accessibility/index.ts","../../projects/koala-ui/shared/components/input-field/select/utils/ajust-options-container-size.ts","../../projects/koala-ui/shared/components/input-field/select/utils/generate-options-resource.ts","../../projects/koala-ui/shared/components/input-field/select/utils/is-loading-feedback.ts","../../projects/koala-ui/shared/components/input-field/select/utils/on-server-filter.ts","../../projects/koala-ui/shared/components/input-field/select/utils/options-loader.ts","../../projects/koala-ui/shared/components/input-field/select/select-option-badge.ts","../../projects/koala-ui/shared/components/input-field/select/select-option-badge.html","../../projects/koala-ui/shared/components/input-field/select/utils/set-selected-option-content.ts","../../projects/koala-ui/shared/components/input-field/select/select.ts","../../projects/koala-ui/shared/components/input-field/select/select.html","../../projects/koala-ui/shared/components/input-field/select/services/select-builder.ts","../../projects/koala-ui/shared/components/input-field/select/koalarx-ui-shared-components-input-field-select.ts"],"sourcesContent":["import { Select } from '../../select';\nimport { ScrollDirection } from './update-scroll-position';\n\nexport function changeSelectedOption(\n component: Select,\n direction: ScrollDirection = 'down'\n) {\n if (!component.selectElement.classList.contains('opened')) {\n return;\n }\n\n const options: NodeListOf<HTMLOptionElement | HTMLLabelElement> =\n component.selectElement.querySelectorAll(\n 'option, .kl-select-options-content .kl-select-option-content'\n );\n\n const selectedOption: HTMLOptionElement | HTMLLabelElement =\n component.selectElement.querySelector('option:checked') ??\n component.selectElement.querySelector(\n 'label.kl-select-option-content:has(input:checked)'\n )!;\n\n let newIndex = 0;\n\n if (selectedOption) {\n const currentIndex = Array.from(options).indexOf(selectedOption);\n\n if (direction === 'down') {\n newIndex =\n currentIndex + 1 < options.length ? currentIndex + 1 : currentIndex;\n } else {\n newIndex = currentIndex - 1 >= 0 ? currentIndex - 1 : currentIndex;\n }\n }\n\n const option = options[newIndex];\n const event = new Event('change', { bubbles: true });\n\n if (option instanceof HTMLOptionElement) {\n option.selected = true;\n\n component.selectElement.dispatchEvent(event);\n } else {\n option.querySelector('input')!.checked = true;\n\n options.forEach((opt) => opt.classList.remove('active'));\n option.classList.toggle('active');\n\n option.querySelector('input')!.dispatchEvent(event);\n }\n}\n","import { Select } from '../../select';\n\nexport type ScrollDirection = 'down' | 'up';\n\nexport function updateScrollPosition(\n component: Select,\n direction: ScrollDirection = 'down'\n) {\n if (!component.selectElement.classList.contains('opened')) {\n return;\n }\n\n setTimeout(() => {\n const optionsContainer = component.selectElement.querySelector(\n '.kl-select-options-content'\n ) as HTMLDivElement;\n const focusedOptionElement =\n optionsContainer.querySelector('option:checked') ??\n component.selectElement.querySelector(\n 'label.kl-select-option-content:has(input:checked)'\n )!;\n\n if (focusedOptionElement) {\n optionsContainer.scrollTo({\n top:\n direction === 'down'\n ? optionsContainer.scrollTop +\n focusedOptionElement.getBoundingClientRect().height\n : optionsContainer.scrollTop -\n focusedOptionElement.getBoundingClientRect().height,\n });\n }\n }, 50);\n}\n","import { Select } from '../select';\nimport { changeSelectedOption } from './utils/change-selected-option';\nimport { updateScrollPosition } from './utils/update-scroll-position';\n\nexport function initOnKeyDownListener(component: Select) {\n function onKeyDown(event: KeyboardEvent) {\n switch (event.key) {\n case 'ArrowDown': {\n event.stopPropagation();\n event.preventDefault();\n\n changeSelectedOption(component, 'down');\n updateScrollPosition(component, 'down');\n break;\n }\n case 'ArrowUp': {\n event.stopPropagation();\n event.preventDefault();\n\n changeSelectedOption(component, 'up');\n updateScrollPosition(component, 'up');\n break;\n }\n }\n }\n\n addEventListener('keydown', onKeyDown);\n\n component.destroyRef.onDestroy(() => {\n removeEventListener('keydown', onKeyDown);\n });\n}\n","import { Select } from '../select';\nimport { initOnKeyDownListener } from './on-keydown';\n\nexport function assessibility(component: Select) {\n initOnKeyDownListener(component);\n}\n","import { afterRenderEffect } from '@angular/core';\nimport { Select } from '../select';\n\nexport function ajustOptionsContainerSize(component: Select) {\n afterRenderEffect(() => {\n const selectElement = component.selectElement;\n const optionsContainer = selectElement.parentElement?.querySelector(\n '.kl-select-options-container',\n ) as HTMLElement;\n\n function setMaxWidth() {\n const currentWidth = selectElement.offsetWidth;\n selectElement.style.setProperty('--select-width', `${currentWidth}px`);\n }\n\n function setMaxHeight() {\n const optionsRect = selectElement.getBoundingClientRect();\n const viewportHeight = window.innerHeight;\n const sizeDiscount = 16 + optionsRect.height;\n\n let availableHeight = viewportHeight - optionsRect.top - sizeDiscount;\n\n if (availableHeight < 150) {\n availableHeight =\n viewportHeight - (viewportHeight - optionsRect.bottom) - sizeDiscount;\n selectElement.style.setProperty('--select-position-area', 'top');\n } else {\n selectElement.style.setProperty('--select-position-area', 'bottom');\n }\n\n optionsContainer.style.maxHeight = `${availableHeight}px`;\n }\n\n function getFilterInput() {\n return optionsContainer.querySelector(\n '.kl-select-filter-container input',\n ) as HTMLInputElement | null;\n }\n\n function disableFilter() {\n const filterInput = getFilterInput();\n\n if (filterInput) {\n filterInput.disabled = true;\n }\n }\n\n function enableAndFocusFilter() {\n const filterInput = getFilterInput();\n\n if (filterInput) {\n filterInput.disabled = false;\n filterInput.focus();\n }\n }\n\n function touchControl() {\n component.control().markAsTouched();\n }\n\n const observer = new IntersectionObserver((entries) => {\n entries.forEach((entry) => {\n if (entry.isIntersecting) {\n component.selectElement.classList.add('opened');\n setMaxWidth();\n setMaxHeight();\n enableAndFocusFilter();\n touchControl();\n } else {\n component.selectElement.classList.remove('opened');\n disableFilter();\n }\n });\n });\n\n setMaxWidth();\n\n observer.observe(optionsContainer);\n component.destroyRef.onDestroy(() => observer.unobserve(optionsContainer));\n });\n}\n","import {\n isSignal,\n ResourceRef,\n runInInjectionContext,\n Signal,\n} from '@angular/core';\nimport { Select } from '../select';\nimport {\n OptionsResource,\n SelectDataOptionsFn,\n SelectList,\n} from '../select.type';\n\nexport function generateOptionsResource(component: Select) {\n const options = component.options();\n\n let optionsResource: OptionsResource;\n\n if (Object.hasOwn(options, 'value')) {\n optionsResource = { onServer: options as ResourceRef<SelectList> };\n } else if (isSignal(options)) {\n optionsResource = {\n inMemoryWithLoading: options as Signal<SelectList>,\n };\n } else if (typeof options === 'function') {\n const resourceFnOptions = options as SelectDataOptionsFn;\n\n optionsResource = {\n onDemand: runInInjectionContext(component.injector, () =>\n resourceFnOptions(component.requestOptionsParams)\n ),\n };\n } else {\n optionsResource = { inMemory: options as SelectList };\n }\n\n component.optionsResource.set(optionsResource);\n}\n","import { effect } from '@angular/core';\nimport { delay } from '@koalarx/utils/KlDelay';\nimport { Select } from '../select';\n\nexport function isLoadingFeedback(component: Select) {\n effect(async () => {\n const isLoading = component.isLoading();\n\n if (!isLoading) {\n while (!component.selectField()) {\n await delay(50);\n }\n\n const selectedContent = component.selectElement.querySelector(\n '.selectcontent'\n ) as HTMLElement;\n\n selectedContent.style.opacity = '0';\n\n if (!component.disabled()) {\n component.isDisabled.set(false);\n }\n\n await delay(1);\n\n selectedContent.style.opacity = '1';\n } else {\n component.isDisabled.set(true);\n }\n });\n}\n","import { effect } from '@angular/core';\nimport { takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop';\nimport { debounceTime } from 'rxjs/internal/operators/debounceTime';\nimport { Select } from '../select';\n\nexport function onServerFilter(component: Select) {\n toObservable(component.filter, { injector: component.injector })\n .pipe(debounceTime(300), takeUntilDestroyed(component.destroyRef))\n .subscribe((value) => component.filteredValue.set(value ?? null));\n\n effect(\n () => {\n if (component.optionsResource()?.onDemand) {\n component.requestOptionsParams.set({\n filter: component.filteredValue(),\n internalFilter: component.internalFilter(),\n currentValue: component.control().value,\n });\n }\n },\n { injector: component.injector }\n );\n}\n","import { effect } from '@angular/core';\nimport { Select } from '../select';\n\nexport function loadOptions(component: Select) {\n effect(() => {\n const options = component.optionsResource();\n\n if (!options) {\n return;\n }\n\n const { onDemand, onServer, inMemory, inMemoryWithLoading } = options;\n\n if (onDemand) {\n component.optionList.set(onDemand.value());\n component.isLoading.set(onDemand.isLoading());\n } else if (onServer) {\n component.optionList.set(component.applyFilter(onServer.value()));\n component.isLoading.set(onServer.isLoading());\n } else if (inMemory) {\n component.optionList.set(component.applyFilter(inMemory));\n component.isLoading.set(false);\n } else if (inMemoryWithLoading) {\n const optionsWithLoading = inMemoryWithLoading();\n component.optionList.set(component.applyFilter(optionsWithLoading ?? []));\n component.isLoading.set(!optionsWithLoading);\n }\n });\n}\n","import { ChangeDetectionStrategy, Component } from '@angular/core';\n\n@Component({\n selector: 'kl-select-option-badge',\n templateUrl: './select-option-badge.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SelectOptionBadge {\n removeCallback: (event: MouseEvent) => void = () => {\n throw new Error('Remove callback not set');\n };\n}\n","<span class=\"flex items-center h-auto badge badge-outline badge-primary badge-sm rounded-sm bg-primary/20 dark:text-neutral-300 dark:border-primary\">\n <ng-content />\n <i class=\"fa-solid fa-xmark text-neutral-500 hover:cursor-pointer\"\n (click)=\"removeCallback($event)\">\n </i>\n</span>\n","import { createComponent } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { isEmpty } from '@koalarx/ui/shared/utils';\nimport { delay } from '@koalarx/utils/KlDelay';\nimport { debounceTime } from 'rxjs/internal/operators/debounceTime';\nimport { Select } from '../select';\nimport { SelectOptionBadge } from '../select-option-badge';\n\nfunction hasValue(value: any) {\n return Array.isArray(value) ? value.length > 0 : !isEmpty(value);\n}\n\nfunction createBadgeElement(component: Select, content: Node, value: any) {\n const badgeComponent = createComponent(SelectOptionBadge, {\n environmentInjector: component.appRef.injector,\n projectableNodes: [[content]],\n });\n\n badgeComponent.instance.removeCallback = (event: MouseEvent) =>\n component.removeOption(event);\n\n const element: HTMLElement = badgeComponent.location.nativeElement;\n const spanElement = element.firstElementChild as HTMLSpanElement;\n\n spanElement.dataset['value'] = value;\n\n return element;\n}\n\nasync function appendSelectedOptionContent(component: Select, value: any) {\n while (component.isLoading()) {\n await delay(50);\n }\n\n const selectedContent = component.selectElement.querySelector(\n '.selectcontent'\n ) as HTMLElement;\n\n if (!Array.isArray(value)) {\n value = isEmpty(value) ? [] : [value];\n }\n\n if (!component.multiple()) {\n selectedContent.innerHTML = '';\n }\n\n selectedContent\n .querySelectorAll<HTMLSpanElement>('span[data-value]')\n .forEach((node) => {\n if (!value.map(String).includes(node.dataset['value'])) {\n node.parentElement!.remove();\n }\n });\n\n for (const v of value) {\n const optionData = component\n .selectedOptions()\n .find((item) => String(item.value) === String(v));\n\n if (!optionData) {\n continue;\n }\n\n const optionContent = document.createElement('span');\n optionContent.dataset['value'] = String(v);\n optionContent.innerHTML = optionData?.label ?? v;\n\n if (selectedContent.querySelector(`[data-value=\"${v}\"]`)) {\n continue;\n }\n\n const optionBadge = component.multiple()\n ? createBadgeElement(component, optionContent, v)\n : optionContent;\n\n selectedContent.appendChild(optionBadge);\n }\n\n component.hasValue.set(hasValue(value));\n\n component.selectElement\n .querySelectorAll<HTMLInputElement>('input[type=checkbox]')\n .forEach((input) => {\n input.checked = value.map(String).includes(input.value);\n });\n}\n\nfunction setSelectedOptionsOnComponent(component: Select, value: any) {\n component.selectedOptions.set(\n component\n .optionList()\n .filter((item) =>\n Array.isArray(value)\n ? value.map(String).includes(String(item.value))\n : String(item.value) === String(value)\n )\n );\n}\n\nexport async function setSelectedOptionContent(component: Select) {\n const value = component.control().value;\n\n component.hasValue.set(hasValue(value));\n\n while (component.isLoading()) {\n await delay(50);\n }\n\n setSelectedOptionsOnComponent(component, value);\n\n await appendSelectedOptionContent(component, value);\n\n component\n .control()\n .valueChanges.pipe(\n debounceTime(50),\n takeUntilDestroyed(component.destroyRef)\n )\n .subscribe((value) => {\n setSelectedOptionsOnComponent(component, value);\n appendSelectedOptionContent(component, value);\n });\n}\n","import {\n ApplicationRef,\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n inject,\n Injector,\n input,\n model,\n OnInit,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { Loader } from '@koalarx/ui/core/components/loader';\nimport { AppConfig } from '@koalarx/ui/core/config';\nimport { FieldErrors } from '@koalarx/ui/shared/components/field-errors';\nimport { InputFieldBase } from '@koalarx/ui/shared/components/input-field';\nimport { assessibility } from './accessibility';\nimport {\n OptionsResource,\n SelectDataOptions,\n SelectDataOptionsFnParams,\n SelectList,\n SelectValue,\n} from './select.type';\nimport { ajustOptionsContainerSize } from './utils/ajust-options-container-size';\nimport { generateOptionsResource } from './utils/generate-options-resource';\nimport { isLoadingFeedback } from './utils/is-loading-feedback';\nimport { onServerFilter } from './utils/on-server-filter';\nimport { loadOptions } from './utils/options-loader';\nimport { setSelectedOptionContent } from './utils/set-selected-option-content';\n\n@Component({\n selector: 'kl-select',\n templateUrl: './select.html',\n imports: [FormsModule, ReactiveFormsModule, FieldErrors, Loader],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class Select extends InputFieldBase implements OnInit {\n readonly appRef = inject(ApplicationRef);\n readonly injector = inject(Injector);\n readonly selectField = viewChild<ElementRef<HTMLDivElement>>('selectField');\n\n readonly optionsResource = signal<OptionsResource | null>(null);\n readonly optionList = signal<SelectList>([]);\n readonly selectedOptions = signal<SelectList>([]);\n readonly isLoading = signal<boolean>(true);\n readonly requestOptionsParams = signal<SelectDataOptionsFnParams>({\n filter: null,\n currentValue: null,\n internalFilter: null,\n });\n readonly translations = inject(AppConfig).translation.form;\n readonly supportsExperimentalSelect = !CSS.supports(\n 'appearance',\n 'base-select',\n );\n readonly hasValue = signal<boolean>(false);\n\n filter = model<string>();\n filteredValue = signal<string | null>(null);\n\n options = input.required<SelectDataOptions>();\n internalFilter = input<string | null>(null);\n withoutFilter = input(false, { transform: booleanAttribute });\n multiple = input(false, { transform: booleanAttribute });\n selectedItem = output<any | null>();\n\n get selectElement() {\n const selectField = this.selectField();\n\n if (!selectField) {\n throw new Error('Select element not found');\n }\n\n return selectField.nativeElement;\n }\n\n constructor() {\n super();\n\n loadOptions(this);\n ajustOptionsContainerSize(this);\n isLoadingFeedback(this);\n assessibility(this);\n }\n\n ngOnInit() {\n onServerFilter(this);\n generateOptionsResource(this);\n setSelectedOptionContent(this);\n }\n\n applyFilter(options: SelectList) {\n const filter = this.filter() ?? '';\n\n return options.filter((option) =>\n option.label.toLowerCase().includes(filter.toLowerCase()),\n );\n }\n\n setValue(event: Event) {\n const select = event.target as HTMLInputElement;\n const value: SelectValue = select.value;\n\n if (this.multiple()) {\n const selectedOptionsElements = this.selectElement.querySelectorAll(\n '.kl-select-options-content input[type=\"checkbox\"]:checked',\n ) as NodeListOf<HTMLInputElement>;\n\n const values: string[] = [];\n\n selectedOptionsElements.forEach((option) => values.push(option.value));\n\n if (select.checked) {\n this.selectedOptions.update((current) => [\n ...current,\n this.optionList().find((item) => String(item.value) === value)!,\n ]);\n } else {\n this.selectedOptions.update((current) =>\n current.filter((item) => String(item.value) !== value),\n );\n }\n\n const selectedValues = this.selectedOptions().map((item) => item.value);\n\n this.control().setValue(selectedValues, { emitEvent: true });\n\n return;\n }\n\n const selectedOption = this.optionList().find(\n (item) => String(item.value) === value,\n );\n\n if (selectedOption) {\n this.selectedOptions.set([selectedOption]);\n this.control().setValue(selectedOption.value, { emitEvent: true });\n }\n\n this.selectedItem.emit(selectedOption?.data ?? null);\n\n document\n .querySelector<HTMLElement>(`#${this.fieldId}[popover]`)\n ?.hidePopover();\n }\n\n clear(event: MouseEvent) {\n event.preventDefault();\n this.selectedOptions.set([]);\n this.control().setValue(null);\n }\n\n removeOption(event: MouseEvent) {\n event.preventDefault();\n\n const target = event.target as HTMLSpanElement;\n const value = target.parentElement?.dataset['value'];\n\n const inputValue = this.selectElement.querySelector(\n `.kl-select-options-content input[value=\"${value}\"]`,\n ) as HTMLInputElement;\n\n inputValue.click();\n }\n}\n","<div class=\"kl-select-container relative w-full has-[select:disabled]:cursor-not-allowed\"\n [class.has-value]=\"hasValue()\">\n\n @if (label(); as label) {\n <label class=\"kl-select-label flex items-center gap-2 whitespace-nowrap text-neutral-900 dark:text-neutral-300\"\n [attr.for]=\"fieldId\">\n @if (isDisabled()) {\n <span class=\"text-neutral-200 dark:text-neutral-600\">\n {{ label }} {{ isRequired() ? '*' : '' }}\n </span>\n } @else {\n <span>{{ label }} {{ isRequired() ? '*' : '' }}</span>\n }\n </label>\n }\n\n @if (!isDisabled() && hasValue()) {\n <div class=\"flex items-center justify-center h-full absolute top-0 right-7 z-10 pr-2\">\n <button class=\"kl-select-clear-button text-neutral-400 hover:cursor-pointer text-sm focus:shadow-none!\"\n type=\"button\"\n (click)=\"clear($event)\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n }\n\n <div class=\"kl-select-content\" #selectField>\n <button type=\"button\" class=\"kl-select-button flex gap-4 disabled:border-neutral-200! disabled:dark:border-neutral-800!\"\n [attr.popovertarget]=\"fieldId\"\n popovertargetaction=\"toggle\">\n\n <span class=\"selectcontent flex flex-wrap gap-1 items-center w-[calc(100%-3rem)] h-full text-left py-1\" [class.py-3]=\"multiple()\"></span>\n\n <span class=\"picker\">\n @if (isLoading()) {\n <kl-loader size=\"small\" />\n } @else {\n <i class=\"fa-solid fa-caret-down\"></i>\n }\n </span>\n </button>\n\n <div [id]=\"fieldId\" popover class=\"kl-select-options-container with-popover relative flex flex-col overflow-hidden bg-base-100 dark:bg-base-300\">\n @if (!withoutFilter()) {\n <div class=\"kl-select-filter-container border-b border-neutral-700\">\n <label class=\"flex items-center text-sm\">\n <i class=\"fa-solid fa-magnifying-glass opacity-60 absolute top-3 left-4\"></i>\n <input class=\"w-full p-2 pr-3 pl-10 outline-none dark:placeholder:opacity-80\"\n #searchInput\n type=\"search\"\n [(ngModel)]=\"filter\"\n [placeholder]=\"translations.selectTypeSearch\"\n />\n </label>\n </div>\n }\n\n <div class=\"kl-select-options-content p-1 overflow-auto\">\n @for (item of optionList(); track $index) {\n @let optionLabelId = fieldId + '-' + item.value;\n\n <label class=\"kl-select-option-content relative py-1 px-2 pr-8 rounded-md text-neutral-900 dark:text-neutral-300 has-[input:checked]:bg-neutral-200 dark:has-[input:checked]:bg-neutral-700 hover:bg-neutral-300 dark:hover:bg-neutral-600 cursor-pointer\"\n [attr.for]=\"optionLabelId\"\n [attr.data-index]=\"$index\">\n <span class=\"w-full flex flex-col justify-center\">\n @let isChecked = multiple() ? (control().value || []).includes(item.value) : item.value === control().value;\n\n <input\n [type]=\"multiple() ? 'checkbox' : 'radio'\"\n [id]=\"optionLabelId\"\n [name]=\"fieldId\"\n [attr.value]=\"item.value\"\n [checked]=\"isChecked\"\n (change)=\"setValue($event)\"\n />\n <span>{{ item.label }}</span>\n <small class=\"empty:hidden opacity-60\">{{ item.description }}</small>\n </span>\n </label>\n }\n </div>\n </div>\n </div>\n</div>\n\n@if (hint()) {\n <span class=\"hint-content\">{{hint()}}</span>\n}\n\n<kl-field-errors [field]=\"control()\">\n <ng-container errors>\n <ng-content select=\"[errors]\" />\n </ng-container>\n</kl-field-errors>\n","import { Injectable, ResourceRef, Signal } from '@angular/core';\nimport { SelectDataOptionsFn, SelectList } from '../select.type';\n\n@Injectable({ providedIn: 'root' })\nexport class SelectBuilder {\n onDemand(config: SelectDataOptionsFn) {\n return config;\n }\n\n onServer(config: ResourceRef<SelectList>) {\n return config;\n }\n\n inMemory(config: SelectList) {\n return config;\n }\n\n inMemoryWithLoading(config: Signal<SelectList>) {\n return config;\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -67,11 +67,11 @@ class Switcher extends InputFieldBase {
67
67
  this.control().setValue(target.checked);
68
68
  }
69
69
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: Switcher, deps: [], target: i0.ɵɵFactoryTarget.Component });
70
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.6", type: Switcher, isStandalone: true, selector: "kl-switcher", inputs: { color: { classPropertyName: "color", publicName: "color", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: "switcherElement", first: true, predicate: ["inputSwitcher"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<label [attr.for]=\"fieldId\" class=\"flex items-center gap-2 cursor-pointer\">\n <input #inputSwitcher\n [id]=\"fieldId\"\n type=\"checkbox\"\n class=\"toggle\"\n [checked]=\"control().value\"\n [disabled]=\"disabled()\"\n (change)=\"toggle($event)\"\n />\n\n <ng-content />\n</label>\n\n@if (hint()) {\n <span class=\"hint-content\"><i class=\"fa-regular fa-circle-question\"></i> {{hint()}}</span>\n}\n", dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
70
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.6", type: Switcher, isStandalone: true, selector: "kl-switcher", inputs: { color: { classPropertyName: "color", publicName: "color", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: "switcherElement", first: true, predicate: ["inputSwitcher"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<label [attr.for]=\"fieldId\" class=\"flex items-center gap-2 cursor-pointer\">\n <input #inputSwitcher\n [id]=\"fieldId\"\n type=\"checkbox\"\n class=\"toggle\"\n [checked]=\"control().value\"\n [disabled]=\"disabled()\"\n (change)=\"toggle($event)\"\n />\n\n <ng-content />\n</label>\n\n@if (hint()) {\n <span class=\"hint-content\">{{hint()}}</span>\n}\n", dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
71
71
  }
72
72
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: Switcher, decorators: [{
73
73
  type: Component,
74
- args: [{ selector: 'kl-switcher', imports: [ReactiveFormsModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "<label [attr.for]=\"fieldId\" class=\"flex items-center gap-2 cursor-pointer\">\n <input #inputSwitcher\n [id]=\"fieldId\"\n type=\"checkbox\"\n class=\"toggle\"\n [checked]=\"control().value\"\n [disabled]=\"disabled()\"\n (change)=\"toggle($event)\"\n />\n\n <ng-content />\n</label>\n\n@if (hint()) {\n <span class=\"hint-content\"><i class=\"fa-regular fa-circle-question\"></i> {{hint()}}</span>\n}\n" }]
74
+ args: [{ selector: 'kl-switcher', imports: [ReactiveFormsModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "<label [attr.for]=\"fieldId\" class=\"flex items-center gap-2 cursor-pointer\">\n <input #inputSwitcher\n [id]=\"fieldId\"\n type=\"checkbox\"\n class=\"toggle\"\n [checked]=\"control().value\"\n [disabled]=\"disabled()\"\n (change)=\"toggle($event)\"\n />\n\n <ng-content />\n</label>\n\n@if (hint()) {\n <span class=\"hint-content\">{{hint()}}</span>\n}\n" }]
75
75
  }], ctorParameters: () => [], propDecorators: { switcherElement: [{ type: i0.ViewChild, args: ['inputSwitcher', { isSignal: true }] }], color: [{ type: i0.Input, args: [{ isSignal: true, alias: "color", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }] } });
76
76
 
77
77
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"koalarx-ui-shared-components-input-field-switcher.mjs","sources":["../../projects/koala-ui/shared/components/input-field/switcher/switcher.ts","../../projects/koala-ui/shared/components/input-field/switcher/switcher.html","../../projects/koala-ui/shared/components/input-field/switcher/koalarx-ui-shared-components-input-field-switcher.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n effect,\n ElementRef,\n input,\n viewChild,\n} from '@angular/core';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { InputFieldBase } from '@koalarx/ui/shared/components/input-field';\n\nexport type SwitcherColor =\n | 'neutral'\n | 'primary'\n | 'secondary'\n | 'accent'\n | 'info'\n | 'success'\n | 'warning'\n | 'error'\n | 'ghost';\n\nexport type SwitcherSize =\n | 'extraSmall'\n | 'small'\n | 'medium'\n | 'large'\n | 'extraLarge';\n\n@Component({\n selector: 'kl-switcher',\n templateUrl: './switcher.html',\n imports: [ReactiveFormsModule],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class Switcher extends InputFieldBase {\n private readonly switcherElement =\n viewChild<ElementRef<HTMLInputElement>>('inputSwitcher');\n\n color = input<SwitcherColor>();\n size = input<SwitcherSize>();\n\n private getColorClass(): string {\n switch (this.color()) {\n case 'neutral':\n return 'toggle-neutral';\n case 'primary':\n return 'toggle-primary';\n case 'secondary':\n return 'toggle-secondary';\n case 'accent':\n return 'toggle-accent';\n case 'info':\n return 'toggle-info';\n case 'success':\n return 'toggle-success';\n case 'warning':\n return 'toggle-warning';\n case 'error':\n return 'toggle-error';\n case 'ghost':\n return 'toggle-ghost';\n default:\n return 'toggle';\n }\n }\n\n private getSizeClass(): string {\n switch (this.size()) {\n case 'extraSmall':\n return 'toggle-xs';\n case 'small':\n return 'toggle-sm';\n case 'medium':\n return 'toggle-md';\n case 'large':\n return 'toggle-lg';\n case 'extraLarge':\n return 'toggle-xl';\n default:\n return 'toggle';\n }\n }\n\n constructor() {\n super();\n\n effect(() => {\n const input = this.switcherElement()?.nativeElement;\n\n if (input) {\n input.classList.add(this.getColorClass());\n }\n });\n\n effect(() => {\n const input = this.switcherElement()?.nativeElement;\n\n if (input) {\n input.classList.add(this.getSizeClass());\n }\n });\n }\n\n toggle(event: Event) {\n const target = event.target as HTMLInputElement;\n this.control().setValue(target.checked);\n }\n}\n","<label [attr.for]=\"fieldId\" class=\"flex items-center gap-2 cursor-pointer\">\n <input #inputSwitcher\n [id]=\"fieldId\"\n type=\"checkbox\"\n class=\"toggle\"\n [checked]=\"control().value\"\n [disabled]=\"disabled()\"\n (change)=\"toggle($event)\"\n />\n\n <ng-content />\n</label>\n\n@if (hint()) {\n <span class=\"hint-content\"><i class=\"fa-regular fa-circle-question\"></i> {{hint()}}</span>\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"koalarx-ui-shared-components-input-field-switcher.mjs","sources":["../../projects/koala-ui/shared/components/input-field/switcher/switcher.ts","../../projects/koala-ui/shared/components/input-field/switcher/switcher.html","../../projects/koala-ui/shared/components/input-field/switcher/koalarx-ui-shared-components-input-field-switcher.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n effect,\n ElementRef,\n input,\n viewChild,\n} from '@angular/core';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { InputFieldBase } from '@koalarx/ui/shared/components/input-field';\n\nexport type SwitcherColor =\n | 'neutral'\n | 'primary'\n | 'secondary'\n | 'accent'\n | 'info'\n | 'success'\n | 'warning'\n | 'error'\n | 'ghost';\n\nexport type SwitcherSize =\n | 'extraSmall'\n | 'small'\n | 'medium'\n | 'large'\n | 'extraLarge';\n\n@Component({\n selector: 'kl-switcher',\n templateUrl: './switcher.html',\n imports: [ReactiveFormsModule],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class Switcher extends InputFieldBase {\n private readonly switcherElement =\n viewChild<ElementRef<HTMLInputElement>>('inputSwitcher');\n\n color = input<SwitcherColor>();\n size = input<SwitcherSize>();\n\n private getColorClass(): string {\n switch (this.color()) {\n case 'neutral':\n return 'toggle-neutral';\n case 'primary':\n return 'toggle-primary';\n case 'secondary':\n return 'toggle-secondary';\n case 'accent':\n return 'toggle-accent';\n case 'info':\n return 'toggle-info';\n case 'success':\n return 'toggle-success';\n case 'warning':\n return 'toggle-warning';\n case 'error':\n return 'toggle-error';\n case 'ghost':\n return 'toggle-ghost';\n default:\n return 'toggle';\n }\n }\n\n private getSizeClass(): string {\n switch (this.size()) {\n case 'extraSmall':\n return 'toggle-xs';\n case 'small':\n return 'toggle-sm';\n case 'medium':\n return 'toggle-md';\n case 'large':\n return 'toggle-lg';\n case 'extraLarge':\n return 'toggle-xl';\n default:\n return 'toggle';\n }\n }\n\n constructor() {\n super();\n\n effect(() => {\n const input = this.switcherElement()?.nativeElement;\n\n if (input) {\n input.classList.add(this.getColorClass());\n }\n });\n\n effect(() => {\n const input = this.switcherElement()?.nativeElement;\n\n if (input) {\n input.classList.add(this.getSizeClass());\n }\n });\n }\n\n toggle(event: Event) {\n const target = event.target as HTMLInputElement;\n this.control().setValue(target.checked);\n }\n}\n","<label [attr.for]=\"fieldId\" class=\"flex items-center gap-2 cursor-pointer\">\n <input #inputSwitcher\n [id]=\"fieldId\"\n type=\"checkbox\"\n class=\"toggle\"\n [checked]=\"control().value\"\n [disabled]=\"disabled()\"\n (change)=\"toggle($event)\"\n />\n\n <ng-content />\n</label>\n\n@if (hint()) {\n <span class=\"hint-content\">{{hint()}}</span>\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  import * as i0 from '@angular/core';
2
- import { inject, ElementRef, signal, linkedSignal, input, booleanAttribute, effect, Directive, ChangeDetectionStrategy, Component } from '@angular/core';
2
+ import { inject, ElementRef, signal, DestroyRef, linkedSignal, input, booleanAttribute, effect, afterRenderEffect, Directive, ChangeDetectionStrategy, Component } from '@angular/core';
3
+ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
3
4
  import * as i1 from '@angular/forms';
4
5
  import { Validators, ReactiveFormsModule } from '@angular/forms';
5
6
  import { CURRENT_THEME } from '@koalarx/ui/core/config';
@@ -10,12 +11,14 @@ import { InputMask } from '@koalarx/ui/shared/directives';
10
11
  class InputFieldBase {
11
12
  elementRef = inject(ElementRef);
12
13
  required = signal(false, ...(ngDevMode ? [{ debugName: "required" }] : []));
14
+ destroyRef = inject(DestroyRef);
13
15
  isDisabled = linkedSignal(() => this.disabled(), ...(ngDevMode ? [{ debugName: "isDisabled" }] : []));
14
16
  isRequired = this.required.asReadonly();
15
17
  fieldId = randomString(10, {
16
18
  lowercase: true,
17
19
  uppercase: true,
18
20
  });
21
+ valueChange = signal(null, ...(ngDevMode ? [{ debugName: "valueChange" }] : []));
19
22
  control = input.required(...(ngDevMode ? [{ debugName: "control" }] : []));
20
23
  label = input(...(ngDevMode ? [undefined, { debugName: "label" }] : []));
21
24
  placeholder = input('', ...(ngDevMode ? [{ debugName: "placeholder" }] : []));
@@ -34,6 +37,11 @@ class InputFieldBase {
34
37
  }
35
38
  }
36
39
  });
40
+ afterRenderEffect(() => {
41
+ this.control()
42
+ .valueChanges.pipe(takeUntilDestroyed(this.destroyRef))
43
+ .subscribe(this.valueChange.set);
44
+ });
37
45
  }
38
46
  getBgColorParent(element) {
39
47
  const containerBgColor = window.getComputedStyle(element).backgroundColor;
@@ -1 +1 @@
1
- {"version":3,"file":"koalarx-ui-shared-components-input-field.mjs","sources":["../../projects/koala-ui/shared/components/input-field/input-field.base.ts","../../projects/koala-ui/shared/components/input-field/input-field.ts","../../projects/koala-ui/shared/components/input-field/input-field.html","../../projects/koala-ui/shared/components/input-field/koalarx-ui-shared-components-input-field.ts"],"sourcesContent":["import {\n booleanAttribute,\n Directive,\n effect,\n ElementRef,\n inject,\n input,\n linkedSignal,\n signal,\n} from '@angular/core';\nimport { FormControl, Validators } from '@angular/forms';\nimport { CURRENT_THEME } from '@koalarx/ui/core/config';\nimport { randomString } from '@koalarx/utils/KlString';\n\n@Directive()\nexport abstract class InputFieldBase {\n private readonly elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly required = signal(false);\n\n readonly isDisabled = linkedSignal(() => this.disabled());\n readonly isRequired = this.required.asReadonly();\n readonly fieldId = randomString(10, {\n lowercase: true,\n uppercase: true,\n });\n\n control = input.required<FormControl>();\n label = input<string>();\n placeholder = input<string>('');\n hint = input<string>();\n disabled = input(false, { transform: booleanAttribute });\n\n constructor() {\n effect(() => this.checkIsRequired(this.control()));\n\n effect(() => {\n CURRENT_THEME();\n\n if (\n this.elementRef.nativeElement?.tagName.toLowerCase() !==\n 'kl-input-field'\n ) {\n const container = this.elementRef.nativeElement.parentElement;\n\n if (container) {\n const containerBgColor = this.getBgColorParent(container);\n\n this.elementRef.nativeElement.style = `--bg-input: ${containerBgColor}`;\n }\n }\n });\n }\n\n private getBgColorParent(element: HTMLElement): string {\n const containerBgColor = window.getComputedStyle(element).backgroundColor;\n\n if (!containerBgColor || containerBgColor === 'rgba(0, 0, 0, 0)') {\n if (!element.parentElement) {\n return 'var(--color-base-100)';\n }\n\n return this.getBgColorParent(element.parentElement!);\n }\n\n return containerBgColor;\n }\n\n private checkIsRequired(control: FormControl) {\n this.required.set(control.hasValidator(Validators.required));\n }\n}\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { FieldErrors } from '@koalarx/ui/shared/components/field-errors';\nimport { InputMask } from '@koalarx/ui/shared/directives';\nimport { InputFieldBase } from './input-field.base';\n\ntype InputTypeField =\n | 'text'\n | 'email'\n | 'password'\n | 'number'\n | 'tel'\n | 'url'\n | 'date'\n | 'datetime-local'\n | 'month'\n | 'time'\n | 'search';\n\n@Component({\n selector: 'kl-input-field',\n templateUrl: './input-field.html',\n imports: [ReactiveFormsModule, InputMask, FieldErrors],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class InputField extends InputFieldBase {\n type = input<InputTypeField>('text');\n mask = input<string>('');\n min = input<string>();\n max = input<string>();\n}\n","<label [attr.for]=\"fieldId\" class=\"floating-label input validator w-full rounded-sm\">\n @if (label(); as label) {\n <span>\n <ng-content select=\"[icon]\" />\n {{ label }} {{ isRequired() ? '*' : '' }}\n </span>\n }\n\n <input\n [id]=\"fieldId\"\n [formControl]=\"control()\"\n [placeholder]=\"label()\n ? label() + (isRequired() ? '*' : '')\n : placeholder()\"\n [required]=\"isRequired()\"\n [mask]=\"mask()\"\n [type]=\"type()\"\n [min]=\"min()\"\n [max]=\"max()\"\n />\n\n <ng-content select=\"[suffix]\" />\n</label>\n\n@if (hint()) {\n <span class=\"hint-content\">{{hint()}}</span>\n}\n\n<kl-field-errors [field]=\"control()\">\n <ng-container errors>\n <ng-content select=\"[errors]\" />\n </ng-container>\n</kl-field-errors>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"koalarx-ui-shared-components-input-field.mjs","sources":["../../projects/koala-ui/shared/components/input-field/input-field.base.ts","../../projects/koala-ui/shared/components/input-field/input-field.ts","../../projects/koala-ui/shared/components/input-field/input-field.html","../../projects/koala-ui/shared/components/input-field/koalarx-ui-shared-components-input-field.ts"],"sourcesContent":["import {\n afterRenderEffect,\n booleanAttribute,\n DestroyRef,\n Directive,\n effect,\n ElementRef,\n inject,\n input,\n linkedSignal,\n signal,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { FormControl, Validators } from '@angular/forms';\nimport { CURRENT_THEME } from '@koalarx/ui/core/config';\nimport { randomString } from '@koalarx/utils/KlString';\n\n@Directive()\nexport abstract class InputFieldBase {\n private readonly elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly required = signal(false);\n\n readonly destroyRef = inject(DestroyRef);\n readonly isDisabled = linkedSignal(() => this.disabled());\n readonly isRequired = this.required.asReadonly();\n readonly fieldId = randomString(10, {\n lowercase: true,\n uppercase: true,\n });\n readonly valueChange = signal<any>(null);\n\n control = input.required<FormControl>();\n label = input<string>();\n placeholder = input<string>('');\n hint = input<string>();\n disabled = input(false, { transform: booleanAttribute });\n\n constructor() {\n effect(() => this.checkIsRequired(this.control()));\n\n effect(() => {\n CURRENT_THEME();\n\n if (\n this.elementRef.nativeElement?.tagName.toLowerCase() !==\n 'kl-input-field'\n ) {\n const container = this.elementRef.nativeElement.parentElement;\n\n if (container) {\n const containerBgColor = this.getBgColorParent(container);\n\n this.elementRef.nativeElement.style = `--bg-input: ${containerBgColor}`;\n }\n }\n });\n\n afterRenderEffect(() => {\n this.control()\n .valueChanges.pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(this.valueChange.set);\n });\n }\n\n private getBgColorParent(element: HTMLElement): string {\n const containerBgColor = window.getComputedStyle(element).backgroundColor;\n\n if (!containerBgColor || containerBgColor === 'rgba(0, 0, 0, 0)') {\n if (!element.parentElement) {\n return 'var(--color-base-100)';\n }\n\n return this.getBgColorParent(element.parentElement!);\n }\n\n return containerBgColor;\n }\n\n private checkIsRequired(control: FormControl) {\n this.required.set(control.hasValidator(Validators.required));\n }\n}\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { FieldErrors } from '@koalarx/ui/shared/components/field-errors';\nimport { InputMask } from '@koalarx/ui/shared/directives';\nimport { InputFieldBase } from './input-field.base';\n\ntype InputTypeField =\n | 'text'\n | 'email'\n | 'password'\n | 'number'\n | 'tel'\n | 'url'\n | 'date'\n | 'datetime-local'\n | 'month'\n | 'time'\n | 'search';\n\n@Component({\n selector: 'kl-input-field',\n templateUrl: './input-field.html',\n imports: [ReactiveFormsModule, InputMask, FieldErrors],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class InputField extends InputFieldBase {\n type = input<InputTypeField>('text');\n mask = input<string>('');\n min = input<string>();\n max = input<string>();\n}\n","<label [attr.for]=\"fieldId\" class=\"floating-label input validator w-full rounded-sm\">\n @if (label(); as label) {\n <span>\n <ng-content select=\"[icon]\" />\n {{ label }} {{ isRequired() ? '*' : '' }}\n </span>\n }\n\n <input\n [id]=\"fieldId\"\n [formControl]=\"control()\"\n [placeholder]=\"label()\n ? label() + (isRequired() ? '*' : '')\n : placeholder()\"\n [required]=\"isRequired()\"\n [mask]=\"mask()\"\n [type]=\"type()\"\n [min]=\"min()\"\n [max]=\"max()\"\n />\n\n <ng-content select=\"[suffix]\" />\n</label>\n\n@if (hint()) {\n <span class=\"hint-content\">{{hint()}}</span>\n}\n\n<kl-field-errors [field]=\"control()\">\n <ng-container errors>\n <ng-content select=\"[errors]\" />\n </ng-container>\n</kl-field-errors>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -98,57 +98,49 @@ class InputCurrencyMask {
98
98
  get input() {
99
99
  return this.elementRef.nativeElement;
100
100
  }
101
- onFocus() {
102
- this.elementRef.nativeElement.addEventListener('focus', () => {
103
- this.putInputCaretOnTheEnd();
104
- });
105
- }
106
- onKeyUp() {
107
- this.elementRef.nativeElement.addEventListener('keyup', (event) => {
108
- if (/\d/.test(event.key) || event.key === 'Backspace') {
109
- this.updateWritedValue(event.key, event.key === 'Backspace');
110
- if (isNaN(this.writedValue)) {
111
- this.writedValue = 0;
112
- }
113
- this.applyMask();
114
- }
115
- else if (event.key === 'ArrowLeft' || event.key === 'ArrowRight') {
116
- this.putInputCaretOnTheEnd();
117
- }
118
- });
119
- }
120
- onKeyPress() {
121
- this.elementRef.nativeElement.addEventListener('keypress', (event) => {
122
- event.preventDefault();
123
- });
124
- }
125
- onKeyDown() {
126
- this.elementRef.nativeElement.addEventListener('keydown', (event) => {
127
- if (event.key === 'Backspace') {
128
- event.preventDefault();
129
- }
130
- });
131
- }
132
- onPaste() {
133
- this.elementRef.nativeElement.addEventListener('paste', (event) => {
134
- event.preventDefault();
135
- if (!event.clipboardData) {
136
- return;
101
+ onFocus = () => {
102
+ this.putInputCaretOnTheEnd();
103
+ };
104
+ onKeyUp = (event) => {
105
+ if (/\d/.test(event.key) || event.key === 'Backspace') {
106
+ this.updateWritedValue(event.key, event.key === 'Backspace');
107
+ if (isNaN(this.writedValue)) {
108
+ this.writedValue = 0;
137
109
  }
138
- const pastedValue = event.clipboardData.getData('Text');
139
- let unmaskedValue = parseFloat(pastedValue);
140
- if (pastedValue.includes(',')) {
141
- unmaskedValue = this.unmaskCoin(event.clipboardData.getData('Text'));
142
- }
143
- this.setValue(this.maskCoin(unmaskedValue));
144
- });
145
- }
146
- onReset() {
147
- this.elementRef.nativeElement.addEventListener('reset', () => {
148
- this.writedValue = 0.0;
149
110
  this.applyMask();
150
- });
151
- }
111
+ }
112
+ else if (event.key === 'ArrowLeft' || event.key === 'ArrowRight') {
113
+ this.putInputCaretOnTheEnd();
114
+ }
115
+ };
116
+ onKeyPress = (event) => {
117
+ event.preventDefault();
118
+ };
119
+ onKeyDown = (event) => {
120
+ if (event.key === 'Backspace') {
121
+ event.preventDefault();
122
+ }
123
+ };
124
+ onPaste = (event) => {
125
+ event.preventDefault();
126
+ if (!event.clipboardData) {
127
+ return;
128
+ }
129
+ const pastedValue = event.clipboardData.getData('Text');
130
+ let unmaskedValue = parseFloat(pastedValue);
131
+ if (pastedValue.includes(',')) {
132
+ unmaskedValue = this.unmaskCoin(event.clipboardData.getData('Text'));
133
+ }
134
+ this.setValue(this.maskCoin(unmaskedValue));
135
+ };
136
+ onReset = () => {
137
+ this.writedValue = 0.0;
138
+ this.applyMask();
139
+ };
140
+ onChange = () => {
141
+ this.writedValue = this.unmaskCoin(this.currentValue);
142
+ this.applyMask();
143
+ };
152
144
  putInputCaretOnTheEnd() {
153
145
  setTimeout(() => this.input.setSelectionRange(this.currentValue.length, this.currentValue.length));
154
146
  }
@@ -169,15 +161,26 @@ class InputCurrencyMask {
169
161
  this.writedValue = parseFloat(`${currentValue}${key}`) / +`1${decimal}`;
170
162
  this.currencyValue.emit(this.writedValue);
171
163
  }
164
+ ngOnDestroy() {
165
+ const inputElement = this.elementRef.nativeElement;
166
+ inputElement.removeEventListener('focus', this.onFocus);
167
+ inputElement.removeEventListener('keyup', this.onKeyUp);
168
+ inputElement.removeEventListener('keypress', this.onKeyPress);
169
+ inputElement.removeEventListener('keydown', this.onKeyDown);
170
+ inputElement.removeEventListener('paste', this.onPaste);
171
+ inputElement.removeEventListener('reset', this.onReset);
172
+ }
172
173
  ngOnInit() {
173
174
  this.writedValue = this.unmaskCoin(this.currentValue);
174
175
  this.input.style.textAlign = 'right';
175
- this.onFocus();
176
- this.onKeyUp();
177
- this.onKeyPress();
178
- this.onKeyDown();
179
- this.onPaste();
180
- this.onReset();
176
+ const inputElement = this.elementRef.nativeElement;
177
+ inputElement.addEventListener('focus', this.onFocus);
178
+ inputElement.addEventListener('keyup', this.onKeyUp);
179
+ inputElement.addEventListener('keypress', this.onKeyPress);
180
+ inputElement.addEventListener('keydown', this.onKeyDown);
181
+ inputElement.addEventListener('paste', this.onPaste);
182
+ inputElement.addEventListener('reset', this.onReset);
183
+ inputElement.onchange = this.onChange;
181
184
  setTimeout(() => this.applyMask());
182
185
  }
183
186
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: InputCurrencyMask, deps: [], target: i0.ɵɵFactoryTarget.Directive });
@@ -1 +1 @@
1
- {"version":3,"file":"koalarx-ui-shared-directives.mjs","sources":["../../projects/koala-ui/shared/directives/hook-change.ts","../../projects/koala-ui/shared/directives/input-mask.ts","../../projects/koala-ui/shared/directives/input-currency-mask.ts","../../projects/koala-ui/shared/directives/tooltip.ts","../../projects/koala-ui/shared/directives/button.ts","../../projects/koala-ui/shared/directives/koalarx-ui-shared-directives.ts"],"sourcesContent":["import {\n Directive,\n effect,\n inject,\n input,\n ViewContainerRef,\n} from '@angular/core';\n\n@Directive({ selector: '[hookChange]' })\nexport class HookChange {\n private readonly viewContainerRef = inject(ViewContainerRef);\n\n hookChange = input.required<any>();\n\n constructor() {\n effect(() => {\n this.hookChange();\n const onChange = this.viewContainerRef.element.nativeElement.onchange;\n\n if (onChange) {\n onChange();\n }\n });\n }\n}\n","import { Directive, effect, ElementRef, inject, input } from '@angular/core';\nimport { NgxMaskPipe } from 'ngx-mask';\n\n@Directive({ selector: 'input[mask]', providers: [NgxMaskPipe] })\nexport class InputMask {\n private readonly ngxMask = inject(NgxMaskPipe);\n private readonly elementRef = inject<ElementRef<HTMLInputElement>>(\n ElementRef<HTMLInputElement>\n );\n\n private get currentValue() {\n return this.input.value;\n }\n\n private get input() {\n return this.elementRef.nativeElement;\n }\n\n mask = input.required<string>();\n\n constructor() {\n effect(() => {\n const mask = this.mask();\n\n if (mask) {\n this.elementRef.nativeElement.addEventListener('keyup', () =>\n this.applyMask(mask)\n );\n this.elementRef.nativeElement.addEventListener('keypress', () =>\n this.applyMask(mask)\n );\n this.elementRef.nativeElement.addEventListener('keydown', () =>\n this.applyMask(mask)\n );\n\n setTimeout(() => this.applyMask(mask), 1);\n }\n });\n }\n\n private applyMask(mask: string) {\n this.setValue(this.ngxMask.transform(this.currentValue, mask));\n }\n\n private setValue(value: string) {\n this.input.value = value;\n }\n}\n","import {\n Directive,\n ElementRef,\n inject,\n input,\n OnInit,\n output,\n} from '@angular/core';\nimport { AppConfig } from '@koalarx/ui/core/config';\nimport { KlNumber } from '@koalarx/utils/KlNumber';\nimport { unmaskCoin } from '@koalarx/utils/KlString';\nimport { NgxMaskPipe } from 'ngx-mask';\n\n@Directive({\n selector: 'input[currencyMask]',\n providers: [NgxMaskPipe],\n})\nexport class InputCurrencyMask implements OnInit {\n private readonly elementRef = inject<ElementRef<HTMLInputElement>>(\n ElementRef<HTMLInputElement>,\n );\n private readonly appConfig = inject(AppConfig);\n private writedValue = 0.0;\n\n decimalCount = input<number>(2);\n currencyValue = output<number>();\n\n private maskCoin(value: number) {\n let prefix = '$';\n let thousandSeparator = ',';\n let decimalSeparator = '.';\n\n switch (this.appConfig.language) {\n case 'en':\n prefix = '$';\n break;\n case 'ptBr':\n thousandSeparator = '.';\n decimalSeparator = ',';\n prefix = 'R$';\n break;\n }\n\n return new KlNumber(value).maskCoin(\n prefix,\n thousandSeparator,\n decimalSeparator,\n this.decimalCount(),\n );\n }\n\n private unmaskCoin(value: string): number {\n return unmaskCoin(value, this.decimalCount());\n }\n\n private applyMask() {\n this.setValue(this.maskCoin(this.writedValue));\n }\n\n private get currentValue() {\n return this.input.value;\n }\n\n private setValue(value: string) {\n this.input.value = value;\n }\n\n private get input() {\n return this.elementRef.nativeElement;\n }\n\n private onFocus() {\n this.elementRef.nativeElement.addEventListener('focus', () => {\n this.putInputCaretOnTheEnd();\n });\n }\n\n private onKeyUp() {\n this.elementRef.nativeElement.addEventListener('keyup', (event) => {\n if (/\\d/.test(event.key) || event.key === 'Backspace') {\n this.updateWritedValue(event.key, event.key === 'Backspace');\n\n if (isNaN(this.writedValue)) {\n this.writedValue = 0;\n }\n\n this.applyMask();\n } else if (event.key === 'ArrowLeft' || event.key === 'ArrowRight') {\n this.putInputCaretOnTheEnd();\n }\n });\n }\n\n private onKeyPress() {\n this.elementRef.nativeElement.addEventListener('keypress', (event) => {\n event.preventDefault();\n });\n }\n\n private onKeyDown() {\n this.elementRef.nativeElement.addEventListener('keydown', (event) => {\n if (event.key === 'Backspace') {\n event.preventDefault();\n }\n });\n }\n\n private onPaste() {\n this.elementRef.nativeElement.addEventListener('paste', (event) => {\n event.preventDefault();\n\n if (!event.clipboardData) {\n return;\n }\n\n const pastedValue = event.clipboardData.getData('Text');\n\n let unmaskedValue = parseFloat(pastedValue);\n\n if (pastedValue.includes(',')) {\n unmaskedValue = this.unmaskCoin(event.clipboardData.getData('Text'));\n }\n\n this.setValue(this.maskCoin(unmaskedValue));\n });\n }\n\n private onReset() {\n this.elementRef.nativeElement.addEventListener('reset', () => {\n this.writedValue = 0.0;\n this.applyMask();\n });\n }\n\n private putInputCaretOnTheEnd() {\n setTimeout(() =>\n this.input.setSelectionRange(\n this.currentValue.length,\n this.currentValue.length,\n ),\n );\n }\n\n private updateWritedValue(key: string, backspace = false) {\n let decimal = '';\n\n for (let i = 0; i < this.decimalCount(); i++) {\n decimal += '0';\n }\n\n if (backspace) {\n const match = (this.writedValue / 10)\n .toString()\n .match(new RegExp(`^-?\\\\d+(?:\\\\.\\\\d{0,${this.decimalCount()}})?`));\n\n if (match) {\n this.writedValue = parseFloat(match[0]);\n }\n }\n\n const currentValue = Math.round(this.writedValue * +`1${decimal}`);\n\n this.writedValue = parseFloat(`${currentValue}${key}`) / +`1${decimal}`;\n this.currencyValue.emit(this.writedValue);\n }\n\n ngOnInit(): void {\n this.writedValue = this.unmaskCoin(this.currentValue);\n\n this.input.style.textAlign = 'right';\n\n this.onFocus();\n this.onKeyUp();\n this.onKeyPress();\n this.onKeyDown();\n this.onPaste();\n this.onReset();\n\n setTimeout(() => this.applyMask());\n }\n}\n","import { Directive, effect, ElementRef, inject, input } from '@angular/core';\n\ntype TooltipPosition = 'top' | 'bottom' | 'left' | 'right';\n\n@Directive({ selector: '[tooltip]' })\nexport class Tooltip {\n private readonly elementRef = inject<ElementRef<HTMLElement>>(\n ElementRef<HTMLElement>\n );\n\n tooltip = input.required<string>();\n tooltipPosition = input<TooltipPosition>('top');\n\n constructor() {\n effect(() => {\n const element = this.elementRef.nativeElement;\n const tooltipText = this.tooltip();\n\n element.classList.add('tooltip');\n element.dataset['tip'] = tooltipText;\n\n switch (this.tooltipPosition()) {\n case 'top':\n element.classList.add('tooltip-top');\n break;\n case 'bottom':\n element.classList.add('tooltip-bottom');\n break;\n case 'left':\n element.classList.add('tooltip-left');\n break;\n case 'right':\n element.classList.add('tooltip-right');\n break;\n }\n });\n }\n}\n","import {\n ApplicationRef,\n booleanAttribute,\n ComponentRef,\n createComponent,\n Directive,\n effect,\n ElementRef,\n EnvironmentInjector,\n inject,\n input,\n inputBinding,\n OnInit,\n} from '@angular/core';\nimport { Loader } from '@koalarx/ui/core/components/loader';\n\nexport type ButtonColor =\n | 'neutral'\n | 'primary'\n | 'secondary'\n | 'accent'\n | 'info'\n | 'success'\n | 'warning'\n | 'error'\n | 'ghost';\n\nexport type ButtonSize =\n | 'extraSmall'\n | 'small'\n | 'medium'\n | 'large'\n | 'extraLarge';\n\n@Directive({ selector: 'button[klButton], a[klButton]' })\nexport class Button implements OnInit {\n private readonly elementRef = inject<ElementRef<HTMLButtonElement>>(\n ElementRef<HTMLButtonElement>\n );\n private readonly appRef = inject(ApplicationRef);\n private readonly injector = inject(EnvironmentInjector);\n private loaderComponent: ComponentRef<Loader> | null = null;\n\n color = input<ButtonColor>('neutral');\n type = input<'button' | 'submit'>('button');\n circle = input(false, { transform: booleanAttribute });\n outline = input(false, { transform: booleanAttribute });\n soft = input(false, { transform: booleanAttribute });\n showLoader = input(false, { transform: booleanAttribute });\n disabled = input(false, { transform: booleanAttribute });\n size = input<ButtonSize>('medium');\n\n constructor() {\n effect(() => this.toggleLoader(this.showLoader()));\n effect(() => {\n const disabled = this.disabled();\n this.elementRef.nativeElement.disabled = disabled;\n });\n }\n\n private createLoaderComponent() {\n const spanContainer = this.elementRef.nativeElement.insertBefore(\n document.createElement('span'),\n this.elementRef.nativeElement.firstChild\n );\n spanContainer.classList.add(\n 'flex',\n 'items-center',\n 'justify-center',\n 'h-full'\n );\n this.loaderComponent = createComponent(Loader, {\n environmentInjector: this.injector,\n hostElement: spanContainer,\n bindings: [inputBinding('size', () => this.size())],\n });\n\n return this.loaderComponent;\n }\n\n private toggleLoader(show: boolean) {\n if (show) {\n const loaderComponent = this.createLoaderComponent();\n\n this.elementRef.nativeElement.disabled = true;\n this.appRef.attachView(loaderComponent.hostView);\n } else {\n if (!this.disabled()) {\n this.elementRef.nativeElement.disabled = false;\n }\n\n if (this.loaderComponent) {\n this.appRef.detachView(this.loaderComponent.hostView);\n this.loaderComponent.destroy();\n this.loaderComponent = null;\n }\n }\n }\n\n private getColorClass(color: ButtonColor): string {\n switch (color) {\n case 'neutral':\n return 'btn-neutral';\n case 'primary':\n return 'btn-primary';\n case 'secondary':\n return 'btn-secondary';\n case 'accent':\n return 'btn-accent';\n case 'info':\n return 'btn-info';\n case 'success':\n return 'btn-success';\n case 'warning':\n return 'btn-warning';\n case 'error':\n return 'btn-error';\n case 'ghost':\n return 'btn-ghost';\n default:\n throw new Error(`Unknown button color: ${color}`);\n }\n }\n\n private getSizeClass(size: ButtonSize): string {\n switch (size) {\n case 'extraSmall':\n return 'btn-xs';\n case 'small':\n return 'btn-sm';\n case 'medium':\n return 'btn-md';\n case 'large':\n return 'btn-lg';\n case 'extraLarge':\n return 'btn-xl';\n default:\n throw new Error(`Unknown button size: ${size}`);\n }\n }\n\n ngOnInit(): void {\n this.elementRef.nativeElement.type = this.type();\n this.elementRef.nativeElement.classList.add('btn');\n this.elementRef.nativeElement.classList.add(\n this.getColorClass(this.color())\n );\n this.elementRef.nativeElement.classList.add(this.getSizeClass(this.size()));\n\n if (this.outline()) {\n this.elementRef.nativeElement.classList.add('btn-outline');\n }\n\n if (this.circle()) {\n this.elementRef.nativeElement.classList.add('btn-circle');\n }\n\n if (this.soft()) {\n this.elementRef.nativeElement.classList.add('btn-soft');\n }\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"koalarx-ui-shared-directives.mjs","sources":["../../projects/koala-ui/shared/directives/hook-change.ts","../../projects/koala-ui/shared/directives/input-mask.ts","../../projects/koala-ui/shared/directives/input-currency-mask.ts","../../projects/koala-ui/shared/directives/tooltip.ts","../../projects/koala-ui/shared/directives/button.ts","../../projects/koala-ui/shared/directives/koalarx-ui-shared-directives.ts"],"sourcesContent":["import {\n Directive,\n effect,\n inject,\n input,\n ViewContainerRef,\n} from '@angular/core';\n\n@Directive({ selector: '[hookChange]' })\nexport class HookChange {\n private readonly viewContainerRef = inject(ViewContainerRef);\n\n hookChange = input.required<any>();\n\n constructor() {\n effect(() => {\n this.hookChange();\n const onChange = this.viewContainerRef.element.nativeElement.onchange;\n\n if (onChange) {\n onChange();\n }\n });\n }\n}\n","import { Directive, effect, ElementRef, inject, input } from '@angular/core';\nimport { NgxMaskPipe } from 'ngx-mask';\n\n@Directive({ selector: 'input[mask]', providers: [NgxMaskPipe] })\nexport class InputMask {\n private readonly ngxMask = inject(NgxMaskPipe);\n private readonly elementRef = inject<ElementRef<HTMLInputElement>>(\n ElementRef<HTMLInputElement>\n );\n\n private get currentValue() {\n return this.input.value;\n }\n\n private get input() {\n return this.elementRef.nativeElement;\n }\n\n mask = input.required<string>();\n\n constructor() {\n effect(() => {\n const mask = this.mask();\n\n if (mask) {\n this.elementRef.nativeElement.addEventListener('keyup', () =>\n this.applyMask(mask)\n );\n this.elementRef.nativeElement.addEventListener('keypress', () =>\n this.applyMask(mask)\n );\n this.elementRef.nativeElement.addEventListener('keydown', () =>\n this.applyMask(mask)\n );\n\n setTimeout(() => this.applyMask(mask), 1);\n }\n });\n }\n\n private applyMask(mask: string) {\n this.setValue(this.ngxMask.transform(this.currentValue, mask));\n }\n\n private setValue(value: string) {\n this.input.value = value;\n }\n}\n","import {\n Directive,\n ElementRef,\n inject,\n input,\n OnDestroy,\n OnInit,\n output,\n} from '@angular/core';\nimport { AppConfig } from '@koalarx/ui/core/config';\nimport { KlNumber } from '@koalarx/utils/KlNumber';\nimport { unmaskCoin } from '@koalarx/utils/KlString';\nimport { NgxMaskPipe } from 'ngx-mask';\n\n@Directive({\n selector: 'input[currencyMask]',\n providers: [NgxMaskPipe],\n})\nexport class InputCurrencyMask implements OnInit, OnDestroy {\n private readonly elementRef = inject<ElementRef<HTMLInputElement>>(\n ElementRef<HTMLInputElement>,\n );\n private readonly appConfig = inject(AppConfig);\n private writedValue = 0.0;\n\n decimalCount = input<number>(2);\n currencyValue = output<number>();\n\n private maskCoin(value: number) {\n let prefix = '$';\n let thousandSeparator = ',';\n let decimalSeparator = '.';\n\n switch (this.appConfig.language) {\n case 'en':\n prefix = '$';\n break;\n case 'ptBr':\n thousandSeparator = '.';\n decimalSeparator = ',';\n prefix = 'R$';\n break;\n }\n\n return new KlNumber(value).maskCoin(\n prefix,\n thousandSeparator,\n decimalSeparator,\n this.decimalCount(),\n );\n }\n\n private unmaskCoin(value: string): number {\n return unmaskCoin(value, this.decimalCount());\n }\n\n private applyMask() {\n this.setValue(this.maskCoin(this.writedValue));\n }\n\n private get currentValue() {\n return this.input.value;\n }\n\n private setValue(value: string) {\n this.input.value = value;\n }\n\n private get input() {\n return this.elementRef.nativeElement;\n }\n\n private onFocus = () => {\n this.putInputCaretOnTheEnd();\n };\n\n private onKeyUp = (event: KeyboardEvent) => {\n if (/\\d/.test(event.key) || event.key === 'Backspace') {\n this.updateWritedValue(event.key, event.key === 'Backspace');\n\n if (isNaN(this.writedValue)) {\n this.writedValue = 0;\n }\n\n this.applyMask();\n } else if (event.key === 'ArrowLeft' || event.key === 'ArrowRight') {\n this.putInputCaretOnTheEnd();\n }\n };\n\n private onKeyPress = (event: KeyboardEvent) => {\n event.preventDefault();\n };\n\n private onKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Backspace') {\n event.preventDefault();\n }\n };\n\n private onPaste = (event: ClipboardEvent) => {\n event.preventDefault();\n\n if (!event.clipboardData) {\n return;\n }\n\n const pastedValue = event.clipboardData.getData('Text');\n\n let unmaskedValue = parseFloat(pastedValue);\n\n if (pastedValue.includes(',')) {\n unmaskedValue = this.unmaskCoin(event.clipboardData.getData('Text'));\n }\n\n this.setValue(this.maskCoin(unmaskedValue));\n };\n\n private onReset = () => {\n this.writedValue = 0.0;\n this.applyMask();\n };\n\n private onChange = () => {\n this.writedValue = this.unmaskCoin(this.currentValue);\n this.applyMask();\n };\n\n private putInputCaretOnTheEnd() {\n setTimeout(() =>\n this.input.setSelectionRange(\n this.currentValue.length,\n this.currentValue.length,\n ),\n );\n }\n\n private updateWritedValue(key: string, backspace = false) {\n let decimal = '';\n\n for (let i = 0; i < this.decimalCount(); i++) {\n decimal += '0';\n }\n\n if (backspace) {\n const match = (this.writedValue / 10)\n .toString()\n .match(new RegExp(`^-?\\\\d+(?:\\\\.\\\\d{0,${this.decimalCount()}})?`));\n\n if (match) {\n this.writedValue = parseFloat(match[0]);\n }\n }\n\n const currentValue = Math.round(this.writedValue * +`1${decimal}`);\n\n this.writedValue = parseFloat(`${currentValue}${key}`) / +`1${decimal}`;\n this.currencyValue.emit(this.writedValue);\n }\n\n ngOnDestroy(): void {\n const inputElement = this.elementRef.nativeElement;\n\n inputElement.removeEventListener('focus', this.onFocus);\n inputElement.removeEventListener('keyup', this.onKeyUp);\n inputElement.removeEventListener('keypress', this.onKeyPress);\n inputElement.removeEventListener('keydown', this.onKeyDown);\n inputElement.removeEventListener('paste', this.onPaste);\n inputElement.removeEventListener('reset', this.onReset);\n }\n\n ngOnInit(): void {\n this.writedValue = this.unmaskCoin(this.currentValue);\n\n this.input.style.textAlign = 'right';\n\n const inputElement = this.elementRef.nativeElement;\n\n inputElement.addEventListener('focus', this.onFocus);\n inputElement.addEventListener('keyup', this.onKeyUp);\n inputElement.addEventListener('keypress', this.onKeyPress);\n inputElement.addEventListener('keydown', this.onKeyDown);\n inputElement.addEventListener('paste', this.onPaste);\n inputElement.addEventListener('reset', this.onReset);\n inputElement.onchange = this.onChange;\n\n setTimeout(() => this.applyMask());\n }\n}\n","import { Directive, effect, ElementRef, inject, input } from '@angular/core';\n\ntype TooltipPosition = 'top' | 'bottom' | 'left' | 'right';\n\n@Directive({ selector: '[tooltip]' })\nexport class Tooltip {\n private readonly elementRef = inject<ElementRef<HTMLElement>>(\n ElementRef<HTMLElement>\n );\n\n tooltip = input.required<string>();\n tooltipPosition = input<TooltipPosition>('top');\n\n constructor() {\n effect(() => {\n const element = this.elementRef.nativeElement;\n const tooltipText = this.tooltip();\n\n element.classList.add('tooltip');\n element.dataset['tip'] = tooltipText;\n\n switch (this.tooltipPosition()) {\n case 'top':\n element.classList.add('tooltip-top');\n break;\n case 'bottom':\n element.classList.add('tooltip-bottom');\n break;\n case 'left':\n element.classList.add('tooltip-left');\n break;\n case 'right':\n element.classList.add('tooltip-right');\n break;\n }\n });\n }\n}\n","import {\n ApplicationRef,\n booleanAttribute,\n ComponentRef,\n createComponent,\n Directive,\n effect,\n ElementRef,\n EnvironmentInjector,\n inject,\n input,\n inputBinding,\n OnInit,\n} from '@angular/core';\nimport { Loader } from '@koalarx/ui/core/components/loader';\n\nexport type ButtonColor =\n | 'neutral'\n | 'primary'\n | 'secondary'\n | 'accent'\n | 'info'\n | 'success'\n | 'warning'\n | 'error'\n | 'ghost';\n\nexport type ButtonSize =\n | 'extraSmall'\n | 'small'\n | 'medium'\n | 'large'\n | 'extraLarge';\n\n@Directive({ selector: 'button[klButton], a[klButton]' })\nexport class Button implements OnInit {\n private readonly elementRef = inject<ElementRef<HTMLButtonElement>>(\n ElementRef<HTMLButtonElement>\n );\n private readonly appRef = inject(ApplicationRef);\n private readonly injector = inject(EnvironmentInjector);\n private loaderComponent: ComponentRef<Loader> | null = null;\n\n color = input<ButtonColor>('neutral');\n type = input<'button' | 'submit'>('button');\n circle = input(false, { transform: booleanAttribute });\n outline = input(false, { transform: booleanAttribute });\n soft = input(false, { transform: booleanAttribute });\n showLoader = input(false, { transform: booleanAttribute });\n disabled = input(false, { transform: booleanAttribute });\n size = input<ButtonSize>('medium');\n\n constructor() {\n effect(() => this.toggleLoader(this.showLoader()));\n effect(() => {\n const disabled = this.disabled();\n this.elementRef.nativeElement.disabled = disabled;\n });\n }\n\n private createLoaderComponent() {\n const spanContainer = this.elementRef.nativeElement.insertBefore(\n document.createElement('span'),\n this.elementRef.nativeElement.firstChild\n );\n spanContainer.classList.add(\n 'flex',\n 'items-center',\n 'justify-center',\n 'h-full'\n );\n this.loaderComponent = createComponent(Loader, {\n environmentInjector: this.injector,\n hostElement: spanContainer,\n bindings: [inputBinding('size', () => this.size())],\n });\n\n return this.loaderComponent;\n }\n\n private toggleLoader(show: boolean) {\n if (show) {\n const loaderComponent = this.createLoaderComponent();\n\n this.elementRef.nativeElement.disabled = true;\n this.appRef.attachView(loaderComponent.hostView);\n } else {\n if (!this.disabled()) {\n this.elementRef.nativeElement.disabled = false;\n }\n\n if (this.loaderComponent) {\n this.appRef.detachView(this.loaderComponent.hostView);\n this.loaderComponent.destroy();\n this.loaderComponent = null;\n }\n }\n }\n\n private getColorClass(color: ButtonColor): string {\n switch (color) {\n case 'neutral':\n return 'btn-neutral';\n case 'primary':\n return 'btn-primary';\n case 'secondary':\n return 'btn-secondary';\n case 'accent':\n return 'btn-accent';\n case 'info':\n return 'btn-info';\n case 'success':\n return 'btn-success';\n case 'warning':\n return 'btn-warning';\n case 'error':\n return 'btn-error';\n case 'ghost':\n return 'btn-ghost';\n default:\n throw new Error(`Unknown button color: ${color}`);\n }\n }\n\n private getSizeClass(size: ButtonSize): string {\n switch (size) {\n case 'extraSmall':\n return 'btn-xs';\n case 'small':\n return 'btn-sm';\n case 'medium':\n return 'btn-md';\n case 'large':\n return 'btn-lg';\n case 'extraLarge':\n return 'btn-xl';\n default:\n throw new Error(`Unknown button size: ${size}`);\n }\n }\n\n ngOnInit(): void {\n this.elementRef.nativeElement.type = this.type();\n this.elementRef.nativeElement.classList.add('btn');\n this.elementRef.nativeElement.classList.add(\n this.getColorClass(this.color())\n );\n this.elementRef.nativeElement.classList.add(this.getSizeClass(this.size()));\n\n if (this.outline()) {\n this.elementRef.nativeElement.classList.add('btn-outline');\n }\n\n if (this.circle()) {\n this.elementRef.nativeElement.classList.add('btn-circle');\n }\n\n if (this.soft()) {\n this.elementRef.nativeElement.classList.add('btn-soft');\n }\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@koalarx/ui",
3
- "version": "21.1.6",
3
+ "version": "21.1.8",
4
4
  "peerDependencies": {
5
5
  "@angular/common": ">=21.0.0",
6
6
  "@angular/core": ">=21.0.0"
package/theme/form.css CHANGED
@@ -36,14 +36,14 @@ button:focus {
36
36
  display: flex;
37
37
  align-items: center;
38
38
  gap: 0.5rem;
39
- padding: 0.2rem 0 0.5rem;
40
- color: var(--color-neutral-500);
41
- font-size: var(--text-sm);
42
- text-transform: uppercase;
39
+ opacity: 0.5;
40
+ padding: 0.3rem 0 0.5rem;
41
+ color: var(--color-neutral-700);
42
+ font-size: var(--text-xs);
43
43
  }
44
44
 
45
45
  .dark .hint-content {
46
- color: var(--color-neutral-700);
46
+ color: var(--color-neutral-200);
47
47
  }
48
48
 
49
49
  kl-select .kl-select-container {
@@ -1,6 +1,6 @@
1
1
  import * as _koalarx_ui_shared_components_input_field_select from '@koalarx/ui/shared/components/input-field/select';
2
2
  import * as _angular_core from '@angular/core';
3
- import { ResourceRef, Signal, OnInit, ApplicationRef, DestroyRef, Injector, ElementRef } from '@angular/core';
3
+ import { ResourceRef, Signal, OnInit, ApplicationRef, Injector, ElementRef } from '@angular/core';
4
4
  import { InputFieldBase } from '@koalarx/ui/shared/components/input-field';
5
5
 
6
6
  interface SelectDataOptionsFnParams {
@@ -27,7 +27,6 @@ interface OptionsResource {
27
27
 
28
28
  declare class Select extends InputFieldBase implements OnInit {
29
29
  readonly appRef: ApplicationRef;
30
- readonly destroyRef: DestroyRef;
31
30
  readonly injector: Injector;
32
31
  readonly selectField: _angular_core.Signal<ElementRef<HTMLDivElement> | undefined>;
33
32
  readonly optionsResource: _angular_core.WritableSignal<OptionsResource | null>;
@@ -1,12 +1,15 @@
1
1
  import * as _angular_core from '@angular/core';
2
+ import { DestroyRef } from '@angular/core';
2
3
  import { FormControl } from '@angular/forms';
3
4
 
4
5
  declare abstract class InputFieldBase {
5
6
  private readonly elementRef;
6
7
  private readonly required;
8
+ readonly destroyRef: DestroyRef;
7
9
  readonly isDisabled: _angular_core.WritableSignal<boolean>;
8
10
  readonly isRequired: _angular_core.Signal<boolean>;
9
11
  readonly fieldId: string;
12
+ readonly valueChange: _angular_core.WritableSignal<any>;
10
13
  control: _angular_core.InputSignal<FormControl<any>>;
11
14
  label: _angular_core.InputSignal<string | undefined>;
12
15
  placeholder: _angular_core.InputSignal<string>;
@@ -1,5 +1,5 @@
1
1
  import * as _angular_core from '@angular/core';
2
- import { OnInit } from '@angular/core';
2
+ import { OnInit, OnDestroy } from '@angular/core';
3
3
 
4
4
  declare class HookChange {
5
5
  private readonly viewContainerRef;
@@ -22,7 +22,7 @@ declare class InputMask {
22
22
  static ɵdir: _angular_core.ɵɵDirectiveDeclaration<InputMask, "input[mask]", never, { "mask": { "alias": "mask"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
23
23
  }
24
24
 
25
- declare class InputCurrencyMask implements OnInit {
25
+ declare class InputCurrencyMask implements OnInit, OnDestroy {
26
26
  private readonly elementRef;
27
27
  private readonly appConfig;
28
28
  private writedValue;
@@ -40,8 +40,10 @@ declare class InputCurrencyMask implements OnInit {
40
40
  private onKeyDown;
41
41
  private onPaste;
42
42
  private onReset;
43
+ private onChange;
43
44
  private putInputCaretOnTheEnd;
44
45
  private updateWritedValue;
46
+ ngOnDestroy(): void;
45
47
  ngOnInit(): void;
46
48
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<InputCurrencyMask, never>;
47
49
  static ɵdir: _angular_core.ɵɵDirectiveDeclaration<InputCurrencyMask, "input[currencyMask]", never, { "decimalCount": { "alias": "decimalCount"; "required": false; "isSignal": true; }; }, { "currencyValue": "currencyValue"; }, never, never, true, never>;