Proyectos de Subversion Moodle

Rev

Rev 1 | Autoría | Comparar con el anterior | Ultima modificación | Ver Log |

{"version":3,"file":"calendar.min.js","sources":["../src/calendar.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 * This module is the highest level module for the calendar. It is\n * responsible for initialising all of the components required for\n * the calendar to run. It also coordinates the interaction between\n * components by listening for and responding to different events\n * triggered within the calendar UI.\n *\n * @module     core_calendar/calendar\n * @copyright  2017 Simey Lameze <simey@moodle.com>\n * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine([\n    'jquery',\n    'core/templates',\n    'core/notification',\n    'core_calendar/repository',\n    'core_calendar/events',\n    'core_calendar/view_manager',\n    'core_calendar/crud',\n    'core_calendar/selectors',\n    'core/url',\n    'core/str',\n],\nfunction(\n    $,\n    Templates,\n    Notification,\n    CalendarRepository,\n    CalendarEvents,\n    CalendarViewManager,\n    CalendarCrud,\n    CalendarSelectors,\n    Url,\n    Str,\n) {\n\n    var SELECTORS = {\n        ROOT: \"[data-region='calendar']\",\n        DAY: \"[data-region='day']\",\n        NEW_EVENT_BUTTON: \"[data-action='new-event-button']\",\n        DAY_CONTENT: \"[data-region='day-content']\",\n        LOADING_ICON: '.loading-icon',\n        VIEW_DAY_LINK: \"[data-action='view-day-link']\",\n        CALENDAR_MONTH_WRAPPER: \".calendarwrapper\",\n        TODAY: '.today',\n        DAY_NUMBER_CIRCLE: '.day-number-circle',\n        DAY_NUMBER: '.day-number',\n        SCREEN_READER_ANNOUNCEMENTS: '.calendar-announcements',\n        CURRENT_MONTH: '.calendar-controls .current'\n    };\n\n    /**\n     * Handler for the drag and drop move event. Provides a loading indicator\n     * while the request is sent to the server to update the event start date.\n     *\n     * Triggers a eventMoved calendar javascript event if the event was successfully\n     * updated.\n     *\n     * @param {event} e The calendar move event\n     * @param {int} eventId The event id being moved\n     * @param {object|null} originElement The jQuery element for where the event is moving from\n     * @param {object} destinationElement The jQuery element for where the event is moving to\n     */\n    var handleMoveEvent = function(e, eventId, originElement, destinationElement) {\n        var originTimestamp = null;\n        var destinationTimestamp = destinationElement.attr('data-day-timestamp');\n\n        if (originElement) {\n            originTimestamp = originElement.attr('data-day-timestamp');\n        }\n\n        // If the event has actually changed day.\n        if (!originElement || originTimestamp != destinationTimestamp) {\n            Templates.render('core/loading', {})\n                .then(function(html, js) {\n                    // First we show some loading icons in each of the days being affected.\n                    destinationElement.find(SELECTORS.DAY_CONTENT).addClass('hidden');\n                    Templates.appendNodeContents(destinationElement, html, js);\n\n                    if (originElement) {\n                        originElement.find(SELECTORS.DAY_CONTENT).addClass('hidden');\n                        Templates.appendNodeContents(originElement, html, js);\n                    }\n                    return;\n                })\n                .then(function() {\n                    // Send a request to the server to make the change.\n                    return CalendarRepository.updateEventStartDay(eventId, destinationTimestamp);\n                })\n                .then(function() {\n                    // If the update was successful then broadcast an event letting the calendar\n                    // know that an event has been moved.\n                    $('body').trigger(CalendarEvents.eventMoved, [eventId, originElement, destinationElement]);\n                    return;\n                })\n                .always(function() {\n                    // Always remove the loading icons regardless of whether the update\n                    // request was successful or not.\n                    var destinationLoadingElement = destinationElement.find(SELECTORS.LOADING_ICON);\n                    destinationElement.find(SELECTORS.DAY_CONTENT).removeClass('hidden');\n                    Templates.replaceNode(destinationLoadingElement, '', '');\n\n                    if (originElement) {\n                        var originLoadingElement = originElement.find(SELECTORS.LOADING_ICON);\n                        originElement.find(SELECTORS.DAY_CONTENT).removeClass('hidden');\n                        Templates.replaceNode(originLoadingElement, '', '');\n                    }\n                    return;\n                })\n                .catch(Notification.exception);\n        }\n    };\n\n    /**\n     * Listen to and handle any calendar events fired by the calendar UI.\n     *\n     * @method registerCalendarEventListeners\n     * @param {object} root The calendar root element\n     * @param {object} eventFormModalPromise A promise reolved with the event form modal\n     */\n    var registerCalendarEventListeners = function(root, eventFormModalPromise) {\n        var body = $('body');\n\n        body.on(CalendarEvents.created, function() {\n            CalendarViewManager.reloadCurrentMonth(root);\n        });\n        body.on(CalendarEvents.deleted, function() {\n            CalendarViewManager.reloadCurrentMonth(root);\n        });\n        body.on(CalendarEvents.updated, function() {\n            CalendarViewManager.reloadCurrentMonth(root);\n        });\n        body.on(CalendarEvents.editActionEvent, function(e, url) {\n            // Action events needs to be edit directly on the course module.\n            window.location.assign(url);\n        });\n        // Handle the event fired by the drag and drop code.\n        body.on(CalendarEvents.moveEvent, handleMoveEvent);\n        // When an event is successfully moved we should updated the UI.\n        body.on(CalendarEvents.eventMoved, function() {\n            CalendarViewManager.reloadCurrentMonth(root);\n        });\n        // Announce the newly loaded month to screen readers.\n        body.on(CalendarEvents.monthChanged, root, async function() {\n            const monthName = body.find(SELECTORS.CURRENT_MONTH).text();\n            const monthAnnoucement = await Str.get_string('newmonthannouncement', 'calendar', monthName);\n            body.find(SELECTORS.SCREEN_READER_ANNOUNCEMENTS).html(monthAnnoucement);\n        });\n\n        CalendarCrud.registerEditListeners(root, eventFormModalPromise);\n    };\n\n    /**\n     * Register event listeners for the module.\n     *\n     * @param {object} root The calendar root element\n     * @param {boolean} isCalendarBlock - A flag indicating whether this is a calendar block.\n     */\n    var registerEventListeners = function(root, isCalendarBlock) {\n        const viewingFullCalendar = document.getElementById(CalendarSelectors.fullCalendarView);\n        // Listen the click on the day link to render the day view.\n        root.on('click', SELECTORS.VIEW_DAY_LINK, function(e) {\n            var dayLink = $(e.target).closest(SELECTORS.VIEW_DAY_LINK);\n            var year = dayLink.data('year'),\n                month = dayLink.data('month'),\n                day = dayLink.data('day'),\n                courseId = dayLink.data('courseid'),\n                categoryId = dayLink.data('categoryid');\n            const urlParams = {\n                view: 'day',\n                time: dayLink.data('timestamp'),\n                course: courseId,\n            };\n            if (viewingFullCalendar) {\n                // Construct the URL parameter string from the urlParams object.\n                const urlParamString = Object.entries(urlParams)\n                    .map(([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(value)}`)\n                    .join('&');\n                CalendarViewManager.refreshDayContent(root, year, month, day, courseId, categoryId, root,\n                    'core_calendar/calendar_day', isCalendarBlock).then(function() {\n                    e.preventDefault();\n                    // Update the URL if it's not calendar block.\n                    if (!isCalendarBlock) {\n                        CalendarViewManager.updateUrl('?' + urlParamString);\n                    }\n                    return;\n                }).catch(Notification.exception);\n            } else {\n                window.location.assign(Url.relativeUrl('calendar/view.php', urlParams));\n            }\n        });\n\n        root.on('change', CalendarSelectors.elements.courseSelector, function() {\n            var selectElement = $(this);\n            var courseId = selectElement.val();\n            const courseName = $(\"option:selected\", selectElement).text();\n            CalendarViewManager.reloadCurrentMonth(root, courseId, null)\n                .then(function() {\n                    // We need to get the selector again because the content has changed.\n                    return root.find(CalendarSelectors.elements.courseSelector).val(courseId);\n                })\n                .then(function() {\n                    CalendarViewManager.updateUrl('?view=month&course=' + courseId);\n                    CalendarViewManager.handleCourseChange(Number(courseId), courseName);\n                    return;\n                })\n                .catch(Notification.exception);\n        });\n\n        var eventFormPromise = CalendarCrud.registerEventFormModal(root),\n            contextId = $(SELECTORS.CALENDAR_MONTH_WRAPPER).data('context-id');\n        registerCalendarEventListeners(root, eventFormPromise);\n\n        if (contextId) {\n            // Bind click events to calendar days.\n            root.on('click', SELECTORS.DAY, function(e) {\n                var target = $(e.target);\n                const displayingSmallBlockCalendar = root.parents('aside').data('blockregion') === 'side-pre';\n\n                if (!viewingFullCalendar && displayingSmallBlockCalendar) {\n                    const dateContainer = target.closest(SELECTORS.DAY);\n                    const wrapper = target.closest(CalendarSelectors.wrapper);\n                    const courseId = wrapper.data('courseid');\n                    const params = {\n                        view: 'day',\n                        time: dateContainer.data('day-timestamp'),\n                        course: courseId,\n                    };\n                    window.location.assign(Url.relativeUrl('calendar/view.php', params));\n                } else {\n                    const hasViewDayLink = target.closest(SELECTORS.VIEW_DAY_LINK).length;\n                    const shouldShowNewEventModal = !hasViewDayLink;\n                    if (shouldShowNewEventModal) {\n                        var startTime = $(this).attr('data-new-event-timestamp');\n                        eventFormPromise.then(function(modal) {\n                            var wrapper = target.closest(CalendarSelectors.wrapper);\n                            modal.setCourseId(wrapper.data('courseid'));\n\n                            var categoryId = wrapper.data('categoryid');\n                            if (typeof categoryId !== 'undefined') {\n                                modal.setCategoryId(categoryId);\n                            }\n\n                            modal.setContextId(wrapper.data('contextId'));\n                            modal.setStartTime(startTime);\n                            modal.show();\n                            return;\n                        }).catch(Notification.exception);\n                    }\n                }\n                e.preventDefault();\n            });\n        }\n    };\n\n    return {\n        /**\n         * Initializes the calendar view manager and registers event listeners.\n         *\n         * @param {HTMLElement} root - The root element where the calendar view manager and event listeners will be attached.\n         * @param {boolean} [isCalendarBlock=false] - A flag indicating whether this is a calendar block.\n         */\n        init: function(root, isCalendarBlock = false) {\n            root = $(root);\n            CalendarViewManager.init(root, 'month', isCalendarBlock);\n            registerEventListeners(root, isCalendarBlock);\n        }\n    };\n});\n"],"names":["define","$","Templates","Notification","CalendarRepository","CalendarEvents","CalendarViewManager","CalendarCrud","CalendarSelectors","Url","Str","SELECTORS","handleMoveEvent","e","eventId","originElement","destinationElement","originTimestamp","destinationTimestamp","attr","render","then","html","js","find","addClass","appendNodeContents","updateEventStartDay","trigger","eventMoved","always","destinationLoadingElement","removeClass","replaceNode","originLoadingElement","catch","exception","registerEventListeners","root","isCalendarBlock","viewingFullCalendar","document","getElementById","fullCalendarView","on","dayLink","target","closest","year","data","month","day","courseId","categoryId","urlParams","view","time","course","urlParamString","Object","entries","map","_ref","key","value","encodeURIComponent","join","refreshDayContent","preventDefault","updateUrl","window","location","assign","relativeUrl","elements","courseSelector","selectElement","this","val","courseName","text","reloadCurrentMonth","handleCourseChange","Number","eventFormPromise","registerEventFormModal","contextId","eventFormModalPromise","body","created","deleted","updated","editActionEvent","url","moveEvent","monthChanged","async","monthName","monthAnnoucement","get_string","registerEditListeners","registerCalendarEventListeners","displayingSmallBlockCalendar","parents","dateContainer","wrapper","params","length","startTime","modal","setCourseId","setCategoryId","setContextId","setStartTime","show","init"],"mappings":"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"}