Skip to content

fix(schedules): default absent second/minute/hour to 0 when editing#3653

Merged
tegan-temporal merged 1 commit into
mainfrom
DT-4249-schedules-everyday-schedule-with-the-ui-does-not-have-any-future-runs-scheduled
Jul 10, 2026
Merged

fix(schedules): default absent second/minute/hour to 0 when editing#3653
tegan-temporal merged 1 commit into
mainfrom
DT-4249-schedules-everyday-schedule-with-the-ui-does-not-have-any-future-runs-scheduled

Conversation

@tegan-temporal

Copy link
Copy Markdown
Contributor

Problem

Editing a schedule whose structured calendar omits second/minute/hour left it with no future runs.

getFormSpecFromSpec mapped a missing time field to an empty range array. On save that serializes to an omitted field, and the server compiles an empty second/minute/hour range to match nothing — the 0 default is only filled for the deprecated string CalendarSpec, not a directly-supplied StructuredCalendarSpec.

Fix

Fall back to a 0 range for these fields, mirroring how dayOfMonth/dayOfWeek/month already handle absent fields. Test updated.

When an existing schedule's structured calendar omits second/minute/hour,
getFormSpecFromSpec mapped the missing field to an empty range array. On
save that serializes to an omitted field, and the server compiles an empty
second/minute/hour range to 'match nothing' (the server only fills the '0'
default for the deprecated string CalendarSpec, not a directly-supplied
StructuredCalendarSpec), so the edited schedule has no future runs.

Fall back to a 0 range for these fields, mirroring dayOfMonth/dayOfWeek/month.
@tegan-temporal
tegan-temporal requested a review from a team as a code owner July 10, 2026 05:18
@vercel

vercel Bot commented Jul 10, 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 Jul 10, 2026 5:20am

Request Review

// An absent second/minute/hour must default to 0, not an empty range.
// if we use an empty range, that tells the server to exclude everything
// and no future runs will occur.
hour: defaultMissingRangeStart(

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 'IRange[]' is not assignable to parameter of type '{ start?: number | undefined; end?: number | undefined; step?: number | undefined; }[]'.

calendar.hour ?? [{ start: 0, end: 0, step: 1 }],
0,
),
minute: defaultMissingRangeStart(

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 'IRange[]' is not assignable to parameter of type '{ start?: number | undefined; end?: number | undefined; step?: number | undefined; }[]'.

calendar.minute ?? [{ start: 0, end: 0, step: 1 }],
0,
),
second: defaultMissingRangeStart(

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 'IRange[]' is not assignable to parameter of type '{ start?: number | undefined; end?: number | undefined; step?: number | undefined; }[]'.

second: defaultMissingRangeStart(
calendar.second ?? [{ start: 0, end: 0, step: 1 }],
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.

  • ⚠️ Type 'IRange[]' is not assignable to type '{ start: number; end?: number | undefined; step?: number | undefined; }[]'.

calendar.second ?? [{ start: 0, end: 0, step: 1 }],
0,
),
month: calendar.month ?? [{ start: 1, end: 12, step: 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.

  • ⚠️ Type 'IRange[] | null | undefined' is not assignable to type '{ start: number; end?: number | undefined; step?: number | undefined; }[] | undefined'.

@temporal-cicd

temporal-cicd Bot commented Jul 10, 2026

Copy link
Copy Markdown
Contributor
Warnings
⚠️

📊 Strict Mode: 9 errors in 1 file (1.0% of 893 total)

src/lib/components/schedule/utilities/get-form-spec.ts (9)
  • L23:8: Type 'IRange[]' is not assignable to type '{ start: number; end?: number | undefined; step?: number | undefined; }[]'.
  • L25:10: Argument of type 'IRange[]' is not assignable to parameter of type '{ start?: number | undefined; end?: number | undefined; step?: number | undefined; }[]'.
  • L32:10: Argument of type 'IRange[]' is not assignable to parameter of type '{ start?: number | undefined; end?: number | undefined; step?: number | undefined; }[]'.
  • L36:10: Argument of type 'IRange[]' is not assignable to parameter of type '{ start?: number | undefined; end?: number | undefined; step?: number | undefined; }[]'.
  • L40:10: Argument of type 'IRange[]' is not assignable to parameter of type '{ start?: number | undefined; end?: number | undefined; step?: number | undefined; }[]'.
  • L43:8: Type 'IRange[]' is not assignable to type '{ start: number; end?: number | undefined; step?: number | undefined; }[]'.
  • L44:8: Type 'IRange[] | null | undefined' is not assignable to type '{ start: number; end?: number | undefined; step?: number | undefined; }[] | undefined'.
  • L51:15: Argument of type '{ kind: "frozen"; interval: { interval: ${number}s; phase: ${number}s; }; }' is not assignable to parameter of type '{ calendar: { second: { start: number; end?: number | undefined; step?: number | undefined; }[]; minute: { start: number; end?: number | undefined; step?: number | undefined; }[]; hour: { start: number; end?: number | undefined; step?: number | undefined; }[]; ... 4 more ...; year?: { ...; }[] | undefined; }; cronSt...'.
  • L57:6: Type '{ kind: "frozen"; interval: { interval: ${number}s; phase: ${number}s; }; }' does not satisfy the expected type '{ calendar: { second: { start: number; end?: number | undefined; step?: number | undefined; }[]; minute: { start: number; end?: number | undefined; step?: number | undefined; }[]; hour: { start: number; end?: number | undefined; step?: number | undefined; }[]; ... 4 more ...; year?: { ...; }[] | undefined; }; cronSt...'.

Generated by 🚫 dangerJS against 89f031b

@tegan-temporal
tegan-temporal enabled auto-merge (squash) July 10, 2026 05:28
@tegan-temporal
tegan-temporal merged commit 3be0df0 into main Jul 10, 2026
24 checks passed
@tegan-temporal
tegan-temporal deleted the DT-4249-schedules-everyday-schedule-with-the-ui-does-not-have-any-future-runs-scheduled branch July 10, 2026 11:47
rossedfort added a commit that referenced this pull request Jul 13, 2026
Auto-generated version bump from 2.52.0 to 2.52.1

Bump type: patch

Changes included:
- [`3be0df00`](3be0df0) fix(schedules): default absent second/minute/hour to 0 when editing (#3653)
- [`508b65b7`](508b65b) fix(schedules): default emptied second/minute/hour to 0 on submit (#3655)
- [`1f0e149c`](1f0e149) fix(workers): reject $LATEST qualifier in Lambda ARN validation (#3657)
- [`b42b0776`](b42b077) a11y(2.4.3): inert-based focus containment + restore; drop trap from native dialogs (#3598)
- [`cc491a29`](cc491a2) a11y(2.4.3): keep toast live region announcing during a focus trap [DT-4252] (#3654)
- [`ddc7f8e2`](ddc7f8e) a11y(2.4.11): add scroll-padding so sticky overlays don't obscure focused elements (#3532)
- [`b7e3a472`](b7e3a47) FilterBar icon update (#3660)
- [`09318ec6`](09318ec) Add danger PR comment for api version bump (#3662)
- [`273cc4be`](273cc4b) a11y(4.1.2): add label prop to Button primitive and enforce accessible names (#3556)
- [`4507115f`](4507115) Use an editable combobox for the Cloud Run region field (DT-4232) (#3636)
- [`694a7471`](694a747) a11y(1.4.13): migrate saved-query nav tooltips to Tooltip primitive (#3607)
- [`8b384a40`](8b384a4) a11y(4.1.2): fix nested interactive elements in Copyable component (#3558)
- [`1bfd2750`](1bfd275) fix describe SANO API requests to include runId parameter (#3661)
- [`ba18b43e`](ba18b43) a11y(4.1.2): require label on CodeBlock primitive; add aria-readonly for read-only mode (#3557)
- [`6e2290f1`](6e2290f) feat(deployments): make compute provider picker configurable (#3659)
- [`4470b76a`](4470b76) fix(workers): persist WDV compute-config edits via update mask; revert $LATEST validation (#3658)
- [`17fd591b`](17fd591) fix(nexus-operations): make start standalone nexus operation timeouts optional (#3656)

Co-authored-by: rossedfort <[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