diff --git a/ui/src/workflows/components/workflow-artifacts.tsx b/ui/src/workflows/components/workflow-artifacts.tsx index 90b59298d55f..0f697a682774 100644 --- a/ui/src/workflows/components/workflow-artifacts.tsx +++ b/ui/src/workflows/components/workflow-artifacts.tsx @@ -1,9 +1,9 @@ import * as React from 'react'; -import {Timestamp} from '../../shared/components/timestamp'; +import {Timestamp, TimestampSwitch} from '../../shared/components/timestamp'; import * as models from '../../shared/models'; import {services} from '../../shared/services'; -import {TIMESTAMP_KEYS} from '../../shared/use-timestamp'; +import useTimestamp, {TIMESTAMP_KEYS} from '../../shared/use-timestamp'; interface Props { workflow: models.Workflow; @@ -12,6 +12,7 @@ interface Props { export function WorkflowArtifacts(props: Props) { const workflowStatusNodes = (props.workflow.status && props.workflow.status.nodes) || {}; + const [storedDisplayISOFormat, setStoredDisplayISOFormat] = useTimestamp(TIMESTAMP_KEYS.WORKFLOW_NODE_ARTIFACT_CREATED); const artifacts = Object.keys(workflowStatusNodes) .map(nodeName => { @@ -40,21 +41,33 @@ export function WorkflowArtifacts(props: Props) { return (
+
+
Name
+
Step Name
+
Path
+
+ Created at +
+
+ {artifacts.map(artifact => ( -
-
- - - {' '} - - {' '} - {artifact.name} - +
+
+ + + + {artifact.name}
-
{artifact.stepName}
-
{artifact.path}
-
- +
+ {artifact.stepName} +
+
+ {artifact.path} +
+
+ + +
))} diff --git a/ui/src/workflows/components/workflow-details/workflow-details.scss b/ui/src/workflows/components/workflow-details/workflow-details.scss index 1023243f539e..fb3a442280f0 100644 --- a/ui/src/workflows/components/workflow-details/workflow-details.scss +++ b/ui/src/workflows/components/workflow-details/workflow-details.scss @@ -109,18 +109,18 @@ display: grid; grid-template-columns: auto minmax(50%, 1fr); - & > * { + &>* { align-items: center; display: flex; min-height: 50px; padding: 14px 0; } - & > *:nth-child(odd) { + &>*:nth-child(odd) { padding-right: 4em; } - & > *:not(:nth-last-child(-n+2)) { + &>*:not(:nth-last-child(-n+2)) { border-bottom: 1px solid $argo-color-gray-3; } @@ -149,3 +149,87 @@ font-weight: bold; min-height: 2em; } + +.row.header { + color: $argo-color-gray-8; + background-color: $argo-color-gray-1; + border-bottom: 1px solid $argo-color-gray-5; + display: flex; + line-height: 1.2em; + padding: 4px 0; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + + &:hover { + overflow: visible; + white-space: normal; + } + + .columns { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + word-wrap: break-word; + word-break: break-all; + overflow-wrap: break-word; + text-align: left; + padding-left: 0; + + &:hover { + overflow: visible; + white-space: normal; + + } + } +} + + +.hoverable { + display: block; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + transition: all 0.2s ease-in-out; + word-wrap: break-word; + word-break: break-all; + overflow-wrap: break-word; + + &:hover { + overflow: visible; + white-space: normal; + position: relative; + z-index: 1; + } +} + +.artifact-row { + color: $argo-color-gray-8; + display: flex; + border-bottom: 1px solid $argo-color-gray-5; + padding: 8px 0; + text-align: left; + + &:hover { + background-color: $argo-color-gray-3; + } + + .columns { + padding-left: 0; + + &.artifact-name { + display: flex; + + a { + margin-right: 1em; + text-decoration: none; + } + + .artifact-name-text { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + } + } +} \ No newline at end of file diff --git a/ui/src/workflows/components/workflow-node-info/workflow-node-info.scss b/ui/src/workflows/components/workflow-node-info/workflow-node-info.scss index 2063135a63f5..ff63a3ea41c4 100644 --- a/ui/src/workflows/components/workflow-node-info/workflow-node-info.scss +++ b/ui/src/workflows/components/workflow-node-info/workflow-node-info.scss @@ -1,7 +1,6 @@ @import 'node_modules/argo-ui/src/styles/config'; .workflow-node-info { - height: calc(100vh - 2 * #{$top-bar-height}); overflow-y: auto; @@ -73,4 +72,88 @@ padding: 1em 0; } } -} + + .row.header { + color: $argo-color-gray-8; + background-color: $argo-color-gray-1; + border-bottom: 1px solid $argo-color-gray-5; + display: flex; + line-height: 1.2em; + padding: 4px 0; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + + &:hover { + overflow: visible; + white-space: normal; + } + + .columns { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + word-wrap: break-word; + word-break: break-all; + overflow-wrap: break-word; + text-align: left; + padding-left: 0; + + &:hover { + overflow: visible; + white-space: normal; + + } + } + } + + + .hoverable { + display: block; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + transition: all 0.2s ease-in-out; + word-wrap: break-word; + word-break: break-all; + overflow-wrap: break-word; + + &:hover { + overflow: visible; + white-space: normal; + position: relative; + z-index: 1; + } + } + + .artifact-row { + color: $argo-color-gray-8; + display: flex; + border-bottom: 1px solid $argo-color-gray-5; + padding: 8px 0; + text-align: left; + + &:hover { + background-color: $argo-color-gray-3; + } + + .columns { + padding-left: 0; + + &.artifact-name { + display: flex; + + a { + margin-right: 1em; + text-decoration: none; + } + + .artifact-name-text { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + } + } + } +} \ No newline at end of file diff --git a/ui/src/workflows/components/workflow-node-info/workflow-node-info.tsx b/ui/src/workflows/components/workflow-node-info/workflow-node-info.tsx index 7a03babd9aed..d0d0034dc4fe 100644 --- a/ui/src/workflows/components/workflow-node-info/workflow-node-info.tsx +++ b/ui/src/workflows/components/workflow-node-info/workflow-node-info.tsx @@ -11,14 +11,14 @@ import {InlineTable} from '../../../shared/components/inline-table/inline-table' import LinkifiedText from '../../../shared/components/linkified-text'; import {Links} from '../../../shared/components/links'; import {Phase} from '../../../shared/components/phase'; -import {Timestamp} from '../../../shared/components/timestamp'; +import {Timestamp, TimestampSwitch} from '../../../shared/components/timestamp'; import * as models from '../../../shared/models'; import {Artifact, NodeStatus, Workflow} from '../../../shared/models'; import {getPodName} from '../../../shared/pod-name'; import {ResourcesDuration} from '../../../shared/resources-duration'; import {services} from '../../../shared/services'; import {getResolvedTemplates} from '../../../shared/template-resolution'; -import {TIMESTAMP_KEYS} from '../../../shared/use-timestamp'; +import useTimestamp, {TIMESTAMP_KEYS} from '../../../shared/use-timestamp'; import './workflow-node-info.scss'; @@ -412,6 +412,7 @@ function WorkflowNodeContainers(props: Props) { } function WorkflowNodeArtifacts(props: {workflow: Workflow; node: NodeStatus; archived: boolean; isInput: boolean; artifacts: Artifact[]}) { + const [storedDisplayISOFormat, setStoredDisplayISOFormat] = useTimestamp(TIMESTAMP_KEYS.WORKFLOW_NODE_ARTIFACT_CREATED); const artifacts = (props.artifacts && props.artifacts.map(artifact => @@ -423,6 +424,7 @@ function WorkflowNodeArtifacts(props: {workflow: Workflow; node: NodeStatus; arc }) )) || []; + return (
{artifacts.length === 0 && ( @@ -435,30 +437,40 @@ function WorkflowNodeArtifacts(props: {workflow: Workflow; node: NodeStatus; arc Artifacts for archived workflows may be overwritten by a more recent workflow with the same name.

)} - {artifacts.map(artifact => ( -
- -
- {artifact.name} -
- - {artifact.nodeName} - - - {artifact.path} - - - - + {artifacts.length > 0 && ( +
+
+
Artifact Name
+
Node Name
+
Path
+
+ Created at
+ + {artifacts.map(artifact => ( +
+
+ + + + {artifact.name} +
+
+ {artifact.nodeName} +
+
+ {artifact.path} +
+
+ + + +
+
+ ))}
- ))} + )}
); }