@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.
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 +14 -49
  35. package/dist/generated/locale-wrapper/be-wrapper.d.ts.map +1 -1
  36. package/dist/generated/locale-wrapper/de-wrapper.d.ts +14 -49
  37. package/dist/generated/locale-wrapper/de-wrapper.d.ts.map +1 -1
  38. package/dist/generated/locale-wrapper/en-wrapper.d.ts +14 -49
  39. package/dist/generated/locale-wrapper/en-wrapper.d.ts.map +1 -1
  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 +10 -55
  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 -13
  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 -14
  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 -37
  205. package/dist/components/pd-spa-helper/PdSpaHelper.d.ts +0 -196
  206. package/dist/components/pd-spa-helper/PdSpaHelper.d.ts.map +0 -1
  207. package/dist/components/pd-spa-helper/PdSpaHelper.js +0 -603
  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 -95
  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 -175
  214. package/dist/components/pd-spa-helper/spa-events.d.ts +0 -132
  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 -98
  263. package/dist/store/async-action-utils.d.ts +0 -154
  264. package/dist/store/async-action-utils.d.ts.map +0 -1
  265. package/dist/store/async-action-utils.js +0 -42
  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,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"}