@verisoft/ui-core 20.1.1 → 20.1.2
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/fesm2022/verisoft-ui-core.mjs +2026 -0
- package/fesm2022/verisoft-ui-core.mjs.map +1 -0
- package/index.d.ts +1126 -0
- package/package.json +18 -6
- package/.eslintrc.json +0 -48
- package/jest.config.ts +0 -21
- package/ng-package.json +0 -11
- package/project.json +0 -36
- package/src/index.ts +0 -6
- package/src/lib/common/angular-helper.ts +0 -44
- package/src/lib/common/constants.ts +0 -5
- package/src/lib/common/control.models.ts +0 -80
- package/src/lib/common/datasource-component.model.spec.ts +0 -42
- package/src/lib/common/datasource-component.model.ts +0 -43
- package/src/lib/common/deactivate-guard.model.ts +0 -5
- package/src/lib/common/download-file.ts +0 -20
- package/src/lib/common/filter.ts +0 -7
- package/src/lib/common/icons.ts +0 -34
- package/src/lib/common/index.ts +0 -10
- package/src/lib/common/notificable-property.model.ts +0 -5
- package/src/lib/common/rxjs.spec.ts +0 -58
- package/src/lib/common/rxjs.ts +0 -21
- package/src/lib/components/action-button-group/action-button-group.model.ts +0 -15
- package/src/lib/components/action-button-group/action-button.model.ts +0 -15
- package/src/lib/components/action-button-group/index.ts +0 -2
- package/src/lib/components/base-form/base-form-input.component.ts +0 -120
- package/src/lib/components/base-form/base-form.component.ts +0 -236
- package/src/lib/components/base-form/directives/detail-store.directive.ts +0 -219
- package/src/lib/components/base-form/index.ts +0 -4
- package/src/lib/components/base-form/models/base-form-input.models.ts +0 -11
- package/src/lib/components/base-form/models/base-form.models.ts +0 -31
- package/src/lib/components/base-form/models/index.ts +0 -2
- package/src/lib/components/breadcrumb/breadcrumb.model.ts +0 -21
- package/src/lib/components/breadcrumb/breadcrumb.service.ts +0 -9
- package/src/lib/components/breadcrumb/breadcrumbcore.component.ts +0 -117
- package/src/lib/components/breadcrumb/index.ts +0 -3
- package/src/lib/components/button/button.model.ts +0 -21
- package/src/lib/components/button/index.ts +0 -1
- package/src/lib/components/calendar/calendar.model.ts +0 -16
- package/src/lib/components/calendar/index.ts +0 -1
- package/src/lib/components/checkbox/checkbox.model.ts +0 -10
- package/src/lib/components/checkbox/index.ts +0 -1
- package/src/lib/components/confirm-dialog/confirm-dialog.model.ts +0 -31
- package/src/lib/components/confirm-dialog/index.ts +0 -1
- package/src/lib/components/dropdown/dropdown.model.ts +0 -16
- package/src/lib/components/dropdown/index.ts +0 -1
- package/src/lib/components/dropdown-button/dropdown-button.model.ts +0 -18
- package/src/lib/components/dropdown-button/index.ts +0 -1
- package/src/lib/components/dynamic-component/dynamic-component.model.ts +0 -2
- package/src/lib/components/dynamic-component/index.ts +0 -1
- package/src/lib/components/filter/filter.model.ts +0 -17
- package/src/lib/components/filter/index.ts +0 -1
- package/src/lib/components/form-field/form-field.model.ts +0 -15
- package/src/lib/components/form-field/index.ts +0 -1
- package/src/lib/components/generic-field/generic-field.model.ts +0 -10
- package/src/lib/components/generic-field/index.ts +0 -1
- package/src/lib/components/generic-form/generic-form.component.ts +0 -33
- package/src/lib/components/generic-form/index.ts +0 -1
- package/src/lib/components/header/header.model.ts +0 -18
- package/src/lib/components/header/index.ts +0 -1
- package/src/lib/components/icons/icons.component.ts +0 -22
- package/src/lib/components/icons/icons.model.ts +0 -16
- package/src/lib/components/icons/index.ts +0 -2
- package/src/lib/components/index.ts +0 -37
- package/src/lib/components/input-group/index.ts +0 -1
- package/src/lib/components/input-group/input-group.model.ts +0 -17
- package/src/lib/components/loader/index.ts +0 -1
- package/src/lib/components/loader/loader.model.ts +0 -7
- package/src/lib/components/multiselect/index.ts +0 -1
- package/src/lib/components/multiselect/mutiselect.model.ts +0 -13
- package/src/lib/components/number-input/index.ts +0 -1
- package/src/lib/components/number-input/number-input.model.ts +0 -14
- package/src/lib/components/page-header/index.ts +0 -3
- package/src/lib/components/page-header/page-header.model.ts +0 -11
- package/src/lib/components/page-header/page-header.service.ts +0 -9
- package/src/lib/components/page-header/page-headercore.component.ts +0 -42
- package/src/lib/components/password/index.ts +0 -1
- package/src/lib/components/password/password.model.ts +0 -25
- package/src/lib/components/radiobutton/index.ts +0 -1
- package/src/lib/components/radiobutton/radiobutton.model.ts +0 -16
- package/src/lib/components/section/index.ts +0 -1
- package/src/lib/components/section/section.model.ts +0 -11
- package/src/lib/components/side-menu/directives/side-menu-service.directive.ts +0 -31
- package/src/lib/components/side-menu/index.ts +0 -4
- package/src/lib/components/side-menu/services/side-menu-provider.service.ts +0 -13
- package/src/lib/components/side-menu/services/side-menu.service.ts +0 -62
- package/src/lib/components/side-menu/side-menu.model.ts +0 -67
- package/src/lib/components/slider/index.ts +0 -1
- package/src/lib/components/slider/slider.model.ts +0 -13
- package/src/lib/components/snackbar/index.ts +0 -1
- package/src/lib/components/snackbar/snackbar.model.ts +0 -7
- package/src/lib/components/stepper/index.ts +0 -1
- package/src/lib/components/stepper/stepper.model.ts +0 -24
- package/src/lib/components/switch/index.ts +0 -1
- package/src/lib/components/switch/switch.model.ts +0 -8
- package/src/lib/components/tab-view/index.ts +0 -1
- package/src/lib/components/tab-view/tab-view.model.ts +0 -22
- package/src/lib/components/table/column-configuration.ts +0 -38
- package/src/lib/components/table/index.ts +0 -4
- package/src/lib/components/table/table-builder.ts +0 -93
- package/src/lib/components/table/table-column.directive.ts +0 -62
- package/src/lib/components/table/table.models.ts +0 -261
- package/src/lib/components/table-filter/index.ts +0 -1
- package/src/lib/components/table-filter/table-filter.model.ts +0 -22
- package/src/lib/components/tag/index.ts +0 -1
- package/src/lib/components/tag/tag.model.ts +0 -13
- package/src/lib/components/textarea/index.ts +0 -1
- package/src/lib/components/textarea/textarea.model.ts +0 -13
- package/src/lib/components/textfield/index.ts +0 -1
- package/src/lib/components/textfield/textfield.model.ts +0 -13
- package/src/lib/components/tooltip/index.ts +0 -1
- package/src/lib/components/tooltip/tooltip.model.ts +0 -13
- package/src/lib/components/unsubscribe.component.ts +0 -12
- package/src/lib/directives/datasource.directive.ts +0 -275
- package/src/lib/directives/index.ts +0 -4
- package/src/lib/directives/shortcut.directive.ts +0 -37
- package/src/lib/directives/table-datasource.directive.ts +0 -184
- package/src/lib/directives/table-filter.directive.ts +0 -69
- package/src/lib/format/format.ts +0 -74
- package/src/lib/pipes/error/error.codes.ts +0 -11
- package/src/lib/pipes/error/error.models.ts +0 -27
- package/src/lib/pipes/error/error.pipe.ts +0 -27
- package/src/lib/pipes/error/warning.codes.ts +0 -5
- package/src/lib/pipes/error/warning.pipe.ts +0 -27
- package/src/lib/pipes/helper/enumToList.pipe.ts +0 -16
- package/src/lib/pipes/index.ts +0 -7
- package/src/lib/pipes/keyOrFn/keyOrFn.pipe.ts +0 -23
- package/src/lib/services/confirm-dialog.service.ts +0 -44
- package/src/lib/services/index.ts +0 -4
- package/src/lib/services/leave-form.service.ts +0 -53
- package/src/lib/services/screen-size.service.ts +0 -25
- package/src/lib/services/table.service.ts +0 -22
- package/src/test-setup.ts +0 -8
- package/tsconfig.json +0 -28
- package/tsconfig.lib.json +0 -17
- package/tsconfig.lib.prod.json +0 -9
- package/tsconfig.spec.json +0 -16
|
@@ -1,184 +0,0 @@
|
|
|
1
|
-
import { HttpClient } from '@angular/common/http';
|
|
2
|
-
import {
|
|
3
|
-
ChangeDetectorRef,
|
|
4
|
-
Directive,
|
|
5
|
-
inject,
|
|
6
|
-
Input,
|
|
7
|
-
OnChanges,
|
|
8
|
-
OnInit,
|
|
9
|
-
SimpleChanges,
|
|
10
|
-
} from '@angular/core';
|
|
11
|
-
import { Store } from '@ngrx/store';
|
|
12
|
-
import {
|
|
13
|
-
BASE_URL_PATH,
|
|
14
|
-
BaseHttpService,
|
|
15
|
-
convertDatasource,
|
|
16
|
-
DataSourceFunctionType,
|
|
17
|
-
DatasourceType,
|
|
18
|
-
LazyLoadEvent,
|
|
19
|
-
normalizeRequest,
|
|
20
|
-
Page,
|
|
21
|
-
RequestParams,
|
|
22
|
-
} from '@verisoft/core';
|
|
23
|
-
import {
|
|
24
|
-
BehaviorSubject,
|
|
25
|
-
catchError,
|
|
26
|
-
debounceTime,
|
|
27
|
-
map,
|
|
28
|
-
of,
|
|
29
|
-
switchMap,
|
|
30
|
-
takeUntil,
|
|
31
|
-
tap,
|
|
32
|
-
} from 'rxjs';
|
|
33
|
-
import {
|
|
34
|
-
DEFAULT_DEBOUNCE_TIME,
|
|
35
|
-
ExtendedRequestType,
|
|
36
|
-
isFilterEmpty,
|
|
37
|
-
setComponentProperties,
|
|
38
|
-
} from '../common';
|
|
39
|
-
import {
|
|
40
|
-
TABLE_COMPONENT_TOKEN,
|
|
41
|
-
TableCore,
|
|
42
|
-
UnsubscribeComponent,
|
|
43
|
-
} from '../components';
|
|
44
|
-
|
|
45
|
-
@Directive({
|
|
46
|
-
// eslint-disable-next-line @angular-eslint/directive-selector
|
|
47
|
-
selector: 'v-table[useDatasource]',
|
|
48
|
-
exportAs: 'useDatasource',
|
|
49
|
-
standalone: true,
|
|
50
|
-
})
|
|
51
|
-
export class TableDatasourceDirective<T>
|
|
52
|
-
extends UnsubscribeComponent
|
|
53
|
-
implements OnInit, OnChanges
|
|
54
|
-
{
|
|
55
|
-
protected readonly store = inject(Store);
|
|
56
|
-
|
|
57
|
-
@Input() autoBind = true;
|
|
58
|
-
|
|
59
|
-
@Input({ required: true }) tableName!: string;
|
|
60
|
-
|
|
61
|
-
@Input() debounceTime = DEFAULT_DEBOUNCE_TIME;
|
|
62
|
-
|
|
63
|
-
@Input() datasource!: DatasourceType<T>;
|
|
64
|
-
|
|
65
|
-
@Input() extraFilter!: any;
|
|
66
|
-
|
|
67
|
-
@Input() transformFn?: (data: T) => unknown;
|
|
68
|
-
|
|
69
|
-
private tableComponent = inject<TableCore<T>>(TABLE_COMPONENT_TOKEN, {
|
|
70
|
-
self: true,
|
|
71
|
-
});
|
|
72
|
-
private changeDetectorRef = inject(ChangeDetectorRef);
|
|
73
|
-
private httpClient = inject(HttpClient);
|
|
74
|
-
private baseUrl: string = inject(BASE_URL_PATH);
|
|
75
|
-
|
|
76
|
-
private dataSourceService?: DataSourceFunctionType<T>;
|
|
77
|
-
private parameters$ = new BehaviorSubject<Partial<ExtendedRequestType<T>>>({});
|
|
78
|
-
|
|
79
|
-
params$ = this.parameters$.asObservable();
|
|
80
|
-
|
|
81
|
-
ngOnInit(): void {
|
|
82
|
-
if (!this.tableName) {
|
|
83
|
-
throw new Error('Property tableName must be defined.');
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
this.tableComponent.lazyLoad.pipe(takeUntil(this.destroyed$)).subscribe((value: LazyLoadEvent) => {
|
|
87
|
-
this.parameters$.next({
|
|
88
|
-
offset: value?.offset,
|
|
89
|
-
limit: value?.limit,
|
|
90
|
-
filter: { ...value?.filter, ...this.extraFilter },
|
|
91
|
-
sort: value?.sort,
|
|
92
|
-
});
|
|
93
|
-
});
|
|
94
|
-
|
|
95
|
-
this.parameters$
|
|
96
|
-
.pipe(
|
|
97
|
-
takeUntil(this.destroyed$),
|
|
98
|
-
map((request) =>
|
|
99
|
-
normalizeRequest({
|
|
100
|
-
...request,
|
|
101
|
-
filter: { ...request.filter, ...this.extraFilter },
|
|
102
|
-
})
|
|
103
|
-
),
|
|
104
|
-
debounceTime(this.debounceTime),
|
|
105
|
-
tap(() => {
|
|
106
|
-
this.changeComponent(this.tableComponent, {
|
|
107
|
-
lazy: true,
|
|
108
|
-
loading: true,
|
|
109
|
-
});
|
|
110
|
-
}),
|
|
111
|
-
switchMap((request) =>
|
|
112
|
-
this.dataSourceService
|
|
113
|
-
? this.dataSourceService(request).pipe(
|
|
114
|
-
map((response) => ({ request, response }))
|
|
115
|
-
)
|
|
116
|
-
: of({
|
|
117
|
-
request,
|
|
118
|
-
response: {
|
|
119
|
-
data: [] as T[],
|
|
120
|
-
total: 0,
|
|
121
|
-
limit: request.limit,
|
|
122
|
-
offset: request.offset,
|
|
123
|
-
} as Page<T>,
|
|
124
|
-
})
|
|
125
|
-
),
|
|
126
|
-
catchError((request) => {
|
|
127
|
-
this.changeComponent(this.tableComponent, {
|
|
128
|
-
loading: false,
|
|
129
|
-
});
|
|
130
|
-
return of({
|
|
131
|
-
request: request as ExtendedRequestType<T>,
|
|
132
|
-
response: {
|
|
133
|
-
data: [] as T[],
|
|
134
|
-
total: 0,
|
|
135
|
-
limit: request.limit,
|
|
136
|
-
offset: request.offset,
|
|
137
|
-
} as Page<T>,
|
|
138
|
-
});
|
|
139
|
-
})
|
|
140
|
-
)
|
|
141
|
-
.subscribe(({ request, response }) =>
|
|
142
|
-
this.setDataToControl(request, response)
|
|
143
|
-
);
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
ngOnChanges(changes: SimpleChanges): void {
|
|
147
|
-
if (changes['datasource']) {
|
|
148
|
-
this.dataSourceService = convertDatasource(
|
|
149
|
-
this.datasource,
|
|
150
|
-
this.baseUrl,
|
|
151
|
-
this.httpClient
|
|
152
|
-
);
|
|
153
|
-
|
|
154
|
-
if (this.autoBind) {
|
|
155
|
-
this.parameters$.next({ offset: 0 });
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
reload() {
|
|
161
|
-
this.parameters$.next({ ...this.parameters$.value });
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
private changeComponent(
|
|
165
|
-
component: TableCore<T>,
|
|
166
|
-
value: Partial<TableCore<T>>
|
|
167
|
-
) {
|
|
168
|
-
setComponentProperties(component, value);
|
|
169
|
-
this.changeDetectorRef.detectChanges();
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
private setDataToControl(request: RequestParams<T>, result: Page<T>): void {
|
|
173
|
-
const data = result.data;
|
|
174
|
-
const total = result.total;
|
|
175
|
-
const transferedData = this.transformFn ? data.map((x) => this.transformFn?.(x)) : data;
|
|
176
|
-
|
|
177
|
-
this.changeComponent(this.tableComponent, {
|
|
178
|
-
lazy: !isFilterEmpty(request.filter) || data?.length < total || this.datasource instanceof BaseHttpService,
|
|
179
|
-
data: transferedData as T[],
|
|
180
|
-
loading: false,
|
|
181
|
-
total,
|
|
182
|
-
});
|
|
183
|
-
}
|
|
184
|
-
}
|
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
ChangeDetectorRef,
|
|
3
|
-
Directive,
|
|
4
|
-
inject,
|
|
5
|
-
Input,
|
|
6
|
-
OnChanges,
|
|
7
|
-
OnDestroy,
|
|
8
|
-
SimpleChanges,
|
|
9
|
-
} from '@angular/core';
|
|
10
|
-
import { debounceTime, Subject, Subscription } from 'rxjs';
|
|
11
|
-
import { DEFAULT_DEBOUNCE_TIME, setComponentProperties } from '../common';
|
|
12
|
-
import { FilterCore, TABLE_COMPONENT_TOKEN, TableCore } from '../components';
|
|
13
|
-
|
|
14
|
-
@Directive({
|
|
15
|
-
// eslint-disable-next-line @angular-eslint/directive-selector
|
|
16
|
-
selector: 'v-table[useFilter]',
|
|
17
|
-
standalone: true,
|
|
18
|
-
exportAs: 'tableFilterDirective',
|
|
19
|
-
})
|
|
20
|
-
export class TableFilterDirective<T> implements OnChanges, OnDestroy {
|
|
21
|
-
@Input({ required: true }) filterComponent!: FilterCore;
|
|
22
|
-
|
|
23
|
-
private filterChange$ = new Subject<T>();
|
|
24
|
-
private subscription: Subscription | undefined = undefined;
|
|
25
|
-
|
|
26
|
-
private tableComponent = inject<TableCore<T>>(TABLE_COMPONENT_TOKEN);
|
|
27
|
-
|
|
28
|
-
private changeDetectorRef = inject(ChangeDetectorRef);
|
|
29
|
-
|
|
30
|
-
ngOnChanges(changes: SimpleChanges): void {
|
|
31
|
-
if (changes['filterComponent']) {
|
|
32
|
-
this.unRegister();
|
|
33
|
-
this.register();
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
private onFilterChange(value: T): void {
|
|
38
|
-
if (this.tableComponent?.filter !== value) {
|
|
39
|
-
setComponentProperties(this.tableComponent, {
|
|
40
|
-
filter: value,
|
|
41
|
-
currentPage: 1,
|
|
42
|
-
});
|
|
43
|
-
|
|
44
|
-
this.changeDetectorRef.detectChanges();
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
ngOnDestroy(): void {
|
|
49
|
-
this.unRegister();
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
private unRegister() {
|
|
53
|
-
this.subscription?.unsubscribe();
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
private register() {
|
|
57
|
-
this.filterComponent.registerOnChange((value: T) => {
|
|
58
|
-
this.filterChange$.next(value);
|
|
59
|
-
});
|
|
60
|
-
|
|
61
|
-
this.subscription = this.filterChange$
|
|
62
|
-
.pipe(
|
|
63
|
-
debounceTime(
|
|
64
|
-
this.filterComponent.debounceTime ? 0 : DEFAULT_DEBOUNCE_TIME
|
|
65
|
-
)
|
|
66
|
-
)
|
|
67
|
-
.subscribe((value) => this.onFilterChange(value));
|
|
68
|
-
}
|
|
69
|
-
}
|
package/src/lib/format/format.ts
DELETED
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
import { toCzechDateTimeString } from "@verisoft/core";
|
|
2
|
-
|
|
3
|
-
/* eslint-disable @typescript-eslint/ban-types */
|
|
4
|
-
export class Format {
|
|
5
|
-
static concatArray(value: any[], itemFormatter?: Function, delimeter = ';') {
|
|
6
|
-
if (!value) {
|
|
7
|
-
return '';
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
return value
|
|
11
|
-
.map(item => itemFormatter ? itemFormatter(item) : item)
|
|
12
|
-
.filter(item => item !== undefined && item !== null)
|
|
13
|
-
.join(`${delimeter} `);
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
static czechDate(value: Date | string) {
|
|
17
|
-
return toCzechDateTimeString(value);
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
static date(value: Date | string) {
|
|
21
|
-
if (!value) {
|
|
22
|
-
return '';
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
if (typeof value === 'string') {
|
|
26
|
-
value = new Date(value);
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
return value.getDate() + '. ' + (value.getMonth() + 1) + '. ' + value.getFullYear();
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
static dateAndTime(value: Date | string) {
|
|
33
|
-
if (!value) {
|
|
34
|
-
return '';
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
if (typeof value === 'string') {
|
|
38
|
-
value = new Date(value);
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
return ('0' + value.getDate()).slice(-2)
|
|
42
|
-
+ '.' + ('0' + (value.getMonth() + 1)).slice(-2)
|
|
43
|
-
+ '.' + value.getFullYear() + ' ' + ('0' + value.getHours()).slice(-2)
|
|
44
|
-
+ ':' + ('0' + value.getMinutes()).slice(-2) + ':' + ('0' + value.getSeconds()).slice(-2);
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
static convertToUserLocaleDate(value?: Date | string) {
|
|
48
|
-
if (!value) {
|
|
49
|
-
return '';
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
if (typeof value === 'string') {
|
|
53
|
-
value = new Date(value);
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
return value.toLocaleDateString(navigator.language, { timeZone: 'UTC' });
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
static bool(value: boolean) {
|
|
60
|
-
if (value) {
|
|
61
|
-
return 'Yes';
|
|
62
|
-
} else {
|
|
63
|
-
return 'No';
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
static boolWithIcon(value: boolean) {
|
|
68
|
-
if (value) {
|
|
69
|
-
return `<span>✓</span>`;
|
|
70
|
-
} else {
|
|
71
|
-
return `<span>⨯</span>`;
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
type ErrorCodesFn = (value?: any) => string;
|
|
2
|
-
|
|
3
|
-
export const ErrorCodesFns: { [key: string]: ErrorCodesFn } = {
|
|
4
|
-
required: () => `This field is required!`,
|
|
5
|
-
email: () => `Email is in wrong format!`,
|
|
6
|
-
iban: () => `IBAN is in wrong format!`,
|
|
7
|
-
lowStrength: () => `Password too weak!`,
|
|
8
|
-
customPasswordRequirements: () => `Password does not meet minimal requirements.`,
|
|
9
|
-
fieldsNotMatching: () => `Passwords are not the same!`,
|
|
10
|
-
validationError: (value: any) => `${value}`,
|
|
11
|
-
};
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
import { AbstractControl, ValidationErrors } from '@angular/forms';
|
|
2
|
-
|
|
3
|
-
type ErrorValue = { key: string; value: string } | null;
|
|
4
|
-
|
|
5
|
-
export function getFirstErrorFromControl<T extends AbstractControl>(
|
|
6
|
-
control: T
|
|
7
|
-
): ErrorValue {
|
|
8
|
-
if (!control || !control.errors) {
|
|
9
|
-
return null;
|
|
10
|
-
}
|
|
11
|
-
const errors = control.errors ?? false;
|
|
12
|
-
if (errors) {
|
|
13
|
-
const key = Object.keys(control.errors)[0];
|
|
14
|
-
const value = control.errors[key];
|
|
15
|
-
return { key, value };
|
|
16
|
-
}
|
|
17
|
-
return null;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
export function getFirstError(errors: ValidationErrors): ErrorValue {
|
|
21
|
-
if (errors) {
|
|
22
|
-
const key = Object.keys(errors)[0];
|
|
23
|
-
const value = errors[key];
|
|
24
|
-
return { key, value };
|
|
25
|
-
}
|
|
26
|
-
return null;
|
|
27
|
-
}
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
import { Pipe, PipeTransform } from '@angular/core';
|
|
2
|
-
import { ValidationErrors } from '@angular/forms';
|
|
3
|
-
import { ErrorCodesFns } from './error.codes';
|
|
4
|
-
import { getFirstError } from './error.models';
|
|
5
|
-
|
|
6
|
-
const EMPTY = '';
|
|
7
|
-
|
|
8
|
-
@Pipe({
|
|
9
|
-
name: 'error',
|
|
10
|
-
standalone: true,
|
|
11
|
-
})
|
|
12
|
-
export class ErrorPipe implements PipeTransform {
|
|
13
|
-
transform(errors: ValidationErrors | undefined | null): string {
|
|
14
|
-
if (!errors) {
|
|
15
|
-
return EMPTY;
|
|
16
|
-
}
|
|
17
|
-
const error = getFirstError(errors);
|
|
18
|
-
if (error) {
|
|
19
|
-
const errorFn = ErrorCodesFns[error.key];
|
|
20
|
-
if (!errorFn) {
|
|
21
|
-
return EMPTY;
|
|
22
|
-
}
|
|
23
|
-
return ErrorCodesFns[error.key](error.value);
|
|
24
|
-
}
|
|
25
|
-
return EMPTY;
|
|
26
|
-
}
|
|
27
|
-
}
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
import { Pipe, PipeTransform } from '@angular/core';
|
|
2
|
-
import { ValidationErrors } from '@angular/forms';
|
|
3
|
-
import { getFirstError } from './error.models';
|
|
4
|
-
import { WarningCodesFns } from './warning.codes';
|
|
5
|
-
|
|
6
|
-
const EMPTY = '';
|
|
7
|
-
|
|
8
|
-
@Pipe({
|
|
9
|
-
name: 'warning',
|
|
10
|
-
standalone: true,
|
|
11
|
-
})
|
|
12
|
-
export class WarningPipe implements PipeTransform {
|
|
13
|
-
transform(warnings: ValidationErrors | undefined | null): string {
|
|
14
|
-
if (!warnings) {
|
|
15
|
-
return EMPTY;
|
|
16
|
-
}
|
|
17
|
-
const error = getFirstError(warnings);
|
|
18
|
-
if (error) {
|
|
19
|
-
const errorFn = WarningCodesFns[error.key];
|
|
20
|
-
if (!errorFn) {
|
|
21
|
-
return EMPTY;
|
|
22
|
-
}
|
|
23
|
-
return WarningCodesFns[error.key](error.value);
|
|
24
|
-
}
|
|
25
|
-
return EMPTY;
|
|
26
|
-
}
|
|
27
|
-
}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import { Pipe, PipeTransform } from "@angular/core";
|
|
2
|
-
|
|
3
|
-
@Pipe({
|
|
4
|
-
name: 'enumToList',
|
|
5
|
-
standalone: true,
|
|
6
|
-
})
|
|
7
|
-
export class EnumToListPipe implements PipeTransform {
|
|
8
|
-
transform(data: any): any[] {
|
|
9
|
-
return Object.keys(data)
|
|
10
|
-
.filter(key => isNaN(Number(key)))
|
|
11
|
-
.map(key => ({
|
|
12
|
-
label: key,
|
|
13
|
-
value: data[key as keyof typeof data],
|
|
14
|
-
}));
|
|
15
|
-
}
|
|
16
|
-
}
|
package/src/lib/pipes/index.ts
DELETED
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
export * from './error/error.codes';
|
|
2
|
-
export * from './error/error.models';
|
|
3
|
-
export * from './error/error.pipe';
|
|
4
|
-
export * from './error/warning.pipe';
|
|
5
|
-
export * from './error/warning.codes';
|
|
6
|
-
export * from './keyOrFn/keyOrFn.pipe';
|
|
7
|
-
export * from './helper/enumToList.pipe'
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
2
|
-
import { Pipe, PipeTransform } from '@angular/core';
|
|
3
|
-
|
|
4
|
-
@Pipe({
|
|
5
|
-
name: 'keyOrFn',
|
|
6
|
-
pure: false,
|
|
7
|
-
standalone: true,
|
|
8
|
-
})
|
|
9
|
-
export class KeyOrFunctionPipe implements PipeTransform {
|
|
10
|
-
transform(keyOrFn: any, row: any): any {
|
|
11
|
-
if (keyOrFn instanceof Function) {
|
|
12
|
-
return keyOrFn(row);
|
|
13
|
-
} else if (typeof keyOrFn === 'string') {
|
|
14
|
-
const value = row[keyOrFn];
|
|
15
|
-
if (value) {
|
|
16
|
-
return value;
|
|
17
|
-
}
|
|
18
|
-
} else if (typeof keyOrFn === 'boolean') {
|
|
19
|
-
return keyOrFn;
|
|
20
|
-
}
|
|
21
|
-
return '';
|
|
22
|
-
}
|
|
23
|
-
}
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
import { EventEmitter, Injectable, Output } from '@angular/core';
|
|
2
|
-
import { ExtendedDialogData } from '../components';
|
|
3
|
-
|
|
4
|
-
@Injectable({
|
|
5
|
-
providedIn: 'root',
|
|
6
|
-
})
|
|
7
|
-
export class DialogService {
|
|
8
|
-
@Output() showEvent: EventEmitter<ExtendedDialogData> =
|
|
9
|
-
new EventEmitter<ExtendedDialogData>();
|
|
10
|
-
|
|
11
|
-
@Output() closeEvent: EventEmitter<null> = new EventEmitter();
|
|
12
|
-
|
|
13
|
-
showDialog<TInputs, TOutputs>(data: ExtendedDialogData<TInputs, TOutputs>): void {
|
|
14
|
-
const mappedData = this.mapInputAndOutpus(data);
|
|
15
|
-
|
|
16
|
-
this.showEvent.emit({
|
|
17
|
-
...data,
|
|
18
|
-
data: mappedData,
|
|
19
|
-
});
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
private mapInputAndOutpus<TInputs, TOutputs>(
|
|
23
|
-
data: ExtendedDialogData<TInputs, TOutputs>
|
|
24
|
-
): ExtendedDialogData<TInputs, TOutputs> {
|
|
25
|
-
const inputsAndOutputs = data.data as TInputs & TOutputs;
|
|
26
|
-
return {
|
|
27
|
-
...data.data,
|
|
28
|
-
...(Object.keys(inputsAndOutputs ?? {})
|
|
29
|
-
.filter((key) => typeof inputsAndOutputs[key as keyof TOutputs] === 'function')
|
|
30
|
-
.reduce((acc, key) => {
|
|
31
|
-
acc[key] = (value: any) => {
|
|
32
|
-
if (typeof inputsAndOutputs[key as keyof TOutputs] === 'function') {
|
|
33
|
-
(inputsAndOutputs[key as keyof TOutputs] as (value: any) => void)(value);
|
|
34
|
-
}
|
|
35
|
-
};
|
|
36
|
-
return acc;
|
|
37
|
-
}, {} as Record<string, any>)),
|
|
38
|
-
};
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
closeModal(): void {
|
|
42
|
-
this.closeEvent.emit();
|
|
43
|
-
}
|
|
44
|
-
}
|
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
import { Injectable, inject } from '@angular/core';
|
|
2
|
-
import { CanDeactivate } from '@angular/router';
|
|
3
|
-
import { TranslateService } from '@ngx-translate/core';
|
|
4
|
-
import { Observable, Subject } from 'rxjs';
|
|
5
|
-
import { PreventUnsavedChangesCore, CommonIcons } from '../common';
|
|
6
|
-
import { DialogService } from './confirm-dialog.service';
|
|
7
|
-
|
|
8
|
-
@Injectable({
|
|
9
|
-
providedIn: 'root',
|
|
10
|
-
})
|
|
11
|
-
export class PreventUnsavedChangesDirective implements CanDeactivate<PreventUnsavedChangesCore> {
|
|
12
|
-
private dialogService = inject(DialogService);
|
|
13
|
-
private translateService = inject(TranslateService);
|
|
14
|
-
private readonly Icons!: CommonIcons;
|
|
15
|
-
|
|
16
|
-
canDeactivate(component: PreventUnsavedChangesCore): Observable<boolean> | Promise<boolean> | boolean {
|
|
17
|
-
if (!component || !component.canDeactivate) {
|
|
18
|
-
return true;
|
|
19
|
-
}
|
|
20
|
-
const result = component.canDeactivate();
|
|
21
|
-
return result;
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
showConfirmationDialog(): Observable<boolean> {
|
|
25
|
-
const resultSubject = new Subject<boolean>();
|
|
26
|
-
|
|
27
|
-
const title = this.translateService.instant('VALIDATIONS.UNSAVED_CHANGES');
|
|
28
|
-
const message = this.translateService.instant('VALIDATIONS.LEAVING_UNSAVED_FORM');
|
|
29
|
-
const leaveButton = this.translateService.instant('BUTTONS.LEAVE');
|
|
30
|
-
const stayButton = this.translateService.instant('BUTTONS.STAY');
|
|
31
|
-
|
|
32
|
-
this.dialogService.showDialog({
|
|
33
|
-
title: title,
|
|
34
|
-
headerIcon: this.Icons.infoCircle,
|
|
35
|
-
innerHTML: `<p>${message}</p>`,
|
|
36
|
-
showCancelButton: true,
|
|
37
|
-
confirmButtonText: stayButton,
|
|
38
|
-
cancelButtonText: leaveButton,
|
|
39
|
-
confirmButtonFn: () => {
|
|
40
|
-
resultSubject.next(false);
|
|
41
|
-
resultSubject.complete();
|
|
42
|
-
this.dialogService.closeModal();
|
|
43
|
-
},
|
|
44
|
-
cancelButtonFn: () => {
|
|
45
|
-
resultSubject.next(true);
|
|
46
|
-
resultSubject.complete();
|
|
47
|
-
this.dialogService.closeModal();
|
|
48
|
-
},
|
|
49
|
-
});
|
|
50
|
-
|
|
51
|
-
return resultSubject.asObservable();
|
|
52
|
-
}
|
|
53
|
-
}
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
import { Injectable } from '@angular/core';
|
|
2
|
-
import { BehaviorSubject } from 'rxjs';
|
|
3
|
-
|
|
4
|
-
@Injectable({
|
|
5
|
-
providedIn: 'root',
|
|
6
|
-
})
|
|
7
|
-
export class ScreenSizeService {
|
|
8
|
-
isMobileBlock = new BehaviorSubject<boolean>(false);
|
|
9
|
-
prevState = false;
|
|
10
|
-
|
|
11
|
-
constructor() {
|
|
12
|
-
this.checkScreenSize();
|
|
13
|
-
window.addEventListener('resize', async () => {
|
|
14
|
-
await this.checkScreenSize();
|
|
15
|
-
});
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
async checkScreenSize() {
|
|
19
|
-
const isMobile = window.matchMedia('(max-width: 768px)').matches;
|
|
20
|
-
if (isMobile !== this.prevState) {
|
|
21
|
-
this.prevState = isMobile;
|
|
22
|
-
this.isMobileBlock.next(isMobile);
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
}
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import { Injectable, signal } from "@angular/core";
|
|
2
|
-
import { TableSignal } from "../components";
|
|
3
|
-
|
|
4
|
-
@Injectable({
|
|
5
|
-
providedIn: 'root'
|
|
6
|
-
})
|
|
7
|
-
export class TableService {
|
|
8
|
-
readonly reload = signal<TableSignal | symbol>(Symbol())
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* If name is set, reload a specific table with the set`[tableName]`
|
|
12
|
-
*
|
|
13
|
-
* If name is NOT set, reload all tables in the current DOM
|
|
14
|
-
* */
|
|
15
|
-
forceReload(name?: string): void {
|
|
16
|
-
if (name) {
|
|
17
|
-
this.reload.set({ name: name, symbol: Symbol() });
|
|
18
|
-
} else {
|
|
19
|
-
this.reload.set(Symbol());
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
}
|
package/src/test-setup.ts
DELETED
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
// @ts-expect-error https://thymikee.github.io/jest-preset-angular/docs/getting-started/test-environment
|
|
2
|
-
globalThis.ngJest = {
|
|
3
|
-
testEnvironmentOptions: {
|
|
4
|
-
errorOnUnknownElements: true,
|
|
5
|
-
errorOnUnknownProperties: true,
|
|
6
|
-
},
|
|
7
|
-
};
|
|
8
|
-
import 'jest-preset-angular/setup-jest';
|
package/tsconfig.json
DELETED
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"compilerOptions": {
|
|
3
|
-
"target": "es2022",
|
|
4
|
-
"forceConsistentCasingInFileNames": true,
|
|
5
|
-
"strict": true,
|
|
6
|
-
"noImplicitOverride": true,
|
|
7
|
-
"noPropertyAccessFromIndexSignature": true,
|
|
8
|
-
"noImplicitReturns": true,
|
|
9
|
-
"noFallthroughCasesInSwitch": true
|
|
10
|
-
},
|
|
11
|
-
"files": [],
|
|
12
|
-
"include": [],
|
|
13
|
-
"references": [
|
|
14
|
-
{
|
|
15
|
-
"path": "./tsconfig.lib.json"
|
|
16
|
-
},
|
|
17
|
-
{
|
|
18
|
-
"path": "./tsconfig.spec.json"
|
|
19
|
-
}
|
|
20
|
-
],
|
|
21
|
-
"extends": "../../../tsconfig.base.json",
|
|
22
|
-
"angularCompilerOptions": {
|
|
23
|
-
"enableI18nLegacyMessageIdFormat": false,
|
|
24
|
-
"strictInjectionParameters": true,
|
|
25
|
-
"strictInputAccessModifiers": true,
|
|
26
|
-
"strictTemplates": true
|
|
27
|
-
}
|
|
28
|
-
}
|
package/tsconfig.lib.json
DELETED
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"extends": "./tsconfig.json",
|
|
3
|
-
"compilerOptions": {
|
|
4
|
-
"outDir": "../../../dist/out-tsc",
|
|
5
|
-
"declaration": true,
|
|
6
|
-
"declarationMap": true,
|
|
7
|
-
"inlineSources": true,
|
|
8
|
-
"types": []
|
|
9
|
-
},
|
|
10
|
-
"exclude": [
|
|
11
|
-
"src/**/*.spec.ts",
|
|
12
|
-
"src/test-setup.ts",
|
|
13
|
-
"jest.config.ts",
|
|
14
|
-
"src/**/*.test.ts"
|
|
15
|
-
],
|
|
16
|
-
"include": ["src/**/*.ts"]
|
|
17
|
-
}
|