@sd-angular/core 19.0.0-beta.4 → 19.0.0-beta.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/components/document-builder/src/document-builder.component.d.ts +7 -6
- package/components/document-builder/src/document-builder.model.d.ts +1 -0
- package/components/document-builder/src/plugins/heading/heading.plugin.d.ts +4 -0
- package/components/document-builder/src/plugins/{image-upload.plugin.d.ts → image-upload/image-upload.plugin.d.ts} +0 -4
- package/components/document-builder/src/plugins/index.d.ts +6 -5
- package/components/table/src/models/table-item.model.d.ts +2 -1
- package/fesm2022/sd-angular-core-components-document-builder.mjs +240 -333
- package/fesm2022/sd-angular-core-components-document-builder.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-table.mjs +135 -69
- package/fesm2022/sd-angular-core-components-table.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-workflow.mjs +3 -3
- package/fesm2022/sd-angular-core-components-workflow.mjs.map +1 -1
- package/fesm2022/sd-angular-core-forms-autocomplete.mjs +4 -2
- package/fesm2022/sd-angular-core-forms-autocomplete.mjs.map +1 -1
- package/fesm2022/sd-angular-core-forms-date.mjs +4 -2
- package/fesm2022/sd-angular-core-forms-date.mjs.map +1 -1
- package/fesm2022/sd-angular-core-forms-datetime.mjs +17 -3
- package/fesm2022/sd-angular-core-forms-datetime.mjs.map +1 -1
- package/fesm2022/sd-angular-core-forms-input-number.mjs +4 -3
- package/fesm2022/sd-angular-core-forms-input-number.mjs.map +1 -1
- package/fesm2022/sd-angular-core-forms-input.mjs +4 -2
- package/fesm2022/sd-angular-core-forms-input.mjs.map +1 -1
- package/fesm2022/sd-angular-core-forms-radio.mjs +4 -2
- package/fesm2022/sd-angular-core-forms-radio.mjs.map +1 -1
- package/fesm2022/sd-angular-core-forms-select.mjs +4 -2
- package/fesm2022/sd-angular-core-forms-select.mjs.map +1 -1
- package/fesm2022/sd-angular-core-forms-textarea.mjs +14 -2
- package/fesm2022/sd-angular-core-forms-textarea.mjs.map +1 -1
- package/fesm2022/sd-angular-core-pipes.mjs +21 -1
- package/fesm2022/sd-angular-core-pipes.mjs.map +1 -1
- package/forms/datetime/src/datetime.component.d.ts +4 -1
- package/package.json +71 -71
- package/pipes/index.d.ts +1 -0
- package/pipes/src/empty.pipe.d.ts +7 -0
- /package/components/document-builder/src/plugins/{comment.plugin.d.ts → comment/comment.plugin.d.ts} +0 -0
- /package/components/document-builder/src/plugins/{page-orientation.plugin.d.ts → page-orientation/page-orientation.plugin.d.ts} +0 -0
- /package/components/document-builder/src/plugins/{table-fit.plugin.d.ts → table-fit/table-fit.plugin.d.ts} +0 -0
- /package/components/document-builder/src/plugins/{variable.plugin.d.ts → variable/variable.plugin.d.ts} +0 -0
|
@@ -422,7 +422,7 @@ class ExternalFilterComponent {
|
|
|
422
422
|
});
|
|
423
423
|
};
|
|
424
424
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: ExternalFilterComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
425
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.17", type: ExternalFilterComponent, isStandalone: true, selector: "external-filter", inputs: { _autoId: ["autoId", "_autoId"], _filter: ["filter", "_filter"], _externalFilters: ["externalFilters", "_externalFilters"], _filterRegister: ["filterRegister", "_filterRegister"] }, ngImport: i0, template: "@if (!filter?.disabled) {\r\n @if (!isMobileOrTablet && externalFilters.length) {\r\n <sd-section [hideHeader]=\"filter?.hideExternalFilterToolbar\" icon=\"filter_alt\" iconColor=\"secondary\" title=\"B\u1ED9 l\u1ECDc\" collapsable>\r\n <div class=\"d-flex mr-4\" sdHeaderRight>\r\n <sd-button\r\n [autoId]=\"autoId + 'clearFilter'\"\r\n [disabled]=\"!filtered\"\r\n type=\"link\"\r\n prefixIcon=\"cleaning_services\"\r\n tooltip=\"X\u00F3a l\u1EF1a ch\u1ECDn\"\r\n (click)=\"$event.stopPropagation(); clearFilter($event)\"></sd-button>\r\n <sd-button\r\n [autoId]=\"autoId + 'setting'\"\r\n type=\"link\"\r\n prefixIcon=\"settings\"\r\n tooltip=\"T\u00F9y ch\u1EC9nh\"\r\n [matMenuTriggerFor]=\"menu\"\r\n (click)=\"$event.stopPropagation()\"></sd-button>\r\n <mat-menu #menu=\"matMenu\" class=\"sd-custom-panel-filter-configuration\">\r\n @for (externalFilter of externalFilters; track externalFilter.field) {\r\n <button mat-menu-item (click)=\"onCheckboxChange($event, externalFilter)\" [disabled]=\"externalFilter.required\">\r\n <sd-checkbox\r\n [label]=\"externalFilter.title\"\r\n [model]=\"inlineExternal[externalFilter.field]\"\r\n [disabled]=\"externalFilter.required\" />\r\n </button>\r\n }\r\n </mat-menu>\r\n </div>\r\n <div class=\"row mx-0\" style=\"row-gap: 16px\">\r\n @for (item of externalFilters; track item.field) {\r\n @if (inlineExternal[item.field]) {\r\n <div class=\"col-md-3 col-sm-6 px-8\" [class.col-lg-2]=\"col === 2\" [class.col-lg-3]=\"col === 3\">\r\n @if (item.type === 'string') {\r\n <sd-input\r\n [autoId]=\"autoId + item.field\"\r\n [label]=\"item.title\"\r\n type=\"text\"\r\n [(model)]=\"externalFilter![item.field]\"\r\n (keyupEnter)=\"onKeyupEnter()\"\r\n appearance=\"outline\"\r\n [form]=\"form\"\r\n [required]=\"item.required\"\r\n hideInlineError>\r\n </sd-input>\r\n } @else if (item.type === 'number') {\r\n <sd-input-number\r\n [autoId]=\"autoId + item.field\"\r\n [label]=\"item.title\"\r\n [(model)]=\"externalFilter![item.field]\"\r\n (keyupEnter)=\"onKeyupEnter()\"\r\n appearance=\"outline\"\r\n [form]=\"form\"\r\n [required]=\"item.required\"\r\n hideInlineError>\r\n </sd-input-number>\r\n } @else if (item.type === 'boolean') {\r\n <sd-select\r\n [autoId]=\"autoId + item.field\"\r\n [label]=\"item.title\"\r\n [items]=\"[\r\n { value: true, display: item.option?.displayOnTrue || 'True' },\r\n { value: false, display: item.option?.displayOnFalse || 'False' }\r\n ]\"\r\n valueField=\"value\"\r\n displayField=\"display\"\r\n [(model)]=\"externalFilter![item.field]\"\r\n (sdChange)=\"onFilter()\"\r\n appearance=\"outline\"\r\n [form]=\"form\"\r\n [required]=\"item.required\"\r\n hideInlineError>\r\n </sd-select>\r\n } @else if (item.type === 'date') {\r\n <sd-date\r\n [autoId]=\"autoId + item.field\"\r\n [label]=\"item.title\"\r\n [(model)]=\"externalFilter![item.field]\"\r\n (sdChange)=\"onFilter()\"\r\n appearance=\"outline\"\r\n [form]=\"form\"\r\n [required]=\"item.required\"\r\n [min]=\"item.minDate\"\r\n [max]=\"item.maxDate\"\r\n hideInlineError>\r\n </sd-date>\r\n } @else if (item.type === 'datetime') {\r\n <sd-datetime\r\n [autoId]=\"autoId + item.field\"\r\n [label]=\"item.title\"\r\n [(model)]=\"externalFilter![item.field]\"\r\n (sdChange)=\"onFilter()\"\r\n appearance=\"outline\"\r\n [form]=\"form\"\r\n [required]=\"item.required\"\r\n [min]=\"item.minDate\"\r\n [max]=\"item.maxDate\"\r\n hideInlineError>\r\n </sd-datetime>\r\n } @else if (item.type === 'daterange') {\r\n <sd-date-range\r\n [autoId]=\"autoId + item.field\"\r\n [label]=\"item.title\"\r\n [(model)]=\"externalFilter![item.field]\"\r\n (sdChange)=\"onFilter()\"\r\n [form]=\"form\"\r\n [required]=\"item.required\"\r\n [min]=\"item.minDate\"\r\n [max]=\"item.maxDate\"\r\n appearance=\"outline\"\r\n hideInlineError>\r\n </sd-date-range>\r\n } @else if (item.type === 'values') {\r\n @if (item.option.selection === 'MULTIPLE') {\r\n <sd-select\r\n [autoId]=\"autoId + item.field\"\r\n [label]=\"item.title\"\r\n [items]=\"item.option.items | filterValues | async\"\r\n [valueField]=\"item.option.valueField\"\r\n [displayField]=\"item.option.displayField\"\r\n [(model)]=\"externalFilter![item.field]\"\r\n (sdChange)=\"onFilter()\"\r\n appearance=\"outline\"\r\n multiple\r\n [form]=\"form\"\r\n [required]=\"item.required\"\r\n hideInlineError>\r\n </sd-select>\r\n } @else if (item.option.selection === 'AUTOCOMPLETE') {\r\n <sd-select\r\n [autoId]=\"autoId + item.field\"\r\n [label]=\"item.title\"\r\n [items]=\"item.option.items | filterValues | async\"\r\n [valueField]=\"item.option.valueField\"\r\n [displayField]=\"item.option.displayField\"\r\n [(model)]=\"externalFilter![item.field]\"\r\n (sdChange)=\"onFilter()\"\r\n appearance=\"outline\"\r\n [form]=\"form\"\r\n [required]=\"item.required\"\r\n hideInlineError>\r\n </sd-select>\r\n } @else if (item.option.selection === 'MULTIPLEAUTOCOMPLETE') {\r\n <sd-select\r\n [autoId]=\"autoId + item.field\"\r\n [label]=\"item.title\"\r\n [items]=\"item.option.items | filterValues | async\"\r\n [valueField]=\"item.option.valueField\"\r\n [displayField]=\"item.option.displayField\"\r\n [(model)]=\"externalFilter![item.field]\"\r\n (sdChange)=\"onFilter()\"\r\n appearance=\"outline\"\r\n multiple\r\n [form]=\"form\"\r\n [required]=\"item.required\"\r\n hideInlineError>\r\n </sd-select>\r\n } @else {\r\n <sd-select\r\n [autoId]=\"autoId + item.field\"\r\n [label]=\"item.title\"\r\n [items]=\"item.option.items | filterValues | async\"\r\n [valueField]=\"item.option.valueField\"\r\n [displayField]=\"item.option.displayField\"\r\n [(model)]=\"externalFilter![item.field]\"\r\n (sdChange)=\"onFilter()\"\r\n appearance=\"outline\"\r\n [form]=\"form\"\r\n [required]=\"item.required\"\r\n hideInlineError>\r\n </sd-select>\r\n }\r\n } @else if (item.type === 'lazy-values') {\r\n @if (item.option.selection === 'MULTIPLE') {\r\n <sd-select\r\n [autoId]=\"autoId + item.field\"\r\n [label]=\"item.title\"\r\n [items]=\"item.option.items\"\r\n [valueField]=\"item.option.valueField\"\r\n [displayField]=\"item.option.displayField\"\r\n [(model)]=\"externalFilter![item.field]\"\r\n (sdChange)=\"onFilter()\"\r\n appearance=\"outline\"\r\n multiple\r\n [form]=\"form\"\r\n [required]=\"item.required\"\r\n hideInlineError>\r\n </sd-select>\r\n } @else {\r\n <sd-select\r\n [autoId]=\"autoId + item.field\"\r\n [label]=\"item.title\"\r\n [items]=\"item.option.items\"\r\n [valueField]=\"item.option.valueField\"\r\n [displayField]=\"item.option.displayField\"\r\n [(model)]=\"externalFilter![item.field]\"\r\n (sdChange)=\"onFilter()\"\r\n appearance=\"outline\"\r\n [form]=\"form\"\r\n [required]=\"item.required\"\r\n hideInlineError>\r\n </sd-select>\r\n }\r\n } @else if (item.type === 'custom' && item.filterDef) {\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n item.filterDef;\r\n context: { form: form, externalFilter: externalFilter, autoId: autoId + item.field }\r\n \"></ng-container>\r\n }\r\n </div>\r\n }\r\n }\r\n </div>\r\n @if (filter?.manualFilter) {\r\n <div class=\"d-flex justify-content-end mt-16 px-8\">\r\n <sd-button\r\n [autoId]=\"autoId + 'onSubmit'\"\r\n [disabled]=\"form.invalid\"\r\n type=\"fill\"\r\n color=\"primary\"\r\n title=\"T\u00ECm ki\u1EBFm\"\r\n prefixIcon=\"filter_alt\"\r\n (click)=\"onSubmit()\">\r\n </sd-button>\r\n </div>\r\n }\r\n </sd-section>\r\n }\r\n <!-- <sd-popup-filter [filterRegister]=\"filterRegister!\" [columns]=\"columns\" [externalFilters]=\"externalFilters\">\r\n </sd-popup-filter> -->\r\n}\r\n", styles: [":host{display:block;padding-left:0;padding-right:0}::ng-deep .sd-custom-panel-filter-configuration{width:240px;max-height:550px;overflow-y:auto}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i2.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i2.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i2.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: SdSection, selector: "sd-section", inputs: ["title", "subTitle", "icon", "iconColor", "collapsed", "collapsable", "hideHeader"] }, { kind: "component", type: SdInput, selector: "sd-input", inputs: ["autoId", "name", "appearance", "size", "form", "label", "helperText", "placeholder", "type", "hideInlineError", "blurOnEnter", "model", "required", "readonly", "minlength", "maxlength", "pattern", "patternErrorMessage", "validator", "inlineError", "disabled", "viewed", "hyperlink", "tooltip"], outputs: ["modelChange", "sdChange", "sdFocus", "sdBlur", "sdFocusForceBlur", "keyupEnter"] }, { kind: "component", type: SdInputNumber, selector: "sd-input-number", inputs: ["autoId", "name", "size", "form", "label", "helperText", "placeholder", "hideInlineError", "blurOnEnter", "model", "required", "type", "precision", "readonly", "min", "max", "validator", "inlineError", "disabled", "viewed", "hyperlink", "appearance"], outputs: ["modelChange", "sdChange", "sdFocus", "sdBlur", "sdFocusForceBlur", "keyupEnter"] }, { kind: "component", type: SdSelect, selector: "sd-select", inputs: ["autoId", "name", "appearance", "hideInlineError", "size", "form", "label", "helperText", "placeholder", "model", "items", "valueField", "displayField", "disabledField", "cacheChecksum", "required", "validator", "inlineError", "disabled", "viewed", "hyperlink", "multiple", "limit"], outputs: ["modelChange", "sdChange", "sdSelection"] }, { kind: "component", type: SdDate, selector: "sd-date", inputs: ["autoId", "name", "appearance", "hideInlineError", "min", "max", "size", "form", "disabled", "viewed", "hyperlink", "required", "inlineError", "label", "helperText", "placeholder", "minDate", "maxDate", "model"], outputs: ["sdChange", "sdFocus", "modelChange"] }, { kind: "component", type: SdDatetime, selector: "sd-datetime", inputs: ["autoId", "name", "appearance", "hideInlineError", "min", "max", "size", "form", "disabled", "required", "inlineError", "label", "helperText", "placeholder", "minDate", "maxDate", "model"], outputs: ["sdChange", "sdFocus", "modelChange"] }, { kind: "component", type: SdDateRange$1, selector: "sd-date-range", inputs: ["autoId", "name", "appearance", "size", "form", "disabled", "required", "label", "helperText", "hideInlineError", "min", "max", "model"], outputs: ["modelChange", "sdChange"] }, { kind: "component", type: SdButton, selector: "sd-button", inputs: ["autoId", "type", "color", "title", "width", "size", "tooltip", "prefixIcon", "suffixIcon", "fontSet", "disabled", "loading"], outputs: ["click"] }, { kind: "pipe", type: FilterValuesPipe, name: "filterValues" }, { kind: "component", type: SdCheckbox, selector: "sd-checkbox", inputs: ["autoId", "name", "form", "label", "color", "disabled", "model", "inlineError"], outputs: ["modelChange", "sdChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
425
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.17", type: ExternalFilterComponent, isStandalone: true, selector: "external-filter", inputs: { _autoId: ["autoId", "_autoId"], _filter: ["filter", "_filter"], _externalFilters: ["externalFilters", "_externalFilters"], _filterRegister: ["filterRegister", "_filterRegister"] }, ngImport: i0, template: "@if (!filter?.disabled) {\r\n @if (!isMobileOrTablet && externalFilters.length) {\r\n <sd-section [hideHeader]=\"filter?.hideExternalFilterToolbar\" icon=\"filter_alt\" iconColor=\"secondary\" title=\"B\u1ED9 l\u1ECDc\" collapsable>\r\n <div class=\"d-flex mr-4\" sdHeaderRight>\r\n <sd-button\r\n [autoId]=\"autoId + 'clearFilter'\"\r\n [disabled]=\"!filtered\"\r\n type=\"link\"\r\n prefixIcon=\"cleaning_services\"\r\n tooltip=\"X\u00F3a l\u1EF1a ch\u1ECDn\"\r\n (click)=\"$event.stopPropagation(); clearFilter($event)\"></sd-button>\r\n <sd-button\r\n [autoId]=\"autoId + 'setting'\"\r\n type=\"link\"\r\n prefixIcon=\"settings\"\r\n tooltip=\"T\u00F9y ch\u1EC9nh\"\r\n [matMenuTriggerFor]=\"menu\"\r\n (click)=\"$event.stopPropagation()\"></sd-button>\r\n <mat-menu #menu=\"matMenu\" class=\"sd-custom-panel-filter-configuration\">\r\n @for (externalFilter of externalFilters; track externalFilter.field) {\r\n <button mat-menu-item (click)=\"onCheckboxChange($event, externalFilter)\" [disabled]=\"externalFilter.required\">\r\n <sd-checkbox\r\n [label]=\"externalFilter.title\"\r\n [model]=\"inlineExternal[externalFilter.field]\"\r\n [disabled]=\"externalFilter.required\" />\r\n </button>\r\n }\r\n </mat-menu>\r\n </div>\r\n <div class=\"row mx-0\" style=\"row-gap: 16px\">\r\n @for (item of externalFilters; track item.field) {\r\n @if (inlineExternal[item.field]) {\r\n <div class=\"col-md-3 col-sm-6 px-8\" [class.col-lg-2]=\"col === 2\" [class.col-lg-3]=\"col === 3\">\r\n @if (item.type === 'string') {\r\n <sd-input\r\n [autoId]=\"autoId + item.field\"\r\n [label]=\"item.title\"\r\n type=\"text\"\r\n [(model)]=\"externalFilter![item.field]\"\r\n (keyupEnter)=\"onKeyupEnter()\"\r\n appearance=\"outline\"\r\n [form]=\"form\"\r\n [required]=\"item.required\"\r\n hideInlineError>\r\n </sd-input>\r\n } @else if (item.type === 'number') {\r\n <sd-input-number\r\n [autoId]=\"autoId + item.field\"\r\n [label]=\"item.title\"\r\n [(model)]=\"externalFilter![item.field]\"\r\n (keyupEnter)=\"onKeyupEnter()\"\r\n appearance=\"outline\"\r\n [form]=\"form\"\r\n [required]=\"item.required\"\r\n hideInlineError>\r\n </sd-input-number>\r\n } @else if (item.type === 'boolean') {\r\n <sd-select\r\n [autoId]=\"autoId + item.field\"\r\n [label]=\"item.title\"\r\n [items]=\"[\r\n { value: true, display: item.option?.displayOnTrue || 'True' },\r\n { value: false, display: item.option?.displayOnFalse || 'False' }\r\n ]\"\r\n valueField=\"value\"\r\n displayField=\"display\"\r\n [(model)]=\"externalFilter![item.field]\"\r\n (sdChange)=\"onFilter()\"\r\n appearance=\"outline\"\r\n [form]=\"form\"\r\n [required]=\"item.required\"\r\n hideInlineError>\r\n </sd-select>\r\n } @else if (item.type === 'date') {\r\n <sd-date\r\n [autoId]=\"autoId + item.field\"\r\n [label]=\"item.title\"\r\n [(model)]=\"externalFilter![item.field]\"\r\n (sdChange)=\"onFilter()\"\r\n appearance=\"outline\"\r\n [form]=\"form\"\r\n [required]=\"item.required\"\r\n [min]=\"item.minDate\"\r\n [max]=\"item.maxDate\"\r\n hideInlineError>\r\n </sd-date>\r\n } @else if (item.type === 'datetime') {\r\n <sd-datetime\r\n [autoId]=\"autoId + item.field\"\r\n [label]=\"item.title\"\r\n [(model)]=\"externalFilter![item.field]\"\r\n (sdChange)=\"onFilter()\"\r\n appearance=\"outline\"\r\n [form]=\"form\"\r\n [required]=\"item.required\"\r\n [min]=\"item.minDate\"\r\n [max]=\"item.maxDate\"\r\n hideInlineError>\r\n </sd-datetime>\r\n } @else if (item.type === 'daterange') {\r\n <sd-date-range\r\n [autoId]=\"autoId + item.field\"\r\n [label]=\"item.title\"\r\n [(model)]=\"externalFilter![item.field]\"\r\n (sdChange)=\"onFilter()\"\r\n [form]=\"form\"\r\n [required]=\"item.required\"\r\n [min]=\"item.minDate\"\r\n [max]=\"item.maxDate\"\r\n appearance=\"outline\"\r\n hideInlineError>\r\n </sd-date-range>\r\n } @else if (item.type === 'values') {\r\n @if (item.option.selection === 'MULTIPLE') {\r\n <sd-select\r\n [autoId]=\"autoId + item.field\"\r\n [label]=\"item.title\"\r\n [items]=\"item.option.items | filterValues | async\"\r\n [valueField]=\"item.option.valueField\"\r\n [displayField]=\"item.option.displayField\"\r\n [(model)]=\"externalFilter![item.field]\"\r\n (sdChange)=\"onFilter()\"\r\n appearance=\"outline\"\r\n multiple\r\n [form]=\"form\"\r\n [required]=\"item.required\"\r\n hideInlineError>\r\n </sd-select>\r\n } @else if (item.option.selection === 'AUTOCOMPLETE') {\r\n <sd-select\r\n [autoId]=\"autoId + item.field\"\r\n [label]=\"item.title\"\r\n [items]=\"item.option.items | filterValues | async\"\r\n [valueField]=\"item.option.valueField\"\r\n [displayField]=\"item.option.displayField\"\r\n [(model)]=\"externalFilter![item.field]\"\r\n (sdChange)=\"onFilter()\"\r\n appearance=\"outline\"\r\n [form]=\"form\"\r\n [required]=\"item.required\"\r\n hideInlineError>\r\n </sd-select>\r\n } @else if (item.option.selection === 'MULTIPLEAUTOCOMPLETE') {\r\n <sd-select\r\n [autoId]=\"autoId + item.field\"\r\n [label]=\"item.title\"\r\n [items]=\"item.option.items | filterValues | async\"\r\n [valueField]=\"item.option.valueField\"\r\n [displayField]=\"item.option.displayField\"\r\n [(model)]=\"externalFilter![item.field]\"\r\n (sdChange)=\"onFilter()\"\r\n appearance=\"outline\"\r\n multiple\r\n [form]=\"form\"\r\n [required]=\"item.required\"\r\n hideInlineError>\r\n </sd-select>\r\n } @else {\r\n <sd-select\r\n [autoId]=\"autoId + item.field\"\r\n [label]=\"item.title\"\r\n [items]=\"item.option.items | filterValues | async\"\r\n [valueField]=\"item.option.valueField\"\r\n [displayField]=\"item.option.displayField\"\r\n [(model)]=\"externalFilter![item.field]\"\r\n (sdChange)=\"onFilter()\"\r\n appearance=\"outline\"\r\n [form]=\"form\"\r\n [required]=\"item.required\"\r\n hideInlineError>\r\n </sd-select>\r\n }\r\n } @else if (item.type === 'lazy-values') {\r\n @if (item.option.selection === 'MULTIPLE') {\r\n <sd-select\r\n [autoId]=\"autoId + item.field\"\r\n [label]=\"item.title\"\r\n [items]=\"item.option.items\"\r\n [valueField]=\"item.option.valueField\"\r\n [displayField]=\"item.option.displayField\"\r\n [(model)]=\"externalFilter![item.field]\"\r\n (sdChange)=\"onFilter()\"\r\n appearance=\"outline\"\r\n multiple\r\n [form]=\"form\"\r\n [required]=\"item.required\"\r\n hideInlineError>\r\n </sd-select>\r\n } @else {\r\n <sd-select\r\n [autoId]=\"autoId + item.field\"\r\n [label]=\"item.title\"\r\n [items]=\"item.option.items\"\r\n [valueField]=\"item.option.valueField\"\r\n [displayField]=\"item.option.displayField\"\r\n [(model)]=\"externalFilter![item.field]\"\r\n (sdChange)=\"onFilter()\"\r\n appearance=\"outline\"\r\n [form]=\"form\"\r\n [required]=\"item.required\"\r\n hideInlineError>\r\n </sd-select>\r\n }\r\n } @else if (item.type === 'custom' && item.filterDef) {\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n item.filterDef;\r\n context: { form: form, externalFilter: externalFilter, autoId: autoId + item.field }\r\n \"></ng-container>\r\n }\r\n </div>\r\n }\r\n }\r\n </div>\r\n @if (filter?.manualFilter) {\r\n <div class=\"d-flex justify-content-end mt-16 px-8\">\r\n <sd-button\r\n [autoId]=\"autoId + 'onSubmit'\"\r\n [disabled]=\"form.invalid\"\r\n type=\"fill\"\r\n color=\"primary\"\r\n title=\"T\u00ECm ki\u1EBFm\"\r\n prefixIcon=\"filter_alt\"\r\n (click)=\"onSubmit()\">\r\n </sd-button>\r\n </div>\r\n }\r\n </sd-section>\r\n }\r\n <!-- <sd-popup-filter [filterRegister]=\"filterRegister!\" [columns]=\"columns\" [externalFilters]=\"externalFilters\">\r\n </sd-popup-filter> -->\r\n}\r\n", styles: [":host{display:block;padding-left:0;padding-right:0}::ng-deep .sd-custom-panel-filter-configuration{width:240px;max-height:550px;overflow-y:auto}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i2.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i2.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i2.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: SdSection, selector: "sd-section", inputs: ["title", "subTitle", "icon", "iconColor", "collapsed", "collapsable", "hideHeader"] }, { kind: "component", type: SdInput, selector: "sd-input", inputs: ["autoId", "name", "appearance", "size", "form", "label", "helperText", "placeholder", "type", "hideInlineError", "blurOnEnter", "model", "required", "readonly", "minlength", "maxlength", "pattern", "patternErrorMessage", "validator", "inlineError", "disabled", "viewed", "hyperlink", "tooltip"], outputs: ["modelChange", "sdChange", "sdFocus", "sdBlur", "sdFocusForceBlur", "keyupEnter"] }, { kind: "component", type: SdInputNumber, selector: "sd-input-number", inputs: ["autoId", "name", "size", "form", "label", "helperText", "placeholder", "hideInlineError", "blurOnEnter", "model", "required", "type", "precision", "readonly", "min", "max", "validator", "inlineError", "disabled", "viewed", "hyperlink", "appearance"], outputs: ["modelChange", "sdChange", "sdFocus", "sdBlur", "sdFocusForceBlur", "keyupEnter"] }, { kind: "component", type: SdSelect, selector: "sd-select", inputs: ["autoId", "name", "appearance", "hideInlineError", "size", "form", "label", "helperText", "placeholder", "model", "items", "valueField", "displayField", "disabledField", "cacheChecksum", "required", "validator", "inlineError", "disabled", "viewed", "hyperlink", "multiple", "limit"], outputs: ["modelChange", "sdChange", "sdSelection"] }, { kind: "component", type: SdDate, selector: "sd-date", inputs: ["autoId", "name", "appearance", "hideInlineError", "min", "max", "size", "form", "disabled", "viewed", "hyperlink", "required", "inlineError", "label", "helperText", "placeholder", "minDate", "maxDate", "model"], outputs: ["sdChange", "sdFocus", "modelChange"] }, { kind: "component", type: SdDatetime, selector: "sd-datetime", inputs: ["autoId", "name", "appearance", "hideInlineError", "min", "max", "size", "form", "disabled", "viewed", "hyperlink", "required", "inlineError", "label", "helperText", "placeholder", "minDate", "maxDate", "model"], outputs: ["sdChange", "sdFocus", "modelChange"] }, { kind: "component", type: SdDateRange$1, selector: "sd-date-range", inputs: ["autoId", "name", "appearance", "size", "form", "disabled", "required", "label", "helperText", "hideInlineError", "min", "max", "model"], outputs: ["modelChange", "sdChange"] }, { kind: "component", type: SdButton, selector: "sd-button", inputs: ["autoId", "type", "color", "title", "width", "size", "tooltip", "prefixIcon", "suffixIcon", "fontSet", "disabled", "loading"], outputs: ["click"] }, { kind: "pipe", type: FilterValuesPipe, name: "filterValues" }, { kind: "component", type: SdCheckbox, selector: "sd-checkbox", inputs: ["autoId", "name", "form", "label", "color", "disabled", "model", "inlineError"], outputs: ["modelChange", "sdChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
426
426
|
}
|
|
427
427
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: ExternalFilterComponent, decorators: [{
|
|
428
428
|
type: Component,
|
|
@@ -2096,7 +2096,8 @@ class SdTable extends SdBaseSecureComponent {
|
|
|
2096
2096
|
option.filter.hideInlineFilter = option?.filter?.hideInlineFilter ?? this.tableConfiguration?.filter?.hideInlineFilter;
|
|
2097
2097
|
option.filter.externalFilterPerRow = option?.filter?.externalFilterPerRow ?? this.tableConfiguration?.filter?.externalFilterPerRow;
|
|
2098
2098
|
option.filter.manualFilter = option?.filter?.manualFilter ?? this.tableConfiguration?.filter?.manualFilter;
|
|
2099
|
-
option.filter.hideExternalFilterToolbar =
|
|
2099
|
+
option.filter.hideExternalFilterToolbar =
|
|
2100
|
+
option?.filter?.hideExternalFilterToolbar ?? this.tableConfiguration?.filter?.hideExternalFilterToolbar;
|
|
2100
2101
|
for (const column of option.columns || []) {
|
|
2101
2102
|
if (column.filter?.operator?.enable) {
|
|
2102
2103
|
if (!column.filter?.operator?.list?.length) {
|
|
@@ -2882,22 +2883,124 @@ class SdTable extends SdBaseSecureComponent {
|
|
|
2882
2883
|
}
|
|
2883
2884
|
}
|
|
2884
2885
|
};
|
|
2886
|
+
#getNestedValue = (obj, path) => {
|
|
2887
|
+
if (!path || !obj)
|
|
2888
|
+
return undefined;
|
|
2889
|
+
const keys = path.split('.');
|
|
2890
|
+
let result = obj;
|
|
2891
|
+
for (const key of keys) {
|
|
2892
|
+
if (result === null || result === undefined) {
|
|
2893
|
+
return undefined;
|
|
2894
|
+
}
|
|
2895
|
+
result = result[key];
|
|
2896
|
+
}
|
|
2897
|
+
return result;
|
|
2898
|
+
};
|
|
2885
2899
|
#format = async (rawItems, columns) => {
|
|
2886
2900
|
const items = rawItems.map(MapToSdTableItem);
|
|
2901
|
+
// Cache for parsed field paths
|
|
2902
|
+
const fieldPathCache = new Map();
|
|
2903
|
+
/**
|
|
2904
|
+
* Get nested property value from object using dot notation
|
|
2905
|
+
*/
|
|
2906
|
+
const getNestedValue = (obj, path) => {
|
|
2907
|
+
if (!path || obj == null)
|
|
2908
|
+
return undefined;
|
|
2909
|
+
let keys = fieldPathCache.get(path);
|
|
2910
|
+
if (!keys) {
|
|
2911
|
+
keys = path.split('.');
|
|
2912
|
+
fieldPathCache.set(path, keys);
|
|
2913
|
+
}
|
|
2914
|
+
if (keys.length === 1)
|
|
2915
|
+
return obj[keys[0]];
|
|
2916
|
+
let result = obj;
|
|
2917
|
+
for (const key of keys) {
|
|
2918
|
+
if (result == null)
|
|
2919
|
+
return undefined;
|
|
2920
|
+
result = result[key];
|
|
2921
|
+
}
|
|
2922
|
+
return result;
|
|
2923
|
+
};
|
|
2924
|
+
/**
|
|
2925
|
+
* Format date display based on column type
|
|
2926
|
+
*/
|
|
2927
|
+
const formatDateDisplay = (value, type) => {
|
|
2928
|
+
const date = DateUtilities.toFormat(value, 'dd/MM/yyyy');
|
|
2929
|
+
const time = DateUtilities.toFormat(value, 'HH:mm:ss');
|
|
2930
|
+
if (type === 'datetime') {
|
|
2931
|
+
return time && date ? `<div class="T14R">${date}<span class="T14R text-black400 ml-4">${time}</span></div>` : '';
|
|
2932
|
+
}
|
|
2933
|
+
if (type === 'date')
|
|
2934
|
+
return date || '';
|
|
2935
|
+
if (type === 'time')
|
|
2936
|
+
return time || '';
|
|
2937
|
+
return '';
|
|
2938
|
+
};
|
|
2939
|
+
/**
|
|
2940
|
+
* Process values display (supports arrays)
|
|
2941
|
+
*/
|
|
2942
|
+
const processValuesDisplay = (value, rowData, column, field) => {
|
|
2943
|
+
if (column.type === 'lazy-values' && typeof column.option.mapValue === 'function') {
|
|
2944
|
+
const val = column.option.mapValue(value, rowData);
|
|
2945
|
+
const vals = (Array.isArray(val) ? val : [val]).filter(e => e?.toString());
|
|
2946
|
+
return vals.map(val => this.#cacheObjValues[field]?.[val]?.[column.option.displayField] || val).join(', ');
|
|
2947
|
+
}
|
|
2948
|
+
const vals = (Array.isArray(value) ? value : [value]).filter(e => e?.toString());
|
|
2949
|
+
return vals.map(val => this.#cacheObjValues[field]?.[val]?.[column.option.displayField] || val).join(', ');
|
|
2950
|
+
};
|
|
2951
|
+
/**
|
|
2952
|
+
* Create badge configuration
|
|
2953
|
+
*/
|
|
2954
|
+
const createBadge = (column, value, rowData) => {
|
|
2955
|
+
if (column.useBadge) {
|
|
2956
|
+
const badge = column.useBadge(value, rowData);
|
|
2957
|
+
if (badge) {
|
|
2958
|
+
return {
|
|
2959
|
+
badge: {
|
|
2960
|
+
type: badge.type ?? 'round',
|
|
2961
|
+
color: badge.color,
|
|
2962
|
+
icon: badge.icon,
|
|
2963
|
+
},
|
|
2964
|
+
title: badge.title,
|
|
2965
|
+
};
|
|
2966
|
+
}
|
|
2967
|
+
return undefined;
|
|
2968
|
+
}
|
|
2969
|
+
if ((column.type === 'string' || column.type === 'number' || column.type === 'values') && column.badge) {
|
|
2970
|
+
return {
|
|
2971
|
+
badge: {
|
|
2972
|
+
type: column.badgeType || 'icon',
|
|
2973
|
+
color: column.badge(value, rowData),
|
|
2974
|
+
icon: column.badgeIcon?.(value, rowData),
|
|
2975
|
+
},
|
|
2976
|
+
title: null,
|
|
2977
|
+
};
|
|
2978
|
+
}
|
|
2979
|
+
if (column.type === 'boolean') {
|
|
2980
|
+
return {
|
|
2981
|
+
badge: {
|
|
2982
|
+
type: 'round',
|
|
2983
|
+
color: value ? 'success' : 'error',
|
|
2984
|
+
},
|
|
2985
|
+
};
|
|
2986
|
+
}
|
|
2987
|
+
return undefined;
|
|
2988
|
+
};
|
|
2887
2989
|
const execute = async (column) => {
|
|
2888
|
-
// Clickable
|
|
2889
2990
|
const { field, click, tooltip, htmlTemplate, transform } = column;
|
|
2991
|
+
// Load lazy-values
|
|
2890
2992
|
if (!transform && !htmlTemplate && column.type === 'lazy-values' && typeof column.option.views === 'function') {
|
|
2891
|
-
const { option: { views, mapValue }, } = column;
|
|
2993
|
+
const { option: { views, mapValue, valueField, displayField }, } = column;
|
|
2892
2994
|
this.#cacheObjValues[field] = this.#cacheObjValues[field] || {};
|
|
2893
2995
|
const values = ArrayUtilities.distinct(items
|
|
2894
2996
|
.map(item => {
|
|
2997
|
+
const value = getNestedValue(item.data, field);
|
|
2895
2998
|
if (typeof mapValue === 'function') {
|
|
2896
|
-
return mapValue(
|
|
2999
|
+
return mapValue(value, item.data);
|
|
2897
3000
|
}
|
|
2898
|
-
return
|
|
3001
|
+
return value;
|
|
2899
3002
|
})
|
|
2900
|
-
.filter(val =>
|
|
3003
|
+
.filter(val => val?.toString())
|
|
2901
3004
|
.reduce((current, next) => [...current, ...(Array.isArray(next) ? next : [next])], [])
|
|
2902
3005
|
.filter(val => !Object.keys(this.#cacheObjValues[field]).includes(val)));
|
|
2903
3006
|
if (values.length) {
|
|
@@ -2905,17 +3008,19 @@ class SdTable extends SdBaseSecureComponent {
|
|
|
2905
3008
|
console.error(err);
|
|
2906
3009
|
return [];
|
|
2907
3010
|
}))
|
|
2908
|
-
.filter((item) => values.includes(item?.[
|
|
3011
|
+
.filter((item) => values.includes(item?.[valueField]))
|
|
2909
3012
|
.map((e) => ({
|
|
2910
|
-
[
|
|
2911
|
-
[
|
|
3013
|
+
[valueField]: e?.[valueField],
|
|
3014
|
+
[displayField]: e?.[displayField],
|
|
2912
3015
|
}));
|
|
2913
|
-
Object.assign(this.#cacheObjValues[field], ArrayUtilities.toObject(
|
|
3016
|
+
Object.assign(this.#cacheObjValues[field], ArrayUtilities.toObject(valueField, lazyItems) || {});
|
|
2914
3017
|
}
|
|
2915
3018
|
}
|
|
3019
|
+
// Process each item
|
|
2916
3020
|
for (const item of items) {
|
|
2917
3021
|
const rowData = item.data;
|
|
2918
|
-
const value = rowData
|
|
3022
|
+
const value = getNestedValue(rowData, field);
|
|
3023
|
+
// Initialize display
|
|
2919
3024
|
item.meta.display[field] = {
|
|
2920
3025
|
badge: undefined,
|
|
2921
3026
|
cellStyle: column.align === 'right' ? { 'text-align': 'right!important' } : undefined,
|
|
@@ -2925,57 +3030,34 @@ class SdTable extends SdBaseSecureComponent {
|
|
|
2925
3030
|
click: typeof click === 'function' ? () => click(value, rowData) : undefined,
|
|
2926
3031
|
};
|
|
2927
3032
|
const display = item.meta.display[field];
|
|
2928
|
-
//
|
|
3033
|
+
// Process display data
|
|
2929
3034
|
if (typeof htmlTemplate === 'function') {
|
|
2930
3035
|
display.isHtml = true;
|
|
2931
3036
|
display.data = htmlTemplate(value, rowData);
|
|
2932
3037
|
}
|
|
2933
3038
|
else if (typeof transform === 'function') {
|
|
2934
3039
|
const newValue = transform(value, rowData);
|
|
2935
|
-
|
|
2936
|
-
display.data = await newValue;
|
|
2937
|
-
}
|
|
2938
|
-
else {
|
|
2939
|
-
display.data = newValue;
|
|
2940
|
-
}
|
|
3040
|
+
display.data = newValue instanceof Promise ? await newValue : newValue;
|
|
2941
3041
|
}
|
|
2942
3042
|
else {
|
|
3043
|
+
// Date/Time
|
|
2943
3044
|
if (column.type === 'date' || column.type === 'datetime' || column.type === 'time') {
|
|
2944
|
-
const
|
|
2945
|
-
|
|
2946
|
-
|
|
2947
|
-
// time = DateUtilities.toFormat(value, 'HH:mm');
|
|
2948
|
-
// }
|
|
2949
|
-
if (column.type === 'date' || column.type === 'datetime') {
|
|
2950
|
-
if (column.type === 'datetime') {
|
|
2951
|
-
display.isHtml = true;
|
|
2952
|
-
display.data = time && date ? `<div class="T14R">${date}<span class="T14R text-black400 ml-4">${time}</span></div>` : '';
|
|
2953
|
-
}
|
|
2954
|
-
else {
|
|
2955
|
-
display.data = date;
|
|
2956
|
-
}
|
|
2957
|
-
}
|
|
2958
|
-
if (column.type === 'time') {
|
|
2959
|
-
display.data = time;
|
|
2960
|
-
}
|
|
3045
|
+
const formatted = formatDateDisplay(value, column.type);
|
|
3046
|
+
display.data = formatted;
|
|
3047
|
+
display.isHtml = column.type === 'datetime';
|
|
2961
3048
|
}
|
|
3049
|
+
// Values/Lazy-values
|
|
2962
3050
|
if (column.type === 'values' || column.type === 'lazy-values') {
|
|
2963
|
-
|
|
2964
|
-
const val = column.option.mapValue(value, rowData);
|
|
2965
|
-
const vals = (Array.isArray(val) ? val : [val]).filter(e => !!e?.toString());
|
|
2966
|
-
display.data = vals.map(val => this.#cacheObjValues[field]?.[val]?.[column.option.displayField] || val)?.join(', ');
|
|
2967
|
-
}
|
|
2968
|
-
else {
|
|
2969
|
-
const vals = (Array.isArray(value) ? value : [value]).filter(e => !!e?.toString());
|
|
2970
|
-
display.data = vals.map(val => this.#cacheObjValues[field]?.[val]?.[column.option.displayField] || val)?.join(', ');
|
|
2971
|
-
}
|
|
3051
|
+
display.data = processValuesDisplay(value, rowData, column, field);
|
|
2972
3052
|
}
|
|
3053
|
+
// Number
|
|
2973
3054
|
if (column.type === 'number' && NumberUtilities.isNumber(value)) {
|
|
2974
3055
|
display.data = this.formatNumberPipe.transform(value);
|
|
2975
3056
|
}
|
|
3057
|
+
// Boolean
|
|
2976
3058
|
if (column.type === 'boolean') {
|
|
2977
3059
|
const { option } = column;
|
|
2978
|
-
if (value
|
|
3060
|
+
if (value != null && value !== '') {
|
|
2979
3061
|
display.data = value === true ? option?.displayOnTrue || 'True' : option?.displayOnFalse || 'False';
|
|
2980
3062
|
}
|
|
2981
3063
|
else {
|
|
@@ -2983,31 +3065,14 @@ class SdTable extends SdBaseSecureComponent {
|
|
|
2983
3065
|
}
|
|
2984
3066
|
}
|
|
2985
3067
|
// Badge
|
|
2986
|
-
|
|
2987
|
-
|
|
2988
|
-
|
|
2989
|
-
|
|
2990
|
-
|
|
2991
|
-
color: badge.color,
|
|
2992
|
-
icon: badge.icon,
|
|
2993
|
-
};
|
|
2994
|
-
display.data = badge.title ?? display.data;
|
|
3068
|
+
const badgeResult = createBadge(column, value, rowData);
|
|
3069
|
+
if (badgeResult) {
|
|
3070
|
+
display.badge = badgeResult.badge;
|
|
3071
|
+
if (badgeResult.title) {
|
|
3072
|
+
display.data = badgeResult.title;
|
|
2995
3073
|
}
|
|
2996
3074
|
}
|
|
2997
|
-
|
|
2998
|
-
display.badge = {
|
|
2999
|
-
type: !column?.badgeType ? 'icon' : column.badgeType,
|
|
3000
|
-
color: column.badge(value, rowData),
|
|
3001
|
-
icon: column.badgeIcon?.(value, rowData),
|
|
3002
|
-
};
|
|
3003
|
-
}
|
|
3004
|
-
else if (column.type === 'boolean') {
|
|
3005
|
-
display.badge = {
|
|
3006
|
-
type: 'round',
|
|
3007
|
-
color: value ? 'success' : 'error',
|
|
3008
|
-
icon: null,
|
|
3009
|
-
};
|
|
3010
|
-
}
|
|
3075
|
+
// Handle empty values
|
|
3011
3076
|
if (display.data === null || display.data === undefined || display.data === '') {
|
|
3012
3077
|
display.data = SD_EMPTY_STR;
|
|
3013
3078
|
display.badge = undefined;
|
|
@@ -3015,6 +3080,7 @@ class SdTable extends SdBaseSecureComponent {
|
|
|
3015
3080
|
}
|
|
3016
3081
|
}
|
|
3017
3082
|
};
|
|
3083
|
+
// Execute for all columns
|
|
3018
3084
|
for (const column of columns.filter(e => !e.hidden)) {
|
|
3019
3085
|
if (column.type === 'children') {
|
|
3020
3086
|
for (const childColumn of column.children?.filter(e => !e.hidden) || []) {
|