@ascentgl/ads-ui 21.50.0 → 21.52.0
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.
|
@@ -2,7 +2,7 @@ import * as i0 from '@angular/core';
|
|
|
2
2
|
import { Input, Component, NgModule, input, output, computed, ChangeDetectionStrategy, EventEmitter, signal, effect, ViewChild, Output, ElementRef, HostListener, Directive, InjectionToken, inject, DestroyRef, Pipe, contentChild, TemplateRef, Inject, Optional, ChangeDetectorRef, Injectable, Renderer2, viewChild, ViewChildren } from '@angular/core';
|
|
3
3
|
import * as i1 from '@ascentgl/ads-icons';
|
|
4
4
|
import { AdsIconModule, AdsIconRegistry } from '@ascentgl/ads-icons';
|
|
5
|
-
import { adsIconUserCircle, adsIconBell, adsIconChevronRight, adsIconCross, adsIconPlus, adsIconWarning, adsIconLock, adsIconPlusCircle, adsIconSearch, adsIconSortDescending, adsIconCheckCircleFilled, adsIconVisibilityEye, adsIconVisibilityEyeNone, adsIconStatusProcessing, adsIconInformation, adsIconChevronDown, adsIconLoading, adsIconDatepicker, adsIconTimepicker, adsIconCheck, adsIconDropdownArrow, adsIconChevronUp, adsIconSortDownToUp, adsIconSortUpToDown, adsIconMenuFilters, adsIconFilter, adsIconArrowUpAndDown, adsIconMenuMoreInfo, adsIconHamburgerMenu, adsIconChevronLeft, adsIconStatusNew } from '@ascentgl/ads-icons/icons';
|
|
5
|
+
import { adsIconUserCircle, adsIconBell, adsIconChevronRight, adsIconCross, adsIconPlus, adsIconWarning, adsIconLock, adsIconPlusCircle, adsIconSearch, adsIconSortDescending, adsIconCheckCircleFilled, adsIconVisibilityEye, adsIconVisibilityEyeNone, adsIconStatusProcessing, adsIconInformation, adsIconChevronDown, adsIconLoading, adsIconDatepicker, adsIconTimepicker, adsIconCheck, adsIconDropdownArrow, adsIconChevronUp, adsIconSortDownToUp, adsIconSortUpToDown, adsIconMenuFilters, adsIconSortingArrowUp, adsIconSortingArrowDown, adsIconFilter, adsIconArrowUpAndDown, adsIconMenuMoreInfo, adsIconHamburgerMenu, adsIconChevronLeft, adsIconStatusNew } from '@ascentgl/ads-icons/icons';
|
|
6
6
|
import * as i1$1 from '@angular/common';
|
|
7
7
|
import { CommonModule, NgOptimizedImage, NgTemplateOutlet, NgClass, NgStyle, DOCUMENT } from '@angular/common';
|
|
8
8
|
import * as i2 from '@angular/material/badge';
|
|
@@ -7289,7 +7289,7 @@ class AdsCustomHeaderComponent {
|
|
|
7289
7289
|
constructor(registry) {
|
|
7290
7290
|
this.registry = registry;
|
|
7291
7291
|
this.menuOpen = false;
|
|
7292
|
-
this.registry.register([adsIconMenuFilters]);
|
|
7292
|
+
this.registry.register([adsIconMenuFilters, adsIconSortingArrowUp, adsIconSortingArrowDown]);
|
|
7293
7293
|
}
|
|
7294
7294
|
agInit(params) {
|
|
7295
7295
|
this.params = params;
|
|
@@ -7347,11 +7347,11 @@ class AdsCustomHeaderComponent {
|
|
|
7347
7347
|
this.menuOpen = false;
|
|
7348
7348
|
}
|
|
7349
7349
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: AdsCustomHeaderComponent, deps: [{ token: i1.AdsIconRegistry }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
7350
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.6", type: AdsCustomHeaderComponent, isStandalone: false, selector: "ads-custom-header", ngImport: i0, template: "<div class=\"ads-custom-header\">\n <span\n class=\"menu-trigger-anchor\"\n [class.align-right]=\"isLastColumn\"\n #menuTrigger=\"matMenuTrigger\"\n [matMenuTriggerFor]=\"sortFilterMenu\"\n (menuOpened)=\"menuOpen = true\"\n (menuClosed)=\"menuOpen = false\"\n ></span>\n\n <span class=\"header-text\">{{ displayName }}</span>\n\n @if (hasSortFilterConfig) {\n <button\n class=\"header-menu-button\"\n [class.active]=\"isActive\"\n (click)=\"menuTrigger.openMenu(); $event.stopPropagation()\"\n >\n <ads-icon name=\"menu_filters\" theme=\"iconPrimary\" stroke=\"iconPrimary\" size=\"auto\" />\n </button>\n }\n</div>\n\n<mat-menu #sortFilterMenu=\"matMenu\" class=\"column-sort-filter-panel\" [xPosition]=\"isLastColumn ? 'before' : 'after'\">\n @if (sortFilterConfig) {\n <ads-column-sort-filter-menu\n [config]=\"sortFilterConfig\"\n [currentSortDirection]=\"sortDirection\"\n [selectedFilterValues]=\"filterValues\"\n (sortChanged)=\"onSortChanged($event)\"\n (filterChanged)=\"onFilterChanged($event)\"\n (hideColumn)=\"onHideColumn($event)\"\n />\n }\n</mat-menu>\n\n", styles: [":host{display:block;width:100%;height:100%}.ads-custom-header{display:flex;align-items:center;justify-content:flex-start;width:100%;height:100%;position:relative}.ads-custom-header .menu-trigger-anchor{position:absolute;left:0;bottom:0;width:1px;height:1px;pointer-events:none}.ads-custom-header .menu-trigger-anchor.align-right{left:auto;right:0}.ads-custom-header .header-text{font-weight:600;font-size:16px;line-height:21px;color:var(--color-medium);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ads-custom-header .header-menu-button{display:flex;align-items:center;justify-content:center;gap:2px;padding:4px;background:transparent;border:none;border-radius:4px;cursor:pointer;transition:background-color .2s ease;flex-shrink:0}::ng-deep .column-sort-filter-panel{margin-top:1px}::ng-deep .column-sort-filter-panel .mat-mdc-menu-content{padding:0}\n"], dependencies: [{ kind: "component", type: i1.AdsIconComponent, selector: "ads-icon", inputs: ["size", "name", "color", "theme", "stroke"] }, { kind: "component", type: i4$3.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "directive", type: i4$3.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "component", type: AdsColumnSortFilterMenuComponent, selector: "ads-column-sort-filter-menu", inputs: ["config", "currentSortDirection", "selectedFilterValues"], outputs: ["sortChanged", "filterChanged", "hideColumn"] }] }); }
|
|
7350
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.6", type: AdsCustomHeaderComponent, isStandalone: false, selector: "ads-custom-header", ngImport: i0, template: "<div class=\"ads-custom-header\">\n <span\n class=\"menu-trigger-anchor\"\n [class.align-right]=\"isLastColumn\"\n #menuTrigger=\"matMenuTrigger\"\n [matMenuTriggerFor]=\"sortFilterMenu\"\n (menuOpened)=\"menuOpen = true\"\n (menuClosed)=\"menuOpen = false\"\n ></span>\n\n <span class=\"header-text\">{{ displayName }}</span>\n\n @if (hasSortFilterConfig) {\n <button\n class=\"header-menu-button\"\n [class.active]=\"isActive\"\n (click)=\"menuTrigger.openMenu(); $event.stopPropagation()\"\n >\n @if (sortDirection === 'asc') {\n <ads-icon name=\"sorting_arrow_up\" theme=\"iconPrimary\" stroke=\"iconPrimary\" size=\"auto\" />\n } @else if (sortDirection === 'desc') {\n <ads-icon name=\"sorting_arrow_down\" theme=\"iconPrimary\" stroke=\"iconPrimary\" size=\"auto\" />\n } @else {\n <ads-icon name=\"menu_filters\" theme=\"iconPrimary\" stroke=\"iconPrimary\" size=\"auto\" />\n }\n </button>\n }\n</div>\n\n<mat-menu #sortFilterMenu=\"matMenu\" class=\"column-sort-filter-panel\" [xPosition]=\"isLastColumn ? 'before' : 'after'\">\n @if (sortFilterConfig) {\n <ads-column-sort-filter-menu\n [config]=\"sortFilterConfig\"\n [currentSortDirection]=\"sortDirection\"\n [selectedFilterValues]=\"filterValues\"\n (sortChanged)=\"onSortChanged($event)\"\n (filterChanged)=\"onFilterChanged($event)\"\n (hideColumn)=\"onHideColumn($event)\"\n />\n }\n</mat-menu>\n\n", styles: [":host{display:block;width:100%;height:100%}.ads-custom-header{display:flex;align-items:center;justify-content:flex-start;width:100%;height:100%;position:relative}.ads-custom-header .menu-trigger-anchor{position:absolute;left:0;bottom:0;width:1px;height:1px;pointer-events:none}.ads-custom-header .menu-trigger-anchor.align-right{left:auto;right:0}.ads-custom-header .header-text{font-weight:600;font-size:16px;line-height:21px;color:var(--color-medium);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ads-custom-header .header-menu-button{display:flex;align-items:center;justify-content:center;gap:2px;padding:4px;background:transparent;border:none;border-radius:4px;cursor:pointer;transition:background-color .2s ease;flex-shrink:0}::ng-deep .column-sort-filter-panel{margin-top:1px}::ng-deep .column-sort-filter-panel .mat-mdc-menu-content{padding:0}\n"], dependencies: [{ kind: "component", type: i1.AdsIconComponent, selector: "ads-icon", inputs: ["size", "name", "color", "theme", "stroke"] }, { kind: "component", type: i4$3.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "directive", type: i4$3.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "component", type: AdsColumnSortFilterMenuComponent, selector: "ads-column-sort-filter-menu", inputs: ["config", "currentSortDirection", "selectedFilterValues"], outputs: ["sortChanged", "filterChanged", "hideColumn"] }] }); }
|
|
7351
7351
|
}
|
|
7352
7352
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: AdsCustomHeaderComponent, decorators: [{
|
|
7353
7353
|
type: Component,
|
|
7354
|
-
args: [{ selector: 'ads-custom-header', standalone: false, template: "<div class=\"ads-custom-header\">\n <span\n class=\"menu-trigger-anchor\"\n [class.align-right]=\"isLastColumn\"\n #menuTrigger=\"matMenuTrigger\"\n [matMenuTriggerFor]=\"sortFilterMenu\"\n (menuOpened)=\"menuOpen = true\"\n (menuClosed)=\"menuOpen = false\"\n ></span>\n\n <span class=\"header-text\">{{ displayName }}</span>\n\n @if (hasSortFilterConfig) {\n <button\n class=\"header-menu-button\"\n [class.active]=\"isActive\"\n (click)=\"menuTrigger.openMenu(); $event.stopPropagation()\"\n >\n <ads-icon name=\"menu_filters\" theme=\"iconPrimary\" stroke=\"iconPrimary\" size=\"auto\" />\n </button>\n }\n</div>\n\n<mat-menu #sortFilterMenu=\"matMenu\" class=\"column-sort-filter-panel\" [xPosition]=\"isLastColumn ? 'before' : 'after'\">\n @if (sortFilterConfig) {\n <ads-column-sort-filter-menu\n [config]=\"sortFilterConfig\"\n [currentSortDirection]=\"sortDirection\"\n [selectedFilterValues]=\"filterValues\"\n (sortChanged)=\"onSortChanged($event)\"\n (filterChanged)=\"onFilterChanged($event)\"\n (hideColumn)=\"onHideColumn($event)\"\n />\n }\n</mat-menu>\n\n", styles: [":host{display:block;width:100%;height:100%}.ads-custom-header{display:flex;align-items:center;justify-content:flex-start;width:100%;height:100%;position:relative}.ads-custom-header .menu-trigger-anchor{position:absolute;left:0;bottom:0;width:1px;height:1px;pointer-events:none}.ads-custom-header .menu-trigger-anchor.align-right{left:auto;right:0}.ads-custom-header .header-text{font-weight:600;font-size:16px;line-height:21px;color:var(--color-medium);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ads-custom-header .header-menu-button{display:flex;align-items:center;justify-content:center;gap:2px;padding:4px;background:transparent;border:none;border-radius:4px;cursor:pointer;transition:background-color .2s ease;flex-shrink:0}::ng-deep .column-sort-filter-panel{margin-top:1px}::ng-deep .column-sort-filter-panel .mat-mdc-menu-content{padding:0}\n"] }]
|
|
7354
|
+
args: [{ selector: 'ads-custom-header', standalone: false, template: "<div class=\"ads-custom-header\">\n <span\n class=\"menu-trigger-anchor\"\n [class.align-right]=\"isLastColumn\"\n #menuTrigger=\"matMenuTrigger\"\n [matMenuTriggerFor]=\"sortFilterMenu\"\n (menuOpened)=\"menuOpen = true\"\n (menuClosed)=\"menuOpen = false\"\n ></span>\n\n <span class=\"header-text\">{{ displayName }}</span>\n\n @if (hasSortFilterConfig) {\n <button\n class=\"header-menu-button\"\n [class.active]=\"isActive\"\n (click)=\"menuTrigger.openMenu(); $event.stopPropagation()\"\n >\n @if (sortDirection === 'asc') {\n <ads-icon name=\"sorting_arrow_up\" theme=\"iconPrimary\" stroke=\"iconPrimary\" size=\"auto\" />\n } @else if (sortDirection === 'desc') {\n <ads-icon name=\"sorting_arrow_down\" theme=\"iconPrimary\" stroke=\"iconPrimary\" size=\"auto\" />\n } @else {\n <ads-icon name=\"menu_filters\" theme=\"iconPrimary\" stroke=\"iconPrimary\" size=\"auto\" />\n }\n </button>\n }\n</div>\n\n<mat-menu #sortFilterMenu=\"matMenu\" class=\"column-sort-filter-panel\" [xPosition]=\"isLastColumn ? 'before' : 'after'\">\n @if (sortFilterConfig) {\n <ads-column-sort-filter-menu\n [config]=\"sortFilterConfig\"\n [currentSortDirection]=\"sortDirection\"\n [selectedFilterValues]=\"filterValues\"\n (sortChanged)=\"onSortChanged($event)\"\n (filterChanged)=\"onFilterChanged($event)\"\n (hideColumn)=\"onHideColumn($event)\"\n />\n }\n</mat-menu>\n\n", styles: [":host{display:block;width:100%;height:100%}.ads-custom-header{display:flex;align-items:center;justify-content:flex-start;width:100%;height:100%;position:relative}.ads-custom-header .menu-trigger-anchor{position:absolute;left:0;bottom:0;width:1px;height:1px;pointer-events:none}.ads-custom-header .menu-trigger-anchor.align-right{left:auto;right:0}.ads-custom-header .header-text{font-weight:600;font-size:16px;line-height:21px;color:var(--color-medium);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ads-custom-header .header-menu-button{display:flex;align-items:center;justify-content:center;gap:2px;padding:4px;background:transparent;border:none;border-radius:4px;cursor:pointer;transition:background-color .2s ease;flex-shrink:0}::ng-deep .column-sort-filter-panel{margin-top:1px}::ng-deep .column-sort-filter-panel .mat-mdc-menu-content{padding:0}\n"] }]
|
|
7355
7355
|
}], ctorParameters: () => [{ type: i1.AdsIconRegistry }] });
|
|
7356
7356
|
|
|
7357
7357
|
class AdsColumnSortFilterMenuModule {
|
|
@@ -7909,9 +7909,34 @@ class AdsTableComponent {
|
|
|
7909
7909
|
}
|
|
7910
7910
|
}
|
|
7911
7911
|
// ============ Custom Sort/Filter Menu Methods ============
|
|
7912
|
+
/** @ignore - Extract unique values from a column in rowData */
|
|
7913
|
+
getUniqueColumnValues(field) {
|
|
7914
|
+
if (!this.rowData || this.rowData.length === 0) {
|
|
7915
|
+
return [];
|
|
7916
|
+
}
|
|
7917
|
+
const uniqueValues = new Set();
|
|
7918
|
+
this.rowData.forEach(row => {
|
|
7919
|
+
const value = row[field];
|
|
7920
|
+
if (value !== null && value !== undefined) {
|
|
7921
|
+
uniqueValues.add(String(value));
|
|
7922
|
+
}
|
|
7923
|
+
});
|
|
7924
|
+
return Array.from(uniqueValues).sort();
|
|
7925
|
+
}
|
|
7912
7926
|
/** @ignore */
|
|
7913
7927
|
getColumnSortFilterConfig(field) {
|
|
7914
|
-
|
|
7928
|
+
const config = this.columnSortFilterConfigs.find(config => config.field === field);
|
|
7929
|
+
if (!config) {
|
|
7930
|
+
return undefined;
|
|
7931
|
+
}
|
|
7932
|
+
// Auto-populate filterOptions from rowData if not provided
|
|
7933
|
+
if (!config.filterOptions || config.filterOptions.length === 0) {
|
|
7934
|
+
return {
|
|
7935
|
+
...config,
|
|
7936
|
+
filterOptions: this.getUniqueColumnValues(field),
|
|
7937
|
+
};
|
|
7938
|
+
}
|
|
7939
|
+
return config;
|
|
7915
7940
|
}
|
|
7916
7941
|
/** @ignore */
|
|
7917
7942
|
getColumnSortDirection(field) {
|