Proyectos de Subversion Moodle

Rev

Autoría | Ultima modificación | Ver Log |

/**
 * Unilabel type imageboard
 *
 * @author      Andreas Schenkel
 * @copyright   Andreas Schenkel {@link https://github.com/andreasschenkel}
 * @license     http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
 */

import * as Str from 'core/str';

/**
 * @param {string} cmid
 * @param {string} canvaswidth
 * @param {string} canvasheight
 * @param {boolean} autoscale
 * @param {boolean} showgrid
 */
export const init = (cmid, canvaswidth, canvasheight, autoscale, showgrid) => {
    if (autoscale === true) {
        // To autoscale we can not just listen to the risize event from the window.
        // We have to check the size of the module container. It will change its size depending on the left and right drawers.
        // To accomplish this, we use the resizeObserver object.

        // The container we want be informed about its resize.
        const moduleContainer = document.querySelector("#module-" + cmid + " div.activity-item");

        // Now we create the resizeObserver object.
        const resizeObserver = new ResizeObserver(function() {
            resize(moduleContainer, cmid, canvaswidth, canvasheight);
        });
        resizeObserver.observe(moduleContainer); // Connect the resizeObserver with the moduleContainer.

        resize(moduleContainer, cmid, canvaswidth, canvasheight);
    }

    const gridtoggler = document.getElementById("unilabeltype-imageboard-gridtoggler-" + cmid);
    const togglerText = gridtoggler.querySelector('.unilabeltype-imageboard-toggle-text');
    const helpergrid = document.getElementById("unilabeltype-imageboard-helpergrid-" + cmid);

    if (showgrid === true) {
        showGrid(togglerText, helpergrid);
    }

    gridtoggler.addEventListener("click", function(event) {
        event.stopPropagation();
        event.preventDefault();
        if (helpergrid.classList.contains("hidden")) {
            showGrid(togglerText, helpergrid);
        } else {
            hideGrid(togglerText, helpergrid);
        }
    });

    /**
     * Helper function to remove the grid from imageboard.
     *
     * @param {object} button
     * @param {object} helpergrid
     */
    function showGrid(button, helpergrid) {
        helpergrid.classList.remove("hidden");
        button.value = 'gridvisible';
        Str.get_string('buttonlabelhelpergridhide', 'unilabeltype_imageboard').done(function(text) {
            button.innerText = text;
        });
    }

    /**
     * Helper function to remove the grid from imageboard.
     *
     * @param {object} button
     * @param {object} helpergrid
     */
    function hideGrid(button, helpergrid) {
        helpergrid.classList.add("hidden");
        button.value = 'gridhidden';
        Str.get_string('buttonlabelhelpergridshow', 'unilabeltype_imageboard').done(function(text) {
            button.innerText = text;
        });
    }

    /**
     * Helper function to get the width of the usable browserarea.
     *
     * @param {Element} moduleContainer
     * @returns {*|number}
     */
    function getWidth(moduleContainer) {
        let style = window.getComputedStyle(moduleContainer);
        let xPadding = parseInt(style.paddingLeft) + parseInt(style.paddingRight);
        return moduleContainer.clientWidth - xPadding;
    }

    /**
     * Resizes the imageboard when autoscale is set true.
     * @param {Element} moduleContainer
     * @param {string} cmid
     * @param {string} canvaswidth
     * @param {string} canvasheight
     */
    function resize(moduleContainer, cmid, canvaswidth, canvasheight) {
        const imageboardContainer = document.getElementById("unilabeltype-imageboard-container-" + cmid);

        let newcanvaswidth = 0;
        newcanvaswidth = getWidth(moduleContainer);
        // Do not make backgroundimage larger than the configured width
        if (newcanvaswidth > canvaswidth) {
            newcanvaswidth = canvaswidth;
        }

        let widthfactor = newcanvaswidth / canvaswidth;

        const mydiv = document.getElementById("unilabeltype-imageboard-" + cmid);

        mydiv.style.transform = "scale(" + widthfactor + ")";
        mydiv.style.transformOrigin = "0 0";

        // Make the imageboardContainer just 20px larger than the imageboard.
        imageboardContainer.style.width = mydiv.offsetWidth * widthfactor + "px";

        // The height of the white space that is generated by scaling the div can be calculated
        let heightOfSpace = canvasheight * (1 - widthfactor);
        mydiv.style.marginBottom = "-" + heightOfSpace + "px";
    }
};