PageSourceSearch

https://www.kpu.go.id/js/backend/app.js

js kpu.go.id collected 2026-09-24 08:58:40 UTC 18,896 bytes, 575 lines download raw bytes

1/* ------------------------------------------------------------------------------
2 *
3 *  # Template JS core
4 *
5 *  Includes minimum required JS code for proper template functioning
6 *
7 * ---------------------------------------------------------------------------- */
8
9
10// Setup module
11// ------------------------------
12
13var App = function () {
14
15
16    //
17    // Setup module components
18    //
19
20    // Transitions
21    // -------------------------
22
23    // Disable all transitions
24    var _transitionsDisabled = function() {
25        $('body').addClass('no-transitions');
26    };
27
28    // Enable all transitions
29    var _transitionsEnabled = function() {
30        $('body').removeClass('no-transitions');
31    };
32
33
34    // Sidebars
35    // -------------------------
36
37    //
38    // On desktop
39    //
40
41    // Resize main sidebar
42    var _sidebarMainResize = function() {
43
44        // Flip 2nd level if menu overflows
45        // bottom edge of browser window
46        var revertBottomMenus = function() {
47            $('.sidebar-main').find('.nav-sidebar').children('.nav-item-submenu').hover(function() {
48                var totalHeight = 0,
49                    $this = $(this),
50                    navSubmenuClass = 'nav-group-sub',
51                    navSubmenuReversedClass = 'nav-item-submenu-reversed';
52
53                totalHeight += $this.find('.' + navSubmenuClass).filter(':visible').outerHeight();
54                if($this.children('.' + navSubmenuClass).length) {
55                    if(($this.children('.' + navSubmenuClass).offset().top + $this.find('.' + navSubmenuClass).filter(':visible').outerHeight()) > document.body.clientHeight) {
56                        $this.addClass(navSubmenuReversedClass)
57                    }
58                    else {
59                        $this.removeClass(navSubmenuReversedClass)
60                    }
61                }
62            });
63        }
64
65        // If sidebar is resized by default
66        if($('body').hasClass('sidebar-xs')) {
67            revertBottomMenus();
68        }
69
70        // Toggle min sidebar class
71        $('.sidebar-main-toggle').on('click', function (e) {
72            e.preventDefault();
73
74            $('body').toggleClass('sidebar-xs').removeClass('sidebar-mobile-main');
75            revertBottomMenus();
76        });
77    };
78
79    // Toggle main sidebar
80    var _sidebarMainToggle = function() {
81        $(document).on('click', '.sidebar-main-hide', function (e) {
82            e.preventDefault();
83            $('body').toggleClass('sidebar-main-hidden');
84        });
85    };
86
87    // Toggle secondary sidebar
88    var _sidebarSecondaryToggle = function() {
89        $(document).on('click', '.sidebar-secondary-toggle', function (e) {
90            e.preventDefault();
91            $('body').toggleClass('sidebar-secondary-hidden');
92        });
93    };
94
95
96    // Show right, resize main
97    var _sidebarRightMainToggle = function() {
98        $(document).on('click', '.sidebar-right-main-toggle', function (e) {
99            e.preventDefault();
100
101            // Right sidebar visibility
102            $('body').toggleClass('sidebar-right-visible');
103
104            // If visible
105            if ($('body').hasClass('sidebar-right-visible')) {
106
107                // Make main sidebar mini
108                $('body').addClass('sidebar-xs');
109
110                // Hide children lists if they are opened, since sliding animation adds inline CSS
111                $('.sidebar-main .nav-sidebar').children('.nav-item').children('.nav-group-sub').css('display', '');
112            }
113            else {
114                $('body').removeClass('sidebar-xs');
115            }
116        });
117    };
118
119    // Show right, hide main
120    var _sidebarRightMainHide = function() {
121        $(document).on('click', '.sidebar-right-main-hide', function (e) {
122            e.preventDefault();
123
124            // Opposite sidebar visibility
125            $('body').toggleClass('sidebar-right-visible');
126            
127            // If visible
128            if ($('body').hasClass('sidebar-right-visible')) {
129                $('body').addClass('sidebar-main-hidden');
130            }
131            else {
132                $('body').removeClass('sidebar-main-hidden');
133            }
134        });
135    };
136
137    // Toggle right sidebar
138    var _sidebarRightToggle = function() {
139        $(document).on('click', '.sidebar-right-toggle', function (e) {
140            e.preventDefault();
141
142            $('body').toggleClass('sidebar-right-visible');
143        });
144    };
145
146    // Show right, hide secondary
147    var _sidebarRightSecondaryToggle = function() {
148        $(document).on('click', '.sidebar-right-secondary-toggle', function (e) {
149            e.preventDefault();
150
151            // Opposite sidebar visibility
152            $('body').toggleClass('sidebar-right-visible');
153
154            // If visible
155            if ($('body').hasClass('sidebar-right-visible')) {
156                $('body').addClass('sidebar-secondary-hidden');
157            }
158            else {
159                $('body').removeClass('sidebar-secondary-hidden');
160            }
161        });
162    };
163
164
165    // Toggle content sidebar
166    var _sidebarComponentToggle = function() {
167        $(document).on('click', '.sidebar-component-toggle', function (e) {
168            e.preventDefault();
169            $('body').toggleClass('sidebar-component-hidden');
170        });
171    };
172
173
174    //
175    // On mobile
176    //
177
178    // Expand sidebar to full screen on mobile
179    var _sidebarMobileFullscreen = function() {
180        $('.sidebar-mobile-expand').on('click', function (e) {
181            e.preventDefault();
182            var $sidebar = $(this).parents('.sidebar'),
183                sidebarFullscreenClass = 'sidebar-fullscreen'
184
185            if(!$sidebar.hasClass(sidebarFullscreenClass)) {
186                $sidebar.addClass(sidebarFullscreenClass);
187            }
188            else {
189                $sidebar.removeClass(sidebarFullscreenClass);
190            }
191        });
192    };
193
194    // Toggle main sidebar on mobile
195    var _sidebarMobileMainToggle = function() {
196        $('.sidebar-mobile-main-toggle').on('click', function(e) {
197            e.preventDefault();
198            $('body').toggleClass('sidebar-mobile-main').removeClass('sidebar-mobile-secondary sidebar-mobile-right');
199
200            if($('.sidebar-main').hasClass('sidebar-fullscreen')) {
201                $('.sidebar-main').removeClass('sidebar-fullscreen');
202            }
203        });
204    };
205
206    // Toggle secondary sidebar on mobile
207    var _sidebarMobileSecondaryToggle = function() {
208        $('.sidebar-mobile-secondary-toggle').on('click', function (e) {
209            e.preventDefault();
210            $('body').toggleClass('sidebar-mobile-secondary').removeClass('sidebar-mobile-main sidebar-mobile-right');
211
212            // Fullscreen mode
213            if($('.sidebar-secondary').hasClass('sidebar-fullscreen')) {
214                $('.sidebar-secondary').removeClass('sidebar-fullscreen');
215            }
216        });
217    };
218
219    // Toggle right sidebar on mobile
220    var _sidebarMobileRightToggle = function() {
221        $('.sidebar-mobile-right-toggle').on('click', function (e) {
222            e.preventDefault();
223            $('body').toggleClass('sidebar-mobile-right').removeClass('sidebar-mobile-main sidebar-mobile-secondary');
224
225            // Hide sidebar if in fullscreen mode on mobile
226            if($('.sidebar-right').hasClass('sidebar-fullscreen')) {
227                $('.sidebar-right').removeClass('sidebar-fullscreen');
228            }
229        });
230    };
231
232    // Toggle component sidebar on mobile
233    var _sidebarMobileComponentToggle = function() {
234        $('.sidebar-mobile-component-toggle').on('click', function (e) {
235            e.preventDefault();
236            $('body').toggleClass('sidebar-mobile-component');
237        });
238    };
239
240
241    // Navigations
242    // -------------------------
243
244    // Sidebar navigation
245    var _navigationSidebar = function() {
246
247        // Define default class names and options
248        var navClass = 'nav-sidebar',
249            navItemClass = 'nav-item',
250            navItemOpenClass = 'nav-item-open',
251            navLinkClass = 'nav-link',
252            navSubmenuClass = 'nav-group-sub',
253            navSlidingSpeed = 250;
254
255        // Configure collapsible functionality
256        $('.' + navClass).each(function() {
257            $(this).find('.' + navItemClass).has('.' + navSubmenuClass).children('.' + navItemClass + ' > ' + '.' + navLinkClass).not('.disabled').on('click', function (e) {
258                e.preventDefault();
259
260                // Simplify stuff
261                var $target = $(this),
262                    $navSidebarMini = $('.sidebar-xs').not('.sidebar-mobile-main').find('.sidebar-main .' + navClass).children('.' + navItemClass);
263
264                // Collapsible
265                if($target.parent('.' + navItemClass).hasClass(navItemOpenClass)) {
266                    $target.parent('.' + navItemClass).not($navSidebarMini).removeClass(navItemOpenClass).children('.' + navSubmenuClass).slideUp(navSlidingSpeed);
267                }
268                else {
269                    $target.parent('.' + navItemClass).not($navSidebarMini).addClass(navItemOpenClass).children('.' + navSubmenuClass).slideDown(navSlidingSpeed);
270                }
271
272                // Accordion
273                if ($target.parents('.' + navClass).data('nav-type') == 'accordion') {
274                    $target.parent('.' + navItemClass).not($navSidebarMini).siblings(':has(.' + navSubmenuClass + ')').removeClass(navItemOpenClass).children('.' + navSubmenuClass).slideUp(navSlidingSpeed);
275                }
276            });
277        });
278
279        // Disable click in disabled navigation items
280        $(document).on('click', '.' + navClass + ' .disabled', function(e) {
281            e.preventDefault();
282        });
283
284        // Scrollspy navigation
285        $('.nav-scrollspy').find('.' + navItemClass).has('.' + navSubmenuClass).children('.' + navItemClass + ' > ' + '.' + navLinkClass).off('click');
286    };
287
288    // Navbar navigation
289    var _navigationNavbar = function() {
290
291        // Prevent dropdown from closing on click
292        $(document).on('click', '.dropdown-content', function(e) {
293            e.stopPropagation();
294        });
295
296        // Disabled links
297        $('.navbar-nav .disabled a, .nav-item-levels .disabled').on('click', function(e) {
298            e.preventDefault();
299            e.stopPropagation();
300        });
301
302        // Show tabs inside dropdowns
303        $('.dropdown-content a[data-toggle="tab"]').on('click', function(e) {
304            $(this).tab('show');
305        });
306    };
307
308
309    // Components
310    // -------------------------
311
312    // Tooltip
313    var _componentTooltip = function() {
314
315        // Initialize
316        $('[data-popup="tooltip"]').tooltip();
317
318        // Demo tooltips, remove in production
319        var demoTooltipSelector = '[data-popup="tooltip-demo"]';
320        if($(demoTooltipSelector).is(':visible')) {
321            $(demoTooltipSelector).tooltip('show');
322            setTimeout(function() {
323                $(demoTooltipSelector).tooltip('hide');
324            }, 2000);
325        }
326    };
327
328    // Popover
329    var _componentPopover = function() {
330        $('[data-popup="popover"]').popover();
331    };
332
333
334    // Card actions
335    // -------------------------
336
337    // Reload card (uses BlockUI extension)
338    var _cardActionReload = function() {
339        $('.card [data-action=reload]:not(.disabled)').on('click', function (e) {
340            e.preventDefault();
341            var $target = $(this),
342                block = $target.closest('.card');
343            
344            // Block card
345            $(block).block({ 
346                message: '<i class="icon-spinner2 spinner"></i>',
347                overlayCSS: {
348                    backgroundColor: '#fff',
349                    opacity: 0.8,
350                    cursor: 'wait',
351                    'box-shadow': '0 0 0 1px #ddd'
352                },
353                css: {
354                    border: 0,
355                    padding: 0,
356                    backgroundColor: 'none'
357                }
358            });
359
360            // For demo purposes
361            window.setTimeout(function () {
362               $(block).unblock();
363            }, 2000); 
364        });
365    };
366
367    // Collapse card
368    var _cardActionCollapse = function() {
369        var $cardCollapsedClass = $('.card-collapsed');
370
371        // Hide if collapsed by default
372        $cardCollapsedClass.children('.card-header').nextAll().hide();
373
374        // Rotate icon if collapsed by default
375        $cardCollapsedClass.find('[data-action=collapse]').addClass('rotate-180');
376
377        // Collapse on click
378        $('.card [data-action=collapse]:not(.disabled)').on('click', function (e) {
379            var $target = $(this),
380                slidingSpeed = 150;
381
382            e.preventDefault();
383            $target.parents('.card').toggleClass('card-collapsed');
384            $target.toggleClass('rotate-180');
385            $target.closest('.card').children('.card-header').nextAll().slideToggle(slidingSpeed);
386        });
387    };
388
389    // Remove card
390    var _cardActionRemove = function() {
391        $('.card [data-action=remove]').on('click', function (e) {
392            e.preventDefault();
393            var $target = $(this),
394                slidingSpeed = 150;
395
396            // If not disabled
397            if(!$target.hasClass('disabled')) {
398                $target.closest('.card').slideUp({
399                    duration: slidingSpeed,
400                    start: function() {
401                        $target.addClass('d-block');
402                    },
403                    complete: function() {
404                        $target.remove();
405                    }
406                });
407            }
408        });
409    };
410
411    // Card fullscreen mode
412    var _cardActionFullscreen = function() {
413        $('.card [data-action=fullscreen]').on('click', function (e) {
414            e.preventDefault();
415
416            // Define vars
417            var $target = $(this),
418                cardFullscreen = $target.closest('.card'),
419                overflowHiddenClass = 'overflow-hidden',
420                collapsedClass = 'collapsed-in-fullscreen',
421                fullscreenAttr = 'data-fullscreen';
422
423            // Toggle classes on card
424            cardFullscreen.toggleClass('fixed-top h-100 rounded-0');
425
426            // Configure
427            if (!cardFullscreen.hasClass('fixed-top')) {
428                $target.removeAttr(fullscreenAttr);
429                cardFullscreen.children('.' + collapsedClass).removeClass('show');
430                $('body').removeClass(overflowHiddenClass);
431                $target.siblings('[data-action=move], [data-action=remove], [data-action=collapse]').removeClass('d-none');
432            }
433            else {
434                $target.attr(fullscreenAttr, 'active');
435                cardFullscreen.removeAttr('style').children('.collapse:not(.show)').addClass('show ' + collapsedClass);
436                $('body').addClass(overflowHiddenClass);
437                $target.siblings('[data-action=move], [data-action=remove], [data-action=collapse]').addClass('d-none');
438            }
439        });
440    };
441
442
443    // Misc
444    // -------------------------
445
446    // Dropdown submenus. Trigger on click
447    var _dropdownSubmenu = function() {
448
449        // All parent levels require .dropdown-toggle class
450        $('.dropdown-menu').find('.dropdown-submenu').not('.disabled').find('.dropdown-toggle').on('click', function(e) {
451            e.stopPropagation();
452            e.preventDefault();
453
454            // Remove "show" class in all siblings
455            $(this).parent().siblings().removeClass('show').find('.show').removeClass('show');
456
457            // Toggle submenu
458            $(this).parent().toggleClass('show').children('.dropdown-menu').toggleClass('show');
459
460            // Hide all levels when parent dropdown is closed
461            $(this).parents('.show').on('hidden.bs.dropdown', function(e) {
462                $('.dropdown-submenu .show, .dropdown-submenu.show').removeClass('show');
463            });
464        });
465    };
466
467    // Header elements toggler
468    var _headerElements = function() {
469
470        // Toggle visible state of header elements
471        $('.header-elements-toggle').on('click', function(e) {
472            e.preventDefault();
473            $(this).parents('[class*=header-elements-]').find('.header-elements').toggleClass('d-none');
474        });
475
476        // Toggle visible state of footer elements
477        $('.footer-elements-toggle').on('click', function(e) {
478            e.preventDefault();
479            $(this).parents('.card-footer').find('.footer-elements').toggleClass('d-none');
480        });
481    };
482
483
484    //
485    // Return objects assigned to module
486    //
487
488    return {
489
490        // Disable transitions before page is fully loaded
491        initBeforeLoad: function() {
492            _transitionsDisabled();
493        },
494
495        // Enable transitions when page is fully loaded
496        initAfterLoad: function() {
497            _transitionsEnabled();
498        },
499
500        // Initialize all sidebars
501        initSidebars: function() {
502
503            // On desktop
504            _sidebarMainResize();
505            _sidebarMainToggle();
506            _sidebarSecondaryToggle();
507            _sidebarRightMainToggle();
508            _sidebarRightMainHide();
509            _sidebarRightToggle();
510            _sidebarRightSecondaryToggle();
511            _sidebarComponentToggle();
512
513            // On mobile
514            _sidebarMobileFullscreen();
515            _sidebarMobileMainToggle();
516            _sidebarMobileSecondaryToggle();
517            _sidebarMobileRightToggle();
518            _sidebarMobileComponentToggle();
519        },
520
521        // Initialize all navigations
522        initNavigations: function() {
523            _navigationSidebar();
524            _navigationNavbar();
525        },
526
527        // Initialize all components
528        initComponents: function() {
529            _componentTooltip();
530            _componentPopover();
531        },
532
533        // Initialize all card actions
534        initCardActions: function() {
535            _cardActionReload();
536            _cardActionCollapse();
537            _cardActionRemove();
538            _cardActionFullscreen();
539        },
540
541        // Dropdown submenu
542        initDropdownSubmenu: function() {
543            _dropdownSubmenu();
544        },
545
546        initHeaderElementsToggle: function() {
547            _headerElements();
548        },
549
550        // Initialize core
551        initCore: function() {
552            App.initSidebars();
553            App.initNavigations();
554            App.initComponents();
555            App.initCardActions();
556            App.initDropdownSubmenu();
557            App.initHeaderElementsToggle();
558        }
559    }
560}();
561
562
563// Initialize module
564// ------------------------------
565
566// When content is loaded
567document.addEventListener('DOMContentLoaded', function() {
568    App.initBeforeLoad();
569    App.initCore();
570});
571
572// When page is fully loaded
573window.addEventListener('load', function() {
574    App.initAfterLoad();
575});

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.