Skip to content

Commit f978005

Browse files
Alex-Tidemanlaurakwhitdependabot[bot]temporal-cicd[bot]temporal-data
authored
Workflow Relationship Tree (#2487)
* Accordion component updates (#2316) * Fix styling for non-expandable Accordion * Update padding on Card to match Accordion * Add AccordionGroup * Make ring inset on focus-within * Fix imports and A11y warning * Highlight active link in nav bar (#2324) * Add active styling for nav item * Add isActive check for nav links * Account for if isActive is undefined * Add workflow electron * Add http api port and async update flag (#2314) * Show all possible failures for WorkflowTaskError (#2328) * Use AccordionGroup to show all possible failures * Dont use red text * Move source to accordion * Add pending task component and move into accordion group * Fixes from Laura's review * Add border * WIP: filter * Bump express from 4.19.2 to 4.20.0 (#2323) Bumps [express](https://github.com/expressjs/express) from 4.19.2 to 4.20.0. - [Release notes](https://github.com/expressjs/express/releases) - [Changelog](https://github.com/expressjs/express/blob/master/History.md) - [Commits](expressjs/express@4.19.2...4.20.0) --- updated-dependencies: - dependency-name: express dependency-type: direct:development ... Signed-off-by: dependabot[bot] <[email protected]> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump vite from 5.0.13 to 5.2.14 (#2329) Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 5.0.13 to 5.2.14. - [Release notes](https://github.com/vitejs/vite/releases) - [Changelog](https://github.com/vitejs/vite/blob/v5.2.14/packages/vite/CHANGELOG.md) - [Commits](https://github.com/vitejs/vite/commits/v5.2.14/packages/vite) --- updated-dependencies: - dependency-name: vite dependency-type: direct:development ... Signed-off-by: dependabot[bot] <[email protected]> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Fix the go things * MVP of electron. Needs some performance tweaks and to add links to each node * Add icons, clean up * Remove commented out code * Update snapshots * Update go to 1.22.6 (#2334) * Update go to 1.23 * Use 1.22.6 * Remove work files * Add go.work to gitignore * Small UI fixes (#2345) * Remove unnecessary coerced Boolean * Pluralize Namespaces badge for Nexus endpoints * Fix action slot on Accordion component * Ignore a11y test on Accordion with action * 2.31.1 (#2346) Co-authored-by: Temporal Data (cicd) <[email protected]> * Update version.go to v2.31.0 (#2347) * Use go 1.23.0 (#2348) * Use 1.23 (#2349) * Update go version to 1.23 in update ui-server (#2351) * Update go version to 1.23 in update ui-server * Use v4 * Add breadcrumbs for nodes * Add hover/click state with opacity * Add back child table * Fix overfetching issue * Fix icon type * WIP Family Tree * Get math right for tree positions * I did things but can't remember what * Remove electron stuff * Get rid of pane * Add side panel descriptions * Better styles and status color * Better side nav buttons. Better lines to dots. Need to fix the tree node expanding * Add link, needs a better place * Better styles on description, add links, fix opening nodes * Add table of info and link vis/sidenav with open/close * Add table * Better description * fix lines * Better isActive, isCurrent checks * isCurrent check * Make split 50/50 * Fix types * Better styles for active, better borders. * Refactor to include root, clean up styles, better basis widths * Add root child count on node tree * Make tree sticky on lg screens * Add CaN tree * Add schedule tree * Delete all unused tables * Delete breadcrumbs * Use justify-end to move links to far right * Fix sm screen layout * Make visual a little shorter at 240px, hide times if small screen * Add dash and min-w for end time, py-1 * Fix root node click and accessibility issues * Bump maxZoomOut for a lot of children * Add back old tables in case api not supported or if we wanna go labs mode route * Small style updates based on feedback, better responsive padding * Better count placement --------- Signed-off-by: dependabot[bot] <[email protected]> Co-authored-by: Laura Whitaker <[email protected]> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: temporal-cicd[bot] <138905749+temporal-cicd[bot]@users.noreply.github.com> Co-authored-by: Temporal Data (cicd) <[email protected]>
1 parent 92aa02b commit f978005

30 files changed

+1180
-91
lines changed

Diff for: pnpm-lock.yaml

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Diff for: src/lib/components/event/payload-decoder.svelte

+7-2
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
import { page } from '$app/stores';
33
44
import { authUser } from '$lib/stores/auth-user';
5+
import type { Memo } from '$lib/types';
56
import type { EventAttribute, WorkflowEvent } from '$lib/types/events';
67
import {
78
cloneAllPotentialPayloadsWithCodec,
@@ -15,7 +16,11 @@
1516
} from '$lib/utilities/get-codec';
1617
import { stringifyWithBigInt } from '$lib/utilities/parse-with-big-int';
1718
18-
export let value: PotentiallyDecodable | EventAttribute | WorkflowEvent;
19+
export let value:
20+
| PotentiallyDecodable
21+
| EventAttribute
22+
| WorkflowEvent
23+
| Memo;
1924
export let key = '';
2025
export let onDecode: (decodedValue: string) => void | undefined = undefined;
2126
@@ -36,7 +41,7 @@
3641
};
3742
3843
const decodePayloads = async (
39-
_value: PotentiallyDecodable | EventAttribute | WorkflowEvent,
44+
_value: PotentiallyDecodable | EventAttribute | WorkflowEvent | Memo,
4045
) => {
4146
try {
4247
const convertedAttributes = await cloneAllPotentialPayloadsWithCodec(

Diff for: src/lib/components/lines-and-dots/workflow-details.svelte

+4-2
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
44
import { translate } from '$lib/i18n/translate';
55
import { relativeTime, timeFormat } from '$lib/stores/time-format';
6-
import { workflowRun } from '$lib/stores/workflow-run';
6+
import type { WorkflowExecution } from '$lib/types/workflows';
77
import { formatDate } from '$lib/utilities/format-date';
88
import { formatDistanceAbbreviated } from '$lib/utilities/format-time';
99
import {
@@ -14,8 +14,10 @@
1414
1515
import WorkflowDetail from './workflow-detail.svelte';
1616
17+
export let workflow: WorkflowExecution;
18+
1719
$: ({ namespace } = $page.params);
18-
$: ({ workflow } = $workflowRun);
20+
1921
$: elapsedTime = formatDistanceAbbreviated({
2022
start: workflow?.startTime,
2123
end: workflow?.endTime || Date.now(),
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
<script lang="ts">
2+
import type { IconName } from '$lib/holocene/icon';
3+
import Icon from '$lib/holocene/icon/icon.svelte';
4+
import Link from '$lib/holocene/link.svelte';
5+
6+
export let label: string;
7+
export let value: string;
8+
export let href: string | undefined = undefined;
9+
export let icon: IconName | undefined = undefined;
10+
export let current = false;
11+
</script>
12+
13+
<div
14+
class="flex w-full flex-col items-center gap-2 border border-subtle px-1 py-4 text-center text-xs transition-all lg:text-base {current &&
15+
'bg-subtle'} max-w-md"
16+
>
17+
{#if icon}
18+
<Icon name={icon} />
19+
{/if}
20+
<p class="font-mono">{label}</p>
21+
<div class="px-1 lg:px-2">
22+
{#if href}
23+
<Link {href}>
24+
{value}
25+
</Link>
26+
{:else}
27+
<p>{value}</p>
28+
{/if}
29+
</div>
30+
</div>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
<script lang="ts">
2+
import { translate } from '$lib/i18n/translate';
3+
import { routeForRelationships } from '$lib/utilities/route-for';
4+
5+
import ContinueAsNewNode from './continue-as-new-node.svelte';
6+
7+
export let namespace: string;
8+
export let workflowId: string;
9+
export let first: string;
10+
export let previous: string;
11+
export let current: string;
12+
export let next: string;
13+
</script>
14+
15+
<div
16+
class="flex w-full items-center justify-between overflow-auto bg-primary px-8 py-16 lg:py-36 xl:px-32"
17+
>
18+
{#if first}
19+
<ContinueAsNewNode
20+
label={translate('workflows.first-execution')}
21+
value={first}
22+
href={routeForRelationships({
23+
namespace,
24+
workflow: workflowId,
25+
run: first,
26+
})}
27+
/>
28+
<div
29+
class="border-top border-1 w-full border border-dashed border-subtle"
30+
></div>
31+
{/if}
32+
{#if previous}
33+
<ContinueAsNewNode
34+
label={translate('workflows.previous-execution')}
35+
value={first}
36+
href={routeForRelationships({
37+
namespace,
38+
workflow: workflowId,
39+
run: previous,
40+
})}
41+
/>
42+
<div class="border-top border-1 w-full border border-subtle"></div>
43+
{/if}
44+
<ContinueAsNewNode
45+
label={translate('workflows.current-execution')}
46+
value={current}
47+
href={routeForRelationships({
48+
namespace,
49+
workflow: workflowId,
50+
run: current,
51+
})}
52+
current
53+
/>
54+
{#if next}
55+
<div class="border-top border-1 w-full border border-subtle"></div>
56+
<ContinueAsNewNode
57+
label={translate('workflows.next-execution')}
58+
value={next}
59+
href={routeForRelationships({
60+
namespace,
61+
workflow: workflowId,
62+
run: next,
63+
})}
64+
/>
65+
{/if}
66+
</div>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
<script lang="ts">
2+
import { translate } from '$lib/i18n/translate';
3+
import {
4+
routeForRelationships,
5+
routeForSchedule,
6+
} from '$lib/utilities/route-for';
7+
8+
import ContinueAsNewNode from './continue-as-new-node.svelte';
9+
10+
export let namespace: string;
11+
export let workflowId: string;
12+
export let scheduleId: string;
13+
export let current: string;
14+
</script>
15+
16+
<div
17+
class="flex w-full flex-col items-center justify-between gap-4 bg-primary px-8 py-12 xl:px-32"
18+
>
19+
<ContinueAsNewNode
20+
label="Schedule"
21+
value={scheduleId}
22+
icon="schedules"
23+
href={routeForSchedule({
24+
namespace: namespace,
25+
scheduleId,
26+
})}
27+
/>
28+
<div class="border-top border-1 h-24 w-0.5 bg-subtle" />
29+
<ContinueAsNewNode
30+
label={translate('workflows.current-execution')}
31+
value={current}
32+
href={routeForRelationships({
33+
namespace,
34+
workflow: workflowId,
35+
run: current,
36+
})}
37+
current
38+
/>
39+
</div>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
<script lang="ts">
2+
import WorkflowStatus from '$lib/components/workflow-status.svelte';
3+
import Icon from '$lib/holocene/icon/icon.svelte';
4+
import { translate } from '$lib/i18n/translate';
5+
import { relativeTime, timeFormat } from '$lib/stores/time-format';
6+
import type { WorkflowExecution } from '$lib/types/workflows';
7+
import { formatDate } from '$lib/utilities/format-date';
8+
import { formatDistanceAbbreviated } from '$lib/utilities/format-time';
9+
10+
export let workflow: WorkflowExecution;
11+
export let isRootWorkflow = false;
12+
13+
$: elapsedTime = formatDistanceAbbreviated({
14+
start: workflow?.startTime,
15+
end: workflow?.endTime || Date.now(),
16+
includeMilliseconds: true,
17+
});
18+
</script>
19+
20+
<div
21+
class="flex w-full flex-col gap-2 p-1 text-left text-sm lg:flex-row lg:items-center"
22+
>
23+
<div class="flex items-center gap-2 lg:basis-96">
24+
<div class="w-32 leading-3">
25+
<WorkflowStatus status={workflow.status} />
26+
</div>
27+
<div class="w-full leading-3">
28+
{#if isRootWorkflow}
29+
<p class="font-mono text-xs">{translate('common.type')}</p>
30+
{/if}
31+
<p>{workflow.name}</p>
32+
</div>
33+
</div>
34+
<div class="leading-3 lg:basis-[800px]">
35+
{#if isRootWorkflow}
36+
<p class="font-mono text-xs">{translate('common.id')}</p>
37+
{/if}
38+
<p>{workflow.id}</p>
39+
</div>
40+
<div class="hidden items-center gap-4 lg:flex lg:basis-5/12">
41+
<div class="leading-3">
42+
{#if isRootWorkflow}
43+
<p class="font-mono text-xs">
44+
{translate('common.start')}
45+
</p>
46+
{/if}
47+
<p>
48+
{formatDate(workflow?.startTime, $timeFormat, {
49+
relative: $relativeTime,
50+
})}
51+
</p>
52+
</div>
53+
<div class="leading-3">
54+
{#if isRootWorkflow}
55+
<p class="min-w-12 font-mono text-xs">{translate('common.end')}</p>
56+
{/if}
57+
<p>
58+
{formatDate(workflow?.endTime, $timeFormat, {
59+
relative: $relativeTime,
60+
}) || '-'}
61+
</p>
62+
</div>
63+
<div class="leading-3">
64+
{#if isRootWorkflow}
65+
<Icon name="clock" class="h-4 w-3" />
66+
{/if}
67+
<p>{elapsedTime}</p>
68+
</div>
69+
</div>
70+
</div>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
<script lang="ts">
2+
import type { RootNode } from '$lib/services/workflow-service';
3+
import type { WorkflowExecution } from '$lib/types/workflows';
4+
5+
import WorkflowFamilyNodeDescription from './workflow-family-node-description.svelte';
6+
7+
export let root: RootNode;
8+
export let expandAll: boolean;
9+
export let onNodeClick: (node: RootNode, generation: number) => void;
10+
export let activeWorkflow: WorkflowExecution | undefined = undefined;
11+
export let generation = 1;
12+
export let openRuns: Map<number, string>;
13+
</script>
14+
15+
{#each root?.children as child}
16+
<WorkflowFamilyNodeDescription
17+
root={child}
18+
{expandAll}
19+
{onNodeClick}
20+
{activeWorkflow}
21+
{generation}
22+
{openRuns}
23+
/>
24+
{/each}

0 commit comments

Comments
 (0)