@stemy/ngx-utils 13.6.13 → 13.6.14
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/assets/ng.mjs +5 -0
- package/package.json +1 -1
- package/bundles/stemy-ngx-utils.umd.js +0 -6380
- package/bundles/stemy-ngx-utils.umd.js.map +0 -1
- package/esm2015/ngx-utils/common-types.js +0 -121
- package/esm2015/ngx-utils/components/dynamic-table/dynamic-table.component.js +0 -139
- package/esm2015/ngx-utils/components/pagination-menu/pagination-menu.component.js +0 -96
- package/esm2015/ngx-utils/components/unordered-list/unordered-list.component.js +0 -51
- package/esm2015/ngx-utils/directives/async-method.base.js +0 -66
- package/esm2015/ngx-utils/directives/async-method.directive.js +0 -17
- package/esm2015/ngx-utils/directives/background.directive.js +0 -51
- package/esm2015/ngx-utils/directives/dynamic-table-template.directive.js +0 -19
- package/esm2015/ngx-utils/directives/global-template.directive.js +0 -27
- package/esm2015/ngx-utils/directives/icon.directive.js +0 -59
- package/esm2015/ngx-utils/directives/ngx-template-outlet.directive.js +0 -88
- package/esm2015/ngx-utils/directives/pagination-item.directive.js +0 -33
- package/esm2015/ngx-utils/directives/pagination.directive.js +0 -76
- package/esm2015/ngx-utils/directives/resource-if.directive.js +0 -51
- package/esm2015/ngx-utils/directives/sticky-class.directive.js +0 -35
- package/esm2015/ngx-utils/directives/sticky.directive.js +0 -48
- package/esm2015/ngx-utils/directives/unordered-list-item.directive.js +0 -70
- package/esm2015/ngx-utils/directives/unordered-list-template.directive.js +0 -26
- package/esm2015/ngx-utils/ngx-utils.module.js +0 -246
- package/esm2015/ngx-utils/pipes/chunk.pipe.js +0 -21
- package/esm2015/ngx-utils/pipes/entries.pipe.js +0 -24
- package/esm2015/ngx-utils/pipes/extra-item-properties.pipe.js +0 -27
- package/esm2015/ngx-utils/pipes/filter.pipe.js +0 -33
- package/esm2015/ngx-utils/pipes/find.pipe.js +0 -25
- package/esm2015/ngx-utils/pipes/format-number.pipe.js +0 -19
- package/esm2015/ngx-utils/pipes/get-offset.pipe.js +0 -13
- package/esm2015/ngx-utils/pipes/get-type.pipe.js +0 -12
- package/esm2015/ngx-utils/pipes/global-template.pipe.js +0 -37
- package/esm2015/ngx-utils/pipes/group-by.pipe.js +0 -23
- package/esm2015/ngx-utils/pipes/is-type.pipe.js +0 -12
- package/esm2015/ngx-utils/pipes/join.pipe.js +0 -15
- package/esm2015/ngx-utils/pipes/keys.pipe.js +0 -18
- package/esm2015/ngx-utils/pipes/map.pipe.js +0 -25
- package/esm2015/ngx-utils/pipes/max.pipe.js +0 -22
- package/esm2015/ngx-utils/pipes/min.pipe.js +0 -22
- package/esm2015/ngx-utils/pipes/pop.pipe.js +0 -12
- package/esm2015/ngx-utils/pipes/reduce.pipe.js +0 -26
- package/esm2015/ngx-utils/pipes/remap.pipe.js +0 -28
- package/esm2015/ngx-utils/pipes/replace.pipe.js +0 -13
- package/esm2015/ngx-utils/pipes/reverse.pipe.js +0 -20
- package/esm2015/ngx-utils/pipes/round.pipe.js +0 -19
- package/esm2015/ngx-utils/pipes/safe-html.pipe.js +0 -32
- package/esm2015/ngx-utils/pipes/shift.pipe.js +0 -12
- package/esm2015/ngx-utils/pipes/split.pipe.js +0 -12
- package/esm2015/ngx-utils/pipes/translate.pipe.js +0 -81
- package/esm2015/ngx-utils/pipes/values.pipe.js +0 -18
- package/esm2015/ngx-utils/plugins/resize-event.plugin.js +0 -56
- package/esm2015/ngx-utils/plugins/scroll-event.plugin.js +0 -36
- package/esm2015/ngx-utils/services/acl.service.js +0 -81
- package/esm2015/ngx-utils/services/api.service.js +0 -39
- package/esm2015/ngx-utils/services/auth.service.js +0 -14
- package/esm2015/ngx-utils/services/base-http.client.js +0 -46
- package/esm2015/ngx-utils/services/base-http.service.js +0 -284
- package/esm2015/ngx-utils/services/config.service.js +0 -137
- package/esm2015/ngx-utils/services/error-handler.service.js +0 -49
- package/esm2015/ngx-utils/services/events.service.js +0 -24
- package/esm2015/ngx-utils/services/formatter.service.js +0 -46
- package/esm2015/ngx-utils/services/global-template.service.js +0 -35
- package/esm2015/ngx-utils/services/icon.service.js +0 -24
- package/esm2015/ngx-utils/services/language.service.js +0 -129
- package/esm2015/ngx-utils/services/open-api.service.js +0 -41
- package/esm2015/ngx-utils/services/promise.service.js +0 -52
- package/esm2015/ngx-utils/services/state.service.js +0 -181
- package/esm2015/ngx-utils/services/static-language.service.js +0 -152
- package/esm2015/ngx-utils/services/storage.service.js +0 -48
- package/esm2015/ngx-utils/services/toaster.service.js +0 -29
- package/esm2015/ngx-utils/services/translated-url.serializer.js +0 -70
- package/esm2015/ngx-utils/services/universal.service.js +0 -78
- package/esm2015/ngx-utils/utils/ajax-request-handler.js +0 -40
- package/esm2015/ngx-utils/utils/array.utils.js +0 -107
- package/esm2015/ngx-utils/utils/auth.guard.js +0 -156
- package/esm2015/ngx-utils/utils/canvas.utils.js +0 -388
- package/esm2015/ngx-utils/utils/date.utils.js +0 -29
- package/esm2015/ngx-utils/utils/file-system.js +0 -25
- package/esm2015/ngx-utils/utils/file.utils.js +0 -90
- package/esm2015/ngx-utils/utils/generic-value.js +0 -20
- package/esm2015/ngx-utils/utils/geometry.js +0 -132
- package/esm2015/ngx-utils/utils/initializer.js +0 -20
- package/esm2015/ngx-utils/utils/loader.utils.js +0 -55
- package/esm2015/ngx-utils/utils/math.utils.js +0 -45
- package/esm2015/ngx-utils/utils/object.utils.js +0 -320
- package/esm2015/ngx-utils/utils/observable.utils.js +0 -63
- package/esm2015/ngx-utils/utils/reflect.utils.js +0 -33
- package/esm2015/ngx-utils/utils/set.utils.js +0 -20
- package/esm2015/ngx-utils/utils/string.utils.js +0 -28
- package/esm2015/ngx-utils/utils/timer.utils.js +0 -52
- package/esm2015/ngx-utils/utils/unique.utils.js +0 -24
- package/esm2015/ngx-utils/utils/vector.js +0 -77
- package/esm2015/public_api.js +0 -89
- package/esm2015/stemy-ngx-utils.js +0 -7
- package/fesm2015/stemy-ngx-utils.js +0 -5060
- package/fesm2015/stemy-ngx-utils.js.map +0 -1
- package/stemy-ngx-utils.metadata.json +0 -1
- package/tools/circular.js +0 -117
- package/tools/circular.js.map +0 -1
- package/tools/config.js +0 -79
- package/tools/config.js.map +0 -1
- package/tools/icons.js +0 -14
- package/tools/icons.js.map +0 -1
|
@@ -1,181 +0,0 @@
|
|
|
1
|
-
import { __awaiter } from "tslib";
|
|
2
|
-
import { Injectable, Injector, NgZone, Optional } from "@angular/core";
|
|
3
|
-
import { ActivatedRouteSnapshot, NavigationEnd, Router } from "@angular/router";
|
|
4
|
-
import { BehaviorSubject, Observable } from "rxjs";
|
|
5
|
-
import { skipWhile } from "rxjs/operators";
|
|
6
|
-
import { ObjectUtils } from "../utils/object.utils";
|
|
7
|
-
import { UniversalService } from "./universal.service";
|
|
8
|
-
export const emptySnapshot = new ActivatedRouteSnapshot();
|
|
9
|
-
export const emptyData = { id: "" };
|
|
10
|
-
export const emptyParams = {};
|
|
11
|
-
export const emptySegments = [];
|
|
12
|
-
export const emptyComponents = [];
|
|
13
|
-
export class StateService extends BehaviorSubject {
|
|
14
|
-
constructor(injector, zone, universal, router = null) {
|
|
15
|
-
super(null);
|
|
16
|
-
this.injector = injector;
|
|
17
|
-
this.zone = zone;
|
|
18
|
-
this.universal = universal;
|
|
19
|
-
this.router = router;
|
|
20
|
-
this.handleRouterEvent = (event) => {
|
|
21
|
-
if (!(event instanceof NavigationEnd))
|
|
22
|
-
return;
|
|
23
|
-
const routerStateSnapshot = this.router.routerState.snapshot;
|
|
24
|
-
let snapshot = routerStateSnapshot.root;
|
|
25
|
-
let context = this.contexts.getContext("primary");
|
|
26
|
-
let segments = snapshot.url;
|
|
27
|
-
const components = [];
|
|
28
|
-
const snapshots = [];
|
|
29
|
-
while (snapshot) {
|
|
30
|
-
snapshots.push(snapshot);
|
|
31
|
-
segments = segments.concat(snapshot.url);
|
|
32
|
-
if (context) {
|
|
33
|
-
if (context.outlet && context.outlet.isActivated)
|
|
34
|
-
components.push(context.outlet.component);
|
|
35
|
-
context = context.children.getContext("primary");
|
|
36
|
-
}
|
|
37
|
-
snapshot = snapshot.firstChild;
|
|
38
|
-
}
|
|
39
|
-
this.comp = components[components.length - 1];
|
|
40
|
-
this.shot = snapshots[snapshots.length - 1];
|
|
41
|
-
this.stateInfo = {
|
|
42
|
-
url: routerStateSnapshot.url,
|
|
43
|
-
segments: segments,
|
|
44
|
-
components: components
|
|
45
|
-
};
|
|
46
|
-
this.next(this.shot);
|
|
47
|
-
};
|
|
48
|
-
if (!this.router)
|
|
49
|
-
return;
|
|
50
|
-
this.globalExtras = {
|
|
51
|
-
queryParamsHandling: "merge"
|
|
52
|
-
};
|
|
53
|
-
this.router.events.subscribe(this.handleRouterEvent);
|
|
54
|
-
this.stateInfo = {
|
|
55
|
-
url: "",
|
|
56
|
-
segments: [],
|
|
57
|
-
components: []
|
|
58
|
-
};
|
|
59
|
-
this.contexts = router.rootContexts;
|
|
60
|
-
}
|
|
61
|
-
static toPath(route, params) {
|
|
62
|
-
let path = route.path || "";
|
|
63
|
-
ObjectUtils.iterate(params, (value, key) => {
|
|
64
|
-
path = path.replace(`:${key}`, `${value}`);
|
|
65
|
-
});
|
|
66
|
-
return path;
|
|
67
|
-
}
|
|
68
|
-
get component() {
|
|
69
|
-
return this.comp;
|
|
70
|
-
}
|
|
71
|
-
get snapshot() {
|
|
72
|
-
return this.shot || emptySnapshot;
|
|
73
|
-
}
|
|
74
|
-
get route() {
|
|
75
|
-
return this.snapshot.routeConfig;
|
|
76
|
-
}
|
|
77
|
-
get data() {
|
|
78
|
-
return this.snapshot.data || emptyData;
|
|
79
|
-
}
|
|
80
|
-
get params() {
|
|
81
|
-
return this.snapshot.params || emptyParams;
|
|
82
|
-
}
|
|
83
|
-
get queryParams() {
|
|
84
|
-
return this.snapshot.queryParams || emptyParams;
|
|
85
|
-
}
|
|
86
|
-
get url() {
|
|
87
|
-
return this.stateInfo.url || "";
|
|
88
|
-
}
|
|
89
|
-
get urlSegments() {
|
|
90
|
-
return this.stateInfo.segments || emptySegments;
|
|
91
|
-
}
|
|
92
|
-
get components() {
|
|
93
|
-
return this.stateInfo.components || emptyComponents;
|
|
94
|
-
}
|
|
95
|
-
get routerConfig() {
|
|
96
|
-
return this.router.config;
|
|
97
|
-
}
|
|
98
|
-
reload() {
|
|
99
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
100
|
-
const routerStateSnapshot = this.router.routerState.snapshot;
|
|
101
|
-
const resolvers = this.route.resolve || {};
|
|
102
|
-
const keys = Object.keys(resolvers);
|
|
103
|
-
for (const key of keys) {
|
|
104
|
-
const resolver = this.injector.get(resolvers[key]);
|
|
105
|
-
let resolved = resolver.resolve(this.snapshot, routerStateSnapshot);
|
|
106
|
-
if (resolved instanceof Observable) {
|
|
107
|
-
resolved = resolved.toPromise();
|
|
108
|
-
}
|
|
109
|
-
if (resolved instanceof Promise) {
|
|
110
|
-
resolved = yield resolved;
|
|
111
|
-
}
|
|
112
|
-
this.data[key] = resolved;
|
|
113
|
-
}
|
|
114
|
-
});
|
|
115
|
-
}
|
|
116
|
-
navigateByUrl(url, navigationExtras = {}) {
|
|
117
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
118
|
-
return this.navigate(url, navigationExtras);
|
|
119
|
-
});
|
|
120
|
-
}
|
|
121
|
-
navigate(url, navigationExtras = {}) {
|
|
122
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
123
|
-
if (!this.router)
|
|
124
|
-
return false;
|
|
125
|
-
const [tree, extras] = this.createUrlTree(url, navigationExtras);
|
|
126
|
-
return this.zone.run(() => {
|
|
127
|
-
return this.router.navigateByUrl(tree, extras);
|
|
128
|
-
});
|
|
129
|
-
});
|
|
130
|
-
}
|
|
131
|
-
open(url, target = "_blank", navigationExtras = {}) {
|
|
132
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
133
|
-
if (!this.router)
|
|
134
|
-
return false;
|
|
135
|
-
const [tree, extras] = this.createUrlTree(url, navigationExtras);
|
|
136
|
-
return this.zone.run(() => {
|
|
137
|
-
return this.openInNewWindow(tree, target) || this.router.navigateByUrl(tree, extras);
|
|
138
|
-
});
|
|
139
|
-
});
|
|
140
|
-
}
|
|
141
|
-
subscribeImmediately(next, error, complete) {
|
|
142
|
-
return this.pipe(skipWhile(v => v == null)).subscribe(next, error, complete);
|
|
143
|
-
}
|
|
144
|
-
openInNewWindow(tree, target) {
|
|
145
|
-
if (!this.universal.isBrowser)
|
|
146
|
-
return false;
|
|
147
|
-
const baseUrl = window.location.href.replace(this.router.url, "");
|
|
148
|
-
try {
|
|
149
|
-
const serialized = this.router.serializeUrl(tree);
|
|
150
|
-
const separator = serialized.startsWith("/") ? "" : "/";
|
|
151
|
-
window.open(baseUrl + separator + serialized, target);
|
|
152
|
-
return true;
|
|
153
|
-
}
|
|
154
|
-
catch (e) {
|
|
155
|
-
console.log(`Can't open new window: ${e}`);
|
|
156
|
-
return false;
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
createUrlTree(url, extras) {
|
|
160
|
-
if (!this.router)
|
|
161
|
-
return null;
|
|
162
|
-
extras = Object.assign(extras, this.globalExtras, extras || {});
|
|
163
|
-
if (ObjectUtils.isArray(url)) {
|
|
164
|
-
return [this.router.createUrlTree(url, extras), extras];
|
|
165
|
-
}
|
|
166
|
-
if (ObjectUtils.isString(url)) {
|
|
167
|
-
return [this.router.parseUrl(url), extras];
|
|
168
|
-
}
|
|
169
|
-
return [url, extras];
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
StateService.decorators = [
|
|
173
|
-
{ type: Injectable }
|
|
174
|
-
];
|
|
175
|
-
StateService.ctorParameters = () => [
|
|
176
|
-
{ type: Injector },
|
|
177
|
-
{ type: NgZone },
|
|
178
|
-
{ type: UniversalService },
|
|
179
|
-
{ type: Router, decorators: [{ type: Optional }] }
|
|
180
|
-
];
|
|
181
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdGUuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9uZ3gtdXRpbHMvc2VydmljZXMvc3RhdGUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFDLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUNyRSxPQUFPLEVBQ0gsc0JBQXNCLEVBSXRCLGFBQWEsRUFNYixNQUFNLEVBR1QsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLEVBQUMsZUFBZSxFQUFFLFVBQVUsRUFBZSxNQUFNLE1BQU0sQ0FBQztBQUMvRCxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDekMsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRWxELE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBRXJELE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBMkIsSUFBSSxzQkFBc0IsRUFBRSxDQUFDO0FBQ2xGLE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBUyxFQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUMsQ0FBQztBQUN4QyxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQVcsRUFBRSxDQUFDO0FBQ3RDLE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBaUIsRUFBRSxDQUFDO0FBQzlDLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBVSxFQUFFLENBQUM7QUFTekMsTUFBTSxPQUFPLFlBQWEsU0FBUSxlQUFvQjtJQXlEbEQsWUFBcUIsUUFBa0IsRUFDbEIsSUFBWSxFQUNaLFNBQTJCLEVBQ2YsU0FBaUIsSUFBSTtRQUNsRCxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFKSyxhQUFRLEdBQVIsUUFBUSxDQUFVO1FBQ2xCLFNBQUksR0FBSixJQUFJLENBQVE7UUFDWixjQUFTLEdBQVQsU0FBUyxDQUFrQjtR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QUM7WUFDdEQsT0FBTyxJQUFJLENBQUM7U0FDZjtRQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ1IsT0FBTyxDQUFDLEdBQUcsQ0FBQywwQkFBMEIsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUMzQyxPQUFPLEtBQUssQ0FBQztTQUNoQjtJQUNMLENBQUM7SUFFUyxhQUFhLENBQUMsR0FBdUIsRUFBRSxNQUF5QjtRQUN0RSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU07WUFBRSxPQUFPLElBQUksQ0FBQztRQUM5QixNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFlBQVksRUFBRSxNQUFNLElBQUksRUFBRSxDQUFDLENBQUM7UUFDaEUsSUFBSSxXQUFXLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQzFCLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUE7U0FDMUQ7UUFDRCxJQUFJLFdBQVcsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDM0IsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1NBQzlDO1FBQ0QsT0FBTyxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUN6QixDQUFDOzs7WUE3SUosVUFBVTs7O1lBbENTLFFBQVE7WUFBRSxNQUFNO1lBb0I1QixnQkFBZ0I7WUFScEIsTUFBTSx1QkFtRk8sUUFBUSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7SW5qZWN0YWJsZSwgSW5qZWN0b3IsIE5nWm9uZSwgT3B0aW9uYWx9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7XHJcbiAgICBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90LFxyXG4gICAgQ2hpbGRyZW5PdXRsZXRDb250ZXh0cyxcclxuICAgIERhdGEsXHJcbiAgICBFdmVudCxcclxuICAgIE5hdmlnYXRpb25FbmQsXHJcbiAgICBOYXZpZ2F0aW9uRXh0cmFzLFxyXG4gICAgT3V0bGV0Q29udGV4dCxcclxuICAgIFBhcmFtcyxcclxuICAgIFJlc29sdmUsXHJcbiAgICBSb3V0ZSxcclxuICAgIFJvdXRlcixcclxuICAgIFVybFNlZ21lbnQsIFVybFNlcmlhbGl6ZXIsXHJcbiAgICBVcmxUcmVlXHJcbn0gZnJvbSBcIkBhbmd1bGFyL3JvdXRlclwiO1xyXG5pbXBvcnQge0JlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgU3Vic2NyaXB0aW9ufSBmcm9tIFwicnhqc1wiO1xyXG5pbXBvcnQge3NraXBXaGlsZX0gZnJvbSBcInJ4anMvb3BlcmF0b3JzXCI7XHJcbmltcG9ydCB7T2JqZWN0VXRpbHN9IGZyb20gXCIuLi91dGlscy9vYmplY3QudXRpbHNcIjtcclxuaW1wb3J0IHtJUm91dGUsIE5hdmlnYXRpb25VcmxQYXJhbX0gZnJvbSBcIi4uL2NvbW1vbi10eXBlc1wiO1xyXG5pbXBvcnQge1VuaXZlcnNhbFNlcnZpY2V9IGZyb20gXCIuL3VuaXZlcnNhbC5zZXJ2aWNlXCI7XHJcblxyXG5leHBvcnQgY29uc3QgZW1wdHlTbmFwc2hvdDogQWN0aXZhdGVkUm91dGVTbmFwc2hvdCA9IG5ldyBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90KCk7XHJcbmV4cG9ydCBjb25zdCBlbXB0eURhdGE6IERhdGEgPSB7aWQ6IFwiXCJ9O1xyXG5leHBvcnQgY29uc3QgZW1wdHlQYXJhbXM6IFBhcmFtcyA9IHt9O1xyXG5leHBvcnQgY29uc3QgZW1wdHlTZWdtZW50czogVXJsU2VnbWVudFtdID0gW107XHJcbmV4cG9ydCBjb25zdCBlbXB0eUNvbXBvbmVudHM6IGFueVtdID0gW107XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElTdGF0ZUluZm8ge1xyXG4gICAgdXJsOiBzdHJpbmc7XHJcbiAgICBzZWdtZW50czogVXJsU2VnbWVudFtdO1xyXG4gICAgY29tcG9uZW50czogYW55W107XHJcbn1cclxuXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIFN0YXRlU2VydmljZSBleHRlbmRzIEJlaGF2aW9yU3ViamVjdDxhbnk+IHtcclxuXHJcbiAgICByZWFkb25seSBnbG9iYWxFeHRyYXM6IE5hdmlnYXRpb25FeHRyYXM7XHJcblxyXG4gICAgcHJpdmF0ZSBzaG90OiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90O1xyXG4gICAgcHJpdmF0ZSBjb21wOiBhbnk7XHJcbiAgICBwcml2YXRlIHN0YXRlSW5mbzogSVN0YXRlSW5mbztcclxuICAgIHByaXZhdGUgY29udGV4dHM6IENoaWxkcmVuT3V0bGV0Q29udGV4dHM7XHJcblxyXG4gICAgc3RhdGljIHRvUGF0aChyb3V0ZTogUm91dGUsIHBhcmFtczogYW55KTogc3RyaW5nIHtcclxuICAgICAgICBsZXQgcGF0aCA9IHJvdXRlLnBhdGggfHwgXCJcIjtcclxuICAgICAgICBPYmplY3RVdGlscy5pdGVyYXRlKHBhcmFtcywgKHZhbHVlOiBhbnksIGtleTogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgICAgIHBhdGggPSBwYXRoLnJlcGxhY2UoYDoke2tleX1gLCBgJHt2YWx1ZX1gKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gcGF0aDtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgY29tcG9uZW50KCk6IGFueSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY29tcDtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgc25hcHNob3QoKTogQWN0aXZhdGVkUm91dGVTbmFwc2hvdCB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc2hvdCB8fCBlbXB0eVNuYXBzaG90O1xyXG4gICAgfVxyXG5cclxuICAgIGdldCByb3V0ZSgpOiBJUm91dGUge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnNuYXBzaG90LnJvdXRlQ29uZmlnO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBkYXRhKCk6IERhdGEge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnNuYXBzaG90LmRhdGEgfHwgZW1wdHlEYXRhO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBwYXJhbXMoKTogUGFyYW1zIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5zbmFwc2hvdC5wYXJhbXMgfHwgZW1wdHlQYXJhbXM7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHF1ZXJ5UGFyYW1zKCk6IFBhcmFtcyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc25hcHNob3QucXVlcnlQYXJhbXMgfHwgZW1wdHlQYXJhbXM7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHVybCgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnN0YXRlSW5mby51cmwgfHwgXCJcIjtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgdXJsU2VnbWVudHMoKTogVXJsU2VnbWVudFtdIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5zdGF0ZUluZm8uc2VnbWVudHMgfHwgZW1wdHlTZWdtZW50cztcclxuICAgIH1cclxuXHJcbiAgICBnZXQgY29tcG9uZW50cygpOiBhbnlbXSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGVJbmZvLmNvbXBvbmVudHMgfHwgZW1wdHlDb21wb25lbnRzO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCByb3V0ZXJDb25maWcoKTogSVJvdXRlW10ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnJvdXRlci5jb25maWc7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3RydWN0b3IocmVhZG9ubHkgaW5qZWN0b3I6IEluamVjdG9yLFxyXG4gICAgICAgICAgICAgICAgcmVhZG9ubHkgem9uZTogTmdab25lLFxyXG4gICAgICAgICAgICAgICAgcmVhZG9ubHkgdW5pdmVyc2FsOiBVbml2ZXJzYWxTZXJ2aWNlLFxyXG4gICAgICAgICAgICAgICAgQE9wdGlvbmFsKCkgcmVhZG9ubHkgcm91dGVyOiBSb3V0ZXIgPSBudWxsKSB7XHJcbiAgICAgICAgc3VwZXIobnVsbCk7XHJcbiAgICAgICAgaWYgKCF0aGlzLnJvdXRlcikgcmV0dXJuO1xyXG4gICAgICAgIHRoaXMuZ2xvYmFsRXh0cmFzID0ge1xyXG4gICAgICAgICAgICBxdWVyeVBhcmFtc0hhbmRsaW5nOiBcIm1lcmdlXCJcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMucm91dGVyLmV2ZW50cy5zdWJzY3JpYmUodGhpcy5oYW5kbGVSb3V0ZXJFdmVudCk7XHJcbiAgICAgICAgdGhpcy5zdGF0ZUluZm8gPSB7XHJcbiAgICAgICAgICAgIHVybDogXCJcIixcclxuICAgICAgICAgICAgc2VnbWVudHM6IFtdLFxyXG4gICAgICAgICAgICBjb21wb25lbnRzOiBbXVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5jb250ZXh0cyA9ICg8YW55PnJvdXRlcikucm9vdENvbnRleHRzO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHJlbG9hZCgpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgICAgIGNvbnN0IHJvdXRlclN0YXRlU25hcHNob3QgPSB0aGlzLnJvdXRlci5yb3V0ZXJTdGF0ZS5zbmFwc2hvdDtcclxuICAgICAgICBjb25zdCByZXNvbHZlcnMgPSB0aGlzLnJvdXRlLnJlc29sdmUgfHwge307XHJcbiAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHJlc29sdmVycyk7XHJcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xyXG4gICAgICAgICAgICBjb25zdCByZXNvbHZlciA9IHRoaXMuaW5qZWN0b3IuZ2V0KHJlc29sdmVyc1trZXldKSBhcyBSZXNvbHZlPGFueT47XHJcbiAgICAgICAgICAgIGxldCByZXNvbHZlZCA9IHJlc29sdmVyLnJlc29sdmUodGhpcy5zbmFwc2hvdCwgcm91dGVyU3RhdGVTbmFwc2hvdCk7XHJcbiAgICAgICAgICAgIGlmIChyZXNvbHZlZCBpbnN0YW5jZW9mIE9ic2VydmFibGUpIHtcclxuICAgICAgICAgICAgICAgIHJlc29sdmVkID0gcmVzb2x2ZWQudG9Qcm9taXNlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHJlc29sdmVkIGluc3RhbmNlb2YgUHJvbWlzZSkge1xyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZWQgPSBhd2FpdCByZXNvbHZlZDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmRhdGFba2V5XSA9IHJlc29sdmVkO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBuYXZpZ2F0ZUJ5VXJsKHVybDogc3RyaW5nIHwgVXJsVHJlZSwgbmF2aWdhdGlvbkV4dHJhczogTmF2aWdhdGlvbkV4dHJhcyA9IHt9KTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubmF2aWdhdGUodXJsLCBuYXZpZ2F0aW9uRXh0cmFzKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBuYXZpZ2F0ZSh1cmw6IE5hdmlnYXRpb25VcmxQYXJhbSwgbmF2aWdhdGlvbkV4dHJhczogTmF2aWdhdGlvbkV4dHJhcyA9IHt9KTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnJvdXRlcikgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIGNvbnN0IFt0cmVlLCBleHRyYXNdID0gdGhpcy5jcmVhdGVVcmxUcmVlKHVybCwgbmF2aWdhdGlvbkV4dHJhcyk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuem9uZS5ydW4oKCkgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yb3V0ZXIubmF2aWdhdGVCeVVybCh0cmVlLCBleHRyYXMpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIG9wZW4odXJsOiBOYXZpZ2F0aW9uVXJsUGFyYW0sIHRhcmdldCA9IFwiX2JsYW5rXCIsIG5hdmlnYXRpb25FeHRyYXM6IE5hdmlnYXRpb25FeHRyYXMgPSB7fSk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgICAgIGlmICghdGhpcy5yb3V0ZXIpIHJldHVybiBmYWxzZTtcclxuICAgICAgICBjb25zdCBbdHJlZSwgZXh0cmFzXSA9IHRoaXMuY3JlYXRlVXJsVHJlZSh1cmwsIG5hdmlnYXRpb25FeHRyYXMpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLnpvbmUucnVuKCgpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMub3BlbkluTmV3V2luZG93KHRyZWUsIHRhcmdldCkgfHwgdGhpcy5yb3V0ZXIubmF2aWdhdGVCeVVybCh0cmVlLCBleHRyYXMpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHN1YnNjcmliZUltbWVkaWF0ZWx5KG5leHQ/OiAodmFsdWU6IEFjdGl2YXRlZFJvdXRlU25hcHNob3QpID0+IHZvaWQsIGVycm9yPzogKGVycm9yOiBhbnkpID0+IHZvaWQsIGNvbXBsZXRlPzogKCkgPT4gdm9pZCk6IFN1YnNjcmlwdGlvbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucGlwZShza2lwV2hpbGUodiA9PiB2ID09IG51bGwpKS5zdWJzY3JpYmUobmV4dCwgZXJyb3IsIGNvbXBsZXRlKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgb3BlbkluTmV3V2luZG93KHRyZWU6IFVybFRyZWUsIHRhcmdldDogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnVuaXZlcnNhbC5pc0Jyb3dzZXIpIHJldHVybiBmYWxzZTtcclxuICAgICAgICBjb25zdCBiYXNlVXJsID0gd2luZG93LmxvY2F0aW9uLmhyZWYucmVwbGFjZSh0aGlzLnJvdXRlci51cmwsIFwiXCIpO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSB0aGlzLnJvdXRlci5zZXJpYWxpemVVcmwodHJlZSk7XHJcbiAgICAgICAgICAgIGNvbnN0IHNlcGFyYXRvciA9IHNlcmlhbGl6ZWQuc3RhcnRzV2l0aChcIi9cIikgPyBcIlwiIDogXCIvXCI7XHJcbiAgICAgICAgICAgIHdpbmRvdy5vcGVuKGJhc2VVcmwgKyBzZXBhcmF0b3IgKyBzZXJpYWxpemVkLCB0YXJnZXQpO1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBDYW4ndCBvcGVuIG5ldyB3aW5kb3c6ICR7ZX1gKTtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgY3JlYXRlVXJsVHJlZSh1cmw6IE5hdmlnYXRpb25VcmxQYXJhbSwgZXh0cmFzPzogTmF2aWdhdGlvbkV4dHJhcyk6IFtVcmxUcmVlLCBOYXZpZ2F0aW9uRXh0cmFzXSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnJvdXRlcikgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgZXh0cmFzID0gT2JqZWN0LmFzc2lnbihleHRyYXMsIHRoaXMuZ2xvYmFsRXh0cmFzLCBleHRyYXMgfHwge30pO1xyXG4gICAgICAgIGlmIChPYmplY3RVdGlscy5pc0FycmF5KHVybCkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFt0aGlzLnJvdXRlci5jcmVhdGVVcmxUcmVlKHVybCwgZXh0cmFzKSwgZXh0cmFzXVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoT2JqZWN0VXRpbHMuaXNTdHJpbmcodXJsKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gW3RoaXMucm91dGVyLnBhcnNlVXJsKHVybCksIGV4dHJhc107XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBbdXJsLCBleHRyYXNdO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBoYW5kbGVSb3V0ZXJFdmVudCA9IChldmVudDogRXZlbnQpOiB2b2lkID0+IHtcclxuICAgICAgICBpZiAoIShldmVudCBpbnN0YW5jZW9mIE5hdmlnYXRpb25FbmQpKSByZXR1cm47XHJcbiAgICAgICAgY29uc3Qgcm91dGVyU3RhdGVTbmFwc2hvdCA9IHRoaXMucm91dGVyLnJvdXRlclN0YXRlLnNuYXBzaG90O1xyXG4gICAgICAgIGxldCBzbmFwc2hvdCA9IHJvdXRlclN0YXRlU25hcHNob3Qucm9vdDtcclxuICAgICAgICBsZXQgY29udGV4dDogT3V0bGV0Q29udGV4dCA9IHRoaXMuY29udGV4dHMuZ2V0Q29udGV4dChcInByaW1hcnlcIik7XHJcbiAgICAgICAgbGV0IHNlZ21lbnRzID0gc25hcHNob3QudXJsO1xyXG4gICAgICAgIGNvbnN0IGNvbXBvbmVudHM6IGFueVtdID0gW107XHJcbiAgICAgICAgY29uc3Qgc25hcHNob3RzOiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90W10gPSBbXTtcclxuICAgICAgICB3aGlsZSAoc25hcHNob3QpIHtcclxuICAgICAgICAgICAgc25hcHNob3RzLnB1c2goc25hcHNob3QpO1xyXG4gICAgICAgICAgICBzZWdtZW50cyA9IHNlZ21lbnRzLmNvbmNhdChzbmFwc2hvdC51cmwpO1xyXG4gICAgICAgICAgICBpZiAoY29udGV4dCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGNvbnRleHQub3V0bGV0ICYmIGNvbnRleHQub3V0bGV0LmlzQWN0aXZhdGVkKVxyXG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudHMucHVzaChjb250ZXh0Lm91dGxldC5jb21wb25lbnQpO1xyXG4gICAgICAgICAgICAgICAgY29udGV4dCA9IGNvbnRleHQuY2hpbGRyZW4uZ2V0Q29udGV4dChcInByaW1hcnlcIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgc25hcHNob3QgPSBzbmFwc2hvdC5maXJzdENoaWxkO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmNvbXAgPSBjb21wb25lbnRzW2NvbXBvbmVudHMubGVuZ3RoIC0gMV07XHJcbiAgICAgICAgdGhpcy5zaG90ID0gc25hcHNob3RzW3NuYXBzaG90cy5sZW5ndGggLSAxXTtcclxuICAgICAgICB0aGlzLnN0YXRlSW5mbyA9IHtcclxuICAgICAgICAgICAgdXJsOiByb3V0ZXJTdGF0ZVNuYXBzaG90LnVybCxcclxuICAgICAgICAgICAgc2VnbWVudHM6IHNlZ21lbnRzLFxyXG4gICAgICAgICAgICBjb21wb25lbnRzOiBjb21wb25lbnRzXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLm5leHQodGhpcy5zaG90KTtcclxuICAgIH07XHJcbn1cclxuIl19
|
|
@@ -1,152 +0,0 @@
|
|
|
1
|
-
import { Inject, Injectable } from "@angular/core";
|
|
2
|
-
import { CONFIG_SERVICE, PROMISE_SERVICE } from "../common-types";
|
|
3
|
-
import { ObjectUtils } from "../utils/object.utils";
|
|
4
|
-
import { EventsService } from "./events.service";
|
|
5
|
-
import { StorageService } from "./storage.service";
|
|
6
|
-
import { BaseHttpClient } from "./base-http.client";
|
|
7
|
-
export class StaticLanguageService {
|
|
8
|
-
constructor(events, storage, configs, promises, client) {
|
|
9
|
-
this.events = events;
|
|
10
|
-
this.storage = storage;
|
|
11
|
-
this.configs = configs;
|
|
12
|
-
this.promises = promises;
|
|
13
|
-
this.client = client;
|
|
14
|
-
this.editLang = null;
|
|
15
|
-
this.currentLang = null;
|
|
16
|
-
this.disableTrans = false;
|
|
17
|
-
this.languageList = [];
|
|
18
|
-
this.translations = {
|
|
19
|
-
none: {}
|
|
20
|
-
};
|
|
21
|
-
this.initService();
|
|
22
|
-
}
|
|
23
|
-
get defaultLanguage() {
|
|
24
|
-
return this.configs.getQueryParameter("lang") || this.storage.get("language", this.getDefaultLanguage());
|
|
25
|
-
}
|
|
26
|
-
get dictionary() {
|
|
27
|
-
return this.translations[this.currentLanguage] || {};
|
|
28
|
-
}
|
|
29
|
-
set dictionary(value) {
|
|
30
|
-
this.translations[this.currentLanguage] = value;
|
|
31
|
-
}
|
|
32
|
-
get languages() {
|
|
33
|
-
return this.languageList;
|
|
34
|
-
}
|
|
35
|
-
get currentLanguage() {
|
|
36
|
-
return this.currentLang || this.defaultLanguage;
|
|
37
|
-
}
|
|
38
|
-
set currentLanguage(lang) {
|
|
39
|
-
this.currentLang = lang;
|
|
40
|
-
this.events.languageChanged.emit(lang);
|
|
41
|
-
}
|
|
42
|
-
get editLanguage() {
|
|
43
|
-
return this.editLang || this.currentLanguage;
|
|
44
|
-
}
|
|
45
|
-
set editLanguage(lang) {
|
|
46
|
-
this.editLang = lang || this.currentLanguage;
|
|
47
|
-
}
|
|
48
|
-
get disableTranslations() {
|
|
49
|
-
return this.disableTrans;
|
|
50
|
-
}
|
|
51
|
-
set disableTranslations(value) {
|
|
52
|
-
this.disableTrans = value;
|
|
53
|
-
this.events.languageChanged.emit(this.currentLang);
|
|
54
|
-
}
|
|
55
|
-
get httpClient() {
|
|
56
|
-
return this.client;
|
|
57
|
-
}
|
|
58
|
-
get config() {
|
|
59
|
-
return this.configs.config;
|
|
60
|
-
}
|
|
61
|
-
get universal() {
|
|
62
|
-
return this.storage.universal;
|
|
63
|
-
}
|
|
64
|
-
initService() {
|
|
65
|
-
}
|
|
66
|
-
replaceLanguages(languages) {
|
|
67
|
-
languages = Array.isArray(languages) && languages.length > 0 ? languages : this.languageList;
|
|
68
|
-
this.languageList = Array.from(new Set(languages));
|
|
69
|
-
this.languageList.forEach(lang => {
|
|
70
|
-
this.translations[lang] = this.translations[lang] || {};
|
|
71
|
-
});
|
|
72
|
-
}
|
|
73
|
-
addLanguages(languages) {
|
|
74
|
-
if (!Array.isArray(languages) || languages.length == 0)
|
|
75
|
-
return;
|
|
76
|
-
this.replaceLanguages(this.languageList.concat(languages));
|
|
77
|
-
}
|
|
78
|
-
getTranslationSync(key, params = null) {
|
|
79
|
-
const lowerKey = (key || "").toLocaleLowerCase();
|
|
80
|
-
const translation = this.dictionary[lowerKey] || lowerKey;
|
|
81
|
-
return this.interpolate(translation == lowerKey ? key : translation, params);
|
|
82
|
-
}
|
|
83
|
-
getTranslation(key, params) {
|
|
84
|
-
if (!ObjectUtils.isString(key) || !key.length) {
|
|
85
|
-
throw new Error(`Parameter "key" required`);
|
|
86
|
-
}
|
|
87
|
-
const translation = ObjectUtils.getValue(this.dictionary, key, key) || key;
|
|
88
|
-
return this.promises.resolve(this.interpolate(translation, params));
|
|
89
|
-
}
|
|
90
|
-
getTranslations(...keys) {
|
|
91
|
-
return this.promises.create(resolve => {
|
|
92
|
-
this.promises.all(keys.map(key => this.getTranslation(key))).then(translations => {
|
|
93
|
-
resolve(keys.reduce((result, key, i) => {
|
|
94
|
-
result[key] = translations[i];
|
|
95
|
-
return result;
|
|
96
|
-
}, {}));
|
|
97
|
-
});
|
|
98
|
-
});
|
|
99
|
-
}
|
|
100
|
-
getTranslationFromObject(translations, params, lang) {
|
|
101
|
-
lang = lang || this.currentLanguage;
|
|
102
|
-
return this.interpolate(translations ? (translations[lang] || "") : "");
|
|
103
|
-
}
|
|
104
|
-
getTranslationFromArray(translations, params, lang) {
|
|
105
|
-
lang = lang || this.currentLanguage;
|
|
106
|
-
const translation = translations ? translations.find(t => t.lang == lang) : null;
|
|
107
|
-
return this.interpolate(translation ? translation.translation : "", params);
|
|
108
|
-
}
|
|
109
|
-
interpolate(expr, params) {
|
|
110
|
-
if (typeof expr === "string") {
|
|
111
|
-
return this.interpolateString(expr, params);
|
|
112
|
-
}
|
|
113
|
-
if (typeof expr === "function") {
|
|
114
|
-
return expr(params);
|
|
115
|
-
}
|
|
116
|
-
return expr;
|
|
117
|
-
}
|
|
118
|
-
interpolateString(expr, params) {
|
|
119
|
-
if (!expr || !params)
|
|
120
|
-
return expr;
|
|
121
|
-
return expr.replace(/{{\s?([^{}\s]*)\s?}}/g, (substring, b) => {
|
|
122
|
-
const r = ObjectUtils.getValue(params, b);
|
|
123
|
-
return ObjectUtils.isDefined(r) ? r : substring;
|
|
124
|
-
});
|
|
125
|
-
}
|
|
126
|
-
getDefaultLanguage() {
|
|
127
|
-
if (!this.universal.isBrowser || typeof window.navigator === "undefined") {
|
|
128
|
-
return "de";
|
|
129
|
-
}
|
|
130
|
-
let browserLang = (window.navigator.languages ? window.navigator.languages[0] : null)
|
|
131
|
-
|| window.navigator.language || window.navigator["browserLanguage"] || window.navigator["userLanguage"] || null;
|
|
132
|
-
if (!browserLang)
|
|
133
|
-
return browserLang;
|
|
134
|
-
["-", "_"].forEach(splitter => {
|
|
135
|
-
if (browserLang.indexOf(splitter) >= 0) {
|
|
136
|
-
browserLang = browserLang.split(splitter)[0];
|
|
137
|
-
}
|
|
138
|
-
});
|
|
139
|
-
return browserLang;
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
StaticLanguageService.decorators = [
|
|
143
|
-
{ type: Injectable }
|
|
144
|
-
];
|
|
145
|
-
StaticLanguageService.ctorParameters = () => [
|
|
146
|
-
{ type: EventsService, decorators: [{ type: Inject, args: [EventsService,] }] },
|
|
147
|
-
{ type: StorageService, decorators: [{ type: Inject, args: [StorageService,] }] },
|
|
148
|
-
{ type: undefined, decorators: [{ type: Inject, args: [CONFIG_SERVICE,] }] },
|
|
149
|
-
{ type: undefined, decorators: [{ type: Inject, args: [PROMISE_SERVICE,] }] },
|
|
150
|
-
{ type: BaseHttpClient, decorators: [{ type: Inject, args: [BaseHttpClient,] }] }
|
|
151
|
-
];
|
|
152
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdGljLWxhbmd1YWdlLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbmd4LXV0aWxzL3NlcnZpY2VzL3N0YXRpYy1sYW5ndWFnZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxNQUFNLEVBQUUsVUFBVSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ2pELE9BQU8sRUFDSCxjQUFjLEVBT2QsZUFBZSxFQUNsQixNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUNsRCxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFDL0MsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBRWpELE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUlsRCxNQUFNLE9BQU8scUJBQXFCO0lBOEQ5QixZQUE0QyxNQUFxQixFQUNwQixPQUF1QixFQUN2QixPQUF1QixFQUNyQixRQUF5QixFQUMxQixNQUFzQjtRQUp4QixXQUFNLEdBQU4sTUFBTSxDQUFlO1FBQ3BCLFlBQU8sR0FBUCxPQUFPLENBQWdCO1FBQ3ZCLFlBQU8sR0FBUCxPQUFPLENBQWdCO1FBQ3JCLGFBQVEsR0FBUixRQUFRLENBQWlCO1FBQzFCLFdBQU0sR0FBTixNQUFNLENBQWdCO1FBQ2hFLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO1FBQzFCLElBQUksQ0FBQyxZQUFZLEdBQUcsRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxZQUFZLEdBQUc7WUFDaEIsSUFBSSxFQUFFLEVBQUU7U0FDWCxDQUFDO1FBQ0YsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3ZC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QUFPLENBQUMsUUFBUSxDQUFDLEVBQUU7WUFDMUIsSUFBSSxXQUFXLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDcEMsV0FBVyxHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDaEQ7UUFDTCxDQUFDLENBQUMsQ0FBQTtRQUNGLE9BQU8sV0FBVyxDQUFDO0lBQ3ZCLENBQUM7OztZQW5LSixVQUFVOzs7WUFOSCxhQUFhLHVCQXFFSixNQUFNLFNBQUMsYUFBYTtZQXBFN0IsY0FBYyx1QkFxRUwsTUFBTSxTQUFDLGNBQWM7NENBQ3JCLE1BQU0sU0FBQyxjQUFjOzRDQUNyQixNQUFNLFNBQUMsZUFBZTtZQXJFL0IsY0FBYyx1QkFzRUwsTUFBTSxTQUFDLGNBQWMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0luamVjdCwgSW5qZWN0YWJsZX0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHtcclxuICAgIENPTkZJR19TRVJWSUNFLFxyXG4gICAgSUNvbmZpZ1NlcnZpY2UsXHJcbiAgICBJQ29uZmlndXJhdGlvbixcclxuICAgIElMYW5ndWFnZVNlcnZpY2UsXHJcbiAgICBJUHJvbWlzZVNlcnZpY2UsXHJcbiAgICBJVHJhbnNsYXRpb24sXHJcbiAgICBJVHJhbnNsYXRpb25zLFxyXG4gICAgUFJPTUlTRV9TRVJWSUNFXHJcbn0gZnJvbSBcIi4uL2NvbW1vbi10eXBlc1wiO1xyXG5pbXBvcnQge09iamVjdFV0aWxzfSBmcm9tIFwiLi4vdXRpbHMvb2JqZWN0LnV0aWxzXCI7XHJcbmltcG9ydCB7RXZlbnRzU2VydmljZX0gZnJvbSBcIi4vZXZlbnRzLnNlcnZpY2VcIjtcclxuaW1wb3J0IHtTdG9yYWdlU2VydmljZX0gZnJvbSBcIi4vc3RvcmFnZS5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7VW5pdmVyc2FsU2VydmljZX0gZnJvbSBcIi4vdW5pdmVyc2FsLnNlcnZpY2VcIjtcclxuaW1wb3J0IHtCYXNlSHR0cENsaWVudH0gZnJvbSBcIi4vYmFzZS1odHRwLmNsaWVudFwiO1xyXG5pbXBvcnQge0h0dHBDbGllbnR9IGZyb20gXCJAYW5ndWxhci9jb21tb24vaHR0cFwiO1xyXG5cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgU3RhdGljTGFuZ3VhZ2VTZXJ2aWNlIGltcGxlbWVudHMgSUxhbmd1YWdlU2VydmljZSB7XHJcblxyXG4gICAgZ2V0IGRlZmF1bHRMYW5ndWFnZSgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNvbmZpZ3MuZ2V0UXVlcnlQYXJhbWV0ZXIoXCJsYW5nXCIpIHx8IHRoaXMuc3RvcmFnZS5nZXQoXCJsYW5ndWFnZVwiLCB0aGlzLmdldERlZmF1bHRMYW5ndWFnZSgpKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgZGljdGlvbmFyeSgpOiBJVHJhbnNsYXRpb25zIHtcclxuICAgICAgICByZXR1cm4gdGhpcy50cmFuc2xhdGlvbnNbdGhpcy5jdXJyZW50TGFuZ3VhZ2VdIHx8IHt9O1xyXG4gICAgfVxyXG5cclxuICAgIHNldCBkaWN0aW9uYXJ5KHZhbHVlOiBJVHJhbnNsYXRpb25zKSB7XHJcbiAgICAgICAgdGhpcy50cmFuc2xhdGlvbnNbdGhpcy5jdXJyZW50TGFuZ3VhZ2VdID0gdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGxhbmd1YWdlcygpOiBSZWFkb25seUFycmF5PHN0cmluZz4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmxhbmd1YWdlTGlzdDtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgY3VycmVudExhbmd1YWdlKCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY3VycmVudExhbmcgfHwgdGhpcy5kZWZhdWx0TGFuZ3VhZ2U7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0IGN1cnJlbnRMYW5ndWFnZShsYW5nOiBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLmN1cnJlbnRMYW5nID0gbGFuZztcclxuICAgICAgICB0aGlzLmV2ZW50cy5sYW5ndWFnZUNoYW5nZWQuZW1pdChsYW5nKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgZWRpdExhbmd1YWdlKCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZWRpdExhbmcgfHwgdGhpcy5jdXJyZW50TGFuZ3VhZ2U7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0IGVkaXRMYW5ndWFnZShsYW5nOiBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLmVkaXRMYW5nID0gbGFuZyB8fCB0aGlzLmN1cnJlbnRMYW5ndWFnZTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgZGlzYWJsZVRyYW5zbGF0aW9ucygpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kaXNhYmxlVHJhbnM7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0IGRpc2FibGVUcmFuc2xhdGlvbnModmFsdWU6IGJvb2xlYW4pIHtcclxuICAgICAgICB0aGlzLmRpc2FibGVUcmFucyA9IHZhbHVlO1xyXG4gICAgICAgIHRoaXMuZXZlbnRzLmxhbmd1YWdlQ2hhbmdlZC5lbWl0KHRoaXMuY3VycmVudExhbmcpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBodHRwQ2xpZW50KCk6IEh0dHBDbGllbnQge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudDtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgY29uZmlnKCk6IElDb25maWd1cmF0aW9uIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jb25maWdzLmNvbmZpZztcclxuICAgIH1cclxuXHJcbiAgICBnZXQgdW5pdmVyc2FsKCk6IFVuaXZlcnNhbFNlcnZpY2Uge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnN0b3JhZ2UudW5pdmVyc2FsO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBlZGl0TGFuZzogc3RyaW5nO1xyXG4gICAgcHJvdGVjdGVkIGN1cnJlbnRMYW5nOiBzdHJpbmc7XHJcbiAgICBwcm90ZWN0ZWQgZGlzYWJsZVRyYW5zOiBib29sZWFuO1xyXG4gICAgcHJvdGVjdGVkIGxhbmd1YWdlTGlzdDogc3RyaW5nW107XHJcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgdHJhbnNsYXRpb25zOiBJVHJhbnNsYXRpb25zO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKEBJbmplY3QoRXZlbnRzU2VydmljZSkgcmVhZG9ubHkgZXZlbnRzOiBFdmVudHNTZXJ2aWNlLFxyXG4gICAgICAgICAgICAgICAgQEluamVjdChTdG9yYWdlU2VydmljZSkgcmVhZG9ubHkgc3RvcmFnZTogU3RvcmFnZVNlcnZpY2UsXHJcbiAgICAgICAgICAgICAgICBASW5qZWN0KENPTkZJR19TRVJWSUNFKSByZWFkb25seSBjb25maWdzOiBJQ29uZmlnU2VydmljZSxcclxuICAgICAgICAgICAgICAgIEBJbmplY3QoUFJPTUlTRV9TRVJWSUNFKSBwcm90ZWN0ZWQgcHJvbWlzZXM6IElQcm9taXNlU2VydmljZSxcclxuICAgICAgICAgICAgICAgIEBJbmplY3QoQmFzZUh0dHBDbGllbnQpIHByb3RlY3RlZCBjbGllbnQ6IEJhc2VIdHRwQ2xpZW50KSB7XHJcbiAgICAgICAgdGhpcy5lZGl0TGFuZyA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50TGFuZyA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5kaXNhYmxlVHJhbnMgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmxhbmd1YWdlTGlzdCA9IFtdO1xyXG4gICAgICAgIHRoaXMudHJhbnNsYXRpb25zID0ge1xyXG4gICAgICAgICAgICBub25lOiB7fVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5pbml0U2VydmljZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBpbml0U2VydmljZSgpOiB2b2lkIHtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgcmVwbGFjZUxhbmd1YWdlcyhsYW5ndWFnZXM6IHN0cmluZ1tdKTogdm9pZCB7XHJcbiAgICAgICAgbGFuZ3VhZ2VzID0gQXJyYXkuaXNBcnJheShsYW5ndWFnZXMpICYmIGxhbmd1YWdlcy5sZW5ndGggPiAwID8gbGFuZ3VhZ2VzIDogdGhpcy5sYW5ndWFnZUxpc3Q7XHJcbiAgICAgICAgdGhpcy5sYW5ndWFnZUxpc3QgPSBBcnJheS5mcm9tKG5ldyBTZXQ8c3RyaW5nPihsYW5ndWFnZXMpKTtcclxuICAgICAgICB0aGlzLmxhbmd1YWdlTGlzdC5mb3JFYWNoKGxhbmcgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnRyYW5zbGF0aW9uc1tsYW5nXSA9IHRoaXMudHJhbnNsYXRpb25zW2xhbmddIHx8IHt9O1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGFkZExhbmd1YWdlcyhsYW5ndWFnZXM6IHN0cmluZ1tdKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGxhbmd1YWdlcykgfHwgbGFuZ3VhZ2VzLmxlbmd0aCA9PSAwKSByZXR1cm47XHJcbiAgICAgICAgdGhpcy5yZXBsYWNlTGFuZ3VhZ2VzKHRoaXMubGFuZ3VhZ2VMaXN0LmNvbmNhdChsYW5ndWFnZXMpKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRUcmFuc2xhdGlvblN5bmMoa2V5OiBzdHJpbmcsIHBhcmFtczogYW55ID0gbnVsbCk6IHN0cmluZyB7XHJcbiAgICAgICAgY29uc3QgbG93ZXJLZXkgPSAoa2V5IHx8IFwiXCIpLnRvTG9jYWxlTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgY29uc3QgdHJhbnNsYXRpb24gPSB0aGlzLmRpY3Rpb25hcnlbbG93ZXJLZXldIHx8IGxvd2VyS2V5O1xyXG4gICAgICAgIHJldHVybiB0aGlzLmludGVycG9sYXRlKHRyYW5zbGF0aW9uID09IGxvd2VyS2V5ID8ga2V5IDogdHJhbnNsYXRpb24sIHBhcmFtcyk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0VHJhbnNsYXRpb24oa2V5OiBzdHJpbmcsIHBhcmFtcz86IGFueSk6IFByb21pc2U8c3RyaW5nPiB7XHJcbiAgICAgICAgaWYgKCFPYmplY3RVdGlscy5pc1N0cmluZyhrZXkpIHx8ICFrZXkubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUGFyYW1ldGVyIFwia2V5XCIgcmVxdWlyZWRgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgdHJhbnNsYXRpb24gPSBPYmplY3RVdGlscy5nZXRWYWx1ZSh0aGlzLmRpY3Rpb25hcnksIGtleSwga2V5KSB8fCBrZXk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvbWlzZXMucmVzb2x2ZSh0aGlzLmludGVycG9sYXRlKHRyYW5zbGF0aW9uLCBwYXJhbXMpKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRUcmFuc2xhdGlvbnMoLi4ua2V5czogc3RyaW5nW10pOiBQcm9taXNlPElUcmFuc2xhdGlvbnM+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5wcm9taXNlcy5jcmVhdGU8SVRyYW5zbGF0aW9ucz4ocmVzb2x2ZSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMucHJvbWlzZXMuYWxsKGtleXMubWFwKGtleSA9PiB0aGlzLmdldFRyYW5zbGF0aW9uKGtleSkpKS50aGVuKHRyYW5zbGF0aW9ucyA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXNvbHZlKGtleXMucmVkdWNlKChyZXN1bHQsIGtleSwgaSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtrZXldID0gdHJhbnNsYXRpb25zW2ldO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgICAgICAgICB9LCB7fSkpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRUcmFuc2xhdGlvbkZyb21PYmplY3QodHJhbnNsYXRpb25zOiBJVHJhbnNsYXRpb25zLCBwYXJhbXM/OiBhbnksIGxhbmc/OiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgICAgIGxhbmcgPSBsYW5nIHx8IHRoaXMuY3VycmVudExhbmd1YWdlO1xyXG4gICAgICAgIHJldHVybiB0aGlzLmludGVycG9sYXRlKHRyYW5zbGF0aW9ucyA/ICh0cmFuc2xhdGlvbnNbbGFuZ10gfHwgXCJcIikgOiBcIlwiKVxyXG4gICAgfVxyXG5cclxuICAgIGdldFRyYW5zbGF0aW9uRnJvbUFycmF5KHRyYW5zbGF0aW9uczogSVRyYW5zbGF0aW9uW10sIHBhcmFtcz86IGFueSwgbGFuZz86IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICAgICAgbGFuZyA9IGxhbmcgfHwgdGhpcy5jdXJyZW50TGFuZ3VhZ2U7XHJcbiAgICAgICAgY29uc3QgdHJhbnNsYXRpb24gPSB0cmFuc2xhdGlvbnMgPyB0cmFuc2xhdGlvbnMuZmluZCh0ID0+IHQubGFuZyA9PSBsYW5nKSA6IG51bGw7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaW50ZXJwb2xhdGUodHJhbnNsYXRpb24gPyB0cmFuc2xhdGlvbi50cmFuc2xhdGlvbiA6IFwiXCIsIHBhcmFtcyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGludGVycG9sYXRlKGV4cHI6IHN0cmluZyB8IEZ1bmN0aW9uLCBwYXJhbXM/OiBhbnkpOiBzdHJpbmcge1xyXG4gICAgICAgIGlmICh0eXBlb2YgZXhwciA9PT0gXCJzdHJpbmdcIikge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pbnRlcnBvbGF0ZVN0cmluZyhleHByLCBwYXJhbXMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodHlwZW9mIGV4cHIgPT09IFwiZnVuY3Rpb25cIikge1xyXG4gICAgICAgICAgICByZXR1cm4gZXhwcihwYXJhbXMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZXhwciBhcyBzdHJpbmc7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGludGVycG9sYXRlU3RyaW5nKGV4cHI6IHN0cmluZywgcGFyYW1zPzogYW55KSB7XHJcbiAgICAgICAgaWYgKCFleHByIHx8ICFwYXJhbXMpIHJldHVybiBleHByO1xyXG4gICAgICAgIHJldHVybiBleHByLnJlcGxhY2UoL3t7XFxzPyhbXnt9XFxzXSopXFxzP319L2csIChzdWJzdHJpbmc6IHN0cmluZywgYjogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHIgPSBPYmplY3RVdGlscy5nZXRWYWx1ZShwYXJhbXMsIGIpO1xyXG4gICAgICAgICAgICByZXR1cm4gT2JqZWN0VXRpbHMuaXNEZWZpbmVkKHIpID8gciA6IHN1YnN0cmluZztcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgZ2V0RGVmYXVsdExhbmd1YWdlKCk6IHN0cmluZyB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnVuaXZlcnNhbC5pc0Jyb3dzZXIgfHwgdHlwZW9mIHdpbmRvdy5uYXZpZ2F0b3IgPT09IFwidW5kZWZpbmVkXCIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFwiZGVcIjtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IGJyb3dzZXJMYW5nOiBzdHJpbmcgPSAod2luZG93Lm5hdmlnYXRvci5sYW5ndWFnZXMgPyB3aW5kb3cubmF2aWdhdG9yLmxhbmd1YWdlc1swXSA6IG51bGwpXHJcbiAgICAgICAgICAgIHx8IHdpbmRvdy5uYXZpZ2F0b3IubGFuZ3VhZ2UgfHwgd2luZG93Lm5hdmlnYXRvcltcImJyb3dzZXJMYW5ndWFnZVwiXSB8fCB3aW5kb3cubmF2aWdhdG9yW1widXNlckxhbmd1YWdlXCJdIHx8IG51bGw7XHJcbiAgICAgICAgaWYgKCFicm93c2VyTGFuZykgcmV0dXJuIGJyb3dzZXJMYW5nO1xyXG5cclxuICAgICAgICBbXCItXCIsIFwiX1wiXS5mb3JFYWNoKHNwbGl0dGVyID0+IHtcclxuICAgICAgICAgICAgaWYgKGJyb3dzZXJMYW5nLmluZGV4T2Yoc3BsaXR0ZXIpID49IDApIHtcclxuICAgICAgICAgICAgICAgIGJyb3dzZXJMYW5nID0gYnJvd3Nlckxhbmcuc3BsaXQoc3BsaXR0ZXIpWzBdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgICAgICByZXR1cm4gYnJvd3Nlckxhbmc7XHJcbiAgICB9XHJcbn1cclxuIl19
|
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
import { Injectable } from "@angular/core";
|
|
2
|
-
import { StorageMode } from "../common-types";
|
|
3
|
-
import { UniversalService } from "./universal.service";
|
|
4
|
-
/**
|
|
5
|
-
* Use this service instead of Storage to avoid Angular Universal breaks on server environment
|
|
6
|
-
*/
|
|
7
|
-
export class StorageService {
|
|
8
|
-
constructor(universal) {
|
|
9
|
-
this.universal = universal;
|
|
10
|
-
}
|
|
11
|
-
get(key, defaultValue, mode = StorageMode.Local) {
|
|
12
|
-
if (!this.universal.isBrowser)
|
|
13
|
-
return defaultValue;
|
|
14
|
-
const storage = mode == StorageMode.Local ? localStorage : sessionStorage;
|
|
15
|
-
const item = storage.getItem(key);
|
|
16
|
-
if (!item)
|
|
17
|
-
return defaultValue;
|
|
18
|
-
try {
|
|
19
|
-
return JSON.parse(item);
|
|
20
|
-
}
|
|
21
|
-
catch (e) {
|
|
22
|
-
return item;
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
set(key, value, mode = StorageMode.Local) {
|
|
26
|
-
if (!this.universal.isBrowser)
|
|
27
|
-
return;
|
|
28
|
-
const storage = mode == StorageMode.Local ? localStorage : sessionStorage;
|
|
29
|
-
if (typeof value == "string") {
|
|
30
|
-
storage.setItem(key, value);
|
|
31
|
-
return;
|
|
32
|
-
}
|
|
33
|
-
storage.setItem(key, JSON.stringify(value));
|
|
34
|
-
}
|
|
35
|
-
remove(key, mode = StorageMode.Local) {
|
|
36
|
-
if (!this.universal.isBrowser)
|
|
37
|
-
return;
|
|
38
|
-
const storage = mode == StorageMode.Local ? localStorage : sessionStorage;
|
|
39
|
-
storage.removeItem(key);
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
StorageService.decorators = [
|
|
43
|
-
{ type: Injectable }
|
|
44
|
-
];
|
|
45
|
-
StorageService.ctorParameters = () => [
|
|
46
|
-
{ type: UniversalService }
|
|
47
|
-
];
|
|
48
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL25neC11dGlscy9zZXJ2aWNlcy9zdG9yYWdlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDNUMsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFFckQ7O0dBRUc7QUFFSCxNQUFNLE9BQU8sY0FBYztJQUV2QixZQUFxQixTQUEyQjtRQUEzQixjQUFTLEdBQVQsU0FBUyxDQUFrQjtJQUNoRCxDQUFDO0lBRUQsR0FBRyxDQUFDLEdBQVcsRUFBRSxZQUFrQixFQUFFLE9BQW9CLFdBQVcsQ0FBQyxLQUFLO1FBQ3RFLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVM7WUFBRSxPQUFPLFlBQVksQ0FBQztRQUNuRCxNQUFNLE9BQU8sR0FBRyxJQUFJLElBQUksV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUM7UUFDMUUsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNsQyxJQUFJLENBQUMsSUFBSTtZQUFFLE9BQU8sWUFBWSxDQUFDO1FBQy9CLElBQUk7WUFDQSxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDM0I7UUFBQyxPQUFPLENBQUMsRUFBRTtZQUNSLE9BQU8sSUFBSSxDQUFDO1NBQ2Y7SUFDTCxDQUFDO0lBRUQsR0FBRyxDQUFDLEdBQVcsRUFBRSxLQUFVLEVBQUUsT0FBb0IsV0FBVyxDQUFDLEtBQUs7UUFDOUQsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUztZQUFFLE9BQU87UUFDdEMsTUFBTSxPQUFPLEdBQUcsSUFBSSxJQUFJLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDO1FBQzFFLElBQUksT0FBTyxLQUFLLElBQUksUUFBUSxFQUFFO1lBQzFCLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQzVCLE9BQU87U0FDVjtRQUNELE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBRUQsTUFBTSxDQUFDLEdBQVcsRUFBRSxPQUFvQixXQUFXLENBQUMsS0FBSztRQUNyRCxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTO1lBQUUsT0FBTztRQUN0QyxNQUFNLE9BQU8sR0FBRyxJQUFJLElBQUksV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUM7UUFDMUUsT0FBTyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUM1QixDQUFDOzs7WUFoQ0osVUFBVTs7O1lBTEgsZ0JBQWdCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtJbmplY3RhYmxlfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQge1N0b3JhZ2VNb2RlfSBmcm9tIFwiLi4vY29tbW9uLXR5cGVzXCI7XHJcbmltcG9ydCB7VW5pdmVyc2FsU2VydmljZX0gZnJvbSBcIi4vdW5pdmVyc2FsLnNlcnZpY2VcIjtcclxuXHJcbi8qKlxyXG4gKiBVc2UgdGhpcyBzZXJ2aWNlIGluc3RlYWQgb2YgU3RvcmFnZSB0byBhdm9pZCBBbmd1bGFyIFVuaXZlcnNhbCBicmVha3Mgb24gc2VydmVyIGVudmlyb25tZW50XHJcbiAqL1xyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBTdG9yYWdlU2VydmljZSB7XHJcblxyXG4gICAgY29uc3RydWN0b3IocmVhZG9ubHkgdW5pdmVyc2FsOiBVbml2ZXJzYWxTZXJ2aWNlKSB7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0KGtleTogc3RyaW5nLCBkZWZhdWx0VmFsdWU/OiBhbnksIG1vZGU6IFN0b3JhZ2VNb2RlID0gU3RvcmFnZU1vZGUuTG9jYWwpOiBhbnkge1xyXG4gICAgICAgIGlmICghdGhpcy51bml2ZXJzYWwuaXNCcm93c2VyKSByZXR1cm4gZGVmYXVsdFZhbHVlO1xyXG4gICAgICAgIGNvbnN0IHN0b3JhZ2UgPSBtb2RlID09IFN0b3JhZ2VNb2RlLkxvY2FsID8gbG9jYWxTdG9yYWdlIDogc2Vzc2lvblN0b3JhZ2U7XHJcbiAgICAgICAgY29uc3QgaXRlbSA9IHN0b3JhZ2UuZ2V0SXRlbShrZXkpO1xyXG4gICAgICAgIGlmICghaXRlbSkgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShpdGVtKTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBpdGVtO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzZXQoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnksIG1vZGU6IFN0b3JhZ2VNb2RlID0gU3RvcmFnZU1vZGUuTG9jYWwpOiB2b2lkIHtcclxuICAgICAgICBpZiAoIXRoaXMudW5pdmVyc2FsLmlzQnJvd3NlcikgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IHN0b3JhZ2UgPSBtb2RlID09IFN0b3JhZ2VNb2RlLkxvY2FsID8gbG9jYWxTdG9yYWdlIDogc2Vzc2lvblN0b3JhZ2U7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PSBcInN0cmluZ1wiKSB7XHJcbiAgICAgICAgICAgIHN0b3JhZ2Uuc2V0SXRlbShrZXksIHZhbHVlKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzdG9yYWdlLnNldEl0ZW0oa2V5LCBKU09OLnN0cmluZ2lmeSh2YWx1ZSkpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbW92ZShrZXk6IHN0cmluZywgbW9kZTogU3RvcmFnZU1vZGUgPSBTdG9yYWdlTW9kZS5Mb2NhbCk6IHZvaWQge1xyXG4gICAgICAgIGlmICghdGhpcy51bml2ZXJzYWwuaXNCcm93c2VyKSByZXR1cm47XHJcbiAgICAgICAgY29uc3Qgc3RvcmFnZSA9IG1vZGUgPT0gU3RvcmFnZU1vZGUuTG9jYWwgPyBsb2NhbFN0b3JhZ2UgOiBzZXNzaW9uU3RvcmFnZTtcclxuICAgICAgICBzdG9yYWdlLnJlbW92ZUl0ZW0oa2V5KTtcclxuICAgIH1cclxufVxyXG4iXX0=
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
import { Inject, Injectable } from "@angular/core";
|
|
2
|
-
import { LANGUAGE_SERVICE } from "../common-types";
|
|
3
|
-
export class ConsoleToasterService {
|
|
4
|
-
constructor(language) {
|
|
5
|
-
this.language = language;
|
|
6
|
-
}
|
|
7
|
-
error(message, params, title) {
|
|
8
|
-
this.translateMessage(message, params, str => console.log(str, title, "background: #BD362F; color: #ffffff"));
|
|
9
|
-
}
|
|
10
|
-
info(message, params, title) {
|
|
11
|
-
this.translateMessage(message, params, str => console.log(str, title, "background: #2F96B4; color: #ffffff"));
|
|
12
|
-
}
|
|
13
|
-
success(message, params, title) {
|
|
14
|
-
this.translateMessage(message, params, str => console.log(str, title, "background: #51A351; color: #ffffff"));
|
|
15
|
-
}
|
|
16
|
-
warning(message, params, title) {
|
|
17
|
-
this.translateMessage(message, params, str => console.log(str, title, "background: #F89406; color: #ffffff"));
|
|
18
|
-
}
|
|
19
|
-
translateMessage(message, params, callback) {
|
|
20
|
-
this.language.getTranslation(message, params).then(callback);
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
ConsoleToasterService.decorators = [
|
|
24
|
-
{ type: Injectable }
|
|
25
|
-
];
|
|
26
|
-
ConsoleToasterService.ctorParameters = () => [
|
|
27
|
-
{ type: undefined, decorators: [{ type: Inject, args: [LANGUAGE_SERVICE,] }] }
|
|
28
|
-
];
|
|
29
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9hc3Rlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL25neC11dGlscy9zZXJ2aWNlcy90b2FzdGVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDakQsT0FBTyxFQUFvQyxnQkFBZ0IsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBR3BGLE1BQU0sT0FBTyxxQkFBcUI7SUFFOUIsWUFBOEMsUUFBMEI7UUFBMUIsYUFBUSxHQUFSLFFBQVEsQ0FBa0I7SUFFeEUsQ0FBQztJQUVELEtBQUssQ0FBQyxPQUFlLEVBQUUsTUFBWSxFQUFFLEtBQWM7UUFDL0MsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUscUNBQXFDLENBQUMsQ0FBQyxDQUFDO0lBQ2xILENBQUM7SUFFRCxJQUFJLENBQUMsT0FBZSxFQUFFLE1BQVksRUFBRSxLQUFjO1FBQzlDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLHFDQUFxQyxDQUFDLENBQUMsQ0FBQztJQUNsSCxDQUFDO0lBRUQsT0FBTyxDQUFDLE9BQWUsRUFBRSxNQUFZLEVBQUUsS0FBYztRQUNqRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxxQ0FBcUMsQ0FBQyxDQUFDLENBQUM7SUFDbEgsQ0FBQztJQUVELE9BQU8sQ0FBQyxPQUFlLEVBQUUsTUFBWSxFQUFFLEtBQWM7UUFDakQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUscUNBQXFDLENBQUMsQ0FBQyxDQUFDO0lBQ2xILENBQUM7SUFFTyxnQkFBZ0IsQ0FBQyxPQUFlLEVBQUUsTUFBVyxFQUFFLFFBQW1DO1FBQ3RGLElBQUksQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDakUsQ0FBQzs7O1lBekJKLFVBQVU7Ozs0Q0FHTSxNQUFNLFNBQUMsZ0JBQWdCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtJbmplY3QsIEluamVjdGFibGV9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7SUxhbmd1YWdlU2VydmljZSwgSVRvYXN0ZXJTZXJ2aWNlLCBMQU5HVUFHRV9TRVJWSUNFfSBmcm9tIFwiLi4vY29tbW9uLXR5cGVzXCI7XHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBDb25zb2xlVG9hc3RlclNlcnZpY2UgaW1wbGVtZW50cyBJVG9hc3RlclNlcnZpY2Uge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKEBJbmplY3QoTEFOR1VBR0VfU0VSVklDRSkgcHJpdmF0ZSBsYW5ndWFnZTogSUxhbmd1YWdlU2VydmljZSkge1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBlcnJvcihtZXNzYWdlOiBzdHJpbmcsIHBhcmFtcz86IGFueSwgdGl0bGU/OiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnRyYW5zbGF0ZU1lc3NhZ2UobWVzc2FnZSwgcGFyYW1zLCBzdHIgPT4gY29uc29sZS5sb2coc3RyLCB0aXRsZSwgXCJiYWNrZ3JvdW5kOiAjQkQzNjJGOyBjb2xvcjogI2ZmZmZmZlwiKSk7XHJcbiAgICB9XHJcblxyXG4gICAgaW5mbyhtZXNzYWdlOiBzdHJpbmcsIHBhcmFtcz86IGFueSwgdGl0bGU/OiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnRyYW5zbGF0ZU1lc3NhZ2UobWVzc2FnZSwgcGFyYW1zLCBzdHIgPT4gY29uc29sZS5sb2coc3RyLCB0aXRsZSwgXCJiYWNrZ3JvdW5kOiAjMkY5NkI0OyBjb2xvcjogI2ZmZmZmZlwiKSk7XHJcbiAgICB9XHJcblxyXG4gICAgc3VjY2VzcyhtZXNzYWdlOiBzdHJpbmcsIHBhcmFtcz86IGFueSwgdGl0bGU/OiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnRyYW5zbGF0ZU1lc3NhZ2UobWVzc2FnZSwgcGFyYW1zLCBzdHIgPT4gY29uc29sZS5sb2coc3RyLCB0aXRsZSwgXCJiYWNrZ3JvdW5kOiAjNTFBMzUxOyBjb2xvcjogI2ZmZmZmZlwiKSk7XHJcbiAgICB9XHJcblxyXG4gICAgd2FybmluZyhtZXNzYWdlOiBzdHJpbmcsIHBhcmFtcz86IGFueSwgdGl0bGU/OiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnRyYW5zbGF0ZU1lc3NhZ2UobWVzc2FnZSwgcGFyYW1zLCBzdHIgPT4gY29uc29sZS5sb2coc3RyLCB0aXRsZSwgXCJiYWNrZ3JvdW5kOiAjRjg5NDA2OyBjb2xvcjogI2ZmZmZmZlwiKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSB0cmFuc2xhdGVNZXNzYWdlKG1lc3NhZ2U6IHN0cmluZywgcGFyYW1zOiBhbnksIGNhbGxiYWNrOiAobWVzc2FnZTogc3RyaW5nKSA9PiB2b2lkKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5sYW5ndWFnZS5nZXRUcmFuc2xhdGlvbihtZXNzYWdlLCBwYXJhbXMpLnRoZW4oY2FsbGJhY2spO1xyXG4gICAgfVxyXG59XHJcbiJdfQ==
|
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
import { Inject, Injectable } from "@angular/core";
|
|
2
|
-
import { DefaultUrlSerializer, UrlSegment, UrlSegmentGroup, UrlTree } from "@angular/router";
|
|
3
|
-
import { LANGUAGE_SERVICE } from "../common-types";
|
|
4
|
-
export class TranslatedUrlSerializer extends DefaultUrlSerializer {
|
|
5
|
-
constructor(language) {
|
|
6
|
-
super();
|
|
7
|
-
this.language = language;
|
|
8
|
-
this.cache = {};
|
|
9
|
-
}
|
|
10
|
-
serialize(tree) {
|
|
11
|
-
const copy = new UrlTree();
|
|
12
|
-
const dictionary = this.getDictionary(true);
|
|
13
|
-
copy.root = this.modifyTreeRecursive(tree.root, segment => {
|
|
14
|
-
segment.path = dictionary[segment.path] || segment.path;
|
|
15
|
-
});
|
|
16
|
-
copy.queryParams = tree.queryParams;
|
|
17
|
-
return super.serialize(copy);
|
|
18
|
-
}
|
|
19
|
-
parse(url) {
|
|
20
|
-
const tree = super.parse(url);
|
|
21
|
-
const dictionary = this.getDictionary(false);
|
|
22
|
-
tree.root = this.modifyTreeRecursive(tree.root, segment => {
|
|
23
|
-
segment.path = dictionary[segment.path] || segment.path;
|
|
24
|
-
});
|
|
25
|
-
return tree;
|
|
26
|
-
}
|
|
27
|
-
getDictionary(serialize) {
|
|
28
|
-
const method = serialize ? `serialize` : `parse`;
|
|
29
|
-
const key = `${this.language.currentLanguage}-${method}`;
|
|
30
|
-
if (!this.cache[key]) {
|
|
31
|
-
const dict = this.language.dictionary;
|
|
32
|
-
this.cache[key] = Object.keys(dict).reduce((res, key) => {
|
|
33
|
-
if (!key.startsWith("route."))
|
|
34
|
-
return res;
|
|
35
|
-
const value = dict[key];
|
|
36
|
-
key = key.replace("route.", "");
|
|
37
|
-
res[serialize ? key : value] = serialize ? value : key;
|
|
38
|
-
return res;
|
|
39
|
-
}, {});
|
|
40
|
-
}
|
|
41
|
-
return this.cache[key];
|
|
42
|
-
}
|
|
43
|
-
modifyTreeRecursive(segmentGroup, cb) {
|
|
44
|
-
if (!segmentGroup)
|
|
45
|
-
return null;
|
|
46
|
-
const childrenArr = [];
|
|
47
|
-
const children = Object.keys(segmentGroup.children || {}).reduce((res, key) => {
|
|
48
|
-
const child = this.modifyTreeRecursive(segmentGroup.children[key], cb);
|
|
49
|
-
childrenArr.push(child);
|
|
50
|
-
res[key] = child;
|
|
51
|
-
return res;
|
|
52
|
-
}, {});
|
|
53
|
-
const newGroup = new UrlSegmentGroup(segmentGroup.segments.map(s => {
|
|
54
|
-
s = new UrlSegment(s.path, Object.assign({}, s.parameters));
|
|
55
|
-
cb(s);
|
|
56
|
-
return s;
|
|
57
|
-
}), children);
|
|
58
|
-
childrenArr.forEach(c => {
|
|
59
|
-
c.parent = newGroup;
|
|
60
|
-
});
|
|
61
|
-
return newGroup;
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
TranslatedUrlSerializer.decorators = [
|
|
65
|
-
{ type: Injectable }
|
|
66
|
-
];
|
|
67
|
-
TranslatedUrlSerializer.ctorParameters = () => [
|
|
68
|
-
{ type: undefined, decorators: [{ type: Inject, args: [LANGUAGE_SERVICE,] }] }
|
|
69
|
-
];
|
|
70
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNsYXRlZC11cmwuc2VyaWFsaXplci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9uZ3gtdXRpbHMvc2VydmljZXMvdHJhbnNsYXRlZC11cmwuc2VyaWFsaXplci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsTUFBTSxFQUFFLFVBQVUsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUNqRCxPQUFPLEVBQUMsb0JBQW9CLEVBQUUsVUFBVSxFQUFFLGVBQWUsRUFBRSxPQUFPLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUMzRixPQUFPLEVBQW1CLGdCQUFnQixFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFPbkUsTUFBTSxPQUFPLHVCQUF3QixTQUFRLG9CQUFvQjtJQUk3RCxZQUErQyxRQUEwQjtRQUNyRSxLQUFLLEVBQUUsQ0FBQztRQURtQyxhQUFRLEdBQVIsUUFBUSxDQUFrQjtRQUVyRSxJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQztJQUNwQixDQUFDO0lBRUQsU0FBUyxDQUFDLElBQWE7UUFDbkIsTUFBTSxJQUFJLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUMzQixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzVDLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLEVBQUU7WUFDdEQsT0FBTyxDQUFDLElBQUksR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUM7UUFDNUQsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7UUFDcEMsT0FBTyxLQUFLLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFFRCxLQUFL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O1lBQ04sT0FBTyxDQUFDLENBQUM7UUFDYixDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUNkLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDcEIsQ0FBQyxDQUFDLE1BQU0sR0FBRyxRQUFRLENBQUM7UUFDeEIsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLFFBQVEsQ0FBQztJQUNwQixDQUFDOzs7WUEvREosVUFBVTs7OzRDQUtNLE1BQU0sU0FBQyxnQkFBZ0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0luamVjdCwgSW5qZWN0YWJsZX0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHtEZWZhdWx0VXJsU2VyaWFsaXplciwgVXJsU2VnbWVudCwgVXJsU2VnbWVudEdyb3VwLCBVcmxUcmVlfSBmcm9tIFwiQGFuZ3VsYXIvcm91dGVyXCI7XHJcbmltcG9ydCB7SUxhbmd1YWdlU2VydmljZSwgTEFOR1VBR0VfU0VSVklDRX0gZnJvbSBcIi4uL2NvbW1vbi10eXBlc1wiO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJVXJsRGljdGlvbmFyeSB7XHJcbiAgICBba2V5OiBzdHJpbmddOiBzdHJpbmdcclxufVxyXG5cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgVHJhbnNsYXRlZFVybFNlcmlhbGl6ZXIgZXh0ZW5kcyBEZWZhdWx0VXJsU2VyaWFsaXplciB7XHJcblxyXG4gICAgcHJvdGVjdGVkIGNhY2hlOiB7W2xhbmc6IHN0cmluZ106IElVcmxEaWN0aW9uYXJ5fTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihASW5qZWN0KExBTkdVQUdFX1NFUlZJQ0UpIHJlYWRvbmx5IGxhbmd1YWdlOiBJTGFuZ3VhZ2VTZXJ2aWNlKSB7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuICAgICAgICB0aGlzLmNhY2hlID0ge307XHJcbiAgICB9XHJcblxyXG4gICAgc2VyaWFsaXplKHRyZWU6IFVybFRyZWUpOiBzdHJpbmcge1xyXG4gICAgICAgIGNvbnN0IGNvcHkgPSBuZXcgVXJsVHJlZSgpO1xyXG4gICAgICAgIGNvbnN0IGRpY3Rpb25hcnkgPSB0aGlzLmdldERpY3Rpb25hcnkodHJ1ZSk7XHJcbiAgICAgICAgY29weS5yb290ID0gdGhpcy5tb2RpZnlUcmVlUmVjdXJzaXZlKHRyZWUucm9vdCwgc2VnbWVudCA9PiB7XHJcbiAgICAgICAgICAgIHNlZ21lbnQucGF0aCA9IGRpY3Rpb25hcnlbc2VnbWVudC5wYXRoXSB8fCBzZWdtZW50LnBhdGg7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgY29weS5xdWVyeVBhcmFtcyA9IHRyZWUucXVlcnlQYXJhbXM7XHJcbiAgICAgICAgcmV0dXJuIHN1cGVyLnNlcmlhbGl6ZShjb3B5KTtcclxuICAgIH1cclxuXHJcbiAgICBwYXJzZSh1cmw6IHN0cmluZyk6IFVybFRyZWUge1xyXG4gICAgICAgIGNvbnN0IHRyZWUgPSBzdXBlci5wYXJzZSh1cmwpO1xyXG4gICAgICAgIGNvbnN0IGRpY3Rpb25hcnkgPSB0aGlzLmdldERpY3Rpb25hcnkoZmFsc2UpO1xyXG4gICAgICAgIHRyZWUucm9vdCA9IHRoaXMubW9kaWZ5VHJlZVJlY3Vyc2l2ZSh0cmVlLnJvb3QsIHNlZ21lbnQgPT4ge1xyXG4gICAgICAgICAgICBzZWdtZW50LnBhdGggPSBkaWN0aW9uYXJ5W3NlZ21lbnQucGF0aF0gfHwgc2VnbWVudC5wYXRoO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiB0cmVlO1xyXG4gICAgfVxyXG5cclxuICAgIGdldERpY3Rpb25hcnkoc2VyaWFsaXplOiBib29sZWFuKTogSVVybERpY3Rpb25hcnkge1xyXG4gICAgICAgIGNvbnN0IG1ldGhvZCA9IHNlcmlhbGl6ZSA/IGBzZXJpYWxpemVgIDogYHBhcnNlYDtcclxuICAgICAgICBjb25zdCBrZXkgPSBgJHt0aGlzLmxhbmd1YWdlLmN1cnJlbnRMYW5ndWFnZX0tJHttZXRob2R9YDtcclxuICAgICAgICBpZiAoIXRoaXMuY2FjaGVba2V5XSkge1xyXG4gICAgICAgICAgICBjb25zdCBkaWN0ID0gdGhpcy5sYW5ndWFnZS5kaWN0aW9uYXJ5O1xyXG4gICAgICAgICAgICB0aGlzLmNhY2hlW2tleV0gPSBPYmplY3Qua2V5cyhkaWN0KS5yZWR1Y2UoKHJlcywga2V5KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWtleS5zdGFydHNXaXRoKFwicm91dGUuXCIpKSByZXR1cm4gcmVzO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBkaWN0W2tleV07XHJcbiAgICAgICAgICAgICAgICBrZXkgPSBrZXkucmVwbGFjZShcInJvdXRlLlwiLCBcIlwiKTtcclxuICAgICAgICAgICAgICAgIHJlc1tzZXJpYWxpemUgPyBrZXkgOiB2YWx1ZV0gPSBzZXJpYWxpemUgPyB2YWx1ZSA6IGtleTtcclxuICAgICAgICAgICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgICAgICAgIH0sIHt9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FjaGVba2V5XTtcclxuICAgIH1cclxuXHJcbiAgICBtb2RpZnlUcmVlUmVjdXJzaXZlKHNlZ21lbnRHcm91cDogVXJsU2VnbWVudEdyb3VwLCBjYjogKHNlZ21lbnQ6IFVybFNlZ21lbnQpID0+IHZvaWQpOiBVcmxTZWdtZW50R3JvdXAge1xyXG4gICAgICAgIGlmICghc2VnbWVudEdyb3VwKSByZXR1cm4gbnVsbDtcclxuICAgICAgICBjb25zdCBjaGlsZHJlbkFyciA9IFtdO1xyXG4gICAgICAgIGNvbnN0IGNoaWxkcmVuID0gT2JqZWN0LmtleXMoc2VnbWVudEdyb3VwLmNoaWxkcmVuIHx8IHt9KS5yZWR1Y2UoKHJlcywga2V5KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNoaWxkID0gdGhpcy5tb2RpZnlUcmVlUmVjdXJzaXZlKHNlZ21lbnRHcm91cC5jaGlsZHJlbltrZXldLCBjYik7XHJcbiAgICAgICAgICAgIGNoaWxkcmVuQXJyLnB1c2goY2hpbGQpO1xyXG4gICAgICAgICAgICByZXNba2V5XSA9IGNoaWxkO1xyXG4gICAgICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgICAgIH0sIHt9KTtcclxuICAgICAgICBjb25zdCBuZXdHcm91cCA9IG5ldyBVcmxTZWdtZW50R3JvdXAoc2VnbWVudEdyb3VwLnNlZ21lbnRzLm1hcChzID0+IHtcclxuICAgICAgICAgICAgcyA9IG5ldyBVcmxTZWdtZW50KHMucGF0aCwgT2JqZWN0LmFzc2lnbih7fSwgcy5wYXJhbWV0ZXJzKSk7XHJcbiAgICAgICAgICAgIGNiKHMpO1xyXG4gICAgICAgICAgICByZXR1cm4gcztcclxuICAgICAgICB9KSwgY2hpbGRyZW4pO1xyXG4gICAgICAgIGNoaWxkcmVuQXJyLmZvckVhY2goYyA9PiB7XHJcbiAgICAgICAgICAgIGMucGFyZW50ID0gbmV3R3JvdXA7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIG5ld0dyb3VwO1xyXG4gICAgfVxyXG59XHJcbiJdfQ==
|