|
@@ -1,50 +1,137 @@
|
|
|
<template>
|
|
|
- <g class="flow-node__activity"
|
|
|
- :status="status"
|
|
|
+ <g
|
|
|
+ class="flow-node__activity"
|
|
|
+ :status="activity.status"
|
|
|
>
|
|
|
- <circle
|
|
|
+ <!--<circle
|
|
|
class="flow-node__activity-background"
|
|
|
rx="0"
|
|
|
ry="0"
|
|
|
- r="17"/>
|
|
|
- <icon-refresh v-if="status=='running'" v-bind="iconProps" class="flow-node__activity-icon" />
|
|
|
- <icon-wait v-else-if="status=='waiting'" v-bind="iconProps" class="flow-node__activity-icon"/>
|
|
|
- <icon-ok v-else-if="status=='finish'" v-bind="iconProps"class="flow-node__activity-icon"/>
|
|
|
- <icon-fail v-else-if="status=='error'" v-bind="iconProps"class="flow-node__activity-icon"/>
|
|
|
+ r="17"/>-->
|
|
|
+ <rect
|
|
|
+ class="flow-node__activity-background"
|
|
|
+ x="-12"
|
|
|
+ y="-12"
|
|
|
+ :width="ellapsed?65:24"
|
|
|
+ height="24"
|
|
|
+ rx="12"
|
|
|
+ />
|
|
|
+
|
|
|
+ <icon-refresh v-if="activity.status=='running'" v-bind="iconProps" class="flow-node__activity-icon" />
|
|
|
+ <icon-wait v-else-if="activity.status=='waiting'" v-bind="iconProps" class="flow-node__activity-icon"/>
|
|
|
+ <icon-ok v-else-if="activity.status=='finish'" v-bind="iconProps"class="flow-node__activity-icon"/>
|
|
|
+ <icon-fail v-else-if="activity.status=='error'" v-bind="iconProps"class="flow-node__activity-icon"/>
|
|
|
<icon-question v-else v-bind="iconProps" class="flow-node__activity-icon" />
|
|
|
+
|
|
|
+ <text v-if="ellapsed" class="flow-node__activity-time" x="13" y="4" fill="black">
|
|
|
+ {{ ellapsed }}
|
|
|
+ </text>
|
|
|
</g>
|
|
|
</template>
|
|
|
<script>
|
|
|
+
|
|
|
import IconWait from '@/assets/icons/wait.svg'
|
|
|
import IconFail from '@/assets/icons/fail.svg'
|
|
|
import IconOk from '@/assets/icons/ok.svg'
|
|
|
import IconQuestion from '@/assets/icons/question.svg'
|
|
|
import IconRefresh from '@/assets/icons/refresh.svg'
|
|
|
+import utils from '@/utils/utils'
|
|
|
|
|
|
export default {
|
|
|
name: 'FlowNodeStatus',
|
|
|
components: {IconWait, IconFail, IconOk, IconQuestion, IconRefresh},
|
|
|
- props: { status: {type: String, default: ''} },
|
|
|
+ props: { activity: {type: Object, default: () => {}} },
|
|
|
+ data () {
|
|
|
+ return {
|
|
|
+ finishTime: null
|
|
|
+ }
|
|
|
+ },
|
|
|
computed: {
|
|
|
iconProps () {
|
|
|
return {
|
|
|
- x: -14,
|
|
|
- y: -14,
|
|
|
+ x: -9,
|
|
|
+ y: -9,
|
|
|
viewBox: '-4 -4 72 72',
|
|
|
- width: 28,
|
|
|
- height: 28
|
|
|
+ width: 18,
|
|
|
+ height: 18
|
|
|
+ }
|
|
|
+ },
|
|
|
+ ellapsed () {
|
|
|
+ if (!this.finishTime) return null
|
|
|
+ const s = new Date(Date.parse(this.activity.startTime))
|
|
|
+ if (!dateIsValid(s)) { return null }
|
|
|
+ const intervalms = this.finishTime - s
|
|
|
+ const sec = intervalms / 1000
|
|
|
+ const min = intervalms / 1000 / 60
|
|
|
+ return utils.padStart(min.toFixed(0), 2, '0') + ':' + utils.padStart(sec.toFixed(0), 2, '0')
|
|
|
+ }
|
|
|
+ },
|
|
|
+ watch: {
|
|
|
+ activity: {
|
|
|
+ handler (val) {
|
|
|
+ console.log('Activity changed', val)
|
|
|
+ const e = new Date(Date.parse(val.endTime))
|
|
|
+ if (dateIsValid(e)) {
|
|
|
+ console.log('End time valid', e.getTime())
|
|
|
+ } else {
|
|
|
+ console.log('End time invalid')
|
|
|
+ }
|
|
|
+ },
|
|
|
+ deep: true
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ mounted () {
|
|
|
+ console.log('Activity', this.activity)
|
|
|
+ this._timeOut = setTimeout(this.updateTime, 999)
|
|
|
+ },
|
|
|
+ beforeDestroy () {
|
|
|
+ clearTimeout(this._timeOut)
|
|
|
+ },
|
|
|
+ methods: {
|
|
|
+ updateTime () {
|
|
|
+ const finish = new Date(Date.parse(this.activity.endTime))
|
|
|
+ if (dateIsValid(finish)) {
|
|
|
+ console.log('Date is valid')
|
|
|
+ this.finishTime = finish
|
|
|
+ return
|
|
|
+ }
|
|
|
+ this.finishTime = new Date()
|
|
|
+ this._timeOut = setTimeout(this.updateTime, 999)
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+const invalidDate = -62135596800000
|
|
|
+function dateIsValid (d) {
|
|
|
+ if (Object.prototype.toString.call(d) === '[object Date]') {
|
|
|
+ if (!isNaN(d.getTime())) { // d.valueOf() could also work
|
|
|
+ if (d.getTime() === invalidDate) {
|
|
|
+ return false
|
|
|
}
|
|
|
+ return true
|
|
|
}
|
|
|
}
|
|
|
+ return false
|
|
|
}
|
|
|
</script>
|
|
|
|
|
|
<style>
|
|
|
.flow-node__activity {
|
|
|
+ font-size:12px;
|
|
|
+ opacity:0;
|
|
|
+ user-select: none;
|
|
|
+ pointer-event:none;
|
|
|
+ transition: all 0.3s;
|
|
|
+}
|
|
|
+
|
|
|
+.flow-view.flow-node--activity .flow-node__activity {
|
|
|
opacity:0.8;
|
|
|
}
|
|
|
|
|
|
.flow-node__activity-background {
|
|
|
+ stroke: rgba(0,0,0,0.2);
|
|
|
fill: inherits;
|
|
|
transition: all 0.3s;
|
|
|
}
|
|
@@ -64,7 +151,7 @@ export default {
|
|
|
-webkit-animation: spin 1s infinite linear;
|
|
|
-moz-animation: spin 1s infinite linear;
|
|
|
animation: spin 1s infinite linear;
|
|
|
- stroke: #00c;
|
|
|
+ stroke: #aa0;
|
|
|
}
|
|
|
|
|
|
.flow-node__activity[status=error] .flow-node__activity-icon > * {
|