@lenne.tech/ng-base 15.0.0-beta-2 → 16.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/base-components/base-components.module.d.ts +1 -2
- package/base-components/components/checkbox/checkbox.component.d.ts +1 -1
- package/base-components/components/delete-account/delete-account.component.d.ts +1 -1
- package/base-components/components/fab-button/fab-button.component.d.ts +1 -1
- package/base-components/components/input/input.component.d.ts +1 -1
- package/base-components/components/loading-bar/loading-bar.component.d.ts +1 -1
- package/base-components/components/model-form/model-form-base.component.d.ts +1 -1
- package/base-components/components/model-form/model-form.component.d.ts +1 -1
- package/base-components/components/model-form-sub/model-form-sub.component.d.ts +1 -1
- package/base-components/components/model-table/model-table.component.d.ts +17 -5
- package/base-components/components/refence-input/refence-input.component.d.ts +1 -1
- package/base-components/components/select/select.component.d.ts +1 -1
- package/base-components/components/skeleton-loader/skeleton-loader.component.d.ts +1 -1
- package/base-components/components/tags/tags.component.d.ts +1 -1
- package/base-components/components/textarea/textarea.component.d.ts +1 -1
- package/base-components/components/toast/toast.component.d.ts +1 -1
- package/base-components/components/upload-image/upload-image.component.d.ts +1 -1
- package/base-components/directives/context-menu.directive.d.ts +1 -1
- package/base-components/directives/sort.directive.d.ts +3 -2
- package/base-prototype/pages/login/login.component.d.ts +1 -1
- package/base-prototype/pages/profile/profile.component.d.ts +1 -1
- package/base-prototype/pages/set-password/set-password.component.d.ts +1 -1
- package/esm2022/base-cms/base-cms-routing.module.mjs +33 -0
- package/esm2022/base-cms/base-cms.module.mjs +61 -0
- package/esm2022/base-cms/pages/base-cms/base-cms.component.mjs +233 -0
- package/esm2022/base-components/base-components.module.mjs +123 -0
- package/esm2022/base-components/components/breadcrumb/breadcrumb.component.mjs +21 -0
- package/esm2022/base-components/components/change-password/change-password.component.mjs +96 -0
- package/esm2022/base-components/components/checkbox/checkbox.component.mjs +35 -0
- package/esm2022/base-components/components/delete-account/delete-account.component.mjs +61 -0
- package/esm2022/base-components/components/fab-button/fab-button.component.mjs +21 -0
- package/esm2022/base-components/components/input/input.component.mjs +72 -0
- package/esm2022/base-components/components/loading-bar/loading-bar.component.mjs +39 -0
- package/esm2022/base-components/components/model-form/model-form-base.component.mjs +145 -0
- package/esm2022/base-components/components/model-form/model-form.component.mjs +585 -0
- package/esm2022/base-components/components/model-form-sub/model-form-sub.component.mjs +111 -0
- package/esm2022/base-components/components/model-table/model-table.component.mjs +470 -0
- package/esm2022/base-components/components/refence-input/refence-input.component.mjs +273 -0
- package/esm2022/base-components/components/select/select.component.mjs +59 -0
- package/esm2022/base-components/components/skeleton-loader/skeleton-loader.component.mjs +32 -0
- package/esm2022/base-components/components/tags/tags.component.mjs +224 -0
- package/esm2022/base-components/components/textarea/textarea.component.mjs +76 -0
- package/esm2022/base-components/components/toast/toast.component.mjs +70 -0
- package/esm2022/base-components/components/upload-image/upload-image.component.mjs +343 -0
- package/esm2022/base-components/directives/back-button.directive.mjs +25 -0
- package/esm2022/base-components/directives/context-menu.directive.mjs +112 -0
- package/esm2022/base-components/directives/sort.directive.mjs +61 -0
- package/esm2022/base-components/directives/stop-propagation.directive.mjs +24 -0
- package/esm2022/base-components/pipes/ellipses.pipe.mjs +23 -0
- package/esm2022/base-prototype/base-prototype.module.mjs +54 -0
- package/esm2022/base-prototype/pages/email-verification/email-verification.component.mjs +62 -0
- package/esm2022/base-prototype/pages/forgot-password/forgot-password.component.mjs +75 -0
- package/esm2022/base-prototype/pages/login/login.component.mjs +111 -0
- package/esm2022/base-prototype/pages/profile/profile.component.mjs +86 -0
- package/esm2022/base-prototype/pages/register/register.component.mjs +94 -0
- package/esm2022/base-prototype/pages/set-password/set-password.component.mjs +90 -0
- package/esm2022/shared/classes/auth.class.mjs +14 -0
- package/esm2022/shared/classes/basic-user.class.mjs +49 -0
- package/esm2022/shared/classes/graphql-enum.class.mjs +10 -0
- package/esm2022/shared/classes/graphql-meta.class.mjs +345 -0
- package/esm2022/shared/classes/graphql-type.class.mjs +14 -0
- package/esm2022/shared/classes/sort.class.mjs +38 -0
- package/esm2022/shared/services/auth.service.mjs +153 -0
- package/esm2022/shared/services/breadcrumb.service.mjs +70 -0
- package/{esm2020 → esm2022}/shared/services/cms.service.mjs +7 -5
- package/esm2022/shared/services/file.service.mjs +87 -0
- package/esm2022/shared/services/forms.service.mjs +62 -0
- package/esm2022/shared/services/graphql-meta.service.mjs +133 -0
- package/esm2022/shared/services/graphql-plus.service.mjs +94 -0
- package/esm2022/shared/services/graphql.service.mjs +511 -0
- package/esm2022/shared/services/image.service.mjs +103 -0
- package/esm2022/shared/services/loader.service.mjs +79 -0
- package/esm2022/shared/services/navigation.service.mjs +39 -0
- package/esm2022/shared/services/scroll.service.mjs +208 -0
- package/esm2022/shared/services/storage.service.mjs +142 -0
- package/esm2022/shared/services/toast.service.mjs +40 -0
- package/esm2022/shared/services/user.service.mjs +161 -0
- package/esm2022/shared/services/ws.service.mjs +18 -0
- package/esm2022/src/base.module.mjs +98 -0
- package/esm2022/src/directives/lazy-load.directive.mjs +48 -0
- package/esm2022/src/directives/match-height.directive.mjs +92 -0
- package/esm2022/src/directives/resizable.directive.mjs +92 -0
- package/esm2022/src/factories/apollo-options.factory.mjs +108 -0
- package/esm2022/src/functions/extract-files.function.mjs +87 -0
- package/esm2022/src/guards/auth.guard.mjs +84 -0
- package/esm2022/src/guards/can-deactivate.guard.mjs +17 -0
- package/esm2022/src/guards/logout.guard.mjs +35 -0
- package/esm2022/src/pipes/date-ago.pipe.mjs +64 -0
- package/esm2022/src/pipes/safe-html.pipe.mjs +23 -0
- package/esm2022/src/services/fullscreen.service.mjs +52 -0
- package/esm2022/src/services/seo.service.mjs +100 -0
- package/esm2022/src/services/theme.service.mjs +45 -0
- package/{fesm2020 → fesm2022}/lenne.tech-ng-base-base-cms.mjs +42 -30
- package/{fesm2020 → fesm2022}/lenne.tech-ng-base-base-cms.mjs.map +1 -1
- package/{fesm2020 → fesm2022}/lenne.tech-ng-base-base-components.mjs +467 -286
- package/fesm2022/lenne.tech-ng-base-base-components.mjs.map +1 -0
- package/{fesm2020 → fesm2022}/lenne.tech-ng-base-base-prototype.mjs +127 -87
- package/{fesm2015 → fesm2022}/lenne.tech-ng-base-base-prototype.mjs.map +1 -1
- package/{fesm2020 → fesm2022}/lenne.tech-ng-base-shared.mjs +165 -113
- package/{fesm2020 → fesm2022}/lenne.tech-ng-base-shared.mjs.map +1 -1
- package/{fesm2020 → fesm2022}/lenne.tech-ng-base.mjs +113 -90
- package/fesm2022/lenne.tech-ng-base.mjs.map +1 -0
- package/package.json +27 -42
- package/src/directives/lazy-load.directive.d.ts +1 -1
- package/src/directives/match-height.directive.d.ts +1 -1
- package/src/directives/resizable.directive.d.ts +1 -1
- package/src/guards/auth.guard.d.ts +2 -2
- package/src/guards/can-deactivate.guard.d.ts +1 -2
- package/src/guards/logout.guard.d.ts +2 -2
- package/esm2020/base-cms/base-cms-routing.module.mjs +0 -32
- package/esm2020/base-cms/base-cms.module.mjs +0 -59
- package/esm2020/base-cms/pages/base-cms/base-cms.component.mjs +0 -222
- package/esm2020/base-components/base-components.module.mjs +0 -123
- package/esm2020/base-components/components/breadcrumb/breadcrumb.component.mjs +0 -18
- package/esm2020/base-components/components/change-password/change-password.component.mjs +0 -90
- package/esm2020/base-components/components/checkbox/checkbox.component.mjs +0 -31
- package/esm2020/base-components/components/delete-account/delete-account.component.mjs +0 -56
- package/esm2020/base-components/components/fab-button/fab-button.component.mjs +0 -21
- package/esm2020/base-components/components/input/input.component.mjs +0 -67
- package/esm2020/base-components/components/loading-bar/loading-bar.component.mjs +0 -35
- package/esm2020/base-components/components/model-form/model-form-base.component.mjs +0 -136
- package/esm2020/base-components/components/model-form/model-form.component.mjs +0 -564
- package/esm2020/base-components/components/model-form-sub/model-form-sub.component.mjs +0 -102
- package/esm2020/base-components/components/model-table/model-table.component.mjs +0 -397
- package/esm2020/base-components/components/refence-input/refence-input.component.mjs +0 -261
- package/esm2020/base-components/components/select/select.component.mjs +0 -54
- package/esm2020/base-components/components/skeleton-loader/skeleton-loader.component.mjs +0 -32
- package/esm2020/base-components/components/tags/tags.component.mjs +0 -218
- package/esm2020/base-components/components/textarea/textarea.component.mjs +0 -72
- package/esm2020/base-components/components/toast/toast.component.mjs +0 -68
- package/esm2020/base-components/components/upload-image/upload-image.component.mjs +0 -324
- package/esm2020/base-components/directives/back-button.directive.mjs +0 -23
- package/esm2020/base-components/directives/context-menu.directive.mjs +0 -108
- package/esm2020/base-components/directives/sort.directive.mjs +0 -54
- package/esm2020/base-components/directives/stop-propagation.directive.mjs +0 -23
- package/esm2020/base-components/pipes/ellipses.pipe.mjs +0 -22
- package/esm2020/base-prototype/base-prototype.module.mjs +0 -53
- package/esm2020/base-prototype/pages/email-verification/email-verification.component.mjs +0 -55
- package/esm2020/base-prototype/pages/forgot-password/forgot-password.component.mjs +0 -67
- package/esm2020/base-prototype/pages/login/login.component.mjs +0 -102
- package/esm2020/base-prototype/pages/profile/profile.component.mjs +0 -81
- package/esm2020/base-prototype/pages/register/register.component.mjs +0 -86
- package/esm2020/base-prototype/pages/set-password/set-password.component.mjs +0 -82
- package/esm2020/shared/classes/auth.class.mjs +0 -17
- package/esm2020/shared/classes/basic-user.class.mjs +0 -52
- package/esm2020/shared/classes/graphql-enum.class.mjs +0 -9
- package/esm2020/shared/classes/graphql-meta.class.mjs +0 -344
- package/esm2020/shared/classes/graphql-type.class.mjs +0 -17
- package/esm2020/shared/classes/sort.class.mjs +0 -40
- package/esm2020/shared/services/auth.service.mjs +0 -148
- package/esm2020/shared/services/breadcrumb.service.mjs +0 -68
- package/esm2020/shared/services/file.service.mjs +0 -84
- package/esm2020/shared/services/forms.service.mjs +0 -59
- package/esm2020/shared/services/graphql-meta.service.mjs +0 -123
- package/esm2020/shared/services/graphql-plus.service.mjs +0 -89
- package/esm2020/shared/services/graphql.service.mjs +0 -507
- package/esm2020/shared/services/image.service.mjs +0 -102
- package/esm2020/shared/services/loader.service.mjs +0 -79
- package/esm2020/shared/services/navigation.service.mjs +0 -36
- package/esm2020/shared/services/scroll.service.mjs +0 -179
- package/esm2020/shared/services/storage.service.mjs +0 -140
- package/esm2020/shared/services/toast.service.mjs +0 -41
- package/esm2020/shared/services/user.service.mjs +0 -155
- package/esm2020/shared/services/ws.service.mjs +0 -16
- package/esm2020/src/base.module.mjs +0 -97
- package/esm2020/src/directives/lazy-load.directive.mjs +0 -45
- package/esm2020/src/directives/match-height.directive.mjs +0 -84
- package/esm2020/src/directives/resizable.directive.mjs +0 -90
- package/esm2020/src/factories/apollo-options.factory.mjs +0 -106
- package/esm2020/src/functions/extract-files.function.mjs +0 -84
- package/esm2020/src/guards/auth.guard.mjs +0 -80
- package/esm2020/src/guards/can-deactivate.guard.mjs +0 -16
- package/esm2020/src/guards/logout.guard.mjs +0 -32
- package/esm2020/src/pipes/date-ago.pipe.mjs +0 -65
- package/esm2020/src/pipes/safe-html.pipe.mjs +0 -21
- package/esm2020/src/services/fullscreen.service.mjs +0 -51
- package/esm2020/src/services/seo.service.mjs +0 -97
- package/esm2020/src/services/theme.service.mjs +0 -43
- package/fesm2015/lenne.tech-ng-base-base-cms.mjs +0 -322
- package/fesm2015/lenne.tech-ng-base-base-cms.mjs.map +0 -1
- package/fesm2015/lenne.tech-ng-base-base-components.mjs +0 -2806
- package/fesm2015/lenne.tech-ng-base-base-components.mjs.map +0 -1
- package/fesm2015/lenne.tech-ng-base-base-prototype.mjs +0 -495
- package/fesm2015/lenne.tech-ng-base-shared.mjs +0 -2749
- package/fesm2015/lenne.tech-ng-base-shared.mjs.map +0 -1
- package/fesm2015/lenne.tech-ng-base.mjs +0 -902
- package/fesm2015/lenne.tech-ng-base.mjs.map +0 -1
- package/fesm2020/lenne.tech-ng-base-base-components.mjs.map +0 -1
- package/fesm2020/lenne.tech-ng-base-base-prototype.mjs.map +0 -1
- package/fesm2020/lenne.tech-ng-base.mjs.map +0 -1
- /package/{esm2020 → esm2022}/base-cms/interfaces/base-cms-module-config.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/base-cms/lenne.tech-ng-base-base-cms.mjs +0 -0
- /package/{esm2020 → esm2022}/base-cms/public-api.mjs +0 -0
- /package/{esm2020 → esm2022}/base-components/lenne.tech-ng-base-base-components.mjs +0 -0
- /package/{esm2020 → esm2022}/base-components/public-api.mjs +0 -0
- /package/{esm2020 → esm2022}/base-prototype/lenne.tech-ng-base-base-prototype.mjs +0 -0
- /package/{esm2020 → esm2022}/base-prototype/public-api.mjs +0 -0
- /package/{esm2020 → esm2022}/lenne.tech-ng-base.mjs +0 -0
- /package/{esm2020 → esm2022}/public-api.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/classes/helper.class.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/classes/standard.class.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/decorators/debounce.decorator.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/enums/comparison-operator.enum.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/enums/graphql-request-type.enum.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/enums/logical-operator.enum.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/enums/skeleton-type.enum.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/enums/sort-order.enum.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/enums/toast-type.enum.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/functions/ws-client.function.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/interfaces/base-module-config.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/interfaces/breadcrumb.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/interfaces/can-component-deactivate.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/interfaces/cms-enum-values.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/interfaces/cms-field-config.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/interfaces/cms-model-config.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/interfaces/cms-table-field.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/interfaces/combined-filter-input.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/interfaces/compress-options.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/interfaces/cropping-options.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/interfaces/field-object.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/interfaces/field.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/interfaces/filter-input.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/interfaces/find-args.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/interfaces/graphql-crud-type.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/interfaces/graphql-fields-object.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/interfaces/graphql-options.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/interfaces/graphql-plus-options.interfacen.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/interfaces/graphql-type-collection.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/interfaces/login-config.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/interfaces/single-filter-input.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/interfaces/sort-input.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/interfaces/time-components.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/interfaces/toast.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/lenne.tech-ng-base-shared.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/public-api.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/types/graphql-fields.type.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/types/storage.type.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/validators/email.validator.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/validators/match.validator.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/validators/secure-password.validator.mjs +0 -0
- /package/{esm2020 → esm2022}/src/decorators/auto-unsubscribe.decorator.mjs +0 -0
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import { Helper } from '../classes/helper.class';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
/**
|
|
5
|
+
* Image service
|
|
6
|
+
*/
|
|
7
|
+
class ImageService {
|
|
8
|
+
/**
|
|
9
|
+
* Preaload images (for lazy handling)
|
|
10
|
+
*
|
|
11
|
+
* @param options
|
|
12
|
+
* @protected
|
|
13
|
+
*/
|
|
14
|
+
preLoadImages(options) {
|
|
15
|
+
// Init configuration
|
|
16
|
+
const config = {
|
|
17
|
+
doneFunnction: undefined,
|
|
18
|
+
elements: document,
|
|
19
|
+
regExp: undefined,
|
|
20
|
+
...options,
|
|
21
|
+
};
|
|
22
|
+
return new Promise((resolve) => {
|
|
23
|
+
// Convert element(s) into array
|
|
24
|
+
if (!Array.isArray(config.elements)) {
|
|
25
|
+
// NodeList or HTMLCollection
|
|
26
|
+
if (Helper.isNodeList(config.elements)) {
|
|
27
|
+
config.elements = Array.from(config.elements);
|
|
28
|
+
}
|
|
29
|
+
// Single element
|
|
30
|
+
else {
|
|
31
|
+
config.elements = [config.elements];
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
// Init loading
|
|
35
|
+
const promises = [];
|
|
36
|
+
// Get all images
|
|
37
|
+
let images = [];
|
|
38
|
+
config.elements.forEach((element) => {
|
|
39
|
+
images = images.concat(Array.from(element.getElementsByTagName('img')));
|
|
40
|
+
});
|
|
41
|
+
// Prepare images
|
|
42
|
+
for (let image of images) {
|
|
43
|
+
const src = image.getAttribute('src');
|
|
44
|
+
// Check if changes are necessary and possible
|
|
45
|
+
if ((image.complete && image.naturalHeight !== 0) || // already laoded
|
|
46
|
+
!src || // Image has no src
|
|
47
|
+
config.regExp?.test(src) // Test if src matches regular expression
|
|
48
|
+
) {
|
|
49
|
+
continue;
|
|
50
|
+
}
|
|
51
|
+
// Replace lazy loading image with immediately loading image
|
|
52
|
+
if (image.getAttribute('loading') === 'lazy') {
|
|
53
|
+
const newImage = document.createElement('img');
|
|
54
|
+
Array.from(image.attributes).forEach((attr) => {
|
|
55
|
+
if (attr.name !== 'loading' && attr.name !== 'src') {
|
|
56
|
+
newImage.setAttribute(attr.name, attr.value);
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
image.replaceWith(newImage);
|
|
60
|
+
image = newImage;
|
|
61
|
+
}
|
|
62
|
+
// Wait for laoding
|
|
63
|
+
promises.push(this.loadImage(image, src));
|
|
64
|
+
}
|
|
65
|
+
// Wait until all images loaded
|
|
66
|
+
Promise.all(promises)
|
|
67
|
+
.catch((e) => console.error('Error during image loading', e))
|
|
68
|
+
.finally(async () => {
|
|
69
|
+
// Return result
|
|
70
|
+
let result;
|
|
71
|
+
if (config.doneFunnction) {
|
|
72
|
+
result = await config.doneFunction();
|
|
73
|
+
}
|
|
74
|
+
resolve(result);
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Load image for image element
|
|
80
|
+
*
|
|
81
|
+
* @param imageElement
|
|
82
|
+
* @param src
|
|
83
|
+
* @protected
|
|
84
|
+
*/
|
|
85
|
+
async loadImage(imageElement, src) {
|
|
86
|
+
src = src || imageElement.src;
|
|
87
|
+
return new Promise((resolve, reject) => {
|
|
88
|
+
imageElement.onload = () => resolve(imageElement);
|
|
89
|
+
imageElement.onerror = reject;
|
|
90
|
+
imageElement.src = src;
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: ImageService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
94
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: ImageService, providedIn: 'root' });
|
|
95
|
+
}
|
|
96
|
+
export { ImageService };
|
|
97
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: ImageService, decorators: [{
|
|
98
|
+
type: Injectable,
|
|
99
|
+
args: [{
|
|
100
|
+
providedIn: 'root',
|
|
101
|
+
}]
|
|
102
|
+
}] });
|
|
103
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2Uuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLWJhc2Uvc2hhcmVkL3NlcnZpY2VzL2ltYWdlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0seUJBQXlCLENBQUM7O0FBRWpEOztHQUVHO0FBQ0gsTUFHYSxZQUFZO0lBQ3ZCOzs7OztPQUtHO0lBQ0ksYUFBYSxDQUFDLE9BWXBCO1FBQ0MscUJBQXFCO1FBQ3JCLE1BQU0sTUFBTSxHQUFHO1lBQ2IsYUFBYSxFQUFFLFNBQVM7WUFDeEIsUUFBUSxFQUFFLFFBQVE7WUFDbEIsTUFBTSxFQUFFLFNBQVM7WUFDakIsR0FBRyxPQUFPO1NBQ1gsQ0FBQztRQUVGLE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtZQUM3QixnQ0FBZ0M7WUFDaEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxFQUFFO2dCQUNuQyw2QkFBNkI7Z0JBQzdCLElBQUksTUFBTSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUU7b0JBQ3RDLE1BQU0sQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBcUMsQ0FBYyxDQUFDO2lCQUN6RjtnQkFFRCxpQkFBaUI7cUJBQ1o7b0JBQ0gsTUFBTSxDQUFDLFFBQVEsR0FBRyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQWMsQ0FBQztpQkFDbEQ7YUFDRjtZQUVELGVBQWU7WUFDZixNQUFNLFFBQVEsR0FBRyxFQUFFLENBQUM7WUFFcEIsaUJBQWlCO1lBQ2pCLElBQUksTUFBTSxHQUF1QixFQUFFLENBQUM7WUFDcEMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENB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QU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSGVscGVyIH0gZnJvbSAnLi4vY2xhc3Nlcy9oZWxwZXIuY2xhc3MnO1xuXG4vKipcbiAqIEltYWdlIHNlcnZpY2VcbiAqL1xuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIEltYWdlU2VydmljZSB7XG4gIC8qKlxuICAgKiBQcmVhbG9hZCBpbWFnZXMgKGZvciBsYXp5IGhhbmRsaW5nKVxuICAgKlxuICAgKiBAcGFyYW0gb3B0aW9uc1xuICAgKiBAcHJvdGVjdGVkXG4gICAqL1xuICBwdWJsaWMgcHJlTG9hZEltYWdlcyhvcHRpb25zPzoge1xuICAgIGRvbmVGdW5jdGlvbj86ICgpID0+IFByb21pc2U8YW55PiB8IGFueSB8IHZvaWQ7XG4gICAgZWxlbWVudHM/OlxuICAgICAgfCBFbGVtZW50XG4gICAgICB8IEVsZW1lbnRbXVxuICAgICAgfCBIVE1MQ29sbGVjdGlvbk9mPEVsZW1lbnQ+XG4gICAgICB8IE5vZGVcbiAgICAgIHwgTm9kZUxpc3RcbiAgICAgIHwgRG9jdW1lbnRcbiAgICAgIHwgSFRNTEVsZW1lbnRcbiAgICAgIHwgSFRNTEVsZW1lbnRbXTtcbiAgICByZWdFeHA/OiBSZWdFeHA7XG4gIH0pOiBQcm9taXNlPGFueT4ge1xuICAgIC8vIEluaXQgY29uZmlndXJhdGlvblxuICAgIGNvbnN0IGNvbmZpZyA9IHtcbiAgICAgIGRvbmVGdW5uY3Rpb246IHVuZGVmaW5lZCxcbiAgICAgIGVsZW1lbnRzOiBkb2N1bWVudCxcbiAgICAgIHJlZ0V4cDogdW5kZWZpbmVkLFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAvLyBDb252ZXJ0IGVsZW1lbnQocykgaW50byBhcnJheVxuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGNvbmZpZy5lbGVtZW50cykpIHtcbiAgICAgICAgLy8gTm9kZUxpc3Qgb3IgSFRNTENvbGxlY3Rpb25cbiAgICAgICAgaWYgKEhlbHBlci5pc05vZGVMaXN0KGNvbmZpZy5lbGVtZW50cykpIHtcbiAgICAgICAgICBjb25maWcuZWxlbWVudHMgPSBBcnJheS5mcm9tKGNvbmZpZy5lbGVtZW50cyBhcyBIVE1MQ29sbGVjdGlvbiB8IE5vZGVMaXN0KSBhcyBFbGVtZW50W107XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTaW5nbGUgZWxlbWVudFxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBjb25maWcuZWxlbWVudHMgPSBbY29uZmlnLmVsZW1lbnRzXSBhcyBFbGVtZW50W107XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gSW5pdCBsb2FkaW5nXG4gICAgICBjb25zdCBwcm9taXNlcyA9IFtdO1xuXG4gICAgICAvLyBHZXQgYWxsIGltYWdlc1xuICAgICAgbGV0IGltYWdlczogSFRNTEltYWdlRWxlbWVudFtdID0gW107XG4gICAgICBjb25maWcuZWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICBpbWFnZXMgPSBpbWFnZXMuY29uY2F0KEFycmF5LmZyb20oZWxlbWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaW1nJykpKTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBQcmVwYXJlIGltYWdlc1xuICAgICAgZm9yIChsZXQgaW1hZ2Ugb2YgaW1hZ2VzKSB7XG4gICAgICAgIGNvbnN0IHNyYyA9IGltYWdlLmdldEF0dHJpYnV0ZSgnc3JjJyk7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgY2hhbmdlcyBhcmUgbmVjZXNzYXJ5IGFuZCBwb3NzaWJsZVxuICAgICAgICBpZiAoXG4gICAgICAgICAgKGltYWdlLmNvbXBsZXRlICYmIGltYWdlLm5hdHVyYWxIZWlnaHQgIT09IDApIHx8IC8vIGFscmVhZHkgbGFvZGVkXG4gICAgICAgICAgIXNyYyB8fCAvLyBJbWFnZSBoYXMgbm8gc3JjXG4gICAgICAgICAgY29uZmlnLnJlZ0V4cD8udGVzdChzcmMpIC8vIFRlc3QgaWYgc3JjIG1hdGNoZXMgcmVndWxhciBleHByZXNzaW9uXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVwbGFjZSBsYXp5IGxvYWRpbmcgaW1hZ2Ugd2l0aCBpbW1lZGlhdGVseSBsb2FkaW5nIGltYWdlXG4gICAgICAgIGlmIChpbWFnZS5nZXRBdHRyaWJ1dGUoJ2xvYWRpbmcnKSA9PT0gJ2xhenknKSB7XG4gICAgICAgICAgY29uc3QgbmV3SW1hZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTtcbiAgICAgICAgICBBcnJheS5mcm9tKGltYWdlLmF0dHJpYnV0ZXMpLmZvckVhY2goKGF0dHIpID0+IHtcbiAgICAgICAgICAgIGlmIChhdHRyLm5hbWUgIT09ICdsb2FkaW5nJyAmJiBhdHRyLm5hbWUgIT09ICdzcmMnKSB7XG4gICAgICAgICAgICAgIG5ld0ltYWdlLnNldEF0dHJpYnV0ZShhdHRyLm5hbWUsIGF0dHIudmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGltYWdlLnJlcGxhY2VXaXRoKG5ld0ltYWdlKTtcbiAgICAgICAgICBpbWFnZSA9IG5ld0ltYWdlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gV2FpdCBmb3IgbGFvZGluZ1xuICAgICAgICBwcm9taXNlcy5wdXNoKHRoaXMubG9hZEltYWdlKGltYWdlLCBzcmMpKTtcbiAgICAgIH1cblxuICAgICAgLy8gV2FpdCB1bnRpbCBhbGwgaW1hZ2VzIGxvYWRlZFxuICAgICAgUHJvbWlzZS5hbGwocHJvbWlzZXMpXG4gICAgICAgIC5jYXRjaCgoZSkgPT4gY29uc29sZS5lcnJvcignRXJyb3IgZHVyaW5nIGltYWdlIGxvYWRpbmcnLCBlKSlcbiAgICAgICAgLmZpbmFsbHkoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIC8vIFJldHVybiByZXN1bHRcbiAgICAgICAgICBsZXQgcmVzdWx0O1xuICAgICAgICAgIGlmIChjb25maWcuZG9uZUZ1bm5jdGlvbikge1xuICAgICAgICAgICAgcmVzdWx0ID0gYXdhaXQgY29uZmlnLmRvbmVGdW5jdGlvbigpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXNvbHZlKHJlc3VsdCk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWQgaW1hZ2UgZm9yIGltYWdlIGVsZW1lbnRcbiAgICpcbiAgICogQHBhcmFtIGltYWdlRWxlbWVudFxuICAgKiBAcGFyYW0gc3JjXG4gICAqIEBwcm90ZWN0ZWRcbiAgICovXG4gIHB1YmxpYyBhc3luYyBsb2FkSW1hZ2UoaW1hZ2VFbGVtZW50OiBIVE1MSW1hZ2VFbGVtZW50LCBzcmM/OiBzdHJpbmcpIHtcbiAgICBzcmMgPSBzcmMgfHwgaW1hZ2VFbGVtZW50LnNyYztcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgaW1hZ2VFbGVtZW50Lm9ubG9hZCA9ICgpID0+IHJlc29sdmUoaW1hZ2VFbGVtZW50KTtcbiAgICAgIGltYWdlRWxlbWVudC5vbmVycm9yID0gcmVqZWN0O1xuICAgICAgaW1hZ2VFbGVtZW50LnNyYyA9IHNyYztcbiAgICB9KTtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import { BehaviorSubject, Observable } from 'rxjs';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
/**
|
|
5
|
+
* Loader service for loading indication
|
|
6
|
+
*/
|
|
7
|
+
class LoaderService {
|
|
8
|
+
isLoading = new BehaviorSubject(false);
|
|
9
|
+
lastStartTime;
|
|
10
|
+
/**
|
|
11
|
+
* Start loading manually
|
|
12
|
+
*/
|
|
13
|
+
start() {
|
|
14
|
+
if (!this.isLoading.value) {
|
|
15
|
+
this.isLoading.next(true);
|
|
16
|
+
this.lastStartTime = new Date().getTime();
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Stop loading manually
|
|
21
|
+
*
|
|
22
|
+
* @param duration
|
|
23
|
+
*/
|
|
24
|
+
stop(duration = 1800) {
|
|
25
|
+
const diffMs = new Date().getTime() - this.lastStartTime;
|
|
26
|
+
if (diffMs >= duration) {
|
|
27
|
+
this.isLoading.next(false);
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
setTimeout(() => {
|
|
31
|
+
this.isLoading.next(false);
|
|
32
|
+
}, duration - diffMs);
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Get loader as observable
|
|
36
|
+
*/
|
|
37
|
+
getAsObservable() {
|
|
38
|
+
return this.isLoading.asObservable();
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Load until observable done
|
|
42
|
+
*
|
|
43
|
+
* @param observable
|
|
44
|
+
* @param duration
|
|
45
|
+
*/
|
|
46
|
+
loadUntilObservable(observable, duration = 1800) {
|
|
47
|
+
return new Observable((subscriber) => {
|
|
48
|
+
const startFrom = new Date().getTime();
|
|
49
|
+
this.isLoading.next(true);
|
|
50
|
+
observable.subscribe({
|
|
51
|
+
next: (value) => {
|
|
52
|
+
const diffMs = new Date().getTime() - startFrom;
|
|
53
|
+
if (diffMs >= duration) {
|
|
54
|
+
subscriber.next(value);
|
|
55
|
+
subscriber.complete();
|
|
56
|
+
this.isLoading.next(false);
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
setTimeout(() => {
|
|
60
|
+
subscriber.next(value);
|
|
61
|
+
subscriber.complete();
|
|
62
|
+
this.isLoading.next(false);
|
|
63
|
+
}, duration - diffMs);
|
|
64
|
+
},
|
|
65
|
+
error: (error) => subscriber.error(error),
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: LoaderService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
70
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: LoaderService, providedIn: 'root' });
|
|
71
|
+
}
|
|
72
|
+
export { LoaderService };
|
|
73
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: LoaderService, decorators: [{
|
|
74
|
+
type: Injectable,
|
|
75
|
+
args: [{
|
|
76
|
+
providedIn: 'root',
|
|
77
|
+
}]
|
|
78
|
+
}] });
|
|
79
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9hZGVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1iYXNlL3NoYXJlZC9zZXJ2aWNlcy9sb2FkZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxlQUFlLEVBQUUsVUFBVSxFQUFFLE1BQU0sTUFBTSxDQUFDOztBQUVuRDs7R0FFRztBQUNILE1BR2EsYUFBYTtJQUN4QixTQUFTLEdBQUcsSUFBSSxlQUFlLENBQVUsS0FBSyxDQUFDLENBQUM7SUFDeEMsYUFBYSxDQUFVO0lBRS9COztPQUVHO0lBQ0gsS0FBSztRQUNILElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRTtZQUN6QixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMxQixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUM7U0FDM0M7SUFDSCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILElBQUksQ0FBQyxXQUFtQixJQUFJO1FBQzFCLE1BQU0sTUFBTSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUMsT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztRQUV6RCxJQUFJLE1BQU0sSUFBSSxRQUFRLEVBQUU7WUFDdEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDM0IsT0FBTztTQUNSO1FBRUQsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUNkLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzdCLENBQUMsRUFBRSxRQUFRLEdBQUcsTUFBTSxDQUFDLENBQUM7SUFDeEIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsZUFBZTtRQUNiLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUN2QyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxtQkFBbUIsQ0FBQyxVQUErQixFQUFFLFdBQW1CLElBQUk7UUFDMUUsT0FBTyxJQUFJLFVBQVUsQ0FBVSxDQUFDLFVBQVUsRUFBRSxFQUFFO1lBQzVDLE1BQU0sU0FBUyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDdkMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDMUIsVUFBVSxDQUFDLFNBQVMsQ0FBQztnQkFDbkIsSUFBSSxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUU7b0JBQ2QsTUFBTSxNQUFNLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQyxPQUFPLEVBQUUsR0FBRyxTQUFTLENBQUM7b0JBQ2hELElBQUksTUFBTSxJQUFJLFFBQVEsRUFBRTt3QkFDdEIsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQzt3QkFDdkIsVUFBVSxDQUFDLFFBQVEsRUFBRSxDQUFDO3dCQUN0QixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQzt3QkFDM0IsT0FBTztxQkFDUjtvQkFFRCxVQUFVLENBQUMsR0FBRyxFQUFFO3dCQUNkLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7d0JBQ3ZCLFVBQVUsQ0FBQyxRQUFRLEVBQUUsQ0FBQzt3QkFDdEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQzdCLENBQUMsRUFBRSxRQUFRLEdBQUcsTUFBTSxDQUFDLENBQUM7Z0JBQ3hCLENBQUM7Z0JBQ0QsS0FBSyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQzthQUMxQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7dUdBcEVVLGFBQWE7MkdBQWIsYUFBYSxjQUZaLE1BQU07O1NBRVAsYUFBYTsyRkFBYixhQUFhO2tCQUh6QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuXG4vKipcbiAqIExvYWRlciBzZXJ2aWNlIGZvciBsb2FkaW5nIGluZGljYXRpb25cbiAqL1xuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIExvYWRlclNlcnZpY2Uge1xuICBpc0xvYWRpbmcgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJpdmF0ZSBsYXN0U3RhcnRUaW1lITogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBTdGFydCBsb2FkaW5nIG1hbnVhbGx5XG4gICAqL1xuICBzdGFydCgpIHtcbiAgICBpZiAoIXRoaXMuaXNMb2FkaW5nLnZhbHVlKSB7XG4gICAgICB0aGlzLmlzTG9hZGluZy5uZXh0KHRydWUpO1xuICAgICAgdGhpcy5sYXN0U3RhcnRUaW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFN0b3AgbG9hZGluZyBtYW51YWxseVxuICAgKlxuICAgKiBAcGFyYW0gZHVyYXRpb25cbiAgICovXG4gIHN0b3AoZHVyYXRpb246IG51bWJlciA9IDE4MDApIHtcbiAgICBjb25zdCBkaWZmTXMgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKSAtIHRoaXMubGFzdFN0YXJ0VGltZTtcblxuICAgIGlmIChkaWZmTXMgPj0gZHVyYXRpb24pIHtcbiAgICAgIHRoaXMuaXNMb2FkaW5nLm5leHQoZmFsc2UpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5pc0xvYWRpbmcubmV4dChmYWxzZSk7XG4gICAgfSwgZHVyYXRpb24gLSBkaWZmTXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBsb2FkZXIgYXMgb2JzZXJ2YWJsZVxuICAgKi9cbiAgZ2V0QXNPYnNlcnZhYmxlKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLmlzTG9hZGluZy5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkIHVudGlsIG9ic2VydmFibGUgZG9uZVxuICAgKlxuICAgKiBAcGFyYW0gb2JzZXJ2YWJsZVxuICAgKiBAcGFyYW0gZHVyYXRpb25cbiAgICovXG4gIGxvYWRVbnRpbE9ic2VydmFibGUob2JzZXJ2YWJsZTogT2JzZXJ2YWJsZTx1bmtub3duPiwgZHVyYXRpb246IG51bWJlciA9IDE4MDApOiBPYnNlcnZhYmxlPHVua25vd24+IHtcbiAgICByZXR1cm4gbmV3IE9ic2VydmFibGU8dW5rbm93bj4oKHN1YnNjcmliZXIpID0+IHtcbiAgICAgIGNvbnN0IHN0YXJ0RnJvbSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgICAgdGhpcy5pc0xvYWRpbmcubmV4dCh0cnVlKTtcbiAgICAgIG9ic2VydmFibGUuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogKHZhbHVlKSA9PiB7XG4gICAgICAgICAgY29uc3QgZGlmZk1zID0gbmV3IERhdGUoKS5nZXRUaW1lKCkgLSBzdGFydEZyb207XG4gICAgICAgICAgaWYgKGRpZmZNcyA+PSBkdXJhdGlvbikge1xuICAgICAgICAgICAgc3Vic2NyaWJlci5uZXh0KHZhbHVlKTtcbiAgICAgICAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTtcbiAgICAgICAgICAgIHRoaXMuaXNMb2FkaW5nLm5leHQoZmFsc2UpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgc3Vic2NyaWJlci5uZXh0KHZhbHVlKTtcbiAgICAgICAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTtcbiAgICAgICAgICAgIHRoaXMuaXNMb2FkaW5nLm5leHQoZmFsc2UpO1xuICAgICAgICAgIH0sIGR1cmF0aW9uIC0gZGlmZk1zKTtcbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6IChlcnJvcikgPT4gc3Vic2NyaWJlci5lcnJvcihlcnJvciksXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import { NavigationEnd } from '@angular/router';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
import * as i1 from "@angular/router";
|
|
5
|
+
import * as i2 from "@angular/common";
|
|
6
|
+
class NavigationService {
|
|
7
|
+
router;
|
|
8
|
+
location;
|
|
9
|
+
history = [];
|
|
10
|
+
constructor(router, location) {
|
|
11
|
+
this.router = router;
|
|
12
|
+
this.location = location;
|
|
13
|
+
this.router.events.subscribe((event) => {
|
|
14
|
+
if (event instanceof NavigationEnd) {
|
|
15
|
+
this.history.push(event.urlAfterRedirects);
|
|
16
|
+
}
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* If the history stack is empty, navigate to the home page, otherwise go back to the previous page
|
|
21
|
+
*/
|
|
22
|
+
back() {
|
|
23
|
+
this.history.pop();
|
|
24
|
+
if (this.history.length > 0) {
|
|
25
|
+
this.location.back();
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
this.router.navigateByUrl('/');
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: NavigationService, deps: [{ token: i1.Router }, { token: i2.Location }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
32
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: NavigationService, providedIn: 'root' });
|
|
33
|
+
}
|
|
34
|
+
export { NavigationService };
|
|
35
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: NavigationService, decorators: [{
|
|
36
|
+
type: Injectable,
|
|
37
|
+
args: [{ providedIn: 'root' }]
|
|
38
|
+
}], ctorParameters: function () { return [{ type: i1.Router }, { type: i2.Location }]; } });
|
|
39
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmF2aWdhdGlvbi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctYmFzZS9zaGFyZWQvc2VydmljZXMvbmF2aWdhdGlvbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFM0MsT0FBTyxFQUFVLGFBQWEsRUFBRSxNQUFNLGlCQUFpQixDQUFDOzs7O0FBRXhELE1BQ2EsaUJBQWlCO0lBR1I7SUFBd0I7SUFGcEMsT0FBTyxHQUFhLEVBQUUsQ0FBQztJQUUvQixZQUFvQixNQUFjLEVBQVUsUUFBa0I7UUFBMUMsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUFVLGFBQVEsR0FBUixRQUFRLENBQVU7UUFDNUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDckMsSUFBSSxLQUFLLFlBQVksYUFBYSxFQUFFO2dCQUNsQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsQ0FBQzthQUM1QztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBSTtRQUNGLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDbkIsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDM0IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztTQUN0QjthQUFNO1lBQ0wsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDaEM7SUFDSCxDQUFDO3VHQXJCVSxpQkFBaUI7MkdBQWpCLGlCQUFpQixjQURKLE1BQU07O1NBQ25CLGlCQUFpQjsyRkFBakIsaUJBQWlCO2tCQUQ3QixVQUFVO21CQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IExvY2F0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IFJvdXRlciwgTmF2aWdhdGlvbkVuZCB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5leHBvcnQgY2xhc3MgTmF2aWdhdGlvblNlcnZpY2Uge1xuICBwcml2YXRlIGhpc3Rvcnk6IHN0cmluZ1tdID0gW107XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByb3V0ZXI6IFJvdXRlciwgcHJpdmF0ZSBsb2NhdGlvbjogTG9jYXRpb24pIHtcbiAgICB0aGlzLnJvdXRlci5ldmVudHMuc3Vic2NyaWJlKChldmVudCkgPT4ge1xuICAgICAgaWYgKGV2ZW50IGluc3RhbmNlb2YgTmF2aWdhdGlvbkVuZCkge1xuICAgICAgICB0aGlzLmhpc3RvcnkucHVzaChldmVudC51cmxBZnRlclJlZGlyZWN0cyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSWYgdGhlIGhpc3Rvcnkgc3RhY2sgaXMgZW1wdHksIG5hdmlnYXRlIHRvIHRoZSBob21lIHBhZ2UsIG90aGVyd2lzZSBnbyBiYWNrIHRvIHRoZSBwcmV2aW91cyBwYWdlXG4gICAqL1xuICBiYWNrKCk6IHZvaWQge1xuICAgIHRoaXMuaGlzdG9yeS5wb3AoKTtcbiAgICBpZiAodGhpcy5oaXN0b3J5Lmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMubG9jYXRpb24uYmFjaygpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZUJ5VXJsKCcvJyk7XG4gICAgfVxuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
import { Inject, Injectable } from '@angular/core';
|
|
2
|
+
import { BASE_MODULE_CONFIG } from '../interfaces/base-module-config.interface';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
import * as i1 from "@angular/router";
|
|
5
|
+
import * as i2 from "./image.service";
|
|
6
|
+
/**
|
|
7
|
+
* Scroll service for autoscroll to specific fragments
|
|
8
|
+
*/
|
|
9
|
+
class ScrollService {
|
|
10
|
+
router;
|
|
11
|
+
moduleConfig;
|
|
12
|
+
imageService;
|
|
13
|
+
/**
|
|
14
|
+
* Current scroll promise
|
|
15
|
+
*
|
|
16
|
+
* @protected
|
|
17
|
+
*/
|
|
18
|
+
scrollPromise;
|
|
19
|
+
/**
|
|
20
|
+
* Resolve function of current scroll promise
|
|
21
|
+
*
|
|
22
|
+
* @protected
|
|
23
|
+
*/
|
|
24
|
+
scrollPromiseResolve;
|
|
25
|
+
/**
|
|
26
|
+
* Is a scroll listener set
|
|
27
|
+
*
|
|
28
|
+
* @protected
|
|
29
|
+
*/
|
|
30
|
+
scrollListener = false;
|
|
31
|
+
/**
|
|
32
|
+
* Current scroll timer;
|
|
33
|
+
*
|
|
34
|
+
* @protected
|
|
35
|
+
*/
|
|
36
|
+
scrollTimer = -1;
|
|
37
|
+
/**
|
|
38
|
+
* Scroll offset
|
|
39
|
+
*/
|
|
40
|
+
scrollOffset;
|
|
41
|
+
/**
|
|
42
|
+
* Detection offset
|
|
43
|
+
* Should be >= scrollOffset
|
|
44
|
+
*/
|
|
45
|
+
detectionOffset;
|
|
46
|
+
/**
|
|
47
|
+
* Sampling rate for scroll done detection
|
|
48
|
+
*/
|
|
49
|
+
scrollSamplingRate;
|
|
50
|
+
/**
|
|
51
|
+
* Initializer
|
|
52
|
+
*/
|
|
53
|
+
constructor(router, moduleConfig, imageService) {
|
|
54
|
+
this.router = router;
|
|
55
|
+
this.moduleConfig = moduleConfig;
|
|
56
|
+
this.imageService = imageService;
|
|
57
|
+
const config = {
|
|
58
|
+
scrollDetectionOffset: 200,
|
|
59
|
+
scrollOffset: 100,
|
|
60
|
+
scrollSamplingRate: 100,
|
|
61
|
+
...moduleConfig,
|
|
62
|
+
};
|
|
63
|
+
this.detectionOffset = config.scrollDetectionOffset;
|
|
64
|
+
this.scrollOffset = config.scrollOffset;
|
|
65
|
+
this.scrollSamplingRate = config.scrollSamplingRate;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Scroll to structureElement with specific ID
|
|
69
|
+
*/
|
|
70
|
+
async scrollTo(id, options = {}) {
|
|
71
|
+
// Prepare config
|
|
72
|
+
const config = {
|
|
73
|
+
checkUrl: false,
|
|
74
|
+
loadImagesBefore: true,
|
|
75
|
+
resetStyles: false,
|
|
76
|
+
setOverflow: true,
|
|
77
|
+
stopPropagation: true,
|
|
78
|
+
...options,
|
|
79
|
+
};
|
|
80
|
+
// Check current URL
|
|
81
|
+
if (config.checkUrl && this.router.url !== '/' && !this.router.url.startsWith('/#')) {
|
|
82
|
+
await this.router.navigate(['/'], { fragment: id });
|
|
83
|
+
return !config.stopPropagation;
|
|
84
|
+
}
|
|
85
|
+
// Check if target element exits
|
|
86
|
+
const el = document.getElementById(id);
|
|
87
|
+
if (!el) {
|
|
88
|
+
console.error('Missing scroll element with ID:', id);
|
|
89
|
+
return !config.stopPropagation;
|
|
90
|
+
}
|
|
91
|
+
// Check if body overflow is visible
|
|
92
|
+
// This is necessary for scroll handling
|
|
93
|
+
const body = document.querySelector('body');
|
|
94
|
+
let undoOverflowChanges = false;
|
|
95
|
+
const scrollBodyStyles = JSON.parse(JSON.stringify(window.getComputedStyle(body)));
|
|
96
|
+
if (config.setOverflow && (scrollBodyStyles.overflowX !== 'visible' || scrollBodyStyles.overflowY !== 'visible')) {
|
|
97
|
+
// Set body overflow to visible
|
|
98
|
+
console.warn('Style of body element for overflowX and overflowY will be set to "visible" for scrolling!');
|
|
99
|
+
body.style.overflowX = 'visible';
|
|
100
|
+
body.style.overflowY = 'visible';
|
|
101
|
+
undoOverflowChanges = true;
|
|
102
|
+
}
|
|
103
|
+
// Load images before scrolling (once)
|
|
104
|
+
if (config.loadImagesBefore) {
|
|
105
|
+
await this.imageService.preLoadImages();
|
|
106
|
+
}
|
|
107
|
+
// Get get bounding rect of target element
|
|
108
|
+
const cords = el.getBoundingClientRect();
|
|
109
|
+
// Scroll to element
|
|
110
|
+
window.scrollBy({ top: cords.top - this.scrollOffset, behavior: 'smooth' });
|
|
111
|
+
await this.scrollDone({
|
|
112
|
+
doneFunction: () => {
|
|
113
|
+
// Undo changes
|
|
114
|
+
if (undoOverflowChanges && config.resetStyles) {
|
|
115
|
+
body.style.overflowX = scrollBodyStyles.overflowX;
|
|
116
|
+
body.style.overflowY = scrollBodyStyles.overflowY;
|
|
117
|
+
console.warn('Original style of body element for overflowX and overflowY is set.');
|
|
118
|
+
}
|
|
119
|
+
},
|
|
120
|
+
});
|
|
121
|
+
// Return stop propagation configuration
|
|
122
|
+
return !config.stopPropagation;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Get last active structureElement
|
|
126
|
+
*/
|
|
127
|
+
getLastActiveElement(list) {
|
|
128
|
+
const currentScrollPosition = window.scrollY;
|
|
129
|
+
const elementsWithId = document.querySelectorAll('[id]');
|
|
130
|
+
let lastId = null;
|
|
131
|
+
let lastPosition = 0 - this.detectionOffset - 1;
|
|
132
|
+
elementsWithId.forEach((element) => {
|
|
133
|
+
const cords = element.getBoundingClientRect();
|
|
134
|
+
const top = cords.top + window.pageYOffset - this.detectionOffset;
|
|
135
|
+
if ((!list || !list.length || list.includes(element.id)) && // In list
|
|
136
|
+
top < currentScrollPosition && // In active area
|
|
137
|
+
lastPosition < top // Higher than the last one
|
|
138
|
+
) {
|
|
139
|
+
lastId = element.id;
|
|
140
|
+
lastPosition = top;
|
|
141
|
+
}
|
|
142
|
+
});
|
|
143
|
+
return lastId;
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Check if ID is active
|
|
147
|
+
*/
|
|
148
|
+
isActive(id, list, isFirst) {
|
|
149
|
+
const lastActiveElement = this.getLastActiveElement(list);
|
|
150
|
+
return id === lastActiveElement || (lastActiveElement === null && isFirst);
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Scroll done promise
|
|
154
|
+
*/
|
|
155
|
+
async scrollDone(options = {}) {
|
|
156
|
+
// Init configuration
|
|
157
|
+
const config = {
|
|
158
|
+
doneFunction: undefined,
|
|
159
|
+
...options,
|
|
160
|
+
};
|
|
161
|
+
// Wait for scroll done
|
|
162
|
+
await this.scrollDoneDetection();
|
|
163
|
+
// Get result
|
|
164
|
+
if (config.doneFunction) {
|
|
165
|
+
return config.doneFunction();
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Scroll done detecton
|
|
170
|
+
*
|
|
171
|
+
* @protected
|
|
172
|
+
*/
|
|
173
|
+
scrollDoneDetection() {
|
|
174
|
+
// Return current scroll promise (Singelton)
|
|
175
|
+
if (this.scrollPromise) {
|
|
176
|
+
return this.scrollPromise;
|
|
177
|
+
}
|
|
178
|
+
// Create current scroll promise
|
|
179
|
+
this.scrollPromise = new Promise((resolve) => {
|
|
180
|
+
this.scrollPromiseResolve = resolve;
|
|
181
|
+
if (this.scrollTimer !== -1) {
|
|
182
|
+
window.clearTimeout(this.scrollTimer);
|
|
183
|
+
}
|
|
184
|
+
this.scrollTimer = window.setTimeout(() => {
|
|
185
|
+
window.removeEventListener('scroll', this.scrollDoneDetection.bind(this));
|
|
186
|
+
this.scrollPromise = undefined;
|
|
187
|
+
resolve();
|
|
188
|
+
}, this.scrollSamplingRate);
|
|
189
|
+
});
|
|
190
|
+
// Lisitening to scroll event;
|
|
191
|
+
window.addEventListener('scroll', this.scrollDoneDetection.bind(this));
|
|
192
|
+
// Return promise
|
|
193
|
+
return this.scrollPromise;
|
|
194
|
+
}
|
|
195
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: ScrollService, deps: [{ token: i1.Router }, { token: BASE_MODULE_CONFIG }, { token: i2.ImageService }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
196
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: ScrollService, providedIn: 'root' });
|
|
197
|
+
}
|
|
198
|
+
export { ScrollService };
|
|
199
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: ScrollService, decorators: [{
|
|
200
|
+
type: Injectable,
|
|
201
|
+
args: [{
|
|
202
|
+
providedIn: 'root',
|
|
203
|
+
}]
|
|
204
|
+
}], ctorParameters: function () { return [{ type: i1.Router }, { type: undefined, decorators: [{
|
|
205
|
+
type: Inject,
|
|
206
|
+
args: [BASE_MODULE_CONFIG]
|
|
207
|
+
}] }, { type: i2.ImageService }]; } });
|
|
208
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Nyb2xsLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1iYXNlL3NoYXJlZC9zZXJ2aWNlcy9zY3JvbGwuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVuRCxPQUFPLEVBQUUsa0JBQWtCLEVBQW9CLE1BQU0sNENBQTRDLENBQUM7Ozs7QUFHbEc7O0dBRUc7QUFDSCxNQUdhLGFBQWE7SUFpRFo7SUFDNEI7SUFDNUI7SUFsRFo7Ozs7T0FJRztJQUNPLGFBQWEsQ0FBZ0I7SUFFdkM7Ozs7T0FJRztJQUNPLG9CQUFvQixDQUE0QztJQUUxRTs7OztPQUlHO0lBQ08sY0FBYyxHQUFHLEtBQUssQ0FBQztJQUVqQzs7OztPQUlHO0lBQ08sV0FBVyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBRTNCOztPQUVHO0lBQ2dCLFlBQVksQ0FBUztJQUV4Qzs7O09BR0c7SUFDZ0IsZUFBZSxDQUFTO0lBRTNDOztPQUVHO0lBQ2dCLGtCQUFrQixDQUFTO0lBRTlDOztPQUVHO0lBQ0gsWUFDWSxNQUFjLEVBQ2MsWUFBOEIsRUFDMUQsWUFBMEI7UUFGMUIsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNjLGlCQUFZLEdBQVosWUFBWSxDQUFrQjtRQUMxRCxpQkFBWSxHQUFaLFlBQVksQ0FBYztRQUVwQyxNQUFNLE1BQU0sR0FBRztZQUNiLHFCQUFxQixFQUFFLEdBQUc7WUFDMUIsWUFBWSxFQUFFLEdBQUc7WUFDakIsa0JBQWtCLEVBQUUsR0FBRztZQUN2QixHQUFHLFlBQVk7U0FDaEIsQ0FBQztRQUVGLElBQUksQ0FBQyxlQUFlLEdBQUcsTUFBTSxDQUFDLHFCQUFxQixDQUFDO1FBQ3BELElBQUksQ0FBQyxZQUFZLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQztRQUN4QyxJQUFJLENBQUMsa0JBQWtCLEdBQUcs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Q0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQzlCLENBQUMsQ0FBQyxDQUFDO1FBRUgsOEJBQThCO1FBQzlCLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBRXZFLGlCQUFpQjtRQUNqQixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUM7SUFDNUIsQ0FBQzt1R0ExTlUsYUFBYSx3Q0FrRGQsa0JBQWtCOzJHQWxEakIsYUFBYSxjQUZaLE1BQU07O1NBRVAsYUFBYTsyRkFBYixhQUFhO2tCQUh6QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQjs7MEJBbURJLE1BQU07MkJBQUMsa0JBQWtCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgQkFTRV9NT0RVTEVfQ09ORklHLCBCYXNlTW9kdWxlQ29uZmlnIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9iYXNlLW1vZHVsZS1jb25maWcuaW50ZXJmYWNlJztcbmltcG9ydCB7IEltYWdlU2VydmljZSB9IGZyb20gJy4vaW1hZ2Uuc2VydmljZSc7XG5cbi8qKlxuICogU2Nyb2xsIHNlcnZpY2UgZm9yIGF1dG9zY3JvbGwgdG8gc3BlY2lmaWMgZnJhZ21lbnRzXG4gKi9cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBTY3JvbGxTZXJ2aWNlIHtcbiAgLyoqXG4gICAqIEN1cnJlbnQgc2Nyb2xsIHByb21pc2VcbiAgICpcbiAgICogQHByb3RlY3RlZFxuICAgKi9cbiAgcHJvdGVjdGVkIHNjcm9sbFByb21pc2U6IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgZnVuY3Rpb24gb2YgY3VycmVudCBzY3JvbGwgcHJvbWlzZVxuICAgKlxuICAgKiBAcHJvdGVjdGVkXG4gICAqL1xuICBwcm90ZWN0ZWQgc2Nyb2xsUHJvbWlzZVJlc29sdmU6ICh2YWx1ZTogdm9pZCB8IFByb21pc2VMaWtlPHZvaWQ+KSA9PiB2b2lkO1xuXG4gIC8qKlxuICAgKiBJcyBhIHNjcm9sbCBsaXN0ZW5lciBzZXRcbiAgICpcbiAgICogQHByb3RlY3RlZFxuICAgKi9cbiAgcHJvdGVjdGVkIHNjcm9sbExpc3RlbmVyID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIEN1cnJlbnQgc2Nyb2xsIHRpbWVyO1xuICAgKlxuICAgKiBAcHJvdGVjdGVkXG4gICAqL1xuICBwcm90ZWN0ZWQgc2Nyb2xsVGltZXIgPSAtMTtcblxuICAvKipcbiAgICogU2Nyb2xsIG9mZnNldFxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNjcm9sbE9mZnNldDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBEZXRlY3Rpb24gb2Zmc2V0XG4gICAqIFNob3VsZCBiZSA+PSBzY3JvbGxPZmZzZXRcbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBkZXRlY3Rpb25PZmZzZXQ6IG51bWJlcjtcblxuICAvKipcbiAgICogU2FtcGxpbmcgcmF0ZSBmb3Igc2Nyb2xsIGRvbmUgZGV0ZWN0aW9uXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2Nyb2xsU2FtcGxpbmdSYXRlOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVyXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgcm91dGVyOiBSb3V0ZXIsXG4gICAgQEluamVjdChCQVNFX01PRFVMRV9DT05GSUcpIHByb3RlY3RlZCBtb2R1bGVDb25maWc6IEJhc2VNb2R1bGVDb25maWcsXG4gICAgcHJvdGVjdGVkIGltYWdlU2VydmljZTogSW1hZ2VTZXJ2aWNlXG4gICkge1xuICAgIGNvbnN0IGNvbmZpZyA9IHtcbiAgICAgIHNjcm9sbERldGVjdGlvbk9mZnNldDogMjAwLFxuICAgICAgc2Nyb2xsT2Zmc2V0OiAxMDAsXG4gICAgICBzY3JvbGxTYW1wbGluZ1JhdGU6IDEwMCxcbiAgICAgIC4uLm1vZHVsZUNvbmZpZyxcbiAgICB9O1xuXG4gICAgdGhpcy5kZXRlY3Rpb25PZmZzZXQgPSBjb25maWcuc2Nyb2xsRGV0ZWN0aW9uT2Zmc2V0O1xuICAgIHRoaXMuc2Nyb2xsT2Zmc2V0ID0gY29uZmlnLnNjcm9sbE9mZnNldDtcbiAgICB0aGlzLnNjcm9sbFNhbXBsaW5nUmF0ZSA9IGNvbmZpZy5zY3JvbGxTYW1wbGluZ1JhdGU7XG4gIH1cblxuICAvKipcbiAgICogU2Nyb2xsIHRvIHN0cnVjdHVyZUVsZW1lbnQgd2l0aCBzcGVjaWZpYyBJRFxuICAgKi9cbiAgYXN5bmMgc2Nyb2xsVG8oXG4gICAgaWQ6IHN0cmluZyxcbiAgICBvcHRpb25zOiB7XG4gICAgICBjaGVja1VybD86IGJvb2xlYW47XG4gICAgICBsb2FkSW1hZ2VzQmVmb3JlPzogYm9vbGVhbjtcbiAgICAgIHJlc2V0U3R5bGVzPzogYm9vbGVhbjtcbiAgICAgIHNldE92ZXJmbG93PzogYm9vbGVhbjtcbiAgICAgIHN0b3BQcm9wYWdhdGlvbj86IGJvb2xlYW47XG4gICAgfSA9IHt9XG4gICkge1xuICAgIC8vIFByZXBhcmUgY29uZmlnXG4gICAgY29uc3QgY29uZmlnID0ge1xuICAgICAgY2hlY2tVcmw6IGZhbHNlLFxuICAgICAgbG9hZEltYWdlc0JlZm9yZTogdHJ1ZSxcbiAgICAgIHJlc2V0U3R5bGVzOiBmYWxzZSxcbiAgICAgIHNldE92ZXJmbG93OiB0cnVlLFxuICAgICAgc3RvcFByb3BhZ2F0aW9uOiB0cnVlLFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICB9O1xuXG4gICAgLy8gQ2hlY2sgY3VycmVudCBVUkxcbiAgICBpZiAoY29uZmlnLmNoZWNrVXJsICYmIHRoaXMucm91dGVyLnVybCAhPT0gJy8nICYmICF0aGlzLnJvdXRlci51cmwuc3RhcnRzV2l0aCgnLyMnKSkge1xuICAgICAgYXdhaXQgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycvJ10sIHsgZnJhZ21lbnQ6IGlkIH0pO1xuICAgICAgcmV0dXJuICFjb25maWcuc3RvcFByb3BhZ2F0aW9uO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIHRhcmdldCBlbGVtZW50IGV4aXRzXG4gICAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7XG4gICAgaWYgKCFlbCkge1xuICAgICAgY29uc29sZS5lcnJvcignTWlzc2luZyBzY3JvbGwgZWxlbWVudCB3aXRoIElEOicsIGlkKTtcbiAgICAgIHJldHVybiAhY29uZmlnLnN0b3BQcm9wYWdhdGlvbjtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiBib2R5IG92ZXJmbG93IGlzIHZpc2libGVcbiAgICAvLyBUaGlzIGlzIG5lY2Vzc2FyeSBmb3Igc2Nyb2xsIGhhbmRsaW5nXG4gICAgY29uc3QgYm9keSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2JvZHknKTtcbiAgICBsZXQgdW5kb092ZXJmbG93Q2hhbmdlcyA9IGZhbHNlO1xuICAgIGNvbnN0IHNjcm9sbEJvZHlTdHlsZXMgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGJvZHkpKSk7XG4gICAgaWYgKGNvbmZpZy5zZXRPdmVyZmxvdyAmJiAoc2Nyb2xsQm9keVN0eWxlcy5vdmVyZmxvd1ggIT09ICd2aXNpYmxlJyB8fCBzY3JvbGxCb2R5U3R5bGVzLm92ZXJmbG93WSAhPT0gJ3Zpc2libGUnKSkge1xuICAgICAgLy8gU2V0IGJvZHkgb3ZlcmZsb3cgdG8gdmlzaWJsZVxuICAgICAgY29uc29sZS53YXJuKCdTdHlsZSBvZiBib2R5IGVsZW1lbnQgZm9yIG92ZXJmbG93WCBhbmQgb3ZlcmZsb3dZIHdpbGwgYmUgc2V0IHRvIFwidmlzaWJsZVwiIGZvciBzY3JvbGxpbmchJyk7XG4gICAgICBib2R5LnN0eWxlLm92ZXJmbG93WCA9ICd2aXNpYmxlJztcbiAgICAgIGJvZHkuc3R5bGUub3ZlcmZsb3dZID0gJ3Zpc2libGUnO1xuICAgICAgdW5kb092ZXJmbG93Q2hhbmdlcyA9IHRydWU7XG4gICAgfVxuXG4gICAgLy8gTG9hZCBpbWFnZXMgYmVmb3JlIHNjcm9sbGluZyAob25jZSlcbiAgICBpZiAoY29uZmlnLmxvYWRJbWFnZXNCZWZvcmUpIHtcbiAgICAgIGF3YWl0IHRoaXMuaW1hZ2VTZXJ2aWNlLnByZUxvYWRJbWFnZXMoKTtcbiAgICB9XG5cbiAgICAvLyBHZXQgZ2V0IGJvdW5kaW5nIHJlY3Qgb2YgdGFyZ2V0IGVsZW1lbnRcbiAgICBjb25zdCBjb3JkcyA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgLy8gU2Nyb2xsIHRvIGVsZW1lbnRcbiAgICB3aW5kb3cuc2Nyb2xsQnkoeyB0b3A6IGNvcmRzLnRvcCAtIHRoaXMuc2Nyb2xsT2Zmc2V0LCBiZWhhdmlvcjogJ3Ntb290aCcgfSk7XG4gICAgYXdhaXQgdGhpcy5zY3JvbGxEb25lKHtcbiAgICAgIGRvbmVGdW5jdGlvbjogKCkgPT4ge1xuICAgICAgICAvLyBVbmRvIGNoYW5nZXNcbiAgICAgICAgaWYgKHVuZG9PdmVyZmxvd0NoYW5nZXMgJiYgY29uZmlnLnJlc2V0U3R5bGVzKSB7XG4gICAgICAgICAgYm9keS5zdHlsZS5vdmVyZmxvd1ggPSBzY3JvbGxCb2R5U3R5bGVzLm92ZXJmbG93WDtcbiAgICAgICAgICBib2R5LnN0eWxlLm92ZXJmbG93WSA9IHNjcm9sbEJvZHlTdHlsZXMub3ZlcmZsb3dZO1xuICAgICAgICAgIGNvbnNvbGUud2FybignT3JpZ2luYWwgc3R5bGUgb2YgYm9keSBlbGVtZW50IGZvciBvdmVyZmxvd1ggYW5kIG92ZXJmbG93WSBpcyBzZXQuJyk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyBSZXR1cm4gc3RvcCBwcm9wYWdhdGlvbiBjb25maWd1cmF0aW9uXG4gICAgcmV0dXJuICFjb25maWcuc3RvcFByb3BhZ2F0aW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBsYXN0IGFjdGl2ZSBzdHJ1Y3R1cmVFbGVtZW50XG4gICAqL1xuICBnZXRMYXN0QWN0aXZlRWxlbWVudChsaXN0Pyk6IHN0cmluZyB7XG4gICAgY29uc3QgY3VycmVudFNjcm9sbFBvc2l0aW9uID0gd2luZG93LnNjcm9sbFk7XG4gICAgY29uc3QgZWxlbWVudHNXaXRoSWQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbaWRdJyk7XG4gICAgbGV0IGxhc3RJZCA9IG51bGw7XG4gICAgbGV0IGxhc3RQb3NpdGlvbiA9IDAgLSB0aGlzLmRldGVjdGlvbk9mZnNldCAtIDE7XG4gICAgZWxlbWVudHNXaXRoSWQuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgY29uc3QgY29yZHMgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgY29uc3QgdG9wID0gY29yZHMudG9wICsgd2luZG93LnBhZ2VZT2Zmc2V0IC0gdGhpcy5kZXRlY3Rpb25PZmZzZXQ7XG4gICAgICBpZiAoXG4gICAgICAgICghbGlzdCB8fCAhbGlzdC5sZW5ndGggfHwgbGlzdC5pbmNsdWRlcyhlbGVtZW50LmlkKSkgJiYgLy8gSW4gbGlzdFxuICAgICAgICB0b3AgPCBjdXJyZW50U2Nyb2xsUG9zaXRpb24gJiYgLy8gSW4gYWN0aXZlIGFyZWFcbiAgICAgICAgbGFzdFBvc2l0aW9uIDwgdG9wIC8vIEhpZ2hlciB0aGFuIHRoZSBsYXN0IG9uZVxuICAgICAgKSB7XG4gICAgICAgIGxhc3RJZCA9IGVsZW1lbnQuaWQ7XG4gICAgICAgIGxhc3RQb3NpdGlvbiA9IHRvcDtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gbGFzdElkO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIElEIGlzIGFjdGl2ZVxuICAgKi9cbiAgaXNBY3RpdmUoaWQsIGxpc3Q/LCBpc0ZpcnN0Pykge1xuICAgIGNvbnN0IGxhc3RBY3RpdmVFbGVtZW50ID0gdGhpcy5nZXRMYXN0QWN0aXZlRWxlbWVudChsaXN0KTtcbiAgICByZXR1cm4gaWQgPT09IGxhc3RBY3RpdmVFbGVtZW50IHx8IChsYXN0QWN0aXZlRWxlbWVudCA9PT0gbnVsbCAmJiBpc0ZpcnN0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTY3JvbGwgZG9uZSBwcm9taXNlXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc2Nyb2xsRG9uZShvcHRpb25zOiB7IGRvbmVGdW5jdGlvbj86ICgpID0+IGFueSB8IHZvaWQgfSA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICAvLyBJbml0IGNvbmZpZ3VyYXRpb25cbiAgICBjb25zdCBjb25maWcgPSB7XG4gICAgICBkb25lRnVuY3Rpb246IHVuZGVmaW5lZCxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgfTtcblxuICAgIC8vIFdhaXQgZm9yIHNjcm9sbCBkb25lXG4gICAgYXdhaXQgdGhpcy5zY3JvbGxEb25lRGV0ZWN0aW9uKCk7XG5cbiAgICAvLyBHZXQgcmVzdWx0XG4gICAgaWYgKGNvbmZpZy5kb25lRnVuY3Rpb24pIHtcbiAgICAgIHJldHVybiBjb25maWcuZG9uZUZ1bmN0aW9uKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNjcm9sbCBkb25lIGRldGVjdG9uXG4gICAqXG4gICAqIEBwcm90ZWN0ZWRcbiAgICovXG4gIHByb3RlY3RlZCBzY3JvbGxEb25lRGV0ZWN0aW9uKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIFJldHVybiBjdXJyZW50IHNjcm9sbCBwcm9taXNlIChTaW5nZWx0b24pXG4gICAgaWYgKHRoaXMuc2Nyb2xsUHJvbWlzZSkge1xuICAgICAgcmV0dXJuIHRoaXMuc2Nyb2xsUHJvbWlzZTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgY3VycmVudCBzY3JvbGwgcHJvbWlzZVxuICAgIHRoaXMuc2Nyb2xsUHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICB0aGlzLnNjcm9sbFByb21pc2VSZXNvbHZlID0gcmVzb2x2ZTtcbiAgICAgIGlmICh0aGlzLnNjcm9sbFRpbWVyICE9PSAtMSkge1xuICAgICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuc2Nyb2xsVGltZXIpO1xuICAgICAgfVxuICAgICAgdGhpcy5zY3JvbGxUaW1lciA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRoaXMuc2Nyb2xsRG9uZURldGVjdGlvbi5iaW5kKHRoaXMpKTtcbiAgICAgICAgdGhpcy5zY3JvbGxQcm9taXNlID0gdW5kZWZpbmVkO1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9LCB0aGlzLnNjcm9sbFNhbXBsaW5nUmF0ZSk7XG4gICAgfSk7XG5cbiAgICAvLyBMaXNpdGVuaW5nIHRvIHNjcm9sbCBldmVudDtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdGhpcy5zY3JvbGxEb25lRGV0ZWN0aW9uLmJpbmQodGhpcykpO1xuXG4gICAgLy8gUmV0dXJuIHByb21pc2VcbiAgICByZXR1cm4gdGhpcy5zY3JvbGxQcm9taXNlO1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
import { Inject, Injectable } from '@angular/core';
|
|
2
|
+
import { BASE_MODULE_CONFIG } from '../interfaces/base-module-config.interface';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
/**
|
|
5
|
+
* Storage service for local data storage
|
|
6
|
+
*/
|
|
7
|
+
class StorageService {
|
|
8
|
+
moduleConfig;
|
|
9
|
+
/**
|
|
10
|
+
* Storage
|
|
11
|
+
*/
|
|
12
|
+
storage = null;
|
|
13
|
+
/**
|
|
14
|
+
* Prefix for storage keys
|
|
15
|
+
*/
|
|
16
|
+
prefix = '';
|
|
17
|
+
/**
|
|
18
|
+
* Initializations
|
|
19
|
+
*/
|
|
20
|
+
constructor(moduleConfig) {
|
|
21
|
+
this.moduleConfig = moduleConfig;
|
|
22
|
+
// Set storage
|
|
23
|
+
const type = moduleConfig.storageType ? moduleConfig.storageType : 'local';
|
|
24
|
+
if (type === 'session') {
|
|
25
|
+
this.storage = sessionStorage;
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
if (localStorage) {
|
|
29
|
+
this.storage = localStorage;
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
this.storage = null;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
// Set prefix
|
|
36
|
+
this.prefix = '';
|
|
37
|
+
if (moduleConfig.prefix) {
|
|
38
|
+
this.prefix += moduleConfig.prefix + '_';
|
|
39
|
+
}
|
|
40
|
+
if (moduleConfig.version) {
|
|
41
|
+
this.prefix += moduleConfig.version + '_';
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Save itemKeys
|
|
46
|
+
*
|
|
47
|
+
* If you want to save one item, use itemKeys and value parameters like these:
|
|
48
|
+
* save('KEY_OF_THE_ITEM', ITEM)
|
|
49
|
+
*
|
|
50
|
+
* If you want to save multiple items, use itemKeys only (value parameter will be ignored):
|
|
51
|
+
* save({'KEY_OF_ITEM_1': ITEM_1, 'KEY_OF_ITEM_2': ITEM_2, ...})
|
|
52
|
+
*/
|
|
53
|
+
save(itemKeys, value) {
|
|
54
|
+
// Check local storage
|
|
55
|
+
if (!this.storage) {
|
|
56
|
+
return false;
|
|
57
|
+
}
|
|
58
|
+
// Check item keys and value
|
|
59
|
+
if (!itemKeys ||
|
|
60
|
+
(typeof itemKeys === 'object' && !Object.keys(itemKeys).length) ||
|
|
61
|
+
(typeof itemKeys === 'string' && value === undefined)) {
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
if (typeof itemKeys === 'object') {
|
|
65
|
+
for (const [itemKey, itemValue] of Object.entries(itemKeys)) {
|
|
66
|
+
this.storage.setItem(this.prefix + itemKey, JSON.stringify(itemValue));
|
|
67
|
+
}
|
|
68
|
+
return true;
|
|
69
|
+
}
|
|
70
|
+
this.storage.setItem(this.prefix + itemKeys, JSON.stringify(value));
|
|
71
|
+
return true;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Load items via key(s)
|
|
75
|
+
*/
|
|
76
|
+
load(itemKeys) {
|
|
77
|
+
// Check local storage
|
|
78
|
+
if (!this.storage) {
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
// Check item keys
|
|
82
|
+
if (!itemKeys || (Array.isArray(itemKeys) && !itemKeys.length)) {
|
|
83
|
+
return null;
|
|
84
|
+
}
|
|
85
|
+
if (Array.isArray(itemKeys)) {
|
|
86
|
+
const back = {};
|
|
87
|
+
itemKeys.forEach((itemKey) => {
|
|
88
|
+
const loadedItem = this.storage.getItem(this.prefix + itemKey);
|
|
89
|
+
if (loadedItem) {
|
|
90
|
+
back[itemKey] = JSON.parse(loadedItem);
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
back[itemKey] = null;
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
return back;
|
|
97
|
+
}
|
|
98
|
+
let value = this.storage.getItem(this.prefix + itemKeys);
|
|
99
|
+
if (value) {
|
|
100
|
+
value = JSON.parse(value);
|
|
101
|
+
}
|
|
102
|
+
return value;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Remove item from storage
|
|
106
|
+
*
|
|
107
|
+
* @param itemKeys keys or key to remove
|
|
108
|
+
*/
|
|
109
|
+
remove(itemKeys) {
|
|
110
|
+
// Check local storage
|
|
111
|
+
if (!this.storage) {
|
|
112
|
+
return false;
|
|
113
|
+
}
|
|
114
|
+
if (Array.isArray(itemKeys)) {
|
|
115
|
+
itemKeys.forEach((key) => {
|
|
116
|
+
this.storage.removeItem(this.prefix + key);
|
|
117
|
+
});
|
|
118
|
+
return true;
|
|
119
|
+
}
|
|
120
|
+
this.storage.removeItem(this.prefix + itemKeys);
|
|
121
|
+
return true;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Clear local storage
|
|
125
|
+
*/
|
|
126
|
+
reset() {
|
|
127
|
+
this.storage.clear();
|
|
128
|
+
}
|
|
129
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: StorageService, deps: [{ token: BASE_MODULE_CONFIG }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
130
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: StorageService, providedIn: 'root' });
|
|
131
|
+
}
|
|
132
|
+
export { StorageService };
|
|
133
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: StorageService, decorators: [{
|
|
134
|
+
type: Injectable,
|
|
135
|
+
args: [{
|
|
136
|
+
providedIn: 'root',
|
|
137
|
+
}]
|
|
138
|
+
}], ctorParameters: function () { return [{ type: undefined, decorators: [{
|
|
139
|
+
type: Inject,
|
|
140
|
+
args: [BASE_MODULE_CONFIG]
|
|
141
|
+
}] }]; } });
|
|
142
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctYmFzZS9zaGFyZWQvc2VydmljZXMvc3RvcmFnZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxrQkFBa0IsRUFBb0IsTUFBTSw0Q0FBNEMsQ0FBQzs7QUFFbEc7O0dBRUc7QUFDSCxNQUdhLGNBQWM7SUFjdUI7SUFiaEQ7O09BRUc7SUFDTyxPQUFPLEdBQVEsSUFBSSxDQUFDO0lBRTlCOztPQUVHO0lBQ08sTUFBTSxHQUFHLEVBQUUsQ0FBQztJQUV0Qjs7T0FFRztJQUNILFlBQWdELFlBQThCO1FBQTlCLGlCQUFZLEdBQVosWUFBWSxDQUFrQjtRQUM1RSxjQUFjO1FBQ2QsTUFBTSxJQUFJLEdBQUcsWUFBWSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO1FBRTNFLElBQUksSUFBSSxLQUFLLFNBQVMsRUFBRTtZQUN0QixJQUFJLENBQUMsT0FBTyxHQUFHLGNBQWMsQ0FBQztTQUMvQjthQUFNO1lBQ0wsSUFBSSxZQUFZLEVBQUU7Z0JBQ2hCLElBQUksQ0FBQyxPQUFPLEdBQUcsWUFBWSxDQUFDO2FBQzdCO2lCQUFNO2dCQUNMLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO2FBQ3JCO1NBQ0Y7UUFFRCxhQUFhO1FBQ2IsSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFDakIsSUFBSSxZQUFZLENBQUMsTUFBTSxFQUFFO1lBQ3ZCLElBQUksQ0FBQyxNQUFNLElBQUksWUFBWSxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUM7U0FDMUM7UUFDRCxJQUFJLFlBQVksQ0FBQyxPQUFPLEVBQUU7WUFDeEIsSUFBSSxDQUFD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O2dCQUN2QixJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDO1lBQzdDLENBQUMsQ0FBQyxDQUFDO1lBQ0gsT0FBTyxJQUFJLENBQUM7U0FDYjtRQUVELElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsUUFBUSxDQUFDLENBQUM7UUFDaEQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7O09BRUc7SUFDSSxLQUFLO1FBQ1YsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUN2QixDQUFDO3VHQXZJVSxjQUFjLGtCQWNMLGtCQUFrQjsyR0FkM0IsY0FBYyxjQUZiLE1BQU07O1NBRVAsY0FBYzsyRkFBZCxjQUFjO2tCQUgxQixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQjs7MEJBZWMsTUFBTTsyQkFBQyxrQkFBa0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEJBU0VfTU9EVUxFX0NPTkZJRywgQmFzZU1vZHVsZUNvbmZpZyB9IGZyb20gJy4uL2ludGVyZmFjZXMvYmFzZS1tb2R1bGUtY29uZmlnLmludGVyZmFjZSc7XG5cbi8qKlxuICogU3RvcmFnZSBzZXJ2aWNlIGZvciBsb2NhbCBkYXRhIHN0b3JhZ2VcbiAqL1xuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIFN0b3JhZ2VTZXJ2aWNlIHtcbiAgLyoqXG4gICAqIFN0b3JhZ2VcbiAgICovXG4gIHByb3RlY3RlZCBzdG9yYWdlOiBhbnkgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBQcmVmaXggZm9yIHN0b3JhZ2Uga2V5c1xuICAgKi9cbiAgcHJvdGVjdGVkIHByZWZpeCA9ICcnO1xuXG4gIC8qKlxuICAgKiBJbml0aWFsaXphdGlvbnNcbiAgICovXG4gIGNvbnN0cnVjdG9yKEBJbmplY3QoQkFTRV9NT0RVTEVfQ09ORklHKSBwcml2YXRlIG1vZHVsZUNvbmZpZzogQmFzZU1vZHVsZUNvbmZpZykge1xuICAgIC8vIFNldCBzdG9yYWdlXG4gICAgY29uc3QgdHlwZSA9IG1vZHVsZUNvbmZpZy5zdG9yYWdlVHlwZSA/IG1vZHVsZUNvbmZpZy5zdG9yYWdlVHlwZSA6ICdsb2NhbCc7XG5cbiAgICBpZiAodHlwZSA9PT0gJ3Nlc3Npb24nKSB7XG4gICAgICB0aGlzLnN0b3JhZ2UgPSBzZXNzaW9uU3RvcmFnZTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGxvY2FsU3RvcmFnZSkge1xuICAgICAgICB0aGlzLnN0b3JhZ2UgPSBsb2NhbFN0b3JhZ2U7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnN0b3JhZ2UgPSBudWxsO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFNldCBwcmVmaXhcbiAgICB0aGlzLnByZWZpeCA9ICcnO1xuICAgIGlmIChtb2R1bGVDb25maWcucHJlZml4KSB7XG4gICAgICB0aGlzLnByZWZpeCArPSBtb2R1bGVDb25maWcucHJlZml4ICsgJ18nO1xuICAgIH1cbiAgICBpZiAobW9kdWxlQ29uZmlnLnZlcnNpb24pIHtcbiAgICAgIHRoaXMucHJlZml4ICs9IG1vZHVsZUNvbmZpZy52ZXJzaW9uICsgJ18nO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTYXZlIGl0ZW1LZXlzXG4gICAqXG4gICAqIElmIHlvdSB3YW50IHRvIHNhdmUgb25lIGl0ZW0sIHVzZSBpdGVtS2V5cyBhbmQgdmFsdWUgcGFyYW1ldGVycyBsaWtlIHRoZXNlOlxuICAgKiBzYXZlKCdLRVlfT0ZfVEhFX0lURU0nLCBJVEVNKVxuICAgKlxuICAgKiBJZiB5b3Ugd2FudCB0byBzYXZlIG11bHRpcGxlIGl0ZW1zLCB1c2UgaXRlbUtleXMgb25seSAodmFsdWUgcGFyYW1ldGVyIHdpbGwgYmUgaWdub3JlZCk6XG4gICAqIHNhdmUoeydLRVlfT0ZfSVRFTV8xJzogSVRFTV8xLCAnS0VZX09GX0lURU1fMic6IElURU1fMiwgLi4ufSlcbiAgICovXG4gIHB1YmxpYyBzYXZlKGl0ZW1LZXlzOiBzdHJpbmcgfCB7IFtrZXk6IHN0cmluZ106IGFueSB9LCB2YWx1ZT86IGFueSk6IGJvb2xlYW4ge1xuICAgIC8vIENoZWNrIGxvY2FsIHN0b3JhZ2VcbiAgICBpZiAoIXRoaXMuc3RvcmFnZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGl0ZW0ga2V5cyBhbmQgdmFsdWVcbiAgICBpZiAoXG4gICAgICAhaXRlbUtleXMgfHxcbiAgICAgICh0eXBlb2YgaXRlbUtleXMgPT09ICdvYmplY3QnICYmICFPYmplY3Qua2V5cyhpdGVtS2V5cykubGVuZ3RoKSB8fFxuICAgICAgKHR5cGVvZiBpdGVtS2V5cyA9PT0gJ3N0cmluZycgJiYgdmFsdWUgPT09IHVuZGVmaW5lZClcbiAgICApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGl0ZW1LZXlzID09PSAnb2JqZWN0Jykge1xuICAgICAgZm9yIChjb25zdCBbaXRlbUtleSwgaXRlbVZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhpdGVtS2V5cykpIHtcbiAgICAgICAgdGhpcy5zdG9yYWdlLnNldEl0ZW0odGhpcy5wcmVmaXggKyBpdGVtS2V5LCBKU09OLnN0cmluZ2lmeShpdGVtVmFsdWUpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHRoaXMuc3RvcmFnZS5zZXRJdGVtKHRoaXMucHJlZml4ICsgaXRlbUtleXMsIEpTT04uc3RyaW5naWZ5KHZhbHVlKSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogTG9hZCBpdGVtcyB2aWEga2V5KHMpXG4gICAqL1xuICBwdWJsaWMgbG9hZChpdGVtS2V5czogc3RyaW5nIHwgc3RyaW5nW10pOiBhbnkge1xuICAgIC8vIENoZWNrIGxvY2FsIHN0b3JhZ2VcbiAgICBpZiAoIXRoaXMuc3RvcmFnZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGl0ZW0ga2V5c1xuICAgIGlmICghaXRlbUtleXMgfHwgKEFycmF5LmlzQXJyYXkoaXRlbUtleXMpICYmICFpdGVtS2V5cy5sZW5ndGgpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShpdGVtS2V5cykpIHtcbiAgICAgIGNvbnN0IGJhY2sgPSB7fTtcbiAgICAgIGl0ZW1LZXlzLmZvckVhY2goKGl0ZW1LZXkpID0+IHtcbiAgICAgICAgY29uc3QgbG9hZGVkSXRlbSA9IHRoaXMuc3RvcmFnZS5nZXRJdGVtKHRoaXMucHJlZml4ICsgaXRlbUtleSk7XG4gICAgICAgIGlmIChsb2FkZWRJdGVtKSB7XG4gICAgICAgICAgYmFja1tpdGVtS2V5XSA9IEpTT04ucGFyc2UobG9hZGVkSXRlbSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYmFja1tpdGVtS2V5XSA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGJhY2s7XG4gICAgfVxuXG4gICAgbGV0IHZhbHVlID0gdGhpcy5zdG9yYWdlLmdldEl0ZW0odGhpcy5wcmVmaXggKyBpdGVtS2V5cyk7XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICB2YWx1ZSA9IEpTT04ucGFyc2UodmFsdWUpO1xuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgaXRlbSBmcm9tIHN0b3JhZ2VcbiAgICpcbiAgICogQHBhcmFtIGl0ZW1LZXlzIGtleXMgb3Iga2V5IHRvIHJlbW92ZVxuICAgKi9cbiAgcHVibGljIHJlbW92ZShpdGVtS2V5czogc3RyaW5nIHwgc3RyaW5nW10pOiBib29sZWFuIHtcbiAgICAvLyBDaGVjayBsb2NhbCBzdG9yYWdlXG4gICAgaWYgKCF0aGlzLnN0b3JhZ2UpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShpdGVtS2V5cykpIHtcbiAgICAgIGl0ZW1LZXlzLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICB0aGlzLnN0b3JhZ2UucmVtb3ZlSXRlbSh0aGlzLnByZWZpeCArIGtleSk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHRoaXMuc3RvcmFnZS5yZW1vdmVJdGVtKHRoaXMucHJlZml4ICsgaXRlbUtleXMpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFyIGxvY2FsIHN0b3JhZ2VcbiAgICovXG4gIHB1YmxpYyByZXNldCgpOiB2b2lkIHtcbiAgICB0aGlzLnN0b3JhZ2UuY2xlYXIoKTtcbiAgfVxufVxuIl19
|