From b0ed74575f5c31faa14104dfd59160c9fdec8dd6 Mon Sep 17 00:00:00 2001 From: the-djmaze <> Date: Fri, 23 Dec 2022 12:22:57 +0100 Subject: [PATCH] Cleanup locate time handling --- dev/Common/Translator.js | 65 +++++++++++++------ dev/Settings/Admin/General.js | 2 +- dev/Settings/User/General.js | 2 +- dev/View/Popup/Compose.js | 2 +- dev/View/User/Login.js | 2 +- dev/View/User/MailBox/MessageList.js | 9 +-- dev/prototype.js | 39 +---------- .../templates/Views/User/MailMessageList.html | 4 +- .../templates/Views/User/MailMessageView.html | 4 +- 9 files changed, 58 insertions(+), 71 deletions(-) diff --git a/dev/Common/Translator.js b/dev/Common/Translator.js index 411ed23e9..46d3a3dc7 100644 --- a/dev/Common/Translator.js +++ b/dev/Common/Translator.js @@ -12,7 +12,6 @@ const init = () => { if (rl.I18N) { I18N_DATA = rl.I18N; - Date.defineRelativeTimeFormat(rl.relativeTime || {}); rl.I18N = null; return 1; } @@ -23,6 +22,31 @@ const getNotificationMessage = code => { let key = getKeyByValue(Notification, code); return key ? I18N_DATA.NOTIFICATIONS[i18nKey(key).replace('_NOTIFICATION', '_ERROR')] : ''; + }, + + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/RelativeTimeFormat + // see /snappymail/v/0.0.0/app/localization/relativetimeformat/ + fromNow = date => { + let unit = 'second', + value = Math.round((date.getTime() - Date.now()) / 1000), + t = [[60,'minute'],[3600,'hour'],[86400,'day'],[2628000,'month'],[31536000,'year']], + i = 5, + abs = Math.abs(value); + while (i--) { + if (t[i][0] <= abs) { + value = Math.round(value / t[i][0]); + unit = t[i][1]; + break; + } + } + if (Intl.RelativeTimeFormat) { + let rtf = new Intl.RelativeTimeFormat(doc.documentElement.lang); + return rtf.format(value, unit); + } + abs = Math.abs(value); + let rtf = rl.relativeTime.long[unit][0 > value ? 'past' : 'future'], + plural = rl.relativeTime.plural(abs); + return (rtf[plural] || rtf).replace('{0}', abs); }; export const @@ -81,19 +105,21 @@ export const const m = new Date(time), h = LanguageStore.hourCycle(); switch (formatStr) { case 'FROMNOW': - return m.fromNow(); + return fromNow(m); case 'SHORT': { - if (4 >= (now - time) / 3600000) - return m.fromNow(); - const mt = m.getTime(), date = new Date, + // 4 hours + if (14400000 >= now - time) + return fromNow(m); + const date = new Date, dt = date.setHours(0,0,0,0); - if (mt > dt) - return i18n('MESSAGE_LIST/TODAY_AT', {TIME: m.format('LT',0,h)}); - if (mt > dt - 86400000) - return i18n('MESSAGE_LIST/YESTERDAY_AT', {TIME: m.format('LT',0,h)}); - if (date.getFullYear() === m.getFullYear()) - return m.format('d M'); - return m.format('LL',0,h); + return (time > dt - 86400000) + ? i18n( + time > dt ? 'MESSAGE_LIST/TODAY_AT' : 'MESSAGE_LIST/YESTERDAY_AT', + {TIME: m.format('LT',0,h)} + ) + : m.format( + date.getFullYear() === m.getFullYear() ? {day: '2-digit', month: 'short'} : {dateStyle: 'medium'} + , 0, h); } case 'FULL': return m.format('LLL',0,h); @@ -116,10 +142,9 @@ export const let key = element.dataset.momentFormat; if (key) { element.textContent = timestampToString(time, key); - } - - if ((key = element.dataset.momentFormatTitle)) { - element.title = timestampToString(time, key); + if ('FULL' !== key && 'FROMNOW' !== key) { + element.title = timestampToString(time, 'FULL'); + } } } catch (e) { // prevent knockout crashes @@ -127,9 +152,7 @@ export const } }, - reloadTime = () => setTimeout(() => - doc.querySelectorAll('time').forEach(element => timeToNode(element)) - , 1), + reloadTime = () => doc.querySelectorAll('time').forEach(element => timeToNode(element)), /** * @param {Function} startCallback @@ -171,15 +194,15 @@ export const * @param {boolean} admin * @param {string} language */ - translatorReload = (admin, language) => + translatorReload = (language, admin) => new Promise((resolve, reject) => { const script = createElement('script'); script.onload = () => { // reload the data if (init()) { i18nToNodes(doc); - admin || reloadTime(); translateTrigger(!translateTrigger()); +// admin || reloadTime(); } script.remove(); resolve(); diff --git a/dev/Settings/Admin/General.js b/dev/Settings/Admin/General.js index e9476ad6e..f94d7cc41 100644 --- a/dev/Settings/Admin/General.js +++ b/dev/Settings/Admin/General.js @@ -91,7 +91,7 @@ export class AdminSettingsGeneral extends AbstractViewSettings { addSubscribablesTo(this, { languageAdmin: value => { this.languageAdminTrigger(SaveSettingStatus.Saving); - translatorReload(true, value) + translatorReload(value, 1) .then(fReloadLanguageHelper(SaveSettingStatus.Success), fReloadLanguageHelper(SaveSettingStatus.Failed)) .then(() => Remote.saveSetting('LanguageAdmin', value)); }, diff --git a/dev/Settings/User/General.js b/dev/Settings/User/General.js index 058ad0dff..564db3c94 100644 --- a/dev/Settings/User/General.js +++ b/dev/Settings/User/General.js @@ -111,7 +111,7 @@ export class UserSettingsGeneral extends AbstractViewSettings { addSubscribablesTo(this, { language: value => { this.languageTrigger(SaveSettingStatus.Saving); - translatorReload(false, value) + translatorReload(value) .then(fReloadLanguageHelper(SaveSettingStatus.Success), fReloadLanguageHelper(SaveSettingStatus.Failed)) .then(() => Remote.saveSetting('Language', value)); }, diff --git a/dev/View/Popup/Compose.js b/dev/View/Popup/Compose.js index 283a8c9e0..be9abfd20 100644 --- a/dev/View/Popup/Compose.js +++ b/dev/View/Popup/Compose.js @@ -696,7 +696,7 @@ export class ComposePopupView extends AbstractViewPopup { .replace(/\r/g, '') .replace(/\s{1,2}?{{FROM}}/g, '') .replace(/\s{1,2}?{{FROM-FULL}}/g, '') - .replace(/{{DATE}}/g, new Date().format('LLLL')) + .replace(/{{DATE}}/g, new Date().format({dateStyle: 'full', timeStyle: 'short'})) .replace(/{{TIME}}/g, new Date().format('LT')) .replace(/{{MOMENT:[^}]+}}/g, ''); signature.length && editor.setSignature(signature, isHtml, !!identity.signatureInsertBefore()); diff --git a/dev/View/User/Login.js b/dev/View/User/Login.js index 7bf1564c4..017a98534 100644 --- a/dev/View/User/Login.js +++ b/dev/View/User/Login.js @@ -69,7 +69,7 @@ export class LoginUserView extends AbstractViewLogin { language: value => { this.langRequest(true); - translatorReload(false, value).then( + translatorReload(value).then( () => { this.langRequest(false); this.bSendLanguage = true; diff --git a/dev/View/User/MailBox/MessageList.js b/dev/View/User/MailBox/MessageList.js index c099cb095..8bcd16d87 100644 --- a/dev/View/User/MailBox/MessageList.js +++ b/dev/View/User/MailBox/MessageList.js @@ -149,17 +149,18 @@ export class MailMessageList extends AbstractViewRight { listByDay: () => { let list = [], current, today = Ymd(new Date()), - rtf = new Intl.RelativeTimeFormat(doc.documentElement.lang, { numeric: "auto" }); + rtf = Intl.RelativeTimeFormat + ? new Intl.RelativeTimeFormat(doc.documentElement.lang, { numeric: "auto" }) : 0; MessagelistUserStore.forEach(msg => { let date = (new Date(msg.dateTimeStampInUTC() * 1000)), ymd = Ymd(date); if (!current || ymd != current.ymd) { - if (today == ymd) { + if (rtf && today == ymd) { date = rtf.format(0, 'day'); - } else if (today - 1 == ymd) { + } else if (rtf && today - 1 == ymd) { date = rtf.format(-1, 'day'); // } else if (today - 7 < ymd) { -// date = date.format('l'); +// date = date.format({weekday: 'long'}); // date = date.format({dateStyle: 'full'},0,LanguageStore.hourCycle()); } else { // date = date.format({dateStyle: 'medium'},0,LanguageStore.hourCycle()); diff --git a/dev/prototype.js b/dev/prototype.js index ed977b05f..a0a9008a4 100644 --- a/dev/prototype.js +++ b/dev/prototype.js @@ -5,23 +5,13 @@ return this.filter((v, i, a) => (fn ? fn(v) : v) && a.indexOf(v) === i); }; - Date.defineRelativeTimeFormat = config => relativeTime = config; - // full = Monday, December 12, 2022 at 12:16:21 PM Central European Standard Time // long = December 12, 2022 at 12:16:21 PM GMT+1 // medium = Dec 12, 2022, 12:16:21 PM // short = 12/12/22, 12:16 PM let formats = { LT : {timeStyle: 'short'}, -// LT : {hour: 'numeric', minute: 'numeric'}, - L : {}, - LL : {dateStyle: 'medium'}, -// LL : {year: 'numeric', month: 'short', day: 'numeric'}, - LLL : {dateStyle: 'long', timeStyle: 'short'}, -// LLL : {year: 'numeric', month: 'long', day: 'numeric', hour: 'numeric', minute: 'numeric'}, - LLLL : {dateStyle: 'full', timeStyle: 'short'}, -// LLLL : {weekday: 'long', year: 'numeric', month: 'long', day: 'numeric', hour: 'numeric', minute: 'numeric'}, - 'd M': {day: '2-digit', month: 'short'} + LLL : {dateStyle: 'long', timeStyle: 'short'} }, phpFormats = { // Day @@ -50,9 +40,6 @@ v: {fractionalSecondDigits: 3}, Z: {timeZone: 'UTC'} }, - relativeTime = { - // see /snappymail/v/0.0.0/app/localization/relativetimeformat/ - }, pad2 = v => 10 > v ? '0' + v : v; // Format momentjs/PHP date formats to Intl.DateTimeFormat @@ -82,30 +69,6 @@ return new Intl.DateTimeFormat(doc.documentElement.lang, options).format(this); }; - // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/RelativeTimeFormat - Date.prototype.fromNow = function() { - let unit = 'second', - value = Math.round((this.getTime() - Date.now()) / 1000), - t = [[60,'minute'],[3600,'hour'],[86400,'day'],[2628000,'month'],[31536000,'year']], - i = 5, - abs = Math.abs(value); - while (i--) { - if (t[i][0] <= abs) { - value = Math.round(value / t[i][0]); - unit = t[i][1]; - break; - } - } - if (Intl.RelativeTimeFormat) { - let rtf = new Intl.RelativeTimeFormat(doc.documentElement.lang); - return rtf.format(value, unit); - } - abs = Math.abs(value); - let rtf = relativeTime.long[unit][0 > value ? 'past' : 'future'], - plural = relativeTime.plural(abs); - return (rtf[plural] || rtf).replace('{0}', abs); - }; - Element.prototype.closestWithin = function(selector, parent) { const el = this.closest(selector); return (el && el !== parent && parent.contains(el)) ? el : null; diff --git a/snappymail/v/0.0.0/app/templates/Views/User/MailMessageList.html b/snappymail/v/0.0.0/app/templates/Views/User/MailMessageList.html index 3302dcfc3..649c57c34 100644 --- a/snappymail/v/0.0.0/app/templates/Views/User/MailMessageList.html +++ b/snappymail/v/0.0.0/app/templates/Views/User/MailMessageList.html @@ -145,7 +145,7 @@
- + @@ -165,7 +165,7 @@
- + diff --git a/snappymail/v/0.0.0/app/templates/Views/User/MailMessageView.html b/snappymail/v/0.0.0/app/templates/Views/User/MailMessageView.html index 24349cf33..23be3e29c 100644 --- a/snappymail/v/0.0.0/app/templates/Views/User/MailMessageView.html +++ b/snappymail/v/0.0.0/app/templates/Views/User/MailMessageView.html @@ -162,9 +162,9 @@ - +   - () + ()