@peckadesign/pd-naja 1.0.0 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -21,13 +21,13 @@ naja.registerExtension(new ExtensionName())
21
21
  ```typescript
22
22
  import { controlManager } from '@peckadesign/pd-naja'
23
23
  import SomeControl from '@/js/Controls/SomeControl' // `SomeControl` must implement `Control` interface
24
- import SomeAnotherControl from '@/js/Controls/SomeControl'
24
+ import SomeAnotherControl from '@/js/Controls/SomeAnotherControl'
25
25
 
26
26
  // This control is only initialized on page load
27
27
  controlManager.addControlOnLoad(SomeControl)
28
28
 
29
29
  // This control will also get initialized after Naja requests
30
- controlManager.addControlOnLive(SomeControl)
30
+ controlManager.addControlOnLive(SomeAnotherControl)
31
31
 
32
32
  ```
33
33
 
@@ -0,0 +1,421 @@
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.1.0
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.shouldPreventSnippetFetch = false;
53
+ this.modalOptions = {};
54
+ this.original = []; // stack of states under the modal after hiding the modal with `forwards` history mode, we need to push the previous state
55
+ this.lastState = null;
56
+ this.abortControllers = new Map();
57
+ this.isRequestWithHistory = (options) => {
58
+ return options.history !== false;
59
+ };
60
+ this.isPdModalRequest = (options) => {
61
+ return Boolean(options.pdModal);
62
+ };
63
+ this.isPdModalState = (state) => {
64
+ return 'pdModal' in state;
65
+ };
66
+ this.restoreExtensionPropertiesFromState = (state) => {
67
+ this.historyEnabled = true; // Called from popstateHandler means the history is enabled
68
+ this.historyDirection = state.pdModal.historyDirection;
69
+ this.modalOptions = state.pdModal.options;
70
+ };
71
+ // Extension popstate has to be executed before naja popstate, so we can correctly detect if the pdModal is
72
+ // opened. Therefore, we bind the callback before the extension initialization itself.
73
+ window.addEventListener('popstate', this.popstateHandler.bind(this));
74
+ this.modal = modal;
75
+ this.initialState = history.state || {};
76
+ }
77
+ initialize(naja) {
78
+ naja.uiHandler.addEventListener('interaction', this.checkExtensionEnabled.bind(this));
79
+ naja.historyHandler.addEventListener('buildState', this.buildState.bind(this));
80
+ naja.snippetCache.addEventListener('fetch', this.onSnippetFetch.bind(this));
81
+ naja.addEventListener('before', this.before.bind(this));
82
+ naja.addEventListener('start', this.abortPreviousRequest.bind(this));
83
+ naja.addEventListener('success', this.success.bind(this));
84
+ naja.addEventListener('complete', this.clearRequest.bind(this));
85
+ this.modal.onShow(this.showHandler.bind(this));
86
+ this.modal.onHide(() => {
87
+ this.removeModalSnippetsIds();
88
+ this.abortControllers.get('modal')?.abort();
89
+ });
90
+ this.modal.onHidden(this.hiddenHandler.bind(this));
91
+ }
92
+ checkExtensionEnabled(event) {
93
+ const { element, options } = event.detail;
94
+ options.pdModal =
95
+ this.modal.isShown() ||
96
+ element.hasAttribute('data-naja-modal') ||
97
+ element.form?.hasAttribute('data-naja-modal');
98
+ if (!this.isPdModalRequest(options)) {
99
+ return;
100
+ }
101
+ // `modalOptions` will be stored in state, therefore no `Element` is allowed. These options are also forwarded
102
+ // to other Naja event handlers via `options`. We also store the element separately to be used there as well.
103
+ this.modalOptions = this.modal.getOptions(element);
104
+ options.modalOptions = this.modalOptions;
105
+ options.modalOpener = element;
106
+ // If the extension is enabled and modal is not opened, we detect and store history mode. History mode cannot
107
+ // change when traversing ajax link inside modal, it stays the same until modal is hidden.
108
+ if (!this.modal.isShown()) {
109
+ this.historyDirection = element.getAttribute('data-naja-modal-history') === 'forwards' ? 'forwards' : 'backwards';
110
+ }
111
+ }
112
+ onSnippetFetch(event) {
113
+ // When snippet cache is off, this method is called to construct Naja request options. We retrieve modal
114
+ // `options` from original state in history if neccessary. Also, when closing the modal from `PopstateEvent`, we
115
+ // don't need to make a new request, so we call `event.preventDefault()` in that case.
116
+ const { state } = event.detail;
117
+ if (this.isPdModalState(state)) {
118
+ event.detail.options.pdModal = true;
119
+ event.detail.options.modalOpener = this.getElementFromString(state.pdModal.opener);
120
+ event.detail.options.modalOptions = state.pdModal.options;
121
+ }
122
+ if (this.shouldPreventSnippetFetch) {
123
+ event.preventDefault();
124
+ this.shouldPreventSnippetFetch = false;
125
+ }
126
+ }
127
+ removeModalSnippetsIds() {
128
+ // When closing the modal, we don't want to update any snippets inside it, when other requests finishes. This
129
+ // will ensure, that snippets that might be also outside modal (e.g. flash messages) will be redrawn outside the
130
+ // modal. Therefore, we remove the id attributes, so no snippet is found.
131
+ //
132
+ // Some snippets are necessary for modal function
133
+ this.modal.element.querySelectorAll('[id^="snippet-"]').forEach((snippet) => {
134
+ if (!this.modal.reservedSnippetIds.includes(snippet.id)) {
135
+ snippet.removeAttribute('id');
136
+ }
137
+ });
138
+ }
139
+ abortPreviousRequest(event) {
140
+ const { abortController, options } = event.detail;
141
+ if (this.isPdModalRequest(options)) {
142
+ this.abortControllers.get(this.uniqueExtKey)?.abort();
143
+ this.abortControllers.set(this.uniqueExtKey, abortController);
144
+ }
145
+ }
146
+ clearRequest(event) {
147
+ const { request } = event.detail;
148
+ if (!request.signal.aborted) {
149
+ this.abortControllers.delete(this.uniqueExtKey);
150
+ }
151
+ }
152
+ buildState(event) {
153
+ const { options, state } = event.detail;
154
+ // Every time naja builds the state, and we have the modal opened, we extend the state with `pdModal` object
155
+ // containing information about modal being opened and what history mode is in use. When `options.forceRedirect`
156
+ // is set, modal might be open but the new state will be redirected outside of it.
157
+ //
158
+ // We must check this.modal.isShown instead of this.isPdModalRequest, because of initial replace state from
159
+ // Naja - in that case, options already contains information about request to be made, but we have to build the
160
+ // "previous" state yet.
161
+ const isShown = this.modal.isShown() && !options.forceRedirect;
162
+ if (isShown) {
163
+ state.pdModal = {
164
+ historyDirection: this.historyDirection,
165
+ opener: options.modalOpener.outerHTML,
166
+ options: this.modalOptions
167
+ };
168
+ }
169
+ // If the state is build, the history is enabled. This information is needed inside modal callback where the
170
+ // options are not available, so we store this internally in extension.
171
+ this.historyEnabled = true;
172
+ }
173
+ before(event) {
174
+ const { options, request } = event.detail;
175
+ if (!this.isPdModalRequest(options)) {
176
+ return;
177
+ }
178
+ this.modal.show(options.modalOpener, options.modalOptions, event);
179
+ request.headers.append('Pd-Modal-Opened', String(Number(this.modal.isShown())));
180
+ }
181
+ success(event) {
182
+ const { options, payload } = event.detail;
183
+ this.popstateFlag = false;
184
+ this.lastState = {
185
+ location: location.href,
186
+ state: history.state,
187
+ title: document.title
188
+ };
189
+ if (!this.isPdModalRequest(options)) {
190
+ return;
191
+ }
192
+ const requestHistory = this.isRequestWithHistory(options);
193
+ // If the history is disabled for current request, we will disable it for all ajax links / forms in modal as well.
194
+ if (!requestHistory && event.target) {
195
+ const ajaxified = this.modal.element.querySelectorAll(event.target.uiHandler?.selector);
196
+ ajaxified.forEach((element) => {
197
+ element.setAttribute('data-naja-history', 'off');
198
+ });
199
+ }
200
+ if (payload.closeModal) {
201
+ this.modal.hide(event);
202
+ }
203
+ else {
204
+ this.modal.setOptions(this.modalOptions);
205
+ if (this.modal.dispatchLoad) {
206
+ this.modal.dispatchLoad(this.modalOptions, event);
207
+ }
208
+ }
209
+ }
210
+ showHandler() {
211
+ this.modal.setOptions(this.modalOptions);
212
+ // If the modal history mode is `forwards`, we store the state under the modal, so we can push it as a new state
213
+ // after hiding the modal.
214
+ if (this.historyDirection === 'forwards') {
215
+ if (this.popstateFlag && this.lastState) {
216
+ this.original.push(this.lastState);
217
+ }
218
+ else {
219
+ const state = {
220
+ location: location.href,
221
+ state: history.state,
222
+ title: document.title
223
+ };
224
+ this.original.push(state);
225
+ }
226
+ }
227
+ }
228
+ hiddenHandler() {
229
+ // This method is called after modal has been hidden. It either pushes a new state into history (mode `forwards`)
230
+ // or calls `history.back()` to start go-back procedure.
231
+ //
232
+ // New state is pushed only if we are able to retrieve the state under the modal (which should have been stored
233
+ // previously) and the modal is not being closed using forward / back buttons in browser.
234
+ if (!this.historyEnabled) {
235
+ return;
236
+ }
237
+ if (this.historyDirection === 'backwards') {
238
+ // We don't know how many states we need to return. We go one by one, see popstate handler. This go-back
239
+ // procedure is detected using `hidePopstateFlag`.
240
+ this.hidePopstateFlag = true;
241
+ this.cleanData();
242
+ window.history.back();
243
+ }
244
+ else if (this.historyDirection === 'forwards') {
245
+ const state = this.original.pop();
246
+ this.original = [];
247
+ if (state) {
248
+ // When closing the modal using forward / back buttons in browser, the current state is the same as the
249
+ // one stored in `this.original`. If that's the case, we don't push anything as it would duplicate the
250
+ // state in history.
251
+ if (history.state === undefined || history.state.href !== state.location) {
252
+ history.pushState(state.state, state.title, state.location);
253
+ document.title = state.title;
254
+ this.popstateFlag = false;
255
+ this.lastState = {
256
+ location: state.location,
257
+ state: state.state,
258
+ title: state.title
259
+ };
260
+ }
261
+ }
262
+ this.cleanData();
263
+ }
264
+ }
265
+ popstateHandler(event) {
266
+ const state = event.state || this.initialState;
267
+ if (typeof state === 'undefined' || !this.modal) {
268
+ return;
269
+ }
270
+ const isCurrentStatePdModal = this.isPdModalState(state);
271
+ this.popstateFlag = true;
272
+ this.shouldPreventSnippetFetch = false;
273
+ // We don't know how many states we go back. So we go one by one until the new state is not modal state
274
+ // (`isPdModalState` is `false`).
275
+ if (this.hidePopstateFlag) {
276
+ // We don't want the naja popstate callback to be executed (or any other popstate handler).
277
+ event.stopImmediatePropagation();
278
+ if (isCurrentStatePdModal) {
279
+ window.history.back();
280
+ return;
281
+ }
282
+ else {
283
+ // 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.
284
+ if (state.title) {
285
+ document.title = state.title;
286
+ }
287
+ }
288
+ this.hidePopstateFlag = false;
289
+ }
290
+ // We check if the state has `pdModal` object present on popstate. If so , we proceed to open the modal. Content
291
+ // of the modal is restored by naja itself (either from cache or by new request).
292
+ //
293
+ // If the initial state is also detected as pdModal state, we returned to some pdModal state using reload. In
294
+ // that case, we don't want to open the modal, because we might be missing some snippets. Effectively this means
295
+ // that the modal will never be opened by forward / back button if there has been some other site loaded outside
296
+ // the modal (e.g. some non-ajax link leading from modal).
297
+ if (isCurrentStatePdModal && !this.isPdModalState(this.initialState)) {
298
+ this.restoreExtensionPropertiesFromState(state);
299
+ this.modal.show(this.getElementFromString(state.pdModal.opener), state.pdModal.options, event);
300
+ // If there is some snippet cache, we might restore modal options. If not, options will be restored based on
301
+ // options after the ajax request. Same applies to dispatching load event - if cache is on, we dispatch the
302
+ // event immediately, otherwise it will be dispatched after ajax request.
303
+ if (state.snippets?.storage !== 'off') {
304
+ this.modal.setOptions(state.pdModal.options);
305
+ if (this.modal.dispatchLoad) {
306
+ this.modal.dispatchLoad(this.modalOptions, event);
307
+ }
308
+ }
309
+ }
310
+ else {
311
+ this.historyEnabled = false; // Hiding modal using forward / back button, we disable the history to prevent state duplication
312
+ // Reload the page if the initial state has been inside modal. This prevents snippets loss e.g. during
313
+ // layout changes.
314
+ if (this.isPdModalState(this.initialState)) {
315
+ window.location.reload();
316
+ }
317
+ // Non-modal state and non-modal initial state → we just hide the current modal and prevent snippet fetch
318
+ // (if snippet cache is off).
319
+ if (this.modal.isShown()) {
320
+ this.modal.hide(event);
321
+ this.shouldPreventSnippetFetch = true;
322
+ }
323
+ }
324
+ // Keep track of current state. When `backwards` history mode is used, we eventually push this state into
325
+ // `this.original`.
326
+ this.lastState = {
327
+ location: location.href,
328
+ state: state,
329
+ title: document.title
330
+ };
331
+ }
332
+ cleanData() {
333
+ this.historyEnabled = false;
334
+ this.historyDirection = 'backwards';
335
+ this.modalOptions = null;
336
+ }
337
+ getElementFromString(stringElement) {
338
+ return new DOMParser().parseFromString(stringElement, 'text/html').body.firstElementChild;
339
+ }
340
+ }
341
+
342
+ class SpinnerExtension {
343
+ constructor(spinner, getSpinnerProps = undefined, ajaxSpinnerWrapSelector = '.ajax-wrap', ajaxSpinnerPlaceholderSelector = '.ajax-spinner') {
344
+ this.spinner = spinner;
345
+ this.getSpinnerProps = getSpinnerProps;
346
+ this.ajaxSpinnerWrapSelector = ajaxSpinnerWrapSelector;
347
+ this.ajaxSpinnerPlaceholderSelector = ajaxSpinnerPlaceholderSelector;
348
+ }
349
+ initialize(naja) {
350
+ naja.uiHandler.addEventListener('interaction', this.getSpinnerInitiator.bind(this));
351
+ naja.addEventListener('start', this.showSpinners.bind(this));
352
+ naja.addEventListener('complete', this.hideSpinners.bind(this));
353
+ }
354
+ getSpinnerInitiator(event) {
355
+ event.detail.options.spinnerInitiator = event.detail.element;
356
+ }
357
+ showSpinners(event) {
358
+ const { options } = event.detail;
359
+ if (!options.spinnerInitiator) {
360
+ return;
361
+ }
362
+ const spinnerInitiator = options.spinnerInitiator;
363
+ const placeholders = this.getPlaceholders(spinnerInitiator);
364
+ if (placeholders.length === 0) {
365
+ return;
366
+ }
367
+ else {
368
+ options.spinnerQueue = options.spinnerQueue || [];
369
+ placeholders.forEach((placeholder) => {
370
+ let spinner;
371
+ if (typeof this.spinner === 'function') {
372
+ spinner = this.getSpinnerProps ? this.spinner(this.getSpinnerProps(spinnerInitiator)) : this.spinner();
373
+ }
374
+ else {
375
+ spinner = this.spinner;
376
+ }
377
+ placeholder.appendChild(spinner);
378
+ options.spinnerQueue.push(spinner);
379
+ spinner.animate([{ opacity: 0 }, { opacity: 1 }], { duration: 100 });
380
+ });
381
+ }
382
+ }
383
+ hideSpinners(event) {
384
+ const { options } = event.detail;
385
+ if (options.forceRedirect) {
386
+ return;
387
+ }
388
+ options.spinnerQueue?.forEach((spinner) => {
389
+ const animation = spinner.animate({ opacity: 0 }, { duration: 100 });
390
+ animation.finished.then(() => spinner.remove());
391
+ });
392
+ }
393
+ getPlaceholders(element) {
394
+ if (!element) {
395
+ return [];
396
+ }
397
+ const spinner = element.getAttribute('data-naja-spinner') || null;
398
+ let placeholders = [];
399
+ if (spinner === 'off') {
400
+ return [];
401
+ }
402
+ placeholders = this.getPlaceholdersByQuerySelector(spinner);
403
+ return placeholders.length ? placeholders : this.getPlaceholdersByDOM(element);
404
+ }
405
+ getPlaceholdersByQuerySelector(selector) {
406
+ return selector ? Array.from(document.querySelectorAll(selector)) : [];
407
+ }
408
+ getPlaceholdersByDOM(element) {
409
+ const wrap = element.closest(this.ajaxSpinnerWrapSelector);
410
+ if (wrap === null) {
411
+ return [];
412
+ }
413
+ const placeholders = wrap.querySelectorAll(this.ajaxSpinnerPlaceholderSelector);
414
+ return placeholders.length ? Array.from(placeholders) : [wrap];
415
+ }
416
+ }
417
+
418
+ const controlManager = new ControlManager();
419
+
420
+ export { AjaxModalExtension, SpinnerExtension, controlManager };
421
+ //# 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,59 @@
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, 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 shouldPreventSnippetFetch;
34
+ private modalOptions;
35
+ private original;
36
+ private lastState;
37
+ private initialState;
38
+ private readonly abortControllers;
39
+ constructor(modal: AjaxModal);
40
+ initialize(naja: Naja): void;
41
+ private isRequestWithHistory;
42
+ private isPdModalRequest;
43
+ private isPdModalState;
44
+ private restoreExtensionPropertiesFromState;
45
+ private checkExtensionEnabled;
46
+ private onSnippetFetch;
47
+ private removeModalSnippetsIds;
48
+ private abortPreviousRequest;
49
+ private clearRequest;
50
+ private buildState;
51
+ private before;
52
+ private success;
53
+ private showHandler;
54
+ private hiddenHandler;
55
+ private popstateHandler;
56
+ private cleanData;
57
+ private getElementFromString;
58
+ }
59
+ 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;