@peckadesign/pd-naja 1.0.0 → 1.0.1

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.
@@ -0,0 +1,393 @@
1
+ /**
2
+ * PD Naja utils & extensions - Utilities and extensions created for use with Naja library.
3
+ * https://github.com/peckadesign/pd-naja#readme
4
+ *
5
+ * @author PeckaDesign, s.r.o <support@peckadesign.cz>
6
+ * @license MIT
7
+ *
8
+ * @version 1.0.1
9
+ */
10
+
11
+ import naja from 'naja';
12
+
13
+ let instance = null;
14
+ class ControlManager {
15
+ constructor() {
16
+ this.onLoadControl = [];
17
+ this.onLiveControl = [];
18
+ if (instance === null) {
19
+ // eslint-disable-next-line @typescript-eslint/no-this-alias
20
+ instance = this;
21
+ naja.snippetHandler.addEventListener('afterUpdate', this.onSnippetUpdate.bind(this));
22
+ }
23
+ return instance;
24
+ }
25
+ onLoad() {
26
+ this.initialize(this.onLoadControl);
27
+ this.initialize(this.onLiveControl);
28
+ }
29
+ onSnippetUpdate(event) {
30
+ this.initialize(this.onLiveControl, event.detail.snippet);
31
+ }
32
+ initialize(controls, snippet) {
33
+ controls.forEach((control) => {
34
+ control.initialize(snippet || document);
35
+ });
36
+ }
37
+ addControlOnLoad(control) {
38
+ this.onLoadControl.push(control);
39
+ }
40
+ addControlOnLive(control) {
41
+ this.onLiveControl.push(control);
42
+ }
43
+ }
44
+
45
+ class AjaxModalExtension {
46
+ constructor(modal) {
47
+ this.uniqueExtKey = 'modal';
48
+ this.popstateFlag = false;
49
+ this.hidePopstateFlag = false;
50
+ this.historyEnabled = false; // (dis)allows `pushState` after hiding the modal when going back in history (popstate), we don't want to push new state into history same is true also when the history is disabled for request altogether
51
+ this.historyDirection = 'backwards';
52
+ this.modalOptions = {};
53
+ this.original = []; // stack of states under the modal after hiding the modal with `forwards` history mode, we need to push the previous state
54
+ this.lastState = null;
55
+ this.abortControllers = new Map();
56
+ this.isRequestWithHistory = (options) => {
57
+ return options.history !== false;
58
+ };
59
+ this.isPdModalState = (state) => {
60
+ return 'pdModal' in state && state.pdModal?.isShown;
61
+ };
62
+ this.restoreExtensionPropertiesFromState = (state) => {
63
+ this.historyEnabled = true; // Called from popstateHandler means the history is enabled
64
+ this.historyDirection = state.pdModal.historyDirection;
65
+ this.modalOptions = state.pdModal.options;
66
+ };
67
+ // Extension popstate has to be executed before naja popstate, so we can correctly detect if the pdModal is
68
+ // opened. Therefore, we bind the callback before the extension initialization itself.
69
+ window.addEventListener('popstate', this.popstateHandler.bind(this));
70
+ this.modal = modal;
71
+ this.initialState = history.state || {};
72
+ }
73
+ initialize(naja) {
74
+ naja.uiHandler.addEventListener('interaction', this.checkExtensionEnabled.bind(this));
75
+ naja.historyHandler.addEventListener('buildState', this.buildState.bind(this));
76
+ naja.snippetCache.addEventListener('fetch', this.onSnippetFetch.bind(this));
77
+ naja.addEventListener('before', this.before.bind(this));
78
+ naja.addEventListener('start', this.abortPreviousRequest.bind(this));
79
+ naja.addEventListener('success', this.success.bind(this));
80
+ naja.addEventListener('complete', this.clearRequest.bind(this));
81
+ this.modal.onShow(this.showHandler.bind(this));
82
+ this.modal.onHide(() => {
83
+ this.removeModalSnippetsIds();
84
+ this.abortControllers.get('modal')?.abort();
85
+ });
86
+ this.modal.onHidden(this.hiddenHandler.bind(this));
87
+ }
88
+ checkExtensionEnabled(event) {
89
+ const { element, options } = event.detail;
90
+ options.pdModal =
91
+ this.modal.isShown() ||
92
+ element.hasAttribute('data-naja-modal') ||
93
+ element.form?.hasAttribute('data-naja-modal');
94
+ // If the extension is enabled and modal is not opened, we detect and store history mode. History mode cannot
95
+ // change when traversing ajax link inside modal.
96
+ if (!options.pdModal) {
97
+ return;
98
+ }
99
+ // `modalOptions` will be stored in state, therefore no `Element` is allowed. These options are also forwarded
100
+ // to other Naja event handlers via `options`. We also store the element separately to be used there as well.
101
+ this.modalOptions = this.modal.getOptions(element);
102
+ options.modalOptions = this.modalOptions;
103
+ options.modalOpener = element;
104
+ // History direction can only be set before opening the modal, then it stays the same until modal is hidden.
105
+ if (!this.modal.isShown()) {
106
+ this.historyDirection = element.getAttribute('data-naja-modal-history') === 'forwards' ? 'forwards' : 'backwards';
107
+ }
108
+ }
109
+ onSnippetFetch(event) {
110
+ event.detail.options.pdModal = 'pdModal' in event.detail.state;
111
+ }
112
+ removeModalSnippetsIds() {
113
+ // When closing the modal, we don't want to update any snippets inside it, when other requests finishes. This
114
+ // will ensure, that snippets that might be also outside modal (e.g. flash messages) will be redrawn outside the
115
+ // modal. Therefore, we remove the id attributes, so no snippet is found.
116
+ //
117
+ // Some snippets are necessary for modal function
118
+ this.modal.element.querySelectorAll('[id^="snippet-"]').forEach((snippet) => {
119
+ if (!this.modal.reservedSnippetIds.includes(snippet.id)) {
120
+ snippet.removeAttribute('id');
121
+ }
122
+ });
123
+ }
124
+ abortPreviousRequest(event) {
125
+ const { abortController, options } = event.detail;
126
+ if (options.pdModal) {
127
+ this.abortControllers.get(this.uniqueExtKey)?.abort();
128
+ this.abortControllers.set(this.uniqueExtKey, abortController);
129
+ }
130
+ }
131
+ clearRequest(event) {
132
+ const { request } = event.detail;
133
+ if (!request.signal.aborted) {
134
+ this.abortControllers.delete(this.uniqueExtKey);
135
+ }
136
+ }
137
+ buildState(event) {
138
+ const { options, state } = event.detail;
139
+ // Every time naja builds the state, we extend it with `pdModal` object containing information about modal being
140
+ // opened and what history mode is in use. When options.forceRedirect is set, modal might be open but the new
141
+ // state will be redirected outside it.
142
+ const isShown = this.modal.isShown() && !options.forceRedirect;
143
+ state.pdModal = {
144
+ isShown,
145
+ historyDirection: isShown ? this.historyDirection : null,
146
+ options: isShown ? this.modalOptions : null
147
+ };
148
+ // If the state is build, the history is enabled. This information is needed inside modal callback where the
149
+ // options are not available, so we store this internally in extension.
150
+ this.historyEnabled = true;
151
+ }
152
+ before(event) {
153
+ const { options, request } = event.detail;
154
+ if (!options.pdModal) {
155
+ return;
156
+ }
157
+ this.modal.show(options.modalOpener, options.modalOptions, event);
158
+ request.headers.append('Pd-Modal-Opened', String(Number(this.modal.isShown())));
159
+ }
160
+ success(event) {
161
+ const { options, payload } = event.detail;
162
+ this.popstateFlag = false;
163
+ this.lastState = {
164
+ location: location.href,
165
+ state: history.state,
166
+ title: document.title
167
+ };
168
+ if (!options.pdModal) {
169
+ return;
170
+ }
171
+ const requestHistory = this.isRequestWithHistory(options);
172
+ // If the history is disabled for current request, we will disable it for all ajax links / forms in modal as well.
173
+ if (!requestHistory && event.target) {
174
+ const ajaxified = this.modal.element.querySelectorAll(event.target.uiHandler?.selector);
175
+ ajaxified.forEach((element) => {
176
+ element.setAttribute('data-naja-history', 'off');
177
+ });
178
+ }
179
+ if (payload.closeModal) {
180
+ this.modal.hide(event);
181
+ }
182
+ else {
183
+ this.modal.setOptions(this.modalOptions);
184
+ if (this.modal.dispatchLoad) {
185
+ this.modal.dispatchLoad(this.modalOptions, event);
186
+ }
187
+ }
188
+ }
189
+ showHandler() {
190
+ this.modal.setOptions(this.modalOptions);
191
+ // If the modal history mode is `forwards`, we store the state under the modal, so we can push it as a new state
192
+ // after hiding the modal.
193
+ if (this.historyDirection === 'forwards') {
194
+ if (this.popstateFlag && this.lastState) {
195
+ this.original.push(this.lastState);
196
+ }
197
+ else {
198
+ const state = {
199
+ location: location.href,
200
+ state: history.state,
201
+ title: document.title
202
+ };
203
+ this.original.push(state);
204
+ }
205
+ }
206
+ }
207
+ hiddenHandler() {
208
+ // This method is called after modal has been hidden. It either pushes a new state into history (mode `forwards`)
209
+ // or calls `history.back()` to start go-back procedure.
210
+ //
211
+ // New state is pushed only if we are able to retrieve the state under the modal (which should have been stored
212
+ // previously) and the modal is not being closed using forward / back buttons in browser.
213
+ if (!this.historyEnabled) {
214
+ return;
215
+ }
216
+ if (this.historyDirection === 'backwards') {
217
+ // We don't know how many states we need to return. We go one by one, see popstate handler. This go-back
218
+ // procedure is detected using `hidePopstateFlag`.
219
+ this.hidePopstateFlag = true;
220
+ this.cleanData();
221
+ window.history.back();
222
+ }
223
+ else if (this.historyDirection === 'forwards') {
224
+ const state = this.original.pop();
225
+ this.original = [];
226
+ if (state) {
227
+ // When closing the modal using forward / back buttons in browser, the current state is the same as the
228
+ // one stored in `this.original`. If that's the case, we don't push anything as it would duplicate the
229
+ // state in history.
230
+ if (history.state === undefined || history.state.href !== state.location) {
231
+ history.pushState(state.state, state.title, state.location);
232
+ document.title = state.title;
233
+ this.popstateFlag = false;
234
+ this.lastState = {
235
+ location: state.location,
236
+ state: state.state,
237
+ title: state.title
238
+ };
239
+ }
240
+ }
241
+ this.cleanData();
242
+ }
243
+ }
244
+ popstateHandler(event) {
245
+ const state = event.state || this.initialState;
246
+ if (typeof state === 'undefined' || !this.modal) {
247
+ return;
248
+ }
249
+ const isCurrentStatePdModal = this.isPdModalState(state);
250
+ this.popstateFlag = true;
251
+ // We don't know how many states we go back. So we go one by one until the new state is not modal state
252
+ // (`isPdModalState` is `false`).
253
+ if (this.hidePopstateFlag) {
254
+ // We don't want the naja popstate callback to be executed (or any other popstate handler).
255
+ event.stopImmediatePropagation();
256
+ if (isCurrentStatePdModal) {
257
+ window.history.back();
258
+ return;
259
+ }
260
+ else {
261
+ // Todo check if this is really necessary. When used with nette.ajax / history.nette.ajax, this was necessary in some cases, where the title hasn't been restored correctly.
262
+ if (state.title) {
263
+ document.title = state.title;
264
+ }
265
+ }
266
+ this.hidePopstateFlag = false;
267
+ }
268
+ // We check if the state has pdModal object present on popstate. If so (and the pdModal.isShown is true), we proceed
269
+ // to open the modal. Content of the modal is restored by naja itself (either from cache or by new request).
270
+ //
271
+ // If the initial state is also detected as pdModal state, we returned to some pdModal state using reload. In that
272
+ // case, we don't want to open the modal, because we might be missing some snippets. Effectively this means that the
273
+ // modal will never be opened by forward / back button if there has been some other site loaded outside the modal
274
+ // (e.g. some non-ajax link leading from modal).
275
+ if (isCurrentStatePdModal && !this.isPdModalState(this.initialState)) {
276
+ this.restoreExtensionPropertiesFromState(state);
277
+ this.modal.show(undefined, state.pdModal.options, event);
278
+ // If there is some snippet cache, we might restore modal options. If not, options will be restored based on
279
+ // options after the ajax request. Same applies to dispatching load event - if cache is on, we dispatch the
280
+ // event immediately, otherwise it will be dispatched after ajax request.
281
+ if (state.snippets?.storage !== 'off') {
282
+ this.modal.setOptions(state.pdModal.options);
283
+ if (this.modal.dispatchLoad) {
284
+ this.modal.dispatchLoad(this.modalOptions, event);
285
+ }
286
+ }
287
+ }
288
+ else {
289
+ this.historyEnabled = false; // Hiding modal using forward / back button, we disable the history to prevent state duplication
290
+ // Reload the page if the initial state has been inside modal. This prevents snippets loss e.g. during layout changes.
291
+ if (this.isPdModalState(this.initialState)) {
292
+ window.location.reload();
293
+ }
294
+ // Non-modal state and non-modal initial state, we just hide the current modal.
295
+ this.modal.hide(event);
296
+ // We don't want the naja popstate callback to be executed (or any other popstate handler).
297
+ event.stopImmediatePropagation();
298
+ }
299
+ // Keep track of current state. When `backwards` history mode is used, we eventually push this state into
300
+ // `this.original`.
301
+ this.lastState = {
302
+ location: location.href,
303
+ state: state,
304
+ title: document.title
305
+ };
306
+ }
307
+ cleanData() {
308
+ this.historyEnabled = false;
309
+ this.historyDirection = 'backwards';
310
+ this.modalOptions = null;
311
+ }
312
+ }
313
+
314
+ class SpinnerExtension {
315
+ constructor(spinner, getSpinnerProps = undefined, ajaxSpinnerWrapSelector = '.ajax-wrap', ajaxSpinnerPlaceholderSelector = '.ajax-spinner') {
316
+ this.spinner = spinner;
317
+ this.getSpinnerProps = getSpinnerProps;
318
+ this.ajaxSpinnerWrapSelector = ajaxSpinnerWrapSelector;
319
+ this.ajaxSpinnerPlaceholderSelector = ajaxSpinnerPlaceholderSelector;
320
+ }
321
+ initialize(naja) {
322
+ naja.uiHandler.addEventListener('interaction', this.getSpinnerInitiator.bind(this));
323
+ naja.addEventListener('start', this.showSpinners.bind(this));
324
+ naja.addEventListener('complete', this.hideSpinners.bind(this));
325
+ }
326
+ getSpinnerInitiator(event) {
327
+ event.detail.options.spinnerInitiator = event.detail.element;
328
+ }
329
+ showSpinners(event) {
330
+ const { options } = event.detail;
331
+ if (!options.spinnerInitiator) {
332
+ return;
333
+ }
334
+ const spinnerInitiator = options.spinnerInitiator;
335
+ const placeholders = this.getPlaceholders(spinnerInitiator);
336
+ if (placeholders.length === 0) {
337
+ return;
338
+ }
339
+ else {
340
+ options.spinnerQueue = options.spinnerQueue || [];
341
+ placeholders.forEach((placeholder) => {
342
+ let spinner;
343
+ if (typeof this.spinner === 'function') {
344
+ spinner = this.getSpinnerProps ? this.spinner(this.getSpinnerProps(spinnerInitiator)) : this.spinner();
345
+ }
346
+ else {
347
+ spinner = this.spinner;
348
+ }
349
+ placeholder.appendChild(spinner);
350
+ options.spinnerQueue.push(spinner);
351
+ spinner.animate([{ opacity: 0 }, { opacity: 1 }], { duration: 100 });
352
+ });
353
+ }
354
+ }
355
+ hideSpinners(event) {
356
+ const { options } = event.detail;
357
+ if (options.forceRedirect) {
358
+ return;
359
+ }
360
+ options.spinnerQueue?.forEach((spinner) => {
361
+ const animation = spinner.animate({ opacity: 0 }, { duration: 100 });
362
+ animation.finished.then(() => spinner.remove());
363
+ });
364
+ }
365
+ getPlaceholders(element) {
366
+ if (!element) {
367
+ return [];
368
+ }
369
+ const spinner = element.getAttribute('data-naja-spinner') || null;
370
+ let placeholders = [];
371
+ if (spinner === 'off') {
372
+ return [];
373
+ }
374
+ placeholders = this.getPlaceholdersByQuerySelector(spinner);
375
+ return placeholders.length ? placeholders : this.getPlaceholdersByDOM(element);
376
+ }
377
+ getPlaceholdersByQuerySelector(selector) {
378
+ return selector ? Array.from(document.querySelectorAll(selector)) : [];
379
+ }
380
+ getPlaceholdersByDOM(element) {
381
+ const wrap = element.closest(this.ajaxSpinnerWrapSelector);
382
+ if (wrap === null) {
383
+ return [];
384
+ }
385
+ const placeholders = wrap.querySelectorAll(this.ajaxSpinnerPlaceholderSelector);
386
+ return placeholders.length ? Array.from(placeholders) : [wrap];
387
+ }
388
+ }
389
+
390
+ const controlManager = new ControlManager();
391
+
392
+ export { AjaxModalExtension, SpinnerExtension, controlManager };
393
+ //# sourceMappingURL=PdNaja.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PdNaja.esm.js","sources":["../src/utils/ControlManager.ts","../src/extensions/AjaxModalExtension.ts","../src/extensions/SpinnerExtension.ts","../src/index.esm.ts"],"sourcesContent":[null,null,null,null],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ import { Naja, BeforeEvent, SuccessEvent, Extension } from 'naja/dist/Naja';
2
+ declare module 'naja/dist/Naja' {
3
+ interface Options {
4
+ pdModal?: boolean;
5
+ modalOpener?: Element;
6
+ modalOptions?: any;
7
+ }
8
+ interface Payload {
9
+ closeModal?: boolean;
10
+ }
11
+ }
12
+ type CallbackFn = (callback: EventListener) => void;
13
+ export interface AjaxModal {
14
+ element: Element;
15
+ reservedSnippetIds: string[];
16
+ show(opener: Element | undefined, options: any, event: BeforeEvent | PopStateEvent): void;
17
+ hide(event: SuccessEvent | PopStateEvent): void;
18
+ isShown(): boolean;
19
+ onShow: CallbackFn;
20
+ onHide: CallbackFn;
21
+ onHidden: CallbackFn;
22
+ dispatchLoad?: (options: any, event: SuccessEvent | PopStateEvent) => void;
23
+ getOptions(opener: Element): any;
24
+ setOptions(options: any): void;
25
+ }
26
+ export declare class AjaxModalExtension implements Extension {
27
+ private readonly modal;
28
+ private readonly uniqueExtKey;
29
+ private popstateFlag;
30
+ private hidePopstateFlag;
31
+ private historyEnabled;
32
+ private historyDirection;
33
+ private modalOptions;
34
+ private original;
35
+ private lastState;
36
+ private initialState;
37
+ private readonly abortControllers;
38
+ constructor(modal: AjaxModal);
39
+ initialize(naja: Naja): void;
40
+ private isRequestWithHistory;
41
+ private isPdModalState;
42
+ private restoreExtensionPropertiesFromState;
43
+ private checkExtensionEnabled;
44
+ private onSnippetFetch;
45
+ private removeModalSnippetsIds;
46
+ private abortPreviousRequest;
47
+ private clearRequest;
48
+ private buildState;
49
+ private before;
50
+ private success;
51
+ private showHandler;
52
+ private hiddenHandler;
53
+ private popstateHandler;
54
+ private cleanData;
55
+ }
56
+ export {};
@@ -0,0 +1,33 @@
1
+ import { Extension, Naja } from 'naja/dist/Naja';
2
+ /**
3
+ * @author Radek Šerý
4
+ *
5
+ * Spinner - loading indicator:
6
+ * 1. Extension can be turned off by using `data-naja-spinner="off"`.
7
+ * 2. If there is `data-naja-spinner` with different value, this value is used as a selector for element into which the spinner element is appended.
8
+ * 3. If there is no `data-naja-spinner`, closest `ajaxSpinnerWrapSelector` is being searched for and:
9
+ * i. If there is `ajaxSpinnerPlaceholderSelector` inside, this element is used for placing spinner element.
10
+ * ii. If not, the spinner element is appended into `ajaxSpinnerWrapSelector` itself.
11
+ */
12
+ declare module 'naja/dist/Naja' {
13
+ interface Options {
14
+ spinnerInitiator?: Element;
15
+ }
16
+ }
17
+ type spinnerType = ((props?: any) => Element) | Element;
18
+ type spinnerPropsFn = ((initiator: Element) => any) | undefined;
19
+ export declare class SpinnerExtension implements Extension {
20
+ readonly spinner: spinnerType;
21
+ readonly getSpinnerProps?: spinnerPropsFn;
22
+ readonly ajaxSpinnerWrapSelector: string;
23
+ readonly ajaxSpinnerPlaceholderSelector: string;
24
+ constructor(spinner: spinnerType, getSpinnerProps?: spinnerPropsFn, ajaxSpinnerWrapSelector?: string, ajaxSpinnerPlaceholderSelector?: string);
25
+ initialize(naja: Naja): void;
26
+ private getSpinnerInitiator;
27
+ private showSpinners;
28
+ private hideSpinners;
29
+ private getPlaceholders;
30
+ private getPlaceholdersByQuerySelector;
31
+ private getPlaceholdersByDOM;
32
+ }
33
+ export {};
@@ -0,0 +1,4 @@
1
+ import ControlManager from './utils/ControlManager';
2
+ export { AjaxModalExtension } from './extensions/AjaxModalExtension';
3
+ export { SpinnerExtension } from './extensions/SpinnerExtension';
4
+ export declare const controlManager: ControlManager;
@@ -0,0 +1,393 @@
1
+ /**
2
+ * PD Naja utils & extensions - Utilities and extensions created for use with Naja library.
3
+ * https://github.com/peckadesign/pd-naja#readme
4
+ *
5
+ * @author PeckaDesign, s.r.o <support@peckadesign.cz>
6
+ * @license MIT
7
+ *
8
+ * @version 1.0.1
9
+ */
10
+
11
+ import naja from 'naja';
12
+
13
+ let instance = null;
14
+ class ControlManager {
15
+ constructor() {
16
+ this.onLoadControl = [];
17
+ this.onLiveControl = [];
18
+ if (instance === null) {
19
+ // eslint-disable-next-line @typescript-eslint/no-this-alias
20
+ instance = this;
21
+ naja.snippetHandler.addEventListener('afterUpdate', this.onSnippetUpdate.bind(this));
22
+ }
23
+ return instance;
24
+ }
25
+ onLoad() {
26
+ this.initialize(this.onLoadControl);
27
+ this.initialize(this.onLiveControl);
28
+ }
29
+ onSnippetUpdate(event) {
30
+ this.initialize(this.onLiveControl, event.detail.snippet);
31
+ }
32
+ initialize(controls, snippet) {
33
+ controls.forEach((control) => {
34
+ control.initialize(snippet || document);
35
+ });
36
+ }
37
+ addControlOnLoad(control) {
38
+ this.onLoadControl.push(control);
39
+ }
40
+ addControlOnLive(control) {
41
+ this.onLiveControl.push(control);
42
+ }
43
+ }
44
+
45
+ class AjaxModalExtension {
46
+ constructor(modal) {
47
+ this.uniqueExtKey = 'modal';
48
+ this.popstateFlag = false;
49
+ this.hidePopstateFlag = false;
50
+ this.historyEnabled = false; // (dis)allows `pushState` after hiding the modal when going back in history (popstate), we don't want to push new state into history same is true also when the history is disabled for request altogether
51
+ this.historyDirection = 'backwards';
52
+ this.modalOptions = {};
53
+ this.original = []; // stack of states under the modal after hiding the modal with `forwards` history mode, we need to push the previous state
54
+ this.lastState = null;
55
+ this.abortControllers = new Map();
56
+ this.isRequestWithHistory = (options) => {
57
+ return options.history !== false;
58
+ };
59
+ this.isPdModalState = (state) => {
60
+ return 'pdModal' in state && state.pdModal?.isShown;
61
+ };
62
+ this.restoreExtensionPropertiesFromState = (state) => {
63
+ this.historyEnabled = true; // Called from popstateHandler means the history is enabled
64
+ this.historyDirection = state.pdModal.historyDirection;
65
+ this.modalOptions = state.pdModal.options;
66
+ };
67
+ // Extension popstate has to be executed before naja popstate, so we can correctly detect if the pdModal is
68
+ // opened. Therefore, we bind the callback before the extension initialization itself.
69
+ window.addEventListener('popstate', this.popstateHandler.bind(this));
70
+ this.modal = modal;
71
+ this.initialState = history.state || {};
72
+ }
73
+ initialize(naja) {
74
+ naja.uiHandler.addEventListener('interaction', this.checkExtensionEnabled.bind(this));
75
+ naja.historyHandler.addEventListener('buildState', this.buildState.bind(this));
76
+ naja.snippetCache.addEventListener('fetch', this.onSnippetFetch.bind(this));
77
+ naja.addEventListener('before', this.before.bind(this));
78
+ naja.addEventListener('start', this.abortPreviousRequest.bind(this));
79
+ naja.addEventListener('success', this.success.bind(this));
80
+ naja.addEventListener('complete', this.clearRequest.bind(this));
81
+ this.modal.onShow(this.showHandler.bind(this));
82
+ this.modal.onHide(() => {
83
+ this.removeModalSnippetsIds();
84
+ this.abortControllers.get('modal')?.abort();
85
+ });
86
+ this.modal.onHidden(this.hiddenHandler.bind(this));
87
+ }
88
+ checkExtensionEnabled(event) {
89
+ const { element, options } = event.detail;
90
+ options.pdModal =
91
+ this.modal.isShown() ||
92
+ element.hasAttribute('data-naja-modal') ||
93
+ element.form?.hasAttribute('data-naja-modal');
94
+ // If the extension is enabled and modal is not opened, we detect and store history mode. History mode cannot
95
+ // change when traversing ajax link inside modal.
96
+ if (!options.pdModal) {
97
+ return;
98
+ }
99
+ // `modalOptions` will be stored in state, therefore no `Element` is allowed. These options are also forwarded
100
+ // to other Naja event handlers via `options`. We also store the element separately to be used there as well.
101
+ this.modalOptions = this.modal.getOptions(element);
102
+ options.modalOptions = this.modalOptions;
103
+ options.modalOpener = element;
104
+ // History direction can only be set before opening the modal, then it stays the same until modal is hidden.
105
+ if (!this.modal.isShown()) {
106
+ this.historyDirection = element.getAttribute('data-naja-modal-history') === 'forwards' ? 'forwards' : 'backwards';
107
+ }
108
+ }
109
+ onSnippetFetch(event) {
110
+ event.detail.options.pdModal = 'pdModal' in event.detail.state;
111
+ }
112
+ removeModalSnippetsIds() {
113
+ // When closing the modal, we don't want to update any snippets inside it, when other requests finishes. This
114
+ // will ensure, that snippets that might be also outside modal (e.g. flash messages) will be redrawn outside the
115
+ // modal. Therefore, we remove the id attributes, so no snippet is found.
116
+ //
117
+ // Some snippets are necessary for modal function
118
+ this.modal.element.querySelectorAll('[id^="snippet-"]').forEach((snippet) => {
119
+ if (!this.modal.reservedSnippetIds.includes(snippet.id)) {
120
+ snippet.removeAttribute('id');
121
+ }
122
+ });
123
+ }
124
+ abortPreviousRequest(event) {
125
+ const { abortController, options } = event.detail;
126
+ if (options.pdModal) {
127
+ this.abortControllers.get(this.uniqueExtKey)?.abort();
128
+ this.abortControllers.set(this.uniqueExtKey, abortController);
129
+ }
130
+ }
131
+ clearRequest(event) {
132
+ const { request } = event.detail;
133
+ if (!request.signal.aborted) {
134
+ this.abortControllers.delete(this.uniqueExtKey);
135
+ }
136
+ }
137
+ buildState(event) {
138
+ const { options, state } = event.detail;
139
+ // Every time naja builds the state, we extend it with `pdModal` object containing information about modal being
140
+ // opened and what history mode is in use. When options.forceRedirect is set, modal might be open but the new
141
+ // state will be redirected outside it.
142
+ const isShown = this.modal.isShown() && !options.forceRedirect;
143
+ state.pdModal = {
144
+ isShown,
145
+ historyDirection: isShown ? this.historyDirection : null,
146
+ options: isShown ? this.modalOptions : null
147
+ };
148
+ // If the state is build, the history is enabled. This information is needed inside modal callback where the
149
+ // options are not available, so we store this internally in extension.
150
+ this.historyEnabled = true;
151
+ }
152
+ before(event) {
153
+ const { options, request } = event.detail;
154
+ if (!options.pdModal) {
155
+ return;
156
+ }
157
+ this.modal.show(options.modalOpener, options.modalOptions, event);
158
+ request.headers.append('Pd-Modal-Opened', String(Number(this.modal.isShown())));
159
+ }
160
+ success(event) {
161
+ const { options, payload } = event.detail;
162
+ this.popstateFlag = false;
163
+ this.lastState = {
164
+ location: location.href,
165
+ state: history.state,
166
+ title: document.title
167
+ };
168
+ if (!options.pdModal) {
169
+ return;
170
+ }
171
+ const requestHistory = this.isRequestWithHistory(options);
172
+ // If the history is disabled for current request, we will disable it for all ajax links / forms in modal as well.
173
+ if (!requestHistory && event.target) {
174
+ const ajaxified = this.modal.element.querySelectorAll(event.target.uiHandler?.selector);
175
+ ajaxified.forEach((element) => {
176
+ element.setAttribute('data-naja-history', 'off');
177
+ });
178
+ }
179
+ if (payload.closeModal) {
180
+ this.modal.hide(event);
181
+ }
182
+ else {
183
+ this.modal.setOptions(this.modalOptions);
184
+ if (this.modal.dispatchLoad) {
185
+ this.modal.dispatchLoad(this.modalOptions, event);
186
+ }
187
+ }
188
+ }
189
+ showHandler() {
190
+ this.modal.setOptions(this.modalOptions);
191
+ // If the modal history mode is `forwards`, we store the state under the modal, so we can push it as a new state
192
+ // after hiding the modal.
193
+ if (this.historyDirection === 'forwards') {
194
+ if (this.popstateFlag && this.lastState) {
195
+ this.original.push(this.lastState);
196
+ }
197
+ else {
198
+ const state = {
199
+ location: location.href,
200
+ state: history.state,
201
+ title: document.title
202
+ };
203
+ this.original.push(state);
204
+ }
205
+ }
206
+ }
207
+ hiddenHandler() {
208
+ // This method is called after modal has been hidden. It either pushes a new state into history (mode `forwards`)
209
+ // or calls `history.back()` to start go-back procedure.
210
+ //
211
+ // New state is pushed only if we are able to retrieve the state under the modal (which should have been stored
212
+ // previously) and the modal is not being closed using forward / back buttons in browser.
213
+ if (!this.historyEnabled) {
214
+ return;
215
+ }
216
+ if (this.historyDirection === 'backwards') {
217
+ // We don't know how many states we need to return. We go one by one, see popstate handler. This go-back
218
+ // procedure is detected using `hidePopstateFlag`.
219
+ this.hidePopstateFlag = true;
220
+ this.cleanData();
221
+ window.history.back();
222
+ }
223
+ else if (this.historyDirection === 'forwards') {
224
+ const state = this.original.pop();
225
+ this.original = [];
226
+ if (state) {
227
+ // When closing the modal using forward / back buttons in browser, the current state is the same as the
228
+ // one stored in `this.original`. If that's the case, we don't push anything as it would duplicate the
229
+ // state in history.
230
+ if (history.state === undefined || history.state.href !== state.location) {
231
+ history.pushState(state.state, state.title, state.location);
232
+ document.title = state.title;
233
+ this.popstateFlag = false;
234
+ this.lastState = {
235
+ location: state.location,
236
+ state: state.state,
237
+ title: state.title
238
+ };
239
+ }
240
+ }
241
+ this.cleanData();
242
+ }
243
+ }
244
+ popstateHandler(event) {
245
+ const state = event.state || this.initialState;
246
+ if (typeof state === 'undefined' || !this.modal) {
247
+ return;
248
+ }
249
+ const isCurrentStatePdModal = this.isPdModalState(state);
250
+ this.popstateFlag = true;
251
+ // We don't know how many states we go back. So we go one by one until the new state is not modal state
252
+ // (`isPdModalState` is `false`).
253
+ if (this.hidePopstateFlag) {
254
+ // We don't want the naja popstate callback to be executed (or any other popstate handler).
255
+ event.stopImmediatePropagation();
256
+ if (isCurrentStatePdModal) {
257
+ window.history.back();
258
+ return;
259
+ }
260
+ else {
261
+ // Todo check if this is really necessary. When used with nette.ajax / history.nette.ajax, this was necessary in some cases, where the title hasn't been restored correctly.
262
+ if (state.title) {
263
+ document.title = state.title;
264
+ }
265
+ }
266
+ this.hidePopstateFlag = false;
267
+ }
268
+ // We check if the state has pdModal object present on popstate. If so (and the pdModal.isShown is true), we proceed
269
+ // to open the modal. Content of the modal is restored by naja itself (either from cache or by new request).
270
+ //
271
+ // If the initial state is also detected as pdModal state, we returned to some pdModal state using reload. In that
272
+ // case, we don't want to open the modal, because we might be missing some snippets. Effectively this means that the
273
+ // modal will never be opened by forward / back button if there has been some other site loaded outside the modal
274
+ // (e.g. some non-ajax link leading from modal).
275
+ if (isCurrentStatePdModal && !this.isPdModalState(this.initialState)) {
276
+ this.restoreExtensionPropertiesFromState(state);
277
+ this.modal.show(undefined, state.pdModal.options, event);
278
+ // If there is some snippet cache, we might restore modal options. If not, options will be restored based on
279
+ // options after the ajax request. Same applies to dispatching load event - if cache is on, we dispatch the
280
+ // event immediately, otherwise it will be dispatched after ajax request.
281
+ if (state.snippets?.storage !== 'off') {
282
+ this.modal.setOptions(state.pdModal.options);
283
+ if (this.modal.dispatchLoad) {
284
+ this.modal.dispatchLoad(this.modalOptions, event);
285
+ }
286
+ }
287
+ }
288
+ else {
289
+ this.historyEnabled = false; // Hiding modal using forward / back button, we disable the history to prevent state duplication
290
+ // Reload the page if the initial state has been inside modal. This prevents snippets loss e.g. during layout changes.
291
+ if (this.isPdModalState(this.initialState)) {
292
+ window.location.reload();
293
+ }
294
+ // Non-modal state and non-modal initial state, we just hide the current modal.
295
+ this.modal.hide(event);
296
+ // We don't want the naja popstate callback to be executed (or any other popstate handler).
297
+ event.stopImmediatePropagation();
298
+ }
299
+ // Keep track of current state. When `backwards` history mode is used, we eventually push this state into
300
+ // `this.original`.
301
+ this.lastState = {
302
+ location: location.href,
303
+ state: state,
304
+ title: document.title
305
+ };
306
+ }
307
+ cleanData() {
308
+ this.historyEnabled = false;
309
+ this.historyDirection = 'backwards';
310
+ this.modalOptions = null;
311
+ }
312
+ }
313
+
314
+ class SpinnerExtension {
315
+ constructor(spinner, getSpinnerProps = undefined, ajaxSpinnerWrapSelector = '.ajax-wrap', ajaxSpinnerPlaceholderSelector = '.ajax-spinner') {
316
+ this.spinner = spinner;
317
+ this.getSpinnerProps = getSpinnerProps;
318
+ this.ajaxSpinnerWrapSelector = ajaxSpinnerWrapSelector;
319
+ this.ajaxSpinnerPlaceholderSelector = ajaxSpinnerPlaceholderSelector;
320
+ }
321
+ initialize(naja) {
322
+ naja.uiHandler.addEventListener('interaction', this.getSpinnerInitiator.bind(this));
323
+ naja.addEventListener('start', this.showSpinners.bind(this));
324
+ naja.addEventListener('complete', this.hideSpinners.bind(this));
325
+ }
326
+ getSpinnerInitiator(event) {
327
+ event.detail.options.spinnerInitiator = event.detail.element;
328
+ }
329
+ showSpinners(event) {
330
+ const { options } = event.detail;
331
+ if (!options.spinnerInitiator) {
332
+ return;
333
+ }
334
+ const spinnerInitiator = options.spinnerInitiator;
335
+ const placeholders = this.getPlaceholders(spinnerInitiator);
336
+ if (placeholders.length === 0) {
337
+ return;
338
+ }
339
+ else {
340
+ options.spinnerQueue = options.spinnerQueue || [];
341
+ placeholders.forEach((placeholder) => {
342
+ let spinner;
343
+ if (typeof this.spinner === 'function') {
344
+ spinner = this.getSpinnerProps ? this.spinner(this.getSpinnerProps(spinnerInitiator)) : this.spinner();
345
+ }
346
+ else {
347
+ spinner = this.spinner;
348
+ }
349
+ placeholder.appendChild(spinner);
350
+ options.spinnerQueue.push(spinner);
351
+ spinner.animate([{ opacity: 0 }, { opacity: 1 }], { duration: 100 });
352
+ });
353
+ }
354
+ }
355
+ hideSpinners(event) {
356
+ const { options } = event.detail;
357
+ if (options.forceRedirect) {
358
+ return;
359
+ }
360
+ options.spinnerQueue?.forEach((spinner) => {
361
+ const animation = spinner.animate({ opacity: 0 }, { duration: 100 });
362
+ animation.finished.then(() => spinner.remove());
363
+ });
364
+ }
365
+ getPlaceholders(element) {
366
+ if (!element) {
367
+ return [];
368
+ }
369
+ const spinner = element.getAttribute('data-naja-spinner') || null;
370
+ let placeholders = [];
371
+ if (spinner === 'off') {
372
+ return [];
373
+ }
374
+ placeholders = this.getPlaceholdersByQuerySelector(spinner);
375
+ return placeholders.length ? placeholders : this.getPlaceholdersByDOM(element);
376
+ }
377
+ getPlaceholdersByQuerySelector(selector) {
378
+ return selector ? Array.from(document.querySelectorAll(selector)) : [];
379
+ }
380
+ getPlaceholdersByDOM(element) {
381
+ const wrap = element.closest(this.ajaxSpinnerWrapSelector);
382
+ if (wrap === null) {
383
+ return [];
384
+ }
385
+ const placeholders = wrap.querySelectorAll(this.ajaxSpinnerPlaceholderSelector);
386
+ return placeholders.length ? Array.from(placeholders) : [wrap];
387
+ }
388
+ }
389
+
390
+ const controlManager = new ControlManager();
391
+
392
+ export { AjaxModalExtension, SpinnerExtension, controlManager };
393
+ //# sourceMappingURL=index.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.esm.js","sources":["../src/utils/ControlManager.ts","../src/extensions/AjaxModalExtension.ts","../src/extensions/SpinnerExtension.ts","../src/index.esm.ts"],"sourcesContent":[null,null,null,null],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export default interface Control {
2
+ initialize(context: Element | Document): void;
3
+ }
@@ -0,0 +1,11 @@
1
+ import Control from './Control';
2
+ export default class ControlManager {
3
+ private onLoadControl;
4
+ private onLiveControl;
5
+ constructor();
6
+ onLoad(): void;
7
+ private onSnippetUpdate;
8
+ private initialize;
9
+ addControlOnLoad(control: Control): void;
10
+ addControlOnLive(control: Control): void;
11
+ }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@peckadesign/pd-naja",
3
3
  "title": "PD Naja utils & extensions",
4
- "version": "1.0.0",
4
+ "version": "1.0.1",
5
5
  "private": false,
6
6
  "description": "Utilities and extensions created for use with Naja library.",
7
7
  "module": "dist/PdNaja.esm.js",
@@ -1,29 +0,0 @@
1
- name: CI
2
- on:
3
- pull_request:
4
- types: [opened, synchronize]
5
-
6
- jobs:
7
- lint:
8
- runs-on: ubuntu-latest
9
- name: ESLint
10
- env:
11
- CI: true
12
- steps:
13
- - name: Checkout 🛎
14
- uses: actions/checkout@v3
15
-
16
- - name: Setup Node 📦
17
- uses: actions/setup-node@v3
18
- with:
19
- node-version: lts/*
20
- cache: npm
21
-
22
- - name: Install dependencies 👨🏻‍💻
23
- run: npm ci
24
-
25
- - name: Lint ✨
26
- run: npm run lint
27
-
28
- - name: Build 🔨
29
- run: npm run build
@@ -1,80 +0,0 @@
1
- name: Publish
2
- on:
3
- push:
4
- tags:
5
- - '*'
6
-
7
- jobs:
8
- build:
9
- name: Build
10
- runs-on: ubuntu-latest
11
- steps:
12
- - name: Checkout 🛎
13
- uses: actions/checkout@v3
14
-
15
- - name: Setup Node 📦
16
- uses: actions/setup-node@v3
17
- with:
18
- node-version: lts/*
19
- cache: npm
20
-
21
- - name: Install dependencies 👨🏻‍💻
22
- run: npm ci
23
-
24
- - name: Build 🔨
25
- run: npm run build
26
-
27
- - name: Download artifacts 🧩
28
- uses: actions/upload-artifact@v3
29
- with:
30
- name: dist-files
31
- path: dist/
32
-
33
- release:
34
- name: Release
35
- runs-on: ubuntu-latest
36
- needs: [build]
37
- steps:
38
- - name: Checkout 🛎
39
- uses: actions/checkout@v3
40
-
41
- - name: Download artifacts 🧩
42
- uses: actions/download-artifact@v3
43
- with:
44
- name: dist-files
45
- path: dist/
46
-
47
- - name: Create release draft 🕊️
48
- uses: softprops/action-gh-release@v1
49
- with:
50
- draft: true
51
- files: |
52
- dist/PdModal.js
53
- dist/PdModal.js.map
54
- dist/PdModal.min.js
55
- dist/PdModal.min.js.map
56
-
57
- publish:
58
- name: Publish
59
- runs-on: ubuntu-latest
60
- needs: [build]
61
- steps:
62
- - name: Checkout 🛎
63
- uses: actions/checkout@v3
64
-
65
- - name: Download artifacts 🧩
66
- uses: actions/download-artifact@v3
67
- with:
68
- name: dist-files
69
- path: dist/
70
-
71
- - name: Setup Node 📦
72
- uses: actions/setup-node@v3
73
- with:
74
- node-version: lts/*
75
- registry-url: 'https://registry.npmjs.org'
76
-
77
- - name: Publish release 🕊️
78
- run: npm publish --access public
79
- env:
80
- NODE_AUTH_TOKEN: ${{ secrets.NPM_AUTH_TOKEN }}
package/rollup.config.js DELETED
@@ -1,61 +0,0 @@
1
- import babel from '@rollup/plugin-babel';
2
- import commonjs from '@rollup/plugin-commonjs';
3
- import resolve from '@rollup/plugin-node-resolve';
4
- import typescript from '@rollup/plugin-typescript';
5
- import path from 'path';
6
-
7
- import pkg from './package.json';
8
- const output = {
9
- banner: `/**\n * ${pkg.title} - ${pkg.description} \n * ${pkg.homepage}\n *\n * @author ${pkg.author.name} <${pkg.author.email}>\n * @license ${pkg.license}\n *\n * @version ${pkg.version}\n */\n`,
10
- sourcemap: true,
11
- };
12
-
13
- const babelPlugin = babel({
14
- exclude: /node_modules/,
15
- include: 'src/**',
16
- babelHelpers: 'runtime',
17
- });
18
-
19
- export default [
20
- {
21
- // ESM build for modern tools like webpack
22
- input: 'src/index.esm.ts',
23
- output: {
24
- ...output,
25
- file: pkg.module,
26
- format: 'esm',
27
- },
28
- external: [
29
- /@babel\/runtime/,
30
- ...Object.keys(pkg.dependencies || {}),
31
- ...Object.keys(pkg.peerDependencies || {}),
32
- ],
33
- plugins: [
34
- resolve(),
35
- commonjs(),
36
- typescript(),
37
- babelPlugin,
38
- ],
39
- },
40
- {
41
- // type declaration files for ESM build
42
- input: 'src/index.esm.ts',
43
- output: {
44
- ...output,
45
- dir: path.dirname(pkg.module),
46
- format: 'esm',
47
- },
48
- external: [
49
- /@babel\/runtime/,
50
- ...Object.keys(pkg.dependencies || {}),
51
- ...Object.keys(pkg.peerDependencies || {}),
52
- ],
53
- plugins: [
54
- typescript({
55
- declaration: true,
56
- declarationDir: path.dirname(pkg.module),
57
- emitDeclarationOnly: true,
58
- }),
59
- ],
60
- },
61
- ];