|
@@ -87,7 +87,7 @@
|
|
<a
|
|
<a
|
|
:draggable="true"
|
|
:draggable="true"
|
|
@dragstart="onAddShape($event, 'line')"
|
|
@dragstart="onAddShape($event, 'line')"
|
|
- @click.stop="onAddShape($event, 'line')"
|
|
|
|
|
|
+ @click="onAddShape($event, 'line')"
|
|
><t-icon name="slash"
|
|
><t-icon name="slash"
|
|
/></a>
|
|
/></a>
|
|
</t-tooltip>
|
|
</t-tooltip>
|
|
@@ -95,7 +95,7 @@
|
|
<a
|
|
<a
|
|
:draggable="true"
|
|
:draggable="true"
|
|
@dragstart="onAddShape($event, 'text')"
|
|
@dragstart="onAddShape($event, 'text')"
|
|
- @click.stop="onAddShape($event, 'text')"
|
|
|
|
|
|
+ @click="onAddShape($event, 'text')"
|
|
>T</a
|
|
>T</a
|
|
>
|
|
>
|
|
</t-tooltip>
|
|
</t-tooltip>
|
|
@@ -210,7 +210,7 @@
|
|
</t-tooltip>
|
|
</t-tooltip>
|
|
|
|
|
|
<t-tooltip content="100%视图" placement="bottom">
|
|
<t-tooltip content="100%视图" placement="bottom">
|
|
- <a @click="onScaleView"><t-icon name="refresh" /></a>
|
|
|
|
|
|
+ <a @click="onScaleFull"><t-icon name="refresh" /></a>
|
|
</t-tooltip>
|
|
</t-tooltip>
|
|
<t-tooltip content="窗口大小" placement="bottom">
|
|
<t-tooltip content="窗口大小" placement="bottom">
|
|
<a @click="onScaleWindow"><t-icon name="fullscreen-exit" /></a>
|
|
<a @click="onScaleWindow"><t-icon name="fullscreen-exit" /></a>
|
|
@@ -285,15 +285,23 @@
|
|
:visible="true"
|
|
:visible="true"
|
|
@close="dataDialog.show = false"
|
|
@close="dataDialog.show = false"
|
|
>
|
|
>
|
|
- <t-tabs :default-value="1" class="body">
|
|
|
|
|
|
+ <t-tabs v-model="dataDialog.tab" class="body">
|
|
<t-tab-panel :value="1" label="数据订阅" :destroy-on-hide="false">
|
|
<t-tab-panel :value="1" label="数据订阅" :destroy-on-hide="false">
|
|
<template #panel>
|
|
<template #panel>
|
|
<div v-if="!dataDialog.editNetwork">
|
|
<div v-if="!dataDialog.editNetwork">
|
|
- <t-row class="mt-16" justify="end">
|
|
|
|
- <t-space :size="12">
|
|
|
|
|
|
+ <div class="mt-16 flex between middle">
|
|
|
|
+ <div>
|
|
|
|
+ <t-checkbox
|
|
|
|
+ v-model="dataDialog.enableMock"
|
|
|
|
+ @change="onChangeMock"
|
|
|
|
+ >
|
|
|
|
+ 开启模拟数据
|
|
|
|
+ </t-checkbox>
|
|
|
|
+ </div>
|
|
|
|
+ <div>
|
|
<t-select-input
|
|
<t-select-input
|
|
v-model:inputValue="dataDialog.input"
|
|
v-model:inputValue="dataDialog.input"
|
|
- placeholder="搜索我的数据源"
|
|
|
|
|
|
+ placeholder="搜索我的数据订阅"
|
|
allow-input
|
|
allow-input
|
|
clearable
|
|
clearable
|
|
:popup-visible="dataDialog.popupVisible"
|
|
:popup-visible="dataDialog.popupVisible"
|
|
@@ -305,18 +313,27 @@
|
|
<template #panel>
|
|
<template #panel>
|
|
<ul style="padding: 4px">
|
|
<ul style="padding: 4px">
|
|
<li
|
|
<li
|
|
- class="hover-background"
|
|
|
|
|
|
+ class="hover-background item"
|
|
|
|
+ v-for="(item, i) in dataDialog.networkList"
|
|
|
|
+ :key="item.url"
|
|
|
|
+ @click="onSelectNetWork(item)"
|
|
|
|
+ >
|
|
|
|
+ 名称: {{ item.name }}
|
|
|
|
+ <div class="desc">地址: {{ item.url }}</div>
|
|
|
|
+ <span class="del" @click.stop="onDelNetWork(item, i)">
|
|
|
|
+ <t-icon name="delete" />
|
|
|
|
+ </span>
|
|
|
|
+ </li>
|
|
|
|
+ <li
|
|
|
|
+ v-if="dataDialog.networkList.length >= 10"
|
|
style="
|
|
style="
|
|
line-height: 1.5;
|
|
line-height: 1.5;
|
|
padding: 8px;
|
|
padding: 8px;
|
|
border-radius: 2px;
|
|
border-radius: 2px;
|
|
"
|
|
"
|
|
- v-for="item in dataDialog.networkList"
|
|
|
|
- :key="item.url"
|
|
|
|
- @click="() => onSelectNetWork(item)"
|
|
|
|
|
|
+ :key="-1"
|
|
>
|
|
>
|
|
- 名称: {{ item.name }}
|
|
|
|
- <div class="desc">地址: {{ item.url }}</div>
|
|
|
|
|
|
+ <div class="desc">...</div>
|
|
</li>
|
|
</li>
|
|
<li
|
|
<li
|
|
v-if="!dataDialog.networkList.length"
|
|
v-if="!dataDialog.networkList.length"
|
|
@@ -335,11 +352,15 @@
|
|
<t-icon name="search" class="hover" />
|
|
<t-icon name="search" class="hover" />
|
|
</template>
|
|
</template>
|
|
</t-select-input>
|
|
</t-select-input>
|
|
- <t-button style="height: 30px" @click="addNetwork">
|
|
|
|
|
|
+ <t-button
|
|
|
|
+ class="ml-12"
|
|
|
|
+ style="height: 30px"
|
|
|
|
+ @click="addNetwork"
|
|
|
|
+ >
|
|
添加数据订阅
|
|
添加数据订阅
|
|
</t-button>
|
|
</t-button>
|
|
- </t-space>
|
|
|
|
- </t-row>
|
|
|
|
|
|
+ </div>
|
|
|
|
+ </div>
|
|
<t-table
|
|
<t-table
|
|
class="mt-12"
|
|
class="mt-12"
|
|
row-key="id"
|
|
row-key="id"
|
|
@@ -348,17 +369,12 @@
|
|
:max-height="280"
|
|
:max-height="280"
|
|
size="small"
|
|
size="small"
|
|
>
|
|
>
|
|
- <template #type="{ row, rowIndex }">
|
|
|
|
- {{ row.type || 'MQTT' }}
|
|
|
|
|
|
+ <template #protocol="{ row, rowIndex }">
|
|
|
|
+ {{ row.protocol || 'MQTT' }}
|
|
</template>
|
|
</template>
|
|
<template #actions="{ row, rowIndex }">
|
|
<template #actions="{ row, rowIndex }">
|
|
<a @click="editNetwork(row)"> 编辑 </a>
|
|
<a @click="editNetwork(row)"> 编辑 </a>
|
|
- <t-popconfirm
|
|
|
|
- content="确认删除吗"
|
|
|
|
- @confirm="deleteNetwork(rowIndex)"
|
|
|
|
- >
|
|
|
|
- <a class="ml-12"> 删除 </a>
|
|
|
|
- </t-popconfirm>
|
|
|
|
|
|
+ <a class="ml-12" @click="deleteNetwork(rowIndex)"> 删除 </a>
|
|
</template>
|
|
</template>
|
|
<template #empty>
|
|
<template #empty>
|
|
<div class="center">
|
|
<div class="center">
|
|
@@ -373,7 +389,10 @@
|
|
<div v-else>
|
|
<div v-else>
|
|
<div class="mt-8">
|
|
<div class="mt-8">
|
|
<a
|
|
<a
|
|
- @click="dataDialog.editNetwork = false"
|
|
|
|
|
|
+ @click="
|
|
|
|
+ dataDialog.network = dataDialog.networkBak;
|
|
|
|
+ dataDialog.editNetwork = false;
|
|
|
|
+ "
|
|
class="flex middle"
|
|
class="flex middle"
|
|
style="width: 44px"
|
|
style="width: 44px"
|
|
>
|
|
>
|
|
@@ -387,173 +406,131 @@
|
|
</template>
|
|
</template>
|
|
</t-tab-panel>
|
|
</t-tab-panel>
|
|
<t-tab-panel :value="2" :destroy-on-hide="false">
|
|
<t-tab-panel :value="2" :destroy-on-hide="false">
|
|
- <template #label>
|
|
|
|
- 数据集
|
|
|
|
- <span><label class="vip-label ml-4">VIP</label></span>
|
|
|
|
- </template>
|
|
|
|
|
|
+ <template #label> 数据集 </template>
|
|
<template #panel>
|
|
<template #panel>
|
|
- <div class="form-item mt-20">
|
|
|
|
- <label style="width: 100px">
|
|
|
|
- 网络地址
|
|
|
|
- <t-tooltip
|
|
|
|
- content="使用网络数据代替自定义数据。高优先级,生产环境使用"
|
|
|
|
- >
|
|
|
|
- <t-icon
|
|
|
|
- name="help-circle"
|
|
|
|
- class="ml-4 hover"
|
|
|
|
- style="margin-top: -2px"
|
|
|
|
- />
|
|
|
|
- </t-tooltip>
|
|
|
|
- </label>
|
|
|
|
- <div class="w-full">
|
|
|
|
- <t-input v-model="dataDialog.datasetUrl" />
|
|
|
|
|
|
+ <template v-if="!dataDialog.editDataset">
|
|
|
|
+ <div class="form-item mt-16">
|
|
|
|
+ <label style="width: 100px"> 当前数据集 </label>
|
|
|
|
+ <div class="flex w-full">
|
|
|
|
+ <t-select
|
|
|
|
+ class="flex-grow"
|
|
|
|
+ v-model="dataDialog.datasetId"
|
|
|
|
+ filterable
|
|
|
|
+ placeholder="选择数据集"
|
|
|
|
+ :on-search="onInputDatasets"
|
|
|
|
+ :popup-props="{ overlayClassName: 'select-options' }"
|
|
|
|
+ @change="onSelDataset()"
|
|
|
|
+ >
|
|
|
|
+ <t-option
|
|
|
|
+ v-for="(item, i) in dataDialog.datasetList"
|
|
|
|
+ :key="item.id"
|
|
|
|
+ :value="item.id"
|
|
|
|
+ :label="item.name"
|
|
|
|
+ >
|
|
|
|
+ <div class="hover-background item">
|
|
|
|
+ 名称: {{ item.name }}
|
|
|
|
+ <div v-if="item.url" class="desc">
|
|
|
|
+ URL: {{ item.url }}
|
|
|
|
+ </div>
|
|
|
|
+ <div v-else class="desc">自定义</div>
|
|
|
|
+ <span class="del" @click.stop="onDelDataset(item, i)">
|
|
|
|
+ <t-icon name="delete" />
|
|
|
|
+ </span>
|
|
|
|
+ </div>
|
|
|
|
+ </t-option>
|
|
|
|
+ <t-option
|
|
|
|
+ v-if="dataDialog.datasetList.length >= 10"
|
|
|
|
+ :disabled="true"
|
|
|
|
+ >
|
|
|
|
+ <div class="ml-8 gray">...</div>
|
|
|
|
+ </t-option>
|
|
|
|
+ </t-select>
|
|
|
|
+
|
|
|
|
+ <t-button
|
|
|
|
+ class="ml-12 shrink-0"
|
|
|
|
+ style="height: 30px"
|
|
|
|
+ @click="addDataset"
|
|
|
|
+ >
|
|
|
|
+ 添加数据集
|
|
|
|
+ </t-button>
|
|
|
|
+ </div>
|
|
</div>
|
|
</div>
|
|
- </div>
|
|
|
|
- <div class="form-item" style="margin-top: 28px">
|
|
|
|
- <label style="width: 100px">
|
|
|
|
- 自定义
|
|
|
|
- <t-tooltip content="初始静态或模拟数据,开发设计阶段使用">
|
|
|
|
- <t-icon
|
|
|
|
- name="help-circle"
|
|
|
|
- class="ml-4 hover"
|
|
|
|
- style="margin-top: -2px"
|
|
|
|
- />
|
|
|
|
- </t-tooltip>
|
|
|
|
- </label>
|
|
|
|
- <div class="w-full flex">
|
|
|
|
- <t-button @click="importDataset">从Excel导入</t-button>
|
|
|
|
- <a href="/data.xlsx" download class="ml-16 mt-4">
|
|
|
|
- 下载Excel示例
|
|
|
|
|
|
+
|
|
|
|
+ <t-table
|
|
|
|
+ class="mt-12"
|
|
|
|
+ row-key="id"
|
|
|
|
+ :data="dataDialog.dataset.data"
|
|
|
|
+ :columns="datasetColumns"
|
|
|
|
+ size="small"
|
|
|
|
+ :max-height="280"
|
|
|
|
+ >
|
|
|
|
+ <template #type="{ row }">
|
|
|
|
+ {{ row.type || 'string' }}
|
|
|
|
+ </template>
|
|
|
|
+ </t-table>
|
|
|
|
+ </template>
|
|
|
|
+ <div v-else>
|
|
|
|
+ <div class="mt-8">
|
|
|
|
+ <a
|
|
|
|
+ @click="
|
|
|
|
+ dataDialog.dataset = dataDialog.datasetBak;
|
|
|
|
+ dataDialog.datasetId = dataDialog.dataset.id;
|
|
|
|
+ dataDialog.editDataset = 0;
|
|
|
|
+ "
|
|
|
|
+ class="flex middle"
|
|
|
|
+ style="width: 44px"
|
|
|
|
+ >
|
|
|
|
+ <t-icon name="rollback" class="mr-4" /> 返回
|
|
</a>
|
|
</a>
|
|
- <div class="flex-grow"></div>
|
|
|
|
- <a class="mt-4" @click="showAddData()"> + 添加数据 </a>
|
|
|
|
|
|
+ </div>
|
|
|
|
+ <div style="height: 300px; overflow-y: auto">
|
|
|
|
+ <Dataset v-model="dataDialog.dataset" />
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
-
|
|
|
|
- <t-table
|
|
|
|
- class="mt-12"
|
|
|
|
- row-key="id"
|
|
|
|
- :data="dataDialog.dataset"
|
|
|
|
- :columns="datasetColumns"
|
|
|
|
- size="small"
|
|
|
|
- :max-height="210"
|
|
|
|
- >
|
|
|
|
- <template #label="{ row }">
|
|
|
|
- {{ `${row.label}(${row.key})` }}
|
|
|
|
- </template>
|
|
|
|
- <template #type="{ row }">
|
|
|
|
- {{ row.type || 'string' }}
|
|
|
|
- </template>
|
|
|
|
- <template #actions="{ row, rowIndex }">
|
|
|
|
- <t-icon name="edit" class="hover" @click="showAddData(row)" />
|
|
|
|
- <t-icon
|
|
|
|
- name="delete"
|
|
|
|
- class="ml-12 hover"
|
|
|
|
- @click="dataDialog.dataset.splice(rowIndex, 1)"
|
|
|
|
- />
|
|
|
|
- </template>
|
|
|
|
- <template #empty>
|
|
|
|
- <div class="center">
|
|
|
|
- 暂无数据, <a class="mt-4" @click="showAddData()"> + 添加 </a>
|
|
|
|
- </div>
|
|
|
|
- </template>
|
|
|
|
- </t-table>
|
|
|
|
</template>
|
|
</template>
|
|
</t-tab-panel>
|
|
</t-tab-panel>
|
|
</t-tabs>
|
|
</t-tabs>
|
|
|
|
|
|
<template #footer>
|
|
<template #footer>
|
|
- <div v-if="dataDialog.editNetwork" class="flex middle">
|
|
|
|
|
|
+ <div
|
|
|
|
+ v-if="dataDialog.tab === 1 && dataDialog.editNetwork"
|
|
|
|
+ class="flex middle"
|
|
|
|
+ >
|
|
<div class="flex-grow"></div>
|
|
<div class="flex-grow"></div>
|
|
<t-checkbox v-model="dataDialog.save">
|
|
<t-checkbox v-model="dataDialog.save">
|
|
- 同时保存到我的数据源
|
|
|
|
|
|
+ 同时保存到我的数据订阅
|
|
</t-checkbox>
|
|
</t-checkbox>
|
|
- <t-button class="ml-16" @click="onOkNetwork">确定</t-button>
|
|
|
|
|
|
+ <t-button @click="onOkNetwork">确定</t-button>
|
|
|
|
+ </div>
|
|
|
|
+ <div v-else-if="dataDialog.tab === 2" class="flex middle">
|
|
|
|
+ <template v-if="dataDialog.editDataset === 1">
|
|
|
|
+ <div class="flex-grow"></div>
|
|
|
|
+ <t-checkbox v-model="dataDialog.save">
|
|
|
|
+ 同时保存为我的数据集
|
|
|
|
+ </t-checkbox>
|
|
|
|
+ <t-button @click="onOkDataset()">保存</t-button>
|
|
|
|
+ </template>
|
|
|
|
+ <template v-else-if="dataDialog.editDataset === 2">
|
|
|
|
+ <div class="flex-grow"></div>
|
|
|
|
+ <t-button @click="onOkDataset(true)"> 另外为新数据集 </t-button>
|
|
|
|
+ <t-button @click="onOkDataset()">保存</t-button>
|
|
|
|
+ </template>
|
|
|
|
+ <template v-else>
|
|
|
|
+ <a v-if="dataDialog.dataset.id" @click="editDataset">
|
|
|
|
+ 编辑当前数据集
|
|
|
|
+ </a>
|
|
|
|
+ <div class="flex-grow"></div>
|
|
|
|
+
|
|
|
|
+ <t-button @click="dataDialog.show = false"> 完成 </t-button>
|
|
|
|
+ </template>
|
|
</div>
|
|
</div>
|
|
<div v-else class="flex middle">
|
|
<div v-else class="flex middle">
|
|
<div class="flex-grow"></div>
|
|
<div class="flex-grow"></div>
|
|
- <t-button class="ml-16" @click="onOkDatasources"> 完成 </t-button>
|
|
|
|
|
|
+ <t-button @click="dataDialog.show = false"> 完成 </t-button>
|
|
</div>
|
|
</div>
|
|
</template>
|
|
</template>
|
|
</t-dialog>
|
|
</t-dialog>
|
|
|
|
|
|
- <t-dialog
|
|
|
|
- v-if="addDataDialog.show"
|
|
|
|
- :visible="true"
|
|
|
|
- class="data-dialog"
|
|
|
|
- :header="addDataDialog.header"
|
|
|
|
- @close="addDataDialog.show = false"
|
|
|
|
- @confirm="onOkAddData"
|
|
|
|
- >
|
|
|
|
- <div class="form-item mt-16">
|
|
|
|
- <label>名称</label>
|
|
|
|
- <t-input v-model="addDataDialog.data.label" placeholder="简短描述" />
|
|
|
|
- </div>
|
|
|
|
- <div class="form-item mt-16">
|
|
|
|
- <label>数据ID</label>
|
|
|
|
- <t-input v-model="addDataDialog.data.key" placeholder="数据ID" />
|
|
|
|
- </div>
|
|
|
|
- <div class="form-item mt-16">
|
|
|
|
- <label>类型</label>
|
|
|
|
- <t-select
|
|
|
|
- class="w-full"
|
|
|
|
- :options="typeOptions"
|
|
|
|
- v-model="addDataDialog.data.type"
|
|
|
|
- placeholder="字符串"
|
|
|
|
- @change="addDataDialog.data.value = null"
|
|
|
|
- />
|
|
|
|
- </div>
|
|
|
|
- <div class="form-item mt-16">
|
|
|
|
- <label>值</label>
|
|
|
|
- <div class="flex-grow" v-if="addDataDialog.data.type === 'number'">
|
|
|
|
- <t-input
|
|
|
|
- class="w-full"
|
|
|
|
- v-model="addDataDialog.data.value"
|
|
|
|
- placeholder="数字"
|
|
|
|
- />
|
|
|
|
- <div class="desc mt-8">
|
|
|
|
- 固定数字:直接输入数字。例如:5<br />
|
|
|
|
- 随机范围数字 :最小值-最大值。例如:0-1 或 0-100
|
|
|
|
- <br />
|
|
|
|
- 随机指定数字 :数字1,数字2,数字3... 。 例如:1,5,10,20<br />
|
|
|
|
- </div>
|
|
|
|
- </div>
|
|
|
|
- <div class="flex-grow" v-else-if="addDataDialog.data.type === 'bool'">
|
|
|
|
- <t-select v-model="addDataDialog.data.value">
|
|
|
|
- <t-option :key="true" :value="true" label="true"></t-option>
|
|
|
|
- <t-option :key="false" :value="false" label="false"></t-option>
|
|
|
|
- <t-option key="随机" label="随机"></t-option>
|
|
|
|
- </t-select>
|
|
|
|
- <div class="desc mt-8">
|
|
|
|
- 固定:指定true或false<br />
|
|
|
|
- 随机:随机生成一个布尔值<br />
|
|
|
|
- </div>
|
|
|
|
- </div>
|
|
|
|
- <div
|
|
|
|
- class="flex-grow"
|
|
|
|
- v-else-if="
|
|
|
|
- addDataDialog.data.type === 'array' ||
|
|
|
|
- addDataDialog.data.type === 'object'
|
|
|
|
- "
|
|
|
|
- >
|
|
|
|
- <CodeEditor v-model="addDataDialog.data.value" :json="true" />
|
|
|
|
- </div>
|
|
|
|
- <div class="flex-grow" v-else>
|
|
|
|
- <t-input
|
|
|
|
- class="w-full"
|
|
|
|
- v-model="addDataDialog.data.value"
|
|
|
|
- placeholder="字符串"
|
|
|
|
- />
|
|
|
|
- <div class="desc mt-8">
|
|
|
|
- 固定文字:直接输入。例如:大屏可视化<br />
|
|
|
|
- 随机文本:[文本长度]。例如:[8] 或 [16]<br />
|
|
|
|
- 随机指定文本:{文本1,文本2,文本3...} 。 例如:{大屏, 可视化}
|
|
|
|
- <br />
|
|
|
|
- </div>
|
|
|
|
- </div>
|
|
|
|
- </div>
|
|
|
|
- </t-dialog>
|
|
|
|
-
|
|
|
|
<t-dialog
|
|
<t-dialog
|
|
v-if="publishDialog.show"
|
|
v-if="publishDialog.show"
|
|
width="700px"
|
|
width="700px"
|
|
@@ -734,23 +711,21 @@ import {
|
|
autoSave,
|
|
autoSave,
|
|
newFile,
|
|
newFile,
|
|
SaveType,
|
|
SaveType,
|
|
- onScaleView,
|
|
|
|
|
|
+ onScaleFull,
|
|
onScaleWindow,
|
|
onScaleWindow,
|
|
useDot,
|
|
useDot,
|
|
- typeOptions,
|
|
|
|
} from '@/services/common';
|
|
} from '@/services/common';
|
|
import { useSelection } from '@/services/selections';
|
|
import { useSelection } from '@/services/selections';
|
|
import { defaultFormat } from '@/services/defaults';
|
|
import { defaultFormat } from '@/services/defaults';
|
|
import { checkData, localStorageName, Meta2dBackData } from '@/services/utils';
|
|
import { checkData, localStorageName, Meta2dBackData } from '@/services/utils';
|
|
import { debounce } from '@/services/debouce';
|
|
import { debounce } from '@/services/debouce';
|
|
-import { importExcel } from '@/services/excel';
|
|
|
|
import { s8 } from '@/services/random';
|
|
import { s8 } from '@/services/random';
|
|
|
|
+import { setCookie } from '@/services/cookie';
|
|
|
|
|
|
-import CodeEditor from './common/CodeEditor.vue';
|
|
|
|
import ContextMenu from './ContextMenu.vue';
|
|
import ContextMenu from './ContextMenu.vue';
|
|
import Network from './Network.vue';
|
|
import Network from './Network.vue';
|
|
|
|
+import Dataset from './Dataset.vue';
|
|
import ChargeCloudPublish from './ChargeCloudPublish.vue';
|
|
import ChargeCloudPublish from './ChargeCloudPublish.vue';
|
|
-import { setCookie } from '@/services/cookie';
|
|
|
|
|
|
|
|
const router = useRouter();
|
|
const router = useRouter();
|
|
const route = useRoute();
|
|
const route = useRoute();
|
|
@@ -768,7 +743,6 @@ const meta2dOptions: Options = {
|
|
height: 1080,
|
|
height: 1080,
|
|
color: '#bdc7db',
|
|
color: '#bdc7db',
|
|
disableAnchor: true,
|
|
disableAnchor: true,
|
|
- domShapes: ['threeDSence'],
|
|
|
|
defaultFormat: { ...defaultFormat },
|
|
defaultFormat: { ...defaultFormat },
|
|
};
|
|
};
|
|
|
|
|
|
@@ -784,15 +758,13 @@ const publishDialog = reactive<any>({});
|
|
|
|
|
|
const publishChargeDialog = reactive<any>({});
|
|
const publishChargeDialog = reactive<any>({});
|
|
|
|
|
|
-const addDataDialog = reactive<any>({});
|
|
|
|
-
|
|
|
|
onMounted(() => {
|
|
onMounted(() => {
|
|
meta2d = new Meta2d('meta2d', meta2dOptions);
|
|
meta2d = new Meta2d('meta2d', meta2dOptions);
|
|
registerBasicDiagram();
|
|
registerBasicDiagram();
|
|
open(true);
|
|
open(true);
|
|
meta2d.on('active', active);
|
|
meta2d.on('active', active);
|
|
meta2d.on('inactive', inactive);
|
|
meta2d.on('inactive', inactive);
|
|
- meta2d.on('scale', scaleListener);
|
|
|
|
|
|
+ meta2d.on('scale', scaleSubscriber);
|
|
meta2d.on('add', lineAdd);
|
|
meta2d.on('add', lineAdd);
|
|
meta2d.on('opened', openedListener);
|
|
meta2d.on('opened', openedListener);
|
|
|
|
|
|
@@ -886,20 +858,6 @@ onUnmounted(() => {
|
|
clearInterval(timer);
|
|
clearInterval(timer);
|
|
watcher();
|
|
watcher();
|
|
if (meta2d) {
|
|
if (meta2d) {
|
|
- meta2d.off('active', active);
|
|
|
|
- meta2d.off('inactive', inactive);
|
|
|
|
- meta2d.off('scale', scaleListener);
|
|
|
|
- meta2d.off('add', lineAdd);
|
|
|
|
- meta2d.on('opened', openedListener);
|
|
|
|
- meta2d.off('undo', patchFlag);
|
|
|
|
- meta2d.off('redo', patchFlag);
|
|
|
|
- meta2d.off('add', patchFlag);
|
|
|
|
- meta2d.off('delete', patchFlag);
|
|
|
|
- meta2d.off('rotatePens', patchFlag);
|
|
|
|
- meta2d.off('translatePens', patchFlag);
|
|
|
|
- meta2d.off('components-update-value', patchFlag);
|
|
|
|
- meta2d.off('contextmenu', onContextmenu);
|
|
|
|
- meta2d.off('click', canvasClick);
|
|
|
|
meta2d.destroy();
|
|
meta2d.destroy();
|
|
}
|
|
}
|
|
});
|
|
});
|
|
@@ -945,11 +903,13 @@ const clearFormat = () => {
|
|
};
|
|
};
|
|
|
|
|
|
const scale = ref(100);
|
|
const scale = ref(100);
|
|
-function scaleListener(newScale: number) {
|
|
|
|
- scale.value = Math.round(newScale * 100);
|
|
|
|
-}
|
|
|
|
|
|
+const scaleSubscriber = (val: number) => {
|
|
|
|
+ scale.value = Math.round(val * 100);
|
|
|
|
+};
|
|
|
|
|
|
-const dataDialog = reactive<any>({});
|
|
|
|
|
|
+const dataDialog = reactive<any>({
|
|
|
|
+ tab: 1,
|
|
|
|
+});
|
|
|
|
|
|
const currentLineType = ref('curve');
|
|
const currentLineType = ref('curve');
|
|
const lineTypes = reactive([
|
|
const lineTypes = reactive([
|
|
@@ -1091,6 +1051,7 @@ const lineAdd = (pens: Pen[]) => {
|
|
};
|
|
};
|
|
|
|
|
|
const onAddShape = (event: DragEvent | MouseEvent, name: string) => {
|
|
const onAddShape = (event: DragEvent | MouseEvent, name: string) => {
|
|
|
|
+ event.stopPropagation();
|
|
let data: any;
|
|
let data: any;
|
|
if (name === 'text') {
|
|
if (name === 'text') {
|
|
data = {
|
|
data = {
|
|
@@ -1102,11 +1063,11 @@ const onAddShape = (event: DragEvent | MouseEvent, name: string) => {
|
|
} else if (name === 'line') {
|
|
} else if (name === 'line') {
|
|
data = {
|
|
data = {
|
|
anchors: [
|
|
anchors: [
|
|
- { id: '0', x: 0, y: 0.5 },
|
|
|
|
- { id: '1', x: 1, y: 0.5 },
|
|
|
|
|
|
+ { id: '0', x: 1, y: 0 },
|
|
|
|
+ { id: '1', x: 0, y: 1 },
|
|
],
|
|
],
|
|
width: 100,
|
|
width: 100,
|
|
- height: 1,
|
|
|
|
|
|
+ height: 100,
|
|
name: 'line',
|
|
name: 'line',
|
|
lineName: 'line',
|
|
lineName: 'line',
|
|
type: 1,
|
|
type: 1,
|
|
@@ -1117,7 +1078,6 @@ const onAddShape = (event: DragEvent | MouseEvent, name: string) => {
|
|
} else {
|
|
} else {
|
|
(event as DragEvent).dataTransfer?.setData('Meta2d', JSON.stringify(data));
|
|
(event as DragEvent).dataTransfer?.setData('Meta2d', JSON.stringify(data));
|
|
}
|
|
}
|
|
- event.stopPropagation();
|
|
|
|
};
|
|
};
|
|
|
|
|
|
const isLock = ref(0);
|
|
const isLock = ref(0);
|
|
@@ -1205,8 +1165,8 @@ const networkColumns = ref([
|
|
width: 160,
|
|
width: 160,
|
|
},
|
|
},
|
|
{
|
|
{
|
|
- colKey: 'type',
|
|
|
|
- title: '类型',
|
|
|
|
|
|
+ colKey: 'protocol',
|
|
|
|
+ title: '通信方式',
|
|
width: 120,
|
|
width: 120,
|
|
},
|
|
},
|
|
{
|
|
{
|
|
@@ -1217,46 +1177,126 @@ const networkColumns = ref([
|
|
{ colKey: 'actions', title: '操作', width: 100 },
|
|
{ colKey: 'actions', title: '操作', width: 100 },
|
|
]);
|
|
]);
|
|
|
|
|
|
-const onShowDataDialog = () => {
|
|
|
|
|
|
+const onShowDataDialog = async () => {
|
|
dataDialog.input = '';
|
|
dataDialog.input = '';
|
|
dataDialog.networks = meta2d.store.data.networks || [];
|
|
dataDialog.networks = meta2d.store.data.networks || [];
|
|
// @ts-ignore
|
|
// @ts-ignore
|
|
- dataDialog.datasetUrl = meta2d.store.data.datasetUrl;
|
|
|
|
|
|
+ dataDialog.dataset = meta2d.store.data.dataset || {};
|
|
|
|
+ dataDialog.datasetId = dataDialog.dataset.id;
|
|
// @ts-ignore
|
|
// @ts-ignore
|
|
- dataDialog.dataset = meta2d.store.data.dataset;
|
|
|
|
|
|
+ dataDialog.enableMock = meta2d.store.data.enableMock;
|
|
dataDialog.networkList = [];
|
|
dataDialog.networkList = [];
|
|
|
|
+ dataDialog.datasetList = [];
|
|
dataDialog.editNetwork = false;
|
|
dataDialog.editNetwork = false;
|
|
dataDialog.save = true;
|
|
dataDialog.save = true;
|
|
dataDialog.show = true;
|
|
dataDialog.show = true;
|
|
getNetworks();
|
|
getNetworks();
|
|
|
|
+ await getDatasets();
|
|
|
|
+ onSelDataset(true);
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+const onChangeMock = () => {
|
|
|
|
+ // @ts-ignore
|
|
|
|
+ meta2d.store.data.enableMock = dataDialog.enableMock;
|
|
};
|
|
};
|
|
|
|
|
|
const onSelectNetWork = (item: any) => {
|
|
const onSelectNetWork = (item: any) => {
|
|
- dataDialog.networks.push(item);
|
|
|
|
|
|
+ const network: any = dataDialog.networks.find(
|
|
|
|
+ (elem: any) => item.id === elem.id
|
|
|
|
+ );
|
|
|
|
+ if (!network) {
|
|
|
|
+ dataDialog.networks.push(item);
|
|
|
|
+ meta2d.store.data.networks = dataDialog.networks;
|
|
|
|
+ meta2d.connectNetwork();
|
|
|
|
+ setDot(true);
|
|
|
|
+ }
|
|
|
|
+
|
|
dataDialog.popupVisible = false;
|
|
dataDialog.popupVisible = false;
|
|
};
|
|
};
|
|
|
|
|
|
-const onInputNetwork = (text: string) => {
|
|
|
|
|
|
+const onDelNetWork = async (item: any, i: number) => {
|
|
|
|
+ const ret: any = await axios.post(`/api/data/datasources/delete`, {
|
|
|
|
+ id: item._id || item.id,
|
|
|
|
+ });
|
|
|
|
+ if (ret) {
|
|
|
|
+ dataDialog.networkList.splice(i, 1);
|
|
|
|
+ }
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+const onInputNetwork = () => {
|
|
debounce(getNetworks, 300);
|
|
debounce(getNetworks, 300);
|
|
};
|
|
};
|
|
|
|
|
|
-// 请求我的数据源接口
|
|
|
|
|
|
+// 请求我的数据订阅
|
|
const getNetworks = async () => {
|
|
const getNetworks = async () => {
|
|
- const ret: any = await axios.post(`/api/data/datasources/list`, {
|
|
|
|
- q: {
|
|
|
|
- name: dataDialog.input,
|
|
|
|
|
|
+ const ret: any = await axios.post(
|
|
|
|
+ `/api/data/datasources/list`,
|
|
|
|
+ {
|
|
|
|
+ q: {
|
|
|
|
+ name: dataDialog.input,
|
|
|
|
+ },
|
|
|
|
+ query: {
|
|
|
|
+ type: 'subscribe',
|
|
|
|
+ },
|
|
|
|
+ projection: { updatedAt: 0 },
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ params: {
|
|
|
|
+ current: 1,
|
|
|
|
+ pageSize: 10,
|
|
|
|
+ },
|
|
|
|
+ }
|
|
|
|
+ );
|
|
|
|
+ if (ret?.list) {
|
|
|
|
+ for (const item of ret.list) {
|
|
|
|
+ item.id = item.id || item._id;
|
|
|
|
+ }
|
|
|
|
+ dataDialog.networkList = ret.list;
|
|
|
|
+ }
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+const onInputDatasets = (name: string) => {
|
|
|
|
+ debounce(getDatasets, 300, name);
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+// 请求我的数据集
|
|
|
|
+const getDatasets = async (name?: string) => {
|
|
|
|
+ const body: any = {
|
|
|
|
+ query: {
|
|
|
|
+ type: 'dataset',
|
|
},
|
|
},
|
|
projection: { updatedAt: 0 },
|
|
projection: { updatedAt: 0 },
|
|
|
|
+ };
|
|
|
|
+ if (name) {
|
|
|
|
+ body.q = { name };
|
|
|
|
+ }
|
|
|
|
+ const ret: any = await axios.post(`/api/data/datasources/list`, body, {
|
|
|
|
+ params: {
|
|
|
|
+ current: 1,
|
|
|
|
+ pageSize: 10,
|
|
|
|
+ },
|
|
});
|
|
});
|
|
- if (ret) {
|
|
|
|
- dataDialog.networkList = ret.list;
|
|
|
|
|
|
+ if (ret?.list) {
|
|
|
|
+ let found = false;
|
|
|
|
+ for (const item of ret.list) {
|
|
|
|
+ item.id = item.id || item._id;
|
|
|
|
+ if (dataDialog.dataset?.id === item.id) {
|
|
|
|
+ found = true;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ if (dataDialog.dataset?.id && !found) {
|
|
|
|
+ ret.list.push(dataDialog.dataset);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ dataDialog.datasetList = ret.list;
|
|
}
|
|
}
|
|
};
|
|
};
|
|
|
|
|
|
const addNetwork = () => {
|
|
const addNetwork = () => {
|
|
dataDialog.network = {
|
|
dataDialog.network = {
|
|
name: '',
|
|
name: '',
|
|
- type: '',
|
|
|
|
|
|
+ type: 'subscribe',
|
|
|
|
+ protocol: 'mqtt',
|
|
url: '',
|
|
url: '',
|
|
options: {
|
|
options: {
|
|
clientId: '',
|
|
clientId: '',
|
|
@@ -1269,18 +1309,19 @@ const addNetwork = () => {
|
|
};
|
|
};
|
|
|
|
|
|
const editNetwork = (data: any) => {
|
|
const editNetwork = (data: any) => {
|
|
- dataDialog.network = data;
|
|
|
|
|
|
+ dataDialog.networkBak = data;
|
|
|
|
+ dataDialog.network = JSON.parse(JSON.stringify(data));
|
|
dataDialog.editNetwork = 2;
|
|
dataDialog.editNetwork = 2;
|
|
};
|
|
};
|
|
|
|
|
|
const deleteNetwork = (index: number) => {
|
|
const deleteNetwork = (index: number) => {
|
|
dataDialog.networks.splice(index, 1);
|
|
dataDialog.networks.splice(index, 1);
|
|
- meta2d.connectSocket();
|
|
|
|
|
|
+ meta2d.store.data.networks = dataDialog.networks;
|
|
|
|
+ meta2d.connectNetwork();
|
|
|
|
+ setDot(true);
|
|
};
|
|
};
|
|
|
|
|
|
const onOkNetwork = async () => {
|
|
const onOkNetwork = async () => {
|
|
- // 保存到我的数据源
|
|
|
|
-
|
|
|
|
if (dataDialog.editNetwork === 1) {
|
|
if (dataDialog.editNetwork === 1) {
|
|
if (dataDialog.save) {
|
|
if (dataDialog.save) {
|
|
const ret: any = await axios.post(
|
|
const ret: any = await axios.post(
|
|
@@ -1290,10 +1331,11 @@ const onOkNetwork = async () => {
|
|
if (!ret) {
|
|
if (!ret) {
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
- dataDialog.network._id = ret._id || ret.id;
|
|
|
|
- dataDialog.network.id = dataDialog.network._id;
|
|
|
|
|
|
+ ret.id = ret.id || ret._id;
|
|
|
|
+ dataDialog.network._id = dataDialog.network.id = ret.id;
|
|
}
|
|
}
|
|
dataDialog.networks.push(dataDialog.network);
|
|
dataDialog.networks.push(dataDialog.network);
|
|
|
|
+ dataDialog.networkList.push(dataDialog.network);
|
|
} else if (dataDialog.editNetwork === 2) {
|
|
} else if (dataDialog.editNetwork === 2) {
|
|
if (dataDialog.save) {
|
|
if (dataDialog.save) {
|
|
const ret: any = await axios.post(
|
|
const ret: any = await axios.post(
|
|
@@ -1306,94 +1348,130 @@ const onOkNetwork = async () => {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ meta2d.store.data.networks = dataDialog.networks;
|
|
|
|
+ meta2d.connectNetwork();
|
|
|
|
+ setDot(true);
|
|
|
|
+
|
|
dataDialog.editNetwork = false;
|
|
dataDialog.editNetwork = false;
|
|
|
|
+ delete dataDialog.networkBak;
|
|
};
|
|
};
|
|
|
|
|
|
const datasetColumns = ref([
|
|
const datasetColumns = ref([
|
|
{
|
|
{
|
|
colKey: 'label',
|
|
colKey: 'label',
|
|
- title: '名称(数据ID)',
|
|
|
|
|
|
+ title: '数据点名称',
|
|
ellipsis: true,
|
|
ellipsis: true,
|
|
},
|
|
},
|
|
{
|
|
{
|
|
- colKey: 'type',
|
|
|
|
- title: '类型',
|
|
|
|
|
|
+ colKey: 'id',
|
|
|
|
+ title: '数据点ID',
|
|
ellipsis: true,
|
|
ellipsis: true,
|
|
},
|
|
},
|
|
{
|
|
{
|
|
- colKey: 'value',
|
|
|
|
- title: '值',
|
|
|
|
|
|
+ colKey: 'type',
|
|
|
|
+ title: '类型',
|
|
ellipsis: true,
|
|
ellipsis: true,
|
|
},
|
|
},
|
|
- {
|
|
|
|
- colKey: 'actions',
|
|
|
|
- title: '操作',
|
|
|
|
- width: 80,
|
|
|
|
- },
|
|
|
|
]);
|
|
]);
|
|
|
|
|
|
-const importDataset = async () => {
|
|
|
|
- let columns: any = [
|
|
|
|
- {
|
|
|
|
- header: '名称',
|
|
|
|
- key: 'label',
|
|
|
|
- },
|
|
|
|
- {
|
|
|
|
- header: '数据ID',
|
|
|
|
- key: 'key',
|
|
|
|
- },
|
|
|
|
- {
|
|
|
|
- header: '类型',
|
|
|
|
- key: 'type',
|
|
|
|
- },
|
|
|
|
- {
|
|
|
|
- header: '场景',
|
|
|
|
- key: 'case',
|
|
|
|
- },
|
|
|
|
- {
|
|
|
|
- header: '值',
|
|
|
|
- key: 'value',
|
|
|
|
- },
|
|
|
|
- ];
|
|
|
|
- const data: any = await importExcel(columns);
|
|
|
|
- dataDialog.dataset = data;
|
|
|
|
|
|
+const addDataset = () => {
|
|
|
|
+ dataDialog.dataset = {
|
|
|
|
+ name: '',
|
|
|
|
+ type: 'dataset',
|
|
|
|
+ mode: 'api',
|
|
|
|
+ url: '',
|
|
|
|
+ data: [],
|
|
|
|
+ };
|
|
|
|
+ dataDialog.editDataset = 1;
|
|
};
|
|
};
|
|
|
|
|
|
-const onOkDatasources = () => {
|
|
|
|
- meta2d.store.data.networks = dataDialog.networks;
|
|
|
|
- // @ts-ignore
|
|
|
|
- meta2d.store.data.dataset = dataDialog.dataset;
|
|
|
|
- // @ts-ignore
|
|
|
|
- meta2d.store.data.datasetUrl = dataDialog.datasetUrl;
|
|
|
|
- dataDialog.show = false;
|
|
|
|
|
|
+const editDataset = () => {
|
|
|
|
+ dataDialog.datasetBak = dataDialog.dataset;
|
|
|
|
+ dataDialog.dataset = JSON.parse(JSON.stringify(dataDialog.dataset));
|
|
|
|
+ dataDialog.editDataset = 2;
|
|
};
|
|
};
|
|
|
|
|
|
-const showAddData = (row?: any) => {
|
|
|
|
- if (row) {
|
|
|
|
- addDataDialog.header = '编辑数据';
|
|
|
|
- addDataDialog.data = row;
|
|
|
|
|
|
+const onOkDataset = async (saveas = false) => {
|
|
|
|
+ if (!dataDialog.dataset.name) {
|
|
|
|
+ MessagePlugin.error('名称不能为空');
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ const dataset = JSON.parse(JSON.stringify(dataDialog.dataset));
|
|
|
|
+
|
|
|
|
+ // 保存到我的数据源
|
|
|
|
+ if (saveas || dataDialog.editDataset === 1) {
|
|
|
|
+ delete dataset.id;
|
|
|
|
+ delete dataset._id;
|
|
|
|
+ const ret: any = await axios.post(`/api/data/datasources/add`, dataset);
|
|
|
|
+ if (!ret) {
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ ret.id = ret.id || ret._id;
|
|
|
|
+ dataDialog.datasetId = ret.id;
|
|
|
|
+ dataDialog.dataset._id = dataDialog.dataset.id = ret.id;
|
|
|
|
+ dataDialog.datasetList.push(dataDialog.dataset);
|
|
} else {
|
|
} else {
|
|
- addDataDialog.header = '添加数据';
|
|
|
|
- addDataDialog.data = { type: 'string' };
|
|
|
|
|
|
+ const ret: any = await axios.post(`/api/data/datasources/update`, dataset);
|
|
|
|
+ if (!ret) {
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
- addDataDialog.show = true;
|
|
|
|
|
|
+ delete dataset.data;
|
|
|
|
+ // @ts-ignore
|
|
|
|
+ meta2d.store.data.dataset = dataset;
|
|
|
|
+
|
|
|
|
+ setDot(true);
|
|
|
|
+
|
|
|
|
+ dataDialog.editDataset = false;
|
|
|
|
+ delete dataDialog.datesetBak;
|
|
};
|
|
};
|
|
|
|
|
|
-const onOkAddData = () => {
|
|
|
|
- if (!addDataDialog.data.label) {
|
|
|
|
- MessagePlugin.error('请填写名称');
|
|
|
|
- return;
|
|
|
|
- }
|
|
|
|
- if (!addDataDialog.data.key) {
|
|
|
|
- MessagePlugin.error('请填写数据ID');
|
|
|
|
- return;
|
|
|
|
|
|
+const onDelDataset = async (item: any, i: number) => {
|
|
|
|
+ const ret: any = await axios.post(`/api/data/datasources/delete`, {
|
|
|
|
+ id: item.id,
|
|
|
|
+ });
|
|
|
|
+ if (ret) {
|
|
|
|
+ dataDialog.datasetList.splice(i, 1);
|
|
}
|
|
}
|
|
- if (!dataDialog.dataset) {
|
|
|
|
- dataDialog.dataset = [];
|
|
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+const onSelDataset = async (init = false) => {
|
|
|
|
+ if (dataDialog.datasetId) {
|
|
|
|
+ const dataset = dataDialog.datasetList.find((item: any) => {
|
|
|
|
+ return item.id === dataDialog.datasetId;
|
|
|
|
+ });
|
|
|
|
+
|
|
|
|
+ if (!dataset) {
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (dataset.url) {
|
|
|
|
+ const ret = await axios.get(dataset.url);
|
|
|
|
+ if (ret) {
|
|
|
|
+ dataset.data = ret;
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ const ret = await axios.post(`/api/data/datasources/get`, {
|
|
|
|
+ id: dataset.id,
|
|
|
|
+ });
|
|
|
|
+ if (ret?.data) {
|
|
|
|
+ dataset.data = ret.data;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ dataDialog.dataset = dataset;
|
|
|
|
+
|
|
|
|
+ if (!init) {
|
|
|
|
+ const d = JSON.parse(JSON.stringify(dataset));
|
|
|
|
+ delete d.data;
|
|
|
|
+ // @ts-ignore
|
|
|
|
+ meta2d.store.data.dataset = d;
|
|
|
|
+
|
|
|
|
+ setDot(true);
|
|
|
|
+ }
|
|
}
|
|
}
|
|
- dataDialog.dataset.push(addDataDialog.data);
|
|
|
|
- addDataDialog.show = false;
|
|
|
|
};
|
|
};
|
|
|
|
|
|
const share = async () => {
|
|
const share = async () => {
|
|
@@ -1551,6 +1629,7 @@ const onSuccessChargeCloud = () => {
|
|
height: 40px;
|
|
height: 40px;
|
|
flex-shrink: 0;
|
|
flex-shrink: 0;
|
|
padding: 0 12px;
|
|
padding: 0 12px;
|
|
|
|
+ z-index: 2;
|
|
|
|
|
|
a {
|
|
a {
|
|
display: flex;
|
|
display: flex;
|
|
@@ -1578,6 +1657,7 @@ const onSuccessChargeCloud = () => {
|
|
#meta2d {
|
|
#meta2d {
|
|
border-top: 1px solid var(--color-background-input);
|
|
border-top: 1px solid var(--color-background-input);
|
|
height: calc(100vh - 81px);
|
|
height: calc(100vh - 81px);
|
|
|
|
+ z-index: 1;
|
|
|
|
|
|
:deep(.meta2d-map) {
|
|
:deep(.meta2d-map) {
|
|
background: var(--color-background);
|
|
background: var(--color-background);
|