Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
131 commits
Select commit Hold shift + click to select a range
358a7fb
Support afterLabel input
tegan-temporal May 29, 2026
cb4ddfb
Remove extra class
tegan-temporal May 29, 2026
c306013
Refactor schedule form to use SuperForms with simplified data flow
Alex-Tideman Apr 3, 2026
157d50f
Redesign schedule form with multi-spec support, new fields, and two-c…
Alex-Tideman Apr 3, 2026
e5ec8bf
Optional chaining for type safety
Alex-Tideman Apr 3, 2026
fb1ff8f
Polish schedule form with Holocene components and UX improvements
Alex-Tideman Apr 3, 2026
40a7f4e
Update Schedule Spec UI to match designs
Alex-Tideman Apr 8, 2026
be94ffa
More UI updates to spec
Alex-Tideman Apr 9, 2026
6c35812
Update Schedule View UI and migrate to Svelte 5
Alex-Tideman Apr 13, 2026
f0ce772
Add No Runs empty state
tegan-temporal May 18, 2026
97c22ea
Better spacing
Alex-Tideman Apr 13, 2026
1d953e8
Container div
Alex-Tideman Apr 13, 2026
40cc151
DT-3751 - download external payloads (#3345)
rossedfort May 15, 2026
d990880
Fix errors
tegan-temporal May 28, 2026
1656319
Update test
tegan-temporal May 28, 2026
099f60f
Fix integration and e2e tests
tegan-temporal May 28, 2026
85a450c
Style adjustments
tegan-temporal May 29, 2026
ebcb0a8
Fix date handlers
tegan-temporal May 29, 2026
0e74c60
WIP
tegan-temporal May 30, 2026
f45f511
Move preview to it's own component
tegan-temporal Jun 1, 2026
2d7be63
More changes
tegan-temporal Jun 1, 2026
320157d
Add cron expression format modal
tegan-temporal Jun 1, 2026
19e6669
Use h2 for title
tegan-temporal Jun 1, 2026
95f60bb
Fix bg color
tegan-temporal Jun 1, 2026
b7b51c8
More updates
tegan-temporal Jun 1, 2026
ea9eab9
Minor updates
tegan-temporal Jun 1, 2026
4b90409
Fix link
tegan-temporal Jun 2, 2026
ee05fe1
Even more updates
tegan-temporal Jun 2, 2026
c19b129
Style fixes
tegan-temporal Jun 2, 2026
9c4cbb5
WIP
tegan-temporal Jun 2, 2026
0710c13
More WIP
tegan-temporal Jun 2, 2026
71c2ec6
Update gap
tegan-temporal Jun 2, 2026
568ab51
Even more wip
tegan-temporal Jun 3, 2026
81159ff
WIP WIP
tegan-temporal Jun 3, 2026
01ce2a9
Wip
tegan-temporal Jun 3, 2026
1cdbb41
Fix import
tegan-temporal Jun 3, 2026
5b2ac54
Make button focusable
tegan-temporal Jun 3, 2026
b2c2ad9
Reset duration on empty
tegan-temporal Jun 3, 2026
6bc457b
Default with '--'\
tegan-temporal Jun 3, 2026
881fec7
Revert fromSeconds change
tegan-temporal Jun 3, 2026
d320512
Boop
tegan-temporal Jun 4, 2026
fdaaf57
WIP WIP WIP
tegan-temporal Jun 4, 2026
2ccfdb0
Group the custom days
tegan-temporal Jun 4, 2026
6b13e79
Beeeeeep
tegan-temporal Jun 4, 2026
d4a320e
Validate spec before adding another one
tegan-temporal Jun 4, 2026
6489784
Boooooop
tegan-temporal Jun 4, 2026
0d11ffa
Wakka wakka
tegan-temporal Jun 5, 2026
acb6e96
AHHHHHHHHHH
tegan-temporal Jun 5, 2026
e6ff728
Make preview just use summary text
tegan-temporal Jun 5, 2026
ee6c460
Move description display
tegan-temporal Jun 5, 2026
a612dd2
Merge branch 'main' into tegan/schedules-update
tegan-temporal Jun 5, 2026
ae4adc2
Make it stack
tegan-temporal Jun 5, 2026
3685d0a
Add max-w to svgs
tegan-temporal Jun 5, 2026
99e695a
Make gap consistent
tegan-temporal Jun 5, 2026
b64bc12
add a minmax to the main content area
tegan-temporal Jun 5, 2026
bd2502a
Updaaaaate
tegan-temporal Jun 5, 2026
be7879c
i18nify
tegan-temporal Jun 5, 2026
19cffb2
Even more i18nification
tegan-temporal Jun 6, 2026
187cd2f
For sure
tegan-temporal Jun 6, 2026
fa9766f
Beeeep
tegan-temporal Jun 6, 2026
ed944f5
Blah
tegan-temporal Jun 6, 2026
570d513
Bloop
tegan-temporal Jun 6, 2026
79d7183
Disable changing start date if editing
tegan-temporal Jun 6, 2026
00103f3
Refactor schedule serialization
tegan-temporal Jun 6, 2026
dfa9bc2
Refactor serialization to individual utilities
tegan-temporal Jun 6, 2026
6e64771
Updaaaate
tegan-temporal Jun 6, 2026
fbaafc7
Add delete modal to edit form
tegan-temporal Jun 6, 2026
08216ce
Make load a pre effect
tegan-temporal Jun 6, 2026
404c8fc
Do it up!
tegan-temporal Jun 7, 2026
e6e159e
Beeeeeep
tegan-temporal Jun 7, 2026
1803289
Add spacing
tegan-temporal Jun 7, 2026
f8129a2
wakka wakka
tegan-temporal Jun 7, 2026
cb74d2e
Blaga blaga blaga
tegan-temporal Jun 7, 2026
d3d5254
Waaaaa
tegan-temporal Jun 7, 2026
8f2a86e
Beeeeep
tegan-temporal Jun 8, 2026
116dc29
Remove inspects
tegan-temporal Jun 8, 2026
d4b219a
Big ole-refactor
tegan-temporal Jun 8, 2026
f7345ee
Add key
tegan-temporal Jun 8, 2026
0c9e12e
Boooooop
tegan-temporal Jun 8, 2026
c87db45
Parse duration
tegan-temporal Jun 8, 2026
914ae6d
Set actioning pending false on error catch
tegan-temporal Jun 8, 2026
bc0f1c8
Fix time
tegan-temporal Jun 8, 2026
6b037ad
Include identity in modals
tegan-temporal Jun 8, 2026
45f400b
Comment aobut doubling
tegan-temporal Jun 8, 2026
804cabe
Updaaaaaaaate
tegan-temporal Jun 8, 2026
d7b2eda
Remove inspect
tegan-temporal Jun 8, 2026
b50be0a
Remove unused fn
tegan-temporal Jun 8, 2026
a088384
cleanup []
tegan-temporal Jun 8, 2026
05473ff
Remove potential of loading and actionPending getting stuck
tegan-temporal Jun 8, 2026
6eb8752
Cleanup timeouts
tegan-temporal Jun 8, 2026
e6fed7d
ensure id is unique
tegan-temporal Jun 8, 2026
a3a28a4
Update other fields to use uuid
tegan-temporal Jun 8, 2026
f0c5e88
Fix copy
tegan-temporal Jun 8, 2026
6fa0085
Don't clear timeout
tegan-temporal Jun 8, 2026
fa40f1a
WIP
tegan-temporal Jun 9, 2026
0e3fa12
Gigantor refactor
tegan-temporal Jun 9, 2026
ad2cdd7
Continue to set innerhtml
tegan-temporal Jun 9, 2026
1216ef8
More!!!! MOre!!!!!
tegan-temporal Jun 10, 2026
de0b5e2
MOARRRRRR
tegan-temporal Jun 10, 2026
39d4c82
Anchor to midnight of given timezone
tegan-temporal Jun 10, 2026
2faa081
pin end date to end of day
tegan-temporal Jun 10, 2026
7bb30da
Fixups
tegan-temporal Jun 10, 2026
78bdd99
Fix type
tegan-temporal Jun 10, 2026
d8b0fbd
Remove unused schema
tegan-temporal Jun 10, 2026
454a7a8
Fixup defaults
tegan-temporal Jun 10, 2026
339866c
Remove timing from summary
tegan-temporal Jun 10, 2026
1f477d7
Indicate times are based on the selected timezone
tegan-temporal Jun 10, 2026
8b0bca6
beeeep
tegan-temporal Jun 10, 2026
60ad6e3
Workflow Input instead of Schedule Input
tegan-temporal Jun 10, 2026
0aabdea
Add validation for interval interval
tegan-temporal Jun 10, 2026
eaba3b5
Interval min should be 1
tegan-temporal Jun 10, 2026
9d6faa2
Test the utils
tegan-temporal Jun 10, 2026
2c968b2
Cleanup types file
tegan-temporal Jun 10, 2026
71d676e
Merge branch 'main' into tegan/schedules-update
tegan-temporal Jun 10, 2026
5c00370
Default month to all months
tegan-temporal Jun 10, 2026
3ace4eb
fixes
tegan-temporal Jun 11, 2026
6e006a3
Update summarize logic
tegan-temporal Jun 11, 2026
b41de5f
Fixes
tegan-temporal Jun 11, 2026
425b07a
Remove unused
tegan-temporal Jun 11, 2026
8c89ccc
Updaaaaaates
tegan-temporal Jun 11, 2026
34a4a01
Move snap to default logic outside duration-input
tegan-temporal Jun 11, 2026
f2aefb8
Attach schedule_id
tegan-temporal Jun 11, 2026
c8e19f8
add some tests and stuff
tegan-temporal Jun 11, 2026
2a9a9b6
cronString is only raw value
tegan-temporal Jun 11, 2026
1e47729
Set min height
tegan-temporal Jun 11, 2026
052c681
Mark schedule's current policy in modals
tegan-temporal Jun 11, 2026
67f5580
Fixes
tegan-temporal Jun 11, 2026
c5a5358
Reset modal state on open state change
tegan-temporal Jun 11, 2026
46cc43d
Add test for modal reset
tegan-temporal Jun 11, 2026
7f047f1
Fix backfill schedule modal
tegan-temporal Jun 11, 2026
3c1bc44
Fix schedules e2e test for redesigned form
tegan-temporal Jun 11, 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
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,7 @@
"@lezer/highlight": "^1.1.3",
"@sveltejs/package": "^2.3.10",
"class-variance-authority": "^0.7.0",
"cronstrue": "^3.14.0",
"danger": "^13.0.5",
"date-fns": "2.29.x",
"date-fns-tz": "1.3.x",
Expand Down
9 changes: 9 additions & 0 deletions pnpm-lock.yaml

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

30 changes: 17 additions & 13 deletions src/lib/components/panel.svelte
Original file line number Diff line number Diff line change
@@ -1,25 +1,29 @@
<script lang="ts">
import type { Snippet } from 'svelte';
import { twMerge } from 'tailwind-merge';

interface Props {
as?: string;
error?: boolean;
class?: string;
children?: Snippet;
}

let { error = false, class: className = '', children }: Props = $props();
let {
as = 'div',
error = false,
class: className = '',
children,
}: Props = $props();
</script>

<div class="panel surface-primary {className}" class:error>
<svelte:element
this={as}
class={twMerge(
'surface-primary border p-8 dark:border-subtle',
className,
error && 'border-danger bg-danger',
)}
>
{@render children?.()}
</div>

<style lang="postcss">
.panel {
@apply border p-8 dark:border-subtle;

&.error {
@apply border-danger bg-danger;
}
}
</style>
</svelte:element>
19 changes: 17 additions & 2 deletions src/lib/components/payload-input-with-encoding.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,10 @@
export let loading = false;
export let label = translate('workflows.input');
export let editing = true;
export let hintText: string | undefined = undefined;
export let placeholder: string | undefined = undefined;
export let payloadLabel: string | undefined = undefined;
export let copyable = false;

$: {
if ($encoding === 'json/plain' && messageType) {
Expand All @@ -28,8 +32,18 @@

<div>
<h5 class="pb-1 text-sm font-medium">{label}</h5>
<Card class="flex flex-col gap-2">
<PayloadInput bind:input bind:loading {error} {id} {editing} />
<Card class="flex flex-col gap-4">
<PayloadInput
bind:input
bind:loading
{error}
{id}
{editing}
{placeholder}
label={payloadLabel}
{hintText}
{copyable}
/>
<div
class="flex items-end gap-2 {editing ? 'justify-between' : 'justify-end'}"
>
Expand All @@ -39,6 +53,7 @@
description={translate('workflows.encoding')}
group={encoding}
name="encoding"
class="p-0"
>
<RadioInput id="json/plain" value="json/plain" label="json/plain" />
<RadioInput
Expand Down
9 changes: 7 additions & 2 deletions src/lib/components/payload-input.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@
loading?: boolean;
hintText?: string;
editing?: boolean;
placeholder?: string;
copyable?: boolean;
}

let {
Expand All @@ -25,6 +27,8 @@
loading = $bindable(false),
hintText = translate('workflows.signal-payload-input-label-hint'),
editing = true,
placeholder,
copyable = false,
}: Props = $props();

const isValidInput = (value: string) => {
Expand Down Expand Up @@ -71,12 +75,13 @@
content={input}
onchange={handleInputChange}
editable={editing}
copyable={false}
{copyable}
{placeholder}
/>
{/key}
{#if editing}
<Tooltip text={translate('common.upload-json')} topRight>
<FileInput id="{id}-input-file-upload" {onUpload} />
<FileInput class="h-full" id="{id}-input-file-upload" {onUpload} />
</Tooltip>
{/if}
</div>
Expand Down
87 changes: 87 additions & 0 deletions src/lib/components/schedule/constants.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
import {
HOURS as HOURS_UNIT,
MINUTES as MINUTES_UNIT,
SECONDS as SECONDS_UNIT,
type Unit,
} from '$lib/holocene/duration-input/duration-input.svelte';
import { translate } from '$lib/i18n/translate';
import type { OverlapPolicy } from '$lib/types/schedule';

import type { DurationString } from './types';

export const getOverlapPolicyContent = (): Record<
Exclude<OverlapPolicy, 'Unspecified'>,
{ isDefault?: boolean; label: string; description: string }
> => ({
Skip: {
isDefault: true,
label: translate('schedules.overlap-skip-label'),
description: translate('schedules.overlap-skip-description'),
},
BufferOne: {
label: translate('schedules.overlap-buffer-one-label'),
description: translate('schedules.overlap-buffer-one-description'),
},
BufferAll: {
label: translate('schedules.overlap-buffer-all-label'),
description: translate('schedules.overlap-buffer-all-description'),
},
CancelOther: {
label: translate('schedules.overlap-cancel-other-label'),
description: translate('schedules.overlap-cancel-other-description'),
},
TerminateOther: {
label: translate('schedules.overlap-terminate-other-label'),
description: translate('schedules.overlap-terminate-other-description'),
},
AllowAll: {
label: translate('schedules.overlap-allow-all-label'),
description: translate('schedules.overlap-allow-all-description'),
},
});

const MONTHS_UNIT: Unit<'month(s)'> = {
label: 'month(s)',
convert: (n: number) => n * 31 * 24 * 60 * 60,
};

const DAYS_UNIT: Unit<'day(s)'> = {
label: 'day(s)',
convert: (n: number) => n * 24 * 60 * 60,
};

export const durationUnits = [
MONTHS_UNIT,
DAYS_UNIT,
HOURS_UNIT,
MINUTES_UNIT,
SECONDS_UNIT,
];

export const intervalUnits = [
DAYS_UNIT,
HOURS_UNIT,
MINUTES_UNIT,
SECONDS_UNIT,
];

export const DAYS_OF_WEEK = [0, 1, 2, 3, 4, 5, 6] as const;

export const DAYS_OF_MONTH = [
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22,
23, 24, 25, 26, 27, 28, 29, 30, 31,
] as const;

export const MONTHS = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] as const;

export const WEEKDAYS = [1, 2, 3, 4, 5] as const;
export const WEEKEND = [0, 6] as const;

const SECONDS_PER_DAY = 86400;
const SECONDS_PER_YEAR = 365 * SECONDS_PER_DAY;

export const MIN_CATCHUP_SECONDS = 10;
export const DEFAULT_CATCHUP_WINDOW: DurationString = `${SECONDS_PER_YEAR}s`;
export const DEFAULT_TASK_TIMEOUT: DurationString = '30s';
export const DEFAULT_RUN_TIMEOUT: DurationString = '120s';
export const DEFAULT_EXECUTION_TIMEOUT: DurationString = '14400s';
Loading
Loading