Skip to content

Commit b7579f5

Browse files
committed
secrets: add cancel buttons to modals, make buttons no-op instead of pop-in/out, error handling
1 parent d1b9acd commit b7579f5

File tree

4 files changed

+82
-48
lines changed

4 files changed

+82
-48
lines changed

src/routes/team/[team]/(teamTabs)/secrets/+page.svelte

-1
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,6 @@
6464
</div>
6565

6666
<CreateSecret
67-
refetch={() => Secrets.fetch({})}
6867
existingNames={secrets.map((s) => s.name)}
6968
bind:open={createSecretOpen[environment.name]}
7069
env={environment.name}

src/routes/team/[team]/(teamTabs)/secrets/CreateSecret.svelte

+17-7
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
export let open: boolean;
77
export let team: string;
88
export let env: string;
9-
export let refetch: () => void;
109
export let existingNames: string[];
1110
1211
let name = '';
@@ -30,6 +29,10 @@
3029
`);
3130
3231
const create = async () => {
32+
if (validationError(name).length > 0 && name.length > 0) {
33+
return;
34+
}
35+
3336
await createSecret.mutate({
3437
name: name,
3538
team: team,
@@ -42,11 +45,15 @@
4245
const secretPage = '/team/' + team + '/' + env + '/secret/' + name
4346
name = '';
4447
open = false;
45-
refetch();
4648
await goto(secretPage);
4749
}
4850
};
4951
52+
const cancel = () => {
53+
name = '';
54+
open = false;
55+
};
56+
5057
const validationError = (name: string) => {
5158
if (!name) {
5259
return '';
@@ -76,7 +83,7 @@
7683
};
7784
</script>
7885

79-
<Modal bind:open width="small">
86+
<Modal bind:open width="small" on:close={cancel}>
8087
<svelte:fragment slot="header">
8188
<Heading>Create new secret</Heading>
8289
<p>The secret will be created in <b>{env}</b></p>
@@ -86,13 +93,16 @@
8693
<svelte:fragment slot="label">Name</svelte:fragment>
8794
</TextField>
8895
{#if $createSecret.errors}
89-
<Alert variant="error">{$createSecret.errors[0].message}</Alert>
96+
<Alert variant="error">
97+
{#each $createSecret.errors as error}
98+
{error.message}
99+
{/each}
100+
</Alert>
90101
{/if}
91102
</div>
92103
<svelte:fragment slot="footer">
93-
{#if validationError(name).length === 0 && name.length > 0}
94-
<Button variant="primary" size="small" on:click={create}>Create</Button>
95-
{/if}
104+
<Button variant="secondary" size="small" on:click={cancel}>Cancel</Button>
105+
<Button variant="primary" size="small" on:click={create}>Create</Button>
96106
</svelte:fragment>
97107
</Modal>
98108

src/routes/team/[team]/[env]/secret/[secret]/+page.svelte

+50-34
Original file line numberDiff line numberDiff line change
@@ -30,13 +30,13 @@
3030
$: env = $page.params.env;
3131
$: team = $page.params.team;
3232
33-
$: applicationManifest = `spec:
34-
envFrom:
35-
- secret: ${secretName}`;
36-
3733
let changes: operation[] = [];
3834
let deleteSecretOpen = false;
3935
36+
const applicationManifest = (secretName: string) => `spec:
37+
envFrom:
38+
- secret: ${secretName}`;
39+
4040
const discardChanges = () => {
4141
changes = [];
4242
Secret.fetch();
@@ -64,7 +64,7 @@
6464
}
6565
`);
6666
const updateSecret = async () => {
67-
if (!secret) return;
67+
if (!secret || changes.length == 0) return;
6868
6969
let data: VariableInput[] = changes.reduce(mergeChanges, secret.data);
7070
@@ -75,8 +75,11 @@
7575
team: team
7676
});
7777
78+
if ($updateSecretMutation.errors) {
79+
return;
80+
}
81+
7882
changes = [];
79-
await Secret.fetch();
8083
};
8184
8285
const deleteSecretMutation = graphql(`
@@ -91,28 +94,27 @@
9194
team: team,
9295
env: env
9396
});
97+
98+
if ($deleteSecretMutation.errors) {
99+
return;
100+
}
101+
94102
await goto('/team/' + team + '/secrets');
95103
};
96104
97-
const toggleDeleteSecretOpen = () => {
98-
deleteSecretOpen = !deleteSecretOpen;
105+
const openDeleteSecretModal = () => {
106+
deleteSecretOpen = true;
99107
};
100108
</script>
101109

102110
<svelte:head><title>{team} - Console</title></svelte:head>
103111

104-
{#if secretName}
105-
<h3>
106-
<a href="/team/{team}">{team}</a> /
107-
<a href="/team/{team}/secrets">secrets</a> /
108-
{env} /
109-
<i><a href="/team/{team}/{env}/secret/{secretName}">{secretName}</a></i>
110-
</h3>
111-
{:else}
112-
<h3>
113-
<a href="/team/{team}">{team}</a> / <a href="/team/{team}/secrets">secrets</a> / {env}
114-
</h3>
115-
{/if}
112+
<h3>
113+
<a href="/team/{team}">{team}</a> /
114+
<a href="/team/{team}/secrets">secrets</a> /
115+
{env} /
116+
<i><a href="/team/{team}/{env}/secret/{secretName}">{secretName}</a></i>
117+
</h3>
116118

117119
{#if $Secret.errors}
118120
<Alert variant="error">
@@ -131,7 +133,7 @@
131133
<HelpText title="Secret data" placement="right">
132134
A secret contains a set of key-value pairs.<br />
133135
<br />
134-
Changes are not persisted until the "Confirm" button is clicked.<br />
136+
Changes are not persisted until the "Save" button is clicked.<br />
135137
Applications using the secret will automatically restart to pick up any changes.
136138
<br />
137139
</HelpText>
@@ -141,7 +143,7 @@
141143
class="delete-secret"
142144
variant="danger"
143145
size="small"
144-
on:click={toggleDeleteSecretOpen}
146+
on:click={openDeleteSecretModal}
145147
>
146148
Delete
147149
</Button>
@@ -166,6 +168,11 @@
166168
<Tbody>
167169
<div class="secret-content">
168170
<div class="secret-edit">
171+
{#if secret.data.length === 0 && filterAddKvs(changes).length === 0}
172+
<Alert variant="info" size="small">
173+
No data found. Add a new row to get started.
174+
</Alert>
175+
{/if}
169176
{#each secret.data as data (data.name)}
170177
<SecretKv key={data.name} value={data.value} bind:changes />
171178
{/each}
@@ -175,17 +182,26 @@
175182
<AddSecretKv bind:changes existingKeys={secret.data.map((d) => d.name)} />
176183
</div>
177184
<div class="secret-edit-buttons">
178-
{#if changes.length > 0}
179-
<Tooltip content="Persist all changes" arrow={false}>
180-
<Button variant="primary" size="small" on:click={updateSecret}>Confirm</Button>
181-
</Tooltip>
182-
<Tooltip content="Discard all changes" arrow={false}>
183-
<Button variant="secondary" size="small" on:click={discardChanges}>Cancel</Button>
184-
</Tooltip>
185-
{/if}
185+
<Tooltip content="Persist all changes" arrow={false}>
186+
<Button variant="primary" size="small" on:click={updateSecret}>Save</Button>
187+
</Tooltip>
188+
<Tooltip content="Discard all changes" arrow={false}>
189+
<Button variant="secondary" size="small" on:click={discardChanges}>Cancel</Button>
190+
</Tooltip>
186191
</div>
187192
{#if $updateSecretMutation.errors}
188-
<Alert variant="error">{$updateSecretMutation.errors[0]?.message}</Alert>
193+
<Alert variant="error">
194+
{#each $updateSecretMutation.errors as error}
195+
{error.message}
196+
{/each}
197+
</Alert>
198+
{/if}
199+
{#if $deleteSecretMutation.errors}
200+
<Alert variant="error">
201+
{#each $deleteSecretMutation.errors as error}
202+
{error.message}
203+
{/each}
204+
</Alert>
189205
{/if}
190206
</div>
191207
</Tbody>
@@ -242,13 +258,13 @@
242258
as environment variables.
243259
</HelpText>
244260
</h4>
245-
<pre class="manifest">{applicationManifest}</pre>
261+
<pre class="manifest">{applicationManifest(secretName)}</pre>
246262
<Tooltip content="Copy manifest to clipboard">
247263
<CopyButton
248264
text="Copy manifest"
249265
activeText="Manifest copied"
250266
variant="action"
251-
copyText={applicationManifest}
267+
copyText={applicationManifest(secretName)}
252268
></CopyButton>
253269
</Tooltip>
254270
</Card>
@@ -301,7 +317,7 @@
301317
}
302318
303319
.secret-edit-buttons {
304-
margin: 16px 0 0 16px;
320+
margin: 32px 0 0 16px;
305321
padding: 32px 0;
306322
}
307323

src/routes/team/[team]/[env]/secret/[secret]/AddSecretKv.svelte

+15-6
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,10 @@
88
99
let addKv = () => {
1010
if (key && value) {
11+
if (validationError(key).length > 0) {
12+
return
13+
}
14+
1115
changes = [
1216
...changes,
1317
{
@@ -48,8 +52,14 @@
4852
let value: string | undefined;
4953
let open: boolean = false;
5054
51-
const toggleOpen = () => {
52-
open = !open;
55+
const openAddKvModal = () => {
56+
open = true;
57+
};
58+
59+
const cancel = () => {
60+
open = false;
61+
key = undefined;
62+
value = undefined;
5363
};
5464
</script>
5565

@@ -66,15 +76,14 @@
6676
</TextField>
6777
</div>
6878
<svelte:fragment slot="footer">
69-
{#if validationError(key).length === 0 && key && key.length > 0}
70-
<Button variant="primary" size="small" on:click={addKv}>Add</Button>
71-
{/if}
79+
<Button variant="secondary" size="small" on:click={cancel}>Cancel</Button>
80+
<Button variant="primary" size="small" on:click={addKv}>Add</Button>
7281
</svelte:fragment>
7382
</Modal>
7483

7584
<div class="buttons">
7685
<Tooltip content="Add new key and value">
77-
<Button variant="tertiary" size="small" on:click={toggleOpen}>
86+
<Button variant="tertiary" size="small" on:click={openAddKvModal}>
7887
<svelte:fragment slot="icon-left">
7988
<PlusCircleFillIcon />
8089
</svelte:fragment>

0 commit comments

Comments
 (0)