Proyectos de Subversion Moodle

Rev

Rev 1 | Mostrar el archivo completo | | | Autoría | Ultima modificación | Ver Log |

Rev 1 Rev 1441
Línea 26... Línea 26...
26
import {dispatchEvent} from 'core/event_dispatcher';
26
import {dispatchEvent} from 'core/event_dispatcher';
27
import {debounce} from 'core/utils';
27
import {debounce} from 'core/utils';
28
import {isSmall, isLarge} from 'core/pagehelpers';
28
import {isSmall, isLarge} from 'core/pagehelpers';
29
import Pending from 'core/pending';
29
import Pending from 'core/pending';
30
import {setUserPreference} from 'core_user/repository';
30
import {setUserPreference} from 'core_user/repository';
31
// The jQuery module is only used for interacting with Boostrap 4. It can we removed when MDL-71979 is integrated.
31
import Tooltip from './bootstrap/tooltip';
32
import jQuery from 'jquery';
32
import * as FocusLock from 'core/local/aria/focuslock';
Línea 33... Línea 33...
33
 
33
 
Línea 34... Línea 34...
34
let backdropPromise = null;
34
let backdropPromise = null;
Línea 140... Línea 140...
140
 * @param {boolean} enableOnBlur if the tooltip must be re-enabled on blur.
140
 * @param {boolean} enableOnBlur if the tooltip must be re-enabled on blur.
141
 * @private
141
 * @private
142
 */
142
 */
143
const disableButtonTooltip = (button, enableOnBlur) => {
143
const disableButtonTooltip = (button, enableOnBlur) => {
144
    if (button.hasAttribute('data-original-title')) {
144
    if (button.hasAttribute('data-original-title')) {
145
        // The jQuery is still used in Boostrap 4. It can we removed when MDL-71979 is integrated.
-
 
146
        jQuery(button).tooltip('disable');
145
        Tooltip.getInstance(button).disable();
147
        button.setAttribute('title', button.dataset.originalTitle);
146
        button.setAttribute('title', button.dataset.originalTitle);
148
    } else {
147
    } else {
149
        button.dataset.disabledToggle = button.dataset.toggle;
148
        button.dataset.disabledToggle = button.dataset.toggle;
150
        button.removeAttribute('data-toggle');
149
        button.removeAttribute('data-bs-toggle');
151
    }
150
    }
152
    if (enableOnBlur) {
151
    if (enableOnBlur) {
153
        button.dataset.restoreTooltipOnBlur = true;
152
        button.dataset.restoreTooltipOnBlur = true;
154
    }
153
    }
155
};
154
};
Línea 178... Línea 177...
178
 *
177
 *
179
 * @param {HTMLElement} button the button element
178
 * @param {HTMLElement} button the button element
180
 * @private
179
 * @private
181
 */
180
 */
182
const enableButtonTooltip = (button) => {
181
const enableButtonTooltip = (button) => {
183
    // The jQuery is still used in Boostrap 4. It can we removed when MDL-71979 is integrated.
-
 
184
    if (button.hasAttribute('data-original-title')) {
182
    if (button.hasAttribute('data-bs-original-title')) {
185
        jQuery(button).tooltip('enable');
183
        Tooltip.getInstance(button).enable();
186
        button.removeAttribute('title');
184
        button.removeAttribute('title');
187
    } else if (button.dataset.disabledToggle) {
185
    } else if (button.dataset.disabledToggle) {
188
        button.dataset.toggle = button.dataset.disabledToggle;
186
        button.dataset.toggle = button.dataset.disabledToggle;
189
        jQuery(button).tooltip();
187
        new Tooltip(button);
190
    }
188
    }
191
    delete button.dataset.restoreTooltipOnBlur;
189
    delete button.dataset.restoreTooltipOnBlur;
192
};
190
};
Línea 193... Línea 191...
193
 
191
 
Línea 430... Línea 428...
430
 
428
 
431
 
429
 
432
        // Remove open tooltip if still visible.
430
        // Remove open tooltip if still visible.
433
        let openButton = getDrawerOpenButton(this.drawerNode.id);
-
 
434
        if (openButton && openButton.hasAttribute('data-original-title')) {
431
        let openButton = getDrawerOpenButton(this.drawerNode.id);
435
            // The jQuery is still used in Boostrap 4. It can we removed when MDL-71979 is integrated.
432
        if (openButton && openButton.hasAttribute('data-original-title')) {
Línea 436... Línea 433...
436
            jQuery(openButton)?.tooltip('hide');
433
            Tooltip.getInstance(openButton)?.hide();
437
        }
434
        }
Línea 458... Línea 455...
458
 
455
 
459
                const pageWrapper = document.getElementById('page');
456
                const pageWrapper = document.getElementById('page');
460
                pageWrapper.style.overflow = 'hidden';
457
                pageWrapper.style.overflow = 'hidden';
461
                return backdrop;
458
                return backdrop;
462
            })
459
            })
-
 
460
            .catch(() => {
-
 
461
                return;
463
            .catch();
462
            });
Línea 464... Línea 463...
464
        }
463
        }
465
 
464
 
466
        // Show close button and header content once the drawer is fully opened.
465
        // Show close button and header content once the drawer is fully opened.
Línea 473... Línea 472...
473
            closeButton.classList.toggle('hidden', false);
472
            closeButton.classList.toggle('hidden', false);
474
            headerContent.classList.toggle('hidden', false);
473
            headerContent.classList.toggle('hidden', false);
475
            if (focusOnCloseButton) {
474
            if (focusOnCloseButton) {
476
                closeButton.focus();
475
                closeButton.focus();
477
            }
476
            }
-
 
477
            // On small devices, the drawer must have a trap focus once the focus is inside
-
 
478
            // to prevent the user from focussing on covered elements.
-
 
479
            if (isSmall()) {
-
 
480
                FocusLock.trapFocus(this.drawerNode);
-
 
481
            }
478
            pendingPromise.resolve();
482
            pendingPromise.resolve();
479
        }, 300);
483
        }, 300);
Línea 480... Línea 484...
480
 
484
 
481
        this.dispatchEvent(Drawers.eventTypes.drawerShown);
485
        this.dispatchEvent(Drawers.eventTypes.drawerShown);
Línea 486... Línea 490...
486
     *
490
     *
487
     * @param {object} args
491
     * @param {object} args
488
     * @param {boolean} [args.focusOnOpenButton=true] Whether to alter page focus when opening the drawer
492
     * @param {boolean} [args.focusOnOpenButton=true] Whether to alter page focus when opening the drawer
489
     * @param {boolean} [args.updatePreferences=true] Whether to update the user prewference
493
     * @param {boolean} [args.updatePreferences=true] Whether to update the user prewference
490
     */
494
     */
491
    closeDrawer({focusOnOpenButton = true, updatePreferences = true} = {}) {
495
        closeDrawer({focusOnOpenButton = true, updatePreferences = true} = {}) {
Línea 492... Línea 496...
492
 
496
 
Línea 493... Línea 497...
493
        const pendingPromise = new Pending('theme_boost/drawers:close');
497
        const pendingPromise = new Pending('theme_boost/drawers:close');
494
 
498
 
Línea 502... Línea 506...
502
        closeButton?.classList.toggle('hidden', true);
506
        closeButton?.classList.toggle('hidden', true);
503
        const headerContent = this.drawerNode.querySelector(SELECTORS.HEADERCONTENT);
507
        const headerContent = this.drawerNode.querySelector(SELECTORS.HEADERCONTENT);
504
        headerContent?.classList.toggle('hidden', true);
508
        headerContent?.classList.toggle('hidden', true);
505
        // Remove the close button tooltip if visible.
509
        // Remove the close button tooltip if visible.
506
        if (closeButton.hasAttribute('data-original-title')) {
510
        if (closeButton.hasAttribute('data-original-title')) {
507
            // The jQuery is still used in Boostrap 4. It can we removed when MDL-71979 is integrated.
-
 
508
            jQuery(closeButton)?.tooltip('hide');
511
            Tooltip.getInstance(closeButton)?.hide();
509
        }
512
        }
Línea 510... Línea 513...
510
 
513
 
511
        const preference = this.drawerNode.dataset.preference;
514
        const preference = this.drawerNode.dataset.preference;
512
        if (preference && updatePreferences && !isSmall()) {
515
        if (preference && updatePreferences && !isSmall()) {
Línea 529... Línea 532...
529
                const pageWrapper = document.getElementById('page');
532
                const pageWrapper = document.getElementById('page');
530
                pageWrapper.style.overflow = 'visible';
533
                pageWrapper.style.overflow = 'visible';
531
            }
534
            }
532
            return backdrop;
535
            return backdrop;
533
        })
536
        })
534
        .catch();
537
        .catch(() => {
-
 
538
                return;
-
 
539
        });
Línea -... Línea 540...
-
 
540
 
-
 
541
        if (isSmall()) {
-
 
542
            FocusLock.untrapFocus();
535
 
543
        }
536
        // Move focus to the open drawer (or toggler) button once the drawer is hidden.
544
        // Move focus to the open drawer (or toggler) button once the drawer is hidden.
537
        let openButton = getDrawerOpenButton(this.drawerNode.id);
545
        let openButton = getDrawerOpenButton(this.drawerNode.id);
538
        if (openButton) {
546
        if (openButton) {
539
            disableButtonTooltip(openButton, true);
547
            disableButtonTooltip(openButton, true);
Línea 776... Línea 784...
776
        if (isSmall()) {
784
        if (isSmall()) {
777
            let anyOpen = false;
785
            let anyOpen = false;
778
            drawerMap.forEach(drawerInstance => {
786
            drawerMap.forEach(drawerInstance => {
779
                disableDrawerTooltips(drawerInstance.drawerNode);
787
                disableDrawerTooltips(drawerInstance.drawerNode);
780
                if (drawerInstance.isOpen) {
788
                if (drawerInstance.isOpen) {
-
 
789
                    const currentFocus = document.activeElement;
-
 
790
                    const drawerContent = drawerInstance.drawerNode.querySelector(SELECTORS.DRAWERCONTENT);
-
 
791
                    const shouldClose = drawerInstance.closeOnResize && (!drawerContent || !drawerContent.contains(currentFocus));
781
                    if (drawerInstance.closeOnResize) {
792
                    if (shouldClose) {
782
                        drawerInstance.closeDrawer();
793
                        drawerInstance.closeDrawer();
783
                    } else {
794
                    } else {
784
                        anyOpen = true;
795
                        anyOpen = true;
785
                    }
796
                    }
786
                }
797
                }
Línea 796... Línea 807...
796
            getBackdrop().then(backdrop => backdrop.hide()).catch();
807
            getBackdrop().then(backdrop => backdrop.hide()).catch();
797
        }
808
        }
798
    };
809
    };
Línea 799... Línea 810...
799
 
810
 
-
 
811
    document.addEventListener('scroll', () => {
-
 
812
        const currentFocus = document.activeElement;
-
 
813
        const drawerContentElements = document.querySelectorAll(SELECTORS.DRAWERCONTENT);
-
 
814
        // Check if the current focus is within any drawer content.
-
 
815
        if (Array.from(drawerContentElements).some(drawer => drawer.contains(currentFocus))) {
-
 
816
            return;
800
    document.addEventListener('scroll', () => {
817
        }
801
        const body = document.querySelector('body');
818
        const body = document.querySelector('body');
802
        if (window.scrollY >= window.innerHeight) {
819
        if (window.scrollY >= window.innerHeight) {
803
            body.classList.add(CLASSES.SCROLLED);
820
            body.classList.add(CLASSES.SCROLLED);
804
        } else {
821
        } else {
Línea 811... Línea 828...
811
 
828
 
812
    const preventOverlap = debounce(Drawers.preventCoveringFocusedElement, 100);
829
    const preventOverlap = debounce(Drawers.preventCoveringFocusedElement, 100);
813
    document.addEventListener('focusin', preventOverlap);
830
    document.addEventListener('focusin', preventOverlap);
Línea 814... Línea 831...
814
    document.addEventListener('focusout', preventOverlap);
831
    document.addEventListener('focusout', preventOverlap);
815
 
832
 
Línea 816... Línea 833...
816
    window.addEventListener('resize', debounce(closeOnResizeListener, 400));
833
    window.addEventListener('resize', debounce(closeOnResizeListener, 400, {pending: true}));
Línea 817... Línea 834...
817
};
834
};