lib/editor/tiny/plugins/media/amd/src/manager.js

// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.

/**
 * Tiny Media Manager plugin class for Moodle.
 *
 * @module      tiny_media/manager
 * @copyright   2022, Stevani Andolo <stevani@hotmail.com.au>
 * @license     http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
 */

import Templates from 'core/templates';
import {get_string as getString} from 'core/str';
import * as Modal from 'core/modal_factory';
import * as ModalEvents from 'core/modal_events';
import {getData} from './options';
import Config from 'core/config';

export const MediaManager = class {

    editor = null;
    area = null;

    constructor(editor) {
        this.editor = editor;
        const data = getData(editor);
        this.area = data.params.area;
        this.area.itemid = data.fpoptions.image.itemid;
    }

    displayDialogue = () => {
        Modal.create({
            type: Modal.types.DEFAULT,
            large: true,
            title: getString('mediamanagerproperties', 'tiny_media'),
            body: Templates.render('tiny_media/mm_iframe', {
                src: this.getIframeURL()
            })
        }).then(modal => {
            modal.getRoot().on(ModalEvents.bodyRendered, () => {
                this.selectFirstElement();
            });
            modal.getRoot().on(ModalEvents.hidden, () => {
                modal.destroy();
            });
            modal.show();
            document.querySelector('.modal-lg').style.cssText = `max-width: 850px`;
            return modal;
        }).catch();
    };

    // It will select the first element in the file manager.
    selectFirstElement = () => {
        const iframe = document.getElementById('mm-iframe');
        iframe.addEventListener('load', function() {
            let intervalId = setInterval(function() {
                const iDocument = iframe.contentWindow.document;
                if (iDocument.querySelector('.filemanager')) {
                    const firstFocusableElement = iDocument.querySelector('.fp-navbar a:not([disabled])');
                    if (firstFocusableElement) {
                        firstFocusableElement.focus();
                    }
                    clearInterval(intervalId);
                }
            }, 200);
        });
    };

    getIframeURL = () => {
        const url = new URL(`${Config.wwwroot}/lib/editor/tiny/plugins/media/manage.php`);
        url.searchParams.append('elementid', this.editor.getElement().id);
        for (const key in this.area) {
            url.searchParams.append(key, this.area[key]);
        }
        return url.toString();
    };
};