audit-class-tree.vue 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312
  1. <template>
  2. <a-card :class="[$style.treewrapD, $style.ywlxtree]" style="height: 100%">
  3. <slot></slot>
  4. <a-input-search placeholder="搜索" @change="onChange" />
  5. <a-tree
  6. :key="key"
  7. ref="auditMaintainCatalogTree"
  8. v-model="checkedKeys"
  9. :block-node="false"
  10. show-icon
  11. :show-line="showLine"
  12. :checkable="checkable"
  13. :check-strictly="checkStrictly"
  14. :draggable="draggable"
  15. :tree-data="treeData"
  16. :selected-keys="defaultSelectedKeys"
  17. :default-selected-keys="defaultSelectedKeys"
  18. :replace-fields="replaceFields"
  19. :expanded-keys="expandedKeys"
  20. @select="treeSelect"
  21. @check="onCheck"
  22. @expand="onExpand"
  23. >
  24. <a-icon slot="folder-open" type="folder-open" />
  25. <a-icon slot="file-done" type="file-done" />
  26. </a-tree>
  27. </a-card>
  28. </template>
  29. <script>
  30. import { Message } from 'ant-design-vue'
  31. export default {
  32. name: 'AuditClassTree',
  33. metaInfo: {
  34. title: 'AuditClassTree',
  35. },
  36. props: {
  37. checkStrictly: {
  38. type: Boolean,
  39. default: false,
  40. },
  41. // // 默认选中节点
  42. // selectedKeys: {
  43. // type: Array,
  44. // default: function() {
  45. // return []
  46. // },
  47. // },
  48. // 查看模式 manager维护权限 read查看权限
  49. managerType: {
  50. type: String,
  51. default: 'manager',
  52. },
  53. // 是否显示复选框
  54. checkable: {
  55. type: Boolean,
  56. default: false,
  57. },
  58. // 是否可以拖拽
  59. draggable: {
  60. type: Boolean,
  61. default: false,
  62. },
  63. // 是否显示连线
  64. showLine: {
  65. type: Boolean,
  66. default: false,
  67. },
  68. // 根节点名称
  69. topNodeText: {
  70. type: String,
  71. default: '根节点',
  72. },
  73. // 地址树接口数据源
  74. treeparams: {
  75. type: Object,
  76. default: () => {
  77. return {}
  78. },
  79. },
  80. // 默认展开节点id
  81. defaultExpandedKeys: {
  82. type: Array,
  83. default: () => {
  84. return ['0']
  85. },
  86. },
  87. // 是否显示隐藏按钮
  88. showPrimary: {
  89. type: Boolean,
  90. default: true,
  91. },
  92. // 地址树是否单选
  93. single: {
  94. type: Boolean,
  95. default: false,
  96. },
  97. refreshKey: {
  98. type: Number,
  99. default: 0,
  100. },
  101. /**
  102. * 是否展示部门下拉列表
  103. */
  104. isSelectDep: {
  105. type: Boolean,
  106. default: false,
  107. },
  108. cate: {
  109. type: Boolean,
  110. default: false,
  111. },
  112. isSelect: {
  113. type: Boolean,
  114. default: false,
  115. },
  116. treeData: {
  117. type: Array,
  118. default: () => {
  119. return []
  120. },
  121. },
  122. replaceFields: {
  123. type: Object,
  124. default: () => {
  125. return { title: 'name', key: 'id' }
  126. },
  127. },
  128. },
  129. data() {
  130. return {
  131. defaultTreeExpandedKeys: ['0'],
  132. defaultSelectedKeys: ['0'],
  133. checkedKeys: [], // 选中的节点数据
  134. dataList: [], // 数组dataList,搜索要用
  135. spinning: true,
  136. empty: false,
  137. icontype: 'left',
  138. fold: false,
  139. expandedKeys: ['0'],
  140. backupsExpandedKeys: [],
  141. autoExpandParent: false,
  142. defaultTopNodeText: '审计事项分类',
  143. defaultTopNodeId: '0',
  144. key: 0,
  145. newtree: [],
  146. depOptions: [], // 部门下拉框列表值
  147. edit: true, // 当前节点是否可编辑
  148. depvalue: '', // 选择的组织数据
  149. orgValue: '',
  150. orgId: null,
  151. searchValue: '',
  152. allTreeDataList: [],
  153. selectedKeys: [],
  154. }
  155. },
  156. created() {},
  157. methods: {
  158. // 点击树
  159. treeSelect(selectedKeys, info) {
  160. this.defaultSelectedKeys = selectedKeys
  161. this.$emit('treeSelect', selectedKeys, info)
  162. },
  163. onChange(e) {
  164. this.initAllTreeData()
  165. const data = this.allTreeDataList.filter((item) => item.name.includes(e.target.value))
  166. this.defaultSelectedKeys = data.map((item) => item.id)
  167. this.expandedKeys = data.map((item) => item.classifyId)
  168. if (e.target.value === '') {
  169. this.defaultSelectedKeys = ['0']
  170. this.expandedKeys = ['0']
  171. }
  172. // 如果 classifyName 和 tab
  173. this.$emit('onChangeSearch', e.target.value)
  174. },
  175. onCheck(...args) {
  176. this.$emit('onCheck', ...args)
  177. },
  178. onExpand(e, { expanded, node }) {
  179. this.expandedKeys = e
  180. this.$emit('onExpand', {
  181. e,
  182. node,
  183. })
  184. },
  185. initAllTreeData() {
  186. if (this.allTreeDataList.length > 0) {
  187. return
  188. }
  189. this.treeData.map((item) => {
  190. // children 内的数组和父级数组合并
  191. this.allTreeDataList = this.allTreeDataList.concat(item.children).map((item) => {
  192. return {
  193. ...item,
  194. }
  195. })
  196. })
  197. },
  198. },
  199. }
  200. </script>
  201. <style module lang="scss">
  202. @use '@/common/design' as *;
  203. .spin {
  204. width: 100%;
  205. line-height: 30;
  206. }
  207. .ywlxtree {
  208. :global(.ant-tree-title) {
  209. display: inline-block;
  210. width: 100%;
  211. overflow: hidden;
  212. text-overflow: ellipsis;
  213. white-space: nowrap;
  214. }
  215. :global(.ant-input-search) {
  216. margin: 8px 0;
  217. overflow: hidden;
  218. }
  219. .active {
  220. color: $primary-color;
  221. }
  222. :global(.ant-select) {
  223. width: 100%;
  224. overflow: hidden;
  225. }
  226. }
  227. .treewrap-d {
  228. position: relative;
  229. display: flex;
  230. flex-direction: column;
  231. width: 100%;
  232. height: calc(100% - 35px);
  233. margin-right: $padding-lg;
  234. transition: width 0.2s;
  235. .fold {
  236. position: absolute;
  237. top: calc(50% - 30px);
  238. right: -15px;
  239. z-index: 2;
  240. width: 15px;
  241. height: 75px;
  242. padding: 0;
  243. border-radius: 0 10px 10px 0;
  244. }
  245. :global(.ant-tree) {
  246. overflow: hidden;
  247. text-overflow: ellipsis;
  248. white-space: nowrap;
  249. }
  250. :global(.ant-card-body) {
  251. background: $white;
  252. }
  253. }
  254. .collapse {
  255. width: 0;
  256. :global(.ant-card-body) {
  257. background: transparent;
  258. :global(.ant-empty) {
  259. display: none;
  260. }
  261. }
  262. }
  263. // 单选样式
  264. .single {
  265. :global .ant-tree-checkbox {
  266. .ant-tree-checkbox-inner {
  267. border-radius: 100px;
  268. &::after {
  269. position: absolute;
  270. top: 3px;
  271. left: 3px;
  272. display: table;
  273. width: 8px;
  274. height: 8px;
  275. content: ' ';
  276. background-color: $primary-color;
  277. border: 0;
  278. border-radius: 8px;
  279. opacity: 0;
  280. transition: all 0.3s cubic-bezier(0.78, 0.14, 0.15, 0.86);
  281. transform: scale(0);
  282. }
  283. }
  284. &.ant-tree-checkbox-checked {
  285. &::after {
  286. position: absolute;
  287. top: 16.67%;
  288. left: 0;
  289. width: 100%;
  290. height: 66.67%;
  291. content: '';
  292. border: 1px solid #1890ff;
  293. border-radius: 50%;
  294. animation: antRadioEffect 0.36s ease-in-out;
  295. animation-fill-mode: both;
  296. }
  297. .ant-tree-checkbox-inner {
  298. background-color: $white;
  299. &::after {
  300. opacity: 1;
  301. transition: all 0.3s cubic-bezier(0.78, 0.14, 0.15, 0.86);
  302. transform: scale(1);
  303. }
  304. }
  305. }
  306. }
  307. }
  308. </style>