mod/assign/amd/src/override_delete_modal.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/>.

/**
 * Modal for deleting an override with the option to recalculate penalties.
 *
 * @module     `mod_assign/override_delete_modal
 * @copyright  2025 Catalyst IT Australia Pty Ltd
 * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
 */

import * as CustomEvents from 'core/custom_interaction_events';
import Config from 'core/config';
import Modal from 'core/modal';

const SELECTORS = {
    DELETE_BUTTONS: '.delete-override',
    RECACULATION_CHECKBOX: '#recalculatepenalties',
};

/**
 * Custom Modal
 */
export default class OverrideDeleteModal extends Modal {
    static TYPE = "mod_assign/override_delete_modal";
    static TEMPLATE = "mod_assign/override_delete_modal";

    /**
     * Configure the modal.
     *
     * @param {Object} modalConfig
     */
    configure(modalConfig) {
        // Add question modals are always large.
        modalConfig.large = true;

        // Always show on creation.
        modalConfig.show = true;
        modalConfig.removeOnClose = true;

        // Apply standard configuration.
        super.configure(modalConfig);

        this.setOverrideId(modalConfig.overrideId);
        this.setSessionKey(modalConfig.sessionKey);
    }

    /**
     * Constructor.
     * Set required data to null.
     *
     * @param {HTMLElement} root
     */
    constructor(root) {
        super(root);

        // Recalculate penalties checkbox.
        this.recalculationCheckbox = this.getModal().find(SELECTORS.RECACULATION_CHECKBOX);

        // Data.
        this.setOverrideId(null);
        this.setSessionKey(null);
    }

    /**
     * Set the override id.
     *
     * @param {number} id The override id.
     */
    setOverrideId(id) {
        this.overrideId = id;
    }

    /**
     * Get the override id.
     *
     * @returns {*}
     */
    getOverrideId() {
        return this.overrideId;
    }

    /**
     * Set the session key.
     *
     * @param {string} key
     */
    setSessionKey(key) {
        this.sessionKey = key;
    }

    /**
     * Get the session key.
     *
     * @returns {*}
     */
    getSessionKey() {
        return this.sessionKey;
    }

    /**
     * Register events.
     *
     */
    registerEventListeners() {
        // Apply parent event listeners.
        super.registerEventListeners(this);

        // Register to close on cancel.
        this.registerCloseOnCancel();

        // Register the delete action.
        this.getModal().on(CustomEvents.events.activate, this.getActionSelector('delete'), () => {
            this.deleteOverride();
        });
    }

    /**
     * Delete a override.
     *
     */
    deleteOverride() {
        // Check if the recalculation checkbox is checked.
        const recalculate = this.recalculationCheckbox.prop('checked');

        // Redirect to the delete URL.
        const targetUrl = new URL(`${Config.wwwroot}/mod/assign/overridedelete.php`);
        targetUrl.searchParams.append('id', this.getOverrideId());
        targetUrl.searchParams.append('sesskey', this.getSessionKey());
        targetUrl.searchParams.append('confirm', 1);

        if (recalculate) {
            targetUrl.searchParams.append('recalculate', 1);
        }

        window.location.href = targetUrl.href;
    }
}