分布式调度框架。
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

168 lines
4.8 KiB

/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
<template>
<div
class="dag-context-menu"
v-show="visible"
:style="{
left: `${left}px`,
top: `${top}px`,
}"
>
<menu-item :disabled="!startAvailable" @on-click="onStart">
{{ $t("Start") }}
</menu-item>
<menu-item :disabled="readOnly" @on-click="onEdit">
{{ $t("Edit") }}
</menu-item>
<menu-item :disabled="readOnly" @on-click="onCopy">
{{ $t("Copy") }}
</menu-item>
<menu-item :disabled="readOnly" @on-click="onDelete">
{{ $t("Delete") }}
</menu-item>
<menu-item v-if="dagChart.type === 'instance'" :disabled="!logMenuVisible" @on-click="showLog">
{{ $t('View log') }}
</menu-item>
</div>
</template>
<script>
import { mapState, mapActions, mapMutations } from 'vuex'
import { findComponentDownward, uuid } from '@/module/util/'
import MenuItem from './menuItem.vue'
import { cloneDeep } from 'lodash'
export default {
name: 'dag-context-menu',
inject: ['dagChart', 'dagCanvas'],
components: {
MenuItem
},
data () {
return {
visible: false,
left: 0,
top: 0,
canvasRef: null,
currentTask: {
code: 0,
name: '',
type: ''
}
}
},
computed: {
...mapState('dag', ['isDetails', 'releaseState', 'tasks']),
startAvailable () {
return (
this.$route.name === 'projects-definition-details' &&
this.releaseState !== 'NOT_RELEASE'
)
},
readOnly () {
return this.isDetails
},
logMenuVisible () {
if (this.dagChart.taskInstances.length > 0) {
return !!this.dagChart.taskInstances.find(taskInstance => taskInstance.taskCode === this.currentTask.code)
}
return true
}
},
mounted () {
document.addEventListener('click', (e) => {
this.hide()
})
},
methods: {
...mapActions('dag', ['genTaskCodeList']),
...mapMutations('dag', ['addTask']),
getDagCanvasRef () {
if (this.canvasRef) {
return this.canvasRef
} else {
const canvas = findComponentDownward(this.dagChart, 'dag-canvas')
this.canvasRef = canvas
return canvas
}
},
setCurrentTask (task) {
this.currentTask = { ...this.currentTask, ...task }
},
onStart () {
this.dagChart.startRunning(this.currentTask.code)
},
onEdit () {
this.dagChart.openFormModel(this.currentTask.code, this.currentTask.type)
},
onCopy () {
const nodes = this.dagCanvas.getNodes()
const targetNode = nodes.find(
(node) => node.id === this.currentTask.code
)
const targetTask = cloneDeep(this.tasks.find(
(task) => task.code === this.currentTask.code
))
if (!targetNode || !targetTask) return
this.genTaskCodeList({
genNum: 1
})
.then((res) => {
const [code] = res
const taskName = uuid(targetTask.name + '_')
const task = {
...targetTask,
code,
name: taskName
}
this.dagCanvas.addNode(code, this.currentTask.type, {
x: targetNode.position.x + 100,
y: targetNode.position.y + 100
})
this.addTask(task)
this.dagCanvas.setNodeName(code, taskName)
})
.catch((err) => {
console.error(err)
})
},
onDelete () {
this.dagCanvas.removeNode(this.currentTask.code)
},
showLog () {
this.dagChart.showLogDialog(this.currentTask.code)
},
show (x = 0, y = 0) {
this.dagCanvas.lockScroller()
this.visible = true
this.left = x + 10
this.top = y + 10
},
hide () {
this.dagCanvas.unlockScroller()
this.visible = false
}
}
}
</script>
<style lang="scss" scoped>
@import "./contextMenu";
</style>