in dolphinscheduler-ui/src/views/projects/task/components/node/detail-modal.tsx [96:266]
setup(props, { emit }) {
const { t, locale } = useI18n()
const router: Router = useRouter()
const taskStore = useTaskNodeStore()
const renderIcon = (icon: any) => {
return () => h(NIcon, null, { default: () => h(icon) })
}
const detailRef = ref()
const onConfirm = async () => {
await detailRef.value.value.validate()
emit('submit', { data: detailRef.value.value.getValues() })
}
const onCancel = () => {
emit('cancel')
}
const headerLinks = ref([] as any)
const projectPreferences = ref({} as any)
const handleViewLog = () => {
if (props.taskInstance) {
emit('viewLog', props.taskInstance.id, props.taskInstance.taskType)
}
}
const initProjectPreferences = (projectCode: number) => {
queryProjectPreferenceByProjectCode(projectCode).then((result: any) => {
if (result?.preferences && result.state === 1) {
projectPreferences.value = JSON.parse(result.preferences)
}
})
}
const restructureNodeData = (data: INodeData) => {
if (!data?.id) {
for (const item in projectPreferences.value) {
if (projectPreferences.value[item] !== null && item in data) {
Object.assign(data, { item: projectPreferences.value[item] })
}
}
}
}
const initHeaderLinks = (workflowInstance: any, taskType?: ITaskType) => {
headerLinks.value = [
{
text: t('project.node.instructions'),
show: !!(taskType && !TASK_TYPES_MAP[taskType]?.helperLinkDisable),
action: () => {
let linkedTaskType = taskType?.toLowerCase().replace('_', '-')
if (taskType === 'PROCEDURE') linkedTaskType = 'stored-procedure'
const helpUrl =
'https://dolphinscheduler.apache.org/' +
locale.value.toLowerCase().replace('_', '-') +
'/docs/latest/user_doc/guide/task/' +
linkedTaskType +
'.html'
window.open(helpUrl)
},
icon: renderIcon(QuestionCircleTwotone)
},
{
text: t('project.node.view_history'),
show: !!props.taskInstance,
action: () => {
router.push({
name: 'task-instance',
query: {
taskCode: props.data.code
}
})
},
icon: renderIcon(HistoryOutlined)
},
{
text: t('project.node.view_log'),
show: !!props.taskInstance,
action: () => {
handleViewLog()
},
icon: renderIcon(ProfileOutlined)
},
{
text: t('project.node.enter_this_child_node'),
show: props.data.taskType === 'SUB_WORKFLOW',
disabled:
!props.data.id ||
(router.currentRoute.value.name === 'workflow-instance-detail' &&
!props.taskInstance),
action: () => {
if (router.currentRoute.value.name === 'workflow-instance-detail') {
querySubWorkflowInstanceByTaskCode(
{ taskId: props.taskInstance?.id },
{ projectCode: props.projectCode }
).then((res: any) => {
router.push({
name: 'workflow-instance-detail',
params: { id: res.subWorkflowInstanceId },
query: { code: props.data.taskParams?.workflowDefinitionCode }
})
})
} else {
router.push({
name: 'workflow-definition-detail',
params: { code: props.data.taskParams?.workflowDefinitionCode }
})
}
},
icon: renderIcon(BranchesOutlined)
}
]
}
const onTaskTypeChange = (taskType: ITaskType) => {
// eslint-disable-next-line vue/no-mutating-props
props.data.taskType = taskType
initHeaderLinks(props.workflowInstance, props.data.taskType)
}
provide(
'data',
computed(() => ({
projectCode: props.projectCode,
data: props.data,
from: props.from,
readonly: props.readonly,
definition: props.definition
}))
)
onMounted(() => {
initProjectPreferences(props.projectCode)
})
watch(
() => [props.show, props.data],
async () => {
if (!props.show) return
initHeaderLinks(props.workflowInstance, props.data.taskType)
taskStore.init()
const nodeData = formatModel(props.data)
await nextTick()
restructureNodeData(nodeData)
detailRef.value.value.setValues(nodeData)
}
)
return () => (
<Modal
show={props.show}
title={
props.from === 1
? `${t('project.task.current_task_settings')}`
: `${t('project.node.current_node_settings')}`
}
onConfirm={onConfirm}
confirmLoading={props.saving}
confirmDisabled={props.readonly}
onCancel={onCancel}
headerLinks={headerLinks}
>
<Detail
ref={detailRef}
onTaskTypeChange={onTaskTypeChange}
key={props.data.taskType}
/>
</Modal>
)
}