index.vue 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776
  1. <template>
  2. <div
  3. id="box"
  4. class="bs-container"
  5. @mousemove="mousemoveOnBox"
  6. @mouseup="mouseupOnBox"
  7. >
  8. <el-row
  9. v-show="datasetType === null"
  10. type="flex"
  11. class="layout"
  12. >
  13. <div
  14. id="left-box"
  15. class="left-box"
  16. :style="{ 'transition': transition + 's' }"
  17. >
  18. <div class="inner-container">
  19. <TypeTree
  20. ref="datasetsTypeTree"
  21. :dataset-type-list="datasetTypeList"
  22. :app-code="appCode"
  23. @nodeClick="nodeClick"
  24. @refreshData="refreshData"
  25. @expandedNodes="expandedNodes"
  26. @reCategory="getTreeList"
  27. />
  28. </div>
  29. </div>
  30. <div
  31. class="right-box inner-container"
  32. :style="{ 'transition': transition + 's' }"
  33. >
  34. <div
  35. id="resize"
  36. class="resize pack-up-box"
  37. @mousedown="mousedown"
  38. @mouseup="mouseup"
  39. @mousemove="mousemove"
  40. >
  41. <a
  42. v-if="isPackUpTree"
  43. @click="packUpTree"
  44. @mousedown="resize = null"
  45. @mouseup="resize = null"
  46. @mousemove="resize = null"
  47. >
  48. <i :class="isPackUpTree === false ? 'el-icon-caret-left' : 'el-icon-caret-right'" />
  49. </a>
  50. <a
  51. v-else
  52. class="visible-pack-up"
  53. >
  54. <span>||</span>
  55. </a>
  56. </div>
  57. <el-form
  58. ref="queryForm"
  59. :model="queryForm"
  60. class="filter-container bs-el-form"
  61. @submit.native.prevent
  62. >
  63. <el-form-item
  64. class="filter-item"
  65. prop="name"
  66. >
  67. <el-input
  68. v-model="queryForm.name"
  69. class="bs-el-input"
  70. placeholder="请输入数据集名称"
  71. clearable
  72. @keyup.enter.native="handleSearch()"
  73. @clear="handleSearch()"
  74. />
  75. </el-form-item>
  76. <el-form-item
  77. class="filter-item"
  78. prop="labelIds"
  79. >
  80. <el-select
  81. v-model="queryForm.labelIds"
  82. class="bs-el-select"
  83. popper-class="bs-el-select"
  84. clearable
  85. filterable
  86. multiple
  87. collapse-tags
  88. placeholder="请选择数据集关联标签"
  89. @clear="handleSearch()"
  90. >
  91. <el-option
  92. v-for="labelItem in labelList"
  93. :key="labelItem.id"
  94. :label="labelItem.labelName"
  95. :value="labelItem.id"
  96. />
  97. </el-select>
  98. </el-form-item>
  99. <el-form-item class="filter-item">
  100. <el-button
  101. :loading="dataListLoading"
  102. type="primary"
  103. icon="el-icon-search"
  104. @click="handleSearch()"
  105. >
  106. 查询
  107. </el-button>
  108. </el-form-item>
  109. <el-form-item class="filter-item">
  110. <el-button
  111. class="bs-el-button-default"
  112. @click="addDataset"
  113. >
  114. 新增
  115. </el-button>
  116. </el-form-item>
  117. </el-form>
  118. <div class="bs-table-box">
  119. <el-table
  120. ref="userTable"
  121. v-table
  122. v-loading="dataListLoading"
  123. height="100%"
  124. class="bs-el-table bs-scrollbar"
  125. :element-loading-text="loadingText"
  126. :data="tableData"
  127. :header-cell-style="sortStyle"
  128. @sort-change="reSort"
  129. @current-change="handleCurrentChange"
  130. @select="selectDs"
  131. @select-all="selectAll"
  132. >
  133. <el-empty slot="empty" />
  134. <el-table-column
  135. v-if="isDialog && multiple"
  136. type="selection"
  137. width="55"
  138. />
  139. <el-table-column
  140. prop="name"
  141. label="数据集名称"
  142. align="left"
  143. show-overflow-tooltip
  144. >
  145. <template slot-scope="scope">
  146. <el-radio
  147. v-if="isDialog && !multiple"
  148. v-model="curRow"
  149. :label="scope.row"
  150. >
  151. {{ scope.row.name }}
  152. </el-radio>
  153. <span v-else>{{ scope.row.name }}</span>
  154. </template>
  155. </el-table-column>
  156. <el-table-column
  157. prop="datasetType"
  158. label="数据集类型"
  159. align="center"
  160. show-overflow-tooltip
  161. >
  162. <template slot-scope="scope">
  163. <span>{{ datasetTypeList.find(type=>type.datasetType===scope.row.datasetType) ? datasetTypeList.find(type=>type.datasetType===scope.row.datasetType).name : '其他' }}</span>
  164. </template>
  165. </el-table-column>
  166. <el-table-column
  167. prop="labelIds"
  168. label="标签"
  169. align="center"
  170. show-overflow-tooltip
  171. >
  172. <template slot-scope="scope">
  173. <span>{{ getLabels(scope.row.labelIds).join(',') }}</span>
  174. </template>
  175. </el-table-column>
  176. <el-table-column
  177. prop="remark"
  178. label="备注"
  179. align="left"
  180. show-overflow-tooltip
  181. />
  182. <!--操作栏-->
  183. <el-table-column
  184. label="操作"
  185. width="200"
  186. align="center"
  187. >
  188. <template
  189. v-if="showOperate(scope.row.datasetType)"
  190. slot-scope="scope"
  191. >
  192. <el-button
  193. class="bs-el-button-default"
  194. :disabled="scope.row.editable === 1 && !appCode"
  195. @click="toEdit(scope.row.id, scope.row.datasetType, scope.row.name, scope.row.typeId)"
  196. >
  197. 编辑
  198. </el-button>
  199. <el-button
  200. class="bs-el-button-default"
  201. :disabled="scope.row.editable === 1 && !appCode"
  202. @click="delDataset(scope.row.id)"
  203. >
  204. 删除
  205. </el-button>
  206. </template>
  207. </el-table-column>
  208. </el-table>
  209. </div>
  210. <div class="bs-pagination">
  211. <el-pagination
  212. class="bs-el-pagination"
  213. popper-class="bs-el-pagination"
  214. :current-page="current"
  215. :page-sizes="[10, 20, 50, 100]"
  216. :page-size="size"
  217. :total="totalCount"
  218. background
  219. prev-text="上一页"
  220. next-text="下一页"
  221. layout="total, prev, pager, next, sizes"
  222. @size-change="sizeChangeHandle"
  223. @current-change="currentChangeHandle"
  224. />
  225. </div>
  226. </div>
  227. </el-row>
  228. <!-- 新增-类型窗口 -->
  229. <DatasetTypeDialog
  230. ref="DatasetTypeDialog"
  231. :dataset-type-list="datasetTypeList"
  232. @openAddForm="openAddForm"
  233. />
  234. <checkDatasource
  235. ref="checkDatasource"
  236. :reasonList="reasonList"
  237. />
  238. <component
  239. :is="componentData.component"
  240. v-if="datasetType"
  241. ref="EditForm"
  242. :key="componentData.key"
  243. :config="componentData.config"
  244. :dataset-id="datasetId"
  245. :dataset-name="datasetName"
  246. :type-id="typeId"
  247. :is-edit="isEdit"
  248. :app-code="appCode"
  249. @back="back"
  250. />
  251. </div>
  252. </template>
  253. <script>
  254. import TypeTree from './TypeTree.vue'
  255. import JsEditForm from './JsEditForm.vue'
  256. import JsonEditForm from './JsonEditForm.vue'
  257. import table from 'data-room-ui/js/utils/table.js'
  258. import ScriptEditForm from './ScriptEditForm.vue'
  259. import checkDatasource from 'data-room-ui/DataSourceManagement/src/checkDatasource.vue'
  260. import CustomEditForm from './CustomEditForm.vue'
  261. import { pageMixins } from 'data-room-ui/js/mixins/page'
  262. import OriginalEditForm from './OriginalEditForm.vue'
  263. import DatasetTypeDialog from './DatasetTypeDialog.vue'
  264. import StoredProcedureEditForm from './StoredProcedureEditForm.vue'
  265. import { datasetPage, datasetRemove, datasetCheck } from 'data-room-ui/js/utils/datasetConfigService'
  266. import { getLabelList } from 'data-room-ui/js/utils/LabelConfigService'
  267. export default {
  268. name: 'DataSetManagement',
  269. directives: {
  270. table // 注册自定义指令
  271. },
  272. components: {
  273. TypeTree,
  274. DatasetTypeDialog,
  275. OriginalEditForm,
  276. CustomEditForm,
  277. JsonEditForm,
  278. StoredProcedureEditForm,
  279. ScriptEditForm,
  280. JsEditForm,
  281. checkDatasource
  282. },
  283. mixins: [pageMixins],
  284. props: {
  285. multiple: {
  286. type: Boolean,
  287. default: false
  288. },
  289. isDialog: {
  290. type: Boolean,
  291. default: false
  292. },
  293. dsValue: {
  294. type: [Array, Object],
  295. default: null
  296. },
  297. dataSetList: {
  298. type: [Array, Object],
  299. default: () => []
  300. },
  301. appCode: {
  302. type: String,
  303. default: ''
  304. },
  305. isBorder: {
  306. type: Boolean,
  307. default: false
  308. }
  309. },
  310. data () {
  311. return {
  312. reasonList:[],
  313. datasetType: null,
  314. isEdit: false,
  315. categoryData: [],
  316. tableData: [], // 表格数据
  317. queryForm: {
  318. name: '',
  319. datasetType: '',
  320. typeId: '', // 分类id
  321. labelIds: []
  322. }, // 查询条件
  323. // 数据集类型
  324. datasetTypeList: [],
  325. labelList: [],
  326. isPackUpTree: false,
  327. transition: 0.1,
  328. loadingText: '正在加载数据',
  329. dataListLoading: false,
  330. leftBox: null,
  331. rightBox: null,
  332. startX: null,
  333. event: null,
  334. endX: null,
  335. resize: null,
  336. datasetId: '', // 数据集Id,用于详情与编辑
  337. datasetName: '', // 数据集名称
  338. typeId: '', // 详情typeId
  339. curRow: null,
  340. multipleSelection: [],
  341. // 远程组件
  342. componentData: {
  343. component: null,
  344. config: null,
  345. key: new Date().getTime()
  346. }
  347. }
  348. },
  349. computed: {
  350. allType () {
  351. return this.datasetTypeList.map(item => item.datasetType).filter(item => item != '')
  352. }
  353. },
  354. watch: {
  355. datasetType (value) {
  356. if (value === null) {
  357. this.datasetId = ''
  358. this.datasetName = ''
  359. this.isEdit = false
  360. }
  361. }
  362. },
  363. mounted () {
  364. this.init()
  365. if (/Safari/.test(navigator.userAgent) && !/Chrome/.test(navigator.userAgent)) {
  366. // 当前浏览器为Safari浏览器
  367. // 执行相关操作
  368. document.addEventListener('mousemove', function (event) {
  369. if (event.buttons === 1) {
  370. event.preventDefault()
  371. }
  372. })
  373. }
  374. },
  375. methods: {
  376. getLabels (list) {
  377. const arr = []
  378. list?.forEach((item) => {
  379. arr.push(this.labelList.filter(x => x.id === item)[0]?.labelName)
  380. })
  381. return arr
  382. },
  383. toggleRowSelection () {
  384. this.$nextTick(() => {
  385. const dsIds = this.multipleSelection.map(ds => ds.id)
  386. this.$refs.userTable.clearSelection()
  387. this.tableData.forEach(item => {
  388. if (dsIds.includes(item.id)) {
  389. this.$refs.userTable.toggleRowSelection(item, true)
  390. }
  391. })
  392. })
  393. },
  394. // 全选
  395. selectAll (selection) {
  396. if (this.isDialog && this.multiple) {
  397. if (selection.length) {
  398. const dsIds = this.multipleSelection.map(ds => ds.id)
  399. selection.forEach(ds => {
  400. if (!dsIds.includes(ds.id)) {
  401. this.multipleSelection.push(ds)
  402. }
  403. })
  404. } else {
  405. this.tableData.forEach(row => {
  406. const dsIds = this.multipleSelection.map(ds => ds.id)
  407. const i = dsIds.indexOf(row.id)
  408. if (i > -1) this.multipleSelection.splice(i, 1)
  409. })
  410. }
  411. }
  412. },
  413. // 手动勾选
  414. selectDs (selection, row) {
  415. if (this.isDialog && this.multiple) {
  416. let dsIndex = null
  417. const ds = this.multipleSelection.find((ds, index) => {
  418. if (ds.id === row.id) {
  419. dsIndex = index
  420. return ds
  421. }
  422. })
  423. if (!ds) {
  424. this.multipleSelection.push(row)
  425. } else {
  426. this.multipleSelection.splice(dsIndex, 1)
  427. }
  428. }
  429. },
  430. // 获取选中数据集信息
  431. getSelectDs () {
  432. if (!this.isDialog) return
  433. if (this.multiple) {
  434. // 多选返回
  435. return this.multipleSelection
  436. } else {
  437. // 单选返回
  438. return this.curRow ? this.curRow : null
  439. }
  440. },
  441. // 单选数据集
  442. handleCurrentChange (currentRow) {
  443. this.curRow = currentRow
  444. },
  445. // 删除数据集
  446. delDataset (id) {
  447. datasetCheck(id).then((res)=>{
  448. console.log(res)
  449. if(res.canDelete){
  450. this.$confirm('确定删除当前数据集吗?', '提示', {
  451. confirmButtonText: '确定',
  452. cancelButtonText: '取消',
  453. type: 'warning',
  454. customClass: 'bs-el-message-box'
  455. }).then(() => {
  456. datasetRemove(id).then(res => {
  457. this.init(false)
  458. this.$message.success('删除成功')
  459. })
  460. }).catch(() => {
  461. })
  462. }else{
  463. this.reasonList=res.reasons
  464. this.$refs.checkDatasource.checkDatasourceVisible = true
  465. }
  466. })
  467. },
  468. // 详情
  469. toPreview (id, type, name, typeId) {
  470. this.datasetId = id
  471. this.datasetType = type
  472. this.datasetName = name
  473. this.typeId = typeId
  474. this.isEdit = false
  475. },
  476. toEdit (id, type, name, typeId) {
  477. this.datasetId = id
  478. this.datasetType = type
  479. this.componentData = this.getComponents(this.datasetTypeList.find(item => item?.datasetType === type)?.componentName) ?? ''
  480. this.datasetName = name
  481. this.typeId = typeId
  482. this.isEdit = true
  483. },
  484. // 回到管理端
  485. back () {
  486. this.datasetType = null
  487. this.isEdit = false
  488. },
  489. // 新增数据集-类型
  490. openAddForm (type, componentName) {
  491. this.datasetType = type
  492. this.componentData = this.getComponents(componentName)
  493. this.typeId = this.queryForm.typeId
  494. this.isEdit = true
  495. },
  496. showOperate (datasetType) {
  497. return this.getComponents(this.datasetTypeList.find(type => type.datasetType === datasetType)?.componentName)?.config?.showOperate ?? true
  498. },
  499. getComponents (componentName) {
  500. const components = Object.values(this.$options.components)
  501. let remoteComponentData = null
  502. if (window.BS_CONFIG?.customDatasetComponents && window.BS_CONFIG?.customDatasetComponents.length > 0) {
  503. // 获取远程组件
  504. remoteComponentData = window.BS_CONFIG?.customDatasetComponents.find(item => item.config.componentName === componentName)
  505. }
  506. return {
  507. component: components.find(component => component.name === componentName) || remoteComponentData?.vueFile,
  508. config: remoteComponentData?.config || null,
  509. key: new Date().getTime()
  510. }
  511. },
  512. // 初始化
  513. init (temp = true) {
  514. if (temp) {
  515. this.getTreeList()
  516. }
  517. if (this.isDialog) {
  518. if (this.multiple) {
  519. this.multipleSelection = this.dsValue ? this.dsValue : []
  520. } else {
  521. this.curRow = this.dsValue
  522. }
  523. }
  524. this.current = 1
  525. const list = [
  526. { name: '全部', datasetType: '' },
  527. { name: '原始数据集', datasetType: 'original', componentName: 'OriginalEditForm' },
  528. { name: '自助数据集', datasetType: 'custom', componentName: 'CustomEditForm' },
  529. { name: '存储过程数据集', datasetType: 'storedProcedure', componentName: 'StoredProcedureEditForm' },
  530. { name: 'JSON数据集', datasetType: 'json', componentName: 'JsonEditForm' },
  531. { name: '脚本数据集', datasetType: 'script', componentName: 'ScriptEditForm' },
  532. { name: 'JS数据集', datasetType: 'js', componentName: 'JsEditForm' }
  533. ]
  534. if (this.dataSetList.length !== 0) {
  535. this.datasetTypeList = [{ name: '全部', datasetType: '' }, ...list.filter(item => this.dataSetList.findIndex(x => x === item.datasetType) !== -1)]
  536. } else {
  537. this.datasetTypeList = [
  538. ...list
  539. ]
  540. }
  541. if (window.BS_CONFIG?.customDatasetComponents && window.BS_CONFIG?.customDatasetComponents.length > 0) {
  542. // 将获得到的远程数据集进行组装
  543. window.BS_CONFIG?.customDatasetComponents.forEach((item) => {
  544. this.datasetTypeList.push({ name: item.config.name, datasetType: item.config.datasetType, componentName: item.config.componentName })
  545. })
  546. }
  547. this.getDataList()
  548. // getLabelList().then(res => {
  549. // this.labelList = res
  550. // })
  551. },
  552. // 新增数据集
  553. addDataset () {
  554. this.$refs.DatasetTypeDialog.dialogVisible = true
  555. },
  556. selectChange () {
  557. this.getDataList()
  558. },
  559. getTreeList () {
  560. },
  561. // 获取表格数据
  562. getDataList () {
  563. getLabelList().then(res => {
  564. this.labelList = res
  565. })
  566. this.dataListLoading = true
  567. datasetPage({
  568. current: this.current,
  569. size: this.size,
  570. moduleCode: this.appCode,
  571. ...this.queryForm,
  572. datasetType: this.queryForm.datasetType === '' ? [...this.allType] : [this.queryForm.datasetType]
  573. }).then((data) => {
  574. this.tableData = data.list
  575. if (this.isDialog) {
  576. if (this.multiple && this.multipleSelection.length) {
  577. this.toggleRowSelection()
  578. } else if (this.curRow.id) {
  579. const ds = this.tableData.find(item => item.id === this.curRow.id)
  580. if (ds) this.curRow = ds
  581. }
  582. }
  583. this.totalCount = data.totalCount
  584. this.dataListLoading = false
  585. }).catch(() => {
  586. this.dataListLoading = false
  587. })
  588. },
  589. expandedNodes (data) {
  590. if (data && data > 50) {
  591. this.transition = 0
  592. } else {
  593. this.transition = 0.1
  594. }
  595. },
  596. nodeClick (row, type) {
  597. this.current = 1
  598. if (type === 'group') {
  599. this.queryForm.typeId = row.id
  600. this.queryForm.datasetType = ''
  601. } else if (type === 'type') {
  602. this.queryForm.typeId = ''
  603. this.queryForm.datasetType = row
  604. }
  605. this.getDataList()
  606. },
  607. refreshData (node) {
  608. if (node && node.id === this.queryForm.typeId) {
  609. this.queryForm.typeId = ''
  610. }
  611. this.getDataList()
  612. },
  613. handleSearch () {
  614. this.current = 1
  615. this.queryForm.typeId = ''
  616. // 清除左侧机构树的选中状态
  617. this.$refs.datasetsTypeTree.ztreeObj.cancelSelectedNode()
  618. this.getDataList()
  619. },
  620. // 拖拽修改div宽度
  621. mousedown (e) {
  622. this.resize = document.getElementsByClassName('resize')[0]
  623. this.resize.left = document.getElementById('left-box').getBoundingClientRect().width
  624. this.leftBox = document.getElementsByClassName('left-box')[0]
  625. this.rightBox = document.getElementsByClassName('right-box')[0]
  626. this.startX = e.clientX
  627. },
  628. mousemove (e) {
  629. this.event = e
  630. if (this.resize) {
  631. const boxWidth = document.getElementById('box').getBoundingClientRect().width
  632. this.endX = e.clientX
  633. const offset = document.getElementById('box').getBoundingClientRect().left > 300 ? 0 : 25
  634. const moveLen = this.resize.left + (this.endX - this.startX) + offset
  635. this.leftBox.style.width = moveLen / boxWidth * 100 + '%'
  636. this.rightBox.style.width = ((1 - moveLen / boxWidth) * 100) + '%'
  637. this.isPackUpTree = false
  638. if (moveLen < 100 && this.endX - this.startX < 0) {
  639. this.isPackUpTree = true
  640. this.leftBox.style.width = '0%'
  641. this.rightBox.style.width = '100%'
  642. } else if (moveLen / boxWidth > 0.5) {
  643. this.leftBox.style.width = '50%'
  644. this.rightBox.style.width = '50%'
  645. }
  646. }
  647. },
  648. packUpTree () {
  649. this.$refs.datasetsTypeTree.expandedNodes()
  650. this.isPackUpTree = !this.isPackUpTree
  651. if (!this.isPackUpTree) {
  652. this.leftBox.style.width = '25%'
  653. this.rightBox.style.width = '75%'
  654. } else {
  655. this.leftBox.style.width = '0%'
  656. this.rightBox.style.width = '100%'
  657. }
  658. },
  659. mouseup () {
  660. if (this.resize) {
  661. this.resize = null
  662. if (this.endX < 350 && this.endX - this.startX > 0) {
  663. this.isPackUpTree = false
  664. this.leftBox.style.width = '25%'
  665. this.rightBox.style.width = '75%'
  666. }
  667. }
  668. },
  669. mousemoveOnBox (e) {
  670. this.mousemove(e)
  671. },
  672. mouseupOnBox () {
  673. this.resize = null
  674. if (this.endX < 350 && this.endX - this.startX > 0) {
  675. this.isPackUpTree = false
  676. this.leftBox.style.width = '25%'
  677. this.rightBox.style.width = '75%'
  678. }
  679. this.resize = null
  680. }
  681. }
  682. }
  683. </script>
  684. <style lang="scss" scoped>
  685. @import '../../assets/style/bsTheme.scss';
  686. @import '../../assets/style/zTree/treePackUp.scss';
  687. ::v-deep .big-screen-router-view-wrap{
  688. padding-left: 16px !important;
  689. }
  690. .bs-pagination {
  691. position: relative !important;
  692. bottom: 0 !important;
  693. padding: 0 12px 16px 16px !important;
  694. ::v-deep .el-input__inner {
  695. width: 110px !important;
  696. border:none;
  697. background: var(--bs-el-background-1);
  698. }
  699. }
  700. .bs-container .inner-container .el-form .filter-item {
  701. ::v-deep .el-input__inner {
  702. width: 200px;
  703. }
  704. }
  705. ::v-deep .left-tab-box {
  706. span {
  707. color: var(--bs-el-text);
  708. }
  709. }
  710. ::v-deep .left-tab-box ul li.tab-active {
  711. background-color: var(--bs-el-background-3);
  712. }
  713. ::v-deep .left-tab-box ul li:hover {
  714. background-color: var(--bs-el-background-3);
  715. }
  716. .el-dialog {
  717. .bs-container {
  718. max-height: calc(90vh - 236px) !important;
  719. .el-table {
  720. height: calc(90vh - 340px);
  721. }
  722. ::v-deep .ztree {
  723. max-height: calc(90vh - 325px) !important;
  724. }
  725. ::v-deep .el-tabs__item.is-active {
  726. border-bottom: none !important;
  727. }
  728. }
  729. }
  730. ::v-deep .ztreeNodeMenu {
  731. ul {
  732. background-color: var(--bs-background-1);
  733. }
  734. li:hover {
  735. background-color: var(--bs-el-background-3);
  736. span {
  737. color: var(--bs-el-color-primary);
  738. }
  739. }
  740. span {
  741. color: var(--bs-el-text);
  742. }
  743. .triangle {
  744. background-color: var(--bs-background-1) !important;
  745. }
  746. }
  747. .layout {
  748. width: 100%;
  749. height: 100%;
  750. }
  751. ::v-deep .el-table__body-wrapper{
  752. max-height: unset !important;
  753. }
  754. </style>