// 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/>.
/**
* Handle clicking on action links of the feedback alert.
*
* @module core/userfeedback
* @copyright 2020 Shamim Rezaie <shamim@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
import Ajax from 'core/ajax';
import Notification from 'core/notification';
const Selectors = {
regions: {
root: '[data-region="core/userfeedback"]',
},
actions: {},
};
Selectors.actions.give = `${Selectors.regions.root} [data-action="give"]`;
Selectors.actions.remind = `${Selectors.regions.root} [data-action="remind"]`;
/**
* Attach the necessary event handlers to the action links
*/
export const registerEventListeners = () => {
document.addEventListener('click', e => {
const giveAction = e.target.closest(Selectors.actions.give);
if (giveAction) {
e.preventDefault();
if (!window.open(giveAction.href)) {
throw new Error('Unable to open popup');
}
Promise.resolve(giveAction)
.then(hideRoot)
.then(recordAction)
.catch(Notification.exception);
}
const remindAction = e.target.closest(Selectors.actions.remind);
if (remindAction) {
e.preventDefault();
Promise.resolve(remindAction)
.then(hideRoot)
.then(recordAction)
.catch(Notification.exception);
}
});
};
/**
* Record the action that the user took.
*
* @param {HTMLElement} clickedItem The action element that the user chose.
* @returns {Promise}
*/
const recordAction = clickedItem => {
if (clickedItem.dataset.record) {
return Ajax.call([{
methodname: 'core_create_userfeedback_action_record',
args: {
action: clickedItem.dataset.action,
contextid: M.cfg.contextid,
}
}])[0];
}
return Promise.resolve();
};
/**
* Hide the root node of the CTA notification.
*
* @param {HTMLElement} clickedItem The action element that the user chose.
* @returns {HTMLElement}
*/
const hideRoot = clickedItem => {
if (clickedItem.dataset.hide) {
clickedItem.closest(Selectors.regions.root).remove();
}
return clickedItem;
};