Current Path : /var/www/ljmtc/cbt/blocks/timeline/amd/build/ |
Current File : /var/www/ljmtc/cbt/blocks/timeline/amd/build/event_list.min.js.map |
{"version":3,"sources":["../src/event_list.js"],"names":["define","$","Notification","Templates","PagedContentFactory","Str","UserDate","CalendarEventsRepository","SELECTORS","EMPTY_MESSAGE","ROOT","EVENT_LIST_CONTENT","EVENT_LIST_LOADING_PLACEHOLDER","TEMPLATES","DEFAULT_PAGED_CONTENT_CONFIG","ignoreControlWhileLoading","controlPlacementBottom","ariaLabels","itemsperpagecomponents","hideContent","root","find","addClass","removeClass","showContent","emptyContent","empty","buildTemplateContext","calendarEvents","midnight","eventsByDay","templateContext","eventsbyday","forEach","calendarEvent","dayTimestamp","timeusermidnight","push","Object","keys","events","past","render","templateName","load","limit","daysOffset","daysLimit","lastId","courseId","endTime","args","starttime","aftereventid","endtime","courseid","queryByCourse","queryByTime","loadEventsFromPageData","pageData","actions","lastIds","preloadedPages","pageNumber","lastPageNumber","hasOwnProperty","eventsPromise","then","result","length","allItemsLoaded","filter","event","eventtype","getUserMidnightForTimestamp","timesort","loadedAll","pop","createPagedContent","pageLimit","firstLoad","paginationAriaLabel","additionalConfig","hasContent","config","extend","get_string","isArray","value","string","itemsperpage","paginationnav","createWithLimit","pagesData","promises","pagePromise","lastEventId","id","catch","exception","when","apply","resolve","init","Deferred","eventListContent","loadingPlaceholder","attr","parseInt","html","js","replaceNodeContents","rootSelector"],"mappings":"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","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 * Javascript to load and render the list of calendar events for a\n * given day range.\n *\n * @module block_timeline/event_list\n * @package block_timeline\n * @copyright 2016 Ryan Wyllie <ryan@moodle.com>\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(\n[\n 'jquery',\n 'core/notification',\n 'core/templates',\n 'core/paged_content_factory',\n 'core/str',\n 'core/user_date',\n 'block_timeline/calendar_events_repository'\n],\nfunction(\n $,\n Notification,\n Templates,\n PagedContentFactory,\n Str,\n UserDate,\n CalendarEventsRepository\n) {\n\n var SECONDS_IN_DAY = 60 * 60 * 24;\n\n var SELECTORS = {\n EMPTY_MESSAGE: '[data-region=\"empty-message\"]',\n ROOT: '[data-region=\"event-list-container\"]',\n EVENT_LIST_CONTENT: '[data-region=\"event-list-content\"]',\n EVENT_LIST_LOADING_PLACEHOLDER: '[data-region=\"event-list-loading-placeholder\"]',\n };\n\n var TEMPLATES = {\n EVENT_LIST_CONTENT: 'block_timeline/event-list-content'\n };\n\n // We want the paged content controls below the paged content area\n // and the controls should be ignored while data is loading.\n var DEFAULT_PAGED_CONTENT_CONFIG = {\n ignoreControlWhileLoading: true,\n controlPlacementBottom: true,\n ariaLabels: {\n itemsperpagecomponents: 'ariaeventlistpagelimit, block_timeline',\n }\n };\n\n /**\n * Hide the content area and display the empty content message.\n *\n * @param {object} root The container element\n */\n var hideContent = function(root) {\n root.find(SELECTORS.EVENT_LIST_CONTENT).addClass('hidden');\n root.find(SELECTORS.EMPTY_MESSAGE).removeClass('hidden');\n };\n\n /**\n * Show the content area and hide the empty content message.\n *\n * @param {object} root The container element\n */\n var showContent = function(root) {\n root.find(SELECTORS.EVENT_LIST_CONTENT).removeClass('hidden');\n root.find(SELECTORS.EMPTY_MESSAGE).addClass('hidden');\n };\n\n /**\n * Empty the content area.\n *\n * @param {object} root The container element\n */\n var emptyContent = function(root) {\n root.find(SELECTORS.EVENT_LIST_CONTENT).empty();\n };\n\n /**\n * Construct the template context from a list of calendar events. The events\n * are grouped by which day they are on. The day is calculated from the user's\n * midnight timestamp to ensure that the calculation is timezone agnostic.\n *\n * The return data structure will look like:\n * {\n * eventsbyday: [\n * {\n * dayTimestamp: 1533744000,\n * events: [\n * { ...event 1 data... },\n * { ...event 2 data... }\n * ]\n * },\n * {\n * dayTimestamp: 1533830400,\n * events: [\n * { ...event 3 data... },\n * { ...event 4 data... }\n * ]\n * }\n * ]\n * }\n *\n * Each day timestamp is the day's midnight in the user's timezone.\n *\n * @param {array} calendarEvents List of calendar events\n * @param {Number} midnight A timestamp representing midnight in the user's timezone\n * @return {object}\n */\n var buildTemplateContext = function(calendarEvents, midnight) {\n var eventsByDay = {};\n var templateContext = {\n eventsbyday: []\n };\n\n calendarEvents.forEach(function(calendarEvent) {\n var dayTimestamp = calendarEvent.timeusermidnight;\n if (eventsByDay[dayTimestamp]) {\n eventsByDay[dayTimestamp].push(calendarEvent);\n } else {\n eventsByDay[dayTimestamp] = [calendarEvent];\n }\n });\n\n Object.keys(eventsByDay).forEach(function(dayTimestamp) {\n var events = eventsByDay[dayTimestamp];\n templateContext.eventsbyday.push({\n past: dayTimestamp < midnight,\n dayTimestamp: dayTimestamp,\n events: events\n });\n });\n\n return templateContext;\n };\n\n /**\n * Render the HTML for the given calendar events.\n *\n * @param {array} calendarEvents A list of calendar events\n * @param {Number} midnight A timestamp representing midnight for the user\n * @return {promise} Resolved with HTML and JS strings.\n */\n var render = function(calendarEvents, midnight) {\n var templateContext = buildTemplateContext(calendarEvents, midnight);\n var templateName = TEMPLATES.EVENT_LIST_CONTENT;\n\n return Templates.render(templateName, templateContext);\n };\n\n /**\n * Retrieve a list of calendar events from the server for the given\n * constraints.\n *\n * @param {Number} midnight The user's midnight time in unix timestamp.\n * @param {Number} limit Limit the result set to this number of items\n * @param {Number} daysOffset How many days (from midnight) to offset the results from\n * @param {int|undefined} daysLimit How many dates (from midnight) to limit the result to\n * @param {int|falsey} lastId The ID of the last seen event (if any)\n * @param {int|undefined} courseId Course ID to restrict events to\n * @return {promise} A jquery promise\n */\n var load = function(midnight, limit, daysOffset, daysLimit, lastId, courseId) {\n var startTime = midnight + (daysOffset * SECONDS_IN_DAY);\n var endTime = daysLimit != undefined ? midnight + (daysLimit * SECONDS_IN_DAY) : false;\n\n var args = {\n starttime: startTime,\n limit: limit,\n };\n\n if (lastId) {\n args.aftereventid = lastId;\n }\n\n if (endTime) {\n args.endtime = endTime;\n }\n\n if (courseId) {\n // If we have a course id then we only want events from that course.\n args.courseid = courseId;\n return CalendarEventsRepository.queryByCourse(args);\n } else {\n // Otherwise we want events from any course.\n return CalendarEventsRepository.queryByTime(args);\n }\n };\n\n /**\n * Handle a single page request from the paged content. Uses the given page data to request\n * the events from the server.\n *\n * Checks the given preloadedPages before sending a request to the server to make sure we\n * don't load data unnecessarily.\n *\n * @param {object} pageData A single page data (see core/paged_content_pages for more info).\n * @param {object} actions Paged content actions (see core/paged_content_pages for more info).\n * @param {Number} midnight The user's midnight time in unix timestamp.\n * @param {object} lastIds The last event ID for each loaded page. Page number is key, id is value.\n * @param {object} preloadedPages An object of preloaded page data. Page number as key, data promise as value.\n * @param {int|undefined} courseId Course ID to restrict events to\n * @param {Number} daysOffset How many days (from midnight) to offset the results from\n * @param {int|undefined} daysLimit How many dates (from midnight) to limit the result to\n * @return {object} jQuery promise resolved with calendar events.\n */\n var loadEventsFromPageData = function(\n pageData,\n actions,\n midnight,\n lastIds,\n preloadedPages,\n courseId,\n daysOffset,\n daysLimit\n ) {\n var pageNumber = pageData.pageNumber;\n var limit = pageData.limit;\n var lastPageNumber = pageNumber;\n\n // This is here to protect us if, for some reason, the pages\n // are loaded out of order somehow and we don't have a reference\n // to the previous page. In that case, scan back to find the most\n // recent page we've seen.\n while (!lastIds.hasOwnProperty(lastPageNumber)) {\n lastPageNumber--;\n }\n // Use the last id of the most recent page.\n var lastId = lastIds[lastPageNumber];\n var eventsPromise = null;\n\n if (preloadedPages && preloadedPages.hasOwnProperty(pageNumber)) {\n // This page has been preloaded so use that rather than load the values\n // again.\n eventsPromise = preloadedPages[pageNumber];\n } else {\n // Load one more than the given limit so that we can tell if there\n // is more content to load after this.\n eventsPromise = load(midnight, limit + 1, daysOffset, daysLimit, lastId, courseId);\n }\n\n return eventsPromise.then(function(result) {\n if (!result.events.length) {\n // If we didn't get any events back then tell the paged content\n // that we're done loading.\n actions.allItemsLoaded(pageNumber);\n return [];\n }\n\n var calendarEvents = result.events.filter(function(event) {\n if (event.eventtype == \"open\" || event.eventtype == \"opensubmission\") {\n var dayTimestamp = UserDate.getUserMidnightForTimestamp(event.timesort, midnight);\n return dayTimestamp > midnight;\n }\n return true;\n });\n // We expect to receive limit + 1 events back from the server.\n // Any less means there are no more events to load.\n var loadedAll = calendarEvents.length <= limit;\n\n if (loadedAll) {\n // Tell the pagination that everything is loaded.\n actions.allItemsLoaded(pageNumber);\n } else {\n // Remove the last element from the array because it isn't\n // needed in this result set.\n calendarEvents.pop();\n }\n\n return calendarEvents;\n });\n };\n\n /**\n * Use the paged content factory to create a paged content element for showing\n * the event list. We only provide a page limit to the factory because we don't\n * know exactly how many pages we'll need. This creates a paging bar with just\n * next/previous buttons.\n *\n * This function specifies the callback for loading the event data that the user\n * is requesting.\n *\n * @param {int|array} pageLimit A single limit or list of limits as options for the paged content\n * @param {object} preloadedPages An object of preloaded page data. Page number as key, data promise as value.\n * @param {Number} midnight The user's midnight time in unix timestamp.\n * @param {object} firstLoad A jQuery promise to be resolved after the first set of data is loaded.\n * @param {int|undefined} courseId Course ID to restrict events to\n * @param {Number} daysOffset How many days (from midnight) to offset the results from\n * @param {int|undefined} daysLimit How many dates (from midnight) to limit the result to\n * @param {string} paginationAriaLabel String to set as the aria label for the pagination bar.\n * @param {object} additionalConfig Additional config options to pass to pagedContentFactory\n * @return {object} jQuery promise.\n */\n var createPagedContent = function(\n pageLimit,\n preloadedPages,\n midnight,\n firstLoad,\n courseId,\n daysOffset,\n daysLimit,\n paginationAriaLabel,\n additionalConfig\n ) {\n // Remember the last event id we loaded on each page because we can't\n // use the offset value since the backend can skip events if the user doesn't\n // have the capability to see them. Instead we load the next page of events\n // based on the last seen event id.\n var lastIds = {'1': 0};\n var hasContent = false;\n var config = $.extend({}, DEFAULT_PAGED_CONTENT_CONFIG, additionalConfig);\n\n return Str.get_string(\n 'ariaeventlistpagelimit',\n 'block_timeline',\n $.isArray(pageLimit) ? pageLimit[0].value : pageLimit\n )\n .then(function(string) {\n config.ariaLabels.itemsperpage = string;\n config.ariaLabels.paginationnav = paginationAriaLabel;\n return string;\n })\n .then(function() {\n return PagedContentFactory.createWithLimit(\n pageLimit,\n function(pagesData, actions) {\n var promises = [];\n\n pagesData.forEach(function(pageData) {\n var pageNumber = pageData.pageNumber;\n // Load the page data.\n var pagePromise = loadEventsFromPageData(\n pageData,\n actions,\n midnight,\n lastIds,\n preloadedPages,\n courseId,\n daysOffset,\n daysLimit\n ).then(function(calendarEvents) {\n if (calendarEvents.length) {\n // Remember that we've loaded content.\n hasContent = true;\n // Remember the last id we've seen.\n var lastEventId = calendarEvents[calendarEvents.length - 1].id;\n // Record the id that the next page will need to start from.\n lastIds[pageNumber + 1] = lastEventId;\n // Get the HTML and JS for these calendar events.\n return render(calendarEvents, midnight);\n } else {\n return calendarEvents;\n }\n })\n .catch(Notification.exception);\n\n promises.push(pagePromise);\n });\n\n $.when.apply($, promises).then(function() {\n // Tell the calling code that the first page has been loaded\n // and whether it contains any content.\n firstLoad.resolve(hasContent);\n return;\n })\n .catch(function() {\n firstLoad.resolve(hasContent);\n });\n\n return promises;\n },\n config\n );\n });\n };\n\n /**\n * Create a paged content region for the calendar events in the given root element.\n * The content of the root element are replaced with a new paged content section\n * each time this function is called.\n *\n * This function will be called each time the offset or limit values are changed to\n * reload the event list region.\n *\n * @param {object} root The event list container element\n * @param {int|array} pageLimit A single limit or list of limits as options for the paged content\n * @param {object} preloadedPages An object of preloaded page data. Page number as key, data promise as value.\n * @param {string} paginationAriaLabel String to set as the aria label for the pagination bar.\n * @param {object} additionalConfig Additional config options to pass to pagedContentFactory\n */\n var init = function(root, pageLimit, preloadedPages, paginationAriaLabel, additionalConfig) {\n root = $(root);\n\n // Create a promise that will be resolved once the first set of page\n // data has been loaded. This ensures that the loading placeholder isn't\n // hidden until we have all of the data back to prevent the page elements\n // jumping around.\n var firstLoad = $.Deferred();\n var eventListContent = root.find(SELECTORS.EVENT_LIST_CONTENT);\n var loadingPlaceholder = root.find(SELECTORS.EVENT_LIST_LOADING_PLACEHOLDER);\n var courseId = root.attr('data-course-id');\n var daysOffset = parseInt(root.attr('data-days-offset'), 10);\n var daysLimit = root.attr('data-days-limit');\n var midnight = parseInt(root.attr('data-midnight'), 10);\n\n // Make sure the content area and loading placeholder is visible.\n // This is because the init function can be called to re-initialise\n // an existing event list area.\n emptyContent(root);\n showContent(root);\n loadingPlaceholder.removeClass('hidden');\n\n // Days limit isn't mandatory.\n if (daysLimit != undefined) {\n daysLimit = parseInt(daysLimit, 10);\n }\n\n // Created the paged content element.\n return createPagedContent(pageLimit, preloadedPages, midnight, firstLoad, courseId, daysOffset, daysLimit,\n paginationAriaLabel, additionalConfig)\n .then(function(html, js) {\n html = $(html);\n // Hide the content for now.\n html.addClass('hidden');\n // Replace existing elements with the newly created paged content.\n // If we're reinitialising an existing event list this will replace\n // the old event list (including removing any event handlers).\n Templates.replaceNodeContents(eventListContent, html, js);\n\n firstLoad.then(function(hasContent) {\n // Prevent changing page elements too much by only showing the content\n // once we've loaded some data for the first time. This allows our\n // fancy loading placeholder to shine.\n html.removeClass('hidden');\n loadingPlaceholder.addClass('hidden');\n\n if (!hasContent) {\n // If we didn't get any data then show the empty data message.\n hideContent(root);\n }\n\n return hasContent;\n })\n .catch(function() {\n return false;\n });\n\n return html;\n })\n .catch(Notification.exception);\n };\n\n return {\n init: init,\n rootSelector: SELECTORS.ROOT,\n };\n});\n"],"file":"event_list.min.js"}