__ __ __ __ _____ _ _ _____ _ _ _ | \/ | \ \ / / | __ \ (_) | | / ____| | | | | | \ / |_ __\ V / | |__) | __ ___ ____ _| |_ ___ | (___ | |__ ___| | | | |\/| | '__|> < | ___/ '__| \ \ / / _` | __/ _ \ \___ \| '_ \ / _ \ | | | | | | |_ / . \ | | | | | |\ V / (_| | || __/ ____) | | | | __/ | | |_| |_|_(_)_/ \_\ |_| |_| |_| \_/ \__,_|\__\___| |_____/|_| |_|\___V 2.1 if you need WebShell for Seo everyday contact me on Telegram Telegram Address : @jackleetFor_More_Tools:
// 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/>.
/**
* Fetch and render dates from timestamps.
*
* @module core/user_date
* @copyright 2017 Ryan Wyllie <ryan@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
define(['jquery', 'core/ajax', 'core/sessionstorage', 'core/config'],
function($, Ajax, Storage, Config) {
var SECONDS_IN_DAY = 86400;
/** @var {object} promisesCache Store all promises we've seen so far. */
var promisesCache = {};
/**
* Generate a cache key for the given request. The request should
* have a timestamp and format key.
*
* @param {object} request
* @return {string}
*/
var getKey = function(request) {
return 'core_user_date/' +
Config.language + '/' +
Config.usertimezone + '/' +
request.timestamp + '/' +
request.format;
};
/**
* Retrieve a transformed date from the browser's storage.
*
* @param {string} key
* @return {string}
*/
var getFromLocalStorage = function(key) {
return Storage.get(key);
};
/**
* Save the transformed date in the browser's storage.
*
* @param {string} key
* @param {string} value
*/
var addToLocalStorage = function(key, value) {
Storage.set(key, value);
};
/**
* Check if a key is in the module's cache.
*
* @param {string} key
* @return {bool}
*/
var inPromisesCache = function(key) {
return (typeof promisesCache[key] !== 'undefined');
};
/**
* Retrieve a promise from the module's cache.
*
* @param {string} key
* @return {object} jQuery promise
*/
var getFromPromisesCache = function(key) {
return promisesCache[key];
};
/**
* Save the given promise in the module's cache.
*
* @param {string} key
* @param {object} promise
*/
var addToPromisesCache = function(key, promise) {
promisesCache[key] = promise;
};
/**
* Send a request to the server for each of the required timestamp
* and format combinations.
*
* Resolves the date's deferred with the values returned from the
* server and saves the value in local storage.
*
* @param {array} dates
* @return {object} jQuery promise
*/
var loadDatesFromServer = function(dates) {
var args = dates.map(function(data) {
var fixDay = data.hasOwnProperty('fixday') ? data.fixday : 1;
var fixHour = data.hasOwnProperty('fixhour') ? data.fixhour : 1;
return {
timestamp: data.timestamp,
format: data.format,
type: data.type || null,
fixday: fixDay,
fixhour: fixHour
};
});
var request = {
methodname: 'core_get_user_dates',
args: {
contextid: Config.contextid,
timestamps: args
}
};
return Ajax.call([request], true, true)[0].then(function(results) {
results.dates.forEach(function(value, index) {
var date = dates[index];
var key = getKey(date);
addToLocalStorage(key, value);
date.deferred.resolve(value);
});
return;
})
.catch(function(ex) {
// If we failed to retrieve the dates then reject the date's
// deferred objects to make sure they don't hang.
dates.forEach(function(date) {
date.deferred.reject(ex);
});
});
};
/**
* Takes an array of request objects and returns a promise that
* is resolved with an array of formatted dates.
*
* The values in the returned array will be ordered the same as
* the request array.
*
* This function will check both the module's static promises cache
* and the browser's session storage to see if the user dates have
* already been loaded in order to avoid sending a network request
* if possible.
*
* Only dates not found in either cache will be sent to the server
* for transforming.
*
* A request object must have a timestamp key and a format key and
* optionally may have a type key.
*
* E.g.
* var request = [
* {
* timestamp: 1293876000,
* format: '%d %B %Y'
* },
* {
* timestamp: 1293876000,
* format: '%A, %d %B %Y, %I:%M %p',
* type: 'gregorian',
* fixday: false,
* fixhour: false
* }
* ];
*
* UserDate.get(request).done(function(dates) {
* console.log(dates[0]); // prints "1 January 2011".
* console.log(dates[1]); // prints "Saturday, 1 January 2011, 10:00 AM".
* });
*
* @param {array} requests
* @return {object} jQuery promise
*/
var get = function(requests) {
var ajaxRequests = [];
var promises = [];
// Loop over each of the requested timestamp/format combos
// and add a promise to the promises array for them.
requests.forEach(function(request) {
var key = getKey(request);
// If we've already got a promise then use it.
if (inPromisesCache(key)) {
promises.push(getFromPromisesCache(key));
} else {
var deferred = $.Deferred();
var cached = getFromLocalStorage(key);
if (cached) {
// If we were able to get the value from session storage
// then we can resolve the deferred with that value. No
// need to ask the server to transform it for us.
deferred.resolve(cached);
} else {
// Add this request to the list of ones we need to load
// from the server. Include the deferred so that it can
// be resolved when the server has responded with the
// transformed values.
request.deferred = deferred;
ajaxRequests.push(request);
}
// Remember this promise for next time so that we can
// bail out early if it is requested again.
addToPromisesCache(key, deferred.promise());
promises.push(deferred.promise());
}
});
// If we have any requests that we couldn't resolve from the caches
// then let's ask the server to get them for us.
if (ajaxRequests.length) {
loadDatesFromServer(ajaxRequests);
}
// Wait for all of the promises to resolve. Some of them may be waiting
// for a response from the server.
return $.when.apply($, promises).then(function() {
// This looks complicated but it's just converting an unknown
// length of arguments into an array for the promise to resolve
// with.
return arguments.length === 1 ? [arguments[0]] : Array.apply(null, arguments);
});
};
/**
* For a given timestamp get the midnight value in the user's timezone.
*
* The calculation is performed relative to the user's midnight timestamp
* for today to ensure that timezones are preserved.
*
* E.g.
* Input:
* timestamp: 1514836800 (01/01/2018 8pm GMT)(02/01/2018 4am GMT+8)
* midnight: 1514851200 (02/01/2018 midnight GMT)
* Output:
* 1514764800 (01/01/2018 midnight GMT)
*
* Input:
* timestamp: 1514836800 (01/01/2018 8pm GMT)(02/01/2018 4am GMT+8)
* midnight: 1514822400 (02/01/2018 midnight GMT+8)
* Output:
* 1514822400 (02/01/2018 midnight GMT+8)
*
* @param {Number} timestamp The timestamp to calculate from
* @param {Number} todayMidnight The user's midnight timestamp
* @return {Number} The midnight value of the user's timestamp
*/
var getUserMidnightForTimestamp = function(timestamp, todayMidnight) {
var future = timestamp > todayMidnight;
var diffSeconds = Math.abs(timestamp - todayMidnight);
var diffDays = future ? Math.floor(diffSeconds / SECONDS_IN_DAY) : Math.ceil(diffSeconds / SECONDS_IN_DAY);
var diffDaysInSeconds = diffDays * SECONDS_IN_DAY;
// Is the timestamp in the future or past?
var dayTimestamp = future ? todayMidnight + diffDaysInSeconds : todayMidnight - diffDaysInSeconds;
return dayTimestamp;
};
return {
get: get,
getUserMidnightForTimestamp: getUserMidnightForTimestamp
};
});
| Name | Type | Size | Permission | Actions |
|---|---|---|---|---|
| bulkactions | Folder | 0777 |
|
|
| check | Folder | 0777 |
|
|
| comboboxsearch | Folder | 0777 |
|
|
| datafilter | Folder | 0777 |
|
|
| emoji | Folder | 0777 |
|
|
| local | Folder | 0777 |
|
|
| moodlenet | Folder | 0777 |
|
|
| adapter.js | File | 123.08 KB | 0777 |
|
| addblockmodal.js | File | 4.34 KB | 0777 |
|
| ajax.js | File | 11.97 KB | 0777 |
|
| aria.js | File | 1011 B | 0777 |
|
| auto_rows.js | File | 3.46 KB | 0777 |
|
| autoscroll.js | File | 6.49 KB | 0777 |
|
| backoff_timer.js | File | 4.98 KB | 0777 |
|
| chart_axis.js | File | 7.39 KB | 0777 |
|
| chart_bar.js | File | 3.08 KB | 0777 |
|
| chart_base.js | File | 11.36 KB | 0777 |
|
| chart_builder.js | File | 1.65 KB | 0777 |
|
| chart_line.js | File | 2.08 KB | 0777 |
|
| chart_output.js | File | 1.08 KB | 0777 |
|
| chart_output_base.js | File | 2.03 KB | 0777 |
|
| chart_output_chartjs.js | File | 11.5 KB | 0777 |
|
| chart_output_htmltable.js | File | 3.3 KB | 0777 |
|
| chart_pie.js | File | 3.03 KB | 0777 |
|
| chart_series.js | File | 8.35 KB | 0777 |
|
| chartjs-lazy.js | File | 497.88 KB | 0777 |
|
| chartjs.js | File | 913 B | 0777 |
|
| checkbox-toggleall.js | File | 12.78 KB | 0777 |
|
| config.js | File | 978 B | 0777 |
|
| copy_to_clipboard.js | File | 7.38 KB | 0777 |
|
| custom_interaction_events.js | File | 22.18 KB | 0777 |
|
| datafilter.js | File | 17.92 KB | 0777 |
|
| dragdrop.js | File | 12.92 KB | 0777 |
|
| drawer.js | File | 3.49 KB | 0777 |
|
| drawer_events.js | File | 967 B | 0777 |
|
| dropzone.js | File | 5.71 KB | 0777 |
|
| dynamic_tabs.js | File | 6.67 KB | 0777 |
|
| edit_switch.js | File | 3.45 KB | 0777 |
|
| event.js | File | 2.53 KB | 0777 |
|
| event_dispatcher.js | File | 2.79 KB | 0777 |
|
| fetch.js | File | 9.4 KB | 0777 |
|
| first.js | File | 1.33 KB | 0777 |
|
| form-autocomplete.js | File | 53.74 KB | 0777 |
|
| form-cohort-selector.js | File | 2.5 KB | 0777 |
|
| form-course-selector.js | File | 3.77 KB | 0777 |
|
| fragment.js | File | 5.03 KB | 0777 |
|
| fullscreen.js | File | 1.62 KB | 0777 |
|
| icon_system.js | File | 3.39 KB | 0777 |
|
| icon_system_fontawesome.js | File | 5.35 KB | 0777 |
|
| icon_system_standard.js | File | 1.96 KB | 0777 |
|
| inplace_editable.js | File | 16.82 KB | 0777 |
|
| key_codes.js | File | 1.34 KB | 0777 |
|
| loadingicon.js | File | 3.88 KB | 0777 |
|
| localstorage.js | File | 2.24 KB | 0777 |
|
| log.js | File | 1.74 KB | 0777 |
|
| loglevel.js | File | 12.38 KB | 0777 |
|
| menu_navigation.js | File | 9.2 KB | 0777 |
|
| modal.js | File | 36.33 KB | 0777 |
|
| modal_backdrop.js | File | 4.17 KB | 0777 |
|
| modal_cancel.js | File | 1.6 KB | 0777 |
|
| modal_copy_to_clipboard.js | File | 3.75 KB | 0777 |
|
| modal_delete_cancel.js | File | 2.36 KB | 0777 |
|
| modal_events.js | File | 1.28 KB | 0777 |
|
| modal_factory.js | File | 5.91 KB | 0777 |
|
| modal_registry.js | File | 2.26 KB | 0777 |
|
| modal_save_cancel.js | File | 2.34 KB | 0777 |
|
| moremenu.js | File | 10.3 KB | 0777 |
|
| mustache.js | File | 28.75 KB | 0777 |
|
| network.js | File | 9.66 KB | 0777 |
|
| normalise.js | File | 2.43 KB | 0777 |
|
| notification.js | File | 11.57 KB | 0777 |
|
| page_global.js | File | 5.38 KB | 0777 |
|
| paged_content.js | File | 2.87 KB | 0777 |
|
| paged_content_events.js | File | 1.17 KB | 0777 |
|
| paged_content_factory.js | File | 20.61 KB | 0777 |
|
| paged_content_pages.js | File | 11.75 KB | 0777 |
|
| paged_content_paging_bar.js | File | 20.36 KB | 0777 |
|
| paged_content_paging_bar_limit_selector.js | File | 2.36 KB | 0777 |
|
| paged_content_paging_dropdown.js | File | 7.36 KB | 0777 |
|
| pagehelpers.js | File | 5.38 KB | 0777 |
|
| pending.js | File | 4.46 KB | 0777 |
|
| permissionmanager.js | File | 9.77 KB | 0777 |
|
| popover_region_controller.js | File | 13.16 KB | 0777 |
|
| popper.js | File | 79.2 KB | 0777 |
|
| popper2.js | File | 61.59 KB | 0777 |
|
| prefetch.js | File | 5.82 KB | 0777 |
|
| process_monitor.js | File | 3.55 KB | 0777 |
|
| pubsub.js | File | 2.17 KB | 0777 |
|
| reactive.js | File | 1.38 KB | 0777 |
|
| scroll_manager.js | File | 5.5 KB | 0777 |
|
| sessionstorage.js | File | 2.22 KB | 0777 |
|
| showhidesettings.js | File | 11.82 KB | 0777 |
|
| showmore.js | File | 1.83 KB | 0777 |
|
| sortable_list.js | File | 29.62 KB | 0777 |
|
| sticky-footer.js | File | 3.16 KB | 0777 |
|
| storage_validation.js | File | 1.36 KB | 0777 |
|
| storagewrapper.js | File | 5.36 KB | 0777 |
|
| stored_progress.js | File | 3.15 KB | 0777 |
|
| str.js | File | 10.01 KB | 0777 |
|
| tag.js | File | 15.02 KB | 0777 |
|
| templates.js | File | 10.83 KB | 0777 |
|
| toast.js | File | 4.26 KB | 0777 |
|
| togglesensitive.js | File | 5.15 KB | 0777 |
|
| tooltip.js | File | 4.09 KB | 0777 |
|
| tree.js | File | 18.39 KB | 0777 |
|
| truncate.js | File | 6.56 KB | 0777 |
|
| url.js | File | 3.65 KB | 0777 |
|
| user_date.js | File | 9.27 KB | 0777 |
|
| userfeedback.js | File | 2.91 KB | 0777 |
|
| usermenu.js | File | 5.13 KB | 0777 |
|
| utility.js | File | 7.5 KB | 0777 |
|
| utils.js | File | 4.83 KB | 0777 |
|
| yui.js | File | 1.13 KB | 0777 |
|