@ferhaps/easy-ui-lib 21.0.8 → 21.0.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -64,8 +64,9 @@ handleTableAction(event: TableEvent) {}
64
64
  ```
65
65
 
66
66
  ### SearchBarComponent
67
- A styled search input with debounce functionality.
68
- The search event emits either a string or Event. Event is emitted when the "X" button is pressed
67
+ A styled search input with debounce functionality. Implements `ControlValueAccessor`, so it can be used as a standard form control with reactive forms or template-driven forms.
68
+
69
+ **Standalone usage (output only)**
69
70
  ```html
70
71
  <lib-search-bar
71
72
  [for]="'users'"
@@ -73,6 +74,18 @@ The search event emits either a string or Event. Event is emitted when the "X" b
73
74
  </lib-search-bar>
74
75
  ```
75
76
 
77
+ **Reactive forms**
78
+ ```html
79
+ <lib-search-bar [for]="'users'" formControlName="search" />
80
+ ```
81
+
82
+ **Template-driven forms**
83
+ ```html
84
+ <lib-search-bar [for]="'users'" [(ngModel)]="searchTerm" />
85
+ ```
86
+
87
+ The `search` output still emits on every debounced change and can be used alongside form binding. The emitted value is the trimmed search string.
88
+
76
89
  ### DefaultDialogComponent
77
90
  A customizable dialog component with optional back button.
78
91
  ```html
@@ -1,7 +1,7 @@
1
1
  import * as i0 from '@angular/core';
2
- import { Pipe, input, Directive, output, ChangeDetectionStrategy, Component, viewChild, Injectable, inject } from '@angular/core';
2
+ import { Pipe, input, Directive, output, ChangeDetectionStrategy, Component, forwardRef, viewChild, Injectable, inject } from '@angular/core';
3
3
  import * as i2 from '@angular/forms';
4
- import { NG_VALIDATORS, FormGroup, FormControl, ReactiveFormsModule } from '@angular/forms';
4
+ import { NG_VALIDATORS, FormGroup, FormControl, ReactiveFormsModule, NG_VALUE_ACCESSOR } from '@angular/forms';
5
5
  import * as i1$1 from '@angular/material/icon';
6
6
  import { MatIconModule } from '@angular/material/icon';
7
7
  import * as i3 from '@angular/material/dialog';
@@ -109,8 +109,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImpor
109
109
  selector: '[libPhoneValidation]',
110
110
  host: {
111
111
  '(input)': 'onInput($event)',
112
- '(keydown)': 'onKeyDown($event)'
113
- }
112
+ '(keydown)': 'onKeyDown($event)',
113
+ },
114
114
  }]
115
115
  }] });
116
116
 
@@ -129,8 +129,8 @@ class PasswordValidatorDirective {
129
129
  {
130
130
  provide: NG_VALIDATORS,
131
131
  useExisting: PasswordValidatorDirective,
132
- multi: true
133
- }
132
+ multi: true,
133
+ },
134
134
  ], ngImport: i0 }); }
135
135
  }
136
136
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: PasswordValidatorDirective, decorators: [{
@@ -141,9 +141,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImpor
141
141
  {
142
142
  provide: NG_VALIDATORS,
143
143
  useExisting: PasswordValidatorDirective,
144
- multi: true
145
- }
146
- ]
144
+ multi: true,
145
+ },
146
+ ],
147
147
  }]
148
148
  }] });
149
149
 
@@ -156,15 +156,11 @@ class DefaultDialogComponent {
156
156
  this.back = output();
157
157
  }
158
158
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: DefaultDialogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
159
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.5", type: DefaultDialogComponent, isStandalone: true, selector: "lib-default-dialog", inputs: { temRef: { classPropertyName: "temRef", publicName: "temRef", isSignal: true, isRequired: false, transformFunction: null }, height: { classPropertyName: "height", publicName: "height", isSignal: true, isRequired: false, transformFunction: null }, dialogTitle: { classPropertyName: "dialogTitle", publicName: "dialogTitle", isSignal: true, isRequired: false, transformFunction: null }, withBack: { classPropertyName: "withBack", publicName: "withBack", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { back: "back" }, ngImport: i0, template: "<div class=\"modal\" [style]=\"{ 'height': height() }\">\r\n <div class=\"dialog-title\">\r\n @if (withBack()) {\r\n <div class=\"back-arrow\" (click)=\"back.emit()\">\r\n <mat-icon>keyboard_arrow_left</mat-icon>\r\n </div>\r\n }\r\n\r\n <h4 class=\"title\">{{ dialogTitle() }}</h4>\r\n\r\n <div class=\"closer\" mat-dialog-close>\r\n <mat-icon>close</mat-icon>\r\n </div>\r\n </div>\r\n\r\n <div class=\"dialog-content\">\r\n <ng-content select=\".dialog-content\" />\r\n <ng-template #tempBody />\r\n <ng-container *ngTemplateOutlet=\"temRef() ? temRef() : tempBody\" />\r\n </div>\r\n</div>", styles: [".modal{display:flex;flex-direction:column}.dialog-title{padding-inline:2rem;padding-top:1rem;margin-bottom:1rem;position:relative;display:flex;font-size:20px;justify-content:center}.dialog-title .back-arrow{cursor:pointer;position:absolute;left:1rem}.dialog-title .title{font-weight:700;font-size:24px;margin:0!important}.dialog-title .closer{right:3%;position:absolute;cursor:pointer}.dialog-content{flex:1;min-height:0;overflow:hidden;padding-bottom:1rem;display:flex;flex-direction:column;align-items:center}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i1$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatDialogModule }, { kind: "directive", type: i3.MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
159
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.5", type: DefaultDialogComponent, isStandalone: true, selector: "lib-default-dialog", inputs: { temRef: { classPropertyName: "temRef", publicName: "temRef", isSignal: true, isRequired: false, transformFunction: null }, height: { classPropertyName: "height", publicName: "height", isSignal: true, isRequired: false, transformFunction: null }, dialogTitle: { classPropertyName: "dialogTitle", publicName: "dialogTitle", isSignal: true, isRequired: false, transformFunction: null }, withBack: { classPropertyName: "withBack", publicName: "withBack", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { back: "back" }, ngImport: i0, template: "<div class=\"modal\" [style]=\"{ height: height() }\">\n\t<div class=\"dialog-title\">\n\t\t@if (withBack()) {\n\t\t\t<div class=\"back-arrow\" (click)=\"back.emit()\">\n\t\t\t\t<mat-icon>keyboard_arrow_left</mat-icon>\n\t\t\t</div>\n\t\t}\n\n\t\t<h4 class=\"title\">{{ dialogTitle() }}</h4>\n\n\t\t<div class=\"closer\" mat-dialog-close>\n\t\t\t<mat-icon>close</mat-icon>\n\t\t</div>\n\t</div>\n\n\t<div class=\"dialog-content\">\n\t\t<ng-content select=\".dialog-content\" />\n\t\t<ng-template #tempBody />\n\t\t<ng-container *ngTemplateOutlet=\"temRef() ? temRef() : tempBody\" />\n\t</div>\n</div>\n", styles: [".modal{display:flex;flex-direction:column}.dialog-title{padding-inline:2rem;padding-top:1rem;margin-bottom:1rem;position:relative;display:flex;font-size:20px;justify-content:center}.dialog-title .back-arrow{cursor:pointer;position:absolute;left:1rem}.dialog-title .title{font-weight:700;font-size:24px;margin:0!important}.dialog-title .closer{right:3%;position:absolute;cursor:pointer}.dialog-content{flex:1;min-height:0;overflow:hidden;padding-bottom:1rem;display:flex;flex-direction:column;align-items:center}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i1$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatDialogModule }, { kind: "directive", type: i3.MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
160
160
  }
161
161
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: DefaultDialogComponent, decorators: [{
162
162
  type: Component,
163
- args: [{ selector: 'lib-default-dialog', imports: [
164
- CommonModule,
165
- MatIconModule,
166
- MatDialogModule
167
- ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"modal\" [style]=\"{ 'height': height() }\">\r\n <div class=\"dialog-title\">\r\n @if (withBack()) {\r\n <div class=\"back-arrow\" (click)=\"back.emit()\">\r\n <mat-icon>keyboard_arrow_left</mat-icon>\r\n </div>\r\n }\r\n\r\n <h4 class=\"title\">{{ dialogTitle() }}</h4>\r\n\r\n <div class=\"closer\" mat-dialog-close>\r\n <mat-icon>close</mat-icon>\r\n </div>\r\n </div>\r\n\r\n <div class=\"dialog-content\">\r\n <ng-content select=\".dialog-content\" />\r\n <ng-template #tempBody />\r\n <ng-container *ngTemplateOutlet=\"temRef() ? temRef() : tempBody\" />\r\n </div>\r\n</div>", styles: [".modal{display:flex;flex-direction:column}.dialog-title{padding-inline:2rem;padding-top:1rem;margin-bottom:1rem;position:relative;display:flex;font-size:20px;justify-content:center}.dialog-title .back-arrow{cursor:pointer;position:absolute;left:1rem}.dialog-title .title{font-weight:700;font-size:24px;margin:0!important}.dialog-title .closer{right:3%;position:absolute;cursor:pointer}.dialog-content{flex:1;min-height:0;overflow:hidden;padding-bottom:1rem;display:flex;flex-direction:column;align-items:center}\n"] }]
163
+ args: [{ selector: 'lib-default-dialog', imports: [CommonModule, MatIconModule, MatDialogModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"modal\" [style]=\"{ height: height() }\">\n\t<div class=\"dialog-title\">\n\t\t@if (withBack()) {\n\t\t\t<div class=\"back-arrow\" (click)=\"back.emit()\">\n\t\t\t\t<mat-icon>keyboard_arrow_left</mat-icon>\n\t\t\t</div>\n\t\t}\n\n\t\t<h4 class=\"title\">{{ dialogTitle() }}</h4>\n\n\t\t<div class=\"closer\" mat-dialog-close>\n\t\t\t<mat-icon>close</mat-icon>\n\t\t</div>\n\t</div>\n\n\t<div class=\"dialog-content\">\n\t\t<ng-content select=\".dialog-content\" />\n\t\t<ng-template #tempBody />\n\t\t<ng-container *ngTemplateOutlet=\"temRef() ? temRef() : tempBody\" />\n\t</div>\n</div>\n", styles: [".modal{display:flex;flex-direction:column}.dialog-title{padding-inline:2rem;padding-top:1rem;margin-bottom:1rem;position:relative;display:flex;font-size:20px;justify-content:center}.dialog-title .back-arrow{cursor:pointer;position:absolute;left:1rem}.dialog-title .title{font-weight:700;font-size:24px;margin:0!important}.dialog-title .closer{right:3%;position:absolute;cursor:pointer}.dialog-content{flex:1;min-height:0;overflow:hidden;padding-bottom:1rem;display:flex;flex-direction:column;align-items:center}\n"] }]
168
164
  }], propDecorators: { temRef: [{ type: i0.Input, args: [{ isSignal: true, alias: "temRef", required: false }] }], height: [{ type: i0.Input, args: [{ isSignal: true, alias: "height", required: false }] }], dialogTitle: [{ type: i0.Input, args: [{ isSignal: true, alias: "dialogTitle", required: false }] }], withBack: [{ type: i0.Input, args: [{ isSignal: true, alias: "withBack", required: false }] }], back: [{ type: i0.Output, args: ["back"] }] } });
169
165
 
170
166
  class ErrorDisplayComponent {
@@ -177,7 +173,8 @@ class ErrorDisplayComponent {
177
173
  if (typeof this.error().error === 'string') {
178
174
  this.displayError = this.error().error;
179
175
  }
180
- else if (this.error && this.error()?.error?.message) {
176
+ else if (this.error &&
177
+ this.error()?.error?.message) {
181
178
  this.displayError = this.error().error.message;
182
179
  }
183
180
  else {
@@ -192,13 +189,15 @@ class ErrorDisplayComponent {
192
189
  }
193
190
  }
194
191
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: ErrorDisplayComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
195
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.5", type: ErrorDisplayComponent, isStandalone: true, selector: "lib-error-display", inputs: { error: { classPropertyName: "error", publicName: "error", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: `<strong class="err-container">{{ displayError | snakeCaseParser }}</strong>`, isInline: true, styles: [".err-container{display:block;max-width:300px;font-size:20px;text-align:center;border:1px solid red;border-radius:5px;padding:.5rem 1.5rem;background-color:#ffe6e6;color:red;overflow-wrap:break-word}\n"], dependencies: [{ kind: "pipe", type: SnakeCaseParserPipe, name: "snakeCaseParser" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
192
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.5", type: ErrorDisplayComponent, isStandalone: true, selector: "lib-error-display", inputs: { error: { classPropertyName: "error", publicName: "error", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: `<strong class="err-container">{{
193
+ displayError | snakeCaseParser
194
+ }}</strong>`, isInline: true, styles: [".err-container{display:block;max-width:300px;font-size:20px;text-align:center;border:1px solid red;border-radius:5px;padding:.5rem 1.5rem;background-color:#ffe6e6;color:red;overflow-wrap:break-word}\n"], dependencies: [{ kind: "pipe", type: SnakeCaseParserPipe, name: "snakeCaseParser" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
196
195
  }
197
196
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: ErrorDisplayComponent, decorators: [{
198
197
  type: Component,
199
- args: [{ selector: 'lib-error-display', imports: [
200
- SnakeCaseParserPipe
201
- ], template: `<strong class="err-container">{{ displayError | snakeCaseParser }}</strong>`, changeDetection: ChangeDetectionStrategy.OnPush, styles: [".err-container{display:block;max-width:300px;font-size:20px;text-align:center;border:1px solid red;border-radius:5px;padding:.5rem 1.5rem;background-color:#ffe6e6;color:red;overflow-wrap:break-word}\n"] }]
198
+ args: [{ selector: 'lib-error-display', imports: [SnakeCaseParserPipe], template: `<strong class="err-container">{{
199
+ displayError | snakeCaseParser
200
+ }}</strong>`, changeDetection: ChangeDetectionStrategy.OnPush, styles: [".err-container{display:block;max-width:300px;font-size:20px;text-align:center;border:1px solid red;border-radius:5px;padding:.5rem 1.5rem;background-color:#ffe6e6;color:red;overflow-wrap:break-word}\n"] }]
202
201
  }], propDecorators: { error: [{ type: i0.Input, args: [{ isSignal: true, alias: "error", required: true }] }] } });
203
202
 
204
203
  class SearchBarComponent {
@@ -206,37 +205,73 @@ class SearchBarComponent {
206
205
  this.for = input.required(...(ngDevMode ? [{ debugName: "for" }] : /* istanbul ignore next */ []));
207
206
  this.search = output();
208
207
  this.searchForm = new FormGroup({
209
- search: new FormControl('')
208
+ search: new FormControl(''),
210
209
  });
211
- this.searchForm.get('search')?.valueChanges.
212
- pipe(debounceTime(1000), distinctUntilChanged()).subscribe((searchTerm) => {
213
- if (typeof searchTerm === 'string') {
214
- searchTerm = searchTerm.trim();
215
- }
216
- this.search.emit(searchTerm);
210
+ this.onChange = () => { };
211
+ this.onTouched = () => { };
212
+ this.searchForm
213
+ .get('search')
214
+ ?.valueChanges.pipe(debounceTime(1000), distinctUntilChanged())
215
+ .subscribe((term) => {
216
+ const trimmed = term.trim();
217
+ this.onChange(trimmed); // notifies parent form control
218
+ this.search.emit(trimmed); // existing output still works
217
219
  });
218
220
  }
221
+ writeValue(value) {
222
+ this.searchForm.get('search')?.setValue(value ?? '', { emitEvent: false });
223
+ }
224
+ registerOnChange(fn) {
225
+ this.onChange = fn;
226
+ }
227
+ registerOnTouched(fn) {
228
+ this.onTouched = fn;
229
+ }
230
+ setDisabledState(isDisabled) {
231
+ isDisabled ? this.searchForm.disable() : this.searchForm.enable();
232
+ }
219
233
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: SearchBarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
220
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.5", type: SearchBarComponent, isStandalone: true, selector: "lib-search-bar", inputs: { for: { classPropertyName: "for", publicName: "for", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { search: "search" }, ngImport: i0, template: `
221
- <form class="search-bar" [formGroup]="searchForm">
222
- <mat-icon>search</mat-icon>
223
- <input class="search-input" type="search" name="field"
224
- [placeholder]="'Search ' + for()" autocomplete="off" formControlName="search" />
225
- </form>
226
- `, isInline: true, styles: [".search-bar{width:270px;border:1px solid #A4A4A4;display:flex;align-items:center}.search-input{border:none;padding:7px 11px;height:100%;width:100%;background-color:transparent}mat-icon{margin-inline:8px}.search-input:focus{border:none;outline:none}@media(max-width:1086px){.search-bar{width:170px}}\n"], dependencies: [{ kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i1$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
234
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.5", type: SearchBarComponent, isStandalone: true, selector: "lib-search-bar", inputs: { for: { classPropertyName: "for", publicName: "for", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { search: "search" }, providers: [
235
+ {
236
+ provide: NG_VALUE_ACCESSOR,
237
+ useExisting: forwardRef(() => SearchBarComponent),
238
+ multi: true,
239
+ },
240
+ ], ngImport: i0, template: `
241
+ <form class="search-bar" [formGroup]="searchForm">
242
+ <mat-icon>search</mat-icon>
243
+ <input
244
+ class="search-input"
245
+ type="search"
246
+ name="field"
247
+ [placeholder]="'Search ' + for()"
248
+ autocomplete="off"
249
+ formControlName="search"
250
+ />
251
+ </form>
252
+ `, isInline: true, styles: [".search-bar{width:270px;border:1px solid #a4a4a4;display:flex;align-items:center}.search-input{border:none;padding:7px 11px;height:100%;width:100%;background-color:transparent}mat-icon{margin-inline:8px}.search-input:focus{border:none;outline:none}@media(max-width:1086px){.search-bar{width:170px}}\n"], dependencies: [{ kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i1$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
227
253
  }
228
254
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: SearchBarComponent, decorators: [{
229
255
  type: Component,
230
- args: [{ selector: 'lib-search-bar', template: `
231
- <form class="search-bar" [formGroup]="searchForm">
232
- <mat-icon>search</mat-icon>
233
- <input class="search-input" type="search" name="field"
234
- [placeholder]="'Search ' + for()" autocomplete="off" formControlName="search" />
235
- </form>
236
- `, imports: [
237
- MatIconModule,
238
- ReactiveFormsModule
239
- ], changeDetection: ChangeDetectionStrategy.OnPush, styles: [".search-bar{width:270px;border:1px solid #A4A4A4;display:flex;align-items:center}.search-input{border:none;padding:7px 11px;height:100%;width:100%;background-color:transparent}mat-icon{margin-inline:8px}.search-input:focus{border:none;outline:none}@media(max-width:1086px){.search-bar{width:170px}}\n"] }]
256
+ args: [{ selector: 'lib-search-bar', template: `
257
+ <form class="search-bar" [formGroup]="searchForm">
258
+ <mat-icon>search</mat-icon>
259
+ <input
260
+ class="search-input"
261
+ type="search"
262
+ name="field"
263
+ [placeholder]="'Search ' + for()"
264
+ autocomplete="off"
265
+ formControlName="search"
266
+ />
267
+ </form>
268
+ `, imports: [MatIconModule, ReactiveFormsModule], providers: [
269
+ {
270
+ provide: NG_VALUE_ACCESSOR,
271
+ useExisting: forwardRef(() => SearchBarComponent),
272
+ multi: true,
273
+ },
274
+ ], changeDetection: ChangeDetectionStrategy.OnPush, styles: [".search-bar{width:270px;border:1px solid #a4a4a4;display:flex;align-items:center}.search-input{border:none;padding:7px 11px;height:100%;width:100%;background-color:transparent}mat-icon{margin-inline:8px}.search-input:focus{border:none;outline:none}@media(max-width:1086px){.search-bar{width:170px}}\n"] }]
240
275
  }], ctorParameters: () => [], propDecorators: { for: [{ type: i0.Input, args: [{ isSignal: true, alias: "for", required: true }] }], search: [{ type: i0.Output, args: ["search"] }] } });
241
276
 
242
277
  class TableSortHeaderComponent {
@@ -258,13 +293,11 @@ class TableSortHeaderComponent {
258
293
  this.sort.emit(this.sortState);
259
294
  }
260
295
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: TableSortHeaderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
261
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.5", type: TableSortHeaderComponent, isStandalone: true, selector: "lib-table-sort-header", inputs: { selected: { classPropertyName: "selected", publicName: "selected", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { sort: "sort" }, ngImport: i0, template: "<div class=\"sorting-container\" (click)=\"onSortClick()\">\r\n <mat-icon\r\n [class.selected]=\"selected() && sortState != 'none'\"\r\n [class.rotated]=\"sortState == 'asc'\">\r\n sort\r\n </mat-icon>\r\n</div>", styles: [".sorting-container{display:flex;align-items:center}.sorting-container *{cursor:pointer}.sorting-container .selected{color:#31adff;background-color:#ebf7fc}.sorting-container .rotated{transform:rotate(180deg) scaleX(-1)}\n"], dependencies: [{ kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i1$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
296
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.5", type: TableSortHeaderComponent, isStandalone: true, selector: "lib-table-sort-header", inputs: { selected: { classPropertyName: "selected", publicName: "selected", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { sort: "sort" }, ngImport: i0, template: "<div class=\"sorting-container\" (click)=\"onSortClick()\">\n\t<mat-icon\n\t\t[class.selected]=\"selected() && sortState != 'none'\"\n\t\t[class.rotated]=\"sortState == 'asc'\"\n\t>\n\t\tsort\n\t</mat-icon>\n</div>\n", styles: [".sorting-container{display:flex;align-items:center}.sorting-container *{cursor:pointer}.sorting-container .selected{color:#31adff;background-color:#ebf7fc}.sorting-container .rotated{transform:rotate(180deg) scaleX(-1)}\n"], dependencies: [{ kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i1$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
262
297
  }
263
298
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: TableSortHeaderComponent, decorators: [{
264
299
  type: Component,
265
- args: [{ selector: 'lib-table-sort-header', imports: [
266
- MatIconModule,
267
- ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"sorting-container\" (click)=\"onSortClick()\">\r\n <mat-icon\r\n [class.selected]=\"selected() && sortState != 'none'\"\r\n [class.rotated]=\"sortState == 'asc'\">\r\n sort\r\n </mat-icon>\r\n</div>", styles: [".sorting-container{display:flex;align-items:center}.sorting-container *{cursor:pointer}.sorting-container .selected{color:#31adff;background-color:#ebf7fc}.sorting-container .rotated{transform:rotate(180deg) scaleX(-1)}\n"] }]
300
+ args: [{ selector: 'lib-table-sort-header', imports: [MatIconModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"sorting-container\" (click)=\"onSortClick()\">\n\t<mat-icon\n\t\t[class.selected]=\"selected() && sortState != 'none'\"\n\t\t[class.rotated]=\"sortState == 'asc'\"\n\t>\n\t\tsort\n\t</mat-icon>\n</div>\n", styles: [".sorting-container{display:flex;align-items:center}.sorting-container *{cursor:pointer}.sorting-container .selected{color:#31adff;background-color:#ebf7fc}.sorting-container .rotated{transform:rotate(180deg) scaleX(-1)}\n"] }]
268
301
  }], propDecorators: { selected: [{ type: i0.Input, args: [{ isSignal: true, alias: "selected", required: true }] }], sort: [{ type: i0.Output, args: ["sort"] }] } });
269
302
 
270
303
  class TableComponent {
@@ -291,13 +324,18 @@ class TableComponent {
291
324
  drop(event) {
292
325
  if (this.config().draggable) {
293
326
  moveItemInArray(this.config().data, event.previousIndex, event.currentIndex);
294
- this.action.emit({ action: 'drag', obj: this.config().data[event.currentIndex], index: event.currentIndex });
327
+ this.action.emit({
328
+ action: 'drag',
329
+ obj: this.config().data[event.currentIndex],
330
+ index: event.currentIndex,
331
+ });
295
332
  }
296
333
  }
297
334
  onScroll(e) {
298
335
  const container = this.scrollContainer().nativeElement;
299
336
  this.action.emit({ action: 'scroll', event: e });
300
- if ((Math.ceil(container.scrollTop) + container.offsetHeight) >= container.scrollHeight) {
337
+ if (Math.ceil(container.scrollTop) + container.offsetHeight >=
338
+ container.scrollHeight) {
301
339
  this.action.emit({ action: 'scrolled' });
302
340
  }
303
341
  }
@@ -308,7 +346,7 @@ class TableComponent {
308
346
  obj,
309
347
  index,
310
348
  selected: this.selectedRowIndex === index || this.selectedIndices.has(index),
311
- event
349
+ event,
312
350
  });
313
351
  }
314
352
  selectOption(оption, obj, index) {
@@ -316,7 +354,7 @@ class TableComponent {
316
354
  action: оption.toLowerCase(),
317
355
  obj,
318
356
  index,
319
- selected: this.selectedRowIndex === index || this.selectedIndices.has(index)
357
+ selected: this.selectedRowIndex === index || this.selectedIndices.has(index),
320
358
  });
321
359
  }
322
360
  areAllRowsSelected() {
@@ -331,7 +369,7 @@ class TableComponent {
331
369
  }
332
370
  this.action.emit({
333
371
  action: 'rowSelect',
334
- selectedRows: [...this.selectedIndices]
372
+ selectedRows: [...this.selectedIndices],
335
373
  });
336
374
  }
337
375
  toggleRowSelection(index) {
@@ -345,7 +383,7 @@ class TableComponent {
345
383
  this.action.emit({
346
384
  action: 'rowSelect',
347
385
  index,
348
- selectedRows: [...this.selectedIndices]
386
+ selectedRows: [...this.selectedIndices],
349
387
  });
350
388
  }
351
389
  }
@@ -362,7 +400,7 @@ class TableComponent {
362
400
  return !!this.config().options;
363
401
  }
364
402
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: TableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
365
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.5", type: TableComponent, isStandalone: true, selector: "lib-table", inputs: { config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { action: "action" }, viewQueries: [{ propertyName: "scrollContainer", first: true, predicate: ["scrollContainer"], descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"flexer\">\r\n @if (config().title) {\r\n <div class=\"row-heading-labels mb05\">{{ config().title }}</div>\r\n }\r\n\r\n <ng-content select=\".upper-part\" />\r\n\r\n @if (config().withAdd) {\r\n <div class=\"flexer action pointer gap05 mb05\" (click)=\"action.emit({action: 'add'})\">\r\n <mat-icon>add_circle_outline</mat-icon>\r\n <div>add</div>\r\n </div>\r\n }\r\n</div>\r\n\r\n<div class=\"scroll\" #scrollContainer (scroll)=\"onScroll($event)\" [class.with-checkboxes]=\"config().selectableRows === 'multiple'\">\r\n <table [class.with-options]=\"hasOptions()\">\r\n <thead>\r\n @if ((config().tableHeadings || []).length > 0) {\r\n <tr>\r\n @if (config().selectableRows === 'multiple') {\r\n <th class=\"box-cell\">\r\n <mat-checkbox\r\n (change)=\"toggleSelectAll($event)\"\r\n [checked]=\"areAllRowsSelected()\">\r\n </mat-checkbox>\r\n </th>\r\n }\r\n\r\n @for (heading of config().tableHeadings; track heading; let i = $index) {\r\n <th>\r\n <div class=\"flexer gap05\">\r\n {{ heading }}\r\n @if (config().sortable && !config().draggable) {\r\n <lib-table-sort-header\r\n [selected]=\"currentSortColumn === i\"\r\n (click)=\"currentSortColumn = i\"\r\n (sort)=\"sortByProp(config().dataProps[i], $event)\"\r\n />\r\n }\r\n </div>\r\n </th>\r\n }\r\n\r\n @if (hasOptions()) {\r\n <th></th>\r\n }\r\n </tr>\r\n } @else {\r\n <ng-content select=\".custom-headers\" />\r\n }\r\n </thead>\r\n @if (config().draggable) {\r\n <tbody cdkDropList (cdkDropListDropped)=\"drop($event)\">\r\n @for (obj of config().data; let i = $index; track i;) {\r\n <tr\r\n (mouseover)=\"hoverRowIndex = i\"\r\n (mouseleave)=\"hoverRowIndex = -1\"\r\n cdkDrag cdkDragLockAxis=\"y\"\r\n [class.pointer]=\"config().selectableRows\"\r\n [class.hover-row]=\"hoverRowIndex == i\"\r\n [class.selected-row]=\"(config().selectableRows === 'single' && selectedRowIndex == i) ||\r\n (config().selectableRows === 'multiple' && selectedIndices.has(i))\"\r\n (click)=\"onRowClick($event, obj, i)\">\r\n @if (config().selectableRows === 'multiple') {\r\n <td>\r\n <mat-checkbox\r\n (click)=\"$event.stopPropagation()\"\r\n [checked]=\"selectedIndices.has(i)\"\r\n (change)=\"toggleRowSelection(i)\">\r\n </mat-checkbox>\r\n </td>\r\n }\r\n\r\n @for (prop of config().dataProps; track prop; let cellIndex = $index) {\r\n <td\r\n [class.dragCol]=\"cellIndex === 0\">\r\n <div [class]=\"'data ' + getClass(obj, prop)\"\r\n [class.flexer]=\"cellIndex === 0\">\r\n @if (cellIndex === 0) {\r\n <mat-icon class=\"draggable\" cdkDragHandle>\r\n drag_indicator\r\n </mat-icon>\r\n }\r\n {{ obj[prop] || '-' }}\r\n </div>\r\n </td>\r\n }\r\n @if (hasOptions()) {\r\n <td class=\"right-align\" (click)=\"$event.stopPropagation()\">\r\n <button mat-icon-button class=\"pointer dots right\" [matMenuTriggerFor]=\"optionsMenu\">\r\n <mat-icon>more_vert</mat-icon>\r\n </button>\r\n <mat-menu #optionsMenu=\"matMenu\">\r\n @for (option of getOptionsForRow(obj); track option) {\r\n <div\r\n mat-menu-item (click)=\"selectOption(option, obj, i)\"\r\n [class.red]=\"option == 'Remove' || option == 'Delete'\">\r\n {{ option }}\r\n </div>\r\n }\r\n </mat-menu>\r\n </td>\r\n }\r\n </tr>\r\n }\r\n </tbody>\r\n } @else {\r\n <tbody>\r\n @for (obj of config().data; let i = $index; track i;) {\r\n <tr\r\n (mouseover)=\"hoverRowIndex = i\"\r\n (mouseleave)=\"hoverRowIndex = -1\"\r\n [class.pointer]=\"config().selectableRows\"\r\n [class.hover-row]=\"hoverRowIndex == i\"\r\n [class.selected-row]=\"(config().selectableRows === 'single' && selectedRowIndex == i) ||\r\n (config().selectableRows === 'multiple' && selectedIndices.has(i))\"\r\n (click)=\"onRowClick($event, obj, i)\">\r\n @if (config().selectableRows === 'multiple') {\r\n <td>\r\n <mat-checkbox\r\n (click)=\"$event.stopPropagation()\"\r\n [checked]=\"selectedIndices.has(i)\"\r\n (change)=\"toggleRowSelection(i)\">\r\n </mat-checkbox>\r\n </td>\r\n }\r\n\r\n @for (prop of config().dataProps; track prop; let cellIndex = $index) {\r\n <td>\r\n <div [class]=\"'data ' + getClass(obj, prop)\">\r\n {{ obj[prop] || '-' }}\r\n </div>\r\n </td>\r\n }\r\n @if (hasOptions()) {\r\n <td class=\"right-align\" (click)=\"$event.stopPropagation()\">\r\n <button mat-icon-button class=\"pointer dots right\" [matMenuTriggerFor]=\"optionsMenu\">\r\n <mat-icon>more_vert</mat-icon>\r\n </button>\r\n <mat-menu #optionsMenu=\"matMenu\">\r\n @for (option of getOptionsForRow(obj); track option) {\r\n <div\r\n mat-menu-item (click)=\"selectOption(option, obj, i)\"\r\n [class.red]=\"option == 'Remove' || option == 'Delete'\">\r\n {{ option }}\r\n </div>\r\n }\r\n </mat-menu>\r\n </td>\r\n }\r\n </tr>\r\n }\r\n </tbody>\r\n }\r\n </table>\r\n</div>\r\n", styles: [".scroll{overflow-y:auto;max-height:94%}table{width:100%;border-collapse:collapse;border-spacing:0px}table.with-options td{padding-block:3px!important}.flexer{display:flex;align-items:center}.action{color:#009ddc;font-weight:500;text-align:right;margin-left:auto}.pointer{cursor:pointer}.gap05{gap:.5rem}.mb05{margin-bottom:.5}.data{white-space:pre-wrap}.row-heading-labels{font-weight:700;font-size:20px}.selected-row td{background-color:#d3edf8}.hover-row{background-color:#ebf7fc}.red{color:red}@media(max-width:1086px){table td,table th{padding:3px!important;width:auto!important}}.with-checkboxes td,.with-checkboxes th{padding-block:0!important}.with-checkboxes td:is(:first-child),.with-checkboxes th:is(:first-child){padding-inline:0!important}td,th{padding:.5rem 1rem;font-size:14px}th{background-color:#f6f6f6;text-align:left;position:sticky;top:0;z-index:2;border-top:2px solid #E5E4E7}td{border-bottom:2px solid #E5E4E7;border-top:2px solid #E5E4E7}.dots{width:fit-content}.draggable{cursor:grabbing}.dragCol{padding-left:0!important}.cdk-drag-preview{box-sizing:border-box;border-radius:4px;font-size:1.5em;text-align:center;opacity:.8;box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f}.dragdrop-placeholder{background:#ccc;border:dotted 3px #999;min-height:30px;transition:transform .1s cubic-bezier(0,0,.2,1)}\n"], dependencies: [{ kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i1$2.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i1$2.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i1$2.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i1$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i3$1.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: TableSortHeaderComponent, selector: "lib-table-sort-header", inputs: ["selected"], outputs: ["sort"] }, { kind: "ngmodule", type: DragDropModule }, { kind: "directive", type: i4.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer", "cdkDropListHasAnchor"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i4.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i4.CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i5.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "aria-expanded", "aria-controls", "aria-owns", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "disabledInteractive", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
403
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.5", type: TableComponent, isStandalone: true, selector: "lib-table", inputs: { config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { action: "action" }, viewQueries: [{ propertyName: "scrollContainer", first: true, predicate: ["scrollContainer"], descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"flexer\">\n\t@if (config().title) {\n\t\t<div class=\"row-heading-labels mb05\">{{ config().title }}</div>\n\t}\n\n\t<ng-content select=\".upper-part\" />\n\n\t@if (config().withAdd) {\n\t\t<div\n\t\t\tclass=\"flexer action pointer gap05 mb05\"\n\t\t\t(click)=\"action.emit({ action: 'add' })\"\n\t\t>\n\t\t\t<mat-icon>add_circle_outline</mat-icon>\n\t\t\t<div>add</div>\n\t\t</div>\n\t}\n</div>\n\n<div\n\tclass=\"scroll\"\n\t#scrollContainer\n\t(scroll)=\"onScroll($event)\"\n\t[class.with-checkboxes]=\"config().selectableRows === 'multiple'\"\n>\n\t<table [class.with-options]=\"hasOptions()\">\n\t\t<thead>\n\t\t\t@if ((config().tableHeadings || []).length > 0) {\n\t\t\t\t<tr>\n\t\t\t\t\t@if (config().selectableRows === \"multiple\") {\n\t\t\t\t\t\t<th class=\"box-cell\">\n\t\t\t\t\t\t\t<mat-checkbox\n\t\t\t\t\t\t\t\t(change)=\"toggleSelectAll($event)\"\n\t\t\t\t\t\t\t\t[checked]=\"areAllRowsSelected()\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t</mat-checkbox>\n\t\t\t\t\t\t</th>\n\t\t\t\t\t}\n\n\t\t\t\t\t@for (\n\t\t\t\t\t\theading of config().tableHeadings;\n\t\t\t\t\t\ttrack heading;\n\t\t\t\t\t\tlet i = $index\n\t\t\t\t\t) {\n\t\t\t\t\t\t<th>\n\t\t\t\t\t\t\t<div class=\"flexer gap05\">\n\t\t\t\t\t\t\t\t{{ heading }}\n\t\t\t\t\t\t\t\t@if (config().sortable && !config().draggable) {\n\t\t\t\t\t\t\t\t\t<lib-table-sort-header\n\t\t\t\t\t\t\t\t\t\t[selected]=\"currentSortColumn === i\"\n\t\t\t\t\t\t\t\t\t\t(click)=\"currentSortColumn = i\"\n\t\t\t\t\t\t\t\t\t\t(sort)=\"sortByProp(config().dataProps[i], $event)\"\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</th>\n\t\t\t\t\t}\n\n\t\t\t\t\t@if (hasOptions()) {\n\t\t\t\t\t\t<th></th>\n\t\t\t\t\t}\n\t\t\t\t</tr>\n\t\t\t} @else {\n\t\t\t\t<ng-content select=\".custom-headers\" />\n\t\t\t}\n\t\t</thead>\n\t\t@if (config().draggable) {\n\t\t\t<tbody cdkDropList (cdkDropListDropped)=\"drop($event)\">\n\t\t\t\t@for (obj of config().data; let i = $index; track i) {\n\t\t\t\t\t<tr\n\t\t\t\t\t\t(mouseover)=\"hoverRowIndex = i\"\n\t\t\t\t\t\t(mouseleave)=\"hoverRowIndex = -1\"\n\t\t\t\t\t\tcdkDrag\n\t\t\t\t\t\tcdkDragLockAxis=\"y\"\n\t\t\t\t\t\t[class.pointer]=\"config().selectableRows\"\n\t\t\t\t\t\t[class.hover-row]=\"hoverRowIndex == i\"\n\t\t\t\t\t\t[class.selected-row]=\"\n\t\t\t\t\t\t\t(config().selectableRows === 'single' && selectedRowIndex == i) ||\n\t\t\t\t\t\t\t(config().selectableRows === 'multiple' && selectedIndices.has(i))\n\t\t\t\t\t\t\"\n\t\t\t\t\t\t(click)=\"onRowClick($event, obj, i)\"\n\t\t\t\t\t>\n\t\t\t\t\t\t@if (config().selectableRows === \"multiple\") {\n\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t<mat-checkbox\n\t\t\t\t\t\t\t\t\t(click)=\"$event.stopPropagation()\"\n\t\t\t\t\t\t\t\t\t[checked]=\"selectedIndices.has(i)\"\n\t\t\t\t\t\t\t\t\t(change)=\"toggleRowSelection(i)\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t</mat-checkbox>\n\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t@for (\n\t\t\t\t\t\t\tprop of config().dataProps;\n\t\t\t\t\t\t\ttrack prop;\n\t\t\t\t\t\t\tlet cellIndex = $index\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t<td [class.dragCol]=\"cellIndex === 0\">\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t[class]=\"getClass(obj, prop)\"\n\t\t\t\t\t\t\t\t\t[class.flexer]=\"cellIndex === 0\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t@if (cellIndex === 0) {\n\t\t\t\t\t\t\t\t\t\t<mat-icon class=\"draggable\" cdkDragHandle>\n\t\t\t\t\t\t\t\t\t\t\tdrag_indicator\n\t\t\t\t\t\t\t\t\t\t</mat-icon>\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t{{ obj[prop] || \"-\" }}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t}\n\t\t\t\t\t\t@if (hasOptions()) {\n\t\t\t\t\t\t\t<td class=\"right-align\" (click)=\"$event.stopPropagation()\">\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\tmat-icon-button\n\t\t\t\t\t\t\t\t\tclass=\"pointer dots right\"\n\t\t\t\t\t\t\t\t\t[matMenuTriggerFor]=\"optionsMenu\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<mat-icon>more_vert</mat-icon>\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t<mat-menu #optionsMenu=\"matMenu\">\n\t\t\t\t\t\t\t\t\t@for (option of getOptionsForRow(obj); track option) {\n\t\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\t\tmat-menu-item\n\t\t\t\t\t\t\t\t\t\t\t(click)=\"selectOption(option, obj, i)\"\n\t\t\t\t\t\t\t\t\t\t\t[class.red]=\"option == 'Remove' || option == 'Delete'\"\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t{{ option }}\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t</mat-menu>\n\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t}\n\t\t\t\t\t</tr>\n\t\t\t\t}\n\t\t\t</tbody>\n\t\t} @else {\n\t\t\t<tbody>\n\t\t\t\t@for (obj of config().data; let i = $index; track i) {\n\t\t\t\t\t<tr\n\t\t\t\t\t\t(mouseover)=\"hoverRowIndex = i\"\n\t\t\t\t\t\t(mouseleave)=\"hoverRowIndex = -1\"\n\t\t\t\t\t\t[class.pointer]=\"config().selectableRows\"\n\t\t\t\t\t\t[class.hover-row]=\"hoverRowIndex == i\"\n\t\t\t\t\t\t[class.selected-row]=\"\n\t\t\t\t\t\t\t(config().selectableRows === 'single' && selectedRowIndex == i) ||\n\t\t\t\t\t\t\t(config().selectableRows === 'multiple' && selectedIndices.has(i))\n\t\t\t\t\t\t\"\n\t\t\t\t\t\t(click)=\"onRowClick($event, obj, i)\"\n\t\t\t\t\t>\n\t\t\t\t\t\t@if (config().selectableRows === \"multiple\") {\n\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t<mat-checkbox\n\t\t\t\t\t\t\t\t\t(click)=\"$event.stopPropagation()\"\n\t\t\t\t\t\t\t\t\t[checked]=\"selectedIndices.has(i)\"\n\t\t\t\t\t\t\t\t\t(change)=\"toggleRowSelection(i)\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t</mat-checkbox>\n\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t@for (\n\t\t\t\t\t\t\tprop of config().dataProps;\n\t\t\t\t\t\t\ttrack prop;\n\t\t\t\t\t\t\tlet cellIndex = $index\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t<div [class]=\"getClass(obj, prop)\">\n\t\t\t\t\t\t\t\t\t{{ obj[prop] || \"-\" }}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t}\n\t\t\t\t\t\t@if (hasOptions()) {\n\t\t\t\t\t\t\t<td class=\"right-align\" (click)=\"$event.stopPropagation()\">\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\tmat-icon-button\n\t\t\t\t\t\t\t\t\tclass=\"pointer dots right\"\n\t\t\t\t\t\t\t\t\t[matMenuTriggerFor]=\"optionsMenu\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<mat-icon>more_vert</mat-icon>\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t<mat-menu #optionsMenu=\"matMenu\">\n\t\t\t\t\t\t\t\t\t@for (option of getOptionsForRow(obj); track option) {\n\t\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\t\tmat-menu-item\n\t\t\t\t\t\t\t\t\t\t\t(click)=\"selectOption(option, obj, i)\"\n\t\t\t\t\t\t\t\t\t\t\t[class.red]=\"option == 'Remove' || option == 'Delete'\"\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t{{ option }}\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t</mat-menu>\n\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t}\n\t\t\t\t\t</tr>\n\t\t\t\t}\n\t\t\t</tbody>\n\t\t}\n\t</table>\n</div>\n", styles: [".scroll{overflow-y:auto;max-height:94%}table{width:100%;border-collapse:collapse;border-spacing:0px}table.with-options td{padding-block:3px!important}.flexer{display:flex;align-items:center}.action{color:#009ddc;font-weight:500;text-align:right;margin-left:auto}.pointer{cursor:pointer}.gap05{gap:.5rem}.mb05{margin-bottom:.5}.row-heading-labels{font-weight:700;font-size:20px}.selected-row td{background-color:#d3edf8}.hover-row{background-color:#ebf7fc}.red{color:red}@media(max-width:1086px){table td,table th{padding:3px!important;width:auto!important}}.with-checkboxes td,.with-checkboxes th{padding-block:0!important}.with-checkboxes td:is(:first-child),.with-checkboxes th:is(:first-child){padding-inline:0!important}td,th{padding:.5rem 1rem;font-size:14px}th{background-color:#f6f6f6;text-align:left;position:sticky;top:0;z-index:2;border-top:2px solid #e5e4e7}td{border-bottom:2px solid #e5e4e7;border-top:2px solid #e5e4e7}.dots{width:fit-content}.draggable{cursor:grabbing}.dragCol{padding-left:0!important}.cdk-drag-preview{box-sizing:border-box;border-radius:4px;font-size:1.5em;text-align:center;opacity:.8;box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f}.dragdrop-placeholder{background:#ccc;border:dotted 3px #999;min-height:30px;transition:transform .1s cubic-bezier(0,0,.2,1)}\n"], dependencies: [{ kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i1$2.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i1$2.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i1$2.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i1$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i3$1.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: TableSortHeaderComponent, selector: "lib-table-sort-header", inputs: ["selected"], outputs: ["sort"] }, { kind: "ngmodule", type: DragDropModule }, { kind: "directive", type: i4.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer", "cdkDropListHasAnchor"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i4.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i4.CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i5.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "aria-expanded", "aria-controls", "aria-owns", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "disabledInteractive", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
366
404
  }
367
405
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: TableComponent, decorators: [{
368
406
  type: Component,
@@ -372,8 +410,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImpor
372
410
  MatButtonModule,
373
411
  TableSortHeaderComponent,
374
412
  DragDropModule,
375
- MatCheckboxModule
376
- ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"flexer\">\r\n @if (config().title) {\r\n <div class=\"row-heading-labels mb05\">{{ config().title }}</div>\r\n }\r\n\r\n <ng-content select=\".upper-part\" />\r\n\r\n @if (config().withAdd) {\r\n <div class=\"flexer action pointer gap05 mb05\" (click)=\"action.emit({action: 'add'})\">\r\n <mat-icon>add_circle_outline</mat-icon>\r\n <div>add</div>\r\n </div>\r\n }\r\n</div>\r\n\r\n<div class=\"scroll\" #scrollContainer (scroll)=\"onScroll($event)\" [class.with-checkboxes]=\"config().selectableRows === 'multiple'\">\r\n <table [class.with-options]=\"hasOptions()\">\r\n <thead>\r\n @if ((config().tableHeadings || []).length > 0) {\r\n <tr>\r\n @if (config().selectableRows === 'multiple') {\r\n <th class=\"box-cell\">\r\n <mat-checkbox\r\n (change)=\"toggleSelectAll($event)\"\r\n [checked]=\"areAllRowsSelected()\">\r\n </mat-checkbox>\r\n </th>\r\n }\r\n\r\n @for (heading of config().tableHeadings; track heading; let i = $index) {\r\n <th>\r\n <div class=\"flexer gap05\">\r\n {{ heading }}\r\n @if (config().sortable && !config().draggable) {\r\n <lib-table-sort-header\r\n [selected]=\"currentSortColumn === i\"\r\n (click)=\"currentSortColumn = i\"\r\n (sort)=\"sortByProp(config().dataProps[i], $event)\"\r\n />\r\n }\r\n </div>\r\n </th>\r\n }\r\n\r\n @if (hasOptions()) {\r\n <th></th>\r\n }\r\n </tr>\r\n } @else {\r\n <ng-content select=\".custom-headers\" />\r\n }\r\n </thead>\r\n @if (config().draggable) {\r\n <tbody cdkDropList (cdkDropListDropped)=\"drop($event)\">\r\n @for (obj of config().data; let i = $index; track i;) {\r\n <tr\r\n (mouseover)=\"hoverRowIndex = i\"\r\n (mouseleave)=\"hoverRowIndex = -1\"\r\n cdkDrag cdkDragLockAxis=\"y\"\r\n [class.pointer]=\"config().selectableRows\"\r\n [class.hover-row]=\"hoverRowIndex == i\"\r\n [class.selected-row]=\"(config().selectableRows === 'single' && selectedRowIndex == i) ||\r\n (config().selectableRows === 'multiple' && selectedIndices.has(i))\"\r\n (click)=\"onRowClick($event, obj, i)\">\r\n @if (config().selectableRows === 'multiple') {\r\n <td>\r\n <mat-checkbox\r\n (click)=\"$event.stopPropagation()\"\r\n [checked]=\"selectedIndices.has(i)\"\r\n (change)=\"toggleRowSelection(i)\">\r\n </mat-checkbox>\r\n </td>\r\n }\r\n\r\n @for (prop of config().dataProps; track prop; let cellIndex = $index) {\r\n <td\r\n [class.dragCol]=\"cellIndex === 0\">\r\n <div [class]=\"'data ' + getClass(obj, prop)\"\r\n [class.flexer]=\"cellIndex === 0\">\r\n @if (cellIndex === 0) {\r\n <mat-icon class=\"draggable\" cdkDragHandle>\r\n drag_indicator\r\n </mat-icon>\r\n }\r\n {{ obj[prop] || '-' }}\r\n </div>\r\n </td>\r\n }\r\n @if (hasOptions()) {\r\n <td class=\"right-align\" (click)=\"$event.stopPropagation()\">\r\n <button mat-icon-button class=\"pointer dots right\" [matMenuTriggerFor]=\"optionsMenu\">\r\n <mat-icon>more_vert</mat-icon>\r\n </button>\r\n <mat-menu #optionsMenu=\"matMenu\">\r\n @for (option of getOptionsForRow(obj); track option) {\r\n <div\r\n mat-menu-item (click)=\"selectOption(option, obj, i)\"\r\n [class.red]=\"option == 'Remove' || option == 'Delete'\">\r\n {{ option }}\r\n </div>\r\n }\r\n </mat-menu>\r\n </td>\r\n }\r\n </tr>\r\n }\r\n </tbody>\r\n } @else {\r\n <tbody>\r\n @for (obj of config().data; let i = $index; track i;) {\r\n <tr\r\n (mouseover)=\"hoverRowIndex = i\"\r\n (mouseleave)=\"hoverRowIndex = -1\"\r\n [class.pointer]=\"config().selectableRows\"\r\n [class.hover-row]=\"hoverRowIndex == i\"\r\n [class.selected-row]=\"(config().selectableRows === 'single' && selectedRowIndex == i) ||\r\n (config().selectableRows === 'multiple' && selectedIndices.has(i))\"\r\n (click)=\"onRowClick($event, obj, i)\">\r\n @if (config().selectableRows === 'multiple') {\r\n <td>\r\n <mat-checkbox\r\n (click)=\"$event.stopPropagation()\"\r\n [checked]=\"selectedIndices.has(i)\"\r\n (change)=\"toggleRowSelection(i)\">\r\n </mat-checkbox>\r\n </td>\r\n }\r\n\r\n @for (prop of config().dataProps; track prop; let cellIndex = $index) {\r\n <td>\r\n <div [class]=\"'data ' + getClass(obj, prop)\">\r\n {{ obj[prop] || '-' }}\r\n </div>\r\n </td>\r\n }\r\n @if (hasOptions()) {\r\n <td class=\"right-align\" (click)=\"$event.stopPropagation()\">\r\n <button mat-icon-button class=\"pointer dots right\" [matMenuTriggerFor]=\"optionsMenu\">\r\n <mat-icon>more_vert</mat-icon>\r\n </button>\r\n <mat-menu #optionsMenu=\"matMenu\">\r\n @for (option of getOptionsForRow(obj); track option) {\r\n <div\r\n mat-menu-item (click)=\"selectOption(option, obj, i)\"\r\n [class.red]=\"option == 'Remove' || option == 'Delete'\">\r\n {{ option }}\r\n </div>\r\n }\r\n </mat-menu>\r\n </td>\r\n }\r\n </tr>\r\n }\r\n </tbody>\r\n }\r\n </table>\r\n</div>\r\n", styles: [".scroll{overflow-y:auto;max-height:94%}table{width:100%;border-collapse:collapse;border-spacing:0px}table.with-options td{padding-block:3px!important}.flexer{display:flex;align-items:center}.action{color:#009ddc;font-weight:500;text-align:right;margin-left:auto}.pointer{cursor:pointer}.gap05{gap:.5rem}.mb05{margin-bottom:.5}.data{white-space:pre-wrap}.row-heading-labels{font-weight:700;font-size:20px}.selected-row td{background-color:#d3edf8}.hover-row{background-color:#ebf7fc}.red{color:red}@media(max-width:1086px){table td,table th{padding:3px!important;width:auto!important}}.with-checkboxes td,.with-checkboxes th{padding-block:0!important}.with-checkboxes td:is(:first-child),.with-checkboxes th:is(:first-child){padding-inline:0!important}td,th{padding:.5rem 1rem;font-size:14px}th{background-color:#f6f6f6;text-align:left;position:sticky;top:0;z-index:2;border-top:2px solid #E5E4E7}td{border-bottom:2px solid #E5E4E7;border-top:2px solid #E5E4E7}.dots{width:fit-content}.draggable{cursor:grabbing}.dragCol{padding-left:0!important}.cdk-drag-preview{box-sizing:border-box;border-radius:4px;font-size:1.5em;text-align:center;opacity:.8;box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f}.dragdrop-placeholder{background:#ccc;border:dotted 3px #999;min-height:30px;transition:transform .1s cubic-bezier(0,0,.2,1)}\n"] }]
413
+ MatCheckboxModule,
414
+ ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"flexer\">\n\t@if (config().title) {\n\t\t<div class=\"row-heading-labels mb05\">{{ config().title }}</div>\n\t}\n\n\t<ng-content select=\".upper-part\" />\n\n\t@if (config().withAdd) {\n\t\t<div\n\t\t\tclass=\"flexer action pointer gap05 mb05\"\n\t\t\t(click)=\"action.emit({ action: 'add' })\"\n\t\t>\n\t\t\t<mat-icon>add_circle_outline</mat-icon>\n\t\t\t<div>add</div>\n\t\t</div>\n\t}\n</div>\n\n<div\n\tclass=\"scroll\"\n\t#scrollContainer\n\t(scroll)=\"onScroll($event)\"\n\t[class.with-checkboxes]=\"config().selectableRows === 'multiple'\"\n>\n\t<table [class.with-options]=\"hasOptions()\">\n\t\t<thead>\n\t\t\t@if ((config().tableHeadings || []).length > 0) {\n\t\t\t\t<tr>\n\t\t\t\t\t@if (config().selectableRows === \"multiple\") {\n\t\t\t\t\t\t<th class=\"box-cell\">\n\t\t\t\t\t\t\t<mat-checkbox\n\t\t\t\t\t\t\t\t(change)=\"toggleSelectAll($event)\"\n\t\t\t\t\t\t\t\t[checked]=\"areAllRowsSelected()\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t</mat-checkbox>\n\t\t\t\t\t\t</th>\n\t\t\t\t\t}\n\n\t\t\t\t\t@for (\n\t\t\t\t\t\theading of config().tableHeadings;\n\t\t\t\t\t\ttrack heading;\n\t\t\t\t\t\tlet i = $index\n\t\t\t\t\t) {\n\t\t\t\t\t\t<th>\n\t\t\t\t\t\t\t<div class=\"flexer gap05\">\n\t\t\t\t\t\t\t\t{{ heading }}\n\t\t\t\t\t\t\t\t@if (config().sortable && !config().draggable) {\n\t\t\t\t\t\t\t\t\t<lib-table-sort-header\n\t\t\t\t\t\t\t\t\t\t[selected]=\"currentSortColumn === i\"\n\t\t\t\t\t\t\t\t\t\t(click)=\"currentSortColumn = i\"\n\t\t\t\t\t\t\t\t\t\t(sort)=\"sortByProp(config().dataProps[i], $event)\"\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</th>\n\t\t\t\t\t}\n\n\t\t\t\t\t@if (hasOptions()) {\n\t\t\t\t\t\t<th></th>\n\t\t\t\t\t}\n\t\t\t\t</tr>\n\t\t\t} @else {\n\t\t\t\t<ng-content select=\".custom-headers\" />\n\t\t\t}\n\t\t</thead>\n\t\t@if (config().draggable) {\n\t\t\t<tbody cdkDropList (cdkDropListDropped)=\"drop($event)\">\n\t\t\t\t@for (obj of config().data; let i = $index; track i) {\n\t\t\t\t\t<tr\n\t\t\t\t\t\t(mouseover)=\"hoverRowIndex = i\"\n\t\t\t\t\t\t(mouseleave)=\"hoverRowIndex = -1\"\n\t\t\t\t\t\tcdkDrag\n\t\t\t\t\t\tcdkDragLockAxis=\"y\"\n\t\t\t\t\t\t[class.pointer]=\"config().selectableRows\"\n\t\t\t\t\t\t[class.hover-row]=\"hoverRowIndex == i\"\n\t\t\t\t\t\t[class.selected-row]=\"\n\t\t\t\t\t\t\t(config().selectableRows === 'single' && selectedRowIndex == i) ||\n\t\t\t\t\t\t\t(config().selectableRows === 'multiple' && selectedIndices.has(i))\n\t\t\t\t\t\t\"\n\t\t\t\t\t\t(click)=\"onRowClick($event, obj, i)\"\n\t\t\t\t\t>\n\t\t\t\t\t\t@if (config().selectableRows === \"multiple\") {\n\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t<mat-checkbox\n\t\t\t\t\t\t\t\t\t(click)=\"$event.stopPropagation()\"\n\t\t\t\t\t\t\t\t\t[checked]=\"selectedIndices.has(i)\"\n\t\t\t\t\t\t\t\t\t(change)=\"toggleRowSelection(i)\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t</mat-checkbox>\n\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t@for (\n\t\t\t\t\t\t\tprop of config().dataProps;\n\t\t\t\t\t\t\ttrack prop;\n\t\t\t\t\t\t\tlet cellIndex = $index\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t<td [class.dragCol]=\"cellIndex === 0\">\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t[class]=\"getClass(obj, prop)\"\n\t\t\t\t\t\t\t\t\t[class.flexer]=\"cellIndex === 0\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t@if (cellIndex === 0) {\n\t\t\t\t\t\t\t\t\t\t<mat-icon class=\"draggable\" cdkDragHandle>\n\t\t\t\t\t\t\t\t\t\t\tdrag_indicator\n\t\t\t\t\t\t\t\t\t\t</mat-icon>\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t{{ obj[prop] || \"-\" }}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t}\n\t\t\t\t\t\t@if (hasOptions()) {\n\t\t\t\t\t\t\t<td class=\"right-align\" (click)=\"$event.stopPropagation()\">\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\tmat-icon-button\n\t\t\t\t\t\t\t\t\tclass=\"pointer dots right\"\n\t\t\t\t\t\t\t\t\t[matMenuTriggerFor]=\"optionsMenu\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<mat-icon>more_vert</mat-icon>\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t<mat-menu #optionsMenu=\"matMenu\">\n\t\t\t\t\t\t\t\t\t@for (option of getOptionsForRow(obj); track option) {\n\t\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\t\tmat-menu-item\n\t\t\t\t\t\t\t\t\t\t\t(click)=\"selectOption(option, obj, i)\"\n\t\t\t\t\t\t\t\t\t\t\t[class.red]=\"option == 'Remove' || option == 'Delete'\"\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t{{ option }}\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t</mat-menu>\n\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t}\n\t\t\t\t\t</tr>\n\t\t\t\t}\n\t\t\t</tbody>\n\t\t} @else {\n\t\t\t<tbody>\n\t\t\t\t@for (obj of config().data; let i = $index; track i) {\n\t\t\t\t\t<tr\n\t\t\t\t\t\t(mouseover)=\"hoverRowIndex = i\"\n\t\t\t\t\t\t(mouseleave)=\"hoverRowIndex = -1\"\n\t\t\t\t\t\t[class.pointer]=\"config().selectableRows\"\n\t\t\t\t\t\t[class.hover-row]=\"hoverRowIndex == i\"\n\t\t\t\t\t\t[class.selected-row]=\"\n\t\t\t\t\t\t\t(config().selectableRows === 'single' && selectedRowIndex == i) ||\n\t\t\t\t\t\t\t(config().selectableRows === 'multiple' && selectedIndices.has(i))\n\t\t\t\t\t\t\"\n\t\t\t\t\t\t(click)=\"onRowClick($event, obj, i)\"\n\t\t\t\t\t>\n\t\t\t\t\t\t@if (config().selectableRows === \"multiple\") {\n\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t<mat-checkbox\n\t\t\t\t\t\t\t\t\t(click)=\"$event.stopPropagation()\"\n\t\t\t\t\t\t\t\t\t[checked]=\"selectedIndices.has(i)\"\n\t\t\t\t\t\t\t\t\t(change)=\"toggleRowSelection(i)\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t</mat-checkbox>\n\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t@for (\n\t\t\t\t\t\t\tprop of config().dataProps;\n\t\t\t\t\t\t\ttrack prop;\n\t\t\t\t\t\t\tlet cellIndex = $index\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t<div [class]=\"getClass(obj, prop)\">\n\t\t\t\t\t\t\t\t\t{{ obj[prop] || \"-\" }}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t}\n\t\t\t\t\t\t@if (hasOptions()) {\n\t\t\t\t\t\t\t<td class=\"right-align\" (click)=\"$event.stopPropagation()\">\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\tmat-icon-button\n\t\t\t\t\t\t\t\t\tclass=\"pointer dots right\"\n\t\t\t\t\t\t\t\t\t[matMenuTriggerFor]=\"optionsMenu\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<mat-icon>more_vert</mat-icon>\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t<mat-menu #optionsMenu=\"matMenu\">\n\t\t\t\t\t\t\t\t\t@for (option of getOptionsForRow(obj); track option) {\n\t\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\t\tmat-menu-item\n\t\t\t\t\t\t\t\t\t\t\t(click)=\"selectOption(option, obj, i)\"\n\t\t\t\t\t\t\t\t\t\t\t[class.red]=\"option == 'Remove' || option == 'Delete'\"\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t{{ option }}\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t</mat-menu>\n\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t}\n\t\t\t\t\t</tr>\n\t\t\t\t}\n\t\t\t</tbody>\n\t\t}\n\t</table>\n</div>\n", styles: [".scroll{overflow-y:auto;max-height:94%}table{width:100%;border-collapse:collapse;border-spacing:0px}table.with-options td{padding-block:3px!important}.flexer{display:flex;align-items:center}.action{color:#009ddc;font-weight:500;text-align:right;margin-left:auto}.pointer{cursor:pointer}.gap05{gap:.5rem}.mb05{margin-bottom:.5}.row-heading-labels{font-weight:700;font-size:20px}.selected-row td{background-color:#d3edf8}.hover-row{background-color:#ebf7fc}.red{color:red}@media(max-width:1086px){table td,table th{padding:3px!important;width:auto!important}}.with-checkboxes td,.with-checkboxes th{padding-block:0!important}.with-checkboxes td:is(:first-child),.with-checkboxes th:is(:first-child){padding-inline:0!important}td,th{padding:.5rem 1rem;font-size:14px}th{background-color:#f6f6f6;text-align:left;position:sticky;top:0;z-index:2;border-top:2px solid #e5e4e7}td{border-bottom:2px solid #e5e4e7;border-top:2px solid #e5e4e7}.dots{width:fit-content}.draggable{cursor:grabbing}.dragCol{padding-left:0!important}.cdk-drag-preview{box-sizing:border-box;border-radius:4px;font-size:1.5em;text-align:center;opacity:.8;box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f}.dragdrop-placeholder{background:#ccc;border:dotted 3px #999;min-height:30px;transition:transform .1s cubic-bezier(0,0,.2,1)}\n"] }]
377
415
  }], propDecorators: { config: [{ type: i0.Input, args: [{ isSignal: true, alias: "config", required: true }] }], action: [{ type: i0.Output, args: ["action"] }], scrollContainer: [{ type: i0.ViewChild, args: ['scrollContainer', { isSignal: true }] }] } });
378
416
 
379
417
  class LoaderService {
@@ -393,7 +431,7 @@ class LoaderService {
393
431
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: LoaderService, decorators: [{
394
432
  type: Injectable,
395
433
  args: [{
396
- providedIn: 'root'
434
+ providedIn: 'root',
397
435
  }]
398
436
  }] });
399
437
 
@@ -402,14 +440,11 @@ class GlobalLoaderComponent {
402
440
  this.loaderService = inject(LoaderService);
403
441
  }
404
442
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: GlobalLoaderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
405
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.5", type: GlobalLoaderComponent, isStandalone: true, selector: "lib-global-loader", ngImport: i0, template: "@if (loaderService.loading$ | async) {\r\n <div class=\"loader\">\r\n <mat-spinner />\r\n </div>\r\n}", styles: [".loader{display:flex;justify-content:center;align-items:center;height:100%;width:100%;position:fixed;top:0;left:0;background-color:#0003;z-index:9999}\n"], dependencies: [{ kind: "ngmodule", type: MatProgressSpinnerModule }, { kind: "component", type: i1$3.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
443
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.5", type: GlobalLoaderComponent, isStandalone: true, selector: "lib-global-loader", ngImport: i0, template: "@if (loaderService.loading$ | async) {\n\t<div class=\"loader\">\n\t\t<mat-spinner />\n\t</div>\n}\n", styles: [".loader{display:flex;justify-content:center;align-items:center;height:100%;width:100%;position:fixed;top:0;left:0;background-color:#0003;z-index:9999}\n"], dependencies: [{ kind: "ngmodule", type: MatProgressSpinnerModule }, { kind: "component", type: i1$3.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
406
444
  }
407
445
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: GlobalLoaderComponent, decorators: [{
408
446
  type: Component,
409
- args: [{ selector: 'lib-global-loader', imports: [
410
- AsyncPipe,
411
- MatProgressSpinnerModule
412
- ], changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (loaderService.loading$ | async) {\r\n <div class=\"loader\">\r\n <mat-spinner />\r\n </div>\r\n}", styles: [".loader{display:flex;justify-content:center;align-items:center;height:100%;width:100%;position:fixed;top:0;left:0;background-color:#0003;z-index:9999}\n"] }]
447
+ args: [{ selector: 'lib-global-loader', imports: [AsyncPipe, MatProgressSpinnerModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (loaderService.loading$ | async) {\n\t<div class=\"loader\">\n\t\t<mat-spinner />\n\t</div>\n}\n", styles: [".loader{display:flex;justify-content:center;align-items:center;height:100%;width:100%;position:fixed;top:0;left:0;background-color:#0003;z-index:9999}\n"] }]
413
448
  }] });
414
449
 
415
450
  class ErrorService {
@@ -426,7 +461,7 @@ class ErrorService {
426
461
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: ErrorService, decorators: [{
427
462
  type: Injectable,
428
463
  args: [{
429
- providedIn: 'root'
464
+ providedIn: 'root',
430
465
  }]
431
466
  }] });
432
467
 
@@ -493,17 +528,17 @@ const HTTP_STATUS_CODES = {
493
528
  507: 'Insufficient Storage',
494
529
  508: 'Loop Detected',
495
530
  510: 'Not Extended',
496
- 511: 'Network Authentication Required'
531
+ 511: 'Network Authentication Required',
497
532
  };
498
533
  const JSON_HTTP_OPTIONS = {
499
534
  headers: {
500
- 'Accept': 'application/json',
535
+ Accept: 'application/json',
501
536
  'Accept-language': 'bg',
502
537
  },
503
- responseType: 'json'
538
+ responseType: 'json',
504
539
  };
505
540
  const STRING_HTTP_OPTIONS = {
506
- responseType: 'text'
541
+ responseType: 'text',
507
542
  };
508
543
  const BLOB_HTTP_OPTIONS = {
509
544
  headers: {
@@ -514,7 +549,7 @@ const BLOB_HTTP_OPTIONS = {
514
549
  };
515
550
  const SKIP_ERROR_OPTIONS = {
516
551
  headers: {
517
- 'Accept': 'application/json',
552
+ Accept: 'application/json',
518
553
  'Accept-language': 'bg',
519
554
  'X-Skip-Error': 'true',
520
555
  },
@@ -522,11 +557,11 @@ const SKIP_ERROR_OPTIONS = {
522
557
  };
523
558
  const JSON_OPTIONS_WITH_GLOBAL_LOADER = {
524
559
  headers: {
525
- 'Accept': 'application/json',
560
+ Accept: 'application/json',
526
561
  'Accept-language': 'bg',
527
562
  'X-Global-Loader': 'true',
528
563
  },
529
- responseType: 'json'
564
+ responseType: 'json',
530
565
  };
531
566
 
532
567
  class ErrorPopupComponent {
@@ -535,14 +570,11 @@ class ErrorPopupComponent {
535
570
  this.error = inject(MAT_DIALOG_DATA);
536
571
  }
537
572
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: ErrorPopupComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
538
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.5", type: ErrorPopupComponent, isStandalone: true, selector: "lib-error-popup", ngImport: i0, template: "<lib-default-dialog [dialogTitle]=\"'\u0410n error has occurred'\">\r\n <div class=\"dialog-content\">\r\n <div class=\"status-info\">\r\n <div>{{ error.status }}</div>\r\n @if (error.status) {\r\n <div>{{ httpStatusCodes[error.status] || 500 }}</div>\r\n }\r\n </div>\r\n <div class=\"error-info\">\r\n <lib-error-display [error]=\"error\" />\r\n </div>\r\n </div>\r\n</lib-default-dialog>", styles: [".dialog-content{display:flex;flex-direction:column;align-items:center;padding-inline:1rem}.dialog-content .status-info{display:flex;margin-bottom:.5rem;font-weight:600;font-size:18px;gap:.5rem}.dialog-content .error-info{display:grid;place-items:center}\n"], dependencies: [{ kind: "component", type: DefaultDialogComponent, selector: "lib-default-dialog", inputs: ["temRef", "height", "dialogTitle", "withBack"], outputs: ["back"] }, { kind: "component", type: ErrorDisplayComponent, selector: "lib-error-display", inputs: ["error"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
573
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.5", type: ErrorPopupComponent, isStandalone: true, selector: "lib-error-popup", ngImport: i0, template: "<lib-default-dialog [dialogTitle]=\"'\u0410n error has occurred'\">\n\t<div class=\"dialog-content\">\n\t\t<div class=\"status-info\">\n\t\t\t<div>{{ error.status }}</div>\n\t\t\t@if (error.status) {\n\t\t\t\t<div>{{ httpStatusCodes[error.status] || 500 }}</div>\n\t\t\t}\n\t\t</div>\n\t\t<div class=\"error-info\">\n\t\t\t<lib-error-display [error]=\"error\" />\n\t\t</div>\n\t</div>\n</lib-default-dialog>\n", styles: [".dialog-content{display:flex;flex-direction:column;align-items:center;padding-inline:1rem}.dialog-content .status-info{display:flex;margin-bottom:.5rem;font-weight:600;font-size:18px;gap:.5rem}.dialog-content .error-info{display:grid;place-items:center}\n"], dependencies: [{ kind: "component", type: DefaultDialogComponent, selector: "lib-default-dialog", inputs: ["temRef", "height", "dialogTitle", "withBack"], outputs: ["back"] }, { kind: "component", type: ErrorDisplayComponent, selector: "lib-error-display", inputs: ["error"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
539
574
  }
540
575
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: ErrorPopupComponent, decorators: [{
541
576
  type: Component,
542
- args: [{ selector: 'lib-error-popup', imports: [
543
- DefaultDialogComponent,
544
- ErrorDisplayComponent
545
- ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<lib-default-dialog [dialogTitle]=\"'\u0410n error has occurred'\">\r\n <div class=\"dialog-content\">\r\n <div class=\"status-info\">\r\n <div>{{ error.status }}</div>\r\n @if (error.status) {\r\n <div>{{ httpStatusCodes[error.status] || 500 }}</div>\r\n }\r\n </div>\r\n <div class=\"error-info\">\r\n <lib-error-display [error]=\"error\" />\r\n </div>\r\n </div>\r\n</lib-default-dialog>", styles: [".dialog-content{display:flex;flex-direction:column;align-items:center;padding-inline:1rem}.dialog-content .status-info{display:flex;margin-bottom:.5rem;font-weight:600;font-size:18px;gap:.5rem}.dialog-content .error-info{display:grid;place-items:center}\n"] }]
577
+ args: [{ selector: 'lib-error-popup', imports: [DefaultDialogComponent, ErrorDisplayComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: "<lib-default-dialog [dialogTitle]=\"'\u0410n error has occurred'\">\n\t<div class=\"dialog-content\">\n\t\t<div class=\"status-info\">\n\t\t\t<div>{{ error.status }}</div>\n\t\t\t@if (error.status) {\n\t\t\t\t<div>{{ httpStatusCodes[error.status] || 500 }}</div>\n\t\t\t}\n\t\t</div>\n\t\t<div class=\"error-info\">\n\t\t\t<lib-error-display [error]=\"error\" />\n\t\t</div>\n\t</div>\n</lib-default-dialog>\n", styles: [".dialog-content{display:flex;flex-direction:column;align-items:center;padding-inline:1rem}.dialog-content .status-info{display:flex;margin-bottom:.5rem;font-weight:600;font-size:18px;gap:.5rem}.dialog-content .error-info{display:grid;place-items:center}\n"] }]
546
578
  }] });
547
579
 
548
580
  class ErrorHandlerComponent {
@@ -572,9 +604,7 @@ class ErrorHandlerComponent {
572
604
  }
573
605
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: ErrorHandlerComponent, decorators: [{
574
606
  type: Component,
575
- args: [{ selector: 'lib-error-handler', imports: [
576
- MatDialogModule
577
- ], changeDetection: ChangeDetectionStrategy.OnPush, template: "" }]
607
+ args: [{ selector: 'lib-error-handler', imports: [MatDialogModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "" }]
578
608
  }], ctorParameters: () => [] });
579
609
 
580
610
  /*
@@ -1 +1 @@
1
- {"version":3,"file":"ferhaps-easy-ui-lib.mjs","sources":["../../../projects/ui-lib/src/lib/pipes/snake-case-parser.pipe.ts","../../../projects/ui-lib/src/lib/directives/fields-match-validator.directive.ts","../../../projects/ui-lib/src/lib/directives/phone-validation.directive.ts","../../../projects/ui-lib/src/lib/directives/password-validator.directive.ts","../../../projects/ui-lib/src/lib/components/default-dialog/default-dialog.component.ts","../../../projects/ui-lib/src/lib/components/default-dialog/default-dialog.component.html","../../../projects/ui-lib/src/lib/components/error-display.component.ts","../../../projects/ui-lib/src/lib/components/search-bar.component.ts","../../../projects/ui-lib/src/lib/components/table-sort-header/table-sort-header.component.ts","../../../projects/ui-lib/src/lib/components/table-sort-header/table-sort-header.component.html","../../../projects/ui-lib/src/lib/components/table/table.component.ts","../../../projects/ui-lib/src/lib/components/table/table.component.html","../../../projects/ui-lib/src/lib/services/loader.service.ts","../../../projects/ui-lib/src/lib/components/global-loader/global-loader.component.ts","../../../projects/ui-lib/src/lib/components/global-loader/global-loader.component.html","../../../projects/ui-lib/src/lib/services/error.service.ts","../../../projects/ui-lib/src/lib/utils/utils.ts","../../../projects/ui-lib/src/lib/components/error-handler/error-popup/error-popup.component.ts","../../../projects/ui-lib/src/lib/components/error-handler/error-popup/error-popup.component.html","../../../projects/ui-lib/src/lib/components/error-handler/error-handler.component.ts","../../../projects/ui-lib/src/lib/components/error-handler/error-handler.component.html","../../../projects/ui-lib/src/public-api.ts","../../../projects/ui-lib/src/ferhaps-easy-ui-lib.ts"],"sourcesContent":["import { Pipe, PipeTransform } from '@angular/core';\r\n\r\n@Pipe({\r\n name: 'snakeCaseParser',\r\n})\r\nexport class SnakeCaseParserPipe implements PipeTransform {\r\n public transform(value: unknown): string {\r\n if (typeof value === 'string') {\r\n let temp = value.replaceAll('_', ' ');\r\n temp = temp.charAt(0).toUpperCase() + temp.slice(1).toLowerCase();\r\n return temp;\r\n }\r\n\r\n return String(value);\r\n }\r\n}\r\n","import { Directive, input } from '@angular/core';\r\nimport { AbstractControl, NG_VALIDATORS, ValidationErrors, Validator } from '@angular/forms';\r\n\r\n@Directive({\r\n selector: '[libFieldsMatchValidator]',\r\n providers: [\r\n {\r\n provide: NG_VALIDATORS,\r\n useExisting: FieldsMatchValidatorDirective,\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class FieldsMatchValidatorDirective implements Validator {\r\n public fieldToMatch = input.required<string>();\r\n\r\n public validate(control: AbstractControl): ValidationErrors | null {\r\n const value = control.value;\r\n\r\n if (!value) {\r\n return null;\r\n }\r\n\r\n const matchingControl = control.root.get(this.fieldToMatch());\r\n if (!matchingControl) {\r\n return null;\r\n }\r\n\r\n if (value !== matchingControl.value) {\r\n return { mismatch: true };\r\n }\r\n\r\n return null;\r\n }\r\n}\r\n","import { Directive } from '@angular/core';\r\n\r\n@Directive({\r\n selector: '[libPhoneValidation]',\r\n host: {\r\n '(input)': 'onInput($event)',\r\n '(keydown)': 'onKeyDown($event)'\r\n }\r\n})\r\nexport class PhoneValidationDirective {\r\n public onInput(event: Event) {\r\n const input = event.target as HTMLInputElement;\r\n \r\n if (!input.value.includes('+')) {\r\n input.value = `+${input.value}`;\r\n }\r\n \r\n // Only allow digits and plus sign\r\n const regex = /^[0-9+]*$/;\r\n if (!regex.test(input.value)) {\r\n input.value = input.value.replace(/[^0-9+]/g, '');\r\n }\r\n }\r\n\r\n public onKeyDown(event: KeyboardEvent): void {\r\n const inputValue = (event.target as HTMLInputElement).value;\r\n if (event.key === 'Backspace' && inputValue === '+') {\r\n event.preventDefault();\r\n }\r\n }\r\n}\r\n","import { Directive } from '@angular/core';\r\nimport { AbstractControl, NG_VALIDATORS, ValidationErrors, Validator } from '@angular/forms';\r\n\r\n@Directive({\r\n selector: '[libPasswordValidator]',\r\n providers: [\r\n {\r\n provide: NG_VALIDATORS,\r\n useExisting: PasswordValidatorDirective,\r\n multi: true\r\n }\r\n ]\r\n})\r\nexport class PasswordValidatorDirective implements Validator {\r\n public validate(control: AbstractControl): ValidationErrors | null {\r\n const password = control.value;\r\n\r\n // At least one uppercase letter, one lowercase letter, one digit, one special character, and minimum eight characters long\r\n const pattern = /^(?=.*[A-Z])(?=.*[a-z])(?=.*[!@#\\$%\\^&\\*])(?=.*\\d).{8,}$/\r\n\r\n if (password && !pattern.test(password)) {\r\n return { passwordInvalid: true };\r\n }\r\n\r\n return null;\r\n }\r\n}\r\n","import { ChangeDetectionStrategy, Component, input, output, TemplateRef } from '@angular/core';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatDialogModule } from '@angular/material/dialog';\r\nimport { CommonModule } from '@angular/common';\r\n\r\n@Component({\r\n selector: 'lib-default-dialog',\r\n imports: [\r\n CommonModule,\r\n MatIconModule,\r\n MatDialogModule\r\n ],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n templateUrl: './default-dialog.component.html',\r\n styleUrls: ['./default-dialog.component.scss']\r\n})\r\nexport class DefaultDialogComponent {\r\n public temRef = input<TemplateRef<unknown>>();\r\n \r\n public height = input<string>();\r\n public dialogTitle = input<string>();\r\n public withBack = input<boolean>();\r\n\r\n protected back = output<void>();\r\n}\r\n","<div class=\"modal\" [style]=\"{ 'height': height() }\">\r\n <div class=\"dialog-title\">\r\n @if (withBack()) {\r\n <div class=\"back-arrow\" (click)=\"back.emit()\">\r\n <mat-icon>keyboard_arrow_left</mat-icon>\r\n </div>\r\n }\r\n\r\n <h4 class=\"title\">{{ dialogTitle() }}</h4>\r\n\r\n <div class=\"closer\" mat-dialog-close>\r\n <mat-icon>close</mat-icon>\r\n </div>\r\n </div>\r\n\r\n <div class=\"dialog-content\">\r\n <ng-content select=\".dialog-content\" />\r\n <ng-template #tempBody />\r\n <ng-container *ngTemplateOutlet=\"temRef() ? temRef() : tempBody\" />\r\n </div>\r\n</div>","import { ChangeDetectionStrategy, Component, input, OnInit } from '@angular/core';\r\n\r\nimport { HttpErrorResponse } from '@angular/common/http';\r\nimport { SnakeCaseParserPipe } from '../pipes/snake-case-parser.pipe';\r\nimport { SystemError } from '../utils/types';\r\n\r\n@Component({\r\n selector: 'lib-error-display',\r\n imports: [\r\n SnakeCaseParserPipe\r\n ],\r\n template: `<strong class=\"err-container\">{{ displayError | snakeCaseParser }}</strong>`,\r\n styles: [`\r\n .err-container {\r\n display: block;\r\n max-width: 300px;\r\n font-size: 20px;\r\n text-align: center;\r\n border: 1px solid red;\r\n border-radius: 5px;\r\n padding: 0.5rem 1.5rem;\r\n background-color: #ffe6e6;\r\n color: #ff0000;\r\n overflow-wrap: break-word;\r\n }\r\n`],\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class ErrorDisplayComponent implements OnInit {\r\n public error = input.required<SystemError>();\r\n\r\n protected displayError: string = '';\r\n\r\n public ngOnInit(): void {\r\n if (this.error() instanceof HttpErrorResponse) {\r\n if (typeof (this.error() as HttpErrorResponse).error === 'string') {\r\n this.displayError = (this.error() as HttpErrorResponse).error;\r\n } else if (this.error && (this.error() as HttpErrorResponse)?.error?.message) {\r\n this.displayError = (this.error() as HttpErrorResponse).error.message;\r\n } else {\r\n this.displayError = 'Unknown error';\r\n }\r\n } else if (typeof this.error() === 'string') {\r\n this.displayError = (this.error() as string);\r\n } else {\r\n this.displayError = 'Unknown error';\r\n }\r\n }\r\n}\r\n","import { Component, output, input, ChangeDetectionStrategy } from '@angular/core';\r\nimport { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { debounceTime, distinctUntilChanged } from 'rxjs';\r\n\r\n@Component({\r\n selector: 'lib-search-bar',\r\n template: `\r\n <form class=\"search-bar\" [formGroup]=\"searchForm\">\r\n <mat-icon>search</mat-icon>\r\n <input class=\"search-input\" type=\"search\" name=\"field\"\r\n [placeholder]=\"'Search ' + for()\" autocomplete=\"off\" formControlName=\"search\" />\r\n </form>\r\n`,\r\n styles: [`\r\n .search-bar {\r\n width: 270px;\r\n border: 1px solid #A4A4A4;\r\n display: flex;\r\n align-items: center;\r\n }\r\n\r\n .search-input {\r\n border: none;\r\n padding: 7px 11px;\r\n height: 100%;\r\n width: 100%;\r\n background-color: transparent;\r\n }\r\n\r\n mat-icon {\r\n margin-inline: 8px;\r\n }\r\n\r\n .search-input:focus {\r\n border: none;\r\n outline: none;\r\n }\r\n\r\n @media (max-width: 1086px) {\r\n .search-bar {\r\n width: 170px;\r\n }\r\n }\r\n`],\r\n imports: [\r\n MatIconModule,\r\n ReactiveFormsModule\r\n ],\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class SearchBarComponent {\r\n public for = input.required<string>();\r\n\r\n protected search = output<string | Event>();\r\n\r\n protected searchForm: FormGroup = new FormGroup({\r\n search: new FormControl('')\r\n });\r\n\r\n constructor() {\r\n this.searchForm.get('search')?.valueChanges.\r\n pipe(\r\n debounceTime(1000),\r\n distinctUntilChanged(),\r\n ).subscribe((searchTerm: string | Event) => {\r\n if (typeof searchTerm === 'string') {\r\n searchTerm = searchTerm.trim();\r\n }\r\n \r\n this.search.emit(searchTerm);\r\n });\r\n }\r\n}","import { Component, input, output, ChangeDetectionStrategy } from '@angular/core';\r\nimport { MatIconModule } from '@angular/material/icon';\r\n\r\nexport type SortState = 'none' | 'asc' | 'desc';\r\n\r\n@Component({\r\n selector: 'lib-table-sort-header',\r\n imports: [\r\n MatIconModule,\r\n ],\r\n templateUrl: './table-sort-header.component.html',\r\n styleUrls: ['./table-sort-header.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class TableSortHeaderComponent {\r\n public selected = input.required<boolean>();\r\n public sort = output<SortState>();\r\n\r\n protected sortState: SortState = 'none';\r\n\r\n protected onSortClick(): void {\r\n if (this.sortState === 'none') {\r\n this.sortState = 'desc';\r\n } else if (this.sortState === 'desc') {\r\n this.sortState = 'asc';\r\n } else {\r\n this.sortState = 'none';\r\n }\r\n\r\n this.sort.emit(this.sortState);\r\n }\r\n}\r\n","<div class=\"sorting-container\" (click)=\"onSortClick()\">\r\n <mat-icon\r\n [class.selected]=\"selected() && sortState != 'none'\"\r\n [class.rotated]=\"sortState == 'asc'\">\r\n sort\r\n </mat-icon>\r\n</div>","import { Component, ElementRef, input, output, viewChild, ChangeDetectionStrategy } from '@angular/core';\r\nimport { MatMenuModule } from '@angular/material/menu';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { SortState, TableSortHeaderComponent } from '../table-sort-header/table-sort-header.component';\r\nimport { CdkDragDrop, DragDropModule, moveItemInArray } from \"@angular/cdk/drag-drop\";\r\nimport { MatCheckboxChange, MatCheckboxModule } from '@angular/material/checkbox';\r\n\r\nexport type TableEvent<T = any> = {\r\n action: 'rowClick' | 'rowSelect' | 'drag' | 'scrolled' | 'sort' | 'add' | string;\r\n obj?: T;\r\n prop?: keyof T;\r\n index?: number;\r\n selected?: boolean;\r\n selectedRows?: number[];\r\n sortState?: SortState;\r\n event?: Event;\r\n};\r\n\r\nexport type Config<T = any> = {\r\n data: T[];\r\n title: string;\r\n dataProps: (keyof T)[];\r\n tableHeadings?: string[];\r\n options?: string[] | ((obj: T) => string[]);\r\n withAdd?: boolean;\r\n selectableRows?: 'single' | 'multiple';\r\n sortable?: boolean;\r\n draggable?: boolean;\r\n classRules?: ClassRule<T>[];\r\n};\r\n\r\nexport type ClassRule<T = any> = {\r\n className: string;\r\n condition: (obj: T, prop: keyof T) => boolean;\r\n};\r\n\r\n@Component({\r\n selector: 'lib-table',\r\n templateUrl: 'table.component.html',\r\n styleUrls: ['table.component.scss'],\r\n imports: [\r\n MatMenuModule,\r\n MatIconModule,\r\n MatButtonModule,\r\n TableSortHeaderComponent,\r\n DragDropModule,\r\n MatCheckboxModule\r\n ],\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class TableComponent<T = any> {\r\n public config = input.required<Config<T>>();\r\n\r\n protected action = output<TableEvent<T>>();\r\n\r\n protected scrollContainer = viewChild.required<ElementRef<HTMLDivElement>>('scrollContainer');\r\n\r\n public selectedRowIndex: number = -1;\r\n public selectedIndices: Set<number> = new Set<number>();\r\n protected hoverRowIndex: number = -1;\r\n protected currentSortColumn: number = -1;\r\n\r\n protected getClass(obj: T, prop: keyof T): string {\r\n if (!this.config().classRules) return '';\r\n\r\n const classes: string[] = [];\r\n for (let rule of (this.config().classRules as ClassRule<T>[])) {\r\n if (rule.condition(obj, prop)) {\r\n classes.push(rule.className);\r\n }\r\n }\r\n\r\n return classes.join(' ');\r\n }\r\n\r\n protected drop(event: CdkDragDrop<T[]>) {\r\n if (this.config().draggable) {\r\n moveItemInArray(this.config().data, event.previousIndex, event.currentIndex);\r\n this.action.emit({ action: 'drag', obj: this.config().data[event.currentIndex], index: event.currentIndex });\r\n }\r\n }\r\n\r\n protected onScroll(e: Event): void {\r\n const container = this.scrollContainer().nativeElement;\r\n this.action.emit({ action: 'scroll', event: e });\r\n if ((Math.ceil(container.scrollTop) + container.offsetHeight) >= container.scrollHeight) {\r\n this.action.emit({ action: 'scrolled' });\r\n }\r\n }\r\n\r\n protected onRowClick(event: Event, obj: T, index: number): void {\r\n this.selectedRowIndex = index === this.selectedRowIndex ? -1 : index;\r\n this.action.emit({\r\n action: 'rowClick',\r\n obj,\r\n index,\r\n selected: this.selectedRowIndex === index || this.selectedIndices.has(index),\r\n event\r\n });\r\n }\r\n\r\n protected selectOption(оption: string, obj: T, index: number): void {\r\n this.action.emit({\r\n action: оption.toLowerCase(),\r\n obj,\r\n index,\r\n selected: this.selectedRowIndex === index || this.selectedIndices.has(index)\r\n });\r\n }\r\n\r\n protected areAllRowsSelected(): boolean {\r\n return this.selectedIndices.size === this.config().data.length;\r\n }\r\n\r\n protected toggleSelectAll(event: MatCheckboxChange): void {\r\n if (event.checked) {\r\n this.config().data.forEach((_, index) => this.selectedIndices.add(index));\r\n } else {\r\n this.selectedIndices.clear();\r\n }\r\n\r\n this.action.emit({\r\n action: 'rowSelect',\r\n selectedRows: [...this.selectedIndices]\r\n });\r\n }\r\n\r\n protected toggleRowSelection(index: number): void {\r\n if (this.config().selectableRows === 'multiple') {\r\n if (this.selectedIndices.has(index)) {\r\n this.selectedIndices.delete(index);\r\n } else {\r\n this.selectedIndices.add(index);\r\n }\r\n \r\n this.action.emit({\r\n action: 'rowSelect',\r\n index,\r\n selectedRows: [...this.selectedIndices]\r\n });\r\n }\r\n }\r\n\r\n protected sortByProp(prop: keyof T, sortState: SortState): void {\r\n this.action.emit({ action: 'sort', prop, sortState });\r\n }\r\n\r\n protected getOptionsForRow(obj: T): string[] {\r\n const options = this.config().options;\r\n if (!options) return [];\r\n return typeof options === 'function' ? options(obj) : options;\r\n }\r\n\r\n protected hasOptions(): boolean {\r\n return !!this.config().options;\r\n }\r\n}\r\n","<div class=\"flexer\">\r\n @if (config().title) {\r\n <div class=\"row-heading-labels mb05\">{{ config().title }}</div>\r\n }\r\n\r\n <ng-content select=\".upper-part\" />\r\n\r\n @if (config().withAdd) {\r\n <div class=\"flexer action pointer gap05 mb05\" (click)=\"action.emit({action: 'add'})\">\r\n <mat-icon>add_circle_outline</mat-icon>\r\n <div>add</div>\r\n </div>\r\n }\r\n</div>\r\n\r\n<div class=\"scroll\" #scrollContainer (scroll)=\"onScroll($event)\" [class.with-checkboxes]=\"config().selectableRows === 'multiple'\">\r\n <table [class.with-options]=\"hasOptions()\">\r\n <thead>\r\n @if ((config().tableHeadings || []).length > 0) {\r\n <tr>\r\n @if (config().selectableRows === 'multiple') {\r\n <th class=\"box-cell\">\r\n <mat-checkbox\r\n (change)=\"toggleSelectAll($event)\"\r\n [checked]=\"areAllRowsSelected()\">\r\n </mat-checkbox>\r\n </th>\r\n }\r\n\r\n @for (heading of config().tableHeadings; track heading; let i = $index) {\r\n <th>\r\n <div class=\"flexer gap05\">\r\n {{ heading }}\r\n @if (config().sortable && !config().draggable) {\r\n <lib-table-sort-header\r\n [selected]=\"currentSortColumn === i\"\r\n (click)=\"currentSortColumn = i\"\r\n (sort)=\"sortByProp(config().dataProps[i], $event)\"\r\n />\r\n }\r\n </div>\r\n </th>\r\n }\r\n\r\n @if (hasOptions()) {\r\n <th></th>\r\n }\r\n </tr>\r\n } @else {\r\n <ng-content select=\".custom-headers\" />\r\n }\r\n </thead>\r\n @if (config().draggable) {\r\n <tbody cdkDropList (cdkDropListDropped)=\"drop($event)\">\r\n @for (obj of config().data; let i = $index; track i;) {\r\n <tr\r\n (mouseover)=\"hoverRowIndex = i\"\r\n (mouseleave)=\"hoverRowIndex = -1\"\r\n cdkDrag cdkDragLockAxis=\"y\"\r\n [class.pointer]=\"config().selectableRows\"\r\n [class.hover-row]=\"hoverRowIndex == i\"\r\n [class.selected-row]=\"(config().selectableRows === 'single' && selectedRowIndex == i) ||\r\n (config().selectableRows === 'multiple' && selectedIndices.has(i))\"\r\n (click)=\"onRowClick($event, obj, i)\">\r\n @if (config().selectableRows === 'multiple') {\r\n <td>\r\n <mat-checkbox\r\n (click)=\"$event.stopPropagation()\"\r\n [checked]=\"selectedIndices.has(i)\"\r\n (change)=\"toggleRowSelection(i)\">\r\n </mat-checkbox>\r\n </td>\r\n }\r\n\r\n @for (prop of config().dataProps; track prop; let cellIndex = $index) {\r\n <td\r\n [class.dragCol]=\"cellIndex === 0\">\r\n <div [class]=\"'data ' + getClass(obj, prop)\"\r\n [class.flexer]=\"cellIndex === 0\">\r\n @if (cellIndex === 0) {\r\n <mat-icon class=\"draggable\" cdkDragHandle>\r\n drag_indicator\r\n </mat-icon>\r\n }\r\n {{ obj[prop] || '-' }}\r\n </div>\r\n </td>\r\n }\r\n @if (hasOptions()) {\r\n <td class=\"right-align\" (click)=\"$event.stopPropagation()\">\r\n <button mat-icon-button class=\"pointer dots right\" [matMenuTriggerFor]=\"optionsMenu\">\r\n <mat-icon>more_vert</mat-icon>\r\n </button>\r\n <mat-menu #optionsMenu=\"matMenu\">\r\n @for (option of getOptionsForRow(obj); track option) {\r\n <div\r\n mat-menu-item (click)=\"selectOption(option, obj, i)\"\r\n [class.red]=\"option == 'Remove' || option == 'Delete'\">\r\n {{ option }}\r\n </div>\r\n }\r\n </mat-menu>\r\n </td>\r\n }\r\n </tr>\r\n }\r\n </tbody>\r\n } @else {\r\n <tbody>\r\n @for (obj of config().data; let i = $index; track i;) {\r\n <tr\r\n (mouseover)=\"hoverRowIndex = i\"\r\n (mouseleave)=\"hoverRowIndex = -1\"\r\n [class.pointer]=\"config().selectableRows\"\r\n [class.hover-row]=\"hoverRowIndex == i\"\r\n [class.selected-row]=\"(config().selectableRows === 'single' && selectedRowIndex == i) ||\r\n (config().selectableRows === 'multiple' && selectedIndices.has(i))\"\r\n (click)=\"onRowClick($event, obj, i)\">\r\n @if (config().selectableRows === 'multiple') {\r\n <td>\r\n <mat-checkbox\r\n (click)=\"$event.stopPropagation()\"\r\n [checked]=\"selectedIndices.has(i)\"\r\n (change)=\"toggleRowSelection(i)\">\r\n </mat-checkbox>\r\n </td>\r\n }\r\n\r\n @for (prop of config().dataProps; track prop; let cellIndex = $index) {\r\n <td>\r\n <div [class]=\"'data ' + getClass(obj, prop)\">\r\n {{ obj[prop] || '-' }}\r\n </div>\r\n </td>\r\n }\r\n @if (hasOptions()) {\r\n <td class=\"right-align\" (click)=\"$event.stopPropagation()\">\r\n <button mat-icon-button class=\"pointer dots right\" [matMenuTriggerFor]=\"optionsMenu\">\r\n <mat-icon>more_vert</mat-icon>\r\n </button>\r\n <mat-menu #optionsMenu=\"matMenu\">\r\n @for (option of getOptionsForRow(obj); track option) {\r\n <div\r\n mat-menu-item (click)=\"selectOption(option, obj, i)\"\r\n [class.red]=\"option == 'Remove' || option == 'Delete'\">\r\n {{ option }}\r\n </div>\r\n }\r\n </mat-menu>\r\n </td>\r\n }\r\n </tr>\r\n }\r\n </tbody>\r\n }\r\n </table>\r\n</div>\r\n","import { Injectable } from '@angular/core';\r\nimport { BehaviorSubject } from 'rxjs';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class LoaderService {\r\n private loadingSubject = new BehaviorSubject<boolean>(false);\r\n public loading$ = this.loadingSubject.asObservable();\r\n\r\n public setLoading(loadingState: boolean) {\r\n this.loadingSubject.next(loadingState);\r\n }\r\n\r\n public isLoading(): boolean {\r\n return this.loadingSubject.getValue();\r\n }\r\n}\r\n","import { Component, inject, ChangeDetectionStrategy } from '@angular/core';\r\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\r\nimport { LoaderService } from '../../services/loader.service';\r\nimport { AsyncPipe } from '@angular/common';\r\n\r\n@Component({\r\n selector: 'lib-global-loader',\r\n imports: [\r\n AsyncPipe,\r\n MatProgressSpinnerModule\r\n ],\r\n templateUrl: './global-loader.component.html',\r\n styleUrl: './global-loader.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class GlobalLoaderComponent {\r\n protected loaderService = inject(LoaderService);\r\n}\r\n","@if (loaderService.loading$ | async) {\r\n <div class=\"loader\">\r\n <mat-spinner />\r\n </div>\r\n}","import { HttpErrorResponse } from \"@angular/common/http\";\r\nimport { Injectable } from \"@angular/core\";\r\nimport { Subject } from \"rxjs\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ErrorService {\r\n private errorSubject = new Subject<HttpErrorResponse>();\r\n public error$ = this.errorSubject.asObservable();\r\n\r\n public sendError(error: HttpErrorResponse) {\r\n this.errorSubject.next(error);\r\n }\r\n}\r\n","export const HTTP_STATUS_CODES: Record<number | string, string> = {\r\n 100: 'Continue',\r\n 101: 'Switching Protocols',\r\n 102: 'Processing',\r\n 103: 'Early Hints',\r\n 200: 'OK',\r\n 201: 'Created',\r\n 202: 'Accepted',\r\n 203: 'Non-Authoritative Information',\r\n 204: 'No Content',\r\n 205: 'Reset Content',\r\n 206: 'Partial Content',\r\n 207: 'Multi-Status',\r\n 208: 'Already Reported',\r\n 226: 'IM Used',\r\n 300: 'Multiple Choices',\r\n 301: 'Moved Permanently',\r\n 302: 'Found',\r\n 303: 'See Other',\r\n 304: 'Not Modified',\r\n 305: 'Use Proxy',\r\n 306: '(Unused)',\r\n 307: 'Temporary Redirect',\r\n 308: 'Permanent Redirect',\r\n 400: 'Bad Request',\r\n 401: 'Unauthorized',\r\n 402: 'Payment Required',\r\n 403: 'Forbidden',\r\n 404: 'Not Found',\r\n 405: 'Method Not Allowed',\r\n 406: 'Not Acceptable',\r\n 407: 'Proxy Authentication Required',\r\n 408: 'Request Timeout',\r\n 409: 'Conflict',\r\n 410: 'Gone',\r\n 411: 'Length Required',\r\n 412: 'Precondition Failed',\r\n 413: 'Payload Too Large',\r\n 414: 'URI Too Long',\r\n 415: 'Unsupported Media Type',\r\n 416: 'Range Not Satisfiable',\r\n 417: 'Expectation Failed',\r\n 418: \"I'm a teapot\",\r\n 421: 'Misdirected Request',\r\n 422: 'Unprocessable Entity',\r\n 423: 'Locked',\r\n 424: 'Failed Dependency',\r\n 425: 'Too Early',\r\n 426: 'Upgrade Required',\r\n 428: 'Precondition Required',\r\n 429: 'Too Many Requests',\r\n 431: 'Request Header Fields Too Large',\r\n 451: 'Unavailable For Legal Reasons',\r\n 500: 'Internal Server Error',\r\n 501: 'Not Implemented',\r\n 502: 'Bad Gateway',\r\n 503: 'Service Unavailable',\r\n 504: 'Gateway Timeout',\r\n 505: 'HTTP Version Not Supported',\r\n 506: 'Variant Also Negotiates',\r\n 507: 'Insufficient Storage',\r\n 508: 'Loop Detected',\r\n 510: 'Not Extended',\r\n 511: 'Network Authentication Required'\r\n};\r\n\r\nexport const JSON_HTTP_OPTIONS: Object = {\r\n headers: {\r\n 'Accept': 'application/json',\r\n 'Accept-language': 'bg',\r\n },\r\n responseType: 'json'\r\n};\r\n\r\nexport const STRING_HTTP_OPTIONS: Object = {\r\n responseType: 'text'\r\n};\r\n\r\nexport const BLOB_HTTP_OPTIONS: Object = {\r\n headers: {\r\n 'Content-type': 'application/octet-stream',\r\n 'Accept-language': 'bg',\r\n },\r\n responseType: 'blob',\r\n};\r\n\r\nexport const SKIP_ERROR_OPTIONS: Object = {\r\n headers: {\r\n 'Accept': 'application/json',\r\n 'Accept-language': 'bg',\r\n 'X-Skip-Error': 'true',\r\n },\r\n responseType: 'json',\r\n};\r\n\r\nexport const JSON_OPTIONS_WITH_GLOBAL_LOADER: Object = {\r\n headers: {\r\n 'Accept': 'application/json',\r\n 'Accept-language': 'bg',\r\n 'X-Global-Loader': 'true',\r\n },\r\n responseType: 'json'\r\n};\r\n","import { Component, inject, ChangeDetectionStrategy } from '@angular/core';\r\nimport { MAT_DIALOG_DATA } from '@angular/material/dialog';\r\nimport { HttpErrorResponse } from '@angular/common/http';\r\nimport { DefaultDialogComponent } from '../../default-dialog/default-dialog.component';\r\nimport { ErrorDisplayComponent } from '../../error-display.component';\r\nimport { HTTP_STATUS_CODES } from '../../../utils/utils';\r\n\r\n@Component({\r\n selector: 'lib-error-popup',\r\n imports: [\r\n DefaultDialogComponent,\r\n ErrorDisplayComponent\r\n ],\r\n templateUrl: './error-popup.component.html',\r\n styleUrls: ['./error-popup.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class ErrorPopupComponent {\r\n protected httpStatusCodes = HTTP_STATUS_CODES;\r\n public error = inject<HttpErrorResponse>(MAT_DIALOG_DATA);\r\n}\r\n","<lib-default-dialog [dialogTitle]=\"'Аn error has occurred'\">\r\n <div class=\"dialog-content\">\r\n <div class=\"status-info\">\r\n <div>{{ error.status }}</div>\r\n @if (error.status) {\r\n <div>{{ httpStatusCodes[error.status] || 500 }}</div>\r\n }\r\n </div>\r\n <div class=\"error-info\">\r\n <lib-error-display [error]=\"error\" />\r\n </div>\r\n </div>\r\n</lib-default-dialog>","import { OnDestroy, inject } from '@angular/core';\r\nimport { Subscription } from 'rxjs';\r\nimport { Component, ChangeDetectionStrategy } from '@angular/core';\r\nimport { HttpErrorResponse } from '@angular/common/http';\r\nimport { MatDialog, MatDialogModule } from '@angular/material/dialog';\r\nimport { ErrorPopupComponent } from './error-popup/error-popup.component';\r\nimport { NoopScrollStrategy } from '@angular/cdk/overlay';\r\nimport { ErrorService } from '../../services/error.service';\r\n\r\n@Component({\r\n selector: 'lib-error-handler',\r\n templateUrl: 'error-handler.component.html',\r\n styleUrls: ['error-handler.component.scss'],\r\n imports: [\r\n MatDialogModule\r\n ],\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class ErrorHandlerComponent implements OnDestroy {\r\n private errSubscriptions = new Subscription();\r\n private errorService = inject(ErrorService);\r\n private dialog = inject(MatDialog);\r\n\r\n constructor() {\r\n this.errSubscriptions.add(\r\n this.errorService.error$.subscribe((err: HttpErrorResponse) => {\r\n console.log(err);\r\n this.showPopup(err);\r\n })\r\n );\r\n }\r\n\r\n private showPopup(error: HttpErrorResponse): void {\r\n this.dialog.closeAll();\r\n this.dialog.open(ErrorPopupComponent, {\r\n data: error,\r\n width: '400px',\r\n autoFocus: false,\r\n scrollStrategy: new NoopScrollStrategy(),\r\n });\r\n }\r\n\r\n public ngOnDestroy(): void {\r\n this.errSubscriptions.unsubscribe();\r\n }\r\n}\r\n","","/*\r\n * Public API Surface of ui-lib\r\n */\r\n\r\nexport * from './lib/pipes/snake-case-parser.pipe';\r\nexport * from './lib/directives/fields-match-validator.directive';\r\nexport * from './lib/directives/phone-validation.directive';\r\nexport * from './lib/directives/password-validator.directive';\r\nexport * from './lib/components/default-dialog/default-dialog.component';\r\nexport * from './lib/components/error-display.component';\r\nexport * from './lib/components/search-bar.component';\r\nexport * from './lib/utils/types';\r\nexport * from './lib/components/table-sort-header/table-sort-header.component';\r\nexport * from './lib/components/table/table.component';\r\nexport * from './lib/components/global-loader/global-loader.component';\r\nexport * from './lib/services/loader.service';\r\nexport * from './lib/services/error.service';\r\nexport * from './lib/components/error-handler/error-handler.component';","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i2","i3"],"mappings":"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"}
1
+ {"version":3,"file":"ferhaps-easy-ui-lib.mjs","sources":["../../../projects/ui-lib/src/lib/pipes/snake-case-parser.pipe.ts","../../../projects/ui-lib/src/lib/directives/fields-match-validator.directive.ts","../../../projects/ui-lib/src/lib/directives/phone-validation.directive.ts","../../../projects/ui-lib/src/lib/directives/password-validator.directive.ts","../../../projects/ui-lib/src/lib/components/default-dialog/default-dialog.component.ts","../../../projects/ui-lib/src/lib/components/default-dialog/default-dialog.component.html","../../../projects/ui-lib/src/lib/components/error-display.component.ts","../../../projects/ui-lib/src/lib/components/search-bar.component.ts","../../../projects/ui-lib/src/lib/components/table-sort-header/table-sort-header.component.ts","../../../projects/ui-lib/src/lib/components/table-sort-header/table-sort-header.component.html","../../../projects/ui-lib/src/lib/components/table/table.component.ts","../../../projects/ui-lib/src/lib/components/table/table.component.html","../../../projects/ui-lib/src/lib/services/loader.service.ts","../../../projects/ui-lib/src/lib/components/global-loader/global-loader.component.ts","../../../projects/ui-lib/src/lib/components/global-loader/global-loader.component.html","../../../projects/ui-lib/src/lib/services/error.service.ts","../../../projects/ui-lib/src/lib/utils/utils.ts","../../../projects/ui-lib/src/lib/components/error-handler/error-popup/error-popup.component.ts","../../../projects/ui-lib/src/lib/components/error-handler/error-popup/error-popup.component.html","../../../projects/ui-lib/src/lib/components/error-handler/error-handler.component.ts","../../../projects/ui-lib/src/lib/components/error-handler/error-handler.component.html","../../../projects/ui-lib/src/public-api.ts","../../../projects/ui-lib/src/ferhaps-easy-ui-lib.ts"],"sourcesContent":["import { Pipe, PipeTransform } from '@angular/core';\n\n@Pipe({\n\tname: 'snakeCaseParser',\n})\nexport class SnakeCaseParserPipe implements PipeTransform {\n\tpublic transform(value: unknown): string {\n\t\tif (typeof value === 'string') {\n\t\t\tlet temp = value.replaceAll('_', ' ');\n\t\t\ttemp = temp.charAt(0).toUpperCase() + temp.slice(1).toLowerCase();\n\t\t\treturn temp;\n\t\t}\n\n\t\treturn String(value);\n\t}\n}\n","import { Directive, input } from '@angular/core';\nimport {\n\tAbstractControl,\n\tNG_VALIDATORS,\n\tValidationErrors,\n\tValidator,\n} from '@angular/forms';\n\n@Directive({\n\tselector: '[libFieldsMatchValidator]',\n\tproviders: [\n\t\t{\n\t\t\tprovide: NG_VALIDATORS,\n\t\t\tuseExisting: FieldsMatchValidatorDirective,\n\t\t\tmulti: true,\n\t\t},\n\t],\n})\nexport class FieldsMatchValidatorDirective implements Validator {\n\tpublic fieldToMatch = input.required<string>();\n\n\tpublic validate(control: AbstractControl): ValidationErrors | null {\n\t\tconst value = control.value;\n\n\t\tif (!value) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst matchingControl = control.root.get(this.fieldToMatch());\n\t\tif (!matchingControl) {\n\t\t\treturn null;\n\t\t}\n\n\t\tif (value !== matchingControl.value) {\n\t\t\treturn { mismatch: true };\n\t\t}\n\n\t\treturn null;\n\t}\n}\n","import { Directive } from '@angular/core';\n\n@Directive({\n\tselector: '[libPhoneValidation]',\n\thost: {\n\t\t'(input)': 'onInput($event)',\n\t\t'(keydown)': 'onKeyDown($event)',\n\t},\n})\nexport class PhoneValidationDirective {\n\tpublic onInput(event: Event) {\n\t\tconst input = event.target as HTMLInputElement;\n\n\t\tif (!input.value.includes('+')) {\n\t\t\tinput.value = `+${input.value}`;\n\t\t}\n\n\t\t// Only allow digits and plus sign\n\t\tconst regex = /^[0-9+]*$/;\n\t\tif (!regex.test(input.value)) {\n\t\t\tinput.value = input.value.replace(/[^0-9+]/g, '');\n\t\t}\n\t}\n\n\tpublic onKeyDown(event: KeyboardEvent): void {\n\t\tconst inputValue = (event.target as HTMLInputElement).value;\n\t\tif (event.key === 'Backspace' && inputValue === '+') {\n\t\t\tevent.preventDefault();\n\t\t}\n\t}\n}\n","import { Directive } from '@angular/core';\nimport {\n\tAbstractControl,\n\tNG_VALIDATORS,\n\tValidationErrors,\n\tValidator,\n} from '@angular/forms';\n\n@Directive({\n\tselector: '[libPasswordValidator]',\n\tproviders: [\n\t\t{\n\t\t\tprovide: NG_VALIDATORS,\n\t\t\tuseExisting: PasswordValidatorDirective,\n\t\t\tmulti: true,\n\t\t},\n\t],\n})\nexport class PasswordValidatorDirective implements Validator {\n\tpublic validate(control: AbstractControl): ValidationErrors | null {\n\t\tconst password = control.value;\n\n\t\t// At least one uppercase letter, one lowercase letter, one digit, one special character, and minimum eight characters long\n\t\tconst pattern = /^(?=.*[A-Z])(?=.*[a-z])(?=.*[!@#\\$%\\^&\\*])(?=.*\\d).{8,}$/;\n\n\t\tif (password && !pattern.test(password)) {\n\t\t\treturn { passwordInvalid: true };\n\t\t}\n\n\t\treturn null;\n\t}\n}\n","import {\n\tChangeDetectionStrategy,\n\tComponent,\n\tinput,\n\toutput,\n\tTemplateRef,\n} from '@angular/core';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatDialogModule } from '@angular/material/dialog';\nimport { CommonModule } from '@angular/common';\n\n@Component({\n\tselector: 'lib-default-dialog',\n\timports: [CommonModule, MatIconModule, MatDialogModule],\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\ttemplateUrl: './default-dialog.component.html',\n\tstyleUrls: ['./default-dialog.component.scss'],\n})\nexport class DefaultDialogComponent {\n\tpublic temRef = input<TemplateRef<unknown>>();\n\n\tpublic height = input<string>();\n\tpublic dialogTitle = input<string>();\n\tpublic withBack = input<boolean>();\n\n\tprotected back = output<void>();\n}\n","<div class=\"modal\" [style]=\"{ height: height() }\">\n\t<div class=\"dialog-title\">\n\t\t@if (withBack()) {\n\t\t\t<div class=\"back-arrow\" (click)=\"back.emit()\">\n\t\t\t\t<mat-icon>keyboard_arrow_left</mat-icon>\n\t\t\t</div>\n\t\t}\n\n\t\t<h4 class=\"title\">{{ dialogTitle() }}</h4>\n\n\t\t<div class=\"closer\" mat-dialog-close>\n\t\t\t<mat-icon>close</mat-icon>\n\t\t</div>\n\t</div>\n\n\t<div class=\"dialog-content\">\n\t\t<ng-content select=\".dialog-content\" />\n\t\t<ng-template #tempBody />\n\t\t<ng-container *ngTemplateOutlet=\"temRef() ? temRef() : tempBody\" />\n\t</div>\n</div>\n","import {\n\tChangeDetectionStrategy,\n\tComponent,\n\tinput,\n\tOnInit,\n} from '@angular/core';\n\nimport { HttpErrorResponse } from '@angular/common/http';\nimport { SnakeCaseParserPipe } from '../pipes/snake-case-parser.pipe';\nimport { SystemError } from '../utils/types';\n\n@Component({\n\tselector: 'lib-error-display',\n\timports: [SnakeCaseParserPipe],\n\ttemplate: `<strong class=\"err-container\">{{\n\t\tdisplayError | snakeCaseParser\n\t}}</strong>`,\n\tstyles: [\n\t\t`\n\t\t\t.err-container {\n\t\t\t\tdisplay: block;\n\t\t\t\tmax-width: 300px;\n\t\t\t\tfont-size: 20px;\n\t\t\t\ttext-align: center;\n\t\t\t\tborder: 1px solid red;\n\t\t\t\tborder-radius: 5px;\n\t\t\t\tpadding: 0.5rem 1.5rem;\n\t\t\t\tbackground-color: #ffe6e6;\n\t\t\t\tcolor: #ff0000;\n\t\t\t\toverflow-wrap: break-word;\n\t\t\t}\n\t\t`,\n\t],\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ErrorDisplayComponent implements OnInit {\n\tpublic error = input.required<SystemError>();\n\n\tprotected displayError: string = '';\n\n\tpublic ngOnInit(): void {\n\t\tif (this.error() instanceof HttpErrorResponse) {\n\t\t\tif (typeof (this.error() as HttpErrorResponse).error === 'string') {\n\t\t\t\tthis.displayError = (this.error() as HttpErrorResponse).error;\n\t\t\t} else if (\n\t\t\t\tthis.error &&\n\t\t\t\t(this.error() as HttpErrorResponse)?.error?.message\n\t\t\t) {\n\t\t\t\tthis.displayError = (this.error() as HttpErrorResponse).error.message;\n\t\t\t} else {\n\t\t\t\tthis.displayError = 'Unknown error';\n\t\t\t}\n\t\t} else if (typeof this.error() === 'string') {\n\t\t\tthis.displayError = this.error() as string;\n\t\t} else {\n\t\t\tthis.displayError = 'Unknown error';\n\t\t}\n\t}\n}\n","import {\n\tComponent,\n\toutput,\n\tinput,\n\tChangeDetectionStrategy,\n\tforwardRef,\n} from '@angular/core';\nimport {\n\tControlValueAccessor,\n\tFormControl,\n\tFormGroup,\n\tNG_VALUE_ACCESSOR,\n\tReactiveFormsModule,\n} from '@angular/forms';\nimport { MatIconModule } from '@angular/material/icon';\nimport { debounceTime, distinctUntilChanged } from 'rxjs';\n\n@Component({\n\tselector: 'lib-search-bar',\n\ttemplate: `\n\t\t<form class=\"search-bar\" [formGroup]=\"searchForm\">\n\t\t\t<mat-icon>search</mat-icon>\n\t\t\t<input\n\t\t\t\tclass=\"search-input\"\n\t\t\t\ttype=\"search\"\n\t\t\t\tname=\"field\"\n\t\t\t\t[placeholder]=\"'Search ' + for()\"\n\t\t\t\tautocomplete=\"off\"\n\t\t\t\tformControlName=\"search\"\n\t\t\t/>\n\t\t</form>\n\t`,\n\tstyles: [\n\t\t`\n\t\t\t.search-bar {\n\t\t\t\twidth: 270px;\n\t\t\t\tborder: 1px solid #a4a4a4;\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t}\n\n\t\t\t.search-input {\n\t\t\t\tborder: none;\n\t\t\t\tpadding: 7px 11px;\n\t\t\t\theight: 100%;\n\t\t\t\twidth: 100%;\n\t\t\t\tbackground-color: transparent;\n\t\t\t}\n\n\t\t\tmat-icon {\n\t\t\t\tmargin-inline: 8px;\n\t\t\t}\n\n\t\t\t.search-input:focus {\n\t\t\t\tborder: none;\n\t\t\t\toutline: none;\n\t\t\t}\n\n\t\t\t@media (max-width: 1086px) {\n\t\t\t\t.search-bar {\n\t\t\t\t\twidth: 170px;\n\t\t\t\t}\n\t\t\t}\n\t\t`,\n\t],\n\timports: [MatIconModule, ReactiveFormsModule],\n\tproviders: [\n\t\t{\n\t\t\tprovide: NG_VALUE_ACCESSOR,\n\t\t\tuseExisting: forwardRef(() => SearchBarComponent),\n\t\t\tmulti: true,\n\t\t},\n\t],\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SearchBarComponent implements ControlValueAccessor {\n\tpublic for = input.required<string>();\n\n\tprotected search = output<string | Event>();\n\n\tprotected searchForm: FormGroup = new FormGroup({\n\t\tsearch: new FormControl(''),\n\t});\n\n\tprivate onChange: (value: string) => void = () => { };\n\tprivate onTouched: () => void = () => { };\n\n\tconstructor() {\n\t\tthis.searchForm\n\t\t\t.get('search')\n\t\t\t?.valueChanges.pipe(debounceTime(1000), distinctUntilChanged())\n\t\t\t.subscribe((term: string) => {\n\t\t\t\tconst trimmed = term.trim();\n\t\t\t\tthis.onChange(trimmed); // notifies parent form control\n\t\t\t\tthis.search.emit(trimmed); // existing output still works\n\t\t\t});\n\t}\n\n\twriteValue(value: string): void {\n\t\tthis.searchForm.get('search')?.setValue(value ?? '', { emitEvent: false });\n\t}\n\n\tregisterOnChange(fn: (value: string) => void): void {\n\t\tthis.onChange = fn;\n\t}\n\tregisterOnTouched(fn: () => void): void {\n\t\tthis.onTouched = fn;\n\t}\n\tsetDisabledState(isDisabled: boolean): void {\n\t\tisDisabled ? this.searchForm.disable() : this.searchForm.enable();\n\t}\n}\n","import {\n\tComponent,\n\tinput,\n\toutput,\n\tChangeDetectionStrategy,\n} from '@angular/core';\nimport { MatIconModule } from '@angular/material/icon';\n\nexport type SortState = 'none' | 'asc' | 'desc';\n\n@Component({\n\tselector: 'lib-table-sort-header',\n\timports: [MatIconModule],\n\ttemplateUrl: './table-sort-header.component.html',\n\tstyleUrls: ['./table-sort-header.component.scss'],\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TableSortHeaderComponent {\n\tpublic selected = input.required<boolean>();\n\tpublic sort = output<SortState>();\n\n\tprotected sortState: SortState = 'none';\n\n\tprotected onSortClick(): void {\n\t\tif (this.sortState === 'none') {\n\t\t\tthis.sortState = 'desc';\n\t\t} else if (this.sortState === 'desc') {\n\t\t\tthis.sortState = 'asc';\n\t\t} else {\n\t\t\tthis.sortState = 'none';\n\t\t}\n\n\t\tthis.sort.emit(this.sortState);\n\t}\n}\n","<div class=\"sorting-container\" (click)=\"onSortClick()\">\n\t<mat-icon\n\t\t[class.selected]=\"selected() && sortState != 'none'\"\n\t\t[class.rotated]=\"sortState == 'asc'\"\n\t>\n\t\tsort\n\t</mat-icon>\n</div>\n","import {\n\tComponent,\n\tElementRef,\n\tinput,\n\toutput,\n\tviewChild,\n\tChangeDetectionStrategy,\n} from '@angular/core';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatButtonModule } from '@angular/material/button';\nimport {\n\tSortState,\n\tTableSortHeaderComponent,\n} from '../table-sort-header/table-sort-header.component';\nimport {\n\tCdkDragDrop,\n\tDragDropModule,\n\tmoveItemInArray,\n} from '@angular/cdk/drag-drop';\nimport {\n\tMatCheckboxChange,\n\tMatCheckboxModule,\n} from '@angular/material/checkbox';\n\nexport type TableEvent<T = any> = {\n\taction:\n\t\t| 'rowClick'\n\t\t| 'rowSelect'\n\t\t| 'drag'\n\t\t| 'scrolled'\n\t\t| 'sort'\n\t\t| 'add'\n\t\t| string;\n\tobj?: T;\n\tprop?: keyof T;\n\tindex?: number;\n\tselected?: boolean;\n\tselectedRows?: number[];\n\tsortState?: SortState;\n\tevent?: Event;\n};\n\nexport type Config<T = any> = {\n\tdata: T[];\n\ttitle: string;\n\tdataProps: (keyof T)[];\n\ttableHeadings?: string[];\n\toptions?: string[] | ((obj: T) => string[]);\n\twithAdd?: boolean;\n\tselectableRows?: 'single' | 'multiple';\n\tsortable?: boolean;\n\tdraggable?: boolean;\n\tclassRules?: ClassRule<T>[];\n};\n\nexport type ClassRule<T = any> = {\n\tclassName: string;\n\tcondition: (obj: T, prop: keyof T) => boolean;\n};\n\n@Component({\n\tselector: 'lib-table',\n\ttemplateUrl: 'table.component.html',\n\tstyleUrls: ['table.component.scss'],\n\timports: [\n\t\tMatMenuModule,\n\t\tMatIconModule,\n\t\tMatButtonModule,\n\t\tTableSortHeaderComponent,\n\t\tDragDropModule,\n\t\tMatCheckboxModule,\n\t],\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TableComponent<T = any> {\n\tpublic config = input.required<Config<T>>();\n\n\tprotected action = output<TableEvent<T>>();\n\n\tprotected scrollContainer =\n\t\tviewChild.required<ElementRef<HTMLDivElement>>('scrollContainer');\n\n\tpublic selectedRowIndex: number = -1;\n\tpublic selectedIndices: Set<number> = new Set<number>();\n\tprotected hoverRowIndex: number = -1;\n\tprotected currentSortColumn: number = -1;\n\n\tprotected getClass(obj: T, prop: keyof T): string {\n\t\tif (!this.config().classRules) return '';\n\n\t\tconst classes: string[] = [];\n\t\tfor (let rule of this.config().classRules as ClassRule<T>[]) {\n\t\t\tif (rule.condition(obj, prop)) {\n\t\t\t\tclasses.push(rule.className);\n\t\t\t}\n\t\t}\n\n\t\treturn classes.join(' ');\n\t}\n\n\tprotected drop(event: CdkDragDrop<T[]>) {\n\t\tif (this.config().draggable) {\n\t\t\tmoveItemInArray(\n\t\t\t\tthis.config().data,\n\t\t\t\tevent.previousIndex,\n\t\t\t\tevent.currentIndex,\n\t\t\t);\n\t\t\tthis.action.emit({\n\t\t\t\taction: 'drag',\n\t\t\t\tobj: this.config().data[event.currentIndex],\n\t\t\t\tindex: event.currentIndex,\n\t\t\t});\n\t\t}\n\t}\n\n\tprotected onScroll(e: Event): void {\n\t\tconst container = this.scrollContainer().nativeElement;\n\t\tthis.action.emit({ action: 'scroll', event: e });\n\t\tif (\n\t\t\tMath.ceil(container.scrollTop) + container.offsetHeight >=\n\t\t\tcontainer.scrollHeight\n\t\t) {\n\t\t\tthis.action.emit({ action: 'scrolled' });\n\t\t}\n\t}\n\n\tprotected onRowClick(event: Event, obj: T, index: number): void {\n\t\tthis.selectedRowIndex = index === this.selectedRowIndex ? -1 : index;\n\t\tthis.action.emit({\n\t\t\taction: 'rowClick',\n\t\t\tobj,\n\t\t\tindex,\n\t\t\tselected:\n\t\t\t\tthis.selectedRowIndex === index || this.selectedIndices.has(index),\n\t\t\tevent,\n\t\t});\n\t}\n\n\tprotected selectOption(оption: string, obj: T, index: number): void {\n\t\tthis.action.emit({\n\t\t\taction: оption.toLowerCase(),\n\t\t\tobj,\n\t\t\tindex,\n\t\t\tselected:\n\t\t\t\tthis.selectedRowIndex === index || this.selectedIndices.has(index),\n\t\t});\n\t}\n\n\tprotected areAllRowsSelected(): boolean {\n\t\treturn this.selectedIndices.size === this.config().data.length;\n\t}\n\n\tprotected toggleSelectAll(event: MatCheckboxChange): void {\n\t\tif (event.checked) {\n\t\t\tthis.config().data.forEach((_, index) => this.selectedIndices.add(index));\n\t\t} else {\n\t\t\tthis.selectedIndices.clear();\n\t\t}\n\n\t\tthis.action.emit({\n\t\t\taction: 'rowSelect',\n\t\t\tselectedRows: [...this.selectedIndices],\n\t\t});\n\t}\n\n\tprotected toggleRowSelection(index: number): void {\n\t\tif (this.config().selectableRows === 'multiple') {\n\t\t\tif (this.selectedIndices.has(index)) {\n\t\t\t\tthis.selectedIndices.delete(index);\n\t\t\t} else {\n\t\t\t\tthis.selectedIndices.add(index);\n\t\t\t}\n\n\t\t\tthis.action.emit({\n\t\t\t\taction: 'rowSelect',\n\t\t\t\tindex,\n\t\t\t\tselectedRows: [...this.selectedIndices],\n\t\t\t});\n\t\t}\n\t}\n\n\tprotected sortByProp(prop: keyof T, sortState: SortState): void {\n\t\tthis.action.emit({ action: 'sort', prop, sortState });\n\t}\n\n\tprotected getOptionsForRow(obj: T): string[] {\n\t\tconst options = this.config().options;\n\t\tif (!options) return [];\n\t\treturn typeof options === 'function' ? options(obj) : options;\n\t}\n\n\tprotected hasOptions(): boolean {\n\t\treturn !!this.config().options;\n\t}\n}\n","<div class=\"flexer\">\n\t@if (config().title) {\n\t\t<div class=\"row-heading-labels mb05\">{{ config().title }}</div>\n\t}\n\n\t<ng-content select=\".upper-part\" />\n\n\t@if (config().withAdd) {\n\t\t<div\n\t\t\tclass=\"flexer action pointer gap05 mb05\"\n\t\t\t(click)=\"action.emit({ action: 'add' })\"\n\t\t>\n\t\t\t<mat-icon>add_circle_outline</mat-icon>\n\t\t\t<div>add</div>\n\t\t</div>\n\t}\n</div>\n\n<div\n\tclass=\"scroll\"\n\t#scrollContainer\n\t(scroll)=\"onScroll($event)\"\n\t[class.with-checkboxes]=\"config().selectableRows === 'multiple'\"\n>\n\t<table [class.with-options]=\"hasOptions()\">\n\t\t<thead>\n\t\t\t@if ((config().tableHeadings || []).length > 0) {\n\t\t\t\t<tr>\n\t\t\t\t\t@if (config().selectableRows === \"multiple\") {\n\t\t\t\t\t\t<th class=\"box-cell\">\n\t\t\t\t\t\t\t<mat-checkbox\n\t\t\t\t\t\t\t\t(change)=\"toggleSelectAll($event)\"\n\t\t\t\t\t\t\t\t[checked]=\"areAllRowsSelected()\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t</mat-checkbox>\n\t\t\t\t\t\t</th>\n\t\t\t\t\t}\n\n\t\t\t\t\t@for (\n\t\t\t\t\t\theading of config().tableHeadings;\n\t\t\t\t\t\ttrack heading;\n\t\t\t\t\t\tlet i = $index\n\t\t\t\t\t) {\n\t\t\t\t\t\t<th>\n\t\t\t\t\t\t\t<div class=\"flexer gap05\">\n\t\t\t\t\t\t\t\t{{ heading }}\n\t\t\t\t\t\t\t\t@if (config().sortable && !config().draggable) {\n\t\t\t\t\t\t\t\t\t<lib-table-sort-header\n\t\t\t\t\t\t\t\t\t\t[selected]=\"currentSortColumn === i\"\n\t\t\t\t\t\t\t\t\t\t(click)=\"currentSortColumn = i\"\n\t\t\t\t\t\t\t\t\t\t(sort)=\"sortByProp(config().dataProps[i], $event)\"\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</th>\n\t\t\t\t\t}\n\n\t\t\t\t\t@if (hasOptions()) {\n\t\t\t\t\t\t<th></th>\n\t\t\t\t\t}\n\t\t\t\t</tr>\n\t\t\t} @else {\n\t\t\t\t<ng-content select=\".custom-headers\" />\n\t\t\t}\n\t\t</thead>\n\t\t@if (config().draggable) {\n\t\t\t<tbody cdkDropList (cdkDropListDropped)=\"drop($event)\">\n\t\t\t\t@for (obj of config().data; let i = $index; track i) {\n\t\t\t\t\t<tr\n\t\t\t\t\t\t(mouseover)=\"hoverRowIndex = i\"\n\t\t\t\t\t\t(mouseleave)=\"hoverRowIndex = -1\"\n\t\t\t\t\t\tcdkDrag\n\t\t\t\t\t\tcdkDragLockAxis=\"y\"\n\t\t\t\t\t\t[class.pointer]=\"config().selectableRows\"\n\t\t\t\t\t\t[class.hover-row]=\"hoverRowIndex == i\"\n\t\t\t\t\t\t[class.selected-row]=\"\n\t\t\t\t\t\t\t(config().selectableRows === 'single' && selectedRowIndex == i) ||\n\t\t\t\t\t\t\t(config().selectableRows === 'multiple' && selectedIndices.has(i))\n\t\t\t\t\t\t\"\n\t\t\t\t\t\t(click)=\"onRowClick($event, obj, i)\"\n\t\t\t\t\t>\n\t\t\t\t\t\t@if (config().selectableRows === \"multiple\") {\n\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t<mat-checkbox\n\t\t\t\t\t\t\t\t\t(click)=\"$event.stopPropagation()\"\n\t\t\t\t\t\t\t\t\t[checked]=\"selectedIndices.has(i)\"\n\t\t\t\t\t\t\t\t\t(change)=\"toggleRowSelection(i)\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t</mat-checkbox>\n\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t@for (\n\t\t\t\t\t\t\tprop of config().dataProps;\n\t\t\t\t\t\t\ttrack prop;\n\t\t\t\t\t\t\tlet cellIndex = $index\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t<td [class.dragCol]=\"cellIndex === 0\">\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t[class]=\"getClass(obj, prop)\"\n\t\t\t\t\t\t\t\t\t[class.flexer]=\"cellIndex === 0\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t@if (cellIndex === 0) {\n\t\t\t\t\t\t\t\t\t\t<mat-icon class=\"draggable\" cdkDragHandle>\n\t\t\t\t\t\t\t\t\t\t\tdrag_indicator\n\t\t\t\t\t\t\t\t\t\t</mat-icon>\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t{{ obj[prop] || \"-\" }}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t}\n\t\t\t\t\t\t@if (hasOptions()) {\n\t\t\t\t\t\t\t<td class=\"right-align\" (click)=\"$event.stopPropagation()\">\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\tmat-icon-button\n\t\t\t\t\t\t\t\t\tclass=\"pointer dots right\"\n\t\t\t\t\t\t\t\t\t[matMenuTriggerFor]=\"optionsMenu\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<mat-icon>more_vert</mat-icon>\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t<mat-menu #optionsMenu=\"matMenu\">\n\t\t\t\t\t\t\t\t\t@for (option of getOptionsForRow(obj); track option) {\n\t\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\t\tmat-menu-item\n\t\t\t\t\t\t\t\t\t\t\t(click)=\"selectOption(option, obj, i)\"\n\t\t\t\t\t\t\t\t\t\t\t[class.red]=\"option == 'Remove' || option == 'Delete'\"\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t{{ option }}\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t</mat-menu>\n\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t}\n\t\t\t\t\t</tr>\n\t\t\t\t}\n\t\t\t</tbody>\n\t\t} @else {\n\t\t\t<tbody>\n\t\t\t\t@for (obj of config().data; let i = $index; track i) {\n\t\t\t\t\t<tr\n\t\t\t\t\t\t(mouseover)=\"hoverRowIndex = i\"\n\t\t\t\t\t\t(mouseleave)=\"hoverRowIndex = -1\"\n\t\t\t\t\t\t[class.pointer]=\"config().selectableRows\"\n\t\t\t\t\t\t[class.hover-row]=\"hoverRowIndex == i\"\n\t\t\t\t\t\t[class.selected-row]=\"\n\t\t\t\t\t\t\t(config().selectableRows === 'single' && selectedRowIndex == i) ||\n\t\t\t\t\t\t\t(config().selectableRows === 'multiple' && selectedIndices.has(i))\n\t\t\t\t\t\t\"\n\t\t\t\t\t\t(click)=\"onRowClick($event, obj, i)\"\n\t\t\t\t\t>\n\t\t\t\t\t\t@if (config().selectableRows === \"multiple\") {\n\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t<mat-checkbox\n\t\t\t\t\t\t\t\t\t(click)=\"$event.stopPropagation()\"\n\t\t\t\t\t\t\t\t\t[checked]=\"selectedIndices.has(i)\"\n\t\t\t\t\t\t\t\t\t(change)=\"toggleRowSelection(i)\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t</mat-checkbox>\n\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t@for (\n\t\t\t\t\t\t\tprop of config().dataProps;\n\t\t\t\t\t\t\ttrack prop;\n\t\t\t\t\t\t\tlet cellIndex = $index\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t<div [class]=\"getClass(obj, prop)\">\n\t\t\t\t\t\t\t\t\t{{ obj[prop] || \"-\" }}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t}\n\t\t\t\t\t\t@if (hasOptions()) {\n\t\t\t\t\t\t\t<td class=\"right-align\" (click)=\"$event.stopPropagation()\">\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\tmat-icon-button\n\t\t\t\t\t\t\t\t\tclass=\"pointer dots right\"\n\t\t\t\t\t\t\t\t\t[matMenuTriggerFor]=\"optionsMenu\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<mat-icon>more_vert</mat-icon>\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t<mat-menu #optionsMenu=\"matMenu\">\n\t\t\t\t\t\t\t\t\t@for (option of getOptionsForRow(obj); track option) {\n\t\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\t\tmat-menu-item\n\t\t\t\t\t\t\t\t\t\t\t(click)=\"selectOption(option, obj, i)\"\n\t\t\t\t\t\t\t\t\t\t\t[class.red]=\"option == 'Remove' || option == 'Delete'\"\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t{{ option }}\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t</mat-menu>\n\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t}\n\t\t\t\t\t</tr>\n\t\t\t\t}\n\t\t\t</tbody>\n\t\t}\n\t</table>\n</div>\n","import { Injectable } from '@angular/core';\nimport { BehaviorSubject } from 'rxjs';\n\n@Injectable({\n\tprovidedIn: 'root',\n})\nexport class LoaderService {\n\tprivate loadingSubject = new BehaviorSubject<boolean>(false);\n\tpublic loading$ = this.loadingSubject.asObservable();\n\n\tpublic setLoading(loadingState: boolean) {\n\t\tthis.loadingSubject.next(loadingState);\n\t}\n\n\tpublic isLoading(): boolean {\n\t\treturn this.loadingSubject.getValue();\n\t}\n}\n","import { Component, inject, ChangeDetectionStrategy } from '@angular/core';\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\nimport { LoaderService } from '../../services/loader.service';\nimport { AsyncPipe } from '@angular/common';\n\n@Component({\n\tselector: 'lib-global-loader',\n\timports: [AsyncPipe, MatProgressSpinnerModule],\n\ttemplateUrl: './global-loader.component.html',\n\tstyleUrl: './global-loader.component.scss',\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class GlobalLoaderComponent {\n\tprotected loaderService = inject(LoaderService);\n}\n","@if (loaderService.loading$ | async) {\n\t<div class=\"loader\">\n\t\t<mat-spinner />\n\t</div>\n}\n","import { HttpErrorResponse } from '@angular/common/http';\nimport { Injectable } from '@angular/core';\nimport { Subject } from 'rxjs';\n\n@Injectable({\n\tprovidedIn: 'root',\n})\nexport class ErrorService {\n\tprivate errorSubject = new Subject<HttpErrorResponse>();\n\tpublic error$ = this.errorSubject.asObservable();\n\n\tpublic sendError(error: HttpErrorResponse) {\n\t\tthis.errorSubject.next(error);\n\t}\n}\n","export const HTTP_STATUS_CODES: Record<number | string, string> = {\n\t100: 'Continue',\n\t101: 'Switching Protocols',\n\t102: 'Processing',\n\t103: 'Early Hints',\n\t200: 'OK',\n\t201: 'Created',\n\t202: 'Accepted',\n\t203: 'Non-Authoritative Information',\n\t204: 'No Content',\n\t205: 'Reset Content',\n\t206: 'Partial Content',\n\t207: 'Multi-Status',\n\t208: 'Already Reported',\n\t226: 'IM Used',\n\t300: 'Multiple Choices',\n\t301: 'Moved Permanently',\n\t302: 'Found',\n\t303: 'See Other',\n\t304: 'Not Modified',\n\t305: 'Use Proxy',\n\t306: '(Unused)',\n\t307: 'Temporary Redirect',\n\t308: 'Permanent Redirect',\n\t400: 'Bad Request',\n\t401: 'Unauthorized',\n\t402: 'Payment Required',\n\t403: 'Forbidden',\n\t404: 'Not Found',\n\t405: 'Method Not Allowed',\n\t406: 'Not Acceptable',\n\t407: 'Proxy Authentication Required',\n\t408: 'Request Timeout',\n\t409: 'Conflict',\n\t410: 'Gone',\n\t411: 'Length Required',\n\t412: 'Precondition Failed',\n\t413: 'Payload Too Large',\n\t414: 'URI Too Long',\n\t415: 'Unsupported Media Type',\n\t416: 'Range Not Satisfiable',\n\t417: 'Expectation Failed',\n\t418: \"I'm a teapot\",\n\t421: 'Misdirected Request',\n\t422: 'Unprocessable Entity',\n\t423: 'Locked',\n\t424: 'Failed Dependency',\n\t425: 'Too Early',\n\t426: 'Upgrade Required',\n\t428: 'Precondition Required',\n\t429: 'Too Many Requests',\n\t431: 'Request Header Fields Too Large',\n\t451: 'Unavailable For Legal Reasons',\n\t500: 'Internal Server Error',\n\t501: 'Not Implemented',\n\t502: 'Bad Gateway',\n\t503: 'Service Unavailable',\n\t504: 'Gateway Timeout',\n\t505: 'HTTP Version Not Supported',\n\t506: 'Variant Also Negotiates',\n\t507: 'Insufficient Storage',\n\t508: 'Loop Detected',\n\t510: 'Not Extended',\n\t511: 'Network Authentication Required',\n};\n\nexport const JSON_HTTP_OPTIONS: Object = {\n\theaders: {\n\t\tAccept: 'application/json',\n\t\t'Accept-language': 'bg',\n\t},\n\tresponseType: 'json',\n};\n\nexport const STRING_HTTP_OPTIONS: Object = {\n\tresponseType: 'text',\n};\n\nexport const BLOB_HTTP_OPTIONS: Object = {\n\theaders: {\n\t\t'Content-type': 'application/octet-stream',\n\t\t'Accept-language': 'bg',\n\t},\n\tresponseType: 'blob',\n};\n\nexport const SKIP_ERROR_OPTIONS: Object = {\n\theaders: {\n\t\tAccept: 'application/json',\n\t\t'Accept-language': 'bg',\n\t\t'X-Skip-Error': 'true',\n\t},\n\tresponseType: 'json',\n};\n\nexport const JSON_OPTIONS_WITH_GLOBAL_LOADER: Object = {\n\theaders: {\n\t\tAccept: 'application/json',\n\t\t'Accept-language': 'bg',\n\t\t'X-Global-Loader': 'true',\n\t},\n\tresponseType: 'json',\n};\n","import { Component, inject, ChangeDetectionStrategy } from '@angular/core';\nimport { MAT_DIALOG_DATA } from '@angular/material/dialog';\nimport { HttpErrorResponse } from '@angular/common/http';\nimport { DefaultDialogComponent } from '../../default-dialog/default-dialog.component';\nimport { ErrorDisplayComponent } from '../../error-display.component';\nimport { HTTP_STATUS_CODES } from '../../../utils/utils';\n\n@Component({\n\tselector: 'lib-error-popup',\n\timports: [DefaultDialogComponent, ErrorDisplayComponent],\n\ttemplateUrl: './error-popup.component.html',\n\tstyleUrls: ['./error-popup.component.scss'],\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ErrorPopupComponent {\n\tprotected httpStatusCodes = HTTP_STATUS_CODES;\n\tpublic error = inject<HttpErrorResponse>(MAT_DIALOG_DATA);\n}\n","<lib-default-dialog [dialogTitle]=\"'Аn error has occurred'\">\n\t<div class=\"dialog-content\">\n\t\t<div class=\"status-info\">\n\t\t\t<div>{{ error.status }}</div>\n\t\t\t@if (error.status) {\n\t\t\t\t<div>{{ httpStatusCodes[error.status] || 500 }}</div>\n\t\t\t}\n\t\t</div>\n\t\t<div class=\"error-info\">\n\t\t\t<lib-error-display [error]=\"error\" />\n\t\t</div>\n\t</div>\n</lib-default-dialog>\n","import { OnDestroy, inject } from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport { Component, ChangeDetectionStrategy } from '@angular/core';\nimport { HttpErrorResponse } from '@angular/common/http';\nimport { MatDialog, MatDialogModule } from '@angular/material/dialog';\nimport { ErrorPopupComponent } from './error-popup/error-popup.component';\nimport { NoopScrollStrategy } from '@angular/cdk/overlay';\nimport { ErrorService } from '../../services/error.service';\n\n@Component({\n\tselector: 'lib-error-handler',\n\ttemplateUrl: 'error-handler.component.html',\n\tstyleUrls: ['error-handler.component.scss'],\n\timports: [MatDialogModule],\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ErrorHandlerComponent implements OnDestroy {\n\tprivate errSubscriptions = new Subscription();\n\tprivate errorService = inject(ErrorService);\n\tprivate dialog = inject(MatDialog);\n\n\tconstructor() {\n\t\tthis.errSubscriptions.add(\n\t\t\tthis.errorService.error$.subscribe((err: HttpErrorResponse) => {\n\t\t\t\tconsole.log(err);\n\t\t\t\tthis.showPopup(err);\n\t\t\t}),\n\t\t);\n\t}\n\n\tprivate showPopup(error: HttpErrorResponse): void {\n\t\tthis.dialog.closeAll();\n\t\tthis.dialog.open(ErrorPopupComponent, {\n\t\t\tdata: error,\n\t\t\twidth: '400px',\n\t\t\tautoFocus: false,\n\t\t\tscrollStrategy: new NoopScrollStrategy(),\n\t\t});\n\t}\n\n\tpublic ngOnDestroy(): void {\n\t\tthis.errSubscriptions.unsubscribe();\n\t}\n}\n","","/*\n * Public API Surface of ui-lib\n */\n\nexport * from './lib/pipes/snake-case-parser.pipe';\nexport * from './lib/directives/fields-match-validator.directive';\nexport * from './lib/directives/phone-validation.directive';\nexport * from './lib/directives/password-validator.directive';\nexport * from './lib/components/default-dialog/default-dialog.component';\nexport * from './lib/components/error-display.component';\nexport * from './lib/components/search-bar.component';\nexport * from './lib/utils/types';\nexport * from './lib/components/table-sort-header/table-sort-header.component';\nexport * from './lib/components/table/table.component';\nexport * from './lib/components/global-loader/global-loader.component';\nexport * from './lib/services/loader.service';\nexport * from './lib/services/error.service';\nexport * from './lib/components/error-handler/error-handler.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i2","i3"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ferhaps/easy-ui-lib",
3
- "version": "21.0.8",
3
+ "version": "21.0.9",
4
4
  "description": "Angular UI components, directives and pipes library with Angular Material",
5
5
  "keywords": [
6
6
  "angular",
@@ -21,10 +21,10 @@
21
21
  "url": "https://github.com/Ferhaps/angular-ui-library"
22
22
  },
23
23
  "peerDependencies": {
24
+ "@angular/cdk": "^21.2.3",
24
25
  "@angular/common": "^21.2.5",
25
26
  "@angular/core": "^21.2.5",
26
- "@angular/material": "^21.2.3",
27
- "@angular/cdk": "^21.2.3"
27
+ "@angular/material": "^21.2.3"
28
28
  },
29
29
  "dependencies": {
30
30
  "tslib": "^2.3.0"
@@ -1,6 +1,6 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { PipeTransform, TemplateRef, OnInit, ElementRef, OnDestroy } from '@angular/core';
3
- import { Validator, AbstractControl, ValidationErrors, FormGroup } from '@angular/forms';
3
+ import { Validator, AbstractControl, ValidationErrors, ControlValueAccessor, FormGroup } from '@angular/forms';
4
4
  import { HttpErrorResponse } from '@angular/common/http';
5
5
  import { CdkDragDrop } from '@angular/cdk/drag-drop';
6
6
  import { MatCheckboxChange } from '@angular/material/checkbox';
@@ -52,11 +52,17 @@ declare class ErrorDisplayComponent implements OnInit {
52
52
  static ɵcmp: i0.ɵɵComponentDeclaration<ErrorDisplayComponent, "lib-error-display", never, { "error": { "alias": "error"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
53
53
  }
54
54
 
55
- declare class SearchBarComponent {
55
+ declare class SearchBarComponent implements ControlValueAccessor {
56
56
  for: i0.InputSignal<string>;
57
57
  protected search: i0.OutputEmitterRef<string | Event>;
58
58
  protected searchForm: FormGroup;
59
+ private onChange;
60
+ private onTouched;
59
61
  constructor();
62
+ writeValue(value: string): void;
63
+ registerOnChange(fn: (value: string) => void): void;
64
+ registerOnTouched(fn: () => void): void;
65
+ setDisabledState(isDisabled: boolean): void;
60
66
  static ɵfac: i0.ɵɵFactoryDeclaration<SearchBarComponent, never>;
61
67
  static ɵcmp: i0.ɵɵComponentDeclaration<SearchBarComponent, "lib-search-bar", never, { "for": { "alias": "for"; "required": true; "isSignal": true; }; }, { "search": "search"; }, never, never, true, never>;
62
68
  }