hide-data.vue 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859
  1. <template>
  2. <div class="h-full">
  3. <div v-if="wbsTypeTabKey === 'tree'" class="hc-layout-box" element-loading-text="批量保存数据中...">
  4. <div
  5. id="wbs-left-tree" :class="[isWbsTreeShow ? 'show' : '', isMouseTree ? 'on-transition' : '']"
  6. :style="`width:${isWbsTreeShow ? leftWidth : 0}px; ${isWbsTreeShow ? '' : 'display: none'}`"
  7. class="hc-layout-left-box bg-white"
  8. >
  9. <div class="hc-project-box">
  10. <div class="hc-project-icon-box">
  11. <HcIcon name="stack" />
  12. </div>
  13. <div class="project-name-box ml-2">
  14. <div class="project-alias">{{ projectInfo.projectName }}</div>
  15. </div>
  16. </div>
  17. <div class="hc-tree-box">
  18. <div class="hc-tree-back-to">
  19. <HcTooltip keys="hide-data-show">
  20. <el-button type="primary" hc-btn keys="hide-data-show" :loading="showTreeNodeLoad" @click="showTreeNode">显示</el-button>
  21. </HcTooltip>
  22. </div>
  23. <div class="hc-search-tree-val">
  24. <el-input v-model="searchTreeVal" clearable block placeholder="请输入名称关键词检索" @keyup="searchTreeKeyUp">
  25. <template #suffix>
  26. <HcIcon name="search-2" ui="text-xl iscusor" @click="searchTreeClick" />
  27. </template>
  28. </el-input>
  29. </div>
  30. <div v-if="isShowLeft" id="hc-tree-scrollbar" v-loading="treeLoading" class="hc-tree-scrollbar" element-loading-text="获取数据中...">
  31. <el-scrollbar v-show="isSearchTree" class="scroll-bar-right-16">
  32. <HcDataTree
  33. :datas="searchTreeData"
  34. :is-mark="TreeMark"
  35. is-counts
  36. is-type
  37. :auto-expand-keys="TreeAutoExpandKeys"
  38. default-expand-all
  39. @node-tap="wbsElTreeClick"
  40. >
  41. <template #default="{ node, data, level }">
  42. <div class="data-custom-tree-node">
  43. <!-- 树组件,节点名称 -->
  44. <div :class="node.level === 1 ? 'level-name' : ''" class="label">
  45. <span v-if="(data.type > 0 && data.majorDataType > 0) || (data.type > 0 && data.majorDataType <= 0)" class="hc-tree-node-type">
  46. {{ getTreeNodeType(data.type, data.majorDataType) }}
  47. </span>
  48. <span :class="data.isBussShow === '2' ? 'text-red' : ''">
  49. {{ node.label }}
  50. </span>
  51. </div>
  52. <!-- 树组件,统计数量 -->
  53. <div class="submit-counts text-blue">【{{ data.submitCounts ?? 0 }}】</div>
  54. <!-- 树组件,操作菜单 END -->
  55. </div>
  56. </template>
  57. </HcDataTree>
  58. </el-scrollbar>
  59. <el-scrollbar v-show="!isSearchTree" class="scroll-bar-right-16">
  60. <HcLazyTree
  61. ref="wbstree"
  62. :auto-expand-keys="TreeAutoExpandKeys"
  63. :is-mark="TreeMark"
  64. is-counts
  65. is-type
  66. show-checkbox
  67. check-strictly
  68. @load="treeLoadNode"
  69. @node-loading="ElTreeNodeLoading"
  70. @node-tap="wbsElTreeClick"
  71. @check="ElTreeNodeCheck"
  72. >
  73. <template #default="{ node, data, level }">
  74. <div class="data-custom-tree-node">
  75. <!-- 树组件,节点名称 -->
  76. <div :class="node.level === 1 ? 'level-name' : ''" class="label">
  77. <span v-if="(data.type > 0 && data.majorDataType > 0) || (data.type > 0 && data.majorDataType <= 0)" class="hc-tree-node-type">
  78. {{ getTreeNodeType(data.type, data.majorDataType) }}
  79. </span>
  80. <span :class="data.isBussShow === '2' ? 'text-red' : ''">
  81. {{ node.label }}
  82. </span>
  83. </div>
  84. <!-- 树组件,统计数量 -->
  85. <div class="submit-counts text-blue">【{{ data.submitCounts ?? 0 }}】</div>
  86. <!-- 树组件,操作菜单 END -->
  87. </div>
  88. </template>
  89. </HcLazyTree>
  90. </el-scrollbar>
  91. </div>
  92. </div>
  93. <div class="hc-tree-foot-tip-box">
  94. <div class="dot-view red">已隐藏</div>
  95. <div class="dot-view black">未隐藏</div>
  96. </div>
  97. <!-- 左右拖动 -->
  98. <div class="horizontal-drag-line" @mousedown="onmousedown" />
  99. </div>
  100. <div id="wbs-content-box" v-loading="ListItemLoading" class="hc-layout-content-box">
  101. <!---展开收缩树 -->
  102. <div class="hc-expansion-contraction-tree" @click="setWbsTreeShow">
  103. <HcIcon v-show="isWbsTreeShow" name="arrow-left-s" />
  104. <HcIcon v-show="!isWbsTreeShow" name="arrow-right-s" />
  105. </div>
  106. <hc-tab-card :tabs="authBtnTabdata" :tab-key="authBtnTabKey" @change="authBtnTabClick">
  107. <el-scrollbar v-if="ListItemDatas.length > 0" ref="ListItemScrollRef">
  108. <CollapseForm
  109. ref="ListItemRef"
  110. :tree-auto-expand-keys="TreeAutoExpandKeys"
  111. :classify="authBtnTabKey"
  112. :contract-id="contractId"
  113. :datas="ListItemDatas"
  114. :draw-type="!isDrawType"
  115. :primary-key-id="primaryKeyId"
  116. :status="NodeStatus"
  117. :tenant-id="userInfo?.tenant_id"
  118. :wbs-temp-id="projectInfo?.referenceWbsTemplateIdTrial"
  119. :wbs-type="2"
  120. :treenode-data-info="nodeDataInfo"
  121. :newlistdata="newlistdata"
  122. @offset-top="ListItemOffsetTop"
  123. @renew="getTableDataAll"
  124. @get-list="searchNodeAllTable1"
  125. />
  126. </el-scrollbar>
  127. <hc-empty v-else title="暂无表单" />
  128. </hc-tab-card>
  129. </div>
  130. </div>
  131. </div>
  132. </template>
  133. <script setup>
  134. import { nextTick, onActivated, onMounted, ref, watch } from 'vue'
  135. import { useRoute, useRouter } from 'vue-router'
  136. import { useAppStore } from '~src/store'
  137. import { HcIsButton } from '~src/plugins/IsButtons'
  138. import CollapseForm from './collapse-form/index.vue'
  139. import NodeTree from './components/nodeTree/index.vue'
  140. import { getTreeNodeType } from 'hc-vue3-ui'
  141. import { getStoreValue, setStoreValue } from '~src/utils/storage'
  142. import {
  143. arrToKey,
  144. getArrValue,
  145. getObjValue,
  146. isNullES,
  147. } from 'js-fast-way'
  148. import { getDictionary } from '~api/other'
  149. import wbsApi from '~api/data-fill/wbs'
  150. import queryApi from '~api/data-fill/query'
  151. //初始变量
  152. const router = useRouter()
  153. const useRoutes = useRoute()
  154. const useAppState = useAppStore()
  155. //全局变量
  156. const projectId = ref(useAppState.projectId)
  157. const contractId = ref(useAppState.contractId)
  158. const projectInfo = ref(useAppState.projectInfo)
  159. const contractInfo = ref(useAppState.contractInfo)
  160. const isCollapse = ref(useAppState.getCollapse)
  161. const userInfo = ref(useAppState.getUserInfo)
  162. //路由参数
  163. const routerQuery = useRoutes?.query
  164. // const typeName = routerQuery?.type || 'map'
  165. const typeName = routerQuery?.type || 'tree'
  166. //是否是抽屉
  167. const isDrawType = ref(true)
  168. //自动展开缓存
  169. const TreeAutoExpandKeys = ref(getStoreValue('wbsTreeExpandKeys') || [])
  170. //树搜索
  171. const isSearchTree = ref(false)
  172. const searchTreeHeight = ref()
  173. const getSearchTreeData = async () => {
  174. treeLoading.value = true
  175. const { error, code, data } = await queryApi.getTreeNodeByQueryValueAndContractId({
  176. contractId: contractId.value,
  177. queryValue: searchTreeVal.value,
  178. tableOwner:authBtnTabKey.value,
  179. description: 1,
  180. })
  181. //判断状态
  182. if (!error && code === 200) {
  183. let treedata = getArrValue(data)
  184. searchTreeData.value = treedata
  185. treeLoading.value = false
  186. } else {
  187. treeLoading.value = false
  188. searchTreeData.value = []
  189. }
  190. }
  191. //监听
  192. const searchTreeVal = ref('')
  193. watch(() => [
  194. useAppState.getCollapse, searchTreeVal.value,
  195. ], ([Collapse, search]) => {
  196. isCollapse.value = Collapse
  197. if (search.length == 0) {
  198. isSearchTree.value = false
  199. }
  200. })
  201. //加载树需要的classType
  202. const classType = ref('')
  203. watch(() => [
  204. classType.value,
  205. ], ([classify]) => {
  206. if (classify) {
  207. //重新加载左边树
  208. isShowLeft.value = false
  209. setTimeout(()=>{
  210. isShowLeft.value = true
  211. }, 500)
  212. }
  213. })
  214. //渲染完成
  215. onMounted(() => {
  216. console.log(projectInfo.value)
  217. treeLoading.value = typeName === 'tree'
  218. setContractType(contractInfo.value?.contractType)
  219. getDictionaryApi()
  220. })
  221. onActivated(()=>{
  222. //重新加载左边树
  223. isShowLeft.value = false
  224. setTimeout(()=>{
  225. isShowLeft.value = true
  226. }, 500)
  227. })
  228. //身份按钮切换数据
  229. const authBtnTabKey = ref('1')
  230. //变量
  231. const wbstree = ref(null)
  232. const isShowLeft = ref(true)
  233. const authBtnTabClick = (val) => {
  234. if (!primaryKeyId.value) {
  235. window?.$message?.warning('请先在左侧项目树选择一个节点')
  236. } else if (val['key'] !== authBtnTabKey.value) {
  237. authBtnTabKey.value = val['key']
  238. //重新加载左边树
  239. isShowLeft.value = false
  240. setTimeout(()=>{
  241. isShowLeft.value = true
  242. }, 500)
  243. getTableDataAll()
  244. }
  245. }
  246. //contractType, 1施工,2监理
  247. const setContractType = (contractType) => {
  248. if (contractType <= 0) {
  249. authBtnTabKey.value = '1'
  250. classType.value = '1'
  251. } else if (contractType === 3) {
  252. authBtnTabKey.value = '1'
  253. classType.value = '1'
  254. } else {
  255. authBtnTabKey.value = contractType + ''
  256. classType.value = contractType + ''
  257. }
  258. }
  259. const getTableDataAll = async (key) => {
  260. await searchNodeAllTable()
  261. await queryNodeStatus()
  262. // wbstree.value.resetNode().then((res)=>{
  263. // if(res){
  264. // searchNodeAllTable()
  265. // queryNodeStatus()
  266. // }
  267. // })
  268. //保存后自动展开到当前表单
  269. if (!isNullES(key)) {
  270. console.log(key)
  271. await nextTick(() => {
  272. ListItemRef.value?.setCollapseKey(key)
  273. })
  274. }
  275. }
  276. //结构类型tab数据和相关处理
  277. const wbsTypeTabKey = ref(typeName)
  278. const wbsTypeTab = ref([
  279. { key: 'map', name: '导图结构填报' },
  280. { key: 'tree', name: '树形结构填报' },
  281. ])
  282. const authBtnTabdata = ref([
  283. { key: '1', name: '施工质检' },
  284. { key: '2', name: '监理质检' },
  285. ])
  286. const wbsTypeTabChange = (item) => {
  287. wbsTypeTabKey.value = item?.key
  288. ListItemDatas.value = []
  289. isDrawer.value = false
  290. treeLoading.value = typeName === 'tree'
  291. setStoreValue('classifyType', classType.value)
  292. setStoreValue('tableOwner', authBtnTabKey.value)
  293. //路由跳转
  294. router.push({
  295. path: useRoutes.path,
  296. query: {
  297. type: item?.key,
  298. classifyType:classType.value,
  299. tableOwner:authBtnTabKey.value,
  300. },
  301. })
  302. getSearchTreeData()
  303. }
  304. const NodeTreeAccordion = ref(true)
  305. //设置树菜单数据
  306. const TreeMark = ref(false)
  307. //树相关变量
  308. const primaryKeyId = ref('')
  309. const nodeItemInfo = ref({})
  310. const nodeDataInfo = ref({})
  311. const searchTreeData = ref([])
  312. //回车
  313. const searchTreeKeyUp = (e) => {
  314. if (e.key === 'Enter') {
  315. searchTreeClick()
  316. }
  317. }
  318. const treeLoading = ref(true)
  319. const searchTreeClick = async () => {
  320. if (searchTreeVal.value) {
  321. searchTreeHeight.value = document.getElementById('hc-tree-scrollbar').offsetHeight
  322. isSearchTree.value = true
  323. //treeLoading.value = true
  324. getSearchTreeData()
  325. } else {
  326. isSearchTree.value = false
  327. }
  328. }
  329. //懒加载的数据
  330. const treeLoadNode = async ({ node, item, level }, resolve) => {
  331. let contractIdRelation = '', parentId = '', primaryKeyId = ''
  332. if (level !== 0) {
  333. const nodeData = getObjValue(item)
  334. contractIdRelation = nodeData?.contractIdRelation || ''
  335. parentId = contractIdRelation ? nodeData?.primaryKeyId : nodeData?.id
  336. primaryKeyId = nodeData?.id || ''
  337. }
  338. //获取数据
  339. const { data } = await queryApi.queryWbsTreeData({
  340. contractId: contractId.value || '',
  341. contractIdRelation,
  342. primaryKeyId,
  343. parentId,
  344. // classifyType: authBtnTabKey.value,
  345. classifyType: classType.value,
  346. tableOwner:authBtnTabKey.value,
  347. description: 1,
  348. })
  349. treeLoading.value = false
  350. resolve(getArrValue(data))
  351. }
  352. //树被点击
  353. const wbsElTreeClick = ({ node, data, keys }) => {
  354. nodeItemInfo.value = node
  355. nodeDataInfo.value = data
  356. primaryKeyId.value = data?.primaryKeyId || ''
  357. const { notExsitChild } = data
  358. const { hasChildren } = data
  359. if (notExsitChild || !hasChildren) {
  360. getTableDataAll()
  361. } else {
  362. ListItemDatas.value = []
  363. NodeStatus.value = '1'
  364. }
  365. setStoreValue('wbsTreeExpandKeys', keys)
  366. TreeAutoExpandKeys.value = keys || []
  367. // getTableDataAll()
  368. }
  369. //树加载完成
  370. const ElTreeNodeLoading = () => {
  371. treeLoading.value = false
  372. }
  373. //导图结构数据
  374. const NodeTreeRef = ref(null)
  375. //鼠标左键单击事件
  376. const NodeTreeClick = ({ keys }) => {
  377. setStoreValue('wbsTreeExpandKeys', keys)
  378. TreeAutoExpandKeys.value = keys || []
  379. }
  380. //双击事件
  381. const isDrawer = ref(false)
  382. const NodeTreeDblClick = ({ node, data }) => {
  383. nodeItemInfo.value = node
  384. nodeDataInfo.value = data
  385. primaryKeyId.value = data?.primaryKeyId || ''
  386. isDrawer.value = true
  387. getTableDataAll()
  388. }
  389. const drawerClose = () => {
  390. isDrawer.value = false
  391. ListItemDatas.value = []
  392. }
  393. //获取节点类型
  394. const nodeTypeData = ref([])
  395. const getDictionaryApi = async () => {
  396. const { data } = await getDictionary({
  397. code: 'wbs_node_type',
  398. })
  399. //处理数据
  400. let newArr = []
  401. const newData = getArrValue(data)
  402. for (let i = 0; i < newData.length; i++) {
  403. newArr.push({
  404. label: newData[i]['dictValue'],
  405. value: Number(newData[i]['dictKey']),
  406. })
  407. }
  408. nodeTypeData.value = newArr
  409. }
  410. //设置滚动条位置
  411. const ListItemScrollRef = ref(null)
  412. const ListItemOffsetTop = (offsetTop) => {
  413. if (offsetTop > 0) {
  414. setTimeout(() => {
  415. ListItemScrollRef.value?.setScrollTop(offsetTop)
  416. }, 350)
  417. } else {
  418. ListItemScrollRef.value?.setScrollTop(offsetTop)
  419. }
  420. }
  421. //获取数据列表
  422. const ListItemDatas = ref([])
  423. const ListItemLoading = ref(false)
  424. const searchNodeAllTable = async () => {
  425. ListItemLoading.value = true
  426. ListItemDatas.value = []
  427. const info = nodeDataInfo.value
  428. const { data } = await wbsApi.searchNodeAllTable({
  429. projectId: projectId.value,
  430. contractId: contractId.value,
  431. primaryKeyId: info['primaryKeyId'],
  432. type: authBtnTabKey.value,
  433. })
  434. ListItemDatas.value = getArrValue(data)
  435. ListItemLoading.value = false
  436. }
  437. const newlistdata = ref([])
  438. const searchNodeAllTable1 = async () => {
  439. console.log('重新获取表单列表')
  440. const info = nodeDataInfo.value
  441. const { data } = await wbsApi.searchNodeAllTable({
  442. projectId: projectId.value,
  443. contractId: contractId.value,
  444. primaryKeyId: info['primaryKeyId'],
  445. type: authBtnTabKey.value,
  446. })
  447. newlistdata.value = getArrValue(data)
  448. }
  449. //查询状态
  450. const NodeStatus = ref('1')
  451. const queryNodeStatus = async () => {
  452. const info = nodeDataInfo.value
  453. if (contractInfo.value?.contractType == 1) {
  454. const { error, code, data } = await wbsApi.queryNodeStatus({
  455. primaryKeyId: info['primaryKeyId'],
  456. //classify:1
  457. classify: authBtnTabKey.value,
  458. })
  459. //1 未填报,2待上报,3已上报
  460. if (!error && code === 200) {
  461. NodeStatus.value = data ?? '1'
  462. } else {
  463. NodeStatus.value = '1'
  464. }
  465. } else {
  466. const { error, code, data } = await wbsApi.queryNodeStatusJl({
  467. // primaryKeyId: info['contractIdRelation'] ? info['id'] : info['primaryKeyId'],
  468. primaryKeyId: info['primaryKeyId'],
  469. //classify: 1
  470. classify: authBtnTabKey.value,
  471. })
  472. //1 未填报,2待上报,3已上报
  473. if (!error && code === 200) {
  474. NodeStatus.value = data ?? '1'
  475. } else {
  476. NodeStatus.value = '1'
  477. }
  478. }
  479. }
  480. //表单变量
  481. const ListItemRef = ref(null)
  482. const ListItemsRef = ref(null)
  483. //划分变更
  484. const divisionClick = () => {
  485. router.push({
  486. path: '/data-fill/division',
  487. })
  488. }
  489. //树展开和收起
  490. const isWbsTreeShow = ref(true)
  491. const setWbsTreeShow = () => {
  492. isWbsTreeShow.value = !isWbsTreeShow.value
  493. }
  494. //左右拖动,改变树形结构宽度
  495. const leftWidth = ref(382)
  496. const isMouseTree = ref(false)
  497. const onmousedown = () => {
  498. const leftNum = isCollapse.value ? 142 : 272
  499. isMouseTree.value = true
  500. document.onmousemove = (ve) => {
  501. let diffVal = ve.clientX - leftNum
  502. if (diffVal >= 310 && diffVal <= 900) {
  503. leftWidth.value = diffVal
  504. }
  505. }
  506. document.onmouseup = () => {
  507. document.onmousemove = null
  508. document.onmouseup = null
  509. isMouseTree.value = false
  510. }
  511. }
  512. //树节点被选中
  513. const treeSelectNode = ref([])
  514. const treeSelectdata = ref([])
  515. const ElTreeNodeCheck = (_, { checkedKeys, checkedNodes }) => {
  516. console.log(checkedNodes, 'checkedNodes')
  517. treeSelectNode.value = getArrValue(checkedKeys)
  518. treeSelectdata.value = getArrValue(checkedNodes)
  519. }
  520. const showTreeNodeLoad = ref(false)
  521. const showTreeNode = async ()=>{
  522. const keys = arrToKey(treeSelectdata.value, 'pKeyId', ',')
  523. if (keys.length <= 0) {
  524. window?.$message?.warning('请先在左侧项目树选择节点')
  525. return
  526. }
  527. //发起请求
  528. showTreeNodeLoad.value = true
  529. const { error, code, msg } = await wbsApi.updateNodeStates({
  530. ids: keys,
  531. status:1,
  532. }, false)
  533. showTreeNodeLoad.value = false
  534. if (!error && code === 200) {
  535. window?.$message?.success(msg || '操作成功')
  536. //重新加载左边树
  537. isShowLeft.value = false
  538. setTimeout(()=>{
  539. isShowLeft.value = true
  540. }, 500)
  541. } else {
  542. window?.$message?.error(msg)
  543. }
  544. }
  545. </script>
  546. <style lang="scss" scoped>
  547. @import "../../styles/data-fill/wbs.scss";
  548. .hc-add-node-modal-foot-box {
  549. position: relative;
  550. display: flex;
  551. align-items: center;
  552. .left-box {
  553. position: relative;
  554. flex: 1;
  555. display: flex;
  556. align-items: center;
  557. }
  558. .right-box {
  559. position: relative;
  560. }
  561. }
  562. .hc-expansion-contraction-tree {
  563. position: absolute;
  564. left: -13px;
  565. top: 0;
  566. width: 10px;
  567. height: 100%;
  568. user-select: none;
  569. cursor: pointer;
  570. display: flex;
  571. justify-content: center;
  572. align-items: center;
  573. color: #8c9099;
  574. font-size: 22px;
  575. border-radius: 5px;
  576. transition: background 0.2s;
  577. background: rgba(255, 255, 255, 0);
  578. &:hover {
  579. background: #f1f5f8;
  580. color: var(--el-color-primary);
  581. }
  582. }
  583. .hc-table-form-action-tip {
  584. position: absolute;
  585. bottom: 77px;
  586. width: 100%;
  587. }
  588. html.theme-dark {
  589. .bg-svg-xml {
  590. background-color: initial;
  591. background-image: initial;
  592. }
  593. .hc-layout-box .hc-layout-content-box .hc-card-max-h-box.node-tree .hc-tree-foot-tip-box {
  594. border-top: 1px solid #303030;
  595. }
  596. }
  597. </style>
  598. <style lang="scss">
  599. .hc-tree-box .el-tree-node {
  600. .el-checkbox {
  601. margin-right: 0;
  602. .el-checkbox__inner {
  603. display: none;
  604. }
  605. }
  606. .is-leaf + .el-checkbox {
  607. margin-right: 8px;
  608. .el-checkbox__inner {
  609. display: inline-block;
  610. }
  611. }
  612. }
  613. .data-fill-wbs-content {
  614. position: relative;
  615. height: 100%;
  616. .n-drawer-container {
  617. margin: -20px -24px;
  618. }
  619. .n-drawer.n-drawer--top-placement {
  620. height: auto !important;
  621. background-color: initial;
  622. pointer-events: none;
  623. bottom: 0;
  624. }
  625. .drawer-data-fill-content-box {
  626. position: relative;
  627. height: 100%;
  628. padding: 24px;
  629. .n-card {
  630. pointer-events: auto;
  631. height: 100%;
  632. overflow: auto;
  633. }
  634. .data-fill-content {
  635. position: relative;
  636. height: 100%;
  637. overflow-y: auto;
  638. scroll-behavior: smooth;
  639. .data-fill-list-box .data-fill-list-item-content {
  640. height: calc(100vh - 470px);
  641. .data-fill-table-form-box {
  642. height: 100%;
  643. }
  644. }
  645. }
  646. .data-fill-foot {
  647. position: relative;
  648. text-align: center;
  649. }
  650. }
  651. }
  652. .n-card.hc-card-overflow-box .n-card__content {
  653. padding: 24px;
  654. }
  655. .n-card.hc-custom-card > .n-card-header {
  656. padding: 15px 24px;
  657. }
  658. .n-card.hc-custom-card.copy {
  659. width: 1200px;
  660. max-height: 90vh;
  661. overflow: auto;
  662. .n-card-header .n-card-header__close {
  663. display: none;
  664. }
  665. &.one {
  666. width: 600px;
  667. }
  668. &.many {
  669. width: 1200px;
  670. }
  671. }
  672. .img-preview-box {
  673. position: relative;
  674. height: 100%;
  675. width: 100%;
  676. }
  677. .hc-layout-content-box {
  678. position: relative;
  679. }
  680. .iscusor {
  681. cursor: pointer;
  682. }
  683. .hc-table-form-action-tip .hc-alert {
  684. background-color: #f1f5f8;
  685. display: inline;
  686. vertical-align: middle;
  687. box-shadow: -2px 0 10px 0 rgba(32, 37, 50, 0.03), 0 10px 21px 20px rgba(32, 37, 50, 0.03);
  688. }
  689. .copy-node-form-box {
  690. margin-top: 24px;
  691. padding-top: 24px;
  692. border-top: 1px solid #efeff5;
  693. }
  694. .hc-position-input-icon {
  695. position: relative;
  696. margin-bottom: 0;
  697. .el-form-item__content {
  698. position: relative;
  699. .el-textarea .el-textarea__inner {
  700. padding-right: 30px;
  701. }
  702. .hc-icon-i {
  703. position: absolute;
  704. right: 10px;
  705. bottom: 0;
  706. font-size: 20px;
  707. cursor: pointer;
  708. color: #0081ff;
  709. opacity: 1;
  710. transition: opacity 0.2s;
  711. &:hover {
  712. opacity: .5;
  713. }
  714. }
  715. }
  716. }
  717. </style>