diff --git a/IPython/html/static/base/js/utils.js b/IPython/html/static/base/js/utils.js index 4e60a9687..41481190b 100644 --- a/IPython/html/static/base/js/utils.js +++ b/IPython/html/static/base/js/utils.js @@ -5,9 +5,10 @@ define([ 'base/js/namespace', 'jquery', 'codemirror/lib/codemirror', + 'moment', // silently upgrades CodeMirror 'codemirror/mode/meta', -], function(IPython, $, CodeMirror){ +], function(IPython, $, CodeMirror, moment){ "use strict"; IPython.load_extensions = function () { @@ -824,7 +825,42 @@ define([ return MathJax.Hub.Queue(["Typeset", MathJax.Hub, this]); }); }; - + + var time = {}; + time.milliseconds = {}; + time.milliseconds.s = 1000; + time.milliseconds.m = 60 * time.milliseconds.s; + time.milliseconds.h = 60 * time.milliseconds.m; + time.milliseconds.d = 24 * time.milliseconds.h; + + time.thresholds = { + // moment.js thresholds in milliseconds + s: moment.relativeTimeThreshold('s') * time.milliseconds.s, + m: moment.relativeTimeThreshold('m') * time.milliseconds.m, + h: moment.relativeTimeThreshold('h') * time.milliseconds.h, + d: moment.relativeTimeThreshold('d') * time.milliseconds.d, + }; + + time.timeout_from_dt = function (dt) { + /** compute a timeout based on dt + + input and output both in milliseconds + + use moment's relative time thresholds: + + - 10 seconds if in 'seconds ago' territory + - 1 minute if in 'minutes ago' + - 1 hour otherwise + */ + if (dt < time.thresholds.s) { + return 10 * time.milliseconds.s; + } else if (dt < time.thresholds.m) { + return time.milliseconds.m; + } else { + return time.milliseconds.h; + } + }; + var utils = { regex_split : regex_split, uuid : uuid, @@ -860,6 +896,7 @@ define([ resolve_promises_dict: resolve_promises_dict, reject: reject, typeset: typeset, + time: time, }; // Backwards compatability. diff --git a/IPython/html/static/edit/js/savewidget.js b/IPython/html/static/edit/js/savewidget.js index 56887809d..c71cafdeb 100644 --- a/IPython/html/static/edit/js/savewidget.js +++ b/IPython/html/static/edit/js/savewidget.js @@ -141,47 +141,22 @@ define([ var long_date = chkd.format('llll'); var human_date; var tdelta = Math.ceil(new Date() - this._last_modified); - if (tdelta < 24 * H){ + if (tdelta < utils.time.milliseconds.d){ // less than 24 hours old, use relative date human_date = chkd.fromNow(); } else { - // otherwise show calendar - // otherwise update every hour and show + // otherwise show calendar // at hh,mm,ss human_date = chkd.calendar(); } el.text(human_date).attr('title', long_date); }; - - - var S = 1000; - var M = 60*S; - var H = 60*M; - var thresholds = { - s: 45 * S, - m: 45 * M, - h: 22 * H - }; - var _timeout_from_dt = function (ms) { - /** compute a timeout to update the last-modified timeout - - based on the delta in milliseconds - */ - if (ms < thresholds.s) { - return 5 * S; - } else if (ms < thresholds.m) { - return M; - } else { - return 5 * M; - } - }; SaveWidget.prototype._schedule_render_last_modified = function () { /** schedule the next update to relative date periodically updated, so short values like 'a few seconds ago' don't get stale. */ - var that = this; if (!this._last_modified) { return; } @@ -189,12 +164,10 @@ define([ clearTimeout(this._last_modified_timeout); } var dt = Math.ceil(new Date() - this._last_modified); - if (dt < 24 * H) { - this._last_modified_timeout = setTimeout( - $.proxy(this._render_last_modified, this), - _timeout_from_dt(dt) - ); - } + this._last_modified_timeout = setTimeout( + $.proxy(this._render_last_modified, this), + utils.time.timeout_from_dt(dt) + ); }; return {'SaveWidget': SaveWidget};