js-kompo-utils 1.0.37 → 1.0.38

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.
@@ -1,3 +1,5 @@
1
+ import { installGlobalLoading } from './loading/globalLoading.js';
2
+
1
3
  export class KompoJsConfigBuilder {
2
4
  components = {};
3
5
  bootstrapCallback = null;
@@ -13,6 +15,7 @@ export class KompoJsConfigBuilder {
13
15
  appSelector = '#app';
14
16
  includeBroadcasting = false;
15
17
  echoBroadcasterConfig = null;
18
+ includeGlobalLoading = true;
16
19
 
17
20
  beforeStepCallbacks = {};
18
21
  afterStepCallbacks = {};
@@ -138,6 +141,16 @@ export class KompoJsConfigBuilder {
138
141
  return this;
139
142
  }
140
143
 
144
+ withGlobalLoading() {
145
+ this.includeGlobalLoading = true;
146
+ return this;
147
+ }
148
+
149
+ withoutGlobalLoading() {
150
+ this.includeGlobalLoading = false;
151
+ return this;
152
+ }
153
+
141
154
  withBroadcasting(config) {
142
155
  this.includeBroadcasting = true;
143
156
  this.echoBroadcasterConfig = {
@@ -231,6 +244,8 @@ export class KompoJsInitializer {
231
244
 
232
245
  this._callStep('bootVue');
233
246
 
247
+ this._callStep('bootGlobalLoadingIfRequired');
248
+
234
249
  this._callStep('decorateWindow');
235
250
 
236
251
  this._callStep('bootCkEditorIfRequired');
@@ -311,6 +326,12 @@ export class KompoJsInitializer {
311
326
  }
312
327
  }
313
328
 
329
+ bootGlobalLoadingIfRequired() {
330
+ if (this.config.includeGlobalLoading) {
331
+ installGlobalLoading(this.window, this.window.document);
332
+ }
333
+ }
334
+
314
335
  decorateWindow() {
315
336
  for (const [key, value] of Object.entries(this.config.windowUtilsObject)) {
316
337
  if (!this.window.utils) {
@@ -0,0 +1,80 @@
1
+ const HOST_ID = 'vl-global-loading'
2
+ const HOST_CLASS = 'vlGlobalLoading'
3
+ const LEGACY_ID = 'vl-spinner'
4
+ const LEGACY_KEY = '__legacy__'
5
+ const DEFAULT_WATCHDOG_MS = 20000
6
+
7
+ /**
8
+ * Ref-counted full-screen loading, owned by us.
9
+ * Writes only .vlGlobalLoading — .vlPanelLoading stays vue-kompo's (->withLoadingIn).
10
+ */
11
+ export function installGlobalLoading(win, doc, options = {}) {
12
+ if (!win || !win._kompo || win._kompo.loading) return
13
+
14
+ const watchdogMs = options.watchdogMs || DEFAULT_WATCHDOG_MS
15
+ const keys = new Map()
16
+ let seq = 0
17
+
18
+ const host = () => doc.getElementById(HOST_ID)
19
+
20
+ // kompo::scripts emits the <script> tags BEFORE @includeIf('kompo.scripts'),
21
+ // so neither the host nor #vl-spinner exists yet when we install. Resolve
22
+ // both lazily on every render instead of once at install time.
23
+ const hideLegacySpinner = () => {
24
+ const el = doc.getElementById(LEGACY_ID)
25
+ if (el) el.style.display = 'none'
26
+ }
27
+
28
+ const render = () => {
29
+ hideLegacySpinner()
30
+ const el = host()
31
+ if (!el) return
32
+ if (keys.size) el.classList.add(HOST_CLASS)
33
+ else el.classList.remove(HOST_CLASS)
34
+ }
35
+
36
+ const end = (key) => {
37
+ if (!keys.has(key)) return
38
+ clearTimeout(keys.get(key))
39
+ keys.delete(key)
40
+ render()
41
+ }
42
+
43
+ const begin = (key, timeoutMs) => {
44
+ const k = key || `k${++seq}`
45
+ if (keys.has(k)) clearTimeout(keys.get(k))
46
+ keys.set(k, setTimeout(() => end(k), timeoutMs || watchdogMs))
47
+ render()
48
+ return k
49
+ }
50
+
51
+ const clear = () => {
52
+ keys.forEach(t => clearTimeout(t))
53
+ keys.clear()
54
+ render()
55
+ }
56
+
57
+ win._kompo.loading = { begin, end, clear, active: () => keys.size > 0 }
58
+
59
+ // Route TurboClick / Layout / $k.loading through the same host, ref-counted.
60
+ // Layout.$_state fires toggleSpinner('none') on unrelated state writes, so a
61
+ // legacy hide must only drop the legacy slot, never keys opened by begin().
62
+ const rawToggle = win._kompo.toggleSpinner
63
+ win._kompo.toggleSpinner = function (display) {
64
+ if (display === 'block') begin(LEGACY_KEY)
65
+ else end(LEGACY_KEY)
66
+ }
67
+ win._kompo.toggleSpinnerRaw = rawToggle
68
+
69
+ // ->submit() never reaches applyLoadingPanel (Action.js submitFormAction),
70
+ // so tear down on the form lifecycle events instead.
71
+ const bus = win.Vue && win.Vue.prototype && win.Vue.prototype.$kompo
72
+ if (bus) {
73
+ const onSuccess = bus.vlSubmitSuccess
74
+ const onError = bus.vlSubmitError
75
+ bus.vlSubmitSuccess = function (...args) { clear(); return onSuccess.apply(this, args) }
76
+ bus.vlSubmitError = function (...args) { clear(); return onError.apply(this, args) }
77
+ }
78
+
79
+ render()
80
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "js-kompo-utils",
3
- "version": "1.0.37",
3
+ "version": "1.0.38",
4
4
  "description": "",
5
5
  "main": "app.js",
6
6
  "scripts": {