feat(1.3.0-beta1): 工作流新增执行参数

This commit is contained in:
xlsea 2024-12-27 23:44:53 +08:00
parent 809dcf4f76
commit c50b1aeec0
6 changed files with 161 additions and 36 deletions

View File

@ -4,6 +4,7 @@ import CodeMirror from 'vue-codemirror6';
import { oneDark } from '@codemirror/theme-one-dark';
import { json } from '@codemirror/lang-json';
import { javascript } from '@codemirror/lang-javascript';
import { useBoolean } from '@sa/hooks';
import { useThemeStore } from '@/store/modules/theme';
defineOptions({
@ -39,6 +40,8 @@ const themeStore = useThemeStore();
const nodeExpression = ref<string>(props.modelValue);
const { bool: visible, setTrue: openModal } = useBoolean();
const codeLang = computed(() => {
switch (props.lang) {
case 'json':
@ -116,16 +119,42 @@ watch(
</script>
<template>
<CodeMirror
v-model="nodeExpression"
class="w-100%"
:readonly="readonly"
:disabled="disabled"
:theme="theme"
:placeholder="placeholder"
basic
:line-number="false"
:lang="codeLang"
:extensions="[oneDark]"
/>
<div class="w-100% flex-x-center gap-8px">
<CodeMirror
v-model="nodeExpression"
class="w-100%"
:readonly="readonly"
:disabled="disabled"
:theme="theme"
:placeholder="placeholder"
basic
:line-number="false"
:lang="codeLang"
:extensions="[oneDark]"
/>
<NButton @click="openModal">
<icon-flowbite:expand-outline class="text-18px" />
</NButton>
<NModal v-model:show="visible" class="max-w-90% w-600px" preset="card" title="编辑器" :bordered="false">
<CodeMirror
v-model="nodeExpression"
class="w-100%"
:readonly="readonly"
:disabled="disabled"
:theme="{
...theme,
'.cm-scroller': {
height: '300px',
overflowY: 'auto',
overflowX: 'hidden'
}
}"
:placeholder="placeholder"
basic
:line-number="false"
:lang="codeLang"
:extensions="[oneDark]"
/>
</NModal>
</div>
</template>

View File

@ -52,7 +52,8 @@ const store = useWorkflowStore();
let title: string = '';
const drawer = ref<boolean>(false);
const form = ref<Workflow.NodeDataType>({
wfContexts: []
wfContexts: [],
notifyIds: []
});
const groupNameList = ref<string[]>([]);
@ -221,7 +222,7 @@ const rules: Record<RuleKey, FormItemRule> = {
</NFormItem>
</NGi>
</NGrid>
<NFormItem path="wfContext" label="工作流上下文" :show-feedback="false">
<NFormItem path="wfContext" label="工作流上下文" :show-feedback="form.wfContexts?.length ? false : true">
<DynamicInput v-model:value="form.wfContexts!" path="wfContexts" />
</NFormItem>
<NFormItem path="workflowStatus" label="节点状态">

View File

@ -18,6 +18,15 @@ export function fetchTriggerWorkflow(id: string) {
});
}
/** trigger workflow */
export function fetchTriggerWorkflowParams(data: Api.Workflow.WorkflowTriggerParams) {
return request({
url: '/workflow/trigger',
method: 'post',
data
});
}
/** get namespace list */
export function fetchGetWorkflowNameList(params?: Api.Workflow.WorkflowNameSearchParams) {
return request<Api.Workflow.Workflow[]>({

View File

@ -920,6 +920,11 @@ declare namespace Api {
executorTimeout: number;
}>;
type WorkflowTriggerParams = {
workflowId?: string;
tmpWfContext?: string;
};
/** workflow search params */
type WorkflowSearchParams = CommonType.RecordNullable<
Pick<Api.Workflow.Workflow, 'workflowName' | 'groupName' | 'workflowStatus'> & CommonSearchParams

View File

@ -1,12 +1,9 @@
<script setup lang="tsx">
import { NButton, NDropdown, NPopconfirm, NTag } from 'naive-ui';
import { useRouter } from 'vue-router';
import {
fetchBatchDeleteWorkflow,
fetchGetWorkflowPageList,
fetchTriggerWorkflow,
fetchUpdateWorkflowStatus
} from '@/service/api';
import { ref } from 'vue';
import { useBoolean } from '@sa/hooks';
import { fetchBatchDeleteWorkflow, fetchGetWorkflowPageList, fetchUpdateWorkflowStatus } from '@/service/api';
import { $t } from '@/locales';
import { useAppStore } from '@/store/modules/app';
import { useTable, useTableOperate } from '@/hooks/common/table';
@ -17,12 +14,17 @@ import { useAuth } from '@/hooks/business/auth';
import { downloadFetch } from '@/utils/download';
import { useRouterPush } from '@/hooks/common/router';
import WorkflowSearch from './modules/workflow-search.vue';
import WorkflowTriggerModal from './modules/workflow-trigger-modal.vue';
const { hasAuth } = useAuth();
const router = useRouter();
const appStore = useAppStore();
const { routerPushByKey } = useRouterPush();
const triggerData = ref<Api.Workflow.Workflow | null>();
const { bool: triggerVisible, setTrue: openTriggerModal } = useBoolean(false);
const { columns, columnChecks, data, getData, loading, mobilePagination, searchParams, resetSearchParams } = useTable({
apiFn: fetchGetWorkflowPageList,
apiParams: {
@ -184,16 +186,9 @@ const { columns, columnChecks, data, getData, loading, mobilePagination, searchP
<n-divider vertical />
<NPopconfirm onPositiveClick={() => execute(row.id!)}>
{{
default: () => $t('common.confirmExecute'),
trigger: () => (
<NButton type="error" text ghost size="small">
{$t('common.execute')}
</NButton>
)
}}
</NPopconfirm>
<NButton type="error" text ghost size="small" onClick={() => execute(row)}>
{$t('common.execute')}
</NButton>
<n-divider vertical />
@ -253,12 +248,9 @@ function copy(id: string) {
// router.push({ path: '/workflow/batch', state: { workflowId: id } });
// }
async function execute(id: string) {
const { error } = await fetchTriggerWorkflow(id);
if (!error) {
window.$message?.success($t('common.executeSuccess'));
getData();
}
async function execute(row: Api.Workflow.Workflow) {
triggerData.value = row;
openTriggerModal();
}
function body(): Api.Workflow.ExportWorkflow {
@ -335,6 +327,7 @@ function goToBatch(workflowId: string) {
class="sm:h-full"
/>
</NCard>
<WorkflowTriggerModal v-model:visible="triggerVisible" :row-data="triggerData" />
</div>
</template>

View File

@ -0,0 +1,88 @@
<script setup lang="ts">
import { reactive, watch } from 'vue';
import { $t } from '@/locales';
import { fetchTriggerWorkflowParams } from '@/service/api';
import { parseContent } from '@/utils/common';
defineOptions({
name: 'WorkflowTriggerModal'
});
interface Props {
/** the edit row data */
rowData?: Api.Workflow.Workflow | null;
}
const props = defineProps<Props>();
interface Emits {
(e: 'submitted'): void;
}
const emit = defineEmits<Emits>();
const visible = defineModel<boolean>('visible', {
default: false
});
type Model = Api.Workflow.WorkflowTriggerParams & {
wfContexts: { key: string; value: string | number | boolean; type: string }[];
};
const model: Model = reactive(createDefaultModel());
function createDefaultModel(): Model {
return {
workflowId: props.rowData?.id,
tmpWfContext: '',
wfContexts: []
};
}
function handleUpdateModelWhenEdit() {
Object.assign(model, createDefaultModel());
}
function closeDrawer() {
visible.value = false;
}
watch(visible, () => {
if (visible.value) {
handleUpdateModelWhenEdit();
}
});
async function handleSubmit() {
const tmpWfContext = JSON.stringify(parseContent(model.wfContexts) || {});
const { error } = await fetchTriggerWorkflowParams({ workflowId: props.rowData?.id, tmpWfContext });
if (error) return;
window.$message?.success($t('common.executeSuccess'));
closeDrawer();
emit('submitted');
}
</script>
<template>
<NModal v-model:show="visible" class="max-w-90% w-600px" preset="card" title="执行工作流" :bordered="false">
<NForm :model="model">
<NFormItem path="wfContexts" label="工作流上下文" :show-feedback="model.wfContexts?.length ? false : true">
<DynamicInput v-model:value="model.wfContexts" path="wfContexts" />
</NFormItem>
</NForm>
<template #footer>
<NSpace justify="end" :size="16">
<NButton @click="closeDrawer">{{ $t('common.cancel') }}</NButton>
<NButton type="primary" @click="handleSubmit">执行</NButton>
</NSpace>
</template>
</NModal>
</template>
<style scoped>
.http-method {
width: 130px !important;
}
</style>