Browse Source

Merge remote-tracking branch 'origin/master'

master
liupeng 7 months ago
parent
commit
ae92a9c4e1
  1. 2
      src/designer/Model2DEditor.vue
  2. 31
      src/designer/viewWidgets/IWidgets.ts
  3. 70
      src/designer/viewWidgets/alarm/AlarmView.vue
  4. 27
      src/designer/viewWidgets/logger/LoggerView.vue
  5. 82
      src/designer/viewWidgets/modeltree/ModeltreeView.vue
  6. 99
      src/designer/viewWidgets/modeltree/ModeltreeViewJs.js
  7. 14
      src/designer/viewWidgets/monitor/MonitorView.vue
  8. 27
      src/designer/viewWidgets/property/PropertyView.vue
  9. 26
      src/designer/viewWidgets/script/ScriptView.vue
  10. 27
      src/designer/viewWidgets/task/TaskView.vue
  11. 30
      src/designer/viewWidgets/toolbox/ToolboxView.vue
  12. 47
      src/views/ModelMain.vue

2
src/designer/ModelEditor.vue → src/designer/Model2DEditor.vue

@ -39,7 +39,7 @@
import { renderIcon } from '@/utils/webutils.ts' import { renderIcon } from '@/utils/webutils.ts'
export default { export default {
name: 'ModelEditor', name: 'Model2DEditor',
components: { components: {
renderIcon renderIcon
}, },

31
src/designer/viewWidgets/IWidgets.ts

@ -0,0 +1,31 @@
import { defineComponent } from 'vue'
import { renderIcon } from '@/utils/webutils.js'
export type IWidgetData = {
/**
*
*/
isActivated: boolean
}
export default defineComponent({
activated() {
this.isActivated = true
console.log('activated', this.$.type.name)
},
deactivated() {
this.isActivated = false
},
emits: ['close'],
data() {
return {
isActivated: false
} as IWidgetData
},
methods: {
renderIcon,
closeMe() {
this.$emit('close')
}
}
})

70
src/designer/viewWidgets/alarm/AlarmView.vue

@ -1,3 +1,71 @@
<template> <template>
AlarmView <div class="title">
告警面板
<el-input v-model="searchKeyword" size="small" style="width: 240px" placeholder="Search">
<template #prefix>
<component :is="renderIcon('element Search')"></component>
</template> </template>
</el-input>
<span class="close" @click="closeMe">
<component :is="renderIcon('element Close')" />
</span>
</div>
<div class="calc-right-panel">
AlarmView_1<br />
AlarmView_2<br />
AlarmView_3<br />
AlarmView_4<br />
AlarmView_5<br />
AlarmView_6<br />
AlarmView_7<br />
AlarmView_8<br />
AlarmView_9<br />
AlarmView_10<br />
AlarmView_11<br />
AlarmView_12<br />
AlarmView_13<br />
AlarmView_14<br />
AlarmView_15<br />
AlarmView_16<br />
AlarmView_17<br />
AlarmView_18<br />
AlarmView_19<br />
AlarmView_20<br />
AlarmView_21<br />
AlarmView_22<br />
AlarmView_23<br />
AlarmView_24<br />
AlarmView_25<br />
AlarmView_26<br />
AlarmView_27<br />
AlarmView_28<br />
AlarmView_29<br />
AlarmView_30<br />
AlarmView_31<br />
AlarmView_32<br />
AlarmView_33<br />
AlarmView_34<br />
AlarmView_35<br />
AlarmView_36<br />
AlarmView_37<br />
AlarmView_38<br />
AlarmView_39<br />
AlarmView_40<br />
</div>
</template>
<script>
import IWidgets from '../IWidgets.js'
export default {
name: 'AlarmView',
webSocketSubscribe: ['alarm'],
emits: ['close'],
mixins: [IWidgets],
data() {
return {
searchKeyword: ''
}
}
}
</script>

27
src/designer/viewWidgets/logger/LoggerView.vue

@ -1,4 +1,16 @@
<template> <template>
<div class="title">
系统日志
<el-input v-model="searchKeyword" size="small" style="width: 240px" placeholder="Search">
<template #prefix>
<component :is="renderIcon('element Search')"></component>
</template>
</el-input>
<span class="close" @click="closeMe">
<component :is="renderIcon('element Close')"></component>
</span>
</div>
<div class="calc-bottom-panel">
LoggerView1<br /> LoggerView1<br />
LoggerView2<br /> LoggerView2<br />
LoggerView3<br /> LoggerView3<br />
@ -39,4 +51,19 @@
LoggerView38<br /> LoggerView38<br />
LoggerView39<br /> LoggerView39<br />
LoggerView40<br /> LoggerView40<br />
</div>
</template> </template>
<script>
import IWidgets from '../IWidgets.js'
export default {
name: 'LoggerView',
webSocketSubscribe: ['logs'],
mixins: [IWidgets],
data() {
return {
searchKeyword: ''
}
}
}
</script>

82
src/designer/viewWidgets/modeltree/ModeltreeView.vue

@ -1,80 +1,28 @@
<template> <template>
<div class="title"> <div class="title">
<el-cascader placeholder="选择楼层" size="small" v-model="currentLevel" :options="allLevels" filterable /> <el-input v-model="searchKeyword" size="small" style="flex-grow: 1; margin: 0 5px 0 0;" placeholder="Search">
<el-input v-model="searchKeyword" size="small" style="width: 240px" placeholder="Search">
<template #prefix> <template #prefix>
<component :is="renderIcon('element Search')"></component> <component :is="renderIcon('element Search')"></component>
</template> </template>
</el-input> </el-input>
<span class="close" @click="closeMe('hideLeft')"> <el-cascader placeholder="选择楼层" size="small" v-model="currentLevel" :options="allLevels" filterable
<component :is="renderIcon('element Close')" /> style="margin-right: 5px; width: 150px;" />
</span>
</div> </div>
<div class="calc-left-panel"> <div class="calc-left-panel">
ModeltreeView1<br /> <el-tree draggable node-key="id" :highlight-current="true"
ModeltreeView2<br /> :data="treedata" :expand-on-click-node="false" :auto-expand-parent="true"
ModeltreeView3<br /> :allow-drop="allowDrop" :allow-drag="allowDrag"
ModeltreeView4<br /> @node-drag-start="handleDragStart"
ModeltreeView5<br /> @node-drag-enter="handleDragEnter"
ModeltreeView6<br /> @node-drag-leave="handleDragLeave"
ModeltreeView7<br /> @node-drag-over="handleDragOver"
ModeltreeView8<br /> @node-drag-end="handleDragEnd"
ModeltreeView9<br /> @node-drop="handleDrop"
ModeltreeView10<br /> />
ModeltreeView11<br />
ModeltreeView12<br />
ModeltreeView13<br />
ModeltreeView14<br />
ModeltreeView15<br />
ModeltreeView16<br />
ModeltreeView17<br />
ModeltreeView18<br />
ModeltreeView19<br />
ModeltreeView20<br />
ModeltreeView21<br />
ModeltreeView22<br />
ModeltreeView23<br />
ModeltreeView24<br />
ModeltreeView25<br />
ModeltreeView26<br />
ModeltreeView27<br />
ModeltreeView28<br />
ModeltreeView29<br />
ModeltreeView30<br />
ModeltreeView31<br />
ModeltreeView32<br />
ModeltreeView33<br />
ModeltreeView34<br />
ModeltreeView35<br />
ModeltreeView36<br />
ModeltreeView37<br />
ModeltreeView38<br />
ModeltreeView39<br />
ModeltreeView40<br />
</div> </div>
</template> </template>
<script> <script>
import { renderIcon } from '@/utils/webutils.js' import ModeltreeViewJs from './ModeltreeViewJs.js'
export default { export default ModeltreeViewJs
name: 'ModeltreeView',
emits: ['close'],
data() {
return {
currentLevel: '',
searchKeyword: ''
}
},
methods: {
renderIcon,
closeMe(name) {
this.$emit('close', name)
}
},
computed: {
allLevels() {
return designer.allLevels
}
}
}
</script> </script>

99
src/designer/viewWidgets/modeltree/ModeltreeViewJs.js

@ -0,0 +1,99 @@
import { defineComponent } from 'vue'
import { renderIcon } from '@/utils/webutils.js'
import IWidgets from '../IWidgets.js'
export default defineComponent({
name: 'ModeltreeView',
mixins: [IWidgets],
data() {
return {
currentLevel: '',
searchKeyword: '',
treedata: data
}
},
methods: {
allowDrop(event) {
return true
},
allowDrag(event) {
return true
},
handleDragStart() {
},
handleDragEnter() {
},
handleDragLeave() {
},
handleDragOver() {
},
handleDragEnd() {
},
handleDrop() {
}
},
computed: {
allLevels() {
return designer.allLevels
}
}
})
const data = [
{
label: 'Level one 1',
children: [
{
label: 'Level two 1-1',
children: [
{
label: 'Level three 1-1-1'
}
]
}
]
},
{
label: 'Level one 2',
children: [
{
label: 'Level two 2-1',
children: [
{
label: 'Level three 2-1-1'
}
]
},
{
label: 'Level two 2-2',
children: [
{
label: 'Level three 2-2-1'
}
]
}
]
},
{
label: 'Level one 3',
children: [
{
label: 'Level two 3-1',
children: [
{
label: 'Level three 3-1-1'
}
]
},
{
label: 'Level two 3-2',
children: [
{
label: 'Level three 3-2-1'
}
]
}
]
}
]

14
src/designer/viewWidgets/monitor/MonitorView.vue

@ -6,7 +6,7 @@
<component :is="renderIcon('element Search')"></component> <component :is="renderIcon('element Search')"></component>
</template> </template>
</el-input> </el-input>
<span class="close" @click="closeMe('hideLeft')"> <span class="close" @click="closeMe">
<component :is="renderIcon('element Close')" /> <component :is="renderIcon('element Close')" />
</span> </span>
</div> </div>
@ -107,11 +107,12 @@
</div> </div>
</template> </template>
<script> <script>
import { renderIcon } from '@/utils/webutils.js' import IWidgets from '../IWidgets.js'
export default { export default {
name: 'MonitorView', name: 'MonitorView',
emits: ['close'], webSocketSubscribe: ['deviceStatus'],
mixins: [IWidgets],
data() { data() {
return { return {
searchKeyword: '', searchKeyword: '',
@ -122,12 +123,7 @@ export default {
idle: 0 idle: 0
} }
}, },
methods: { methods: {}
renderIcon,
closeMe(name) {
this.$emit('close', name)
}
}
} }
</script> </script>
<style lang="less"> <style lang="less">

27
src/designer/viewWidgets/property/PropertyView.vue

@ -1,4 +1,16 @@
<template> <template>
<div class="title">
属性面板
<el-input v-model="searchKeyword" size="small" style="width: 240px" placeholder="Search">
<template #prefix>
<component :is="renderIcon('element Search')"></component>
</template>
</el-input>
<span class="close" @click="closeMe('hideReft')">
<component :is="renderIcon('element Close')" />
</span>
</div>
<div class="calc-right-panel">
PropertyView1<br /> PropertyView1<br />
PropertyView2<br /> PropertyView2<br />
PropertyView3<br /> PropertyView3<br />
@ -39,6 +51,19 @@
PropertyView38<br /> PropertyView38<br />
PropertyView39<br /> PropertyView39<br />
PropertyView40<br /> PropertyView40<br />
</div>
</template> </template>
<script setup lang="ts"> <script>
import IWidgets from '../IWidgets.js'
export default {
name: 'PropertyView',
mixins: [IWidgets],
data() {
return {
searchKeyword: ''
}
}
}
</script> </script>

26
src/designer/viewWidgets/script/ScriptView.vue

@ -1,3 +1,29 @@
<template> <template>
<div class="title">
脚本编辑
<el-input v-model="searchKeyword" size="small" style="width: 240px" placeholder="Search">
<template #prefix>
<component :is="renderIcon('element Search')"></component>
</template>
</el-input>
<span class="close" @click="closeMe">
<component :is="renderIcon('element Close')"></component>
</span>
</div>
<div class="calc-bottom-panel">
ScriptView ScriptView
</div>
</template> </template>
<script>
import IWidgets from '@/designer/viewWidgets/IWidgets.js'
export default {
name: 'ScriptView',
mixins: [IWidgets],
data() {
return {
searchKeyword: ''
}
}
}
</script>

27
src/designer/viewWidgets/task/TaskView.vue

@ -1,4 +1,16 @@
<template> <template>
<div class="title">
任务监视
<el-input v-model="searchKeyword" size="small" style="width: 240px" placeholder="Search">
<template #prefix>
<component :is="renderIcon('element Search')"></component>
</template>
</el-input>
<span class="close" @click="closeMe">
<component :is="renderIcon('element Close')"></component>
</span>
</div>
<div class="calc-bottom-panel">
TaskView1<br /> TaskView1<br />
TaskView2<br /> TaskView2<br />
TaskView3<br /> TaskView3<br />
@ -19,4 +31,19 @@
TaskView18<br /> TaskView18<br />
TaskView19<br /> TaskView19<br />
TaskView20<br /> TaskView20<br />
</div>
</template> </template>
<script>
import IWidgets from '../IWidgets.js'
export default {
name: 'TaskView',
webSocketSubscribe: ['task'],
mixins: [IWidgets],
data() {
return {
searchKeyword: ''
}
}
}
</script>

30
src/designer/viewWidgets/toolbox/ToolboxView.vue

@ -6,7 +6,7 @@
<component :is="renderIcon('element Search')"></component> <component :is="renderIcon('element Search')"></component>
</template> </template>
</el-input> </el-input>
<span class="close" @click="closeMe('hideLeft')"> <span class="close" @click="closeMe">
<component :is="renderIcon('element Close')" /> <component :is="renderIcon('element Close')" />
</span> </span>
</div> </div>
@ -32,11 +32,12 @@
</div> </div>
</template> </template>
<script> <script>
import { renderIcon } from '@/utils/webutils.js'
import IWidgets from '../IWidgets.js'
export default { export default {
name: 'ToolboxView', name: 'ToolboxView',
emits: ['close'], mixins: [IWidgets],
data() { data() {
return { return {
searchKeyword: '', searchKeyword: '',
@ -113,7 +114,6 @@ export default {
} }
}, },
methods: { methods: {
renderIcon,
closeMe() { closeMe() {
this.$emit('close') this.$emit('close')
}, },
@ -124,16 +124,16 @@ export default {
console.log(key, keyPath) console.log(key, keyPath)
}, },
updateFilteredItemsAndExpand() { updateFilteredItemsAndExpand() {
const expandedKeys = []; const expandedKeys = []
this.itemTypes.forEach(itemType => { this.itemTypes.forEach(itemType => {
const filteredChildren = itemType.children.filter(item => const filteredChildren = itemType.children.filter(item =>
item.label.includes(this.searchKeyword) || item.name.includes(this.searchKeyword)); item.label.includes(this.searchKeyword) || item.name.includes(this.searchKeyword))
if (filteredChildren.length > 0) { if (filteredChildren.length > 0) {
expandedKeys.push(itemType.name); expandedKeys.push(itemType.name)
} }
itemType.children = filteredChildren; itemType.children = filteredChildren
}); })
this.defaultExpandedKeys = expandedKeys; this.defaultExpandedKeys = expandedKeys
} }
}, },
watch: { watch: {
@ -141,17 +141,17 @@ export default {
if (!newVal) { if (!newVal) {
// //
this.itemTypes.forEach(itemType => { this.itemTypes.forEach(itemType => {
itemType.children = this.originalItemTypes.find(originalItemType => originalItemType.name === itemType.name).children; itemType.children = this.originalItemTypes.find(originalItemType => originalItemType.name === itemType.name).children
}); })
this.defaultExpandedKeys = []; this.defaultExpandedKeys = []
} else { } else {
this.updateFilteredItemsAndExpand(); this.updateFilteredItemsAndExpand()
} }
} }
}, },
mounted() { mounted() {
// itemTypes // itemTypes
this.originalItemTypes = JSON.parse(JSON.stringify(this.itemTypes)); this.originalItemTypes = JSON.parse(JSON.stringify(this.itemTypes))
} }
} }
</script> </script>

47
src/views/ModelMain.vue

@ -43,14 +43,16 @@
<SplitArea v-show="!hideLeft" class="section-left" :class="{'hidden-split':hideLeft}" <SplitArea v-show="!hideLeft" class="section-left" :class="{'hidden-split':hideLeft}"
:size="hideLeft ? 0 : sectionLeftSize"> :size="hideLeft ? 0 : sectionLeftSize">
<div class="section-item-wrap"> <div class="section-item-wrap">
<keep-alive>
<component v-if="calcLeftPanel?.component" :is="calcLeftPanel.component" <component v-if="calcLeftPanel?.component" :is="calcLeftPanel.component"
@close="closeMe('hideLeft')" /> @close="closeMe('hideLeft')" :key="calcLeftPanel?.name" />
</keep-alive>
</div> </div>
</SplitArea> </SplitArea>
<SplitArea class="section-center" :class="{'hidden-split':hideRight}" :size="calcCenterSize"> <SplitArea class="section-center" :class="{'hidden-split':hideRight}" :size="calcCenterSize">
<el-tabs type="card" class="section-tabs" v-model="centerActiveName" @tab-click="handleCenterTabClick"> <el-tabs type="card" class="section-tabs" v-model="centerActiveName" @tab-click="handleCenterTabClick">
<el-tab-pane label="2D视图" name="ModelEditor" lazy> <el-tab-pane label="2D视图" name="ModelEditor" lazy>
<ModelEditor /> <Model2DEditor />
</el-tab-pane> </el-tab-pane>
<el-tab-pane label="3D视图" name="ModelView" lazy> <el-tab-pane label="3D视图" name="ModelView" lazy>
<ModelView /> <ModelView />
@ -65,41 +67,20 @@
</SplitArea> </SplitArea>
<SplitArea v-show="!hideRight" class="section-right" :size="hideRight ? 0 : sectionRightSize"> <SplitArea v-show="!hideRight" class="section-right" :size="hideRight ? 0 : sectionRightSize">
<div class="section-item-wrap"> <div class="section-item-wrap">
<div class="title"> <keep-alive>
<component :is="calcRightPanel?.icon" /> <component v-if="calcRightPanel?.component" :is="calcRightPanel.component"
{{ calcRightPanel?.title }} @close="()=>closeMe('hideRight')" :key="calcRightPanel.name" />
<el-input v-model="sectionLeftSearch" size="small" style="width: 240px" placeholder="Search"> </keep-alive>
<template #prefix>
<component :is="renderIcon('element Search')"></component>
</template>
</el-input>
<span class="close" @click="closeMe('hideReft')"><component
:is="renderIcon('element Close')"></component></span>
</div>
<div class="calc-right-panel">
<component v-if="calcRightPanel?.component" :is="calcRightPanel.component" />
</div>
</div> </div>
</SplitArea> </SplitArea>
</Split> </Split>
</SplitArea> </SplitArea>
<SplitArea v-show="!hideBottom" :class="['section-bottom']" :size="hideBottom ? 0 : bottomSize" :min-size="0"> <SplitArea v-show="!hideBottom" :class="['section-bottom']" :size="hideBottom ? 0 : bottomSize" :min-size="0">
<div class="section-item-wrap"> <div class="section-item-wrap">
<div class="title"> <keep-alive>
<component :is="calcBottomPanel?.icon" /> <component v-if="calcBottomPanel?.component" :is="calcBottomPanel.component"
{{ calcBottomPanel?.title }} @close="()=>closeMe('hideBottom')" :key="calcBottomPanel.name" />
<el-input v-model="sectionLeftSearch" size="small" style="width: 240px" placeholder="Search"> </keep-alive>
<template #prefix>
<component :is="renderIcon('element Search')"></component>
</template>
</el-input>
<span class="close" @click="closeMe('hideBottom')">
<component :is="renderIcon('element Close')"></component>
</span>
</div>
<div class="calc-bottom-panel">
<component v-if="calcBottomPanel?.component" :is="calcBottomPanel.component" />
</div>
</div> </div>
</SplitArea> </SplitArea>
</Split> </Split>
@ -126,13 +107,13 @@ import './ModelMain.less'
import { ModelMainInit, ModelMainMounted, ModelMainUnmounted } from '@/views/ModelMainInit.js' import { ModelMainInit, ModelMainMounted, ModelMainUnmounted } from '@/views/ModelMainInit.js'
import { getRootMenu } from '@/runtime/DefineMenu.js' import { getRootMenu } from '@/runtime/DefineMenu.js'
import { getWidgetByName, getWidgetBySide, getAllWidget } from '@/runtime/DefineWidget.js' import { getWidgetByName, getWidgetBySide, getAllWidget } from '@/runtime/DefineWidget.js'
import ModelEditor from '@/designer/ModelEditor.vue' import Model2DEditor from '@/designer/Model2DEditor.vue'
import ModelView from '@/designer/ModelView.vue' import ModelView from '@/designer/ModelView.vue'
import { normalizeShortKey } from '@/utils/webutils.ts' import { normalizeShortKey } from '@/utils/webutils.ts'
export default { export default {
components: { ModelEditor, ModelView, Split, SplitArea }, components: { Model2DEditor, ModelView, Split, SplitArea },
created() { created() {
ModelMainInit() ModelMainInit()
}, },

Loading…
Cancel
Save