@progressive-development/pd-spa-helper 0.9.1 → 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.
Files changed (269) hide show
  1. package/dist/PdSpaHelper.d.ts +83 -0
  2. package/dist/PdSpaHelper.d.ts.map +1 -0
  3. package/dist/PdSpaHelper.js +492 -0
  4. package/dist/defaultpage/default-confirm-popup.d.ts +19 -0
  5. package/dist/defaultpage/default-confirm-popup.d.ts.map +1 -0
  6. package/dist/defaultpage/default-confirm-popup.js +70 -0
  7. package/dist/defaultpage/default-dialog-popup.d.ts +19 -0
  8. package/dist/defaultpage/default-dialog-popup.d.ts.map +1 -0
  9. package/dist/defaultpage/default-dialog-popup.js +103 -0
  10. package/dist/defaultpage/default-login.d.ts +6 -0
  11. package/dist/defaultpage/default-login.d.ts.map +1 -0
  12. package/dist/defaultpage/default-login.js +33 -0
  13. package/dist/defaultpage/default-not-found.d.ts +6 -0
  14. package/dist/defaultpage/default-not-found.d.ts.map +1 -0
  15. package/dist/{components/default-not-found/DefaultNotFound.js → defaultpage/default-not-found.js} +3 -10
  16. package/dist/defaultpage/default-popup.d.ts +7 -0
  17. package/dist/defaultpage/default-popup.d.ts.map +1 -0
  18. package/dist/defaultpage/default-popup.js +24 -0
  19. package/dist/defaultpage/default-step-address.d.ts +14 -0
  20. package/dist/defaultpage/default-step-address.d.ts.map +1 -0
  21. package/dist/defaultpage/default-step-address.js +77 -0
  22. package/dist/defaultpage/default-step-summary.d.ts +28 -0
  23. package/dist/defaultpage/default-step-summary.d.ts.map +1 -0
  24. package/dist/defaultpage/default-step-summary.js +67 -0
  25. package/dist/defaultpage/default-view-page.d.ts +10 -0
  26. package/dist/defaultpage/default-view-page.d.ts.map +1 -0
  27. package/dist/defaultpage/default-view-page.js +70 -0
  28. package/dist/defaultpage/default-wizard.d.ts +37 -0
  29. package/dist/defaultpage/default-wizard.d.ts.map +1 -0
  30. package/dist/defaultpage/default-wizard.js +255 -0
  31. package/dist/defaultpage/pd-default-wizard-step.d.ts +60 -0
  32. package/dist/defaultpage/pd-default-wizard-step.d.ts.map +1 -0
  33. package/dist/defaultpage/pd-default-wizard-step.js +144 -0
  34. package/dist/generated/locale-wrapper/be-wrapper.d.ts +63 -0
  35. package/dist/generated/locale-wrapper/be-wrapper.d.ts.map +1 -0
  36. package/dist/generated/locale-wrapper/de-wrapper.d.ts +63 -0
  37. package/dist/generated/locale-wrapper/de-wrapper.d.ts.map +1 -0
  38. package/dist/generated/locale-wrapper/en-wrapper.d.ts +63 -0
  39. package/dist/generated/locale-wrapper/en-wrapper.d.ts.map +1 -0
  40. package/dist/generated/locales/be.d.ts +15 -1
  41. package/dist/generated/locales/be.d.ts.map +1 -1
  42. package/dist/generated/locales/be.js +15 -1
  43. package/dist/generated/locales/de.d.ts +15 -1
  44. package/dist/generated/locales/de.d.ts.map +1 -1
  45. package/dist/generated/locales/de.js +15 -1
  46. package/dist/generated/locales/en.d.ts +15 -1
  47. package/dist/generated/locales/en.d.ts.map +1 -1
  48. package/dist/generated/locales/en.js +15 -1
  49. package/dist/helper/blob-helper.d.ts +3 -0
  50. package/dist/helper/blob-helper.d.ts.map +1 -0
  51. package/dist/helper/blob-helper.js +35 -0
  52. package/dist/helper/date-helper.d.ts +27 -0
  53. package/dist/helper/date-helper.d.ts.map +1 -0
  54. package/dist/helper/date-helper.js +129 -0
  55. package/dist/helper/locale-format.d.ts +4 -0
  56. package/dist/helper/locale-format.d.ts.map +1 -0
  57. package/dist/helper/locale-format.js +16 -0
  58. package/dist/helper/logger.d.ts +12 -11
  59. package/dist/helper/logger.d.ts.map +1 -1
  60. package/dist/helper/logger.js +49 -10
  61. package/dist/helper/number-helper.d.ts +2 -0
  62. package/dist/helper/number-helper.d.ts.map +1 -0
  63. package/dist/helper/number-helper.js +13 -0
  64. package/dist/helper/price-helper.d.ts +5 -0
  65. package/dist/helper/price-helper.d.ts.map +1 -0
  66. package/dist/helper/price-helper.js +22 -0
  67. package/dist/helper/refresh-id-token.d.ts.map +1 -1
  68. package/dist/helper/refresh-id-token.js +4 -6
  69. package/dist/helper/text-helper.d.ts +3 -0
  70. package/dist/helper/text-helper.d.ts.map +1 -0
  71. package/dist/helper/text-helper.js +4 -0
  72. package/dist/index.d.ts +29 -31
  73. package/dist/index.d.ts.map +1 -1
  74. package/dist/index.js +50 -27
  75. package/dist/model/spa-model.d.ts +15 -14
  76. package/dist/model/spa-model.d.ts.map +1 -1
  77. package/dist/popup/wizard-close-popup.d.ts +11 -0
  78. package/dist/popup/wizard-close-popup.d.ts.map +1 -0
  79. package/dist/popup/wizard-close-popup.js +63 -0
  80. package/dist/popup/wizard-reload-popup.d.ts +14 -0
  81. package/dist/popup/wizard-reload-popup.d.ts.map +1 -0
  82. package/dist/popup/wizard-reload-popup.js +76 -0
  83. package/dist/router/PdRouterService.d.ts +1 -4
  84. package/dist/router/PdRouterService.d.ts.map +1 -1
  85. package/dist/router/PdRouterService.js +16 -40
  86. package/dist/service-provider/firebase/auth.d.ts +19 -0
  87. package/dist/service-provider/firebase/auth.d.ts.map +1 -0
  88. package/dist/service-provider/firebase/auth.js +62 -0
  89. package/dist/service-provider/firebase/firestorage-client.d.ts +22 -0
  90. package/dist/service-provider/firebase/firestorage-client.d.ts.map +1 -0
  91. package/dist/service-provider/firebase/firestorage-client.js +226 -0
  92. package/dist/service-provider/firebase/firestore-client.d.ts +12 -0
  93. package/dist/service-provider/firebase/firestore-client.d.ts.map +1 -0
  94. package/dist/service-provider/firebase/firestore-client.js +25 -0
  95. package/dist/service-provider/firebase/functions-client.d.ts +10 -0
  96. package/dist/service-provider/firebase/functions-client.d.ts.map +1 -0
  97. package/dist/service-provider/firebase/functions-client.js +63 -0
  98. package/dist/service-provider/firebase/messagingFirebaseClient.d.ts +9 -0
  99. package/dist/service-provider/firebase/messagingFirebaseClient.d.ts.map +1 -0
  100. package/dist/service-provider/firebase/messagingFirebaseClient.js +69 -0
  101. package/dist/service-provider/mock/auth.d.ts +6 -0
  102. package/dist/service-provider/mock/auth.d.ts.map +1 -0
  103. package/dist/service-provider/mock/auth.js +60 -0
  104. package/dist/service-provider/mock/function-client.d.ts +7 -0
  105. package/dist/service-provider/mock/function-client.d.ts.map +1 -0
  106. package/dist/service-provider/mock/function-client.js +30 -0
  107. package/dist/service-provider/mock/storage-client.d.ts +11 -0
  108. package/dist/service-provider/mock/storage-client.d.ts.map +1 -0
  109. package/dist/service-provider/mock/storage-client.js +106 -0
  110. package/dist/service-provider/service-provider-impl.d.ts +27 -0
  111. package/dist/service-provider/service-provider-impl.d.ts.map +1 -0
  112. package/dist/service-provider/service-provider-impl.js +222 -0
  113. package/dist/service-provider/service-provider-model.d.ts +7 -26
  114. package/dist/service-provider/service-provider-model.d.ts.map +1 -1
  115. package/dist/{db → store}/indexDB.d.ts +9 -9
  116. package/dist/store/indexDB.d.ts.map +1 -0
  117. package/dist/{db → store}/indexDB.js +12 -14
  118. package/dist/store/mini-rx.store.d.ts.map +1 -1
  119. package/dist/store/mini-rx.store.js +3 -1
  120. package/dist/store/spa-app-actions.d.ts +22 -5
  121. package/dist/store/spa-app-actions.d.ts.map +1 -1
  122. package/dist/store/spa-app-actions.js +8 -4
  123. package/dist/store/spa-app-effects.d.ts +17 -0
  124. package/dist/store/spa-app-effects.d.ts.map +1 -1
  125. package/dist/store/spa-app-effects.js +40 -2
  126. package/dist/store/spa-app-reducer.d.ts +10 -5
  127. package/dist/store/spa-app-reducer.d.ts.map +1 -1
  128. package/dist/store/spa-app-reducer.js +8 -17
  129. package/dist/store/spa-app-selector.d.ts +2 -2
  130. package/dist/store/spa-app-selector.d.ts.map +1 -1
  131. package/dist/store/spa-app-selector.js +1 -1
  132. package/dist/stories/address-edit.stories.d.ts +27 -0
  133. package/dist/stories/address-edit.stories.d.ts.map +1 -0
  134. package/dist/stories/address-new.stories.d.ts +33 -0
  135. package/dist/stories/address-new.stories.d.ts.map +1 -0
  136. package/dist/stories/default-confirm-popup.stories.d.ts +24 -0
  137. package/dist/stories/default-confirm-popup.stories.d.ts.map +1 -0
  138. package/dist/stories/default-dialog-popup.stories.d.ts +23 -0
  139. package/dist/stories/default-dialog-popup.stories.d.ts.map +1 -0
  140. package/dist/stories/default-login.stories.d.ts +10 -0
  141. package/dist/stories/default-login.stories.d.ts.map +1 -0
  142. package/dist/stories/default-popup.stories.d.ts +9 -0
  143. package/dist/stories/default-popup.stories.d.ts.map +1 -0
  144. package/dist/stories/pd-loading-state.stories.d.ts +30 -0
  145. package/dist/stories/pd-loading-state.stories.d.ts.map +1 -0
  146. package/dist/stories/pd-toast.stories.d.ts +27 -0
  147. package/dist/stories/pd-toast.stories.d.ts.map +1 -0
  148. package/dist/stories/routing.stories.d.ts +24 -0
  149. package/dist/stories/routing.stories.d.ts.map +1 -0
  150. package/dist/stories/test-impls/address-test.d.ts +6 -0
  151. package/dist/stories/test-impls/address-test.d.ts.map +1 -0
  152. package/dist/stories/test-impls/test-mock-app.d.ts +15 -0
  153. package/dist/stories/test-impls/test-mock-app.d.ts.map +1 -0
  154. package/dist/stories/test-impls/test-pages/test-home-page.d.ts +7 -0
  155. package/dist/stories/test-impls/test-pages/test-home-page.d.ts.map +1 -0
  156. package/dist/stories/test-impls/test-pages/test-not-found-page.d.ts +5 -0
  157. package/dist/stories/test-impls/test-pages/test-not-found-page.d.ts.map +1 -0
  158. package/dist/stories/test-impls/test-pages/test-wizard-step.d.ts +17 -0
  159. package/dist/stories/test-impls/test-pages/test-wizard-step.d.ts.map +1 -0
  160. package/dist/stories/test-impls/test-pages/test-wizard.d.ts +16 -0
  161. package/dist/stories/test-impls/test-pages/test-wizard.d.ts.map +1 -0
  162. package/dist/stories/test-impls/test-popups/default-confirm-popup-test-error.d.ts +8 -0
  163. package/dist/stories/test-impls/test-popups/default-confirm-popup-test-error.d.ts.map +1 -0
  164. package/dist/stories/test-impls/test-popups/default-confirm-popup-test-info.d.ts +8 -0
  165. package/dist/stories/test-impls/test-popups/default-confirm-popup-test-info.d.ts.map +1 -0
  166. package/dist/stories/test-impls/test-popups/default-confirm-popup-test-warn.d.ts +8 -0
  167. package/dist/stories/test-impls/test-popups/default-confirm-popup-test-warn.d.ts.map +1 -0
  168. package/dist/stories/test-impls/test-popups/default-dialog-popup-test.d.ts +13 -0
  169. package/dist/stories/test-impls/test-popups/default-dialog-popup-test.d.ts.map +1 -0
  170. package/dist/stories/test-impls/test-popups/default-popup-test.d.ts +5 -0
  171. package/dist/stories/test-impls/test-popups/default-popup-test.d.ts.map +1 -0
  172. package/dist/stories/test-wizard-step.stories.d.ts +11 -0
  173. package/dist/stories/test-wizard-step.stories.d.ts.map +1 -0
  174. package/dist/stories/test-wizard.stories.d.ts +9 -0
  175. package/dist/stories/test-wizard.stories.d.ts.map +1 -0
  176. package/dist/tmpown/pd-loading-state.d.ts +9 -0
  177. package/dist/tmpown/pd-loading-state.d.ts.map +1 -0
  178. package/dist/tmpown/pd-loading-state.js +196 -0
  179. package/dist/tmpown/pd-login.d.ts +13 -0
  180. package/dist/tmpown/pd-login.d.ts.map +1 -0
  181. package/dist/tmpown/pd-login.js +165 -0
  182. package/dist/tmpown/pd-toast.d.ts +13 -0
  183. package/dist/tmpown/pd-toast.d.ts.map +1 -0
  184. package/dist/tmpown/pd-toast.js +127 -0
  185. package/package.json +9 -13
  186. package/dist/auth/AuthController.d.ts +0 -37
  187. package/dist/auth/AuthController.d.ts.map +0 -1
  188. package/dist/auth/AuthController.js +0 -65
  189. package/dist/auth/auth-directives.d.ts +0 -59
  190. package/dist/auth/auth-directives.d.ts.map +0 -1
  191. package/dist/auth/auth-directives.js +0 -81
  192. package/dist/auth/auth-utils.d.ts +0 -45
  193. package/dist/auth/auth-utils.d.ts.map +0 -1
  194. package/dist/auth/auth-utils.js +0 -42
  195. package/dist/auth/index.d.ts +0 -7
  196. package/dist/auth/index.d.ts.map +0 -1
  197. package/dist/components/default-login/DefaultLogin.d.ts +0 -15
  198. package/dist/components/default-login/DefaultLogin.d.ts.map +0 -1
  199. package/dist/components/default-login/DefaultLogin.js +0 -120
  200. package/dist/components/default-not-found/DefaultNotFound.d.ts +0 -6
  201. package/dist/components/default-not-found/DefaultNotFound.d.ts.map +0 -1
  202. package/dist/components/pd-section-page/PdSectionPage.d.ts +0 -55
  203. package/dist/components/pd-section-page/PdSectionPage.d.ts.map +0 -1
  204. package/dist/components/pd-section-page/PdSectionPage.js +0 -40
  205. package/dist/components/pd-spa-helper/PdSpaHelper.d.ts +0 -160
  206. package/dist/components/pd-spa-helper/PdSpaHelper.d.ts.map +0 -1
  207. package/dist/components/pd-spa-helper/PdSpaHelper.js +0 -651
  208. package/dist/components/pd-spa-helper/controllers/ScrollController.d.ts +0 -77
  209. package/dist/components/pd-spa-helper/controllers/ScrollController.d.ts.map +0 -1
  210. package/dist/components/pd-spa-helper/controllers/ScrollController.js +0 -102
  211. package/dist/components/pd-spa-helper/spa-config.d.ts +0 -87
  212. package/dist/components/pd-spa-helper/spa-config.d.ts.map +0 -1
  213. package/dist/components/pd-spa-helper/spa-config.js +0 -167
  214. package/dist/components/pd-spa-helper/spa-events.d.ts +0 -121
  215. package/dist/components/pd-spa-helper/spa-events.d.ts.map +0 -1
  216. package/dist/components/pd-spa-helper/spa-events.js +0 -18
  217. package/dist/db/index.d.ts +0 -3
  218. package/dist/db/index.d.ts.map +0 -1
  219. package/dist/db/indexDB.d.ts.map +0 -1
  220. package/dist/model/index.d.ts +0 -4
  221. package/dist/model/index.d.ts.map +0 -1
  222. package/dist/router/index.d.ts +0 -3
  223. package/dist/router/index.d.ts.map +0 -1
  224. package/dist/screen-size/ScreenSizeController.d.ts +0 -34
  225. package/dist/screen-size/ScreenSizeController.d.ts.map +0 -1
  226. package/dist/screen-size/ScreenSizeController.js +0 -58
  227. package/dist/screen-size/ScreenSizeService.d.ts +0 -49
  228. package/dist/screen-size/ScreenSizeService.d.ts.map +0 -1
  229. package/dist/screen-size/ScreenSizeService.js +0 -107
  230. package/dist/screen-size/index.d.ts +0 -13
  231. package/dist/screen-size/index.d.ts.map +0 -1
  232. package/dist/screen-size/responsive-directives.d.ts +0 -59
  233. package/dist/screen-size/responsive-directives.d.ts.map +0 -1
  234. package/dist/screen-size/responsive-directives.js +0 -71
  235. package/dist/screen-size/types.d.ts +0 -44
  236. package/dist/screen-size/types.d.ts.map +0 -1
  237. package/dist/service-provider/ServiceRegistry.d.ts +0 -67
  238. package/dist/service-provider/ServiceRegistry.d.ts.map +0 -1
  239. package/dist/service-provider/ServiceRegistry.js +0 -76
  240. package/dist/service-provider/function-utils.d.ts +0 -55
  241. package/dist/service-provider/function-utils.d.ts.map +0 -1
  242. package/dist/service-provider/function-utils.js +0 -30
  243. package/dist/service-provider/index.d.ts +0 -10
  244. package/dist/service-provider/index.d.ts.map +0 -1
  245. package/dist/service-provider/interfaces/IAuthProvider.d.ts +0 -68
  246. package/dist/service-provider/interfaces/IAuthProvider.d.ts.map +0 -1
  247. package/dist/service-provider/interfaces/IDatabaseProvider.d.ts +0 -75
  248. package/dist/service-provider/interfaces/IDatabaseProvider.d.ts.map +0 -1
  249. package/dist/service-provider/interfaces/IFunctionProvider.d.ts +0 -49
  250. package/dist/service-provider/interfaces/IFunctionProvider.d.ts.map +0 -1
  251. package/dist/service-provider/interfaces/IStorageProvider.d.ts +0 -118
  252. package/dist/service-provider/interfaces/IStorageProvider.d.ts.map +0 -1
  253. package/dist/service-provider/interfaces/ServiceProvider.d.ts +0 -24
  254. package/dist/service-provider/interfaces/ServiceProvider.d.ts.map +0 -1
  255. package/dist/service-provider/interfaces/common.d.ts +0 -5
  256. package/dist/service-provider/interfaces/common.d.ts.map +0 -1
  257. package/dist/services/fire-once-service.d.ts +0 -35
  258. package/dist/services/fire-once-service.d.ts.map +0 -1
  259. package/dist/services/fire-once-service.js +0 -61
  260. package/dist/store/async-action-effects.d.ts +0 -179
  261. package/dist/store/async-action-effects.d.ts.map +0 -1
  262. package/dist/store/async-action-effects.js +0 -97
  263. package/dist/store/async-action-utils.d.ts +0 -151
  264. package/dist/store/async-action-utils.d.ts.map +0 -1
  265. package/dist/store/async-action-utils.js +0 -41
  266. package/dist/store/index.d.ts +0 -9
  267. package/dist/store/index.d.ts.map +0 -1
  268. package/dist/stories/introduction.stories.d.ts +0 -11
  269. package/dist/stories/introduction.stories.d.ts.map +0 -1
@@ -1,651 +0,0 @@
1
- import { LitElement, css, html } from 'lit';
2
- import { property, state } from 'lit/decorators.js';
3
- import '@progressive-development/pd-page/pd-menu';
4
- import '@progressive-development/pd-page/pd-footer';
5
- import '@progressive-development/pd-content/pd-panel-viewer';
6
- import '@progressive-development/pd-content/pd-panel';
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 } 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 { toastBus } from '@progressive-development/pd-page';
16
- import { spaConfig } from './spa-config.js';
17
- import { SPA_EVENTS, dispatchInit } from './spa-events.js';
18
- import { ScrollController } from './controllers/ScrollController.js';
19
- import { fireOnceService } from '../../services/fire-once-service.js';
20
- import '../default-login/DefaultLogin.js';
21
- import '../default-not-found/DefaultNotFound.js';
22
- import '@progressive-development/pd-page/pd-toast';
23
- import '@progressive-development/pd-content/pd-loading-state';
24
- import '@progressive-development/pd-dialog/pd-popup';
25
-
26
- var __defProp = Object.defineProperty;
27
- var __decorateClass = (decorators, target, key, kind) => {
28
- var result = void 0 ;
29
- for (var i = decorators.length - 1, decorator; i >= 0; i--)
30
- if (decorator = decorators[i])
31
- result = (decorator(target, key, result) ) || result;
32
- if (result) __defProp(target, key, result);
33
- return result;
34
- };
35
- const MADE_BY = {
36
- txt: "made by PD Progressive Development",
37
- email: "info@progressive-development.com"
38
- };
39
- const spaLogger = createLogger("PdSpaHelper");
40
- const startInit = (config) => {
41
- spaLogger.debug("Starting SPA initialization", config);
42
- spaConfig.initialize(config);
43
- dispatchInit();
44
- spaLogger.debug("SPA initialization complete");
45
- };
46
- const THRESHOLD_DEFAULT = 100;
47
- class PdSpaHelper extends LitElement {
48
- // ---------------------------------------------------------------------------
49
- // Lifecycle
50
- // ---------------------------------------------------------------------------
51
- constructor() {
52
- super();
53
- // ---------------------------------------------------------------------------
54
- // Controllers
55
- // ---------------------------------------------------------------------------
56
- /** Controller for scroll threshold detection (teaser collapse) */
57
- this.scrollController = new ScrollController(this, {
58
- threshold: THRESHOLD_DEFAULT,
59
- // Default, synced with teaserCollapseThreshold property
60
- onScrolledDown: () => {
61
- this.teaserCollapsed = true;
62
- },
63
- onScrolledUp: () => {
64
- this.teaserCollapsed = false;
65
- }
66
- });
67
- this.title = "PD SPA";
68
- this.teaserCollapseThreshold = THRESHOLD_DEFAULT;
69
- this._loadingState = [];
70
- this._route = "";
71
- this._params = {};
72
- this._query = {};
73
- this.teaserCollapsed = false;
74
- this._skipTeaserTransition = false;
75
- /** Pending section ID for navigate-and-scroll (stored until init-menu-sections fires) */
76
- this._pendingScrollSectionId = null;
77
- this._claims = {};
78
- /** Whether to show locale selector in single menu only */
79
- this._singleLocaleMenu = false;
80
- /** Track previous auth state to detect real transitions (not initial load) */
81
- this._previousAuthState = "unknown";
82
- // ---------------------------------------------------------------------------
83
- // Section Actions (lazy loading via section visibility)
84
- // ---------------------------------------------------------------------------
85
- /** Map of section IDs to action creator functions */
86
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
87
- this._sectionActions = /* @__PURE__ */ new Map();
88
- setRouteElement(this);
89
- document.addEventListener(SPA_EVENTS.INIT, () => {
90
- spaLogger.debug("SPA init event received");
91
- });
92
- if (spaConfig.includesLogin) {
93
- spaLogger.debug("Login included, activating login handler");
94
- this._activateLoginHandler();
95
- }
96
- this.addEventListener(
97
- "route-event",
98
- this._handleRouteEvent
99
- );
100
- }
101
- static {
102
- // ---------------------------------------------------------------------------
103
- // Styles
104
- // ---------------------------------------------------------------------------
105
- this.styles = css`
106
- /* ═══════════════════════════════════════════════════════════════════════
107
- CSS CUSTOM PROPERTIES - Mobile First (configurable by host application)
108
- ═══════════════════════════════════════════════════════════════════════ */
109
- :host {
110
- /* Header heights - Mobile defaults */
111
- --pd-top-menu-height: 30px;
112
- --pd-teaser-height: 200px;
113
- --pd-menu-height: 50px;
114
-
115
- /* Transition timing */
116
- --pd-header-transition: 300ms ease-out;
117
-
118
- /* Layout */
119
- display: flex;
120
- flex-flow: column;
121
- height: 100%;
122
- }
123
-
124
- /* Tablet (768px+) */
125
- @media (min-width: 768px) {
126
- :host {
127
- --pd-teaser-height: 280px;
128
- --pd-menu-height: 56px;
129
- }
130
- }
131
-
132
- /* Desktop (1024px+) */
133
- @media (min-width: 1024px) {
134
- :host {
135
- --pd-teaser-height: 380px;
136
- --pd-menu-height: 60px;
137
- }
138
- }
139
-
140
- /* ═══════════════════════════════════════════════════════════════════════
141
- HEADER
142
- ═══════════════════════════════════════════════════════════════════════ */
143
- header {
144
- flex-grow: 0;
145
- position: fixed;
146
- top: 0;
147
- width: 100%;
148
- z-index: 99;
149
- }
150
-
151
- /* ═══════════════════════════════════════════════════════════════════════
152
- FOOTER
153
- ═══════════════════════════════════════════════════════════════════════ */
154
- footer {
155
- flex-grow: 0;
156
- }
157
-
158
- /* ═══════════════════════════════════════════════════════════════════════
159
- TEASER
160
- ═══════════════════════════════════════════════════════════════════════ */
161
- .teaser {
162
- --pd-panel-overflow: hidden;
163
- --pd-panel-height: var(--pd-teaser-height);
164
- --pd-panel-width: 100%;
165
- --pd-panel-border-radius: 0;
166
- --pd-panel-bg: var(--pd-default-col);
167
- --pd-panel-viewer-bg-col: var(--pd-default-col);
168
-
169
- height: var(--pd-teaser-height);
170
- overflow: hidden;
171
- transition: height var(--pd-header-transition);
172
- }
173
-
174
- /* Teaser collapsed */
175
- :host([teaser-collapsed]) .teaser {
176
- height: 0;
177
- pointer-events: none; /* Prevent Hammer.js from processing swipe events while collapsed */
178
- }
179
-
180
- :host([teaser-collapsed]) {
181
- --pd-teaser-height: 0px;
182
- }
183
-
184
- /* No menu: set height to 0 for correct padding calculations */
185
- :host([no-menu]) {
186
- --pd-menu-height: 0px;
187
- }
188
-
189
- /* No top-menu: set height to 0 for correct padding calculations */
190
- :host([no-top-menu]) {
191
- --pd-top-menu-height: 0px;
192
- }
193
-
194
- /* Skip teaser transition during navigate-and-scroll */
195
- :host([skip-teaser-transition]) .teaser {
196
- transition: none !important;
197
- }
198
-
199
- /* ═══════════════════════════════════════════════════════════════════════
200
- MAIN MENU
201
- ═══════════════════════════════════════════════════════════════════════ */
202
- .menu {
203
- transition: background-color var(--pd-header-transition);
204
- }
205
-
206
- /* Menu colors when teaser is visible (has teaser AND not collapsed) */
207
- :host(:not([teaser-collapsed])) .menu.with-teaser {
208
- --pd-menu-bg-col: var(--pd-spa-menu-change-col, #afc1d2);
209
- --pd-menu-font-col: var(--pd-spa-menu-change-font-col, #0a3a48);
210
- }
211
-
212
- /* ═══════════════════════════════════════════════════════════════════════
213
- TOP MENU
214
- ═══════════════════════════════════════════════════════════════════════ */
215
- .top-menu {
216
- --pd-menu-height: var(--pd-top-menu-height);
217
- --pd-menu-font-size: 0.8em;
218
- --pd-menu-shadow: 0;
219
- }
220
-
221
- /* Top-menu colors when teaser is visible */
222
- :host(:not([teaser-collapsed])) .top-menu.with-teaser {
223
- --pd-menu-bg-col: var(--pd-teaser-bg-col);
224
- }
225
-
226
- /* ═══════════════════════════════════════════════════════════════════════
227
- MAIN CONTENT
228
- ═══════════════════════════════════════════════════════════════════════ */
229
- main {
230
- flex-grow: 1;
231
- flex-basis: max-content;
232
- padding-top: calc(var(--pd-menu-height) + var(--pd-top-menu-height));
233
- }
234
-
235
- /* When teaser is visible (has teaser AND not collapsed), add teaser height */
236
- :host(:not([teaser-collapsed])) main.with-teaser {
237
- padding-top: calc(
238
- var(--pd-menu-height) + var(--pd-top-menu-height) +
239
- var(--pd-teaser-height)
240
- );
241
- }
242
-
243
- /* ═══════════════════════════════════════════════════════════════════════
244
- LOGIN MODAL
245
- ═══════════════════════════════════════════════════════════════════════ */
246
- .login-modal {
247
- --pd-popup-default-display: block;
248
- --pd-popup-content-bg: var(--pd-default-bg-light-col);
249
- }
250
- `;
251
- }
252
- connectedCallback() {
253
- super.connectedCallback();
254
- pdRouterService.onRouteChange(({ route, params, query }) => {
255
- const isRouteChange = route !== this._route;
256
- const isLoginModal = route === "login";
257
- if (isRouteChange && !isLoginModal) {
258
- this.scrollController.scrollToTop();
259
- }
260
- this._route = route;
261
- this._params = params;
262
- this._query = query;
263
- });
264
- this._subscription = pdStore().select(getLoadingSelector).subscribe((loadingState) => {
265
- this._loadingState = loadingState;
266
- });
267
- this.addEventListener(
268
- SPA_EVENTS.APP_CONFIG,
269
- this._handleAppConfigEvent
270
- );
271
- this.addEventListener(
272
- "section-activated",
273
- this._handleSectionActivated
274
- );
275
- this.scrollController.setThreshold(this.teaserCollapseThreshold);
276
- }
277
- disconnectedCallback() {
278
- this._subscription?.unsubscribe();
279
- this.removeEventListener(
280
- SPA_EVENTS.APP_CONFIG,
281
- this._handleAppConfigEvent
282
- );
283
- this.removeEventListener(
284
- "section-activated",
285
- this._handleSectionActivated
286
- );
287
- super.disconnectedCallback();
288
- }
289
- willUpdate(changedProps) {
290
- super.willUpdate(changedProps);
291
- if (changedProps.has("_route") && this._route) {
292
- const pageConf = spaConfig.getNavigationPage(this._route);
293
- const hasTeaser = !!(pageConf?.withTeaser && this._getTeaserContent().length > 0);
294
- this.toggleAttribute("no-menu", !!pageConf?.hideMenu);
295
- this.toggleAttribute(
296
- "no-top-menu",
297
- !!pageConf?.hideTopMenu || !pageConf?.topMenuItems?.length
298
- );
299
- this.scrollController.setTeaserCollapseEnabled(hasTeaser);
300
- if (this._pendingScrollSectionId) {
301
- this.teaserCollapsed = true;
302
- this._skipTeaserTransition = true;
303
- } else {
304
- this._skipTeaserTransition = false;
305
- this.teaserCollapsed = !hasTeaser;
306
- }
307
- }
308
- }
309
- // ---------------------------------------------------------------------------
310
- // Render
311
- // ---------------------------------------------------------------------------
312
- render() {
313
- if (this._route === "") {
314
- return this._renderLoading();
315
- }
316
- const isLoginModal = this._route === "login";
317
- const configRoute = isLoginModal ? pdRouterService.previousRoute || "home" : this._route;
318
- const pageConf = spaConfig.getNavigationPage(configRoute);
319
- const showTeaser = !!(pageConf?.withTeaser && this._getTeaserContent().length > 0);
320
- return this._renderLayout(pageConf, showTeaser);
321
- }
322
- /**
323
- * Render the loading state while route is being resolved
324
- * Can be overridden by subclass
325
- */
326
- _renderLoading() {
327
- return html`<slot name="loading"><p>Loading...</p></slot>`;
328
- }
329
- /**
330
- * Render the main layout
331
- * Can be overridden by subclass for custom layouts
332
- */
333
- _renderLayout(pageConf, showTeaser) {
334
- const isLoginModal = this._route === "login";
335
- const backgroundRoute = pdRouterService.previousRoute || "home";
336
- const contentRoute = isLoginModal ? backgroundRoute : this._route;
337
- return html`
338
- <header>
339
- ${pageConf?.hideTopMenu ? "" : this._renderTopMenu(pageConf, showTeaser)}
340
- ${showTeaser ? this._renderTeaser() : ""}
341
- ${pageConf?.hideMenu ? "" : this._renderMenu(pageConf, showTeaser)}
342
- </header>
343
-
344
- <main
345
- class="${this._getMainClass(pageConf, showTeaser)}"
346
- @init-menu-sections="${this._handleInitMenuSections}"
347
- >
348
- ${this._loadingState.map(
349
- (ls) => html`<pd-loading-state .loadingState="${ls}"></pd-loading-state>`
350
- )}
351
- ${this._renderRoutePages(contentRoute)}
352
- ${this._route === "not-found" ? html`<default-not-found></default-not-found>` : ""}
353
- </main>
354
-
355
- ${isLoginModal ? this._renderLoginModal() : ""}
356
- ${pageConf?.withFooter ? html`<footer>${this._renderFooter()}</footer>` : ""}
357
-
358
- <pd-toast></pd-toast>
359
- `;
360
- }
361
- /**
362
- * Render the login modal popup
363
- */
364
- _renderLoginModal() {
365
- return html`
366
- <pd-popup
367
- class="login-modal"
368
- closeByEscape
369
- popupLabel="Anmeldung"
370
- @popup-close="${this._handleLoginPopupClose}"
371
- >
372
- <default-login slot="content"></default-login>
373
- </pd-popup>
374
- `;
375
- }
376
- /**
377
- * Handle login popup close (user aborted login via Escape or backdrop click)
378
- */
379
- _handleLoginPopupClose() {
380
- const backRoute = pdRouterService.previousRoute || "/";
381
- pdRouterService.navigate(backRoute);
382
- }
383
- // ---------------------------------------------------------------------------
384
- // Layout Rendering Methods (can be overridden)
385
- // ---------------------------------------------------------------------------
386
- _renderMenu(pageConfig, showTeaser) {
387
- const menuForPage = pageConfig?.menu || [];
388
- if (!menuForPage.length) return "";
389
- const showLogo = !showTeaser || this.teaserCollapsed;
390
- const visibleMenuItems = menuForPage.filter(
391
- (item) => !item.requiredRoles?.length || item.requiredRoles.some((role) => this._claims?.[role] === true)
392
- );
393
- if (!visibleMenuItems.length) return "";
394
- return html`
395
- <pd-menu
396
- id="pdHelperMenuId"
397
- class="menu ${showTeaser ? "with-teaser" : ""}"
398
- @locale-change="${this._handleLocaleChange}"
399
- selectedLocale="${this._selectedLocale}"
400
- .locales=${this._singleLocaleMenu ? this._availableLocales : []}
401
- .menuItems=${visibleMenuItems}
402
- .topMenuItems=${[]}
403
- activeRoute="${this._route}"
404
- logoRoute="${pageConfig?.menuLogoRoute || ""}"
405
- >
406
- ${showLogo ? this._getAppLogo() : ""}
407
- </pd-menu>
408
- `;
409
- }
410
- _renderTopMenu(pageConfig, showTeaser) {
411
- const topMenuForPage = pageConfig?.topMenuItems;
412
- if (!topMenuForPage) return "";
413
- const visibleTopMenuItems = topMenuForPage.filter(
414
- (item) => !item.requiredRoles?.length || item.requiredRoles.some((role) => this._claims?.[role] === true)
415
- );
416
- if (!visibleTopMenuItems.length) return "";
417
- return html`
418
- <pd-menu
419
- id="pdHelperTopMenuId"
420
- noBurgerMenu
421
- class="top-menu ${showTeaser ? "with-teaser" : ""}"
422
- @locale-change="${this._handleLocaleChange}"
423
- .locales=${this._availableLocales}
424
- selectedLocale="${this._selectedLocale}"
425
- .topMenuItems=${visibleTopMenuItems}
426
- activeRoute="${this._route}"
427
- >
428
- </pd-menu>
429
- `;
430
- }
431
- _renderTeaser() {
432
- const teaserContent = this._getTeaserContent();
433
- if (!teaserContent || teaserContent.length === 0) {
434
- return "";
435
- }
436
- return html`
437
- <pd-panel-viewer class="teaser" id="teaserPanelViewerId" deltaCalc="4">
438
- ${teaserContent.map((content) => html`<pd-panel>${content}</pd-panel>`)}
439
- </pd-panel-viewer>
440
- `;
441
- }
442
- _renderFooter() {
443
- const footer = this._getFooter();
444
- return html`
445
- <pd-footer
446
- .footerLinks="${footer.links}"
447
- version="${footer.version}"
448
- copyright="${footer.copyright || "PD Progressive Development UG"}"
449
- .madeBy="${MADE_BY}"
450
- @footer-link="${this._handleFooterLink}"
451
- >
452
- </pd-footer>
453
- `;
454
- }
455
- // ---------------------------------------------------------------------------
456
- // Optional Override Methods (have default implementations)
457
- // ---------------------------------------------------------------------------
458
- /**
459
- * Get teaser content panels
460
- * Override to provide teaser content, or return empty array for no teaser
461
- */
462
- _getTeaserContent() {
463
- return [];
464
- }
465
- // ---------------------------------------------------------------------------
466
- // Event Handlers
467
- // ---------------------------------------------------------------------------
468
- _handleRouteEvent(e) {
469
- if (e.detail.el && !e.detail.route) {
470
- this._scrollToSection(e.detail.el);
471
- } else if (e.detail.route) {
472
- if (e.detail.sectionId) {
473
- this._pendingScrollSectionId = e.detail.sectionId;
474
- }
475
- this._navigateToPage(e.detail.route);
476
- }
477
- }
478
- _handleFooterLink(e) {
479
- const { linkObj } = e.detail;
480
- if (linkObj.link) {
481
- this._navigateToPage(linkObj.link);
482
- }
483
- if (linkObj.action) {
484
- linkObj.action();
485
- }
486
- }
487
- _handleInitMenuSections(e) {
488
- const pageConf = spaConfig.getNavigationPage(this._route);
489
- if (pageConf?.menu) {
490
- pageConf.menu = pageConf.menu.map((menuElement) => ({
491
- ...menuElement,
492
- ref: menuElement.sec ? e.detail.menuRefs[menuElement.sec] ?? void 0 : void 0
493
- }));
494
- this.requestUpdate();
495
- }
496
- if (e.detail.sectionActions) {
497
- for (const [sectionId, actionCreator] of Object.entries(
498
- e.detail.sectionActions
499
- )) {
500
- this._sectionActions.set(sectionId, actionCreator);
501
- }
502
- }
503
- if (this._pendingScrollSectionId) {
504
- const element = this._findSectionElement(this._pendingScrollSectionId);
505
- if (element) {
506
- requestAnimationFrame(() => {
507
- this._scrollToSection(element);
508
- this._skipTeaserTransition = false;
509
- });
510
- } else {
511
- this._skipTeaserTransition = false;
512
- }
513
- this._pendingScrollSectionId = null;
514
- }
515
- }
516
- /**
517
- * Handle section-activated event from pd-menu.
518
- * Dispatches the registered action for a section (once per session).
519
- */
520
- _handleSectionActivated(e) {
521
- const { sectionId } = e.detail;
522
- const actionCreator = this._sectionActions.get(sectionId);
523
- if (actionCreator) {
524
- fireOnceService.fireOnce(sectionId, actionCreator());
525
- }
526
- }
527
- _handleLocaleChange(e) {
528
- spaLogger.debug("Handle change locale", e);
529
- const newLocale = e.detail;
530
- this._setLocale(newLocale);
531
- this._selectedLocale = newLocale;
532
- setCurrentFormatLocale(newLocale);
533
- }
534
- _handleAppConfigEvent(event) {
535
- const customEvent = event;
536
- if (customEvent.detail) {
537
- customEvent.detail.appConf = this._getAppConfiguration();
538
- }
539
- }
540
- // ---------------------------------------------------------------------------
541
- // Private Methods
542
- // ---------------------------------------------------------------------------
543
- _activateLoginHandler() {
544
- spaLogger.debug("Activating login handler");
545
- services.auth.onAuthStateChanged(async (user) => {
546
- spaLogger.debug("Auth state changed", user?.email);
547
- const newState = user ? "logged-in" : "logged-out";
548
- if (user) {
549
- const tokenResult = await services.auth.getIdTokenResult();
550
- const claims = tokenResult?.claims || {};
551
- this._claims = claims;
552
- pdStore().dispatch(
553
- loginSuccess({
554
- uid: user.uid,
555
- email: user.email,
556
- emailVerified: user.emailVerified,
557
- claims,
558
- providerId: "unknown"
559
- // Provider ID is Firebase-specific, not in interface
560
- })
561
- );
562
- const redirectRoute = sessionStorage.getItem(POST_LOGIN_REDIRECT_KEY);
563
- if (redirectRoute) {
564
- const routeToNavigate = redirectRoute && redirectRoute !== "/login" ? redirectRoute : "";
565
- sessionStorage.removeItem(POST_LOGIN_REDIRECT_KEY);
566
- spaLogger.debug("Redirecting after login to:", routeToNavigate);
567
- this._navigateToPage(routeToNavigate);
568
- }
569
- if (this._previousAuthState === "logged-out") {
570
- toastBus.success(`Angemeldet als ${user.email}`);
571
- }
572
- } else {
573
- pdStore().dispatch(nologin());
574
- this._claims = {};
575
- if (this._previousAuthState === "logged-in") {
576
- toastBus.info("Abgemeldet");
577
- this._navigateToPage(spaConfig.logoutRedirect);
578
- }
579
- }
580
- this._previousAuthState = newState;
581
- });
582
- }
583
- _getMainClass(pageConf, showTeaser) {
584
- if (pageConf?.mainClass) {
585
- return pageConf.mainClass;
586
- }
587
- return showTeaser ? "with-teaser" : "";
588
- }
589
- _navigateToPage(routeURL) {
590
- pdRouterService.navigate(routeURL);
591
- }
592
- /**
593
- * Scroll to a section element. Collapses teaser if expanded.
594
- */
595
- _scrollToSection(element) {
596
- if (!this.teaserCollapsed) {
597
- this.teaserCollapsed = true;
598
- }
599
- element.scrollIntoView({ behavior: "smooth", block: "start" });
600
- }
601
- /**
602
- * Find section element by sectionId from current page's menu refs.
603
- */
604
- _findSectionElement(sectionId) {
605
- const pageConf = spaConfig.getNavigationPage(this._route);
606
- if (!pageConf?.menu) return null;
607
- const menuItem = pageConf.menu.find(
608
- (item) => item.sec === sectionId
609
- );
610
- return menuItem?.ref ?? null;
611
- }
612
- // ---------------------------------------------------------------------------
613
- // Responsive Handling
614
- // ---------------------------------------------------------------------------
615
- }
616
- __decorateClass([
617
- property({ type: String })
618
- ], PdSpaHelper.prototype, "title");
619
- __decorateClass([
620
- property({ type: Number, attribute: "teaser-collapse-threshold" })
621
- ], PdSpaHelper.prototype, "teaserCollapseThreshold");
622
- __decorateClass([
623
- state()
624
- ], PdSpaHelper.prototype, "_loadingState");
625
- __decorateClass([
626
- state()
627
- ], PdSpaHelper.prototype, "_route");
628
- __decorateClass([
629
- state()
630
- ], PdSpaHelper.prototype, "_params");
631
- __decorateClass([
632
- state()
633
- ], PdSpaHelper.prototype, "_query");
634
- __decorateClass([
635
- property({ type: Boolean, reflect: true, attribute: "teaser-collapsed" })
636
- ], PdSpaHelper.prototype, "teaserCollapsed");
637
- __decorateClass([
638
- property({
639
- type: Boolean,
640
- reflect: true,
641
- attribute: "skip-teaser-transition"
642
- })
643
- ], PdSpaHelper.prototype, "_skipTeaserTransition");
644
- __decorateClass([
645
- state()
646
- ], PdSpaHelper.prototype, "_selectedLocale");
647
- __decorateClass([
648
- state()
649
- ], PdSpaHelper.prototype, "_claims");
650
-
651
- export { PdSpaHelper, startInit };