@theseam/ui-common 2.0.0 → 2.0.1-beta.103
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/ai/index.d.ts +363 -1
- package/carousel/index.d.ts +21 -1
- package/data-filters/index.d.ts +29 -7
- package/datatable/index.d.ts +299 -3
- package/datatable-alterations-display/index.d.ts +61 -1
- package/fesm2022/theseam-ui-common-ai.mjs +1368 -1
- package/fesm2022/theseam-ui-common-ai.mjs.map +1 -1
- package/fesm2022/theseam-ui-common-carousel.mjs +48 -1
- package/fesm2022/theseam-ui-common-carousel.mjs.map +1 -1
- package/fesm2022/theseam-ui-common-data-filters.mjs +104 -16
- package/fesm2022/theseam-ui-common-data-filters.mjs.map +1 -1
- package/fesm2022/theseam-ui-common-datatable-alterations-display.mjs +197 -1
- package/fesm2022/theseam-ui-common-datatable-alterations-display.mjs.map +1 -1
- package/fesm2022/theseam-ui-common-datatable.mjs +674 -10
- package/fesm2022/theseam-ui-common-datatable.mjs.map +1 -1
- package/fesm2022/theseam-ui-common-file-input.mjs +156 -1
- package/fesm2022/theseam-ui-common-file-input.mjs.map +1 -1
- package/fesm2022/theseam-ui-common-google-maps.mjs +299 -218
- package/fesm2022/theseam-ui-common-google-maps.mjs.map +1 -1
- package/fesm2022/theseam-ui-common-icon.mjs +72 -1
- package/fesm2022/theseam-ui-common-icon.mjs.map +1 -1
- package/fesm2022/theseam-ui-common-table-cell-types.mjs +4 -0
- package/fesm2022/theseam-ui-common-table-cell-types.mjs.map +1 -1
- package/fesm2022/theseam-ui-common-tooltip.mjs +110 -1
- package/fesm2022/theseam-ui-common-tooltip.mjs.map +1 -1
- package/fesm2022/theseam-ui-common-utils.mjs +109 -18
- package/fesm2022/theseam-ui-common-utils.mjs.map +1 -1
- package/fesm2022/theseam-ui-common-widget.mjs +23 -1
- package/fesm2022/theseam-ui-common-widget.mjs.map +1 -1
- package/file-input/index.d.ts +78 -1
- package/google-maps/index.d.ts +35 -23
- package/icon/index.d.ts +33 -3
- package/package.json +6 -3
- package/tooltip/index.d.ts +40 -2
- package/utils/index.d.ts +38 -6
- package/widget/index.d.ts +17 -2
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { InjectionToken, forwardRef, Input, Inject, Optional, Component, ChangeDetectionStrategy, NgModule } from '@angular/core';
|
|
2
|
+
import { InjectionToken, forwardRef, Input, Inject, Optional, Component, ChangeDetectionStrategy, signal, ViewChild, HostBinding, NgModule } from '@angular/core';
|
|
3
3
|
import { of, combineLatest } from 'rxjs';
|
|
4
4
|
import { switchMap, startWith, map, shareReplay } from 'rxjs/operators';
|
|
5
5
|
import * as i1 from '@angular/common';
|
|
@@ -13,10 +13,14 @@ import * as i4 from '@theseam/ui-common/icon';
|
|
|
13
13
|
import { TheSeamIconModule } from '@theseam/ui-common/icon';
|
|
14
14
|
import * as i3$1 from '@theseam/ui-common/toggle-group';
|
|
15
15
|
import { TheSeamToggleGroupModule } from '@theseam/ui-common/toggle-group';
|
|
16
|
+
import * as i4$1 from '@theseam/ui-common/menu';
|
|
17
|
+
import { TheSeamMenuModule } from '@theseam/ui-common/menu';
|
|
18
|
+
import * as i5 from '@theseam/ui-common/buttons';
|
|
19
|
+
import { TheSeamButtonsModule } from '@theseam/ui-common/buttons';
|
|
16
20
|
import { __decorate } from 'tslib';
|
|
17
21
|
import { faSearch } from '@fortawesome/free-solid-svg-icons';
|
|
18
22
|
import { InputBoolean } from '@theseam/ui-common/core';
|
|
19
|
-
import { isNullOrUndefined, hasProperty } from '@theseam/ui-common/utils';
|
|
23
|
+
import { isNullOrUndefined, hasProperty, notNullOrUndefined } from '@theseam/ui-common/utils';
|
|
20
24
|
import { coerceArray } from '@angular/cdk/coercion';
|
|
21
25
|
|
|
22
26
|
const THESEAM_DATA_FILTER = new InjectionToken('TheSeamDataFilter');
|
|
@@ -310,6 +314,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
|
|
|
310
314
|
type: Input
|
|
311
315
|
}] } });
|
|
312
316
|
|
|
317
|
+
const DATA_FILTER_TOGGLE_BUTTON_DROPDOWN_TEXT = 'Select Filter';
|
|
313
318
|
const DATA_FILTER_TOGGLE_BUTTON = {
|
|
314
319
|
provide: THESEAM_DATA_FILTER,
|
|
315
320
|
useExisting: forwardRef(() => DataFilterToggleButtonsComponent),
|
|
@@ -323,6 +328,9 @@ const DefaultToggleButtonsFilterOptions = {
|
|
|
323
328
|
buttons: [],
|
|
324
329
|
exact: false,
|
|
325
330
|
caseSensitive: false,
|
|
331
|
+
maxWidth: undefined,
|
|
332
|
+
filterDropdownLabel: DATA_FILTER_TOGGLE_BUTTON_DROPDOWN_TEXT,
|
|
333
|
+
disableCollapse: undefined,
|
|
326
334
|
};
|
|
327
335
|
function toggleButtonsFilter(data, values, options = DefaultToggleButtonsFilterOptions) {
|
|
328
336
|
if (!data || !values) {
|
|
@@ -367,6 +375,7 @@ function toggleButtonsFilter(data, values, options = DefaultToggleButtonsFilterO
|
|
|
367
375
|
}
|
|
368
376
|
let _uid = 0;
|
|
369
377
|
class DataFilterToggleButtonsComponent {
|
|
378
|
+
_elementRef;
|
|
370
379
|
_filterContainer;
|
|
371
380
|
_filterOptions;
|
|
372
381
|
name = 'toggle-buttons';
|
|
@@ -380,22 +389,31 @@ class DataFilterToggleButtonsComponent {
|
|
|
380
389
|
buttons = this._optDefault('buttons');
|
|
381
390
|
exact = this._optDefault('exact');
|
|
382
391
|
caseSensitive = this._optDefault('caseSensitive');
|
|
392
|
+
maxWidth = this._optDefault('maxWidth');
|
|
393
|
+
filterDropdownLabel = this._optDefault('filterDropdownLabel');
|
|
394
|
+
disableCollapse = this._optDefault('disableCollapse');
|
|
395
|
+
get _collapsedClass() {
|
|
396
|
+
return this.isCollapsed();
|
|
397
|
+
}
|
|
398
|
+
get _expandedClass() {
|
|
399
|
+
return !this.isCollapsed();
|
|
400
|
+
}
|
|
401
|
+
isCollapsed = signal(false, ...(ngDevMode ? [{ debugName: "isCollapsed" }] : []));
|
|
402
|
+
_measureDiv;
|
|
403
|
+
_resizeObserver;
|
|
383
404
|
set value(value) {
|
|
384
405
|
const _value = !isNullOrUndefined(value) ? coerceArray(value) : undefined;
|
|
385
|
-
// console.log('_value', _value, this._control.value)
|
|
386
406
|
if (this._control.value !== _value) {
|
|
387
407
|
this._control.setValue(_value);
|
|
388
408
|
}
|
|
389
409
|
}
|
|
390
410
|
filterStateChanges;
|
|
391
|
-
|
|
411
|
+
activeFilterLabel;
|
|
412
|
+
constructor(_elementRef, _filterContainer, _filterOptions) {
|
|
413
|
+
this._elementRef = _elementRef;
|
|
392
414
|
this._filterContainer = _filterContainer;
|
|
393
415
|
this._filterOptions = _filterOptions;
|
|
394
|
-
this.filterStateChanges = this._control.valueChanges.pipe(
|
|
395
|
-
// tap(v => console.log('v', v)),
|
|
396
|
-
switchMap(() => of(this.filterState())),
|
|
397
|
-
// tap(v => console.log('v2', v)),
|
|
398
|
-
shareReplay({ bufferSize: 1, refCount: true }));
|
|
416
|
+
this.filterStateChanges = this._control.valueChanges.pipe(switchMap(() => of(this.filterState())), shareReplay({ bufferSize: 1, refCount: true }));
|
|
399
417
|
}
|
|
400
418
|
ngOnInit() {
|
|
401
419
|
this._filterContainer.addFilter(this);
|
|
@@ -403,9 +421,32 @@ class DataFilterToggleButtonsComponent {
|
|
|
403
421
|
hasProperty(this._filterOptions, 'initialValue')) {
|
|
404
422
|
this.value = this._optDefault('initialValue');
|
|
405
423
|
}
|
|
424
|
+
this.activeFilterLabel = this.filterStateChanges.pipe(startWith(undefined), map(() => {
|
|
425
|
+
const state = this.filterState();
|
|
426
|
+
const options = state.state.options;
|
|
427
|
+
const selectedOptions = options.buttons
|
|
428
|
+
.filter((o) => coerceArray(state.state.value).includes(o.value))
|
|
429
|
+
.map((o) => o.name);
|
|
430
|
+
return selectedOptions.length > 0
|
|
431
|
+
? selectedOptions.join(', ')
|
|
432
|
+
: this.filterDropdownLabel || DATA_FILTER_TOGGLE_BUTTON_DROPDOWN_TEXT;
|
|
433
|
+
}));
|
|
434
|
+
}
|
|
435
|
+
ngAfterViewInit() {
|
|
436
|
+
this._resizeObserver = new ResizeObserver(() => this._updateCollapsed());
|
|
437
|
+
if (notNullOrUndefined(this._elementRef.nativeElement.parentElement) &&
|
|
438
|
+
this.disableCollapse !== true) {
|
|
439
|
+
this._resizeObserver.observe(this._elementRef.nativeElement.parentElement);
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
ngOnChanges(changes) {
|
|
443
|
+
if (changes['buttons'] && !changes['buttons'].firstChange) {
|
|
444
|
+
this._updateCollapsed();
|
|
445
|
+
}
|
|
406
446
|
}
|
|
407
447
|
ngOnDestroy() {
|
|
408
448
|
this._filterContainer.removeFilter(this);
|
|
449
|
+
this._resizeObserver?.disconnect();
|
|
409
450
|
}
|
|
410
451
|
_optDefault(prop) {
|
|
411
452
|
if (this._filterOptions &&
|
|
@@ -423,11 +464,37 @@ class DataFilterToggleButtonsComponent {
|
|
|
423
464
|
buttons: this.buttons,
|
|
424
465
|
exact: this.exact,
|
|
425
466
|
caseSensitive: this.caseSensitive,
|
|
467
|
+
maxWidth: this.maxWidth,
|
|
468
|
+
filterDropdownLabel: this.filterDropdownLabel,
|
|
469
|
+
disableCollapse: this.disableCollapse,
|
|
426
470
|
};
|
|
427
471
|
}
|
|
428
472
|
filter(data) {
|
|
429
473
|
return this._control.valueChanges.pipe(map((v) => toggleButtonsFilter(data, coerceArray(v), this.options)), startWith(toggleButtonsFilter(data, coerceArray(this._control.value), this.options)));
|
|
430
474
|
}
|
|
475
|
+
_updateCollapsed() {
|
|
476
|
+
if (this.disableCollapse) {
|
|
477
|
+
if (this.isCollapsed()) {
|
|
478
|
+
this.isCollapsed.set(false);
|
|
479
|
+
}
|
|
480
|
+
return;
|
|
481
|
+
}
|
|
482
|
+
if (!this._measureDiv) {
|
|
483
|
+
return;
|
|
484
|
+
}
|
|
485
|
+
const measureWidth = this._measureDiv.nativeElement.scrollWidth;
|
|
486
|
+
// Because of the flex layout, this element won't necessarily grow to its full
|
|
487
|
+
// potential width when in collapsed mode, meaning it stays collapsed even
|
|
488
|
+
// though there's room to expand. If this becomes a problem, we may need to use a
|
|
489
|
+
// different strategy to determine when it's safe to show the full filter bar.
|
|
490
|
+
const clientWidth = this._elementRef.nativeElement.parentElement?.clientWidth;
|
|
491
|
+
// Not enough information to determine collapsed state, so don't update it
|
|
492
|
+
if (isNullOrUndefined(clientWidth)) {
|
|
493
|
+
return;
|
|
494
|
+
}
|
|
495
|
+
const threshold = this.maxWidth != null ? Math.min(clientWidth, this.maxWidth) : clientWidth;
|
|
496
|
+
this.isCollapsed.set(measureWidth > threshold);
|
|
497
|
+
}
|
|
431
498
|
filterState() {
|
|
432
499
|
return {
|
|
433
500
|
// id:
|
|
@@ -438,13 +505,13 @@ class DataFilterToggleButtonsComponent {
|
|
|
438
505
|
},
|
|
439
506
|
};
|
|
440
507
|
}
|
|
441
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: DataFilterToggleButtonsComponent, deps: [{ token: THESEAM_DATA_FILTER_CONTAINER }, { token: THESEAM_DATA_FILTER_OPTIONS, optional: true }], target: i0.ɵɵFactoryTarget.Component });
|
|
442
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.15", type: DataFilterToggleButtonsComponent, isStandalone: false, selector: "seam-data-filter-toggle-buttons", inputs: { filterName: "filterName", properties: "properties", omitProperties: "omitProperties", multiple: "multiple", selectionToggleable: "selectionToggleable", buttons: "buttons", exact: "exact", caseSensitive: "caseSensitive", value: "value" }, providers: [DATA_FILTER_TOGGLE_BUTTON], ngImport: i0, template: "<div\n class=\"btn-group\"\n
|
|
508
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: DataFilterToggleButtonsComponent, deps: [{ token: i0.ElementRef }, { token: THESEAM_DATA_FILTER_CONTAINER }, { token: THESEAM_DATA_FILTER_OPTIONS, optional: true }], target: i0.ɵɵFactoryTarget.Component });
|
|
509
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.15", type: DataFilterToggleButtonsComponent, isStandalone: false, selector: "seam-data-filter-toggle-buttons", inputs: { filterName: "filterName", properties: "properties", omitProperties: "omitProperties", multiple: "multiple", selectionToggleable: "selectionToggleable", buttons: "buttons", exact: "exact", caseSensitive: "caseSensitive", maxWidth: "maxWidth", filterDropdownLabel: "filterDropdownLabel", disableCollapse: "disableCollapse", value: "value" }, host: { properties: { "class.seam-data-filter-toggle-buttons-collapsed": "this._collapsedClass", "class.seam-data-filter-toggle-buttons-expanded": "this._expandedClass" } }, providers: [DATA_FILTER_TOGGLE_BUTTON], viewQueries: [{ propertyName: "_measureDiv", first: true, predicate: ["measureDiv"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<ng-container *ngIf=\"isCollapsed(); else buttonsTpl\">\n <button\n seamButton\n theme=\"primary\"\n size=\"sm\"\n class=\"dropdown-toggle\"\n title=\"View filter options\"\n [seamMenuToggle]=\"buttonsDropdownTpl\"\n >\n {{ activeFilterLabel | async }}\n </button>\n <seam-menu #buttonsDropdownTpl>\n <div\n role=\"group\"\n aria-label=\"Toggle Filters\"\n *ngIf=\"options as opts\"\n [formControl]=\"_control\"\n seamToggleGroup\n [multiple]=\"opts.multiple\"\n [selectionToggleable]=\"opts.selectionToggleable\"\n >\n <ng-container *ngFor=\"let btn of buttons\">\n <button\n seamMenuItem\n [seamToggleGroupOption]=\"btn.value\"\n #opt=\"seamToggleGroupOption\"\n [class.seam-menu-item-active]=\"opt.selected\"\n (click)=\"opt.selected = !opt.selected\"\n title=\"Apply filter\"\n >\n {{ btn.name || btn.value }}\n </button>\n </ng-container>\n </div>\n </seam-menu>\n</ng-container>\n\n<ng-template #buttonsTpl>\n <div\n class=\"btn-group\"\n role=\"group\"\n aria-label=\"Toggle Filters\"\n *ngIf=\"options as opts\"\n [formControl]=\"_control\"\n seamToggleGroup\n [multiple]=\"opts.multiple\"\n [selectionToggleable]=\"opts.selectionToggleable\"\n >\n <ng-container *ngFor=\"let btn of buttons\">\n <button\n type=\"button\"\n class=\"btn btn-sm px-4\"\n [seamToggleGroupOption]=\"btn.value\"\n #opt=\"seamToggleGroupOption\"\n [class.btn-lightgray]=\"!opt.selected\"\n [class.btn-primary]=\"opt.selected\"\n (click)=\"opt.selected = !opt.selected\"\n title=\"Apply filter\"\n >\n {{ btn.name || btn.value }}\n </button>\n </ng-container>\n </div>\n</ng-template>\n\n<!-- Hidden measurement div: always in DOM, used to read natural btn-group width -->\n<div #measureDiv class=\"btn-group btn-group--measure\" aria-hidden=\"true\">\n <ng-container *ngFor=\"let btn of buttons\">\n <button type=\"button\" class=\"btn btn-sm px-4\" tabindex=\"-1\">\n {{ btn.name || btn.value }}\n </button>\n </ng-container>\n</div>\n", styles: [":host{position:relative}.btn-group--measure{visibility:hidden;position:absolute;pointer-events:none;white-space:nowrap;top:0;left:-9999px}.seam-menu-item.seam-menu-item-active,.seam-menu-item.seam-menu-item-active.cdk-mouse-focused:not(:hover){background:#357ebd;color:#fff}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i3$1.ToggleGroupDirective, selector: "[seamToggleGroup]", inputs: ["value", "disabled", "multiple", "selectionToggleable"], outputs: ["change"], exportAs: ["seamToggleGroup"] }, { kind: "directive", type: i3$1.ToggleGroupOptionDirective, selector: "[seamToggleGroupOption]", inputs: ["seamToggleGroupOption", "selected"], outputs: ["selectionChange"], exportAs: ["seamToggleGroupOption"] }, { kind: "component", type: i4$1.MenuComponent, selector: "seam-menu", inputs: ["menuClass", "baseWidth", "animationType"], outputs: ["closed"], exportAs: ["seamMenu"] }, { kind: "directive", type: i4$1.MenuToggleDirective, selector: "[seamMenuToggle]", inputs: ["seamMenuToggle", "positions", "seamMenuTogglePositionsOffsetY"], outputs: ["menuToggle", "menuOpened", "menuClosed"], exportAs: ["seamMenuToggle"] }, { kind: "component", type: i4$1.MenuItemComponent, selector: "[seamMenuItem]", inputs: ["disabled", "role", "icon", "iconClass", "sublevelIcon", "subLevelIconClass", "badgeText", "badgeTheme"], exportAs: ["seamMenuItem"] }, { kind: "component", type: i5.TheSeamButtonComponent, selector: "button[seamButton]", inputs: ["disabled", "theme", "size", "type"], exportAs: ["seamButton"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }] });
|
|
443
510
|
}
|
|
444
511
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: DataFilterToggleButtonsComponent, decorators: [{
|
|
445
512
|
type: Component,
|
|
446
|
-
args: [{ selector: 'seam-data-filter-toggle-buttons', providers: [DATA_FILTER_TOGGLE_BUTTON], standalone: false, template: "<div\n class=\"btn-group\"\n
|
|
447
|
-
}], ctorParameters: () => [{ type: undefined, decorators: [{
|
|
513
|
+
args: [{ selector: 'seam-data-filter-toggle-buttons', providers: [DATA_FILTER_TOGGLE_BUTTON], standalone: false, template: "<ng-container *ngIf=\"isCollapsed(); else buttonsTpl\">\n <button\n seamButton\n theme=\"primary\"\n size=\"sm\"\n class=\"dropdown-toggle\"\n title=\"View filter options\"\n [seamMenuToggle]=\"buttonsDropdownTpl\"\n >\n {{ activeFilterLabel | async }}\n </button>\n <seam-menu #buttonsDropdownTpl>\n <div\n role=\"group\"\n aria-label=\"Toggle Filters\"\n *ngIf=\"options as opts\"\n [formControl]=\"_control\"\n seamToggleGroup\n [multiple]=\"opts.multiple\"\n [selectionToggleable]=\"opts.selectionToggleable\"\n >\n <ng-container *ngFor=\"let btn of buttons\">\n <button\n seamMenuItem\n [seamToggleGroupOption]=\"btn.value\"\n #opt=\"seamToggleGroupOption\"\n [class.seam-menu-item-active]=\"opt.selected\"\n (click)=\"opt.selected = !opt.selected\"\n title=\"Apply filter\"\n >\n {{ btn.name || btn.value }}\n </button>\n </ng-container>\n </div>\n </seam-menu>\n</ng-container>\n\n<ng-template #buttonsTpl>\n <div\n class=\"btn-group\"\n role=\"group\"\n aria-label=\"Toggle Filters\"\n *ngIf=\"options as opts\"\n [formControl]=\"_control\"\n seamToggleGroup\n [multiple]=\"opts.multiple\"\n [selectionToggleable]=\"opts.selectionToggleable\"\n >\n <ng-container *ngFor=\"let btn of buttons\">\n <button\n type=\"button\"\n class=\"btn btn-sm px-4\"\n [seamToggleGroupOption]=\"btn.value\"\n #opt=\"seamToggleGroupOption\"\n [class.btn-lightgray]=\"!opt.selected\"\n [class.btn-primary]=\"opt.selected\"\n (click)=\"opt.selected = !opt.selected\"\n title=\"Apply filter\"\n >\n {{ btn.name || btn.value }}\n </button>\n </ng-container>\n </div>\n</ng-template>\n\n<!-- Hidden measurement div: always in DOM, used to read natural btn-group width -->\n<div #measureDiv class=\"btn-group btn-group--measure\" aria-hidden=\"true\">\n <ng-container *ngFor=\"let btn of buttons\">\n <button type=\"button\" class=\"btn btn-sm px-4\" tabindex=\"-1\">\n {{ btn.name || btn.value }}\n </button>\n </ng-container>\n</div>\n", styles: [":host{position:relative}.btn-group--measure{visibility:hidden;position:absolute;pointer-events:none;white-space:nowrap;top:0;left:-9999px}.seam-menu-item.seam-menu-item-active,.seam-menu-item.seam-menu-item-active.cdk-mouse-focused:not(:hover){background:#357ebd;color:#fff}\n"] }]
|
|
514
|
+
}], ctorParameters: () => [{ type: i0.ElementRef }, { type: undefined, decorators: [{
|
|
448
515
|
type: Inject,
|
|
449
516
|
args: [THESEAM_DATA_FILTER_CONTAINER]
|
|
450
517
|
}] }, { type: undefined, decorators: [{
|
|
@@ -468,6 +535,21 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
|
|
|
468
535
|
type: Input
|
|
469
536
|
}], caseSensitive: [{
|
|
470
537
|
type: Input
|
|
538
|
+
}], maxWidth: [{
|
|
539
|
+
type: Input
|
|
540
|
+
}], filterDropdownLabel: [{
|
|
541
|
+
type: Input
|
|
542
|
+
}], disableCollapse: [{
|
|
543
|
+
type: Input
|
|
544
|
+
}], _collapsedClass: [{
|
|
545
|
+
type: HostBinding,
|
|
546
|
+
args: ['class.seam-data-filter-toggle-buttons-collapsed']
|
|
547
|
+
}], _expandedClass: [{
|
|
548
|
+
type: HostBinding,
|
|
549
|
+
args: ['class.seam-data-filter-toggle-buttons-expanded']
|
|
550
|
+
}], _measureDiv: [{
|
|
551
|
+
type: ViewChild,
|
|
552
|
+
args: ['measureDiv']
|
|
471
553
|
}], value: [{
|
|
472
554
|
type: Input
|
|
473
555
|
}] } });
|
|
@@ -506,7 +588,9 @@ class TheSeamDataFiltersModule {
|
|
|
506
588
|
TheSeamFormFieldModule,
|
|
507
589
|
FontAwesomeModule,
|
|
508
590
|
TheSeamToggleGroupModule,
|
|
509
|
-
TheSeamIconModule
|
|
591
|
+
TheSeamIconModule,
|
|
592
|
+
TheSeamMenuModule,
|
|
593
|
+
TheSeamButtonsModule], exports: [DataFilterSearchComponent,
|
|
510
594
|
DataFilterTextComponent,
|
|
511
595
|
DataFilterToggleButtonsComponent] });
|
|
512
596
|
static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: TheSeamDataFiltersModule, providers: [...filterDefProviders], imports: [CommonModule,
|
|
@@ -514,7 +598,9 @@ class TheSeamDataFiltersModule {
|
|
|
514
598
|
TheSeamFormFieldModule,
|
|
515
599
|
FontAwesomeModule,
|
|
516
600
|
TheSeamToggleGroupModule,
|
|
517
|
-
TheSeamIconModule
|
|
601
|
+
TheSeamIconModule,
|
|
602
|
+
TheSeamMenuModule,
|
|
603
|
+
TheSeamButtonsModule] });
|
|
518
604
|
}
|
|
519
605
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: TheSeamDataFiltersModule, decorators: [{
|
|
520
606
|
type: NgModule,
|
|
@@ -527,6 +613,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
|
|
|
527
613
|
FontAwesomeModule,
|
|
528
614
|
TheSeamToggleGroupModule,
|
|
529
615
|
TheSeamIconModule,
|
|
616
|
+
TheSeamMenuModule,
|
|
617
|
+
TheSeamButtonsModule,
|
|
530
618
|
],
|
|
531
619
|
providers: [...filterDefProviders],
|
|
532
620
|
exports: [...filterComponents],
|
|
@@ -537,5 +625,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
|
|
|
537
625
|
* Generated bundle index. Do not edit.
|
|
538
626
|
*/
|
|
539
627
|
|
|
540
|
-
export { DATA_FILTER_SEARCH, DATA_FILTER_TEXT, DATA_FILTER_TOGGLE_BUTTON, DataFilterSearchComponent, DataFilterTextComponent, DataFilterToggleButtonsComponent, DefaultSearchFilterOptions, DefaultTextFilterOptions, DefaultToggleButtonsFilterOptions, THESEAM_DATA_FILTER, THESEAM_DATA_FILTER_CONTAINER, THESEAM_DATA_FILTER_DEF, THESEAM_DATA_FILTER_OPTIONS, TheSeamDataFiltersModule, composeDataFilterStates, composeDataFilters, filterOperator, searchDataFilter, textDataFilter, toggleButtonsFilter };
|
|
628
|
+
export { DATA_FILTER_SEARCH, DATA_FILTER_TEXT, DATA_FILTER_TOGGLE_BUTTON, DATA_FILTER_TOGGLE_BUTTON_DROPDOWN_TEXT, DataFilterSearchComponent, DataFilterTextComponent, DataFilterToggleButtonsComponent, DefaultSearchFilterOptions, DefaultTextFilterOptions, DefaultToggleButtonsFilterOptions, THESEAM_DATA_FILTER, THESEAM_DATA_FILTER_CONTAINER, THESEAM_DATA_FILTER_DEF, THESEAM_DATA_FILTER_OPTIONS, TheSeamDataFiltersModule, composeDataFilterStates, composeDataFilters, filterOperator, searchDataFilter, textDataFilter, toggleButtonsFilter };
|
|
541
629
|
//# sourceMappingURL=theseam-ui-common-data-filters.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"theseam-ui-common-data-filters.mjs","sources":["../../../projects/ui-common/data-filters/data-filter.ts","../../../projects/ui-common/data-filters/data-filter-def.ts","../../../projects/ui-common/data-filters/data-filter-container.ts","../../../projects/ui-common/data-filters/filters/data-filter-text/data-filter-text.component.ts","../../../projects/ui-common/data-filters/filters/data-filter-text/data-filter-text.component.html","../../../projects/ui-common/data-filters/filters/data-filter-search/data-filter-search.component.ts","../../../projects/ui-common/data-filters/filters/data-filter-search/data-filter-search.component.html","../../../projects/ui-common/data-filters/filters/data-filter-toggle-buttons/data-filter-toggle-buttons.component.ts","../../../projects/ui-common/data-filters/filters/data-filter-toggle-buttons/data-filter-toggle-buttons.component.html","../../../projects/ui-common/data-filters/data-filters.module.ts","../../../projects/ui-common/data-filters/theseam-ui-common-data-filters.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core'\nimport { combineLatest, Observable, of } from 'rxjs'\nimport { map, startWith, switchMap } from 'rxjs/operators'\n\nexport type DataFilterFunction = <T>(data: T[]) => Observable<T[]>\n\n/**\n * State of the filter that would allow an external operation to apply the\n * filtering.\n *\n * This is primarily for server-side filtering.\n */\nexport interface DataFilterState {\n /**\n * DataFilter's name.\n */\n name: string\n\n /**\n * Anything necessary for an external implementation to apply this filter.\n */\n state: { [key: string]: any }\n}\n\n// TODO: Consider adding something, such as a priority or order, to allow the\n// order the filter functions are called in to be declared/influenced\n// externally. This would allow the filters that will most likely filter out\n// many records quickly to be run before the heavy processing filters.\nexport interface DataFilter {\n /**\n * Name used when referencing filter by string.\n */\n name: string\n\n /**\n * Optional override for the filter name used in `filterState()`.\n *\n * When multiple instances of the same filter type exist on a page, each\n * instance shares the same `name`. Set `filterName` to give an instance a\n * distinct key so that filter-state mappers can differentiate them.\n *\n * If unset, `filterState()` falls back to `name`.\n */\n filterName?: string\n\n /**\n * Unique value to prevent a filter being used more than once if it ends up\n * being registered more than once.\n */\n uid: string\n\n /**\n *\n */\n filterStateChanges: Observable<DataFilterState>\n\n /**\n * Filters the data based on the conditions of the filter.\n */\n filter<T>(data: T[]): Observable<T[]>\n\n /**\n *\n */\n filterState(): DataFilterState\n}\n\nexport const THESEAM_DATA_FILTER = new InjectionToken<DataFilter>(\n 'TheSeamDataFilter',\n)\nexport const THESEAM_DATA_FILTER_OPTIONS = new InjectionToken<object>(\n 'TheSeamDataFilterOptions',\n)\n\nexport function filterOperator<T>(filterFn: DataFilterFunction) {\n return (source$: Observable<T[]>) => source$.pipe(switchMap(filterFn))\n}\n\nexport function composeDataFilters(filters: DataFilter[]) {\n const filterFunctions = filters.map((f) => filterOperator(f.filter.bind(f)))\n return (source$: Observable<any>) => {\n let src$ = source$\n for (const f of filterFunctions) {\n src$ = src$.pipe(f)\n }\n return src$\n }\n}\n\nexport function composeDataFilterStates(\n filters: DataFilter[],\n): Observable<DataFilterState[]> {\n if (filters.length === 0) {\n return of([])\n }\n\n return combineLatest(\n filters.map((f) =>\n f.filterStateChanges.pipe(\n startWith(undefined),\n map(() => f.filterState()),\n ),\n ),\n )\n}\n\n/** @deprecated Use `DataFilter` instead. */\nexport type IDataFilter = DataFilter\n\n/** @deprecated Use `IDataFilterFunction` instead. */\nexport type IDataFilterFunction = DataFilterFunction\n","import { InjectionToken } from '@angular/core'\n\nimport { IDataFilter } from './data-filter'\n\nexport interface IDataFilterDef<T = any> {\n name: string\n\n /**\n * Component that controls the filter.\n */\n component: IDataFilter\n}\n\nexport const THESEAM_DATA_FILTER_DEF = new InjectionToken<IDataFilterDef[]>(\n 'TheSeamDataFilter',\n)\n","import { InjectionToken } from '@angular/core'\nimport { IDataFilter } from './data-filter'\n\nexport interface DataFilterContainer {\n filters(): IDataFilter[]\n\n addFilter(dataFilter: IDataFilter): void\n\n removeFilter(dataFilter: IDataFilter): void\n}\n\nexport const THESEAM_DATA_FILTER_CONTAINER =\n new InjectionToken<DataFilterContainer>('DataFilterContainer')\n","import { BooleanInput } from '@angular/cdk/coercion'\nimport {\n Component,\n forwardRef,\n Inject,\n Input,\n OnDestroy,\n OnInit,\n Optional,\n TemplateRef,\n} from '@angular/core'\nimport { UntypedFormControl } from '@angular/forms'\nimport { Observable, of } from 'rxjs'\nimport { map, shareReplay, startWith, switchMap } from 'rxjs/operators'\n\nimport { InputBoolean } from '@theseam/ui-common/core'\nimport { isNullOrUndefined } from '@theseam/ui-common/utils'\n\nimport {\n DataFilterState,\n IDataFilter,\n THESEAM_DATA_FILTER,\n THESEAM_DATA_FILTER_OPTIONS,\n} from '../../data-filter'\nimport { THESEAM_DATA_FILTER_CONTAINER } from '../../data-filter-container'\nimport type { DataFilterContainer } from '../../data-filter-container'\nimport { ITextFilterOptions } from './text-filter-options'\n\nexport const DATA_FILTER_TEXT: any = {\n provide: THESEAM_DATA_FILTER,\n useExisting: forwardRef(() => DataFilterTextComponent),\n multi: true,\n}\n\nexport const DefaultTextFilterOptions: ITextFilterOptions = {\n properties: undefined,\n omitProperties: undefined,\n exact: false,\n caseSensitive: false,\n}\n\nexport function textDataFilter(\n data: any[],\n text: string,\n options = DefaultTextFilterOptions,\n) {\n if (!data || !text) {\n return data\n }\n\n if (data.length <= 0) {\n return data\n }\n\n let props = options ? options.properties : undefined\n if (!props) {\n props = []\n let keys = Object.keys(data[0])\n if (options && options.omitProperties) {\n keys = keys.filter(\n (key) => !(options.omitProperties || []).find((p) => p === key),\n )\n }\n for (const key of keys) {\n if (Object.prototype.hasOwnProperty.call(data[0], key)) {\n props.push(key)\n }\n }\n }\n\n const filtered: any[] = []\n\n for (const item of data) {\n for (const p of props) {\n let value1 = `${item[p]}`\n let value2 = text\n\n if (!options.caseSensitive) {\n value1 = value1.toLowerCase()\n value2 = value2.toLowerCase()\n }\n\n if (item[p] && value1.indexOf(value2) !== (options.exact ? 0 : -1)) {\n filtered.push(item)\n break\n }\n }\n }\n\n return filtered\n}\n\nlet _uid = 0\n\n@Component({\n selector: 'seam-data-filter-text',\n templateUrl: './data-filter-text.component.html',\n styleUrls: ['./data-filter-text.component.scss'],\n providers: [DATA_FILTER_TEXT],\n standalone: false,\n})\nexport class DataFilterTextComponent implements OnInit, OnDestroy, IDataFilter {\n static ngAcceptInputType_exact: BooleanInput\n static ngAcceptInputType_caseSensitive: BooleanInput\n\n public readonly name = 'text'\n public readonly uid = `text__${_uid++}`\n\n @Input() filterName: string | undefined\n\n _control = new UntypedFormControl()\n\n @Input() properties: string[] | undefined | null =\n this._optDefault('properties')\n @Input() omitProperties: string[] | undefined | null =\n this._optDefault('omitProperties')\n @Input() @InputBoolean() exact: boolean = this._optDefault('exact')\n @Input() @InputBoolean() caseSensitive: boolean =\n this._optDefault('caseSensitive')\n\n @Input() placeholder: string | undefined | null\n @Input() iconTpl: TemplateRef<HTMLElement> | undefined | null\n\n @Input()\n set value(value: string | string[]) {\n const _value = !isNullOrUndefined(value) ? `${value}` : ''\n if (this._control.value !== _value) {\n this._control.setValue(_value)\n }\n }\n\n public readonly filterStateChanges: Observable<DataFilterState>\n\n constructor(\n @Inject(THESEAM_DATA_FILTER_CONTAINER)\n private _filterContainer: DataFilterContainer,\n @Optional()\n @Inject(THESEAM_DATA_FILTER_OPTIONS)\n private _filterOptions: ITextFilterOptions | null,\n ) {\n this.filterStateChanges = this._control.valueChanges.pipe(\n switchMap(() => of(this.filterState())),\n shareReplay({ bufferSize: 1, refCount: true }),\n )\n }\n\n ngOnInit() {\n this._filterContainer.addFilter(this)\n }\n\n ngOnDestroy() {\n this._filterContainer.removeFilter(this)\n }\n\n private _optDefault<K extends keyof ITextFilterOptions>(prop: K) {\n if (\n this._filterOptions &&\n Object.prototype.hasOwnProperty.call(this._filterOptions, prop)\n ) {\n return this._filterOptions[prop]\n }\n return DefaultTextFilterOptions[prop]\n }\n\n get options(): ITextFilterOptions {\n return {\n properties: this.properties ?? undefined,\n omitProperties: this.omitProperties ?? undefined,\n exact: this.exact,\n caseSensitive: this.caseSensitive,\n }\n }\n\n public filter<T>(data: T[]): Observable<T[]> {\n return this._control.valueChanges.pipe(\n map((v) => textDataFilter(data, v, this.options)),\n startWith(textDataFilter(data, this._control.value, this.options)),\n )\n }\n\n public filterState(): DataFilterState {\n return {\n // id:\n name: this.filterName ?? this.name,\n state: {\n value: this._control.value,\n options: this.options,\n },\n }\n }\n}\n","<div\n class=\"position-relative\"\n [class.data-filter-text-has-icon]=\"iconTpl\"\n (click)=\"inp.focus()\"\n>\n <label [attr.for]=\"inp.id\" class=\"sr-only\">Text filter</label>\n <input\n seamInput\n #inp=\"seamInput\"\n seamInputSize=\"sm\"\n [formControl]=\"_control\"\n [placeholder]=\"placeholder\"\n />\n <ng-container *ngIf=\"iconTpl\">\n <ng-container *ngTemplateOutlet=\"iconTpl\"></ng-container>\n </ng-container>\n</div>\n","import { BooleanInput } from '@angular/cdk/coercion'\nimport {\n ChangeDetectionStrategy,\n Component,\n forwardRef,\n Inject,\n Input,\n OnDestroy,\n OnInit,\n Optional,\n TemplateRef,\n} from '@angular/core'\nimport { UntypedFormControl } from '@angular/forms'\nimport { Observable, of } from 'rxjs'\nimport { map, shareReplay, startWith, switchMap } from 'rxjs/operators'\n\nimport { faSearch } from '@fortawesome/free-solid-svg-icons'\n\nimport { InputBoolean } from '@theseam/ui-common/core'\nimport type { SeamIcon } from '@theseam/ui-common/icon'\nimport { isNullOrUndefined } from '@theseam/ui-common/utils'\n\nimport {\n DataFilterState,\n IDataFilter,\n THESEAM_DATA_FILTER,\n THESEAM_DATA_FILTER_OPTIONS,\n} from '../../data-filter'\nimport { THESEAM_DATA_FILTER_CONTAINER } from '../../data-filter-container'\nimport type { DataFilterContainer } from '../../data-filter-container'\nimport { textDataFilter } from '../data-filter-text/data-filter-text.component'\n\nimport { ISearchFilterOptions } from './search-filter-options'\n\nexport const DATA_FILTER_SEARCH: any = {\n provide: THESEAM_DATA_FILTER,\n useExisting: forwardRef(() => DataFilterSearchComponent),\n multi: true,\n}\n\nexport const DefaultSearchFilterOptions: ISearchFilterOptions = {\n properties: undefined,\n omitProperties: undefined,\n exact: false,\n caseSensitive: false,\n}\n\nexport function searchDataFilter(\n data: any[],\n values: string,\n options = DefaultSearchFilterOptions,\n) {\n return textDataFilter(data, values, options)\n}\n\nlet _uid = 0\n\n@Component({\n selector: 'seam-data-filter-search',\n templateUrl: './data-filter-search.component.html',\n styleUrls: ['./data-filter-search.component.scss'],\n providers: [DATA_FILTER_SEARCH],\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: false,\n})\nexport class DataFilterSearchComponent\n implements OnInit, OnDestroy, IDataFilter\n{\n static ngAcceptInputType_exact: BooleanInput\n static ngAcceptInputType_caseSensitive: BooleanInput\n\n public readonly name = 'search'\n public readonly uid = `search__${_uid++}`\n\n @Input() filterName: string | undefined\n\n _control = new UntypedFormControl()\n\n @Input() properties: string[] | undefined | null =\n this._optDefault('properties')\n @Input() omitProperties: string[] | undefined | null =\n this._optDefault('omitProperties')\n @Input() @InputBoolean() exact: boolean = this._optDefault('exact')\n @Input() @InputBoolean() caseSensitive: boolean =\n this._optDefault('caseSensitive')\n\n @Input() placeholder: string | undefined | null = 'Search...'\n @Input() icon: SeamIcon | undefined | null = faSearch\n @Input() iconTpl?: TemplateRef<HTMLElement>\n\n @Input()\n set value(value: string | string[]) {\n const _value = !isNullOrUndefined(value) ? `${value}` : ''\n if (this._control.value !== _value) {\n this._control.setValue(_value)\n }\n }\n\n public readonly filterStateChanges: Observable<DataFilterState>\n\n constructor(\n @Inject(THESEAM_DATA_FILTER_CONTAINER)\n private _filterContainer: DataFilterContainer,\n @Optional()\n @Inject(THESEAM_DATA_FILTER_OPTIONS)\n private _filterOptions: ISearchFilterOptions | null,\n ) {\n this.filterStateChanges = this._control.valueChanges.pipe(\n switchMap(() => of(this.filterState())),\n shareReplay({ bufferSize: 1, refCount: true }),\n )\n }\n\n ngOnInit() {\n this._filterContainer.addFilter(this)\n }\n\n ngOnDestroy() {\n this._filterContainer.removeFilter(this)\n }\n\n private _optDefault<K extends keyof ISearchFilterOptions>(prop: K) {\n if (\n this._filterOptions &&\n Object.prototype.hasOwnProperty.call(this._filterOptions, prop)\n ) {\n return this._filterOptions[prop]\n }\n return DefaultSearchFilterOptions[prop]\n }\n\n get options(): ISearchFilterOptions {\n return {\n properties: this.properties ?? undefined,\n omitProperties: this.omitProperties ?? undefined,\n exact: this.exact,\n caseSensitive: this.caseSensitive,\n }\n }\n\n public filter<T>(data: T[]): Observable<T[]> {\n return this._control.valueChanges.pipe(\n map((v) => searchDataFilter(data, v, this.options)),\n startWith(searchDataFilter(data, this._control.value, this.options)),\n )\n }\n\n public filterState(): DataFilterState {\n return {\n // id:\n name: this.filterName ?? this.name,\n state: {\n value: this._control.value,\n options: this.options,\n },\n }\n }\n}\n","<div\n class=\"position-relative\"\n [class.data-filter-search-has-icon]=\"iconTpl || icon\"\n (click)=\"inp.focus()\"\n>\n <label [attr.for]=\"inp.id\" class=\"sr-only\">Search filter</label>\n <input\n seamInput\n #inp=\"seamInput\"\n seamInputSize=\"sm\"\n [formControl]=\"_control\"\n [placeholder]=\"placeholder\"\n />\n <ng-container *ngIf=\"iconTpl; else searchIconTpl\">\n <div class=\"data-filter-search--icon-wrapper\">\n <ng-container *ngTemplateOutlet=\"iconTpl\"></ng-container>\n </div>\n </ng-container>\n <ng-template #searchIconTpl>\n <ng-container *ngIf=\"icon\">\n <div class=\"data-filter-search--icon-wrapper\">\n <seam-icon [icon]=\"icon\" class=\"text-muted\"></seam-icon>\n </div>\n </ng-container>\n </ng-template>\n</div>\n","import { coerceArray } from '@angular/cdk/coercion'\nimport {\n Component,\n forwardRef,\n Inject,\n Input,\n OnDestroy,\n OnInit,\n Optional,\n} from '@angular/core'\nimport { UntypedFormControl } from '@angular/forms'\nimport { Observable, of } from 'rxjs'\nimport { map, shareReplay, startWith, switchMap, tap } from 'rxjs/operators'\n\nimport { hasProperty, isNullOrUndefined } from '@theseam/ui-common/utils'\n\nimport {\n DataFilterState,\n IDataFilter,\n THESEAM_DATA_FILTER,\n THESEAM_DATA_FILTER_OPTIONS,\n} from '../../data-filter'\nimport { THESEAM_DATA_FILTER_CONTAINER } from '../../data-filter-container'\nimport type { DataFilterContainer } from '../../data-filter-container'\nimport { textDataFilter } from '../data-filter-text/data-filter-text.component'\nimport { ITextFilterOptions } from '../data-filter-text/text-filter-options'\n\nexport const DATA_FILTER_TOGGLE_BUTTON: any = {\n provide: THESEAM_DATA_FILTER,\n useExisting: forwardRef(() => DataFilterToggleButtonsComponent),\n multi: true,\n}\n\nexport interface IToggleButton {\n name: string\n value: string\n comparator?: (value: any, row: any, index: number) => -1 | 0 | 1\n}\n\nexport interface IToggleButtonsFilterOptions extends ITextFilterOptions {\n selectionToggleable: boolean\n multiple: boolean\n buttons: IToggleButton[]\n initialValue?: any\n}\n\nexport const DefaultToggleButtonsFilterOptions: IToggleButtonsFilterOptions = {\n properties: undefined,\n omitProperties: undefined,\n multiple: false,\n selectionToggleable: false,\n buttons: [],\n exact: false,\n caseSensitive: false,\n}\n\nexport function toggleButtonsFilter(\n data: any[],\n values: string[],\n options = DefaultToggleButtonsFilterOptions,\n) {\n if (!data || !values) {\n return data\n }\n\n const customComparatorBtns: IToggleButton[] = []\n for (const btn of options.buttons) {\n if (btn.comparator) {\n customComparatorBtns.push(btn)\n }\n }\n\n let _data = data\n for (const val of values) {\n if (val === '') {\n continue\n }\n\n let cmp\n for (const btn of customComparatorBtns) {\n if (btn.value === val) {\n cmp = btn.comparator\n }\n }\n if (cmp) {\n const filtered: any[] = []\n for (let i = 0; i < _data.length; i++) {\n if (cmp(val, _data[i], i) !== -1) {\n filtered.push(_data[i])\n }\n }\n _data = filtered\n } else {\n _data = textDataFilter(_data, val, {\n properties: options.properties,\n omitProperties: options.omitProperties,\n exact: options.exact,\n caseSensitive: options.caseSensitive,\n })\n }\n }\n return _data\n}\n\nlet _uid = 0\n\n@Component({\n selector: 'seam-data-filter-toggle-buttons',\n templateUrl: './data-filter-toggle-buttons.component.html',\n styleUrls: ['./data-filter-toggle-buttons.component.scss'],\n providers: [DATA_FILTER_TOGGLE_BUTTON],\n standalone: false,\n})\nexport class DataFilterToggleButtonsComponent\n implements OnInit, OnDestroy, IDataFilter\n{\n public readonly name = 'toggle-buttons'\n public readonly uid = `toggle-buttons__${_uid++}`\n\n @Input() filterName: string | undefined\n\n _control = new UntypedFormControl()\n\n @Input() properties = this._optDefault('properties')\n @Input() omitProperties = this._optDefault('omitProperties')\n @Input() multiple = this._optDefault('multiple')\n @Input() selectionToggleable = this._optDefault('selectionToggleable')\n @Input() buttons = this._optDefault('buttons')\n @Input() exact = this._optDefault('exact')\n @Input() caseSensitive = this._optDefault('caseSensitive')\n\n @Input()\n set value(value: string | string[]) {\n const _value = !isNullOrUndefined(value) ? coerceArray(value) : undefined\n // console.log('_value', _value, this._control.value)\n if (this._control.value !== _value) {\n this._control.setValue(_value)\n }\n }\n\n public readonly filterStateChanges: Observable<DataFilterState>\n\n constructor(\n @Inject(THESEAM_DATA_FILTER_CONTAINER)\n private _filterContainer: DataFilterContainer,\n @Optional()\n @Inject(THESEAM_DATA_FILTER_OPTIONS)\n private _filterOptions: IToggleButtonsFilterOptions | null,\n ) {\n this.filterStateChanges = this._control.valueChanges.pipe(\n // tap(v => console.log('v', v)),\n switchMap(() => of(this.filterState())),\n // tap(v => console.log('v2', v)),\n shareReplay({ bufferSize: 1, refCount: true }),\n )\n }\n\n ngOnInit() {\n this._filterContainer.addFilter(this)\n if (\n this._filterOptions &&\n hasProperty(this._filterOptions, 'initialValue')\n ) {\n this.value = this._optDefault('initialValue')\n }\n }\n\n ngOnDestroy() {\n this._filterContainer.removeFilter(this)\n }\n\n private _optDefault<K extends keyof IToggleButtonsFilterOptions>(prop: K) {\n if (\n this._filterOptions &&\n Object.prototype.hasOwnProperty.call(this._filterOptions, prop)\n ) {\n return this._filterOptions[prop]\n }\n return DefaultToggleButtonsFilterOptions[prop]\n }\n\n get options(): IToggleButtonsFilterOptions {\n return {\n properties: this.properties,\n omitProperties: this.omitProperties,\n multiple: this.multiple,\n selectionToggleable: this.selectionToggleable,\n buttons: this.buttons,\n exact: this.exact,\n caseSensitive: this.caseSensitive,\n }\n }\n\n public filter<T>(data: T[]): Observable<T[]> {\n return this._control.valueChanges.pipe(\n map((v) => toggleButtonsFilter(data, coerceArray(v), this.options)),\n startWith(\n toggleButtonsFilter(\n data,\n coerceArray(this._control.value),\n this.options,\n ),\n ),\n )\n }\n\n public filterState(): DataFilterState {\n return {\n // id:\n name: this.filterName ?? this.name,\n state: {\n value: this._control.value,\n options: this.options,\n },\n }\n }\n}\n","<div\n class=\"btn-group\"\n role=\"group\"\n aria-label=\"Progress Filter\"\n *ngIf=\"options as opts\"\n [formControl]=\"_control\"\n seamToggleGroup\n [multiple]=\"opts.multiple\"\n [selectionToggleable]=\"opts.selectionToggleable\"\n>\n <ng-container *ngFor=\"let btn of buttons\">\n <button\n type=\"button\"\n class=\"btn btn-sm px-4\"\n [seamToggleGroupOption]=\"btn.value\"\n #opt=\"seamToggleGroupOption\"\n [class.btn-lightgray]=\"!opt.selected\"\n [class.btn-primary]=\"opt.selected\"\n (click)=\"opt.selected = !opt.selected\"\n >\n {{ btn.name || btn.value }}\n </button>\n </ng-container>\n</div>\n","import { CommonModule } from '@angular/common'\nimport { NgModule } from '@angular/core'\nimport { ReactiveFormsModule } from '@angular/forms'\n\nimport { FontAwesomeModule } from '@fortawesome/angular-fontawesome'\n\nimport { TheSeamFormFieldModule } from '@theseam/ui-common/form-field'\nimport { TheSeamIconModule } from '@theseam/ui-common/icon'\nimport { TheSeamToggleGroupModule } from '@theseam/ui-common/toggle-group'\n\nimport { THESEAM_DATA_FILTER_DEF } from './data-filter-def'\nimport { DataFilterSearchComponent } from './filters/data-filter-search/data-filter-search.component'\nimport { DataFilterTextComponent } from './filters/data-filter-text/data-filter-text.component'\nimport { DataFilterToggleButtonsComponent } from './filters/data-filter-toggle-buttons/data-filter-toggle-buttons.component'\n\nconst filterComponents = [\n DataFilterSearchComponent,\n DataFilterTextComponent,\n DataFilterToggleButtonsComponent,\n]\n\nconst filterDefProviders = [\n {\n provide: THESEAM_DATA_FILTER_DEF,\n useValue: { name: 'search', component: DataFilterSearchComponent },\n multi: true,\n },\n {\n provide: THESEAM_DATA_FILTER_DEF,\n useValue: { name: 'text', component: DataFilterTextComponent },\n multi: true,\n },\n {\n provide: THESEAM_DATA_FILTER_DEF,\n useValue: {\n name: 'toggle-buttons',\n component: DataFilterToggleButtonsComponent,\n },\n multi: true,\n },\n]\n\n@NgModule({\n declarations: [...filterComponents],\n imports: [\n CommonModule,\n ReactiveFormsModule,\n TheSeamFormFieldModule,\n FontAwesomeModule,\n TheSeamToggleGroupModule,\n TheSeamIconModule,\n ],\n providers: [...filterDefProviders],\n exports: [...filterComponents],\n})\nexport class TheSeamDataFiltersModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["_uid","i3"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"theseam-ui-common-data-filters.mjs","sources":["../../../projects/ui-common/data-filters/data-filter.ts","../../../projects/ui-common/data-filters/data-filter-def.ts","../../../projects/ui-common/data-filters/data-filter-container.ts","../../../projects/ui-common/data-filters/filters/data-filter-text/data-filter-text.component.ts","../../../projects/ui-common/data-filters/filters/data-filter-text/data-filter-text.component.html","../../../projects/ui-common/data-filters/filters/data-filter-search/data-filter-search.component.ts","../../../projects/ui-common/data-filters/filters/data-filter-search/data-filter-search.component.html","../../../projects/ui-common/data-filters/filters/data-filter-toggle-buttons/data-filter-toggle-buttons.component.ts","../../../projects/ui-common/data-filters/filters/data-filter-toggle-buttons/data-filter-toggle-buttons.component.html","../../../projects/ui-common/data-filters/data-filters.module.ts","../../../projects/ui-common/data-filters/theseam-ui-common-data-filters.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core'\nimport { combineLatest, Observable, of } from 'rxjs'\nimport { map, startWith, switchMap } from 'rxjs/operators'\n\nexport type DataFilterFunction = <T>(data: T[]) => Observable<T[]>\n\n/**\n * State of the filter that would allow an external operation to apply the\n * filtering.\n *\n * This is primarily for server-side filtering.\n */\nexport interface DataFilterState {\n /**\n * DataFilter's name.\n */\n name: string\n\n /**\n * Anything necessary for an external implementation to apply this filter.\n */\n state: { [key: string]: any }\n}\n\n// TODO: Consider adding something, such as a priority or order, to allow the\n// order the filter functions are called in to be declared/influenced\n// externally. This would allow the filters that will most likely filter out\n// many records quickly to be run before the heavy processing filters.\nexport interface DataFilter {\n /**\n * Name used when referencing filter by string.\n */\n name: string\n\n /**\n * Optional override for the filter name used in `filterState()`.\n *\n * When multiple instances of the same filter type exist on a page, each\n * instance shares the same `name`. Set `filterName` to give an instance a\n * distinct key so that filter-state mappers can differentiate them.\n *\n * If unset, `filterState()` falls back to `name`.\n */\n filterName?: string\n\n /**\n * Unique value to prevent a filter being used more than once if it ends up\n * being registered more than once.\n */\n uid: string\n\n /**\n *\n */\n filterStateChanges: Observable<DataFilterState>\n\n /**\n * Filters the data based on the conditions of the filter.\n */\n filter<T>(data: T[]): Observable<T[]>\n\n /**\n *\n */\n filterState(): DataFilterState\n}\n\nexport const THESEAM_DATA_FILTER = new InjectionToken<DataFilter>(\n 'TheSeamDataFilter',\n)\nexport const THESEAM_DATA_FILTER_OPTIONS = new InjectionToken<object>(\n 'TheSeamDataFilterOptions',\n)\n\nexport function filterOperator<T>(filterFn: DataFilterFunction) {\n return (source$: Observable<T[]>) => source$.pipe(switchMap(filterFn))\n}\n\nexport function composeDataFilters(filters: DataFilter[]) {\n const filterFunctions = filters.map((f) => filterOperator(f.filter.bind(f)))\n return (source$: Observable<any>) => {\n let src$ = source$\n for (const f of filterFunctions) {\n src$ = src$.pipe(f)\n }\n return src$\n }\n}\n\nexport function composeDataFilterStates(\n filters: DataFilter[],\n): Observable<DataFilterState[]> {\n if (filters.length === 0) {\n return of([])\n }\n\n return combineLatest(\n filters.map((f) =>\n f.filterStateChanges.pipe(\n startWith(undefined),\n map(() => f.filterState()),\n ),\n ),\n )\n}\n\n/** @deprecated Use `DataFilter` instead. */\nexport type IDataFilter = DataFilter\n\n/** @deprecated Use `IDataFilterFunction` instead. */\nexport type IDataFilterFunction = DataFilterFunction\n","import { InjectionToken } from '@angular/core'\n\nimport { IDataFilter } from './data-filter'\n\nexport interface IDataFilterDef<T = any> {\n name: string\n\n /**\n * Component that controls the filter.\n */\n component: IDataFilter\n}\n\nexport const THESEAM_DATA_FILTER_DEF = new InjectionToken<IDataFilterDef[]>(\n 'TheSeamDataFilter',\n)\n","import { InjectionToken } from '@angular/core'\nimport { IDataFilter } from './data-filter'\n\nexport interface DataFilterContainer {\n filters(): IDataFilter[]\n\n addFilter(dataFilter: IDataFilter): void\n\n removeFilter(dataFilter: IDataFilter): void\n}\n\nexport const THESEAM_DATA_FILTER_CONTAINER =\n new InjectionToken<DataFilterContainer>('DataFilterContainer')\n","import { BooleanInput } from '@angular/cdk/coercion'\nimport {\n Component,\n forwardRef,\n Inject,\n Input,\n OnDestroy,\n OnInit,\n Optional,\n TemplateRef,\n} from '@angular/core'\nimport { UntypedFormControl } from '@angular/forms'\nimport { Observable, of } from 'rxjs'\nimport { map, shareReplay, startWith, switchMap } from 'rxjs/operators'\n\nimport { InputBoolean } from '@theseam/ui-common/core'\nimport { isNullOrUndefined } from '@theseam/ui-common/utils'\n\nimport {\n DataFilterState,\n IDataFilter,\n THESEAM_DATA_FILTER,\n THESEAM_DATA_FILTER_OPTIONS,\n} from '../../data-filter'\nimport { THESEAM_DATA_FILTER_CONTAINER } from '../../data-filter-container'\nimport type { DataFilterContainer } from '../../data-filter-container'\nimport { ITextFilterOptions } from './text-filter-options'\n\nexport const DATA_FILTER_TEXT: any = {\n provide: THESEAM_DATA_FILTER,\n useExisting: forwardRef(() => DataFilterTextComponent),\n multi: true,\n}\n\nexport const DefaultTextFilterOptions: ITextFilterOptions = {\n properties: undefined,\n omitProperties: undefined,\n exact: false,\n caseSensitive: false,\n}\n\nexport function textDataFilter(\n data: any[],\n text: string,\n options = DefaultTextFilterOptions,\n) {\n if (!data || !text) {\n return data\n }\n\n if (data.length <= 0) {\n return data\n }\n\n let props = options ? options.properties : undefined\n if (!props) {\n props = []\n let keys = Object.keys(data[0])\n if (options && options.omitProperties) {\n keys = keys.filter(\n (key) => !(options.omitProperties || []).find((p) => p === key),\n )\n }\n for (const key of keys) {\n if (Object.prototype.hasOwnProperty.call(data[0], key)) {\n props.push(key)\n }\n }\n }\n\n const filtered: any[] = []\n\n for (const item of data) {\n for (const p of props) {\n let value1 = `${item[p]}`\n let value2 = text\n\n if (!options.caseSensitive) {\n value1 = value1.toLowerCase()\n value2 = value2.toLowerCase()\n }\n\n if (item[p] && value1.indexOf(value2) !== (options.exact ? 0 : -1)) {\n filtered.push(item)\n break\n }\n }\n }\n\n return filtered\n}\n\nlet _uid = 0\n\n@Component({\n selector: 'seam-data-filter-text',\n templateUrl: './data-filter-text.component.html',\n styleUrls: ['./data-filter-text.component.scss'],\n providers: [DATA_FILTER_TEXT],\n standalone: false,\n})\nexport class DataFilterTextComponent implements OnInit, OnDestroy, IDataFilter {\n static ngAcceptInputType_exact: BooleanInput\n static ngAcceptInputType_caseSensitive: BooleanInput\n\n public readonly name = 'text'\n public readonly uid = `text__${_uid++}`\n\n @Input() filterName: string | undefined\n\n _control = new UntypedFormControl()\n\n @Input() properties: string[] | undefined | null =\n this._optDefault('properties')\n @Input() omitProperties: string[] | undefined | null =\n this._optDefault('omitProperties')\n @Input() @InputBoolean() exact: boolean = this._optDefault('exact')\n @Input() @InputBoolean() caseSensitive: boolean =\n this._optDefault('caseSensitive')\n\n @Input() placeholder: string | undefined | null\n @Input() iconTpl: TemplateRef<HTMLElement> | undefined | null\n\n @Input()\n set value(value: string | string[]) {\n const _value = !isNullOrUndefined(value) ? `${value}` : ''\n if (this._control.value !== _value) {\n this._control.setValue(_value)\n }\n }\n\n public readonly filterStateChanges: Observable<DataFilterState>\n\n constructor(\n @Inject(THESEAM_DATA_FILTER_CONTAINER)\n private _filterContainer: DataFilterContainer,\n @Optional()\n @Inject(THESEAM_DATA_FILTER_OPTIONS)\n private _filterOptions: ITextFilterOptions | null,\n ) {\n this.filterStateChanges = this._control.valueChanges.pipe(\n switchMap(() => of(this.filterState())),\n shareReplay({ bufferSize: 1, refCount: true }),\n )\n }\n\n ngOnInit() {\n this._filterContainer.addFilter(this)\n }\n\n ngOnDestroy() {\n this._filterContainer.removeFilter(this)\n }\n\n private _optDefault<K extends keyof ITextFilterOptions>(prop: K) {\n if (\n this._filterOptions &&\n Object.prototype.hasOwnProperty.call(this._filterOptions, prop)\n ) {\n return this._filterOptions[prop]\n }\n return DefaultTextFilterOptions[prop]\n }\n\n get options(): ITextFilterOptions {\n return {\n properties: this.properties ?? undefined,\n omitProperties: this.omitProperties ?? undefined,\n exact: this.exact,\n caseSensitive: this.caseSensitive,\n }\n }\n\n public filter<T>(data: T[]): Observable<T[]> {\n return this._control.valueChanges.pipe(\n map((v) => textDataFilter(data, v, this.options)),\n startWith(textDataFilter(data, this._control.value, this.options)),\n )\n }\n\n public filterState(): DataFilterState {\n return {\n // id:\n name: this.filterName ?? this.name,\n state: {\n value: this._control.value,\n options: this.options,\n },\n }\n }\n}\n","<div\n class=\"position-relative\"\n [class.data-filter-text-has-icon]=\"iconTpl\"\n (click)=\"inp.focus()\"\n>\n <label [attr.for]=\"inp.id\" class=\"sr-only\">Text filter</label>\n <input\n seamInput\n #inp=\"seamInput\"\n seamInputSize=\"sm\"\n [formControl]=\"_control\"\n [placeholder]=\"placeholder\"\n />\n <ng-container *ngIf=\"iconTpl\">\n <ng-container *ngTemplateOutlet=\"iconTpl\"></ng-container>\n </ng-container>\n</div>\n","import { BooleanInput } from '@angular/cdk/coercion'\nimport {\n ChangeDetectionStrategy,\n Component,\n forwardRef,\n Inject,\n Input,\n OnDestroy,\n OnInit,\n Optional,\n TemplateRef,\n} from '@angular/core'\nimport { UntypedFormControl } from '@angular/forms'\nimport { Observable, of } from 'rxjs'\nimport { map, shareReplay, startWith, switchMap } from 'rxjs/operators'\n\nimport { faSearch } from '@fortawesome/free-solid-svg-icons'\n\nimport { InputBoolean } from '@theseam/ui-common/core'\nimport type { SeamIcon } from '@theseam/ui-common/icon'\nimport { isNullOrUndefined } from '@theseam/ui-common/utils'\n\nimport {\n DataFilterState,\n IDataFilter,\n THESEAM_DATA_FILTER,\n THESEAM_DATA_FILTER_OPTIONS,\n} from '../../data-filter'\nimport { THESEAM_DATA_FILTER_CONTAINER } from '../../data-filter-container'\nimport type { DataFilterContainer } from '../../data-filter-container'\nimport { textDataFilter } from '../data-filter-text/data-filter-text.component'\n\nimport { ISearchFilterOptions } from './search-filter-options'\n\nexport const DATA_FILTER_SEARCH: any = {\n provide: THESEAM_DATA_FILTER,\n useExisting: forwardRef(() => DataFilterSearchComponent),\n multi: true,\n}\n\nexport const DefaultSearchFilterOptions: ISearchFilterOptions = {\n properties: undefined,\n omitProperties: undefined,\n exact: false,\n caseSensitive: false,\n}\n\nexport function searchDataFilter(\n data: any[],\n values: string,\n options = DefaultSearchFilterOptions,\n) {\n return textDataFilter(data, values, options)\n}\n\nlet _uid = 0\n\n@Component({\n selector: 'seam-data-filter-search',\n templateUrl: './data-filter-search.component.html',\n styleUrls: ['./data-filter-search.component.scss'],\n providers: [DATA_FILTER_SEARCH],\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: false,\n})\nexport class DataFilterSearchComponent\n implements OnInit, OnDestroy, IDataFilter\n{\n static ngAcceptInputType_exact: BooleanInput\n static ngAcceptInputType_caseSensitive: BooleanInput\n\n public readonly name = 'search'\n public readonly uid = `search__${_uid++}`\n\n @Input() filterName: string | undefined\n\n _control = new UntypedFormControl()\n\n @Input() properties: string[] | undefined | null =\n this._optDefault('properties')\n @Input() omitProperties: string[] | undefined | null =\n this._optDefault('omitProperties')\n @Input() @InputBoolean() exact: boolean = this._optDefault('exact')\n @Input() @InputBoolean() caseSensitive: boolean =\n this._optDefault('caseSensitive')\n\n @Input() placeholder: string | undefined | null = 'Search...'\n @Input() icon: SeamIcon | undefined | null = faSearch\n @Input() iconTpl?: TemplateRef<HTMLElement>\n\n @Input()\n set value(value: string | string[]) {\n const _value = !isNullOrUndefined(value) ? `${value}` : ''\n if (this._control.value !== _value) {\n this._control.setValue(_value)\n }\n }\n\n public readonly filterStateChanges: Observable<DataFilterState>\n\n constructor(\n @Inject(THESEAM_DATA_FILTER_CONTAINER)\n private _filterContainer: DataFilterContainer,\n @Optional()\n @Inject(THESEAM_DATA_FILTER_OPTIONS)\n private _filterOptions: ISearchFilterOptions | null,\n ) {\n this.filterStateChanges = this._control.valueChanges.pipe(\n switchMap(() => of(this.filterState())),\n shareReplay({ bufferSize: 1, refCount: true }),\n )\n }\n\n ngOnInit() {\n this._filterContainer.addFilter(this)\n }\n\n ngOnDestroy() {\n this._filterContainer.removeFilter(this)\n }\n\n private _optDefault<K extends keyof ISearchFilterOptions>(prop: K) {\n if (\n this._filterOptions &&\n Object.prototype.hasOwnProperty.call(this._filterOptions, prop)\n ) {\n return this._filterOptions[prop]\n }\n return DefaultSearchFilterOptions[prop]\n }\n\n get options(): ISearchFilterOptions {\n return {\n properties: this.properties ?? undefined,\n omitProperties: this.omitProperties ?? undefined,\n exact: this.exact,\n caseSensitive: this.caseSensitive,\n }\n }\n\n public filter<T>(data: T[]): Observable<T[]> {\n return this._control.valueChanges.pipe(\n map((v) => searchDataFilter(data, v, this.options)),\n startWith(searchDataFilter(data, this._control.value, this.options)),\n )\n }\n\n public filterState(): DataFilterState {\n return {\n // id:\n name: this.filterName ?? this.name,\n state: {\n value: this._control.value,\n options: this.options,\n },\n }\n }\n}\n","<div\n class=\"position-relative\"\n [class.data-filter-search-has-icon]=\"iconTpl || icon\"\n (click)=\"inp.focus()\"\n>\n <label [attr.for]=\"inp.id\" class=\"sr-only\">Search filter</label>\n <input\n seamInput\n #inp=\"seamInput\"\n seamInputSize=\"sm\"\n [formControl]=\"_control\"\n [placeholder]=\"placeholder\"\n />\n <ng-container *ngIf=\"iconTpl; else searchIconTpl\">\n <div class=\"data-filter-search--icon-wrapper\">\n <ng-container *ngTemplateOutlet=\"iconTpl\"></ng-container>\n </div>\n </ng-container>\n <ng-template #searchIconTpl>\n <ng-container *ngIf=\"icon\">\n <div class=\"data-filter-search--icon-wrapper\">\n <seam-icon [icon]=\"icon\" class=\"text-muted\"></seam-icon>\n </div>\n </ng-container>\n </ng-template>\n</div>\n","import { coerceArray } from '@angular/cdk/coercion'\nimport {\n AfterViewInit,\n Component,\n ElementRef,\n forwardRef,\n HostBinding,\n Inject,\n Input,\n OnChanges,\n OnDestroy,\n OnInit,\n Optional,\n signal,\n SimpleChanges,\n ViewChild,\n} from '@angular/core'\nimport { UntypedFormControl } from '@angular/forms'\nimport { Observable, of } from 'rxjs'\nimport { map, shareReplay, startWith, switchMap } from 'rxjs/operators'\n\nimport {\n hasProperty,\n isNullOrUndefined,\n notNullOrUndefined,\n} from '@theseam/ui-common/utils'\n\nimport {\n DataFilterState,\n IDataFilter,\n THESEAM_DATA_FILTER,\n THESEAM_DATA_FILTER_OPTIONS,\n} from '../../data-filter'\nimport { THESEAM_DATA_FILTER_CONTAINER } from '../../data-filter-container'\nimport type { DataFilterContainer } from '../../data-filter-container'\nimport { textDataFilter } from '../data-filter-text/data-filter-text.component'\nimport { ITextFilterOptions } from '../data-filter-text/text-filter-options'\n\nexport const DATA_FILTER_TOGGLE_BUTTON_DROPDOWN_TEXT = 'Select Filter'\n\nexport const DATA_FILTER_TOGGLE_BUTTON: any = {\n provide: THESEAM_DATA_FILTER,\n useExisting: forwardRef(() => DataFilterToggleButtonsComponent),\n multi: true,\n}\n\nexport interface IToggleButton {\n name: string\n value: string\n comparator?: (value: any, row: any, index: number) => -1 | 0 | 1\n}\n\nexport interface IToggleButtonsFilterOptions extends ITextFilterOptions {\n selectionToggleable: boolean\n multiple: boolean\n buttons: IToggleButton[]\n initialValue?: any\n /** The maximum width a button row can grow to before collapsing. If not set, the button row will grow until it overflows, then collapse. */\n maxWidth?: number\n /** The text shown when the button row is in the collapsed state and no filter is selected. */\n filterDropdownLabel?: string\n /** When true, will prevent the button row from collapsing into a dropdown on smaller screen sizes. */\n disableCollapse?: boolean\n}\n\nexport const DefaultToggleButtonsFilterOptions: IToggleButtonsFilterOptions = {\n properties: undefined,\n omitProperties: undefined,\n multiple: false,\n selectionToggleable: false,\n buttons: [],\n exact: false,\n caseSensitive: false,\n maxWidth: undefined,\n filterDropdownLabel: DATA_FILTER_TOGGLE_BUTTON_DROPDOWN_TEXT,\n disableCollapse: undefined,\n}\n\nexport function toggleButtonsFilter(\n data: any[],\n values: string[],\n options = DefaultToggleButtonsFilterOptions,\n) {\n if (!data || !values) {\n return data\n }\n\n const customComparatorBtns: IToggleButton[] = []\n for (const btn of options.buttons) {\n if (btn.comparator) {\n customComparatorBtns.push(btn)\n }\n }\n\n let _data = data\n for (const val of values) {\n if (val === '') {\n continue\n }\n\n let cmp\n for (const btn of customComparatorBtns) {\n if (btn.value === val) {\n cmp = btn.comparator\n }\n }\n if (cmp) {\n const filtered: any[] = []\n for (let i = 0; i < _data.length; i++) {\n if (cmp(val, _data[i], i) !== -1) {\n filtered.push(_data[i])\n }\n }\n _data = filtered\n } else {\n _data = textDataFilter(_data, val, {\n properties: options.properties,\n omitProperties: options.omitProperties,\n exact: options.exact,\n caseSensitive: options.caseSensitive,\n })\n }\n }\n return _data\n}\n\nlet _uid = 0\n\n@Component({\n selector: 'seam-data-filter-toggle-buttons',\n templateUrl: './data-filter-toggle-buttons.component.html',\n styleUrls: ['./data-filter-toggle-buttons.component.scss'],\n providers: [DATA_FILTER_TOGGLE_BUTTON],\n standalone: false,\n})\nexport class DataFilterToggleButtonsComponent\n implements OnInit, OnChanges, OnDestroy, AfterViewInit, IDataFilter\n{\n public readonly name = 'toggle-buttons'\n public readonly uid = `toggle-buttons__${_uid++}`\n\n @Input() filterName: string | undefined\n\n _control = new UntypedFormControl()\n\n @Input() properties = this._optDefault('properties')\n @Input() omitProperties = this._optDefault('omitProperties')\n @Input() multiple = this._optDefault('multiple')\n @Input() selectionToggleable = this._optDefault('selectionToggleable')\n @Input() buttons = this._optDefault('buttons')\n @Input() exact = this._optDefault('exact')\n @Input() caseSensitive = this._optDefault('caseSensitive')\n @Input() maxWidth = this._optDefault('maxWidth')\n @Input() filterDropdownLabel = this._optDefault('filterDropdownLabel')\n @Input() disableCollapse = this._optDefault('disableCollapse')\n\n @HostBinding('class.seam-data-filter-toggle-buttons-collapsed')\n get _collapsedClass() {\n return this.isCollapsed()\n }\n\n @HostBinding('class.seam-data-filter-toggle-buttons-expanded')\n get _expandedClass() {\n return !this.isCollapsed()\n }\n\n public readonly isCollapsed = signal(false)\n\n @ViewChild('measureDiv') private _measureDiv!: ElementRef<HTMLElement>\n\n private _resizeObserver: ResizeObserver | undefined\n\n @Input()\n set value(value: string | string[]) {\n const _value = !isNullOrUndefined(value) ? coerceArray(value) : undefined\n if (this._control.value !== _value) {\n this._control.setValue(_value)\n }\n }\n\n public readonly filterStateChanges: Observable<DataFilterState>\n public activeFilterLabel!: Observable<string>\n\n constructor(\n private _elementRef: ElementRef<HTMLElement>,\n @Inject(THESEAM_DATA_FILTER_CONTAINER)\n private _filterContainer: DataFilterContainer,\n @Optional()\n @Inject(THESEAM_DATA_FILTER_OPTIONS)\n private _filterOptions: IToggleButtonsFilterOptions | null,\n ) {\n this.filterStateChanges = this._control.valueChanges.pipe(\n switchMap(() => of(this.filterState())),\n shareReplay({ bufferSize: 1, refCount: true }),\n )\n }\n\n ngOnInit() {\n this._filterContainer.addFilter(this)\n if (\n this._filterOptions &&\n hasProperty(this._filterOptions, 'initialValue')\n ) {\n this.value = this._optDefault('initialValue')\n }\n\n this.activeFilterLabel = this.filterStateChanges.pipe(\n startWith(undefined),\n map(() => {\n const state = this.filterState()\n const options = state.state.options as IToggleButtonsFilterOptions\n const selectedOptions = options.buttons\n .filter((o) => coerceArray(state.state.value).includes(o.value))\n .map((o) => o.name)\n\n return selectedOptions.length > 0\n ? selectedOptions.join(', ')\n : this.filterDropdownLabel || DATA_FILTER_TOGGLE_BUTTON_DROPDOWN_TEXT\n }),\n )\n }\n\n ngAfterViewInit(): void {\n this._resizeObserver = new ResizeObserver(() => this._updateCollapsed())\n\n if (\n notNullOrUndefined(this._elementRef.nativeElement.parentElement) &&\n this.disableCollapse !== true\n ) {\n this._resizeObserver.observe(this._elementRef.nativeElement.parentElement)\n }\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['buttons'] && !changes['buttons'].firstChange) {\n this._updateCollapsed()\n }\n }\n\n ngOnDestroy(): void {\n this._filterContainer.removeFilter(this)\n this._resizeObserver?.disconnect()\n }\n\n private _optDefault<K extends keyof IToggleButtonsFilterOptions>(prop: K) {\n if (\n this._filterOptions &&\n Object.prototype.hasOwnProperty.call(this._filterOptions, prop)\n ) {\n return this._filterOptions[prop]\n }\n return DefaultToggleButtonsFilterOptions[prop]\n }\n\n get options(): IToggleButtonsFilterOptions {\n return {\n properties: this.properties,\n omitProperties: this.omitProperties,\n multiple: this.multiple,\n selectionToggleable: this.selectionToggleable,\n buttons: this.buttons,\n exact: this.exact,\n caseSensitive: this.caseSensitive,\n maxWidth: this.maxWidth,\n filterDropdownLabel: this.filterDropdownLabel,\n disableCollapse: this.disableCollapse,\n }\n }\n\n public filter<T>(data: T[]): Observable<T[]> {\n return this._control.valueChanges.pipe(\n map((v) => toggleButtonsFilter(data, coerceArray(v), this.options)),\n startWith(\n toggleButtonsFilter(\n data,\n coerceArray(this._control.value),\n this.options,\n ),\n ),\n )\n }\n\n private _updateCollapsed(): void {\n if (this.disableCollapse) {\n if (this.isCollapsed()) {\n this.isCollapsed.set(false)\n }\n\n return\n }\n if (!this._measureDiv) {\n return\n }\n const measureWidth = this._measureDiv.nativeElement.scrollWidth\n\n // Because of the flex layout, this element won't necessarily grow to its full\n // potential width when in collapsed mode, meaning it stays collapsed even\n // though there's room to expand. If this becomes a problem, we may need to use a\n // different strategy to determine when it's safe to show the full filter bar.\n const clientWidth =\n this._elementRef.nativeElement.parentElement?.clientWidth\n\n // Not enough information to determine collapsed state, so don't update it\n if (isNullOrUndefined(clientWidth)) {\n return\n }\n\n const threshold =\n this.maxWidth != null ? Math.min(clientWidth, this.maxWidth) : clientWidth\n this.isCollapsed.set(measureWidth > threshold)\n }\n\n public filterState(): DataFilterState {\n return {\n // id:\n name: this.filterName ?? this.name,\n state: {\n value: this._control.value,\n options: this.options,\n },\n }\n }\n}\n","<ng-container *ngIf=\"isCollapsed(); else buttonsTpl\">\n <button\n seamButton\n theme=\"primary\"\n size=\"sm\"\n class=\"dropdown-toggle\"\n title=\"View filter options\"\n [seamMenuToggle]=\"buttonsDropdownTpl\"\n >\n {{ activeFilterLabel | async }}\n </button>\n <seam-menu #buttonsDropdownTpl>\n <div\n role=\"group\"\n aria-label=\"Toggle Filters\"\n *ngIf=\"options as opts\"\n [formControl]=\"_control\"\n seamToggleGroup\n [multiple]=\"opts.multiple\"\n [selectionToggleable]=\"opts.selectionToggleable\"\n >\n <ng-container *ngFor=\"let btn of buttons\">\n <button\n seamMenuItem\n [seamToggleGroupOption]=\"btn.value\"\n #opt=\"seamToggleGroupOption\"\n [class.seam-menu-item-active]=\"opt.selected\"\n (click)=\"opt.selected = !opt.selected\"\n title=\"Apply filter\"\n >\n {{ btn.name || btn.value }}\n </button>\n </ng-container>\n </div>\n </seam-menu>\n</ng-container>\n\n<ng-template #buttonsTpl>\n <div\n class=\"btn-group\"\n role=\"group\"\n aria-label=\"Toggle Filters\"\n *ngIf=\"options as opts\"\n [formControl]=\"_control\"\n seamToggleGroup\n [multiple]=\"opts.multiple\"\n [selectionToggleable]=\"opts.selectionToggleable\"\n >\n <ng-container *ngFor=\"let btn of buttons\">\n <button\n type=\"button\"\n class=\"btn btn-sm px-4\"\n [seamToggleGroupOption]=\"btn.value\"\n #opt=\"seamToggleGroupOption\"\n [class.btn-lightgray]=\"!opt.selected\"\n [class.btn-primary]=\"opt.selected\"\n (click)=\"opt.selected = !opt.selected\"\n title=\"Apply filter\"\n >\n {{ btn.name || btn.value }}\n </button>\n </ng-container>\n </div>\n</ng-template>\n\n<!-- Hidden measurement div: always in DOM, used to read natural btn-group width -->\n<div #measureDiv class=\"btn-group btn-group--measure\" aria-hidden=\"true\">\n <ng-container *ngFor=\"let btn of buttons\">\n <button type=\"button\" class=\"btn btn-sm px-4\" tabindex=\"-1\">\n {{ btn.name || btn.value }}\n </button>\n </ng-container>\n</div>\n","import { CommonModule } from '@angular/common'\nimport { NgModule } from '@angular/core'\nimport { ReactiveFormsModule } from '@angular/forms'\n\nimport { FontAwesomeModule } from '@fortawesome/angular-fontawesome'\n\nimport { TheSeamFormFieldModule } from '@theseam/ui-common/form-field'\nimport { TheSeamIconModule } from '@theseam/ui-common/icon'\nimport { TheSeamToggleGroupModule } from '@theseam/ui-common/toggle-group'\nimport { TheSeamMenuModule } from '@theseam/ui-common/menu'\nimport { TheSeamButtonsModule } from '@theseam/ui-common/buttons'\n\nimport { THESEAM_DATA_FILTER_DEF } from './data-filter-def'\nimport { DataFilterSearchComponent } from './filters/data-filter-search/data-filter-search.component'\nimport { DataFilterTextComponent } from './filters/data-filter-text/data-filter-text.component'\nimport { DataFilterToggleButtonsComponent } from './filters/data-filter-toggle-buttons/data-filter-toggle-buttons.component'\n\nconst filterComponents = [\n DataFilterSearchComponent,\n DataFilterTextComponent,\n DataFilterToggleButtonsComponent,\n]\n\nconst filterDefProviders = [\n {\n provide: THESEAM_DATA_FILTER_DEF,\n useValue: { name: 'search', component: DataFilterSearchComponent },\n multi: true,\n },\n {\n provide: THESEAM_DATA_FILTER_DEF,\n useValue: { name: 'text', component: DataFilterTextComponent },\n multi: true,\n },\n {\n provide: THESEAM_DATA_FILTER_DEF,\n useValue: {\n name: 'toggle-buttons',\n component: DataFilterToggleButtonsComponent,\n },\n multi: true,\n },\n]\n\n@NgModule({\n declarations: [...filterComponents],\n imports: [\n CommonModule,\n ReactiveFormsModule,\n TheSeamFormFieldModule,\n FontAwesomeModule,\n TheSeamToggleGroupModule,\n TheSeamIconModule,\n TheSeamMenuModule,\n TheSeamButtonsModule,\n ],\n providers: [...filterDefProviders],\n exports: [...filterComponents],\n})\nexport class TheSeamDataFiltersModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["_uid","i3","i4"],"mappings":"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"}
|