diff --git a/src/common/i18n/en.json b/src/common/i18n/en.json index 20fcb3916..36651bf9f 100644 --- a/src/common/i18n/en.json +++ b/src/common/i18n/en.json @@ -629,8 +629,9 @@ "system-status.job-details.header.producerName": "Producer Name", "system-status.export-details.link.label": "Link to files", - "system-status.export-details.description.text": "Job Description: {desc}", + "system-status.export-details.description.label": "Description: ", "system-status.export-details.no-description.text": "None", + "system-status.export-details.expirationDate": "Expiration Date", "system-status.job-priority-lowest": "Lowest", "system-status.job-priority-low": "Low", diff --git a/src/common/i18n/he.json b/src/common/i18n/he.json index a63a0f26f..1659f0a92 100644 --- a/src/common/i18n/he.json +++ b/src/common/i18n/he.json @@ -641,6 +641,7 @@ "system-status.export-details.link.label": "לינק לקבצים", "system-status.export-details.description.label": "תיאור משימה: ", "system-status.export-details.no-description.text": "ללא", + "system-status.export-details.expirationDate": "תאריך תפוגה", "system-status.task.fields.type.label": "מטלה", "system-status.task.fields.status.label": "סטטוס", diff --git a/src/discrete-layer/components/job-manager/grids/job-manager-grid.common.tsx b/src/discrete-layer/components/job-manager/grids/job-manager-grid.common.tsx index 74364ec45..055a73905 100644 --- a/src/discrete-layer/components/job-manager/grids/job-manager-grid.common.tsx +++ b/src/discrete-layer/components/job-manager/grids/job-manager-grid.common.tsx @@ -195,52 +195,52 @@ const JobManagerGrid: React.FC = (props) => { comparator: (valueA, valueB, nodeA, nodeB, isInverted): number => valueA - valueB, }, - { - headerName: intl.formatMessage({ - id: 'system-status.job.fields.expirationDate.label', - }), - width: 160, - field: 'parameters.cleanupData.cleanupExpirationTime', - sortable: true, - cellRenderer: 'dateCellRenderer', - cellRendererParams: { - field: 'parameters.cleanupData.cleanupExpirationTime', - comingSoonDaysIndication: 10, - shouldShowPredicate: (data: JobModelType): boolean => { - return (data.type as string).toLowerCase().includes('export'); - }, - onChange: ( - updatedExpirationDate: Date, - jobData: JobModelType - ): void => { - const { id, productType } = jobData; - const updateTaskDomain = getProductDomain( - productType as ProductType, - enumsMap ?? undefined - ); + // { + // headerName: intl.formatMessage({ + // id: 'system-status.job.fields.expirationDate.label', + // }), + // width: 160, + // field: 'expirationDate', + // sortable: true, + // cellRenderer: 'dateCellRenderer', + // cellRendererParams: { + // field: 'expirationDate', + // comingSoonDaysIndication: 10, + // shouldShowPredicate: (data: JobModelType): boolean => { + // return (data.type as string).toLowerCase().includes('export'); + // }, + // onChange: ( + // updatedExpirationDate: Date, + // jobData: JobModelType + // ): void => { + // const { id, productType } = jobData; + // const updateTaskDomain = getProductDomain( + // productType as ProductType, + // enumsMap ?? undefined + // ); - updateJobCB({ - id, - domain: updateTaskDomain, - data: { - parameters: { - cleanupData: { - cleanupExpirationTime: updatedExpirationDate - } - }, - }, - }); - }, - datePickerProps: { - disablePast: true, - disableFuture: false, - minDate: moment().add(1,'day').toDate(), - } - }, - // @ts-ignore - comparator: (valueA, valueB, nodeA, nodeB, isInverted): number => - valueA - valueB, - }, + // updateJobCB({ + // id, + // domain: updateTaskDomain, + // data: { + // parameters: { + // cleanupData: { + // cleanupExpirationTime: updatedExpirationDate + // } + // }, + // }, + // }); + // }, + // datePickerProps: { + // disablePast: true, + // disableFuture: false, + // minDate: moment().add(1,'day').toDate(), + // } + // }, + // // @ts-ignore + // comparator: (valueA, valueB, nodeA, nodeB, isInverted): number => + // valueA - valueB, + // }, { headerName: intl.formatMessage({ id: 'system-status.job.fields.status.label', diff --git a/src/discrete-layer/components/job-manager/jobs.dialog.css b/src/discrete-layer/components/job-manager/jobs.dialog.css index 3414f433f..e959b86d6 100644 --- a/src/discrete-layer/components/job-manager/jobs.dialog.css +++ b/src/discrete-layer/components/job-manager/jobs.dialog.css @@ -52,6 +52,7 @@ body[dir='rtl'] #jobsDialog .closeIcon { } #jobsDialog .refreshContainer .refreshSecs { + cursor: pointer; position: relative; text-align: center; font-size: 8px; diff --git a/src/discrete-layer/components/system-status/cell-renderer/job-details.cell-renderer.tsx b/src/discrete-layer/components/system-status/cell-renderer/job-details.cell-renderer.tsx index 8334a3dce..18858b1d2 100644 --- a/src/discrete-layer/components/system-status/cell-renderer/job-details.cell-renderer.tsx +++ b/src/discrete-layer/components/system-status/cell-renderer/job-details.cell-renderer.tsx @@ -171,15 +171,36 @@ const TasksRenderer: React.FC = observer(({ jobId, productT ); }); -export const JobDetailsRenderer: React.FC = (props) => { - const jobId = (props.data as JobModelType).id; +export const JobDetailsRenderer: React.FC = observer((props) => { + const [propsWithJobParams, setPropsWithJobParams] = useState(props); + + const jobId = (props.data as JobModelType).id.replace(DETAILS_ROW_ID_SUFFIX, ''); + + const { data } = useQuery( + (store) => + store.queryJob({ + id: jobId, + }) + ); + + useEffect(() => { + if (!data?.job) return; + + setPropsWithJobParams(prev => ({ + ...prev, + data: { + ...props.data, + parameters: data.job?.parameters + }, + })); + }, [data]); const keyPrefix = `${(props.data as JobModelType).resourceId as string}`; return ( - - + + {taskFields.map((field) => ( = (props) => { ))} - + ); -}; +}); diff --git a/src/discrete-layer/components/system-status/cell-renderer/job-details.header.tsx b/src/discrete-layer/components/system-status/cell-renderer/job-details.header.tsx index 15b2489c7..6661b8b92 100644 --- a/src/discrete-layer/components/system-status/cell-renderer/job-details.header.tsx +++ b/src/discrete-layer/components/system-status/cell-renderer/job-details.header.tsx @@ -29,6 +29,7 @@ export const JobDetailsHeader: React.FC = ({ inProgressTasks, completedTasks, pendingTasks, + expiredTasks, }, }) => { const intl = useIntl(); @@ -77,9 +78,10 @@ export const JobDetailsHeader: React.FC = ({ label: getStatusTranslation(Status.Pending), value: (pendingTasks as unknown) as string, }, - suspended: { + // suspended: { + expired: { label: getStatusTranslation(Status.Suspended), - value: (completedTasks as unknown) as string, + value: (expiredTasks as unknown) as string, }, }, failReason: { diff --git a/src/discrete-layer/components/system-status/cell-renderer/job.details.export-job-data.css b/src/discrete-layer/components/system-status/cell-renderer/job.details.export-job-data.css index 8e7a0e5b4..a53bfd860 100644 --- a/src/discrete-layer/components/system-status/cell-renderer/job.details.export-job-data.css +++ b/src/discrete-layer/components/system-status/cell-renderer/job.details.export-job-data.css @@ -26,4 +26,12 @@ .exportJobDataContainer .exportJobLinkContainer > a:hover { filter: brightness(150%); +} + +.exportJobDataContainer .jobDescriptionContainer .expired { + color: var(--mdc-theme-gc-error-medium); +} + +.exportJobDataContainer .jobDescriptionContainer .valid { + color: var(--mdc-theme-gc-priority-normal); } \ No newline at end of file diff --git a/src/discrete-layer/components/system-status/cell-renderer/job.details.export-job-data.tsx b/src/discrete-layer/components/system-status/cell-renderer/job.details.export-job-data.tsx index 7259930dd..991d1e0bc 100644 --- a/src/discrete-layer/components/system-status/cell-renderer/job.details.export-job-data.tsx +++ b/src/discrete-layer/components/system-status/cell-renderer/job.details.export-job-data.tsx @@ -5,6 +5,7 @@ import { get } from 'lodash'; import React from 'react'; import { useIntl } from 'react-intl'; import { Hyperlink } from '../../../../common/components/hyperlink/hyperlink'; +import { dateFormatter } from '../../../../common/helpers/formatters'; import { JobModelType, Status } from '../../../models'; import { CopyButton } from '../../job-manager/job-details.copy-button'; @@ -23,6 +24,17 @@ const JobDetailsExportJobData: React.FC = ({ data const jobDescription = jobData.description as string | undefined ?? ''; const exportLinks = get(jobData, `parameters.callbackParams.links`) as Record | undefined; + const expirationTimeUTC: string = get(jobData, `parameters.cleanupData.cleanupExpirationTimeUTC`); + let formattedExpirationTime = ''; + let hasExpired: boolean = false; + + if (expirationTimeUTC) { + const expirationTime = new Date(expirationTimeUTC); + formattedExpirationTime = dateFormatter(expirationTime); + const today = new Date(); + hasExpired = expirationTime < today; + } + const jobStatus = jobData.status; // const exportLinkLabel = intl.formatMessage({id: 'system-status.export-details.link.label'}); @@ -35,6 +47,14 @@ const JobDetailsExportJobData: React.FC = ({ data return ( + { exportLinks && expirationTimeUTC && + <> + + { intl.formatMessage({id: 'system-status.export-details.expirationDate'}) + ': ' + formattedExpirationTime} + + { " | " } + + } {jobDescriptionText}