@arsedizioni/ars-utils 22.6.85 → 22.6.88
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/arsedizioni-ars-utils-clipper.common.mjs +3158 -3344
- package/fesm2022/arsedizioni-ars-utils-clipper.common.mjs.map +1 -1
- package/fesm2022/arsedizioni-ars-utils-clipper.ui.mjs +7616 -4772
- package/fesm2022/arsedizioni-ars-utils-clipper.ui.mjs.map +1 -1
- package/fesm2022/arsedizioni-ars-utils-core.date.mjs +321 -702
- package/fesm2022/arsedizioni-ars-utils-core.date.mjs.map +1 -1
- package/fesm2022/arsedizioni-ars-utils-core.markdown.mjs +445 -590
- package/fesm2022/arsedizioni-ars-utils-core.markdown.mjs.map +1 -1
- package/fesm2022/arsedizioni-ars-utils-core.mjs +1735 -2370
- package/fesm2022/arsedizioni-ars-utils-core.mjs.map +1 -1
- package/fesm2022/arsedizioni-ars-utils-core.validators.mjs +1280 -1470
- package/fesm2022/arsedizioni-ars-utils-core.validators.mjs.map +1 -1
- package/fesm2022/arsedizioni-ars-utils-evolution.common.mjs +1097 -1528
- package/fesm2022/arsedizioni-ars-utils-evolution.common.mjs.map +1 -1
- package/fesm2022/arsedizioni-ars-utils-support.common.mjs +198 -294
- package/fesm2022/arsedizioni-ars-utils-support.common.mjs.map +1 -1
- package/fesm2022/arsedizioni-ars-utils-ui.controls.date.mjs +115 -117
- package/fesm2022/arsedizioni-ars-utils-ui.controls.date.mjs.map +1 -1
- package/fesm2022/arsedizioni-ars-utils-ui.controls.mjs +1607 -613
- package/fesm2022/arsedizioni-ars-utils-ui.controls.mjs.map +1 -1
- package/fesm2022/arsedizioni-ars-utils-ui.controls.tree.mjs +840 -367
- package/fesm2022/arsedizioni-ars-utils-ui.controls.tree.mjs.map +1 -1
- package/fesm2022/arsedizioni-ars-utils-ui.dialogs.auth.mjs +1634 -651
- package/fesm2022/arsedizioni-ars-utils-ui.dialogs.auth.mjs.map +1 -1
- package/fesm2022/arsedizioni-ars-utils-ui.dialogs.mjs +1255 -792
- package/fesm2022/arsedizioni-ars-utils-ui.dialogs.mjs.map +1 -1
- package/fesm2022/arsedizioni-ars-utils-ui.dialogs.prompt.mjs +1410 -357
- package/fesm2022/arsedizioni-ars-utils-ui.dialogs.prompt.mjs.map +1 -1
- package/fesm2022/arsedizioni-ars-utils-ui.dialogs.select.mjs +2401 -944
- package/fesm2022/arsedizioni-ars-utils-ui.dialogs.select.mjs.map +1 -1
- package/fesm2022/arsedizioni-ars-utils-ui.files.mjs +1553 -741
- package/fesm2022/arsedizioni-ars-utils-ui.files.mjs.map +1 -1
- package/fesm2022/arsedizioni-ars-utils-ui.filters.mjs +901 -430
- package/fesm2022/arsedizioni-ars-utils-ui.filters.mjs.map +1 -1
- package/fesm2022/arsedizioni-ars-utils-ui.help.mjs +737 -530
- package/fesm2022/arsedizioni-ars-utils-ui.help.mjs.map +1 -1
- package/fesm2022/arsedizioni-ars-utils-ui.mjs +6638 -1755
- package/fesm2022/arsedizioni-ars-utils-ui.mjs.map +1 -1
- package/fesm2022/arsedizioni-ars-utils-ui.navigation.mjs +1479 -1207
- package/fesm2022/arsedizioni-ars-utils-ui.navigation.mjs.map +1 -1
- package/fesm2022/arsedizioni-ars-utils-ui.notifications.mjs +1003 -270
- package/fesm2022/arsedizioni-ars-utils-ui.notifications.mjs.map +1 -1
- package/fesm2022/arsedizioni-ars-utils-ui.oauth.mjs +497 -278
- package/fesm2022/arsedizioni-ars-utils-ui.oauth.mjs.map +1 -1
- package/fesm2022/arsedizioni-ars-utils-ui.paginator.mjs +48 -52
- package/fesm2022/arsedizioni-ars-utils-ui.paginator.mjs.map +1 -1
- package/fesm2022/arsedizioni-ars-utils-ui.shell.mjs +464 -704
- package/fesm2022/arsedizioni-ars-utils-ui.shell.mjs.map +1 -1
- package/fesm2022/arsedizioni-ars-utils-ui.tinymce.mjs +724 -657
- package/fesm2022/arsedizioni-ars-utils-ui.tinymce.mjs.map +1 -1
- package/fesm2022/arsedizioni-ars-utils.mjs +3 -19
- package/fesm2022/arsedizioni-ars-utils.mjs.map +1 -1
- package/package.json +1 -1
- package/types/arsedizioni-ars-utils-clipper.common.d.ts +1151 -1163
- package/types/arsedizioni-ars-utils-clipper.ui.d.ts +1588 -1426
- package/types/arsedizioni-ars-utils-core.d.ts +1169 -1172
- package/types/arsedizioni-ars-utils-core.date.d.ts +204 -208
- package/types/arsedizioni-ars-utils-core.markdown.d.ts +128 -126
- package/types/arsedizioni-ars-utils-core.validators.d.ts +270 -236
- package/types/arsedizioni-ars-utils-evolution.common.d.ts +1054 -1067
- package/types/arsedizioni-ars-utils-support.common.d.ts +225 -234
- package/types/arsedizioni-ars-utils-ui.controls.d.ts +440 -278
- package/types/arsedizioni-ars-utils-ui.controls.date.d.ts +24 -28
- package/types/arsedizioni-ars-utils-ui.controls.tree.d.ts +172 -136
- package/types/arsedizioni-ars-utils-ui.d.ts +2035 -821
- package/types/arsedizioni-ars-utils-ui.dialogs.auth.d.ts +327 -322
- package/types/arsedizioni-ars-utils-ui.dialogs.d.ts +343 -347
- package/types/arsedizioni-ars-utils-ui.dialogs.prompt.d.ts +167 -167
- package/types/arsedizioni-ars-utils-ui.dialogs.select.d.ts +373 -367
- package/types/arsedizioni-ars-utils-ui.files.d.ts +335 -283
- package/types/arsedizioni-ars-utils-ui.filters.d.ts +232 -160
- package/types/arsedizioni-ars-utils-ui.help.d.ts +204 -211
- package/types/arsedizioni-ars-utils-ui.navigation.d.ts +811 -646
- package/types/arsedizioni-ars-utils-ui.notifications.d.ts +74 -78
- package/types/arsedizioni-ars-utils-ui.oauth.d.ts +102 -62
- package/types/arsedizioni-ars-utils-ui.paginator.d.ts +19 -22
- package/types/arsedizioni-ars-utils-ui.shell.d.ts +376 -382
- package/types/arsedizioni-ars-utils-ui.tinymce.d.ts +244 -231
- package/types/arsedizioni-ars-utils.d.ts +1 -3
|
@@ -1,187 +1,184 @@
|
|
|
1
|
-
import * as i0 from
|
|
2
|
-
import { EventEmitter,
|
|
3
|
-
import { SelectionModel } from
|
|
4
|
-
import { Locale } from
|
|
5
|
-
import { SafeHtml, SafeResourceUrl } from
|
|
6
|
-
import { Observable } from
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
bag?: unknown;
|
|
1
|
+
import * as i0 from "@angular/core";
|
|
2
|
+
import { EventEmitter, OnDestroy, PipeTransform, Signal } from "@angular/core";
|
|
3
|
+
import { SelectionModel } from "@angular/cdk/collections";
|
|
4
|
+
import { Locale } from "date-fns";
|
|
5
|
+
import { SafeHtml, SafeResourceUrl } from "@angular/platform-browser";
|
|
6
|
+
import { Observable } from "rxjs";
|
|
7
|
+
export interface INode {
|
|
8
|
+
id: string;
|
|
9
|
+
name: string;
|
|
10
|
+
count?: number;
|
|
11
|
+
children?: INode[];
|
|
12
|
+
subFolders?: INode[];
|
|
13
|
+
parent?: INode;
|
|
14
|
+
level?: number;
|
|
15
|
+
bag?: unknown;
|
|
17
16
|
}
|
|
18
|
-
interface DoneResult<T> {
|
|
19
|
-
|
|
20
|
-
|
|
17
|
+
export interface DoneResult<T> {
|
|
18
|
+
isNew?: boolean;
|
|
19
|
+
data?: T;
|
|
21
20
|
}
|
|
22
|
-
interface ApiResponse {
|
|
23
|
-
|
|
24
|
-
|
|
21
|
+
export interface ApiResponse {
|
|
22
|
+
success: boolean;
|
|
23
|
+
message: string;
|
|
25
24
|
}
|
|
26
|
-
interface ApiResult<T> extends ApiResponse {
|
|
27
|
-
|
|
25
|
+
export interface ApiResult<T> extends ApiResponse {
|
|
26
|
+
value: T;
|
|
28
27
|
}
|
|
29
|
-
interface Folder extends INode {
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
28
|
+
export interface Folder extends INode {
|
|
29
|
+
teamId?: string;
|
|
30
|
+
parentId?: string;
|
|
31
|
+
position?: number;
|
|
32
|
+
isPrivate?: boolean;
|
|
33
|
+
itemsCount?: number;
|
|
34
|
+
subItemsCount?: number;
|
|
36
35
|
}
|
|
37
|
-
interface FolderTree extends Folder {
|
|
38
|
-
|
|
39
|
-
|
|
36
|
+
export interface FolderTree extends Folder {
|
|
37
|
+
children?: Folder[];
|
|
38
|
+
path?: string;
|
|
40
39
|
}
|
|
41
|
-
interface File<T> {
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
40
|
+
export interface File<T> {
|
|
41
|
+
ownerId?: T;
|
|
42
|
+
id?: number;
|
|
43
|
+
fileName: string;
|
|
44
|
+
fileData: unknown;
|
|
46
45
|
}
|
|
47
|
-
interface Validated {
|
|
48
|
-
|
|
46
|
+
export interface Validated {
|
|
47
|
+
isValid(): boolean;
|
|
49
48
|
}
|
|
50
|
-
declare class FileInfo implements Validated {
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
49
|
+
export declare class FileInfo implements Validated {
|
|
50
|
+
file: any;
|
|
51
|
+
valid: boolean;
|
|
52
|
+
isValid(): boolean;
|
|
54
53
|
}
|
|
55
|
-
interface ErrorInfo {
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
54
|
+
export interface ErrorInfo {
|
|
55
|
+
invalidateSession?: boolean;
|
|
56
|
+
title?: string;
|
|
57
|
+
message?: string;
|
|
58
|
+
errorStatus?: number;
|
|
59
|
+
service?: string;
|
|
61
60
|
}
|
|
62
|
-
interface NameValueItem<T> {
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
61
|
+
export interface NameValueItem<T> {
|
|
62
|
+
name: string;
|
|
63
|
+
value: T;
|
|
64
|
+
shortName?: string;
|
|
65
|
+
parentName?: string;
|
|
66
|
+
parentValue?: T;
|
|
67
|
+
header?: string;
|
|
68
|
+
bag?: any;
|
|
69
|
+
bagInfo?: string;
|
|
70
|
+
disabled?: boolean;
|
|
71
|
+
selected?: boolean;
|
|
73
72
|
}
|
|
74
|
-
interface Checkable {
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
73
|
+
export interface Checkable {
|
|
74
|
+
checked?: boolean;
|
|
75
|
+
bag: unknown;
|
|
76
|
+
getId(): unknown;
|
|
78
77
|
}
|
|
79
|
-
declare class ValueModel<T> {
|
|
80
|
-
|
|
78
|
+
export declare class ValueModel<T> {
|
|
79
|
+
value: T;
|
|
81
80
|
}
|
|
82
|
-
declare class IDModel<T = number> {
|
|
83
|
-
|
|
81
|
+
export declare class IDModel<T = number> {
|
|
82
|
+
id: T;
|
|
84
83
|
}
|
|
85
|
-
declare class GroupModel<T = number> {
|
|
86
|
-
|
|
84
|
+
export declare class GroupModel<T = number> {
|
|
85
|
+
ids: T[];
|
|
87
86
|
}
|
|
88
|
-
declare class DeleteModel<T = number> extends GroupModel<T> {
|
|
89
|
-
|
|
90
|
-
|
|
87
|
+
export declare class DeleteModel<T = number> extends GroupModel<T> {
|
|
88
|
+
mode?: number;
|
|
89
|
+
parentId?: T;
|
|
91
90
|
}
|
|
92
|
-
interface DeleteResultModel<T> {
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
91
|
+
export interface DeleteResultModel<T> {
|
|
92
|
+
items?: T[];
|
|
93
|
+
deleted: number;
|
|
94
|
+
total: number;
|
|
95
|
+
log?: string;
|
|
97
96
|
}
|
|
98
|
-
declare class RelationModel<T = number> {
|
|
99
|
-
|
|
100
|
-
|
|
97
|
+
export declare class RelationModel<T = number> {
|
|
98
|
+
id: T;
|
|
99
|
+
parentId: T;
|
|
101
100
|
}
|
|
102
|
-
declare class UpdateRelationsModel<T = number> {
|
|
103
|
-
|
|
104
|
-
|
|
101
|
+
export declare class UpdateRelationsModel<T = number> {
|
|
102
|
+
id: T;
|
|
103
|
+
relatedIds: T[];
|
|
105
104
|
}
|
|
106
105
|
/** Identifies the external identity provider used for an OAuth login. */
|
|
107
|
-
declare enum LoginOAuthType {
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
106
|
+
export declare enum LoginOAuthType {
|
|
107
|
+
None = 0,
|
|
108
|
+
Microsoft = 1,
|
|
109
|
+
Google = 2
|
|
111
110
|
}
|
|
112
111
|
/** Payload emitted by the OAuth login components once the provider returned a token. */
|
|
113
|
-
interface LoginOAuthResult {
|
|
114
|
-
|
|
115
|
-
|
|
112
|
+
export interface LoginOAuthResult {
|
|
113
|
+
type: LoginOAuthType;
|
|
114
|
+
token: string;
|
|
116
115
|
}
|
|
117
|
-
declare class QueryModel {
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
116
|
+
export declare class QueryModel {
|
|
117
|
+
any?: string;
|
|
118
|
+
sortBy?: string;
|
|
119
|
+
sortDescending?: boolean;
|
|
120
|
+
first?: number;
|
|
121
|
+
count?: number;
|
|
123
122
|
}
|
|
124
|
-
interface QueryResultModel<T> {
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
123
|
+
export interface QueryResultModel<T> {
|
|
124
|
+
interval?: string;
|
|
125
|
+
items: T[];
|
|
126
|
+
total: number;
|
|
128
127
|
}
|
|
129
|
-
interface UpdateModel<T = number> {
|
|
130
|
-
|
|
131
|
-
|
|
128
|
+
export interface UpdateModel<T = number> {
|
|
129
|
+
parentId?: T;
|
|
130
|
+
ids: T[];
|
|
132
131
|
}
|
|
133
|
-
interface UpdateResultModel<T> {
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
132
|
+
export interface UpdateResultModel<T> {
|
|
133
|
+
items?: T[];
|
|
134
|
+
updated: number;
|
|
135
|
+
total: number;
|
|
136
|
+
log?: string;
|
|
138
137
|
}
|
|
139
|
-
interface AddModel<T> extends UpdateModel<T> {
|
|
138
|
+
export interface AddModel<T> extends UpdateModel<T> {}
|
|
139
|
+
export interface AddResultModel<T> {
|
|
140
|
+
items?: T[];
|
|
141
|
+
added: number;
|
|
142
|
+
total: number;
|
|
143
|
+
log?: string;
|
|
140
144
|
}
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
145
|
+
export declare class ImportModel {
|
|
146
|
+
origin: string;
|
|
147
|
+
dataFile: FileInfo;
|
|
148
|
+
jumpFirstLine?: boolean;
|
|
149
|
+
map?: unknown;
|
|
146
150
|
}
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
dataFile: FileInfo;
|
|
150
|
-
jumpFirstLine?: boolean;
|
|
151
|
-
map?: unknown;
|
|
151
|
+
export interface EnableDisableModel {
|
|
152
|
+
value: boolean;
|
|
152
153
|
}
|
|
153
|
-
interface
|
|
154
|
-
|
|
154
|
+
export interface SendToModel {
|
|
155
|
+
sendToRecipients?: string;
|
|
156
|
+
sendToSubject?: string;
|
|
157
|
+
sendToText?: string;
|
|
155
158
|
}
|
|
156
|
-
interface
|
|
157
|
-
|
|
158
|
-
sendToSubject?: string;
|
|
159
|
-
sendToText?: string;
|
|
159
|
+
export interface SearchBag {
|
|
160
|
+
name: string;
|
|
160
161
|
}
|
|
161
|
-
interface
|
|
162
|
-
|
|
162
|
+
export interface Searchable {
|
|
163
|
+
searchBag: SearchBag;
|
|
163
164
|
}
|
|
164
|
-
interface
|
|
165
|
-
|
|
165
|
+
export interface SearchFilterMetadata {
|
|
166
|
+
total: number;
|
|
167
|
+
count: number;
|
|
166
168
|
}
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
169
|
+
export declare class DateInterval {
|
|
170
|
+
from?: Date;
|
|
171
|
+
to?: Date;
|
|
172
|
+
get fromAsDate(): Date | undefined;
|
|
173
|
+
get toAsDate(): Date | undefined;
|
|
174
|
+
constructor(from?: Date, to?: Date);
|
|
175
|
+
clear(): void;
|
|
170
176
|
}
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
get toAsDate(): Date | undefined;
|
|
176
|
-
constructor(from?: Date, to?: Date);
|
|
177
|
-
clear(): void;
|
|
177
|
+
export interface LoginResult<T> extends ApiResult<boolean> {
|
|
178
|
+
context?: T;
|
|
179
|
+
oauth?: number;
|
|
180
|
+
requiresMfa?: boolean;
|
|
178
181
|
}
|
|
179
|
-
interface LoginResult<T> extends ApiResult<boolean> {
|
|
180
|
-
context?: T;
|
|
181
|
-
oauth?: number;
|
|
182
|
-
requiresMfa?: boolean;
|
|
183
|
-
}
|
|
184
|
-
|
|
185
182
|
/**
|
|
186
183
|
* Conversions between the objects the API speaks (DTOs) and the models a signal form works with.
|
|
187
184
|
*
|
|
@@ -245,71 +242,78 @@ interface LoginResult<T> extends ApiResult<boolean> {
|
|
|
245
242
|
* `string` (which is what `''` widens to) narrows to `string`. That is the reason a date field is
|
|
246
243
|
* `Date | null` and never `Date | string`: the latter could not be narrowed at all.
|
|
247
244
|
*/
|
|
248
|
-
type Dto<TModel> = {
|
|
249
|
-
[K in keyof TModel]: Exclude<TModel[K], '' | null>;
|
|
250
|
-
};
|
|
245
|
+
export type Dto<TModel> = { [K in keyof TModel]: Exclude<TModel[K], '' | null>; };
|
|
251
246
|
/** The two conversions between an API DTO and the model a signal form works with. */
|
|
252
|
-
declare class DtoUtils {
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
247
|
+
export declare class DtoUtils {
|
|
248
|
+
/**
|
|
249
|
+
* Builds a form model from the object returned by the API.
|
|
250
|
+
*
|
|
251
|
+
* The shape of the result is decided by `empty`, never by the DTO: every key of `empty` is in
|
|
252
|
+
* the result, taken from the DTO when it carries a usable value and left at its empty value
|
|
253
|
+
* otherwise. A DTO field that is absent and one that is explicitly `null` are treated the same,
|
|
254
|
+
* because both mean "the record has no value here" and the form wants its empty value for both.
|
|
255
|
+
*
|
|
256
|
+
* Keys that exist only in the model (a multi-select decomposed from a bitmask, a checkbox
|
|
257
|
+
* extracted from a flags value) simply keep their empty value: fill them in around the call.
|
|
258
|
+
*
|
|
259
|
+
* @param empty - The neutral model: it declares every field the form owns, and the value each
|
|
260
|
+
* one takes when the DTO does not carry it.
|
|
261
|
+
* @param dto - The object coming from the API, or `undefined` when creating a new record.
|
|
262
|
+
* @returns A new model, never the same reference as `empty` nor as `dto`.
|
|
263
|
+
*/
|
|
264
|
+
static toForm<TModel extends object>(empty: TModel, dto?: Partial<TModel> | null): TModel;
|
|
265
|
+
/**
|
|
266
|
+
* Builds the payload for the API from the current form model.
|
|
267
|
+
*
|
|
268
|
+
* Every empty value — `''`, `null` or `undefined` — is dropped, so a field the user never filled
|
|
269
|
+
* in travels as absent instead of reaching the backend as an empty string that would blank the
|
|
270
|
+
* record. `0` and `false` are NOT empty: an amount of zero and a switch left off are data, and a
|
|
271
|
+
* filter that wants an unticked box to mean "no filter" has to say so where it builds its query.
|
|
272
|
+
*
|
|
273
|
+
* The conversion is shallow: nested objects and arrays are passed through as they are, so a
|
|
274
|
+
* composite field (a bitmask to rebuild, a nested block to normalize) is handled around the call
|
|
275
|
+
* — usually by destructuring it out of the model first.
|
|
276
|
+
*
|
|
277
|
+
* The return type is {@link Dto}, the model without its empty values, so what the compiler sees
|
|
278
|
+
* matches what travels: a `coachLevel: CoachLevel | null` field arrives as `CoachLevel` and fits
|
|
279
|
+
* the optional `coachLevel?: CoachLevel` of the API model. At runtime the empty keys are simply
|
|
280
|
+
* not there, which is what `HttpClient` serializes anyway.
|
|
281
|
+
*
|
|
282
|
+
* @param model - The current form model.
|
|
283
|
+
* @returns A shallow copy without the empty fields.
|
|
284
|
+
*/
|
|
285
|
+
static toPayload<TModel extends object>(model: TModel): Dto<TModel>;
|
|
291
286
|
}
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
UTILS_DIALOGS_SELECT_OPTIONS_CHANGED: string;
|
|
287
|
+
export declare const UtilsMessages: {
|
|
288
|
+
/**
|
|
289
|
+
* Messages
|
|
290
|
+
*/
|
|
291
|
+
UTILS_DIALOGS_SELECT_OPTIONS_CHANGED: string;
|
|
298
292
|
};
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
293
|
+
export declare enum DateFormat {
|
|
294
|
+
Short = 1 // dd/mm/yyyy
|
|
295
|
+
,
|
|
296
|
+
Long = 2 // d mmmm yyyy
|
|
297
|
+
,
|
|
298
|
+
LongWithShortMonth = 3 // d mmm yyyy
|
|
299
|
+
,
|
|
300
|
+
LongWithWeekDay = 4 // wwww, d mmmm yyyy
|
|
301
|
+
,
|
|
302
|
+
LongWithShortWeekDay = 5 // www, d mmmm yyyy
|
|
303
|
+
,
|
|
304
|
+
MonthAndYear = 6 // mmm yyyy
|
|
305
|
+
,
|
|
306
|
+
LongMonthAndYear = 7 // mmmm yyyy
|
|
307
|
+
,
|
|
308
|
+
WeekDay = 8 // www d
|
|
309
|
+
,
|
|
310
|
+
LongWeekDay = 9 // wwww d
|
|
311
|
+
,
|
|
312
|
+
DayAndMonth = 10 // d mmmm
|
|
313
|
+
,
|
|
314
|
+
ShortUS = 11 // mm/dd/yyyy
|
|
315
|
+
,
|
|
316
|
+
ShortISO8601 = 12
|
|
313
317
|
}
|
|
314
318
|
/**
|
|
315
319
|
* Key selector with IDE autocomplete and compile-time checking.
|
|
@@ -319,396 +323,395 @@ declare enum DateFormat {
|
|
|
319
323
|
* branch), so existing callers that pass dynamic or untyped keys keep
|
|
320
324
|
* compiling unchanged.
|
|
321
325
|
*/
|
|
322
|
-
type KeyOf<T> = Extract<keyof T, string> | (string & {});
|
|
323
|
-
interface PasswordStrength {
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
326
|
+
export type KeyOf<T> = Extract<keyof T, string> | (string & {});
|
|
327
|
+
export interface PasswordStrength {
|
|
328
|
+
score: number;
|
|
329
|
+
label?: string;
|
|
330
|
+
color?: string;
|
|
331
|
+
suggestions?: string[];
|
|
332
|
+
isValid: boolean;
|
|
329
333
|
}
|
|
330
|
-
declare class SystemUtils {
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
334
|
+
export declare class SystemUtils {
|
|
335
|
+
/** Shared collator for locale-aware, case-insensitive string comparison. */
|
|
336
|
+
private static readonly collator;
|
|
337
|
+
/**
|
|
338
|
+
* Array find by key
|
|
339
|
+
* @param array : the array to scan
|
|
340
|
+
* @param key : key name
|
|
341
|
+
* @param value : the value to search for
|
|
342
|
+
* @returns : the property value or null
|
|
343
|
+
*/
|
|
344
|
+
static arrayFindByKey<T>(array: T[] | undefined, key: KeyOf<T>, value: unknown): T | undefined;
|
|
345
|
+
/**
|
|
346
|
+
* Array find index by key
|
|
347
|
+
* @param array : the array to scan
|
|
348
|
+
* @param key : the key name
|
|
349
|
+
* @param value : the value to search for
|
|
350
|
+
* @returns : the array index or -1 if not found
|
|
351
|
+
*/
|
|
352
|
+
static arrayFindIndexByKey<T>(array: T[] | undefined, key: KeyOf<T>, value: unknown): number;
|
|
353
|
+
/**
|
|
354
|
+
* Get a value from and array made of name|value items
|
|
355
|
+
* @param array : the array to scan
|
|
356
|
+
* @param value : the value to search for
|
|
357
|
+
* @returns : the property value or null if not found
|
|
358
|
+
*/
|
|
359
|
+
static arrayGetValue<T>(array: T[] | undefined, value: unknown): unknown;
|
|
360
|
+
/**
|
|
361
|
+
* Convert items to nodes into a tree structure
|
|
362
|
+
* @param items : list of nodes
|
|
363
|
+
* @param parent : parent node
|
|
364
|
+
* @returns : an array of INode objects
|
|
365
|
+
*/
|
|
366
|
+
static arrayToNodes(items: INode[], parent?: INode): INode[];
|
|
367
|
+
/**
|
|
368
|
+
* Comparator factory for sorting arrays of objects by a given property key.
|
|
369
|
+
* Pass the element type for compile-time key checking:
|
|
370
|
+
* `items.sort(SystemUtils.arraySortCompare<Employee>('lastName'))`.
|
|
371
|
+
* @param key - Name of the property to sort by (autocompleted from `T` when provided).
|
|
372
|
+
* @param order - Sort direction: `'asc'` (default) or `'desc'`.
|
|
373
|
+
* @returns A comparator function that returns a negative, zero, or positive number.
|
|
374
|
+
*/
|
|
375
|
+
static arraySortCompare<T extends object = Record<string, unknown>>(key: KeyOf<T>, order?: 'asc' | 'desc' | (string & {})): (a: T, b: T) => number;
|
|
376
|
+
/**
|
|
377
|
+
* Format weight
|
|
378
|
+
* @param gr : grams
|
|
379
|
+
* @returns : the formatted string
|
|
380
|
+
*/
|
|
381
|
+
static formatWeight(gr: number): string;
|
|
382
|
+
/**
|
|
383
|
+
* Format file size
|
|
384
|
+
* @param bytes : number of bytes
|
|
385
|
+
* @returns : the formatted string
|
|
386
|
+
*/
|
|
387
|
+
static formatFileSize(bytes: number): string;
|
|
388
|
+
/**
|
|
389
|
+
* Compare two strings (case-insensitive, locale-aware, accent-insensitive).
|
|
390
|
+
* @param a : string a
|
|
391
|
+
* @param b : string b
|
|
392
|
+
* @returns : 0 if equals, 1 if bigger, -1 if lower
|
|
393
|
+
*/
|
|
394
|
+
static compareString(a?: string, b?: string): number;
|
|
395
|
+
/**
|
|
396
|
+
* Capitalize a string
|
|
397
|
+
* @param s : the string to capitalize
|
|
398
|
+
* @returns : the capitalized string
|
|
399
|
+
*/
|
|
400
|
+
static capitalize(s?: string): string | undefined;
|
|
401
|
+
/**
|
|
402
|
+
* Truncate a string at the last word boundary before `max`.
|
|
403
|
+
* @param s : the string to truncate
|
|
404
|
+
* @param max : the max number of chars
|
|
405
|
+
* @returns : the truncated string
|
|
406
|
+
*/
|
|
407
|
+
static truncate(s?: string, max?: number): string | undefined;
|
|
408
|
+
/**
|
|
409
|
+
* Join a list of strings
|
|
410
|
+
* @param items : the list of strings
|
|
411
|
+
* @param sep : the separator string
|
|
412
|
+
* @param max : the maximum resulting string
|
|
413
|
+
* @returns : the joined string
|
|
414
|
+
*/
|
|
415
|
+
static join(items?: string[], sep?: string, max?: number): string | undefined;
|
|
416
|
+
/**
|
|
417
|
+
* Normalize a string by converting it to lowercase and removing extra spaces, with special handling for acronyms and camelCase.
|
|
418
|
+
* @param s : the string to normalize
|
|
419
|
+
* @returns : The normalized string, or `undefined` if the input is falsy.
|
|
420
|
+
*/
|
|
421
|
+
static normalizeDisplay(s?: string): string | undefined;
|
|
422
|
+
/**
|
|
423
|
+
* Wraps bare URLs in the given string with `<a>` anchor tags.
|
|
424
|
+
* @param s - The plain-text or HTML string to process.
|
|
425
|
+
* @returns The string with URLs replaced by clickable links, or `''` when `s` is falsy.
|
|
426
|
+
*/
|
|
427
|
+
static replaceAsHtml(s?: string): string;
|
|
428
|
+
/**
|
|
429
|
+
* Compare two names
|
|
430
|
+
* @param a : name a
|
|
431
|
+
* @param b : name b
|
|
432
|
+
* @returns : true if a equals b
|
|
433
|
+
*/
|
|
434
|
+
static compareNames(a?: string, b?: string): boolean;
|
|
435
|
+
/**
|
|
436
|
+
* Obfuscate a text with a key-driven code point rotation.
|
|
437
|
+
*
|
|
438
|
+
* @deprecated This is OBFUSCATION, not cryptography: it hides values from
|
|
439
|
+
* casual inspection but offers no real security. Use {@link encrypt} /
|
|
440
|
+
* {@link decrypt} (AES-GCM via Web Crypto) for anything sensitive.
|
|
441
|
+
*
|
|
442
|
+
* The rotation operates on Unicode code points and skips the surrogate
|
|
443
|
+
* range, so the output is always a well-formed string: emoji and other
|
|
444
|
+
* astral characters round-trip correctly (the previous code-unit based
|
|
445
|
+
* version could emit lone surrogates and corrupt them).
|
|
446
|
+
*
|
|
447
|
+
* BREAKING CHANGE: values encoded with the previous code-unit algorithm
|
|
448
|
+
* cannot be decoded by this implementation.
|
|
449
|
+
*
|
|
450
|
+
* @param text : the text to encode or decode
|
|
451
|
+
* @param key : the key
|
|
452
|
+
* @param reverse : true to decode, false to encode
|
|
453
|
+
* @returns : the obfuscated (or restored) text, or undefined when text/key are empty
|
|
454
|
+
*/
|
|
455
|
+
static cipher(text: string, key: string, reverse?: boolean): string | undefined;
|
|
456
|
+
/** Payload format version, first byte of the binary envelope. */
|
|
457
|
+
private static readonly CIPHER_VERSION;
|
|
458
|
+
/** PBKDF2 salt length in bytes. */
|
|
459
|
+
private static readonly CIPHER_SALT_LENGTH;
|
|
460
|
+
/** AES-GCM IV length in bytes (96 bit, the recommended size for GCM). */
|
|
461
|
+
private static readonly CIPHER_IV_LENGTH;
|
|
462
|
+
/** PBKDF2-HMAC-SHA-256 iterations (OWASP recommendation). */
|
|
463
|
+
private static readonly CIPHER_ITERATIONS;
|
|
464
|
+
/**
|
|
465
|
+
* Derives an AES-GCM 256-bit key from a password using PBKDF2-HMAC-SHA-256.
|
|
466
|
+
* @param password : the user password / passphrase
|
|
467
|
+
* @param salt : the random salt bound to this payload
|
|
468
|
+
* @returns : a non-extractable AES-GCM CryptoKey
|
|
469
|
+
*/
|
|
470
|
+
private static deriveKey;
|
|
471
|
+
/**
|
|
472
|
+
* Encodes bytes as URL-safe Base64 (no '+', '/' or trailing '=').
|
|
473
|
+
* @param bytes : the bytes to encode
|
|
474
|
+
* @returns : the base64url string
|
|
475
|
+
*/
|
|
476
|
+
private static toBase64Url;
|
|
477
|
+
/**
|
|
478
|
+
* Decodes a URL-safe Base64 string back to bytes.
|
|
479
|
+
* @param value : the base64url string
|
|
480
|
+
* @returns : the decoded bytes
|
|
481
|
+
*/
|
|
482
|
+
private static fromBase64Url;
|
|
483
|
+
/**
|
|
484
|
+
* Encrypts a text with a password using AES-GCM (256 bit) and a key derived
|
|
485
|
+
* via PBKDF2-HMAC-SHA-256 with a random per-message salt.
|
|
486
|
+
*
|
|
487
|
+
* The result is a self-contained, URL-safe Base64 payload:
|
|
488
|
+
* `version (1 byte) | salt (16 bytes) | iv (12 bytes) | ciphertext+tag`.
|
|
489
|
+
* GCM is authenticated: any tampering makes {@link decrypt} fail.
|
|
490
|
+
*
|
|
491
|
+
* Requires a secure context (HTTPS or localhost) for `crypto.subtle`.
|
|
492
|
+
*
|
|
493
|
+
* @param text : the plain text to encrypt
|
|
494
|
+
* @param password : the password / passphrase
|
|
495
|
+
* @returns : the base64url payload, or undefined when text/password are
|
|
496
|
+
* empty or the Web Crypto API is unavailable
|
|
497
|
+
*/
|
|
498
|
+
static encrypt(text: string, password: string): Promise<string | undefined>;
|
|
499
|
+
/**
|
|
500
|
+
* Decrypts a payload produced by {@link encrypt}.
|
|
501
|
+
* Returns undefined when the password is wrong, the payload was tampered
|
|
502
|
+
* with, the format is unknown, or the Web Crypto API is unavailable.
|
|
503
|
+
*
|
|
504
|
+
* @param payload : the base64url payload returned by {@link encrypt}
|
|
505
|
+
* @param password : the password / passphrase used to encrypt
|
|
506
|
+
* @returns : the original plain text, or undefined on any failure
|
|
507
|
+
*/
|
|
508
|
+
static decrypt(payload: string, password: string): Promise<string | undefined>;
|
|
509
|
+
/**
|
|
510
|
+
* Clone an object (deep copy).
|
|
511
|
+
* Uses native structuredClone: handles Date, Map, Set, typed arrays and circular references.
|
|
512
|
+
* @param obj : the object to clone
|
|
513
|
+
* @returns : a new object
|
|
514
|
+
*/
|
|
515
|
+
static clone<T>(obj: T): T;
|
|
516
|
+
/**
|
|
517
|
+
* Creates a deep clone of an object.
|
|
518
|
+
* @param obj - The source object to clone.
|
|
519
|
+
* @param dest - Optional pre-allocated destination object to merge the clone into.
|
|
520
|
+
* @returns A deep copy of `obj`.
|
|
521
|
+
*/
|
|
522
|
+
static deepClone<T extends object>(obj: T, dest?: T): T;
|
|
523
|
+
/**
|
|
524
|
+
* Returns `true` when `value` is a syntactically valid UUID string.
|
|
525
|
+
* @param value - The string to validate.
|
|
526
|
+
*/
|
|
527
|
+
static parseUUID(value?: string): boolean;
|
|
528
|
+
/**
|
|
529
|
+
* Returns `true` when `value` is a valid, non-empty (non-zero) UUID.
|
|
530
|
+
* @param value - The string to validate.
|
|
531
|
+
*/
|
|
532
|
+
static parseUUIDNotEmpty(value?: string): boolean;
|
|
533
|
+
/**
|
|
534
|
+
* Return an empty UUID
|
|
535
|
+
* @returns : the empty UUID
|
|
536
|
+
*/
|
|
537
|
+
static emptyUUID(): string;
|
|
538
|
+
/**
|
|
539
|
+
* Create a new UUID
|
|
540
|
+
* @returns : the string UUID
|
|
541
|
+
*/
|
|
542
|
+
static generateUUID(): string;
|
|
543
|
+
/**
|
|
544
|
+
* Reconstruct a standard UUID (with dashes) from a 32-char hex string without dashes.
|
|
545
|
+
* @param value : 32-character hex string
|
|
546
|
+
* @returns : the formatted UUID or the original string if it doesn't match the expected format
|
|
547
|
+
*/
|
|
548
|
+
static inflateUUID(value: string): string;
|
|
549
|
+
/** Precompiled validation patterns. */
|
|
550
|
+
private static readonly emailRegex;
|
|
551
|
+
private static readonly urlRegex;
|
|
552
|
+
/**
|
|
553
|
+
* Parse a text and return true if it is a valid email (or empty)
|
|
554
|
+
* @param value : email
|
|
555
|
+
* @returns : true if the email is valid or empty
|
|
556
|
+
*/
|
|
557
|
+
static parseEmail(value?: string): boolean;
|
|
558
|
+
/**
|
|
559
|
+
* Parse a text containing one or more email addresses separated by `;` or `,`
|
|
560
|
+
* and return true if all of them are valid (or the text is empty).
|
|
561
|
+
* Empty items caused by double or trailing separators are ignored.
|
|
562
|
+
* @param value : the email list to parse (e.g. "a@b.it; c@d.it")
|
|
563
|
+
* @returns : true if all emails are valid or the value is empty
|
|
564
|
+
*/
|
|
565
|
+
static parseEmails(value?: string): boolean;
|
|
566
|
+
/**
|
|
567
|
+
* Parse a text and return true if it is a valid url (or empty)
|
|
568
|
+
* @param value : the url to parse
|
|
569
|
+
* @returns : true if the url is valid or empty
|
|
570
|
+
*/
|
|
571
|
+
static parseUrl(value?: string): boolean;
|
|
572
|
+
/**
|
|
573
|
+
* Get date parts from a string value
|
|
574
|
+
* @param value : the string to parse
|
|
575
|
+
* @returns : an array of numbers with year, month, day
|
|
576
|
+
*/
|
|
577
|
+
static getDateParts(value?: string): number[] | undefined;
|
|
578
|
+
/**
|
|
579
|
+
* Checks whether a value is a valid Date instance.
|
|
580
|
+
* Note: do not use `date.getTime()` as a truthiness test, it is 0 (falsy)
|
|
581
|
+
* for the Unix epoch (1970-01-01T00:00:00Z) even though the date is valid.
|
|
582
|
+
* @param d : the value to check
|
|
583
|
+
* @returns : true when `d` is a Date representing a valid point in time
|
|
584
|
+
*/
|
|
585
|
+
static isValidDate(d: unknown): d is Date;
|
|
586
|
+
/**
|
|
587
|
+
* Parse a date
|
|
588
|
+
* @param value : the value to check
|
|
589
|
+
* @param locale : the locale to use
|
|
590
|
+
* @returns : a valid Date object or undefined
|
|
591
|
+
*/
|
|
592
|
+
static parseDate(value?: string | Date, locale?: Locale): Date | undefined;
|
|
593
|
+
/**
|
|
594
|
+
* Converts a Date, timestamp or ISO string into a Europe/Rome Date whose JSON serialisation
|
|
595
|
+
* emits a naive local datetime string ("yyyy-MM-dd'T'HH:mm:ss"), with no timezone designator,
|
|
596
|
+
* so the wall-clock value round-trips to the server unchanged. Use this instead of `new Date(...)`
|
|
597
|
+
* when reviving dates received from the API, to stay consistent with the DateFnsAdapter (values
|
|
598
|
+
* entered through the datepicker already behave this way).
|
|
599
|
+
* @param value : the source Date, Unix timestamp (ms) or ISO string
|
|
600
|
+
* @returns : a Europe/Rome Date serialising as naive local time, or undefined for empty/invalid input
|
|
601
|
+
*/
|
|
602
|
+
static toLocalDate(value?: Date | number | string): Date | undefined;
|
|
603
|
+
/**
|
|
604
|
+
* Format a date
|
|
605
|
+
* @param value : the date or string to format
|
|
606
|
+
* @param fmt : the DateFormat to use or the string pattern
|
|
607
|
+
* @param locale : the locale to use (default is IT)
|
|
608
|
+
* @returns : the formatted string
|
|
609
|
+
*/
|
|
610
|
+
static formatDate(value?: Date | string, fmt?: DateFormat | string, locale?: Locale): string;
|
|
611
|
+
/**
|
|
612
|
+
* Update a DateInterval object according to a string
|
|
613
|
+
* @param value : string value
|
|
614
|
+
* @param interval : DateInterval value to update
|
|
615
|
+
* @param end : true if must be updated the first or the end value
|
|
616
|
+
* @param copy : copy the same value (works only if not end element)
|
|
617
|
+
*/
|
|
618
|
+
static changeDateInterval(value: string, interval: DateInterval, end?: boolean, copy?: boolean): void;
|
|
619
|
+
/** Cache of `Intl.NumberFormat` instances (their construction is expensive). */
|
|
620
|
+
private static readonly numberFormatCache;
|
|
621
|
+
/**
|
|
622
|
+
* Returns a cached `Intl.NumberFormat` for the given options, creating it on first use.
|
|
623
|
+
* @param locale - BCP 47 locale tag.
|
|
624
|
+
* @param options - The `Intl.NumberFormat` options.
|
|
625
|
+
* @returns A shared formatter instance.
|
|
626
|
+
*/
|
|
627
|
+
private static getNumberFormat;
|
|
628
|
+
/**
|
|
629
|
+
* Formats a number using a cached `Intl.NumberFormat`.
|
|
630
|
+
* @param value - The number to format.
|
|
631
|
+
* @param decimals - Maximum decimal places (default: `2`).
|
|
632
|
+
* @param locale - BCP 47 locale tag (default: `'it-IT'`).
|
|
633
|
+
* @returns The formatted number string.
|
|
634
|
+
*/
|
|
635
|
+
static formatNumber(value: number, decimals?: number, locale?: string): string;
|
|
636
|
+
/**
|
|
637
|
+
* Formats a number as a currency string using a cached `Intl.NumberFormat`.
|
|
638
|
+
* @param value - The number to format.
|
|
639
|
+
* @param currency - ISO 4217 currency code (default: `'EUR'`).
|
|
640
|
+
* @param decimals - Maximum decimal places (default: `2`).
|
|
641
|
+
* @param locale - BCP 47 locale tag (default: `'it-IT'`).
|
|
642
|
+
* @returns The formatted currency string.
|
|
643
|
+
*/
|
|
644
|
+
static formatCurrency(value: number, currency?: string, decimals?: number, locale?: string): string;
|
|
645
|
+
/**
|
|
646
|
+
* Percent-encodes a string for safe inclusion in a URL.
|
|
647
|
+
* @param value - The string to encode.
|
|
648
|
+
* @returns The encoded string, or `undefined` when `value` is empty.
|
|
649
|
+
*/
|
|
650
|
+
static urlEncode(value: string): string | undefined;
|
|
651
|
+
/**
|
|
652
|
+
* Decodes a percent-encoded URL string, treating `+` as a space.
|
|
653
|
+
* @param value - The encoded string to decode.
|
|
654
|
+
* @returns The decoded string, or `undefined` when `value` is empty or absent.
|
|
655
|
+
*/
|
|
656
|
+
static urlDecode(value?: string): string | undefined;
|
|
657
|
+
/**
|
|
658
|
+
* Reads a query string parameter value from the current page URL.
|
|
659
|
+
* @param name - The parameter name to look up.
|
|
660
|
+
* @returns The decoded parameter value, or `undefined` when absent or running server-side.
|
|
661
|
+
*/
|
|
662
|
+
static getQueryStringValueByName(name: string): string | undefined;
|
|
663
|
+
/**
|
|
664
|
+
* Generate a password
|
|
665
|
+
* @returns : the password string
|
|
666
|
+
*/
|
|
667
|
+
static generatePassword(length?: number): string;
|
|
668
|
+
/**
|
|
669
|
+
* Calculate password strength
|
|
670
|
+
* @param password: the password to evaluate
|
|
671
|
+
* @returns the password strength info
|
|
672
|
+
*/
|
|
673
|
+
static calculatePasswordStrength(password?: string): PasswordStrength;
|
|
674
|
+
/**
|
|
675
|
+
* Check if current browser supports touch
|
|
676
|
+
* @returns : true if the display is touchable
|
|
677
|
+
*/
|
|
678
|
+
static isTouchable(): boolean;
|
|
679
|
+
/**
|
|
680
|
+
* This check will prevent 'window' logic to be executed
|
|
681
|
+
* while executing the server rendering
|
|
682
|
+
* @returns : true if using the browser
|
|
683
|
+
*/
|
|
684
|
+
static isBrowser(): boolean;
|
|
685
|
+
/**
|
|
686
|
+
* Convert folders in a tree of Node object.
|
|
687
|
+
* @param folders : the subfolders group or null to root
|
|
688
|
+
* @returns : a node list
|
|
689
|
+
*/
|
|
690
|
+
static toNodes(folders: INode[]): INode[];
|
|
691
|
+
/**
|
|
692
|
+
* Convert folders in a tree of Node object.
|
|
693
|
+
* @param folders : the children group or null to root
|
|
694
|
+
* @param parent : the parent node
|
|
695
|
+
* @returns : a node list
|
|
696
|
+
*/
|
|
697
|
+
private static _toNodes;
|
|
698
|
+
/**
|
|
699
|
+
* Returns an array of individual power-of-2 flag values that are set in `value`.
|
|
700
|
+
* @param value - The bitmask to decompose.
|
|
701
|
+
* @param max - Upper-bound exponent: checks flags from `1` up to `1 << max` (default: `30`).
|
|
702
|
+
* @returns Array of set flag values, or an empty array when `value` is `0`.
|
|
703
|
+
*/
|
|
704
|
+
static getFlags(value: number, max?: number): number[];
|
|
705
|
+
/** Cache for resolved color luminance results. */
|
|
706
|
+
private static readonly colorLightCache;
|
|
707
|
+
/**
|
|
708
|
+
* Check if a color is light or dark
|
|
709
|
+
* @param color : the color
|
|
710
|
+
* @param minimumLuminance : the lumimance to consider
|
|
711
|
+
* @returns true if the color is light
|
|
712
|
+
*/
|
|
713
|
+
static isColorLight(color: string, minimumLuminance?: number): boolean;
|
|
710
714
|
}
|
|
711
|
-
|
|
712
715
|
/**
|
|
713
716
|
* Generic selection model that tracks a set of selected items identified by a lookup field.
|
|
714
717
|
* Wraps Angular CDK's `SelectionModel` and adds lookup-based add/remove logic.
|
|
@@ -716,191 +719,204 @@ declare class SystemUtils {
|
|
|
716
719
|
* @typeParam T - The item type held in the selection.
|
|
717
720
|
* @typeParam V - The type of the lookup key used to identify items.
|
|
718
721
|
*/
|
|
719
|
-
declare class SelectableModel<T, V> {
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
722
|
+
export declare class SelectableModel<T, V> {
|
|
723
|
+
/**
|
|
724
|
+
* Emits whenever the selection changes.
|
|
725
|
+
* Carries the affected item, or `undefined` when the whole selection is cleared.
|
|
726
|
+
*
|
|
727
|
+
* Note: kept as `EventEmitter` (instead of a plain RxJS `Subject`) for
|
|
728
|
+
* backward compatibility with existing consumers; `EventEmitter` extends
|
|
729
|
+
* `Subject`, so `.subscribe()`, `pipe(...)` and `takeUntilDestroyed` all
|
|
730
|
+
* work as expected.
|
|
731
|
+
*/
|
|
732
|
+
readonly changed: EventEmitter<T>;
|
|
733
|
+
private readonly _all;
|
|
734
|
+
/**
|
|
735
|
+
* Snapshot of all items currently tracked by this model (selected or previously toggled).
|
|
736
|
+
* Backed by a signal — reads are always up to date.
|
|
737
|
+
*/
|
|
738
|
+
get all(): T[];
|
|
739
|
+
private readonly _current;
|
|
740
|
+
/** The underlying CDK `SelectionModel` (provides `.selected`, `.isSelected`, etc.). */
|
|
741
|
+
get current(): SelectionModel<T>;
|
|
742
|
+
private readonly _lookupFieldName;
|
|
743
|
+
/** Signal that is `true` when at least one item is tracked in the internal list. */
|
|
744
|
+
readonly hasValue: import("@angular/core").Signal<boolean>;
|
|
745
|
+
/** Signal with the number of items currently tracked in the internal list. */
|
|
746
|
+
readonly count: import("@angular/core").Signal<number>;
|
|
747
|
+
/** Signal that is `true` when exactly one item is currently selected. */
|
|
748
|
+
readonly selectedOne: import("@angular/core").Signal<boolean>;
|
|
749
|
+
/** Signal that is `true` when two or more items are currently selected. */
|
|
750
|
+
readonly selectedMany: import("@angular/core").Signal<boolean>;
|
|
751
|
+
/** Signal that is `true` when at least one element is selected. */
|
|
752
|
+
readonly selectedAny: import("@angular/core").Signal<boolean>;
|
|
753
|
+
/** Signal that is `true` when no item is currently selected. */
|
|
754
|
+
readonly selectedNone: import("@angular/core").Signal<boolean>;
|
|
755
|
+
/** Signal with the first currently selected item, or `undefined` when none is selected. */
|
|
756
|
+
readonly first: import("@angular/core").Signal<T>;
|
|
757
|
+
/**
|
|
758
|
+
* @param allowMultiSelect - When `true` (default), multiple items can be selected simultaneously.
|
|
759
|
+
* @param lookupFieldName - Name of the field used as the unique key when searching the internal list
|
|
760
|
+
* (default: `'id'`). Keys of `T` are autocompleted; plain strings remain accepted.
|
|
761
|
+
*/
|
|
762
|
+
constructor(allowMultiSelect?: boolean, lookupFieldName?: KeyOf<T>);
|
|
763
|
+
/**
|
|
764
|
+
* Toggles the CDK selection state of an item that already exists in the tracked list.
|
|
765
|
+
* Has no effect when `lookupValue` does not match any tracked item.
|
|
766
|
+
* @param item - The item whose selection state should be toggled.
|
|
767
|
+
* @param lookupValue - The key value used to locate the item in the internal list.
|
|
768
|
+
*/
|
|
769
|
+
updateCurrent(item: T, lookupValue: V): void;
|
|
770
|
+
/**
|
|
771
|
+
* Toggles an item in both the internal list and the CDK selection.
|
|
772
|
+
* Adds the item when it is not yet tracked; removes it when it is.
|
|
773
|
+
* @param item - The item to toggle.
|
|
774
|
+
* @param lookupValue - The key value used to locate or register the item.
|
|
775
|
+
*/
|
|
776
|
+
toggle(item: T, lookupValue?: V): void;
|
|
777
|
+
/**
|
|
778
|
+
* Adds an item to the internal list (when not already present) and marks it as selected.
|
|
779
|
+
* @param item - The item to select.
|
|
780
|
+
* @param lookupValue - The key value used to locate or register the item.
|
|
781
|
+
*/
|
|
782
|
+
select(item: T, lookupValue?: V): void;
|
|
783
|
+
/**
|
|
784
|
+
* Removes an item from the internal list and deselects it in the CDK model.
|
|
785
|
+
* Has no effect when the item is not currently tracked.
|
|
786
|
+
* @param item - The item to deselect.
|
|
787
|
+
* @param lookupValue - The key value used to locate the item in the internal list.
|
|
788
|
+
*/
|
|
789
|
+
deselect(item: T, lookupValue?: V): void;
|
|
790
|
+
/**
|
|
791
|
+
* Deselects all items whose lookup key is contained in `lookupValues`.
|
|
792
|
+
* @param lookupValues - Array of key values identifying the items to deselect.
|
|
793
|
+
*/
|
|
794
|
+
deselectByValues(lookupValues: V[]): void;
|
|
795
|
+
/**
|
|
796
|
+
* Runs `clearFunc` against every currently selected item, then clears the CDK selection.
|
|
797
|
+
* The internal tracked list is **not** affected; only the CDK selection is cleared.
|
|
798
|
+
* @param clearFunc - Callback invoked for each currently selected item before clearing.
|
|
799
|
+
*/
|
|
800
|
+
clearCurrent(clearFunc: (item: T) => void): void;
|
|
801
|
+
/**
|
|
802
|
+
* Clears both the internal tracked list and the CDK selection.
|
|
803
|
+
*/
|
|
804
|
+
clear(): void;
|
|
805
|
+
/**
|
|
806
|
+
* Returns `true` when the item identified by `lookupValue` is present in the tracked list.
|
|
807
|
+
* @param lookupValue - The key value to look up.
|
|
808
|
+
*/
|
|
809
|
+
isSelected(lookupValue?: V): boolean;
|
|
807
810
|
}
|
|
808
|
-
|
|
809
811
|
/**
|
|
810
812
|
* Directive that moves browser focus to the host element after the first render cycle.
|
|
811
813
|
* Apply `autoFocus` to any focusable element to set focus automatically on initialisation.
|
|
812
814
|
*/
|
|
813
|
-
declare class AutoFocusDirective {
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
|
|
817
|
-
|
|
815
|
+
export declare class AutoFocusDirective {
|
|
816
|
+
private readonly elementRef;
|
|
817
|
+
constructor();
|
|
818
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<AutoFocusDirective, never>;
|
|
819
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<AutoFocusDirective, "[autoFocus]", never, {}, {}, never, never, true, never>;
|
|
818
820
|
}
|
|
819
|
-
|
|
820
821
|
/**
|
|
821
822
|
* Directive that listens to `keyup` events on a date input and debounces changes
|
|
822
823
|
* into a {@link DateInterval} model, converting shorthand strings (e.g. "d/m") to dates.
|
|
823
824
|
* Apply `[dateIntervalChange]="interval"` to the host `<input>` element.
|
|
824
825
|
*/
|
|
825
|
-
declare class DateIntervalChangeDirective {
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
826
|
+
export declare class DateIntervalChangeDirective {
|
|
827
|
+
/** The date interval model to update when the input value changes. */
|
|
828
|
+
readonly dateIntervalChange: import("@angular/core").InputSignal<DateInterval>;
|
|
829
|
+
/** When `true`, the directive updates the interval's end date; otherwise the start date. */
|
|
830
|
+
readonly end: import("@angular/core").InputSignal<boolean>;
|
|
831
|
+
private readonly subject;
|
|
832
|
+
private readonly destroyRef;
|
|
833
|
+
constructor();
|
|
834
|
+
/**
|
|
835
|
+
* Handles `keydown` events on the host element.
|
|
836
|
+
* The space key must be blocked HERE: by the time `keyup` fires the character
|
|
837
|
+
* has already been inserted into the input, so `preventDefault` on `keyup`
|
|
838
|
+
* cannot stop it.
|
|
839
|
+
* @param e - The keyboard event emitted by the host input.
|
|
840
|
+
*/
|
|
841
|
+
onKeydown(e: KeyboardEvent): void;
|
|
842
|
+
/**
|
|
843
|
+
* Handles `keyup` events on the host element and forwards them to the debounce pipeline.
|
|
844
|
+
* @param e - The keyboard event emitted by the host input.
|
|
845
|
+
*/
|
|
846
|
+
onKeyup(e: KeyboardEvent): void;
|
|
847
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<DateIntervalChangeDirective, never>;
|
|
848
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<DateIntervalChangeDirective, "[dateIntervalChange]", never, {
|
|
849
|
+
"dateIntervalChange": {
|
|
850
|
+
"alias": "dateIntervalChange";
|
|
851
|
+
"required": false;
|
|
852
|
+
"isSignal": true;
|
|
853
|
+
};
|
|
854
|
+
"end": {
|
|
855
|
+
"alias": "end";
|
|
856
|
+
"required": false;
|
|
857
|
+
"isSignal": true;
|
|
858
|
+
};
|
|
859
|
+
}, {}, never, never, true, never>;
|
|
848
860
|
}
|
|
849
|
-
|
|
850
861
|
/**
|
|
851
862
|
* Directive that copies a string payload to the clipboard when the host element is clicked.
|
|
852
863
|
* Bind `[copyClipboard]="text"` to provide the content to copy and listen to `(copied)` for confirmation.
|
|
853
864
|
*/
|
|
854
|
-
declare class CopyClipboardDirective {
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
|
|
865
|
+
export declare class CopyClipboardDirective {
|
|
866
|
+
/** The text to copy to the clipboard. Bound via the `copyClipboard` attribute. */
|
|
867
|
+
readonly payload: import("@angular/core").InputSignal<string>;
|
|
868
|
+
/** Emits the copied text after a successful copy operation. */
|
|
869
|
+
readonly copied: import("@angular/core").OutputEmitterRef<string>;
|
|
870
|
+
/**
|
|
871
|
+
* Handles click events on the host element and copies the payload to the clipboard.
|
|
872
|
+
* Emits `copied` with the copied text on success.
|
|
873
|
+
* @param e - The mouse click event.
|
|
874
|
+
*/
|
|
875
|
+
onClick(e: MouseEvent): void;
|
|
876
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<CopyClipboardDirective, never>;
|
|
877
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<CopyClipboardDirective, "[copyClipboard]", never, {
|
|
878
|
+
"payload": {
|
|
879
|
+
"alias": "copyClipboard";
|
|
880
|
+
"required": false;
|
|
881
|
+
"isSignal": true;
|
|
882
|
+
};
|
|
883
|
+
}, {
|
|
884
|
+
"copied": "copied";
|
|
885
|
+
}, never, never, true, never>;
|
|
867
886
|
}
|
|
868
|
-
|
|
869
887
|
/**
|
|
870
888
|
* Directive that removes focus from the host element after it is clicked,
|
|
871
889
|
* preventing the browser from keeping a visible focus ring post-interaction.
|
|
872
890
|
* Apply `removeFocus` to any focusable element (e.g. a button).
|
|
873
891
|
*/
|
|
874
|
-
declare class RemoveFocusDirective {
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
|
|
892
|
+
export declare class RemoveFocusDirective {
|
|
893
|
+
private readonly elementRef;
|
|
894
|
+
/**
|
|
895
|
+
* Handles click events on the host element and blurs it on the next event-loop tick
|
|
896
|
+
* so that the click action completes before focus is removed.
|
|
897
|
+
*/
|
|
898
|
+
onClick(): void;
|
|
899
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<RemoveFocusDirective, never>;
|
|
900
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<RemoveFocusDirective, "[removeFocus]", never, {}, {}, never, never, true, never>;
|
|
883
901
|
}
|
|
884
|
-
|
|
885
902
|
/**
|
|
886
903
|
* Pipe that converts plain-text newlines (`\r\n`, `\r`, `\n`) to HTML `<br>` tags
|
|
887
904
|
* and marks the result as trusted HTML so Angular does not escape it.
|
|
888
905
|
*
|
|
889
906
|
* Usage: `{{ text | formatHtml }}`
|
|
890
907
|
*/
|
|
891
|
-
declare class FormatHtmlPipe implements PipeTransform {
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
|
|
900
|
-
|
|
901
|
-
|
|
908
|
+
export declare class FormatHtmlPipe implements PipeTransform {
|
|
909
|
+
private readonly sanitizer;
|
|
910
|
+
/**
|
|
911
|
+
* Transforms a plain-text string into sanitized HTML by replacing newline characters
|
|
912
|
+
* with `<br>` tags.
|
|
913
|
+
* @param value - The input string to transform. Treated as an empty string when `undefined`.
|
|
914
|
+
* @returns A `SafeHtml` value that can be rendered with `[innerHTML]`.
|
|
915
|
+
*/
|
|
916
|
+
transform(value?: string): SafeHtml;
|
|
917
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<FormatHtmlPipe, never>;
|
|
918
|
+
static ɵpipe: i0.ɵɵPipeDeclaration<FormatHtmlPipe, "formatHtml", true>;
|
|
902
919
|
}
|
|
903
|
-
|
|
904
920
|
/**
|
|
905
921
|
* General-purpose formatting pipe that converts a raw value to a locale-aware string
|
|
906
922
|
* based on the specified format type.
|
|
@@ -910,25 +926,24 @@ declare class FormatHtmlPipe implements PipeTransform {
|
|
|
910
926
|
*
|
|
911
927
|
* Usage: `{{ value | format:'currency' }}`
|
|
912
928
|
*/
|
|
913
|
-
declare class FormatPipe implements PipeTransform {
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
|
|
929
|
+
export declare class FormatPipe implements PipeTransform {
|
|
930
|
+
/** Shared formatters: building an `Intl.NumberFormat` per call is expensive. */
|
|
931
|
+
private static readonly currencyFormat;
|
|
932
|
+
private static readonly numberFormat;
|
|
933
|
+
private static readonly number0Format;
|
|
934
|
+
private static readonly percentFormat;
|
|
935
|
+
/**
|
|
936
|
+
* Formats a value according to the specified type and optional pattern.
|
|
937
|
+
* Returns `undefined` when the value is `null` or `undefined`, or when the type is unrecognised.
|
|
938
|
+
* @param value - The raw value to format.
|
|
939
|
+
* @param type - The format type identifier (default: `'date'`).
|
|
940
|
+
* @param pattern - The date pattern used when `type` is `'date'` (default: `'dd/MM/yyyy'`).
|
|
941
|
+
* @returns A formatted string, or `undefined` when the value cannot be formatted.
|
|
942
|
+
*/
|
|
943
|
+
transform(value?: unknown, type?: string, pattern?: string): string | undefined;
|
|
944
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<FormatPipe, never>;
|
|
945
|
+
static ɵpipe: i0.ɵɵPipeDeclaration<FormatPipe, "format", true>;
|
|
930
946
|
}
|
|
931
|
-
|
|
932
947
|
/**
|
|
933
948
|
* Pipe that applies a global regex replacement on a string and returns the result
|
|
934
949
|
* as sanitized HTML. When `regexValue` is `'\n'` and no `replaceValue` is given,
|
|
@@ -936,57 +951,54 @@ declare class FormatPipe implements PipeTransform {
|
|
|
936
951
|
*
|
|
937
952
|
* Usage: `{{ text | replace:'\n':'' }}`
|
|
938
953
|
*/
|
|
939
|
-
declare class ReplacePipe implements PipeTransform {
|
|
940
|
-
|
|
941
|
-
|
|
942
|
-
|
|
943
|
-
|
|
944
|
-
|
|
945
|
-
|
|
946
|
-
|
|
947
|
-
|
|
948
|
-
|
|
949
|
-
|
|
950
|
-
|
|
951
|
-
|
|
954
|
+
export declare class ReplacePipe implements PipeTransform {
|
|
955
|
+
private readonly sanitizer;
|
|
956
|
+
/**
|
|
957
|
+
* Replaces all occurrences of `regexValue` in `value` with `replaceValue`.
|
|
958
|
+
* Returns `undefined` when `value` is empty or `undefined`.
|
|
959
|
+
* @param value - The source string to process.
|
|
960
|
+
* @param regexValue - The regex pattern string to match (applied with the global flag).
|
|
961
|
+
* @param replaceValue - The replacement string. Defaults to `'<br>'` when `regexValue` is `'\n'` and this is falsy.
|
|
962
|
+
* @returns A `SafeHtml` value with all matches replaced, or `undefined` when the input is empty.
|
|
963
|
+
*/
|
|
964
|
+
transform(value: string | undefined, regexValue: string, replaceValue?: string): SafeHtml | undefined;
|
|
965
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<ReplacePipe, never>;
|
|
966
|
+
static ɵpipe: i0.ɵɵPipeDeclaration<ReplacePipe, "replace", true>;
|
|
952
967
|
}
|
|
953
|
-
|
|
954
968
|
/**
|
|
955
969
|
* Pipe that marks an HTML string as trusted so Angular does not escape it when
|
|
956
970
|
* bound via `[innerHTML]`.
|
|
957
971
|
*
|
|
958
972
|
* Usage: `<div [innerHTML]="html | safeHtml"></div>`
|
|
959
973
|
*/
|
|
960
|
-
declare class SafeHtmlPipe implements PipeTransform {
|
|
961
|
-
|
|
962
|
-
|
|
963
|
-
|
|
964
|
-
|
|
965
|
-
|
|
966
|
-
|
|
967
|
-
|
|
968
|
-
|
|
969
|
-
|
|
974
|
+
export declare class SafeHtmlPipe implements PipeTransform {
|
|
975
|
+
private readonly sanitizer;
|
|
976
|
+
/**
|
|
977
|
+
* Bypasses Angular's HTML sanitization and returns a `SafeHtml` instance.
|
|
978
|
+
* @param value - The raw HTML string to trust. Treated as an empty string when `undefined`.
|
|
979
|
+
* @returns A `SafeHtml` value that can be bound to `[innerHTML]` without escaping.
|
|
980
|
+
*/
|
|
981
|
+
transform(value?: string): SafeHtml;
|
|
982
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<SafeHtmlPipe, never>;
|
|
983
|
+
static ɵpipe: i0.ɵɵPipeDeclaration<SafeHtmlPipe, "safeHtml", true>;
|
|
970
984
|
}
|
|
971
|
-
|
|
972
985
|
/**
|
|
973
986
|
* Pipe that marks a URL string as a trusted resource URL so Angular does not block it
|
|
974
987
|
* when bound to attributes such as `[src]` or `[href]` on iframes, objects, or embeds.
|
|
975
988
|
*
|
|
976
989
|
* Usage: `<iframe [src]="url | safeUrl"></iframe>`
|
|
977
990
|
*/
|
|
978
|
-
declare class SafeUrlPipe implements PipeTransform {
|
|
979
|
-
|
|
980
|
-
|
|
981
|
-
|
|
982
|
-
|
|
983
|
-
|
|
984
|
-
|
|
985
|
-
|
|
986
|
-
|
|
987
|
-
|
|
991
|
+
export declare class SafeUrlPipe implements PipeTransform {
|
|
992
|
+
private readonly sanitizer;
|
|
993
|
+
/**
|
|
994
|
+
* Bypasses Angular's resource-URL sanitization and returns a `SafeResourceUrl` instance.
|
|
995
|
+
* @param value - The URL string to trust. Treated as an empty string when `undefined`.
|
|
996
|
+
* @returns A `SafeResourceUrl` that can be bound to resource URL attributes without blocking.
|
|
997
|
+
*/
|
|
998
|
+
transform(value?: string): SafeResourceUrl;
|
|
999
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<SafeUrlPipe, never>;
|
|
1000
|
+
static ɵpipe: i0.ɵɵPipeDeclaration<SafeUrlPipe, "safeUrl", true>;
|
|
988
1001
|
}
|
|
989
|
-
|
|
990
1002
|
/**
|
|
991
1003
|
* Impure pipe that filters an array using a caller-provided predicate function.
|
|
992
1004
|
* Because the pipe is impure it re-evaluates on every change-detection cycle,
|
|
@@ -994,20 +1006,19 @@ declare class SafeUrlPipe implements PipeTransform {
|
|
|
994
1006
|
*
|
|
995
1007
|
* Usage: `*ngFor="let item of items | callback:myFilter"`
|
|
996
1008
|
*/
|
|
997
|
-
declare class SearchCallbackPipe implements PipeTransform {
|
|
998
|
-
|
|
999
|
-
|
|
1000
|
-
|
|
1001
|
-
|
|
1002
|
-
|
|
1003
|
-
|
|
1004
|
-
|
|
1005
|
-
|
|
1006
|
-
|
|
1007
|
-
|
|
1008
|
-
|
|
1009
|
+
export declare class SearchCallbackPipe implements PipeTransform {
|
|
1010
|
+
/**
|
|
1011
|
+
* Filters `items` by applying `callback` to each element.
|
|
1012
|
+
* Returns the original array unchanged when either argument is falsy.
|
|
1013
|
+
* @param items - The source array to filter. May be `undefined`.
|
|
1014
|
+
* @param callback - A predicate function that returns `true` for items to keep.
|
|
1015
|
+
* @returns A new filtered array, the original array when no callback is provided,
|
|
1016
|
+
* or `undefined` when `items` is `undefined`.
|
|
1017
|
+
*/
|
|
1018
|
+
transform<T>(items: T[] | undefined, callback: ((item: T) => boolean) | undefined): T[] | undefined;
|
|
1019
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<SearchCallbackPipe, never>;
|
|
1020
|
+
static ɵpipe: i0.ɵɵPipeDeclaration<SearchCallbackPipe, "callback", true>;
|
|
1009
1021
|
}
|
|
1010
|
-
|
|
1011
1022
|
/**
|
|
1012
1023
|
* Pure pipe that filters an array of searchable items against a text query.
|
|
1013
1024
|
* Note: being pure, it re-runs only when the array REFERENCE or the query
|
|
@@ -1024,41 +1035,35 @@ declare class SearchCallbackPipe implements PipeTransform {
|
|
|
1024
1035
|
* <div>Showing {{ meta.count }} of {{ meta.total }}</div>
|
|
1025
1036
|
* ```
|
|
1026
1037
|
*/
|
|
1027
|
-
declare class SearchFilterPipe implements PipeTransform {
|
|
1028
|
-
|
|
1029
|
-
|
|
1030
|
-
|
|
1031
|
-
|
|
1032
|
-
|
|
1033
|
-
|
|
1034
|
-
|
|
1035
|
-
|
|
1036
|
-
|
|
1037
|
-
|
|
1038
|
-
|
|
1039
|
-
|
|
1038
|
+
export declare class SearchFilterPipe implements PipeTransform {
|
|
1039
|
+
/**
|
|
1040
|
+
* Filters `items` by performing a case-insensitive substring match against `value`.
|
|
1041
|
+
* When `items` or `value` is falsy the original array is returned unfiltered.
|
|
1042
|
+
* @param items - The source array to filter. May be `undefined`.
|
|
1043
|
+
* @param value - The search text to match against each item. May be `undefined`.
|
|
1044
|
+
* @param metadata - Optional object that is updated with `total` and `count` after filtering.
|
|
1045
|
+
* @returns The filtered array, the original array when no filter text is given,
|
|
1046
|
+
* or `undefined` when `items` is `undefined`.
|
|
1047
|
+
*/
|
|
1048
|
+
transform(items?: any[], value?: string, metadata?: SearchFilterMetadata): any[] | undefined;
|
|
1049
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<SearchFilterPipe, never>;
|
|
1050
|
+
static ɵpipe: i0.ɵɵPipeDeclaration<SearchFilterPipe, "search", true>;
|
|
1040
1051
|
}
|
|
1041
|
-
|
|
1042
|
-
/**
|
|
1043
|
-
* Standard Broadcast Messages Manager
|
|
1044
|
-
* https://developer.mozilla.org/en-US/docs/Web/API/BroadcastChannel
|
|
1045
|
-
*/
|
|
1046
|
-
|
|
1047
1052
|
/** The typed message payload exchanged over the broadcast channel. */
|
|
1048
|
-
interface BroadcastChannelMessageBag<T> {
|
|
1049
|
-
|
|
1050
|
-
|
|
1051
|
-
|
|
1052
|
-
|
|
1053
|
-
|
|
1054
|
-
|
|
1053
|
+
export interface BroadcastChannelMessageBag<T> {
|
|
1054
|
+
/** Unique identifier for the message type. */
|
|
1055
|
+
messageId: string;
|
|
1056
|
+
/** Identifier of the sender. */
|
|
1057
|
+
sender?: string;
|
|
1058
|
+
/** Optional typed data attached to the message. */
|
|
1059
|
+
data?: T;
|
|
1055
1060
|
}
|
|
1056
1061
|
/** Subscription descriptor that pairs a message type identifier with its handler. */
|
|
1057
|
-
interface BroadcastChannelSubscriberInfo<T> {
|
|
1058
|
-
|
|
1059
|
-
|
|
1060
|
-
|
|
1061
|
-
|
|
1062
|
+
export interface BroadcastChannelSubscriberInfo<T> {
|
|
1063
|
+
/** The message type identifier to listen for. */
|
|
1064
|
+
messageId: string;
|
|
1065
|
+
/** Callback invoked with the full message bag when a matching message is received. */
|
|
1066
|
+
action: (bag: BroadcastChannelMessageBag<T>) => void;
|
|
1062
1067
|
}
|
|
1063
1068
|
/**
|
|
1064
1069
|
* Wrapper around the native Web `BroadcastChannel` API that adds typed messaging,
|
|
@@ -1066,279 +1071,274 @@ interface BroadcastChannelSubscriberInfo<T> {
|
|
|
1066
1071
|
*
|
|
1067
1072
|
* @see https://developer.mozilla.org/en-US/docs/Web/API/BroadcastChannel
|
|
1068
1073
|
*/
|
|
1069
|
-
declare class BroadcastChannelManager {
|
|
1070
|
-
|
|
1071
|
-
|
|
1072
|
-
|
|
1073
|
-
|
|
1074
|
-
|
|
1075
|
-
|
|
1076
|
-
|
|
1077
|
-
|
|
1078
|
-
|
|
1079
|
-
|
|
1080
|
-
|
|
1081
|
-
|
|
1082
|
-
|
|
1083
|
-
|
|
1084
|
-
|
|
1085
|
-
|
|
1086
|
-
|
|
1087
|
-
|
|
1088
|
-
|
|
1089
|
-
|
|
1090
|
-
|
|
1091
|
-
|
|
1092
|
-
|
|
1093
|
-
|
|
1094
|
-
|
|
1095
|
-
|
|
1096
|
-
|
|
1097
|
-
|
|
1098
|
-
|
|
1099
|
-
|
|
1100
|
-
|
|
1101
|
-
|
|
1102
|
-
|
|
1103
|
-
|
|
1104
|
-
|
|
1105
|
-
|
|
1106
|
-
|
|
1107
|
-
|
|
1108
|
-
|
|
1109
|
-
|
|
1110
|
-
|
|
1111
|
-
|
|
1112
|
-
|
|
1113
|
-
|
|
1114
|
-
|
|
1115
|
-
|
|
1116
|
-
|
|
1117
|
-
|
|
1118
|
-
|
|
1119
|
-
|
|
1120
|
-
|
|
1121
|
-
|
|
1122
|
-
|
|
1123
|
-
|
|
1124
|
-
|
|
1125
|
-
|
|
1126
|
-
|
|
1127
|
-
|
|
1128
|
-
|
|
1129
|
-
|
|
1130
|
-
|
|
1131
|
-
|
|
1132
|
-
|
|
1133
|
-
|
|
1134
|
-
|
|
1135
|
-
|
|
1136
|
-
|
|
1137
|
-
|
|
1138
|
-
|
|
1139
|
-
|
|
1140
|
-
|
|
1141
|
-
|
|
1142
|
-
|
|
1143
|
-
|
|
1144
|
-
|
|
1145
|
-
|
|
1146
|
-
|
|
1147
|
-
|
|
1148
|
-
|
|
1149
|
-
|
|
1150
|
-
|
|
1151
|
-
|
|
1074
|
+
export declare class BroadcastChannelManager {
|
|
1075
|
+
private channel?;
|
|
1076
|
+
private readonly subject;
|
|
1077
|
+
private subscriptions;
|
|
1078
|
+
/**
|
|
1079
|
+
* The name of the underlying `BroadcastChannel`, or `undefined` when the API
|
|
1080
|
+
* is not supported by the current browser.
|
|
1081
|
+
*/
|
|
1082
|
+
get currentBus(): string | undefined;
|
|
1083
|
+
/**
|
|
1084
|
+
* Observable that emits EVERY message bag received on the channel,
|
|
1085
|
+
* regardless of `messageId`. Completed by {@link dispose}.
|
|
1086
|
+
* Prefer {@link observe} to listen for a single message type.
|
|
1087
|
+
*/
|
|
1088
|
+
get messages(): Observable<BroadcastChannelMessageBag<unknown>>;
|
|
1089
|
+
/**
|
|
1090
|
+
* Returns a typed Observable that emits only the messages with the given `messageId`.
|
|
1091
|
+
*
|
|
1092
|
+
* Unlike {@link subscribe} (one callback per id, replaced on re-registration),
|
|
1093
|
+
* this supports any number of concurrent subscribers and integrates with the
|
|
1094
|
+
* RxJS lifecycle (`takeUntilDestroyed`, `async` pipe, ...). Completed by {@link dispose}.
|
|
1095
|
+
*
|
|
1096
|
+
* @param messageId - The message type identifier to listen for.
|
|
1097
|
+
* @returns An Observable of the matching typed message bags.
|
|
1098
|
+
*/
|
|
1099
|
+
observe<T>(messageId: string): Observable<BroadcastChannelMessageBag<T>>;
|
|
1100
|
+
/**
|
|
1101
|
+
* Opens a `BroadcastChannel` with the given name (when the API is available).
|
|
1102
|
+
* @param bus - The channel name to open (default: `'ARS-CHANNEL'`).
|
|
1103
|
+
*/
|
|
1104
|
+
constructor(bus?: string);
|
|
1105
|
+
/**
|
|
1106
|
+
* Closes the underlying channel and completes the internal subject after a short delay
|
|
1107
|
+
* to allow any in-flight messages to be delivered.
|
|
1108
|
+
*/
|
|
1109
|
+
dispose(): void;
|
|
1110
|
+
/**
|
|
1111
|
+
* Sends a typed message bag immediately.
|
|
1112
|
+
* @param bag - The message bag to send.
|
|
1113
|
+
* @example
|
|
1114
|
+
* channel.sendMessage({ messageId: 'my-message', sender: 'me', data: value });
|
|
1115
|
+
*/
|
|
1116
|
+
sendMessage<T>(bag: BroadcastChannelMessageBag<T>): void;
|
|
1117
|
+
/**
|
|
1118
|
+
* Sends a typed message bag after an optional delay.
|
|
1119
|
+
* @param bag - The message bag to send.
|
|
1120
|
+
* @param delay - Milliseconds to wait before posting the message.
|
|
1121
|
+
* @example
|
|
1122
|
+
* channel.sendMessage({ messageId: 'my-message', sender: 'me', data: value }, 250);
|
|
1123
|
+
*/
|
|
1124
|
+
sendMessage<T>(bag: BroadcastChannelMessageBag<T>, delay?: number): void;
|
|
1125
|
+
/**
|
|
1126
|
+
* Sends a message identified by a string ID with optional data.
|
|
1127
|
+
* @param messageId - The message type identifier.
|
|
1128
|
+
* @param data - Optional typed payload.
|
|
1129
|
+
* @example
|
|
1130
|
+
* channel.sendMessage('my-message', value);
|
|
1131
|
+
*/
|
|
1132
|
+
sendMessage<T>(messageId: string, data?: T): void;
|
|
1133
|
+
/**
|
|
1134
|
+
* Sends a message identified by a string ID with optional data after an optional delay.
|
|
1135
|
+
* @param messageId - The message type identifier.
|
|
1136
|
+
* @param data - Optional typed payload.
|
|
1137
|
+
* @param delay - Milliseconds to wait before posting the message.
|
|
1138
|
+
* @example
|
|
1139
|
+
* channel.sendMessage('my-message', value, 250);
|
|
1140
|
+
*/
|
|
1141
|
+
sendMessage<T>(messageId: string, data?: T, delay?: number): void;
|
|
1142
|
+
/**
|
|
1143
|
+
* Registers a handler for messages with the given `messageId`.
|
|
1144
|
+
* If a handler for the same `messageId` is already registered it is replaced.
|
|
1145
|
+
* @param args - The subscription descriptor containing the message ID and handler.
|
|
1146
|
+
*/
|
|
1147
|
+
subscribe<T>(args: BroadcastChannelSubscriberInfo<T>): void;
|
|
1148
|
+
/**
|
|
1149
|
+
* Removes the subscription for the given message ID, if one exists.
|
|
1150
|
+
* @param messageId - The message type identifier whose subscription should be removed.
|
|
1151
|
+
*/
|
|
1152
|
+
unsubscribe(messageId: string): void;
|
|
1153
|
+
/**
|
|
1154
|
+
* Removes all registered subscriptions.
|
|
1155
|
+
*/
|
|
1156
|
+
unsubscribeAll(): void;
|
|
1152
1157
|
}
|
|
1153
|
-
|
|
1154
|
-
declare const CHANNEL_NAME = "D2693418-B18F-41BB-BAE9-41BB5407957A-CHANNEL";
|
|
1158
|
+
export declare const CHANNEL_NAME = "D2693418-B18F-41BB-BAE9-41BB5407957A-CHANNEL";
|
|
1155
1159
|
/** Payload carried by every in-process broadcast message. */
|
|
1156
|
-
interface BroadcastMessageInfo {
|
|
1157
|
-
|
|
1158
|
-
|
|
1159
|
-
|
|
1160
|
-
|
|
1160
|
+
export interface BroadcastMessageInfo {
|
|
1161
|
+
/** Unique identifier for the message type. */
|
|
1162
|
+
id: string;
|
|
1163
|
+
/** Optional data attached to the message. */
|
|
1164
|
+
data?: any;
|
|
1161
1165
|
}
|
|
1162
|
-
interface BroadcastMessageToastData {
|
|
1163
|
-
|
|
1164
|
-
|
|
1165
|
-
|
|
1166
|
+
export interface BroadcastMessageToastData {
|
|
1167
|
+
message: string;
|
|
1168
|
+
icon?: string;
|
|
1169
|
+
duration?: number;
|
|
1166
1170
|
}
|
|
1167
1171
|
/**
|
|
1168
1172
|
* Application-level messaging service that combines two transports:
|
|
1169
1173
|
* - An in-process RxJS `Subject` for same-tab communication (`sendMessage` / `getMessage`).
|
|
1170
1174
|
* - A native `BroadcastChannel` for cross-tab communication (`sendChannelMessage` / `subscribeChannelMessage`).
|
|
1171
1175
|
*/
|
|
1172
|
-
declare class BroadcastService implements OnDestroy {
|
|
1173
|
-
|
|
1174
|
-
|
|
1175
|
-
|
|
1176
|
-
|
|
1177
|
-
|
|
1178
|
-
|
|
1179
|
-
|
|
1180
|
-
|
|
1181
|
-
|
|
1182
|
-
|
|
1183
|
-
|
|
1184
|
-
|
|
1185
|
-
|
|
1186
|
-
|
|
1187
|
-
|
|
1188
|
-
|
|
1189
|
-
|
|
1190
|
-
|
|
1191
|
-
|
|
1192
|
-
|
|
1193
|
-
|
|
1194
|
-
|
|
1195
|
-
|
|
1196
|
-
|
|
1197
|
-
|
|
1198
|
-
|
|
1199
|
-
|
|
1200
|
-
|
|
1201
|
-
|
|
1202
|
-
|
|
1203
|
-
|
|
1204
|
-
|
|
1205
|
-
|
|
1206
|
-
|
|
1207
|
-
|
|
1208
|
-
|
|
1209
|
-
|
|
1210
|
-
|
|
1211
|
-
|
|
1212
|
-
|
|
1213
|
-
|
|
1214
|
-
|
|
1215
|
-
|
|
1216
|
-
|
|
1217
|
-
|
|
1218
|
-
|
|
1219
|
-
|
|
1220
|
-
|
|
1221
|
-
|
|
1222
|
-
|
|
1223
|
-
|
|
1224
|
-
|
|
1225
|
-
|
|
1226
|
-
|
|
1227
|
-
|
|
1176
|
+
export declare class BroadcastService implements OnDestroy {
|
|
1177
|
+
private readonly subject;
|
|
1178
|
+
private readonly channel;
|
|
1179
|
+
/**
|
|
1180
|
+
* Creates a new standalone `BroadcastChannelManager` instance bound to the shared ARS channel.
|
|
1181
|
+
* Useful when a caller needs direct channel access outside the service.
|
|
1182
|
+
* @returns A new `BroadcastChannelManager` connected to the shared channel.
|
|
1183
|
+
*/
|
|
1184
|
+
static createChannel(): BroadcastChannelManager;
|
|
1185
|
+
ngOnDestroy(): void;
|
|
1186
|
+
/**
|
|
1187
|
+
* Publishes a message to the in-process subject, optionally after a delay.
|
|
1188
|
+
* @param id - The message type identifier.
|
|
1189
|
+
* @param data - Optional payload to attach to the message.
|
|
1190
|
+
* @param delay - Milliseconds to wait before publishing (default: `0`).
|
|
1191
|
+
*/
|
|
1192
|
+
sendMessage(id: string, data?: any, delay?: number): void;
|
|
1193
|
+
/**
|
|
1194
|
+
* Publishes a typed message over the native `BroadcastChannel` (cross-tab), optionally after a delay.
|
|
1195
|
+
* @param id - The message type identifier.
|
|
1196
|
+
* @param data - Optional typed payload to send.
|
|
1197
|
+
* @param delay - Milliseconds to wait before sending (forwarded to the channel manager).
|
|
1198
|
+
*/
|
|
1199
|
+
sendChannelMessage<T>(id: string, data?: T, delay?: number): void;
|
|
1200
|
+
/**
|
|
1201
|
+
* Registers a handler that is invoked whenever a channel message with the given `id` is received.
|
|
1202
|
+
* @param id - The message type identifier to listen for.
|
|
1203
|
+
* @param action - Callback invoked with the full `BroadcastChannelMessageBag` when a matching message arrives.
|
|
1204
|
+
*/
|
|
1205
|
+
subscribeChannelMessage<T>(id: string, action: (bag: BroadcastChannelMessageBag<T>) => void): void;
|
|
1206
|
+
/**
|
|
1207
|
+
* Removes the channel subscription previously registered for the given `id`, if any.
|
|
1208
|
+
* @param id - The message type identifier whose subscription should be removed.
|
|
1209
|
+
*/
|
|
1210
|
+
unsubscribeChannelMessage(id: string): void;
|
|
1211
|
+
/**
|
|
1212
|
+
* Returns a typed Observable of the cross-tab channel messages with the given `id`.
|
|
1213
|
+
* Supports multiple concurrent subscribers and the RxJS lifecycle operators,
|
|
1214
|
+
* unlike `subscribeChannelMessage` (single callback per id).
|
|
1215
|
+
* @param id - The message type identifier to listen for.
|
|
1216
|
+
* @returns An Observable of the matching typed message bags.
|
|
1217
|
+
*/
|
|
1218
|
+
observeChannelMessage<T>(id: string): Observable<BroadcastChannelMessageBag<T>>;
|
|
1219
|
+
/**
|
|
1220
|
+
* Returns an `Observable` that emits every in-process message published via `sendMessage`.
|
|
1221
|
+
* @returns An observable stream of `BroadcastMessageInfo` objects.
|
|
1222
|
+
*/
|
|
1223
|
+
getMessage(): Observable<BroadcastMessageInfo>;
|
|
1224
|
+
/**
|
|
1225
|
+
* Returns a typed `Observable` of the in-process messages with the given `id`.
|
|
1226
|
+
* @param id - The message type identifier to listen for.
|
|
1227
|
+
* @returns An Observable emitting the typed `data` payload of each matching message.
|
|
1228
|
+
*/
|
|
1229
|
+
observeMessage<T>(id: string): Observable<T | undefined>;
|
|
1230
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<BroadcastService, never>;
|
|
1231
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<any>;
|
|
1228
1232
|
}
|
|
1229
|
-
|
|
1230
1233
|
/**
|
|
1231
1234
|
* Application-wide environment configuration service.
|
|
1232
1235
|
* Exposes writable signals for the base URIs used throughout the application.
|
|
1233
1236
|
* Values should be set once during application bootstrap (e.g. in `APP_INITIALIZER`).
|
|
1234
1237
|
*/
|
|
1235
|
-
declare class EnvironmentService {
|
|
1236
|
-
|
|
1237
|
-
|
|
1238
|
-
|
|
1239
|
-
|
|
1240
|
-
|
|
1241
|
-
|
|
1242
|
-
|
|
1243
|
-
|
|
1244
|
-
|
|
1245
|
-
|
|
1246
|
-
|
|
1247
|
-
|
|
1248
|
-
|
|
1249
|
-
|
|
1250
|
-
|
|
1251
|
-
|
|
1252
|
-
|
|
1253
|
-
|
|
1254
|
-
|
|
1255
|
-
|
|
1256
|
-
|
|
1257
|
-
|
|
1258
|
-
|
|
1259
|
-
|
|
1260
|
-
|
|
1261
|
-
|
|
1262
|
-
|
|
1263
|
-
|
|
1264
|
-
|
|
1265
|
-
|
|
1266
|
-
|
|
1267
|
-
|
|
1268
|
-
|
|
1269
|
-
|
|
1270
|
-
|
|
1271
|
-
|
|
1272
|
-
|
|
1273
|
-
|
|
1274
|
-
|
|
1275
|
-
|
|
1238
|
+
export declare class EnvironmentService {
|
|
1239
|
+
/** Writable signal holding the base URI of the frontend application (e.g. `https://app.example.com`). */
|
|
1240
|
+
readonly appUriSignal: import("@angular/core").WritableSignal<string>;
|
|
1241
|
+
/** Writable signal holding the base URI of the backend API service (e.g. `https://api.example.com`). */
|
|
1242
|
+
readonly appServiceUriSignal: import("@angular/core").WritableSignal<string>;
|
|
1243
|
+
/**
|
|
1244
|
+
* Writable signal holding the redirect URI used after login.
|
|
1245
|
+
* When empty, `appLoginRedirectUri` falls back to `appUri`.
|
|
1246
|
+
*/
|
|
1247
|
+
readonly appLoginRedirectUriSignal: import("@angular/core").WritableSignal<string>;
|
|
1248
|
+
/**
|
|
1249
|
+
* Writable signal holding the login endpoint URI of the backend service.
|
|
1250
|
+
* When empty, `appServiceLoginUri` falls back to `appServiceUri`.
|
|
1251
|
+
*/
|
|
1252
|
+
readonly appServiceLoginUriSignal: import("@angular/core").WritableSignal<string>;
|
|
1253
|
+
private readonly _effectiveLoginRedirectUri;
|
|
1254
|
+
private readonly _effectiveServiceLoginUri;
|
|
1255
|
+
/** Base URI of the frontend application. */
|
|
1256
|
+
get appUri(): string;
|
|
1257
|
+
/** @param value - The base URI of the frontend application. */
|
|
1258
|
+
set appUri(value: string);
|
|
1259
|
+
/** Base URI of the backend API service. */
|
|
1260
|
+
get appServiceUri(): string;
|
|
1261
|
+
/** @param value - The base URI of the backend API service. */
|
|
1262
|
+
set appServiceUri(value: string);
|
|
1263
|
+
/**
|
|
1264
|
+
* Effective login redirect URI.
|
|
1265
|
+
* Returns the explicitly set value, or falls back to `appUri` when empty.
|
|
1266
|
+
*/
|
|
1267
|
+
get appLoginRedirectUri(): string;
|
|
1268
|
+
/** @param value - The redirect URI to use after login. */
|
|
1269
|
+
set appLoginRedirectUri(value: string);
|
|
1270
|
+
/**
|
|
1271
|
+
* Effective service login URI.
|
|
1272
|
+
* Returns the explicitly set value, or falls back to `appServiceUri` when empty.
|
|
1273
|
+
*/
|
|
1274
|
+
get appServiceLoginUri(): string;
|
|
1275
|
+
/** @param value - The login endpoint URI of the backend service. */
|
|
1276
|
+
set appServiceLoginUri(value: string);
|
|
1277
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<EnvironmentService, never>;
|
|
1278
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<any>;
|
|
1276
1279
|
}
|
|
1277
|
-
|
|
1278
1280
|
/**
|
|
1279
1281
|
* Service that exposes reactive screen and device-capability information.
|
|
1280
1282
|
*/
|
|
1281
|
-
declare class ScreenService {
|
|
1282
|
-
|
|
1283
|
-
|
|
1284
|
-
|
|
1285
|
-
|
|
1286
|
-
|
|
1287
|
-
|
|
1288
|
-
|
|
1289
|
-
|
|
1290
|
-
|
|
1291
|
-
|
|
1292
|
-
|
|
1293
|
-
|
|
1294
|
-
|
|
1295
|
-
|
|
1296
|
-
|
|
1297
|
-
|
|
1298
|
-
|
|
1299
|
-
|
|
1283
|
+
export declare class ScreenService {
|
|
1284
|
+
/**
|
|
1285
|
+
* Writable signal that holds the current Material breakpoint alias
|
|
1286
|
+
* (e.g. `'xs'`, `'sm'`, `'md'`, `'lg'`, `'xl'`).
|
|
1287
|
+
* Updated externally by the breakpoint observer in the consuming component or module.
|
|
1288
|
+
*/
|
|
1289
|
+
readonly mq: import("@angular/core").WritableSignal<string>;
|
|
1290
|
+
/**
|
|
1291
|
+
* Returns `true` when the primary input mechanism can hover over elements
|
|
1292
|
+
* with coarse pointer precision (i.e. a touch screen).
|
|
1293
|
+
*/
|
|
1294
|
+
get isTouchable(): boolean;
|
|
1295
|
+
/**
|
|
1296
|
+
* Returns `true` when the current browser is Internet Explorer or the legacy Edge (EdgeHTML).
|
|
1297
|
+
* Modern Chromium-based Edge reports a different user-agent and will return `false`.
|
|
1298
|
+
*/
|
|
1299
|
+
get isIEOrEdge(): boolean;
|
|
1300
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<ScreenService, never>;
|
|
1301
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<any>;
|
|
1300
1302
|
}
|
|
1301
|
-
|
|
1302
|
-
|
|
1303
|
-
|
|
1304
|
-
|
|
1305
|
-
|
|
1306
|
-
|
|
1307
|
-
|
|
1308
|
-
|
|
1309
|
-
|
|
1310
|
-
|
|
1311
|
-
|
|
1312
|
-
|
|
1313
|
-
|
|
1314
|
-
|
|
1315
|
-
|
|
1316
|
-
|
|
1317
|
-
|
|
1318
|
-
|
|
1319
|
-
|
|
1320
|
-
|
|
1321
|
-
|
|
1322
|
-
|
|
1323
|
-
|
|
1324
|
-
|
|
1325
|
-
|
|
1326
|
-
|
|
1327
|
-
|
|
1328
|
-
|
|
1329
|
-
|
|
1330
|
-
|
|
1331
|
-
|
|
1332
|
-
|
|
1333
|
-
|
|
1334
|
-
|
|
1335
|
-
|
|
1336
|
-
|
|
1337
|
-
static ɵprov: i0.ɵɵInjectableDeclaration<any>;
|
|
1303
|
+
export declare class SplashService {
|
|
1304
|
+
private readonly isBrowser;
|
|
1305
|
+
/**
|
|
1306
|
+
* Resolve the global splash API exposed by index.html.
|
|
1307
|
+
* @returns The API object, or `undefined` when the splash has already
|
|
1308
|
+
* been removed or when running in SSR.
|
|
1309
|
+
*/
|
|
1310
|
+
private get api();
|
|
1311
|
+
/**
|
|
1312
|
+
* Update the splash message (e.g. "Accesso in corso...").
|
|
1313
|
+
* No-op when the splash is gone or in SSR.
|
|
1314
|
+
* @param text - The new message to display.
|
|
1315
|
+
*/
|
|
1316
|
+
setMessage(text: string): void;
|
|
1317
|
+
/**
|
|
1318
|
+
* Defuse the watchdog: Angular bootstrap succeeded,
|
|
1319
|
+
* no automatic reload will ever fire.
|
|
1320
|
+
*/
|
|
1321
|
+
bootstrapped(): void;
|
|
1322
|
+
/** Fade out and remove the splash overlay from the DOM. */
|
|
1323
|
+
hide(): void;
|
|
1324
|
+
/**
|
|
1325
|
+
* Give up on loading, without taking the splash away.
|
|
1326
|
+
*
|
|
1327
|
+
* The splash stays where it is but stops pretending something is still happening: the progress
|
|
1328
|
+
* bar goes and a reload button appears, so a user who would otherwise sit in front of an endless
|
|
1329
|
+
* animation has something to do. Uncovering the page instead would be worse — whatever is
|
|
1330
|
+
* underneath is, by definition, not ready.
|
|
1331
|
+
*
|
|
1332
|
+
* Falls back to {@link setMessage} where `index.html` does not publish `fail`: the user still
|
|
1333
|
+
* reads what happened, only without the button.
|
|
1334
|
+
* @param text - What to tell the user.
|
|
1335
|
+
*/
|
|
1336
|
+
fail(text: string): void;
|
|
1337
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<SplashService, never>;
|
|
1338
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<any>;
|
|
1338
1339
|
}
|
|
1339
|
-
|
|
1340
1340
|
/** The three available theme modes: follow system preference, force light, or force dark. */
|
|
1341
|
-
type ThemeType = 'auto' | 'light' | 'dark';
|
|
1341
|
+
export type ThemeType = 'auto' | 'light' | 'dark';
|
|
1342
1342
|
/**
|
|
1343
1343
|
* Application-level theme management service.
|
|
1344
1344
|
*
|
|
@@ -1349,73 +1349,70 @@ type ThemeType = 'auto' | 'light' | 'dark';
|
|
|
1349
1349
|
* - Synchronises theme changes across browser tabs via `BroadcastChannel`.
|
|
1350
1350
|
* - Exposes reactive signals (`themeIcon`, `themeName`, `toggleTooltip`) for the UI.
|
|
1351
1351
|
*/
|
|
1352
|
-
declare class ThemeService implements OnDestroy {
|
|
1353
|
-
|
|
1354
|
-
|
|
1355
|
-
|
|
1356
|
-
|
|
1357
|
-
|
|
1358
|
-
|
|
1359
|
-
|
|
1360
|
-
|
|
1361
|
-
|
|
1362
|
-
|
|
1363
|
-
|
|
1364
|
-
|
|
1365
|
-
|
|
1366
|
-
|
|
1367
|
-
|
|
1368
|
-
|
|
1369
|
-
|
|
1370
|
-
|
|
1371
|
-
|
|
1372
|
-
|
|
1373
|
-
|
|
1374
|
-
|
|
1375
|
-
|
|
1376
|
-
|
|
1377
|
-
|
|
1378
|
-
|
|
1379
|
-
|
|
1380
|
-
|
|
1381
|
-
|
|
1382
|
-
|
|
1383
|
-
|
|
1384
|
-
|
|
1385
|
-
|
|
1386
|
-
|
|
1387
|
-
|
|
1388
|
-
|
|
1389
|
-
|
|
1390
|
-
|
|
1391
|
-
|
|
1392
|
-
|
|
1393
|
-
|
|
1394
|
-
|
|
1395
|
-
|
|
1396
|
-
|
|
1397
|
-
|
|
1398
|
-
|
|
1399
|
-
|
|
1400
|
-
|
|
1401
|
-
|
|
1402
|
-
|
|
1403
|
-
|
|
1404
|
-
|
|
1405
|
-
|
|
1406
|
-
|
|
1407
|
-
|
|
1408
|
-
|
|
1409
|
-
|
|
1410
|
-
|
|
1411
|
-
|
|
1412
|
-
|
|
1413
|
-
|
|
1414
|
-
|
|
1415
|
-
|
|
1416
|
-
|
|
1417
|
-
|
|
1418
|
-
}
|
|
1419
|
-
|
|
1420
|
-
export { AutoFocusDirective, BroadcastChannelManager, BroadcastService, CHANNEL_NAME, CopyClipboardDirective, DateFormat, DateInterval, DateIntervalChangeDirective, DeleteModel, DtoUtils, EnvironmentService, FileInfo, FormatHtmlPipe, FormatPipe, GroupModel, IDModel, ImportModel, LoginOAuthType, QueryModel, RelationModel, RemoveFocusDirective, ReplacePipe, SafeHtmlPipe, SafeUrlPipe, ScreenService, SearchCallbackPipe, SearchFilterPipe, SelectableModel, SplashService, SystemUtils, ThemeService, UpdateRelationsModel, UtilsMessages, ValueModel };
|
|
1421
|
-
export type { AddModel, AddResultModel, ApiResponse, ApiResult, BroadcastChannelMessageBag, BroadcastChannelSubscriberInfo, BroadcastMessageInfo, BroadcastMessageToastData, Checkable, DeleteResultModel, DoneResult, Dto, EnableDisableModel, ErrorInfo, File, Folder, FolderTree, INode, KeyOf, LoginOAuthResult, LoginResult, NameValueItem, PasswordStrength, QueryResultModel, SearchBag, SearchFilterMetadata, Searchable, SendToModel, ThemeType, UpdateModel, UpdateResultModel, Validated };
|
|
1352
|
+
export declare class ThemeService implements OnDestroy {
|
|
1353
|
+
private readonly broadcastChannel;
|
|
1354
|
+
private readonly broadcastMessage;
|
|
1355
|
+
private readonly prefersColorSchemeMediaQueryList;
|
|
1356
|
+
/**
|
|
1357
|
+
* Observable that emits the resolved (`'light'` or `'dark'`) theme whenever it changes.
|
|
1358
|
+
* Useful for components that cannot consume signals directly (e.g. class-based guards).
|
|
1359
|
+
* @example
|
|
1360
|
+
* this.themeService.changed
|
|
1361
|
+
* .pipe(takeUntilDestroyed(this.destroyRef))
|
|
1362
|
+
* .subscribe(theme => { ... });
|
|
1363
|
+
*/
|
|
1364
|
+
readonly changed: Observable<ThemeType>;
|
|
1365
|
+
private readonly themeChanged;
|
|
1366
|
+
private readonly renderFactory2;
|
|
1367
|
+
private readonly renderer;
|
|
1368
|
+
/** The currently selected `ThemeType` (may be `'auto'`). */
|
|
1369
|
+
private readonly theme;
|
|
1370
|
+
/** `true` when the theme is set to follow the system preference. */
|
|
1371
|
+
private readonly auto;
|
|
1372
|
+
private readonly themeInfo;
|
|
1373
|
+
/** Reactive Material icon code for the current theme (use with `<mat-icon>`). */
|
|
1374
|
+
readonly themeIcon: Signal<string>;
|
|
1375
|
+
/** Reactive human-readable name of the current theme. */
|
|
1376
|
+
readonly themeName: Signal<string>;
|
|
1377
|
+
/** Reactive tooltip text for the theme toggle button. */
|
|
1378
|
+
readonly toggleTooltip: Signal<string>;
|
|
1379
|
+
constructor();
|
|
1380
|
+
/**
|
|
1381
|
+
* Initialises the service: loads the preferred theme, registers OS-change listener,
|
|
1382
|
+
* and subscribes to cross-tab broadcast messages.
|
|
1383
|
+
* Call this once during application bootstrap (e.g. in `APP_INITIALIZER`).
|
|
1384
|
+
* @param theme - The initial theme to apply (defaults to the value stored in `localStorage`).
|
|
1385
|
+
*/
|
|
1386
|
+
initialize(theme?: ThemeType): void;
|
|
1387
|
+
ngOnDestroy(): void;
|
|
1388
|
+
/**
|
|
1389
|
+
* Advances the theme through the cycle: `auto` → `light` → `dark` → `auto`.
|
|
1390
|
+
*/
|
|
1391
|
+
toggleTheme(): void;
|
|
1392
|
+
/**
|
|
1393
|
+
* Returns the resolved effective theme (`'light'` or `'dark'`), taking the OS preference
|
|
1394
|
+
* into account when the current mode is `'auto'`.
|
|
1395
|
+
* @returns `'light'` or `'dark'` — never `'auto'`.
|
|
1396
|
+
*/
|
|
1397
|
+
getTheme(): ThemeType;
|
|
1398
|
+
/**
|
|
1399
|
+
* Reads the theme stored in `localStorage` and validates it.
|
|
1400
|
+
* Falls back to `'auto'` when the stored value is missing or invalid.
|
|
1401
|
+
* @returns The persisted `ThemeType`, or `'auto'` as default.
|
|
1402
|
+
*/
|
|
1403
|
+
private getPreferredTheme;
|
|
1404
|
+
/**
|
|
1405
|
+
* Returns `true` when `value` is a valid `ThemeType` string.
|
|
1406
|
+
* Acts as a TypeScript type guard.
|
|
1407
|
+
* @param value - The string to check.
|
|
1408
|
+
*/
|
|
1409
|
+
private isTheme;
|
|
1410
|
+
/**
|
|
1411
|
+
* Applies the given theme to `<body>` (CSS class), persists it to `localStorage`,
|
|
1412
|
+
* notifies the `changed` observable, and broadcasts the change to other tabs.
|
|
1413
|
+
* @param theme - The `ThemeType` to apply (defaults to `'auto'`).
|
|
1414
|
+
*/
|
|
1415
|
+
private setTheme;
|
|
1416
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<ThemeService, never>;
|
|
1417
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<any>;
|
|
1418
|
+
}
|