PageSourceSearch

https://vestnikkui.ru/bundles/asutemplate/Base/js/editorum-ui/edit…?v=20260421-button-toggle-compat

js vestnikkui.ru collected 2026-10-02 20:03:10 UTC 22,137 bytes, 711 lines download raw bytes

1(function (window, document) {
2    var namespace = window.EditorumUi = window.EditorumUi || {};
3    var internals = namespace.__internals = namespace.__internals || {};
4    var bootstrapCompatInitialized = false;
5    var notifyCompatInitialized = false;
6
7    function normalizeNotifyType(type) {
8        if (type === 'error') {
9            return 'danger';
10        }
11
12        if (type === 'notice' || type === 'message') {
13            return 'info';
14        }
15
16        if (type === 'warn') {
17            return 'warning';
18        }
19
20        return type || 'info';
21    }
22
23    function collectNotifyMessages(value) {
24        var container;
25        var lines = [];
26
27        if (value === null || typeof value === 'undefined') {
28            return lines;
29        }
30
31        if (Array.isArray(value)) {
32            internals.each(value, function (entry) {
33                lines = lines.concat(collectNotifyMessages(entry));
34            });
35
36            return lines;
37        }
38
39        if (typeof value !== 'string') {
40            lines.push(String(value));
41            return lines;
42        }
43
44        if (value.indexOf('<') === -1) {
45            lines.push(value);
46            return lines;
47        }
48
49        container = document.createElement('div');
50        container.innerHTML = value
51            .replace(/<br\s*\/?>/gi, '\n')
52            .replace(/<\/p>\s*<p[^>]*>/gi, '\n');
53
54        lines = String(container.textContent || container.innerText || '')
55            .split('\n')
56            .map(function (line) {
57                return line.replace(/\s+/g, ' ').trim();
58            })
59            .filter(function (line) {
60                return line.length > 0;
61            });
62
63        return lines;
64    }
65
66    function normalizeNotifyGroup(payload, options) {
67        var settings = options || {};
68        var data = payload;
69        var type;
70        var title = '';
71        var messages = [];
72        var timer;
73
74        if (typeof data === 'string') {
75            data = {
76                message: data
77            };
78        }
79
80        if (!data || typeof data !== 'object') {
81            data = {
82                message: data
83            };
84        }
85
86        type = normalizeNotifyType(settings.type || data.type);
87        title = collectNotifyMessages(data.title || settings.title).join(' ').trim();
88        messages = collectNotifyMessages(data.message || data.text || data.content || data.html);
89
90        if (!messages.length && title) {
91            messages = [title];
92            title = '';
93        }
94
95        timer = parseInt(settings.timer || settings.delay || data.timer || data.delay, 10);
96
97        return {
98            type: type,
99            title: title,
100            messages: messages.length ? messages : [''],
101            timer: isNaN(timer) ? 4000 : timer
102        };
103    }
104
105    function installNotifyCompat() {
106        if (notifyCompatInitialized) {
107            return false;
108        }
109
110        notifyCompatInitialized = true;
111        return true;
112    }
113
114    function getTabTargetSelector(trigger) {
115        if (!trigger) {
116            return '';
117        }
118
119        return trigger.getAttribute('data-target') || trigger.getAttribute('href') || '';
120    }
121
122    function getTabTarget(trigger) {
123        var targetSelector = getTabTargetSelector(trigger);
124
125        if (targetSelector.charAt(0) !== '#') {
126            return null;
127        }
128
129        return internals.query(targetSelector);
130    }
131
132    function getActiveTabTrigger(nav) {
133        if (!nav) {
134            return null;
135        }
136
137        return internals.query('li.active > [data-toggle="tab"], [data-toggle="tab"].active', nav);
138    }
139
140    function appendBackdrop() {
141        var backdrop = internals.query('.modal-backdrop');
142
143        if (backdrop) {
144            return backdrop;
145        }
146
147        backdrop = document.createElement('div');
148        backdrop.className = 'modal-backdrop fade in';
149        document.body.appendChild(backdrop);
150
151        return backdrop;
152    }
153
154    function ensureModalPortalState(modal) {
155        if (!modal || modal.__editorumModalPortalState) {
156            return modal && modal.__editorumModalPortalState;
157        }
158
159        modal.__editorumModalPortalState = {
160            parent: null,
161            nextSibling: null,
162            placeholder: null,
163            portalled: false
164        };
165
166        return modal.__editorumModalPortalState;
167    }
168
169    function portalModalToBody(modal) {
170        var state = ensureModalPortalState(modal);
171        var placeholder;
172
173        if (!modal || !state || state.portalled) {
174            return;
175        }
176
177        state.parent = modal.parentNode;
178        state.nextSibling = modal.nextSibling;
179
180        if (!state.parent || state.parent === document.body) {
181            state.portalled = true;
182            return;
183        }
184
185        placeholder = document.createComment('editorum-modal-portal');
186        state.placeholder = placeholder;
187        state.parent.insertBefore(placeholder, state.nextSibling);
188        document.body.appendChild(modal);
189        state.portalled = true;
190    }
191
192    function restoreModalFromBody(modal) {
193        var state = modal && modal.__editorumModalPortalState;
194
195        if (!modal || !state || !state.portalled) {
196            return;
197        }
198
199        if (state.parent && state.parent !== document.body) {
200            if (state.placeholder && state.placeholder.parentNode === state.parent) {
201                state.parent.insertBefore(modal, state.placeholder);
202                state.placeholder.parentNode.removeChild(state.placeholder);
203            } else if (state.nextSibling && state.nextSibling.parentNode === state.parent) {
204                state.parent.insertBefore(modal, state.nextSibling);
205            } else {
206                state.parent.appendChild(modal);
207            }
208        }
209
210        state.parent = null;
211        state.nextSibling = null;
212        state.placeholder = null;
213        state.portalled = false;
214    }
215
216    function closeModal(modal, relatedTarget) {
217        var backdrops = internals.queryAll('.modal-backdrop');
218        var hideEvent;
219
220        if (!modal) {
221            return false;
222        }
223
224        hideEvent = internals.dispatch(modal, 'hide.bs.modal', {
225            cancelable: true,
226            relatedTarget: relatedTarget || null
227        });
228
229        if (hideEvent.prevented) {
230            return false;
231        }
232
233        modal.classList.remove('in');
234        modal.setAttribute('aria-hidden', 'true');
235        internals.hide(modal);
236
237        internals.each(backdrops, function (backdrop) {
238            if (backdrop.parentNode) {
239                backdrop.parentNode.removeChild(backdrop);
240            }
241        });
242
243        document.body.classList.remove('modal-open');
244        restoreModalFromBody(modal);
245        internals.dispatch(modal, 'hidden.bs.modal', {
246            relatedTarget: relatedTarget || null
247        });
248
249        return true;
250    }
251
252    function closeAlert(dismiss) {
253        var targetSelector;
254        var target;
255        var closeEvent;
256
257        if (!dismiss) {
258            return false;
259        }
260
261        targetSelector = dismiss.getAttribute('data-target') || dismiss.getAttribute('href') || '';
262        if (targetSelector.length > 1 && targetSelector.charAt(0) === '#') {
263            target = internals.query(targetSelector);
264        }
265
266        if (!target) {
267            target = internals.closest(dismiss, '.alert');
268        }
269
270        if (!target) {
271            return false;
272        }
273
274        closeEvent = internals.dispatch(target, 'close.bs.alert', {
275            cancelable: true,
276            relatedTarget: dismiss
277        });
278
279        if (closeEvent.prevented) {
280            return false;
281        }
282
283        target.classList.remove('in');
284        internals.hide(target);
285        internals.dispatch(target, 'closed.bs.alert', {
286            relatedTarget: dismiss
287        });
288
289        if (target.parentNode) {
290            target.parentNode.removeChild(target);
291        }
292
293        return true;
294    }
295
296    function openModal(modal, relatedTarget) {
297        var showEvent;
298
299        if (!modal) {
300            return false;
301        }
302
303        showEvent = internals.dispatch(modal, 'show.bs.modal', {
304            cancelable: true,
305            relatedTarget: relatedTarget || null
306        });
307
308        if (showEvent.prevented) {
309            return false;
310        }
311
312        portalModalToBody(modal);
313        appendBackdrop();
314        internals.show(modal, 'block');
315        modal.classList.add('in');
316        modal.setAttribute('aria-hidden', 'false');
317        document.body.classList.add('modal-open');
318        internals.dispatch(modal, 'shown.bs.modal', {
319            relatedTarget: relatedTarget || null
320        });
321
322        return true;
323    }
324
325    function activateTab(trigger, target, options) {
326        var settings = options || {};
327        var nav = internals.closest(trigger, '.nav, .nav-tabs, .tab-bar, .tabs-section');
328        var item = internals.closest(trigger, 'li');
329        var paneRoot = internals.closest(target, '.tab-content') || target.parentNode;
330        var currentTrigger = getActiveTabTrigger(nav);
331        var currentPane = currentTrigger ? getTabTarget(currentTrigger) : null;
332        var hiddenEvent;
333        var showEvent;
334
335        if (currentTrigger === trigger && currentPane === target) {
336            return true;
337        }
338
339        if (!settings.silent && currentTrigger && currentTrigger !== trigger) {
340            hiddenEvent = internals.dispatch(currentTrigger, 'hide.bs.tab', {
341                cancelable: true,
342                relatedTarget: trigger
343            });
344
345            if (hiddenEvent.prevented) {
346                return false;
347            }
348        }
349
350        if (!settings.silent) {
351            showEvent = internals.dispatch(trigger, 'show.bs.tab', {
352                cancelable: true,
353                relatedTarget: currentTrigger || null
354            });
355
356            if (showEvent.prevented) {
357                return false;
358            }
359        }
360
361        if (nav) {
362            internals.each(internals.queryAll('li', nav), function (navItem) {
363                navItem.classList.remove('active');
364            });
365
366            internals.each(internals.queryAll('[data-toggle="tab"]', nav), function (navTr
366igger) {
367                navTrigger.classList.remove('active');
368                navTrigger.setAttribute('aria-selected', 'false');
369            });
370        }
371
372        if (item) {
373            item.classList.add('active');
374        }
375
376        trigger.classList.add('active');
377        trigger.setAttribute('aria-selected', 'true');
378
379        if (paneRoot) {
380            internals.each(internals.queryAll('.tab-pane', paneRoot), function (pane) {
381                if (internals.closest(pane.parentNode, '.tab-content') !== paneRoot) {
382                    return;
383                }
384                pane.classList.remove('active');
385                pane.classList.remove('in');
386                pane.setAttribute('aria-hidden', 'true');
387            });
388        }
389
390        target.classList.add('active');
391        target.classList.add('in');
392        target.setAttribute('aria-hidden', 'false');
393
394        if (!settings.silent && currentTrigger && currentTrigger !== trigger) {
395            internals.dispatch(currentTrigger, 'hidden.bs.tab', {
396                relatedTarget: trigger
397            });
398        }
399
400        if (!settings.silent) {
401            internals.dispatch(trigger, 'shown.bs.tab', {
402                relatedTarget: currentTrigger || null
403            });
404        }
405
406        return true;
407    }
408
409    function syncBootstrapTabs() {
410        internals.each(internals.queryAll('[data-toggle="tab"]'), function (trigger) {
411            trigger.classList.remove('active');
412            trigger.setAttribute('aria-selected', 'false');
413        });
414
415        internals.each(internals.queryAll('li.active > [data-toggle="tab"]'), function (trigger) {
416            var targetSelector = trigger.getAttribute('data-target') || trigger.getAttribute('href') || '';
417            var target;
418
419            if (targetSelector.charAt(0) !== '#') {
420                return;
421            }
422
423            target = internals.query(targetSelector);
424            if (!target) {
425                return;
426            }
427
428            activateTab(trigger, target, {
429                silent: true
430            });
431        });
432    }
433
434    function setCollapseState(trigger, panel, shouldOpen) {
435        var icon = internals.query('.ds-icon', trigger);
436        var use;
437
438        panel.classList.toggle('in', shouldOpen);
439        panel.setAttribute('aria-expanded', shouldOpen ? 'true' : 'false');
440        internals.toggle(panel, shouldOpen);
441
442        trigger.classList.toggle('collapsed', !shouldOpen);
443        trigger.setAttribute('aria-expanded', shouldOpen ? 'true' : 'false');
444
445        if (icon) {
446            use = icon.querySelector('use');
447            if (use) {
448                use.setAttribute('href', '#icon-' + (shouldOpen ? 'chevron-up' : 'chevron-down'));
449            }
450        }
451    }
452
453    function syncButtonGroup(group) {
454        if (!group) {
455            return;
456        }
457
458        internals.each(internals.queryAll('.btn', group), function (button) {
459            var input = internals.query('input[type="radio"], input[type="checkbox"]', button);
460            var isActive = input ? !!input.checked : button.classList.contains('active');
461
462            button.classList.toggle('active', isActive);
463            button.setAttribute('aria-pressed', isActive ? 'true' : 'false');
464        });
465    }
466
467    function syncBootstrapButtons() {
468        internals.each(internals.queryAll('[data-toggle="buttons"]'), function (group) {
469            syncButtonGroup(group);
470        });
471    }
472
473    function toggleButtonGroup(button) {
474        var group = internals.closest(button, '[data-toggle="buttons"]');
475        var input = group && internals.query('input[type="radio"], input[type="checkbox"]', button);
476        var type;
477        var didChange = false;
478
479        if (!group || !input || input.disabled) {
480            return false;
481        }
482
483        type = (input.getAttribute('type') || '').toLowerCase();
484
485        if (type === 'radio') {
486            if (!input.checked) {
487                internals.each(internals.queryAll('input[type="radio"]', group), function (radio) {
488                    radio.checked = false;
489                });
490
491                input.checked = true;
492                didChange = true;
493            }
494        } else if (type === 'checkbox') {
495            input.checked = !input.checked;
496            didChange = true;
497        } else {
498            return false;
499        }
500
501        syncButtonGroup(group);
502
503        if (didChange) {
504            input.dispatchEvent(new Event('change', { bubbles: true }));
505        }
506
507        input.dispatchEvent(new Event('input', { bubbles: true }));
508        return true;
509    }
510
511    function installJQueryBootstrapCompat() {
512        return false;
513    }
514
515    function initBootstrapCompat() {
516        if (bootstrapCompatInitialized) {
517            return true;
518        }
519
520        internals.initTooltipCompat();
521        installNotifyCompat();
522        installJQueryBootstrapCompat();
523        bootstrapCompatInitialized = true;
524        syncBootstrapTabs();
525        syncBootstrapButtons();
526
527        document.addEventListener('click', function (event) {
528            var modalDismiss = internals.closest(event.target, '[data-dismiss="modal"]');
529            var alertDismiss = internals.closest(event.target, '[data-dismiss="alert"]');
530            var buttonGroupTrigger = internals.closest(event.target, '[data-toggle="buttons"] .btn');
531            var tabTrigger = internals.closest(event.target, '[data-toggle="tab"]');
532            var dropdownTrigger = internals.closest(event.target, '[data-toggle="dropdown"]');
533            var collapseTrigger = internals.closest(event.target, '[data-toggle="collapse"]');
534            var modalTrigger = internals.closest(event.target, '[data-toggle="modal"]');
535            var dropdownRoot;
536            var targetSelector;
537            var target;
538            var parentSelector;
539
540            if (modalDismiss) {
541                target = internals.closest(modalDismiss, '.modal');
542                if (!target && modalDismiss.getAttribute('data-target')) {
543                    target = internals.query(modalDismiss.getAttribute('data-target'));
544                }
545
546                if (target) {
547                    event.preventDefault();
548                    closeModal(target, modalDismiss);
549                }
550
551                return;
552            }
553
554            if (alertDismiss) {
555                event.preventDefault();
556                closeAlert(alertDismiss);
557                return;
558            }
559
560            if (buttonGroupTrigger) {
561                event.preventDefault();
562                toggleButtonGroup(buttonGroupTrigger);
563                return;
564            }
565
566            if (tabTrigger) {
567                targetSelector = tabTrigger.getAttribute('data-target') || tabTrigger.getAttribute('href') || '';
568                if (targetSelector.charAt(0) !== '#') {
569                    return;
570                }
571
572                target = internals.query(targetSelector);
573                if (!target) {
574                    return;
575                }
576
577                event.preventDefault();
578                activateTab(tabTrigger, target);
579                return;
580            }
581
582            if (dropdownTrigger) {
583                dropdownRoot = internals.closest(dropdownTrigger, '.dropdown');
584                if (!dropdownRoot) {
585                    return;
586                }
587
588                event.preventDefault();
589                event.stopPropagation();
590
591                internals.each(internals.queryAll('.dropdown.open, .open.dropdown'), function (dropdown) {
592                    if (dropdown !== dropdownRoot) {
593                        dropdown.classList.remove('open');
594                    }
595                });
596
597                dropdownRoot.classList.toggle('open');
598                return;
599            }
600
601            if (collapseTrigger) {
602                targetSelector = collapseTrigger.getAttribute('data-target') || collapseTrigger.getAttribute('href') || '';
603                if (targetSelector.charAt(0) !== '#') {
604                    return;
605                }
606
607                target = internals.query(targetSelector);
608                if (!target) {
609                    return;
610                }
611
612                event.preventDefault();
613
614                parentSelector = collapseTrigger.getAttribute('data-parent');
615                if (!target.classList.contains('in') && parentSelector) {
616                    internals.each(internals.queryAll('[data-toggle="collapse"]', internals.query(parentSelector) || document), function (openedTrigger) {
617                        var openedTargetSelector;
618                        var openedTarget;
619
620                        if (openedTrigger === collapseTrigger) {
621                            return;
622                        }
623
624                        openedTargetSelector = openedTrigger.getAttribute('data-target') || openedTrigger.getAttribute('href') || '';
625                        if (openedTargetSelector.charAt(0) !== '#') {
626                            return;
627                        }
628
629                        openedTarget = internals.query(openedTargetSelector);
630                        if (openedTarget) {
631                            setCollapseState(openedTrigger, openedTarget, false);
632                        }
633                    });
634                }
635
636                setCollapseState(collapseTrigger, target, !target.classList.contains('in'));
637                return;
638            }
639
640            if (modalTrigger) {
641                targetSelector = modalTrigger.getAttribute('data-target') || modalTrigger.getAttribute('href') || '';
642                if (targetSelector.charAt(0) !== '#') {
643                    return;
644                }
645
646                target = internals.query(targetSelector);
647                if (!target) {
648                    return;
649                }
650
651                event.preventDefault();
652                openModal(target, modalTrigger);
653            }
654        });
655
656        document.addEventListener('click', function (event) {
657            var dropdown = internals.closest(event.target, '.dropdown');
658
659            if (!dropdown) {
660                internals.each(internals.queryAll('.dropdown.open, .open.dropdown'), function (opened) {
661                    opened.classList.remove('open');
662                });
663            }
664        });
665
666        document.addEventListener('click', function (event) {
667            var modal = internals.closest(event.target, '.modal');
668
669            if (modal && event.target === modal) {
670                closeModal(modal);
671            }
672
673            if (internals.matches(event.target, '.modal-backdrop')) {
674                internals.each(internals.queryAll('.modal.in'), function (openModalElement) {
675                    closeModal(openModalElement);
676                });
677            }
678        });
679
680        document.addEventListener('keydown', function (event) {
681            var openModalElement;
682
683            if (event.key === 'Escape' || event.keyCode === 27) {
684                openModalElement = internals.query('.modal.in');
685                if (openModalElement) {
686                    closeModal(openModalElement);
687                }
688            }
689        });
690
691        document.addEventListener('change', function (event) {
692            var group = internals.closest(event.target, '[data-toggle="buttons"]');
693
694            if (group && internals.matches(event.target, 'input[type="radio"], input[type="checkbox"]')) {
695                syncButtonGroup(group);
696            }
697        });
698
699        return true;
700    }
701
702    internals.getTabTarget = getTabTarget;
703    internals.closeModal = closeModal;
704    internals.closeAlert = closeAlert;
705    internals.openModal = openModal;
706    internals.activateTab = activateTab;
707    internals.syncBootstrapTabs = syncBootstrapTabs;
708    internals.syncBootstrapButtons = syncBootstrapButtons;
709    internals.setCollapseState = setCollapseState;
710    internals.initBootstrapCompat = initBootstrapCompat;
711})(window, document);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.