mod/workshop/amd/src/modform.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/>.

/**
 * Additional javascript for the Workshop module form.
 *
 * @module      mod_workshop/modform
 * @copyright   The Open University 2018
 * @license     http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
 */
define(['jquery'], function($) {

    var submissionTypes = {
        text: {
            available: null,
            required: null,
            requiredHidden: null
        },
        file: {
            available: null,
            required: null,
            requiredHidden: null
        }
    };

    /**
     * Determine whether one of the submission types has been marked as not available.
     *
     * If it has been marked not available, clear and disable its required checkbox.  Then determine if the other submission
     * type is available, and if it is, check and disable its required checkbox.
     *
     * @param {Object} checkUnavailable
     * @param {Object} checkAvailable
     */
    function checkAvailability(checkUnavailable, checkAvailable) {
        if (!checkUnavailable.available.prop('checked')) {
            checkUnavailable.required.prop('disabled', true);
            checkUnavailable.required.prop('checked', false);
            if (checkAvailable.available.prop('checked')) {
                checkAvailable.required.prop('disabled', true);
                checkAvailable.required.prop('checked', true);
                // Also set the checkbox's hidden field to 1 so a 'required' value is submitted for the submission type.
                checkAvailable.requiredHidden.val(1);
            }
        }
    }

    /**
     * Enable the submission type's required checkbox and uncheck it.
     *
     * @param {Object} submissionType
     */
    function enableRequired(submissionType) {
        submissionType.required.prop('disabled', false);
        submissionType.required.prop('checked', false);
        submissionType.requiredHidden.val(0);
    }

    /**
     * Check which submission types have been marked as available, and disable required checkboxes as necessary.
     */
    function submissionTypeChanged() {
        checkAvailability(submissionTypes.file, submissionTypes.text);
        checkAvailability(submissionTypes.text, submissionTypes.file);
        if (submissionTypes.text.available.prop('checked') && submissionTypes.file.available.prop('checked')) {
            enableRequired(submissionTypes.text);
            enableRequired(submissionTypes.file);
        }
    }

    return /** @alias module:mod_workshop/modform */ {
        /**
         * Find all the required fields, set up event listeners, and set the initial state of required checkboxes.
         */
        init: function() {
            submissionTypes.text.available = $('#id_submissiontypetextavailable');
            submissionTypes.text.required = $('#id_submissiontypetextrequired');
            submissionTypes.text.requiredHidden = $('input[name="submissiontypetextrequired"][type="hidden"]');
            submissionTypes.file.available = $('#id_submissiontypefileavailable');
            submissionTypes.file.required = $('#id_submissiontypefilerequired');
            submissionTypes.file.requiredHidden = $('input[name="submissiontypefilerequired"][type="hidden"]');
            submissionTypes.text.available.on('change', submissionTypeChanged);
            submissionTypes.file.available.on('change', submissionTypeChanged);
            submissionTypeChanged();
        }
    };
});