Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
a5fecae
DT-3531 - start standalone activity (#3074)
rossedfort Jan 7, 2026
666e2a5
Merge branch 'main' into standalone-activities
rossedfort Jan 15, 2026
1653ac9
DT-3526 describe standalone activity (#3099)
rossedfort Jan 20, 2026
70c49c5
Standalone Activities List (#3103)
Alex-Tideman Jan 21, 2026
e6da300
DT-3532 - activity execution actions (#3115)
rossedfort Jan 26, 2026
205ff7f
Merge branch 'main' into standalone-activities
rossedfort Jan 26, 2026
fb800a6
add disabled state for standalone activities (#3122)
rossedfort Jan 27, 2026
e1ec090
Standalone activities design scrub (#3123)
rossedfort Jan 28, 2026
f0f534b
Merge branch 'main' into standalone-activities
rossedfort Jan 28, 2026
9656864
fix test
rossedfort Jan 28, 2026
17653e3
fix test
rossedfort Jan 28, 2026
e712796
add alert for when no workers
rossedfort Jan 28, 2026
c5b682d
404 standalone activities for now
rossedfort Jan 29, 2026
adb3ba8
refetch activity after terminate and cancel
rossedfort Feb 2, 2026
8939e4e
add search attributes for filters
rossedfort Feb 2, 2026
09d6c14
fix duration input dark mode
rossedfort Feb 2, 2026
3c97e6a
add fallback values for activity header
rossedfort Feb 2, 2026
f0af030
remove postscss
rossedfort Feb 2, 2026
d589454
better way to do search attributes
rossedfort Feb 2, 2026
3288165
fix screaming enums
rossedfort Feb 2, 2026
07b9937
trigger actions
rossedfort Feb 3, 2026
0b47388
bump api version to v1.62.0
rossedfort Feb 3, 2026
8a53f4a
fix some strict mode
rossedfort Feb 3, 2026
7b11111
fix some more strict
rossedfort Feb 3, 2026
0544e5c
Make table maxHeight optional and remove default constraints
andrewzamojc Feb 3, 2026
8668018
Remove maxHeight from full-page table usages
andrewzamojc Feb 3, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,7 @@
"@storybook/addon-essentials": "^8.6.11",
"@storybook/addon-interactions": "^8.6.11",
"@storybook/addon-links": "^8.6.11",
"@storybook/addon-svelte-csf": "^5.0.0-next.23",
"@storybook/addon-svelte-csf": "^5.0.10",
"@storybook/addon-themes": "^8.6.11",
"@storybook/blocks": "^8.6.11",
"@storybook/icons": "^1.4.0",
Expand Down
2 changes: 1 addition & 1 deletion pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion server/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ require (
github.com/labstack/echo/v4 v4.13.4
github.com/stretchr/testify v1.10.0
github.com/urfave/cli/v2 v2.3.0
go.temporal.io/api v1.57.0
go.temporal.io/api v1.62.0
golang.org/x/net v0.47.0
golang.org/x/oauth2 v0.30.0
google.golang.org/grpc v1.66.1
Expand Down
4 changes: 2 additions & 2 deletions server/go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -68,8 +68,8 @@ github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6Kllzaw
github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQD0Loo=
github.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ=
go.temporal.io/api v1.57.0 h1:vJGbU6RqMqCAXP03Jq4KEL61sCxAdJx4Yj7PxtbsrF0=
go.temporal.io/api v1.57.0/go.mod h1:iaxoP/9OXMJcQkETTECfwYq4cw/bj4nwov8b3ZLVnXM=
go.temporal.io/api v1.62.0 h1:rh7LqqV+pxaLNwPLsFRZgYoDJ/NvCNDv0EnWe6oS7A4=
go.temporal.io/api v1.62.0/go.mod h1:iaxoP/9OXMJcQkETTECfwYq4cw/bj4nwov8b3ZLVnXM=
golang.org/x/crypto v0.45.0 h1:jMBrvKuj23MTlT0bQEOBcAE0mjg8mK9RXFhRH6nyF3Q=
golang.org/x/crypto v0.45.0/go.mod h1:XTGrrkGJve7CYK7J8PEww4aY7gM3qMCElcJQ8n8JdX4=
golang.org/x/net v0.47.0 h1:Mx+4dIFzqraBXUugkia1OOvlD6LemFo1ALMHjrXDOhY=
Expand Down
6 changes: 4 additions & 2 deletions src/lib/components/detail-list/detail-list-label.svelte
Original file line number Diff line number Diff line change
@@ -1,17 +1,19 @@
<script lang="ts">
import type { Snippet } from 'svelte';
import { type ClassNameValue, twMerge } from 'tailwind-merge';

import Link from '$lib/holocene/link.svelte';

interface Props {
children: Snippet;
class?: ClassNameValue;
href?: string;
}

const { children, href }: Props = $props();
const { children, href, class: className = '' }: Props = $props();
</script>

<dd class="col-[1]">
<dd class={twMerge('col-[1]', className)}>
{#if href}
<Link {href} newTab>{@render children()}</Link>
{:else}
Expand Down
34 changes: 23 additions & 11 deletions src/lib/components/detail-list/detail-list-text-value.svelte
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
<script lang="ts">
import Badge, { type BadgeType } from '$lib/holocene/badge.svelte';
import type { IconName } from '$lib/holocene/icon';
import Icon from '$lib/holocene/icon/icon.svelte';
import Tooltip from '$lib/holocene/tooltip.svelte';
Expand All @@ -11,23 +12,34 @@
text: string;
tooltipText?: string;
isBadge?: boolean;
badgeType?: BadgeType;
iconName?: IconName | undefined;
}

let { copyable, copyableText, text, tooltipText, isBadge, iconName }: Props =
$props();
let {
copyable,
copyableText,
text,
tooltipText,
iconName,
isBadge = false,
badgeType = 'default',
}: Props = $props();
</script>

{#snippet content()}
<div
class="flex select-all items-center gap-1 truncate rounded-sm"
class:surface-subtle={isBadge}
>
{#if iconName}
<Icon name={iconName} class="shrink-0" />
{/if}
<span class="truncate">{text}</span>
</div>
{#if isBadge}
<Badge type={badgeType}>
{text}
</Badge>
{:else}
<div class="flex select-all items-center gap-1 truncate rounded-sm">
{#if iconName}
<Icon name={iconName} class="shrink-0" />
{/if}
<span class="truncate">{text}</span>
</div>
{/if}
{/snippet}

<DetailListValue {copyable} {copyableText}>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
<script lang="ts">
import type { Snippet } from 'svelte';

import Tooltip from '$lib/holocene/tooltip.svelte';
import { relativeTime } from '$lib/stores/time-format';
import type { ValidTime } from '$lib/utilities/format-time';

import { timestamp } from '../timestamp.svelte';

import DetailListValue from './detail-list-value.svelte';

interface Props {
timestamp: ValidTime | undefined | null;
children?: Snippet;
fallback?: string;
}

let { timestamp: t, children, fallback }: Props = $props();

let formattedTimestamp = $derived(
t ? $timestamp(t) : fallback ? fallback : '',
);
let relativeTimestamp = $derived(
t ? $timestamp(t, { relative: true }) : fallback ? fallback : '',
);
</script>

{#snippet content()}
<div class="flex select-all items-center gap-1 truncate rounded-sm">
{$relativeTime ? relativeTimestamp : formattedTimestamp}
</div>
{/snippet}

<DetailListValue>
<Tooltip
hide={!t}
text={$relativeTime ? formattedTimestamp : relativeTimestamp}
top
class="min-w-0"
>
{@render content()}
{@render children?.()}
</Tooltip>
</DetailListValue>
1 change: 1 addition & 0 deletions src/lib/components/detail-list/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,4 @@ export { default as DetailListValue } from './detail-list-value.svelte';
export { default as DetailListTextValue } from './detail-list-text-value.svelte';
export { default as DetailListLinkValue } from './detail-list-link-value.svelte';
export { default as DetailListColumn } from './detail-list-column.svelte';
export { default as DetailListTimestampValue } from './detail-list-timestamp-value.svelte';
13 changes: 3 additions & 10 deletions src/lib/components/payload-input-with-encoding.svelte
Original file line number Diff line number Diff line change
@@ -1,19 +1,12 @@
<script context="module" lang="ts">
const encoding = ['json/plain', 'json/protobuf'] as const;
export type PayloadInputEncoding = (typeof encoding)[number];
export const isPayloadInputEncodingType = (
x: unknown,
): x is PayloadInputEncoding => encoding.includes(x as PayloadInputEncoding);
</script>

<script lang="ts">
import { type Writable } from 'svelte/store';
import type { Writable } from 'svelte/store';

import Card from '$lib/holocene/card.svelte';
import Input from '$lib/holocene/input/input.svelte';
import RadioGroup from '$lib/holocene/radio-input/radio-group.svelte';
import RadioInput from '$lib/holocene/radio-input/radio-input.svelte';
import { translate } from '$lib/i18n/translate';
import type { PayloadInputEncoding } from '$lib/models/payload-encoding';

import PayloadInput from './payload-input.svelte';

Expand Down Expand Up @@ -44,7 +37,7 @@
<div class="flex w-full flex-col gap-2">
<RadioGroup
description={translate('workflows.encoding')}
bind:group={encoding}
group={encoding}
name="encoding"
>
<RadioInput id="json/plain" value="json/plain" label="json/plain" />
Expand Down
43 changes: 43 additions & 0 deletions src/lib/components/retry-policy-input.svelte
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
<script lang="ts">
import DurationInput from '$lib/holocene/duration-input/duration-input.svelte';
import Input from '$lib/holocene/input/input.svelte';

interface Props {
initialInterval: string;
backoffCoefficient: string;
maximumInterval: string;
maximumAttempts: string;
}

let {
initialInterval = $bindable(),
backoffCoefficient = $bindable(),
maximumAttempts = $bindable(),
maximumInterval = $bindable(),
}: Props = $props();
</script>

<div class="space-y-2">
<DurationInput
label="Initial Interval"
id="initial-interval-input"
bind:value={initialInterval}
/>
<Input
type="number"
label="Backoff Coefficient"
id="backoff-coefficient-input"
bind:value={backoffCoefficient}
/>
<DurationInput
label="Maximum Interval"
id="maximum-interval-input"
bind:value={maximumInterval}
/>
<Input
type="number"
label="Maximum Attempts"
id="maximum-attempts-input"
bind:value={maximumAttempts}
/>
</div>
3 changes: 1 addition & 2 deletions src/lib/components/schedule/schedule-form-view.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
import Link from '$lib/holocene/link.svelte';
import Loading from '$lib/holocene/loading.svelte';
import { translate } from '$lib/i18n/translate';
import type { PayloadInputEncoding } from '$lib/models/payload-encoding';
import { error, loading } from '$lib/stores/schedules';
import {
customSearchAttributes,
Expand All @@ -31,8 +32,6 @@
} from '$lib/utilities/route-for';
import { writeActionsAreAllowed } from '$lib/utilities/write-actions-are-allowed';

import type { PayloadInputEncoding } from '../payload-input-with-encoding.svelte';

import ScheduleInputPayload from './schedule-input-payload.svelte';
import SchedulesSearchAttributesInputs from './schedules-search-attributes-inputs.svelte';

Expand Down
9 changes: 5 additions & 4 deletions src/lib/components/schedule/schedule-input-payload.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,16 @@

import Button from '$lib/holocene/button.svelte';
import { translate } from '$lib/i18n/translate';
import {
isPayloadInputEncodingType,
type PayloadInputEncoding,
} from '$lib/models/payload-encoding';
import type { Payloads } from '$lib/types';
import { atob } from '$lib/utilities/atob';
import { getSinglePayload } from '$lib/utilities/encode-payload';

import PayloadDecoder from '../event/payload-decoder.svelte';
import PayloadInputWithEncoding, {
isPayloadInputEncodingType,
type PayloadInputEncoding,
} from '../payload-input-with-encoding.svelte';
import PayloadInputWithEncoding from '../payload-input-with-encoding.svelte';

export let input: string;
export let editInput: boolean;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
<script lang="ts">
import { page } from '$app/state';

import Button from '$lib/holocene/button.svelte';
import Icon from '$lib/holocene/icon/icon.svelte';
import PaginatedTable from '$lib/holocene/table/paginated-table/api-paginated.svelte';
import Tooltip from '$lib/holocene/tooltip.svelte';
import { translate } from '$lib/i18n/translate';
import { fetchPaginatedActivities } from '$lib/services/standalone-activities';
import { activityCount, activityRefresh } from '$lib/stores/activities';
import { configurableTableColumns } from '$lib/stores/configurable-table-columns';

import TableBodyCell from './activities-summary-configurable-table/table-body-cell.svelte';
import TableEmptyState from './activities-summary-configurable-table/table-empty-state.svelte';
import TableHeaderCell from './activities-summary-configurable-table/table-header-cell.svelte';
import TableHeaderRow from './activities-summary-configurable-table/table-header-row.svelte';
import TableRow from './activities-summary-configurable-table/table-row.svelte';

interface Props {
onClickConfigure: () => void;
}

let { onClickConfigure }: Props = $props();

const namespace = $derived(page.params.namespace);
const columns = $derived(
$configurableTableColumns?.[namespace]?.activities ?? [],
);
const query = $derived(page.url.searchParams.get('query') ?? '');

const onFetch = $derived(() => fetchPaginatedActivities(namespace, query));
</script>

{#key [namespace, query, $activityRefresh]}
<PaginatedTable
total={$activityCount.count}
{onFetch}
let:visibleItems
aria-label={translate('standalone-activities.standalone-activities')}
pageSizeSelectLabel={translate('common.per-page')}
nextButtonLabel={translate('common.next')}
previousButtonLabel={translate('common.previous')}
emptyStateMessage={translate('standalone-activities.empty-state-title')}
>
<caption class="sr-only" slot="caption">
{translate('standalone-activities.standalone-activities')}
</caption>
<TableHeaderRow slot="headers">
<th></th>
{#each columns as column}
<TableHeaderCell {column} />
{/each}
</TableHeaderRow>
{#each visibleItems as activity}
<TableRow {activity}>
{#each columns as column}
<TableBodyCell {activity} {column} />
{/each}
</TableRow>
{/each}
<svelte:fragment slot="empty">
<TableEmptyState />
</svelte:fragment>
<svelte:fragment slot="actions-end-additional">
<Tooltip text="Configure Columns" top>
<Button
on:click={onClickConfigure}
data-testid="activities-summary-table-configuration-button"
size="xs"
variant="ghost"
>
<Icon name="settings" />
</Button>
</Tooltip>
</svelte:fragment>
</PaginatedTable>
{/key}
Loading