refactor ActionItem

This commit is contained in:
Alex Tran
2025-12-05 16:47:46 +00:00
parent 1e238e7a48
commit 76ec9e3ebf
4 changed files with 19 additions and 21 deletions

View File

@@ -8,6 +8,7 @@ import type {
SharedLinkResponseDto,
SystemConfigDto,
UserAdminResponseDto,
WorkflowResponseDto,
} from '@immich/sdk';
export type Events = {
@@ -42,6 +43,9 @@ export type Events = {
LibraryUpdate: [LibraryResponseDto];
LibraryDelete: [{ id: string }];
WorkflowUpdate: [WorkflowResponseDto];
WorkflowDelete: [WorkflowResponseDto];
ReleaseEvent: [ReleaseEvent];
};

View File

@@ -1,5 +1,6 @@
import { goto } from '$app/navigation';
import { AppRoute } from '$lib/constants';
import { eventManager } from '$lib/managers/event-manager.svelte';
import { handleError } from '$lib/utils/handle-error';
import { getFormatter } from '$lib/utils/i18n';
import {
@@ -377,6 +378,7 @@ export const handleToggleWorkflowEnabled = async (
workflowUpdateDto: { enabled: !workflow.enabled },
});
eventManager.emit('WorkflowUpdate', updated);
toastManager.success($t('workflow_updated'));
return updated;
} catch (error) {
@@ -398,6 +400,7 @@ export const handleDeleteWorkflow = async (workflow: WorkflowResponseDto): Promi
try {
await deleteWorkflow({ id: workflow.id });
eventManager.emit('WorkflowDelete', workflow);
toastManager.success($t('workflow_deleted'));
return true;
} catch (error) {

View File

@@ -1,13 +1,12 @@
<script lang="ts">
import emptyWorkflows from '$lib/assets/empty-workflows.svg';
import UserPageLayout from '$lib/components/layouts/user-page-layout.svelte';
import OnEvents from '$lib/components/OnEvents.svelte';
import EmptyPlaceholder from '$lib/components/shared-components/empty-placeholder.svelte';
import {
getWorkflowActions,
getWorkflowShowSchemaAction,
handleCreateWorkflow,
handleDeleteWorkflow,
handleToggleWorkflowEnabled,
type WorkflowPayload,
} from '$lib/services/workflow.service';
import type { PluginFilterResponseDto, WorkflowResponseDto } from '@immich/sdk';
@@ -91,18 +90,14 @@
const getJson = (workflow: WorkflowResponseDto) => JSON.stringify(constructPayload(workflow), null, 2);
const onToggleEnabled = async (workflow: WorkflowResponseDto) => {
const updated = await handleToggleWorkflowEnabled(workflow);
if (updated) {
workflows = workflows.map((w) => (w.id === updated.id ? updated : w));
}
const onWorkflowUpdate = (updatedWorkflow: WorkflowResponseDto) => {
workflows = workflows.map((currentWorkflow) =>
currentWorkflow.id === updatedWorkflow.id ? updatedWorkflow : currentWorkflow,
);
};
const onDeleteWorkflow = async (workflow: WorkflowResponseDto) => {
const deleted = await handleDeleteWorkflow(workflow);
if (deleted) {
workflows = workflows.filter((w) => w.id !== workflow.id);
}
const onWorkflowDelete = (deletedWorkflow: WorkflowResponseDto) => {
workflows = workflows.filter((currentWorkflow) => currentWorkflow.id !== deletedWorkflow.id);
};
const getFilterLabel = (filterId: string) => {
@@ -135,22 +130,18 @@
target: event.currentTarget as HTMLElement,
position: 'top-left',
items: [
{
...ToggleEnabled,
onAction: () => void onToggleEnabled(workflow),
},
ToggleEnabled,
Edit,
getWorkflowShowSchemaAction($t, expandedWorkflows.has(workflow.id), () => toggleShowingSchema(workflow.id)),
MenuItemType.Divider,
{
...Delete,
onAction: () => void onDeleteWorkflow(workflow),
},
Delete,
],
});
};
</script>
<OnEvents {onWorkflowUpdate} {onWorkflowDelete} />
{#snippet chipItem(title: string)}
<span class="rounded-xl border border-gray-200/80 px-3 py-1.5 text-sm dark:border-gray-600 bg-light">
<span class="font-medium text-dark">{title}</span>

View File

@@ -533,7 +533,7 @@
isDragging: draggedActionIndex === index,
isDragOver: dragOverActionIndex === index,
})}
class="mb-4 cursor-move rounded-2xl border-2 p-4 transition-all bg-light-100 border-dashed hover:border-light-300"
class="mb-4 cursor-move rounded-2xl border-2 p-4 transition-all bg-light-50 border-dashed hover:border-light-300"
>
<div class="flex items-start gap-4">
{@render cardOrder(index)}