Skip to content

DT-3671 - standalone activity details redesign#3255

Draft
rossedfort wants to merge 9 commits intomainfrom
DT-3671-standalone-activity-details-redesign
Draft

DT-3671 - standalone activity details redesign#3255
rossedfort wants to merge 9 commits intomainfrom
DT-3671-standalone-activity-details-redesign

Conversation

@rossedfort
Copy link
Copy Markdown
Contributor

Description & motivation 💭

Better UI for the standalone activity details page

Screenshots (if applicable) 📸

Screenshot 2026-03-26 at 9 48 37 AM

Design Considerations 🎨

Testing 🧪

How was this tested 👻

  • Manual testing
  • E2E tests added
  • Unit tests added

Steps for others to test: 🚶🏽‍♂️🚶🏽‍♀️

Checklists

Draft Checklist

Merge Checklist

Issue(s) closed

Docs

Any docs updates needed?

@rossedfort rossedfort requested review from a team and Alex-Tideman as code owners March 26, 2026 15:49
@vercel
Copy link
Copy Markdown

vercel bot commented Mar 26, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
holocene Ready Ready Preview, Comment Mar 30, 2026 7:39pm

Request Review

</div>
<DetailList aria-label="Retry Policy" rowCount={2}>
<DetailListColumn>
<DetailListLabel>Initial Interval</DetailListLabel>
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  • ⚠️ Argument of type 'number | undefined' is not assignable to parameter of type 'string | number'.

<DetailListColumn>
<DetailListLabel>Initial Interval</DetailListLabel>
<DetailListTextValue text={fromSeconds(activity.initialInterval)} />
<DetailListLabel>Maximum Interval</DetailListLabel>
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  • ⚠️ Argument of type 'number | undefined' is not assignable to parameter of type 'string | number'.

{@const badgeType = failed ? 'danger' : 'default'}
{#if activity}
<div class="flex flex-col gap-4">
<ActivityExecutionInputAndOutcome
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  • ⚠️ '$activityExecution' is possibly 'undefined'.

{#if activity}
<div class="flex flex-col gap-4">
<ActivityExecutionInputAndOutcome
input={$activityExecution.input}
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  • ⚠️ '$activityExecution' is possibly 'undefined'.

<div class="flex flex-col gap-4">
<ActivityExecutionInputAndOutcome
input={$activityExecution.input}
outcome={$activityExecution.outcome}
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  • ⚠️ '$activityExecution' is possibly 'undefined'.

this.backoffCoefficient =
activityExecution?.info?.retryPolicy.backoffCoefficient;
this.scheduleTime = activityExecution?.info?.scheduleTime;
this.currentInterval = formatSecondsAbbreviated(
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  • ⚠️ Argument of type 'string | undefined' is not assignable to parameter of type 'string'.

}

public intervalForAttempt(attempt: number): number {
return Math.min(
Copy link
Copy Markdown
Contributor

@temporal-cicd temporal-cicd bot Mar 26, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  • ⚠️ Type 'string | undefined' is not assignable to type 'string'.


public intervalForAttempt(attempt: number): number {
return Math.min(
this.initialInterval * Math.pow(this.backoffCoefficient, attempt - 1),
Copy link
Copy Markdown
Contributor

@temporal-cicd temporal-cicd bot Mar 26, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  • ⚠️ Type 'string | undefined' is not assignable to type 'string'.

}),
...(activityFormData.heartbeatTimeout && {
heartbeatTimeout: activityFormData.heartbeatTimeout,
}),
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  • ⚠️ Type '{ backoffCoefficient?: number | undefined; maximumAttempts?: number | undefined; maximumInterval?: string | undefined; initialInterval?: string | undefined; }' is not assignable to type 'RetryPolicy'.

};

export const fromNumberToDuration = (duration: string): string => {
export const fromNumberToDuration = (duration: string | number): string => {
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  • ⚠️ Type 'undefined' is not assignable to type 'string'.

@temporal-cicd
Copy link
Copy Markdown
Contributor

temporal-cicd bot commented Mar 26, 2026

Warnings
⚠️

📊 Strict Mode: 45 errors in 7 files (4.0% of 1112 total)

src/lib/utilities/format-time.ts (3)
  • L160:34: Argument of type 'Duration | null' is not assignable to parameter of type 'string | Duration'.
  • L186:34: Argument of type 'Duration | null' is not assignable to parameter of type 'string | Duration'.
  • L270:17: Type 'undefined' is not assignable to type 'string'.
src/lib/pages/standalone-activity.svelte.ts (22)
  • L31:9: Type 'string | undefined' is not assignable to type 'string'.
  • L32:9: Type 'string | undefined' is not assignable to type 'string'.
  • L33:9: Type 'string | undefined' is not assignable to type 'string'.
  • L34:9: Type 'string | undefined' is not assignable to type 'string'.
  • L60:10: Argument of type 'number | undefined' is not assignable to parameter of type 'number'.
  • L66:4: Object is possibly 'undefined'.
  • L66:27: Object is possibly 'undefined'.
  • L72:40: 'a' is possibly 'undefined'.
  • L72:66: 'a' is possibly 'undefined'.
  • L73:41: Argument of type 'number | undefined' is not assignable to parameter of type 'number'.
  • L113:21: Object is possibly 'undefined'.
  • L127:21: Object is possibly 'undefined'.
  • L139:8: Argument of type 'string | undefined' is not assignable to parameter of type 'string'.
  • L145:8: Argument of type 'string | undefined' is not assignable to parameter of type 'string'.
  • L154:27: Argument of type 'string | undefined' is not assignable to parameter of type 'string'.
  • L162:4: Type 'string | undefined' is not assignable to type 'string'.
  • L164:4: Type 'string | undefined' is not assignable to type 'string'.
  • L165:4: Type 'string | undefined' is not assignable to type 'string'.
  • L167:4: Type 'string | undefined' is not assignable to type 'string'.
  • L173:6: Object is possibly 'undefined'.
  • L173:38: Argument of type 'number | undefined' is not assignable to parameter of type 'number'.
  • L174:6: Argument of type 'number | undefined' is not assignable to parameter of type 'number'.
src/lib/pages/standalone-activity.test.ts (1)
  • L85:11: 'activity.deadlineTime' is possibly 'undefined'.
src/lib/services/standalone-activities.ts (5)
  • L59:6: Type 'ErrorCallback' is not assignable to type '(error: unknown, toasts?: Toaster, errors?: Writable<NetworkError | null>, isBrowser?: boolean) => void'.
  • L123:6: Type '{ indexedFields?: ({ [k: string]: temporal.api.common.v1.IPayload; } | null); }' is not assignable to type '{ [k: string]: IPayload; }'.
  • L124:31: Argument of type 'SearchAttributeInput[]' is not assignable to parameter of type '{ type: "Unspecified" | "Keyword" | "Text" | "Int" | "Double" | "Bool" | "KeywordList" | "Datetime"; label: string; value?: any; }[]'.
  • L137:4: Type 'ISearchAttributes | null' is not assignable to type 'ISearchAttributes | undefined'.
  • L154:4: Type '{ backoffCoefficient?: number | undefined; maximumAttempts?: number | undefined; maximumInterval?: string | undefined; initialInterval?: string | undefined; }' is not assignable to type 'RetryPolicy'.
src/lib/components/standalone-activities/activity-execution-retry-schedule.svelte (2)
  • L89:45: Argument of type 'number | undefined' is not assignable to parameter of type 'string | number'.
  • L91:45: Argument of type 'number | undefined' is not assignable to parameter of type 'string | number'.
src/lib/components/standalone-activities/activity-header.svelte (1)
  • L87:8: Type 'string | null | undefined' is not assignable to type 'string'.
src/lib/pages/standalone-activity-details.svelte (11)
  • L33:13: '$activityExecution' is possibly 'undefined'.
  • L34:15: '$activityExecution' is possibly 'undefined'.
  • L35:15: '$activityExecution' is possibly 'undefined'.
  • L39:15: '$activityExecution' is possibly 'undefined'.
  • L45:23: '$activityExecution' is possibly 'undefined'.
  • L46:8: Type 'IPayloads | undefined' is not assignable to type 'IPayloads'.
  • L46:26: '$activityExecution' is possibly 'undefined'.
  • L49:18: '$activityExecution' is possibly 'undefined'.
  • L61:42: Type 'ActivityExecutionRunState | undefined' is not assignable to type 'ActivityExecutionRunState'.
  • L86:8: Type 'number | undefined' is not assignable to type 'number'.
  • L87:8: Type 'number | undefined' is not assignable to type 'number'.

Generated by 🚫 dangerJS against df9f3a3

@rossedfort rossedfort marked this pull request as draft March 26, 2026 16:00
@bilal-karim bilal-karim self-requested a review March 26, 2026 16:23
public currentAttempt: number | undefined = $state();
public scheduleTime: string | undefined = $state();
public lastAttemptCompletedTime: string | undefined = $state();
public nextAttemptScheduleTime: string | undefined = $state();
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  • ⚠️ Type 'string | undefined' is not assignable to type 'string'.

public upcomingAttempts = $derived(
this.running
? this.buildUpcomingAttempts(
this.activityExecution?.info?.lastAttemptCompleteTime,
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  • ⚠️ Argument of type 'number | undefined' is not assignable to parameter of type 'number'.

: [],
);

public attemptsRemaining = $derived(
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  • ⚠️ Object is possibly 'undefined'.
  • ⚠️ Object is possibly 'undefined'.


public secondsRemaining = $derived.by(() => {
if (this.maximumAttempts) {
let total = 0;
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  • ⚠️ 'a' is possibly 'undefined'.
  • ⚠️ 'a' is possibly 'undefined'.


const startToCloseTimeoutMillis = this.startToCloseTimeoutSeconds * 1000;

const endTime = new SvelteDate(
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  • ⚠️ Object is possibly 'undefined'.

activityExecution?.info?.lastAttemptCompleteTime;
this.nextAttemptScheduleTime =
activityExecution?.info?.nextAttemptScheduleTime;
this.closeTime = activityExecution?.info?.closeTime;
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  • ⚠️ Type 'string | undefined' is not assignable to type 'string'.

activityExecution?.info.scheduleToCloseTimeout;
this.startToCloseTimeout = activityExecution?.info?.startToCloseTimeout;
this.scheduleToStartTimeout =
activityExecution?.info?.scheduleToStartTimeout;
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  • ⚠️ Type 'string | undefined' is not assignable to type 'string'.

}

public intervalForAttempt(attempt: number): number {
return Math.min(
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  • ⚠️ Argument of type 'number | undefined' is not assignable to parameter of type 'number'.
  • ⚠️ Object is possibly 'undefined'.


public intervalForAttempt(attempt: number): number {
return Math.min(
this.initialInterval * Math.pow(this.backoffCoefficient, attempt - 1),
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  • ⚠️ Argument of type 'number | undefined' is not assignable to parameter of type 'number'.

expect(activity.running).toBe(true);
expect(activity.upcomingAttempts.length).toBe(51); // includes current attempt
expect(activity.secondsRemaining).toBe(5500);
expect(activity.nextRetrySecondsLeft).toBe('1m 40s');
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  • ⚠️ 'activity.deadlineTime' is possibly 'undefined'.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant