audit-find-cat-tree-mixins.js 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249
  1. import notebook from '@/common/components/sd-icon-library/icons/outline/notebook'
  2. // 判断是否已经选择
  3. function isChecked(selectedKeys, eventKey) {
  4. return selectedKeys.indexOf(eventKey) === -1
  5. }
  6. const AuditFindCatTreeMixins = {
  7. created() {
  8. // 判断单选多选
  9. if (!this.single) {
  10. this.checkedKeys = {
  11. checked: [],
  12. halfChecked: [],
  13. }
  14. }
  15. // 如果有默认展开节点,则赋值
  16. if (this.defaultExpandedKeys) {
  17. this.defaultTreeExpandedKeys = [...this.defaultExpandedKeys]
  18. }
  19. // 如果有传根节点名称,则赋值
  20. if (this.topNodeText) {
  21. this.defaultTopNodeText = this.topNodeText
  22. }
  23. // 如果有传默认选中节点,则赋值
  24. if (this.selectedKeys) {
  25. if (this.selectedKeys.length > 0) {
  26. this.defaultSelectedKeys = [...this.selectedKeys]
  27. }
  28. }
  29. // 如果有传部门下拉默认值,则赋值
  30. if (this.defaultDepValue) {
  31. if (this.defaultDepValue.length > 0) {
  32. this.depvalue = [...this.defaultDepValue]
  33. this.initTreeData(this.defaultDepValue[0])
  34. } else {
  35. this.initTreeData()
  36. }
  37. } else {
  38. if (this.initTreeData !== undefined) {
  39. this.initTreeData()
  40. }
  41. }
  42. },
  43. methods: {
  44. /**
  45. * 显示分类负责人
  46. */
  47. showUser(item) {
  48. this.$emit('showUser', item)
  49. },
  50. // 判断当前树需要展示的节点信息
  51. bindTree(nodeinfo) {
  52. const checklist = this.checkedKeys.checked
  53. if (nodeinfo.children) {
  54. this.bindTree(nodeinfo.children)
  55. const hiddenItem = nodeinfo.children.find((item, index) => {
  56. return item.hidden !== true
  57. })
  58. // 判断当前进节点是否隐藏
  59. if (!hiddenItem && checklist.indexOf(nodeinfo.id) === -1) {
  60. nodeinfo.hidden = true
  61. }
  62. // 如果显示但是没有在选择列表,则不可选中
  63. if (!nodeinfo.hidden && checklist.indexOf(nodeinfo.id) === -1) {
  64. nodeinfo.disabled = true
  65. }
  66. } else {
  67. nodeinfo.forEach((node, nodeindex) => {
  68. if (node.children) {
  69. // 判断子节点是否有选中的节点
  70. this.bindTree(node.children)
  71. const hiddenItem = node.children.find((item, index) => {
  72. return item.hidden !== true
  73. })
  74. // 判断当前进节点是否隐藏
  75. if (!hiddenItem && checklist.indexOf(node.id) === -1) {
  76. node.hidden = true
  77. }
  78. // 如果显示但是没有在选择列表,则不可选中
  79. if (!node.hidden && checklist.indexOf(node.id) === -1) {
  80. node.disabled = true
  81. }
  82. } else {
  83. if (checklist.indexOf(node.id) === -1) {
  84. node.hidden = true
  85. }
  86. // 如果显示但是没有在选择列表,则不可选中
  87. if (!node.hidden && checklist.indexOf(node.id) === -1) {
  88. node.disabled = true
  89. }
  90. }
  91. })
  92. }
  93. },
  94. /***
  95. * 选中复选框时的事件
  96. */
  97. treeCheck(allKeys, echecked) {
  98. // echecked.checkedNodes 选中的所有节点信息为数组 .data.props 获取详细信息
  99. // echecked.node.dataRef 当前选中的节点信息
  100. if (this.single) {
  101. this.checkedKeys.checked = []
  102. this.checkedKeys.checked = [echecked.node.dataRef.id]
  103. }
  104. this.$emit('checkedKeys', echecked.node.dataRef, echecked.checkedNodes)
  105. },
  106. getTree(node) {
  107. const removeIndex = []
  108. node.children.forEach((item, index) => {
  109. if (item.hidden === true) {
  110. removeIndex.push(index)
  111. } else {
  112. if (item.children) {
  113. this.getTree(item)
  114. }
  115. }
  116. })
  117. // 删除元素
  118. removeIndex.forEach((oneindex, index) => {
  119. node.children.splice(oneindex - index, 1)
  120. })
  121. },
  122. // 点击树
  123. treeSelect(selectedKeys, info) {
  124. this.defaultSelectedKeys = selectedKeys
  125. if (this.single) {
  126. this.checkedKeys = []
  127. this.checkedKeys = [info.node.dataRef.id]
  128. } else {
  129. if (isChecked(this.checkedKeys.checked, info.node.dataRef.id)) {
  130. this.checkedKeys.checked.push(info.node.dataRef.id)
  131. } else {
  132. this.checkedKeys.checked.splice(this.checkedKeys.checked.indexOf(info.node.dataRef.id), 1)
  133. }
  134. this.checkedKeys.checked = [...new Set(this.checkedKeys.checked)]
  135. }
  136. this.$emit('treeSelect', [...selectedKeys, ...this.checkedKeys.checked], info)
  137. },
  138. // 筛选树
  139. onSearchChange(e) {
  140. const value = e.target.value
  141. const expandedKeys = this.dataList
  142. .map((item) => {
  143. if (item.title.indexOf(value) > -1) {
  144. return this.getParentKey(item.key, this.treeData)
  145. }
  146. return null
  147. })
  148. .filter((item, i, self) => item && self.indexOf(item) === i)
  149. expandedKeys.unshift('0') // 顶结点永远展开
  150. Object.assign(this, {
  151. expandedKeys,
  152. searchValue: value,
  153. autoExpandParent: true,
  154. })
  155. },
  156. getParentKey(key, tree) {
  157. let parentKey
  158. for (let i = 0; i < tree.length; i++) {
  159. const node = tree[i]
  160. if (node.children) {
  161. if (node.children.some((item) => item.id === key)) {
  162. parentKey = node.id
  163. } else if (this.getParentKey(key, node.children)) {
  164. parentKey = this.getParentKey(key, node.children)
  165. }
  166. }
  167. }
  168. return parentKey
  169. },
  170. transformData(data) {
  171. return data.map((d) => {
  172. const { children, ...rest } = d
  173. return {
  174. ...rest,
  175. children: children && this.transformData(children),
  176. scopedSlots: { title: 'title' },
  177. }
  178. })
  179. },
  180. // 处理搜索用的dataList
  181. generateList(data) {
  182. for (let i = 0; i < data.length; i++) {
  183. const node = data[i]
  184. const key = node.id
  185. const title = node.text
  186. const props = node.props
  187. // 用来判断此几点是否已经配置了用户,需要后台返回标识位进行判断
  188. // if (props.showuser) {
  189. // data[i].scopedSlots.icon = 'hasuser'
  190. // }
  191. this.dataList.push({ key, id: key, title: title, props })
  192. if (node.children) {
  193. this.generateList(node.children)
  194. }
  195. }
  196. },
  197. onExpand(expandedKeys) {
  198. // 用户点击展开时,取消自动展开效果
  199. this.expandedKeys = expandedKeys
  200. this.autoExpandParent = false
  201. },
  202. // 小箭头点击事件
  203. foldClick() {
  204. // const newtree = {}
  205. // Object.assign(newtree, this.treeData)
  206. // this.bindTree(newtree[0])
  207. // this.getTree(newtree[0])
  208. this.fold = !this.fold
  209. if (this.fold) {
  210. this.icontype = 'right'
  211. } else {
  212. this.icontype = 'left'
  213. }
  214. },
  215. // 组织下拉框change时触发
  216. changedep(value, option, extra) {
  217. this.key++
  218. if (!value) {
  219. this.defaultTreeExpandedKeys = ['0']
  220. this.defaultSelectedKeys = ['0']
  221. this.defaultTopNodeId = '0'
  222. this.defaultTopNodeText = this.topNodeText
  223. } else {
  224. this.defaultTreeExpandedKeys = [extra.triggerNode.dataRef.value]
  225. this.defaultSelectedKeys = [extra.triggerNode.dataRef.value]
  226. this.defaultTopNodeId = extra.triggerNode.dataRef.value
  227. this.defaultTopNodeText = extra.triggerNode.dataRef.title
  228. }
  229. this.initTreeData(value)
  230. this.$emit('depChanged', value, option)
  231. },
  232. // 刷新树方法
  233. refreshTree() {
  234. this.key++
  235. },
  236. },
  237. }
  238. export default AuditFindCatTreeMixins