@ferhaps/easy-ui-lib 21.0.7 → 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,14 +1,13 @@
1
1
  import * as i0 from '@angular/core';
2
- import { Pipe, input, Directive, HostListener, output, Input, Component, viewChild, Injectable, inject, 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';
8
8
  import { MatDialogModule, MAT_DIALOG_DATA, MatDialog } from '@angular/material/dialog';
9
9
  import * as i1 from '@angular/common';
10
10
  import { CommonModule, AsyncPipe } from '@angular/common';
11
- import * as i1$4 from '@angular/common/http';
12
11
  import { HttpErrorResponse } from '@angular/common/http';
13
12
  import { debounceTime, distinctUntilChanged, BehaviorSubject, Subject, Subscription } from 'rxjs';
14
13
  import * as i1$2 from '@angular/material/menu';
@@ -108,14 +107,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImpor
108
107
  type: Directive,
109
108
  args: [{
110
109
  selector: '[libPhoneValidation]',
110
+ host: {
111
+ '(input)': 'onInput($event)',
112
+ '(keydown)': 'onKeyDown($event)',
113
+ },
111
114
  }]
112
- }], propDecorators: { onInput: [{
113
- type: HostListener,
114
- args: ['input', ['$event']]
115
- }], onKeyDown: [{
116
- type: HostListener,
117
- args: ['keydown', ['$event']]
118
- }] } });
115
+ }] });
119
116
 
120
117
  class PasswordValidatorDirective {
121
118
  validate(control) {
@@ -132,8 +129,8 @@ class PasswordValidatorDirective {
132
129
  {
133
130
  provide: NG_VALIDATORS,
134
131
  useExisting: PasswordValidatorDirective,
135
- multi: true
136
- }
132
+ multi: true,
133
+ },
137
134
  ], ngImport: i0 }); }
138
135
  }
139
136
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: PasswordValidatorDirective, decorators: [{
@@ -144,32 +141,27 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImpor
144
141
  {
145
142
  provide: NG_VALIDATORS,
146
143
  useExisting: PasswordValidatorDirective,
147
- multi: true
148
- }
149
- ]
144
+ multi: true,
145
+ },
146
+ ],
150
147
  }]
151
148
  }] });
152
149
 
153
150
  class DefaultDialogComponent {
154
151
  constructor() {
152
+ this.temRef = input(...(ngDevMode ? [undefined, { debugName: "temRef" }] : /* istanbul ignore next */ []));
155
153
  this.height = input(...(ngDevMode ? [undefined, { debugName: "height" }] : /* istanbul ignore next */ []));
156
154
  this.dialogTitle = input(...(ngDevMode ? [undefined, { debugName: "dialogTitle" }] : /* istanbul ignore next */ []));
157
155
  this.withBack = input(...(ngDevMode ? [undefined, { debugName: "withBack" }] : /* istanbul ignore next */ []));
158
156
  this.back = output();
159
157
  }
160
158
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: DefaultDialogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
161
- 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: false, 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"] }] }); }
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 }); }
162
160
  }
163
161
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: DefaultDialogComponent, decorators: [{
164
162
  type: Component,
165
- args: [{ selector: 'lib-default-dialog', imports: [
166
- CommonModule,
167
- MatIconModule,
168
- MatDialogModule
169
- ], 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"] }]
170
- }], propDecorators: { temRef: [{
171
- type: Input
172
- }], 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"] }] } });
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"] }]
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"] }] } });
173
165
 
174
166
  class ErrorDisplayComponent {
175
167
  constructor() {
@@ -181,7 +173,8 @@ class ErrorDisplayComponent {
181
173
  if (typeof this.error().error === 'string') {
182
174
  this.displayError = this.error().error;
183
175
  }
184
- else if (this.error && this.error()?.error?.message) {
176
+ else if (this.error &&
177
+ this.error()?.error?.message) {
185
178
  this.displayError = this.error().error.message;
186
179
  }
187
180
  else {
@@ -196,13 +189,15 @@ class ErrorDisplayComponent {
196
189
  }
197
190
  }
198
191
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: ErrorDisplayComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
199
- 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" }] }); }
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 }); }
200
195
  }
201
196
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: ErrorDisplayComponent, decorators: [{
202
197
  type: Component,
203
- args: [{ selector: 'lib-error-display', imports: [
204
- SnakeCaseParserPipe
205
- ], template: `<strong class="err-container">{{ displayError | snakeCaseParser }}</strong>`, 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"] }]
206
201
  }], propDecorators: { error: [{ type: i0.Input, args: [{ isSignal: true, alias: "error", required: true }] }] } });
207
202
 
208
203
  class SearchBarComponent {
@@ -210,37 +205,73 @@ class SearchBarComponent {
210
205
  this.for = input.required(...(ngDevMode ? [{ debugName: "for" }] : /* istanbul ignore next */ []));
211
206
  this.search = output();
212
207
  this.searchForm = new FormGroup({
213
- search: new FormControl('')
208
+ search: new FormControl(''),
214
209
  });
215
- this.searchForm.get('search')?.valueChanges.
216
- pipe(debounceTime(1000), distinctUntilChanged()).subscribe((searchTerm) => {
217
- if (typeof searchTerm === 'string') {
218
- searchTerm = searchTerm.trim();
219
- }
220
- 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
221
219
  });
222
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
+ }
223
233
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: SearchBarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
224
- 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: `
225
- <form class="search-bar" [formGroup]="searchForm">
226
- <mat-icon>search</mat-icon>
227
- <input class="search-input" type="search" name="field"
228
- [placeholder]="'Search ' + for()" autocomplete="off" formControlName="search" />
229
- </form>
230
- `, 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"] }] }); }
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 }); }
231
253
  }
232
254
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: SearchBarComponent, decorators: [{
233
255
  type: Component,
234
- args: [{ selector: 'lib-search-bar', template: `
235
- <form class="search-bar" [formGroup]="searchForm">
236
- <mat-icon>search</mat-icon>
237
- <input class="search-input" type="search" name="field"
238
- [placeholder]="'Search ' + for()" autocomplete="off" formControlName="search" />
239
- </form>
240
- `, imports: [
241
- MatIconModule,
242
- ReactiveFormsModule
243
- ], 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"] }]
244
275
  }], ctorParameters: () => [], propDecorators: { for: [{ type: i0.Input, args: [{ isSignal: true, alias: "for", required: true }] }], search: [{ type: i0.Output, args: ["search"] }] } });
245
276
 
246
277
  class TableSortHeaderComponent {
@@ -262,13 +293,11 @@ class TableSortHeaderComponent {
262
293
  this.sort.emit(this.sortState);
263
294
  }
264
295
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: TableSortHeaderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
265
- 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"] }] }); }
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 }); }
266
297
  }
267
298
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: TableSortHeaderComponent, decorators: [{
268
299
  type: Component,
269
- args: [{ selector: 'lib-table-sort-header', imports: [
270
- MatIconModule,
271
- ], 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"] }]
272
301
  }], propDecorators: { selected: [{ type: i0.Input, args: [{ isSignal: true, alias: "selected", required: true }] }], sort: [{ type: i0.Output, args: ["sort"] }] } });
273
302
 
274
303
  class TableComponent {
@@ -295,13 +324,18 @@ class TableComponent {
295
324
  drop(event) {
296
325
  if (this.config().draggable) {
297
326
  moveItemInArray(this.config().data, event.previousIndex, event.currentIndex);
298
- 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
+ });
299
332
  }
300
333
  }
301
334
  onScroll(e) {
302
335
  const container = this.scrollContainer().nativeElement;
303
336
  this.action.emit({ action: 'scroll', event: e });
304
- if ((Math.ceil(container.scrollTop) + container.offsetHeight) >= container.scrollHeight) {
337
+ if (Math.ceil(container.scrollTop) + container.offsetHeight >=
338
+ container.scrollHeight) {
305
339
  this.action.emit({ action: 'scrolled' });
306
340
  }
307
341
  }
@@ -312,7 +346,7 @@ class TableComponent {
312
346
  obj,
313
347
  index,
314
348
  selected: this.selectedRowIndex === index || this.selectedIndices.has(index),
315
- event
349
+ event,
316
350
  });
317
351
  }
318
352
  selectOption(оption, obj, index) {
@@ -320,7 +354,7 @@ class TableComponent {
320
354
  action: оption.toLowerCase(),
321
355
  obj,
322
356
  index,
323
- selected: this.selectedRowIndex === index || this.selectedIndices.has(index)
357
+ selected: this.selectedRowIndex === index || this.selectedIndices.has(index),
324
358
  });
325
359
  }
326
360
  areAllRowsSelected() {
@@ -335,7 +369,7 @@ class TableComponent {
335
369
  }
336
370
  this.action.emit({
337
371
  action: 'rowSelect',
338
- selectedRows: [...this.selectedIndices]
372
+ selectedRows: [...this.selectedIndices],
339
373
  });
340
374
  }
341
375
  toggleRowSelection(index) {
@@ -349,7 +383,7 @@ class TableComponent {
349
383
  this.action.emit({
350
384
  action: 'rowSelect',
351
385
  index,
352
- selectedRows: [...this.selectedIndices]
386
+ selectedRows: [...this.selectedIndices],
353
387
  });
354
388
  }
355
389
  }
@@ -366,7 +400,7 @@ class TableComponent {
366
400
  return !!this.config().options;
367
401
  }
368
402
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: TableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
369
- 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\" [classList]=\"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\" [classList]=\"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"] }] }); }
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 }); }
370
404
  }
371
405
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: TableComponent, decorators: [{
372
406
  type: Component,
@@ -376,8 +410,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImpor
376
410
  MatButtonModule,
377
411
  TableSortHeaderComponent,
378
412
  DragDropModule,
379
- MatCheckboxModule
380
- ], 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\" [classList]=\"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\" [classList]=\"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"] }]
381
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 }] }] } });
382
416
 
383
417
  class LoaderService {
@@ -397,7 +431,7 @@ class LoaderService {
397
431
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: LoaderService, decorators: [{
398
432
  type: Injectable,
399
433
  args: [{
400
- providedIn: 'root'
434
+ providedIn: 'root',
401
435
  }]
402
436
  }] });
403
437
 
@@ -406,14 +440,11 @@ class GlobalLoaderComponent {
406
440
  this.loaderService = inject(LoaderService);
407
441
  }
408
442
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: GlobalLoaderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
409
- 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" }] }); }
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 }); }
410
444
  }
411
445
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: GlobalLoaderComponent, decorators: [{
412
446
  type: Component,
413
- args: [{ selector: 'lib-global-loader', imports: [
414
- AsyncPipe,
415
- MatProgressSpinnerModule
416
- ], 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"] }]
417
448
  }] });
418
449
 
419
450
  class ErrorService {
@@ -430,7 +461,7 @@ class ErrorService {
430
461
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: ErrorService, decorators: [{
431
462
  type: Injectable,
432
463
  args: [{
433
- providedIn: 'root'
464
+ providedIn: 'root',
434
465
  }]
435
466
  }] });
436
467
 
@@ -497,17 +528,17 @@ const HTTP_STATUS_CODES = {
497
528
  507: 'Insufficient Storage',
498
529
  508: 'Loop Detected',
499
530
  510: 'Not Extended',
500
- 511: 'Network Authentication Required'
531
+ 511: 'Network Authentication Required',
501
532
  };
502
533
  const JSON_HTTP_OPTIONS = {
503
534
  headers: {
504
- 'Accept': 'application/json',
535
+ Accept: 'application/json',
505
536
  'Accept-language': 'bg',
506
537
  },
507
- responseType: 'json'
538
+ responseType: 'json',
508
539
  };
509
540
  const STRING_HTTP_OPTIONS = {
510
- responseType: 'text'
541
+ responseType: 'text',
511
542
  };
512
543
  const BLOB_HTTP_OPTIONS = {
513
544
  headers: {
@@ -518,7 +549,7 @@ const BLOB_HTTP_OPTIONS = {
518
549
  };
519
550
  const SKIP_ERROR_OPTIONS = {
520
551
  headers: {
521
- 'Accept': 'application/json',
552
+ Accept: 'application/json',
522
553
  'Accept-language': 'bg',
523
554
  'X-Skip-Error': 'true',
524
555
  },
@@ -526,31 +557,25 @@ const SKIP_ERROR_OPTIONS = {
526
557
  };
527
558
  const JSON_OPTIONS_WITH_GLOBAL_LOADER = {
528
559
  headers: {
529
- 'Accept': 'application/json',
560
+ Accept: 'application/json',
530
561
  'Accept-language': 'bg',
531
562
  'X-Global-Loader': 'true',
532
563
  },
533
- responseType: 'json'
564
+ responseType: 'json',
534
565
  };
535
566
 
536
567
  class ErrorPopupComponent {
537
- constructor(error) {
538
- this.error = error;
568
+ constructor() {
539
569
  this.httpStatusCodes = HTTP_STATUS_CODES;
570
+ this.error = inject(MAT_DIALOG_DATA);
540
571
  }
541
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: ErrorPopupComponent, deps: [{ token: MAT_DIALOG_DATA }], target: i0.ɵɵFactoryTarget.Component }); }
542
- 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"] }] }); }
572
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: ErrorPopupComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
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 }); }
543
574
  }
544
575
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: ErrorPopupComponent, decorators: [{
545
576
  type: Component,
546
- args: [{ selector: 'lib-error-popup', imports: [
547
- DefaultDialogComponent,
548
- ErrorDisplayComponent
549
- ], 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"] }]
550
- }], ctorParameters: () => [{ type: i1$4.HttpErrorResponse, decorators: [{
551
- type: Inject,
552
- args: [MAT_DIALOG_DATA]
553
- }] }] });
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"] }]
578
+ }] });
554
579
 
555
580
  class ErrorHandlerComponent {
556
581
  constructor() {
@@ -575,13 +600,11 @@ class ErrorHandlerComponent {
575
600
  this.errSubscriptions.unsubscribe();
576
601
  }
577
602
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: ErrorHandlerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
578
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.5", type: ErrorHandlerComponent, isStandalone: true, selector: "lib-error-handler", ngImport: i0, template: "", styles: [""], dependencies: [{ kind: "ngmodule", type: MatDialogModule }] }); }
603
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.5", type: ErrorHandlerComponent, isStandalone: true, selector: "lib-error-handler", ngImport: i0, template: "", styles: [""], dependencies: [{ kind: "ngmodule", type: MatDialogModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
579
604
  }
580
605
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: ErrorHandlerComponent, decorators: [{
581
606
  type: Component,
582
- args: [{ selector: 'lib-error-handler', imports: [
583
- MatDialogModule
584
- ], template: "" }]
607
+ args: [{ selector: 'lib-error-handler', imports: [MatDialogModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "" }]
585
608
  }], ctorParameters: () => [] });
586
609
 
587
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, 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): { [key: string]: any } | 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, HostListener } from '@angular/core';\r\n\r\n@Directive({\r\n selector: '[libPhoneValidation]',\r\n})\r\nexport class PhoneValidationDirective {\r\n @HostListener('input', ['$event']) 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 @HostListener('keydown', ['$event']) 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 { Component, Input, 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 templateUrl: './default-dialog.component.html',\r\n styleUrls: ['./default-dialog.component.scss']\r\n})\r\nexport class DefaultDialogComponent {\r\n @Input() temRef!: TemplateRef<any>;\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 { 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})\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 } 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})\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 } 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})\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 } 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})\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\" [classList]=\"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\" [classList]=\"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 } 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})\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 } 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})\r\nexport class ErrorPopupComponent {\r\n protected httpStatusCodes = HTTP_STATUS_CODES;\r\n \r\n constructor(@Inject(MAT_DIALOG_DATA) public error: HttpErrorResponse) { }\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 } 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})\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.7",
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';
@@ -14,9 +14,7 @@ declare class SnakeCaseParserPipe implements PipeTransform {
14
14
 
15
15
  declare class FieldsMatchValidatorDirective implements Validator {
16
16
  fieldToMatch: i0.InputSignal<string>;
17
- validate(control: AbstractControl): {
18
- [key: string]: any;
19
- } | null;
17
+ validate(control: AbstractControl): ValidationErrors | null;
20
18
  static ɵfac: i0.ɵɵFactoryDeclaration<FieldsMatchValidatorDirective, never>;
21
19
  static ɵdir: i0.ɵɵDirectiveDeclaration<FieldsMatchValidatorDirective, "[libFieldsMatchValidator]", never, { "fieldToMatch": { "alias": "fieldToMatch"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
22
20
  }
@@ -35,13 +33,13 @@ declare class PasswordValidatorDirective implements Validator {
35
33
  }
36
34
 
37
35
  declare class DefaultDialogComponent {
38
- temRef: TemplateRef<any>;
36
+ temRef: i0.InputSignal<TemplateRef<unknown> | undefined>;
39
37
  height: i0.InputSignal<string | undefined>;
40
38
  dialogTitle: i0.InputSignal<string | undefined>;
41
39
  withBack: i0.InputSignal<boolean | undefined>;
42
40
  protected back: i0.OutputEmitterRef<void>;
43
41
  static ɵfac: i0.ɵɵFactoryDeclaration<DefaultDialogComponent, never>;
44
- static ɵcmp: i0.ɵɵComponentDeclaration<DefaultDialogComponent, "lib-default-dialog", never, { "temRef": { "alias": "temRef"; "required": false; }; "height": { "alias": "height"; "required": false; "isSignal": true; }; "dialogTitle": { "alias": "dialogTitle"; "required": false; "isSignal": true; }; "withBack": { "alias": "withBack"; "required": false; "isSignal": true; }; }, { "back": "back"; }, never, [".dialog-content"], true, never>;
42
+ static ɵcmp: i0.ɵɵComponentDeclaration<DefaultDialogComponent, "lib-default-dialog", never, { "temRef": { "alias": "temRef"; "required": false; "isSignal": true; }; "height": { "alias": "height"; "required": false; "isSignal": true; }; "dialogTitle": { "alias": "dialogTitle"; "required": false; "isSignal": true; }; "withBack": { "alias": "withBack"; "required": false; "isSignal": true; }; }, { "back": "back"; }, never, [".dialog-content"], true, never>;
45
43
  }
46
44
 
47
45
  type SystemError = HttpErrorResponse | string | undefined;
@@ -54,11 +52,17 @@ declare class ErrorDisplayComponent implements OnInit {
54
52
  static ɵcmp: i0.ɵɵComponentDeclaration<ErrorDisplayComponent, "lib-error-display", never, { "error": { "alias": "error"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
55
53
  }
56
54
 
57
- declare class SearchBarComponent {
55
+ declare class SearchBarComponent implements ControlValueAccessor {
58
56
  for: i0.InputSignal<string>;
59
57
  protected search: i0.OutputEmitterRef<string | Event>;
60
58
  protected searchForm: FormGroup;
59
+ private onChange;
60
+ private onTouched;
61
61
  constructor();
62
+ writeValue(value: string): void;
63
+ registerOnChange(fn: (value: string) => void): void;
64
+ registerOnTouched(fn: () => void): void;
65
+ setDisabledState(isDisabled: boolean): void;
62
66
  static ɵfac: i0.ɵɵFactoryDeclaration<SearchBarComponent, never>;
63
67
  static ɵcmp: i0.ɵɵComponentDeclaration<SearchBarComponent, "lib-search-bar", never, { "for": { "alias": "for"; "required": true; "isSignal": true; }; }, { "search": "search"; }, never, never, true, never>;
64
68
  }