dashboardTreeNodes.tsx 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. /*
  2. * <<
  3. * Davinci
  4. * ==
  5. * Copyright (C) 2016 - 2017 EDP
  6. * ==
  7. * Licensed under the Apache License, Version 2.0 (the "License");
  8. * you may not use this file except in compliance with the License.
  9. * You may obtain a copy of the License at
  10. *
  11. * http://www.apache.org/licenses/LICENSE-2.0
  12. *
  13. * Unless required by applicable law or agreed to in writing, software
  14. * distributed under the License is distributed on an "AS IS" BASIS,
  15. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  16. * See the License for the specific language governing permissions and
  17. * limitations under the License.
  18. * >>
  19. */
  20. import React, { useMemo } from 'react'
  21. import { Tree, TreeSelect, Icon } from 'antd'
  22. import { IDashboardNode } from '../types'
  23. import { DashboardTypes } from '../constants'
  24. const dashboardNodeKeyPrefix = 'dashboard_'
  25. const renderTreeNodes = (
  26. nodes: IDashboardNode[],
  27. folderOnly: boolean,
  28. treeSelect: boolean
  29. ) => {
  30. if (!nodes || !nodes.length) {
  31. return null
  32. }
  33. let filterNodes = folderOnly
  34. ? nodes.filter(({ type }) => type === DashboardTypes.Folder)
  35. : nodes
  36. if (!filterNodes.length) {
  37. return null
  38. }
  39. const { TreeNode } = treeSelect ? TreeSelect : Tree
  40. return filterNodes.map((node) => (
  41. <TreeNode
  42. key={`${dashboardNodeKeyPrefix}${node.id}`}
  43. title={node.name}
  44. icon={!node.children && <Icon type="dot-chart" />}
  45. isLeaf={!node.children}
  46. >
  47. {renderTreeNodes(node.children, folderOnly, treeSelect)}
  48. </TreeNode>
  49. ))
  50. }
  51. const findFirstLeaf = (nodes: IDashboardNode[], folderOnly: boolean): string[] => {
  52. if (!nodes || !nodes.length) {
  53. return []
  54. }
  55. let filterNodes = folderOnly
  56. ? nodes.filter(({ type }) => type === DashboardTypes.Folder)
  57. : nodes
  58. if (!filterNodes.length) {
  59. return []
  60. }
  61. if (folderOnly) {
  62. return [`${dashboardNodeKeyPrefix}${filterNodes[0].id}`]
  63. }
  64. let firstDashboardNodeKey: string[] = []
  65. filterNodes.some((node) => {
  66. if (node.type === DashboardTypes.Dashboard) {
  67. firstDashboardNodeKey = [`${dashboardNodeKeyPrefix}${node.id}`]
  68. return true
  69. }
  70. firstDashboardNodeKey = findFirstLeaf(node.children, folderOnly)
  71. return firstDashboardNodeKey.length
  72. })
  73. return firstDashboardNodeKey
  74. }
  75. const useDashboardTreeNodes = (
  76. nodes: IDashboardNode[],
  77. folderOnly: boolean = false,
  78. treeSelect: boolean = false
  79. ): [JSX.Element[], string[]] => {
  80. const treeNodes = useMemo(
  81. () => renderTreeNodes(nodes, folderOnly, treeSelect),
  82. [nodes]
  83. )
  84. const firstDashboardNodeKey = useMemo(
  85. () => findFirstLeaf(nodes, folderOnly),
  86. [nodes, folderOnly]
  87. )
  88. return [treeNodes, firstDashboardNodeKey]
  89. }
  90. export default useDashboardTreeNodes