HEX
Server: Apache/2.4.6 (CentOS) OpenSSL/1.0.2k-fips PHP/8.0.30
System: Linux multiplicar 3.10.0-1160.102.1.el7.x86_64 #1 SMP Tue Oct 17 15:42:21 UTC 2023 x86_64
User: root (0)
PHP: 8.0.30
Disabled: NONE
Upload Files
File: /var/www/html/dls/calendar/amd/build/view_manager.min.js.map
{"version":3,"file":"view_manager.min.js","sources":["../src/view_manager.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.\n\n/**\n * A javascript module to handler calendar view changes.\n *\n * @module     core_calendar/view_manager\n * @copyright  2017 Andrew Nicols <andrew@nicols.co.uk>\n * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport $ from 'jquery';\nimport Templates from 'core/templates';\nimport Notification from 'core/notification';\nimport * as CalendarRepository from 'core_calendar/repository';\nimport CalendarEvents from 'core_calendar/events';\nimport * as CalendarSelectors from 'core_calendar/selectors';\nimport ModalFactory from 'core/modal_factory';\nimport ModalEvents from 'core/modal_events';\nimport SummaryModal from 'core_calendar/summary_modal';\nimport CustomEvents from 'core/custom_interaction_events';\nimport Pending from 'core/pending';\n\n/**\n * Register event listeners for the module.\n *\n * @param {object} root The root element.\n */\nconst registerEventListeners = (root) => {\n    root = $(root);\n\n    // Bind click events to event links.\n    root.on('click', CalendarSelectors.links.eventLink, (e) => {\n        const target = e.target;\n        let eventLink = null;\n        let eventId = null;\n        const pendingPromise = new Pending('core_calendar/view_manager:eventLink:click');\n\n        if (target.matches(CalendarSelectors.actions.viewEvent)) {\n            eventLink = target;\n        } else {\n            eventLink = target.closest(CalendarSelectors.actions.viewEvent);\n        }\n\n        if (eventLink) {\n            eventId = eventLink.dataset.eventId;\n        } else {\n            eventId = target.querySelector(CalendarSelectors.actions.viewEvent).dataset.eventId;\n        }\n\n        if (eventId) {\n            // A link was found. Show the modal.\n\n            e.preventDefault();\n            // We've handled the event so stop it from bubbling\n            // and causing the day click handler to fire.\n            e.stopPropagation();\n\n            renderEventSummaryModal(eventId)\n            .then(pendingPromise.resolve)\n            .catch();\n        } else {\n            pendingPromise.resolve();\n        }\n    });\n\n    root.on('click', CalendarSelectors.links.navLink, (e) => {\n        const wrapper = root.find(CalendarSelectors.wrapper);\n        const view = wrapper.data('view');\n        const courseId = wrapper.data('courseid');\n        const categoryId = wrapper.data('categoryid');\n        const link = e.currentTarget;\n\n        if (view === 'month') {\n            changeMonth(root, link.href, link.dataset.year, link.dataset.month, courseId, categoryId, link.dataset.day);\n            e.preventDefault();\n        } else if (view === 'day') {\n            changeDay(root, link.href, link.dataset.year, link.dataset.month, link.dataset.day, courseId, categoryId);\n            e.preventDefault();\n        }\n    });\n\n    const viewSelector = root.find(CalendarSelectors.viewSelector);\n    CustomEvents.define(viewSelector, [CustomEvents.events.activate]);\n    viewSelector.on(\n        CustomEvents.events.activate,\n        (e) => {\n            e.preventDefault();\n\n            const option = e.target;\n            if (option.classList.contains('active')) {\n                return;\n            }\n\n            const view = option.dataset.view,\n                year = option.dataset.year,\n                month = option.dataset.month,\n                day = option.dataset.day,\n                courseId = option.dataset.courseid,\n                categoryId = option.dataset.categoryid;\n\n            if (view == 'month') {\n                refreshMonthContent(root, year, month, courseId, categoryId, root, 'core_calendar/calendar_month', day)\n                    .then(() => {\n                        return window.history.pushState({}, '', '?view=month');\n                    }).fail(Notification.exception);\n            } else if (view == 'day') {\n                refreshDayContent(root, year, month, day, courseId, categoryId, root, 'core_calendar/calendar_day')\n                    .then(() => {\n                        return window.history.pushState({}, '', '?view=day');\n                    }).fail(Notification.exception);\n            } else if (view == 'upcoming') {\n                reloadCurrentUpcoming(root, courseId, categoryId, root, 'core_calendar/calendar_upcoming')\n                    .then(() => {\n                        return window.history.pushState({}, '', '?view=upcoming');\n                    }).fail(Notification.exception);\n            }\n        }\n    );\n};\n\n/**\n * Refresh the month content.\n *\n * @param {object} root The root element.\n * @param {number} year Year\n * @param {number} month Month\n * @param {number} courseId The id of the course whose events are shown\n * @param {number} categoryId The id of the category whose events are shown\n * @param {object} target The element being replaced. If not specified, the calendarwrapper is used.\n * @param {string} template The template to be rendered.\n * @param {number} day Day (optional)\n * @return {promise}\n */\nexport const refreshMonthContent = (root, year, month, courseId, categoryId, target = null, template = '', day = 1) => {\n    startLoading(root);\n\n    target = target || root.find(CalendarSelectors.wrapper);\n    template = template || root.attr('data-template');\n    M.util.js_pending([root.get('id'), year, month, courseId].join('-'));\n    const includenavigation = root.data('includenavigation');\n    const mini = root.data('mini');\n    return CalendarRepository.getCalendarMonthData(year, month, courseId, categoryId, includenavigation, mini, day)\n        .then(context => {\n            context.viewingmonth = true;\n            return Templates.render(template, context);\n        })\n        .then((html, js) => {\n            return Templates.replaceNode(target, html, js);\n        })\n        .then(() => {\n            document.querySelector('body').dispatchEvent(new CustomEvent(CalendarEvents.viewUpdated));\n            return;\n        })\n        .always(() => {\n            M.util.js_complete([root.get('id'), year, month, courseId].join('-'));\n            return stopLoading(root);\n        })\n        .fail(Notification.exception);\n};\n\n/**\n * Handle changes to the current calendar view.\n *\n * @param {object} root The container element\n * @param {string} url The calendar url to be shown\n * @param {number} year Year\n * @param {number} month Month\n * @param {number} courseId The id of the course whose events are shown\n * @param {number} categoryId The id of the category whose events are shown\n * @param {number} day Day (optional)\n * @return {promise}\n */\nexport const changeMonth = (root, url, year, month, courseId, categoryId, day = 1) => {\n    return refreshMonthContent(root, year, month, courseId, categoryId, null, '', day)\n        .then((...args) => {\n            if (url.length && url !== '#') {\n                window.history.pushState({}, '', url);\n            }\n            return args;\n        })\n        .then((...args) => {\n            $('body').trigger(CalendarEvents.monthChanged, [year, month, courseId, categoryId]);\n            return args;\n        });\n};\n\n/**\n * Reload the current month view data.\n *\n * @param {object} root The container element.\n * @param {number} courseId The course id.\n * @param {number} categoryId The id of the category whose events are shown\n * @return {promise}\n */\nexport const reloadCurrentMonth = (root, courseId = 0, categoryId = 0) => {\n    const year = root.find(CalendarSelectors.wrapper).data('year');\n    const month = root.find(CalendarSelectors.wrapper).data('month');\n    const day = root.find(CalendarSelectors.wrapper).data('day');\n\n    courseId = courseId || root.find(CalendarSelectors.wrapper).data('courseid');\n    categoryId = categoryId || root.find(CalendarSelectors.wrapper).data('categoryid');\n\n    return refreshMonthContent(root, year, month, courseId, categoryId, null, '', day);\n};\n\n\n/**\n * Refresh the day content.\n *\n * @param {object} root The root element.\n * @param {number} year Year\n * @param {number} month Month\n * @param {number} day Day\n * @param {number} courseId The id of the course whose events are shown\n * @param {number} categoryId The id of the category whose events are shown\n * @param {object} target The element being replaced. If not specified, the calendarwrapper is used.\n * @param {string} template The template to be rendered.\n *\n * @return {promise}\n */\nexport const refreshDayContent = (root, year, month, day, courseId, categoryId, target = null, template = '') => {\n    startLoading(root);\n\n    if (!target || target.length == 0){\n        target = root.find(CalendarSelectors.wrapper);\n    }\n    template = template || root.attr('data-template');\n    M.util.js_pending([root.get('id'), year, month, day, courseId, categoryId].join('-'));\n    const includenavigation = root.data('includenavigation');\n    return CalendarRepository.getCalendarDayData(year, month, day, courseId, categoryId, includenavigation)\n        .then((context) => {\n            context.viewingday = true;\n            return Templates.render(template, context);\n        })\n        .then((html, js) => {\n            return Templates.replaceNode(target, html, js);\n        })\n        .then(() => {\n            document.querySelector('body').dispatchEvent(new CustomEvent(CalendarEvents.viewUpdated));\n            return;\n        })\n        .always(() => {\n            M.util.js_complete([root.get('id'), year, month, day, courseId, categoryId].join('-'));\n            return stopLoading(root);\n        })\n        .fail(Notification.exception);\n};\n\n/**\n * Reload the current day view data.\n *\n * @param {object} root The container element.\n * @param {number} courseId The course id.\n * @param {number} categoryId The id of the category whose events are shown\n * @return {promise}\n */\nexport const reloadCurrentDay = (root, courseId = 0, categoryId = 0) => {\n    const wrapper = root.find(CalendarSelectors.wrapper);\n    const year = wrapper.data('year');\n    const month = wrapper.data('month');\n    const day = wrapper.data('day');\n\n    courseId = courseId || root.find(CalendarSelectors.wrapper).data('courseid');\n    categoryId = categoryId || root.find(CalendarSelectors.wrapper).data('categoryid');\n\n    return refreshDayContent(root, year, month, day, courseId, categoryId);\n};\n\n/**\n * Handle changes to the current calendar view.\n *\n * @param {object} root The root element.\n * @param {String} url The calendar url to be shown\n * @param {Number} year Year\n * @param {Number} month Month\n * @param {Number} day Day\n * @param {Number} courseId The id of the course whose events are shown\n * @param {Number} categoryId The id of the category whose events are shown\n * @return {promise}\n */\nexport const changeDay = (root, url, year, month, day, courseId, categoryId) => {\n    return refreshDayContent(root, year, month, day, courseId, categoryId)\n        .then((...args) => {\n            if (url.length && url !== '#') {\n                window.history.pushState({}, '', url);\n            }\n            return args;\n        })\n        .then((...args) => {\n            $('body').trigger(CalendarEvents.dayChanged, [year, month, courseId, categoryId]);\n            return args;\n        });\n};\n\n/**\n * Set the element state to loading.\n *\n * @param {object} root The container element\n * @method startLoading\n */\nconst startLoading = (root) => {\n    const loadingIconContainer = root.find(CalendarSelectors.containers.loadingIcon);\n\n    loadingIconContainer.removeClass('hidden');\n};\n\n/**\n * Remove the loading state from the element.\n *\n * @param {object} root The container element\n * @method stopLoading\n */\nconst stopLoading = (root) => {\n    const loadingIconContainer = root.find(CalendarSelectors.containers.loadingIcon);\n\n    loadingIconContainer.addClass('hidden');\n};\n\n/**\n * Reload the current month view data.\n *\n * @param {object} root The container element.\n * @param {number} courseId The course id.\n * @param {number} categoryId The id of the category whose events are shown\n * @param {object} target The element being replaced. If not specified, the calendarwrapper is used.\n * @param {string} template The template to be rendered.\n * @return {promise}\n */\nexport const reloadCurrentUpcoming = (root, courseId = 0, categoryId = 0, target = null, template = '') => {\n    startLoading(root);\n\n    target = target || root.find(CalendarSelectors.wrapper);\n    template = template || root.attr('data-template');\n    courseId = courseId || root.find(CalendarSelectors.wrapper).data('courseid');\n    categoryId = categoryId || root.find(CalendarSelectors.wrapper).data('categoryid');\n\n    return CalendarRepository.getCalendarUpcomingData(courseId, categoryId)\n        .then((context) => {\n            context.viewingupcoming = true;\n            return Templates.render(template, context);\n        })\n        .then((html, js) => {\n            return Templates.replaceNode(target, html, js);\n        })\n        .then(() => {\n            document.querySelector('body').dispatchEvent(new CustomEvent(CalendarEvents.viewUpdated));\n            return;\n        })\n        .always(function() {\n            return stopLoading(root);\n        })\n        .fail(Notification.exception);\n};\n\n/**\n * Get the CSS class to apply for the given event type.\n *\n * @param {string} eventType The calendar event type\n * @return {string}\n */\nconst getEventTypeClassFromType = (eventType) => {\n    return 'calendar_event_' + eventType;\n};\n\n/**\n * Render the event summary modal.\n *\n * @param {Number} eventId The calendar event id.\n * @returns {Promise}\n */\nconst renderEventSummaryModal = (eventId) => {\n    const pendingPromise = new Pending('core_calendar/view_manager:renderEventSummaryModal');\n\n    // Calendar repository promise.\n    return CalendarRepository.getEventById(eventId)\n    .then((getEventResponse) => {\n        if (!getEventResponse.event) {\n            throw new Error('Error encountered while trying to fetch calendar event with ID: ' + eventId);\n        }\n\n        return getEventResponse.event;\n    })\n    .then(eventData => {\n        // Build the modal parameters from the event data.\n        const modalParams = {\n            title: eventData.name,\n            type: SummaryModal.TYPE,\n            body: Templates.render('core_calendar/event_summary_body', eventData),\n            templateContext: {\n                canedit: eventData.canedit,\n                candelete: eventData.candelete,\n                headerclasses: getEventTypeClassFromType(eventData.normalisedeventtype),\n                isactionevent: eventData.isactionevent,\n                url: eventData.url,\n                action: eventData.action\n            }\n        };\n\n        // Create the modal.\n        return ModalFactory.create(modalParams);\n    })\n    .then(modal => {\n        // Handle hidden event.\n        modal.getRoot().on(ModalEvents.hidden, function() {\n            // Destroy when hidden.\n            modal.destroy();\n        });\n\n        // Finally, render the modal!\n        modal.show();\n\n        return modal;\n    })\n    .then(modal => {\n        pendingPromise.resolve();\n\n        return modal;\n    })\n    .catch(Notification.exception);\n};\n\nexport const init = (root, view) => {\n    registerEventListeners(root, view);\n};\n"],"names":["refreshMonthContent","root","year","month","courseId","categoryId","target","template","day","startLoading","find","CalendarSelectors","wrapper","attr","M","util","js_pending","get","join","includenavigation","data","mini","CalendarRepository","getCalendarMonthData","then","context","viewingmonth","Templates","render","html","js","replaceNode","document","querySelector","dispatchEvent","CustomEvent","CalendarEvents","viewUpdated","always","js_complete","stopLoading","fail","Notification","exception","changeMonth","url","length","window","history","pushState","args","trigger","monthChanged","refreshDayContent","getCalendarDayData","viewingday","changeDay","dayChanged","containers","loadingIcon","removeClass","addClass","reloadCurrentUpcoming","getCalendarUpcomingData","viewingupcoming","renderEventSummaryModal","eventId","pendingPromise","Pending","getEventById","getEventResponse","event","Error","eventData","eventType","modalParams","title","name","type","SummaryModal","TYPE","body","templateContext","canedit","candelete","headerclasses","normalisedeventtype","isactionevent","action","ModalFactory","create","modal","getRoot","on","ModalEvents","hidden","destroy","show","resolve","catch","view","links","eventLink","e","matches","actions","viewEvent","closest","dataset","preventDefault","stopPropagation","navLink","link","currentTarget","href","viewSelector","define","CustomEvents","events","activate","option","classList","contains","courseid","categoryid","registerEventListeners"],"mappings":"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"}