@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.
- package/fesm2022/fundamental-ngx-platform-table-helpers.mjs +27 -0
- package/fesm2022/fundamental-ngx-platform-table-helpers.mjs.map +1 -1
- package/fesm2022/fundamental-ngx-platform-table.mjs +555 -55
- package/fesm2022/fundamental-ngx-platform-table.mjs.map +1 -1
- package/package.json +4 -4
- package/schematics/ng-add/index.js +1 -1
- package/schematics/package.json +1 -1
- package/types/fundamental-ngx-platform-table-helpers.d.ts +28 -0
- package/types/fundamental-ngx-platform-table.d.ts +195 -17
|
@@ -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,
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
-
/**
|
|
2719
|
-
this.
|
|
2720
|
-
|
|
2721
|
-
|
|
2722
|
-
|
|
2723
|
-
|
|
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
|
-
/**
|
|
2739
|
-
this.
|
|
2740
|
-
const
|
|
2741
|
-
if
|
|
2742
|
-
|
|
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
|
|
2745
|
-
}
|
|
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
|
-
*
|
|
2749
|
-
*
|
|
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
|
-
|
|
2752
|
-
this.
|
|
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
|
-
*
|
|
2757
|
-
* @param
|
|
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
|
-
|
|
2760
|
-
this.
|
|
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
|
-
|
|
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
|
-
|
|
2784
|
-
|
|
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:
|
|
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
|
-
|
|
3112
|
-
|
|
3113
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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: '
|
|
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
|
-
|
|
3401
|
-
|
|
3402
|
-
|
|
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
|
|
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(
|
|
3541
|
-
|
|
4039
|
+
_applySorting(sortingData) {
|
|
4040
|
+
const sortRules = sortingData.sortBy ?? [];
|
|
4041
|
+
this._table?.sort(sortRules);
|
|
3542
4042
|
}
|
|
3543
4043
|
/** @hidden */
|
|
3544
4044
|
_applyFiltering(filters) {
|