@kris701/ez-ui 0.0.10 → 1.0.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.
@@ -1,23 +1,29 @@
1
1
  import * as i0 from '@angular/core';
2
- import { EventEmitter, Output, Input, Component, signal, ViewChild, Directive } from '@angular/core';
2
+ import { EventEmitter, Output, Input, Component, signal, ViewChild, ContentChild, Directive } from '@angular/core';
3
3
  import * as i1 from '@angular/forms';
4
4
  import { FormsModule } from '@angular/forms';
5
- import { TuiDay } from '@taiga-ui/cdk/date-time';
6
- import * as i1$1 from '@taiga-ui/core';
7
- import { TuiInput, TuiOption, TuiDropdown, TuiGroup, TuiButton, TuiScrollbar, TuiSelectLike, TuiDataList, TuiTextfield, TuiIcon } from '@taiga-ui/core';
8
- import * as i2$1 from '@taiga-ui/kit';
9
- import { TuiInputDate, TuiChevron, TuiTextarea, TuiMultiSelect, TuiInputNumber, TuiInputChip, TuiPassword, TUI_CONFIRM } from '@taiga-ui/kit';
5
+ import { TuiDay, TuiTime } from '@taiga-ui/cdk/date-time';
6
+ import * as i3$1 from '@taiga-ui/core';
7
+ import { TuiInput, TuiOption, TuiDropdown, TuiGroup, TuiButton, TuiScrollbar, TuiSelectLike, TuiDataList, TuiTextfield, TuiIcon, TuiHint, TuiLoader } from '@taiga-ui/core';
8
+ import * as i4$1 from '@taiga-ui/kit';
9
+ import { TuiInputDate, TuiFiles, TuiChevron, TuiTextarea, TuiMultiSelect, TuiInputNumber, TuiInputChip, TuiPassword, TuiBadge, TuiStatus, TuiDataListWrapper, TuiButtonSelect, TuiBadgeNotification, TuiStringifyContentPipe, TuiBadgedContent, TuiInputDateTime, TUI_CONFIRM } from '@taiga-ui/kit';
10
10
  import * as i2 from '@taiga-ui/core/components/label';
11
11
  import * as i3 from '@taiga-ui/core/components/textfield';
12
12
  import * as i4 from '@taiga-ui/core/portals/dropdown';
13
13
  import * as i6 from '@taiga-ui/core/components/calendar';
14
+ import * as i2$1 from '@angular/common';
14
15
  import { CommonModule } from '@angular/common';
15
16
  import { marked } from 'marked';
16
17
  import Compressor from 'compressorjs';
17
18
  import * as i7 from '@taiga-ui/cdk/directives/item';
19
+ import * as i3$2 from '@taiga-ui/addon-table';
20
+ import { TuiTablePagination, TuiTable } from '@taiga-ui/addon-table';
21
+ import * as i4$2 from '@taiga-ui/layout';
22
+ import { TuiBlockStatus } from '@taiga-ui/layout';
23
+ import { v4 } from 'uuid';
18
24
  import { firstValueFrom, switchMap } from 'rxjs';
19
- import * as i1$2 from '@angular/common/http';
20
- import * as i3$1 from '@taiga-ui/addon-mobile';
25
+ import * as i1$1 from '@angular/common/http';
26
+ import * as i3$3 from '@taiga-ui/addon-mobile';
21
27
 
22
28
  class EzUIDateInput {
23
29
  icon = '';
@@ -52,7 +58,7 @@ class EzUIDateInput {
52
58
  <input tuiInputDate [(ngModel)]="internalValue" (ngModelChange)="updateValue()" [disabled]="disabled" [min]="min ? TuiDay.fromLocalNativeDate(min) : null" [max]="max ? TuiDay.fromLocalNativeDate(max) : null"/>
53
59
  <tui-calendar *tuiDropdown />
54
60
  </tui-textfield>
55
- `, isInline: true, styles: [""], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox]):not([ngNoCva])[formControlName],textarea:not([ngNoCva])[formControlName],input:not([type=checkbox]):not([ngNoCva])[formControl],textarea:not([ngNoCva])[formControl],input:not([type=checkbox]):not([ngNoCva])[ngModel],textarea:not([ngNoCva])[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i2.TuiLabel, selector: "label[tuiLabel]" }, { kind: "component", type: i3.TuiTextfieldComponent, selector: "tui-textfield:not([multi])", inputs: ["content", "filler"] }, { kind: "directive", type: i3.TuiTextfieldOptionsDirective, selector: "[tuiTextfieldAppearance],[tuiTextfieldSize],[tuiTextfieldCleaner]", inputs: ["tuiTextfieldAppearance", "tuiTextfieldSize", "tuiTextfieldCleaner"] }, { kind: "directive", type: i4.TuiDropdownContent, selector: "ng-template[tuiDropdown]" }, { kind: "directive", type: i2$1.TuiInputDateDirective, selector: "input[tuiInputDate]", inputs: ["max", "min"] }, { kind: "component", type: i6.TuiCalendar, selector: "tui-calendar:not([new])", inputs: ["minViewedMonth", "maxViewedMonth", "showAdjacent", "markerHandler", "initialView", "hoveredItem"], outputs: ["hoveredItemChange", "dayClick"] }] });
61
+ `, isInline: true, styles: [""], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox]):not([ngNoCva])[formControlName],textarea:not([ngNoCva])[formControlName],input:not([type=checkbox]):not([ngNoCva])[formControl],textarea:not([ngNoCva])[formControl],input:not([type=checkbox]):not([ngNoCva])[ngModel],textarea:not([ngNoCva])[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i2.TuiLabel, selector: "label[tuiLabel]" }, { kind: "component", type: i3.TuiTextfieldComponent, selector: "tui-textfield:not([multi])", inputs: ["content", "filler"] }, { kind: "directive", type: i3.TuiTextfieldOptionsDirective, selector: "[tuiTextfieldAppearance],[tuiTextfieldSize],[tuiTextfieldCleaner]", inputs: ["tuiTextfieldAppearance", "tuiTextfieldSize", "tuiTextfieldCleaner"] }, { kind: "directive", type: i4.TuiDropdownContent, selector: "ng-template[tuiDropdown]" }, { kind: "directive", type: i4$1.TuiInputDateDirective, selector: "input[tuiInputDate]", inputs: ["max", "min"] }, { kind: "component", type: i6.TuiCalendar, selector: "tui-calendar:not([new])", inputs: ["minViewedMonth", "maxViewedMonth", "showAdjacent", "markerHandler", "initialView", "hoveredItem"], outputs: ["hoveredItemChange", "dayClick"] }] });
56
62
  }
57
63
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: EzUIDateInput, decorators: [{
58
64
  type: Component,
@@ -87,6 +93,78 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImpor
87
93
  type: Output
88
94
  }] } });
89
95
 
96
+ class EzUIFileInput {
97
+ files = signal([], /* @ts-ignore */
98
+ ...(ngDevMode ? [{ debugName: "files" }] : /* istanbul ignore next */ []));
99
+ clear() {
100
+ this.files.set([]);
101
+ }
102
+ onChange(files) {
103
+ if (files instanceof File)
104
+ this.files.set([files]);
105
+ else
106
+ this.files.set(files);
107
+ }
108
+ removeFile(file) {
109
+ var files = this.files();
110
+ var index = files.indexOf(file);
111
+ if (index != -1) {
112
+ files.splice(index, 1);
113
+ this.files.set(files);
114
+ }
115
+ }
116
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: EzUIFileInput, deps: [], target: i0.ɵɵFactoryTarget.Component });
117
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.7", type: EzUIFileInput, isStandalone: true, selector: "ezui-fileinput", ngImport: i0, template: `
118
+ <label tuiInputFiles>
119
+ <input
120
+ #validator="tuiInputFilesValidator"
121
+ accept="*/*"
122
+ tuiInputFiles
123
+ [ngModel]="files()"
124
+ (ngModelChange)="onChange($event)"
125
+ />
126
+ </label>
127
+
128
+ <tui-files>
129
+ @for(file of files(); track file){
130
+ <tui-file
131
+ state="normal"
132
+ [file]="file"
133
+ (remove)="removeFile(file)"
134
+ />
135
+ }
136
+ </tui-files>
137
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox]):not([ngNoCva])[formControlName],textarea:not([ngNoCva])[formControlName],input:not([type=checkbox]):not([ngNoCva])[formControl],textarea:not([ngNoCva])[formControl],input:not([type=checkbox]):not([ngNoCva])[ngModel],textarea:not([ngNoCva])[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i4$1.TuiFile, selector: "tui-file,a[tuiFile],button[tuiFile]", inputs: ["file", "state", "size", "showDelete", "showSize", "leftContent"], outputs: ["remove"] }, { kind: "component", type: i4$1.TuiInputFiles, selector: "label[tuiInputFiles]", inputs: ["tuiInputFiles"] }, { kind: "component", type: i4$1.TuiFilesComponent, selector: "tui-files", inputs: ["max", "expanded"], outputs: ["expandedChange"] }, { kind: "directive", type: i4$1.TuiInputFilesDirective, selector: "input[tuiInputFiles]", outputs: ["reject"] }] });
138
+ }
139
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: EzUIFileInput, decorators: [{
140
+ type: Component,
141
+ args: [{
142
+ selector: 'ezui-fileinput',
143
+ imports: [FormsModule, TuiFiles],
144
+ template: `
145
+ <label tuiInputFiles>
146
+ <input
147
+ #validator="tuiInputFilesValidator"
148
+ accept="*/*"
149
+ tuiInputFiles
150
+ [ngModel]="files()"
151
+ (ngModelChange)="onChange($event)"
152
+ />
153
+ </label>
154
+
155
+ <tui-files>
156
+ @for(file of files(); track file){
157
+ <tui-file
158
+ state="normal"
159
+ [file]="file"
160
+ (remove)="removeFile(file)"
161
+ />
162
+ }
163
+ </tui-files>
164
+ `
165
+ }]
166
+ }] });
167
+
90
168
  const compressImage = async (file, quality, maxHeight, maxWidth, convertSize) => {
91
169
  return await new Promise((resolve, reject) => {
92
170
  new Compressor(file, {
@@ -137,7 +215,7 @@ class EzUIMenuBarSubDataList {
137
215
  </button>
138
216
  }
139
217
  }
140
- `, isInline: true, styles: [".subdatalist{display:flex;flex-direction:column}\n"], dependencies: [{ kind: "component", type: EzUIMenuBarSubDataList, selector: "tui-data-list[subdatalist]", inputs: ["subdatalist"] }, { kind: "directive", type: i1$1.TuiDropdownOptionsDirective, selector: "[tuiDropdownAlign], [tuiDropdownAppearance], [tuiDropdownDirection], [tuiDropdownLimitWidth], [tuiDropdownMinHeight], [tuiDropdownMaxHeight], [tuiDropdownOffset]", inputs: ["tuiDropdownAlign", "tuiDropdownAppearance", "tuiDropdownDirection", "tuiDropdownLimitWidth", "tuiDropdownMinHeight", "tuiDropdownMaxHeight", "tuiDropdownOffset"] }, { kind: "directive", type: i1$1.TuiDropdownDirective, selector: "[tuiDropdown]:not(ng-container):not(ng-template)", inputs: ["tuiDropdown"], exportAs: ["tuiDropdown"] }, { kind: "directive", type: i1$1.TuiDropdownOpen, selector: "[tuiDropdown][tuiDropdownAuto],[tuiDropdown][tuiDropdownOpen],[tuiDropdown][tuiDropdownOpenChange]", inputs: ["tuiDropdownEnabled", "tuiDropdownOpen"], outputs: ["tuiDropdownOpenChange"] }, { kind: "directive", type: i1$1.TuiDropdownPositionSided, selector: "[tuiDropdownSided]", inputs: ["tuiDropdownSided", "tuiDropdownSidedOffset"] }, { kind: "directive", type: TuiOption, selector: "button[tuiOption], a[tuiOption], label[tuiOption]", inputs: ["disabled"] }, { kind: "directive", type: TuiChevron, selector: "[tuiChevron]", inputs: ["tuiChevron"] }] });
218
+ `, isInline: true, styles: [".subdatalist{display:flex;flex-direction:column}\n"], dependencies: [{ kind: "component", type: EzUIMenuBarSubDataList, selector: "tui-data-list[subdatalist]", inputs: ["subdatalist"] }, { kind: "directive", type: i3$1.TuiDropdownOptionsDirective, selector: "[tuiDropdownAlign], [tuiDropdownAppearance], [tuiDropdownDirection], [tuiDropdownLimitWidth], [tuiDropdownMinHeight], [tuiDropdownMaxHeight], [tuiDropdownOffset]", inputs: ["tuiDropdownAlign", "tuiDropdownAppearance", "tuiDropdownDirection", "tuiDropdownLimitWidth", "tuiDropdownMinHeight", "tuiDropdownMaxHeight", "tuiDropdownOffset"] }, { kind: "directive", type: i3$1.TuiDropdownDirective, selector: "[tuiDropdown]:not(ng-container):not(ng-template)", inputs: ["tuiDropdown"], exportAs: ["tuiDropdown"] }, { kind: "directive", type: i3$1.TuiDropdownOpen, selector: "[tuiDropdown][tuiDropdownAuto],[tuiDropdown][tuiDropdownOpen],[tuiDropdown][tuiDropdownOpenChange]", inputs: ["tuiDropdownEnabled", "tuiDropdownOpen"], outputs: ["tuiDropdownOpenChange"] }, { kind: "directive", type: i3$1.TuiDropdownPositionSided, selector: "[tuiDropdownSided]", inputs: ["tuiDropdownSided", "tuiDropdownSidedOffset"] }, { kind: "directive", type: TuiOption, selector: "button[tuiOption], a[tuiOption], label[tuiOption]", inputs: ["disabled"] }, { kind: "directive", type: TuiChevron, selector: "[tuiChevron]", inputs: ["tuiChevron"] }] });
141
219
  }
142
220
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: EzUIMenuBarSubDataList, decorators: [{
143
221
  type: Component,
@@ -232,7 +310,7 @@ class EzUIMenuBar {
232
310
  }
233
311
  }
234
312
  </div>
235
- `, isInline: true, styles: [".group{width:100%;white-space:nowrap}.subdatalist{display:flex;flex-direction:column}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: TuiGroup, selector: "[tuiGroup]:not(ng-container)", inputs: ["orientation", "collapsed", "rounded", "size"] }, { kind: "directive", type: TuiButton, selector: "a[tuiButton],button[tuiButton],a[tuiIconButton],button[tuiIconButton]", inputs: ["size"] }, { kind: "directive", type: i1$1.TuiDropdownOptionsDirective, selector: "[tuiDropdownAlign], [tuiDropdownAppearance], [tuiDropdownDirection], [tuiDropdownLimitWidth], [tuiDropdownMinHeight], [tuiDropdownMaxHeight], [tuiDropdownOffset]", inputs: ["tuiDropdownAlign", "tuiDropdownAppearance", "tuiDropdownDirection", "tuiDropdownLimitWidth", "tuiDropdownMinHeight", "tuiDropdownMaxHeight", "tuiDropdownOffset"] }, { kind: "directive", type: i1$1.TuiDropdownDirective, selector: "[tuiDropdown]:not(ng-container):not(ng-template)", inputs: ["tuiDropdown"], exportAs: ["tuiDropdown"] }, { kind: "directive", type: i1$1.TuiDropdownOpen, selector: "[tuiDropdown][tuiDropdownAuto],[tuiDropdown][tuiDropdownOpen],[tuiDropdown][tuiDropdownOpenChange]", inputs: ["tuiDropdownEnabled", "tuiDropdownOpen"], outputs: ["tuiDropdownOpenChange"] }, { kind: "directive", type: TuiChevron, selector: "[tuiChevron]", inputs: ["tuiChevron"] }, { kind: "component", type: EzUIMenuBarSubDataList, selector: "tui-data-list[subdatalist]", inputs: ["subdatalist"] }] });
313
+ `, isInline: true, styles: [".group{width:100%;white-space:nowrap}.subdatalist{display:flex;flex-direction:column}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: TuiGroup, selector: "[tuiGroup]:not(ng-container)", inputs: ["orientation", "collapsed", "rounded", "size"] }, { kind: "directive", type: TuiButton, selector: "a[tuiButton],button[tuiButton],a[tuiIconButton],button[tuiIconButton]", inputs: ["size"] }, { kind: "directive", type: i3$1.TuiDropdownOptionsDirective, selector: "[tuiDropdownAlign], [tuiDropdownAppearance], [tuiDropdownDirection], [tuiDropdownLimitWidth], [tuiDropdownMinHeight], [tuiDropdownMaxHeight], [tuiDropdownOffset]", inputs: ["tuiDropdownAlign", "tuiDropdownAppearance", "tuiDropdownDirection", "tuiDropdownLimitWidth", "tuiDropdownMinHeight", "tuiDropdownMaxHeight", "tuiDropdownOffset"] }, { kind: "directive", type: i3$1.TuiDropdownDirective, selector: "[tuiDropdown]:not(ng-container):not(ng-template)", inputs: ["tuiDropdown"], exportAs: ["tuiDropdown"] }, { kind: "directive", type: i3$1.TuiDropdownOpen, selector: "[tuiDropdown][tuiDropdownAuto],[tuiDropdown][tuiDropdownOpen],[tuiDropdown][tuiDropdownOpenChange]", inputs: ["tuiDropdownEnabled", "tuiDropdownOpen"], outputs: ["tuiDropdownOpenChange"] }, { kind: "directive", type: TuiChevron, selector: "[tuiChevron]", inputs: ["tuiChevron"] }, { kind: "component", type: EzUIMenuBarSubDataList, selector: "tui-data-list[subdatalist]", inputs: ["subdatalist"] }] });
236
314
  }
237
315
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: EzUIMenuBar, decorators: [{
238
316
  type: Component,
@@ -518,7 +596,7 @@ class EzUIMarkdownEditor {
518
596
  </tui-scrollbar>
519
597
  </div>
520
598
  }
521
- `, isInline: true, styles: [".editor-container{display:flex;flex-direction:row;width:100%;outline:.125rem solid var(--tui-background-accent-1);border-radius:var(--tui-radius-l)}.editor-container .editor{display:flex;flex-direction:column;width:100%}.editor-container .editor .editor-field{block-size:100%;border-radius:0px 0px 0px var(--tui-radius-l)}.preview-container{width:100%;border-radius:0px var(--tui-radius-l) var(--tui-radius-l) 0px;transition-property:box-shadow,background-color,outline-color,border-color,color;transition-duration:calc(var(--tui-duration) / 2);transition-timing-function:var(--tui-curve-productive-standard);--t-shadow: 0 .125rem .1875rem rgba(0, 0, 0, .1);background-color:var(--tui-background-base);color:var(--tui-text-tertiary);box-shadow:var(--t-shadow);outline:1px solid var(--tui-border-normal);outline-offset:-1px;border-width:0;block-size:100%}.preview-container ::ng-deep tui-scrollbar{height:100%}.preview-container ::ng-deep .t-content{display:flex;block-size:auto!important}.preview-container .preview{padding:10px}.preview-readonly-container{width:100%;border-radius:var(--tui-radius-l);transition-property:box-shadow,background-color,outline-color,border-color,color;transition-duration:calc(var(--tui-duration) / 2);transition-timing-function:var(--tui-curve-productive-standard);--t-shadow: 0 .125rem .1875rem rgba(0, 0, 0, .1);background-color:var(--tui-background-base);color:var(--tui-text-tertiary);box-shadow:var(--t-shadow);outline:1px solid var(--tui-border-normal);outline-offset:-1px;border-width:0;block-size:100%}.preview-readonly-container .edit-button{position:absolute;z-index:999}.preview-readonly-container ::ng-deep tui-scrollbar{height:100%}.preview-readonly-container ::ng-deep .t-content{display:flex;block-size:auto!important}.preview-readonly-container .preview{padding:10px}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox]):not([ngNoCva])[formControlName],textarea:not([ngNoCva])[formControlName],input:not([type=checkbox]):not([ngNoCva])[formControl],textarea:not([ngNoCva])[formControl],input:not([type=checkbox]):not([ngNoCva])[ngModel],textarea:not([ngNoCva])[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2$1.TuiTextareaComponent, selector: "textarea[tuiTextarea]", inputs: ["min", "max", "content"] }, { kind: "component", type: i3.TuiTextfieldComponent, selector: "tui-textfield:not([multi])", inputs: ["content", "filler"] }, { kind: "directive", type: TuiButton, selector: "a[tuiButton],button[tuiButton],a[tuiIconButton],button[tuiIconButton]", inputs: ["size"] }, { kind: "component", type: TuiScrollbar, selector: "tui-scrollbar" }, { kind: "component", type: EzUIMenuBar, selector: "ezui-menubar", inputs: ["items"] }] });
599
+ `, isInline: true, styles: [".editor-container{display:flex;flex-direction:row;width:100%;outline:.125rem solid var(--tui-background-accent-1);border-radius:var(--tui-radius-l)}.editor-container .editor{display:flex;flex-direction:column;width:100%}.editor-container .editor .editor-field{block-size:100%;border-radius:0px 0px 0px var(--tui-radius-l)}.preview-container{width:100%;border-radius:0px var(--tui-radius-l) var(--tui-radius-l) 0px;transition-property:box-shadow,background-color,outline-color,border-color,color;transition-duration:calc(var(--tui-duration) / 2);transition-timing-function:var(--tui-curve-productive-standard);--t-shadow: 0 .125rem .1875rem rgba(0, 0, 0, .1);background-color:var(--tui-background-base);color:var(--tui-text-tertiary);box-shadow:var(--t-shadow);outline:1px solid var(--tui-border-normal);outline-offset:-1px;border-width:0;block-size:100%}.preview-container ::ng-deep tui-scrollbar{height:100%}.preview-container ::ng-deep .t-content{display:flex;block-size:auto!important}.preview-container .preview{padding:10px}.preview-readonly-container{width:100%;border-radius:var(--tui-radius-l);transition-property:box-shadow,background-color,outline-color,border-color,color;transition-duration:calc(var(--tui-duration) / 2);transition-timing-function:var(--tui-curve-productive-standard);--t-shadow: 0 .125rem .1875rem rgba(0, 0, 0, .1);background-color:var(--tui-background-base);color:var(--tui-text-tertiary);box-shadow:var(--t-shadow);outline:1px solid var(--tui-border-normal);outline-offset:-1px;border-width:0;block-size:100%}.preview-readonly-container .edit-button{position:absolute;z-index:999}.preview-readonly-container ::ng-deep tui-scrollbar{height:100%}.preview-readonly-container ::ng-deep .t-content{display:flex;block-size:auto!important}.preview-readonly-container .preview{padding:10px}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox]):not([ngNoCva])[formControlName],textarea:not([ngNoCva])[formControlName],input:not([type=checkbox]):not([ngNoCva])[formControl],textarea:not([ngNoCva])[formControl],input:not([type=checkbox]):not([ngNoCva])[ngModel],textarea:not([ngNoCva])[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i4$1.TuiTextareaComponent, selector: "textarea[tuiTextarea]", inputs: ["min", "max", "content"] }, { kind: "component", type: i3.TuiTextfieldComponent, selector: "tui-textfield:not([multi])", inputs: ["content", "filler"] }, { kind: "directive", type: TuiButton, selector: "a[tuiButton],button[tuiButton],a[tuiIconButton],button[tuiIconButton]", inputs: ["size"] }, { kind: "component", type: TuiScrollbar, selector: "tui-scrollbar" }, { kind: "component", type: EzUIMenuBar, selector: "ezui-menubar", inputs: ["items"] }] });
522
600
  }
523
601
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: EzUIMarkdownEditor, decorators: [{
524
602
  type: Component,
@@ -624,7 +702,7 @@ class EzUIMultiSelect {
624
702
  }
625
703
  </tui-data-list>
626
704
  </tui-textfield>
627
- `, isInline: true, styles: [""], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox]):not([ngNoCva])[formControlName],textarea:not([ngNoCva])[formControlName],input:not([type=checkbox]):not([ngNoCva])[formControl],textarea:not([ngNoCva])[formControl],input:not([type=checkbox]):not([ngNoCva])[ngModel],textarea:not([ngNoCva])[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2$1.TuiMultiSelectGroupDirective, selector: "[tuiMultiSelectGroup]" }, { kind: "directive", type: i2.TuiLabel, selector: "label[tuiLabel]" }, { kind: "directive", type: i3.TuiTextfieldOptionsDirective, selector: "[tuiTextfieldAppearance],[tuiTextfieldSize],[tuiTextfieldCleaner]", inputs: ["tuiTextfieldAppearance", "tuiTextfieldSize", "tuiTextfieldCleaner"] }, { kind: "directive", type: i4.TuiDropdownContent, selector: "ng-template[tuiDropdown]" }, { kind: "component", type: i1$1.TuiDataListComponent, selector: "tui-data-list", inputs: ["emptyContent", "size"] }, { kind: "directive", type: i1$1.TuiOption, selector: "button[tuiOption], a[tuiOption], label[tuiOption]", inputs: ["disabled"] }, { kind: "directive", type: i1$1.TuiOptionWithValue, selector: "button[tuiOption][value], a[tuiOption][value], label[tuiOption][value]", inputs: ["disabled", "value"] }, { kind: "directive", type: i7.TuiItem, selector: "[tuiItem]" }, { kind: "component", type: i1$1.TuiTextfieldMultiComponent, selector: "tui-textfield[multi]", inputs: ["rows"] }, { kind: "directive", type: i2$1.TuiInputChipDirective, selector: "input[tuiInputChip]", inputs: ["separator", "unique"] }, { kind: "component", type: i2$1.TuiInputChipComponent, selector: "tui-input-chip", inputs: ["editable"] }, { kind: "directive", type: TuiSelectLike, selector: "[tuiSelectLike]" }, { kind: "directive", type: TuiChevron, selector: "[tuiChevron]", inputs: ["tuiChevron"] }] });
705
+ `, isInline: true, styles: [""], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox]):not([ngNoCva])[formControlName],textarea:not([ngNoCva])[formControlName],input:not([type=checkbox]):not([ngNoCva])[formControl],textarea:not([ngNoCva])[formControl],input:not([type=checkbox]):not([ngNoCva])[ngModel],textarea:not([ngNoCva])[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i4$1.TuiMultiSelectGroupDirective, selector: "[tuiMultiSelectGroup]" }, { kind: "directive", type: i2.TuiLabel, selector: "label[tuiLabel]" }, { kind: "directive", type: i3.TuiTextfieldOptionsDirective, selector: "[tuiTextfieldAppearance],[tuiTextfieldSize],[tuiTextfieldCleaner]", inputs: ["tuiTextfieldAppearance", "tuiTextfieldSize", "tuiTextfieldCleaner"] }, { kind: "directive", type: i4.TuiDropdownContent, selector: "ng-template[tuiDropdown]" }, { kind: "component", type: i3$1.TuiDataListComponent, selector: "tui-data-list", inputs: ["emptyContent", "size"] }, { kind: "directive", type: i3$1.TuiOption, selector: "button[tuiOption], a[tuiOption], label[tuiOption]", inputs: ["disabled"] }, { kind: "directive", type: i3$1.TuiOptionWithValue, selector: "button[tuiOption][value], a[tuiOption][value], label[tuiOption][value]", inputs: ["disabled", "value"] }, { kind: "directive", type: i7.TuiItem, selector: "[tuiItem]" }, { kind: "component", type: i3$1.TuiTextfieldMultiComponent, selector: "tui-textfield[multi]", inputs: ["rows"] }, { kind: "directive", type: i4$1.TuiInputChipDirective, selector: "input[tuiInputChip]", inputs: ["separator", "unique"] }, { kind: "component", type: i4$1.TuiInputChipComponent, selector: "tui-input-chip", inputs: ["editable"] }, { kind: "directive", type: TuiSelectLike, selector: "[tuiSelectLike]" }, { kind: "directive", type: TuiChevron, selector: "[tuiChevron]", inputs: ["tuiChevron"] }] });
628
706
  }
629
707
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: EzUIMultiSelect, decorators: [{
630
708
  type: Component,
@@ -698,7 +776,7 @@ class EzUINumberInput {
698
776
  }
699
777
  <input tuiInputNumber [(ngModel)]="value" (ngModelChange)="valueChange.emit(value)" [disabled]="disabled" [min]="min" [max]="max"/>
700
778
  </tui-textfield>
701
- `, isInline: true, styles: [""], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox]):not([ngNoCva])[formControlName],textarea:not([ngNoCva])[formControlName],input:not([type=checkbox]):not([ngNoCva])[formControl],textarea:not([ngNoCva])[formControl],input:not([type=checkbox]):not([ngNoCva])[ngModel],textarea:not([ngNoCva])[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.TuiLabel, selector: "label[tuiLabel]" }, { kind: "component", type: i3.TuiTextfieldComponent, selector: "tui-textfield:not([multi])", inputs: ["content", "filler"] }, { kind: "directive", type: i3.TuiTextfieldOptionsDirective, selector: "[tuiTextfieldAppearance],[tuiTextfieldSize],[tuiTextfieldCleaner]", inputs: ["tuiTextfieldAppearance", "tuiTextfieldSize", "tuiTextfieldCleaner"] }, { kind: "directive", type: i2$1.TuiInputNumberDirective, selector: "input[tuiInputNumber]" }] });
779
+ `, isInline: true, styles: [""], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox]):not([ngNoCva])[formControlName],textarea:not([ngNoCva])[formControlName],input:not([type=checkbox]):not([ngNoCva])[formControl],textarea:not([ngNoCva])[formControl],input:not([type=checkbox]):not([ngNoCva])[ngModel],textarea:not([ngNoCva])[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.TuiLabel, selector: "label[tuiLabel]" }, { kind: "component", type: i3.TuiTextfieldComponent, selector: "tui-textfield:not([multi])", inputs: ["content", "filler"] }, { kind: "directive", type: i3.TuiTextfieldOptionsDirective, selector: "[tuiTextfieldAppearance],[tuiTextfieldSize],[tuiTextfieldCleaner]", inputs: ["tuiTextfieldAppearance", "tuiTextfieldSize", "tuiTextfieldCleaner"] }, { kind: "directive", type: i4$1.TuiInputNumberDirective, selector: "input[tuiInputNumber]" }] });
702
780
  }
703
781
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: EzUINumberInput, decorators: [{
704
782
  type: Component,
@@ -754,7 +832,7 @@ class EzUIPasswordInput {
754
832
  <input tuiInput type="password" [(ngModel)]="value" (ngModelChange)="valueChange.emit(value)" [disabled]="disabled"/>
755
833
  <tui-icon tuiPassword />
756
834
  </tui-textfield>
757
- `, isInline: true, styles: [""], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox]):not([ngNoCva])[formControlName],textarea:not([ngNoCva])[formControlName],input:not([type=checkbox]):not([ngNoCva])[formControl],textarea:not([ngNoCva])[formControl],input:not([type=checkbox]):not([ngNoCva])[ngModel],textarea:not([ngNoCva])[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.TuiLabel, selector: "label[tuiLabel]" }, { kind: "component", type: i3.TuiTextfieldComponent, selector: "tui-textfield:not([multi])", inputs: ["content", "filler"] }, { kind: "directive", type: i3.TuiTextfieldOptionsDirective, selector: "[tuiTextfieldAppearance],[tuiTextfieldSize],[tuiTextfieldCleaner]", inputs: ["tuiTextfieldAppearance", "tuiTextfieldSize", "tuiTextfieldCleaner"] }, { kind: "directive", type: i1$1.TuiInputDirective, selector: "input[tuiInput]", inputs: ["readOnly", "invalid", "focused", "state"] }, { kind: "component", type: TuiIcon, selector: "tui-icon:not([tuiBadge])", inputs: ["background"] }, { kind: "directive", type: TuiPassword, selector: "tui-icon[tuiPassword]" }] });
835
+ `, isInline: true, styles: [""], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox]):not([ngNoCva])[formControlName],textarea:not([ngNoCva])[formControlName],input:not([type=checkbox]):not([ngNoCva])[formControl],textarea:not([ngNoCva])[formControl],input:not([type=checkbox]):not([ngNoCva])[ngModel],textarea:not([ngNoCva])[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.TuiLabel, selector: "label[tuiLabel]" }, { kind: "component", type: i3.TuiTextfieldComponent, selector: "tui-textfield:not([multi])", inputs: ["content", "filler"] }, { kind: "directive", type: i3.TuiTextfieldOptionsDirective, selector: "[tuiTextfieldAppearance],[tuiTextfieldSize],[tuiTextfieldCleaner]", inputs: ["tuiTextfieldAppearance", "tuiTextfieldSize", "tuiTextfieldCleaner"] }, { kind: "directive", type: i3$1.TuiInputDirective, selector: "input[tuiInput]", inputs: ["readOnly", "invalid", "focused", "state"] }, { kind: "component", type: TuiIcon, selector: "tui-icon:not([tuiBadge])", inputs: ["background"] }, { kind: "directive", type: TuiPassword, selector: "tui-icon[tuiPassword]" }] });
758
836
  }
759
837
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: EzUIPasswordInput, decorators: [{
760
838
  type: Component,
@@ -787,6 +865,1390 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImpor
787
865
  type: Output
788
866
  }] } });
789
867
 
868
+ class EzUITablePresets {
869
+ table;
870
+ storageKey = null;
871
+ currentPreset = signal(null, /* @ts-ignore */
872
+ ...(ngDevMode ? [{ debugName: "currentPreset" }] : /* istanbul ignore next */ []));
873
+ presets = signal([], /* @ts-ignore */
874
+ ...(ngDevMode ? [{ debugName: "presets" }] : /* istanbul ignore next */ []));
875
+ constructor(table) {
876
+ this.table = table;
877
+ }
878
+ async ngOnChanges(changes) {
879
+ if (changes['storageKey'] && changes['storageKey'].previousValue != changes['storageKey'].currentValue) {
880
+ this.storageKey = changes['storageKey'].currentValue;
881
+ if (this.storageKey) {
882
+ var item = localStorage.getItem(this.storageKey);
883
+ if (item) {
884
+ var parsed = JSON.parse(item);
885
+ if (parsed) {
886
+ this.presets.set(parsed.presets);
887
+ if (parsed.current) {
888
+ var target = (parsed.presets).find(x => x.id == parsed.current);
889
+ if (target)
890
+ this.selectPreset(target.id);
891
+ }
892
+ }
893
+ }
894
+ }
895
+ }
896
+ }
897
+ ngOnInit() {
898
+ setTimeout(() => {
899
+ var current = this.currentPreset();
900
+ if (current)
901
+ this.onPresetChange.emit(current);
902
+ }, 500);
903
+ }
904
+ onPresetChange = new EventEmitter();
905
+ saveCurrentPreset() {
906
+ var currentPreset = this.currentPreset();
907
+ if (currentPreset) {
908
+ currentPreset.sorts = [...this.table.sorts()];
909
+ currentPreset.filters = [...this.table.filters()];
910
+ this.currentPreset.set(currentPreset);
911
+ var presets = this.presets();
912
+ var target = this.presets().findIndex(x => x.id == currentPreset?.id);
913
+ if (target != -1)
914
+ presets[target] = currentPreset;
915
+ this.presets.set(presets);
916
+ this.savePresets();
917
+ }
918
+ }
919
+ selectPreset(id) {
920
+ var presets = this.presets();
921
+ var target = presets.findIndex(x => x.id == id);
922
+ if (target != -1) {
923
+ var preset = presets[target];
924
+ this.currentPreset.set(preset);
925
+ this.table.sorts.set(preset.sorts);
926
+ this.table.filters.set(preset.filters);
927
+ this.onPresetChange.emit(preset);
928
+ this.table.applyFilter();
929
+ }
930
+ this.savePresets();
931
+ }
932
+ createPreset() {
933
+ this.saveCurrentPreset();
934
+ var preset = {
935
+ id: v4(),
936
+ name: 'New Preset',
937
+ sorts: [...this.table.sorts()],
938
+ filters: [...this.table.filters()]
939
+ };
940
+ this.currentPreset.set(preset);
941
+ var presets = this.presets();
942
+ presets.push(preset);
943
+ this.presets.set(presets);
944
+ this.savePresets();
945
+ }
946
+ removePreset(id) {
947
+ var presets = this.presets();
948
+ var target = presets.findIndex(x => x.id == id);
949
+ if (target != -1)
950
+ presets.splice(target, 1);
951
+ this.presets.set(presets);
952
+ var current = this.currentPreset();
953
+ if (current?.id == id) {
954
+ if (presets.length > 0) {
955
+ this.currentPreset.set(presets[0]);
956
+ this.onPresetChange.emit(presets[0]);
957
+ }
958
+ else {
959
+ this.currentPreset.set(null);
960
+ this.onPresetChange.emit(null);
961
+ }
962
+ }
963
+ this.savePresets();
964
+ }
965
+ savePresets() {
966
+ if (this.storageKey) {
967
+ var saveBody = {
968
+ current: this.currentPreset()?.id,
969
+ presets: [...this.presets()]
970
+ };
971
+ localStorage.setItem(this.storageKey, JSON.stringify(saveBody));
972
+ }
973
+ }
974
+ clearFilters() {
975
+ this.currentPreset.set(null);
976
+ this.onPresetChange.emit(null);
977
+ this.table.sorts.set([]);
978
+ this.table.filters.set([]);
979
+ this.savePresets();
980
+ this.table.applyFilter();
981
+ }
982
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: EzUITablePresets, deps: [{ token: EzUITable }], target: i0.ɵɵFactoryTarget.Component });
983
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.7", type: EzUITablePresets, isStandalone: true, selector: "ezui-table-presets", inputs: { storageKey: "storageKey" }, outputs: { onPresetChange: "onPresetChange" }, host: { styleAttribute: "display:flex;flex-direction: row;gap:10px;padding:5px;padding-top:0px;" }, usesOnChanges: true, ngImport: i0, template: `
984
+ <button tuiButton iconStart="plus" size="s" appearance="secondary" (click)="createPreset()" tuiHint="Create new preset from current filters"></button>
985
+
986
+ <tui-scrollbar>
987
+ @let current = currentPreset();
988
+ @for(preset of presets(); track preset.id){
989
+ <div tuiGroup [collapsed]="true" [rounded]="true">
990
+ @let isActive = current?.id == preset.id;
991
+ @if(isActive){
992
+ @if(preset.edit){
993
+ <tui-textfield style="width:10rem" tuiTextfieldSize="s" (keydown.enter)="preset.edit = false;saveCurrentPreset()">
994
+ <input tuiInput [(ngModel)]="preset.name"/>
995
+ </tui-textfield>
996
+ <button style="flex: 0 0 auto;" tuiButton iconStart="save" size="s" appearance="info" (click)="preset.edit = false;saveCurrentPreset()" tuiHint="Save"></button>
997
+ }
998
+ @else {
999
+ <div style="height:100%" appearance="positive" tuiBadge tuiStatus>
1000
+ {{preset.name}}
1001
+ </div>
1002
+ <button style="flex: 0 0 auto;" tuiButton iconStart="square-pen" size="s" appearance="info" (click)="preset.edit = true" tuiHint="Edit"></button>
1003
+ }
1004
+ <button style="flex: 0 0 auto;" tuiButton iconStart="x" size="s" appearance="negative" (click)="removePreset(preset.id)" tuiHint="Delete"></button>
1005
+ }
1006
+ @else {
1007
+ <button style="flex: 0 0 auto;" tuiButton appearance="secondary" size="s" (click)="selectPreset(preset.id)">{{preset.name}}</button>
1008
+ }
1009
+ </div>
1010
+ }
1011
+ </tui-scrollbar>
1012
+ `, isInline: true, styles: ["tui-scrollbar{width:100%!important}tui-scrollbar ::ng-deep>.t-content{display:flex;gap:10px;width:0px}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox]):not([ngNoCva])[formControlName],textarea:not([ngNoCva])[formControlName],input:not([type=checkbox]):not([ngNoCva])[formControl],textarea:not([ngNoCva])[formControl],input:not([type=checkbox]):not([ngNoCva])[ngModel],textarea:not([ngNoCva])[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: CommonModule }, { kind: "component", type: TuiScrollbar, selector: "tui-scrollbar" }, { kind: "directive", type: TuiButton, selector: "a[tuiButton],button[tuiButton],a[tuiIconButton],button[tuiIconButton]", inputs: ["size"] }, { kind: "directive", type: TuiGroup, selector: "[tuiGroup]:not(ng-container)", inputs: ["orientation", "collapsed", "rounded", "size"] }, { kind: "directive", type: TuiBadge, selector: "[tuiBadge],tui-icon[tuiBadge]", inputs: ["size"] }, { kind: "directive", type: TuiStatus, selector: "[tuiStatus]", inputs: ["tuiStatus"] }, { kind: "component", type: i3.TuiTextfieldComponent, selector: "tui-textfield:not([multi])", inputs: ["content", "filler"] }, { kind: "directive", type: i3.TuiTextfieldOptionsDirective, selector: "[tuiTextfieldAppearance],[tuiTextfieldSize],[tuiTextfieldCleaner]", inputs: ["tuiTextfieldAppearance", "tuiTextfieldSize", "tuiTextfieldCleaner"] }, { kind: "directive", type: i3$1.TuiInputDirective, selector: "input[tuiInput]", inputs: ["readOnly", "invalid", "focused", "state"] }, { kind: "directive", type: i3$1.TuiHintDirective, selector: "[tuiHint]:not(ng-container):not(ng-template)", inputs: ["tuiHint", "tuiHintContext", "tuiHintAppearance"], outputs: ["tuiHintVisible"] }] });
1013
+ }
1014
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: EzUITablePresets, decorators: [{
1015
+ type: Component,
1016
+ args: [{ selector: 'ezui-table-presets', imports: [FormsModule, CommonModule, TuiScrollbar, TuiButton, TuiGroup, TuiBadge, TuiStatus, TuiInput, TuiHint], template: `
1017
+ <button tuiButton iconStart="plus" size="s" appearance="secondary" (click)="createPreset()" tuiHint="Create new preset from current filters"></button>
1018
+
1019
+ <tui-scrollbar>
1020
+ @let current = currentPreset();
1021
+ @for(preset of presets(); track preset.id){
1022
+ <div tuiGroup [collapsed]="true" [rounded]="true">
1023
+ @let isActive = current?.id == preset.id;
1024
+ @if(isActive){
1025
+ @if(preset.edit){
1026
+ <tui-textfield style="width:10rem" tuiTextfieldSize="s" (keydown.enter)="preset.edit = false;saveCurrentPreset()">
1027
+ <input tuiInput [(ngModel)]="preset.name"/>
1028
+ </tui-textfield>
1029
+ <button style="flex: 0 0 auto;" tuiButton iconStart="save" size="s" appearance="info" (click)="preset.edit = false;saveCurrentPreset()" tuiHint="Save"></button>
1030
+ }
1031
+ @else {
1032
+ <div style="height:100%" appearance="positive" tuiBadge tuiStatus>
1033
+ {{preset.name}}
1034
+ </div>
1035
+ <button style="flex: 0 0 auto;" tuiButton iconStart="square-pen" size="s" appearance="info" (click)="preset.edit = true" tuiHint="Edit"></button>
1036
+ }
1037
+ <button style="flex: 0 0 auto;" tuiButton iconStart="x" size="s" appearance="negative" (click)="removePreset(preset.id)" tuiHint="Delete"></button>
1038
+ }
1039
+ @else {
1040
+ <button style="flex: 0 0 auto;" tuiButton appearance="secondary" size="s" (click)="selectPreset(preset.id)">{{preset.name}}</button>
1041
+ }
1042
+ </div>
1043
+ }
1044
+ </tui-scrollbar>
1045
+ `, host: {
1046
+ style: 'display:flex;flex-direction: row;gap:10px;padding:5px;padding-top:0px;'
1047
+ }, styles: ["tui-scrollbar{width:100%!important}tui-scrollbar ::ng-deep>.t-content{display:flex;gap:10px;width:0px}\n"] }]
1048
+ }], ctorParameters: () => [{ type: EzUITable }], propDecorators: { storageKey: [{
1049
+ type: Input
1050
+ }], onPresetChange: [{
1051
+ type: Output
1052
+ }] } });
1053
+
1054
+ class EzUIFilterHelpers {
1055
+ static textFilter(values, fn, column) {
1056
+ var filtered = [];
1057
+ for (let value of values) {
1058
+ var asStr = value[column];
1059
+ if (fn(asStr))
1060
+ filtered.push(value);
1061
+ }
1062
+ return filtered;
1063
+ }
1064
+ static dateFilter(values, fn, column) {
1065
+ var filtered = [];
1066
+ for (let value of values) {
1067
+ var asDate = new Date(value[column]);
1068
+ if (fn(asDate))
1069
+ filtered.push(value);
1070
+ }
1071
+ return filtered;
1072
+ }
1073
+ }
1074
+
1075
+ class EzUITableFilterService {
1076
+ sortMethods = [
1077
+ {
1078
+ state: 'asc',
1079
+ sort: (a, b, column) => {
1080
+ if (a[column] < b[column])
1081
+ return 1;
1082
+ if (a[column] > b[column])
1083
+ return -1;
1084
+ return 0;
1085
+ }
1086
+ },
1087
+ {
1088
+ state: 'desc',
1089
+ sort: (a, b, column) => {
1090
+ if (a[column] < b[column])
1091
+ return -1;
1092
+ if (a[column] > b[column])
1093
+ return 1;
1094
+ return 0;
1095
+ }
1096
+ }
1097
+ ];
1098
+ filterMethods = [
1099
+ // Text filters
1100
+ {
1101
+ key: 'str',
1102
+ action: 'con',
1103
+ filter: (values, column, value) => EzUIFilterHelpers.textFilter(values, (i) => i.includes(value), column)
1104
+ },
1105
+ {
1106
+ key: 'str',
1107
+ action: 'ncon',
1108
+ filter: (values, column, value) => EzUIFilterHelpers.textFilter(values, (i) => !i.includes(value), column)
1109
+ },
1110
+ {
1111
+ key: 'str',
1112
+ action: 'sta',
1113
+ filter: (values, column, value) => EzUIFilterHelpers.textFilter(values, (i) => i.startsWith(value), column)
1114
+ },
1115
+ {
1116
+ key: 'str',
1117
+ action: 'end',
1118
+ filter: (values, column, value) => EzUIFilterHelpers.textFilter(values, (i) => i.endsWith(value), column)
1119
+ },
1120
+ // Select filters
1121
+ {
1122
+ key: 'sel',
1123
+ action: 'con',
1124
+ filter: (values, column, value) => EzUIFilterHelpers.textFilter(values, (i) => value.includes(i), column)
1125
+ },
1126
+ {
1127
+ key: 'sel',
1128
+ action: 'ncon',
1129
+ filter: (values, column, value) => EzUIFilterHelpers.textFilter(values, (i) => !value.includes(i), column)
1130
+ },
1131
+ // Date filters
1132
+ {
1133
+ key: 'dat',
1134
+ action: 'bef',
1135
+ filter: (values, column, value) => EzUIFilterHelpers.dateFilter(values, (i) => {
1136
+ var normal = value[0].toLocalNativeDate();
1137
+ normal.setMilliseconds(value[1].toAbsoluteMilliseconds());
1138
+ return i.getTime() < normal.getTime();
1139
+ }, column)
1140
+ },
1141
+ {
1142
+ key: 'dat',
1143
+ action: 'aft',
1144
+ filter: (values, column, value) => EzUIFilterHelpers.dateFilter(values, (i) => {
1145
+ var normal = value[0].toLocalNativeDate();
1146
+ normal.setMilliseconds(value[1].toAbsoluteMilliseconds());
1147
+ return i.getTime() > normal.getTime();
1148
+ }, column)
1149
+ },
1150
+ ];
1151
+ sort(values, sort) {
1152
+ var target = this.sortMethods.find(x => x.state == sort.state);
1153
+ if (target)
1154
+ return values.sort((a, b) => target.sort(a, b, sort.column));
1155
+ return values;
1156
+ }
1157
+ filter(values, filter) {
1158
+ var split = filter.expression.split(';');
1159
+ var target = this.filterMethods.find(x => split[0] == x.key && split[1] == x.action);
1160
+ if (target)
1161
+ return target.filter(values, filter.column, filter.value);
1162
+ return values;
1163
+ }
1164
+ }
1165
+
1166
+ class EzUITable {
1167
+ filterService;
1168
+ tableHeader;
1169
+ tableRows;
1170
+ tableExpandedrow;
1171
+ presetHeader;
1172
+ disabled = false;
1173
+ isLoading = signal(false, /* @ts-ignore */
1174
+ ...(ngDevMode ? [{ debugName: "isLoading" }] : /* istanbul ignore next */ []));
1175
+ showAdd = false;
1176
+ showRefresh = false;
1177
+ showClearFilters = false;
1178
+ expandable = false;
1179
+ values = [];
1180
+ internalValues = [];
1181
+ displayValues = signal([], /* @ts-ignore */
1182
+ ...(ngDevMode ? [{ debugName: "displayValues" }] : /* istanbul ignore next */ []));
1183
+ sorts = signal([], /* @ts-ignore */
1184
+ ...(ngDevMode ? [{ debugName: "sorts" }] : /* istanbul ignore next */ []));
1185
+ filters = signal([], /* @ts-ignore */
1186
+ ...(ngDevMode ? [{ debugName: "filters" }] : /* istanbul ignore next */ []));
1187
+ storageKey = null;
1188
+ allowPresets = false;
1189
+ constructor(filterService) {
1190
+ this.filterService = filterService;
1191
+ }
1192
+ async ngOnChanges(changes) {
1193
+ if (changes['values'] && changes['values'].previousValue != changes['values'].currentValue) {
1194
+ this.values = changes['values'].currentValue;
1195
+ this.applyFilter();
1196
+ }
1197
+ }
1198
+ onAddItem = new EventEmitter();
1199
+ onLoadItems = new EventEmitter();
1200
+ onRowExpanded = new EventEmitter();
1201
+ onPresetChange = new EventEmitter();
1202
+ pageSize = signal(25, /* @ts-ignore */
1203
+ ...(ngDevMode ? [{ debugName: "pageSize" }] : /* istanbul ignore next */ []));
1204
+ page = signal(0, /* @ts-ignore */
1205
+ ...(ngDevMode ? [{ debugName: "page" }] : /* istanbul ignore next */ []));
1206
+ pages = signal(0, /* @ts-ignore */
1207
+ ...(ngDevMode ? [{ debugName: "pages" }] : /* istanbul ignore next */ []));
1208
+ pageSizes = [10, 25, 50, 100, 1000];
1209
+ processPage() {
1210
+ var fromIndex = this.pageSize() * this.page();
1211
+ var toIndex = fromIndex + this.pageSize();
1212
+ this.displayValues.set(this.internalValues.slice(fromIndex, toIndex));
1213
+ }
1214
+ applySorts() {
1215
+ var sorted = [...this.internalValues];
1216
+ for (var sort of this.sorts())
1217
+ sorted = this.filterService.sort(sorted, sort);
1218
+ this.internalValues = sorted;
1219
+ }
1220
+ applyFilter() {
1221
+ var filtered = [...this.values];
1222
+ for (var filter of this.filters())
1223
+ filtered = this.filterService.filter(filtered, filter);
1224
+ this.internalValues = filtered;
1225
+ this.applySorts();
1226
+ this.state = [];
1227
+ this.page.set(0);
1228
+ this.pages.set(Math.floor(this.internalValues.length / this.pageSize()) + 1);
1229
+ this.processPage();
1230
+ this.presetHeader?.saveCurrentPreset();
1231
+ }
1232
+ state = {};
1233
+ setSort(sort) {
1234
+ var sorts = this.sorts();
1235
+ var target = sorts.findIndex(x => x.column == sort.column);
1236
+ if (target != -1)
1237
+ sorts[target] = sort;
1238
+ else
1239
+ sorts.push(sort);
1240
+ this.sorts.set(sorts);
1241
+ this.applyFilter();
1242
+ }
1243
+ clearSort(column) {
1244
+ var sorts = this.sorts();
1245
+ var target = sorts.findIndex(x => x.column == column);
1246
+ if (target != -1)
1247
+ sorts.splice(target, 1);
1248
+ this.sorts.set(sorts);
1249
+ this.applyFilter();
1250
+ }
1251
+ setFilter(filter) {
1252
+ var filters = this.filters();
1253
+ var target = filters.findIndex(x => x.column == filter.column);
1254
+ if (target != -1) {
1255
+ filters[target] = filter;
1256
+ }
1257
+ else
1258
+ filters.push(filter);
1259
+ this.filters.set(filters);
1260
+ this.applyFilter();
1261
+ }
1262
+ clearFilter(column) {
1263
+ var filters = this.filters();
1264
+ var target = filters.findIndex(x => x.column == column);
1265
+ if (target != -1)
1266
+ filters.splice(target, 1);
1267
+ this.filters.set(filters);
1268
+ this.applyFilter();
1269
+ }
1270
+ clearFilters() {
1271
+ this.presetHeader?.currentPreset.set(null);
1272
+ this.onPresetChange.emit(null);
1273
+ this.sorts.set([]);
1274
+ this.filters.set([]);
1275
+ this.presetHeader?.savePresets();
1276
+ this.applyFilter();
1277
+ }
1278
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: EzUITable, deps: [{ token: EzUITableFilterService }], target: i0.ɵɵFactoryTarget.Component });
1279
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.7", type: EzUITable, isStandalone: true, selector: "ezui-table", inputs: { disabled: "disabled", isLoading: "isLoading", showAdd: "showAdd", showRefresh: "showRefresh", showClearFilters: "showClearFilters", expandable: "expandable", values: "values", storageKey: "storageKey", allowPresets: "allowPresets", pageSize: "pageSize" }, outputs: { onAddItem: "onAddItem", onLoadItems: "onLoadItems", onRowExpanded: "onRowExpanded", onPresetChange: "onPresetChange" }, host: { classAttribute: "w-full h-full" }, queries: [{ propertyName: "tableHeader", first: true, predicate: ["tableHeader"], descendants: true }, { propertyName: "tableRows", first: true, predicate: ["tableRows"], descendants: true }, { propertyName: "tableExpandedrow", first: true, predicate: ["tableExpandedrow"], descendants: true }], viewQueries: [{ propertyName: "presetHeader", first: true, predicate: ["presetHeader"], descendants: true }], usesOnChanges: true, ngImport: i0, template: `
1280
+ <div class="ezui-table">
1281
+ <tui-loader [inheritColor]="true" [overlay]="true" size="xxl" [loading]="isLoading()">
1282
+ @if(values.length == 0){
1283
+ <tui-block-status>
1284
+ <tui-icon tuiSlot="top" icon="grid-2x2-x" />
1285
+
1286
+ <h3>No Data</h3>
1287
+
1288
+ No data to display.
1289
+ </tui-block-status>
1290
+ }
1291
+ @else {
1292
+ @if(showAdd || showRefresh || showClearFilters){
1293
+ <div class="ezui-table-header">
1294
+ @if(showRefresh){
1295
+ <button tuiButton iconStart="rotate-cw" size="s" appearance="info" (click)="onLoadItems.emit()" tuiHint="Refresh the table"></button>
1296
+ }
1297
+ @if(showAdd){
1298
+ <button tuiButton iconStart="plus" size="s" appearance="info" (click)="onAddItem.emit()" tuiHint="Add new item"></button>
1299
+ }
1300
+ @if(showClearFilters){
1301
+ <button tuiButton iconStart="funnel-x" size="s" appearance="info" (click)="clearFilters()" tuiHint="Clear filters"></button>
1302
+ }
1303
+ </div>
1304
+ }
1305
+ @if(allowPresets){
1306
+ <ezui-table-presets #presetHeader [storageKey]="storageKey" (onPresetChange)="onPresetChange.emit($event)">
1307
+ </ezui-table-presets>
1308
+ }
1309
+ <tui-scrollbar class="forcefullsize">
1310
+ <table tuiTable class="forcefullsize">
1311
+ <thead>
1312
+ <tr>
1313
+ @if(expandable){
1314
+ <th tuiTh></th>
1315
+ }
1316
+ <ng-container [ngTemplateOutlet]="tableHeader"></ng-container>
1317
+ </tr>
1318
+ </thead>
1319
+ @for (item of displayValues(); track page() * pageSize() + i; let i = $index){
1320
+ @let fullIndex = page() * pageSize() + i;
1321
+ <tbody tuiTbody>
1322
+ <tr>
1323
+ @if(expandable){
1324
+ <td tuiTd class="ezui-table-expander">
1325
+ <button
1326
+ appearance="flat-grayscale"
1327
+ size="xs"
1328
+ tuiIconButton
1329
+ type="button"
1330
+ [tuiChevron]="state[fullIndex] ?? false"
1331
+ (click)="state[fullIndex] = !state[fullIndex];onRowExpanded.emit(item)"
1332
+ >
1333
+ Toggle
1334
+ </button>
1335
+ </td>
1336
+ }
1337
+ <ng-container [ngTemplateOutlet]="tableRows" [ngTemplateOutletContext]="{ $implicit: item }"></ng-container>
1338
+ </tr>
1339
+ </tbody>
1340
+
1341
+ <tbody tuiTableExpand [expanded]="state[fullIndex] ?? false">
1342
+ @if(state[fullIndex] ?? false){
1343
+ <tr>
1344
+ <ng-container [ngTemplateOutlet]="tableExpandedrow" [ngTemplateOutletContext]="{ $implicit: item }"></ng-container>
1345
+ </tr>
1346
+ }
1347
+ </tbody>
1348
+ }
1349
+ </table>
1350
+ </tui-scrollbar>
1351
+ @if(internalValues.length > pageSize() || pageSize() != 25){
1352
+ <div class="ezui-table-footer">
1353
+ <tui-table-pagination
1354
+ [(size)]="pageSize"
1355
+ [(page)]="page"
1356
+ [total]="internalValues.length"
1357
+ [items]="pageSizes"
1358
+ (pageChange)="processPage()"
1359
+ (sizeChange)="processPage()"
1360
+ />
1361
+ </div>
1362
+ }
1363
+ }
1364
+ </tui-loader>
1365
+ </div>
1366
+ `, isInline: true, styles: [".ezui-table{border:2px solid var(--tui-border-normal);border-radius:var(--tui-radius-l);display:flex;height:100%;width:100%;overflow:hidden}.ezui-table ::ng-deep tui-loader{display:flex;height:100%;width:100%;flex-direction:column}.ezui-table .ezui-table-header{display:flex;flex-direction:row;gap:10px;padding:5px 5px 0}.ezui-table .ezui-table-footer{display:flex;margin-bottom:.5rem;padding-left:2rem;padding-right:2rem}.ezui-table .ezui-table-footer tui-table-pagination{flex:1}.ezui-table ::ng-deep table{border-radius:var(--tui-radius-l)}.ezui-table ::ng-deep th{background-color:var(--tui-background-base-alt)!important}.ezui-table ::ng-deep .ezui-table-expander{padding:0}.ezui-table th[tuiTh]{align-items:center}.ezui-table .forcefullsize{width:100%!important}.ezui-table tui-block-status{padding-top:20px;padding-bottom:20px}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2$1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i3$2.TuiTableDirective, selector: "table[tuiTable]", inputs: ["columns", "size", "direction", "sorter"], outputs: ["directionChange", "sorterChange", "sortChange"] }, { kind: "component", type: i3$2.TuiTableTbody, selector: "tbody[tuiTbody]", inputs: ["heading", "open"], outputs: ["openChange"] }, { kind: "component", type: i3$2.TuiTableTh, selector: "th[tuiTh]", inputs: ["minWidth", "maxWidth", "sorter", "resizable", "sticky", "requiredSort"], outputs: ["sorterChange"] }, { kind: "component", type: i3$2.TuiTableTd, selector: "th[tuiTd], td[tuiTd]" }, { kind: "component", type: i3$2.TuiTableExpand, selector: "tui-table-expand, tbody[tuiTableExpand]", inputs: ["expanded"], outputs: ["expandedChange"] }, { kind: "component", type: TuiScrollbar, selector: "tui-scrollbar" }, { kind: "directive", type: TuiButton, selector: "a[tuiButton],button[tuiButton],a[tuiIconButton],button[tuiIconButton]", inputs: ["size"] }, { kind: "directive", type: TuiChevron, selector: "[tuiChevron]", inputs: ["tuiChevron"] }, { kind: "component", type: TuiTablePagination, selector: "tui-table-pagination", inputs: ["items", "total", "page", "size"], outputs: ["pageChange", "sizeChange", "paginationChange"] }, { kind: "component", type: TuiLoader, selector: "tui-loader", inputs: ["size", "inheritColor", "overlay", "textContent", "loading"] }, { kind: "component", type: i4$2.TuiBlockStatusComponent, selector: "tui-block-status", inputs: ["card", "size"] }, { kind: "directive", type: i4$2.TuiBlockStatusDirective, selector: "[tuiSlot]", inputs: ["tuiSlot"] }, { kind: "component", type: TuiIcon, selector: "tui-icon:not([tuiBadge])", inputs: ["background"] }, { kind: "component", type: EzUITablePresets, selector: "ezui-table-presets", inputs: ["storageKey"], outputs: ["onPresetChange"] }, { kind: "directive", type: i3$1.TuiHintDirective, selector: "[tuiHint]:not(ng-container):not(ng-template)", inputs: ["tuiHint", "tuiHintContext", "tuiHintAppearance"], outputs: ["tuiHintVisible"] }] });
1367
+ }
1368
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: EzUITable, decorators: [{
1369
+ type: Component,
1370
+ args: [{ selector: 'ezui-table', imports: [FormsModule, CommonModule, TuiTable, TuiScrollbar, TuiButton, TuiChevron, TuiDropdown, TuiDataListWrapper, TuiTablePagination, TuiLoader, TuiBlockStatus, TuiIcon, TuiInput, EzUITablePresets, TuiHint], template: `
1371
+ <div class="ezui-table">
1372
+ <tui-loader [inheritColor]="true" [overlay]="true" size="xxl" [loading]="isLoading()">
1373
+ @if(values.length == 0){
1374
+ <tui-block-status>
1375
+ <tui-icon tuiSlot="top" icon="grid-2x2-x" />
1376
+
1377
+ <h3>No Data</h3>
1378
+
1379
+ No data to display.
1380
+ </tui-block-status>
1381
+ }
1382
+ @else {
1383
+ @if(showAdd || showRefresh || showClearFilters){
1384
+ <div class="ezui-table-header">
1385
+ @if(showRefresh){
1386
+ <button tuiButton iconStart="rotate-cw" size="s" appearance="info" (click)="onLoadItems.emit()" tuiHint="Refresh the table"></button>
1387
+ }
1388
+ @if(showAdd){
1389
+ <button tuiButton iconStart="plus" size="s" appearance="info" (click)="onAddItem.emit()" tuiHint="Add new item"></button>
1390
+ }
1391
+ @if(showClearFilters){
1392
+ <button tuiButton iconStart="funnel-x" size="s" appearance="info" (click)="clearFilters()" tuiHint="Clear filters"></button>
1393
+ }
1394
+ </div>
1395
+ }
1396
+ @if(allowPresets){
1397
+ <ezui-table-presets #presetHeader [storageKey]="storageKey" (onPresetChange)="onPresetChange.emit($event)">
1398
+ </ezui-table-presets>
1399
+ }
1400
+ <tui-scrollbar class="forcefullsize">
1401
+ <table tuiTable class="forcefullsize">
1402
+ <thead>
1403
+ <tr>
1404
+ @if(expandable){
1405
+ <th tuiTh></th>
1406
+ }
1407
+ <ng-container [ngTemplateOutlet]="tableHeader"></ng-container>
1408
+ </tr>
1409
+ </thead>
1410
+ @for (item of displayValues(); track page() * pageSize() + i; let i = $index){
1411
+ @let fullIndex = page() * pageSize() + i;
1412
+ <tbody tuiTbody>
1413
+ <tr>
1414
+ @if(expandable){
1415
+ <td tuiTd class="ezui-table-expander">
1416
+ <button
1417
+ appearance="flat-grayscale"
1418
+ size="xs"
1419
+ tuiIconButton
1420
+ type="button"
1421
+ [tuiChevron]="state[fullIndex] ?? false"
1422
+ (click)="state[fullIndex] = !state[fullIndex];onRowExpanded.emit(item)"
1423
+ >
1424
+ Toggle
1425
+ </button>
1426
+ </td>
1427
+ }
1428
+ <ng-container [ngTemplateOutlet]="tableRows" [ngTemplateOutletContext]="{ $implicit: item }"></ng-container>
1429
+ </tr>
1430
+ </tbody>
1431
+
1432
+ <tbody tuiTableExpand [expanded]="state[fullIndex] ?? false">
1433
+ @if(state[fullIndex] ?? false){
1434
+ <tr>
1435
+ <ng-container [ngTemplateOutlet]="tableExpandedrow" [ngTemplateOutletContext]="{ $implicit: item }"></ng-container>
1436
+ </tr>
1437
+ }
1438
+ </tbody>
1439
+ }
1440
+ </table>
1441
+ </tui-scrollbar>
1442
+ @if(internalValues.length > pageSize() || pageSize() != 25){
1443
+ <div class="ezui-table-footer">
1444
+ <tui-table-pagination
1445
+ [(size)]="pageSize"
1446
+ [(page)]="page"
1447
+ [total]="internalValues.length"
1448
+ [items]="pageSizes"
1449
+ (pageChange)="processPage()"
1450
+ (sizeChange)="processPage()"
1451
+ />
1452
+ </div>
1453
+ }
1454
+ }
1455
+ </tui-loader>
1456
+ </div>
1457
+ `, host: {
1458
+ class: 'w-full h-full'
1459
+ }, styles: [".ezui-table{border:2px solid var(--tui-border-normal);border-radius:var(--tui-radius-l);display:flex;height:100%;width:100%;overflow:hidden}.ezui-table ::ng-deep tui-loader{display:flex;height:100%;width:100%;flex-direction:column}.ezui-table .ezui-table-header{display:flex;flex-direction:row;gap:10px;padding:5px 5px 0}.ezui-table .ezui-table-footer{display:flex;margin-bottom:.5rem;padding-left:2rem;padding-right:2rem}.ezui-table .ezui-table-footer tui-table-pagination{flex:1}.ezui-table ::ng-deep table{border-radius:var(--tui-radius-l)}.ezui-table ::ng-deep th{background-color:var(--tui-background-base-alt)!important}.ezui-table ::ng-deep .ezui-table-expander{padding:0}.ezui-table th[tuiTh]{align-items:center}.ezui-table .forcefullsize{width:100%!important}.ezui-table tui-block-status{padding-top:20px;padding-bottom:20px}\n"] }]
1460
+ }], ctorParameters: () => [{ type: EzUITableFilterService }], propDecorators: { tableHeader: [{
1461
+ type: ContentChild,
1462
+ args: ['tableHeader', { static: false }]
1463
+ }], tableRows: [{
1464
+ type: ContentChild,
1465
+ args: ['tableRows', { static: false }]
1466
+ }], tableExpandedrow: [{
1467
+ type: ContentChild,
1468
+ args: ['tableExpandedrow', { static: false }]
1469
+ }], presetHeader: [{
1470
+ type: ViewChild,
1471
+ args: ['presetHeader', { static: false }]
1472
+ }], disabled: [{
1473
+ type: Input
1474
+ }], isLoading: [{
1475
+ type: Input
1476
+ }], showAdd: [{
1477
+ type: Input
1478
+ }], showRefresh: [{
1479
+ type: Input
1480
+ }], showClearFilters: [{
1481
+ type: Input
1482
+ }], expandable: [{
1483
+ type: Input
1484
+ }], values: [{
1485
+ type: Input
1486
+ }], storageKey: [{
1487
+ type: Input
1488
+ }], allowPresets: [{
1489
+ type: Input
1490
+ }], onAddItem: [{
1491
+ type: Output
1492
+ }], onLoadItems: [{
1493
+ type: Output
1494
+ }], onRowExpanded: [{
1495
+ type: Output
1496
+ }], onPresetChange: [{
1497
+ type: Output
1498
+ }], pageSize: [{
1499
+ type: Input
1500
+ }] } });
1501
+
1502
+ class EzUITableDateFilter {
1503
+ column;
1504
+ filterApplied = signal(false, /* @ts-ignore */
1505
+ ...(ngDevMode ? [{ debugName: "filterApplied" }] : /* istanbul ignore next */ []));
1506
+ filterVisible = signal(false, /* @ts-ignore */
1507
+ ...(ngDevMode ? [{ debugName: "filterVisible" }] : /* istanbul ignore next */ []));
1508
+ table;
1509
+ value = [TuiDay.currentLocal(), TuiTime.currentLocal()];
1510
+ filterType;
1511
+ filterTypes;
1512
+ stringify = (item) => `${item.label}`;
1513
+ constructor(table) {
1514
+ this.table = table;
1515
+ this.filterTypes = [
1516
+ {
1517
+ label: 'After',
1518
+ expression: 'dat;aft'
1519
+ },
1520
+ {
1521
+ label: 'Before',
1522
+ expression: 'dat;bef'
1523
+ }
1524
+ ];
1525
+ this.filterType = this.filterTypes[0];
1526
+ this.table.onPresetChange.subscribe(x => {
1527
+ if (!x) {
1528
+ this.filterType = this.filterTypes[0];
1529
+ this.value = [TuiDay.currentLocal(), TuiTime.currentLocal()];
1530
+ this.filterApplied.set(false);
1531
+ return;
1532
+ }
1533
+ var filter = x.filters.find(x => x.column == this.column);
1534
+ if (!filter) {
1535
+ this.filterType = this.filterTypes[0];
1536
+ this.value = [TuiDay.currentLocal(), TuiTime.currentLocal()];
1537
+ this.filterApplied.set(false);
1538
+ return;
1539
+ }
1540
+ var type = this.filterTypes.find(x => x.expression == filter.expression);
1541
+ if (!type) {
1542
+ this.filterType = this.filterTypes[0];
1543
+ this.value = [TuiDay.currentLocal(), TuiTime.currentLocal()];
1544
+ this.filterApplied.set(false);
1545
+ return;
1546
+ }
1547
+ this.filterType = type;
1548
+ this.value = filter.value;
1549
+ this.filterApplied.set(true);
1550
+ });
1551
+ }
1552
+ applyFilter(expression) {
1553
+ this.table.setFilter({
1554
+ column: this.column,
1555
+ value: this.value,
1556
+ expression: expression,
1557
+ });
1558
+ this.filterVisible.set(false);
1559
+ this.filterApplied.set(true);
1560
+ }
1561
+ clearFilter() {
1562
+ this.table.clearFilter(this.column);
1563
+ this.filterVisible.set(false);
1564
+ this.filterApplied.set(false);
1565
+ }
1566
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: EzUITableDateFilter, deps: [{ token: EzUITable }], target: i0.ɵɵFactoryTarget.Component });
1567
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.7", type: EzUITableDateFilter, isStandalone: true, selector: "ezui-table-datefilter", inputs: { column: "column" }, ngImport: i0, template: `
1568
+ @if(column){
1569
+ <tui-badged-content>
1570
+ @if(filterApplied()){
1571
+ <tui-badge-notification
1572
+ size="s"
1573
+ tuiSlot="top"
1574
+ >
1575
+ 1
1576
+ </tui-badge-notification>
1577
+ }
1578
+ <button
1579
+ tuiButton size="s"
1580
+ iconStart="funnel"
1581
+ appearance="flat-grayscale"
1582
+ style="opacity:0.72"
1583
+ [tuiDropdown]="filterPop"
1584
+ [(tuiDropdownOpen)]="filterVisible"
1585
+ (click)="filterVisible.set(true)"
1586
+ ></button>
1587
+ </tui-badged-content>
1588
+
1589
+ <ng-template #filterPop>
1590
+ <div class="filterPopContainer">
1591
+ <button
1592
+ appearance="outline-grayscale"
1593
+ size="s"
1594
+ tuiButton
1595
+ tuiButtonSelect
1596
+ [(ngModel)]="filterType"
1597
+ >
1598
+ {{ filterType.label }}
1599
+ <tui-data-list-wrapper
1600
+ *tuiDropdown
1601
+ [itemContent]="stringify | tuiStringifyContent"
1602
+ [items]="filterTypes"
1603
+ />
1604
+ </button>
1605
+
1606
+ <tui-textfield (keydown.enter)="applyFilter(filterType.expression)">
1607
+ <label tuiLabel>Choose a date</label>
1608
+ <input
1609
+ tuiInputDateTime
1610
+ [(ngModel)]="value"
1611
+ />
1612
+ <tui-calendar *tuiDropdown />
1613
+ </tui-textfield>
1614
+ <button
1615
+ tuiButton size="s"
1616
+ iconStart="funnel"
1617
+ tuiButton
1618
+ (click)="applyFilter(filterType.expression)"
1619
+ >
1620
+ Apply
1621
+ </button>
1622
+
1623
+ @if(filterApplied()){
1624
+ <button
1625
+ tuiButton size="s"
1626
+ iconStart="circle-x"
1627
+ tuiButton
1628
+ (click)="clearFilter()"
1629
+ >
1630
+ Clear
1631
+ </button>
1632
+ }
1633
+ </div>
1634
+ </ng-template>
1635
+ }
1636
+ `, isInline: true, styles: [".filterPopContainer{display:flex;flex-direction:column;gap:10px;padding:10px;min-width:20rem}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox]):not([ngNoCva])[formControlName],textarea:not([ngNoCva])[formControlName],input:not([type=checkbox]):not([ngNoCva])[formControl],textarea:not([ngNoCva])[formControl],input:not([type=checkbox]):not([ngNoCva])[ngModel],textarea:not([ngNoCva])[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i3$1.TuiDropdownDirective, selector: "[tuiDropdown]:not(ng-container):not(ng-template)", inputs: ["tuiDropdown"], exportAs: ["tuiDropdown"] }, { kind: "directive", type: i3$1.TuiDropdownOpen, selector: "[tuiDropdown][tuiDropdownAuto],[tuiDropdown][tuiDropdownOpen],[tuiDropdown][tuiDropdownOpenChange]", inputs: ["tuiDropdownEnabled", "tuiDropdownOpen"], outputs: ["tuiDropdownOpenChange"] }, { kind: "directive", type: i3$1.TuiDropdownContent, selector: "ng-template[tuiDropdown]" }, { kind: "component", type: i4$1.TuiDataListWrapperComponent, selector: "tui-data-list-wrapper:not([labels])", inputs: ["items", "emptyContent", "size", "itemContent"], outputs: ["itemClick"] }, { kind: "directive", type: TuiButton, selector: "a[tuiButton],button[tuiButton],a[tuiIconButton],button[tuiIconButton]", inputs: ["size"] }, { kind: "directive", type: TuiButtonSelect, selector: "button[tuiButtonSelect]" }, { kind: "component", type: TuiBadgeNotification, selector: "tui-badge-notification", inputs: ["size"] }, { kind: "directive", type: i4$1.TuiBadgedContentDirective, selector: "[tuiSlot]", inputs: ["tuiSlot"] }, { kind: "component", type: i4$1.TuiBadgedContentComponent, selector: "tui-badged-content" }, { kind: "directive", type: i2.TuiLabel, selector: "label[tuiLabel]" }, { kind: "component", type: i3.TuiTextfieldComponent, selector: "tui-textfield:not([multi])", inputs: ["content", "filler"] }, { kind: "directive", type: i4$1.TuiInputDateTimeDirective, selector: "input[tuiInputDateTime]", inputs: ["timeMode", "min", "max"] }, { kind: "component", type: i6.TuiCalendar, selector: "tui-calendar:not([new])", inputs: ["minViewedMonth", "maxViewedMonth", "showAdjacent", "markerHandler", "initialView", "hoveredItem"], outputs: ["hoveredItemChange", "dayClick"] }, { kind: "pipe", type: TuiStringifyContentPipe, name: "tuiStringifyContent" }] });
1637
+ }
1638
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: EzUITableDateFilter, decorators: [{
1639
+ type: Component,
1640
+ args: [{ selector: 'ezui-table-datefilter', imports: [CommonModule, FormsModule, TuiDropdown, TuiDataListWrapper, TuiButton, TuiButtonSelect, TuiStringifyContentPipe, TuiBadgeNotification, TuiBadgedContent, TuiInput, TuiInputDateTime], template: `
1641
+ @if(column){
1642
+ <tui-badged-content>
1643
+ @if(filterApplied()){
1644
+ <tui-badge-notification
1645
+ size="s"
1646
+ tuiSlot="top"
1647
+ >
1648
+ 1
1649
+ </tui-badge-notification>
1650
+ }
1651
+ <button
1652
+ tuiButton size="s"
1653
+ iconStart="funnel"
1654
+ appearance="flat-grayscale"
1655
+ style="opacity:0.72"
1656
+ [tuiDropdown]="filterPop"
1657
+ [(tuiDropdownOpen)]="filterVisible"
1658
+ (click)="filterVisible.set(true)"
1659
+ ></button>
1660
+ </tui-badged-content>
1661
+
1662
+ <ng-template #filterPop>
1663
+ <div class="filterPopContainer">
1664
+ <button
1665
+ appearance="outline-grayscale"
1666
+ size="s"
1667
+ tuiButton
1668
+ tuiButtonSelect
1669
+ [(ngModel)]="filterType"
1670
+ >
1671
+ {{ filterType.label }}
1672
+ <tui-data-list-wrapper
1673
+ *tuiDropdown
1674
+ [itemContent]="stringify | tuiStringifyContent"
1675
+ [items]="filterTypes"
1676
+ />
1677
+ </button>
1678
+
1679
+ <tui-textfield (keydown.enter)="applyFilter(filterType.expression)">
1680
+ <label tuiLabel>Choose a date</label>
1681
+ <input
1682
+ tuiInputDateTime
1683
+ [(ngModel)]="value"
1684
+ />
1685
+ <tui-calendar *tuiDropdown />
1686
+ </tui-textfield>
1687
+ <button
1688
+ tuiButton size="s"
1689
+ iconStart="funnel"
1690
+ tuiButton
1691
+ (click)="applyFilter(filterType.expression)"
1692
+ >
1693
+ Apply
1694
+ </button>
1695
+
1696
+ @if(filterApplied()){
1697
+ <button
1698
+ tuiButton size="s"
1699
+ iconStart="circle-x"
1700
+ tuiButton
1701
+ (click)="clearFilter()"
1702
+ >
1703
+ Clear
1704
+ </button>
1705
+ }
1706
+ </div>
1707
+ </ng-template>
1708
+ }
1709
+ `, styles: [".filterPopContainer{display:flex;flex-direction:column;gap:10px;padding:10px;min-width:20rem}\n"] }]
1710
+ }], ctorParameters: () => [{ type: EzUITable }], propDecorators: { column: [{
1711
+ type: Input
1712
+ }] } });
1713
+
1714
+ class EzUITableSelectFilter {
1715
+ column;
1716
+ filterApplied = signal(false, /* @ts-ignore */
1717
+ ...(ngDevMode ? [{ debugName: "filterApplied" }] : /* istanbul ignore next */ []));
1718
+ filterVisible = signal(false, /* @ts-ignore */
1719
+ ...(ngDevMode ? [{ debugName: "filterVisible" }] : /* istanbul ignore next */ []));
1720
+ table;
1721
+ options = [];
1722
+ selected = [];
1723
+ filterType;
1724
+ filterTypes;
1725
+ stringify = (item) => `${item.label}`;
1726
+ constructor(table) {
1727
+ this.table = table;
1728
+ this.filterTypes = [
1729
+ {
1730
+ label: 'Contains',
1731
+ expression: 'sel;con'
1732
+ },
1733
+ {
1734
+ label: 'Not Contains',
1735
+ expression: 'sel;ncon'
1736
+ }
1737
+ ];
1738
+ this.filterType = this.filterTypes[0];
1739
+ this.table.onPresetChange.subscribe(x => {
1740
+ if (!x) {
1741
+ this.filterType = this.filterTypes[0];
1742
+ this.selected = [];
1743
+ this.filterApplied.set(false);
1744
+ return;
1745
+ }
1746
+ var filter = x.filters.find(x => x.column == this.column);
1747
+ if (!filter) {
1748
+ this.filterType = this.filterTypes[0];
1749
+ this.selected = [];
1750
+ this.filterApplied.set(false);
1751
+ return;
1752
+ }
1753
+ var type = this.filterTypes.find(x => x.expression == filter.expression);
1754
+ if (!type) {
1755
+ this.filterType = this.filterTypes[0];
1756
+ this.selected = [];
1757
+ this.filterApplied.set(false);
1758
+ return;
1759
+ }
1760
+ this.filterType = type;
1761
+ this.selected = filter.value;
1762
+ this.filterApplied.set(true);
1763
+ });
1764
+ }
1765
+ applyFilter(expression) {
1766
+ this.table.setFilter({
1767
+ column: this.column,
1768
+ value: this.selected,
1769
+ expression: expression,
1770
+ });
1771
+ this.filterVisible.set(false);
1772
+ this.filterApplied.set(true);
1773
+ }
1774
+ clearFilter() {
1775
+ this.table.clearFilter(this.column);
1776
+ this.filterVisible.set(false);
1777
+ this.filterApplied.set(false);
1778
+ }
1779
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: EzUITableSelectFilter, deps: [{ token: EzUITable }], target: i0.ɵɵFactoryTarget.Component });
1780
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.7", type: EzUITableSelectFilter, isStandalone: true, selector: "ezui-table-selectfilter", inputs: { column: "column", options: "options" }, ngImport: i0, template: `
1781
+ @if(column){
1782
+ <tui-badged-content>
1783
+ @if(filterApplied()){
1784
+ <tui-badge-notification
1785
+ size="s"
1786
+ tuiSlot="top"
1787
+ >
1788
+ 1
1789
+ </tui-badge-notification>
1790
+ }
1791
+ <button
1792
+ tuiButton size="s"
1793
+ iconStart="funnel"
1794
+ appearance="flat-grayscale"
1795
+ style="opacity:0.72"
1796
+ [tuiDropdown]="filterPop"
1797
+ [(tuiDropdownOpen)]="filterVisible"
1798
+ (click)="filterVisible.set(true)"
1799
+ ></button>
1800
+ </tui-badged-content>
1801
+
1802
+ <ng-template #filterPop>
1803
+ <div class="filterPopContainer">
1804
+ <button
1805
+ appearance="outline-grayscale"
1806
+ size="s"
1807
+ tuiButton
1808
+ tuiButtonSelect
1809
+ [(ngModel)]="filterType"
1810
+ >
1811
+ {{ filterType.label }}
1812
+ <tui-data-list-wrapper
1813
+ *tuiDropdown
1814
+ [itemContent]="stringify | tuiStringifyContent"
1815
+ [items]="filterTypes"
1816
+ />
1817
+ </button>
1818
+
1819
+ <button
1820
+ appearance="secondary-grayscale"
1821
+ size="s"
1822
+ tuiButton
1823
+ tuiButtonSelect
1824
+ [(ngModel)]="selected"
1825
+ >
1826
+ {{selected.length === 1 ? selected[0] : 'Selected ' + selected.length}}
1827
+
1828
+ <tui-data-list *tuiDropdown>
1829
+ <tui-opt-group
1830
+ label="Options"
1831
+ tuiMultiSelectGroup
1832
+ >
1833
+ @for (option of options; track option) {
1834
+ <button
1835
+ tuiOption
1836
+ type="button"
1837
+ [value]="option"
1838
+ >
1839
+ {{ option }}
1840
+ </button>
1841
+ }
1842
+ </tui-opt-group>
1843
+ </tui-data-list>
1844
+ </button>
1845
+
1846
+ <button
1847
+ tuiButton size="s"
1848
+ iconStart="funnel"
1849
+ tuiButton
1850
+ (click)="applyFilter(filterType.expression)"
1851
+ >
1852
+ Apply
1853
+ </button>
1854
+
1855
+ @if(filterApplied()){
1856
+ <button
1857
+ tuiButton size="s"
1858
+ iconStart="circle-x"
1859
+ tuiButton
1860
+ (click)="clearFilter()"
1861
+ >
1862
+ Clear
1863
+ </button>
1864
+ }
1865
+ </div>
1866
+ </ng-template>
1867
+ }
1868
+ `, isInline: true, styles: [".filterPopContainer{display:flex;flex-direction:column;gap:10px;padding:10px;min-width:20rem}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i3$1.TuiDropdownDirective, selector: "[tuiDropdown]:not(ng-container):not(ng-template)", inputs: ["tuiDropdown"], exportAs: ["tuiDropdown"] }, { kind: "directive", type: i3$1.TuiDropdownOpen, selector: "[tuiDropdown][tuiDropdownAuto],[tuiDropdown][tuiDropdownOpen],[tuiDropdown][tuiDropdownOpenChange]", inputs: ["tuiDropdownEnabled", "tuiDropdownOpen"], outputs: ["tuiDropdownOpenChange"] }, { kind: "directive", type: i3$1.TuiDropdownContent, selector: "ng-template[tuiDropdown]" }, { kind: "component", type: i4$1.TuiDataListWrapperComponent, selector: "tui-data-list-wrapper:not([labels])", inputs: ["items", "emptyContent", "size", "itemContent"], outputs: ["itemClick"] }, { kind: "directive", type: TuiButton, selector: "a[tuiButton],button[tuiButton],a[tuiIconButton],button[tuiIconButton]", inputs: ["size"] }, { kind: "directive", type: TuiButtonSelect, selector: "button[tuiButtonSelect]" }, { kind: "component", type: TuiBadgeNotification, selector: "tui-badge-notification", inputs: ["size"] }, { kind: "directive", type: i4$1.TuiBadgedContentDirective, selector: "[tuiSlot]", inputs: ["tuiSlot"] }, { kind: "component", type: i4$1.TuiBadgedContentComponent, selector: "tui-badged-content" }, { kind: "component", type: i4$1.TuiMultiSelectGroupComponent, selector: "tui-opt-group[tuiMultiSelectGroup]", inputs: ["label"] }, { kind: "directive", type: i4$1.TuiMultiSelectGroupDirective, selector: "[tuiMultiSelectGroup]" }, { kind: "component", type: i3$1.TuiDataListComponent, selector: "tui-data-list", inputs: ["emptyContent", "size"] }, { kind: "directive", type: i3$1.TuiOption, selector: "button[tuiOption], a[tuiOption], label[tuiOption]", inputs: ["disabled"] }, { kind: "directive", type: i3$1.TuiOptionWithValue, selector: "button[tuiOption][value], a[tuiOption][value], label[tuiOption][value]", inputs: ["disabled", "value"] }, { kind: "directive", type: i3$1.TuiOptGroup, selector: "tui-opt-group", inputs: ["label"] }, { kind: "pipe", type: TuiStringifyContentPipe, name: "tuiStringifyContent" }] });
1869
+ }
1870
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: EzUITableSelectFilter, decorators: [{
1871
+ type: Component,
1872
+ args: [{ selector: 'ezui-table-selectfilter', imports: [CommonModule, FormsModule, TuiDropdown, TuiDataListWrapper, TuiButton, TuiButtonSelect, TuiStringifyContentPipe, TuiBadgeNotification, TuiBadgedContent, TuiInput, TuiMultiSelect, TuiDataList], template: `
1873
+ @if(column){
1874
+ <tui-badged-content>
1875
+ @if(filterApplied()){
1876
+ <tui-badge-notification
1877
+ size="s"
1878
+ tuiSlot="top"
1879
+ >
1880
+ 1
1881
+ </tui-badge-notification>
1882
+ }
1883
+ <button
1884
+ tuiButton size="s"
1885
+ iconStart="funnel"
1886
+ appearance="flat-grayscale"
1887
+ style="opacity:0.72"
1888
+ [tuiDropdown]="filterPop"
1889
+ [(tuiDropdownOpen)]="filterVisible"
1890
+ (click)="filterVisible.set(true)"
1891
+ ></button>
1892
+ </tui-badged-content>
1893
+
1894
+ <ng-template #filterPop>
1895
+ <div class="filterPopContainer">
1896
+ <button
1897
+ appearance="outline-grayscale"
1898
+ size="s"
1899
+ tuiButton
1900
+ tuiButtonSelect
1901
+ [(ngModel)]="filterType"
1902
+ >
1903
+ {{ filterType.label }}
1904
+ <tui-data-list-wrapper
1905
+ *tuiDropdown
1906
+ [itemContent]="stringify | tuiStringifyContent"
1907
+ [items]="filterTypes"
1908
+ />
1909
+ </button>
1910
+
1911
+ <button
1912
+ appearance="secondary-grayscale"
1913
+ size="s"
1914
+ tuiButton
1915
+ tuiButtonSelect
1916
+ [(ngModel)]="selected"
1917
+ >
1918
+ {{selected.length === 1 ? selected[0] : 'Selected ' + selected.length}}
1919
+
1920
+ <tui-data-list *tuiDropdown>
1921
+ <tui-opt-group
1922
+ label="Options"
1923
+ tuiMultiSelectGroup
1924
+ >
1925
+ @for (option of options; track option) {
1926
+ <button
1927
+ tuiOption
1928
+ type="button"
1929
+ [value]="option"
1930
+ >
1931
+ {{ option }}
1932
+ </button>
1933
+ }
1934
+ </tui-opt-group>
1935
+ </tui-data-list>
1936
+ </button>
1937
+
1938
+ <button
1939
+ tuiButton size="s"
1940
+ iconStart="funnel"
1941
+ tuiButton
1942
+ (click)="applyFilter(filterType.expression)"
1943
+ >
1944
+ Apply
1945
+ </button>
1946
+
1947
+ @if(filterApplied()){
1948
+ <button
1949
+ tuiButton size="s"
1950
+ iconStart="circle-x"
1951
+ tuiButton
1952
+ (click)="clearFilter()"
1953
+ >
1954
+ Clear
1955
+ </button>
1956
+ }
1957
+ </div>
1958
+ </ng-template>
1959
+ }
1960
+ `, styles: [".filterPopContainer{display:flex;flex-direction:column;gap:10px;padding:10px;min-width:20rem}\n"] }]
1961
+ }], ctorParameters: () => [{ type: EzUITable }], propDecorators: { column: [{
1962
+ type: Input
1963
+ }], options: [{
1964
+ type: Input
1965
+ }] } });
1966
+
1967
+ class EzUITableTextFilter {
1968
+ column;
1969
+ filterApplied = signal(false, /* @ts-ignore */
1970
+ ...(ngDevMode ? [{ debugName: "filterApplied" }] : /* istanbul ignore next */ []));
1971
+ filterVisible = signal(false, /* @ts-ignore */
1972
+ ...(ngDevMode ? [{ debugName: "filterVisible" }] : /* istanbul ignore next */ []));
1973
+ table;
1974
+ value = '';
1975
+ filterType;
1976
+ filterTypes;
1977
+ stringify = (item) => `${item.label}`;
1978
+ constructor(table) {
1979
+ this.table = table;
1980
+ this.filterTypes = [
1981
+ {
1982
+ label: 'Contains',
1983
+ expression: 'str;con'
1984
+ },
1985
+ {
1986
+ label: 'Not Contains',
1987
+ expression: 'str;ncon'
1988
+ },
1989
+ {
1990
+ label: 'Starts With',
1991
+ expression: 'str;sta'
1992
+ },
1993
+ {
1994
+ label: 'Ends With',
1995
+ expression: 'str;end'
1996
+ }
1997
+ ];
1998
+ this.filterType = this.filterTypes[0];
1999
+ this.table.onPresetChange.subscribe(x => {
2000
+ if (!x) {
2001
+ this.filterType = this.filterTypes[0];
2002
+ this.value = "";
2003
+ this.filterApplied.set(false);
2004
+ return;
2005
+ }
2006
+ var filter = x.filters.find(x => x.column == this.column);
2007
+ if (!filter) {
2008
+ this.filterType = this.filterTypes[0];
2009
+ this.value = "";
2010
+ this.filterApplied.set(false);
2011
+ return;
2012
+ }
2013
+ var type = this.filterTypes.find(x => x.expression == filter.expression);
2014
+ if (!type) {
2015
+ this.filterType = this.filterTypes[0];
2016
+ this.value = "";
2017
+ this.filterApplied.set(false);
2018
+ return;
2019
+ }
2020
+ this.filterType = type;
2021
+ this.value = filter.value;
2022
+ this.filterApplied.set(true);
2023
+ });
2024
+ }
2025
+ applyFilter(expression) {
2026
+ this.table.setFilter({
2027
+ column: this.column,
2028
+ value: this.value,
2029
+ expression: expression,
2030
+ });
2031
+ this.filterVisible.set(false);
2032
+ this.filterApplied.set(true);
2033
+ }
2034
+ clearFilter() {
2035
+ this.table.clearFilter(this.column);
2036
+ this.filterVisible.set(false);
2037
+ this.filterApplied.set(false);
2038
+ }
2039
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: EzUITableTextFilter, deps: [{ token: EzUITable }], target: i0.ɵɵFactoryTarget.Component });
2040
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.7", type: EzUITableTextFilter, isStandalone: true, selector: "ezui-table-textfilter", inputs: { column: "column" }, ngImport: i0, template: `
2041
+ @if(column){
2042
+ <tui-badged-content>
2043
+ @if(filterApplied()){
2044
+ <tui-badge-notification
2045
+ size="s"
2046
+ tuiSlot="top"
2047
+ >
2048
+ 1
2049
+ </tui-badge-notification>
2050
+ }
2051
+ <button
2052
+ tuiButton size="s"
2053
+ iconStart="funnel"
2054
+ appearance="flat-grayscale"
2055
+ style="opacity:0.72"
2056
+ [tuiDropdown]="filterPop"
2057
+ [(tuiDropdownOpen)]="filterVisible"
2058
+ (click)="filterVisible.set(true)"
2059
+ ></button>
2060
+ </tui-badged-content>
2061
+
2062
+ <ng-template #filterPop>
2063
+ <div class="filterPopContainer">
2064
+ <button
2065
+ appearance="outline-grayscale"
2066
+ size="s"
2067
+ tuiButton
2068
+ tuiButtonSelect
2069
+ [(ngModel)]="filterType"
2070
+ >
2071
+ {{ filterType.label }}
2072
+ <tui-data-list-wrapper
2073
+ *tuiDropdown
2074
+ [itemContent]="stringify | tuiStringifyContent"
2075
+ [items]="filterTypes"
2076
+ />
2077
+ </button>
2078
+
2079
+ <tui-textfield tuiTextfieldSize="s" (keydown.enter)="applyFilter(filterType.expression)">
2080
+ <input tuiInput [(ngModel)]="value"/>
2081
+ </tui-textfield>
2082
+ <button
2083
+ tuiButton size="s"
2084
+ iconStart="funnel"
2085
+ tuiButton
2086
+ (click)="applyFilter(filterType.expression)"
2087
+ >
2088
+ Apply
2089
+ </button>
2090
+
2091
+ @if(filterApplied()){
2092
+ <button
2093
+ tuiButton size="s"
2094
+ iconStart="circle-x"
2095
+ tuiButton
2096
+ (click)="clearFilter()"
2097
+ >
2098
+ Clear
2099
+ </button>
2100
+ }
2101
+ </div>
2102
+ </ng-template>
2103
+ }
2104
+ `, isInline: true, styles: [".filterPopContainer{display:flex;flex-direction:column;gap:10px;padding:10px;min-width:20rem}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox]):not([ngNoCva])[formControlName],textarea:not([ngNoCva])[formControlName],input:not([type=checkbox]):not([ngNoCva])[formControl],textarea:not([ngNoCva])[formControl],input:not([type=checkbox]):not([ngNoCva])[ngModel],textarea:not([ngNoCva])[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i3$1.TuiDropdownDirective, selector: "[tuiDropdown]:not(ng-container):not(ng-template)", inputs: ["tuiDropdown"], exportAs: ["tuiDropdown"] }, { kind: "directive", type: i3$1.TuiDropdownOpen, selector: "[tuiDropdown][tuiDropdownAuto],[tuiDropdown][tuiDropdownOpen],[tuiDropdown][tuiDropdownOpenChange]", inputs: ["tuiDropdownEnabled", "tuiDropdownOpen"], outputs: ["tuiDropdownOpenChange"] }, { kind: "directive", type: i3$1.TuiDropdownContent, selector: "ng-template[tuiDropdown]" }, { kind: "component", type: i4$1.TuiDataListWrapperComponent, selector: "tui-data-list-wrapper:not([labels])", inputs: ["items", "emptyContent", "size", "itemContent"], outputs: ["itemClick"] }, { kind: "directive", type: TuiButton, selector: "a[tuiButton],button[tuiButton],a[tuiIconButton],button[tuiIconButton]", inputs: ["size"] }, { kind: "directive", type: TuiButtonSelect, selector: "button[tuiButtonSelect]" }, { kind: "component", type: TuiBadgeNotification, selector: "tui-badge-notification", inputs: ["size"] }, { kind: "directive", type: i4$1.TuiBadgedContentDirective, selector: "[tuiSlot]", inputs: ["tuiSlot"] }, { kind: "component", type: i4$1.TuiBadgedContentComponent, selector: "tui-badged-content" }, { kind: "component", type: i3.TuiTextfieldComponent, selector: "tui-textfield:not([multi])", inputs: ["content", "filler"] }, { kind: "directive", type: i3.TuiTextfieldOptionsDirective, selector: "[tuiTextfieldAppearance],[tuiTextfieldSize],[tuiTextfieldCleaner]", inputs: ["tuiTextfieldAppearance", "tuiTextfieldSize", "tuiTextfieldCleaner"] }, { kind: "directive", type: i3$1.TuiInputDirective, selector: "input[tuiInput]", inputs: ["readOnly", "invalid", "focused", "state"] }, { kind: "pipe", type: TuiStringifyContentPipe, name: "tuiStringifyContent" }] });
2105
+ }
2106
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: EzUITableTextFilter, decorators: [{
2107
+ type: Component,
2108
+ args: [{ selector: 'ezui-table-textfilter', imports: [CommonModule, FormsModule, TuiDropdown, TuiDataListWrapper, TuiButton, TuiButtonSelect, TuiStringifyContentPipe, TuiBadgeNotification, TuiBadgedContent, TuiInput], template: `
2109
+ @if(column){
2110
+ <tui-badged-content>
2111
+ @if(filterApplied()){
2112
+ <tui-badge-notification
2113
+ size="s"
2114
+ tuiSlot="top"
2115
+ >
2116
+ 1
2117
+ </tui-badge-notification>
2118
+ }
2119
+ <button
2120
+ tuiButton size="s"
2121
+ iconStart="funnel"
2122
+ appearance="flat-grayscale"
2123
+ style="opacity:0.72"
2124
+ [tuiDropdown]="filterPop"
2125
+ [(tuiDropdownOpen)]="filterVisible"
2126
+ (click)="filterVisible.set(true)"
2127
+ ></button>
2128
+ </tui-badged-content>
2129
+
2130
+ <ng-template #filterPop>
2131
+ <div class="filterPopContainer">
2132
+ <button
2133
+ appearance="outline-grayscale"
2134
+ size="s"
2135
+ tuiButton
2136
+ tuiButtonSelect
2137
+ [(ngModel)]="filterType"
2138
+ >
2139
+ {{ filterType.label }}
2140
+ <tui-data-list-wrapper
2141
+ *tuiDropdown
2142
+ [itemContent]="stringify | tuiStringifyContent"
2143
+ [items]="filterTypes"
2144
+ />
2145
+ </button>
2146
+
2147
+ <tui-textfield tuiTextfieldSize="s" (keydown.enter)="applyFilter(filterType.expression)">
2148
+ <input tuiInput [(ngModel)]="value"/>
2149
+ </tui-textfield>
2150
+ <button
2151
+ tuiButton size="s"
2152
+ iconStart="funnel"
2153
+ tuiButton
2154
+ (click)="applyFilter(filterType.expression)"
2155
+ >
2156
+ Apply
2157
+ </button>
2158
+
2159
+ @if(filterApplied()){
2160
+ <button
2161
+ tuiButton size="s"
2162
+ iconStart="circle-x"
2163
+ tuiButton
2164
+ (click)="clearFilter()"
2165
+ >
2166
+ Clear
2167
+ </button>
2168
+ }
2169
+ </div>
2170
+ </ng-template>
2171
+ }
2172
+ `, styles: [".filterPopContainer{display:flex;flex-direction:column;gap:10px;padding:10px;min-width:20rem}\n"] }]
2173
+ }], ctorParameters: () => [{ type: EzUITable }], propDecorators: { column: [{
2174
+ type: Input
2175
+ }] } });
2176
+
2177
+ class EzUITTableSortableColumn {
2178
+ column;
2179
+ table;
2180
+ state = 'none';
2181
+ icon = signal("text-align-justify", /* @ts-ignore */
2182
+ ...(ngDevMode ? [{ debugName: "icon" }] : /* istanbul ignore next */ []));
2183
+ constructor(table) {
2184
+ this.table = table;
2185
+ this.table.onPresetChange.subscribe(x => {
2186
+ if (!x) {
2187
+ this.state = 'none';
2188
+ this.icon.set('text-align-justify');
2189
+ return;
2190
+ }
2191
+ var sort = x.sorts.find(x => x.column == this.column);
2192
+ if (!sort) {
2193
+ this.state = 'none';
2194
+ this.icon.set('text-align-justify');
2195
+ return;
2196
+ }
2197
+ this.state = sort.state;
2198
+ switch (sort.state) {
2199
+ case 'none':
2200
+ this.icon.set('text-align-justify');
2201
+ break;
2202
+ case 'asc':
2203
+ this.icon.set('arrow-up-wide-narrow');
2204
+ break;
2205
+ case 'desc':
2206
+ this.icon.set('arrow-down-wide-narrow');
2207
+ break;
2208
+ }
2209
+ });
2210
+ }
2211
+ sort() {
2212
+ switch (this.state) {
2213
+ case 'none':
2214
+ this.state = 'asc';
2215
+ this.table.setSort({ column: this.column, state: this.state });
2216
+ this.icon.set('arrow-up-wide-narrow');
2217
+ break;
2218
+ case 'asc':
2219
+ this.state = 'desc';
2220
+ this.table.setSort({ column: this.column, state: this.state });
2221
+ this.icon.set('arrow-down-wide-narrow');
2222
+ break;
2223
+ case 'desc':
2224
+ this.state = 'none';
2225
+ this.table.clearSort(this.column);
2226
+ this.icon.set('text-align-justify');
2227
+ break;
2228
+ }
2229
+ }
2230
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: EzUITTableSortableColumn, deps: [{ token: EzUITable }], target: i0.ɵɵFactoryTarget.Component });
2231
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.7", type: EzUITTableSortableColumn, isStandalone: true, selector: "ezui-table-sortable", inputs: { column: "column" }, ngImport: i0, template: `
2232
+ @if(column){
2233
+ <button tuiButton style="opacity:0.72" [iconStart]="icon()" size="s" appearance="flat-grayscale" (click)="sort()"></button>
2234
+ }
2235
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: TuiButton, selector: "a[tuiButton],button[tuiButton],a[tuiIconButton],button[tuiIconButton]", inputs: ["size"] }] });
2236
+ }
2237
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: EzUITTableSortableColumn, decorators: [{
2238
+ type: Component,
2239
+ args: [{
2240
+ selector: 'ezui-table-sortable',
2241
+ imports: [CommonModule, TuiButton],
2242
+ template: `
2243
+ @if(column){
2244
+ <button tuiButton style="opacity:0.72" [iconStart]="icon()" size="s" appearance="flat-grayscale" (click)="sort()"></button>
2245
+ }
2246
+ `
2247
+ }]
2248
+ }], ctorParameters: () => [{ type: EzUITable }], propDecorators: { column: [{
2249
+ type: Input
2250
+ }] } });
2251
+
790
2252
  class EzUITextInput {
791
2253
  icon = '';
792
2254
  label = '';
@@ -807,7 +2269,7 @@ class EzUITextInput {
807
2269
  }
808
2270
  <input tuiInput [(ngModel)]="value" (ngModelChange)="valueChange.emit(value)" [disabled]="disabled"/>
809
2271
  </tui-textfield>
810
- `, isInline: true, styles: [""], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox]):not([ngNoCva])[formControlName],textarea:not([ngNoCva])[formControlName],input:not([type=checkbox]):not([ngNoCva])[formControl],textarea:not([ngNoCva])[formControl],input:not([type=checkbox]):not([ngNoCva])[ngModel],textarea:not([ngNoCva])[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.TuiLabel, selector: "label[tuiLabel]" }, { kind: "component", type: i3.TuiTextfieldComponent, selector: "tui-textfield:not([multi])", inputs: ["content", "filler"] }, { kind: "directive", type: i3.TuiTextfieldOptionsDirective, selector: "[tuiTextfieldAppearance],[tuiTextfieldSize],[tuiTextfieldCleaner]", inputs: ["tuiTextfieldAppearance", "tuiTextfieldSize", "tuiTextfieldCleaner"] }, { kind: "directive", type: i1$1.TuiInputDirective, selector: "input[tuiInput]", inputs: ["readOnly", "invalid", "focused", "state"] }] });
2272
+ `, isInline: true, styles: [""], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox]):not([ngNoCva])[formControlName],textarea:not([ngNoCva])[formControlName],input:not([type=checkbox]):not([ngNoCva])[formControl],textarea:not([ngNoCva])[formControl],input:not([type=checkbox]):not([ngNoCva])[ngModel],textarea:not([ngNoCva])[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.TuiLabel, selector: "label[tuiLabel]" }, { kind: "component", type: i3.TuiTextfieldComponent, selector: "tui-textfield:not([multi])", inputs: ["content", "filler"] }, { kind: "directive", type: i3.TuiTextfieldOptionsDirective, selector: "[tuiTextfieldAppearance],[tuiTextfieldSize],[tuiTextfieldCleaner]", inputs: ["tuiTextfieldAppearance", "tuiTextfieldSize", "tuiTextfieldCleaner"] }, { kind: "directive", type: i3$1.TuiInputDirective, selector: "input[tuiInput]", inputs: ["readOnly", "invalid", "focused", "state"] }] });
811
2273
  }
812
2274
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: EzUITextInput, decorators: [{
813
2275
  type: Component,
@@ -1005,12 +2467,12 @@ class BaseCRUDInterface {
1005
2467
  this.currentItem.set(this.newItemTemplate());
1006
2468
  this.showDialog.set(true);
1007
2469
  }
1008
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: BaseCRUDInterface, deps: [{ token: i1$2.HttpClient }, { token: i1$1.TuiNotificationService }, { token: i3$1.TuiResponsiveDialogService }], target: i0.ɵɵFactoryTarget.Directive });
2470
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: BaseCRUDInterface, deps: [{ token: i1$1.HttpClient }, { token: i3$1.TuiNotificationService }, { token: i3$3.TuiResponsiveDialogService }], target: i0.ɵɵFactoryTarget.Directive });
1009
2471
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.7", type: BaseCRUDInterface, isStandalone: true, ngImport: i0 });
1010
2472
  }
1011
2473
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: BaseCRUDInterface, decorators: [{
1012
2474
  type: Directive
1013
- }], ctorParameters: () => [{ type: i1$2.HttpClient }, { type: i1$1.TuiNotificationService }, { type: i3$1.TuiResponsiveDialogService }] });
2475
+ }], ctorParameters: () => [{ type: i1$1.HttpClient }, { type: i3$1.TuiNotificationService }, { type: i3$3.TuiResponsiveDialogService }] });
1014
2476
 
1015
2477
  class BaseListService {
1016
2478
  http;
@@ -1057,12 +2519,12 @@ class BaseListService {
1057
2519
  while (!test())
1058
2520
  await new Promise(resolve => setTimeout(resolve, delayMs));
1059
2521
  }
1060
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: BaseListService, deps: [{ token: i1$2.HttpClient }], target: i0.ɵɵFactoryTarget.Directive });
2522
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: BaseListService, deps: [{ token: i1$1.HttpClient }], target: i0.ɵɵFactoryTarget.Directive });
1061
2523
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.7", type: BaseListService, isStandalone: true, ngImport: i0 });
1062
2524
  }
1063
2525
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: BaseListService, decorators: [{
1064
2526
  type: Directive
1065
- }], ctorParameters: () => [{ type: i1$2.HttpClient }] });
2527
+ }], ctorParameters: () => [{ type: i1$1.HttpClient }] });
1066
2528
 
1067
2529
  // Components
1068
2530
 
@@ -1070,5 +2532,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImpor
1070
2532
  * Generated bundle index. Do not edit.
1071
2533
  */
1072
2534
 
1073
- export { BaseCRUDInterface, BaseListService, EzUIDateInput, EzUIMarkdownEditor, EzUIMultiSelect, EzUINumberInput, EzUIPasswordInput, EzUITextInput, compressImage };
2535
+ export { BaseCRUDInterface, BaseListService, EzUIDateInput, EzUIFileInput, EzUIFilterHelpers, EzUIMarkdownEditor, EzUIMultiSelect, EzUINumberInput, EzUIPasswordInput, EzUITTableSortableColumn, EzUITable, EzUITableDateFilter, EzUITableFilterService, EzUITableSelectFilter, EzUITableTextFilter, EzUITextInput, compressImage };
1074
2536
  //# sourceMappingURL=kris701-ez-ui.mjs.map