cloud-ide-academics 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +63 -0
- package/fesm2022/cloud-ide-academics.mjs +1536 -0
- package/fesm2022/cloud-ide-academics.mjs.map +1 -0
- package/index.d.ts +377 -0
- package/package.json +23 -0
package/index.d.ts
ADDED
|
@@ -0,0 +1,377 @@
|
|
|
1
|
+
import { Route } from '@angular/router';
|
|
2
|
+
import * as _angular_core from '@angular/core';
|
|
3
|
+
import { OnInit, OnDestroy, TemplateRef } from '@angular/core';
|
|
4
|
+
import { FormGroup, FormArray } from '@angular/forms';
|
|
5
|
+
import { TabItem, TemplateContext, GridConfiguration, GridEvent, DropdownConfig, DropdownItem } from 'cloud-ide-element';
|
|
6
|
+
import { Observable } from 'rxjs';
|
|
7
|
+
import { MAcademicYear, academicYearControllerResponse, MAcademicYearGetByIdPayload, academicYearByIdControllerResponse, MAcademicYearInsertUpdatePayload, academicYearInsertUpdateControllerResponse, MAcademicYearDeletePayload, academicYearDeleteControllerResponse, MAcademicYearToggleStatusPayload, academicYearToggleStatusControllerResponse, academicYearMappingInsertUpdateControllerResponse, MAcademicYearMapping, academicYearMappingControllerResponse, MAcademicYearMappingGetByIdPayload, academicYearMappingByIdControllerResponse, MAcademicYearMappingInsertUpdatePayload, MAcademicYearMappingDeletePayload, academicYearMappingDeleteControllerResponse, MAcademicYearMappingToggleStatusPayload, academicYearMappingToggleStatusControllerResponse } from 'cloud-ide-lms-model';
|
|
8
|
+
|
|
9
|
+
declare const academicsRoutes: Route[];
|
|
10
|
+
|
|
11
|
+
interface AcademicYearMapping$1 {
|
|
12
|
+
_id?: string;
|
|
13
|
+
acayrmp_entity_id_syen: string;
|
|
14
|
+
acayrmp_islocked?: boolean;
|
|
15
|
+
acayrmp_iscurrent?: boolean;
|
|
16
|
+
}
|
|
17
|
+
interface Entity {
|
|
18
|
+
_id?: string;
|
|
19
|
+
syen_name?: string;
|
|
20
|
+
syen_code?: string;
|
|
21
|
+
}
|
|
22
|
+
declare class AcademicYearCreateComponent implements OnInit, OnDestroy {
|
|
23
|
+
private readonly destroyRef;
|
|
24
|
+
private readonly fb;
|
|
25
|
+
private readonly academicYearService;
|
|
26
|
+
private readonly academicYearMappingService;
|
|
27
|
+
private readonly entityService;
|
|
28
|
+
private readonly router;
|
|
29
|
+
private readonly route;
|
|
30
|
+
academicYearForm: FormGroup;
|
|
31
|
+
readonly activeTab: _angular_core.WritableSignal<string>;
|
|
32
|
+
readonly loading: _angular_core.WritableSignal<boolean>;
|
|
33
|
+
readonly error: _angular_core.WritableSignal<string | null>;
|
|
34
|
+
readonly academicYearId: _angular_core.WritableSignal<string>;
|
|
35
|
+
readonly isEditMode: _angular_core.WritableSignal<boolean>;
|
|
36
|
+
readonly originalMappings: _angular_core.WritableSignal<AcademicYearMapping$1[]>;
|
|
37
|
+
readonly entityOptions: _angular_core.WritableSignal<Entity[]>;
|
|
38
|
+
constructor();
|
|
39
|
+
ngOnInit(): void;
|
|
40
|
+
/**
|
|
41
|
+
* Initialize component
|
|
42
|
+
*/
|
|
43
|
+
private initializeComponent;
|
|
44
|
+
/**
|
|
45
|
+
* Load dropdown options
|
|
46
|
+
*/
|
|
47
|
+
private loadDropdownOptions;
|
|
48
|
+
/**
|
|
49
|
+
* Load academic year data for edit mode
|
|
50
|
+
*/
|
|
51
|
+
private loadAcademicYearData;
|
|
52
|
+
/**
|
|
53
|
+
* Load academic year mappings for edit mode
|
|
54
|
+
*/
|
|
55
|
+
private loadAcademicYearMappings;
|
|
56
|
+
/**
|
|
57
|
+
* Populate form with academic year data
|
|
58
|
+
*/
|
|
59
|
+
private populateFormWithAcademicYearData;
|
|
60
|
+
/**
|
|
61
|
+
* Populate form with mappings data
|
|
62
|
+
*/
|
|
63
|
+
private populateFormWithMappingsData;
|
|
64
|
+
/**
|
|
65
|
+
* Tab configuration
|
|
66
|
+
*/
|
|
67
|
+
academicYearTabs(): {
|
|
68
|
+
id: string;
|
|
69
|
+
label: string;
|
|
70
|
+
icon: string;
|
|
71
|
+
}[];
|
|
72
|
+
onTabChange(tab: TabItem): void;
|
|
73
|
+
onSubmit(): void;
|
|
74
|
+
/**
|
|
75
|
+
* Mark all form controls as touched to trigger validation display
|
|
76
|
+
*/
|
|
77
|
+
private markFormGroupTouched;
|
|
78
|
+
resetForm(): void;
|
|
79
|
+
/**
|
|
80
|
+
* Go back to academic year list
|
|
81
|
+
*/
|
|
82
|
+
goBackToAcademicYearList(): void;
|
|
83
|
+
/**
|
|
84
|
+
* Cancel form and optionally navigate back
|
|
85
|
+
*/
|
|
86
|
+
cancelForm(): void;
|
|
87
|
+
/**
|
|
88
|
+
* Get page title based on mode
|
|
89
|
+
*/
|
|
90
|
+
getPageTitle(): string;
|
|
91
|
+
/**
|
|
92
|
+
* Getter methods for form arrays
|
|
93
|
+
*/
|
|
94
|
+
get academicYearMappingsArray(): FormArray;
|
|
95
|
+
/**
|
|
96
|
+
* Add new academic year mapping
|
|
97
|
+
*/
|
|
98
|
+
addAcademicYearMapping(): void;
|
|
99
|
+
/**
|
|
100
|
+
* Update academic year ID in all existing mappings when academic year ID changes
|
|
101
|
+
*/
|
|
102
|
+
private updateMappingsAcademicYearId;
|
|
103
|
+
/**
|
|
104
|
+
* Get form array value for validation or submission
|
|
105
|
+
*/
|
|
106
|
+
getAcademicYearMappingsValue(): any[];
|
|
107
|
+
/**
|
|
108
|
+
* Check if mappings array has any invalid controls
|
|
109
|
+
*/
|
|
110
|
+
isMappingsArrayValid(): boolean;
|
|
111
|
+
/**
|
|
112
|
+
* Set academic year ID for all existing mappings
|
|
113
|
+
* This is useful when the academic year ID is generated after creation
|
|
114
|
+
*/
|
|
115
|
+
setAcademicYearIdForMappings(academicYearId: string): void;
|
|
116
|
+
/**
|
|
117
|
+
* Validate that all mappings have required fields
|
|
118
|
+
*/
|
|
119
|
+
validateMappings(): boolean;
|
|
120
|
+
/**
|
|
121
|
+
* Find duplicate entity selection in mappings
|
|
122
|
+
*/
|
|
123
|
+
private findDuplicateEntitySelection;
|
|
124
|
+
/**
|
|
125
|
+
* Remove academic year mapping
|
|
126
|
+
*/
|
|
127
|
+
removeAcademicYearMapping(index: number): void;
|
|
128
|
+
/**
|
|
129
|
+
* Handle entity selection change for a specific mapping
|
|
130
|
+
*/
|
|
131
|
+
onMappingEntityChange(event: any, mappingIndex: number): void;
|
|
132
|
+
/**
|
|
133
|
+
* Get filtered entity options excluding already selected entities in other mappings
|
|
134
|
+
* @param currentMappingIndex The index of the current mapping being edited
|
|
135
|
+
* @returns Entity options excluding already selected entities
|
|
136
|
+
*/
|
|
137
|
+
getFilteredEntityOptions(currentMappingIndex: number): any[];
|
|
138
|
+
/**
|
|
139
|
+
* Get all currently selected entity IDs from other mappings
|
|
140
|
+
*/
|
|
141
|
+
private getSelectedEntityIds;
|
|
142
|
+
/**
|
|
143
|
+
* Update entity options for all mappings to prevent duplicates
|
|
144
|
+
*/
|
|
145
|
+
private updateEntityOptionsForMappings;
|
|
146
|
+
/**
|
|
147
|
+
* Check if an entity is disabled for a specific mapping
|
|
148
|
+
*/
|
|
149
|
+
isEntityDisabled(entityId: string, mappingIndex: number): boolean;
|
|
150
|
+
/**
|
|
151
|
+
* Get the count of available entities for a specific mapping
|
|
152
|
+
*/
|
|
153
|
+
getAvailableEntityCount(mappingIndex: number): number;
|
|
154
|
+
/**
|
|
155
|
+
* Get the count of total entities
|
|
156
|
+
*/
|
|
157
|
+
getTotalEntityCount(): number;
|
|
158
|
+
/**
|
|
159
|
+
* Check if all entities are already selected in other mappings
|
|
160
|
+
* @param currentMappingIndex The index of the current mapping being edited
|
|
161
|
+
* @returns True if all entities are already selected
|
|
162
|
+
*/
|
|
163
|
+
isAllEntitiesSelected(currentMappingIndex: number): boolean;
|
|
164
|
+
/**
|
|
165
|
+
* Check if all entities are already mapped (for disabling Add Entity Mapping button)
|
|
166
|
+
* @returns True if all entities are already mapped
|
|
167
|
+
*/
|
|
168
|
+
isAllEntitiesMapped(): boolean;
|
|
169
|
+
/**
|
|
170
|
+
* Cleanup when component is destroyed
|
|
171
|
+
* This ensures that when the component is destroyed (e.g., tab closed),
|
|
172
|
+
* all state is properly reset to prevent old data from persisting
|
|
173
|
+
*/
|
|
174
|
+
ngOnDestroy(): void;
|
|
175
|
+
/**
|
|
176
|
+
* Delete removed academic year mappings
|
|
177
|
+
*/
|
|
178
|
+
private deleteRemovedMappings;
|
|
179
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<AcademicYearCreateComponent, never>;
|
|
180
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<AcademicYearCreateComponent, "cide-core-academic-year-create", never, {}, {}, never, never, true, never>;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
interface AcademicYear {
|
|
184
|
+
_id?: string;
|
|
185
|
+
acayr_code?: string;
|
|
186
|
+
acayr_name?: string;
|
|
187
|
+
acayr_description?: string;
|
|
188
|
+
acayr_from_date?: string | Date;
|
|
189
|
+
acayr_to_date?: string | Date;
|
|
190
|
+
acayr_isactive?: boolean;
|
|
191
|
+
acayr_iscurrent?: boolean;
|
|
192
|
+
acayr_islocked?: boolean;
|
|
193
|
+
}
|
|
194
|
+
declare class AcademicYearListComponent implements OnInit, OnDestroy {
|
|
195
|
+
private readonly destroyRef;
|
|
196
|
+
private readonly academicYearService;
|
|
197
|
+
private readonly router;
|
|
198
|
+
private readonly appState;
|
|
199
|
+
private readonly confirmationService;
|
|
200
|
+
private readonly notificationService;
|
|
201
|
+
readonly academicYearDetailsRendererTemplate: _angular_core.Signal<TemplateRef<TemplateContext<Record<string, unknown>>>>;
|
|
202
|
+
readonly dateRangeRendererTemplate: _angular_core.Signal<TemplateRef<TemplateContext<Record<string, unknown>>>>;
|
|
203
|
+
readonly statusRendererTemplate: _angular_core.Signal<TemplateRef<TemplateContext<Record<string, unknown>>>>;
|
|
204
|
+
readonly actionsDropdownRendererTemplate: _angular_core.Signal<TemplateRef<TemplateContext<Record<string, unknown>>>>;
|
|
205
|
+
readonly academicYears: _angular_core.WritableSignal<AcademicYear[]>;
|
|
206
|
+
readonly loading: _angular_core.WritableSignal<boolean>;
|
|
207
|
+
readonly error: _angular_core.WritableSignal<string | null>;
|
|
208
|
+
readonly currentPage: _angular_core.WritableSignal<number>;
|
|
209
|
+
readonly pageSize: _angular_core.WritableSignal<number>;
|
|
210
|
+
readonly totalItems: _angular_core.WritableSignal<number>;
|
|
211
|
+
readonly totalPages: _angular_core.WritableSignal<number>;
|
|
212
|
+
readonly searchQuery: _angular_core.WritableSignal<string>;
|
|
213
|
+
readonly sortColumn: _angular_core.WritableSignal<string>;
|
|
214
|
+
readonly sortDirection: _angular_core.WritableSignal<"asc" | "desc">;
|
|
215
|
+
readonly selectedStatusFilter: _angular_core.WritableSignal<string>;
|
|
216
|
+
readonly statusFilterOptions: _angular_core.Signal<{
|
|
217
|
+
value: string;
|
|
218
|
+
label: string;
|
|
219
|
+
}[]>;
|
|
220
|
+
readonly gridConfig: _angular_core.Signal<GridConfiguration<AcademicYear>>;
|
|
221
|
+
ngOnInit(): void;
|
|
222
|
+
ngOnDestroy(): void;
|
|
223
|
+
/**
|
|
224
|
+
* Load academic years from API
|
|
225
|
+
*/
|
|
226
|
+
loadAcademicYears(): void;
|
|
227
|
+
templateRenderers: _angular_core.Signal<Record<string, TemplateRef<TemplateContext<Record<string, unknown>>>>>;
|
|
228
|
+
/**
|
|
229
|
+
* Handle grid events
|
|
230
|
+
*/
|
|
231
|
+
onGridEvent(event: GridEvent<any>): void;
|
|
232
|
+
onStatusFilterChange(): void;
|
|
233
|
+
clearFilters(): void;
|
|
234
|
+
createAcademicYear(): void;
|
|
235
|
+
viewAcademicYear(academicYear: AcademicYear): void;
|
|
236
|
+
editAcademicYear(academicYear: AcademicYear): void;
|
|
237
|
+
/**
|
|
238
|
+
* Get dropdown configuration
|
|
239
|
+
*/
|
|
240
|
+
getDropdownConfig(): DropdownConfig;
|
|
241
|
+
/**
|
|
242
|
+
* Get action dropdown items
|
|
243
|
+
*/
|
|
244
|
+
getActionDropdownItems(academicYear: AcademicYear): DropdownItem[];
|
|
245
|
+
/**
|
|
246
|
+
* Handle dropdown item click
|
|
247
|
+
*/
|
|
248
|
+
onDropdownItemClick(item: DropdownItem, academicYear: AcademicYear): void;
|
|
249
|
+
/**
|
|
250
|
+
* Toggle academic year status (active/inactive)
|
|
251
|
+
*/
|
|
252
|
+
toggleAcademicYearStatus(academicYear: AcademicYear): void;
|
|
253
|
+
/**
|
|
254
|
+
* Toggle status of all academic year mappings for a specific academic year
|
|
255
|
+
*/
|
|
256
|
+
private toggleAcademicYearMappingsStatus;
|
|
257
|
+
private handleExport;
|
|
258
|
+
private exportToCSV;
|
|
259
|
+
private exportToExcel;
|
|
260
|
+
private exportToPDF;
|
|
261
|
+
private downloadFile;
|
|
262
|
+
formatDate(date: string | Date | null | undefined): string;
|
|
263
|
+
getDuration(fromDate: string | Date | null | undefined, toDate: string | Date | null | undefined): string;
|
|
264
|
+
getStatusBadgeClass(academicYear: AcademicYear): string;
|
|
265
|
+
getActiveStatusBadgeClass(academicYear: AcademicYear): string;
|
|
266
|
+
getStatusText(academicYear: AcademicYear): string;
|
|
267
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<AcademicYearListComponent, never>;
|
|
268
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<AcademicYearListComponent, "cide-core-academic-year-list", never, {}, {}, never, never, true, never>;
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
interface AcademicYearMapping {
|
|
272
|
+
_id?: string;
|
|
273
|
+
acayrmp_entity_id_syen: string;
|
|
274
|
+
acayrmp_islocked?: boolean;
|
|
275
|
+
acayrmp_iscurrent?: boolean;
|
|
276
|
+
}
|
|
277
|
+
interface AcademicYearWithMappings {
|
|
278
|
+
acayr_academic_year_mappings?: AcademicYearMapping[];
|
|
279
|
+
[key: string]: any;
|
|
280
|
+
}
|
|
281
|
+
interface DeleteMappingPayload {
|
|
282
|
+
acayrmp_id: string;
|
|
283
|
+
}
|
|
284
|
+
interface ToggleMappingPayload {
|
|
285
|
+
acayrmp_id: string;
|
|
286
|
+
}
|
|
287
|
+
declare class CideLytAcademicYearService {
|
|
288
|
+
private http;
|
|
289
|
+
/**
|
|
290
|
+
* Get list of academic years
|
|
291
|
+
* @param payload - Query parameters for filtering/pagination
|
|
292
|
+
* @returns Observable of academic year list response
|
|
293
|
+
*/
|
|
294
|
+
getAcademicYearList(payload: MAcademicYear): Observable<academicYearControllerResponse>;
|
|
295
|
+
/**
|
|
296
|
+
* Get academic year by ID
|
|
297
|
+
* @param payload - Academic year ID payload
|
|
298
|
+
* @returns Observable of academic year data
|
|
299
|
+
*/
|
|
300
|
+
getAcademicYearById(payload: MAcademicYearGetByIdPayload): Observable<academicYearByIdControllerResponse>;
|
|
301
|
+
/**
|
|
302
|
+
* Create or update academic year
|
|
303
|
+
* @param data - Academic year data to save
|
|
304
|
+
* @returns Observable of the save response
|
|
305
|
+
*/
|
|
306
|
+
saveUpdateAcademicYear(data: MAcademicYearInsertUpdatePayload): Observable<academicYearInsertUpdateControllerResponse>;
|
|
307
|
+
/**
|
|
308
|
+
* Create or update academic year with mappings
|
|
309
|
+
* @param data - Academic year data with mappings
|
|
310
|
+
* @returns Observable of the save response
|
|
311
|
+
*/
|
|
312
|
+
saveUpdateAcademicYearWithMappings(data: AcademicYearWithMappings): Observable<academicYearInsertUpdateControllerResponse>;
|
|
313
|
+
/**
|
|
314
|
+
* Delete academic year
|
|
315
|
+
* @param payload - Academic year ID payload
|
|
316
|
+
* @returns Observable of the delete response
|
|
317
|
+
*/
|
|
318
|
+
deleteAcademicYear(payload: MAcademicYearDeletePayload): Observable<academicYearDeleteControllerResponse>;
|
|
319
|
+
/**
|
|
320
|
+
* Toggle academic year status
|
|
321
|
+
* @param payload - Academic year ID payload
|
|
322
|
+
* @returns Observable of the toggle response
|
|
323
|
+
*/
|
|
324
|
+
toggleAcademicYearStatus(payload: MAcademicYearToggleStatusPayload): Observable<academicYearToggleStatusControllerResponse>;
|
|
325
|
+
/**
|
|
326
|
+
* Delete academic year mapping
|
|
327
|
+
* @param payload - Academic year mapping ID payload
|
|
328
|
+
* @returns Observable of the delete response
|
|
329
|
+
*/
|
|
330
|
+
deleteAcademicYearMapping(payload: DeleteMappingPayload): Observable<academicYearMappingInsertUpdateControllerResponse>;
|
|
331
|
+
/**
|
|
332
|
+
* Toggle academic year mapping status
|
|
333
|
+
* @param payload - Academic year mapping ID payload
|
|
334
|
+
* @returns Observable of the toggle response
|
|
335
|
+
*/
|
|
336
|
+
toggleAcademicYearMappingStatus(payload: ToggleMappingPayload): Observable<academicYearMappingInsertUpdateControllerResponse>;
|
|
337
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<CideLytAcademicYearService, never>;
|
|
338
|
+
static ɵprov: _angular_core.ɵɵInjectableDeclaration<CideLytAcademicYearService>;
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
declare class CideLytAcademicYearMappingService {
|
|
342
|
+
private http;
|
|
343
|
+
/**
|
|
344
|
+
* Get list of academic year mappings
|
|
345
|
+
* @param payload - Query parameters for filtering/pagination
|
|
346
|
+
* @returns Observable of academic year mapping list response
|
|
347
|
+
*/
|
|
348
|
+
getAcademicYearMappingList(payload: MAcademicYearMapping): Observable<academicYearMappingControllerResponse>;
|
|
349
|
+
/**
|
|
350
|
+
* Get academic year mapping by ID
|
|
351
|
+
* @param payload - Academic year mapping ID payload
|
|
352
|
+
* @returns Observable of academic year mapping data
|
|
353
|
+
*/
|
|
354
|
+
getAcademicYearMappingById(payload: MAcademicYearMappingGetByIdPayload): Observable<academicYearMappingByIdControllerResponse>;
|
|
355
|
+
/**
|
|
356
|
+
* Create or update academic year mapping
|
|
357
|
+
* @param data - Academic year mapping data to save
|
|
358
|
+
* @returns Observable of the save response
|
|
359
|
+
*/
|
|
360
|
+
saveUpdateAcademicYearMapping(data: MAcademicYearMappingInsertUpdatePayload): Observable<academicYearMappingInsertUpdateControllerResponse>;
|
|
361
|
+
/**
|
|
362
|
+
* Delete academic year mapping
|
|
363
|
+
* @param payload - Academic year mapping ID payload
|
|
364
|
+
* @returns Observable of the delete response
|
|
365
|
+
*/
|
|
366
|
+
deleteAcademicYearMapping(payload: MAcademicYearMappingDeletePayload): Observable<academicYearMappingDeleteControllerResponse>;
|
|
367
|
+
/**
|
|
368
|
+
* Toggle academic year mapping status
|
|
369
|
+
* @param payload - Academic year mapping ID payload
|
|
370
|
+
* @returns Observable of the toggle response
|
|
371
|
+
*/
|
|
372
|
+
toggleAcademicYearMappingStatus(payload: MAcademicYearMappingToggleStatusPayload): Observable<academicYearMappingToggleStatusControllerResponse>;
|
|
373
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<CideLytAcademicYearMappingService, never>;
|
|
374
|
+
static ɵprov: _angular_core.ɵɵInjectableDeclaration<CideLytAcademicYearMappingService>;
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
export { AcademicYearCreateComponent, AcademicYearListComponent, CideLytAcademicYearMappingService, CideLytAcademicYearService, academicsRoutes };
|
package/package.json
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "cloud-ide-academics",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"peerDependencies": {
|
|
5
|
+
"@angular/common": "^20.1.0",
|
|
6
|
+
"@angular/core": "^20.1.0"
|
|
7
|
+
},
|
|
8
|
+
"dependencies": {
|
|
9
|
+
"tslib": "^2.3.0"
|
|
10
|
+
},
|
|
11
|
+
"sideEffects": false,
|
|
12
|
+
"module": "fesm2022/cloud-ide-academics.mjs",
|
|
13
|
+
"typings": "index.d.ts",
|
|
14
|
+
"exports": {
|
|
15
|
+
"./package.json": {
|
|
16
|
+
"default": "./package.json"
|
|
17
|
+
},
|
|
18
|
+
".": {
|
|
19
|
+
"types": "./index.d.ts",
|
|
20
|
+
"default": "./fesm2022/cloud-ide-academics.mjs"
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|