@shipfox/client-workflows 12.0.0 → 12.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,2 +1,2 @@
1
1
  $ shipfox-swc
2
- Successfully compiled: 60 files with swc (496.35ms)
2
+ Successfully compiled: 60 files with swc (447.93ms)
package/CHANGELOG.md CHANGED
@@ -1,5 +1,25 @@
1
1
  # @shipfox/client-workflows
2
2
 
3
+ ## 12.0.2
4
+
5
+ ### Patch Changes
6
+
7
+ - @shipfox/api-definitions-dto@11.0.0
8
+ - @shipfox/client-shell@12.0.2
9
+ - @shipfox/client-projects@12.0.2
10
+ - @shipfox/client-triggers@12.0.2
11
+
12
+ ## 12.0.1
13
+
14
+ ### Patch Changes
15
+
16
+ - 78a0033: Show running job executions as running in the workflow graph.
17
+ - Updated dependencies [57e69d8]
18
+ - @shipfox/client-logs@12.0.1
19
+ - @shipfox/client-projects@12.0.1
20
+ - @shipfox/client-shell@12.0.1
21
+ - @shipfox/client-triggers@12.0.1
22
+
3
23
  ## 12.0.0
4
24
 
5
25
  ### Patch Changes
@@ -1 +1 @@
1
- {"version":3,"file":"job-node.d.ts","sourceRoot":"","sources":["../../../src/components/job-graph/job-node.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAC,oBAAoB,EAAE,GAAG,EAAC,MAAM,OAAO,CAAC;AAGrD,OAAO,KAAK,EAAmC,iBAAiB,EAAC,MAAM,uBAAuB,CAAC;AAC/F,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,kBAAkB,CAAC;AAMnD,wBAAgB,WAAW,CAAC,EAC1B,OAAO,GACR,EAAE;IACD,OAAO,EAAE,IAAI,CACX,iBAAiB,EACjB,qBAAqB,GAAG,cAAc,GAAG,iBAAiB,GAAG,eAAe,CAC7E,CAAC;CACH,+BA0BA;AAED,wBAAgB,OAAO,CAAC,EACtB,IAAI,EACJ,QAAQ,EACR,QAAQ,EACR,SAAS,EACT,YAAY,EACZ,UAAU,EACV,GAAG,GACJ,EAAE;IACD,IAAI,EAAE,YAAY,CAAC;IACnB,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,SAAS,EAAE,oBAAoB,CAAC,iBAAiB,CAAC,CAAC;IACnD,YAAY,EAAE,MAAM,IAAI,CAAC;IACzB,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,GAAG,CAAC,EAAE,GAAG,CAAC,iBAAiB,CAAC,CAAC;CAC9B,+BA+CA"}
1
+ {"version":3,"file":"job-node.d.ts","sourceRoot":"","sources":["../../../src/components/job-graph/job-node.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAC,oBAAoB,EAAE,GAAG,EAAC,MAAM,OAAO,CAAC;AAGrD,OAAO,KAAK,EAAmC,iBAAiB,EAAC,MAAM,uBAAuB,CAAC;AAC/F,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,kBAAkB,CAAC;AAMnD,wBAAgB,WAAW,CAAC,EAC1B,OAAO,GACR,EAAE;IACD,OAAO,EAAE,IAAI,CACX,iBAAiB,EACjB,qBAAqB,GAAG,cAAc,GAAG,iBAAiB,GAAG,eAAe,CAC7E,CAAC;CACH,+BA0BA;AAED,wBAAgB,OAAO,CAAC,EACtB,IAAI,EACJ,QAAQ,EACR,QAAQ,EACR,SAAS,EACT,YAAY,EACZ,UAAU,EACV,GAAG,GACJ,EAAE;IACD,IAAI,EAAE,YAAY,CAAC;IACnB,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,SAAS,EAAE,oBAAoB,CAAC,iBAAiB,CAAC,CAAC;IACnD,YAAY,EAAE,MAAM,IAAI,CAAC;IACzB,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,GAAG,CAAC,EAAE,GAAG,CAAC,iBAAiB,CAAC,CAAC;CAC9B,+BAoDA"}
@@ -45,7 +45,8 @@ export function TriggerNode({ trigger }) {
45
45
  }
46
46
  export function JobNode({ node, selected, onSelect, onKeyDown, onHoverStart, onHoverEnd, ref }) {
47
47
  useTimeTick();
48
- const visual = getWorkflowStatusVisual(node.status);
48
+ const status = node.status === 'pending' && node.jobExecutions.some((jobExecution)=>jobExecution.status === 'running') ? 'running' : node.status;
49
+ const visual = getWorkflowStatusVisual(status);
49
50
  const accessibleLabel = [
50
51
  node.displayName,
51
52
  visual.label,
@@ -73,7 +74,7 @@ export function JobNode({ node, selected, onSelect, onKeyDown, onHoverStart, onH
73
74
  className: "flex min-w-0 flex-1 items-center gap-8",
74
75
  children: [
75
76
  /*#__PURE__*/ _jsx(WorkflowStatusIcon, {
76
- status: node.status,
77
+ status: status,
77
78
  jobMode: node.mode,
78
79
  size: 14
79
80
  }),
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/job-graph/job-node.tsx"],"sourcesContent":["import {TriggerSourceIcon} from '@shipfox/client-triggers';\nimport {Badge} from '@shipfox/react-ui/badge';\nimport {useIsTextTruncated} from '@shipfox/react-ui/hooks';\nimport {Icon} from '@shipfox/react-ui/icon';\nimport {useTimeTick} from '@shipfox/react-ui/time-ticker';\nimport {Tooltip, TooltipContent, TooltipTrigger} from '@shipfox/react-ui/tooltip';\nimport {Code} from '@shipfox/react-ui/typography';\nimport {cn} from '@shipfox/react-ui/utils';\nimport type {KeyboardEventHandler, Ref} from 'react';\nimport {getWorkflowStatusVisual} from '#components/workflow-status/status-visuals.js';\nimport {WorkflowStatusIcon} from '#components/workflow-status/workflow-status-icon.js';\nimport type {JobExecution, JobExecutionStatus, WorkflowRunDetail} from '#core/workflow-run.js';\nimport type {JobGraphNode} from './graph-model.js';\nimport {formatJobDurationAccessibleLabel} from './job-duration-format.js';\nimport {JobDurationLabel} from './job-duration-label.js';\n\nconst TRIGGER_SIZE = 36;\n\nexport function TriggerNode({\n trigger,\n}: {\n trigger: Pick<\n WorkflowRunDetail,\n 'triggerDisplayLabel' | 'triggerLabel' | 'triggerProvider' | 'triggerSource'\n >;\n}) {\n const label = trigger.triggerDisplayLabel || 'trigger';\n const tooltip = trigger.triggerLabel || label;\n\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n aria-label={label}\n className=\"flex items-center justify-center rounded-full border border-border-neutral-base bg-background-components-base transition-colors hover:bg-background-components-hover focus-visible:shadow-border-interactive-with-active focus-visible:outline-none\"\n style={{width: TRIGGER_SIZE, height: TRIGGER_SIZE}}\n >\n <TriggerSourceIcon\n provider={trigger.triggerProvider}\n source={trigger.triggerSource}\n aria-hidden\n className=\"size-14 shrink-0 text-foreground-neutral-muted\"\n />\n </button>\n </TooltipTrigger>\n <TooltipContent>\n <span>{tooltip}</span>\n </TooltipContent>\n </Tooltip>\n );\n}\n\nexport function JobNode({\n node,\n selected,\n onSelect,\n onKeyDown,\n onHoverStart,\n onHoverEnd,\n ref,\n}: {\n node: JobGraphNode;\n selected: boolean;\n onSelect: () => void;\n onKeyDown: KeyboardEventHandler<HTMLButtonElement>;\n onHoverStart: () => void;\n onHoverEnd: () => void;\n ref?: Ref<HTMLButtonElement>;\n}) {\n useTimeTick();\n const visual = getWorkflowStatusVisual(node.status);\n const accessibleLabel = [\n node.displayName,\n visual.label,\n formatJobDurationAccessibleLabel(node.displayDuration),\n node.executionCountVisible\n ? executionCountAccessibleLabel(node.jobExecutions.length)\n : undefined,\n node.carriedOver ? 'reused' : undefined,\n ]\n .filter((part): part is string => Boolean(part))\n .join(', ');\n\n return (\n <button\n ref={ref}\n type=\"button\"\n aria-pressed={selected}\n aria-label={accessibleLabel}\n data-job-id={node.id}\n onClick={onSelect}\n onKeyDown={onKeyDown}\n onPointerEnter={onHoverStart}\n onPointerLeave={onHoverEnd}\n className={cn(\n 'group relative flex h-48 w-208 items-center gap-8 rounded-8 border border-border-neutral-base bg-background-components-base px-10 text-left transition-colors hover:bg-background-components-hover focus-visible:shadow-border-interactive-with-active focus-visible:outline-none',\n selected && 'bg-background-components-hover',\n node.carriedOver && 'opacity-[0.55]',\n )}\n >\n {selected ? (\n <span\n aria-hidden=\"true\"\n className=\"absolute inset-y-6 left-0 w-3 rounded-full bg-border-highlights-interactive\"\n />\n ) : null}\n <div className=\"flex min-w-0 flex-1 items-center gap-8\">\n <WorkflowStatusIcon status={node.status} jobMode={node.mode} size={14} />\n <JobLabel label={node.displayName} />\n </div>\n <JobDurationLabel duration={node.displayDuration} />\n {node.executionCountVisible ? <ExecutionCountText executions={node.jobExecutions} /> : null}\n {node.carriedOver ? <CarriedOverBadge /> : null}\n </button>\n );\n}\n\nfunction ExecutionCountText({executions}: {executions: JobExecution[]}) {\n const count = executions.length;\n\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <span\n aria-hidden=\"true\"\n className=\"inline-flex h-20 min-w-28 shrink-0 items-center justify-end gap-4 text-foreground-neutral-muted\"\n >\n <Icon name=\"loopRightLine\" className=\"size-12\" />\n <Code as=\"span\" variant=\"label\" className=\"text-current\">\n {count}\n </Code>\n </span>\n </TooltipTrigger>\n <TooltipContent>{executionCountTooltip(executions)}</TooltipContent>\n </Tooltip>\n );\n}\n\nfunction CarriedOverBadge() {\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <span className=\"shrink-0\">\n <Badge variant=\"neutral\" size=\"2xs\">\n reused\n </Badge>\n </span>\n </TooltipTrigger>\n <TooltipContent>\n Carried over from a previous attempt; did not run in this attempt\n </TooltipContent>\n </Tooltip>\n );\n}\n\nfunction JobLabel({label}: {label: string}) {\n const {ref: labelRef, isTruncated} = useIsTextTruncated<HTMLSpanElement>(label);\n\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <span ref={labelRef} className=\"block min-w-0 truncate\">\n <Code as=\"span\" variant=\"label\" bold className=\"text-foreground-neutral-base\">\n {label}\n </Code>\n </span>\n </TooltipTrigger>\n {isTruncated ? <TooltipContent>{label}</TooltipContent> : null}\n </Tooltip>\n );\n}\n\nfunction executionCountAccessibleLabel(count: number): string {\n return `${count} ${count === 1 ? 'execution' : 'executions'}`;\n}\n\nfunction executionCountTooltip(executions: JobExecution[]): string {\n const counts = executionStatusCounts(executions);\n const parts = EXECUTION_STATUSES.map((status) =>\n counts[status] > 0 ? `${counts[status]} ${status}` : undefined,\n ).filter((part): part is string => part !== undefined);\n return parts.length > 0 ? parts.join(', ') : 'No executions';\n}\n\nconst EXECUTION_STATUSES = [\n 'pending',\n 'running',\n 'succeeded',\n 'failed',\n 'cancelled',\n] as const satisfies readonly JobExecutionStatus[];\n\nfunction executionStatusCounts(executions: JobExecution[]) {\n return executions.reduce(\n (counts, execution) => {\n counts[execution.status] += 1;\n return counts;\n },\n {pending: 0, running: 0, succeeded: 0, failed: 0, cancelled: 0},\n );\n}\n"],"names":["TriggerSourceIcon","Badge","useIsTextTruncated","Icon","useTimeTick","Tooltip","TooltipContent","TooltipTrigger","Code","cn","getWorkflowStatusVisual","WorkflowStatusIcon","formatJobDurationAccessibleLabel","JobDurationLabel","TRIGGER_SIZE","TriggerNode","trigger","label","triggerDisplayLabel","tooltip","triggerLabel","asChild","button","type","aria-label","className","style","width","height","provider","triggerProvider","source","triggerSource","aria-hidden","span","JobNode","node","selected","onSelect","onKeyDown","onHoverStart","onHoverEnd","ref","visual","status","accessibleLabel","displayName","displayDuration","executionCountVisible","executionCountAccessibleLabel","jobExecutions","length","undefined","carriedOver","filter","part","Boolean","join","aria-pressed","data-job-id","id","onClick","onPointerEnter","onPointerLeave","div","jobMode","mode","size","JobLabel","duration","ExecutionCountText","executions","CarriedOverBadge","count","name","as","variant","executionCountTooltip","labelRef","isTruncated","bold","counts","executionStatusCounts","parts","EXECUTION_STATUSES","map","reduce","execution","pending","running","succeeded","failed","cancelled"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/components/job-graph/job-node.tsx"],"sourcesContent":["import {TriggerSourceIcon} from '@shipfox/client-triggers';\nimport {Badge} from '@shipfox/react-ui/badge';\nimport {useIsTextTruncated} from '@shipfox/react-ui/hooks';\nimport {Icon} from '@shipfox/react-ui/icon';\nimport {useTimeTick} from '@shipfox/react-ui/time-ticker';\nimport {Tooltip, TooltipContent, TooltipTrigger} from '@shipfox/react-ui/tooltip';\nimport {Code} from '@shipfox/react-ui/typography';\nimport {cn} from '@shipfox/react-ui/utils';\nimport type {KeyboardEventHandler, Ref} from 'react';\nimport {getWorkflowStatusVisual} from '#components/workflow-status/status-visuals.js';\nimport {WorkflowStatusIcon} from '#components/workflow-status/workflow-status-icon.js';\nimport type {JobExecution, JobExecutionStatus, WorkflowRunDetail} from '#core/workflow-run.js';\nimport type {JobGraphNode} from './graph-model.js';\nimport {formatJobDurationAccessibleLabel} from './job-duration-format.js';\nimport {JobDurationLabel} from './job-duration-label.js';\n\nconst TRIGGER_SIZE = 36;\n\nexport function TriggerNode({\n trigger,\n}: {\n trigger: Pick<\n WorkflowRunDetail,\n 'triggerDisplayLabel' | 'triggerLabel' | 'triggerProvider' | 'triggerSource'\n >;\n}) {\n const label = trigger.triggerDisplayLabel || 'trigger';\n const tooltip = trigger.triggerLabel || label;\n\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n aria-label={label}\n className=\"flex items-center justify-center rounded-full border border-border-neutral-base bg-background-components-base transition-colors hover:bg-background-components-hover focus-visible:shadow-border-interactive-with-active focus-visible:outline-none\"\n style={{width: TRIGGER_SIZE, height: TRIGGER_SIZE}}\n >\n <TriggerSourceIcon\n provider={trigger.triggerProvider}\n source={trigger.triggerSource}\n aria-hidden\n className=\"size-14 shrink-0 text-foreground-neutral-muted\"\n />\n </button>\n </TooltipTrigger>\n <TooltipContent>\n <span>{tooltip}</span>\n </TooltipContent>\n </Tooltip>\n );\n}\n\nexport function JobNode({\n node,\n selected,\n onSelect,\n onKeyDown,\n onHoverStart,\n onHoverEnd,\n ref,\n}: {\n node: JobGraphNode;\n selected: boolean;\n onSelect: () => void;\n onKeyDown: KeyboardEventHandler<HTMLButtonElement>;\n onHoverStart: () => void;\n onHoverEnd: () => void;\n ref?: Ref<HTMLButtonElement>;\n}) {\n useTimeTick();\n const status =\n node.status === 'pending' &&\n node.jobExecutions.some((jobExecution) => jobExecution.status === 'running')\n ? 'running'\n : node.status;\n const visual = getWorkflowStatusVisual(status);\n const accessibleLabel = [\n node.displayName,\n visual.label,\n formatJobDurationAccessibleLabel(node.displayDuration),\n node.executionCountVisible\n ? executionCountAccessibleLabel(node.jobExecutions.length)\n : undefined,\n node.carriedOver ? 'reused' : undefined,\n ]\n .filter((part): part is string => Boolean(part))\n .join(', ');\n\n return (\n <button\n ref={ref}\n type=\"button\"\n aria-pressed={selected}\n aria-label={accessibleLabel}\n data-job-id={node.id}\n onClick={onSelect}\n onKeyDown={onKeyDown}\n onPointerEnter={onHoverStart}\n onPointerLeave={onHoverEnd}\n className={cn(\n 'group relative flex h-48 w-208 items-center gap-8 rounded-8 border border-border-neutral-base bg-background-components-base px-10 text-left transition-colors hover:bg-background-components-hover focus-visible:shadow-border-interactive-with-active focus-visible:outline-none',\n selected && 'bg-background-components-hover',\n node.carriedOver && 'opacity-[0.55]',\n )}\n >\n {selected ? (\n <span\n aria-hidden=\"true\"\n className=\"absolute inset-y-6 left-0 w-3 rounded-full bg-border-highlights-interactive\"\n />\n ) : null}\n <div className=\"flex min-w-0 flex-1 items-center gap-8\">\n <WorkflowStatusIcon status={status} jobMode={node.mode} size={14} />\n <JobLabel label={node.displayName} />\n </div>\n <JobDurationLabel duration={node.displayDuration} />\n {node.executionCountVisible ? <ExecutionCountText executions={node.jobExecutions} /> : null}\n {node.carriedOver ? <CarriedOverBadge /> : null}\n </button>\n );\n}\n\nfunction ExecutionCountText({executions}: {executions: JobExecution[]}) {\n const count = executions.length;\n\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <span\n aria-hidden=\"true\"\n className=\"inline-flex h-20 min-w-28 shrink-0 items-center justify-end gap-4 text-foreground-neutral-muted\"\n >\n <Icon name=\"loopRightLine\" className=\"size-12\" />\n <Code as=\"span\" variant=\"label\" className=\"text-current\">\n {count}\n </Code>\n </span>\n </TooltipTrigger>\n <TooltipContent>{executionCountTooltip(executions)}</TooltipContent>\n </Tooltip>\n );\n}\n\nfunction CarriedOverBadge() {\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <span className=\"shrink-0\">\n <Badge variant=\"neutral\" size=\"2xs\">\n reused\n </Badge>\n </span>\n </TooltipTrigger>\n <TooltipContent>\n Carried over from a previous attempt; did not run in this attempt\n </TooltipContent>\n </Tooltip>\n );\n}\n\nfunction JobLabel({label}: {label: string}) {\n const {ref: labelRef, isTruncated} = useIsTextTruncated<HTMLSpanElement>(label);\n\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <span ref={labelRef} className=\"block min-w-0 truncate\">\n <Code as=\"span\" variant=\"label\" bold className=\"text-foreground-neutral-base\">\n {label}\n </Code>\n </span>\n </TooltipTrigger>\n {isTruncated ? <TooltipContent>{label}</TooltipContent> : null}\n </Tooltip>\n );\n}\n\nfunction executionCountAccessibleLabel(count: number): string {\n return `${count} ${count === 1 ? 'execution' : 'executions'}`;\n}\n\nfunction executionCountTooltip(executions: JobExecution[]): string {\n const counts = executionStatusCounts(executions);\n const parts = EXECUTION_STATUSES.map((status) =>\n counts[status] > 0 ? `${counts[status]} ${status}` : undefined,\n ).filter((part): part is string => part !== undefined);\n return parts.length > 0 ? parts.join(', ') : 'No executions';\n}\n\nconst EXECUTION_STATUSES = [\n 'pending',\n 'running',\n 'succeeded',\n 'failed',\n 'cancelled',\n] as const satisfies readonly JobExecutionStatus[];\n\nfunction executionStatusCounts(executions: JobExecution[]) {\n return executions.reduce(\n (counts, execution) => {\n counts[execution.status] += 1;\n return counts;\n },\n {pending: 0, running: 0, succeeded: 0, failed: 0, cancelled: 0},\n );\n}\n"],"names":["TriggerSourceIcon","Badge","useIsTextTruncated","Icon","useTimeTick","Tooltip","TooltipContent","TooltipTrigger","Code","cn","getWorkflowStatusVisual","WorkflowStatusIcon","formatJobDurationAccessibleLabel","JobDurationLabel","TRIGGER_SIZE","TriggerNode","trigger","label","triggerDisplayLabel","tooltip","triggerLabel","asChild","button","type","aria-label","className","style","width","height","provider","triggerProvider","source","triggerSource","aria-hidden","span","JobNode","node","selected","onSelect","onKeyDown","onHoverStart","onHoverEnd","ref","status","jobExecutions","some","jobExecution","visual","accessibleLabel","displayName","displayDuration","executionCountVisible","executionCountAccessibleLabel","length","undefined","carriedOver","filter","part","Boolean","join","aria-pressed","data-job-id","id","onClick","onPointerEnter","onPointerLeave","div","jobMode","mode","size","JobLabel","duration","ExecutionCountText","executions","CarriedOverBadge","count","name","as","variant","executionCountTooltip","labelRef","isTruncated","bold","counts","executionStatusCounts","parts","EXECUTION_STATUSES","map","reduce","execution","pending","running","succeeded","failed","cancelled"],"mappings":"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"}