diff --git a/web/src/lib/managers/event-manager.svelte.ts b/web/src/lib/managers/event-manager.svelte.ts index f6ef83386f..223eb68888 100644 --- a/web/src/lib/managers/event-manager.svelte.ts +++ b/web/src/lib/managers/event-manager.svelte.ts @@ -73,6 +73,7 @@ export type Events = { LibraryUpdate: [LibraryResponseDto]; LibraryDelete: [{ id: string }]; + WorkflowCreate: [WorkflowResponseDto]; WorkflowUpdate: [WorkflowResponseDto]; WorkflowDelete: [WorkflowResponseDto]; diff --git a/web/src/lib/services/workflow.service.ts b/web/src/lib/services/workflow.service.ts index 1e7df5c563..96815725bb 100644 --- a/web/src/lib/services/workflow.service.ts +++ b/web/src/lib/services/workflow.service.ts @@ -17,12 +17,13 @@ import { type PluginFilterResponseDto, type PluginTriggerResponseDto, type WorkflowActionItemDto, + type WorkflowCreateDto, type WorkflowFilterItemDto, type WorkflowResponseDto, type WorkflowUpdateDto, } from '@immich/sdk'; import { modalManager, toastManager, type ActionItem } from '@immich/ui'; -import { mdiCodeJson, mdiDelete, mdiPause, mdiPencil, mdiPlay } from '@mdi/js'; +import { mdiCodeJson, mdiDelete, mdiPause, mdiPencil, mdiPlay, mdiPlus } from '@mdi/js'; import type { MessageFormatter } from 'svelte-i18n'; export type PickerSubType = 'album-picker' | 'people-picker'; @@ -318,6 +319,23 @@ export const handleUpdateWorkflow = async ( return updateWorkflow({ id: workflowId, workflowUpdateDto: updateDto }); }; +export const getWorkflowsActions = ($t: MessageFormatter) => { + const Create: ActionItem = { + title: $t('create_workflow'), + icon: mdiPlus, + onAction: () => + handleCreateWorkflow({ + name: $t('untitled_workflow'), + triggerType: PluginTriggerType.AssetCreate, + filters: [], + actions: [], + enabled: false, + }), + }; + + return { Create }; +}; + export const getWorkflowActions = ($t: MessageFormatter, workflow: WorkflowResponseDto) => { const ToggleEnabled: ActionItem = { title: workflow.enabled ? $t('disable') : $t('enable'), @@ -356,22 +374,12 @@ export const getWorkflowShowSchemaAction = ( onAction: onToggle, }); -export const handleCreateWorkflow = async (): Promise => { +const handleCreateWorkflow = async (dto: WorkflowCreateDto) => { const $t = await getFormatter(); try { - const workflow = await createWorkflow({ - workflowCreateDto: { - name: $t('untitled_workflow'), - triggerType: PluginTriggerType.AssetCreate, - filters: [], - actions: [], - enabled: false, - }, - }); - - await goto(Route.viewWorkflow(workflow)); - return workflow; + const response = await createWorkflow({ workflowCreateDto: dto }); + eventManager.emit('WorkflowCreate', response); } catch (error) { handleError(error, $t('errors.unable_to_create')); } diff --git a/web/src/routes/(user)/utilities/workflows/+page.svelte b/web/src/routes/(user)/utilities/workflows/+page.svelte index 13ab2c13fb..637858ac9c 100644 --- a/web/src/routes/(user)/utilities/workflows/+page.svelte +++ b/web/src/routes/(user)/utilities/workflows/+page.svelte @@ -1,15 +1,17 @@ - + {#snippet chipItem(title: string)} @@ -148,23 +151,14 @@ {/snippet} - - {#snippet buttons()} - - - - {/snippet} - +
{#if workflows.length === 0} Create.onAction(Create)} src={emptyWorkflows} class="mt-10 mx-auto" />