|
@@ -27,18 +27,11 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
<template #left>
|
|
<template #left>
|
|
|
- <!-- 左侧Tab菜单栏 -->
|
|
|
|
|
- <div class="left-sidebar-wrap" v-if="currentView !== 'list-mode'">
|
|
|
|
|
- <TechTabs v-model="activeLeftTab" type="underline" @tab-click="handleTabClick">
|
|
|
|
|
- <TechTabPane label="总览" name="overview" class="menu-scroll-view" :loading="menuData.length === 0">
|
|
|
|
|
- <MenuItem theme="tech" v-for="item in menuData" :key="item.id" :node="item" :level="0"
|
|
|
|
|
- @node-click="handleMenuClick" @folder-click="handleFolderClick"/>
|
|
|
|
|
- </TechTabPane>
|
|
|
|
|
- <TechTabPane label="路口" name="crossing" class="menu-scroll-view" :loading="menuData.length === 0">
|
|
|
|
|
- <MenuItem theme="tech" v-for="item in menuData" :key="item.id" :node="item" :level="0"
|
|
|
|
|
- @node-click="handleMenuClick" />
|
|
|
|
|
- </TechTabPane>
|
|
|
|
|
- <TechTabPane label="干线" name="trunkLine" class="menu-scroll-view" :loading="trunkLineMenuData.length === 0">
|
|
|
|
|
|
|
+ <div class="left-sidebar-wrap">
|
|
|
|
|
+ <div class="left-sidebar-title">干线协调</div>
|
|
|
|
|
+ <div class="left-sidebar-body">
|
|
|
|
|
+ <div v-if="trunkLineMenuData.length === 0" class="sidebar-loading">加载中...</div>
|
|
|
|
|
+ <template v-else>
|
|
|
<MenuItem v-for="item in trunkLineMenuData" :key="item.id" :node="item" :level="0"
|
|
<MenuItem v-for="item in trunkLineMenuData" :key="item.id" :node="item" :level="0"
|
|
|
@node-click="handleTrunkLineClick">
|
|
@node-click="handleTrunkLineClick">
|
|
|
<template #label="{ node }">
|
|
<template #label="{ node }">
|
|
@@ -46,24 +39,8 @@
|
|
|
<span v-else>{{ node.label }} 绿波带</span>
|
|
<span v-else>{{ node.label }} 绿波带</span>
|
|
|
</template>
|
|
</template>
|
|
|
</MenuItem>
|
|
</MenuItem>
|
|
|
- </TechTabPane>
|
|
|
|
|
- <TechTabPane label="特勤" name="specialDuty" class="menu-scroll-view">
|
|
|
|
|
- <TaskCardList :listData="tableData" class="special-duty-pane"
|
|
|
|
|
- @view="({ item }) => handleSpecialTaskView(item)"
|
|
|
|
|
- @start="({ item }) => handleSpecialTaskStart(item)"
|
|
|
|
|
- @end="({ item }) => handleSpecialTaskEnd(item)"
|
|
|
|
|
- @restart="({ item }) => handleSpecialTaskRestart(item)"
|
|
|
|
|
- />
|
|
|
|
|
- </TechTabPane>
|
|
|
|
|
- </TechTabs>
|
|
|
|
|
- </div>
|
|
|
|
|
- <div class="list-mode-tabs" v-else>
|
|
|
|
|
- <TechTabs v-model="activeLeftTab" type="underline" @tab-click="onListTabSelect">
|
|
|
|
|
- <TechTabPane label="总览" name="overview" />
|
|
|
|
|
- <TechTabPane label="路口" name="crossing" />
|
|
|
|
|
- <TechTabPane label="干线" name="trunkLine" />
|
|
|
|
|
- <TechTabPane label="特勤" name="specialDuty" />
|
|
|
|
|
- </TechTabs>
|
|
|
|
|
|
|
+ </template>
|
|
|
|
|
+ </div>
|
|
|
</div>
|
|
</div>
|
|
|
</template>
|
|
</template>
|
|
|
|
|
|
|
@@ -104,12 +81,9 @@
|
|
|
<script>
|
|
<script>
|
|
|
import DashboardLayout from '@/layouts/DashboardLayout.vue';
|
|
import DashboardLayout from '@/layouts/DashboardLayout.vue';
|
|
|
import DateTimeWidget from '@/components/ui/DateTimeWidget.vue';
|
|
import DateTimeWidget from '@/components/ui/DateTimeWidget.vue';
|
|
|
-import TechTabs from '@/components/ui/TechTabs.vue';
|
|
|
|
|
-import TechTabPane from '@/components/ui/TechTabPane.vue';
|
|
|
|
|
import TongzhouTrafficMap from '@/components/TongzhouTrafficMap.vue';
|
|
import TongzhouTrafficMap from '@/components/TongzhouTrafficMap.vue';
|
|
|
import MenuItem from '@/components/ui/MenuItem.vue';
|
|
import MenuItem from '@/components/ui/MenuItem.vue';
|
|
|
import ButtonGroup from '@/components/ui/ButtonGroup.vue';
|
|
import ButtonGroup from '@/components/ui/ButtonGroup.vue';
|
|
|
-import TaskCardList from '@/components/ui/TaskCardList.vue';
|
|
|
|
|
import CrossingListPanel from '@/components/ui/CrossingListPanel.vue';
|
|
import CrossingListPanel from '@/components/ui/CrossingListPanel.vue';
|
|
|
import OnlineStatusTabs from '@/components/ui/OnlineStatusTabs.vue';
|
|
import OnlineStatusTabs from '@/components/ui/OnlineStatusTabs.vue';
|
|
|
import DeviceStatusTabs from '@/components/ui/DeviceStatusTabs.vue';
|
|
import DeviceStatusTabs from '@/components/ui/DeviceStatusTabs.vue';
|
|
@@ -121,12 +95,9 @@ export default {
|
|
|
components: {
|
|
components: {
|
|
|
DashboardLayout,
|
|
DashboardLayout,
|
|
|
DateTimeWidget,
|
|
DateTimeWidget,
|
|
|
- TechTabs,
|
|
|
|
|
- TechTabPane,
|
|
|
|
|
TongzhouTrafficMap,
|
|
TongzhouTrafficMap,
|
|
|
MenuItem,
|
|
MenuItem,
|
|
|
ButtonGroup,
|
|
ButtonGroup,
|
|
|
- TaskCardList,
|
|
|
|
|
CrossingListPanel,
|
|
CrossingListPanel,
|
|
|
OnlineStatusTabs,
|
|
OnlineStatusTabs,
|
|
|
DeviceStatusTabs,
|
|
DeviceStatusTabs,
|
|
@@ -717,6 +688,33 @@ export default {
|
|
|
.mode-switch>div {
|
|
.mode-switch>div {
|
|
|
width: 200px;
|
|
width: 200px;
|
|
|
}
|
|
}
|
|
|
|
|
+.left-sidebar-wrap {
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ flex-direction: column;
|
|
|
|
|
+ max-width: 400px;
|
|
|
|
|
+}
|
|
|
|
|
+.left-sidebar-title {
|
|
|
|
|
+ font-size: clamp(14px, 1.04vw, 20px);
|
|
|
|
|
+ font-weight: bold;
|
|
|
|
|
+ color: #e0e8f0;
|
|
|
|
|
+ padding: 12px 0;
|
|
|
|
|
+ letter-spacing: 2px;
|
|
|
|
|
+}
|
|
|
|
|
+.left-sidebar-body {
|
|
|
|
|
+ background: rgba(17, 36, 70, 0.9);
|
|
|
|
|
+ outline: 2px solid #3760A9;
|
|
|
|
|
+ outline-offset: -2px;
|
|
|
|
|
+ height: 700px;
|
|
|
|
|
+ overflow: auto;
|
|
|
|
|
+}
|
|
|
|
|
+.sidebar-loading {
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ align-items: center;
|
|
|
|
|
+ justify-content: center;
|
|
|
|
|
+ height: 120px;
|
|
|
|
|
+ color: #758599;
|
|
|
|
|
+ font-size: 14px;
|
|
|
|
|
+}
|
|
|
.duty-table {
|
|
.duty-table {
|
|
|
margin-top: 10px;
|
|
margin-top: 10px;
|
|
|
}
|
|
}
|