@progressive-development/pd-spa-helper 0.9.2 → 1.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/dist/PdSpaHelper.d.ts +83 -0
- package/dist/PdSpaHelper.d.ts.map +1 -0
- package/dist/PdSpaHelper.js +492 -0
- package/dist/defaultpage/default-confirm-popup.d.ts +19 -0
- package/dist/defaultpage/default-confirm-popup.d.ts.map +1 -0
- package/dist/defaultpage/default-confirm-popup.js +70 -0
- package/dist/defaultpage/default-dialog-popup.d.ts +19 -0
- package/dist/defaultpage/default-dialog-popup.d.ts.map +1 -0
- package/dist/defaultpage/default-dialog-popup.js +103 -0
- package/dist/defaultpage/default-login.d.ts +6 -0
- package/dist/defaultpage/default-login.d.ts.map +1 -0
- package/dist/defaultpage/default-login.js +33 -0
- package/dist/defaultpage/default-not-found.d.ts +6 -0
- package/dist/defaultpage/default-not-found.d.ts.map +1 -0
- package/dist/{components/default-not-found/DefaultNotFound.js → defaultpage/default-not-found.js} +3 -10
- package/dist/defaultpage/default-popup.d.ts +7 -0
- package/dist/defaultpage/default-popup.d.ts.map +1 -0
- package/dist/defaultpage/default-popup.js +24 -0
- package/dist/defaultpage/default-step-address.d.ts +14 -0
- package/dist/defaultpage/default-step-address.d.ts.map +1 -0
- package/dist/defaultpage/default-step-address.js +77 -0
- package/dist/defaultpage/default-step-summary.d.ts +28 -0
- package/dist/defaultpage/default-step-summary.d.ts.map +1 -0
- package/dist/defaultpage/default-step-summary.js +67 -0
- package/dist/defaultpage/default-view-page.d.ts +10 -0
- package/dist/defaultpage/default-view-page.d.ts.map +1 -0
- package/dist/defaultpage/default-view-page.js +70 -0
- package/dist/defaultpage/default-wizard.d.ts +37 -0
- package/dist/defaultpage/default-wizard.d.ts.map +1 -0
- package/dist/defaultpage/default-wizard.js +255 -0
- package/dist/defaultpage/pd-default-wizard-step.d.ts +60 -0
- package/dist/defaultpage/pd-default-wizard-step.d.ts.map +1 -0
- package/dist/defaultpage/pd-default-wizard-step.js +144 -0
- package/dist/generated/locale-wrapper/be-wrapper.d.ts +14 -49
- package/dist/generated/locale-wrapper/be-wrapper.d.ts.map +1 -1
- package/dist/generated/locale-wrapper/de-wrapper.d.ts +14 -49
- package/dist/generated/locale-wrapper/de-wrapper.d.ts.map +1 -1
- package/dist/generated/locale-wrapper/en-wrapper.d.ts +14 -49
- package/dist/generated/locale-wrapper/en-wrapper.d.ts.map +1 -1
- package/dist/generated/locales/be.d.ts +15 -1
- package/dist/generated/locales/be.d.ts.map +1 -1
- package/dist/generated/locales/be.js +15 -1
- package/dist/generated/locales/de.d.ts +15 -1
- package/dist/generated/locales/de.d.ts.map +1 -1
- package/dist/generated/locales/de.js +15 -1
- package/dist/generated/locales/en.d.ts +15 -1
- package/dist/generated/locales/en.d.ts.map +1 -1
- package/dist/generated/locales/en.js +15 -1
- package/dist/helper/blob-helper.d.ts +3 -0
- package/dist/helper/blob-helper.d.ts.map +1 -0
- package/dist/helper/blob-helper.js +35 -0
- package/dist/helper/date-helper.d.ts +27 -0
- package/dist/helper/date-helper.d.ts.map +1 -0
- package/dist/helper/date-helper.js +129 -0
- package/dist/helper/locale-format.d.ts +4 -0
- package/dist/helper/locale-format.d.ts.map +1 -0
- package/dist/helper/locale-format.js +16 -0
- package/dist/helper/logger.d.ts +12 -11
- package/dist/helper/logger.d.ts.map +1 -1
- package/dist/helper/logger.js +49 -10
- package/dist/helper/number-helper.d.ts +2 -0
- package/dist/helper/number-helper.d.ts.map +1 -0
- package/dist/helper/number-helper.js +13 -0
- package/dist/helper/price-helper.d.ts +5 -0
- package/dist/helper/price-helper.d.ts.map +1 -0
- package/dist/helper/price-helper.js +22 -0
- package/dist/helper/refresh-id-token.d.ts.map +1 -1
- package/dist/helper/refresh-id-token.js +4 -6
- package/dist/helper/text-helper.d.ts +3 -0
- package/dist/helper/text-helper.d.ts.map +1 -0
- package/dist/helper/text-helper.js +4 -0
- package/dist/index.d.ts +29 -31
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +50 -27
- package/dist/model/spa-model.d.ts +15 -14
- package/dist/model/spa-model.d.ts.map +1 -1
- package/dist/popup/wizard-close-popup.d.ts +11 -0
- package/dist/popup/wizard-close-popup.d.ts.map +1 -0
- package/dist/popup/wizard-close-popup.js +63 -0
- package/dist/popup/wizard-reload-popup.d.ts +14 -0
- package/dist/popup/wizard-reload-popup.d.ts.map +1 -0
- package/dist/popup/wizard-reload-popup.js +76 -0
- package/dist/router/PdRouterService.d.ts +1 -4
- package/dist/router/PdRouterService.d.ts.map +1 -1
- package/dist/router/PdRouterService.js +16 -40
- package/dist/service-provider/firebase/auth.d.ts +19 -0
- package/dist/service-provider/firebase/auth.d.ts.map +1 -0
- package/dist/service-provider/firebase/auth.js +62 -0
- package/dist/service-provider/firebase/firestorage-client.d.ts +22 -0
- package/dist/service-provider/firebase/firestorage-client.d.ts.map +1 -0
- package/dist/service-provider/firebase/firestorage-client.js +226 -0
- package/dist/service-provider/firebase/firestore-client.d.ts +12 -0
- package/dist/service-provider/firebase/firestore-client.d.ts.map +1 -0
- package/dist/service-provider/firebase/firestore-client.js +25 -0
- package/dist/service-provider/firebase/functions-client.d.ts +10 -0
- package/dist/service-provider/firebase/functions-client.d.ts.map +1 -0
- package/dist/service-provider/firebase/functions-client.js +63 -0
- package/dist/service-provider/firebase/messagingFirebaseClient.d.ts +9 -0
- package/dist/service-provider/firebase/messagingFirebaseClient.d.ts.map +1 -0
- package/dist/service-provider/firebase/messagingFirebaseClient.js +69 -0
- package/dist/service-provider/mock/auth.d.ts +6 -0
- package/dist/service-provider/mock/auth.d.ts.map +1 -0
- package/dist/service-provider/mock/auth.js +60 -0
- package/dist/service-provider/mock/function-client.d.ts +7 -0
- package/dist/service-provider/mock/function-client.d.ts.map +1 -0
- package/dist/service-provider/mock/function-client.js +30 -0
- package/dist/service-provider/mock/storage-client.d.ts +11 -0
- package/dist/service-provider/mock/storage-client.d.ts.map +1 -0
- package/dist/service-provider/mock/storage-client.js +106 -0
- package/dist/service-provider/service-provider-impl.d.ts +27 -0
- package/dist/service-provider/service-provider-impl.d.ts.map +1 -0
- package/dist/service-provider/service-provider-impl.js +222 -0
- package/dist/service-provider/service-provider-model.d.ts +10 -55
- package/dist/service-provider/service-provider-model.d.ts.map +1 -1
- package/dist/{db → store}/indexDB.d.ts +9 -9
- package/dist/store/indexDB.d.ts.map +1 -0
- package/dist/{db → store}/indexDB.js +12 -14
- package/dist/store/mini-rx.store.d.ts.map +1 -1
- package/dist/store/mini-rx.store.js +3 -1
- package/dist/store/spa-app-actions.d.ts +22 -5
- package/dist/store/spa-app-actions.d.ts.map +1 -1
- package/dist/store/spa-app-actions.js +8 -4
- package/dist/store/spa-app-effects.d.ts +17 -0
- package/dist/store/spa-app-effects.d.ts.map +1 -1
- package/dist/store/spa-app-effects.js +40 -2
- package/dist/store/spa-app-reducer.d.ts +10 -5
- package/dist/store/spa-app-reducer.d.ts.map +1 -1
- package/dist/store/spa-app-reducer.js +8 -13
- package/dist/store/spa-app-selector.d.ts +2 -2
- package/dist/store/spa-app-selector.d.ts.map +1 -1
- package/dist/store/spa-app-selector.js +1 -1
- package/dist/stories/address-edit.stories.d.ts +27 -0
- package/dist/stories/address-edit.stories.d.ts.map +1 -0
- package/dist/stories/address-new.stories.d.ts +33 -0
- package/dist/stories/address-new.stories.d.ts.map +1 -0
- package/dist/stories/default-confirm-popup.stories.d.ts +24 -0
- package/dist/stories/default-confirm-popup.stories.d.ts.map +1 -0
- package/dist/stories/default-dialog-popup.stories.d.ts +23 -0
- package/dist/stories/default-dialog-popup.stories.d.ts.map +1 -0
- package/dist/stories/default-login.stories.d.ts +10 -0
- package/dist/stories/default-login.stories.d.ts.map +1 -0
- package/dist/stories/default-popup.stories.d.ts +9 -0
- package/dist/stories/default-popup.stories.d.ts.map +1 -0
- package/dist/stories/pd-loading-state.stories.d.ts +30 -0
- package/dist/stories/pd-loading-state.stories.d.ts.map +1 -0
- package/dist/stories/pd-toast.stories.d.ts +27 -0
- package/dist/stories/pd-toast.stories.d.ts.map +1 -0
- package/dist/stories/routing.stories.d.ts +24 -0
- package/dist/stories/routing.stories.d.ts.map +1 -0
- package/dist/stories/test-impls/address-test.d.ts +6 -0
- package/dist/stories/test-impls/address-test.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/stories/test-impls/test-pages/test-wizard-step.d.ts +17 -0
- package/dist/stories/test-impls/test-pages/test-wizard-step.d.ts.map +1 -0
- package/dist/stories/test-impls/test-pages/test-wizard.d.ts +16 -0
- package/dist/stories/test-impls/test-pages/test-wizard.d.ts.map +1 -0
- package/dist/stories/test-impls/test-popups/default-confirm-popup-test-error.d.ts +8 -0
- package/dist/stories/test-impls/test-popups/default-confirm-popup-test-error.d.ts.map +1 -0
- package/dist/stories/test-impls/test-popups/default-confirm-popup-test-info.d.ts +8 -0
- package/dist/stories/test-impls/test-popups/default-confirm-popup-test-info.d.ts.map +1 -0
- package/dist/stories/test-impls/test-popups/default-confirm-popup-test-warn.d.ts +8 -0
- package/dist/stories/test-impls/test-popups/default-confirm-popup-test-warn.d.ts.map +1 -0
- package/dist/stories/test-impls/test-popups/default-dialog-popup-test.d.ts +13 -0
- package/dist/stories/test-impls/test-popups/default-dialog-popup-test.d.ts.map +1 -0
- package/dist/stories/test-impls/test-popups/default-popup-test.d.ts +5 -0
- package/dist/stories/test-impls/test-popups/default-popup-test.d.ts.map +1 -0
- package/dist/stories/test-wizard-step.stories.d.ts +11 -0
- package/dist/stories/test-wizard-step.stories.d.ts.map +1 -0
- package/dist/stories/test-wizard.stories.d.ts +9 -0
- package/dist/stories/test-wizard.stories.d.ts.map +1 -0
- package/dist/tmpown/pd-loading-state.d.ts +9 -0
- package/dist/tmpown/pd-loading-state.d.ts.map +1 -0
- package/dist/tmpown/pd-loading-state.js +196 -0
- package/dist/tmpown/pd-login.d.ts +13 -0
- package/dist/tmpown/pd-login.d.ts.map +1 -0
- package/dist/tmpown/pd-login.js +165 -0
- package/dist/tmpown/pd-toast.d.ts +13 -0
- package/dist/tmpown/pd-toast.d.ts.map +1 -0
- package/dist/tmpown/pd-toast.js +127 -0
- package/package.json +9 -14
- package/dist/auth/AuthController.d.ts +0 -37
- package/dist/auth/AuthController.d.ts.map +0 -1
- package/dist/auth/AuthController.js +0 -65
- package/dist/auth/auth-directives.d.ts +0 -59
- package/dist/auth/auth-directives.d.ts.map +0 -1
- package/dist/auth/auth-directives.js +0 -81
- package/dist/auth/auth-utils.d.ts +0 -45
- package/dist/auth/auth-utils.d.ts.map +0 -1
- package/dist/auth/auth-utils.js +0 -42
- package/dist/auth/index.d.ts +0 -7
- package/dist/auth/index.d.ts.map +0 -1
- package/dist/components/default-login/DefaultLogin.d.ts +0 -15
- package/dist/components/default-login/DefaultLogin.d.ts.map +0 -1
- package/dist/components/default-login/DefaultLogin.js +0 -120
- package/dist/components/default-not-found/DefaultNotFound.d.ts +0 -6
- package/dist/components/default-not-found/DefaultNotFound.d.ts.map +0 -1
- package/dist/components/pd-section-page/PdSectionPage.d.ts +0 -55
- package/dist/components/pd-section-page/PdSectionPage.d.ts.map +0 -1
- package/dist/components/pd-section-page/PdSectionPage.js +0 -37
- package/dist/components/pd-spa-helper/PdSpaHelper.d.ts +0 -196
- package/dist/components/pd-spa-helper/PdSpaHelper.d.ts.map +0 -1
- package/dist/components/pd-spa-helper/PdSpaHelper.js +0 -603
- package/dist/components/pd-spa-helper/controllers/ScrollController.d.ts +0 -77
- package/dist/components/pd-spa-helper/controllers/ScrollController.d.ts.map +0 -1
- package/dist/components/pd-spa-helper/controllers/ScrollController.js +0 -102
- package/dist/components/pd-spa-helper/spa-config.d.ts +0 -95
- package/dist/components/pd-spa-helper/spa-config.d.ts.map +0 -1
- package/dist/components/pd-spa-helper/spa-config.js +0 -175
- package/dist/components/pd-spa-helper/spa-events.d.ts +0 -132
- package/dist/components/pd-spa-helper/spa-events.d.ts.map +0 -1
- package/dist/components/pd-spa-helper/spa-events.js +0 -18
- package/dist/db/index.d.ts +0 -3
- package/dist/db/index.d.ts.map +0 -1
- package/dist/db/indexDB.d.ts.map +0 -1
- package/dist/model/index.d.ts +0 -4
- package/dist/model/index.d.ts.map +0 -1
- package/dist/router/index.d.ts +0 -3
- package/dist/router/index.d.ts.map +0 -1
- package/dist/screen-size/ScreenSizeController.d.ts +0 -34
- package/dist/screen-size/ScreenSizeController.d.ts.map +0 -1
- package/dist/screen-size/ScreenSizeController.js +0 -58
- package/dist/screen-size/ScreenSizeService.d.ts +0 -49
- package/dist/screen-size/ScreenSizeService.d.ts.map +0 -1
- package/dist/screen-size/ScreenSizeService.js +0 -107
- package/dist/screen-size/index.d.ts +0 -13
- package/dist/screen-size/index.d.ts.map +0 -1
- package/dist/screen-size/responsive-directives.d.ts +0 -59
- package/dist/screen-size/responsive-directives.d.ts.map +0 -1
- package/dist/screen-size/responsive-directives.js +0 -71
- package/dist/screen-size/types.d.ts +0 -44
- package/dist/screen-size/types.d.ts.map +0 -1
- package/dist/service-provider/ServiceRegistry.d.ts +0 -67
- package/dist/service-provider/ServiceRegistry.d.ts.map +0 -1
- package/dist/service-provider/ServiceRegistry.js +0 -76
- package/dist/service-provider/function-utils.d.ts +0 -55
- package/dist/service-provider/function-utils.d.ts.map +0 -1
- package/dist/service-provider/function-utils.js +0 -30
- package/dist/service-provider/index.d.ts +0 -10
- package/dist/service-provider/index.d.ts.map +0 -1
- package/dist/service-provider/interfaces/IAuthProvider.d.ts +0 -68
- package/dist/service-provider/interfaces/IAuthProvider.d.ts.map +0 -1
- package/dist/service-provider/interfaces/IDatabaseProvider.d.ts +0 -75
- package/dist/service-provider/interfaces/IDatabaseProvider.d.ts.map +0 -1
- package/dist/service-provider/interfaces/IFunctionProvider.d.ts +0 -49
- package/dist/service-provider/interfaces/IFunctionProvider.d.ts.map +0 -1
- package/dist/service-provider/interfaces/IStorageProvider.d.ts +0 -118
- package/dist/service-provider/interfaces/IStorageProvider.d.ts.map +0 -1
- package/dist/service-provider/interfaces/ServiceProvider.d.ts +0 -24
- package/dist/service-provider/interfaces/ServiceProvider.d.ts.map +0 -1
- package/dist/service-provider/interfaces/common.d.ts +0 -5
- package/dist/service-provider/interfaces/common.d.ts.map +0 -1
- package/dist/services/fire-once-service.d.ts +0 -35
- package/dist/services/fire-once-service.d.ts.map +0 -1
- package/dist/services/fire-once-service.js +0 -61
- package/dist/store/async-action-effects.d.ts +0 -179
- package/dist/store/async-action-effects.d.ts.map +0 -1
- package/dist/store/async-action-effects.js +0 -98
- package/dist/store/async-action-utils.d.ts +0 -154
- package/dist/store/async-action-utils.d.ts.map +0 -1
- package/dist/store/async-action-utils.js +0 -42
- package/dist/store/index.d.ts +0 -9
- package/dist/store/index.d.ts.map +0 -1
- package/dist/stories/introduction.stories.d.ts +0 -11
- package/dist/stories/introduction.stories.d.ts.map +0 -1
|
@@ -1,603 +0,0 @@
|
|
|
1
|
-
import { LitElement, css, html } from 'lit';
|
|
2
|
-
import { property, state } from 'lit/decorators.js';
|
|
3
|
-
import { styleMap } from 'lit/directives/style-map.js';
|
|
4
|
-
import '@progressive-development/pd-page/pd-site-header';
|
|
5
|
-
import '@progressive-development/pd-page/pd-footer';
|
|
6
|
-
import { mapMenuBg, mapFooterBg, toastBus } from '@progressive-development/pd-page';
|
|
7
|
-
import { pdStore } from '../../store/mini-rx.store.js';
|
|
8
|
-
import { services } from '../../service-provider/ServiceRegistry.js';
|
|
9
|
-
import { getLoadingSelector } from '../../store/spa-app-selector.js';
|
|
10
|
-
import { setRouteElement } from '../../store/spa-app-effects.js';
|
|
11
|
-
import { loginSuccess, nologin, logoutSuccess } from '../../store/spa-app-actions.js';
|
|
12
|
-
import { setCurrentFormatLocale } from '@progressive-development/pd-utils';
|
|
13
|
-
import { pdRouterService, POST_LOGIN_REDIRECT_KEY } from '../../router/PdRouterService.js';
|
|
14
|
-
import { createLogger } from '../../helper/logger.js';
|
|
15
|
-
import { spaConfig } from './spa-config.js';
|
|
16
|
-
import { SPA_EVENTS, dispatchInit } from './spa-events.js';
|
|
17
|
-
import { ScrollController } from './controllers/ScrollController.js';
|
|
18
|
-
import { fireOnceService } from '../../services/fire-once-service.js';
|
|
19
|
-
import '../default-login/DefaultLogin.js';
|
|
20
|
-
import '../default-not-found/DefaultNotFound.js';
|
|
21
|
-
import '@progressive-development/pd-page/pd-toast';
|
|
22
|
-
import '@progressive-development/pd-content/pd-loading-state';
|
|
23
|
-
import '@progressive-development/pd-dialog/pd-popup';
|
|
24
|
-
|
|
25
|
-
var __defProp = Object.defineProperty;
|
|
26
|
-
var __decorateClass = (decorators, target, key, kind) => {
|
|
27
|
-
var result = void 0 ;
|
|
28
|
-
for (var i = decorators.length - 1, decorator; i >= 0; i--)
|
|
29
|
-
if (decorator = decorators[i])
|
|
30
|
-
result = (decorator(target, key, result) ) || result;
|
|
31
|
-
if (result) __defProp(target, key, result);
|
|
32
|
-
return result;
|
|
33
|
-
};
|
|
34
|
-
const MADE_BY = {
|
|
35
|
-
txt: "made by PD Progressive Development",
|
|
36
|
-
email: "info@progressive-development.com"
|
|
37
|
-
};
|
|
38
|
-
const spaLogger = createLogger("PdSpaHelper");
|
|
39
|
-
const startInit = (config) => {
|
|
40
|
-
spaLogger.debug("Starting SPA initialization", config);
|
|
41
|
-
spaConfig.initialize(config);
|
|
42
|
-
dispatchInit();
|
|
43
|
-
spaLogger.debug("SPA initialization complete");
|
|
44
|
-
};
|
|
45
|
-
const THRESHOLD_DEFAULT = 100;
|
|
46
|
-
class PdSpaHelper extends LitElement {
|
|
47
|
-
// ---------------------------------------------------------------------------
|
|
48
|
-
// Lifecycle
|
|
49
|
-
// ---------------------------------------------------------------------------
|
|
50
|
-
constructor() {
|
|
51
|
-
super();
|
|
52
|
-
// ---------------------------------------------------------------------------
|
|
53
|
-
// Controllers
|
|
54
|
-
// ---------------------------------------------------------------------------
|
|
55
|
-
/** Controller for scroll threshold detection (teaser collapse) */
|
|
56
|
-
this.scrollController = new ScrollController(this, {
|
|
57
|
-
threshold: THRESHOLD_DEFAULT,
|
|
58
|
-
// Default, synced with teaserCollapseThreshold property
|
|
59
|
-
onScrolledDown: () => {
|
|
60
|
-
this.teaserCollapsed = true;
|
|
61
|
-
},
|
|
62
|
-
onScrolledUp: () => {
|
|
63
|
-
this.teaserCollapsed = false;
|
|
64
|
-
}
|
|
65
|
-
});
|
|
66
|
-
this.title = "PD SPA";
|
|
67
|
-
this.teaserCollapseThreshold = THRESHOLD_DEFAULT;
|
|
68
|
-
this._loadingState = [];
|
|
69
|
-
this._route = "";
|
|
70
|
-
this._params = {};
|
|
71
|
-
this._query = {};
|
|
72
|
-
this.teaserCollapsed = false;
|
|
73
|
-
this._skipTeaserTransition = false;
|
|
74
|
-
/** Pending section ID for navigate-and-scroll (stored until init-menu-sections fires) */
|
|
75
|
-
this._pendingScrollSectionId = null;
|
|
76
|
-
this._claims = {};
|
|
77
|
-
/** Whether to show locale selector in single menu only */
|
|
78
|
-
this._singleLocaleMenu = false;
|
|
79
|
-
/** Track previous auth state to detect real transitions (not initial load) */
|
|
80
|
-
this._previousAuthState = "unknown";
|
|
81
|
-
// ---------------------------------------------------------------------------
|
|
82
|
-
// Section Actions (lazy loading via section visibility)
|
|
83
|
-
// ---------------------------------------------------------------------------
|
|
84
|
-
/** Map of section IDs to action creator functions */
|
|
85
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
86
|
-
this._sectionActions = /* @__PURE__ */ new Map();
|
|
87
|
-
setRouteElement(this);
|
|
88
|
-
document.addEventListener(SPA_EVENTS.INIT, () => {
|
|
89
|
-
spaLogger.debug("SPA init event received");
|
|
90
|
-
});
|
|
91
|
-
if (spaConfig.includesLogin) {
|
|
92
|
-
spaLogger.debug("Login included, activating login handler");
|
|
93
|
-
this._activateLoginHandler();
|
|
94
|
-
}
|
|
95
|
-
this.addEventListener(
|
|
96
|
-
"route-event",
|
|
97
|
-
this._handleRouteEvent
|
|
98
|
-
);
|
|
99
|
-
this.addEventListener("pd-action", this._handlePdAction);
|
|
100
|
-
}
|
|
101
|
-
static {
|
|
102
|
-
// ---------------------------------------------------------------------------
|
|
103
|
-
// Styles
|
|
104
|
-
// ---------------------------------------------------------------------------
|
|
105
|
-
this.styles = css`
|
|
106
|
-
/* ═══════════════════════════════════════════════════════════════════════
|
|
107
|
-
CSS CUSTOM PROPERTIES
|
|
108
|
-
═══════════════════════════════════════════════════════════════════════ */
|
|
109
|
-
:host {
|
|
110
|
-
/* Single header height variable — set by pd-site-header height-change event */
|
|
111
|
-
--pd-site-header-height: 90px;
|
|
112
|
-
|
|
113
|
-
/* Layout */
|
|
114
|
-
display: flex;
|
|
115
|
-
flex-flow: column;
|
|
116
|
-
height: 100%;
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
/* ═══════════════════════════════════════════════════════════════════════
|
|
120
|
-
HEADER
|
|
121
|
-
═══════════════════════════════════════════════════════════════════════ */
|
|
122
|
-
header {
|
|
123
|
-
flex-grow: 0;
|
|
124
|
-
position: fixed;
|
|
125
|
-
top: 0;
|
|
126
|
-
width: 100%;
|
|
127
|
-
z-index: 99;
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
/* ═══════════════════════════════════════════════════════════════════════
|
|
131
|
-
FOOTER
|
|
132
|
-
═══════════════════════════════════════════════════════════════════════ */
|
|
133
|
-
footer {
|
|
134
|
-
flex-grow: 0;
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
/* ═══════════════════════════════════════════════════════════════════════
|
|
138
|
-
MAIN CONTENT
|
|
139
|
-
═══════════════════════════════════════════════════════════════════════ */
|
|
140
|
-
main {
|
|
141
|
-
flex-grow: 1;
|
|
142
|
-
flex-basis: max-content;
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
header + main {
|
|
146
|
-
padding-top: var(--pd-site-header-height, 90px);
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
/* ═══════════════════════════════════════════════════════════════════════
|
|
150
|
-
LOGIN MODAL
|
|
151
|
-
═══════════════════════════════════════════════════════════════════════ */
|
|
152
|
-
.login-modal {
|
|
153
|
-
--pd-popup-default-display: block;
|
|
154
|
-
--pd-popup-content-bg: var(--pd-default-bg-light-col);
|
|
155
|
-
}
|
|
156
|
-
`;
|
|
157
|
-
}
|
|
158
|
-
connectedCallback() {
|
|
159
|
-
super.connectedCallback();
|
|
160
|
-
pdRouterService.onRouteChange(({ route, params, query }) => {
|
|
161
|
-
const isRouteChange = route !== this._route;
|
|
162
|
-
const isLoginModal = route === "login";
|
|
163
|
-
if (isRouteChange && !isLoginModal) {
|
|
164
|
-
this.scrollController.scrollToTop();
|
|
165
|
-
}
|
|
166
|
-
this._route = route;
|
|
167
|
-
this._params = params;
|
|
168
|
-
this._query = query;
|
|
169
|
-
});
|
|
170
|
-
this._subscription = pdStore().select(getLoadingSelector).subscribe((loadingState) => {
|
|
171
|
-
this._loadingState = loadingState;
|
|
172
|
-
});
|
|
173
|
-
this.addEventListener(
|
|
174
|
-
SPA_EVENTS.APP_CONFIG,
|
|
175
|
-
this._handleAppConfigEvent
|
|
176
|
-
);
|
|
177
|
-
this.addEventListener(
|
|
178
|
-
"section-activated",
|
|
179
|
-
this._handleSectionActivated
|
|
180
|
-
);
|
|
181
|
-
this.scrollController.setThreshold(this.teaserCollapseThreshold);
|
|
182
|
-
}
|
|
183
|
-
disconnectedCallback() {
|
|
184
|
-
this._subscription?.unsubscribe();
|
|
185
|
-
this.removeEventListener(
|
|
186
|
-
SPA_EVENTS.APP_CONFIG,
|
|
187
|
-
this._handleAppConfigEvent
|
|
188
|
-
);
|
|
189
|
-
this.removeEventListener(
|
|
190
|
-
"section-activated",
|
|
191
|
-
this._handleSectionActivated
|
|
192
|
-
);
|
|
193
|
-
super.disconnectedCallback();
|
|
194
|
-
}
|
|
195
|
-
willUpdate(changedProps) {
|
|
196
|
-
super.willUpdate(changedProps);
|
|
197
|
-
if (changedProps.has("_route") && this._route) {
|
|
198
|
-
const pageConf = spaConfig.getNavigationPage(this._route);
|
|
199
|
-
const hasTeaser = !!pageConf?.withTeaser && this._hasTeaserContent();
|
|
200
|
-
this.scrollController.setTeaserCollapseEnabled(hasTeaser);
|
|
201
|
-
if (this._pendingScrollSectionId) {
|
|
202
|
-
this.teaserCollapsed = true;
|
|
203
|
-
this._skipTeaserTransition = true;
|
|
204
|
-
} else {
|
|
205
|
-
this._skipTeaserTransition = false;
|
|
206
|
-
this.teaserCollapsed = !hasTeaser;
|
|
207
|
-
}
|
|
208
|
-
}
|
|
209
|
-
}
|
|
210
|
-
// ---------------------------------------------------------------------------
|
|
211
|
-
// Render
|
|
212
|
-
// ---------------------------------------------------------------------------
|
|
213
|
-
render() {
|
|
214
|
-
if (this._route === "") {
|
|
215
|
-
return this._renderLoading();
|
|
216
|
-
}
|
|
217
|
-
const isLoginModal = this._route === "login";
|
|
218
|
-
const configRoute = isLoginModal ? pdRouterService.previousRoute || "home" : this._route;
|
|
219
|
-
const pageConf = spaConfig.getNavigationPage(configRoute);
|
|
220
|
-
const showTeaser = !!pageConf?.withTeaser && this._hasTeaserContent();
|
|
221
|
-
return this._renderLayout(pageConf, showTeaser);
|
|
222
|
-
}
|
|
223
|
-
/**
|
|
224
|
-
* Render the loading state while route is being resolved
|
|
225
|
-
* Can be overridden by subclass
|
|
226
|
-
*/
|
|
227
|
-
_renderLoading() {
|
|
228
|
-
return html`<slot name="loading"><p>Loading...</p></slot>`;
|
|
229
|
-
}
|
|
230
|
-
/**
|
|
231
|
-
* Render the main layout
|
|
232
|
-
* Can be overridden by subclass for custom layouts
|
|
233
|
-
*/
|
|
234
|
-
_renderLayout(pageConf, showTeaser) {
|
|
235
|
-
const isLoginModal = this._route === "login";
|
|
236
|
-
const backgroundRoute = pdRouterService.previousRoute || "home";
|
|
237
|
-
const contentRoute = isLoginModal ? backgroundRoute : this._route;
|
|
238
|
-
return html`
|
|
239
|
-
${pageConf?.hideMenu ? "" : html`<header>
|
|
240
|
-
${this._renderSiteHeader(pageConf, showTeaser)}
|
|
241
|
-
</header>`}
|
|
242
|
-
|
|
243
|
-
<main
|
|
244
|
-
class="${this._getMainClass(pageConf)}"
|
|
245
|
-
@init-menu-sections="${this._handleInitMenuSections}"
|
|
246
|
-
>
|
|
247
|
-
${this._loadingState.map(
|
|
248
|
-
(ls) => html`<pd-loading-state
|
|
249
|
-
.loadingState="${ls}"
|
|
250
|
-
.loaderStyle="${ls.loaderStyle || spaConfig.defaultLoaderStyle || "spinner"}"
|
|
251
|
-
></pd-loading-state>`
|
|
252
|
-
)}
|
|
253
|
-
${this._renderRoutePages(contentRoute)}
|
|
254
|
-
${this._route === "not-found" ? html`<default-not-found></default-not-found>` : ""}
|
|
255
|
-
</main>
|
|
256
|
-
|
|
257
|
-
${isLoginModal ? this._renderLoginModal() : ""}
|
|
258
|
-
${pageConf?.withFooter ? html`<footer>${this._renderFooter()}</footer>` : ""}
|
|
259
|
-
|
|
260
|
-
<pd-toast></pd-toast>
|
|
261
|
-
`;
|
|
262
|
-
}
|
|
263
|
-
/**
|
|
264
|
-
* Render the login modal popup
|
|
265
|
-
*/
|
|
266
|
-
_renderLoginModal() {
|
|
267
|
-
return html`
|
|
268
|
-
<pd-popup
|
|
269
|
-
class="login-modal"
|
|
270
|
-
closeByEscape
|
|
271
|
-
popupLabel="Anmeldung"
|
|
272
|
-
@popup-close="${this._handleLoginPopupClose}"
|
|
273
|
-
>
|
|
274
|
-
<default-login slot="content"></default-login>
|
|
275
|
-
</pd-popup>
|
|
276
|
-
`;
|
|
277
|
-
}
|
|
278
|
-
/**
|
|
279
|
-
* Handle login popup close (user aborted login via Escape or backdrop click)
|
|
280
|
-
*/
|
|
281
|
-
_handleLoginPopupClose() {
|
|
282
|
-
const backRoute = pdRouterService.previousRoute || "/";
|
|
283
|
-
pdRouterService.navigate(backRoute);
|
|
284
|
-
}
|
|
285
|
-
// ---------------------------------------------------------------------------
|
|
286
|
-
// Layout Rendering Methods (can be overridden)
|
|
287
|
-
// ---------------------------------------------------------------------------
|
|
288
|
-
_renderSiteHeader(pageConf, showTeaser) {
|
|
289
|
-
const { bgImage, styles: bgStyles } = mapMenuBg(pageConf?.bgConfig);
|
|
290
|
-
return html`
|
|
291
|
-
<pd-site-header
|
|
292
|
-
id="pdHelperSiteHeaderId"
|
|
293
|
-
style="${styleMap(bgStyles)}"
|
|
294
|
-
bg-image="${bgImage}"
|
|
295
|
-
.topMenuItems=${this._getVisibleTopMenuItems(pageConf)}
|
|
296
|
-
.menuItems=${this._getVisibleMenuItems(pageConf)}
|
|
297
|
-
selectedLocale="${this._selectedLocale}"
|
|
298
|
-
.locales=${this._availableLocales}
|
|
299
|
-
?singleLocaleMenu=${this._singleLocaleMenu}
|
|
300
|
-
activeRoute="${this._route}"
|
|
301
|
-
logoRoute="${pageConf?.menuLogoRoute || ""}"
|
|
302
|
-
.showTeaser=${showTeaser}
|
|
303
|
-
.teaserCollapsed=${this.teaserCollapsed}
|
|
304
|
-
.skipTeaserTransition=${this._skipTeaserTransition}
|
|
305
|
-
topMenuMode="${pageConf?.topMenuMode || "detached"}"
|
|
306
|
-
@locale-change="${this._handleLocaleChange}"
|
|
307
|
-
@height-change="${this._handleHeaderHeightChange}"
|
|
308
|
-
>
|
|
309
|
-
<span slot="logo">${this._getAppLogo()}</span>
|
|
310
|
-
${showTeaser ? this._renderTeaserSlotContent() : ""}
|
|
311
|
-
</pd-site-header>
|
|
312
|
-
`;
|
|
313
|
-
}
|
|
314
|
-
_getVisibleMenuItems(pageConf) {
|
|
315
|
-
return (pageConf?.menu || []).filter(
|
|
316
|
-
(item) => !item.requiredRoles?.length || item.requiredRoles.some((role) => this._claims?.[role] === true)
|
|
317
|
-
);
|
|
318
|
-
}
|
|
319
|
-
_getVisibleTopMenuItems(pageConf) {
|
|
320
|
-
if (pageConf?.hideTopMenu) return [];
|
|
321
|
-
return (pageConf?.topMenuItems || []).filter(
|
|
322
|
-
(item) => !item.requiredRoles?.length || item.requiredRoles.some((role) => this._claims?.[role] === true)
|
|
323
|
-
);
|
|
324
|
-
}
|
|
325
|
-
_renderFooter() {
|
|
326
|
-
const footer = this._getFooter();
|
|
327
|
-
const pdSections = footer.sections?.map((s) => ({
|
|
328
|
-
heading: s.heading,
|
|
329
|
-
links: s.links.map((l) => ({ key: l.key, name: l.name }))
|
|
330
|
-
})) ?? [];
|
|
331
|
-
const pdLegalLinks = footer.legalLinks?.map((l) => ({ key: l.key, name: l.name })) ?? [];
|
|
332
|
-
const { bgImage, styles: bgStyles } = mapFooterBg(footer.bgConfig);
|
|
333
|
-
return html`
|
|
334
|
-
<pd-footer
|
|
335
|
-
style="${styleMap(bgStyles)}"
|
|
336
|
-
bg-image="${bgImage}"
|
|
337
|
-
.sections="${pdSections}"
|
|
338
|
-
.socialLinks="${footer.socialLinks ?? []}"
|
|
339
|
-
.legalLinks="${pdLegalLinks}"
|
|
340
|
-
copyright="${footer.copyright || "PD Progressive Development UG"}"
|
|
341
|
-
version="${footer.version || ""}"
|
|
342
|
-
?show-version="${footer.showVersion ?? false}"
|
|
343
|
-
.madeBy="${footer.madeBy || MADE_BY}"
|
|
344
|
-
@footer-link="${this._handleFooterLink}"
|
|
345
|
-
>
|
|
346
|
-
</pd-footer>
|
|
347
|
-
`;
|
|
348
|
-
}
|
|
349
|
-
// ---------------------------------------------------------------------------
|
|
350
|
-
// Optional Override Methods (have default implementations)
|
|
351
|
-
// ---------------------------------------------------------------------------
|
|
352
|
-
/**
|
|
353
|
-
* Whether the app has teaser content. Default: false.
|
|
354
|
-
* Override in subclass to enable teaser rendering.
|
|
355
|
-
* Used together with pageConf.withTeaser to determine if the teaser is shown.
|
|
356
|
-
*/
|
|
357
|
-
_hasTeaserContent() {
|
|
358
|
-
return false;
|
|
359
|
-
}
|
|
360
|
-
/**
|
|
361
|
-
* Render teaser slot content for pd-site-header.
|
|
362
|
-
* Override in subclass (or intermediate layer like PdVisitcardApp)
|
|
363
|
-
* to provide teaser content. The returned template must include
|
|
364
|
-
* `slot="teaser-content"` on its root element.
|
|
365
|
-
*
|
|
366
|
-
* @example
|
|
367
|
-
* ```typescript
|
|
368
|
-
* protected override _renderTeaserSlotContent(): TemplateResult {
|
|
369
|
-
* return html`<img slot="teaser-content" src="hero.jpg" />`;
|
|
370
|
-
* }
|
|
371
|
-
* ```
|
|
372
|
-
*/
|
|
373
|
-
_renderTeaserSlotContent() {
|
|
374
|
-
return html``;
|
|
375
|
-
}
|
|
376
|
-
// ---------------------------------------------------------------------------
|
|
377
|
-
// Event Handlers
|
|
378
|
-
// ---------------------------------------------------------------------------
|
|
379
|
-
_handleRouteEvent(e) {
|
|
380
|
-
if (e.detail.el && !e.detail.route) {
|
|
381
|
-
this._scrollToSection(e.detail.el);
|
|
382
|
-
} else if (e.detail.route) {
|
|
383
|
-
if (e.detail.sectionId) {
|
|
384
|
-
this._pendingScrollSectionId = e.detail.sectionId;
|
|
385
|
-
}
|
|
386
|
-
this._navigateToPage(e.detail.route);
|
|
387
|
-
}
|
|
388
|
-
}
|
|
389
|
-
_handleFooterLink(e) {
|
|
390
|
-
const { key } = e.detail.linkObj;
|
|
391
|
-
const footer = this._getFooter();
|
|
392
|
-
const allLinks = [
|
|
393
|
-
...footer.sections?.flatMap((s) => s.links) ?? [],
|
|
394
|
-
...footer.legalLinks ?? []
|
|
395
|
-
];
|
|
396
|
-
const linkObj = allLinks.find((l) => l.key === key);
|
|
397
|
-
if (linkObj?.link) {
|
|
398
|
-
this._navigateToPage(linkObj.link);
|
|
399
|
-
}
|
|
400
|
-
if (linkObj?.action) {
|
|
401
|
-
linkObj.action();
|
|
402
|
-
}
|
|
403
|
-
}
|
|
404
|
-
/**
|
|
405
|
-
* Handle pd-action events dispatched by scoped interceptors on data-pd-action elements.
|
|
406
|
-
* Handles generic actions (route, section). Override in subclass for app-specific
|
|
407
|
-
* actions (e.g., "wizard").
|
|
408
|
-
*
|
|
409
|
-
* Unknown actions are silently ignored.
|
|
410
|
-
* "url" actions are handled natively by the browser via href — no handler needed.
|
|
411
|
-
*/
|
|
412
|
-
_handlePdAction(e) {
|
|
413
|
-
const { action, target } = e.detail;
|
|
414
|
-
switch (action) {
|
|
415
|
-
case "route":
|
|
416
|
-
this._navigateToPage(target);
|
|
417
|
-
break;
|
|
418
|
-
case "section":
|
|
419
|
-
this._navigateToSection(target);
|
|
420
|
-
break;
|
|
421
|
-
}
|
|
422
|
-
}
|
|
423
|
-
/**
|
|
424
|
-
* Scroll to a section by its ID on the current page.
|
|
425
|
-
* Uses the existing menu-ref mechanism from init-menu-sections.
|
|
426
|
-
*
|
|
427
|
-
* TODO: Navigate-and-scroll for sections on other pages is not yet supported
|
|
428
|
-
* via pd-action. Currently only scrolls if the section is on the current page.
|
|
429
|
-
* For cross-page section navigation, the calling code should use route-event
|
|
430
|
-
* with { route, sectionId } directly — same mechanism pd-menu uses.
|
|
431
|
-
*/
|
|
432
|
-
_navigateToSection(sectionId) {
|
|
433
|
-
const element = this._findSectionElement(sectionId);
|
|
434
|
-
if (element) {
|
|
435
|
-
this._scrollToSection(element);
|
|
436
|
-
}
|
|
437
|
-
}
|
|
438
|
-
_handleInitMenuSections(e) {
|
|
439
|
-
const pageConf = spaConfig.getNavigationPage(this._route);
|
|
440
|
-
if (pageConf?.menu) {
|
|
441
|
-
pageConf.menu = pageConf.menu.map((menuElement) => ({
|
|
442
|
-
...menuElement,
|
|
443
|
-
ref: menuElement.sec ? e.detail.menuRefs[menuElement.sec] ?? void 0 : void 0
|
|
444
|
-
}));
|
|
445
|
-
this.requestUpdate();
|
|
446
|
-
}
|
|
447
|
-
if (e.detail.sectionActions) {
|
|
448
|
-
for (const [sectionId, actionCreator] of Object.entries(
|
|
449
|
-
e.detail.sectionActions
|
|
450
|
-
)) {
|
|
451
|
-
this._sectionActions.set(sectionId, actionCreator);
|
|
452
|
-
}
|
|
453
|
-
}
|
|
454
|
-
if (this._pendingScrollSectionId) {
|
|
455
|
-
const element = this._findSectionElement(this._pendingScrollSectionId);
|
|
456
|
-
if (element) {
|
|
457
|
-
requestAnimationFrame(() => {
|
|
458
|
-
this._scrollToSection(element);
|
|
459
|
-
this._skipTeaserTransition = false;
|
|
460
|
-
});
|
|
461
|
-
} else {
|
|
462
|
-
this._skipTeaserTransition = false;
|
|
463
|
-
}
|
|
464
|
-
this._pendingScrollSectionId = null;
|
|
465
|
-
}
|
|
466
|
-
}
|
|
467
|
-
/**
|
|
468
|
-
* Handle section-activated event from pd-menu.
|
|
469
|
-
* Dispatches the registered action for a section (once per session).
|
|
470
|
-
*/
|
|
471
|
-
_handleSectionActivated(e) {
|
|
472
|
-
const { sectionId } = e.detail;
|
|
473
|
-
const actionCreator = this._sectionActions.get(sectionId);
|
|
474
|
-
if (actionCreator) {
|
|
475
|
-
fireOnceService.fireOnce(sectionId, actionCreator());
|
|
476
|
-
}
|
|
477
|
-
}
|
|
478
|
-
_handleLocaleChange(e) {
|
|
479
|
-
spaLogger.debug("Handle change locale", e);
|
|
480
|
-
const newLocale = e.detail;
|
|
481
|
-
this._setLocale(newLocale);
|
|
482
|
-
this._selectedLocale = newLocale;
|
|
483
|
-
setCurrentFormatLocale(newLocale);
|
|
484
|
-
}
|
|
485
|
-
_handleAppConfigEvent(event) {
|
|
486
|
-
const customEvent = event;
|
|
487
|
-
if (customEvent.detail) {
|
|
488
|
-
customEvent.detail.appConf = this._getAppConfiguration();
|
|
489
|
-
}
|
|
490
|
-
}
|
|
491
|
-
// ---------------------------------------------------------------------------
|
|
492
|
-
// Private Methods
|
|
493
|
-
// ---------------------------------------------------------------------------
|
|
494
|
-
_activateLoginHandler() {
|
|
495
|
-
spaLogger.debug("Activating login handler");
|
|
496
|
-
services.auth.onAuthStateChanged(async (user) => {
|
|
497
|
-
spaLogger.debug("Auth state changed", user?.email);
|
|
498
|
-
const newState = user ? "logged-in" : "logged-out";
|
|
499
|
-
if (user) {
|
|
500
|
-
const tokenResult = await services.auth.getIdTokenResult();
|
|
501
|
-
const claims = tokenResult?.claims || {};
|
|
502
|
-
this._claims = claims;
|
|
503
|
-
pdStore().dispatch(
|
|
504
|
-
loginSuccess({
|
|
505
|
-
uid: user.uid,
|
|
506
|
-
email: user.email,
|
|
507
|
-
emailVerified: user.emailVerified,
|
|
508
|
-
claims,
|
|
509
|
-
providerId: "unknown"
|
|
510
|
-
// Provider ID is Firebase-specific, not in interface
|
|
511
|
-
})
|
|
512
|
-
);
|
|
513
|
-
const redirectRoute = sessionStorage.getItem(POST_LOGIN_REDIRECT_KEY);
|
|
514
|
-
if (redirectRoute) {
|
|
515
|
-
const routeToNavigate = redirectRoute && redirectRoute !== "/login" ? redirectRoute : "";
|
|
516
|
-
sessionStorage.removeItem(POST_LOGIN_REDIRECT_KEY);
|
|
517
|
-
spaLogger.debug("Redirecting after login to:", routeToNavigate);
|
|
518
|
-
this._navigateToPage(routeToNavigate);
|
|
519
|
-
}
|
|
520
|
-
if (this._previousAuthState === "logged-out") {
|
|
521
|
-
toastBus.success(`Angemeldet als ${user.email}`);
|
|
522
|
-
}
|
|
523
|
-
} else {
|
|
524
|
-
pdStore().dispatch(nologin());
|
|
525
|
-
this._claims = {};
|
|
526
|
-
if (this._previousAuthState === "logged-in") {
|
|
527
|
-
pdStore().dispatch(logoutSuccess());
|
|
528
|
-
toastBus.info("Abgemeldet");
|
|
529
|
-
this._navigateToPage(spaConfig.logoutRedirect);
|
|
530
|
-
}
|
|
531
|
-
}
|
|
532
|
-
this._previousAuthState = newState;
|
|
533
|
-
});
|
|
534
|
-
}
|
|
535
|
-
_getMainClass(pageConf) {
|
|
536
|
-
return pageConf?.mainClass || "";
|
|
537
|
-
}
|
|
538
|
-
_handleHeaderHeightChange(e) {
|
|
539
|
-
this.style.setProperty("--pd-site-header-height", `${e.detail.height}px`);
|
|
540
|
-
}
|
|
541
|
-
_navigateToPage(routeURL) {
|
|
542
|
-
pdRouterService.navigate(routeURL);
|
|
543
|
-
}
|
|
544
|
-
/**
|
|
545
|
-
* Scroll to a section element. Collapses teaser if expanded.
|
|
546
|
-
*/
|
|
547
|
-
_scrollToSection(element) {
|
|
548
|
-
if (!this.teaserCollapsed) {
|
|
549
|
-
this.teaserCollapsed = true;
|
|
550
|
-
}
|
|
551
|
-
element.scrollIntoView({ behavior: "smooth", block: "start" });
|
|
552
|
-
}
|
|
553
|
-
/**
|
|
554
|
-
* Find section element by sectionId from current page's menu refs.
|
|
555
|
-
*/
|
|
556
|
-
_findSectionElement(sectionId) {
|
|
557
|
-
const pageConf = spaConfig.getNavigationPage(this._route);
|
|
558
|
-
if (!pageConf?.menu) return null;
|
|
559
|
-
const menuItem = pageConf.menu.find(
|
|
560
|
-
(item) => item.sec === sectionId
|
|
561
|
-
);
|
|
562
|
-
return menuItem?.ref ?? null;
|
|
563
|
-
}
|
|
564
|
-
// ---------------------------------------------------------------------------
|
|
565
|
-
// Responsive Handling
|
|
566
|
-
// ---------------------------------------------------------------------------
|
|
567
|
-
}
|
|
568
|
-
__decorateClass([
|
|
569
|
-
property({ type: String })
|
|
570
|
-
], PdSpaHelper.prototype, "title");
|
|
571
|
-
__decorateClass([
|
|
572
|
-
property({ type: Number, attribute: "teaser-collapse-threshold" })
|
|
573
|
-
], PdSpaHelper.prototype, "teaserCollapseThreshold");
|
|
574
|
-
__decorateClass([
|
|
575
|
-
state()
|
|
576
|
-
], PdSpaHelper.prototype, "_loadingState");
|
|
577
|
-
__decorateClass([
|
|
578
|
-
state()
|
|
579
|
-
], PdSpaHelper.prototype, "_route");
|
|
580
|
-
__decorateClass([
|
|
581
|
-
state()
|
|
582
|
-
], PdSpaHelper.prototype, "_params");
|
|
583
|
-
__decorateClass([
|
|
584
|
-
state()
|
|
585
|
-
], PdSpaHelper.prototype, "_query");
|
|
586
|
-
__decorateClass([
|
|
587
|
-
property({ type: Boolean, reflect: true, attribute: "teaser-collapsed" })
|
|
588
|
-
], PdSpaHelper.prototype, "teaserCollapsed");
|
|
589
|
-
__decorateClass([
|
|
590
|
-
property({
|
|
591
|
-
type: Boolean,
|
|
592
|
-
reflect: true,
|
|
593
|
-
attribute: "skip-teaser-transition"
|
|
594
|
-
})
|
|
595
|
-
], PdSpaHelper.prototype, "_skipTeaserTransition");
|
|
596
|
-
__decorateClass([
|
|
597
|
-
state()
|
|
598
|
-
], PdSpaHelper.prototype, "_selectedLocale");
|
|
599
|
-
__decorateClass([
|
|
600
|
-
state()
|
|
601
|
-
], PdSpaHelper.prototype, "_claims");
|
|
602
|
-
|
|
603
|
-
export { PdSpaHelper, startInit };
|
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
import { ReactiveController, ReactiveControllerHost } from 'lit';
|
|
2
|
-
/**
|
|
3
|
-
* Options for ScrollController
|
|
4
|
-
*/
|
|
5
|
-
export interface ScrollControllerOptions {
|
|
6
|
-
/** Scroll threshold in pixels for triggering state changes */
|
|
7
|
-
threshold?: number;
|
|
8
|
-
/** Callback when scroll passes threshold (scrolled down) */
|
|
9
|
-
onScrolledDown?: () => void;
|
|
10
|
-
/** Callback when scroll returns above threshold (scrolled up) */
|
|
11
|
-
onScrolledUp?: () => void;
|
|
12
|
-
}
|
|
13
|
-
/**
|
|
14
|
-
* Reactive Controller for scroll threshold detection.
|
|
15
|
-
*
|
|
16
|
-
* Provides:
|
|
17
|
-
* - Threshold-based callbacks for scroll state changes
|
|
18
|
-
* - scrollToTop() utility for navigation
|
|
19
|
-
*
|
|
20
|
-
* @example
|
|
21
|
-
* ```typescript
|
|
22
|
-
* class MyComponent extends LitElement {
|
|
23
|
-
* private scrollController = new ScrollController(this, {
|
|
24
|
-
* threshold: 380, // Teaser height
|
|
25
|
-
* onScrolledDown: () => this.teaserCollapsed = true,
|
|
26
|
-
* onScrolledUp: () => this.teaserCollapsed = false,
|
|
27
|
-
* });
|
|
28
|
-
*
|
|
29
|
-
* render() {
|
|
30
|
-
* return html`
|
|
31
|
-
* <button @click=${() => this.scrollController.scrollToTop()}>
|
|
32
|
-
* Back to top
|
|
33
|
-
* </button>
|
|
34
|
-
* `;
|
|
35
|
-
* }
|
|
36
|
-
* }
|
|
37
|
-
* ```
|
|
38
|
-
*/
|
|
39
|
-
export declare class ScrollController implements ReactiveController {
|
|
40
|
-
private _host;
|
|
41
|
-
private _options;
|
|
42
|
-
private _handler;
|
|
43
|
-
private _ticking;
|
|
44
|
-
private _isPastThreshold;
|
|
45
|
-
private _teaserCollapseEnabled;
|
|
46
|
-
constructor(host: ReactiveControllerHost, options?: ScrollControllerOptions);
|
|
47
|
-
/**
|
|
48
|
-
* Whether the scroll position is past the threshold
|
|
49
|
-
*/
|
|
50
|
-
get isPastThreshold(): boolean;
|
|
51
|
-
/**
|
|
52
|
-
* Scroll to the top of the page smoothly
|
|
53
|
-
*/
|
|
54
|
-
scrollToTop(): void;
|
|
55
|
-
/**
|
|
56
|
-
* Update the threshold value dynamically
|
|
57
|
-
*/
|
|
58
|
-
setThreshold(threshold: number): void;
|
|
59
|
-
/**
|
|
60
|
-
* Enable/disable teaser collapse behavior.
|
|
61
|
-
* When disabled, scroll threshold callbacks are not triggered.
|
|
62
|
-
* Use this on pages without teaser to prevent scroll events from
|
|
63
|
-
* incorrectly toggling teaserCollapsed state.
|
|
64
|
-
*/
|
|
65
|
-
setTeaserCollapseEnabled(enabled: boolean): void;
|
|
66
|
-
hostConnected(): void;
|
|
67
|
-
hostDisconnected(): void;
|
|
68
|
-
/**
|
|
69
|
-
* Create the scroll handler with requestAnimationFrame throttling
|
|
70
|
-
*/
|
|
71
|
-
private _createScrollHandler;
|
|
72
|
-
/**
|
|
73
|
-
* Check if threshold is crossed and trigger callbacks
|
|
74
|
-
*/
|
|
75
|
-
private _checkThreshold;
|
|
76
|
-
}
|
|
77
|
-
//# sourceMappingURL=ScrollController.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ScrollController.d.ts","sourceRoot":"","sources":["../../../../src/components/pd-spa-helper/controllers/ScrollController.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,KAAK,CAAC;AAMjE;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,8DAA8D;IAC9D,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,4DAA4D;IAC5D,cAAc,CAAC,EAAE,MAAM,IAAI,CAAC;IAE5B,iEAAiE;IACjE,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;CAC3B;AAMD;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,qBAAa,gBAAiB,YAAW,kBAAkB;IACzD,OAAO,CAAC,KAAK,CAAyB;IACtC,OAAO,CAAC,QAAQ,CAAoC;IACpD,OAAO,CAAC,QAAQ,CAA6B;IAC7C,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,sBAAsB,CAAQ;gBAGpC,IAAI,EAAE,sBAAsB,EAC5B,OAAO,GAAE,uBAA4B;IAgBvC;;OAEG;IACH,IAAI,eAAe,IAAI,OAAO,CAE7B;IAED;;OAEG;IACH,WAAW,IAAI,IAAI;IAQnB;;OAEG;IACH,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAIrC;;;;;OAKG;IACH,wBAAwB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAQhD,aAAa,IAAI,IAAI;IAQrB,gBAAgB,IAAI,IAAI;IAWxB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAY5B;;OAEG;IACH,OAAO,CAAC,eAAe;CAoBxB"}
|