@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.
Files changed (38) hide show
  1. package/components/document-builder/src/document-builder.component.d.ts +7 -6
  2. package/components/document-builder/src/document-builder.model.d.ts +1 -0
  3. package/components/document-builder/src/plugins/heading/heading.plugin.d.ts +4 -0
  4. package/components/document-builder/src/plugins/{image-upload.plugin.d.ts → image-upload/image-upload.plugin.d.ts} +0 -4
  5. package/components/document-builder/src/plugins/index.d.ts +6 -5
  6. package/components/table/src/models/table-item.model.d.ts +2 -1
  7. package/fesm2022/sd-angular-core-components-document-builder.mjs +240 -333
  8. package/fesm2022/sd-angular-core-components-document-builder.mjs.map +1 -1
  9. package/fesm2022/sd-angular-core-components-table.mjs +135 -69
  10. package/fesm2022/sd-angular-core-components-table.mjs.map +1 -1
  11. package/fesm2022/sd-angular-core-components-workflow.mjs +3 -3
  12. package/fesm2022/sd-angular-core-components-workflow.mjs.map +1 -1
  13. package/fesm2022/sd-angular-core-forms-autocomplete.mjs +4 -2
  14. package/fesm2022/sd-angular-core-forms-autocomplete.mjs.map +1 -1
  15. package/fesm2022/sd-angular-core-forms-date.mjs +4 -2
  16. package/fesm2022/sd-angular-core-forms-date.mjs.map +1 -1
  17. package/fesm2022/sd-angular-core-forms-datetime.mjs +17 -3
  18. package/fesm2022/sd-angular-core-forms-datetime.mjs.map +1 -1
  19. package/fesm2022/sd-angular-core-forms-input-number.mjs +4 -3
  20. package/fesm2022/sd-angular-core-forms-input-number.mjs.map +1 -1
  21. package/fesm2022/sd-angular-core-forms-input.mjs +4 -2
  22. package/fesm2022/sd-angular-core-forms-input.mjs.map +1 -1
  23. package/fesm2022/sd-angular-core-forms-radio.mjs +4 -2
  24. package/fesm2022/sd-angular-core-forms-radio.mjs.map +1 -1
  25. package/fesm2022/sd-angular-core-forms-select.mjs +4 -2
  26. package/fesm2022/sd-angular-core-forms-select.mjs.map +1 -1
  27. package/fesm2022/sd-angular-core-forms-textarea.mjs +14 -2
  28. package/fesm2022/sd-angular-core-forms-textarea.mjs.map +1 -1
  29. package/fesm2022/sd-angular-core-pipes.mjs +21 -1
  30. package/fesm2022/sd-angular-core-pipes.mjs.map +1 -1
  31. package/forms/datetime/src/datetime.component.d.ts +4 -1
  32. package/package.json +71 -71
  33. package/pipes/index.d.ts +1 -0
  34. package/pipes/src/empty.pipe.d.ts +7 -0
  35. /package/components/document-builder/src/plugins/{comment.plugin.d.ts → comment/comment.plugin.d.ts} +0 -0
  36. /package/components/document-builder/src/plugins/{page-orientation.plugin.d.ts → page-orientation/page-orientation.plugin.d.ts} +0 -0
  37. /package/components/document-builder/src/plugins/{table-fit.plugin.d.ts → table-fit/table-fit.plugin.d.ts} +0 -0
  38. /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 = option?.filter?.hideExternalFilterToolbar ?? this.tableConfiguration?.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(item.data?.[field], item.data);
2999
+ return mapValue(value, item.data);
2897
3000
  }
2898
- return item.data?.[field];
3001
+ return value;
2899
3002
  })
2900
- .filter(val => !!val?.toString())
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?.[column.option.valueField]))
3011
+ .filter((item) => values.includes(item?.[valueField]))
2909
3012
  .map((e) => ({
2910
- [column.option.valueField]: e?.[column.option.valueField],
2911
- [column.option.displayField]: e?.[column.option.displayField],
3013
+ [valueField]: e?.[valueField],
3014
+ [displayField]: e?.[displayField],
2912
3015
  }));
2913
- Object.assign(this.#cacheObjValues[field], ArrayUtilities.toObject(column.option.valueField, lazyItems) || {});
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?.[field];
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
- // Display
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
- if (newValue instanceof Promise) {
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 date = DateUtilities.toFormat(value, 'dd/MM/yyyy');
2945
- let time = DateUtilities.toFormat(value, 'HH:mm:ss');
2946
- // if (time?.endsWith('00')) {
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
- if (column.type === 'lazy-values' && typeof column.option.mapValue === 'function') {
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 !== undefined && value !== null && 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
- if (column.useBadge) {
2987
- const badge = column.useBadge(value, rowData);
2988
- if (badge) {
2989
- display.badge = {
2990
- type: badge.type ?? 'round',
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
- else if ((column.type === 'string' || column.type === 'number' || column.type === 'values') && column.badge) {
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) || []) {