Skip to content

Commit f4f9bfc

Browse files
authored
Refactor out payload inputs to its own component and add encoding field (#2370)
* Refactor out payload inputs to its own component and add encoding field to set encoding * Pass encoding to workflow start * Use RadioGroup for encoding type * Add upload file button to payload-input, base64 decode all payloads * Update e2e test with new id
1 parent 7757a34 commit f4f9bfc

File tree

17 files changed

+189
-121
lines changed

17 files changed

+189
-121
lines changed
Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
<script context="module" lang="ts">
2+
export type PayloadInputEncoding = 'json/plain' | 'json/protobuf';
3+
</script>
4+
5+
<script lang="ts">
6+
import { type Writable } from 'svelte/store';
7+
8+
import { onDestroy } from 'svelte';
9+
10+
import Alert from '$lib/holocene/alert.svelte';
11+
import Card from '$lib/holocene/card.svelte';
12+
import CodeBlock from '$lib/holocene/code-block.svelte';
13+
import FileInput from '$lib/holocene/file-input.svelte';
14+
import Label from '$lib/holocene/label.svelte';
15+
import RadioGroup from '$lib/holocene/radio-input/radio-group.svelte';
16+
import RadioInput from '$lib/holocene/radio-input/radio-input.svelte';
17+
import Tooltip from '$lib/holocene/tooltip.svelte';
18+
import { translate } from '$lib/i18n/translate';
19+
20+
export let input: string;
21+
export let encoding: Writable<PayloadInputEncoding>;
22+
export let error = false;
23+
export let resetValues = false;
24+
25+
let codeBlock: CodeBlock;
26+
let uploaded = false;
27+
28+
$: error = !isValidInput(input);
29+
30+
$: {
31+
if (resetValues) {
32+
clearValues();
33+
}
34+
}
35+
36+
const handleInputChange = (event: CustomEvent<string>): void => {
37+
input = event.detail;
38+
};
39+
40+
const isValidInput = (value: string) => {
41+
if (!input) return true;
42+
try {
43+
JSON.parse(value);
44+
return true;
45+
} catch (e) {
46+
return false;
47+
}
48+
};
49+
50+
const clearValues = () => {
51+
$encoding = 'json/plain';
52+
input = '';
53+
codeBlock?.resetView(input);
54+
uploaded = false;
55+
};
56+
57+
const onUpload = (uploadInput: string) => {
58+
input = uploadInput;
59+
uploaded = true;
60+
};
61+
62+
onDestroy(() => {
63+
clearValues();
64+
});
65+
</script>
66+
67+
<div class="flex items-center justify-between">
68+
<h5>Input</h5>
69+
<span class="text-xs font-light italic">
70+
{translate('workflows.signal-payload-input-label-hint')}
71+
</span>
72+
</div>
73+
<Card class="flex flex-col gap-2">
74+
<div class="flex items-center justify-between">
75+
<RadioGroup description={'Encoding'} bind:group={encoding} name="encoding">
76+
<RadioInput id="json/plain" value="json/plain" label="json/plain" />
77+
<RadioInput
78+
id="json/protobuf"
79+
value="json/protobuf"
80+
label="json/protobuf"
81+
/>
82+
</RadioGroup>
83+
<Tooltip text={translate('common.upload-json')} left>
84+
<FileInput id="start-workflow-input-file-upload" {onUpload} />
85+
</Tooltip>
86+
</div>
87+
<div class="flex flex-col gap-2">
88+
<Label
89+
for="payload-input"
90+
label={translate('workflows.signal-payload-input-label')}
91+
/>
92+
{#key uploaded}
93+
<CodeBlock
94+
id="payload-input"
95+
maxHeight={320}
96+
content={input}
97+
on:change={handleInputChange}
98+
editable
99+
copyable={false}
100+
bind:this={codeBlock}
101+
/>
102+
{/key}
103+
{#if error}
104+
<Alert intent="error" title={translate('common.input-valid-json')} />
105+
{/if}
106+
</div>
107+
</Card>

src/lib/components/schedule/schedule-form-view.svelte

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
<script lang="ts">
2+
import { writable, type Writable } from 'svelte/store';
3+
24
import { onDestroy } from 'svelte';
35
46
import { page } from '$app/stores';
@@ -24,6 +26,7 @@
2426
} from '$lib/utilities/route-for';
2527
import { writeActionsAreAllowed } from '$lib/utilities/write-actions-are-allowed';
2628
29+
import type { PayloadInputEncoding } from '../payload-input.svelte';
2730
import AddSearchAttributes from '../workflow/add-search-attributes.svelte';
2831
2932
import ScheduleInputPayload from './schedule-input-payload.svelte';
@@ -70,6 +73,7 @@
7073
let workflowId = decodedWorkflow?.workflowId ?? '';
7174
let taskQueue = decodedWorkflow?.taskQueue?.name ?? '';
7275
let input = '';
76+
let encoding: Writable<PayloadInputEncoding> = writable('json/plain');
7377
let daysOfWeek: string[] = [];
7478
let daysOfMonth: number[] = [];
7579
let months: string[] = [];
@@ -90,6 +94,7 @@
9094
workflowId,
9195
taskQueue,
9296
input,
97+
encoding: $encoding,
9398
hour,
9499
minute,
95100
second,
@@ -163,7 +168,6 @@
163168
<h1>{title}</h1>
164169
</header>
165170
<form class="mb-4 flex w-full flex-col gap-4 md:w-2/3 xl:w-1/2">
166-
<Alert intent="error" title={$error} hidden={!$error} />
167171
<div class="w-full">
168172
<Input
169173
id="name"
@@ -212,8 +216,8 @@
212216
</div>
213217
<ScheduleInputPayload
214218
bind:input
219+
bind:encoding
215220
payloads={schedule?.action?.startWorkflow?.input}
216-
error={errors['input']}
217221
/>
218222
<AddSearchAttributes
219223
bind:attributesToAdd={searchAttributesInput}
@@ -243,6 +247,7 @@
243247
>
244248
</div>
245249
</SchedulesCalendarView>
250+
<Alert intent="error" title={$error} hidden={!$error} />
246251
</form>
247252
{/if}
248253
</div>
Lines changed: 15 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,45 +1,34 @@
11
<script lang="ts">
2-
import CodeBlock from '$lib/holocene/code-block.svelte';
3-
import Label from '$lib/holocene/label.svelte';
4-
import { translate } from '$lib/i18n/translate';
2+
import type { Writable } from 'svelte/store';
3+
54
import type { Payloads } from '$lib/types';
5+
import { atob } from '$lib/utilities/atob';
66
import { getSinglePayload } from '$lib/utilities/encode-payload';
77
88
import PayloadDecoder from '../event/payload-decoder.svelte';
9+
import PayloadInput, {
10+
type PayloadInputEncoding,
11+
} from '../payload-input.svelte';
912
1013
export let input: string;
14+
export let encoding: Writable<PayloadInputEncoding>;
1115
export let payloads: Payloads;
12-
export let error = false;
1316
14-
const handleInputChange = (event: CustomEvent<string>) => {
15-
input = event.detail;
16-
};
17+
let loading = true;
1718
1819
const setInitialInput = (decodedValue: string): void => {
1920
input = getSinglePayload(decodedValue);
21+
$encoding = atob(
22+
String(payloads?.payloads[0]?.metadata?.encoding ?? 'json/plain'),
23+
) as PayloadInputEncoding;
24+
loading = false;
2025
};
2126
</script>
2227

2328
<div class="flex flex-col gap-1">
24-
<Label for="schedule-input" label={translate('workflows.input')} />
25-
<PayloadDecoder
26-
value={payloads}
27-
let:decodedValue
28-
key="payloads"
29-
onDecode={setInitialInput}
30-
>
31-
{#key decodedValue}
32-
<CodeBlock
33-
id="schedule-input"
34-
maxHeight={320}
35-
content={getSinglePayload(decodedValue)}
36-
on:change={handleInputChange}
37-
editable
38-
copyable={false}
39-
/>
29+
<PayloadDecoder value={payloads} key="payloads" onDecode={setInitialInput}>
30+
{#key loading}
31+
<PayloadInput bind:input bind:encoding />
4032
{/key}
4133
</PayloadDecoder>
42-
<span class="text-xs font-light italic" class:text-red-700={error}>
43-
{translate('workflows.signal-payload-input-label-hint')}
44-
</span>
4534
</div>

src/lib/components/workflow/client-actions/signal-confirmation-modal.svelte

Lines changed: 9 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
<script lang="ts">
2-
import type { Writable } from 'svelte/store';
2+
import { writable, type Writable } from 'svelte/store';
33
4-
import CodeBlock from '$lib/holocene/code-block.svelte';
4+
import PayloadInput, {
5+
type PayloadInputEncoding,
6+
} from '$lib/components/payload-input.svelte';
57
import Input from '$lib/holocene/input/input.svelte';
68
import Modal from '$lib/holocene/modal.svelte';
79
import { translate } from '$lib/i18n/translate';
@@ -18,14 +20,13 @@
1820
let error: string = '';
1921
let loading = false;
2022
let name = '';
23+
24+
let encoding: Writable<PayloadInputEncoding> = writable('json/plain');
2125
let input = '';
22-
let codeBlock: CodeBlock;
2326
2427
const hideSignalModal = () => {
2528
open = false;
26-
input = '';
2729
name = '';
28-
codeBlock?.resetView(input);
2930
};
3031
3132
const signal = async () => {
@@ -36,6 +37,7 @@
3637
namespace,
3738
workflow,
3839
input,
40+
encoding: $encoding,
3941
name,
4042
});
4143
$refresh = Date.now();
@@ -52,10 +54,6 @@
5254
loading = false;
5355
}
5456
};
55-
56-
const handleInputChange = (event: CustomEvent<string>): void => {
57-
input = event.detail;
58-
};
5957
</script>
6058

6159
<Modal
@@ -66,7 +64,7 @@
6664
{loading}
6765
confirmText={translate('common.submit')}
6866
cancelText={translate('common.cancel')}
69-
confirmDisabled={!name}
67+
confirmDisabled={!name || !encoding}
7068
on:cancelModal={hideSignalModal}
7169
on:confirmModal={signal}
7270
>
@@ -78,21 +76,6 @@
7876
required
7977
bind:value={name}
8078
/>
81-
<div>
82-
<span class="text-sm font-medium"
83-
>{translate('workflows.signal-payload-input-label')}</span
84-
>
85-
<span class="text-xs font-light italic">
86-
{translate('workflows.signal-payload-input-label-hint')}
87-
</span>
88-
<CodeBlock
89-
maxHeight={320}
90-
content={input}
91-
on:change={handleInputChange}
92-
editable
93-
copyable={false}
94-
bind:this={codeBlock}
95-
/>
96-
</div>
79+
<PayloadInput bind:input bind:encoding resetValues={!open} />
9780
</div>
9881
</Modal>

src/lib/holocene/file-input.svelte

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
export let accept = '.json';
88
export let onUpload: (input: string) => void;
99
10-
const onFileSelect = async (e: Event) => {
10+
const onFileSelect = (e: Event) => {
1111
const target = e.target as HTMLInputElement;
1212
const file = target?.files?.[0];
1313
const reader = new FileReader();

src/lib/i18n/locales/en/workflows.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ export const Strings = {
103103
'Are you sure you want to terminate this workflow? This action cannot be undone.',
104104
'signal-modal-title': 'Send a Signal',
105105
'signal-name-label': 'Signal name',
106-
'signal-payload-input-label': 'Input',
106+
'signal-payload-input-label': 'Data',
107107
'signal-payload-input-label-hint': '(only single JSON payload supported)',
108108
'cancel-request-sent': 'Cancel Request Sent',
109109
'cancel-request-sent-description':

src/lib/pages/schedule-edit.svelte

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
workflowId,
3737
taskQueue,
3838
input,
39+
encoding,
3940
hour,
4041
minute,
4142
second,
@@ -54,6 +55,7 @@
5455
workflowId,
5556
taskQueue,
5657
input,
58+
encoding,
5759
searchAttributes,
5860
};
5961
const spec: Partial<ScheduleSpecParameters> = {

src/lib/pages/schedules-create.svelte

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
workflowId,
2424
taskQueue,
2525
input,
26+
encoding,
2627
hour,
2728
minute,
2829
second,
@@ -42,6 +43,7 @@
4243
workflowId,
4344
taskQueue,
4445
input,
46+
encoding,
4547
searchAttributes,
4648
};
4749
const spec: Partial<ScheduleSpecParameters> = {

0 commit comments

Comments
 (0)