From 6065a9a4d94c55326450d8aa218fb80cbef16766 Mon Sep 17 00:00:00 2001 From: Anthony Rimet Date: Wed, 22 Nov 2023 11:41:09 +0100 Subject: [PATCH] Feat(precomputed): Display time since precomputed start --- src/api/models/precomputed.js | 9 +++++ src/api/services/precomputed/precomputed.js | 4 ++ .../js/admin/precomputed/PrecomputedForm.js | 37 +++++++++++++++++-- .../js/admin/precomputed/PrecomputedList.js | 8 +++- 4 files changed, 53 insertions(+), 5 deletions(-) diff --git a/src/api/models/precomputed.js b/src/api/models/precomputed.js index c83bc18cb1..5de7c6ccd9 100644 --- a/src/api/models/precomputed.js +++ b/src/api/models/precomputed.js @@ -58,6 +58,15 @@ export default async db => { ); }; + collection.updateStartedAt = async (id, startedAt) => { + collection.updateOne( + { + $or: [{ _id: new ObjectId(id) }, { _id: id }], + }, + { $set: { startedAt } }, + ); + }; + collection.castIds = castIdsFactory(collection); return collection; diff --git a/src/api/services/precomputed/precomputed.js b/src/api/services/precomputed/precomputed.js index 55ff5313c6..996bdd8c84 100644 --- a/src/api/services/precomputed/precomputed.js +++ b/src/api/services/precomputed/precomputed.js @@ -381,6 +381,7 @@ export const getComputedFromWebservice = async ( await ctx.precomputed.updateStatus(precomputedId, FINISHED, { data, }); + await ctx.precomputed.updateStartedAt(precomputedId, null); job.progress(100); const isFailed = await job.isFailed(); @@ -447,6 +448,7 @@ export const getFailureFromWebservice = async ( await ctx.precomputed.updateStatus(precomputedId, ERROR, { message: errorMessage, }); + await ctx.precomputed.updateStartedAt(precomputedId, null); job.progress(100); progress.finish(tenant); @@ -467,6 +469,7 @@ export const getFailureFromWebservice = async ( export const processPrecomputed = async (precomputed, ctx) => { let logData = {}; await ctx.precomputed.updateStatus(precomputed._id, IN_PROGRESS); + await ctx.precomputed.updateStartedAt(precomputed._id, new Date()); const room = `${ctx.tenant}-precomputed-job-${ctx.job.id}`; @@ -568,6 +571,7 @@ export const setPrecomputedError = async (ctx, err) => { message: err?.message, }, ); + await ctx.precomputed.updateStartedAt(id, new Date()); const room = `precomputed-job-${ctx.job.id}`; const logData = JSON.stringify({ diff --git a/src/app/js/admin/precomputed/PrecomputedForm.js b/src/app/js/admin/precomputed/PrecomputedForm.js index 5a323fea9f..421f14a529 100644 --- a/src/app/js/admin/precomputed/PrecomputedForm.js +++ b/src/app/js/admin/precomputed/PrecomputedForm.js @@ -50,6 +50,7 @@ import { import { io } from 'socket.io-client'; import CancelButton from '../../lib/components/CancelButton'; import { DEFAULT_TENANT } from '../../../../common/tools/tenantTools'; +import getLocale from '../../../../common/getLocale'; // UTILITARY PART const PRECOMPUTED_FORM = 'PRECOMPUTED_FORM'; @@ -71,7 +72,31 @@ const renderTextField = ({ input, label, meta: { touched, error } }) => { ); }; -export const renderStatus = (status, polyglot) => { +function getDisplayTimeStartedAt(startedAt) { + const now = new Date(); + const startedAtDate = new Date(startedAt); + const diff = now - startedAtDate; + + const diffInMinutes = Math.floor(diff / 60000); + const diffInHours = Math.floor(diffInMinutes / 60); + const diffInDays = Math.floor(diffInHours / 24); + + const relativeTime = new Intl.RelativeTimeFormat(getLocale(), { + numeric: 'auto', + }); + let timeSinceStarted = ''; + + if (diffInHours < 1) { + timeSinceStarted = relativeTime.format(-diffInMinutes, 'minute'); + } else if (diffInDays < 1) { + timeSinceStarted = relativeTime.format(-diffInHours, 'hour'); + } else { + timeSinceStarted = relativeTime.format(-diffInDays, 'day'); + } + return timeSinceStarted; +} + +export const renderStatus = (status, polyglot, startedAt = null) => { if (status === PENDING) { return ( { return ( ); @@ -386,7 +413,11 @@ export const PrecomputedForm = ({ > {polyglot.t('precomputed_status')} :   - {renderStatus(precomputedStatus, polyglot)} + {renderStatus( + precomputedStatus, + polyglot, + initialValues?.startedAt, + )}