@fundamental-ngx/platform 0.64.2-rc.2 → 0.64.2-rc.21

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.
@@ -1,7 +1,8 @@
1
1
  import * as i4 from '@angular/cdk/a11y';
2
+ import { LiveAnnouncer } from '@angular/cdk/a11y';
2
3
  import { DOWN_ARROW, UP_ARROW, SPACE } from '@angular/cdk/keycodes';
3
4
  import * as i0 from '@angular/core';
4
- import { ViewEncapsulation, ChangeDetectionStrategy, Component, InjectionToken, Inject, signal, inject, DestroyRef, ViewChild, ViewChildren, Input, computed, DOCUMENT, input, ContentChild, Optional, Host, EventEmitter, Output, forwardRef, Pipe, TemplateRef, Directive, ChangeDetectorRef, afterEveryRender, output, linkedSignal, ContentChildren, HostBinding, NgZone, ElementRef, effect, booleanAttribute, NgModule } from '@angular/core';
5
+ import { ViewEncapsulation, ChangeDetectionStrategy, Component, InjectionToken, Inject, signal, inject, DestroyRef, ViewChild, ViewChildren, Input, computed, DOCUMENT, input, ContentChild, Optional, Host, EventEmitter, Output, forwardRef, Pipe, TemplateRef, Directive, ChangeDetectorRef, afterEveryRender, output, linkedSignal, untracked, viewChildren, effect, ContentChildren, HostBinding, NgZone, ElementRef, booleanAttribute, NgModule } from '@angular/core';
5
6
  import { NgTemplateOutlet, NgStyle, AsyncPipe, NgClass } from '@angular/common';
6
7
  import * as i3 from '@fundamental-ngx/cdk/utils';
7
8
  import { TemplateDirective, RtlService, InitialFocusDirective, DisabledBehaviorDirective, FDK_FOCUSABLE_ITEM_DIRECTIVE, FDK_FOCUSABLE_LIST_DIRECTIVE, ValueByPathPipe, set, uuidv4, destroyObservable, KeyUtil, get, range, RangeSelector, resizeObservable, uniq, DragAndDropModule, IntersectionSpyDirective, FDK_FOCUSABLE_GRID_DIRECTIVE, DndListDirective, FocusableGridDirective } from '@fundamental-ngx/cdk/utils';
@@ -10,7 +11,7 @@ import * as i1$3 from '@fundamental-ngx/core/content-density';
10
11
  import { ContentDensityDirective, contentDensityObserverProviders, ContentDensityObserver, ContentDensityMode } from '@fundamental-ngx/core/content-density';
11
12
  import { SkeletonComponent } from '@fundamental-ngx/core/skeleton';
12
13
  import { TablePopoverDirective, TableIconDirective, TableRowDirective, TableCellDirective, TableStatusIndicatorDirective, TableTextDirective, TableComponent as TableComponent$1, TableHeaderDirective, TableBodyDirective, TableFooterDirective, TableService as TableService$1 } from '@fundamental-ngx/core/table';
13
- import { FdTranslatePipe, resolveTranslationSignalFn } from '@fundamental-ngx/i18n';
14
+ import { FdTranslatePipe, FD_LANGUAGE_SIGNAL, TranslationResolver, resolveTranslationSignalFn } from '@fundamental-ngx/i18n';
14
15
  import { isJsObject, FDP_PRESET_MANAGED_COMPONENT } from '@fundamental-ngx/platform/shared';
15
16
  import * as i1 from '@fundamental-ngx/platform/table-helpers';
16
17
  import { SortDirection, TableService, Table, ColumnAlign, FILTER_STRING_STRATEGY, FilterableColumnDataType, TableColumn, FdpCellDef, FdpEditableCellDef, FdpHeaderCellDef, TableCellHeaderPopoverDirective, getFilterStrategiesBasedOnDataType, FILTER_STRATEGY, FILTER_STRATEGY_LABEL, getUniqueListValuesByKey, FdpViewSettingsFilterCustomDef, FilterType, TableDataSourceDirective, SelectionMode, TableColumnResizeService, TableRowService, PlatformTableCellResizableDirective, SelectionCellStylesPipe, TableCellStylesPipe, ColumnResizableSidePipe, TableColumnSortingDirectionPipe, isTreeRow, isTreeRowFirstCell, EditableTableCell, TableDraggableDirective, DEFAULT_HIGHLIGHTING_KEY, SEMANTIC_HIGHLIGHTING_COLUMN_WIDTH, ROW_HEIGHT, TABLE_COLUMN_MIN_WIDTH, FDP_TABLE_STATE_DIRECTIVE, FDP_TABLE_VIRTUAL_SCROLL_DIRECTIVE, FDP_TABLE_DRAGGABLE_DIRECTIVE, TableHeaderResizerDirective, isRowNavigatable, TableRowType, buildNewRowSkeleton, EDITABLE_ROW_SEMANTIC_STATE, SaveRowsEvent, getSelectableRows, TableCellActivateEvent, TableRowActivateEvent, TableRowToggleOpenStateEvent, findRowChildren, getRowParents, TableSortChangeEvent, TablePageChangeEvent, TableGroupChangeEvent, TableColumnFreezeEvent, TableFilterChangeEvent, TableColumnsChangeEvent, convertObjectsToTableRows, isTableRow, convertTreeTableRowToFlatList, convertTreeObjectsToTableRows, getFreezableColumns, getFreezableEndColumns, applySelectionToChildren, SELECTION_COLUMN_WIDTH, TableScrollableDirective, RowClassesPipe, TableScrollDispatcherService, TableResponsiveService, TableHelpersModule } from '@fundamental-ngx/platform/table-helpers';
@@ -20,8 +21,8 @@ import { fromEvent, BehaviorSubject, Subscription, combineLatest, distinctUntilC
20
21
  import { startWith, take, debounceTime, skip, filter, switchMap, takeUntil, map, distinctUntilChanged as distinctUntilChanged$1, tap } from 'rxjs/operators';
21
22
  import { ButtonComponent } from '@fundamental-ngx/core/button';
22
23
  import { takeUntilDestroyed, outputFromObservable, toObservable } from '@angular/core/rxjs-interop';
23
- import { FormItemComponent, FormLabelComponent, FormControlComponent } from '@fundamental-ngx/core/form';
24
- import { ListLinkDirective, ListIconDirective, ListTitleDirective, ListComponent as ListComponent$1, ListItemComponent, ListGroupHeaderDirective } from '@fundamental-ngx/core/list';
24
+ import { FormItemComponent, FormLabelComponent, FormControlComponent, FormGroupComponent } from '@fundamental-ngx/core/form';
25
+ import { ListLinkDirective, ListIconDirective, ListTitleDirective, ListComponent as ListComponent$1, ListItemComponent, ListGroupHeaderDirective, ListSecondaryDirective } from '@fundamental-ngx/core/list';
25
26
  import { PopoverComponent, PopoverTriggerDirective } from '@fundamental-ngx/core/popover';
26
27
  import { PopoverPlacement } from '@fundamental-ngx/core/shared';
27
28
  import { ListComponent, FreeContentListItemComponent } from '@fundamental-ngx/platform/list';
@@ -42,6 +43,8 @@ import { LayoutGridRowDirective, LayoutGridColDirective, LayoutGridComponent } f
42
43
  import { SelectComponent, OptionComponent } from '@fundamental-ngx/core/select';
43
44
  import { PanelComponent, PanelTitleDirective, PanelContentDirective } from '@fundamental-ngx/core/panel';
44
45
  import { RadioButtonComponent } from '@fundamental-ngx/core/radio';
46
+ import { ComboboxComponent } from '@fundamental-ngx/core/combobox';
47
+ import { SegmentedButtonComponent } from '@fundamental-ngx/core/segmented-button';
45
48
  import { IconTabBarComponent, IconTabBarTabComponent } from '@fundamental-ngx/platform/icon-tab-bar';
46
49
  import { InputComponent, PlatformDatePickerComponent, SwitchComponent } from '@fundamental-ngx/platform/form';
47
50
 
@@ -2309,11 +2312,11 @@ class FilterMultiSelectComponent {
2309
2312
  this._value = this._selectableOptions.filter(({ selected }) => selected).map(({ value }) => value);
2310
2313
  }
2311
2314
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: FilterMultiSelectComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
2312
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.5", type: FilterMultiSelectComponent, isStandalone: true, selector: "fdp-filter-multi-select", inputs: { options: "options", filterBy: "filterBy" }, outputs: { valueChange: "valueChange" }, ngImport: i0, template: "<ul fd-list [selection]=\"true\">\n @for (option of _selectableOptions; track option) {\n <li fd-list-item [selected]=\"option.selected\">\n <fd-checkbox [ngModel]=\"option.selected\" (ngModelChange)=\"_onSelectChange(option, $event)\"></fd-checkbox>\n <span fd-list-title>{{ option.label }}</span>\n </li>\n }\n</ul>\n", dependencies: [{ kind: "component", type: ListComponent$1, selector: "[fd-list], [fdList]", inputs: ["dropdownMode", "multiInputMode", "mobileMode", "hasMessage", "noBorder", "navigationIndicator", "selection", "keyboardSupport", "byline", "subline", "theme", "unreadIndicator", "role", "settingsList", "settingsListFooter", "searchResultsList"], outputs: ["focusEscapeList"] }, { kind: "component", type: ListItemComponent, selector: "[fdListItem] ,[fd-list-item]", inputs: ["selected", "noData", "action", "interactive", "growing", "counter", "counterRole", "counterAriaLabel", "active", "unread", "byline", "ariaRole", "id", "preventClick", "settingsListTpl", "suggestion"], outputs: ["keyDown"], exportAs: ["fdListItem"] }, { kind: "component", type: CheckboxComponent, selector: "fd-checkbox", inputs: ["wrapLabel", "valignLabel", "ariaLabel", "role", "value", "ariaLabelledBy", "ariaDescribedBy", "title", "inputId", "state", "name", "label", "disabled", "readonly", "tristate", "tristateSelectable", "labelClass", "required", "displayOnly", "values", "standalone"], outputs: ["focusChange"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: ListTitleDirective, selector: "[fd-list-title], [fdListTitle]", inputs: ["wrap", "truncate", "scope"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
2315
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.5", type: FilterMultiSelectComponent, isStandalone: true, selector: "fdp-filter-multi-select", inputs: { options: "options", filterBy: "filterBy" }, outputs: { valueChange: "valueChange" }, ngImport: i0, template: "<ul fd-list [selection]=\"true\">\n @for (option of _selectableOptions; track option) {\n <li\n fd-list-item\n [selected]=\"option.selected\"\n [attr.aria-label]=\"\n ('platformTable.filterDialogFilterByLabel' | fdTranslate: { filterLabel: option.label })()\n \"\n >\n <fd-checkbox [ngModel]=\"option.selected\" (ngModelChange)=\"_onSelectChange(option, $event)\"></fd-checkbox>\n <span fd-list-title>{{ option.label }}</span>\n </li>\n }\n</ul>\n", dependencies: [{ kind: "component", type: ListComponent$1, selector: "[fd-list], [fdList]", inputs: ["dropdownMode", "multiInputMode", "mobileMode", "hasMessage", "noBorder", "navigationIndicator", "selection", "keyboardSupport", "byline", "subline", "theme", "unreadIndicator", "role", "settingsList", "settingsListFooter", "searchResultsList"], outputs: ["focusEscapeList"] }, { kind: "component", type: ListItemComponent, selector: "[fdListItem] ,[fd-list-item]", inputs: ["selected", "noData", "action", "interactive", "growing", "counter", "counterRole", "counterAriaLabel", "active", "unread", "byline", "ariaRole", "id", "preventClick", "settingsListTpl", "suggestion"], outputs: ["keyDown"], exportAs: ["fdListItem"] }, { kind: "component", type: CheckboxComponent, selector: "fd-checkbox", inputs: ["wrapLabel", "valignLabel", "ariaLabel", "role", "value", "ariaLabelledBy", "ariaDescribedBy", "title", "inputId", "state", "name", "label", "disabled", "readonly", "tristate", "tristateSelectable", "labelClass", "required", "displayOnly", "values", "standalone"], outputs: ["focusChange"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: ListTitleDirective, selector: "[fd-list-title], [fdListTitle]", inputs: ["wrap", "truncate", "scope"] }, { kind: "pipe", type: FdTranslatePipe, name: "fdTranslate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
2313
2316
  }
2314
2317
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: FilterMultiSelectComponent, decorators: [{
2315
2318
  type: Component,
2316
- args: [{ selector: 'fdp-filter-multi-select', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, imports: [ListComponent$1, ListItemComponent, CheckboxComponent, FormsModule, ListTitleDirective], template: "<ul fd-list [selection]=\"true\">\n @for (option of _selectableOptions; track option) {\n <li fd-list-item [selected]=\"option.selected\">\n <fd-checkbox [ngModel]=\"option.selected\" (ngModelChange)=\"_onSelectChange(option, $event)\"></fd-checkbox>\n <span fd-list-title>{{ option.label }}</span>\n </li>\n }\n</ul>\n" }]
2319
+ args: [{ selector: 'fdp-filter-multi-select', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, imports: [ListComponent$1, ListItemComponent, CheckboxComponent, FormsModule, ListTitleDirective, FdTranslatePipe], template: "<ul fd-list [selection]=\"true\">\n @for (option of _selectableOptions; track option) {\n <li\n fd-list-item\n [selected]=\"option.selected\"\n [attr.aria-label]=\"\n ('platformTable.filterDialogFilterByLabel' | fdTranslate: { filterLabel: option.label })()\n \"\n >\n <fd-checkbox [ngModel]=\"option.selected\" (ngModelChange)=\"_onSelectChange(option, $event)\"></fd-checkbox>\n <span fd-list-title>{{ option.label }}</span>\n </li>\n }\n</ul>\n" }]
2317
2320
  }], propDecorators: { options: [{
2318
2321
  type: Input
2319
2322
  }], filterBy: [{
@@ -2354,11 +2357,11 @@ class FilterSingleSelectComponent {
2354
2357
  }
2355
2358
  }
2356
2359
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: FilterSingleSelectComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
2357
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.5", type: FilterSingleSelectComponent, isStandalone: true, selector: "fdp-filter-single-select", inputs: { options: "options", filterBy: "filterBy" }, outputs: { valueChange: "valueChange" }, ngImport: i0, template: "<ul fd-list [selection]=\"true\">\n <li fd-list-item [selected]=\"_value === NOT_FILTERED_OPTION_VALUE\">\n <fd-radio-button\n name=\"sort-by\"\n [value]=\"NOT_FILTERED_OPTION_VALUE\"\n state=\"default\"\n [ngModel]=\"_value\"\n (ngModelChange)=\"_onValueChange($event)\"\n ></fd-radio-button>\n <span fd-list-title>{{ ('platformTable.filterDialogNotFilteredLabel' | fdTranslate)() }}</span>\n </li>\n @for (option of options; track option) {\n <li fd-list-item [selected]=\"option.value === _value\">\n <fd-radio-button\n [ngModel]=\"_value\"\n (ngModelChange)=\"_onValueChange($event)\"\n [value]=\"option.value\"\n name=\"filtering-settings-single-select\"\n ></fd-radio-button>\n <span fd-list-title>{{ option.label }}</span>\n </li>\n }\n</ul>\n", dependencies: [{ kind: "component", type: ListComponent$1, selector: "[fd-list], [fdList]", inputs: ["dropdownMode", "multiInputMode", "mobileMode", "hasMessage", "noBorder", "navigationIndicator", "selection", "keyboardSupport", "byline", "subline", "theme", "unreadIndicator", "role", "settingsList", "settingsListFooter", "searchResultsList"], outputs: ["focusEscapeList"] }, { kind: "component", type: ListItemComponent, selector: "[fdListItem] ,[fd-list-item]", inputs: ["selected", "noData", "action", "interactive", "growing", "counter", "counterRole", "counterAriaLabel", "active", "unread", "byline", "ariaRole", "id", "preventClick", "settingsListTpl", "suggestion"], outputs: ["keyDown"], exportAs: ["fdListItem"] }, { kind: "component", type: RadioButtonComponent, selector: "fd-radio-button", inputs: ["ariaLabel", "ariaLabelledBy", "ariaDescribedBy", "title", "tabIndex", "state", "disabled", "readOnly", "selectedValue", "name", "id", "value", "required", "standalone", "wrapLabel", "valignLabel"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: ListTitleDirective, selector: "[fd-list-title], [fdListTitle]", inputs: ["wrap", "truncate", "scope"] }, { kind: "pipe", type: FdTranslatePipe, name: "fdTranslate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
2360
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.5", type: FilterSingleSelectComponent, isStandalone: true, selector: "fdp-filter-single-select", inputs: { options: "options", filterBy: "filterBy" }, outputs: { valueChange: "valueChange" }, ngImport: i0, template: "<ul fd-list [selection]=\"true\">\n <li fd-list-item [selected]=\"_value === NOT_FILTERED_OPTION_VALUE\">\n <fd-radio-button\n name=\"sort-by\"\n [value]=\"NOT_FILTERED_OPTION_VALUE\"\n state=\"default\"\n [ngModel]=\"_value\"\n (ngModelChange)=\"_onValueChange($event)\"\n ></fd-radio-button>\n <span fd-list-title>{{ ('platformTable.filterDialogNotFilteredLabel' | fdTranslate)() }}</span>\n </li>\n @for (option of options; track option) {\n <li\n fd-list-item\n [selected]=\"option.value === _value\"\n [attr.aria-label]=\"\n ('platformTable.filterDialogFilterByLabel' | fdTranslate: { filterLabel: option.label })()\n \"\n >\n <fd-radio-button\n [ngModel]=\"_value\"\n (ngModelChange)=\"_onValueChange($event)\"\n [value]=\"option.value\"\n name=\"filtering-settings-single-select\"\n ></fd-radio-button>\n <span fd-list-title>{{ option.label }}</span>\n </li>\n }\n</ul>\n", dependencies: [{ kind: "component", type: ListComponent$1, selector: "[fd-list], [fdList]", inputs: ["dropdownMode", "multiInputMode", "mobileMode", "hasMessage", "noBorder", "navigationIndicator", "selection", "keyboardSupport", "byline", "subline", "theme", "unreadIndicator", "role", "settingsList", "settingsListFooter", "searchResultsList"], outputs: ["focusEscapeList"] }, { kind: "component", type: ListItemComponent, selector: "[fdListItem] ,[fd-list-item]", inputs: ["selected", "noData", "action", "interactive", "growing", "counter", "counterRole", "counterAriaLabel", "active", "unread", "byline", "ariaRole", "id", "preventClick", "settingsListTpl", "suggestion"], outputs: ["keyDown"], exportAs: ["fdListItem"] }, { kind: "component", type: RadioButtonComponent, selector: "fd-radio-button", inputs: ["ariaLabel", "ariaLabelledBy", "ariaDescribedBy", "title", "tabIndex", "state", "disabled", "readOnly", "selectedValue", "name", "id", "value", "required", "standalone", "wrapLabel", "valignLabel"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: ListTitleDirective, selector: "[fd-list-title], [fdListTitle]", inputs: ["wrap", "truncate", "scope"] }, { kind: "pipe", type: FdTranslatePipe, name: "fdTranslate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
2358
2361
  }
2359
2362
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: FilterSingleSelectComponent, decorators: [{
2360
2363
  type: Component,
2361
- args: [{ selector: 'fdp-filter-single-select', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, imports: [ListComponent$1, ListItemComponent, RadioButtonComponent, FormsModule, ListTitleDirective, FdTranslatePipe], template: "<ul fd-list [selection]=\"true\">\n <li fd-list-item [selected]=\"_value === NOT_FILTERED_OPTION_VALUE\">\n <fd-radio-button\n name=\"sort-by\"\n [value]=\"NOT_FILTERED_OPTION_VALUE\"\n state=\"default\"\n [ngModel]=\"_value\"\n (ngModelChange)=\"_onValueChange($event)\"\n ></fd-radio-button>\n <span fd-list-title>{{ ('platformTable.filterDialogNotFilteredLabel' | fdTranslate)() }}</span>\n </li>\n @for (option of options; track option) {\n <li fd-list-item [selected]=\"option.value === _value\">\n <fd-radio-button\n [ngModel]=\"_value\"\n (ngModelChange)=\"_onValueChange($event)\"\n [value]=\"option.value\"\n name=\"filtering-settings-single-select\"\n ></fd-radio-button>\n <span fd-list-title>{{ option.label }}</span>\n </li>\n }\n</ul>\n" }]
2364
+ args: [{ selector: 'fdp-filter-single-select', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, imports: [ListComponent$1, ListItemComponent, RadioButtonComponent, FormsModule, ListTitleDirective, FdTranslatePipe], template: "<ul fd-list [selection]=\"true\">\n <li fd-list-item [selected]=\"_value === NOT_FILTERED_OPTION_VALUE\">\n <fd-radio-button\n name=\"sort-by\"\n [value]=\"NOT_FILTERED_OPTION_VALUE\"\n state=\"default\"\n [ngModel]=\"_value\"\n (ngModelChange)=\"_onValueChange($event)\"\n ></fd-radio-button>\n <span fd-list-title>{{ ('platformTable.filterDialogNotFilteredLabel' | fdTranslate)() }}</span>\n </li>\n @for (option of options; track option) {\n <li\n fd-list-item\n [selected]=\"option.value === _value\"\n [attr.aria-label]=\"\n ('platformTable.filterDialogFilterByLabel' | fdTranslate: { filterLabel: option.label })()\n \"\n >\n <fd-radio-button\n [ngModel]=\"_value\"\n (ngModelChange)=\"_onValueChange($event)\"\n [value]=\"option.value\"\n name=\"filtering-settings-single-select\"\n ></fd-radio-button>\n <span fd-list-title>{{ option.label }}</span>\n </li>\n }\n</ul>\n" }]
2362
2365
  }], propDecorators: { options: [{
2363
2366
  type: Input
2364
2367
  }], filterBy: [{
@@ -2447,7 +2450,7 @@ class FiltersListStepComponent {
2447
2450
  this.selectFilter = new EventEmitter();
2448
2451
  }
2449
2452
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: FiltersListStepComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
2450
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.5", type: FiltersListStepComponent, isStandalone: true, selector: "fdp-filters-list-step", inputs: { filters: "filters", headingLevel: "headingLevel" }, outputs: { selectFilter: "selectFilter" }, providers: [{ provide: FILTERS_VIEW_STEP_TOKEN, useExisting: forwardRef(() => FiltersListStepComponent) }], viewQueries: [{ propertyName: "titleTemplateRef", first: true, predicate: ["titleTemplate"], descendants: true }, { propertyName: "bodyTemplateRef", first: true, predicate: ["bodyTemplate"], descendants: true }], ngImport: i0, template: "<ng-template #titleTemplate>\n <span role=\"heading\" [attr.aria-level]=\"headingLevel\" fd-title [headerSize]=\"4\">{{\n ('platformTable.filterDialogFilterTitle' | fdTranslate)()\n }}</span>\n</ng-template>\n\n<ng-template #bodyTemplate>\n <div fd-list-group-header>\n <span fd-list-title id=\"platformTableInternalFilterListGroupHeader\">\n {{ ('platformTable.filterDialogFilterBy' | fdTranslate)() }}\n </span>\n </div>\n <ul fd-list aria-labelledby=\"platformTableInternalFilterListGroupHeader\" [navigationIndicator]=\"true\">\n @for (filter of filters; track filter) {\n <li\n fd-list-item\n [interactive]=\"true\"\n (click)=\"selectFilter.emit(filter)\"\n (keydown.space)=\"selectFilter.emit(filter)\"\n (keydown.enter)=\"selectFilter.emit(filter)\"\n >\n <a fd-list-link [navigationIndicator]=\"true\">\n <span fd-list-title>{{ filter.label }}</span>\n </a>\n </li>\n }\n </ul>\n</ng-template>\n", dependencies: [{ kind: "component", type: TitleComponent, selector: "[fd-title], [fdTitle]", inputs: ["twoLineClamp", "headerSize", "wrap"], exportAs: ["fd-title"] }, { kind: "component", type: ListComponent$1, selector: "[fd-list], [fdList]", inputs: ["dropdownMode", "multiInputMode", "mobileMode", "hasMessage", "noBorder", "navigationIndicator", "selection", "keyboardSupport", "byline", "subline", "theme", "unreadIndicator", "role", "settingsList", "settingsListFooter", "searchResultsList"], outputs: ["focusEscapeList"] }, { kind: "directive", type: ListGroupHeaderDirective, selector: "[fdListGroupHeader], [fd-list-group-header]", inputs: ["nativeElementId"], outputs: ["keyDown"] }, { kind: "component", type: ListItemComponent, selector: "[fdListItem] ,[fd-list-item]", inputs: ["selected", "noData", "action", "interactive", "growing", "counter", "counterRole", "counterAriaLabel", "active", "unread", "byline", "ariaRole", "id", "preventClick", "settingsListTpl", "suggestion"], outputs: ["keyDown"], exportAs: ["fdListItem"] }, { kind: "directive", type: ListLinkDirective, selector: "[fd-list-link], [fdListLink]", inputs: ["navigationIndicator", "navigated", "focusable"] }, { kind: "directive", type: ListTitleDirective, selector: "[fd-list-title], [fdListTitle]", inputs: ["wrap", "truncate", "scope"] }, { kind: "pipe", type: FdTranslatePipe, name: "fdTranslate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
2453
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.5", type: FiltersListStepComponent, isStandalone: true, selector: "fdp-filters-list-step", inputs: { filters: "filters", headingLevel: "headingLevel" }, outputs: { selectFilter: "selectFilter" }, providers: [{ provide: FILTERS_VIEW_STEP_TOKEN, useExisting: forwardRef(() => FiltersListStepComponent) }], viewQueries: [{ propertyName: "titleTemplateRef", first: true, predicate: ["titleTemplate"], descendants: true }, { propertyName: "bodyTemplateRef", first: true, predicate: ["bodyTemplate"], descendants: true }], ngImport: i0, template: "<ng-template #titleTemplate>\n <span role=\"heading\" [attr.aria-level]=\"headingLevel\" fd-title [headerSize]=\"4\">{{\n ('platformTable.filterDialogFilterTitle' | fdTranslate)()\n }}</span>\n</ng-template>\n\n<ng-template #bodyTemplate>\n <div fd-list-group-header>\n <span fd-list-title id=\"platformTableInternalFilterListGroupHeader\">\n {{ ('platformTable.filterDialogFilterBy' | fdTranslate)() }}\n </span>\n </div>\n <ul fd-list aria-labelledby=\"platformTableInternalFilterListGroupHeader\" [navigationIndicator]=\"true\">\n @for (filter of filters; track filter) {\n <li\n fd-list-item\n [interactive]=\"true\"\n (click)=\"selectFilter.emit(filter)\"\n (keydown.space)=\"selectFilter.emit(filter)\"\n (keydown.enter)=\"selectFilter.emit(filter)\"\n aria-expanded=\"false\"\n >\n <a fd-list-link [navigationIndicator]=\"true\">\n <span fd-list-title>{{ filter.label }}</span>\n </a>\n </li>\n }\n </ul>\n</ng-template>\n", dependencies: [{ kind: "component", type: TitleComponent, selector: "[fd-title], [fdTitle]", inputs: ["twoLineClamp", "headerSize", "wrap"], exportAs: ["fd-title"] }, { kind: "component", type: ListComponent$1, selector: "[fd-list], [fdList]", inputs: ["dropdownMode", "multiInputMode", "mobileMode", "hasMessage", "noBorder", "navigationIndicator", "selection", "keyboardSupport", "byline", "subline", "theme", "unreadIndicator", "role", "settingsList", "settingsListFooter", "searchResultsList"], outputs: ["focusEscapeList"] }, { kind: "directive", type: ListGroupHeaderDirective, selector: "[fdListGroupHeader], [fd-list-group-header]", inputs: ["nativeElementId"], outputs: ["keyDown"] }, { kind: "component", type: ListItemComponent, selector: "[fdListItem] ,[fd-list-item]", inputs: ["selected", "noData", "action", "interactive", "growing", "counter", "counterRole", "counterAriaLabel", "active", "unread", "byline", "ariaRole", "id", "preventClick", "settingsListTpl", "suggestion"], outputs: ["keyDown"], exportAs: ["fdListItem"] }, { kind: "directive", type: ListLinkDirective, selector: "[fd-list-link], [fdListLink]", inputs: ["navigationIndicator", "navigated", "focusable"] }, { kind: "directive", type: ListTitleDirective, selector: "[fd-list-title], [fdListTitle]", inputs: ["wrap", "truncate", "scope"] }, { kind: "pipe", type: FdTranslatePipe, name: "fdTranslate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
2451
2454
  }
2452
2455
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: FiltersListStepComponent, decorators: [{
2453
2456
  type: Component,
@@ -2459,7 +2462,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
2459
2462
  ListLinkDirective,
2460
2463
  ListTitleDirective,
2461
2464
  FdTranslatePipe
2462
- ], template: "<ng-template #titleTemplate>\n <span role=\"heading\" [attr.aria-level]=\"headingLevel\" fd-title [headerSize]=\"4\">{{\n ('platformTable.filterDialogFilterTitle' | fdTranslate)()\n }}</span>\n</ng-template>\n\n<ng-template #bodyTemplate>\n <div fd-list-group-header>\n <span fd-list-title id=\"platformTableInternalFilterListGroupHeader\">\n {{ ('platformTable.filterDialogFilterBy' | fdTranslate)() }}\n </span>\n </div>\n <ul fd-list aria-labelledby=\"platformTableInternalFilterListGroupHeader\" [navigationIndicator]=\"true\">\n @for (filter of filters; track filter) {\n <li\n fd-list-item\n [interactive]=\"true\"\n (click)=\"selectFilter.emit(filter)\"\n (keydown.space)=\"selectFilter.emit(filter)\"\n (keydown.enter)=\"selectFilter.emit(filter)\"\n >\n <a fd-list-link [navigationIndicator]=\"true\">\n <span fd-list-title>{{ filter.label }}</span>\n </a>\n </li>\n }\n </ul>\n</ng-template>\n" }]
2465
+ ], template: "<ng-template #titleTemplate>\n <span role=\"heading\" [attr.aria-level]=\"headingLevel\" fd-title [headerSize]=\"4\">{{\n ('platformTable.filterDialogFilterTitle' | fdTranslate)()\n }}</span>\n</ng-template>\n\n<ng-template #bodyTemplate>\n <div fd-list-group-header>\n <span fd-list-title id=\"platformTableInternalFilterListGroupHeader\">\n {{ ('platformTable.filterDialogFilterBy' | fdTranslate)() }}\n </span>\n </div>\n <ul fd-list aria-labelledby=\"platformTableInternalFilterListGroupHeader\" [navigationIndicator]=\"true\">\n @for (filter of filters; track filter) {\n <li\n fd-list-item\n [interactive]=\"true\"\n (click)=\"selectFilter.emit(filter)\"\n (keydown.space)=\"selectFilter.emit(filter)\"\n (keydown.enter)=\"selectFilter.emit(filter)\"\n aria-expanded=\"false\"\n >\n <a fd-list-link [navigationIndicator]=\"true\">\n <span fd-list-title>{{ filter.label }}</span>\n </a>\n </li>\n }\n </ul>\n</ng-template>\n" }]
2463
2466
  }], propDecorators: { filters: [{
2464
2467
  type: Input
2465
2468
  }], headingLevel: [{
@@ -2706,6 +2709,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
2706
2709
  let sortOrderHeaderUniqueId = 0;
2707
2710
  let sortDialogSortByHeaderUniqueId = 0;
2708
2711
  class SortingComponent {
2712
+ /** @hidden */
2709
2713
  constructor() {
2710
2714
  /** Input data for sorting */
2711
2715
  this.sortingData = input(/* @ts-ignore */
@@ -2715,12 +2719,42 @@ class SortingComponent {
2715
2719
  ...(ngDevMode ? [undefined, { debugName: "initialSorting" }] : /* istanbul ignore next */ []));
2716
2720
  /** Event emitter for sort changes */
2717
2721
  this.sortChange = output();
2718
- /** Current selected sorting direction - resets when sortingData changes */
2719
- this.direction = linkedSignal(() => this.sortingData()?.direction ?? INITIAL_DIRECTION, /* @ts-ignore */
2720
- ...(ngDevMode ? [{ debugName: "direction" }] : /* istanbul ignore next */ []));
2721
- /** Current selected sorting field - resets when sortingData changes */
2722
- this.field = linkedSignal(() => this.sortingData()?.field ?? NOT_SORTED_OPTION_VALUE, /* @ts-ignore */
2723
- ...(ngDevMode ? [{ debugName: "field" }] : /* istanbul ignore next */ []));
2722
+ /** Event emitter for reset availability changes */
2723
+ this.resetAvailabilityChange = outputFromObservable(toObservable(computed(() => {
2724
+ const initial = this.initialSorting();
2725
+ if (!initial) {
2726
+ return false;
2727
+ }
2728
+ // Get current sort criteria (only those with fields selected)
2729
+ const currentCriteria = this.sortCriteriaList().filter((c) => c.field !== null);
2730
+ // Build initial criteria array for comparison
2731
+ const initialCriteria = initial.field !== null ? [{ field: initial.field, direction: initial.direction }] : [];
2732
+ // Reset is available if:
2733
+ // 1. Number of sort criteria changed
2734
+ // 2. Any criteria field/direction differs from initial
2735
+ // 3. Combobox has invalid text
2736
+ if (currentCriteria.length !== initialCriteria.length) {
2737
+ return true;
2738
+ }
2739
+ for (let i = 0; i < currentCriteria.length; i++) {
2740
+ if (currentCriteria[i].field !== initialCriteria[i]?.field ||
2741
+ currentCriteria[i].direction !== initialCriteria[i]?.direction) {
2742
+ return true;
2743
+ }
2744
+ }
2745
+ return this._hasInvalidComboboxText();
2746
+ })).pipe(distinctUntilChanged()));
2747
+ /** Event emitter for validity changes */
2748
+ this.validityChange = outputFromObservable(toObservable(computed(() => {
2749
+ const invalidMap = this._invalidInputPerRow();
2750
+ // Valid if no rows have invalid input
2751
+ for (const isInvalid of invalidMap.values()) {
2752
+ if (isInvalid) {
2753
+ return false;
2754
+ }
2755
+ }
2756
+ return true;
2757
+ })).pipe(distinctUntilChanged()));
2724
2758
  /** @hidden */
2725
2759
  this.sortOrderHeaderId = `fdp-table-sort-order-header-${sortOrderHeaderUniqueId++}`;
2726
2760
  /** @hidden */
@@ -2735,40 +2769,450 @@ class SortingComponent {
2735
2769
  /** Available table columns for sorting */
2736
2770
  this.columns = computed(() => this.sortingData()?.columns ?? [], /* @ts-ignore */
2737
2771
  ...(ngDevMode ? [{ debugName: "columns" }] : /* istanbul ignore next */ []));
2738
- /** Event emitter for reset availability changes */
2739
- this.resetAvailabilityChange = outputFromObservable(toObservable(computed(() => {
2740
- const initial = this.initialSorting();
2741
- if (!initial) {
2742
- return false;
2772
+ /** @hidden Computed signal that checks if any row has invalid input */
2773
+ this.isValid = computed(() => {
2774
+ const invalidMap = this._invalidInputPerRow();
2775
+ // Valid if no rows have invalid input
2776
+ for (const isInvalid of invalidMap.values()) {
2777
+ if (isInvalid) {
2778
+ return false;
2779
+ }
2743
2780
  }
2744
- return this.direction() !== initial.direction || this.field() !== initial.field;
2745
- })).pipe(distinctUntilChanged()));
2781
+ return true;
2782
+ }, /* @ts-ignore */
2783
+ ...(ngDevMode ? [{ debugName: "isValid" }] : /* istanbul ignore next */ []));
2784
+ /** @hidden Computed signal that returns the currently selected column object */
2785
+ this.selectedColumn = computed(() => {
2786
+ const currentField = this.firstSortingField();
2787
+ return this.columns().find((col) => col.key === currentField) ?? null;
2788
+ }, /* @ts-ignore */
2789
+ ...(ngDevMode ? [{ debugName: "selectedColumn" }] : /* istanbul ignore next */ []));
2790
+ /**
2791
+ * @hidden
2792
+ * Computed signal that returns available columns for each row.
2793
+ * Columns selected in other rows are filtered out.
2794
+ */
2795
+ this.availableColumnsPerRow = computed(() => {
2796
+ const allColumns = this.columns();
2797
+ const criteriaList = this.sortCriteriaList();
2798
+ return criteriaList.map((_, rowIndex) => {
2799
+ // Collect fields selected in OTHER rows
2800
+ const selectedFieldsInOtherRows = new Set(criteriaList.filter((c, index) => index !== rowIndex && c.field !== null).map((c) => c.field));
2801
+ // Return columns not selected in other rows
2802
+ return allColumns.filter((col) => !selectedFieldsInOtherRows.has(col.key));
2803
+ });
2804
+ }, /* @ts-ignore */
2805
+ ...(ngDevMode ? [{ debugName: "availableColumnsPerRow" }] : /* istanbul ignore next */ []));
2806
+ /**
2807
+ * @hidden
2808
+ * Computed signal that returns the selected column object for each row.
2809
+ */
2810
+ this.selectedColumnsPerRow = computed(() => {
2811
+ const allColumns = this.columns();
2812
+ const criteriaList = this.sortCriteriaList();
2813
+ return criteriaList.map((criteria) => {
2814
+ if (!criteria.field) {
2815
+ return null;
2816
+ }
2817
+ return allColumns.find((col) => col.key === criteria.field) ?? null;
2818
+ });
2819
+ }, /* @ts-ignore */
2820
+ ...(ngDevMode ? [{ debugName: "selectedColumnsPerRow" }] : /* istanbul ignore next */ []));
2821
+ /**
2822
+ * @hidden
2823
+ * Computed signal that returns the direction for each row.
2824
+ */
2825
+ this.directionsPerRow = computed(() => this.sortCriteriaList().map((criteria) => criteria.direction ?? INITIAL_DIRECTION), /* @ts-ignore */
2826
+ ...(ngDevMode ? [{ debugName: "directionsPerRow" }] : /* istanbul ignore next */ []));
2827
+ /**
2828
+ * @hidden
2829
+ * Computed signal that returns the form state ('error' or undefined) for each row.
2830
+ */
2831
+ this.rowStates = computed(() => {
2832
+ const invalidMap = this._invalidInputPerRow();
2833
+ return this.sortCriteriaList().map((_, index) => (invalidMap.get(index) ? 'error' : undefined));
2834
+ }, /* @ts-ignore */
2835
+ ...(ngDevMode ? [{ debugName: "rowStates" }] : /* istanbul ignore next */ []));
2836
+ /**
2837
+ * @hidden
2838
+ * Computed signal that returns visibility for each row.
2839
+ * First row is always visible, subsequent rows visible only if previous has selection.
2840
+ */
2841
+ this.rowVisibility = computed(() => {
2842
+ const criteriaList = this.sortCriteriaList();
2843
+ return criteriaList.map((_, index) => {
2844
+ if (index === 0) {
2845
+ return true;
2846
+ }
2847
+ return criteriaList[index - 1]?.field !== null;
2848
+ });
2849
+ }, /* @ts-ignore */
2850
+ ...(ngDevMode ? [{ debugName: "rowVisibility" }] : /* istanbul ignore next */ []));
2851
+ /**
2852
+ * @hidden
2853
+ * Computed signal that returns whether each row can be moved up.
2854
+ */
2855
+ this.canMoveUpPerRow = computed(() => {
2856
+ const criteriaList = this.sortCriteriaList();
2857
+ return criteriaList.map((criteria, index) => {
2858
+ if (index === 0) {
2859
+ return false;
2860
+ }
2861
+ return criteria.field !== null;
2862
+ });
2863
+ }, /* @ts-ignore */
2864
+ ...(ngDevMode ? [{ debugName: "canMoveUpPerRow" }] : /* istanbul ignore next */ []));
2865
+ /**
2866
+ * @hidden
2867
+ * Computed signal that returns whether each row can be moved down.
2868
+ */
2869
+ this.canMoveDownPerRow = computed(() => {
2870
+ const criteriaList = this.sortCriteriaList();
2871
+ return criteriaList.map((criteria, index) => {
2872
+ const nextRow = criteriaList[index + 1];
2873
+ // Can't move down if current row has no selection
2874
+ if (criteria.field === null) {
2875
+ return false;
2876
+ }
2877
+ // Can't move down if next row doesn't exist or has no selection
2878
+ return nextRow !== undefined && nextRow.field !== null;
2879
+ });
2880
+ }, /* @ts-ignore */
2881
+ ...(ngDevMode ? [{ debugName: "canMoveDownPerRow" }] : /* istanbul ignore next */ []));
2882
+ /**
2883
+ * @hidden
2884
+ * Computed signal that returns whether each row can be deleted.
2885
+ */
2886
+ this.canDeletePerRow = computed(() => this.sortCriteriaList().map((criteria) => criteria.field !== null), /* @ts-ignore */
2887
+ ...(ngDevMode ? [{ debugName: "canDeletePerRow" }] : /* istanbul ignore next */ []));
2888
+ /** Current selected sorting direction - derived from first sortBy entry */
2889
+ this.direction = linkedSignal(() => this.sortingData()?.sortBy?.[0]?.direction ?? INITIAL_DIRECTION, /* @ts-ignore */
2890
+ ...(ngDevMode ? [{ debugName: "direction" }] : /* istanbul ignore next */ []));
2891
+ /** Current selected sorting field - derived from first sortBy entry */
2892
+ this.firstSortingField = linkedSignal(() => this.sortingData()?.sortBy?.[0]?.field ?? NOT_SORTED_OPTION_VALUE, /* @ts-ignore */
2893
+ ...(ngDevMode ? [{ debugName: "firstSortingField" }] : /* istanbul ignore next */ []));
2894
+ /**
2895
+ * @hidden
2896
+ * Array of sort criteria rows. Each row has a field and direction.
2897
+ * linkedSignal resets when sortBy reference changes (e.g., on reset),
2898
+ * but allows local modifications via .set()/.update().
2899
+ */
2900
+ this.sortCriteriaList = linkedSignal(() => {
2901
+ // Only track sortBy reference changes, not all sortingData changes
2902
+ const sortBy = this._sortByRef() ?? [];
2903
+ // Use untracked for columns since we don't want column changes to reset the list
2904
+ const columns = untracked(() => this.sortingData()?.columns ?? []);
2905
+ return columns.map((_, index) => {
2906
+ const existingCriteria = sortBy[index];
2907
+ if (existingCriteria) {
2908
+ return {
2909
+ field: existingCriteria.field,
2910
+ direction: existingCriteria.direction
2911
+ };
2912
+ }
2913
+ return { field: null, direction: INITIAL_DIRECTION };
2914
+ });
2915
+ }, /* @ts-ignore */
2916
+ ...(ngDevMode ? [{ debugName: "sortCriteriaList" }] : /* istanbul ignore next */ []));
2917
+ /**
2918
+ * @hidden
2919
+ * Extracts the sortBy array reference from sortingData.
2920
+ * Used as the source for linkedSignal to track only sortBy reference changes.
2921
+ */
2922
+ this._sortByRef = computed(() => this.sortingData()?.sortBy, /* @ts-ignore */
2923
+ ...(ngDevMode ? [{ debugName: "_sortByRef" }] : /* istanbul ignore next */ []));
2924
+ /**
2925
+ * @hidden
2926
+ * Tracks invalid input text per row (non-empty text that doesn't match any column).
2927
+ * Resets to empty Map when sortBy reference changes.
2928
+ */
2929
+ this._invalidInputPerRow = linkedSignal(() => {
2930
+ // Only track sortBy reference changes
2931
+ this._sortByRef();
2932
+ return new Map();
2933
+ }, /* @ts-ignore */
2934
+ ...(ngDevMode ? [{ debugName: "_invalidInputPerRow" }] : /* istanbul ignore next */ []));
2935
+ /**
2936
+ * @hidden
2937
+ * Computed signal that checks if any row has invalid combobox text.
2938
+ * Used by resetAvailabilityChange to determine if reset should be available.
2939
+ */
2940
+ this._hasInvalidComboboxText = computed(() => {
2941
+ const invalidMap = this._invalidInputPerRow();
2942
+ for (const isInvalid of invalidMap.values()) {
2943
+ if (isInvalid) {
2944
+ return true;
2945
+ }
2946
+ }
2947
+ return false;
2948
+ }, /* @ts-ignore */
2949
+ ...(ngDevMode ? [{ debugName: "_hasInvalidComboboxText" }] : /* istanbul ignore next */ []));
2950
+ /** @hidden Reference to the comboboxes for programmatic reset */
2951
+ this._comboboxes = viewChildren('sortCombobox', /* @ts-ignore */
2952
+ ...(ngDevMode ? [{ debugName: "_comboboxes" }] : /* istanbul ignore next */ []));
2953
+ // DOM side effect: sync combobox display text when sortBy reference changes.
2954
+ // This is needed because when user types invalid text and reset happens,
2955
+ // the model value might not change but the display text needs to update.
2956
+ effect(() => {
2957
+ const sortBy = this._sortByRef();
2958
+ // Only sync when reference changes (not on every sortingData update)
2959
+ if (sortBy !== this._previousSortByRef) {
2960
+ this._previousSortByRef = sortBy;
2961
+ // Use untracked to avoid creating additional dependencies
2962
+ untracked(() => this._syncComboboxDisplayText());
2963
+ }
2964
+ });
2746
2965
  }
2747
2966
  /**
2748
- * Handle sort direction changes.
2749
- * @param direction New sorting direction.
2967
+ * Get available columns for a specific sort criteria row.
2968
+ * Excludes columns that are already selected in other rows.
2969
+ * @param rowIndex Index of the current row.
2970
+ * @returns Array of columns available for selection.
2750
2971
  */
2751
- _sortDirectionChange(direction) {
2752
- this.direction.set(direction);
2972
+ getAvailableColumns(rowIndex) {
2973
+ return this.availableColumnsPerRow()[rowIndex] ?? [];
2974
+ }
2975
+ /**
2976
+ * Get the selected column object for a specific row.
2977
+ * @param rowIndex Index of the row.
2978
+ * @returns The selected column object or null.
2979
+ */
2980
+ getSelectedColumnForRow(rowIndex) {
2981
+ return this.selectedColumnsPerRow()[rowIndex] ?? null;
2982
+ }
2983
+ /**
2984
+ * Get the direction for a specific row.
2985
+ * @param rowIndex Index of the row.
2986
+ * @returns The sort direction.
2987
+ */
2988
+ getDirectionForRow(rowIndex) {
2989
+ return this.directionsPerRow()[rowIndex] ?? INITIAL_DIRECTION;
2990
+ }
2991
+ /**
2992
+ * Get the form state for a specific row's combobox.
2993
+ * Returns 'error' if the row has invalid input, undefined otherwise.
2994
+ * @param rowIndex Index of the row.
2995
+ * @returns The form state or undefined.
2996
+ */
2997
+ getRowState(rowIndex) {
2998
+ return this.rowStates()[rowIndex];
2999
+ }
3000
+ /**
3001
+ * Determine if a row should be visible.
3002
+ * The first row is always visible. Subsequent rows are only visible
3003
+ * if the previous row has a column selected.
3004
+ * @param rowIndex Index of the row.
3005
+ * @returns True if the row should be visible.
3006
+ */
3007
+ isRowVisible(rowIndex) {
3008
+ return this.rowVisibility()[rowIndex] ?? false;
3009
+ }
3010
+ /**
3011
+ * Check if a row can be moved up.
3012
+ * A row can move up if it's not the first row and has a field selected.
3013
+ * @param rowIndex Index of the row.
3014
+ * @returns True if the row can be moved up.
3015
+ */
3016
+ canMoveUp(rowIndex) {
3017
+ return this.canMoveUpPerRow()[rowIndex] ?? false;
3018
+ }
3019
+ /**
3020
+ * Check if a row can be moved down.
3021
+ * A row can move down if there's a visible row below it with a field selected.
3022
+ * @param rowIndex Index of the row.
3023
+ * @returns True if the row can be moved down.
3024
+ */
3025
+ canMoveDown(rowIndex) {
3026
+ return this.canMoveDownPerRow()[rowIndex] ?? false;
3027
+ }
3028
+ /**
3029
+ * Check if a row can be deleted (cleared).
3030
+ * A row can be deleted if it has a field selected.
3031
+ * @param rowIndex Index of the row.
3032
+ * @returns True if the row can be deleted.
3033
+ */
3034
+ canDelete(rowIndex) {
3035
+ return this.canDeletePerRow()[rowIndex] ?? false;
3036
+ }
3037
+ /**
3038
+ * Move a sort criteria row up (swap with the row above).
3039
+ * @param rowIndex Index of the row to move up.
3040
+ */
3041
+ moveUp(rowIndex) {
3042
+ if (!this.canMoveUpPerRow()[rowIndex]) {
3043
+ return;
3044
+ }
3045
+ this.sortCriteriaList.update((list) => {
3046
+ const newList = [...list];
3047
+ // Swap with the row above
3048
+ [newList[rowIndex - 1], newList[rowIndex]] = [newList[rowIndex], newList[rowIndex - 1]];
3049
+ return newList;
3050
+ });
3051
+ this._syncMainFieldAndDirection();
2753
3052
  this._onModelChange();
2754
3053
  }
2755
3054
  /**
2756
- * Handle sort field changes.
2757
- * @param field New sorting field.
3055
+ * Move a sort criteria row down (swap with the row below).
3056
+ * @param rowIndex Index of the row to move down.
2758
3057
  */
2759
- _sortFieldChange(field) {
2760
- this.field.set(field);
3058
+ moveDown(rowIndex) {
3059
+ if (!this.canMoveDownPerRow()[rowIndex]) {
3060
+ return;
3061
+ }
3062
+ this.sortCriteriaList.update((list) => {
3063
+ const newList = [...list];
3064
+ // Swap with the row below
3065
+ [newList[rowIndex], newList[rowIndex + 1]] = [newList[rowIndex + 1], newList[rowIndex]];
3066
+ return newList;
3067
+ });
3068
+ this._syncMainFieldAndDirection();
3069
+ this._onModelChange();
3070
+ }
3071
+ /**
3072
+ * Delete (clear) a sort criteria row.
3073
+ * This removes the field selection and shifts remaining criteria up.
3074
+ * @param rowIndex Index of the row to delete.
3075
+ */
3076
+ deleteRow(rowIndex) {
3077
+ if (!this.canDeletePerRow()[rowIndex]) {
3078
+ return;
3079
+ }
3080
+ this.sortCriteriaList.update((list) => {
3081
+ const newList = [...list];
3082
+ // Remove the criteria at this index and add an empty one at the end
3083
+ newList.splice(rowIndex, 1);
3084
+ newList.push({ field: null, direction: INITIAL_DIRECTION });
3085
+ return newList;
3086
+ });
3087
+ this._syncMainFieldAndDirection();
3088
+ this._onModelChange();
3089
+ }
3090
+ /**
3091
+ * Handle sort direction changes for a specific row.
3092
+ * @param rowIndex Index of the row.
3093
+ * @param direction New sorting direction.
3094
+ */
3095
+ _sortDirectionChangeForRow(rowIndex, direction) {
3096
+ this.sortCriteriaList.update((list) => {
3097
+ const newList = [...list];
3098
+ newList[rowIndex] = { ...newList[rowIndex], direction };
3099
+ return newList;
3100
+ });
3101
+ // Update the main direction if this is the first row (for backward compatibility)
3102
+ if (rowIndex === 0) {
3103
+ this.direction.set(direction);
3104
+ }
3105
+ // Always emit changes for multi-column sorting
2761
3106
  this._onModelChange();
2762
3107
  }
3108
+ /**
3109
+ * Handle sort field changes for a specific row.
3110
+ * @param rowIndex Index of the row.
3111
+ * @param column Selected column object or string.
3112
+ */
3113
+ _sortFieldChangeForRow(rowIndex, column) {
3114
+ let fieldKey = null;
3115
+ let shouldUpdate = true;
3116
+ let isInvalid = false;
3117
+ if (typeof column === 'string') {
3118
+ if (column === '') {
3119
+ // Empty string - clear any error state and don't update selection
3120
+ // This can happen when combobox re-renders and emits empty value
3121
+ shouldUpdate = false;
3122
+ isInvalid = false;
3123
+ }
3124
+ else {
3125
+ const matchingColumn = this.columns().find((col) => col.label === column);
3126
+ fieldKey = matchingColumn?.key ?? null;
3127
+ // Check if any column label starts with the typed text (case-insensitive)
3128
+ // This handles the case where user is still typing and autocomplete is showing suggestions
3129
+ const hasPartialMatch = this.columns().some((col) => col.label.toLowerCase().startsWith(column.toLowerCase()));
3130
+ // Mark as invalid only if text doesn't match any column AND no partial matches exist
3131
+ isInvalid = matchingColumn === undefined && !hasPartialMatch;
3132
+ // Only update if we found a matching column
3133
+ shouldUpdate = matchingColumn !== undefined;
3134
+ }
3135
+ }
3136
+ else if (column) {
3137
+ fieldKey = column.key;
3138
+ isInvalid = false;
3139
+ }
3140
+ else {
3141
+ // null/undefined column - don't clear existing selection
3142
+ // This can happen when combobox re-renders
3143
+ shouldUpdate = false;
3144
+ isInvalid = false;
3145
+ }
3146
+ // Update invalid state for this row
3147
+ this._invalidInputPerRow.update((map) => {
3148
+ const newMap = new Map(map);
3149
+ if (isInvalid) {
3150
+ newMap.set(rowIndex, true);
3151
+ }
3152
+ else {
3153
+ newMap.delete(rowIndex);
3154
+ }
3155
+ return newMap;
3156
+ });
3157
+ if (shouldUpdate) {
3158
+ this.sortCriteriaList.update((list) => {
3159
+ const newList = [...list];
3160
+ newList[rowIndex] = { ...newList[rowIndex], field: fieldKey };
3161
+ return newList;
3162
+ });
3163
+ // Update the main field if this is the first row (for backward compatibility)
3164
+ if (rowIndex === 0 && fieldKey !== null) {
3165
+ this.firstSortingField.set(fieldKey);
3166
+ }
3167
+ // Always emit changes for multi-column sorting
3168
+ this._onModelChange();
3169
+ }
3170
+ }
3171
+ /** @hidden */
3172
+ displayColumn(column) {
3173
+ return column?.label ?? '';
3174
+ }
3175
+ /**
3176
+ * Sync the main field and direction signals with the first row's values.
3177
+ * Used after move/delete operations to keep backward compatibility.
3178
+ * @hidden
3179
+ */
3180
+ _syncMainFieldAndDirection() {
3181
+ const firstCriteria = this.sortCriteriaList()[0];
3182
+ if (firstCriteria) {
3183
+ this.firstSortingField.set(firstCriteria.field);
3184
+ this.direction.set(firstCriteria.direction);
3185
+ }
3186
+ }
2763
3187
  /**
2764
3188
  * Emit changes to the model.
2765
3189
  * @hidden
2766
3190
  */
2767
3191
  _onModelChange() {
2768
- this.sortChange.emit({ direction: this.direction(), field: this.field() });
3192
+ // Build array of all sort criteria that have a field selected
3193
+ const sortBy = this.sortCriteriaList()
3194
+ .filter((criteria) => criteria.field !== null)
3195
+ .map((criteria) => ({
3196
+ field: criteria.field,
3197
+ direction: criteria.direction
3198
+ }));
3199
+ this.sortChange.emit({ sortBy });
3200
+ }
3201
+ /**
3202
+ * Sync combobox display text with the current selected column.
3203
+ * This is a DOM side effect needed when reset happens and the combobox has invalid text,
3204
+ * because ngModel won't call writeValue if the underlying model value hasn't changed.
3205
+ * @hidden
3206
+ */
3207
+ _syncComboboxDisplayText() {
3208
+ const comboboxes = this._comboboxes();
3209
+ if (comboboxes.length > 0) {
3210
+ const column = this.selectedColumn();
3211
+ comboboxes[0].writeValue(column);
3212
+ }
2769
3213
  }
2770
3214
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: SortingComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
2771
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.5", type: SortingComponent, isStandalone: true, selector: "fdp-sorting", inputs: { sortingData: { classPropertyName: "sortingData", publicName: "sortingData", isSignal: true, isRequired: false, transformFunction: null }, initialSorting: { classPropertyName: "initialSorting", publicName: "initialSorting", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { sortChange: "sortChange", resetAvailabilityChange: "resetAvailabilityChange" }, ngImport: i0, template: "<fieldset>\n <legend fd-list-group-header>\n <span fd-list-title [attr.id]=\"sortOrderHeaderId\">\n {{ ('platformTable.sortDialogSortOrderHeader' | fdTranslate)() }}\n </span>\n </legend>\n <ul fd-list [selection]=\"true\" [attr.aria-labelledby]=\"sortOrderHeaderId\">\n <li fd-list-item [selected]=\"direction() === SORT_DIRECTION.ASC\">\n <fd-radio-button\n name=\"sort-order\"\n value=\"asc\"\n state=\"default\"\n [ngModel]=\"direction()\"\n (ngModelChange)=\"_sortDirectionChange($event)\"\n ></fd-radio-button>\n <span fd-list-title>{{ ('platformTable.sortDialogSortOrderAsc' | fdTranslate)() }}</span>\n </li>\n <li fd-list-item [selected]=\"direction() === SORT_DIRECTION.DESC\">\n <fd-radio-button\n name=\"sort-order\"\n value=\"desc\"\n state=\"default\"\n [ngModel]=\"direction()\"\n (ngModelChange)=\"_sortDirectionChange($event)\"\n ></fd-radio-button>\n <span fd-list-title>{{ ('platformTable.sortDialogSortOrderDesc' | fdTranslate)() }}</span>\n </li>\n </ul>\n</fieldset>\n\n<fieldset>\n <legend fd-list-group-header>\n <span fd-list-title [attr.id]=\"sortDialogSortByHeaderId\">\n {{ ('platformTable.sortDialogSortByHeader' | fdTranslate)() }}\n </span>\n </legend>\n <ul fd-list [selection]=\"true\" [attr.aria-labelledby]=\"sortDialogSortByHeaderId\">\n @if (allowDisablingSorting()) {\n <li fd-list-item [selected]=\"field() === NOT_SORTED_OPTION_VALUE\">\n <fd-radio-button\n name=\"sort-by\"\n [value]=\"NOT_SORTED_OPTION_VALUE\"\n state=\"default\"\n [ngModel]=\"field()\"\n (ngModelChange)=\"_sortFieldChange($event)\"\n ></fd-radio-button>\n <span fd-list-title>{{ ('platformTable.sortDialogNotSortedLabel' | fdTranslate)() }}</span>\n </li>\n }\n @for (column of columns(); track column) {\n <li fd-list-item [selected]=\"column.key === field()\">\n <fd-radio-button\n name=\"sort-by\"\n [value]=\"column.key\"\n state=\"default\"\n [ngModel]=\"field()\"\n (ngModelChange)=\"_sortFieldChange($event)\"\n ></fd-radio-button>\n <span fd-list-title>{{ column.label }}</span>\n </li>\n }\n </ul>\n</fieldset>\n", dependencies: [{ kind: "component", type: ListComponent$1, selector: "[fd-list], [fdList]", inputs: ["dropdownMode", "multiInputMode", "mobileMode", "hasMessage", "noBorder", "navigationIndicator", "selection", "keyboardSupport", "byline", "subline", "theme", "unreadIndicator", "role", "settingsList", "settingsListFooter", "searchResultsList"], outputs: ["focusEscapeList"] }, { kind: "directive", type: ListGroupHeaderDirective, selector: "[fdListGroupHeader], [fd-list-group-header]", inputs: ["nativeElementId"], outputs: ["keyDown"] }, { kind: "directive", type: ListTitleDirective, selector: "[fd-list-title], [fdListTitle]", inputs: ["wrap", "truncate", "scope"] }, { kind: "component", type: ListItemComponent, selector: "[fdListItem] ,[fd-list-item]", inputs: ["selected", "noData", "action", "interactive", "growing", "counter", "counterRole", "counterAriaLabel", "active", "unread", "byline", "ariaRole", "id", "preventClick", "settingsListTpl", "suggestion"], outputs: ["keyDown"], exportAs: ["fdListItem"] }, { kind: "component", type: RadioButtonComponent, selector: "fd-radio-button", inputs: ["ariaLabel", "ariaLabelledBy", "ariaDescribedBy", "title", "tabIndex", "state", "disabled", "readOnly", "selectedValue", "name", "id", "value", "required", "standalone", "wrapLabel", "valignLabel"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "pipe", type: FdTranslatePipe, name: "fdTranslate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
3215
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.5", type: SortingComponent, isStandalone: true, selector: "fdp-sorting", inputs: { sortingData: { classPropertyName: "sortingData", publicName: "sortingData", isSignal: true, isRequired: false, transformFunction: null }, initialSorting: { classPropertyName: "initialSorting", publicName: "initialSorting", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { sortChange: "sortChange", resetAvailabilityChange: "resetAvailabilityChange", validityChange: "validityChange" }, viewQueries: [{ propertyName: "_comboboxes", predicate: ["sortCombobox"], descendants: true, isSignal: true }], ngImport: i0, template: "<fieldset>\n <ul fd-list>\n @for (criteria of sortCriteriaList(); track $index; let rowIndex = $index) {\n @if (rowVisibility()[rowIndex]) {\n <li fd-list-item class=\"fdp-sorting__row\">\n <div class=\"fd-margin-end--sm\">\n <fd-combobox\n #sortCombobox\n [dropdownValues]=\"availableColumnsPerRow()[rowIndex]\"\n [displayFn]=\"displayColumn\"\n [placeholder]=\"('platformTable.sortDialogSortByHeader' | fdTranslate)()\"\n [state]=\"rowStates()[rowIndex]\"\n [ngModel]=\"selectedColumnsPerRow()[rowIndex]\"\n (ngModelChange)=\"_sortFieldChangeForRow(rowIndex, $event)\"\n >\n </fd-combobox>\n </div>\n\n <div class=\"fd-margin-end--sm\">\n <fd-segmented-button\n [name]=\"'sort-order-' + rowIndex\"\n [ngModel]=\"directionsPerRow()[rowIndex]\"\n (ngModelChange)=\"_sortDirectionChangeForRow(rowIndex, $event)\"\n >\n <button\n fd-button\n glyph=\"sort-ascending\"\n [attr.title]=\"('platformTable.sortDialogSortOrderAsc' | fdTranslate)()\"\n value=\"asc\"\n ></button>\n <button\n fd-button\n glyph=\"sort-descending\"\n [attr.title]=\"('platformTable.sortDialogSortOrderDesc' | fdTranslate)()\"\n value=\"desc\"\n ></button>\n </fd-segmented-button>\n </div>\n\n @if (directionsPerRow()[rowIndex] === 'asc') {\n <span fd-list-title>{{ ('platformTable.sortDialogSortOrderAsc' | fdTranslate)() }}</span>\n }\n\n @if (directionsPerRow()[rowIndex] === 'desc') {\n <span fd-list-title>{{ ('platformTable.sortDialogSortOrderDesc' | fdTranslate)() }}</span>\n }\n\n <span fd-list-secondary class=\"fdp-sorting__actions\">\n <button\n fd-button\n glyph=\"slim-arrow-up\"\n [attr.title]=\"('platformTable.sortDialogMoveUp' | fdTranslate)()\"\n [disabled]=\"!canMoveUpPerRow()[rowIndex]\"\n (click)=\"moveUp(rowIndex)\"\n ></button>\n <button\n fd-button\n glyph=\"slim-arrow-down\"\n [attr.title]=\"('platformTable.sortDialogMoveDown' | fdTranslate)()\"\n [disabled]=\"!canMoveDownPerRow()[rowIndex]\"\n (click)=\"moveDown(rowIndex)\"\n ></button>\n <button\n fd-button\n glyph=\"decline\"\n [attr.title]=\"('platformTable.sortDialogDelete' | fdTranslate)()\"\n [disabled]=\"!canDeletePerRow()[rowIndex]\"\n (click)=\"deleteRow(rowIndex)\"\n ></button>\n </span>\n </li>\n }\n }\n </ul>\n</fieldset>\n", styles: [".fd-margin--tiny{margin-block:.5rem;margin-inline:.5rem}.fd-margin--sm{margin-block:1rem;margin-inline:1rem}.fd-margin--md{margin-block:2rem;margin-inline:2rem}.fd-margin--lg{margin-block:3rem;margin-inline:3rem}.fd-margin--none{margin-block:0;margin-inline:0}.fd-margin-top--tiny{-webkit-margin-before:.5rem;margin-block-start:.5rem}.fd-margin-top--sm{-webkit-margin-before:1rem;margin-block-start:1rem}.fd-margin-top--md{-webkit-margin-before:2rem;margin-block-start:2rem}.fd-margin-top--lg{-webkit-margin-before:3rem;margin-block-start:3rem}.fd-margin-top--none{-webkit-margin-before:0;margin-block-start:0}.fd-margin-end--tiny{-webkit-margin-end:.5rem;margin-inline-end:.5rem}.fd-margin-end--sm{-webkit-margin-end:1rem;margin-inline-end:1rem}.fd-margin-end--md{-webkit-margin-end:2rem;margin-inline-end:2rem}.fd-margin-end--lg{-webkit-margin-end:3rem;margin-inline-end:3rem}.fd-margin-end--none{-webkit-margin-end:0;margin-inline-end:0}.fd-margin-bottom--tiny{-webkit-margin-after:.5rem;margin-block-end:.5rem}.fd-margin-bottom--sm{-webkit-margin-after:1rem;margin-block-end:1rem}.fd-margin-bottom--md{-webkit-margin-after:2rem;margin-block-end:2rem}.fd-margin-bottom--lg{-webkit-margin-after:3rem;margin-block-end:3rem}.fd-margin-bottom--none{-webkit-margin-after:0;margin-block-end:0}.fd-margin-begin--tiny{-webkit-margin-start:.5rem;margin-inline-start:.5rem}.fd-margin-begin--sm{-webkit-margin-start:1rem;margin-inline-start:1rem}.fd-margin-begin--md{-webkit-margin-start:2rem;margin-inline-start:2rem}.fd-margin-begin--lg{-webkit-margin-start:3rem;margin-inline-start:3rem}.fd-margin-begin--none{-webkit-margin-start:0;margin-inline-start:0}.fd-margin-top-bottom--tiny{margin-block:.5rem}.fd-margin-top-bottom--sm{margin-block:1rem}.fd-margin-top-bottom--md{margin-block:2rem}.fd-margin-top-bottom--lg{margin-block:3rem}.fd-margin-begin-end--tiny{margin-inline:.5rem}.fd-margin-begin-end--sm{margin-inline:1rem}.fd-margin-begin-end--md{margin-inline:2rem}.fd-margin-begin-end--lg{margin-inline:3rem}.fd-margin-responsive--sm{margin-block:0 1rem;margin-inline:0}.fd-margin-responsive--md{margin-block:1rem;margin-inline:1rem}.fd-margin-responsive--lg{margin-block:1rem;margin-inline:2rem}.fd-margin-responsive--xl{margin-block:1rem;margin-inline:3rem}.fd-margin-negative-begin-end--tiny{margin-block:0;margin-inline:-.5rem}.fd-margin-negative-begin-end--sm{margin-block:0;margin-inline:-1rem}.fd-margin-negative-begin-end--md{margin-block:0;margin-inline:-2rem}.fd-margin-negative-begin-end--lg{margin-block:0;margin-inline:-3rem}.fdp-sorting__actions{visibility:hidden}.fdp-sorting__row:hover .fdp-sorting__actions,.fdp-sorting__row:focus-within .fdp-sorting__actions{visibility:visible}\n/*! Bundled license information:\n\nfundamental-styles/dist/margins.css:\n (*!\n * Fundamental Library Styles v0.41.8\n * Copyright (c) 2026 SAP SE or an SAP affiliate company.\n * Licensed under Apache License 2.0 (https://github.com/SAP/fundamental-styles/blob/main/LICENSE)\n *)\n*/\n"], dependencies: [{ kind: "component", type: ListComponent$1, selector: "[fd-list], [fdList]", inputs: ["dropdownMode", "multiInputMode", "mobileMode", "hasMessage", "noBorder", "navigationIndicator", "selection", "keyboardSupport", "byline", "subline", "theme", "unreadIndicator", "role", "settingsList", "settingsListFooter", "searchResultsList"], outputs: ["focusEscapeList"] }, { kind: "directive", type: ListTitleDirective, selector: "[fd-list-title], [fdListTitle]", inputs: ["wrap", "truncate", "scope"] }, { kind: "component", type: ListItemComponent, selector: "[fdListItem] ,[fd-list-item]", inputs: ["selected", "noData", "action", "interactive", "growing", "counter", "counterRole", "counterAriaLabel", "active", "unread", "byline", "ariaRole", "id", "preventClick", "settingsListTpl", "suggestion"], outputs: ["keyDown"], exportAs: ["fdListItem"] }, { kind: "directive", type: ListSecondaryDirective, selector: "[fd-list-secondary], [fdListSecondary]", inputs: ["type"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: SegmentedButtonComponent, selector: "fd-segmented-button", inputs: ["toggle", "vertical"] }, { kind: "component", type: ButtonComponent, selector: "button[fd-button], a[fd-button], span[fd-button]", inputs: ["id"], exportAs: ["fd-button"] }, { kind: "component", type: ComboboxComponent, selector: "fd-combobox", inputs: ["comboboxId", "inputId", "ariaLabel", "ariaLabelledBy", "required", "dropdownValues", "filterFn", "disabled", "placeholder", "isSearch", "glyph", "glyphFont", "showClearButton", "triggers", "closeOnOutsideClick", "openOnKeyboardEvent", "state", "itemTemplate", "groupFn", "maxHeight", "dropDownMaxWidthPx", "noDropDownMaxWidth", "width", "searchFn", "highlighting", "closeOnSelect", "fillOnSelect", "autoComplete", "fillControlMode", "communicateByObject", "displayFn", "buttonFocusable", "clearButtonFocusable", "readOnly", "mobile", "mobileConfig", "showDropdownButton", "includes", "title", "byline", "tabOutStrategy", "valueProperty"], outputs: ["itemClicked", "openChange", "inputTextChange"] }, { kind: "pipe", type: FdTranslatePipe, name: "fdTranslate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
2772
3216
  }
2773
3217
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: SortingComponent, decorators: [{
2774
3218
  type: Component,
@@ -2777,11 +3221,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
2777
3221
  ListGroupHeaderDirective,
2778
3222
  ListTitleDirective,
2779
3223
  ListItemComponent,
3224
+ ListSecondaryDirective,
2780
3225
  RadioButtonComponent,
2781
3226
  FormsModule,
2782
- FdTranslatePipe
2783
- ], template: "<fieldset>\n <legend fd-list-group-header>\n <span fd-list-title [attr.id]=\"sortOrderHeaderId\">\n {{ ('platformTable.sortDialogSortOrderHeader' | fdTranslate)() }}\n </span>\n </legend>\n <ul fd-list [selection]=\"true\" [attr.aria-labelledby]=\"sortOrderHeaderId\">\n <li fd-list-item [selected]=\"direction() === SORT_DIRECTION.ASC\">\n <fd-radio-button\n name=\"sort-order\"\n value=\"asc\"\n state=\"default\"\n [ngModel]=\"direction()\"\n (ngModelChange)=\"_sortDirectionChange($event)\"\n ></fd-radio-button>\n <span fd-list-title>{{ ('platformTable.sortDialogSortOrderAsc' | fdTranslate)() }}</span>\n </li>\n <li fd-list-item [selected]=\"direction() === SORT_DIRECTION.DESC\">\n <fd-radio-button\n name=\"sort-order\"\n value=\"desc\"\n state=\"default\"\n [ngModel]=\"direction()\"\n (ngModelChange)=\"_sortDirectionChange($event)\"\n ></fd-radio-button>\n <span fd-list-title>{{ ('platformTable.sortDialogSortOrderDesc' | fdTranslate)() }}</span>\n </li>\n </ul>\n</fieldset>\n\n<fieldset>\n <legend fd-list-group-header>\n <span fd-list-title [attr.id]=\"sortDialogSortByHeaderId\">\n {{ ('platformTable.sortDialogSortByHeader' | fdTranslate)() }}\n </span>\n </legend>\n <ul fd-list [selection]=\"true\" [attr.aria-labelledby]=\"sortDialogSortByHeaderId\">\n @if (allowDisablingSorting()) {\n <li fd-list-item [selected]=\"field() === NOT_SORTED_OPTION_VALUE\">\n <fd-radio-button\n name=\"sort-by\"\n [value]=\"NOT_SORTED_OPTION_VALUE\"\n state=\"default\"\n [ngModel]=\"field()\"\n (ngModelChange)=\"_sortFieldChange($event)\"\n ></fd-radio-button>\n <span fd-list-title>{{ ('platformTable.sortDialogNotSortedLabel' | fdTranslate)() }}</span>\n </li>\n }\n @for (column of columns(); track column) {\n <li fd-list-item [selected]=\"column.key === field()\">\n <fd-radio-button\n name=\"sort-by\"\n [value]=\"column.key\"\n state=\"default\"\n [ngModel]=\"field()\"\n (ngModelChange)=\"_sortFieldChange($event)\"\n ></fd-radio-button>\n <span fd-list-title>{{ column.label }}</span>\n </li>\n }\n </ul>\n</fieldset>\n" }]
2784
- }], propDecorators: { sortingData: [{ type: i0.Input, args: [{ isSignal: true, alias: "sortingData", required: false }] }], initialSorting: [{ type: i0.Input, args: [{ isSignal: true, alias: "initialSorting", required: false }] }], sortChange: [{ type: i0.Output, args: ["sortChange"] }], resetAvailabilityChange: [{ type: i0.Output, args: ["resetAvailabilityChange"] }] } });
3227
+ FdTranslatePipe,
3228
+ SegmentedButtonComponent,
3229
+ ButtonComponent,
3230
+ ComboboxComponent,
3231
+ FormGroupComponent
3232
+ ], template: "<fieldset>\n <ul fd-list>\n @for (criteria of sortCriteriaList(); track $index; let rowIndex = $index) {\n @if (rowVisibility()[rowIndex]) {\n <li fd-list-item class=\"fdp-sorting__row\">\n <div class=\"fd-margin-end--sm\">\n <fd-combobox\n #sortCombobox\n [dropdownValues]=\"availableColumnsPerRow()[rowIndex]\"\n [displayFn]=\"displayColumn\"\n [placeholder]=\"('platformTable.sortDialogSortByHeader' | fdTranslate)()\"\n [state]=\"rowStates()[rowIndex]\"\n [ngModel]=\"selectedColumnsPerRow()[rowIndex]\"\n (ngModelChange)=\"_sortFieldChangeForRow(rowIndex, $event)\"\n >\n </fd-combobox>\n </div>\n\n <div class=\"fd-margin-end--sm\">\n <fd-segmented-button\n [name]=\"'sort-order-' + rowIndex\"\n [ngModel]=\"directionsPerRow()[rowIndex]\"\n (ngModelChange)=\"_sortDirectionChangeForRow(rowIndex, $event)\"\n >\n <button\n fd-button\n glyph=\"sort-ascending\"\n [attr.title]=\"('platformTable.sortDialogSortOrderAsc' | fdTranslate)()\"\n value=\"asc\"\n ></button>\n <button\n fd-button\n glyph=\"sort-descending\"\n [attr.title]=\"('platformTable.sortDialogSortOrderDesc' | fdTranslate)()\"\n value=\"desc\"\n ></button>\n </fd-segmented-button>\n </div>\n\n @if (directionsPerRow()[rowIndex] === 'asc') {\n <span fd-list-title>{{ ('platformTable.sortDialogSortOrderAsc' | fdTranslate)() }}</span>\n }\n\n @if (directionsPerRow()[rowIndex] === 'desc') {\n <span fd-list-title>{{ ('platformTable.sortDialogSortOrderDesc' | fdTranslate)() }}</span>\n }\n\n <span fd-list-secondary class=\"fdp-sorting__actions\">\n <button\n fd-button\n glyph=\"slim-arrow-up\"\n [attr.title]=\"('platformTable.sortDialogMoveUp' | fdTranslate)()\"\n [disabled]=\"!canMoveUpPerRow()[rowIndex]\"\n (click)=\"moveUp(rowIndex)\"\n ></button>\n <button\n fd-button\n glyph=\"slim-arrow-down\"\n [attr.title]=\"('platformTable.sortDialogMoveDown' | fdTranslate)()\"\n [disabled]=\"!canMoveDownPerRow()[rowIndex]\"\n (click)=\"moveDown(rowIndex)\"\n ></button>\n <button\n fd-button\n glyph=\"decline\"\n [attr.title]=\"('platformTable.sortDialogDelete' | fdTranslate)()\"\n [disabled]=\"!canDeletePerRow()[rowIndex]\"\n (click)=\"deleteRow(rowIndex)\"\n ></button>\n </span>\n </li>\n }\n }\n </ul>\n</fieldset>\n", styles: [".fd-margin--tiny{margin-block:.5rem;margin-inline:.5rem}.fd-margin--sm{margin-block:1rem;margin-inline:1rem}.fd-margin--md{margin-block:2rem;margin-inline:2rem}.fd-margin--lg{margin-block:3rem;margin-inline:3rem}.fd-margin--none{margin-block:0;margin-inline:0}.fd-margin-top--tiny{-webkit-margin-before:.5rem;margin-block-start:.5rem}.fd-margin-top--sm{-webkit-margin-before:1rem;margin-block-start:1rem}.fd-margin-top--md{-webkit-margin-before:2rem;margin-block-start:2rem}.fd-margin-top--lg{-webkit-margin-before:3rem;margin-block-start:3rem}.fd-margin-top--none{-webkit-margin-before:0;margin-block-start:0}.fd-margin-end--tiny{-webkit-margin-end:.5rem;margin-inline-end:.5rem}.fd-margin-end--sm{-webkit-margin-end:1rem;margin-inline-end:1rem}.fd-margin-end--md{-webkit-margin-end:2rem;margin-inline-end:2rem}.fd-margin-end--lg{-webkit-margin-end:3rem;margin-inline-end:3rem}.fd-margin-end--none{-webkit-margin-end:0;margin-inline-end:0}.fd-margin-bottom--tiny{-webkit-margin-after:.5rem;margin-block-end:.5rem}.fd-margin-bottom--sm{-webkit-margin-after:1rem;margin-block-end:1rem}.fd-margin-bottom--md{-webkit-margin-after:2rem;margin-block-end:2rem}.fd-margin-bottom--lg{-webkit-margin-after:3rem;margin-block-end:3rem}.fd-margin-bottom--none{-webkit-margin-after:0;margin-block-end:0}.fd-margin-begin--tiny{-webkit-margin-start:.5rem;margin-inline-start:.5rem}.fd-margin-begin--sm{-webkit-margin-start:1rem;margin-inline-start:1rem}.fd-margin-begin--md{-webkit-margin-start:2rem;margin-inline-start:2rem}.fd-margin-begin--lg{-webkit-margin-start:3rem;margin-inline-start:3rem}.fd-margin-begin--none{-webkit-margin-start:0;margin-inline-start:0}.fd-margin-top-bottom--tiny{margin-block:.5rem}.fd-margin-top-bottom--sm{margin-block:1rem}.fd-margin-top-bottom--md{margin-block:2rem}.fd-margin-top-bottom--lg{margin-block:3rem}.fd-margin-begin-end--tiny{margin-inline:.5rem}.fd-margin-begin-end--sm{margin-inline:1rem}.fd-margin-begin-end--md{margin-inline:2rem}.fd-margin-begin-end--lg{margin-inline:3rem}.fd-margin-responsive--sm{margin-block:0 1rem;margin-inline:0}.fd-margin-responsive--md{margin-block:1rem;margin-inline:1rem}.fd-margin-responsive--lg{margin-block:1rem;margin-inline:2rem}.fd-margin-responsive--xl{margin-block:1rem;margin-inline:3rem}.fd-margin-negative-begin-end--tiny{margin-block:0;margin-inline:-.5rem}.fd-margin-negative-begin-end--sm{margin-block:0;margin-inline:-1rem}.fd-margin-negative-begin-end--md{margin-block:0;margin-inline:-2rem}.fd-margin-negative-begin-end--lg{margin-block:0;margin-inline:-3rem}.fdp-sorting__actions{visibility:hidden}.fdp-sorting__row:hover .fdp-sorting__actions,.fdp-sorting__row:focus-within .fdp-sorting__actions{visibility:visible}\n/*! Bundled license information:\n\nfundamental-styles/dist/margins.css:\n (*!\n * Fundamental Library Styles v0.41.8\n * Copyright (c) 2026 SAP SE or an SAP affiliate company.\n * Licensed under Apache License 2.0 (https://github.com/SAP/fundamental-styles/blob/main/LICENSE)\n *)\n*/\n"] }]
3233
+ }], ctorParameters: () => [], propDecorators: { sortingData: [{ type: i0.Input, args: [{ isSignal: true, alias: "sortingData", required: false }] }], initialSorting: [{ type: i0.Input, args: [{ isSignal: true, alias: "initialSorting", required: false }] }], sortChange: [{ type: i0.Output, args: ["sortChange"] }], resetAvailabilityChange: [{ type: i0.Output, args: ["resetAvailabilityChange"] }], validityChange: [{ type: i0.Output, args: ["validityChange"] }], _comboboxes: [{ type: i0.ViewChildren, args: ['sortCombobox', { isSignal: true }] }] } });
2785
3234
 
2786
3235
  const INITIAL_SEARCH_TEXT = '';
2787
3236
  const INITIAL_SHOW_ALL_ITEMS = true;
@@ -3045,6 +3494,12 @@ class SettingsDialogComponent {
3045
3494
  /** Signal to track reset availability */
3046
3495
  this.isResetAvailable$ = signal(false, /* @ts-ignore */
3047
3496
  ...(ngDevMode ? [{ debugName: "isResetAvailable$" }] : /* istanbul ignore next */ []));
3497
+ /** Signal to track if the dialog is valid (OK button can be clicked) */
3498
+ this.isDialogValid = signal(true, /* @ts-ignore */
3499
+ ...(ngDevMode ? [{ debugName: "isDialogValid" }] : /* istanbul ignore next */ []));
3500
+ /** Input for custom reset announcement message. If not provided, uses the translated default from i18n */
3501
+ this.resetAnnouncementMessage = input(null, /* @ts-ignore */
3502
+ ...(ngDevMode ? [{ debugName: "resetAnnouncementMessage" }] : /* istanbul ignore next */ []));
3048
3503
  /** @hidden Initial sorting configuration */
3049
3504
  this._initialSorting = signal(null, /* @ts-ignore */
3050
3505
  ...(ngDevMode ? [{ debugName: "_initialSorting" }] : /* istanbul ignore next */ []));
@@ -3066,6 +3521,12 @@ class SettingsDialogComponent {
3066
3521
  /** @hidden Tracks reset availability per tab */
3067
3522
  this._resetAvailabilityByTab = signal({}, /* @ts-ignore */
3068
3523
  ...(ngDevMode ? [{ debugName: "_resetAvailabilityByTab" }] : /* istanbul ignore next */ []));
3524
+ /** @hidden Live announcer for screen reader announcements */
3525
+ this._liveAnnouncer = inject(LiveAnnouncer);
3526
+ /** @hidden Language signal for getting current language */
3527
+ this._langSignal = inject(FD_LANGUAGE_SIGNAL);
3528
+ /** @hidden Translation resolver for getting translations synchronously */
3529
+ this._translationResolver = inject(TranslationResolver);
3069
3530
  const data = this.dialogRef.data;
3070
3531
  this.sortingData.set(data.sortingData);
3071
3532
  this.filteringData.set(data.filteringData);
@@ -3089,8 +3550,11 @@ class SettingsDialogComponent {
3089
3550
  const columnsData = this._pendingColumnsChanges
3090
3551
  ? { columns: this._pendingColumnsChanges.columns }
3091
3552
  : this.columnsData();
3553
+ // Build sorting result directly from sortingData signal
3554
+ const sortingData = this.sortingData();
3555
+ const sortingResult = sortingData ? { sortBy: sortingData.sortBy ?? [] } : null;
3092
3556
  this.dialogRef.close({
3093
- sortingData: this.sortingData(),
3557
+ sortingData: sortingResult,
3094
3558
  filteringData: this.filteringData(),
3095
3559
  groupingData: this.groupingData(),
3096
3560
  columnsData
@@ -3107,10 +3571,16 @@ class SettingsDialogComponent {
3107
3571
  */
3108
3572
  reset() {
3109
3573
  if (this.activeTab() === ActiveTab.SORT && this.sortingData()) {
3574
+ const current = this.sortingData();
3575
+ const initial = this._initialSorting();
3576
+ // Reset sortBy to initial sorting (if any)
3577
+ const initialSortBy = initial.field !== NOT_SORTED_OPTION_VALUE
3578
+ ? [{ field: initial.field, direction: initial.direction }]
3579
+ : [];
3110
3580
  this.sortingData.set({
3111
- ...this.sortingData(),
3112
- field: this._initialSorting().field,
3113
- direction: this._initialSorting().direction
3581
+ columns: current.columns,
3582
+ allowDisablingSorting: current.allowDisablingSorting,
3583
+ sortBy: initialSortBy
3114
3584
  });
3115
3585
  }
3116
3586
  if (this.activeTab() === ActiveTab.FILTER && this.filteringData()) {
@@ -3138,18 +3608,27 @@ class SettingsDialogComponent {
3138
3608
  this._pendingColumnsChanges = initialColumns;
3139
3609
  }
3140
3610
  this.updateResetAvailability(this.activeTab(), false);
3611
+ // Announce reset to screen readers
3612
+ this._announceReset();
3141
3613
  }
3142
3614
  /**
3143
3615
  * Handle sort change event and update sorting data.
3144
3616
  * @param event Updated sorting data.
3145
3617
  */
3146
3618
  onSortChange(event) {
3619
+ // Update sortingData with new sortBy
3147
3620
  this.sortingData.set({
3148
3621
  ...this.sortingData(),
3149
- field: event.field,
3150
- direction: event.direction
3622
+ sortBy: event.sortBy ?? []
3151
3623
  });
3152
3624
  }
3625
+ /**
3626
+ * Handle sort validity change event.
3627
+ * @param isValid Whether the sorting configuration is valid.
3628
+ */
3629
+ onSortValidityChange(isValid) {
3630
+ this.isDialogValid.set(isValid);
3631
+ }
3153
3632
  /**
3154
3633
  * Handle filter change event and update filtering data.
3155
3634
  * @param event Updated filtering data.
@@ -3271,7 +3750,9 @@ class SettingsDialogComponent {
3271
3750
  * Set initial sorting configuration from the table's state.
3272
3751
  */
3273
3752
  _setInitialSorting() {
3274
- const initialSorting = (this._table.initialState?.initialSortBy || [])[0];
3753
+ // Use snapshot which preserves the original initial state
3754
+ // even if initialSortBy input is dynamically updated
3755
+ const initialSorting = (this._table.initialState?.getInitialSortBySnapshot() || [])[0];
3275
3756
  this._initialSorting.set({
3276
3757
  field: initialSorting?.field ?? NOT_SORTED_OPTION_VALUE,
3277
3758
  direction: initialSorting?.direction ?? INITIAL_DIRECTION
@@ -3281,13 +3762,15 @@ class SettingsDialogComponent {
3281
3762
  * Set initial filter configuration from the table's state.
3282
3763
  */
3283
3764
  _setInitialFilters() {
3284
- this._initialFilters.set(this._table.initialState?.initialFilterBy ?? []);
3765
+ // Use snapshot which preserves the original initial state
3766
+ this._initialFilters.set(this._table.initialState?.getInitialFilterBySnapshot() ?? []);
3285
3767
  }
3286
3768
  /**
3287
3769
  * Set initial grouping configuration from the table's state.
3288
3770
  */
3289
3771
  _setInitialGrouping() {
3290
- const initialGrouping = (this._table.initialState?.initialGroupBy || [])[0];
3772
+ // Use snapshot which preserves the original initial state
3773
+ const initialGrouping = (this._table.initialState?.getInitialGroupBySnapshot() || [])[0];
3291
3774
  this._initialGrouping.set({
3292
3775
  field: initialGrouping?.field ?? NOT_GROUPED_OPTION_VALUE,
3293
3776
  direction: initialGrouping?.direction ?? INITIAL_DIRECTION
@@ -3313,8 +3796,23 @@ class SettingsDialogComponent {
3313
3796
  columns: initialColumnsArray
3314
3797
  });
3315
3798
  }
3799
+ /**
3800
+ * Announce the reset action to screen readers.
3801
+ * @hidden
3802
+ */
3803
+ _announceReset() {
3804
+ // Get the announcement message: use custom input if provided, otherwise use translation
3805
+ let message = this.resetAnnouncementMessage();
3806
+ if (!message) {
3807
+ // Resolve the translation key synchronously
3808
+ message = this._translationResolver.resolve(this._langSignal(), 'platformTable.resetConfirmationAnnouncement');
3809
+ }
3810
+ // Announce the message to screen readers using LiveAnnouncer
3811
+ // 'polite' priority ensures it doesn't interrupt other announcements
3812
+ this._liveAnnouncer.announce(message, 'polite');
3813
+ }
3316
3814
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: SettingsDialogComponent, deps: [{ token: i1$1.DialogRef }, { token: i1.Table }], target: i0.ɵɵFactoryTarget.Component }); }
3317
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.5", type: SettingsDialogComponent, isStandalone: true, selector: "fdp-settings-dialog-settings", providers: [{ provide: RESETTABLE_TOKEN, useExisting: forwardRef(() => SettingsDialogComponent) }], ngImport: i0, template: "<fd-dialog>\n <fd-dialog-header>\n <ng-template fdkTemplate=\"header\">\n <div fd-bar-left>\n @if (activeTab() !== 'filter') {\n <fd-bar-element>\n <span role=\"heading\" [attr.aria-level]=\"headingLevel\" fd-title [headerSize]=\"4\">{{\n ('platformTable.settingsDialogHeader' | fdTranslate)()\n }}</span>\n </fd-bar-element>\n } @else {\n <fd-bar-element>\n @if (activeFilterStepView()?.titleTemplateRef) {\n <ng-container\n [ngTemplateOutlet]=\"activeFilterStepView()?.titleTemplateRef ?? null\"\n ></ng-container>\n }\n </fd-bar-element>\n }\n </div>\n <div fd-bar-right>\n <fd-bar-element>\n <fdp-table-reset-button></fdp-table-reset-button>\n </fd-bar-element>\n </div>\n </ng-template>\n </fd-dialog-header>\n\n <fd-dialog-body disablePaddings>\n @if (showSubheader()) {\n <fdp-icon-tab-bar layoutMode=\"row\" iconTabSize=\"sm\" (iconTabSelected)=\"onTabSelected($event)\">\n @if (columnsData() && showColumns) {\n <fdp-icon-tab-bar-tab [label]=\"('platformTable.toolbarActionColumnsButtonTitle' | fdTranslate)()\">\n <fdp-columns\n [columnsData]=\"columnsData()!\"\n [initialColumns]=\"_initialColumns()\"\n (columnsChange)=\"onColumnsChange($event)\"\n (resetAvailabilityChange)=\"updateResetAvailability(ActiveTab.COLUMNS, $event)\"\n ></fdp-columns>\n </fdp-icon-tab-bar-tab>\n }\n @if (sortingData()) {\n <fdp-icon-tab-bar-tab [label]=\"('platformTable.toolbarActionSortButtonTitle' | fdTranslate)()\">\n <fdp-sorting\n [sortingData]=\"sortingData()!\"\n [initialSorting]=\"_initialSorting()\"\n (sortChange)=\"onSortChange($event)\"\n (resetAvailabilityChange)=\"updateResetAvailability(ActiveTab.SORT, $event)\"\n ></fdp-sorting>\n </fdp-icon-tab-bar-tab>\n }\n @if (filteringData()) {\n <fdp-icon-tab-bar-tab [label]=\"('platformTable.toolbarActionFilterButtonTitle' | fdTranslate)()\">\n <fdp-filters\n [headingLevel]=\"headingLevel\"\n [filteringData]=\"filteringData()!\"\n [initialFilters]=\"_initialFilters()\"\n (activeFilterStepViewChange)=\"onActiveFilterStepViewChange($event)\"\n (filterChange)=\"onFilterChange($event)\"\n (resetAvailabilityChange)=\"updateResetAvailability(ActiveTab.FILTER, $event)\"\n ></fdp-filters>\n </fdp-icon-tab-bar-tab>\n }\n @if (groupingData()) {\n <fdp-icon-tab-bar-tab [label]=\"('platformTable.toolbarActionGroupButtonTitle' | fdTranslate)()\">\n <fdp-grouping\n [groupingData]=\"groupingData()!\"\n [initialGrouping]=\"_initialGrouping()\"\n (groupChange)=\"onGroupChange($event)\"\n (resetAvailabilityChange)=\"updateResetAvailability(ActiveTab.GROUP, $event)\"\n ></fdp-grouping>\n </fdp-icon-tab-bar-tab>\n }\n </fdp-icon-tab-bar>\n } @else {\n @if (columnsData() && showColumns) {\n <fdp-columns\n [columnsData]=\"columnsData()!\"\n [initialColumns]=\"_initialColumns()\"\n (columnsChange)=\"onColumnsChange($event)\"\n (resetAvailabilityChange)=\"updateResetAvailability(ActiveTab.COLUMNS, $event)\"\n ></fdp-columns>\n }\n @if (sortingData()) {\n <fdp-sorting\n [sortingData]=\"sortingData()!\"\n [initialSorting]=\"_initialSorting()\"\n (sortChange)=\"onSortChange($event)\"\n (resetAvailabilityChange)=\"updateResetAvailability(ActiveTab.SORT, $event)\"\n ></fdp-sorting>\n }\n @if (filteringData()) {\n <fdp-filters\n [headingLevel]=\"headingLevel\"\n [filteringData]=\"filteringData()!\"\n [initialFilters]=\"_initialFilters()\"\n (activeFilterStepViewChange)=\"onActiveFilterStepViewChange($event)\"\n (filterChange)=\"onFilterChange($event)\"\n (resetAvailabilityChange)=\"updateResetAvailability(ActiveTab.FILTER, $event)\"\n ></fdp-filters>\n }\n @if (groupingData()) {\n <fdp-grouping\n [groupingData]=\"groupingData()!\"\n [initialGrouping]=\"_initialGrouping()\"\n (groupChange)=\"onGroupChange($event)\"\n (resetAvailabilityChange)=\"updateResetAvailability(ActiveTab.GROUP, $event)\"\n ></fdp-grouping>\n }\n }\n </fd-dialog-body>\n\n <fd-dialog-footer>\n <fd-button-bar\n fdType=\"emphasized\"\n [label]=\"('platformTable.confirmBtnLabel' | fdTranslate)()\"\n (click)=\"confirm()\"\n ></fd-button-bar>\n <fd-button-bar\n [label]=\"('platformTable.cancelBtnLabel' | fdTranslate)()\"\n fdkInitialFocus\n (click)=\"cancel()\"\n ></fd-button-bar>\n </fd-dialog-footer>\n</fd-dialog>\n", dependencies: [{ kind: "component", type: DialogComponent, selector: "fd-dialog", inputs: ["class", "dialogRef", "dialogConfig"] }, { kind: "component", type: DialogHeaderComponent, selector: "fd-dialog-header", inputs: ["inShellbar"] }, { kind: "directive", type: BarLeftDirective, selector: "[fd-bar-left]", inputs: ["stackContentsVertically"] }, { kind: "directive", type: BarElementDirective, selector: "fd-bar-element", inputs: ["fullWidth"] }, { kind: "directive", type: BarRightDirective, selector: "[fd-bar-right]", inputs: ["stackContentsVertically"] }, { kind: "component", type: ResetButtonComponent, selector: "fdp-table-reset-button" }, { kind: "component", type: DialogBodyComponent, selector: "fd-dialog-body", inputs: ["disablePaddings"] }, { kind: "component", type: DialogFooterComponent, selector: "fd-dialog-footer" }, { kind: "component", type: SortingComponent, selector: "fdp-sorting", inputs: ["sortingData", "initialSorting"], outputs: ["sortChange", "resetAvailabilityChange"] }, { kind: "component", type: FiltersComponent, selector: "fdp-filters", inputs: ["filteringData", "headingLevel", "initialFilters"], outputs: ["activeFilterStepViewChange", "filterChange", "resetAvailabilityChange"] }, { kind: "component", type: GroupingComponent, selector: "fdp-grouping", inputs: ["groupingData", "initialGrouping"], outputs: ["groupChange", "resetAvailabilityChange"] }, { kind: "component", type: ColumnsComponent, selector: "fdp-columns", inputs: ["columnsData", "initialColumns"], outputs: ["columnsChange", "resetAvailabilityChange"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: TemplateDirective, selector: "[fdkTemplate]", inputs: ["fdkTemplate"] }, { kind: "component", type: TitleComponent, selector: "[fd-title], [fdTitle]", inputs: ["twoLineClamp", "headerSize", "wrap"], exportAs: ["fd-title"] }, { kind: "component", type: ButtonBarComponent, selector: "fd-button-bar", inputs: ["fullWidth", "fdType", "title", "ariaLabelledby", "id"] }, { kind: "directive", type: InitialFocusDirective, selector: "[fdkInitialFocus]", inputs: ["fdkInitialFocus", "enabled", "focusLastElement"] }, { kind: "component", type: IconTabBarComponent, selector: "fdp-icon-tab-bar", inputs: ["stackContent", "tabHeadingLevel", "iconTabType", "tabsConfig", "densityMode", "iconTabFont", "enableTabReordering", "showTotalTab", "multiClick", "layoutMode", "iconTabBackground", "iconTabSize", "colorAssociations", "settings", "maxContentHeight"], outputs: ["tabsConfigChange", "densityModeChange", "iconTabSelected", "iconTabReordered", "closeTab"] }, { kind: "component", type: IconTabBarTabComponent, selector: "fdp-icon-tab-bar-tab", inputs: ["label", "color", "icon", "iconFont", "counter", "active", "badge", "closable", "id"] }, { kind: "pipe", type: FdTranslatePipe, name: "fdTranslate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
3815
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.5", type: SettingsDialogComponent, isStandalone: true, selector: "fdp-settings-dialog-settings", inputs: { resetAnnouncementMessage: { classPropertyName: "resetAnnouncementMessage", publicName: "resetAnnouncementMessage", isSignal: true, isRequired: false, transformFunction: null } }, providers: [{ provide: RESETTABLE_TOKEN, useExisting: forwardRef(() => SettingsDialogComponent) }], ngImport: i0, template: "<fd-dialog>\n <fd-dialog-header>\n <ng-template fdkTemplate=\"header\">\n <div fd-bar-left>\n @if (activeTab() !== 'filter') {\n <fd-bar-element>\n <span role=\"heading\" [attr.aria-level]=\"headingLevel\" fd-title [headerSize]=\"4\">{{\n ('platformTable.settingsDialogHeader' | fdTranslate)()\n }}</span>\n </fd-bar-element>\n } @else {\n <fd-bar-element>\n @if (activeFilterStepView()?.titleTemplateRef) {\n <ng-container\n [ngTemplateOutlet]=\"activeFilterStepView()?.titleTemplateRef ?? null\"\n ></ng-container>\n }\n </fd-bar-element>\n }\n </div>\n <div fd-bar-right>\n <fd-bar-element>\n <fdp-table-reset-button></fdp-table-reset-button>\n </fd-bar-element>\n </div>\n </ng-template>\n </fd-dialog-header>\n\n <fd-dialog-body disablePaddings>\n @if (showSubheader()) {\n <fdp-icon-tab-bar layoutMode=\"row\" iconTabSize=\"sm\" (iconTabSelected)=\"onTabSelected($event)\">\n @if (columnsData() && showColumns) {\n <fdp-icon-tab-bar-tab [label]=\"('platformTable.toolbarActionColumnsButtonTitle' | fdTranslate)()\">\n <fdp-columns\n [columnsData]=\"columnsData()!\"\n [initialColumns]=\"_initialColumns()\"\n (columnsChange)=\"onColumnsChange($event)\"\n (resetAvailabilityChange)=\"updateResetAvailability(ActiveTab.COLUMNS, $event)\"\n ></fdp-columns>\n </fdp-icon-tab-bar-tab>\n }\n @if (sortingData()) {\n <fdp-icon-tab-bar-tab [label]=\"('platformTable.toolbarActionSortButtonTitle' | fdTranslate)()\">\n <fdp-sorting\n [sortingData]=\"sortingData()!\"\n [initialSorting]=\"_initialSorting()\"\n (sortChange)=\"onSortChange($event)\"\n (validityChange)=\"onSortValidityChange($event)\"\n (resetAvailabilityChange)=\"updateResetAvailability(ActiveTab.SORT, $event)\"\n ></fdp-sorting>\n </fdp-icon-tab-bar-tab>\n }\n @if (filteringData()) {\n <fdp-icon-tab-bar-tab [label]=\"('platformTable.toolbarActionFilterButtonTitle' | fdTranslate)()\">\n <fdp-filters\n [headingLevel]=\"headingLevel\"\n [filteringData]=\"filteringData()!\"\n [initialFilters]=\"_initialFilters()\"\n (activeFilterStepViewChange)=\"onActiveFilterStepViewChange($event)\"\n (filterChange)=\"onFilterChange($event)\"\n (resetAvailabilityChange)=\"updateResetAvailability(ActiveTab.FILTER, $event)\"\n ></fdp-filters>\n </fdp-icon-tab-bar-tab>\n }\n @if (groupingData()) {\n <fdp-icon-tab-bar-tab [label]=\"('platformTable.toolbarActionGroupButtonTitle' | fdTranslate)()\">\n <fdp-grouping\n [groupingData]=\"groupingData()!\"\n [initialGrouping]=\"_initialGrouping()\"\n (groupChange)=\"onGroupChange($event)\"\n (resetAvailabilityChange)=\"updateResetAvailability(ActiveTab.GROUP, $event)\"\n ></fdp-grouping>\n </fdp-icon-tab-bar-tab>\n }\n </fdp-icon-tab-bar>\n } @else {\n @if (columnsData() && showColumns) {\n <fdp-columns\n [columnsData]=\"columnsData()!\"\n [initialColumns]=\"_initialColumns()\"\n (columnsChange)=\"onColumnsChange($event)\"\n (resetAvailabilityChange)=\"updateResetAvailability(ActiveTab.COLUMNS, $event)\"\n ></fdp-columns>\n }\n @if (sortingData()) {\n <fdp-sorting\n [sortingData]=\"sortingData()!\"\n [initialSorting]=\"_initialSorting()\"\n (sortChange)=\"onSortChange($event)\"\n (validityChange)=\"onSortValidityChange($event)\"\n (resetAvailabilityChange)=\"updateResetAvailability(ActiveTab.SORT, $event)\"\n ></fdp-sorting>\n }\n @if (filteringData()) {\n <fdp-filters\n [headingLevel]=\"headingLevel\"\n [filteringData]=\"filteringData()!\"\n [initialFilters]=\"_initialFilters()\"\n (activeFilterStepViewChange)=\"onActiveFilterStepViewChange($event)\"\n (filterChange)=\"onFilterChange($event)\"\n (resetAvailabilityChange)=\"updateResetAvailability(ActiveTab.FILTER, $event)\"\n ></fdp-filters>\n }\n @if (groupingData()) {\n <fdp-grouping\n [groupingData]=\"groupingData()!\"\n [initialGrouping]=\"_initialGrouping()\"\n (groupChange)=\"onGroupChange($event)\"\n (resetAvailabilityChange)=\"updateResetAvailability(ActiveTab.GROUP, $event)\"\n ></fdp-grouping>\n }\n }\n </fd-dialog-body>\n\n <fd-dialog-footer>\n <fd-button-bar\n fdType=\"emphasized\"\n [label]=\"('platformTable.confirmBtnLabel' | fdTranslate)()\"\n [disabled]=\"!isDialogValid()\"\n (click)=\"confirm()\"\n ></fd-button-bar>\n <fd-button-bar\n [label]=\"('platformTable.cancelBtnLabel' | fdTranslate)()\"\n fdkInitialFocus\n (click)=\"cancel()\"\n ></fd-button-bar>\n </fd-dialog-footer>\n</fd-dialog>\n", dependencies: [{ kind: "component", type: DialogComponent, selector: "fd-dialog", inputs: ["class", "dialogRef", "dialogConfig"] }, { kind: "component", type: DialogHeaderComponent, selector: "fd-dialog-header", inputs: ["inShellbar"] }, { kind: "directive", type: BarLeftDirective, selector: "[fd-bar-left]", inputs: ["stackContentsVertically"] }, { kind: "directive", type: BarElementDirective, selector: "fd-bar-element", inputs: ["fullWidth"] }, { kind: "directive", type: BarRightDirective, selector: "[fd-bar-right]", inputs: ["stackContentsVertically"] }, { kind: "component", type: ResetButtonComponent, selector: "fdp-table-reset-button" }, { kind: "component", type: DialogBodyComponent, selector: "fd-dialog-body", inputs: ["disablePaddings"] }, { kind: "component", type: DialogFooterComponent, selector: "fd-dialog-footer" }, { kind: "component", type: SortingComponent, selector: "fdp-sorting", inputs: ["sortingData", "initialSorting"], outputs: ["sortChange", "resetAvailabilityChange", "validityChange"] }, { kind: "component", type: FiltersComponent, selector: "fdp-filters", inputs: ["filteringData", "headingLevel", "initialFilters"], outputs: ["activeFilterStepViewChange", "filterChange", "resetAvailabilityChange"] }, { kind: "component", type: GroupingComponent, selector: "fdp-grouping", inputs: ["groupingData", "initialGrouping"], outputs: ["groupChange", "resetAvailabilityChange"] }, { kind: "component", type: ColumnsComponent, selector: "fdp-columns", inputs: ["columnsData", "initialColumns"], outputs: ["columnsChange", "resetAvailabilityChange"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: TemplateDirective, selector: "[fdkTemplate]", inputs: ["fdkTemplate"] }, { kind: "component", type: TitleComponent, selector: "[fd-title], [fdTitle]", inputs: ["twoLineClamp", "headerSize", "wrap"], exportAs: ["fd-title"] }, { kind: "component", type: ButtonBarComponent, selector: "fd-button-bar", inputs: ["fullWidth", "fdType", "title", "ariaLabelledby", "id"] }, { kind: "directive", type: InitialFocusDirective, selector: "[fdkInitialFocus]", inputs: ["fdkInitialFocus", "enabled", "focusLastElement"] }, { kind: "component", type: IconTabBarComponent, selector: "fdp-icon-tab-bar", inputs: ["stackContent", "tabHeadingLevel", "iconTabType", "tabsConfig", "densityMode", "iconTabFont", "enableTabReordering", "showTotalTab", "multiClick", "layoutMode", "iconTabBackground", "iconTabSize", "colorAssociations", "settings", "maxContentHeight"], outputs: ["tabsConfigChange", "densityModeChange", "iconTabSelected", "iconTabReordered", "closeTab"] }, { kind: "component", type: IconTabBarTabComponent, selector: "fdp-icon-tab-bar-tab", inputs: ["label", "color", "icon", "iconFont", "counter", "active", "badge", "closable", "id"] }, { kind: "pipe", type: FdTranslatePipe, name: "fdTranslate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
3318
3816
  }
3319
3817
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: SettingsDialogComponent, decorators: [{
3320
3818
  type: Component,
@@ -3340,13 +3838,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
3340
3838
  InitialFocusDirective,
3341
3839
  IconTabBarComponent,
3342
3840
  IconTabBarTabComponent
3343
- ], template: "<fd-dialog>\n <fd-dialog-header>\n <ng-template fdkTemplate=\"header\">\n <div fd-bar-left>\n @if (activeTab() !== 'filter') {\n <fd-bar-element>\n <span role=\"heading\" [attr.aria-level]=\"headingLevel\" fd-title [headerSize]=\"4\">{{\n ('platformTable.settingsDialogHeader' | fdTranslate)()\n }}</span>\n </fd-bar-element>\n } @else {\n <fd-bar-element>\n @if (activeFilterStepView()?.titleTemplateRef) {\n <ng-container\n [ngTemplateOutlet]=\"activeFilterStepView()?.titleTemplateRef ?? null\"\n ></ng-container>\n }\n </fd-bar-element>\n }\n </div>\n <div fd-bar-right>\n <fd-bar-element>\n <fdp-table-reset-button></fdp-table-reset-button>\n </fd-bar-element>\n </div>\n </ng-template>\n </fd-dialog-header>\n\n <fd-dialog-body disablePaddings>\n @if (showSubheader()) {\n <fdp-icon-tab-bar layoutMode=\"row\" iconTabSize=\"sm\" (iconTabSelected)=\"onTabSelected($event)\">\n @if (columnsData() && showColumns) {\n <fdp-icon-tab-bar-tab [label]=\"('platformTable.toolbarActionColumnsButtonTitle' | fdTranslate)()\">\n <fdp-columns\n [columnsData]=\"columnsData()!\"\n [initialColumns]=\"_initialColumns()\"\n (columnsChange)=\"onColumnsChange($event)\"\n (resetAvailabilityChange)=\"updateResetAvailability(ActiveTab.COLUMNS, $event)\"\n ></fdp-columns>\n </fdp-icon-tab-bar-tab>\n }\n @if (sortingData()) {\n <fdp-icon-tab-bar-tab [label]=\"('platformTable.toolbarActionSortButtonTitle' | fdTranslate)()\">\n <fdp-sorting\n [sortingData]=\"sortingData()!\"\n [initialSorting]=\"_initialSorting()\"\n (sortChange)=\"onSortChange($event)\"\n (resetAvailabilityChange)=\"updateResetAvailability(ActiveTab.SORT, $event)\"\n ></fdp-sorting>\n </fdp-icon-tab-bar-tab>\n }\n @if (filteringData()) {\n <fdp-icon-tab-bar-tab [label]=\"('platformTable.toolbarActionFilterButtonTitle' | fdTranslate)()\">\n <fdp-filters\n [headingLevel]=\"headingLevel\"\n [filteringData]=\"filteringData()!\"\n [initialFilters]=\"_initialFilters()\"\n (activeFilterStepViewChange)=\"onActiveFilterStepViewChange($event)\"\n (filterChange)=\"onFilterChange($event)\"\n (resetAvailabilityChange)=\"updateResetAvailability(ActiveTab.FILTER, $event)\"\n ></fdp-filters>\n </fdp-icon-tab-bar-tab>\n }\n @if (groupingData()) {\n <fdp-icon-tab-bar-tab [label]=\"('platformTable.toolbarActionGroupButtonTitle' | fdTranslate)()\">\n <fdp-grouping\n [groupingData]=\"groupingData()!\"\n [initialGrouping]=\"_initialGrouping()\"\n (groupChange)=\"onGroupChange($event)\"\n (resetAvailabilityChange)=\"updateResetAvailability(ActiveTab.GROUP, $event)\"\n ></fdp-grouping>\n </fdp-icon-tab-bar-tab>\n }\n </fdp-icon-tab-bar>\n } @else {\n @if (columnsData() && showColumns) {\n <fdp-columns\n [columnsData]=\"columnsData()!\"\n [initialColumns]=\"_initialColumns()\"\n (columnsChange)=\"onColumnsChange($event)\"\n (resetAvailabilityChange)=\"updateResetAvailability(ActiveTab.COLUMNS, $event)\"\n ></fdp-columns>\n }\n @if (sortingData()) {\n <fdp-sorting\n [sortingData]=\"sortingData()!\"\n [initialSorting]=\"_initialSorting()\"\n (sortChange)=\"onSortChange($event)\"\n (resetAvailabilityChange)=\"updateResetAvailability(ActiveTab.SORT, $event)\"\n ></fdp-sorting>\n }\n @if (filteringData()) {\n <fdp-filters\n [headingLevel]=\"headingLevel\"\n [filteringData]=\"filteringData()!\"\n [initialFilters]=\"_initialFilters()\"\n (activeFilterStepViewChange)=\"onActiveFilterStepViewChange($event)\"\n (filterChange)=\"onFilterChange($event)\"\n (resetAvailabilityChange)=\"updateResetAvailability(ActiveTab.FILTER, $event)\"\n ></fdp-filters>\n }\n @if (groupingData()) {\n <fdp-grouping\n [groupingData]=\"groupingData()!\"\n [initialGrouping]=\"_initialGrouping()\"\n (groupChange)=\"onGroupChange($event)\"\n (resetAvailabilityChange)=\"updateResetAvailability(ActiveTab.GROUP, $event)\"\n ></fdp-grouping>\n }\n }\n </fd-dialog-body>\n\n <fd-dialog-footer>\n <fd-button-bar\n fdType=\"emphasized\"\n [label]=\"('platformTable.confirmBtnLabel' | fdTranslate)()\"\n (click)=\"confirm()\"\n ></fd-button-bar>\n <fd-button-bar\n [label]=\"('platformTable.cancelBtnLabel' | fdTranslate)()\"\n fdkInitialFocus\n (click)=\"cancel()\"\n ></fd-button-bar>\n </fd-dialog-footer>\n</fd-dialog>\n" }]
3344
- }], ctorParameters: () => [{ type: i1$1.DialogRef }, { type: i1.Table }] });
3841
+ ], template: "<fd-dialog>\n <fd-dialog-header>\n <ng-template fdkTemplate=\"header\">\n <div fd-bar-left>\n @if (activeTab() !== 'filter') {\n <fd-bar-element>\n <span role=\"heading\" [attr.aria-level]=\"headingLevel\" fd-title [headerSize]=\"4\">{{\n ('platformTable.settingsDialogHeader' | fdTranslate)()\n }}</span>\n </fd-bar-element>\n } @else {\n <fd-bar-element>\n @if (activeFilterStepView()?.titleTemplateRef) {\n <ng-container\n [ngTemplateOutlet]=\"activeFilterStepView()?.titleTemplateRef ?? null\"\n ></ng-container>\n }\n </fd-bar-element>\n }\n </div>\n <div fd-bar-right>\n <fd-bar-element>\n <fdp-table-reset-button></fdp-table-reset-button>\n </fd-bar-element>\n </div>\n </ng-template>\n </fd-dialog-header>\n\n <fd-dialog-body disablePaddings>\n @if (showSubheader()) {\n <fdp-icon-tab-bar layoutMode=\"row\" iconTabSize=\"sm\" (iconTabSelected)=\"onTabSelected($event)\">\n @if (columnsData() && showColumns) {\n <fdp-icon-tab-bar-tab [label]=\"('platformTable.toolbarActionColumnsButtonTitle' | fdTranslate)()\">\n <fdp-columns\n [columnsData]=\"columnsData()!\"\n [initialColumns]=\"_initialColumns()\"\n (columnsChange)=\"onColumnsChange($event)\"\n (resetAvailabilityChange)=\"updateResetAvailability(ActiveTab.COLUMNS, $event)\"\n ></fdp-columns>\n </fdp-icon-tab-bar-tab>\n }\n @if (sortingData()) {\n <fdp-icon-tab-bar-tab [label]=\"('platformTable.toolbarActionSortButtonTitle' | fdTranslate)()\">\n <fdp-sorting\n [sortingData]=\"sortingData()!\"\n [initialSorting]=\"_initialSorting()\"\n (sortChange)=\"onSortChange($event)\"\n (validityChange)=\"onSortValidityChange($event)\"\n (resetAvailabilityChange)=\"updateResetAvailability(ActiveTab.SORT, $event)\"\n ></fdp-sorting>\n </fdp-icon-tab-bar-tab>\n }\n @if (filteringData()) {\n <fdp-icon-tab-bar-tab [label]=\"('platformTable.toolbarActionFilterButtonTitle' | fdTranslate)()\">\n <fdp-filters\n [headingLevel]=\"headingLevel\"\n [filteringData]=\"filteringData()!\"\n [initialFilters]=\"_initialFilters()\"\n (activeFilterStepViewChange)=\"onActiveFilterStepViewChange($event)\"\n (filterChange)=\"onFilterChange($event)\"\n (resetAvailabilityChange)=\"updateResetAvailability(ActiveTab.FILTER, $event)\"\n ></fdp-filters>\n </fdp-icon-tab-bar-tab>\n }\n @if (groupingData()) {\n <fdp-icon-tab-bar-tab [label]=\"('platformTable.toolbarActionGroupButtonTitle' | fdTranslate)()\">\n <fdp-grouping\n [groupingData]=\"groupingData()!\"\n [initialGrouping]=\"_initialGrouping()\"\n (groupChange)=\"onGroupChange($event)\"\n (resetAvailabilityChange)=\"updateResetAvailability(ActiveTab.GROUP, $event)\"\n ></fdp-grouping>\n </fdp-icon-tab-bar-tab>\n }\n </fdp-icon-tab-bar>\n } @else {\n @if (columnsData() && showColumns) {\n <fdp-columns\n [columnsData]=\"columnsData()!\"\n [initialColumns]=\"_initialColumns()\"\n (columnsChange)=\"onColumnsChange($event)\"\n (resetAvailabilityChange)=\"updateResetAvailability(ActiveTab.COLUMNS, $event)\"\n ></fdp-columns>\n }\n @if (sortingData()) {\n <fdp-sorting\n [sortingData]=\"sortingData()!\"\n [initialSorting]=\"_initialSorting()\"\n (sortChange)=\"onSortChange($event)\"\n (validityChange)=\"onSortValidityChange($event)\"\n (resetAvailabilityChange)=\"updateResetAvailability(ActiveTab.SORT, $event)\"\n ></fdp-sorting>\n }\n @if (filteringData()) {\n <fdp-filters\n [headingLevel]=\"headingLevel\"\n [filteringData]=\"filteringData()!\"\n [initialFilters]=\"_initialFilters()\"\n (activeFilterStepViewChange)=\"onActiveFilterStepViewChange($event)\"\n (filterChange)=\"onFilterChange($event)\"\n (resetAvailabilityChange)=\"updateResetAvailability(ActiveTab.FILTER, $event)\"\n ></fdp-filters>\n }\n @if (groupingData()) {\n <fdp-grouping\n [groupingData]=\"groupingData()!\"\n [initialGrouping]=\"_initialGrouping()\"\n (groupChange)=\"onGroupChange($event)\"\n (resetAvailabilityChange)=\"updateResetAvailability(ActiveTab.GROUP, $event)\"\n ></fdp-grouping>\n }\n }\n </fd-dialog-body>\n\n <fd-dialog-footer>\n <fd-button-bar\n fdType=\"emphasized\"\n [label]=\"('platformTable.confirmBtnLabel' | fdTranslate)()\"\n [disabled]=\"!isDialogValid()\"\n (click)=\"confirm()\"\n ></fd-button-bar>\n <fd-button-bar\n [label]=\"('platformTable.cancelBtnLabel' | fdTranslate)()\"\n fdkInitialFocus\n (click)=\"cancel()\"\n ></fd-button-bar>\n </fd-dialog-footer>\n</fd-dialog>\n" }]
3842
+ }], ctorParameters: () => [{ type: i1$1.DialogRef }, { type: i1.Table }], propDecorators: { resetAnnouncementMessage: [{ type: i0.Input, args: [{ isSignal: true, alias: "resetAnnouncementMessage", required: false }] }] } });
3345
3843
 
3346
3844
  const dialogConfig = {
3347
3845
  responsivePadding: false,
3348
3846
  verticalPadding: false,
3349
- width: 'auto'
3847
+ width: '40rem',
3848
+ height: '80%'
3350
3849
  };
3351
3850
  /**
3352
3851
  * View settings dialog component.
@@ -3397,9 +3896,9 @@ class TableViewSettingsDialogComponent {
3397
3896
  const columns = this._getTableColumns();
3398
3897
  const sortData = {
3399
3898
  columns: columns.filter(({ sortable }) => sortable),
3400
- direction: state.sortBy?.[0]?.direction,
3401
- field: state.sortBy?.[0]?.field,
3402
- allowDisablingSorting: this.allowDisablingSorting
3899
+ allowDisablingSorting: this.allowDisablingSorting,
3900
+ // Filter out any criteria with null fields
3901
+ sortBy: (state.sortBy ?? []).filter((s) => s.field !== null)
3403
3902
  };
3404
3903
  const filterData = {
3405
3904
  columns,
@@ -3481,7 +3980,7 @@ class TableViewSettingsDialogComponent {
3481
3980
  .pipe(filter((result) => !!result), takeUntilDestroyed(this.destroyRef))
3482
3981
  .subscribe(({ sortingData, filteringData, groupingData, columnsData }) => {
3483
3982
  if (sortingData) {
3484
- this._applySorting(sortingData.field, sortingData.direction);
3983
+ this._applySorting(sortingData);
3485
3984
  }
3486
3985
  if (filteringData) {
3487
3986
  this._applyFiltering(filteringData.filterBy);
@@ -3537,8 +4036,9 @@ class TableViewSettingsDialogComponent {
3537
4036
  return this._table?.getTableColumns() || [];
3538
4037
  }
3539
4038
  /** @hidden */
3540
- _applySorting(field, direction) {
3541
- this._table?.sort(field ? [{ field, direction }] : []);
4039
+ _applySorting(sortingData) {
4040
+ const sortRules = sortingData.sortBy ?? [];
4041
+ this._table?.sort(sortRules);
3542
4042
  }
3543
4043
  /** @hidden */
3544
4044
  _applyFiltering(filters) {