@progressive-development/pd-spa-helper 0.7.5 → 0.8.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/dist/PdSpaHelper.d.ts +13 -18
- package/dist/PdSpaHelper.d.ts.map +1 -1
- package/dist/_virtual/_commonjsHelpers.js +6 -0
- package/dist/_virtual/hammer.js +4 -0
- package/dist/defaultpage/default-confirm-popup.d.ts.map +1 -1
- package/dist/defaultpage/default-dialog-popup.d.ts.map +1 -1
- package/dist/defaultpage/default-login.d.ts.map +1 -1
- package/dist/defaultpage/default-popup.d.ts.map +1 -1
- package/dist/defaultpage/default-step-address.d.ts.map +1 -1
- package/dist/defaultpage/default-step-summary.d.ts.map +1 -1
- package/dist/defaultpage/default-view-page.d.ts.map +1 -1
- package/dist/defaultpage/default-wizard-step.d.ts.map +1 -1
- package/dist/defaultpage/default-wizard.d.ts.map +1 -1
- package/dist/generated/locale-codes.d.ts.map +1 -1
- package/dist/generated/locale-wrapper/be-wrapper.d.ts +54 -13
- package/dist/generated/locale-wrapper/be-wrapper.d.ts.map +1 -1
- package/dist/generated/locale-wrapper/de-wrapper.d.ts +54 -13
- package/dist/generated/locale-wrapper/de-wrapper.d.ts.map +1 -1
- package/dist/generated/locale-wrapper/en-wrapper.d.ts +54 -13
- package/dist/generated/locale-wrapper/en-wrapper.d.ts.map +1 -1
- package/dist/generated/locales/be.d.ts +13 -13
- package/dist/generated/locales/be.d.ts.map +1 -1
- package/dist/generated/locales/de.d.ts +13 -13
- package/dist/generated/locales/de.d.ts.map +1 -1
- package/dist/generated/locales/en.d.ts +13 -13
- package/dist/generated/locales/en.d.ts.map +1 -1
- package/dist/helper/blob-helper.d.ts +3 -0
- package/dist/helper/blob-helper.d.ts.map +1 -0
- package/dist/helper/date-helper.d.ts +27 -0
- package/dist/helper/date-helper.d.ts.map +1 -0
- package/dist/helper/locale-format.d.ts +4 -0
- package/dist/helper/locale-format.d.ts.map +1 -0
- package/dist/helper/number-helper.d.ts +2 -0
- package/dist/helper/number-helper.d.ts.map +1 -0
- package/dist/helper/offline-watcher-helper.d.ts +3 -0
- package/dist/helper/offline-watcher-helper.d.ts.map +1 -0
- package/dist/helper/price-helper.d.ts +5 -0
- package/dist/helper/price-helper.d.ts.map +1 -0
- package/dist/helper/refresh-id-token.d.ts.map +1 -1
- package/dist/helper/text-helper.d.ts +3 -0
- package/dist/helper/text-helper.d.ts.map +1 -0
- package/dist/index.d.ts +8 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +23 -11
- package/dist/model/spa-model.d.ts +1 -0
- package/dist/model/spa-model.d.ts.map +1 -1
- package/dist/node_modules/@progressive-development/pd-content/dist/locales/be.js +7 -0
- package/dist/node_modules/@progressive-development/pd-content/dist/locales/de.js +7 -0
- package/dist/node_modules/@progressive-development/pd-content/dist/locales/en.js +7 -0
- package/dist/{src/router/AppMain.js → node_modules/@progressive-development/pd-content/dist/pd-box-view.js} +18 -7
- package/dist/node_modules/@progressive-development/pd-content/dist/pd-collapse.js +152 -0
- package/dist/node_modules/@progressive-development/pd-content/dist/pd-edit-content.js +225 -0
- package/dist/node_modules/@progressive-development/pd-content/dist/pd-more-info.js +84 -0
- package/dist/{pd-panel-viewer.js → node_modules/@progressive-development/pd-content/dist/pd-panel-viewer.js} +95 -75
- package/dist/{pd-panel.js → node_modules/@progressive-development/pd-content/dist/pd-panel.js} +21 -21
- package/dist/node_modules/@progressive-development/pd-content/dist/pd-resize-content.js +64 -0
- package/dist/node_modules/@progressive-development/pd-shared-styles/{src/shared-color-styles.js → dist/src/pd-color-styles.js} +13 -14
- package/dist/node_modules/@progressive-development/pd-shared-styles/dist/src/pd-font-styles.js +25 -0
- package/dist/node_modules/hammerjs/hammer.js +1797 -0
- package/dist/node_modules/universal-router/path-to-regexp.js +260 -0
- package/dist/node_modules/universal-router/universal-router.js +135 -0
- package/dist/popup/wizard-close-popup.d.ts.map +1 -1
- package/dist/popup/wizard-reload-popup.d.ts.map +1 -1
- package/dist/router/PdRouterService.d.ts +28 -0
- package/dist/router/PdRouterService.d.ts.map +1 -0
- package/dist/router/rout-types.d.ts +17 -0
- package/dist/router/rout-types.d.ts.map +1 -0
- package/dist/service-provider/firebase/auth.d.ts +2 -2
- package/dist/service-provider/firebase/auth.d.ts.map +1 -1
- package/dist/service-provider/firebase/firestorage-client.d.ts.map +1 -1
- package/dist/service-provider/firebase/firestore-client.d.ts +1 -1
- package/dist/service-provider/firebase/firestore-client.d.ts.map +1 -1
- package/dist/service-provider/firebase/functions-client.d.ts.map +1 -1
- package/dist/service-provider/firebase/messagingFirebaseClient.d.ts.map +1 -1
- package/dist/service-provider/mock/auth.d.ts +1 -1
- package/dist/service-provider/mock/auth.d.ts.map +1 -1
- package/dist/service-provider/mock/function-client.d.ts +1 -3
- package/dist/service-provider/mock/function-client.d.ts.map +1 -1
- package/dist/service-provider/mock/storage-client.d.ts.map +1 -1
- package/dist/service-provider/service-provider-impl.d.ts +2 -4
- package/dist/service-provider/service-provider-impl.d.ts.map +1 -1
- package/dist/service-provider/service-provider-model.d.ts +7 -8
- package/dist/service-provider/service-provider-model.d.ts.map +1 -1
- package/dist/src/PdSpaHelper.js +190 -189
- package/dist/src/defaultpage/default-confirm-popup.js +7 -7
- package/dist/src/defaultpage/default-dialog-popup.js +16 -18
- package/dist/src/defaultpage/default-login.js +4 -6
- package/dist/src/defaultpage/default-popup.js +1 -3
- package/dist/src/defaultpage/default-step-address.js +5 -7
- package/dist/src/defaultpage/default-step-summary.js +8 -6
- package/dist/src/defaultpage/default-view-page.js +0 -2
- package/dist/src/defaultpage/default-wizard-step.js +6 -8
- package/dist/src/defaultpage/default-wizard.js +34 -14
- package/dist/src/generated/locale-wrapper/be-wrapper.js +18 -11
- package/dist/src/generated/locale-wrapper/de-wrapper.js +18 -11
- package/dist/src/generated/locale-wrapper/en-wrapper.js +18 -11
- package/dist/src/helper/blob-helper.js +37 -0
- package/dist/src/helper/date-helper.js +137 -0
- package/dist/src/helper/locale-format.js +19 -0
- package/dist/src/helper/number-helper.js +14 -0
- package/dist/src/helper/{helper-utils.js → offline-watcher-helper.js} +1 -17
- package/dist/src/helper/price-helper.js +25 -0
- package/dist/src/helper/refresh-id-token.js +3 -1
- package/dist/src/helper/text-helper.js +6 -0
- package/dist/src/model/spa-model.js +3 -1
- package/dist/src/popup/wizard-close-popup.js +11 -5
- package/dist/src/popup/wizard-reload-popup.js +9 -6
- package/dist/src/router/PdRouterService.js +112 -0
- package/dist/src/service-provider/firebase/firestorage-client.js +33 -12
- package/dist/src/service-provider/firebase/firestore-client.js +7 -5
- package/dist/src/service-provider/firebase/functions-client.js +11 -9
- package/dist/src/service-provider/firebase/messagingFirebaseClient.js +9 -10
- package/dist/src/service-provider/mock/storage-client.js +21 -9
- package/dist/src/service-provider/service-provider-impl.js +19 -18
- package/dist/src/store/spa-app-actions.js +32 -8
- package/dist/src/store/spa-app-effects.js +19 -15
- package/dist/src/store/spa-app-reducer.js +5 -9
- package/dist/src/tmpown/pd-loading-state.js +60 -43
- package/dist/src/tmpown/pd-login.js +58 -45
- package/dist/src/tmpown/pd-toast.js +23 -20
- package/dist/store/indexDB.d.ts.map +1 -1
- package/dist/store/mini-rx.store.d.ts.map +1 -1
- package/dist/store/spa-app-actions.d.ts +2 -2
- package/dist/store/spa-app-actions.d.ts.map +1 -1
- package/dist/store/spa-app-effects.d.ts +2 -2
- package/dist/store/spa-app-effects.d.ts.map +1 -1
- package/dist/store/spa-app-reducer.d.ts.map +1 -1
- package/dist/store/spa-app-selector.d.ts.map +1 -1
- package/dist/stories/address-edit.stories.d.ts +1 -1
- package/dist/stories/address-edit.stories.d.ts.map +1 -1
- package/dist/stories/address-new.stories.d.ts +1 -1
- package/dist/stories/address-new.stories.d.ts.map +1 -1
- package/dist/stories/pd-loading-state.stories.d.ts +1 -1
- package/dist/stories/pd-loading-state.stories.d.ts.map +1 -1
- package/dist/stories/pd-toast.stories.d.ts +1 -1
- package/dist/stories/pd-toast.stories.d.ts.map +1 -1
- package/dist/stories/routing.stories.d.ts +24 -0
- package/dist/stories/routing.stories.d.ts.map +1 -0
- package/dist/stories/test-impls/test-mock-app.d.ts +15 -0
- package/dist/stories/test-impls/test-mock-app.d.ts.map +1 -0
- package/dist/stories/test-impls/test-pages/test-home-page.d.ts +7 -0
- package/dist/stories/test-impls/test-pages/test-home-page.d.ts.map +1 -0
- package/dist/stories/test-impls/test-pages/test-not-found-page.d.ts +5 -0
- package/dist/stories/test-impls/test-pages/test-not-found-page.d.ts.map +1 -0
- package/dist/tmpown/pd-loading-state.d.ts.map +1 -1
- package/dist/tmpown/pd-login.d.ts.map +1 -1
- package/dist/tmpown/pd-toast.d.ts.map +1 -1
- package/package.json +42 -79
- package/dist/helper/helper-utils.d.ts +0 -6
- package/dist/helper/helper-utils.d.ts.map +0 -1
- package/dist/node_modules/@progressive-development/pd-shared-styles/src/shared-font-styles.js +0 -32
- package/dist/pd-icon-panel-button.d.ts +0 -2
- package/dist/pd-icon-panel-button.js +0 -231
- package/dist/pd-panel-viewer.d.ts +0 -2
- package/dist/pd-panel.d.ts +0 -2
- package/dist/pd-tab.d.ts +0 -2
- package/dist/pd-tab.js +0 -146
- package/dist/router/AppMain.d.ts +0 -7
- package/dist/router/AppMain.d.ts.map +0 -1
- package/dist/service-call-controller2.d.ts +0 -17
- package/dist/service-call-controller2.d.ts.map +0 -1
- package/dist/stories/pd-icon-button.stories.d.ts +0 -30
- package/dist/stories/pd-icon-button.stories.d.ts.map +0 -1
- package/dist/tmpown/pd-icon-panel-button.d.ts +0 -17
- package/dist/tmpown/pd-icon-panel-button.d.ts.map +0 -1
- package/dist/tmpown/pd-panel-viewer.d.ts +0 -17
- package/dist/tmpown/pd-panel-viewer.d.ts.map +0 -1
- package/dist/tmpown/pd-panel.d.ts +0 -6
- package/dist/tmpown/pd-panel.d.ts.map +0 -1
- package/dist/tmpown/pd-tab.d.ts +0 -19
- package/dist/tmpown/pd-tab.d.ts.map +0 -1
- package/dist/tmpown/pd-tab.stories.d.ts +0 -23
- package/dist/tmpown/pd-tab.stories.d.ts.map +0 -1
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { getCurrentFormatLocale } from "./locale-format.js";
|
|
2
|
+
import { isValidNumber } from "./number-helper.js";
|
|
3
|
+
const EURO_FORMAT = (locale = getCurrentFormatLocale()) => Intl.NumberFormat(locale, {
|
|
4
|
+
style: "currency",
|
|
5
|
+
currency: "EUR"
|
|
6
|
+
});
|
|
7
|
+
const replaceForPriceFormat = (numberString) => numberString == null ? void 0 : numberString.replaceAll(",", ".");
|
|
8
|
+
const formatToPrice = (price) => {
|
|
9
|
+
let resultStr = "-- €";
|
|
10
|
+
if (price) {
|
|
11
|
+
resultStr = EURO_FORMAT().format(price);
|
|
12
|
+
}
|
|
13
|
+
return resultStr;
|
|
14
|
+
};
|
|
15
|
+
const toValidNumberOrUndefined = (numberStr) => {
|
|
16
|
+
const replacedNumber = replaceForPriceFormat(numberStr);
|
|
17
|
+
const replacedNumberFixed = isValidNumber(replacedNumber) ? Number(replacedNumber).toFixed(2) : void 0;
|
|
18
|
+
return replacedNumberFixed ? Number(replacedNumberFixed) : void 0;
|
|
19
|
+
};
|
|
20
|
+
export {
|
|
21
|
+
EURO_FORMAT,
|
|
22
|
+
formatToPrice,
|
|
23
|
+
replaceForPriceFormat,
|
|
24
|
+
toValidNumberOrUndefined
|
|
25
|
+
};
|
|
@@ -13,7 +13,9 @@ const refreshAndPersistUserIdToken = async () => {
|
|
|
13
13
|
userNameToken: userName,
|
|
14
14
|
userIdToken: userToken
|
|
15
15
|
});
|
|
16
|
-
console.log(
|
|
16
|
+
console.log(
|
|
17
|
+
`[TokenRefresh] ID Token refreshed & saved to local DB for app: ${appName}`
|
|
18
|
+
);
|
|
17
19
|
return true;
|
|
18
20
|
} catch (error) {
|
|
19
21
|
console.error(`[TokenRefresh] Failed to refresh and persist token:`, error);
|
|
@@ -17,7 +17,9 @@ let WizardClosePopup = class extends DefaultConfirmPopup {
|
|
|
17
17
|
super(...arguments);
|
|
18
18
|
this._singleButton = false;
|
|
19
19
|
this._type = "warn";
|
|
20
|
-
this._popupTitle = msg("Bearbeitung abbrechen", {
|
|
20
|
+
this._popupTitle = msg("Bearbeitung abbrechen", {
|
|
21
|
+
id: "spaH.wizard.close.popup.title"
|
|
22
|
+
});
|
|
21
23
|
this.withStorage = false;
|
|
22
24
|
}
|
|
23
25
|
// eslint-disable-next-line class-methods-use-this
|
|
@@ -25,16 +27,21 @@ let WizardClosePopup = class extends DefaultConfirmPopup {
|
|
|
25
27
|
return html`
|
|
26
28
|
<div class="popup-content" slot="content">
|
|
27
29
|
<p>
|
|
28
|
-
${this.withStorage ? msg(
|
|
30
|
+
${this.withStorage ? msg(
|
|
31
|
+
"Die aktuellen Eingaben können für eine spätere Bearbeitung gespeichert oder verworfen werden. Welche Aktion soll ausgeführt werden?",
|
|
32
|
+
{ id: "spaH.wizard.close.popup.storage.content" }
|
|
33
|
+
) : msg(
|
|
34
|
+
"Die aktuellen Eingaben gehen nach dem Schließen unwiderruflich verloren. Dennoch schließen?",
|
|
35
|
+
{ id: "spaH.wizard.reload.popup.noStorage.content" }
|
|
36
|
+
)}
|
|
29
37
|
</p>
|
|
30
|
-
</div>
|
|
38
|
+
</div>
|
|
31
39
|
`;
|
|
32
40
|
}
|
|
33
41
|
};
|
|
34
42
|
WizardClosePopup.styles = [
|
|
35
43
|
DefaultConfirmPopup.styles,
|
|
36
44
|
css`
|
|
37
|
-
|
|
38
45
|
:host {
|
|
39
46
|
--pd-popup-max-width: 80%;
|
|
40
47
|
}
|
|
@@ -43,7 +50,6 @@ WizardClosePopup.styles = [
|
|
|
43
50
|
display: flex;
|
|
44
51
|
flex-direction: column;
|
|
45
52
|
}
|
|
46
|
-
|
|
47
53
|
`
|
|
48
54
|
];
|
|
49
55
|
__decorateClass([
|
|
@@ -17,26 +17,30 @@ let WizardReloadPopup = class extends DefaultConfirmPopup {
|
|
|
17
17
|
super(...arguments);
|
|
18
18
|
this._singleButton = false;
|
|
19
19
|
this._type = "info";
|
|
20
|
-
this._popupTitle = msg("Bearbeitung fortsetzen?", {
|
|
20
|
+
this._popupTitle = msg("Bearbeitung fortsetzen?", {
|
|
21
|
+
id: "spaH.wizard.reload.popup.title"
|
|
22
|
+
});
|
|
21
23
|
}
|
|
22
24
|
// eslint-disable-next-line class-methods-use-this
|
|
23
25
|
_renderContent() {
|
|
24
26
|
return html`
|
|
25
27
|
<div class="popup-content" slot="content">
|
|
26
28
|
<p>
|
|
27
|
-
${msg(
|
|
29
|
+
${msg(
|
|
30
|
+
"Für dieses Formular wurden bereits Daten gespeichert. Soll die Bearbeitung fortgesetzt, oder eine neue Dateneingabe gestartet werden? Bei einer neuen Eingabe werden die bisherigen Daten verworfen.",
|
|
31
|
+
{ id: "spaH.wizard.reload.popup.content" }
|
|
32
|
+
)}
|
|
28
33
|
</p>
|
|
29
34
|
<div class="last-modified">
|
|
30
35
|
Letzte Bearbeitung: <span>${this.reloadItem.timestamp}</span>
|
|
31
36
|
</div>
|
|
32
|
-
</div>
|
|
37
|
+
</div>
|
|
33
38
|
`;
|
|
34
39
|
}
|
|
35
40
|
};
|
|
36
41
|
WizardReloadPopup.styles = [
|
|
37
42
|
DefaultConfirmPopup.styles,
|
|
38
43
|
css`
|
|
39
|
-
|
|
40
44
|
:host {
|
|
41
45
|
--pd-popup-max-width: 80%;
|
|
42
46
|
}
|
|
@@ -56,10 +60,9 @@ WizardReloadPopup.styles = [
|
|
|
56
60
|
}
|
|
57
61
|
|
|
58
62
|
.last-modified::before {
|
|
59
|
-
content:
|
|
63
|
+
content: "🕒";
|
|
60
64
|
margin-right: 6px;
|
|
61
65
|
}
|
|
62
|
-
|
|
63
66
|
`
|
|
64
67
|
];
|
|
65
68
|
__decorateClass([
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import UniversalRouter from "../../node_modules/universal-router/universal-router.js";
|
|
2
|
+
class PdRouterService {
|
|
3
|
+
constructor() {
|
|
4
|
+
this.router = null;
|
|
5
|
+
this.onChangeHandlers = [];
|
|
6
|
+
this.currentRoute = "";
|
|
7
|
+
this.isAuthenticatedWithSessionRedirect = async () => true;
|
|
8
|
+
window.addEventListener("popstate", () => {
|
|
9
|
+
this.resolve(location.pathname + location.search);
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
// Default-Fallback, falls nicht überschrieben
|
|
13
|
+
/**
|
|
14
|
+
* Setzt die Routen-Konfiguration. Muss vor Verwendung von navigate() aufgerufen werden.
|
|
15
|
+
*/
|
|
16
|
+
configureRoutes(definitions) {
|
|
17
|
+
console.log(
|
|
18
|
+
"############ CONFIGURE ROUTING SERVICE ##################",
|
|
19
|
+
definitions
|
|
20
|
+
);
|
|
21
|
+
definitions.forEach((def) => {
|
|
22
|
+
console.log(`[ROUTING] ${def.name}:`);
|
|
23
|
+
(Array.isArray(def.pattern) ? def.pattern : [def.pattern]).forEach(
|
|
24
|
+
(p, idx) => {
|
|
25
|
+
console.log(
|
|
26
|
+
` Pattern[${idx}]: "${p}" | Codes: ${[...p].map((c) => c.charCodeAt(0)).join(", ")}`
|
|
27
|
+
);
|
|
28
|
+
}
|
|
29
|
+
);
|
|
30
|
+
});
|
|
31
|
+
const universalRoutes = definitions.flatMap((def) => {
|
|
32
|
+
const patterns = Array.isArray(def.pattern) ? def.pattern : [def.pattern];
|
|
33
|
+
return patterns.map((pattern) => ({
|
|
34
|
+
path: pattern,
|
|
35
|
+
action: async (context) => {
|
|
36
|
+
if (def.auth && !await this.isAuthenticatedWithSessionRedirect(def.name)) {
|
|
37
|
+
const fallbackRoute = def.authFallback ?? "login";
|
|
38
|
+
return { route: fallbackRoute };
|
|
39
|
+
}
|
|
40
|
+
if (def.action) {
|
|
41
|
+
const result = await def.action();
|
|
42
|
+
if (result && typeof result === "object" && result.route) {
|
|
43
|
+
return { ...result, params: context.params };
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return {
|
|
47
|
+
route: def.name,
|
|
48
|
+
params: context.params
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
}));
|
|
52
|
+
});
|
|
53
|
+
this.router = new UniversalRouter(universalRoutes);
|
|
54
|
+
this.resolve(location.pathname + location.search);
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Navigiert zu einer neuen Route und triggert resolve()
|
|
58
|
+
*/
|
|
59
|
+
async navigate(path, force = false) {
|
|
60
|
+
const fullPath = new URL(path, window.location.origin).pathname + new URL(path, window.location.origin).search;
|
|
61
|
+
const current = window.location.pathname + window.location.search;
|
|
62
|
+
if (!force && current === fullPath) {
|
|
63
|
+
console.debug("[PdRouter] Navigation skipped (same path):", path);
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
history.pushState({}, "", path);
|
|
67
|
+
await this.resolve(path);
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Registriert einen Callback, der bei jeder Routenänderung aufgerufen wird
|
|
71
|
+
*/
|
|
72
|
+
onRouteChange(handler) {
|
|
73
|
+
this.onChangeHandlers.push(handler);
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Interne Methode zum Auflösen einer Route und Benachrichtigen aller Listener
|
|
77
|
+
*/
|
|
78
|
+
async resolve(path) {
|
|
79
|
+
if (!this.router) {
|
|
80
|
+
console.warn("[PdRouter] Router not yet configured");
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
const url = new URL(path, window.location.origin);
|
|
84
|
+
const pathname = url.pathname;
|
|
85
|
+
const query = Object.fromEntries(url.searchParams.entries());
|
|
86
|
+
try {
|
|
87
|
+
console.log(
|
|
88
|
+
"[PdRouter] bevore resolve Current location:",
|
|
89
|
+
location.pathname
|
|
90
|
+
);
|
|
91
|
+
const result = await this.router.resolve({ pathname });
|
|
92
|
+
if (!result || typeof result !== "object" || !result.route) {
|
|
93
|
+
console.warn("[PdRouter] Invalid route result:", result);
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
const routeInfo = {
|
|
97
|
+
route: result.route,
|
|
98
|
+
path: pathname,
|
|
99
|
+
params: result.params ?? {},
|
|
100
|
+
query
|
|
101
|
+
};
|
|
102
|
+
this.currentRoute = routeInfo.route;
|
|
103
|
+
this.onChangeHandlers.forEach((fn) => fn(routeInfo));
|
|
104
|
+
} catch (err) {
|
|
105
|
+
console.error("[PdRouter] Routing error:", err);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
const pdRouterService = new PdRouterService();
|
|
110
|
+
export {
|
|
111
|
+
pdRouterService
|
|
112
|
+
};
|
|
@@ -44,19 +44,26 @@ const uploadFirestorageFile = (file) => {
|
|
|
44
44
|
throw new Error(`Invalid storage name: ${storageName || DEFAULT_STORAGE}`);
|
|
45
45
|
}
|
|
46
46
|
if (!storageConf2.references || storageConf2.references.length === 0) {
|
|
47
|
-
throw new Error(
|
|
47
|
+
throw new Error(
|
|
48
|
+
`No references configured for storage: ${storageName || DEFAULT_STORAGE}`
|
|
49
|
+
);
|
|
48
50
|
}
|
|
49
|
-
const uploadRefConf = referenceKey ? storageConf2.references.filter(
|
|
51
|
+
const uploadRefConf = referenceKey ? storageConf2.references.filter(
|
|
52
|
+
(filterRef) => filterRef.key === referenceKey
|
|
53
|
+
)[0] : storageConf2.references[0];
|
|
50
54
|
if (!uploadRefConf || !uploadRefConf.storageRef) {
|
|
51
55
|
throw new Error(`No valid reference for key: ${referenceKey}`);
|
|
52
56
|
}
|
|
53
|
-
const fileRef = ref(
|
|
57
|
+
const fileRef = ref(
|
|
58
|
+
uploadRefConf.storageRef,
|
|
59
|
+
subFolderName ? `${subFolderName}/${fileName}` : fileName
|
|
60
|
+
);
|
|
54
61
|
const metadata = {
|
|
55
62
|
customMetadata: {
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
63
|
+
creator: (_a = getUser()) == null ? void 0 : _a.displayName,
|
|
64
|
+
comment: file.description,
|
|
65
|
+
name: file.descriptionName,
|
|
66
|
+
readonly: file.readonly ? "true" : "false"
|
|
60
67
|
}
|
|
61
68
|
};
|
|
62
69
|
return uploadString(fileRef, file.base64DataURL, "data_url", metadata);
|
|
@@ -112,7 +119,9 @@ const fetchItemsAndFolders = async (usedRef, storageName, refKey, includeMetaDat
|
|
|
112
119
|
}
|
|
113
120
|
if (includeMetaData) {
|
|
114
121
|
const metaResults = await Promise.all(metaPromises);
|
|
115
|
-
return itemRefs.map(
|
|
122
|
+
return itemRefs.map(
|
|
123
|
+
(item, index) => processMetadata(item, metaResults[index])
|
|
124
|
+
);
|
|
116
125
|
}
|
|
117
126
|
return itemRefs;
|
|
118
127
|
} catch (error) {
|
|
@@ -166,14 +175,26 @@ const getFirestorageFileList = (storageName, refKey, subFolder, includeMetaData)
|
|
|
166
175
|
throw new Error(`Invalid storage name: ${storageName}`);
|
|
167
176
|
}
|
|
168
177
|
if (!storageConf2.references || storageConf2.references.length === 0) {
|
|
169
|
-
throw new Error(
|
|
178
|
+
throw new Error(
|
|
179
|
+
`No references configured for storage: ${storageName || DEFAULT_STORAGE}`
|
|
180
|
+
);
|
|
170
181
|
}
|
|
171
|
-
const storageRef = storageConf2.references.filter(
|
|
182
|
+
const storageRef = storageConf2.references.filter(
|
|
183
|
+
(refIt) => refIt.key === refKey
|
|
184
|
+
)[0];
|
|
172
185
|
if (!storageRef) {
|
|
173
|
-
throw new Error(
|
|
186
|
+
throw new Error(
|
|
187
|
+
`No reference available for storage: ${storageName || DEFAULT_STORAGE} and ref: ${refKey}`
|
|
188
|
+
);
|
|
174
189
|
}
|
|
175
190
|
const usedRef = subFolder ? ref(storageRef.storageRef, subFolder) : storageRef.storageRef;
|
|
176
|
-
return fetchItemsAndFolders(
|
|
191
|
+
return fetchItemsAndFolders(
|
|
192
|
+
usedRef,
|
|
193
|
+
storageName,
|
|
194
|
+
refKey,
|
|
195
|
+
includeMetaData,
|
|
196
|
+
true
|
|
197
|
+
);
|
|
177
198
|
};
|
|
178
199
|
const downloadFileFirestorage = (file) => {
|
|
179
200
|
if (!storageMap || storageMap.size === 0) {
|
|
@@ -8,12 +8,14 @@ const initFirestore = (app) => {
|
|
|
8
8
|
}
|
|
9
9
|
};
|
|
10
10
|
const getFirebaseCollectionListener = (callback, col, constraints) => {
|
|
11
|
-
const queryConstraints = (constraints || []).map(
|
|
12
|
-
|
|
13
|
-
|
|
11
|
+
const queryConstraints = (constraints || []).map(
|
|
12
|
+
(constraint) => {
|
|
13
|
+
if (constraint.type === "where") {
|
|
14
|
+
return where(constraint.field, constraint.operator, constraint.value);
|
|
15
|
+
}
|
|
16
|
+
throw new Error(`Unkown constraint type: ${constraint.type}`);
|
|
14
17
|
}
|
|
15
|
-
|
|
16
|
-
});
|
|
18
|
+
);
|
|
17
19
|
const q = query(collection(db, col), ...queryConstraints);
|
|
18
20
|
return onSnapshot(q, (querySnapshot) => callback(querySnapshot));
|
|
19
21
|
};
|
|
@@ -43,15 +43,17 @@ const internalCallFunction = async (def, functionInput) => {
|
|
|
43
43
|
}
|
|
44
44
|
};
|
|
45
45
|
const handleInvalidUser = () => {
|
|
46
|
-
pdStore().dispatch(
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
46
|
+
pdStore().dispatch(
|
|
47
|
+
toastAction({
|
|
48
|
+
txt: msg(
|
|
49
|
+
"Sie haben nicht die erforderlichen Berechtigungen, um diese Aktion auszuführen. Wenden Sie sich an Ihren Administrator.",
|
|
50
|
+
{ id: "spaH.toast.error.user.invalid" }
|
|
51
|
+
),
|
|
52
|
+
isError: true,
|
|
53
|
+
isSuccess: false,
|
|
54
|
+
duration: -1
|
|
55
|
+
})
|
|
56
|
+
);
|
|
55
57
|
};
|
|
56
58
|
const callFunction = async (def, functionInput) => internalCallFunction(def, functionInput);
|
|
57
59
|
export {
|
|
@@ -29,20 +29,19 @@ const initMessageToken = async (registration) => {
|
|
|
29
29
|
if (!messaging || !firebaseMessagingAppConfigKey || !registration) {
|
|
30
30
|
throw new Error("Messaging, Registration or Key not available");
|
|
31
31
|
}
|
|
32
|
-
const currentToken = await getToken(
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
serviceWorkerRegistration: registration
|
|
37
|
-
}
|
|
38
|
-
);
|
|
32
|
+
const currentToken = await getToken(messaging, {
|
|
33
|
+
vapidKey: firebaseMessagingAppConfigKey.apidKey,
|
|
34
|
+
serviceWorkerRegistration: registration
|
|
35
|
+
});
|
|
39
36
|
if (currentToken) {
|
|
40
37
|
const storedToken = localStorage.getItem(NOTIFICATION_TOKEN);
|
|
41
38
|
if (storedToken !== currentToken) {
|
|
42
39
|
console.log("Update new token in Backend");
|
|
43
|
-
pdStore().dispatch(
|
|
44
|
-
|
|
45
|
-
|
|
40
|
+
pdStore().dispatch(
|
|
41
|
+
updateNewNotificationToken({
|
|
42
|
+
messagingToken: currentToken
|
|
43
|
+
})
|
|
44
|
+
);
|
|
46
45
|
} else {
|
|
47
46
|
console.log("RegisterDevice: Stored token is valid");
|
|
48
47
|
}
|
|
@@ -67,9 +67,13 @@ const uploadStorageFileMock = (file) => {
|
|
|
67
67
|
throw new Error(`Invalid storage name: ${storageName || DEFAULT_STORAGE}`);
|
|
68
68
|
}
|
|
69
69
|
if (!storageConf.references || storageConf.references.length === 0) {
|
|
70
|
-
throw new Error(
|
|
70
|
+
throw new Error(
|
|
71
|
+
`No references configured for storage: ${storageName || DEFAULT_STORAGE}`
|
|
72
|
+
);
|
|
71
73
|
}
|
|
72
|
-
const uploadRefConf = referenceKey ? storageConf.references.filter(
|
|
74
|
+
const uploadRefConf = referenceKey ? storageConf.references.filter(
|
|
75
|
+
(filterRef) => filterRef.key === referenceKey
|
|
76
|
+
)[0] : storageConf.references[0];
|
|
73
77
|
if (!uploadRefConf || !uploadRefConf.storageRef) {
|
|
74
78
|
throw new Error(`No valid reference for key: ${referenceKey}`);
|
|
75
79
|
}
|
|
@@ -81,14 +85,22 @@ const downloadFileMock = (file) => {
|
|
|
81
85
|
return Promise.resolve("");
|
|
82
86
|
};
|
|
83
87
|
const getMockFileList = (storageName, refKey, subFolder, includeMetadata) => {
|
|
84
|
-
console.log(
|
|
85
|
-
|
|
86
|
-
fileName: "workReport.png",
|
|
87
|
-
filePath: "workReports/1234234f2fswf/workReport.png",
|
|
88
|
-
documentType: "ToDo",
|
|
88
|
+
console.log(
|
|
89
|
+
"Searching for Documents in ",
|
|
89
90
|
storageName,
|
|
90
|
-
refKey
|
|
91
|
-
|
|
91
|
+
refKey,
|
|
92
|
+
subFolder,
|
|
93
|
+
includeMetadata
|
|
94
|
+
);
|
|
95
|
+
return Promise.resolve([
|
|
96
|
+
{
|
|
97
|
+
fileName: "workReport.png",
|
|
98
|
+
filePath: "workReports/1234234f2fswf/workReport.png",
|
|
99
|
+
documentType: "ToDo",
|
|
100
|
+
storageName,
|
|
101
|
+
refKey
|
|
102
|
+
}
|
|
103
|
+
]);
|
|
92
104
|
};
|
|
93
105
|
export {
|
|
94
106
|
downloadFileMock,
|
|
@@ -11,7 +11,9 @@ import { POST_LOGIN_REDIRECT_KEY } from "../PdSpaHelper.js";
|
|
|
11
11
|
let provider;
|
|
12
12
|
let app;
|
|
13
13
|
const throwUndefinedProviderError = () => {
|
|
14
|
-
throw new Error(
|
|
14
|
+
throw new Error(
|
|
15
|
+
"Undefined service provider, please check configuration. 'firebase' or 'mock' allowed here."
|
|
16
|
+
);
|
|
15
17
|
};
|
|
16
18
|
const setServiceProvider = (providerParam) => {
|
|
17
19
|
provider = providerParam;
|
|
@@ -36,17 +38,16 @@ const initFirebaseApplicationServices = (firebaseApp, config) => {
|
|
|
36
38
|
prepareMessaging(firebaseApp, config.messagingConfig);
|
|
37
39
|
console.debug("Set firebase app and config for messaging");
|
|
38
40
|
activateTokenChangeHandler(firebaseApp.name);
|
|
39
|
-
console.debug(
|
|
41
|
+
console.debug(
|
|
42
|
+
`idTokenChangeHandler for messaging and app ${firebaseApp.name} activated`
|
|
43
|
+
);
|
|
40
44
|
}
|
|
41
45
|
console.debug("Firebase initialized");
|
|
42
46
|
};
|
|
43
47
|
const initAppImpl = (config) => {
|
|
44
48
|
if (provider === "firebase" && config.firebaseConfig) {
|
|
45
49
|
app = initializeApp(config.firebaseConfig);
|
|
46
|
-
initFirebaseApplicationServices(
|
|
47
|
-
app,
|
|
48
|
-
config
|
|
49
|
-
);
|
|
50
|
+
initFirebaseApplicationServices(app, config);
|
|
50
51
|
} else if (provider === "mock") {
|
|
51
52
|
initMockResponse(config.mock);
|
|
52
53
|
initStorageMock("default", config.storageConfig);
|
|
@@ -56,12 +57,10 @@ const initAppImpl = (config) => {
|
|
|
56
57
|
};
|
|
57
58
|
const callFunctionImpl = async (def, functionInput) => {
|
|
58
59
|
if (provider === "firebase") {
|
|
59
|
-
|
|
60
|
-
return promise;
|
|
60
|
+
return callFunction(def, functionInput);
|
|
61
61
|
}
|
|
62
62
|
if (provider === "mock") {
|
|
63
|
-
|
|
64
|
-
return promise;
|
|
63
|
+
return callFunctionMock(def, functionInput);
|
|
65
64
|
}
|
|
66
65
|
return throwUndefinedProviderError();
|
|
67
66
|
};
|
|
@@ -136,7 +135,12 @@ const uploadFile = (file) => {
|
|
|
136
135
|
};
|
|
137
136
|
const getStorageFileList = (storageName, keyRef, subFolder, includeMetadata) => {
|
|
138
137
|
if (provider === "firebase") {
|
|
139
|
-
return getFirestorageFileList(
|
|
138
|
+
return getFirestorageFileList(
|
|
139
|
+
storageName,
|
|
140
|
+
keyRef,
|
|
141
|
+
subFolder,
|
|
142
|
+
includeMetadata
|
|
143
|
+
);
|
|
140
144
|
}
|
|
141
145
|
if (provider === "mock") {
|
|
142
146
|
return getMockFileList(storageName, keyRef, subFolder, includeMetadata);
|
|
@@ -145,12 +149,7 @@ const getStorageFileList = (storageName, keyRef, subFolder, includeMetadata) =>
|
|
|
145
149
|
};
|
|
146
150
|
const getStorageFile = (storageName, refKey, storageURI, includeMetaData) => {
|
|
147
151
|
if (provider === "firebase") {
|
|
148
|
-
return getFirestorageFile(
|
|
149
|
-
storageName,
|
|
150
|
-
refKey,
|
|
151
|
-
storageURI,
|
|
152
|
-
includeMetaData
|
|
153
|
-
);
|
|
152
|
+
return getFirestorageFile(storageName, refKey, storageURI, includeMetaData);
|
|
154
153
|
}
|
|
155
154
|
return throwUndefinedProviderError();
|
|
156
155
|
};
|
|
@@ -190,7 +189,9 @@ const registerAppDeviceForNotification = async (registration) => {
|
|
|
190
189
|
return registerDevice(registration);
|
|
191
190
|
}
|
|
192
191
|
if (provider === "mock") {
|
|
193
|
-
console.log(
|
|
192
|
+
console.log(
|
|
193
|
+
"registerAppDeviceForNotification not implemented for MOCK, do noting"
|
|
194
|
+
);
|
|
194
195
|
return Promise.resolve();
|
|
195
196
|
}
|
|
196
197
|
return throwUndefinedProviderError();
|
|
@@ -3,14 +3,38 @@ const initIndexDBSucess = action("SPA_INIT_INDEX_DB_SUCCESS");
|
|
|
3
3
|
const loginSucess = action("SPA_LOGIN_SUCCESS");
|
|
4
4
|
const nologin = action("SPA_NO_LOGIN");
|
|
5
5
|
const routeAction = action("SPA_APP_ROUTE", payload());
|
|
6
|
-
const toastAction = action(
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
const
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
6
|
+
const toastAction = action(
|
|
7
|
+
"SPA_APP_TOAST",
|
|
8
|
+
payload()
|
|
9
|
+
);
|
|
10
|
+
const updateInternetOffline = action(
|
|
11
|
+
"SPA_APP_UPDATE_INTERNET_OFFLINE",
|
|
12
|
+
payload()
|
|
13
|
+
);
|
|
14
|
+
const addLoadingState = action(
|
|
15
|
+
"SPA_APP_ADD_LOADING",
|
|
16
|
+
payload()
|
|
17
|
+
);
|
|
18
|
+
const changeSubTask = action(
|
|
19
|
+
"SPA_APP_CHANGE_SUB_LOADING",
|
|
20
|
+
payload()
|
|
21
|
+
);
|
|
22
|
+
const removeLoadingState = action(
|
|
23
|
+
"SPA_APP_REMOVE_LOADING",
|
|
24
|
+
payload()
|
|
25
|
+
);
|
|
26
|
+
const updateNewNotificationToken = action(
|
|
27
|
+
"UPDATE_NOTIFICATION_TOKEN",
|
|
28
|
+
payload()
|
|
29
|
+
);
|
|
30
|
+
const updateNewNotificationTokenSuccess = action(
|
|
31
|
+
"UPDATE_NOTIFICATION_TOKEN_SUCCESS",
|
|
32
|
+
payload()
|
|
33
|
+
);
|
|
34
|
+
const updateNewNotificationTokenFail = action(
|
|
35
|
+
"UPDATE_NOTIFICATION_TOKEN_FAIL",
|
|
36
|
+
payload()
|
|
37
|
+
);
|
|
14
38
|
export {
|
|
15
39
|
addLoadingState,
|
|
16
40
|
changeSubTask,
|
|
@@ -14,11 +14,13 @@ const appRouteEffect = createEffect(
|
|
|
14
14
|
if (!routeElement) {
|
|
15
15
|
console.error("No route element set for appRouteEffect");
|
|
16
16
|
} else {
|
|
17
|
-
routeElement.dispatchEvent(
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
17
|
+
routeElement.dispatchEvent(
|
|
18
|
+
new CustomEvent("route-event", {
|
|
19
|
+
detail: { route: action.payload },
|
|
20
|
+
bubbles: true,
|
|
21
|
+
composed: true
|
|
22
|
+
})
|
|
23
|
+
);
|
|
22
24
|
}
|
|
23
25
|
})
|
|
24
26
|
),
|
|
@@ -33,16 +35,18 @@ const appToastEffect = createEffect(
|
|
|
33
35
|
if (!routeElement) {
|
|
34
36
|
console.error("No route element set for appToastEffect");
|
|
35
37
|
} else {
|
|
36
|
-
routeElement.dispatchEvent(
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
38
|
+
routeElement.dispatchEvent(
|
|
39
|
+
new CustomEvent("toast-event", {
|
|
40
|
+
detail: {
|
|
41
|
+
txt: action.payload.txt,
|
|
42
|
+
isSuccess: action.payload.isSuccess,
|
|
43
|
+
isError: action.payload.isError,
|
|
44
|
+
duration: action.payload.duration
|
|
45
|
+
},
|
|
46
|
+
bubbles: true,
|
|
47
|
+
composed: true
|
|
48
|
+
})
|
|
49
|
+
);
|
|
46
50
|
}
|
|
47
51
|
})
|
|
48
52
|
),
|