This commit is contained in:
zyy 2020-06-24 15:44:14 +08:00
commit 74b5f8a291
16 changed files with 307 additions and 516 deletions

File diff suppressed because one or more lines are too long

View File

@ -150,7 +150,7 @@ export default {
};
mouseCancelState(this.selected);
this.$store.dispatch('training/next', operate).then(({ valid }) => {
this.$store.dispatch('training/nextNew', operate).then(({ valid }) => {
if (valid) {
this.$store.dispatch('menuOperation/handleBreakFlag', { break: true });
} else {
@ -170,7 +170,7 @@ export default {
};
mouseCancelState(this.selected);
this.$store.dispatch('training/next', operate).then(({ valid }) => {
this.$store.dispatch('training/nextNew', operate).then(({ valid }) => {
if (valid) {
this.$store.dispatch('menuOperation/handleBreakFlag', { break: true });
} else {

View File

@ -1,126 +0,0 @@
<template>
<el-dialog
v-dialogDrag
class="xian-02__system station-human-control-all"
:title="title"
:visible.sync="show"
width="360px"
:before-close="doClose"
:z-index="2000"
:modal="false"
:close-on-click-modal="false"
append-to-body
>
<div class="context">
<span>{{ title }}</span>
</div>
<el-row justify="center" class="button-group">
<el-col :span="10" :offset="2">
<el-button :id="domIdConfirm" type="primary" :loading="loading" @click="commit">确定</el-button>
</el-col>
<el-col :span="8" :offset="4">
<el-button :id="domIdCancel" @click="cancel"> </el-button>
</el-col>
</el-row>
<notice-info ref="noticeInfo" pop-class="xian-02__systerm" />
</el-dialog>
</template>
<script>
import { MapDeviceType, OperationEvent } from '@/scripts/ConstDic';
import NoticeInfo from '@/jmapNew/theme/components/menus/childDialog/noticeInfo';
export default {
name: 'StationHumanControlAll',
components: {
NoticeInfo
},
data() {
return {
dialogShow: false,
loading: false,
selected: null,
operation: null
};
},
computed: {
show() {
return this.dialogShow && !this.$store.state.menuOperation.break;
},
title() {
return '全集中站进路交人工控';
},
domIdCancel() {
return this.dialogShow ? OperationEvent.Command.cancel.menu.domId : '';
},
domIdConfirm() {
return this.dialogShow ? OperationEvent.Station.humanControlALL.menu.domId : '';
}
},
mounted() {
this.$nextTick(() => {
this.$store.dispatch('training/tipReload');
});
},
methods: {
doShow(operate, selected) {
this.selected = selected;
if (!this.dialogShow) {
this.loading = false;
this.operation = operate.operation;
}
this.dialogShow = true;
this.$nextTick(function () {
this.$store.dispatch('training/emitTipFresh');
});
},
doClose() {
this.loading = false;
this.dialogShow = false;
this.$store.dispatch('training/emitTipFresh');
},
commit() {
const operate = {
send: true,
type: MapDeviceType.Station.type,
label: MapDeviceType.Station.label,
operation: OperationEvent.Station.humanControlALL.menu.operation
};
this.loading = true;
this.$store.dispatch('training/next', operate).then(({ valid }) => {
this.loading = false;
if (valid) {
this.doClose();
}
}).catch(() => {
this.loading = false;
this.doClose();
this.$refs.noticeInfo.doShow(operate);
});
},
cancel() {
const operate = {
type: MapDeviceType.Station.type,
operation: OperationEvent.Command.cancel.menu.operation
};
this.$store.dispatch('training/next', operate).then(({ valid }) => {
if (valid) {
this.doClose();
}
}).catch(() => {
this.doClose();
});
}
}
};
</script>
<style>
.station-human-control-all .context {
padding-bottom: 40px !important;
border: 1px solid lightgray;
}
</style>

View File

@ -1,145 +0,0 @@
<template>
<el-dialog
v-dialogDrag
class="xian-02__system station-set-route-control-all"
:title="title"
:visible.sync="show"
width="320px"
:before-close="doClose"
:z-index="2000"
:modal="false"
:close-on-click-modal="false"
append-to-body
>
<div style="padding: 0px 10px">
<el-form ref="form" size="small" label-width="90px" label-position="left">
<el-form-item label="集中站名称:" prop="stationName">
<el-input v-model="stationName" size="small" disabled />
</el-form-item>
</el-form>
<el-radio-group v-model="mode">
<el-row>
<el-radio :label="true">检查冲突</el-radio>
</el-row>
<el-row style="margin-top: 20px">
<el-radio :label="false">不检查冲突</el-radio>
</el-row>
</el-radio-group>
</div>
<el-row justify="center" class="button-group">
<el-col :span="10" :offset="2">
<el-button :id="domIdConfirm" type="primary" :loading="loading" @click="commit">确定</el-button>
</el-col>
<el-col :span="8" :offset="4">
<el-button :id="domIdCancel" @click="cancel"> </el-button>
</el-col>
</el-row>
<notice-info ref="noticeInfo" pop-class="xian-02__systerm" />
</el-dialog>
</template>
<script>
import { MapDeviceType, OperationEvent } from '@/scripts/ConstDic';
import NoticeInfo from '@/jmapNew/theme/components/menus/childDialog/noticeInfo';
export default {
name: 'StationSetRouteControlAll',
components: {
NoticeInfo
},
data() {
return {
dialogShow: false,
loading: false,
selected: null,
operation: null,
stationName: '',
mode: true
};
},
computed: {
show() {
return this.dialogShow && !this.$store.state.menuOperation.break;
},
title() {
return '全集中站设置进路控制模式';
},
domIdCancel() {
return this.dialogShow ? OperationEvent.Command.cancel.menu.domId : '';
},
domIdConfirm() {
return this.dialogShow ? OperationEvent.Station.atsAutoControlALL.menu.domId : '';
}
},
mounted() {
this.$nextTick(() => {
this.$store.dispatch('training/tipReload');
});
},
methods: {
doShow(operate, selected) {
this.selected = selected;
if (!this.dialogShow) {
this.loading = false;
this.operation = operate.operation;
this.stationName = '';
if (selected) {
this.stationName = selected.name;
}
}
this.dialogShow = true;
this.$nextTick(function () {
this.$store.dispatch('training/emitTipFresh');
});
},
doClose() {
this.loading = false;
this.dialogShow = false;
this.$store.dispatch('training/emitTipFresh');
},
commit() {
const operate = {
send: true,
type: MapDeviceType.Station.type,
label: MapDeviceType.Station.label,
operation: OperationEvent.Station.atsAutoControlALL.menu.operation,
val: this.mode
};
this.loading = true;
this.$store.dispatch('training/next', operate).then(({ valid }) => {
this.loading = false;
if (valid) {
this.doClose();
}
}).catch(() => {
this.loading = false;
this.doClose();
this.$refs.noticeInfo.doShow(operate);
});
},
cancel() {
const operate = {
type: MapDeviceType.Station.type,
operation: OperationEvent.Command.cancel.menu.operation
};
this.$store.dispatch('training/next', operate).then(({ valid }) => {
if (valid) {
this.doClose();
}
}).catch(() => {
this.doClose();
});
}
}
};
</script>
<style>
.station-set-route-control-all .context {
padding-bottom: 40px !important;
border: 1px solid lightgray;
}
</style>

View File

@ -69,7 +69,12 @@ export default {
if (list && list.length) {
list.forEach(item => {
if (item.device && item.device.code) {
const station = this.$store.getters['map/getDeviceByCode'](item.device.stationCode);
let station;
if (item.device._type == 'Station') {
station = item.device;
} else {
station = this.$store.getters['map/getDeviceByCode'](item.device.stationCode);
}
const param = {
station: `CP ${station.name}`,
operation: `${item.device.name} ${item.operation.name}`,

View File

@ -1,12 +1,12 @@
<template>
<div>
<pop-menu ref="popMenu" :menu="menu" pop-class="xian-02__pop_tip_station" :tip-msg="topTip" :tip-subhead="tipSubhead" />
<section-control ref="sectionControl" pop-class="xian-02__systerm" />
<section-control ref="sectionControl" pop-class="xian-02__system" />
<section-un-lock ref="sectionUnLock" />
<speed-limit-control ref="speedLimitControl" />
<notice-info ref="noticeInfo" pop-class="xian-02__systerm" />
<set-fault ref="setFault" pop-class="xian-02__systerm" />
<train-add-plan ref="trainAddPlan" pop-class="xian-02__systerm" />
<notice-info ref="noticeInfo" pop-class="xian-02__system" />
<set-fault ref="setFault" pop-class="xian-02__system" />
<train-add-plan ref="trainAddPlan" pop-class="xian-02__system" />
</div>
</template>

View File

@ -2,8 +2,8 @@
<div>
<pop-menu ref="popMenu" :menu="menu" :tip-msg="topTip" :tip-subhead="tipSubhead" pop-class="xian-02__pop_tip_station" />
<route-detail ref="routeDetail" />
<notice-info ref="noticeInfo" pop-class="xian-02__systerm" />
<set-fault ref="setFault" pop-class="xian-02__systerm" />
<notice-info ref="noticeInfo" pop-class="xian-02__system" />
<set-fault ref="setFault" pop-class="xian-02__system" />
</div>
</template>

View File

@ -2,8 +2,6 @@
<div class="xian-02__system">
<pop-menu ref="popMenu" :menu="menu" pop-class="xian-02__pop_tip_station" :tip-msg="topTip" :tip-subhead="tipSubhead" />
<station-cmd-control ref="stationCmdControl" />
<station-human-control-all ref="stationHumanControlAll" />
<station-set-route-control-all ref="stationSetRouteControlAll" />
<notice-info ref="noticeInfo" pop-class="xian-02__systerm" />
</div>
</template>
@ -11,8 +9,6 @@
<script>
import PopMenu from '@/components/PopMenu/index';
import StationCmdControl from './dialog/stationCmdControl';
import StationHumanControlAll from './dialog/stationHumanControlAll';
import StationSetRouteControlAll from './dialog/stationSetRouteControlAll';
import NoticeInfo from '@/jmapNew/theme/components/menus/childDialog/noticeInfo';
import { mapGetters } from 'vuex';
@ -26,8 +22,6 @@ export default {
components: {
PopMenu,
StationCmdControl,
StationHumanControlAll,
StationSetRouteControlAll,
NoticeInfo
},
props: {
@ -241,37 +235,55 @@ export default {
},
//
humanControlALL() {
const operate = {
const step = {
start: true,
over: true,
code: `${this.selected.code}`,
operation: OperationEvent.Station.humanControlALL.menu.operation,
cmdType: CMD.Station.CMD_STATION_CLOSE_AUTO_SETTING,
param: {
stationCode: this.selected.code
}
};
this.$store.dispatch('training/nextNew', operate).then(({ valid }) => {
this.$store.dispatch('training/nextNew', step).then(({ valid }) => {
if (valid) {
this.doClose();
this.$store.dispatch('menuOperation/handleBreakFlag', { break: true });
this.$store.dispatch('menuOperation/pushRequestList', {
device: this.selected,
operation: { code: OperationEvent.Station.humanControlALL.menu.operation, name: '所有进路自排关'},
cmdType: CMD.Station.CMD_STATION_CLOSE_AUTO_SETTING,
param: step.param
});
} else {
this.$refs.noticeInfo.doShow(step);
}
}).catch(() => this.doClose());
}).catch(() => {
this.$refs.noticeInfo.doShow(step);
});
},
//
atsAutoControlALL() {
const operate = {
const step = {
start: true,
over: true,
code: `${this.selected.code}`,
operation: OperationEvent.Station.atsAutoControlALL.menu.operation,
cmdType: CMD.Station.CMD_STATION_OPEN_AUTO_SETTING,
param: {
stationCode: this.selected.code
}
};
this.$store.dispatch('training/nextNew', operate).then(({ valid }) => {
this.$store.dispatch('training/nextNew', step).then(({ valid }) => {
if (valid) {
this.doClose();
this.$store.dispatch('menuOperation/handleBreakFlag', { break: true });
this.$store.dispatch('menuOperation/pushRequestList', {
device: this.selected,
operation: { code: OperationEvent.Station.atsAutoControlALL.menu.operation, name: '所有进路自排开'},
cmdType: CMD.Station.CMD_STATION_OPEN_AUTO_SETTING,
param: step.param
});
} else {
this.$refs.noticeInfo.doShow(step);
}
}).catch(() => this.doClose());
}).catch(() => {
this.$refs.noticeInfo.doShow(step);
});
},
undeveloped() {
this.doClose();

View File

@ -1,11 +1,11 @@
<template>
<div>
<pop-menu ref="popMenu" :menu="menu" pop-class="xian-02__pop_tip_station" :tip-msg="topTip" :tip-subhead="tipSubhead" />
<switch-control ref="switchControl" pop-class="xian-02__systerm" />
<switch-control ref="switchControl" pop-class="xian-02__system" />
<switch-un-lock ref="switchUnLock" />
<speed-limit-control ref="speedLimitControl" />
<notice-info ref="noticeInfo" pop-class="xian-02__systerm" />
<set-fault ref="setFault" pop-class="xian-02__systerm" />
<notice-info ref="noticeInfo" pop-class="xian-02__system" />
<set-fault ref="setFault" pop-class="xian-02__system" />
</div>
</template>

View File

@ -1,7 +1,7 @@
<template>
<div>
<pop-menu ref="popMenu" :menu="menu" :tip-msg="topTip" :tip-subhead="tipSubhead" pop-class="xian-02__pop_tip_station" />
<notice-info ref="noticeInfo" pop-class="xian-02__systerm" />
<notice-info ref="noticeInfo" pop-class="xian-02__system" />
<train-delete ref="trainDelete" />
<train-define ref="trainDefine" />
<train-move ref="trainMove" />

View File

@ -1,11 +1,11 @@
<template>
<div>
<pop-menu ref="popMenu" :menu="menu" trigger="click" :tip-msg="topTip" text-align="left" pop-class="xian-02__pop_tip_station" />
<notice-info ref="noticeInfo" pop-class="xian-02__systerm" />
<notice-info ref="noticeInfo" pop-class="xian-02__system" />
<update-stand-plan ref="updateStandPlan" :selected="selected" />
<warning-confirm ref="warningConfirm" :selected="selected" />
<stop-profile ref="stopProfile" :selected="selected" />
<set-fault ref="setFault" pop-class="xian-02__systerm" />
<set-fault ref="setFault" pop-class="xian-02__system" />
</div>
</template>

View File

@ -866,7 +866,7 @@ export const asyncRouter = [
},
children: [
{
path: 'edit/:id/:mode',
path: 'edit',
component: IscsDraw,
hidden: true
}
@ -908,7 +908,7 @@ export const asyncRouter = [
},
children: [
{
path: 'edit/:id/:mode',
path: 'edit',
component: IscsDraw,
hidden: true
}

View File

@ -74,226 +74,349 @@ export default {
this.treeList = [];
this.treeList = [
{
name: 'iscs系统',
id: 0,
name: 'FAS界面',
mode: 'fas',
id: 'fas',
type: 'system',
children: [
{
name: 'FAS界面',
name: '站厅报警',
mode: 'fas',
id: 'fas',
id: 'stationHall',
type: 'system',
children: [
{
name: '站厅报警',
mode: 'fas',
id: 'stationHall',
type: 'system',
children: [
{
name: '站厅报警',
mode: 'fas',
id: 'stationHall',
type: 'interface'
}
]
},
{
name: '站台报警',
mode: 'fas',
id: 'stand',
type: 'system',
children: {
name: '站台报警',
mode: 'fas',
id: 'stand',
type: 'interface'
}
},
{
name: '站台报警-公共',
mode: 'fas',
id: '12',
type: 'interface'
},
{
name: '系统状态',
mode: 'fas',
id: '13',
type: 'interface'
}
]
},
{
name: 'BAS界面',
mode: 'bas',
id: '2',
name: '站台报警',
mode: 'fas',
id: 'stand',
type: 'system',
children: [
{
name: '站台报警',
mode: 'fas',
id: 'stand',
type: 'interface'
},
{
name: '公共区域',
mode: 'fas',
id: 'standPublicArea',
type: 'interface'
}
]
},
{
name: '系统状态',
mode: 'fas',
id: 'systemState',
type: 'system',
children: [
{
name: '系统状态',
mode: 'fas',
id: 'systemState',
type: 'interface'
}
]
}
]
},
{
name: 'BAS界面',
mode: 'bas',
id: 'bas',
type: 'system',
children: [
{
name: '大系统',
mode: 'bas',
id: 'bigSystem',
type: 'system',
children:[
{
name: '大系统',
mode: 'bas',
id: '21',
id: 'bigSystem',
type: 'interface'
},
}
]
},
{
name: '小系统',
mode: 'bas',
id: 'smallSystem',
type: 'system',
children: [
{
name: '小系统',
name: '小系统A端(一)',
mode: 'bas',
id: '22',
type: 'interface'
},
{
name: '小系统B端',
mode: 'bas',
id: '22-1',
id: 'aSideOne',
type: 'interface'
},
{
name: '小系统A端(二)',
mode: 'bas',
id: '22-2',
id: 'aSideTwo',
type: 'interface'
},
{
name: '小系统B端',
mode: 'bas',
id: 'bSide',
type: 'interface'
}
]
},
{
name: '水系统',
mode: 'bas',
id: 'waterSystem',
type: 'system',
children: [
{
name: '水系统',
mode: 'bas',
id: '23',
id: 'waterSystem',
type: 'interface'
},
}
]
},
{
name: '照明',
mode: 'bas',
id: 'lightingSystem',
type: 'system',
children: [
{
name: '照明',
name: '照明系统',
mode: 'bas',
id: '24',
id: 'lightingSystem',
type: 'interface'
},
{
name: 'EPS系统',
mode: 'bas',
id: '25',
type: 'interface'
},
{
name: '电扶梯',
mode: 'bas',
id: '26',
type: 'interface'
},
{
name: '机电排水',
mode: 'bas',
id: '27',
type: 'interface'
},
{
name: '隧道通风',
mode: 'bas',
id: '28',
type: 'interface'
},
{
name: '隧道通风-射流风机图',
mode: 'bas',
id: '29',
type: 'interface'
},
{
name: '车站网络',
mode: 'bas',
id: '210',
id: 'epsSystem',
type: 'interface'
}
]
},
{
name: 'PSD界面',
name: '电扶梯',
mode: 'bas',
id: 'electricEscalator',
type: 'system',
children: [
{
name: '电扶梯',
mode: 'bas',
id: 'electricEscalator',
type: 'interface'
}
]
},
{
name: '机电排水',
mode: 'bas',
id: 'waterSupply',
type: 'system',
children: [
{
name: '机电排水',
mode: 'bas',
id: 'waterSupply',
type: 'interface'
}
]
},
{
name: '隧道通风',
mode: 'bas',
id: 'tunnelVentilation',
type: 'system',
children: [
{
name: '隧道通风',
mode: 'bas',
id: 'tunnelVentilation',
type: 'interface'
},
{
name: '射流风机图',
mode: 'bas',
id: 'jetFan',
type: 'interface'
}
]
},
{
name: '车站网络',
mode: 'bas',
id: 'stationNet',
type: 'system',
children: [
{
name: '车站网络',
mode:'bas',
id: 'stationNet',
type: 'interface'
}
]
}
]
},
{
name: 'PSD界面',
mode: 'psd',
id: 'psd',
type: 'system',
children: [
{
name: '屏蔽门',
mode: 'psd',
id: '3',
id: 'psd',
type: 'system',
children: [
{
name: '屏蔽门',
mode: 'psd',
id: '31',
id: 'psd',
type: 'interface'
}
]
},
}
]
},
{
name: 'cctv界面',
mode: 'cctv',
id: 'cctv',
type: 'system',
children: [
{
name: 'cctv界面',
name: '车站控制',
mode: 'cctv',
id: '4',
id: 'cctv',
type: 'system',
children: [
{
name: '车站控制-站厅',
name: '站厅',
mode: 'cctv',
id: '41',
id: 'stationHall',
type: 'interface'
},
{
name: '车站控制-站台',
name: '站台',
mode: 'cctv',
id: '42',
id: 'stand',
type: 'interface'
},
{
name: '中心设备状态',
name: '云台',
mode: 'cctv',
id: '43',
type: 'interface'
},
{
name: '车站控制-云台',
mode: 'cctv',
id: '44',
id: 'holder',
type: 'interface'
}
]
},
{
name: 'AFC界面',
name: '中心设备状态',
mode: 'cctv',
id: 'centralDeviceState',
type: 'system',
children: [
{
name: '中心设备状态',
mode: 'cctv',
id: 'centralDeviceState',
type: 'interface'
}
]
}
]
},
{
name: 'AFC界面',
mode: 'afc',
id: 'afc',
type: 'system',
children: [
{
name: '售检票',
mode: 'afc',
id: '5',
id: 'afc',
type: 'system',
children: [
{
name: '售检票',
mode: 'afc',
id: '51',
id: 'afc',
type: 'interface'
}
]
},
}
]
},
{
name: 'ACS界面',
mode: 'acs',
id: 'acs',
type: 'system',
children: [
{
name: 'ACS界面',
name: '门禁-站台层',
mode: 'acs',
id: '6',
id: 'stand',
type: 'system',
children: [
{
name: '门禁-站台层',
mode: 'acs',
id: '61',
type: 'interface'
},
{
name: '门禁-站厅层',
mode: 'acs',
id: '62',
id: 'stand',
type: 'interface'
}
]
},
{
name: '门禁-站厅层',
mode: 'acs',
id: 'stationHall',
type: 'system',
children: [
{
name: '门禁-站厅层',
mode: 'acs',
id: 'stationHall',
type: 'interface'
}
]
}
]
},
{
name: '网络状态',
mode: 'netState',
id: 'netState',
type: 'system',
children: [
{
name: '网络状态',
mode: 'netState',
id: '7',
id: 'netState',
type: 'system',
children: [
{
name: '网络状态',
mode: 'netState',
id: '71',
id: 'netState',
type: 'interface'
}
]
@ -307,7 +430,7 @@ export default {
case 'system' :
break;
case 'interface':
this.$router.push({ path: `/iscs/design/edit/${obj.id}/${obj.mode}` });
this.$router.push({ path: `/iscs/design/edit`, query: {mode: obj.mode, system: data.parent.data.id, part: obj.id} });
break;
}
},

View File

@ -49,24 +49,24 @@ export default {
},
computed:{
iscsMode() {
return this.$route.params.mode;
return this.$route.query.mode;
}
},
watch: {
$route(val) {
this.iscsChange(this.$route.params.id);
this.iscsChange(this.$route.query.mode, this.$route.query.system, this.$route.query.part);
}
},
mounted() {
this.$refs.iscsPlate.show();
this.$refs.iscsPlate.show(this.$route.query.mode, this.$route.query.system, this.$route.query.part);
this.$refs.iscsPlate.drawIscsInit();
},
beforeDestroy() {
},
methods: {
iscsChange(id) {
this.$refs.iscsPlate.show(id);
iscsChange(mode, system, part) {
this.$refs.iscsPlate.show(mode, system, part);
this.$refs.iscsPlate.drawIscsInit();
}
}

View File

@ -18,7 +18,7 @@ export default {
};
},
mounted() {
this.$refs.iscsPlate.show('net', 'netState', 'netState');
this.$refs.iscsPlate.show('netState', 'netState', 'netState');
},
methods: {}
};

View File

@ -9,7 +9,7 @@
import Vue from 'vue';
import Iscs from '@/iscs/iscs';
import { parser, deviceFactory } from '@/iscs/utils/parser';
import iscsData from '@/iscs/constant/iscsData';
import {getIscsData} from '@/iscs/constant/iscsData';
import { mapGetters } from 'vuex';
import { exitFullscreen } from '@/utils/screen';
import { putJointTrainingSimulationUser } from '@/api/chat';
@ -92,8 +92,8 @@ export default {
this.iscsDestroy();
},
methods: {
show (deviceCode) {
if (!deviceCode) {
show (mode, system, part) {
if (!mode || !system || !part) {
return;
}
document.getElementById(this.iscsId).oncontextmenu = function (e) {
@ -101,7 +101,7 @@ export default {
};
this.iscsDestroy();
this.loading = true;
const data = parser(iscsData[deviceCode], {width: this.canvasWidth, height: this.canvasHeight});
const data = parser(getIscsData(mode, system, part), {width: this.canvasWidth, height: this.canvasHeight});
this.$iscs = new Iscs({
dom: document.getElementById(this.iscsId),
config: {
@ -123,8 +123,8 @@ export default {
if (this.$route.query.group) {
this.$iscs.on('selected', this.onSelected, this);
}
this.setIscs(data, iscsData[deviceCode]);
this.$store.dispatch('iscs/setIscsData', iscsData[deviceCode]);
this.setIscs(data, getIscsData(mode, system, part));
this.$store.dispatch('iscs/setIscsData', getIscsData(mode, system, part));
if (this.$route.path.startsWith('/iscs/design')) {
this.$iscs.on('keyboard', this.onKeyboard, this);
}