@ecodev/natural 62.1.2 → 63.0.0
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/ecodev-natural-vanilla.mjs +1193 -0
- package/fesm2022/ecodev-natural-vanilla.mjs.map +1 -0
- package/fesm2022/ecodev-natural.mjs +436 -425
- package/fesm2022/ecodev-natural.mjs.map +1 -1
- package/lib/classes/network-activity.service.d.ts +54 -0
- package/lib/classes/validators.d.ts +1 -1
- package/lib/modules/columns-picker/columns-picker.component.d.ts +2 -2
- package/lib/modules/common/services/seo.provider.d.ts +2 -2
- package/lib/modules/dropdown-components/type-select/type-select.component.d.ts +1 -1
- package/lib/modules/file/abstract-file.d.ts +6 -3
- package/lib/modules/file/component/file.component.d.ts +2 -2
- package/lib/modules/file/file-drop.directive.d.ts +2 -3
- package/lib/modules/fixed-button-detail/fixed-button-detail.component.d.ts +2 -3
- package/lib/modules/hierarchic-selector/hierarchic-selector/hierarchic-selector.component.d.ts +3 -3
- package/lib/modules/icon/icon.module.d.ts +2 -2
- package/lib/modules/panels/panels.service.d.ts +1 -2
- package/lib/modules/relations/relations.component.d.ts +3 -3
- package/lib/modules/search/dropdown-container/dropdown-container.component.d.ts +2 -3
- package/lib/modules/search/group/group.component.d.ts +2 -3
- package/lib/modules/search/input/input.component.d.ts +5 -5
- package/lib/modules/search/search/search.component.d.ts +2 -2
- package/lib/modules/select/abstract-select.component.d.ts +3 -3
- package/lib/modules/select/select/select.component.d.ts +1 -1
- package/lib/modules/sidenav/sidenav-container/sidenav-container.component.d.ts +1 -1
- package/lib/modules/table-button/table-button.component.d.ts +4 -2
- package/package.json +16 -14
- package/public-api.d.ts +1 -0
- package/src/lib/_natural.theme.scss +1 -2
- package/vanilla/index.d.ts +5 -0
- package/vanilla/package.json +3 -0
- package/vanilla/public-api.d.ts +11 -0
- package/vanilla/src/lib/classes/crypto.d.ts +8 -0
- package/vanilla/src/lib/classes/data-source.d.ts +32 -0
- package/vanilla/src/lib/classes/query-variable-manager-utils.d.ts +2 -0
- package/vanilla/src/lib/classes/query-variable-manager.d.ts +91 -0
- package/vanilla/src/lib/classes/signing.d.ts +7 -0
- package/vanilla/src/lib/classes/utility.d.ts +77 -0
- package/vanilla/src/lib/modules/search/classes/graphql-doctrine.types.d.ts +83 -0
- package/vanilla/src/lib/modules/search/classes/utils.d.ts +17 -0
- package/vanilla/src/lib/modules/search/types/dropdown-component.d.ts +20 -0
- package/vanilla/src/lib/modules/search/types/facet.d.ts +75 -0
- package/vanilla/src/lib/modules/search/types/values.d.ts +32 -0
- package/vanilla/src/lib/services/abstract-model.service.d.ts +244 -0
- package/vanilla/src/lib/services/debounce.service.d.ts +52 -0
- package/vanilla/src/lib/types/types.d.ts +100 -0
- package/esm2022/ecodev-natural.mjs +0 -5
- package/esm2022/lib/classes/abstract-detail.mjs +0 -229
- package/esm2022/lib/classes/abstract-editable-list.mjs +0 -99
- package/esm2022/lib/classes/abstract-list.mjs +0 -461
- package/esm2022/lib/classes/abstract-navigable-list.mjs +0 -133
- package/esm2022/lib/classes/apollo-utils.mjs +0 -59
- package/esm2022/lib/classes/crypto.mjs +0 -23
- package/esm2022/lib/classes/cumulative-changes.mjs +0 -50
- package/esm2022/lib/classes/data-source.mjs +0 -71
- package/esm2022/lib/classes/providers.mjs +0 -13
- package/esm2022/lib/classes/query-variable-manager-utils.mjs +0 -14
- package/esm2022/lib/classes/query-variable-manager.mjs +0 -172
- package/esm2022/lib/classes/rxjs.mjs +0 -54
- package/esm2022/lib/classes/signing.mjs +0 -38
- package/esm2022/lib/classes/tld.mjs +0 -1476
- package/esm2022/lib/classes/utility.mjs +0 -234
- package/esm2022/lib/classes/validators.mjs +0 -179
- package/esm2022/lib/directives/http-prefix.directive.mjs +0 -47
- package/esm2022/lib/modules/alert/alert.service.mjs +0 -53
- package/esm2022/lib/modules/alert/confirm.component.mjs +0 -16
- package/esm2022/lib/modules/alert/public-api.mjs +0 -6
- package/esm2022/lib/modules/avatar/component/avatar.component.mjs +0 -203
- package/esm2022/lib/modules/avatar/public-api.mjs +0 -6
- package/esm2022/lib/modules/avatar/service/avatar.service.mjs +0 -63
- package/esm2022/lib/modules/avatar/sources/gravatar.mjs +0 -29
- package/esm2022/lib/modules/avatar/sources/image.mjs +0 -13
- package/esm2022/lib/modules/avatar/sources/initials.mjs +0 -39
- package/esm2022/lib/modules/avatar/sources/source.mjs +0 -16
- package/esm2022/lib/modules/columns-picker/columns-picker.component.mjs +0 -145
- package/esm2022/lib/modules/columns-picker/public-api.mjs +0 -5
- package/esm2022/lib/modules/columns-picker/types.mjs +0 -2
- package/esm2022/lib/modules/common/directives/background-density.directive.mjs +0 -63
- package/esm2022/lib/modules/common/directives/linkable-tab.directive.mjs +0 -93
- package/esm2022/lib/modules/common/directives/src-density.directive.mjs +0 -72
- package/esm2022/lib/modules/common/pipes/capitalize.pipe.mjs +0 -24
- package/esm2022/lib/modules/common/pipes/ellipsis.pipe.mjs +0 -17
- package/esm2022/lib/modules/common/pipes/enum.pipe.mjs +0 -24
- package/esm2022/lib/modules/common/pipes/time-ago.pipe.mjs +0 -140
- package/esm2022/lib/modules/common/public-api.mjs +0 -14
- package/esm2022/lib/modules/common/services/memory-storage.mjs +0 -110
- package/esm2022/lib/modules/common/services/seo.provider.mjs +0 -23
- package/esm2022/lib/modules/common/services/seo.service.mjs +0 -235
- package/esm2022/lib/modules/detail-header/detail-header.component.mjs +0 -84
- package/esm2022/lib/modules/detail-header/public-api.mjs +0 -5
- package/esm2022/lib/modules/dialog-trigger/dialog-trigger.component.mjs +0 -72
- package/esm2022/lib/modules/dialog-trigger/public-api.mjs +0 -5
- package/esm2022/lib/modules/dropdown-components/abstract-association-select-component.directive.mjs +0 -100
- package/esm2022/lib/modules/dropdown-components/public-api.mjs +0 -14
- package/esm2022/lib/modules/dropdown-components/type-boolean/type-boolean.component.mjs +0 -39
- package/esm2022/lib/modules/dropdown-components/type-date/type-date.component.mjs +0 -173
- package/esm2022/lib/modules/dropdown-components/type-date-range/type-date-range.component.mjs +0 -134
- package/esm2022/lib/modules/dropdown-components/type-hierarchic-selector/type-hierarchic-selector.component.mjs +0 -80
- package/esm2022/lib/modules/dropdown-components/type-natural-select/type-natural-select.component.mjs +0 -48
- package/esm2022/lib/modules/dropdown-components/type-number/type-number.component.mjs +0 -110
- package/esm2022/lib/modules/dropdown-components/type-options/type-options.component.mjs +0 -64
- package/esm2022/lib/modules/dropdown-components/type-select/type-select.component.mjs +0 -175
- package/esm2022/lib/modules/dropdown-components/type-text/type-text.component.mjs +0 -62
- package/esm2022/lib/modules/dropdown-components/types.mjs +0 -41
- package/esm2022/lib/modules/dropdown-components/utils.mjs +0 -35
- package/esm2022/lib/modules/file/abstract-file.mjs +0 -230
- package/esm2022/lib/modules/file/component/file.component.mjs +0 -172
- package/esm2022/lib/modules/file/file-drop.directive.mjs +0 -111
- package/esm2022/lib/modules/file/file-select.directive.mjs +0 -26
- package/esm2022/lib/modules/file/file.service.mjs +0 -43
- package/esm2022/lib/modules/file/public-api.mjs +0 -9
- package/esm2022/lib/modules/file/types.mjs +0 -2
- package/esm2022/lib/modules/file/utils.mjs +0 -129
- package/esm2022/lib/modules/fixed-button/fixed-button.component.mjs +0 -30
- package/esm2022/lib/modules/fixed-button/public-api.mjs +0 -5
- package/esm2022/lib/modules/fixed-button-detail/fixed-button-detail.component.mjs +0 -56
- package/esm2022/lib/modules/fixed-button-detail/public-api.mjs +0 -5
- package/esm2022/lib/modules/hierarchic-selector/classes/flat-node.mjs +0 -18
- package/esm2022/lib/modules/hierarchic-selector/classes/hierarchic-configuration.mjs +0 -2
- package/esm2022/lib/modules/hierarchic-selector/classes/hierarchic-filters-configuration.mjs +0 -2
- package/esm2022/lib/modules/hierarchic-selector/classes/model-node.mjs +0 -14
- package/esm2022/lib/modules/hierarchic-selector/hierarchic-selector/hierarchic-selector.component.mjs +0 -398
- package/esm2022/lib/modules/hierarchic-selector/hierarchic-selector/hierarchic-selector.service.mjs +0 -243
- package/esm2022/lib/modules/hierarchic-selector/hierarchic-selector-dialog/hierarchic-selector-dialog.component.mjs +0 -38
- package/esm2022/lib/modules/hierarchic-selector/hierarchic-selector-dialog/hierarchic-selector-dialog.service.mjs +0 -22
- package/esm2022/lib/modules/hierarchic-selector/public-api.mjs +0 -10
- package/esm2022/lib/modules/icon/icon.directive.mjs +0 -96
- package/esm2022/lib/modules/icon/icon.module.mjs +0 -33
- package/esm2022/lib/modules/icon/public-api.mjs +0 -6
- package/esm2022/lib/modules/logger/error-handler.mjs +0 -87
- package/esm2022/lib/modules/logger/error.module.mjs +0 -22
- package/esm2022/lib/modules/logger/public-api.mjs +0 -6
- package/esm2022/lib/modules/matomo/matomo.service.mjs +0 -96
- package/esm2022/lib/modules/matomo/public-api.mjs +0 -5
- package/esm2022/lib/modules/panels/abstract-panel.mjs +0 -76
- package/esm2022/lib/modules/panels/fallback-if-no-opened-panels.urlmatcher.mjs +0 -12
- package/esm2022/lib/modules/panels/panels.component.mjs +0 -27
- package/esm2022/lib/modules/panels/panels.module.mjs +0 -10
- package/esm2022/lib/modules/panels/panels.service.mjs +0 -329
- package/esm2022/lib/modules/panels/panels.urlmatcher.mjs +0 -75
- package/esm2022/lib/modules/panels/public-api.mjs +0 -11
- package/esm2022/lib/modules/panels/types.mjs +0 -3
- package/esm2022/lib/modules/relations/public-api.mjs +0 -5
- package/esm2022/lib/modules/relations/relations.component.mjs +0 -254
- package/esm2022/lib/modules/search/classes/graphql-doctrine.mjs +0 -111
- package/esm2022/lib/modules/search/classes/graphql-doctrine.types.mjs +0 -14
- package/esm2022/lib/modules/search/classes/transformers.mjs +0 -142
- package/esm2022/lib/modules/search/classes/url.mjs +0 -53
- package/esm2022/lib/modules/search/classes/utils.mjs +0 -25
- package/esm2022/lib/modules/search/dropdown-container/dropdown-container-animations.mjs +0 -44
- package/esm2022/lib/modules/search/dropdown-container/dropdown-container.component.mjs +0 -87
- package/esm2022/lib/modules/search/dropdown-container/dropdown-ref.mjs +0 -24
- package/esm2022/lib/modules/search/dropdown-container/dropdown.service.mjs +0 -90
- package/esm2022/lib/modules/search/facet-selector/facet-selector.component.mjs +0 -45
- package/esm2022/lib/modules/search/group/group.component.mjs +0 -53
- package/esm2022/lib/modules/search/input/input.component.mjs +0 -365
- package/esm2022/lib/modules/search/public-api.mjs +0 -7
- package/esm2022/lib/modules/search/search/search.component.mjs +0 -102
- package/esm2022/lib/modules/search/types/dropdown-component.mjs +0 -2
- package/esm2022/lib/modules/search/types/facet.mjs +0 -2
- package/esm2022/lib/modules/search/types/values.mjs +0 -2
- package/esm2022/lib/modules/select/abstract-select.component.mjs +0 -232
- package/esm2022/lib/modules/select/public-api.mjs +0 -7
- package/esm2022/lib/modules/select/select/select.component.mjs +0 -310
- package/esm2022/lib/modules/select/select-enum/select-enum.component.mjs +0 -57
- package/esm2022/lib/modules/select/select-hierarchic/select-hierarchic.component.mjs +0 -155
- package/esm2022/lib/modules/sidenav/public-api.mjs +0 -9
- package/esm2022/lib/modules/sidenav/sidenav/sidenav.component.mjs +0 -15
- package/esm2022/lib/modules/sidenav/sidenav-container/sidenav-container.component.mjs +0 -90
- package/esm2022/lib/modules/sidenav/sidenav-content/sidenav-content.component.mjs +0 -11
- package/esm2022/lib/modules/sidenav/sidenav-stack.service.mjs +0 -50
- package/esm2022/lib/modules/sidenav/sidenav.service.mjs +0 -196
- package/esm2022/lib/modules/stamp/public-api.mjs +0 -5
- package/esm2022/lib/modules/stamp/stamp.component.mjs +0 -23
- package/esm2022/lib/modules/table-button/public-api.mjs +0 -5
- package/esm2022/lib/modules/table-button/table-button.component.mjs +0 -78
- package/esm2022/lib/services/abstract-model.service.mjs +0 -526
- package/esm2022/lib/services/debounce.service.mjs +0 -149
- package/esm2022/lib/services/enum.service.mjs +0 -64
- package/esm2022/lib/services/link-mutation.service.mjs +0 -154
- package/esm2022/lib/services/persistence.service.mjs +0 -115
- package/esm2022/lib/services/swiss-parsing-date-adapter.service.mjs +0 -63
- package/esm2022/lib/types/types.mjs +0 -2
- package/esm2022/public-api.mjs +0 -46
|
@@ -1,149 +0,0 @@
|
|
|
1
|
-
import { catchError, debounceTime, EMPTY, forkJoin, map, mergeMap, Observable, of, raceWith, ReplaySubject, shareReplay, Subject, take, } from 'rxjs';
|
|
2
|
-
import { Injectable } from '@angular/core';
|
|
3
|
-
import * as i0 from "@angular/core";
|
|
4
|
-
/**
|
|
5
|
-
* Debounce subscriptions to update mutations, with the possibility to cancel one, flush one, or flush all of them.
|
|
6
|
-
*
|
|
7
|
-
* `modelService` is also used to separate objects by their types. So User with ID 1 is not confused with Product with ID 1.
|
|
8
|
-
*
|
|
9
|
-
* `id` must be the ID of the object that will be updated.
|
|
10
|
-
*/
|
|
11
|
-
export class NaturalDebounceService {
|
|
12
|
-
/**
|
|
13
|
-
* Stores the debounced update function
|
|
14
|
-
*/
|
|
15
|
-
allDebouncedUpdateCache = new Map();
|
|
16
|
-
/**
|
|
17
|
-
* Debounce the `modelService.updateNow()` mutation for a short time. If called multiple times with the same
|
|
18
|
-
* modelService and id, it will postpone the subscription to the mutation.
|
|
19
|
-
*
|
|
20
|
-
* All input variables for the same object (same service and ID) will be cumulated over time. So it is possible
|
|
21
|
-
* to update `field1`, then `field2`, and they will be batched into a single XHR including `field1` and `field2`.
|
|
22
|
-
*
|
|
23
|
-
* But it will always keep the same debouncing timeline.
|
|
24
|
-
*/
|
|
25
|
-
debounce(modelService, id, object) {
|
|
26
|
-
const debouncedUpdateCache = this.getMap(modelService);
|
|
27
|
-
let debounced = debouncedUpdateCache.get(id);
|
|
28
|
-
if (debounced) {
|
|
29
|
-
debounced.object = {
|
|
30
|
-
...debounced.object,
|
|
31
|
-
...object,
|
|
32
|
-
};
|
|
33
|
-
}
|
|
34
|
-
else {
|
|
35
|
-
const debouncer = new ReplaySubject(1);
|
|
36
|
-
let wasCancelled = false;
|
|
37
|
-
const canceller = new Subject();
|
|
38
|
-
canceller.subscribe(() => {
|
|
39
|
-
wasCancelled = true;
|
|
40
|
-
debouncer.complete();
|
|
41
|
-
canceller.complete();
|
|
42
|
-
this.delete(modelService, id);
|
|
43
|
-
});
|
|
44
|
-
const flusher = new Subject();
|
|
45
|
-
debounced = {
|
|
46
|
-
object,
|
|
47
|
-
debouncer,
|
|
48
|
-
canceller,
|
|
49
|
-
flusher,
|
|
50
|
-
modelService: modelService,
|
|
51
|
-
result: debouncer.pipe(debounceTime(2000), // Wait 2 seconds...
|
|
52
|
-
raceWith(flusher), // ...unless flusher is triggered
|
|
53
|
-
take(1), mergeMap(() => {
|
|
54
|
-
this.delete(modelService, id);
|
|
55
|
-
if (wasCancelled || !debounced) {
|
|
56
|
-
return EMPTY;
|
|
57
|
-
}
|
|
58
|
-
return modelService.updateNow(debounced.object);
|
|
59
|
-
}), shareReplay()),
|
|
60
|
-
};
|
|
61
|
-
debouncedUpdateCache.set(id, debounced);
|
|
62
|
-
}
|
|
63
|
-
// Notify our debounced update each time we ask to update
|
|
64
|
-
debounced.debouncer.next();
|
|
65
|
-
// Return and observable that is updated when mutation is done
|
|
66
|
-
return debounced.result;
|
|
67
|
-
}
|
|
68
|
-
cancelOne(modelService, id) {
|
|
69
|
-
const debounced = this.allDebouncedUpdateCache.get(modelService)?.get(id);
|
|
70
|
-
debounced?.canceller.next();
|
|
71
|
-
}
|
|
72
|
-
/**
|
|
73
|
-
* Immediately execute the pending update, if any.
|
|
74
|
-
*
|
|
75
|
-
* It should typically be called before resolving the object, to mutate it before re-fetching it from server.
|
|
76
|
-
*
|
|
77
|
-
* The returned observable will complete when the update completes, even if it errors.
|
|
78
|
-
*/
|
|
79
|
-
flushOne(modelService, id) {
|
|
80
|
-
const debounced = this.allDebouncedUpdateCache.get(modelService)?.get(id);
|
|
81
|
-
return this.internalFlush(debounced ? [debounced] : []);
|
|
82
|
-
}
|
|
83
|
-
/**
|
|
84
|
-
* Immediately execute all pending updates.
|
|
85
|
-
*
|
|
86
|
-
* It should typically be called before login out.
|
|
87
|
-
*
|
|
88
|
-
* The returned observable will complete when all updates complete, even if some of them error.
|
|
89
|
-
*/
|
|
90
|
-
flush() {
|
|
91
|
-
const all = [];
|
|
92
|
-
this.allDebouncedUpdateCache.forEach(map => map.forEach(debounced => all.push(debounced)));
|
|
93
|
-
return this.internalFlush(all);
|
|
94
|
-
}
|
|
95
|
-
internalFlush(debounceds) {
|
|
96
|
-
const all = [];
|
|
97
|
-
const allFlusher = [];
|
|
98
|
-
debounceds.forEach(debounced => {
|
|
99
|
-
all.push(debounced.result.pipe(catchError(() => of(undefined))));
|
|
100
|
-
allFlusher.push(debounced.flusher);
|
|
101
|
-
});
|
|
102
|
-
if (!all.length) {
|
|
103
|
-
all.push(of(undefined));
|
|
104
|
-
}
|
|
105
|
-
return new Observable(subscriber => {
|
|
106
|
-
const subscription = forkJoin(all)
|
|
107
|
-
.pipe(map(() => undefined))
|
|
108
|
-
.subscribe(subscriber);
|
|
109
|
-
// Flush only after subscription process is finished
|
|
110
|
-
allFlusher.forEach(flusher => flusher.next());
|
|
111
|
-
return subscription;
|
|
112
|
-
});
|
|
113
|
-
}
|
|
114
|
-
/**
|
|
115
|
-
* Count of pending updates
|
|
116
|
-
*/
|
|
117
|
-
get count() {
|
|
118
|
-
let count = 0;
|
|
119
|
-
this.allDebouncedUpdateCache.forEach(map => (count += map.size));
|
|
120
|
-
return count;
|
|
121
|
-
}
|
|
122
|
-
getMap(modelService) {
|
|
123
|
-
let debouncedUpdateCache = this.allDebouncedUpdateCache.get(modelService);
|
|
124
|
-
if (!debouncedUpdateCache) {
|
|
125
|
-
debouncedUpdateCache = new Map();
|
|
126
|
-
this.allDebouncedUpdateCache.set(modelService, debouncedUpdateCache);
|
|
127
|
-
}
|
|
128
|
-
return debouncedUpdateCache;
|
|
129
|
-
}
|
|
130
|
-
delete(modelService, id) {
|
|
131
|
-
const map = this.allDebouncedUpdateCache.get(modelService);
|
|
132
|
-
if (!map) {
|
|
133
|
-
return;
|
|
134
|
-
}
|
|
135
|
-
map.delete(id);
|
|
136
|
-
if (!map.size) {
|
|
137
|
-
this.allDebouncedUpdateCache.delete(modelService);
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.3", ngImport: i0, type: NaturalDebounceService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
141
|
-
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.3", ngImport: i0, type: NaturalDebounceService, providedIn: 'root' });
|
|
142
|
-
}
|
|
143
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.3", ngImport: i0, type: NaturalDebounceService, decorators: [{
|
|
144
|
-
type: Injectable,
|
|
145
|
-
args: [{
|
|
146
|
-
providedIn: 'root',
|
|
147
|
-
}]
|
|
148
|
-
}] });
|
|
149
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVib3VuY2Uuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25hdHVyYWwvc3JjL2xpYi9zZXJ2aWNlcy9kZWJvdW5jZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDSCxVQUFVLEVBQ1YsWUFBWSxFQUNaLEtBQUssRUFDTCxRQUFRLEVBQ1IsR0FBRyxFQUNILFFBQVEsRUFDUixVQUFVLEVBQ1YsRUFBRSxFQUNGLFFBQVEsRUFDUixhQUFhLEVBQ2IsV0FBVyxFQUNYLE9BQU8sRUFDUCxJQUFJLEdBQ1AsTUFBTSxNQUFNLENBQUM7QUFDZCxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sZUFBZSxDQUFDOztBQVl6Qzs7Ozs7O0dBTUc7QUFJSCxNQUFNLE9BQU8sc0JBQXNCO0lBQy9COztPQUVHO0lBQ2MsdUJBQXVCLEdBQUcsSUFBSSxHQUFHLEVBRy9DLENBQUM7SUFFSjs7Ozs7Ozs7T0FRRztJQUNJLFFBQVEsQ0FDWCxZQUFpQyxFQUNqQyxFQUFVLEVBQ1YsTUFBcUM7UUFFckMsTUFBTSxvQkFBb0IsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3ZELElBQUksU0FBUyxHQUFHLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQTZCLENBQUM7UUFFekUsSUFBSSxTQUFTLEVBQUUsQ0FBQztZQUNaLFNBQVMsQ0FBQyxNQUFNLEdBQUc7Z0JBQ2YsR0FBRyxTQUFTLENBQUMsTUFBTTtnQkFDbkIsR0FBRyxNQUFNO2FBQ1osQ0FBQztRQUNOLENBQUM7YUFBTSxDQUFDO1lBQ0osTUFBTSxTQUFTLEdBQUcsSUFBSSxhQUFhLENBQU8sQ0FBQyxDQUFDLENBQUM7WUFDN0MsSUFBSSxZQUFZLEdBQUcsS0FBSyxDQUFDO1lBQ3pCLE1BQU0sU0FBUyxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7WUFDdEMsU0FBUyxDQUFDLFNBQVMsQ0FB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QUFDO1FBRUQsT0FBTyxvQkFBaUQsQ0FBQztJQUM3RCxDQUFDO0lBRU8sTUFBTSxDQUFDLFlBQWlDLEVBQUUsRUFBVTtRQUN4RCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQzNELElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNQLE9BQU87UUFDWCxDQUFDO1FBRUQsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUVmLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDWixJQUFJLENBQUMsdUJBQXVCLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3RELENBQUM7SUFDTCxDQUFDO3VHQXJLUSxzQkFBc0I7MkdBQXRCLHNCQUFzQixjQUZuQixNQUFNOzsyRkFFVCxzQkFBc0I7a0JBSGxDLFVBQVU7bUJBQUM7b0JBQ1IsVUFBVSxFQUFFLE1BQU07aUJBQ3JCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBjYXRjaEVycm9yLFxuICAgIGRlYm91bmNlVGltZSxcbiAgICBFTVBUWSxcbiAgICBmb3JrSm9pbixcbiAgICBtYXAsXG4gICAgbWVyZ2VNYXAsXG4gICAgT2JzZXJ2YWJsZSxcbiAgICBvZixcbiAgICByYWNlV2l0aCxcbiAgICBSZXBsYXlTdWJqZWN0LFxuICAgIHNoYXJlUmVwbGF5LFxuICAgIFN1YmplY3QsXG4gICAgdGFrZSxcbn0gZnJvbSAncnhqcyc7XG5pbXBvcnQge0luamVjdGFibGV9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtVbnR5cGVkTW9kZWxTZXJ2aWNlfSBmcm9tICcuLi90eXBlcy90eXBlcyc7XG5cbnR5cGUgRGVib3VuY2VkPFQgZXh0ZW5kcyBVbnR5cGVkTW9kZWxTZXJ2aWNlPiA9IHtcbiAgICBvYmplY3Q6IFBhcmFtZXRlcnM8VFsndXBkYXRlTm93J10+WzBdO1xuICAgIG1vZGVsU2VydmljZTogVDtcbiAgICBkZWJvdW5jZXI6IFN1YmplY3Q8dm9pZD47XG4gICAgY2FuY2VsbGVyOiBTdWJqZWN0PHZvaWQ+O1xuICAgIGZsdXNoZXI6IFN1YmplY3Q8dm9pZD47XG4gICAgcmVzdWx0OiBSZXR1cm5UeXBlPFRbJ3VwZGF0ZU5vdyddPjtcbn07XG5cbi8qKlxuICogRGVib3VuY2Ugc3Vic2NyaXB0aW9ucyB0byB1cGRhdGUgbXV0YXRpb25zLCB3aXRoIHRoZSBwb3NzaWJpbGl0eSB0byBjYW5jZWwgb25lLCBmbHVzaCBvbmUsIG9yIGZsdXNoIGFsbCBvZiB0aGVtLlxuICpcbiAqIGBtb2RlbFNlcnZpY2VgIGlzIGFsc28gdXNlZCB0byBzZXBhcmF0ZSBvYmplY3RzIGJ5IHRoZWlyIHR5cGVzLiBTbyBVc2VyIHdpdGggSUQgMSBpcyBub3QgY29uZnVzZWQgd2l0aCBQcm9kdWN0IHdpdGggSUQgMS5cbiAqXG4gKiBgaWRgIG11c3QgYmUgdGhlIElEIG9mIHRoZSBvYmplY3QgdGhhdCB3aWxsIGJlIHVwZGF0ZWQuXG4gKi9cbkBJbmplY3RhYmxlKHtcbiAgICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIE5hdHVyYWxEZWJvdW5jZVNlcnZpY2Uge1xuICAgIC8qKlxuICAgICAqIFN0b3JlcyB0aGUgZGVib3VuY2VkIHVwZGF0ZSBmdW5jdGlvblxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgYWxsRGVib3VuY2VkVXBkYXRlQ2FjaGUgPSBuZXcgTWFwPFxuICAgICAgICBVbnR5cGVkTW9kZWxTZXJ2aWNlLFxuICAgICAgICBNYXA8c3RyaW5nLCBEZWJvdW5jZWQ8VW50eXBlZE1vZGVsU2VydmljZT4+XG4gICAgPigpO1xuXG4gICAgLyoqXG4gICAgICogRGVib3VuY2UgdGhlIGBtb2RlbFNlcnZpY2UudXBkYXRlTm93KClgIG11dGF0aW9uIGZvciBhIHNob3J0IHRpbWUuIElmIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyB3aXRoIHRoZSBzYW1lXG4gICAgICogbW9kZWxTZXJ2aWNlIGFuZCBpZCwgaXQgd2lsbCBwb3N0cG9uZSB0aGUgc3Vic2NyaXB0aW9uIHRvIHRoZSBtdXRhdGlvbi5cbiAgICAgKlxuICAgICAqIEFsbCBpbnB1dCB2YXJpYWJsZXMgZm9yIHRoZSBzYW1lIG9iamVjdCAoc2FtZSBzZXJ2aWNlIGFuZCBJRCkgd2lsbCBiZSBjdW11bGF0ZWQgb3ZlciB0aW1lLiBTbyBpdCBpcyBwb3NzaWJsZVxuICAgICAqIHRvIHVwZGF0ZSBgZmllbGQxYCwgdGhlbiBgZmllbGQyYCwgYW5kIHRoZXkgd2lsbCBiZSBiYXRjaGVkIGludG8gYSBzaW5nbGUgWEhSIGluY2x1ZGluZyBgZmllbGQxYCBhbmQgYGZpZWxkMmAuXG4gICAgICpcbiAgICAgKiBCdXQgaXQgd2lsbCBhbHdheXMga2VlcCB0aGUgc2FtZSBkZWJvdW5jaW5nIHRpbWVsaW5lLlxuICAgICAqL1xuICAgIHB1YmxpYyBkZWJvdW5jZTxUIGV4dGVuZHMgVW50eXBlZE1vZGVsU2VydmljZT4oXG4gICAgICAgIG1vZGVsU2VydmljZTogVW50eXBlZE1vZGVsU2VydmljZSxcbiAgICAgICAgaWQ6IHN0cmluZyxcbiAgICAgICAgb2JqZWN0OiBQYXJhbWV0ZXJzPFRbJ3VwZGF0ZU5vdyddPlswXSxcbiAgICApOiBSZXR1cm5UeXBlPFRbJ3VwZGF0ZU5vdyddPiB7XG4gICAgICAgIGNvbnN0IGRlYm91bmNlZFVwZGF0ZUNhY2hlID0gdGhpcy5nZXRNYXAobW9kZWxTZXJ2aWNlKTtcbiAgICAgICAgbGV0IGRlYm91bmNlZCA9IGRlYm91bmNlZFVwZGF0ZUNhY2hlLmdldChpZCkgYXMgRGVib3VuY2VkPFQ+IHwgdW5kZWZpbmVkO1xuXG4gICAgICAgIGlmIChkZWJvdW5jZWQpIHtcbiAgICAgICAgICAgIGRlYm91bmNlZC5vYmplY3QgPSB7XG4gICAgICAgICAgICAgICAgLi4uZGVib3VuY2VkLm9iamVjdCxcbiAgICAgICAgICAgICAgICAuLi5vYmplY3QsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgZGVib3VuY2VyID0gbmV3IFJlcGxheVN1YmplY3Q8dm9pZD4oMSk7XG4gICAgICAgICAgICBsZXQgd2FzQ2FuY2VsbGVkID0gZmFsc2U7XG4gICAgICAgICAgICBjb25zdCBjYW5jZWxsZXIgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICAgICAgICAgICAgY2FuY2VsbGVyLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgd2FzQ2FuY2VsbGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBkZWJvdW5jZXIuY29tcGxldGUoKTtcbiAgICAgICAgICAgICAgICBjYW5jZWxsZXIuY29tcGxldGUoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmRlbGV0ZShtb2RlbFNlcnZpY2UsIGlkKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBjb25zdCBmbHVzaGVyID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICAgICAgICAgICAgZGVib3VuY2VkID0ge1xuICAgICAgICAgICAgICAgIG9iamVjdCxcbiAgICAgICAgICAgICAgICBkZWJvdW5jZXIsXG4gICAgICAgICAgICAgICAgY2FuY2VsbGVyLFxuICAgICAgICAgICAgICAgIGZsdXNoZXIsXG4gICAgICAgICAgICAgICAgbW9kZWxTZXJ2aWNlOiBtb2RlbFNlcnZpY2UgYXMgVCxcbiAgICAgICAgICAgICAgICByZXN1bHQ6IGRlYm91bmNlci5waXBlKFxuICAgICAgICAgICAgICAgICAgICBkZWJvdW5jZVRpbWUoMjAwMCksIC8vIFdhaXQgMiBzZWNvbmRzLi4uXG4gICAgICAgICAgICAgICAgICAgIHJhY2VXaXRoKGZsdXNoZXIpLCAvLyAuLi51bmxlc3MgZmx1c2hlciBpcyB0cmlnZ2VyZWRcbiAgICAgICAgICAgICAgICAgICAgdGFrZSgxKSxcbiAgICAgICAgICAgICAgICAgICAgbWVyZ2VNYXAoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWxldGUobW9kZWxTZXJ2aWNlLCBpZCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3YXNDYW5jZWxsZWQgfHwgIWRlYm91bmNlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFTVBUWTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1vZGVsU2VydmljZS51cGRhdGVOb3coZGVib3VuY2VkLm9iamVjdCk7XG4gICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICBzaGFyZVJlcGxheSgpLCAvLyBBbGwgYXR0ZW1wdHMgdG8gdXBkYXRlIHdpbGwgc2hhcmUgdGhlIGV4YWN0IHNhbWUgc2luZ2xlIHJlc3VsdCBmcm9tIEFQSVxuICAgICAgICAgICAgICAgICkgYXMgUmV0dXJuVHlwZTxUWyd1cGRhdGVOb3cnXT4sXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBkZWJvdW5jZWRVcGRhdGVDYWNoZS5zZXQoaWQsIGRlYm91bmNlZCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBOb3RpZnkgb3VyIGRlYm91bmNlZCB1cGRhdGUgZWFjaCB0aW1lIHdlIGFzayB0byB1cGRhdGVcbiAgICAgICAgZGVib3VuY2VkLmRlYm91bmNlci5uZXh0KCk7XG5cbiAgICAgICAgLy8gUmV0dXJuIGFuZCBvYnNlcnZhYmxlIHRoYXQgaXMgdXBkYXRlZCB3aGVuIG11dGF0aW9uIGlzIGRvbmVcbiAgICAgICAgcmV0dXJuIGRlYm91bmNlZC5yZXN1bHQ7XG4gICAgfVxuXG4gICAgcHVibGljIGNhbmNlbE9uZShtb2RlbFNlcnZpY2U6IFVudHlwZWRNb2RlbFNlcnZpY2UsIGlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZGVib3VuY2VkID0gdGhpcy5hbGxEZWJvdW5jZWRVcGRhdGVDYWNoZS5nZXQobW9kZWxTZXJ2aWNlKT8uZ2V0KGlkKTtcbiAgICAgICAgZGVib3VuY2VkPy5jYW5jZWxsZXIubmV4dCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEltbWVkaWF0ZWx5IGV4ZWN1dGUgdGhlIHBlbmRpbmcgdXBkYXRlLCBpZiBhbnkuXG4gICAgICpcbiAgICAgKiBJdCBzaG91bGQgdHlwaWNhbGx5IGJlIGNhbGxlZCBiZWZvcmUgcmVzb2x2aW5nIHRoZSBvYmplY3QsIHRvIG11dGF0ZSBpdCBiZWZvcmUgcmUtZmV0Y2hpbmcgaXQgZnJvbSBzZXJ2ZXIuXG4gICAgICpcbiAgICAgKiBUaGUgcmV0dXJuZWQgb2JzZXJ2YWJsZSB3aWxsIGNvbXBsZXRlIHdoZW4gdGhlIHVwZGF0ZSBjb21wbGV0ZXMsIGV2ZW4gaWYgaXQgZXJyb3JzLlxuICAgICAqL1xuICAgIHB1YmxpYyBmbHVzaE9uZShtb2RlbFNlcnZpY2U6IFVudHlwZWRNb2RlbFNlcnZpY2UsIGlkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgZGVib3VuY2VkID0gdGhpcy5hbGxEZWJvdW5jZWRVcGRhdGVDYWNoZS5nZXQobW9kZWxTZXJ2aWNlKT8uZ2V0KGlkKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5pbnRlcm5hbEZsdXNoKGRlYm91bmNlZCA/IFtkZWJvdW5jZWRdIDogW10pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEltbWVkaWF0ZWx5IGV4ZWN1dGUgYWxsIHBlbmRpbmcgdXBkYXRlcy5cbiAgICAgKlxuICAgICAqIEl0IHNob3VsZCB0eXBpY2FsbHkgYmUgY2FsbGVkIGJlZm9yZSBsb2dpbiBvdXQuXG4gICAgICpcbiAgICAgKiBUaGUgcmV0dXJuZWQgb2JzZXJ2YWJsZSB3aWxsIGNvbXBsZXRlIHdoZW4gYWxsIHVwZGF0ZXMgY29tcGxldGUsIGV2ZW4gaWYgc29tZSBvZiB0aGVtIGVycm9yLlxuICAgICAqL1xuICAgIHB1YmxpYyBmbHVzaCgpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgYWxsOiBEZWJvdW5jZWQ8VW50eXBlZE1vZGVsU2VydmljZT5bXSA9IFtdO1xuICAgICAgICB0aGlzLmFsbERlYm91bmNlZFVwZGF0ZUNhY2hlLmZvckVhY2gobWFwID0+IG1hcC5mb3JFYWNoKGRlYm91bmNlZCA9PiBhbGwucHVzaChkZWJvdW5jZWQpKSk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuaW50ZXJuYWxGbHVzaChhbGwpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaW50ZXJuYWxGbHVzaChkZWJvdW5jZWRzOiBEZWJvdW5jZWQ8VW50eXBlZE1vZGVsU2VydmljZT5bXSk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgICAgICBjb25zdCBhbGw6IE9ic2VydmFibGU8dW5rbm93bj5bXSA9IFtdO1xuICAgICAgICBjb25zdCBhbGxGbHVzaGVyOiBTdWJqZWN0PHZvaWQ+W10gPSBbXTtcblxuICAgICAgICBkZWJvdW5jZWRzLmZvckVhY2goZGVib3VuY2VkID0+IHtcbiAgICAgICAgICAgIGFsbC5wdXNoKGRlYm91bmNlZC5yZXN1bHQucGlwZShjYXRjaEVycm9yKCgpID0+IG9mKHVuZGVmaW5lZCkpKSk7XG4gICAgICAgICAgICBhbGxGbHVzaGVyLnB1c2goZGVib3VuY2VkLmZsdXNoZXIpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoIWFsbC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGFsbC5wdXNoKG9mKHVuZGVmaW5lZCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKHN1YnNjcmliZXIgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc3Vic2NyaXB0aW9uID0gZm9ya0pvaW4oYWxsKVxuICAgICAgICAgICAgICAgIC5waXBlKG1hcCgoKSA9PiB1bmRlZmluZWQpKVxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoc3Vic2NyaWJlcik7XG5cbiAgICAgICAgICAgIC8vIEZsdXNoIG9ubHkgYWZ0ZXIgc3Vic2NyaXB0aW9uIHByb2Nlc3MgaXMgZmluaXNoZWRcbiAgICAgICAgICAgIGFsbEZsdXNoZXIuZm9yRWFjaChmbHVzaGVyID0+IGZsdXNoZXIubmV4dCgpKTtcblxuICAgICAgICAgICAgcmV0dXJuIHN1YnNjcmlwdGlvbjtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ291bnQgb2YgcGVuZGluZyB1cGRhdGVzXG4gICAgICovXG4gICAgcHVibGljIGdldCBjb3VudCgpOiBudW1iZXIge1xuICAgICAgICBsZXQgY291bnQgPSAwO1xuICAgICAgICB0aGlzLmFsbERlYm91bmNlZFVwZGF0ZUNhY2hlLmZvckVhY2gobWFwID0+IChjb3VudCArPSBtYXAuc2l6ZSkpO1xuXG4gICAgICAgIHJldHVybiBjb3VudDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldE1hcDxUIGV4dGVuZHMgVW50eXBlZE1vZGVsU2VydmljZT4obW9kZWxTZXJ2aWNlOiBUKTogTWFwPHN0cmluZywgRGVib3VuY2VkPFQ+PiB7XG4gICAgICAgIGxldCBkZWJvdW5jZWRVcGRhdGVDYWNoZSA9IHRoaXMuYWxsRGVib3VuY2VkVXBkYXRlQ2FjaGUuZ2V0KG1vZGVsU2VydmljZSk7XG4gICAgICAgIGlmICghZGVib3VuY2VkVXBkYXRlQ2FjaGUpIHtcbiAgICAgICAgICAgIGRlYm91bmNlZFVwZGF0ZUNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIERlYm91bmNlZDxVbnR5cGVkTW9kZWxTZXJ2aWNlPj4oKTtcbiAgICAgICAgICAgIHRoaXMuYWxsRGVib3VuY2VkVXBkYXRlQ2FjaGUuc2V0KG1vZGVsU2VydmljZSwgZGVib3VuY2VkVXBkYXRlQ2FjaGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGRlYm91bmNlZFVwZGF0ZUNhY2hlIGFzIE1hcDxzdHJpbmcsIERlYm91bmNlZDxUPj47XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBkZWxldGUobW9kZWxTZXJ2aWNlOiBVbnR5cGVkTW9kZWxTZXJ2aWNlLCBpZDogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IG1hcCA9IHRoaXMuYWxsRGVib3VuY2VkVXBkYXRlQ2FjaGUuZ2V0KG1vZGVsU2VydmljZSk7XG4gICAgICAgIGlmICghbWFwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBtYXAuZGVsZXRlKGlkKTtcblxuICAgICAgICBpZiAoIW1hcC5zaXplKSB7XG4gICAgICAgICAgICB0aGlzLmFsbERlYm91bmNlZFVwZGF0ZUNhY2hlLmRlbGV0ZShtb2RlbFNlcnZpY2UpO1xuICAgICAgICB9XG4gICAgfVxufVxuIl19
|
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
import { Apollo, gql } from 'apollo-angular';
|
|
2
|
-
import { inject, Injectable } from '@angular/core';
|
|
3
|
-
import { map } from 'rxjs/operators';
|
|
4
|
-
import * as i0 from "@angular/core";
|
|
5
|
-
const enumTypeQuery = gql `
|
|
6
|
-
query EnumType($name: String!) {
|
|
7
|
-
__type(name: $name) {
|
|
8
|
-
__typename
|
|
9
|
-
enumValues {
|
|
10
|
-
name
|
|
11
|
-
description
|
|
12
|
-
}
|
|
13
|
-
}
|
|
14
|
-
}
|
|
15
|
-
`;
|
|
16
|
-
export class NaturalEnumService {
|
|
17
|
-
apollo = inject(Apollo);
|
|
18
|
-
/**
|
|
19
|
-
* Return a list of observable enumerables considering the given name
|
|
20
|
-
*/
|
|
21
|
-
get(name) {
|
|
22
|
-
// Load possible action statuses
|
|
23
|
-
return this.apollo
|
|
24
|
-
.query({
|
|
25
|
-
query: enumTypeQuery,
|
|
26
|
-
variables: { name: name },
|
|
27
|
-
fetchPolicy: 'cache-first',
|
|
28
|
-
})
|
|
29
|
-
.pipe(map(result => {
|
|
30
|
-
const values = [];
|
|
31
|
-
if (result.data.__type?.enumValues) {
|
|
32
|
-
for (const enumValue of result.data.__type.enumValues) {
|
|
33
|
-
values.push({
|
|
34
|
-
value: enumValue.name,
|
|
35
|
-
name: enumValue.description || '',
|
|
36
|
-
});
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
return values;
|
|
40
|
-
}));
|
|
41
|
-
}
|
|
42
|
-
/**
|
|
43
|
-
* Returns the enum user-friendly name, instead of its value.
|
|
44
|
-
*/
|
|
45
|
-
getValueName(value, enumName) {
|
|
46
|
-
return this.get(enumName).pipe(map(values => {
|
|
47
|
-
for (const v of values) {
|
|
48
|
-
if (v.value === value) {
|
|
49
|
-
return v.name;
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
return '';
|
|
53
|
-
}));
|
|
54
|
-
}
|
|
55
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.3", ngImport: i0, type: NaturalEnumService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
56
|
-
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.3", ngImport: i0, type: NaturalEnumService, providedIn: 'root' });
|
|
57
|
-
}
|
|
58
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.3", ngImport: i0, type: NaturalEnumService, decorators: [{
|
|
59
|
-
type: Injectable,
|
|
60
|
-
args: [{
|
|
61
|
-
providedIn: 'root',
|
|
62
|
-
}]
|
|
63
|
-
}] });
|
|
64
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW51bS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmF0dXJhbC9zcmMvbGliL3NlcnZpY2VzL2VudW0uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsTUFBTSxFQUFFLEdBQUcsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sRUFBQyxNQUFNLEVBQUUsVUFBVSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBRWpELE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQzs7QUFFbkMsTUFBTSxhQUFhLEdBQUcsR0FBRyxDQUFBOzs7Ozs7Ozs7O0NBVXhCLENBQUM7QUFzQkYsTUFBTSxPQUFPLGtCQUFrQjtJQUNWLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7SUFFekM7O09BRUc7SUFDSSxHQUFHLENBQUMsSUFBWTtRQUNuQixnQ0FBZ0M7UUFDaEMsT0FBTyxJQUFJLENBQUMsTUFBTTthQUNiLEtBQUssQ0FBVztZQUNiLEtBQUssRUFBRSxhQUFhO1lBQ3BCLFNBQVMsRUFBRSxFQUFDLElBQUksRUFBRSxJQUFJLEVBQUM7WUFDdkIsV0FBVyxFQUFFLGFBQWE7U0FDN0IsQ0FBQzthQUNELElBQUksQ0FDRCxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDVCxNQUFNLE1BQU0sR0FBWSxFQUFFLENBQUM7WUFDM0IsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUUsQ0FBQztnQkFDakMsS0FBSyxNQUFNLFNBQVMsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQztvQkFDcEQsTUFBTSxDQUFDLElBQUksQ0FBQzt3QkFDUixLQUFLLEVBQUUsU0FBUyxDQUFDLElBQUk7d0JBQ3JCLElBQUksRUFBRSxTQUFTLENBQUMsV0FBVyxJQUFJLEVBQUU7cUJBQ3BDLENBQUMsQ0FBQztnQkFDUCxDQUFDO1lBQ0wsQ0FBQztZQUVELE9BQU8sTUFBTSxDQUFDO1FBQ2xCLENBQUMsQ0FBQyxDQUNMLENBQUM7SUFDVixDQUFDO0lBRUQ7O09BRUc7SUFDSSxZQUFZLENBQUMsS0FBYSxFQUFFLFFBQWdCO1FBQy9DLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQzFCLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUNULEtBQUssTUFBTSxDQUFDLElBQUksTUFBTSxFQUFFLENBQUM7Z0JBQ3JCLElBQUksQ0FBQyxDQUFDLEtBQUssS0FBSyxLQUFLLEVBQUUsQ0FBQztvQkFDcEIsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDO2dCQUNsQixDQUFDO1lBQ0wsQ0FBQztZQUVELE9BQU8sRUFBRSxDQUFDO1FBQ2QsQ0FBQyxDQUFDLENBQ0wsQ0FBQztJQUNOLENBQUM7dUdBOUNRLGtCQUFrQjsyR0FBbEIsa0JBQWtCLGNBRmYsTUFBTTs7MkZBRVQsa0JBQWtCO2tCQUg5QixVQUFVO21CQUFDO29CQUNSLFVBQVUsRUFBRSxNQUFNO2lCQUNyQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7QXBvbGxvLCBncWx9IGZyb20gJ2Fwb2xsby1hbmd1bGFyJztcbmltcG9ydCB7aW5qZWN0LCBJbmplY3RhYmxlfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7T2JzZXJ2YWJsZX0gZnJvbSAncnhqcyc7XG5pbXBvcnQge21hcH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5jb25zdCBlbnVtVHlwZVF1ZXJ5ID0gZ3FsYFxuICAgIHF1ZXJ5IEVudW1UeXBlKCRuYW1lOiBTdHJpbmchKSB7XG4gICAgICAgIF9fdHlwZShuYW1lOiAkbmFtZSkge1xuICAgICAgICAgICAgX190eXBlbmFtZVxuICAgICAgICAgICAgZW51bVZhbHVlcyB7XG4gICAgICAgICAgICAgICAgbmFtZVxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5gO1xuXG50eXBlIEVudW1UeXBlID0ge1xuICAgIF9fdHlwZTogbnVsbCB8IHtcbiAgICAgICAgX190eXBlbmFtZTogc3RyaW5nO1xuICAgICAgICBlbnVtVmFsdWVzOlxuICAgICAgICAgICAgfCBudWxsXG4gICAgICAgICAgICB8IHtcbiAgICAgICAgICAgICAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBudWxsIHwgc3RyaW5nO1xuICAgICAgICAgICAgICB9W107XG4gICAgfTtcbn07XG5cbmV4cG9ydCB0eXBlIElFbnVtID0ge1xuICAgIHZhbHVlOiBzdHJpbmc7XG4gICAgbmFtZTogc3RyaW5nO1xufTtcblxuQEluamVjdGFibGUoe1xuICAgIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgTmF0dXJhbEVudW1TZXJ2aWNlIHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGFwb2xsbyA9IGluamVjdChBcG9sbG8pO1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJuIGEgbGlzdCBvZiBvYnNlcnZhYmxlIGVudW1lcmFibGVzIGNvbnNpZGVyaW5nIHRoZSBnaXZlbiBuYW1lXG4gICAgICovXG4gICAgcHVibGljIGdldChuYW1lOiBzdHJpbmcpOiBPYnNlcnZhYmxlPElFbnVtW10+IHtcbiAgICAgICAgLy8gTG9hZCBwb3NzaWJsZSBhY3Rpb24gc3RhdHVzZXNcbiAgICAgICAgcmV0dXJuIHRoaXMuYXBvbGxvXG4gICAgICAgICAgICAucXVlcnk8RW51bVR5cGU+KHtcbiAgICAgICAgICAgICAgICBxdWVyeTogZW51bVR5cGVRdWVyeSxcbiAgICAgICAgICAgICAgICB2YXJpYWJsZXM6IHtuYW1lOiBuYW1lfSxcbiAgICAgICAgICAgICAgICBmZXRjaFBvbGljeTogJ2NhY2hlLWZpcnN0JyxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICBtYXAocmVzdWx0ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWVzOiBJRW51bVtdID0gW107XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuZGF0YS5fX3R5cGU/LmVudW1WYWx1ZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZW51bVZhbHVlIG9mIHJlc3VsdC5kYXRhLl9fdHlwZS5lbnVtVmFsdWVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZW51bVZhbHVlLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGVudW1WYWx1ZS5kZXNjcmlwdGlvbiB8fCAnJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZXM7XG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGVudW0gdXNlci1mcmllbmRseSBuYW1lLCBpbnN0ZWFkIG9mIGl0cyB2YWx1ZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0VmFsdWVOYW1lKHZhbHVlOiBzdHJpbmcsIGVudW1OYW1lOiBzdHJpbmcpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXQoZW51bU5hbWUpLnBpcGUoXG4gICAgICAgICAgICBtYXAodmFsdWVzID0+IHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHYgb2YgdmFsdWVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2LnZhbHVlID09PSB2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHYubmFtZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgIH1cbn1cbiJdfQ==
|
|
@@ -1,154 +0,0 @@
|
|
|
1
|
-
import { Apollo, gql } from 'apollo-angular';
|
|
2
|
-
import { inject, Injectable } from '@angular/core';
|
|
3
|
-
import { clone } from 'lodash-es';
|
|
4
|
-
import { forkJoin, of } from 'rxjs';
|
|
5
|
-
import { map, switchMap } from 'rxjs/operators';
|
|
6
|
-
import { upperCaseFirstLetter } from '../classes/utility';
|
|
7
|
-
import * as i0 from "@angular/core";
|
|
8
|
-
/**
|
|
9
|
-
* Query to get list of mutations
|
|
10
|
-
*/
|
|
11
|
-
const queriesQuery = gql `
|
|
12
|
-
query Mutations {
|
|
13
|
-
__type(name: "Mutation") {
|
|
14
|
-
fields {
|
|
15
|
-
name
|
|
16
|
-
args {
|
|
17
|
-
name
|
|
18
|
-
type {
|
|
19
|
-
ofType {
|
|
20
|
-
name
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
`;
|
|
28
|
-
export class NaturalLinkMutationService {
|
|
29
|
-
apollo = inject(Apollo);
|
|
30
|
-
/**
|
|
31
|
-
* Receives the list of available mutations
|
|
32
|
-
*/
|
|
33
|
-
allMutations;
|
|
34
|
-
/**
|
|
35
|
-
* Link two objects together
|
|
36
|
-
*/
|
|
37
|
-
link(obj1, obj2, otherName = null, variables = {}) {
|
|
38
|
-
// clone prevents to affect the original reference
|
|
39
|
-
const clonedVariables = clone(variables);
|
|
40
|
-
return this.getMutation('link', obj1, obj2, otherName, clonedVariables).pipe(switchMap(mutation => this.execute(mutation)));
|
|
41
|
-
}
|
|
42
|
-
/**
|
|
43
|
-
* Link many objects
|
|
44
|
-
*/
|
|
45
|
-
linkMany(obj1, objects, otherName = null, variables = {}) {
|
|
46
|
-
return forkJoin(objects.map(obj2 => this.link(obj1, obj2, otherName, variables)));
|
|
47
|
-
}
|
|
48
|
-
/**
|
|
49
|
-
* Unlink two objects
|
|
50
|
-
*/
|
|
51
|
-
unlink(obj1, obj2, otherName = null) {
|
|
52
|
-
return this.getMutation('unlink', obj1, obj2, otherName).pipe(switchMap(mutation => this.execute(mutation)));
|
|
53
|
-
}
|
|
54
|
-
/**
|
|
55
|
-
* Return the list of all available mutation names
|
|
56
|
-
*/
|
|
57
|
-
getAllMutationNames() {
|
|
58
|
-
if (this.allMutations) {
|
|
59
|
-
return of(this.allMutations);
|
|
60
|
-
}
|
|
61
|
-
const mapArg = (arg) => {
|
|
62
|
-
return {
|
|
63
|
-
name: arg.name,
|
|
64
|
-
type: arg.type?.ofType?.name?.replace(/ID$/, '') || 'should-never-happen',
|
|
65
|
-
};
|
|
66
|
-
};
|
|
67
|
-
return this.apollo
|
|
68
|
-
.query({
|
|
69
|
-
query: queriesQuery,
|
|
70
|
-
fetchPolicy: 'cache-first',
|
|
71
|
-
})
|
|
72
|
-
.pipe(map(({ data }) => {
|
|
73
|
-
if (data.__type?.fields) {
|
|
74
|
-
this.allMutations = data.__type.fields
|
|
75
|
-
.filter(v => /^(link|unlink)/.exec(v.name))
|
|
76
|
-
.map(v => {
|
|
77
|
-
return {
|
|
78
|
-
name: v.name,
|
|
79
|
-
arg1: mapArg(v.args[0]),
|
|
80
|
-
arg2: mapArg(v.args[1]),
|
|
81
|
-
};
|
|
82
|
-
});
|
|
83
|
-
}
|
|
84
|
-
else {
|
|
85
|
-
this.allMutations = [];
|
|
86
|
-
}
|
|
87
|
-
return this.allMutations;
|
|
88
|
-
}));
|
|
89
|
-
}
|
|
90
|
-
/**
|
|
91
|
-
* Generate mutation using patterns and replacing variables
|
|
92
|
-
*/
|
|
93
|
-
getMutation(action, obj1, obj2, otherName, variables = {}) {
|
|
94
|
-
otherName = otherName ? upperCaseFirstLetter(otherName) : otherName;
|
|
95
|
-
const mutationName = action + obj1.__typename + (otherName || obj2.__typename);
|
|
96
|
-
const reversedMutationName = action + obj2.__typename + (otherName || obj1.__typename);
|
|
97
|
-
return this.getAllMutationNames().pipe(map(allMutationNames => {
|
|
98
|
-
const mutation = allMutationNames.find(mut => mut.name === mutationName) ||
|
|
99
|
-
allMutationNames.find(mut => mut.name === reversedMutationName);
|
|
100
|
-
if (mutation) {
|
|
101
|
-
return this.buildTemplate(mutation, obj1, obj2, variables);
|
|
102
|
-
}
|
|
103
|
-
throw TypeError('API does not allow to ' + action + ' ' + obj1.__typename + ' and ' + obj2.__typename);
|
|
104
|
-
}));
|
|
105
|
-
}
|
|
106
|
-
/**
|
|
107
|
-
* Execute mutation
|
|
108
|
-
*/
|
|
109
|
-
execute(mutation) {
|
|
110
|
-
return this.apollo
|
|
111
|
-
.mutate({
|
|
112
|
-
mutation: gql(mutation),
|
|
113
|
-
})
|
|
114
|
-
.pipe(map(r => {
|
|
115
|
-
this.apollo.client.reFetchObservableQueries();
|
|
116
|
-
return r;
|
|
117
|
-
}));
|
|
118
|
-
}
|
|
119
|
-
/**
|
|
120
|
-
* Build the actual mutation string
|
|
121
|
-
*/
|
|
122
|
-
buildTemplate(mutation, obj1, obj2, variables = {}) {
|
|
123
|
-
let name1;
|
|
124
|
-
let name2;
|
|
125
|
-
if (obj1.__typename === mutation.arg1.type) {
|
|
126
|
-
name1 = mutation.arg1.name;
|
|
127
|
-
name2 = mutation.arg2.name;
|
|
128
|
-
}
|
|
129
|
-
else {
|
|
130
|
-
name1 = mutation.arg2.name;
|
|
131
|
-
name2 = mutation.arg1.name;
|
|
132
|
-
}
|
|
133
|
-
variables[name1] = obj1.id;
|
|
134
|
-
variables[name2] = obj2.id;
|
|
135
|
-
let serializedVariables = '';
|
|
136
|
-
for (const key of Object.keys(variables)) {
|
|
137
|
-
serializedVariables += key + ': ' + JSON.stringify(variables[key]) + ' ';
|
|
138
|
-
}
|
|
139
|
-
return `mutation linkAndUnlink {
|
|
140
|
-
${mutation.name}(${serializedVariables}) {
|
|
141
|
-
id
|
|
142
|
-
}
|
|
143
|
-
}`;
|
|
144
|
-
}
|
|
145
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.3", ngImport: i0, type: NaturalLinkMutationService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
146
|
-
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.3", ngImport: i0, type: NaturalLinkMutationService, providedIn: 'root' });
|
|
147
|
-
}
|
|
148
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.3", ngImport: i0, type: NaturalLinkMutationService, decorators: [{
|
|
149
|
-
type: Injectable,
|
|
150
|
-
args: [{
|
|
151
|
-
providedIn: 'root',
|
|
152
|
-
}]
|
|
153
|
-
}] });
|
|
154
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGluay1tdXRhdGlvbi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmF0dXJhbC9zcmMvbGliL3NlcnZpY2VzL2xpbmstbXV0YXRpb24uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsTUFBTSxFQUFFLEdBQUcsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBRTNDLE9BQU8sRUFBQyxNQUFNLEVBQUUsVUFBVSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ2pELE9BQU8sRUFBQyxLQUFLLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDaEMsT0FBTyxFQUFDLFFBQVEsRUFBYyxFQUFFLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFDOUMsT0FBTyxFQUFDLEdBQUcsRUFBRSxTQUFTLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUU5QyxPQUFPLEVBQUMsb0JBQW9CLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQzs7QUFFeEQ7O0dBRUc7QUFDSCxNQUFNLFlBQVksR0FBRyxHQUFHLENBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Q0FnQnZCLENBQUM7QUF5Q0YsTUFBTSxPQUFPLDBCQUEwQjtJQUNsQixNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBRXpDOztPQUVHO0lBQ0ssWUFBWSxDQUFjO0lBRWxDOztPQUVHO0lBQ0ksSUFBSSxDQUNQLElBQW9CLEVBQ3BCLElBQW9CLEVBQ3BCLFlBQTJCLElBQUksRUFDL0IsWUFBcUIsRUFBRTtRQUV2QixrREFBa0Q7UUFDbEQsTUFBTSxlQUFlLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRXpDLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsZUFBZSxDQUFDLENBQUMsSUFBSSxDQUN4RSxTQUFTLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENB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Q3BCLElBQW9CLEVBQ3BCLFlBQXFCLEVBQUU7UUFFdkIsSUFBSSxLQUFLLENBQUM7UUFDVixJQUFJLEtBQUssQ0FBQztRQUNWLElBQUksSUFBSSxDQUFDLFVBQVUsS0FBSyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3pDLEtBQUssR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztZQUMzQixLQUFLLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDL0IsQ0FBQzthQUFNLENBQUM7WUFDSixLQUFLLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7WUFDM0IsS0FBSyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQy9CLENBQUM7UUFDRCxTQUFTLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUMzQixTQUFTLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUUzQixJQUFJLG1CQUFtQixHQUFHLEVBQUUsQ0FBQztRQUM3QixLQUFLLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztZQUN2QyxtQkFBbUIsSUFBSSxHQUFHLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQzdFLENBQUM7UUFFRCxPQUFPO2NBQ0QsUUFBUSxDQUFDLElBQUksSUFBSSxtQkFBbUI7OztVQUd4QyxDQUFDO0lBQ1AsQ0FBQzt1R0FyS1EsMEJBQTBCOzJHQUExQiwwQkFBMEIsY0FGdkIsTUFBTTs7MkZBRVQsMEJBQTBCO2tCQUh0QyxVQUFVO21CQUFDO29CQUNSLFVBQVUsRUFBRSxNQUFNO2lCQUNyQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7QXBvbGxvLCBncWx9IGZyb20gJ2Fwb2xsby1hbmd1bGFyJztcbmltcG9ydCB7RmV0Y2hSZXN1bHR9IGZyb20gJ0BhcG9sbG8vY2xpZW50L2NvcmUnO1xuaW1wb3J0IHtpbmplY3QsIEluamVjdGFibGV9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtjbG9uZX0gZnJvbSAnbG9kYXNoLWVzJztcbmltcG9ydCB7Zm9ya0pvaW4sIE9ic2VydmFibGUsIG9mfSBmcm9tICdyeGpzJztcbmltcG9ydCB7bWFwLCBzd2l0Y2hNYXB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7TGl0ZXJhbH0gZnJvbSAnLi4vdHlwZXMvdHlwZXMnO1xuaW1wb3J0IHt1cHBlckNhc2VGaXJzdExldHRlcn0gZnJvbSAnLi4vY2xhc3Nlcy91dGlsaXR5JztcblxuLyoqXG4gKiBRdWVyeSB0byBnZXQgbGlzdCBvZiBtdXRhdGlvbnNcbiAqL1xuY29uc3QgcXVlcmllc1F1ZXJ5ID0gZ3FsYFxuICAgIHF1ZXJ5IE11dGF0aW9ucyB7XG4gICAgICAgIF9fdHlwZShuYW1lOiBcIk11dGF0aW9uXCIpIHtcbiAgICAgICAgICAgIGZpZWxkcyB7XG4gICAgICAgICAgICAgICAgbmFtZVxuICAgICAgICAgICAgICAgIGFyZ3Mge1xuICAgICAgICAgICAgICAgICAgICBuYW1lXG4gICAgICAgICAgICAgICAgICAgIHR5cGUge1xuICAgICAgICAgICAgICAgICAgICAgICAgb2ZUeXBlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5gO1xuXG50eXBlIEludHJvc3BlY3RlZEFyZyA9IHtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgdHlwZToge1xuICAgICAgICBvZlR5cGU6IG51bGwgfCB7XG4gICAgICAgICAgICBuYW1lOiBudWxsIHwgc3RyaW5nO1xuICAgICAgICB9O1xuICAgIH07XG59O1xuXG50eXBlIEludHJvc3BlY3RlZE11dGF0aW9ucyA9IHtcbiAgICBfX3R5cGU6IG51bGwgfCB7XG4gICAgICAgIGZpZWxkczpcbiAgICAgICAgICAgIHwgbnVsbFxuICAgICAgICAgICAgfCB7XG4gICAgICAgICAgICAgICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICAgICAgICAgICAgICBhcmdzOiBJbnRyb3NwZWN0ZWRBcmdbXTtcbiAgICAgICAgICAgICAgfVtdO1xuICAgIH07XG59O1xuXG5leHBvcnQgdHlwZSBMaW5rYWJsZU9iamVjdCA9IHtcbiAgICBpZDogc3RyaW5nO1xuICAgIF9fdHlwZW5hbWU6IHN0cmluZztcbn07XG5cbnR5cGUgTXV0YXRpb25BcmcgPSB7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIHR5cGU6IHN0cmluZztcbn07XG5cbnR5cGUgTXV0YXRpb24gPSB7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGFyZzE6IE11dGF0aW9uQXJnO1xuICAgIGFyZzI6IE11dGF0aW9uQXJnO1xufTtcblxuQEluamVjdGFibGUoe1xuICAgIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgTmF0dXJhbExpbmtNdXRhdGlvblNlcnZpY2Uge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgYXBvbGxvID0gaW5qZWN0KEFwb2xsbyk7XG5cbiAgICAvKipcbiAgICAgKiBSZWNlaXZlcyB0aGUgbGlzdCBvZiBhdmFpbGFibGUgbXV0YXRpb25zXG4gICAgICovXG4gICAgcHJpdmF0ZSBhbGxNdXRhdGlvbnM/OiBNdXRhdGlvbltdO1xuXG4gICAgLyoqXG4gICAgICogTGluayB0d28gb2JqZWN0cyB0b2dldGhlclxuICAgICAqL1xuICAgIHB1YmxpYyBsaW5rKFxuICAgICAgICBvYmoxOiBMaW5rYWJsZU9iamVjdCxcbiAgICAgICAgb2JqMjogTGlua2FibGVPYmplY3QsXG4gICAgICAgIG90aGVyTmFtZTogc3RyaW5nIHwgbnVsbCA9IG51bGwsXG4gICAgICAgIHZhcmlhYmxlczogTGl0ZXJhbCA9IHt9LFxuICAgICk6IE9ic2VydmFibGU8RmV0Y2hSZXN1bHQ8e2lkOiBzdHJpbmd9Pj4ge1xuICAgICAgICAvLyBjbG9uZSBwcmV2ZW50cyB0byBhZmZlY3QgdGhlIG9yaWdpbmFsIHJlZmVyZW5jZVxuICAgICAgICBjb25zdCBjbG9uZWRWYXJpYWJsZXMgPSBjbG9uZSh2YXJpYWJsZXMpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmdldE11dGF0aW9uKCdsaW5rJywgb2JqMSwgb2JqMiwgb3RoZXJOYW1lLCBjbG9uZWRWYXJpYWJsZXMpLnBpcGUoXG4gICAgICAgICAgICBzd2l0Y2hNYXAobXV0YXRpb24gPT4gdGhpcy5leGVjdXRlKG11dGF0aW9uKSksXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTGluayBtYW55IG9iamVjdHNcbiAgICAgKi9cbiAgICBwdWJsaWMgbGlua01hbnkoXG4gICAgICAgIG9iajE6IExpbmthYmxlT2JqZWN0LFxuICAgICAgICBvYmplY3RzOiBMaW5rYWJsZU9iamVjdFtdLFxuICAgICAgICBvdGhlck5hbWU6IHN0cmluZyB8IG51bGwgPSBudWxsLFxuICAgICAgICB2YXJpYWJsZXM6IExpdGVyYWwgPSB7fSxcbiAgICApOiBPYnNlcnZhYmxlPEZldGNoUmVzdWx0PHtpZDogc3RyaW5nfT5bXT4ge1xuICAgICAgICByZXR1cm4gZm9ya0pvaW4ob2JqZWN0cy5tYXAob2JqMiA9PiB0aGlzLmxpbmsob2JqMSwgb2JqMiwgb3RoZXJOYW1lLCB2YXJpYWJsZXMpKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVW5saW5rIHR3byBvYmplY3RzXG4gICAgICovXG4gICAgcHVibGljIHVubGluayhcbiAgICAgICAgb2JqMTogTGlua2FibGVPYmplY3QsXG4gICAgICAgIG9iajI6IExpbmthYmxlT2JqZWN0LFxuICAgICAgICBvdGhlck5hbWU6IHN0cmluZyB8IG51bGwgPSBudWxsLFxuICAgICk6IE9ic2VydmFibGU8RmV0Y2hSZXN1bHQ8e2lkOiBzdHJpbmd9Pj4ge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRNdXRhdGlvbigndW5saW5rJywgb2JqMSwgb2JqMiwgb3RoZXJOYW1lKS5waXBlKHN3aXRjaE1hcChtdXRhdGlvbiA9PiB0aGlzLmV4ZWN1dGUobXV0YXRpb24pKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJuIHRoZSBsaXN0IG9mIGFsbCBhdmFpbGFibGUgbXV0YXRpb24gbmFtZXNcbiAgICAgKi9cbiAgICBwcml2YXRlIGdldEFsbE11dGF0aW9uTmFtZXMoKTogT2JzZXJ2YWJsZTxNdXRhdGlvbltdPiB7XG4gICAgICAgIGlmICh0aGlzLmFsbE11dGF0aW9ucykge1xuICAgICAgICAgICAgcmV0dXJuIG9mKHRoaXMuYWxsTXV0YXRpb25zKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG1hcEFyZyA9IChhcmc6IEludHJvc3BlY3RlZEFyZyk6IE11dGF0aW9uQXJnID0+IHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgbmFtZTogYXJnLm5hbWUsXG4gICAgICAgICAgICAgICAgdHlwZTogYXJnLnR5cGU/Lm9mVHlwZT8ubmFtZT8ucmVwbGFjZSgvSUQkLywgJycpIHx8ICdzaG91bGQtbmV2ZXItaGFwcGVuJyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuYXBvbGxvXG4gICAgICAgICAgICAucXVlcnk8SW50cm9zcGVjdGVkTXV0YXRpb25zPih7XG4gICAgICAgICAgICAgICAgcXVlcnk6IHF1ZXJpZXNRdWVyeSxcbiAgICAgICAgICAgICAgICBmZXRjaFBvbGljeTogJ2NhY2hlLWZpcnN0JyxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICBtYXAoKHtkYXRhfSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5fX3R5cGU/LmZpZWxkcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hbGxNdXRhdGlvbnMgPSBkYXRhLl9fdHlwZS5maWVsZHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKHYgPT4gL14obGlua3x1bmxpbmspLy5leGVjKHYubmFtZSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCh2ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IHYubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZzE6IG1hcEFyZyh2LmFyZ3NbMF0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnMjogbWFwQXJnKHYuYXJnc1sxXSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFsbE11dGF0aW9ucyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYWxsTXV0YXRpb25zO1xuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZW5lcmF0ZSBtdXRhdGlvbiB1c2luZyBwYXR0ZXJucyBhbmQgcmVwbGFjaW5nIHZhcmlhYmxlc1xuICAgICAqL1xuICAgIHByaXZhdGUgZ2V0TXV0YXRpb24oXG4gICAgICAgIGFjdGlvbjogc3RyaW5nLFxuICAgICAgICBvYmoxOiBMaW5rYWJsZU9iamVjdCxcbiAgICAgICAgb2JqMjogTGlua2FibGVPYmplY3QsXG4gICAgICAgIG90aGVyTmFtZTogc3RyaW5nIHwgbnVsbCxcbiAgICAgICAgdmFyaWFibGVzOiBMaXRlcmFsID0ge30sXG4gICAgKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICAgICAgb3RoZXJOYW1lID0gb3RoZXJOYW1lID8gdXBwZXJDYXNlRmlyc3RMZXR0ZXIob3RoZXJOYW1lKSA6IG90aGVyTmFtZTtcbiAgICAgICAgY29uc3QgbXV0YXRpb25OYW1lID0gYWN0aW9uICsgb2JqMS5fX3R5cGVuYW1lICsgKG90aGVyTmFtZSB8fCBvYmoyLl9fdHlwZW5hbWUpO1xuICAgICAgICBjb25zdCByZXZlcnNlZE11dGF0aW9uTmFtZSA9IGFjdGlvbiArIG9iajIuX190eXBlbmFtZSArIChvdGhlck5hbWUgfHwgb2JqMS5fX3R5cGVuYW1lKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5nZXRBbGxNdXRhdGlvbk5hbWVzKCkucGlwZShcbiAgICAgICAgICAgIG1hcChhbGxNdXRhdGlvbk5hbWVzID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBtdXRhdGlvbiA9XG4gICAgICAgICAgICAgICAgICAgIGFsbE11dGF0aW9uTmFtZXMuZmluZChtdXQgPT4gbXV0Lm5hbWUgPT09IG11dGF0aW9uTmFtZSkgfHxcbiAgICAgICAgICAgICAgICAgICAgYWxsTXV0YXRpb25OYW1lcy5maW5kKG11dCA9PiBtdXQubmFtZSA9PT0gcmV2ZXJzZWRNdXRhdGlvbk5hbWUpO1xuXG4gICAgICAgICAgICAgICAgaWYgKG11dGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmJ1aWxkVGVtcGxhdGUobXV0YXRpb24sIG9iajEsIG9iajIsIHZhcmlhYmxlcyk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhyb3cgVHlwZUVycm9yKCdBUEkgZG9lcyBub3QgYWxsb3cgdG8gJyArIGFjdGlvbiArICcgJyArIG9iajEuX190eXBlbmFtZSArICcgYW5kICcgKyBvYmoyLl9fdHlwZW5hbWUpO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXhlY3V0ZSBtdXRhdGlvblxuICAgICAqL1xuICAgIHByaXZhdGUgZXhlY3V0ZShtdXRhdGlvbjogc3RyaW5nKTogT2JzZXJ2YWJsZTxGZXRjaFJlc3VsdDx7aWQ6IHN0cmluZ30+PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmFwb2xsb1xuICAgICAgICAgICAgLm11dGF0ZTx7aWQ6IHN0cmluZ30+KHtcbiAgICAgICAgICAgICAgICBtdXRhdGlvbjogZ3FsKG11dGF0aW9uKSxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICBtYXAociA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXBvbGxvLmNsaWVudC5yZUZldGNoT2JzZXJ2YWJsZVF1ZXJpZXMoKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHI7XG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEJ1aWxkIHRoZSBhY3R1YWwgbXV0YXRpb24gc3RyaW5nXG4gICAgICovXG4gICAgcHJpdmF0ZSBidWlsZFRlbXBsYXRlKFxuICAgICAgICBtdXRhdGlvbjogTXV0YXRpb24sXG4gICAgICAgIG9iajE6IExpbmthYmxlT2JqZWN0LFxuICAgICAgICBvYmoyOiBMaW5rYWJsZU9iamVjdCxcbiAgICAgICAgdmFyaWFibGVzOiBMaXRlcmFsID0ge30sXG4gICAgKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IG5hbWUxO1xuICAgICAgICBsZXQgbmFtZTI7XG4gICAgICAgIGlmIChvYmoxLl9fdHlwZW5hbWUgPT09IG11dGF0aW9uLmFyZzEudHlwZSkge1xuICAgICAgICAgICAgbmFtZTEgPSBtdXRhdGlvbi5hcmcxLm5hbWU7XG4gICAgICAgICAgICBuYW1lMiA9IG11dGF0aW9uLmFyZzIubmFtZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5hbWUxID0gbXV0YXRpb24uYXJnMi5uYW1lO1xuICAgICAgICAgICAgbmFtZTIgPSBtdXRhdGlvbi5hcmcxLm5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgdmFyaWFibGVzW25hbWUxXSA9IG9iajEuaWQ7XG4gICAgICAgIHZhcmlhYmxlc1tuYW1lMl0gPSBvYmoyLmlkO1xuXG4gICAgICAgIGxldCBzZXJpYWxpemVkVmFyaWFibGVzID0gJyc7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHZhcmlhYmxlcykpIHtcbiAgICAgICAgICAgIHNlcmlhbGl6ZWRWYXJpYWJsZXMgKz0ga2V5ICsgJzogJyArIEpTT04uc3RyaW5naWZ5KHZhcmlhYmxlc1trZXldKSArICcgJztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBgbXV0YXRpb24gbGlua0FuZFVubGluayB7XG4gICAgICAgICAgICAke211dGF0aW9uLm5hbWV9KCR7c2VyaWFsaXplZFZhcmlhYmxlc30pIHtcbiAgICAgICAgICAgICAgICBpZFxuICAgICAgICAgICAgfVxuICAgICAgICB9YDtcbiAgICB9XG59XG4iXX0=
|
|
@@ -1,115 +0,0 @@
|
|
|
1
|
-
import { inject, Injectable, InjectionToken } from '@angular/core';
|
|
2
|
-
import { Router } from '@angular/router';
|
|
3
|
-
import { clone } from 'lodash-es';
|
|
4
|
-
import { SESSION_STORAGE } from '../modules/common/services/memory-storage';
|
|
5
|
-
import * as i0 from "@angular/core";
|
|
6
|
-
export const NATURAL_PERSISTENCE_VALIDATOR = new InjectionToken('Validator for persisted value retrieved from NaturalPersistenceService. If returns false, the persisted value will never be returned.');
|
|
7
|
-
export class NaturalPersistenceService {
|
|
8
|
-
router = inject(Router);
|
|
9
|
-
sessionStorage = inject(SESSION_STORAGE);
|
|
10
|
-
isValid = inject(NATURAL_PERSISTENCE_VALIDATOR, { optional: true }) ?? (() => true); // By default, anything is valid
|
|
11
|
-
/**
|
|
12
|
-
* Persist in url and local storage the given value with the given key.
|
|
13
|
-
* When stored in storage, we need more "key" to identify the controller.
|
|
14
|
-
*/
|
|
15
|
-
persist(key, value, route, storageKey, navigationExtras) {
|
|
16
|
-
this.persistInStorage(key, value, storageKey);
|
|
17
|
-
return this.persistInUrl(key, value, route, navigationExtras);
|
|
18
|
-
}
|
|
19
|
-
/**
|
|
20
|
-
* Return object with persisted data in url or in session storage
|
|
21
|
-
* Url has priority over session storage because of url sharing. When url is provided, session storage is ignored.
|
|
22
|
-
* Url and storage are synced when arriving in a component :
|
|
23
|
-
* - When loading with url parameters, storage is updated to stay synced
|
|
24
|
-
* - When loading without url, but with storage data, the url is updated
|
|
25
|
-
*/
|
|
26
|
-
// eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents
|
|
27
|
-
get(key, route, storageKey) {
|
|
28
|
-
// From url
|
|
29
|
-
let params = this.getFromUrl(key, route);
|
|
30
|
-
if (!this.isFalseyValue(params)) {
|
|
31
|
-
this.persistInStorage(key, params, storageKey);
|
|
32
|
-
return params;
|
|
33
|
-
}
|
|
34
|
-
// From storage
|
|
35
|
-
params = this.getFromStorage(key, storageKey);
|
|
36
|
-
if (!this.isFalseyValue(params)) {
|
|
37
|
-
this.persistInUrl(key, params, route);
|
|
38
|
-
return params;
|
|
39
|
-
}
|
|
40
|
-
return null;
|
|
41
|
-
}
|
|
42
|
-
/**
|
|
43
|
-
* Get given key from the url parameters
|
|
44
|
-
*/
|
|
45
|
-
// eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents
|
|
46
|
-
getFromUrl(key, route) {
|
|
47
|
-
const value = route.snapshot.paramMap.get(key);
|
|
48
|
-
return this.deserialize(key, null, value);
|
|
49
|
-
}
|
|
50
|
-
/**
|
|
51
|
-
* Add/override given pair key-value in the url
|
|
52
|
-
* Always JSON.stringify() the given value
|
|
53
|
-
* If the value is falsey, the pair key-value is removed from the url.
|
|
54
|
-
*/
|
|
55
|
-
persistInUrl(key, value, route, navigationExtras) {
|
|
56
|
-
const params = clone(route.snapshot.url[route.snapshot.url.length - 1].parameters);
|
|
57
|
-
if (this.isFalseyValue(value)) {
|
|
58
|
-
delete params[key];
|
|
59
|
-
}
|
|
60
|
-
else {
|
|
61
|
-
params[key] = JSON.stringify(value);
|
|
62
|
-
}
|
|
63
|
-
navigationExtras = Object.assign(navigationExtras || {}, { relativeTo: route });
|
|
64
|
-
return this.router.navigate(['.', params], navigationExtras);
|
|
65
|
-
}
|
|
66
|
-
// eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents
|
|
67
|
-
getFromStorage(key, storageKey) {
|
|
68
|
-
const value = this.sessionStorage.getItem(this.getStorageKey(key, storageKey));
|
|
69
|
-
return this.deserialize(key, storageKey, value);
|
|
70
|
-
}
|
|
71
|
-
/**
|
|
72
|
-
* Store value in session storage.
|
|
73
|
-
* If value is falsy, the entry is removed
|
|
74
|
-
*/
|
|
75
|
-
persistInStorage(key, value, storageKey) {
|
|
76
|
-
if (this.isFalseyValue(value)) {
|
|
77
|
-
this.sessionStorage.removeItem(this.getStorageKey(key, storageKey));
|
|
78
|
-
}
|
|
79
|
-
else {
|
|
80
|
-
this.sessionStorage.setItem(this.getStorageKey(key, storageKey), JSON.stringify(value));
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
getStorageKey(key, storageKey) {
|
|
84
|
-
return storageKey + '-' + key;
|
|
85
|
-
}
|
|
86
|
-
// Returns if the given value is falsey
|
|
87
|
-
// Falsey values are : null, undefined and empty string.
|
|
88
|
-
// This cause usually the parameter to be removed from url/storage instead of being stored with no value. Url would be polluted.
|
|
89
|
-
isFalseyValue(value) {
|
|
90
|
-
return value == null || value === ''; // == means null or undefined;
|
|
91
|
-
}
|
|
92
|
-
// eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents
|
|
93
|
-
deserialize(key, storageKey, value) {
|
|
94
|
-
if (!value) {
|
|
95
|
-
return null;
|
|
96
|
-
}
|
|
97
|
-
let result = null;
|
|
98
|
-
try {
|
|
99
|
-
result = JSON.parse(value);
|
|
100
|
-
}
|
|
101
|
-
catch (e) {
|
|
102
|
-
// noop
|
|
103
|
-
}
|
|
104
|
-
return this.isValid(key, storageKey, result) ? result : null;
|
|
105
|
-
}
|
|
106
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.3", ngImport: i0, type: NaturalPersistenceService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
107
|
-
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.3", ngImport: i0, type: NaturalPersistenceService, providedIn: 'root' });
|
|
108
|
-
}
|
|
109
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.3", ngImport: i0, type: NaturalPersistenceService, decorators: [{
|
|
110
|
-
type: Injectable,
|
|
111
|
-
args: [{
|
|
112
|
-
providedIn: 'root',
|
|
113
|
-
}]
|
|
114
|
-
}] });
|
|
115
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVyc2lzdGVuY2Uuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25hdHVyYWwvc3JjL2xpYi9zZXJ2aWNlcy9wZXJzaXN0ZW5jZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxNQUFNLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUNqRSxPQUFPLEVBQW1DLE1BQU0sRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQ3pFLE9BQU8sRUFBQyxLQUFLLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDaEMsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLDJDQUEyQyxDQUFDOztBQVUxRSxNQUFNLENBQUMsTUFBTSw2QkFBNkIsR0FBRyxJQUFJLGNBQWMsQ0FDM0QsdUlBQXVJLENBQzFJLENBQUM7QUFLRixNQUFNLE9BQU8seUJBQXlCO0lBQ2pCLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDeEIsY0FBYyxHQUFHLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUN6QyxPQUFPLEdBQUcsTUFBTSxDQUFDLDZCQUE2QixFQUFFLEVBQUMsUUFBUSxFQUFFLElBQUksRUFBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLGdDQUFnQztJQUVwSTs7O09BR0c7SUFDSSxPQUFPLENBQ1YsR0FBVyxFQUNYLEtBQWMsRUFDZCxLQUFxQixFQUNyQixVQUFrQixFQUNsQixnQkFBbUM7UUFFbkMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDOUMsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLGdCQUFnQixDQUFDLENBQUM7SUFDbEUsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNI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LEdBQUcsRUFBRSxVQUFVLENBQUMsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDNUYsQ0FBQztJQUNMLENBQUM7SUFFTyxhQUFhLENBQUMsR0FBVyxFQUFFLFVBQWtCO1FBQ2pELE9BQU8sVUFBVSxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7SUFDbEMsQ0FBQztJQUVELHVDQUF1QztJQUN2Qyx3REFBd0Q7SUFDeEQsZ0lBQWdJO0lBQ3hILGFBQWEsQ0FBQyxLQUFjO1FBQ2hDLE9BQU8sS0FBSyxJQUFJLElBQUksSUFBSSxLQUFLLEtBQUssRUFBRSxDQUFDLENBQUMsOEJBQThCO0lBQ3hFLENBQUM7SUFFRCw2RUFBNkU7SUFDckUsV0FBVyxDQUFDLEdBQVcsRUFBRSxVQUF5QixFQUFFLEtBQW9CO1FBQzVFLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNULE9BQU8sSUFBSSxDQUFDO1FBQ2hCLENBQUM7UUFFRCxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUM7UUFDbEIsSUFBSSxDQUFDO1lBQ0QsTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDL0IsQ0FBQztRQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDVCxPQUFPO1FBQ1gsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsVUFBVSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUNqRSxDQUFDO3VHQTVIUSx5QkFBeUI7MkdBQXpCLHlCQUF5QixjQUZ0QixNQUFNOzsyRkFFVCx5QkFBeUI7a0JBSHJDLFVBQVU7bUJBQUM7b0JBQ1IsVUFBVSxFQUFFLE1BQU07aUJBQ3JCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtpbmplY3QsIEluamVjdGFibGUsIEluamVjdGlvblRva2VufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7QWN0aXZhdGVkUm91dGUsIE5hdmlnYXRpb25FeHRyYXMsIFJvdXRlcn0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7Y2xvbmV9IGZyb20gJ2xvZGFzaC1lcyc7XG5pbXBvcnQge1NFU1NJT05fU1RPUkFHRX0gZnJvbSAnLi4vbW9kdWxlcy9jb21tb24vc2VydmljZXMvbWVtb3J5LXN0b3JhZ2UnO1xuXG4vKipcbiAqIFZhbGlkYXRvciBmb3IgcGVyc2lzdGVkIHZhbHVlcyByZXRyaWV2ZWQgZnJvbSBOYXR1cmFsUGVyc2lzdGVuY2VTZXJ2aWNlLiBJZiByZXR1cm5zIGZhbHNlLCB0aGUgcGVyc2lzdGVkIHZhbHVlXG4gKiB3aWxsIGJlIGlnbm9yZWQsIGFuZCBpbnN0ZWFkIGBudWxsYCB3aWxsIGJlIHJldHVybmVkLlxuICpcbiAqIGBzdG9yYWdlS2V5YCBpcyBvbmx5IGdpdmVuIGlmIHRoZSB2YWx1ZSBpcyBjb21pbmcgZnJvbSBzZXNzaW9uIHN0b3JhZ2UgKGFuZCBub3QgZnJvbSBVUkwpLlxuICovXG5leHBvcnQgdHlwZSBQZXJzaXN0ZW5jZVZhbGlkYXRvciA9IChrZXk6IHN0cmluZywgc3RvcmFnZUtleTogc3RyaW5nIHwgbnVsbCwgdmFsdWU6IHVua25vd24pID0+IGJvb2xlYW47XG5cbmV4cG9ydCBjb25zdCBOQVRVUkFMX1BFUlNJU1RFTkNFX1ZBTElEQVRPUiA9IG5ldyBJbmplY3Rpb25Ub2tlbjxQZXJzaXN0ZW5jZVZhbGlkYXRvcj4oXG4gICAgJ1ZhbGlkYXRvciBmb3IgcGVyc2lzdGVkIHZhbHVlIHJldHJpZXZlZCBmcm9tIE5hdHVyYWxQZXJzaXN0ZW5jZVNlcnZpY2UuIElmIHJldHVybnMgZmFsc2UsIHRoZSBwZXJzaXN0ZWQgdmFsdWUgd2lsbCBuZXZlciBiZSByZXR1cm5lZC4nLFxuKTtcblxuQEluamVjdGFibGUoe1xuICAgIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgTmF0dXJhbFBlcnNpc3RlbmNlU2VydmljZSB7XG4gICAgcHJpdmF0ZSByZWFkb25seSByb3V0ZXIgPSBpbmplY3QoUm91dGVyKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHNlc3Npb25TdG9yYWdlID0gaW5qZWN0KFNFU1NJT05fU1RPUkFHRSk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBpc1ZhbGlkID0gaW5qZWN0KE5BVFVSQUxfUEVSU0lTVEVOQ0VfVkFMSURBVE9SLCB7b3B0aW9uYWw6IHRydWV9KSA/PyAoKCkgPT4gdHJ1ZSk7IC8vIEJ5IGRlZmF1bHQsIGFueXRoaW5nIGlzIHZhbGlkXG5cbiAgICAvKipcbiAgICAgKiBQZXJzaXN0IGluIHVybCBhbmQgbG9jYWwgc3RvcmFnZSB0aGUgZ2l2ZW4gdmFsdWUgd2l0aCB0aGUgZ2l2ZW4ga2V5LlxuICAgICAqIFdoZW4gc3RvcmVkIGluIHN0b3JhZ2UsIHdlIG5lZWQgbW9yZSBcImtleVwiIHRvIGlkZW50aWZ5IHRoZSBjb250cm9sbGVyLlxuICAgICAqL1xuICAgIHB1YmxpYyBwZXJzaXN0KFxuICAgICAgICBrZXk6IHN0cmluZyxcbiAgICAgICAgdmFsdWU6IHVua25vd24sXG4gICAgICAgIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgICAgICAgc3RvcmFnZUtleTogc3RyaW5nLFxuICAgICAgICBuYXZpZ2F0aW9uRXh0cmFzPzogTmF2aWdhdGlvbkV4dHJhcyxcbiAgICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgdGhpcy5wZXJzaXN0SW5TdG9yYWdlKGtleSwgdmFsdWUsIHN0b3JhZ2VLZXkpO1xuICAgICAgICByZXR1cm4gdGhpcy5wZXJzaXN0SW5Vcmwoa2V5LCB2YWx1ZSwgcm91dGUsIG5hdmlnYXRpb25FeHRyYXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybiBvYmplY3Qgd2l0aCBwZXJzaXN0ZWQgZGF0YSBpbiB1cmwgb3IgaW4gc2Vzc2lvbiBzdG9yYWdlXG4gICAgICogVXJsIGhhcyBwcmlvcml0eSBvdmVyIHNlc3Npb24gc3RvcmFnZSBiZWNhdXNlIG9mIHVybCBzaGFyaW5nLiBXaGVuIHVybCBpcyBwcm92aWRlZCwgc2Vzc2lvbiBzdG9yYWdlIGlzIGlnbm9yZWQuXG4gICAgICogVXJsIGFuZCBzdG9yYWdlIGFyZSBzeW5jZWQgd2hlbiBhcnJpdmluZyBpbiBhIGNvbXBvbmVudCA6XG4gICAgICogIC0gV2hlbiBsb2FkaW5nIHdpdGggdXJsIHBhcmFtZXRlcnMsIHN0b3JhZ2UgaXMgdXBkYXRlZCB0byBzdGF5IHN5bmNlZFxuICAgICAqICAtIFdoZW4gbG9hZGluZyB3aXRob3V0IHVybCwgYnV0IHdpdGggc3RvcmFnZSBkYXRhLCB0aGUgdXJsIGlzIHVwZGF0ZWRcbiAgICAgKi9cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlZHVuZGFudC10eXBlLWNvbnN0aXR1ZW50c1xuICAgIHB1YmxpYyBnZXQoa2V5OiBzdHJpbmcsIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSwgc3RvcmFnZUtleTogc3RyaW5nKTogYW55IHwgbnVsbCB7XG4gICAgICAgIC8vIEZyb20gdXJsXG4gICAgICAgIGxldCBwYXJhbXMgPSB0aGlzLmdldEZyb21Vcmwoa2V5LCByb3V0ZSk7XG4gICAgICAgIGlmICghdGhpcy5pc0ZhbHNleVZhbHVlKHBhcmFtcykpIHtcbiAgICAgICAgICAgIHRoaXMucGVyc2lzdEluU3RvcmFnZShrZXksIHBhcmFtcywgc3RvcmFnZUtleSk7XG4gICAgICAgICAgICByZXR1cm4gcGFyYW1zO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRnJvbSBzdG9yYWdlXG4gICAgICAgIHBhcmFtcyA9IHRoaXMuZ2V0RnJvbVN0b3JhZ2Uoa2V5LCBzdG9yYWdlS2V5KTtcbiAgICAgICAgaWYgKCF0aGlzLmlzRmFsc2V5VmFsdWUocGFyYW1zKSkge1xuICAgICAgICAgICAgdGhpcy5wZXJzaXN0SW5Vcmwoa2V5LCBwYXJhbXMsIHJvdXRlKTtcbiAgICAgICAgICAgIHJldHVybiBwYXJhbXM7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgZ2l2ZW4ga2V5IGZyb20gdGhlIHVybCBwYXJhbWV0ZXJzXG4gICAgICovXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZWR1bmRhbnQtdHlwZS1jb25zdGl0dWVudHNcbiAgICBwdWJsaWMgZ2V0RnJvbVVybChrZXk6IHN0cmluZywgcm91dGU6IEFjdGl2YXRlZFJvdXRlKTogYW55IHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gcm91dGUuc25hcHNob3QucGFyYW1NYXAuZ2V0KGtleSk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZGVzZXJpYWxpemUoa2V5LCBudWxsLCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkL292ZXJyaWRlIGdpdmVuIHBhaXIga2V5LXZhbHVlIGluIHRoZSB1cmxcbiAgICAgKiBBbHdheXMgSlNPTi5zdHJpbmdpZnkoKSB0aGUgZ2l2ZW4gdmFsdWVcbiAgICAgKiBJZiB0aGUgdmFsdWUgaXMgZmFsc2V5LCB0aGUgcGFpciBrZXktdmFsdWUgaXMgcmVtb3ZlZCBmcm9tIHRoZSB1cmwuXG4gICAgICovXG4gICAgcHVibGljIHBlcnNpc3RJblVybChcbiAgICAgICAga2V5OiBzdHJpbmcsXG4gICAgICAgIHZhbHVlOiB1bmtub3duLFxuICAgICAgICByb3V0ZTogQWN0aXZhdGVkUm91dGUsXG4gICAgICAgIG5hdmlnYXRpb25FeHRyYXM/OiBOYXZpZ2F0aW9uRXh0cmFzLFxuICAgICk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICBjb25zdCBwYXJhbXMgPSBjbG9uZShyb3V0ZS5zbmFwc2hvdC51cmxbcm91dGUuc25hcHNob3QudXJsLmxlbmd0aCAtIDFdLnBhcmFtZXRlcnMpO1xuXG4gICAgICAgIGlmICh0aGlzLmlzRmFsc2V5VmFsdWUodmFsdWUpKSB7XG4gICAgICAgICAgICBkZWxldGUgcGFyYW1zW2tleV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwYXJhbXNba2V5XSA9IEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIG5hdmlnYXRpb25FeHRyYXMgPSBPYmplY3QuYXNzaWduKG5hdmlnYXRpb25FeHRyYXMgfHwge30sIHtyZWxhdGl2ZVRvOiByb3V0ZX0pO1xuXG4gICAgICAgIHJldHVybiB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy4nLCBwYXJhbXNdLCBuYXZpZ2F0aW9uRXh0cmFzKTtcbiAgICB9XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlZHVuZGFudC10eXBlLWNvbnN0aXR1ZW50c1xuICAgIHB1YmxpYyBnZXRGcm9tU3RvcmFnZShrZXk6IHN0cmluZywgc3RvcmFnZUtleTogc3RyaW5nKTogYW55IHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5zZXNzaW9uU3RvcmFnZS5nZXRJdGVtKHRoaXMuZ2V0U3RvcmFnZUtleShrZXksIHN0b3JhZ2VLZXkpKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5kZXNlcmlhbGl6ZShrZXksIHN0b3JhZ2VLZXksIHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTdG9yZSB2YWx1ZSBpbiBzZXNzaW9uIHN0b3JhZ2UuXG4gICAgICogSWYgdmFsdWUgaXMgZmFsc3ksIHRoZSBlbnRyeSBpcyByZW1vdmVkXG4gICAgICovXG4gICAgcHVibGljIHBlcnNpc3RJblN0b3JhZ2Uoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBzdG9yYWdlS2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuaXNGYWxzZXlWYWx1ZSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHRoaXMuc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbSh0aGlzLmdldFN0b3JhZ2VLZXkoa2V5LCBzdG9yYWdlS2V5KSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNlc3Npb25TdG9yYWdlLnNldEl0ZW0odGhpcy5nZXRTdG9yYWdlS2V5KGtleSwgc3RvcmFnZUtleSksIEpTT04uc3RyaW5naWZ5KHZhbHVlKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFN0b3JhZ2VLZXkoa2V5OiBzdHJpbmcsIHN0b3JhZ2VLZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBzdG9yYWdlS2V5ICsgJy0nICsga2V5O1xuICAgIH1cblxuICAgIC8vIFJldHVybnMgaWYgdGhlIGdpdmVuIHZhbHVlIGlzIGZhbHNleVxuICAgIC8vIEZhbHNleSB2YWx1ZXMgYXJlIDogbnVsbCwgdW5kZWZpbmVkIGFuZCBlbXB0eSBzdHJpbmcuXG4gICAgLy8gVGhpcyBjYXVzZSB1c3VhbGx5IHRoZSBwYXJhbWV0ZXIgdG8gYmUgcmVtb3ZlZCBmcm9tIHVybC9zdG9yYWdlIGluc3RlYWQgb2YgYmVpbmcgc3RvcmVkIHdpdGggbm8gdmFsdWUuIFVybCB3b3VsZCBiZSBwb2xsdXRlZC5cbiAgICBwcml2YXRlIGlzRmFsc2V5VmFsdWUodmFsdWU6IHVua25vd24pOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlID09IG51bGwgfHwgdmFsdWUgPT09ICcnOyAvLyA9PSBtZWFucyBudWxsIG9yIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlZHVuZGFudC10eXBlLWNvbnN0aXR1ZW50c1xuICAgIHByaXZhdGUgZGVzZXJpYWxpemUoa2V5OiBzdHJpbmcsIHN0b3JhZ2VLZXk6IHN0cmluZyB8IG51bGwsIHZhbHVlOiBzdHJpbmcgfCBudWxsKTogdW5rbm93biB8IG51bGwge1xuICAgICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZXN1bHQgPSBudWxsO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmVzdWx0ID0gSlNPTi5wYXJzZSh2YWx1ZSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIC8vIG5vb3BcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQoa2V5LCBzdG9yYWdlS2V5LCByZXN1bHQpID8gcmVzdWx0IDogbnVsbDtcbiAgICB9XG59XG4iXX0=
|
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
import { Injectable } from '@angular/core';
|
|
2
|
-
import { NativeDateAdapter } from '@angular/material/core';
|
|
3
|
-
import * as i0 from "@angular/core";
|
|
4
|
-
const patterns = [
|
|
5
|
-
/^(?<day>\d{1,2})\.(?<month>\d{1,2})\.(?<year>\d{4}|\d{2})$/,
|
|
6
|
-
/^(?<day>\d{1,2})-(?<month>\d{1,2})-(?<year>\d{4}|\d{2})$/,
|
|
7
|
-
/^(?<day>\d{1,2})\/(?<month>\d{1,2})\/(?<year>\d{4}|\d{2})$/,
|
|
8
|
-
/^(?<day>\d{1,2})\\(?<month>\d{1,2})\\(?<year>\d{4}|\d{2})$/,
|
|
9
|
-
// strict ISO format
|
|
10
|
-
/^(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})$/,
|
|
11
|
-
];
|
|
12
|
-
export class NaturalSwissParsingDateAdapter extends NativeDateAdapter {
|
|
13
|
-
/**
|
|
14
|
-
* Parse commonly accepted swiss format, such as:
|
|
15
|
-
*
|
|
16
|
-
* - 24.12.2018
|
|
17
|
-
* - 1.4.18
|
|
18
|
-
* - 2018-12-24
|
|
19
|
-
*/
|
|
20
|
-
parse(value) {
|
|
21
|
-
if (typeof value === 'number') {
|
|
22
|
-
return new Date(value);
|
|
23
|
-
}
|
|
24
|
-
if (typeof value === 'string') {
|
|
25
|
-
const trimmed = value.trim();
|
|
26
|
-
for (const pattern of patterns) {
|
|
27
|
-
const m = trimmed.match(pattern);
|
|
28
|
-
if (m?.groups) {
|
|
29
|
-
const year = +m.groups.year;
|
|
30
|
-
const month = +m.groups.month;
|
|
31
|
-
const day = +m.groups.day;
|
|
32
|
-
return this.createDateIfValid(year, month, day);
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
return null;
|
|
37
|
-
}
|
|
38
|
-
createDateIfValid(year, month, date) {
|
|
39
|
-
// Assume year 2000 if only two digits
|
|
40
|
-
if (year < 100) {
|
|
41
|
-
year += 2000;
|
|
42
|
-
}
|
|
43
|
-
month = month - 1;
|
|
44
|
-
if (month >= 0 && month <= 11 && date >= 1 && date <= 31) {
|
|
45
|
-
return this.createDate(year, month, date);
|
|
46
|
-
}
|
|
47
|
-
return null;
|
|
48
|
-
}
|
|
49
|
-
getFirstDayOfWeek() {
|
|
50
|
-
// Always starts on Monday, even though it is not true for Canada, U.S., Mexico and many more
|
|
51
|
-
// Also see https://github.com/tc39/ecma402/issues/6
|
|
52
|
-
return 1;
|
|
53
|
-
}
|
|
54
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.3", ngImport: i0, type: NaturalSwissParsingDateAdapter, deps: null, target: i0.ɵɵFactoryTarget.Injectable });
|
|
55
|
-
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.3", ngImport: i0, type: NaturalSwissParsingDateAdapter, providedIn: 'root' });
|
|
56
|
-
}
|
|
57
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.3", ngImport: i0, type: NaturalSwissParsingDateAdapter, decorators: [{
|
|
58
|
-
type: Injectable,
|
|
59
|
-
args: [{
|
|
60
|
-
providedIn: 'root',
|
|
61
|
-
}]
|
|
62
|
-
}] });
|
|
63
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3dpc3MtcGFyc2luZy1kYXRlLWFkYXB0ZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25hdHVyYWwvc3JjL2xpYi9zZXJ2aWNlcy9zd2lzcy1wYXJzaW5nLWRhdGUtYWRhcHRlci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sd0JBQXdCLENBQUM7O0FBRXpELE1BQU0sUUFBUSxHQUFzQjtJQUNoQyw0REFBNEQ7SUFDNUQsMERBQTBEO0lBQzFELDREQUE0RDtJQUM1RCw0REFBNEQ7SUFDNUQsb0JBQW9CO0lBQ3BCLGdEQUFnRDtDQUNuRCxDQUFDO0FBS0YsTUFBTSxPQUFPLDhCQUErQixTQUFRLGlCQUFpQjtJQUNqRTs7Ozs7O09BTUc7SUFDYSxLQUFLLENBQUMsS0FBYztRQUNoQyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQzVCLE9BQU8sSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDM0IsQ0FBQztRQUVELElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDNUIsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO1lBRTdCLEtBQUssTUFBTSxPQUFPLElBQUksUUFBUSxFQUFFLENBQUM7Z0JBQzdCLE1BQU0sQ0FBQyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQ2pDLElBQUksQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDO29CQUNaLE1BQU0sSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7b0JBQzVCLE1BQU0sS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7b0JBQzlCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUM7b0JBRTFCLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7Z0JBQ3BELENBQUM7WUFDTCxDQUFDO1FBQ0wsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFTyxpQkFBaUIsQ0FBQyxJQUFZLEVBQUUsS0FBYSxFQUFFLElBQVk7UUFDL0Qsc0NBQXNDO1FBQ3RDLElBQUksSUFBSSxHQUFHLEdBQUcsRUFBRSxDQUFDO1lBQ2IsSUFBSSxJQUFJLElBQUksQ0FBQztRQUNqQixDQUFDO1FBRUQsS0FBSyxHQUFHLEtBQUssR0FBRyxDQUFDLENBQUM7UUFDbEIsSUFBSSxLQUFLLElBQUksQ0FBQyxJQUFJLEtBQUssSUFBSSxFQUFFLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksRUFBRSxFQUFFLENBQUM7WUFDdkQsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDOUMsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFZSxpQkFBaUI7UUFDN0IsNkZBQTZGO1FBQzdGLG9EQUFvRDtRQUNwRCxPQUFPLENBQUMsQ0FBQztJQUNiLENBQUM7dUdBakRRLDhCQUE4QjsyR0FBOUIsOEJBQThCLGNBRjNCLE1BQU07OzJGQUVULDhCQUE4QjtrQkFIMUMsVUFBVTttQkFBQztvQkFDUixVQUFVLEVBQUUsTUFBTTtpQkFDckIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0luamVjdGFibGV9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtOYXRpdmVEYXRlQWRhcHRlcn0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY29yZSc7XG5cbmNvbnN0IHBhdHRlcm5zOiByZWFkb25seSBSZWdFeHBbXSA9IFtcbiAgICAvXig/PGRheT5cXGR7MSwyfSlcXC4oPzxtb250aD5cXGR7MSwyfSlcXC4oPzx5ZWFyPlxcZHs0fXxcXGR7Mn0pJC8sXG4gICAgL14oPzxkYXk+XFxkezEsMn0pLSg/PG1vbnRoPlxcZHsxLDJ9KS0oPzx5ZWFyPlxcZHs0fXxcXGR7Mn0pJC8sXG4gICAgL14oPzxkYXk+XFxkezEsMn0pXFwvKD88bW9udGg+XFxkezEsMn0pXFwvKD88eWVhcj5cXGR7NH18XFxkezJ9KSQvLFxuICAgIC9eKD88ZGF5PlxcZHsxLDJ9KVxcXFwoPzxtb250aD5cXGR7MSwyfSlcXFxcKD88eWVhcj5cXGR7NH18XFxkezJ9KSQvLFxuICAgIC8vIHN0cmljdCBJU08gZm9ybWF0XG4gICAgL14oPzx5ZWFyPlxcZHs0fSktKD88bW9udGg+XFxkezJ9KS0oPzxkYXk+XFxkezJ9KSQvLFxuXTtcblxuQEluamVjdGFibGUoe1xuICAgIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgTmF0dXJhbFN3aXNzUGFyc2luZ0RhdGVBZGFwdGVyIGV4dGVuZHMgTmF0aXZlRGF0ZUFkYXB0ZXIge1xuICAgIC8qKlxuICAgICAqIFBhcnNlIGNvbW1vbmx5IGFjY2VwdGVkIHN3aXNzIGZvcm1hdCwgc3VjaCBhczpcbiAgICAgKlxuICAgICAqIC0gMjQuMTIuMjAxOFxuICAgICAqIC0gMS40LjE4XG4gICAgICogLSAyMDE4LTEyLTI0XG4gICAgICovXG4gICAgcHVibGljIG92ZXJyaWRlIHBhcnNlKHZhbHVlOiB1bmtub3duKTogRGF0ZSB8IG51bGwge1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBEYXRlKHZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBjb25zdCB0cmltbWVkID0gdmFsdWUudHJpbSgpO1xuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHBhdHRlcm4gb2YgcGF0dGVybnMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtID0gdHJpbW1lZC5tYXRjaChwYXR0ZXJuKTtcbiAgICAgICAgICAgICAgICBpZiAobT8uZ3JvdXBzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHllYXIgPSArbS5ncm91cHMueWVhcjtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbW9udGggPSArbS5ncm91cHMubW9udGg7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRheSA9ICttLmdyb3Vwcy5kYXk7XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlRGF0ZUlmVmFsaWQoeWVhciwgbW9udGgsIGRheSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjcmVhdGVEYXRlSWZWYWxpZCh5ZWFyOiBudW1iZXIsIG1vbnRoOiBudW1iZXIsIGRhdGU6IG51bWJlcik6IERhdGUgfCBudWxsIHtcbiAgICAgICAgLy8gQXNzdW1lIHllYXIgMjAwMCBpZiBvbmx5IHR3byBkaWdpdHNcbiAgICAgICAgaWYgKHllYXIgPCAxMDApIHtcbiAgICAgICAgICAgIHllYXIgKz0gMjAwMDtcbiAgICAgICAgfVxuXG4gICAgICAgIG1vbnRoID0gbW9udGggLSAxO1xuICAgICAgICBpZiAobW9udGggPj0gMCAmJiBtb250aCA8PSAxMSAmJiBkYXRlID49IDEgJiYgZGF0ZSA8PSAzMSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlRGF0ZSh5ZWFyLCBtb250aCwgZGF0ZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgb3ZlcnJpZGUgZ2V0Rmlyc3REYXlPZldlZWsoKTogbnVtYmVyIHtcbiAgICAgICAgLy8gQWx3YXlzIHN0YXJ0cyBvbiBNb25kYXksIGV2ZW4gdGhvdWdoIGl0IGlzIG5vdCB0cnVlIGZvciBDYW5hZGEsIFUuUy4sIE1leGljbyBhbmQgbWFueSBtb3JlXG4gICAgICAgIC8vIEFsc28gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L2VjbWE0MDIvaXNzdWVzLzZcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgfVxufVxuIl19
|