Proyectos de Subversion Moodle

Rev

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

// 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/>.

/**
 * unilabel helper for activity picker
 *
 * @author      Andreas Grabs <info@grabs-edv.de>
 * @copyright   2018 onwards Grabs EDV {@link https://www.grabs-edv.de}
 * @license     http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
 */

import log from 'core/log';

/**
 * Switch the input to a visible activity link.
 *
 * @param {Element} currentinput The url input field which is bound to the picker
 * @param {Element} activitylinksrc The activity element from the picker list to be cloned to the url input
 * @param {String} url
 * @param {Boolean} makedirty Should the from be dirty after switching
 * @param {String} deletestr The delete string for the delete button.
 */
export const switchInput = (currentinput, activitylinksrc, url, makedirty, deletestr) => {
    /**
     * Go recursive through all child elements given from element and apply the callback function.
     *
     * @param {Element} element
     * @param {CallableFunction} callback
     */
    const childrenAll = (element, callback) => {
        for (const child of element.children) {
            childrenAll(child, callback);
        }
        callback(element);
    };

    /**
     * Make the form dirty so the changechecker is aware of.
     *
     * @param {Element} currentinput
     */
    const makeFormDirty = (currentinput) => {
        // To make the moodle form aware of the change, we set the data-initial-value to its original value.
        currentinput.closest('form').dataset.formDirty = true;
    };

    currentinput.value = url;
    currentinput.type = 'hidden';
    currentinput.dataset.initialValue = currentinput.value;
    let activitylink = activitylinksrc.closest('.activitytitle').cloneNode(true); // The new clone might have ids.

    log.debug('Remove all links from clone');
    childrenAll(activitylink, (e) => {
        e.removeAttribute('id'); // Remove all ids.
        if (e.nodeName.toLowerCase() == 'div' && e.classList.contains('unilabel-activity-picker-info')) {
            e.remove();
        }
        if (e.nodeName.toLowerCase() == 'a') {
            e.target = '_blank';
            e.classList.remove('stretched-link');
        }
    });

    activitylink.classList.add('unilabel-input-replacement', 'border-primary', 'rounded');
    let deletelinkcontainer = document.createElement('div');
    let deletelink = document.createElement('a');
    let deleteicon = document.createElement('i');

    deleteicon.classList.add('fa', 'fa-times', 'text-danger');
    deleteicon.dataset.inputid = currentinput.id; // Add data attribute because it often is the click target.
    deleteicon.title = deletestr;

    deletelink.insertAdjacentElement('afterbegin', deleteicon);
    deletelink.classList.add('unilabel-replacement-delete');
    deletelink.href = '#';
    deletelink.dataset.inputid = currentinput.id; // Add the data attribute to find the input field.
    deletelink.title = deletestr;

    deletelinkcontainer.insertAdjacentElement('afterbegin', deletelink);
    activitylink.insertAdjacentElement('beforeend', deletelinkcontainer);
    currentinput.insertAdjacentElement('afterend', activitylink);

    if (makedirty) {
        makeFormDirty(currentinput);
    }

    deletelink.addEventListener('click', (e) => {
        e.preventDefault();
        activitylink.remove();
        let currentinput = document.querySelector('#' + e.target.dataset.inputid);
        currentinput.value = '';
        currentinput.type = 'text';
        currentinput.focus();

        makeFormDirty(currentinput);
    });
};