Skip to content

Fix required activity timeout inputs on Start a Standalone Activity form#3567

Merged
laurakwhit merged 4 commits into
mainfrom
fix/required-activity-timeouts
Jun 17, 2026
Merged

Fix required activity timeout inputs on Start a Standalone Activity form#3567
laurakwhit merged 4 commits into
mainfrom
fix/required-activity-timeouts

Conversation

@laurakwhit

Copy link
Copy Markdown
Collaborator

Description & motivation 💭

On the Start a Standalone Activity form, either Start to Close Timeout or Schedule to Close Timeout is required. The validation worked when both fields were left blank, but broke as soon as a value was entered and then removed:

  1. The DurationInput converted its raw numeric field to a seconds string with ${unit.convert(Number(durationValue))}s. When the field was cleared, Number('') evaluated to 0, so the bound value became '0s' instead of empty.
  2. The form's required-check used plain truthiness (!data.startToCloseTimeout). Since '0s' is a truthy string, the check passed, the form considered itself valid and it submitted.
  3. The same root cause ('0s' from an emptied field) also meant a deliberately-typed 0 slipped past validation.

The DurationInput now yields an empty value (value = '') when the raw input is empty or non-numeric, instead of coercing to '0s'. The Start a Standalone Activity form now has an isPositiveDuration helper check for the required prop on the Start to Close Timeout and Schedule to Close Timeout fields.

Screenshots (if applicable) 📸

Design Considerations 🎨

Testing 🧪

How was this tested 👻

  • Manual testing
  • E2E tests added
  • Unit tests added

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

  • On the Start a Standalone Activity form > without entering a Start to Close Timeout or Schedule to Close Timeout hit submit
    • Verify the error ("Either "Start to Close Timeout" or "Schedule to Close Timeout" is required.") appears
  • Enter a value for either Start to Close Timeout or Schedule to Close Timeout and then clear it and hit submit
    • Verify the error appears
  • Enter "0" for either Start to Close Timeout or Schedule to Close Timeout and hit submit
    • Verify the error appears

Checklists

Draft Checklist

Merge Checklist

Issue(s) closed

DT-4181

Docs

Any docs updates needed?

@vercel

vercel Bot commented Jun 16, 2026

Copy link
Copy Markdown

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

Project Deployment Actions Updated (UTC)
holocene Ready Ready Preview, Comment Jun 16, 2026 11:55pm

Request Review

required={!isPositiveDuration($form.scheduleToCloseTimeout)}
hintText={translate(
'standalone-activities.form-start-to-close-timeout-hint',
)}

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'.

required={!isPositiveDuration($form.startToCloseTimeout)}
hintText={translate(
'standalone-activities.form-schedule-to-close-timeout-hint',
)}

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'.

@temporal-cicd

temporal-cicd Bot commented Jun 16, 2026

Copy link
Copy Markdown
Contributor
Warnings
⚠️

📊 Strict Mode: 5 errors in 1 file (0.6% of 906 total)

src/lib/components/standalone-activities/start-standalone-activity-form/form.svelte (5)
  • L153:6: Type 'ClientValidationAdapter<{ encoding: "json/plain" | "json/protobuf"; namespace: string; identity: string; activityId: string; taskQueue: string; activityType: string; initialInterval: string; maximumInterval: string; ... 11 more ...; idConflictPolicy?: string | undefined; }, { ...; }>' is not assignable to type 'ClientValidationAdapter<Partial<{ input: string; messageType: string; scheduleToStartTimeout: string; summary: string; details: string; heartbeatTimeout: string; initialInterval: string; backoffCoefficient: null; ... 11 more ...; scheduleToCloseTimeout: string | undefined; }>, Record<...>> | ValidatorsOption<...> | ...'.
  • L328:11: Type 'string | undefined' is not assignable to type 'string'.
  • L340:11: Type 'string | undefined' is not assignable to type 'string'.
  • L406:13: Type 'null' is not assignable to type 'string'.
  • L408:13: Type 'null' is not assignable to type 'string'.

Generated by 🚫 dangerJS against 8eb9fcb

@laurakwhit
laurakwhit marked this pull request as ready for review June 16, 2026 22:21
@laurakwhit
laurakwhit requested a review from a team as a code owner June 16, 2026 22:21
Comment thread src/lib/holocene/duration-input/duration-input.svelte Outdated

@tegan-temporal tegan-temporal left a comment

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.

I ran across a similar issue with schedules and was too afraid to rework the logic of duration-input... hopefully nothing relies on this unexpected behavior 🤞

@laurakwhit
laurakwhit merged commit 38376e4 into main Jun 17, 2026
20 checks passed
@laurakwhit
laurakwhit deleted the fix/required-activity-timeouts branch June 17, 2026 00:16
laurakwhit added a commit that referenced this pull request Jun 23, 2026
Auto-generated version bump from 2.51.0 to 2.51.1

Specific version: 2.51.1

Changes included:
- [`c848ec54`](c848ec5) fix(a11y): announce workflow / event status on timeline graph nodes (WCAG 1.4.1) (#3443)
- [`af6b12a9`](af6b12a) fix(deployments): align version/status/compute badges in worker deployments table (#3489)
- [`df86587c`](df86587) Add SDK version to standalone activity details (#3447)
- [`59695290`](5969529) Use shared FilterBar component for workflows (#3448)
- [`ded94469`](ded9446) Set display contents in wrapper div if no afterLabel in Input component (#3513)
- [`d7e5eb43`](d7e5eb4) fix(standalone-activities): decode failure encodedAttributes in activity detail (#3507)
- [`81a255a9`](81a255a) fix(DT-4151): fix bottom nav scrollability and double-menu on mobile (#3514)
- [`368f646e`](368f646) Fix exports to work properly with vite8 (#3519)
- [`231bdaff`](231bdaf) chore(deps-dev): bump vitest from 3.2.4 to 3.2.6 (#3509)
- [`1de44ea6`](1de44ea) fix(workers): soften no-workers-polling alert for serverless worker deployments (#3524)
- [`689955a8`](689955a) fix(DT-4080): surface error when validate connection has no compute config, warn on set current (#3516)
- [`93323db9`](93323db) feat(DT-4078): Add Set Ramping Version to Worker Deployment Versions (#3508)
- [`9d3450c0`](9d3450c) fix(DT-4081): surface task queue not registered error in validate connection modal (#3517)
- [`b7f56237`](b7f5623) feat(DT-4079): miscellaneous WD UI fixes (#3511)
- [`83b2d4ec`](83b2d4e) feat(deployments): simplify create worker deployment UX (#3518)
- [`ccb4cb73`](ccb4cb7) Standalone Activity write guards (#3534)
- [`ab20ef03`](ab20ef0) Worker insights UI updates (#3520)
- [`aaf63bdc`](aaf63bd) [wcag] Replace text-[12px] with text-xs in DatePicker action buttons (SC 1.4.4) (#3525)
- [`743be902`](743be90) a11y(2.4.3): replace flex-wrap-reverse with flex-wrap on workflow history toolbar (#3527)
- [`41b73e87`](41b73e8) a11y(2.4.2): ui-main — set distinct, descriptive titles on login/signin, task-queues list, and activity-workers sub-tab (#3535)
- [`3d64cdbf`](3d64cdb) [WCAG 2.4.3] group-details-row — remove redundant outer focus stop on <g> wrapper (#3537)
- [`883e5db1`](883e5db) a11y(2.4.6): datepicker — replace empty label with translate('common.start') (#3543)
- [`9da915e2`](9da915e) a11y(2.4.5): import history — add back-link to Import landing page (#3542)
- [`ca4c1d61`](ca4c1d6) Cache new Intl.DateTimeFormat (#3565)
- [`38376e4d`](38376e4) Fix required activity timeout inputs on Start a Standalone Activity form (#3567)
- [`49d7c9e4`](49d7c9e) Use separate copy for title vs menu item (#3568)
- [`3c7dcdc3`](3c7dcdc) a11y(2.5.8): pagination — grow caret buttons from 12×12 to 24×24 CSS px (#3547)
- [`b5171825`](b517182) a11y(2.5.8): chip — pad remove button to 24×24 CSS px minimum (#3544)
- [`1fea5d5c`](1fea5d5) a11y(2.1.1): fake-button widgets — replace deprecated onkeypress with onkeydown handling Enter and Space (#3528)
- [`5bf09000`](5bf0900) a11y(2.1.1): navigation primitives — replace hover-only CSS :after label tooltip with focusable Tooltip (#3529)
- [`deed43f0`](deed43f) a11y(2.1.1): event summary row — add keyboard-accessible expand control alongside the mouse-only <tr onclick> (#3526)
- [`d401123e`](d401123) a11y(2.5.8): checkbox — add min-h-6 min-w-6 to Label for 24×24 hit area (#3545)
- [`aef4166f`](aef4166) [a11y] Expose toggled state via aria-pressed on ToggleButton (#3559)
- [`797f8831`](797f883) Show single attempt in Standalone Activity details (#3572)
- [`893bc58c`](893bc58) feat(DT-4183): Add Tabs (Primitive) (#3574)
- [`323c1993`](323c199) Date picker input field bug/kt (#3522)
- [`3ac34ce2`](3ac34ce) Various serverless UI updates (#3573)
- [`f365416a`](f365416) a11y(2.1.1): ZoomSvg — add keyboard pan/zoom controls so the workflow family tree is operable without a mouse (#3530)
- [`feb6897e`](feb6897) Fix gaps in slot cards on worker details page (#3580)
- [`b3c80072`](b3c8007) Remove font weight on cache size (#3583)
- [`0e7337ea`](0e7337e) Bump API to v1.62.14 (#3575)

Co-authored-by: laurakwhit <[email protected]>
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.

2 participants