mirror of
https://github.com/immich-app/immich.git
synced 2026-05-21 23:26:31 -04:00
3d075f2bf8
feat: plugins chore: better types feat: plugins
122 lines
3.5 KiB
TypeScript
122 lines
3.5 KiB
TypeScript
import {
|
|
createWorkflow,
|
|
deleteWorkflow,
|
|
updateWorkflow,
|
|
WorkflowTrigger,
|
|
type AlbumResponseDto,
|
|
type PersonResponseDto,
|
|
type WorkflowCreateDto,
|
|
type WorkflowResponseDto,
|
|
type WorkflowUpdateDto,
|
|
} from '@immich/sdk';
|
|
import { modalManager, toastManager, type ActionItem } from '@immich/ui';
|
|
import { mdiCodeJson, mdiDelete, mdiPause, mdiPencil, mdiPlay, mdiPlus } from '@mdi/js';
|
|
import type { MessageFormatter } from 'svelte-i18n';
|
|
import { goto } from '$app/navigation';
|
|
import { eventManager } from '$lib/managers/event-manager.svelte';
|
|
import { Route } from '$lib/route';
|
|
import { handleError } from '$lib/utils/handle-error';
|
|
import { getFormatter } from '$lib/utils/i18n';
|
|
|
|
export type PickerSubType = 'album-picker' | 'people-picker';
|
|
export type PickerMetadata = AlbumResponseDto | PersonResponseDto | AlbumResponseDto[] | PersonResponseDto[];
|
|
|
|
export const getWorkflowsActions = ($t: MessageFormatter) => {
|
|
const Create: ActionItem = {
|
|
title: $t('create_workflow'),
|
|
icon: mdiPlus,
|
|
onAction: () =>
|
|
handleCreateWorkflow({
|
|
trigger: WorkflowTrigger.AssetCreate,
|
|
steps: [],
|
|
enabled: false,
|
|
}),
|
|
};
|
|
|
|
return { Create };
|
|
};
|
|
|
|
export const getWorkflowActions = ($t: MessageFormatter, workflow: WorkflowResponseDto) => {
|
|
const ToggleEnabled: ActionItem = {
|
|
title: workflow.enabled ? $t('disable') : $t('enable'),
|
|
icon: workflow.enabled ? mdiPause : mdiPlay,
|
|
color: workflow.enabled ? 'danger' : 'primary',
|
|
onAction: () => handleUpdateWorkflow(workflow.id, { enabled: !workflow.enabled }),
|
|
};
|
|
|
|
const Edit: ActionItem = {
|
|
title: $t('edit'),
|
|
icon: mdiPencil,
|
|
onAction: () => goto(Route.viewWorkflow(workflow)),
|
|
};
|
|
|
|
const Delete: ActionItem = {
|
|
title: $t('delete'),
|
|
icon: mdiDelete,
|
|
color: 'danger',
|
|
onAction: async () => {
|
|
await handleDeleteWorkflow(workflow);
|
|
},
|
|
};
|
|
|
|
return { ToggleEnabled, Edit, Delete };
|
|
};
|
|
|
|
export const getWorkflowShowSchemaAction = (
|
|
$t: MessageFormatter,
|
|
isExpanded: boolean,
|
|
onToggle: () => void,
|
|
): ActionItem => ({
|
|
title: isExpanded ? $t('hide_schema') : $t('show_schema'),
|
|
icon: mdiCodeJson,
|
|
onAction: onToggle,
|
|
});
|
|
|
|
const handleCreateWorkflow = async (dto: WorkflowCreateDto) => {
|
|
const $t = await getFormatter();
|
|
|
|
try {
|
|
const response = await createWorkflow({ workflowCreateDto: dto });
|
|
eventManager.emit('WorkflowCreate', response);
|
|
} catch (error) {
|
|
handleError(error, $t('errors.unable_to_create'));
|
|
}
|
|
};
|
|
|
|
export const handleUpdateWorkflow = async (id: string, dto: WorkflowUpdateDto) => {
|
|
const $t = await getFormatter();
|
|
|
|
try {
|
|
const response = await updateWorkflow({ id, workflowUpdateDto: dto });
|
|
eventManager.emit('WorkflowUpdate', response);
|
|
toastManager.primary($t('workflow_update_success'), { closable: true });
|
|
return true;
|
|
} catch (error) {
|
|
handleError(error, $t('errors.unable_to_update_workflow'));
|
|
return false;
|
|
}
|
|
};
|
|
|
|
export const handleDeleteWorkflow = async (workflow: WorkflowResponseDto): Promise<boolean> => {
|
|
const $t = await getFormatter();
|
|
|
|
const confirmed = await modalManager.showDialog({
|
|
prompt: $t('workflow_delete_prompt'),
|
|
confirmColor: 'danger',
|
|
});
|
|
|
|
if (!confirmed) {
|
|
return false;
|
|
}
|
|
|
|
try {
|
|
await deleteWorkflow({ id: workflow.id });
|
|
eventManager.emit('WorkflowDelete', workflow);
|
|
toastManager.primary($t('workflow_deleted'));
|
|
return true;
|
|
} catch (error) {
|
|
handleError(error, $t('errors.unable_to_delete_workflow'));
|
|
return false;
|
|
}
|
|
};
|