1
0
mirror of https://github.com/laurent22/joplin.git synced 2024-12-21 09:38:01 +02:00

Desktop: Use relative time in note list for today and yesterday

This commit is contained in:
Laurent Cozic 2024-06-20 14:01:13 +01:00
parent 9eb4944614
commit 1437dd5f27
7 changed files with 134 additions and 4 deletions

View File

@ -130,6 +130,7 @@ import initializeCommandService from './utils/initializeCommandService';
import PlatformImplementation from './plugins/PlatformImplementation'; import PlatformImplementation from './plugins/PlatformImplementation';
import ShareManager from './components/screens/ShareManager'; import ShareManager from './components/screens/ShareManager';
import appDefaultState, { DEFAULT_ROUTE } from './utils/appDefaultState'; import appDefaultState, { DEFAULT_ROUTE } from './utils/appDefaultState';
import { setDateFormat, setTimeFormat, setTimeLocale } from '@joplin/utils/time';
type SideMenuPosition = 'left' | 'right'; type SideMenuPosition = 'left' | 'right';
@ -186,10 +187,13 @@ const generalMiddleware = (store: any) => (next: any) => async (action: any) =>
if ((action.type === 'SETTING_UPDATE_ONE' && (action.key === 'dateFormat' || action.key === 'timeFormat')) || (action.type === 'SETTING_UPDATE_ALL')) { if ((action.type === 'SETTING_UPDATE_ONE' && (action.key === 'dateFormat' || action.key === 'timeFormat')) || (action.type === 'SETTING_UPDATE_ALL')) {
time.setDateFormat(Setting.value('dateFormat')); time.setDateFormat(Setting.value('dateFormat'));
time.setTimeFormat(Setting.value('timeFormat')); time.setTimeFormat(Setting.value('timeFormat'));
setDateFormat(Setting.value('dateFormat'));
setTimeFormat(Setting.value('timeFormat'));
} }
if (action.type === 'SETTING_UPDATE_ONE' && action.key === 'locale' || action.type === 'SETTING_UPDATE_ALL') { if (action.type === 'SETTING_UPDATE_ONE' && action.key === 'locale' || action.type === 'SETTING_UPDATE_ALL') {
setLocale(Setting.value('locale')); setLocale(Setting.value('locale'));
setTimeLocale(Setting.value('locale'));
} }
if ((action.type === 'SETTING_UPDATE_ONE' && (action.key.indexOf('encryption.') === 0)) || (action.type === 'SETTING_UPDATE_ALL')) { if ((action.type === 'SETTING_UPDATE_ONE' && (action.key.indexOf('encryption.') === 0)) || (action.type === 'SETTING_UPDATE_ALL')) {

View File

@ -21,6 +21,7 @@ import BaseItem from './models/BaseItem';
import Note from './models/Note'; import Note from './models/Note';
import Tag from './models/Tag'; import Tag from './models/Tag';
import { splitCommandString } from '@joplin/utils'; import { splitCommandString } from '@joplin/utils';
import { setDateFormat, setTimeFormat, setTimeLocale } from '@joplin/utils/time';
import { reg } from './registry'; import { reg } from './registry';
import time from './time'; import time from './time';
import BaseSyncTarget from './BaseSyncTarget'; import BaseSyncTarget from './BaseSyncTarget';
@ -357,6 +358,9 @@ export default class BaseApplication {
const sideEffects: any = { const sideEffects: any = {
'dateFormat': async () => { 'dateFormat': async () => {
time.setLocale(Setting.value('locale')); time.setLocale(Setting.value('locale'));
setTimeLocale(Setting.value('locale'));
setDateFormat(Setting.value('dateFormat'));
setTimeFormat(Setting.value('timeFormat'));
time.setDateFormat(Setting.value('dateFormat')); time.setDateFormat(Setting.value('dateFormat'));
time.setTimeFormat(Setting.value('timeFormat')); time.setTimeFormat(Setting.value('timeFormat'));
}, },

View File

@ -1,5 +1,6 @@
import Logger from '@joplin/utils/Logger'; import Logger from '@joplin/utils/Logger';
import time from '../../time'; import time from '../../time';
import { formatMsToRelative } from '@joplin/utils/time';
import { TagEntity } from '../database/types'; import { TagEntity } from '../database/types';
import { ListRendererDependency, RenderNoteView } from '../plugins/api/noteListType'; import { ListRendererDependency, RenderNoteView } from '../plugins/api/noteListType';
@ -15,10 +16,10 @@ export interface RenderViewPropsOptions {
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied // eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
const renderViewProp = (name: ListRendererDependency, value: any, options: RenderViewPropsOptions): string => { const renderViewProp = (name: ListRendererDependency, value: any, options: RenderViewPropsOptions): string => {
const renderers: Partial<Record<ListRendererDependency, ()=> string>> = { const renderers: Partial<Record<ListRendererDependency, ()=> string>> = {
'note.user_updated_time': () => time.formatMsToLocal(value), 'note.user_updated_time': () => formatMsToRelative(value),
'note.user_created_time': () => time.formatMsToLocal(value), 'note.user_created_time': () => formatMsToRelative(value),
'note.updated_time': () => time.formatMsToLocal(value), 'note.updated_time': () => formatMsToRelative(value),
'note.created_time': () => time.formatMsToLocal(value), 'note.created_time': () => formatMsToRelative(value),
'note.todo_completed': () => value ? time.formatMsToLocal(value) : '', 'note.todo_completed': () => value ? time.formatMsToLocal(value) : '',
'note.todo_due': () => value ? time.formatMsToLocal(value) : '', 'note.todo_due': () => value ? time.formatMsToLocal(value) : '',
'note.tags': () => value ? value.map((t: TagEntity) => t.title).join(', ') : '', 'note.tags': () => value ? value.map((t: TagEntity) => t.title).join(', ') : '',

View File

@ -1,3 +1,9 @@
// -----------------------------------------------------------------------------------------------
// !!IMPORTANT!! New time-related code should be added to @joplin/util/time and should be based on
// `dayjs` (which is part of `@joplin/util`). Eventually we'll migrate all code here to
// `@joplin/utils/time`.
// -----------------------------------------------------------------------------------------------
import shim from './shim'; import shim from './shim';
const moment = require('moment'); const moment = require('moment');

View File

@ -34,6 +34,7 @@
"dependencies": { "dependencies": {
"@joplin/fork-htmlparser2": "^4.1.51", "@joplin/fork-htmlparser2": "^4.1.51",
"async-mutex": "0.4.1", "async-mutex": "0.4.1",
"dayjs": "1.11.11",
"execa": "5.1.1", "execa": "5.1.1",
"fs-extra": "11.2.0", "fs-extra": "11.2.0",
"glob": "10.3.10", "glob": "10.3.10",

View File

@ -1,3 +1,55 @@
// -----------------------------------------------------------------------------------------------
// NOTE: Some of the code in here is copied from @joplin/lib/time. New time-related code should be
// added here, and should be based on dayjs (not moment)
// -----------------------------------------------------------------------------------------------
import dayjs = require('dayjs');
import dayJsRelativeTime = require('dayjs/plugin/relativeTime');
const supportedLocales: Record<string, unknown> = {
'ar': require('dayjs/locale/ar'),
'bg': require('dayjs/locale/bg'),
'bs': require('dayjs/locale/bs'),
'ca': require('dayjs/locale/ca'),
'cs': require('dayjs/locale/cs'),
'da': require('dayjs/locale/da'),
'de': require('dayjs/locale/de'),
'el': require('dayjs/locale/el'),
'en-gb': require('dayjs/locale/en-gb'),
'en': require('dayjs/locale/en'),
'eo': require('dayjs/locale/eo'),
'es': require('dayjs/locale/es'),
'et': require('dayjs/locale/et'),
'eu': require('dayjs/locale/eu'),
'fa': require('dayjs/locale/fa'),
'fi': require('dayjs/locale/fi'),
'fr': require('dayjs/locale/fr'),
'gl': require('dayjs/locale/gl'),
'hr': require('dayjs/locale/hr'),
'hu': require('dayjs/locale/hu'),
'id': require('dayjs/locale/id'),
'it': require('dayjs/locale/it'),
'ja': require('dayjs/locale/ja'),
'ko': require('dayjs/locale/ko'),
'nb': require('dayjs/locale/nb'),
'nl-be': require('dayjs/locale/nl-be'),
'nl': require('dayjs/locale/nl'),
'pl': require('dayjs/locale/pl'),
'pt-br': require('dayjs/locale/pt-br'),
'pt': require('dayjs/locale/pt'),
'ro': require('dayjs/locale/ro'),
'ru': require('dayjs/locale/ru'),
'sl': require('dayjs/locale/sl'),
'sr': require('dayjs/locale/sr'),
'sv': require('dayjs/locale/sv'),
'th': require('dayjs/locale/th'),
'tr': require('dayjs/locale/tr'),
'uk': require('dayjs/locale/uk'),
'vi': require('dayjs/locale/vi'),
'zh-cn': require('dayjs/locale/zh-cn'),
'zh-tw': require('dayjs/locale/zh-tw'),
};
export const Second = 1000; export const Second = 1000;
export const Minute = 60 * Second; export const Minute = 60 * Second;
export const Hour = 60 * Minute; export const Hour = 60 * Minute;
@ -5,6 +57,15 @@ export const Day = 24 * Hour;
export const Week = 7 * Day; export const Week = 7 * Day;
export const Month = 30 * Day; export const Month = 30 * Day;
function initDayJs() {
dayjs.extend(dayJsRelativeTime);
}
initDayJs();
let dateFormat_ = 'DD/MM/YYYY';
let timeFormat_ = 'HH:mm';
export const msleep = (ms: number) => { export const msleep = (ms: number) => {
return new Promise(resolve => setTimeout(resolve, ms)); return new Promise(resolve => setTimeout(resolve, ms));
}; };
@ -27,3 +88,48 @@ export function timerPop() {
// eslint-disable-next-line no-console // eslint-disable-next-line no-console
console.info(`Time: ${t.name}: ${Date.now() - t.startTime}`); console.info(`Time: ${t.name}: ${Date.now() - t.startTime}`);
} }
export const formatMsToRelative = (ms: number) => {
if (Date.now() - ms > 2 * Day) return formatMsToLocal(ms);
return dayjs(ms).fromNow(false);
};
const joplinLocaleToDayJsLocale = (locale: string) => {
locale = locale.toLowerCase().replace(/_/, '-');
if (supportedLocales[locale]) return locale;
const lang = locale.split('-')[0];
if (supportedLocales[lang]) return lang;
return 'en-gb';
};
export const setTimeLocale = (locale: string) => {
const dayJsLocale = joplinLocaleToDayJsLocale(locale);
dayjs.locale(dayJsLocale);
};
export const setDateFormat = (format: string) => {
dateFormat_ = format;
};
export const setTimeFormat = (format: string) => {
timeFormat_ = format;
};
const dateFormat = () => {
return dateFormat_;
};
const timeFormat = () => {
return timeFormat_;
};
const dateTimeFormat = () => {
return `${dateFormat()} ${timeFormat()}`;
};
export const formatMsToLocal = (ms: number, format: string|null = null) => {
if (format === null) format = dateTimeFormat();
return dayjs(ms).format(format);
};

View File

@ -7240,6 +7240,7 @@ __metadata:
"@types/markdown-it": 13.0.7 "@types/markdown-it": 13.0.7
"@types/node-fetch": 2.6.11 "@types/node-fetch": 2.6.11
async-mutex: 0.4.1 async-mutex: 0.4.1
dayjs: 1.11.11
execa: 5.1.1 execa: 5.1.1
fs-extra: 11.2.0 fs-extra: 11.2.0
glob: 10.3.10 glob: 10.3.10
@ -18327,6 +18328,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"dayjs@npm:1.11.11":
version: 1.11.11
resolution: "dayjs@npm:1.11.11"
checksum: 84788275aad8a87fee4f1ce4be08861df29687aae6b7b43dd65350118a37dda56772a3902f802cb2dc651dfed447a5a8df62d88f0fb900dba8333e411190a5d5
languageName: node
linkType: hard
"dayjs@npm:^1.11.7": "dayjs@npm:^1.11.7":
version: 1.11.9 version: 1.11.9
resolution: "dayjs@npm:1.11.9" resolution: "dayjs@npm:1.11.9"