diff --git a/src/api/types.ts b/src/api/types.ts index ce1d7ab7..a4a38b49 100644 --- a/src/api/types.ts +++ b/src/api/types.ts @@ -144,6 +144,38 @@ export interface SubscribeShare { episode_group?: string } +// 工作流分享 +export interface WorkflowShare { + // 分享ID + id?: number + // 工作流ID + workflow_id?: string + // 分享标题 + share_title?: string + // 分享说明 + share_comment?: string + // 分享人 + share_user?: string + // 分享人唯一ID + share_uid?: string + // 工作流名称 + name?: string + // 工作流描述 + description?: string + // 定时器 + timer?: string + // 动作列表 + actions?: any[] + // 动作流 + flows?: any[] + // 上下文 + context?: string + // 时间 + date?: string + // 复用次数 + count?: number +} + // 历史记录 export interface TransferHistory { // ID diff --git a/src/components/cards/WorkflowShareCard.vue b/src/components/cards/WorkflowShareCard.vue new file mode 100644 index 00000000..4e364ee1 --- /dev/null +++ b/src/components/cards/WorkflowShareCard.vue @@ -0,0 +1,121 @@ + + + \ No newline at end of file diff --git a/src/components/cards/WorkflowTaskCard.vue b/src/components/cards/WorkflowTaskCard.vue index 6ba75b4d..39b65e34 100644 --- a/src/components/cards/WorkflowTaskCard.vue +++ b/src/components/cards/WorkflowTaskCard.vue @@ -4,6 +4,7 @@ import { useToast } from 'vue-toastification' import { useConfirm } from '@/composables/useConfirm' import WorkflowAddEditDialog from '@/components/dialog/WorkflowAddEditDialog.vue' import WorkflowActionsDialog from '@/components/dialog/WorkflowActionsDialog.vue' +import WorkflowShareDialog from '@/components/dialog/WorkflowShareDialog.vue' import api from '@/api' import { useI18n } from 'vue-i18n' @@ -32,6 +33,9 @@ const editDialog = ref(false) // 流程对话框 const flowDialog = ref(false) +// 分享对话框 +const shareDialog = ref(false) + // 加载中 const loading = ref(false) @@ -45,10 +49,16 @@ function handleFlow(item: Workflow) { flowDialog.value = true } +// 分享工作流 +function handleShare(item: Workflow) { + shareDialog.value = true +} + // 编辑完成 function editDone() { editDialog.value = false flowDialog.value = false + shareDialog.value = false emit('refresh') } @@ -240,6 +250,12 @@ const resolveProgress = (item: Workflow) => { {{ t('workflow.task.reset') }} + + + {{ t('workflow.task.share') }} + diff --git a/src/components/dialog/ForkWorkflowDialog.vue b/src/components/dialog/ForkWorkflowDialog.vue new file mode 100644 index 00000000..d4db5a62 --- /dev/null +++ b/src/components/dialog/ForkWorkflowDialog.vue @@ -0,0 +1,173 @@ + + \ No newline at end of file diff --git a/src/components/dialog/WorkflowShareDialog.vue b/src/components/dialog/WorkflowShareDialog.vue new file mode 100644 index 00000000..0ec4951e --- /dev/null +++ b/src/components/dialog/WorkflowShareDialog.vue @@ -0,0 +1,122 @@ + + + \ No newline at end of file diff --git a/src/locales/en-US.ts b/src/locales/en-US.ts index 202fdd37..1ad91734 100644 --- a/src/locales/en-US.ts +++ b/src/locales/en-US.ts @@ -329,6 +329,10 @@ export default { share: 'Subscription Shares', }, }, + workflowTabs: { + list: 'Workflow', + share: 'Workflow Share', + }, pluginTabs: { installed: 'My Plugins', market: 'Plugin Market', @@ -488,6 +492,7 @@ export default { dragComponentHint: 'Drag component to canvas', task: { edit: 'Edit Task', + share: 'Share', continue: 'Continue', restart: 'Restart', run: 'Run Now', @@ -655,6 +660,19 @@ export default { loadPluginSettingFailed: 'Failed to load plugin settings', }, title: 'Workflow', + share: 'Workflow Share', + searchShares: 'Search Workflow Shares', + noShareData: 'No shared workflows', + sharer: 'Sharer', + timer: 'Timer', + actionCount: 'Action Count', + normalFork: 'Fork Workflow', + cancelShare: 'Cancel Share', + cancelSuccess: 'Share cancelled successfully', + cancelFailed: 'Failed to cancel share: {message}', + usageCount: 'Used {count} times', + addSuccess: 'Forked {name} successfully!', + addFailed: 'Failed to fork {name}: {message}', noWorkflow: 'No Workflow', noWorkflowDescription: 'Click the add button to create a workflow task.', }, @@ -1730,6 +1748,18 @@ export default { shareSuccess: '{name} shared successfully!', shareFailed: '{name} share failed: {message}!', }, + workflowShare: { + shareWorkflow: 'Share Workflow', + title: 'Title', + description: 'Description', + descriptionHint: + 'Add a description about this workflow. Actions and flows will be included in the share by default', + shareUser: 'Share User', + shareUserHint: "Sharer's nickname", + confirmShare: 'Confirm Share', + shareSuccess: '{name} shared successfully!', + shareFailed: '{name} share failed: {message}!', + }, u115Auth: { loginTitle: '115 Cloud Login', scanQrCode: 'Please scan with WeChat or 115 client', diff --git a/src/locales/zh-CN.ts b/src/locales/zh-CN.ts index 76841819..b03b8faa 100644 --- a/src/locales/zh-CN.ts +++ b/src/locales/zh-CN.ts @@ -328,6 +328,10 @@ export default { share: '订阅分享', }, }, + workflowTabs: { + list: '工作流', + share: '工作流分享', + }, pluginTabs: { installed: '我的插件', market: '插件市场', @@ -486,6 +490,7 @@ export default { dragComponentHint: '拖动组件到画布', task: { edit: '编辑任务', + share: '分享', continue: '继续执行', restart: '重新执行', run: '立即执行', @@ -653,6 +658,19 @@ export default { loadPluginSettingFailed: '加载插件设置失败', }, title: '工作流', + share: '工作流分享', + searchShares: '搜索工作流分享', + noShareData: '暂无分享的工作流', + sharer: '分享人', + timer: '定时器', + actionCount: '动作数量', + normalFork: '复用工作流', + cancelShare: '取消分享', + cancelSuccess: '取消分享成功', + cancelFailed: '取消分享失败:{message}', + usageCount: '复用 {count} 次', + addSuccess: '复用 {name} 成功!', + addFailed: '复用 {name} 失败:{message}', noWorkflow: '没有工作流', noWorkflowDescription: '点击添加按钮创建工作流任务。', }, @@ -1709,6 +1727,17 @@ export default { shareSuccess: '{name} 分享成功!', shareFailed: '{name} 分享失败:{message}!', }, + workflowShare: { + shareWorkflow: '分享工作流', + title: '标题', + description: '说明', + descriptionHint: '填写关于该工作流的说明,工作流的动作和流程将会默认包含在分享中', + shareUser: '分享用户', + shareUserHint: '分享人的昵称', + confirmShare: '确认分享', + shareSuccess: '{name} 分享成功!', + shareFailed: '{name} 分享失败:{message}!', + }, u115Auth: { loginTitle: '115网盘登录', scanQrCode: '请使用微信或115客户端扫码', diff --git a/src/locales/zh-TW.ts b/src/locales/zh-TW.ts index e2a82a4b..7057e523 100644 --- a/src/locales/zh-TW.ts +++ b/src/locales/zh-TW.ts @@ -329,6 +329,10 @@ export default { share: '訂閱分享', }, }, + workflowTabs: { + list: '工作流', + share: '工作流分享', + }, pluginTabs: { installed: '我的插件', market: '插件市場', @@ -484,6 +488,7 @@ export default { dragComponentHint: '拖曳組件到畫布', task: { edit: '編輯任務', + share: '分享', continue: '繼續', restart: '重新開始', run: '立即執行', @@ -651,6 +656,19 @@ export default { loadPluginSettingFailed: '加載插件設置失敗', }, title: '工作流', + share: '工作流分享', + searchShares: '搜索工作流分享', + noShareData: '暫無分享的工作流', + sharer: '分享人', + timer: '定時器', + actionCount: '動作數量', + normalFork: '復用工作流', + cancelShare: '取消分享', + cancelSuccess: '取消分享成功', + cancelFailed: '取消分享失敗:{message}', + usageCount: '復用 {count} 次', + addSuccess: '復用 {name} 成功!', + addFailed: '復用 {name} 失敗:{message}', noWorkflow: '沒有工作流', noWorkflowDescription: '點擊添加按鈕創建工作流任務。', }, @@ -1708,6 +1726,17 @@ export default { shareSuccess: '{name} 分享成功!', shareFailed: '{name} 分享失敗:{message}!', }, + workflowShare: { + shareWorkflow: '分享工作流', + title: '標題', + description: '說明', + descriptionHint: '填寫關於該工作流的說明,工作流的動作和流程將會默認包含在分享中', + shareUser: '分享用戶', + shareUserHint: '分享人的暱稱', + confirmShare: '確認分享', + shareSuccess: '{name} 分享成功!', + shareFailed: '{name} 分享失敗:{message}!', + }, u115Auth: { loginTitle: '115網盤登錄', scanQrCode: '請使用微信或115客戶端掃碼', diff --git a/src/pages/workflow.vue b/src/pages/workflow.vue index f6574d3d..403a820b 100644 --- a/src/pages/workflow.vue +++ b/src/pages/workflow.vue @@ -1,9 +1,133 @@ + + diff --git a/src/router/i18n-menu.ts b/src/router/i18n-menu.ts index f385b5d3..c3cdc9e6 100644 --- a/src/router/i18n-menu.ts +++ b/src/router/i18n-menu.ts @@ -293,3 +293,21 @@ export function getDiscoverTabs() { }, ] } + +// 获取工作流标签页 +export function getWorkflowTabs() { + const { t } = useI18n() + + return [ + { + title: t('workflowTabs.list'), + tab: 'list', + icon: 'mdi-format-list-bulleted', + }, + { + title: t('workflowTabs.share'), + tab: 'share', + icon: 'mdi-share', + }, + ] +} diff --git a/src/styles/custom.scss b/src/styles/custom.scss index 916617e1..aad4236e 100644 --- a/src/styles/custom.scss +++ b/src/styles/custom.scss @@ -236,6 +236,10 @@ body { grid-template-columns: repeat(auto-fill, minmax(20rem, 1fr)); } +.grid-workflow-share-card { + grid-template-columns: repeat(auto-fill, minmax(15rem, 1fr)); +} + .v-tabs:not(.v-tabs-pill).v-tabs--horizontal { border-block-end: 1px solid rgba(var(--v-border-color), var(--v-border-opacity)); } diff --git a/src/views/workflow/WorkflowListView.vue b/src/views/workflow/WorkflowListView.vue index f96675d0..ae3cd0d2 100644 --- a/src/views/workflow/WorkflowListView.vue +++ b/src/views/workflow/WorkflowListView.vue @@ -4,7 +4,6 @@ import { Workflow } from '@/api/types' import WorkflowAddEditDialog from '@/components/dialog/WorkflowAddEditDialog.vue' import WorkflowTaskCard from '@/components/cards/WorkflowTaskCard.vue' import NoDataFound from '@/components/NoDataFound.vue' -import { useDynamicButton } from '@/composables/useDynamicButton' import { useI18n } from 'vue-i18n' import { usePWA } from '@/composables/usePWA' @@ -49,14 +48,6 @@ onMounted(() => { onActivated(() => { fetchData() }) - -// 使用动态按钮钩子 新增 -useDynamicButton({ - icon: 'mdi-plus', - onClick: () => { - addDialog.value = true - }, -}) diff --git a/src/views/workflow/WorkflowShareView.vue b/src/views/workflow/WorkflowShareView.vue new file mode 100644 index 00000000..bfe3db54 --- /dev/null +++ b/src/views/workflow/WorkflowShareView.vue @@ -0,0 +1,139 @@ + + +