|
|
@ -6,10 +6,11 @@ |
|
|
<button class="icon-button" title="收起面板" @click="clearSelection"><svg><use href="#i-x" /></svg></button> |
|
|
<button class="icon-button" title="收起面板" @click="clearSelection"><svg><use href="#i-x" /></svg></button> |
|
|
</div> |
|
|
</div> |
|
|
|
|
|
|
|
|
<label class="device-search"> |
|
|
|
|
|
<svg><use href="#i-search" /></svg> |
|
|
|
|
|
<input v-model="search" type="text" placeholder="搜索机巢或无人机" /> |
|
|
|
|
|
</label> |
|
|
|
|
|
|
|
|
<div class="device-search"> |
|
|
|
|
|
<t-input v-model="search" clearable placeholder="搜索机巢或无人机"> |
|
|
|
|
|
<template #prefix-icon><t-icon name="search" /></template> |
|
|
|
|
|
</t-input> |
|
|
|
|
|
</div> |
|
|
|
|
|
|
|
|
<div class="filter-row"> |
|
|
<div class="filter-row"> |
|
|
<button class="filter" :class="{ active: filter === 'all' }" @click="filter = 'all'">全部 <b>{{ filterCounts.all }}</b></button> |
|
|
<button class="filter" :class="{ active: filter === 'all' }" @click="filter = 'all'">全部 <b>{{ filterCounts.all }}</b></button> |
|
|
@ -25,10 +26,12 @@ |
|
|
<div class="device-list"> |
|
|
<div class="device-list"> |
|
|
<template v-for="dock in filteredDocks" :key="dock.id"> |
|
|
<template v-for="dock in filteredDocks" :key="dock.id"> |
|
|
<article class="device-card" :class="{ active: isDockCardActive(dock), 'multi-selected': selectedDockIds.has(dock.id) }"> |
|
|
<article class="device-card" :class="{ active: isDockCardActive(dock), 'multi-selected': selectedDockIds.has(dock.id) }"> |
|
|
<label class="device-select-checkbox" :title="`选择${dock.name}`" @click.stop> |
|
|
|
|
|
<input type="checkbox" :checked="selectedDockIds.has(dock.id)" @change="toggleDockSelection(dock.id)" /> |
|
|
|
|
|
<span></span> |
|
|
|
|
|
</label> |
|
|
|
|
|
|
|
|
<div class="device-select-checkbox" :title="`选择${dock.name}`" @click.stop> |
|
|
|
|
|
<t-checkbox |
|
|
|
|
|
:checked="selectedDockIds.has(dock.id)" |
|
|
|
|
|
@change="(checked) => setDockSelection(dock.id, checked)" |
|
|
|
|
|
/> |
|
|
|
|
|
</div> |
|
|
<button class="device-card-main" @click="select(dock.id)"> |
|
|
<button class="device-card-main" @click="select(dock.id)"> |
|
|
<span class="dock-glyph" :class="{ alarm: dock.statusClass === 'alarm', offline: dock.statusClass === 'offline' }"> |
|
|
<span class="dock-glyph" :class="{ alarm: dock.statusClass === 'alarm', offline: dock.statusClass === 'offline' }"> |
|
|
<svg><use href="#i-home" /></svg> |
|
|
<svg><use href="#i-home" /></svg> |
|
|
@ -301,17 +304,14 @@ |
|
|
</section> |
|
|
</section> |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<div class="modal-backdrop" :class="{ open: dockStatusOpen }" :aria-hidden="!dockStatusOpen" @click.self="closeDockStatus"> |
|
|
|
|
|
<div class="modal dock-status-dialog" role="dialog" aria-modal="true" aria-labelledby="dockStatusTitle"> |
|
|
|
|
|
<header class="dock-status-header"> |
|
|
|
|
|
<div> |
|
|
|
|
|
<span>机巢运行状态</span> |
|
|
|
|
|
<h3 id="dockStatusTitle">{{ dockStatusTitle }}</h3> |
|
|
|
|
|
</div> |
|
|
|
|
|
<button class="icon-button" type="button" title="关闭详情" @click="closeDockStatus"> |
|
|
|
|
|
<svg><use href="#i-x" /></svg> |
|
|
|
|
|
</button> |
|
|
|
|
|
</header> |
|
|
|
|
|
|
|
|
<t-dialog |
|
|
|
|
|
v-model:visible="dockStatusOpen" |
|
|
|
|
|
:header="dockStatusTitle" |
|
|
|
|
|
width="700px" |
|
|
|
|
|
:footer="false" |
|
|
|
|
|
dialog-class-name="dock-status-dialog" |
|
|
|
|
|
@close="closeDockStatus" |
|
|
|
|
|
> |
|
|
<div class="dock-status-body"> |
|
|
<div class="dock-status-body"> |
|
|
<div class="dock-status-grid"> |
|
|
<div class="dock-status-grid"> |
|
|
<div> |
|
|
<div> |
|
|
@ -391,8 +391,7 @@ |
|
|
</div> |
|
|
</div> |
|
|
</section> |
|
|
</section> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
|
|
|
</div> |
|
|
|
|
|
|
|
|
</t-dialog> |
|
|
</template> |
|
|
</template> |
|
|
|
|
|
|
|
|
<script setup> |
|
|
<script setup> |
|
|
@ -1357,9 +1356,9 @@ function clearDockSelection() { |
|
|
selectedDockIds.clear() |
|
|
selectedDockIds.clear() |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
function toggleDockSelection(id) { |
|
|
|
|
|
if (selectedDockIds.has(id)) selectedDockIds.delete(id) |
|
|
|
|
|
else selectedDockIds.add(id) |
|
|
|
|
|
|
|
|
function setDockSelection(id, checked) { |
|
|
|
|
|
if (checked) selectedDockIds.add(id) |
|
|
|
|
|
else selectedDockIds.delete(id) |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
function selectAllDocks() { |
|
|
function selectAllDocks() { |
|
|
@ -1573,3 +1572,32 @@ async function runCommand(title, desc) { |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
</script> |
|
|
</script> |
|
|
|
|
|
|
|
|
|
|
|
<style scoped> |
|
|
|
|
|
.device-search { |
|
|
|
|
|
height: auto; |
|
|
|
|
|
margin-top: 16px; |
|
|
|
|
|
padding: 0; |
|
|
|
|
|
border: 0; |
|
|
|
|
|
background: transparent; |
|
|
|
|
|
} |
|
|
|
|
|
.device-search :deep(.t-input) { |
|
|
|
|
|
width: 100%; |
|
|
|
|
|
} |
|
|
|
|
|
.device-select-checkbox { |
|
|
|
|
|
width: auto; |
|
|
|
|
|
height: auto; |
|
|
|
|
|
display: flex; |
|
|
|
|
|
align-items: center; |
|
|
|
|
|
justify-content: center; |
|
|
|
|
|
} |
|
|
|
|
|
.device-select-checkbox :deep(.t-checkbox) { |
|
|
|
|
|
margin: 0; |
|
|
|
|
|
} |
|
|
|
|
|
.device-select-checkbox :deep(.t-checkbox__input) { |
|
|
|
|
|
margin: 0; |
|
|
|
|
|
} |
|
|
|
|
|
.dock-status-body { |
|
|
|
|
|
padding: 13px 18px 15px; |
|
|
|
|
|
} |
|
|
|
|
|
</style> |
|
|
|