Skip to content

Commit

Permalink
DT-913 - add batch reset to UI (#1957)
Browse files Browse the repository at this point in the history
* add batch reset

* clean up

* fix incorrect placeholder

* fix tests

* rm whitespace

* Check for rc in minimumVersion

* fix batch reset confirmation toast

---------

Co-authored-by: Alex Tideman <[email protected]>
  • Loading branch information
rossedfort and Alex-Tideman authored Apr 15, 2024
1 parent bdd9284 commit 1a233d5
Show file tree
Hide file tree
Showing 16 changed files with 313 additions and 117 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
import { batchCancelWorkflows } from '$lib/services/batch-service';
import { authUser } from '$lib/stores/auth-user';
import { toaster } from '$lib/stores/toaster';
import { workflowsQuery } from '$lib/stores/workflows';
import { isNetworkError } from '$lib/utilities/is-network-error';
import { getPlacholder } from '$lib/utilities/workflow-actions';
Expand All @@ -29,7 +30,7 @@
let jobIdPlaceholder = v4();
let error = '';
const { allSelected, cancelableWorkflows, query } =
const { allSelected, cancelableWorkflows } =
getContext<BatchOperationContext>(BATCH_OPERATION_CONTEXT);
const resetForm = () => {
Expand All @@ -48,7 +49,7 @@
reason: $reason || reasonPlaceholder,
jobId: $jobId || jobIdPlaceholder,
...($allSelected
? { query: $query }
? { query: $workflowsQuery }
: { workflows: $cancelableWorkflows }),
};
try {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
<script lang="ts">
import { derived, type Readable } from 'svelte/store';
import { getContext } from 'svelte';
import Input from '$lib/holocene/input/input.svelte';
Expand All @@ -9,6 +11,7 @@
BATCH_OPERATION_CONTEXT,
type BatchOperationContext,
} from '$lib/pages/workflows-with-new-search.svelte';
import { workflowsQuery } from '$lib/stores/workflows';
export let action: Action;
export let reason: string;
Expand All @@ -17,24 +20,49 @@
export let jobIdPlaceholder: string;
export let jobIdValid: boolean;
const { allSelected, query, terminableWorkflows, cancelableWorkflows } =
getContext<BatchOperationContext>(BATCH_OPERATION_CONTEXT);
const {
allSelected,
terminableWorkflows,
cancelableWorkflows,
selectedWorkflows,
} = getContext<BatchOperationContext>(BATCH_OPERATION_CONTEXT);
$: actionText = getActionText(action);
$: operableWorkflowsCount = getOperableWorkflowsCount(action);
$: actionText =
action === Action.Cancel
? translate('common.cancel')
: translate('workflows.terminate');
$: operableWorkflowsCount =
action === Action.Terminate
? $terminableWorkflows.length
: $cancelableWorkflows.length;
const getActionText = (action: Action): string => {
switch (action) {
case Action.Cancel:
return translate('common.cancel');
case Action.Terminate:
return translate('workflows.terminate');
case Action.Reset:
return translate('workflows.reset');
}
};
const getOperableWorkflowsCount = (action: Action): Readable<number> => {
return derived(
[cancelableWorkflows, terminableWorkflows, selectedWorkflows],
([$cancelable, $terminable, $selected]) => {
switch (action) {
case Action.Cancel:
return $cancelable.length;
case Action.Terminate:
return $terminable.length;
case Action.Reset:
return $selected.length;
}
},
);
};
const handleJobIdChange = (event: Event & { target: HTMLInputElement }) => {
jobIdValid = /^[\w.~-]*$/.test(event.target.value);
};
</script>

<div class="mb-4 flex flex-col gap-2">
<div class="mb-4 flex flex-col gap-4">
{#if $allSelected}
<p class="mb-2">
<Translate
Expand All @@ -46,7 +74,7 @@
class="mb-2 overflow-scroll whitespace-nowrap rounded border border-primary bg-badge p-2"
>
<code data-testid="batch-action-workflows-query">
{$query}
{$workflowsQuery}
</code>
</div>
<span class="text-xs">
Expand All @@ -57,12 +85,18 @@
</span>
{:else}
<p>
<Translate
key={action === Action.Cancel
? 'workflows.batch-cancel-confirmation'
: 'workflows.batch-terminate-confirmation'}
count={operableWorkflowsCount}
/>
{#if action === Action.Reset}
<Translate
key="workflows.batch-reset-confirmation"
count={$operableWorkflowsCount}
/>
{:else}
<Translate
key="workflows.batch-confirmation"
replace={{ action: actionText }}
count={$operableWorkflowsCount}
/>
{/if}
</p>
{/if}
<Input
Expand All @@ -85,4 +119,5 @@
on:input={handleJobIdChange}
valid={jobIdValid}
/>
<slot />
</div>
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
<script lang="ts">
import { writable } from 'svelte/store';
import { getContext } from 'svelte';
import { v4 } from 'uuid';
import Modal from '$lib/holocene/modal.svelte';
import RadioGroup from '$lib/holocene/radio-input/radio-group.svelte';
import RadioInput from '$lib/holocene/radio-input/radio-input.svelte';
import { translate } from '$lib/i18n/translate';
import Translate from '$lib/i18n/translate.svelte';
import { Action } from '$lib/models/workflow-actions';
import {
BATCH_OPERATION_CONTEXT,
type BatchOperationContext,
} from '$lib/pages/workflows-with-new-search.svelte';
import { batchResetWorkflows } from '$lib/services/batch-service';
import { authUser } from '$lib/stores/auth-user';
import { toaster } from '$lib/stores/toaster';
import { workflowsQuery } from '$lib/stores/workflows';
import { isNetworkError } from '$lib/utilities/is-network-error';
import { getPlacholder } from '$lib/utilities/workflow-actions';
import BatchOperationConfirmationForm from './batch-operation-confirmation-form.svelte';
export let namespace: string;
export let open = false;
let error = '';
let jobIdPlaceholder = v4();
let resetType = writable<'first' | 'last'>();
const reason = writable('');
const reasonPlaceholder = getPlacholder(Action.Reset, $authUser.email);
const jobId = writable('');
const jobIdValid = writable(true);
const { allSelected, selectedWorkflows } = getContext<BatchOperationContext>(
BATCH_OPERATION_CONTEXT,
);
const resetForm = () => {
$reason = '';
$jobId = '';
$jobIdValid = true;
jobIdPlaceholder = v4();
};
$: if (open) resetForm();
const resetWorkflows = async () => {
error = '';
const options = {
namespace,
reason: $reason || reasonPlaceholder,
jobId: $jobId || jobIdPlaceholder,
resetType: $resetType,
...($allSelected
? { query: $workflowsQuery }
: { workflows: $selectedWorkflows }),
};
try {
await batchResetWorkflows(options);
open = false;
resetForm();
toaster.push({
message: translate('workflows.batch-reset-all-success'),
id: 'batch-reset-success-toast',
});
} catch (err) {
error = isNetworkError(err)
? err.message
: translate('common.unknown-error');
}
};
</script>

<Modal
cancelText={translate('common.cancel')}
confirmText={translate('workflows.reset')}
bind:error
bind:open
id="batch-reset-confirmation-modal"
on:confirmModal={resetWorkflows}
confirmType="destructive"
>
<h3 slot="title">
<Translate key="workflows.batch-reset-modal-title" />
</h3>
<svelte:fragment slot="content">
<BatchOperationConfirmationForm
bind:reason={$reason}
bind:jobId={$jobId}
bind:jobIdValid={$jobIdValid}
{jobIdPlaceholder}
{reasonPlaceholder}
action={Action.Reset}
>
<RadioGroup
description={translate('workflows.reset-event-radio-group-description')}
bind:group={resetType}
name="reset-event"
>
<RadioInput
id="reset-event-first"
value="first"
label="First Workflow task"
/>
<RadioInput
id="reset-event-last"
value="last"
label="Last Workflow task"
/>
</RadioGroup>
</BatchOperationConfirmationForm>
</svelte:fragment>
</Modal>
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
import { batchTerminateWorkflows } from '$lib/services/batch-service';
import { authUser } from '$lib/stores/auth-user';
import { toaster } from '$lib/stores/toaster';
import { workflowsQuery } from '$lib/stores/workflows';
import { isNetworkError } from '$lib/utilities/is-network-error';
import { getPlacholder } from '$lib/utilities/workflow-actions';
Expand All @@ -23,13 +24,13 @@
export let namespace: string;
export let open: boolean;
const reason = writable('');
const reasonPlaceholder = getPlacholder(Action.Cancel, $authUser.email);
const reasonPlaceholder = getPlacholder(Action.Terminate, $authUser.email);
const jobId = writable('');
const jobIdValid = writable(true);
let jobIdPlaceholder = v4();
let error = '';
const { allSelected, terminableWorkflows, query } =
const { allSelected, terminableWorkflows } =
getContext<BatchOperationContext>(BATCH_OPERATION_CONTEXT);
const resetForm = () => {
Expand All @@ -49,7 +50,7 @@
reason: $reason || reasonPlaceholder,
jobId: $jobId || jobIdPlaceholder,
...($allSelected
? { query: $query }
? { query: $workflowsQuery }
: { workflows: $terminableWorkflows }),
};
await batchTerminateWorkflows(options);
Expand Down
Loading

0 comments on commit 1a233d5

Please sign in to comment.