@handaotech-design/bom 0.0.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (159) hide show
  1. package/README.md +13 -0
  2. package/build.config.ts +27 -0
  3. package/dist/es/all-components.d.ts +3 -0
  4. package/dist/es/all-components.js +10 -0
  5. package/dist/es/assets/icons/operation-selected.svg +3 -0
  6. package/dist/es/assets/icons/operation.svg +3 -0
  7. package/dist/es/assets/icons/process-path-selected.svg +3 -0
  8. package/dist/es/assets/icons/process-path.svg +3 -0
  9. package/dist/es/assets/icons/process-plan-selected.svg +3 -0
  10. package/dist/es/assets/icons/process-plan.svg +3 -0
  11. package/dist/es/assets/icons/remove-minus.svg +4 -0
  12. package/dist/es/assets/icons/remove-plus.svg +5 -0
  13. package/dist/es/assets/icons/search.svg +4 -0
  14. package/dist/es/components/bom-tree/index.d.ts +3 -0
  15. package/dist/es/components/bom-tree/index.js +5 -0
  16. package/dist/es/components/bom-tree/index.vue +358 -0
  17. package/dist/es/components/bom-workbench/index.d.ts +3 -0
  18. package/dist/es/components/bom-workbench/index.js +5 -0
  19. package/dist/es/components/bom-workbench/index.vue +98 -0
  20. package/dist/es/components/gray-input/index.d.ts +3 -0
  21. package/dist/es/components/gray-input/index.js +5 -0
  22. package/dist/es/components/gray-input/index.vue +44 -0
  23. package/dist/es/components/index.d.ts +4 -0
  24. package/dist/es/components/index.js +4 -0
  25. package/dist/es/components/left-right/index.d.ts +3 -0
  26. package/dist/es/components/left-right/index.js +5 -0
  27. package/dist/es/components/left-right/index.vue +142 -0
  28. package/dist/es/defaults.d.ts +4 -0
  29. package/dist/es/defaults.js +3 -0
  30. package/dist/es/hooks/index.d.ts +1 -0
  31. package/dist/es/hooks/index.js +1 -0
  32. package/dist/es/hooks/use-ppboms.d.ts +19 -0
  33. package/dist/es/hooks/use-ppboms.js +81 -0
  34. package/dist/es/index.d.ts +7 -0
  35. package/dist/es/index.js +7 -0
  36. package/dist/es/models/bom.d.ts +35 -0
  37. package/dist/es/models/bom.js +1 -0
  38. package/dist/es/models/common.d.ts +5 -0
  39. package/dist/es/models/common.js +5 -0
  40. package/dist/es/models/index.d.ts +2 -0
  41. package/dist/es/models/index.js +2 -0
  42. package/dist/es/shared/keys.d.ts +1 -0
  43. package/dist/es/shared/keys.js +1 -0
  44. package/dist/es/shared/make-installer.d.ts +4 -0
  45. package/dist/es/shared/make-installer.js +13 -0
  46. package/dist/es/shims-vue.d.ts +5 -0
  47. package/dist/es/tokens/index.d.ts +0 -0
  48. package/dist/es/tokens/index.js +0 -0
  49. package/dist/es/types/components.d.ts +17 -0
  50. package/dist/es/utils/bom.d.ts +3 -0
  51. package/dist/es/utils/bom.js +29 -0
  52. package/dist/es/utils/config.d.ts +1 -0
  53. package/dist/es/utils/config.js +11 -0
  54. package/dist/es/utils/index.d.ts +4 -0
  55. package/dist/es/utils/index.js +4 -0
  56. package/dist/es/utils/rule-engine.d.ts +20 -0
  57. package/dist/es/utils/rule-engine.js +50 -0
  58. package/dist/es/utils/template.d.ts +1 -0
  59. package/dist/es/utils/template.js +11 -0
  60. package/dist/lib/all-components.d.ts +3 -0
  61. package/dist/lib/all-components.js +12 -0
  62. package/dist/lib/assets/icons/operation-selected.svg +3 -0
  63. package/dist/lib/assets/icons/operation.svg +3 -0
  64. package/dist/lib/assets/icons/process-path-selected.svg +3 -0
  65. package/dist/lib/assets/icons/process-path.svg +3 -0
  66. package/dist/lib/assets/icons/process-plan-selected.svg +3 -0
  67. package/dist/lib/assets/icons/process-plan.svg +3 -0
  68. package/dist/lib/assets/icons/remove-minus.svg +4 -0
  69. package/dist/lib/assets/icons/remove-plus.svg +5 -0
  70. package/dist/lib/assets/icons/search.svg +4 -0
  71. package/dist/lib/components/bom-tree/index.d.ts +3 -0
  72. package/dist/lib/components/bom-tree/index.js +26 -0
  73. package/dist/lib/components/bom-tree/index.vue +358 -0
  74. package/dist/lib/components/bom-workbench/index.d.ts +3 -0
  75. package/dist/lib/components/bom-workbench/index.js +26 -0
  76. package/dist/lib/components/bom-workbench/index.vue +98 -0
  77. package/dist/lib/components/gray-input/index.d.ts +3 -0
  78. package/dist/lib/components/gray-input/index.js +26 -0
  79. package/dist/lib/components/gray-input/index.vue +44 -0
  80. package/dist/lib/components/index.d.ts +4 -0
  81. package/dist/lib/components/index.js +49 -0
  82. package/dist/lib/components/left-right/index.d.ts +3 -0
  83. package/dist/lib/components/left-right/index.js +26 -0
  84. package/dist/lib/components/left-right/index.vue +142 -0
  85. package/dist/lib/defaults.d.ts +4 -0
  86. package/dist/lib/defaults.js +10 -0
  87. package/dist/lib/hooks/index.d.ts +1 -0
  88. package/dist/lib/hooks/index.js +16 -0
  89. package/dist/lib/hooks/use-ppboms.d.ts +19 -0
  90. package/dist/lib/hooks/use-ppboms.js +94 -0
  91. package/dist/lib/index.d.ts +7 -0
  92. package/dist/lib/index.js +61 -0
  93. package/dist/lib/models/bom.d.ts +35 -0
  94. package/dist/lib/models/bom.js +7 -0
  95. package/dist/lib/models/common.d.ts +5 -0
  96. package/dist/lib/models/common.js +11 -0
  97. package/dist/lib/models/index.d.ts +2 -0
  98. package/dist/lib/models/index.js +27 -0
  99. package/dist/lib/shared/keys.d.ts +1 -0
  100. package/dist/lib/shared/keys.js +7 -0
  101. package/dist/lib/shared/make-installer.d.ts +4 -0
  102. package/dist/lib/shared/make-installer.js +20 -0
  103. package/dist/lib/shims-vue.d.ts +5 -0
  104. package/dist/lib/tokens/index.d.ts +0 -0
  105. package/dist/lib/tokens/index.js +1 -0
  106. package/dist/lib/types/components.d.ts +17 -0
  107. package/dist/lib/utils/bom.d.ts +3 -0
  108. package/dist/lib/utils/bom.js +40 -0
  109. package/dist/lib/utils/config.d.ts +1 -0
  110. package/dist/lib/utils/config.js +18 -0
  111. package/dist/lib/utils/index.d.ts +4 -0
  112. package/dist/lib/utils/index.js +49 -0
  113. package/dist/lib/utils/rule-engine.d.ts +20 -0
  114. package/dist/lib/utils/rule-engine.js +57 -0
  115. package/dist/lib/utils/template.d.ts +1 -0
  116. package/dist/lib/utils/template.js +19 -0
  117. package/dist/style.css +86 -0
  118. package/package.json +65 -0
  119. package/rollup.config.ts +47 -0
  120. package/src/all-components.ts +12 -0
  121. package/src/assets/icons/operation-selected.svg +3 -0
  122. package/src/assets/icons/operation.svg +3 -0
  123. package/src/assets/icons/process-path-selected.svg +3 -0
  124. package/src/assets/icons/process-path.svg +3 -0
  125. package/src/assets/icons/process-plan-selected.svg +3 -0
  126. package/src/assets/icons/process-plan.svg +3 -0
  127. package/src/assets/icons/remove-minus.svg +4 -0
  128. package/src/assets/icons/remove-plus.svg +5 -0
  129. package/src/assets/icons/search.svg +4 -0
  130. package/src/components/bom-tree/index.ts +5 -0
  131. package/src/components/bom-tree/index.vue +377 -0
  132. package/src/components/bom-workbench/index.ts +5 -0
  133. package/src/components/bom-workbench/index.vue +97 -0
  134. package/src/components/gray-input/index.ts +5 -0
  135. package/src/components/gray-input/index.vue +40 -0
  136. package/src/components/index.ts +4 -0
  137. package/src/components/left-right/index.ts +5 -0
  138. package/src/components/left-right/index.vue +149 -0
  139. package/src/defaults.ts +3 -0
  140. package/src/hooks/index.ts +1 -0
  141. package/src/hooks/use-ppboms.ts +97 -0
  142. package/src/index.ts +9 -0
  143. package/src/models/bom.ts +43 -0
  144. package/src/models/common.ts +6 -0
  145. package/src/models/index.ts +2 -0
  146. package/src/shared/keys.ts +1 -0
  147. package/src/shared/make-installer.ts +21 -0
  148. package/src/shims-vue.d.ts +5 -0
  149. package/src/tokens/index.ts +0 -0
  150. package/src/types/components.d.ts +17 -0
  151. package/src/utils/bom.ts +33 -0
  152. package/src/utils/config.ts +11 -0
  153. package/src/utils/index.ts +4 -0
  154. package/src/utils/rule-engine.ts +83 -0
  155. package/src/utils/template.ts +13 -0
  156. package/tsconfig.json +7 -0
  157. package/unocss.config.ts +55 -0
  158. package/vite-env.d.ts +1 -0
  159. package/vite.config.ts +79 -0
package/README.md ADDED
@@ -0,0 +1,13 @@
1
+ # Bom 组件库
2
+ ## 组件列表
3
+ ### HdBomTree
4
+ bom树组件
5
+ 注意:
6
+ * 需“确保”树组件容器有一定高度。树组件会根据容器高度自适应虚拟滚动的高度
7
+
8
+ 具体交互参考 HdBomTree 组件
9
+
10
+ ### HdBomWorkbench
11
+ bom带拖拽的左右布局
12
+
13
+ 具体交互参考 HdBomWorkbench 组件
@@ -0,0 +1,27 @@
1
+ import { defineBuildConfig } from 'unbuild'
2
+
3
+ export default defineBuildConfig({
4
+ entries: [
5
+ {
6
+ builder: 'mkdist',
7
+ input: 'src',
8
+ outDir: 'dist/lib',
9
+ format: 'cjs',
10
+ ext: 'js',
11
+ declaration: true,
12
+ },
13
+ {
14
+ builder: 'mkdist',
15
+ input: 'src',
16
+ outDir: 'dist/es',
17
+ format: 'esm',
18
+ ext: 'js',
19
+ declaration: true,
20
+ },
21
+ ],
22
+ failOnWarn: false,
23
+ externals: [
24
+ 'vue',
25
+ 'ant-design-vue',
26
+ ],
27
+ })
@@ -0,0 +1,3 @@
1
+ import type { Plugin } from 'vue';
2
+ declare const _default: Plugin[];
3
+ export default _default;
@@ -0,0 +1,10 @@
1
+ import HdBomTree from "./components/bom-tree/index.js";
2
+ import HdGrayInput from "./components/gray-input/index.js";
3
+ import HdLeftRight from "./components/left-right/index.js";
4
+ import HdBomWorkbench from "./components/bom-workbench/index.js";
5
+ export default [
6
+ HdGrayInput,
7
+ HdLeftRight,
8
+ HdBomTree,
9
+ HdBomWorkbench
10
+ ];
@@ -0,0 +1,3 @@
1
+ <svg width="200" height="200" viewBox="0 0 200 200" fill="none" xmlns="http://www.w3.org/2000/svg" class="keep">
2
+ <path d="M140.222 106.426C161.171 106.426 178.086 123.392 178 144.299C177.914 165.206 161 182.085 140.05 182C119.101 182 102.187 165.034 102.273 144.127C102.273 123.906 118.328 107.283 138.591 106.426H140.222ZM96.0908 18C99.5251 18 102.358 20.8276 102.358 24.255H113.262C119.788 24.255 125.197 28.7962 126.055 34.7084H142.798C148.464 34.7941 153.101 39.0783 153.616 44.7335L153.702 45.8474V98.1148C148.636 96.4011 143.399 95.4586 137.99 95.4586C111.459 95.4586 89.9948 117.308 89.9948 144.299C89.9948 154.666 93.2574 164.863 99.3534 173.26L100.641 174.888H35.904C30.2374 174.888 25.5152 170.432 25.0859 164.777L25 163.835V45.7617C25 40.1065 29.2929 35.3082 34.9596 34.7941L35.904 34.7084H55.1363C55.9949 29.139 60.8888 24.7691 66.9848 24.3406H78.8332C78.8332 20.9133 81.6665 18.0857 85.1009 18.0857L96.0908 18ZM140.05 125.105C135.586 127.59 132.924 131.789 132.495 136.673L132.409 137.787L110.429 149.782V150.468L115.237 158.437L117.985 162.464H118.672L125.54 158.437L139.964 150.468C142.025 151.839 144.772 152.439 146.833 152.439C150.267 152.439 153.015 151.753 155.762 150.468C157.823 149.097 161.257 146.098 161.944 143.099C163.146 140.186 163.318 137.272 162.889 134.359L162.631 133.074H161.257L148.894 140.443L147.52 138.472L145.459 135.816L147.52 134.445L158.51 127.762V127.076C158.081 126.219 157.308 125.534 156.449 125.105C155.161 124.42 148.207 120.65 140.05 125.105ZM79.1767 129.561H49.5555C46.808 129.561 44.5757 131.703 44.5757 134.445C44.5757 136.93 46.3787 139.072 48.8686 139.415L49.5555 139.5H79.1767C81.9241 139.5 84.1564 137.272 84.1564 134.531C84.1564 131.789 81.9241 129.561 79.1767 129.561ZM92.3989 96.6582H49.5555C46.808 96.6582 44.5757 98.8859 44.5757 101.542C44.5757 104.027 46.3787 106.083 48.8686 106.426L49.5555 106.512H92.3989C95.1463 106.512 97.3786 104.284 97.3786 101.542C97.2928 98.8859 95.0605 96.6582 92.3989 96.6582ZM131.894 63.8411H49.5555C46.808 63.8411 44.5757 66.0689 44.5757 68.7251C44.5757 71.2099 46.3787 73.2663 48.8686 73.6091L49.5555 73.6948H131.894C134.641 73.6948 136.874 71.467 136.874 68.7251C136.874 65.9832 134.641 63.8411 131.894 63.8411ZM92.5706 30.5956H88.6211C85.8736 31.1954 83.4696 33.0804 82.2676 35.651L81.9241 36.5078C80.9797 38.9926 81.2373 41.7345 82.5251 44.1337C84.1564 47.047 87.2473 48.8463 90.5958 48.8463C95.6615 48.8463 99.8685 44.7335 99.8685 39.6781C99.8685 38.3072 99.5251 36.9362 98.9241 35.651L98.4089 34.7941L98.0655 34.28C96.7776 32.3093 94.8029 31.024 92.5706 30.5956Z" fill="#1E3B9D"/>
3
+ </svg>
@@ -0,0 +1,3 @@
1
+ <svg width="200" height="200" viewBox="0 0 200 200" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <path d="M140.222 106.426C161.171 106.426 178.086 123.392 178 144.299C177.914 165.206 161 182.085 140.05 182C119.101 182 102.187 165.034 102.273 144.127C102.273 123.906 118.328 107.283 138.591 106.426H140.222ZM96.0908 18C99.5251 18 102.358 20.8276 102.358 24.255H113.262C119.788 24.255 125.197 28.7962 126.055 34.7084H142.798C148.464 34.7941 153.101 39.0783 153.616 44.7335L153.702 45.8474V98.1148C148.636 96.4011 143.399 95.4586 137.99 95.4586C111.459 95.4586 89.9948 117.308 89.9948 144.299C89.9948 154.666 93.2574 164.863 99.3534 173.26L100.641 174.888H35.904C30.2374 174.888 25.5152 170.432 25.0859 164.777L25 163.835V45.7617C25 40.1065 29.2929 35.3082 34.9596 34.7941L35.904 34.7084H55.1363C55.9949 29.139 60.8888 24.7691 66.9848 24.3406H78.8332C78.8332 20.9133 81.6665 18.0857 85.1009 18.0857L96.0908 18ZM140.05 125.105C135.586 127.59 132.924 131.789 132.495 136.673L132.409 137.787L110.429 149.782V150.468L115.237 158.437L117.985 162.464H118.672L125.54 158.437L139.964 150.468C142.025 151.839 144.772 152.439 146.833 152.439C150.267 152.439 153.015 151.753 155.762 150.468C157.823 149.097 161.257 146.098 161.944 143.099C163.146 140.186 163.318 137.272 162.889 134.359L162.631 133.074H161.257L148.894 140.443L147.52 138.472L145.459 135.816L147.52 134.445L158.51 127.762V127.076C158.081 126.219 157.308 125.534 156.449 125.105C155.161 124.42 148.207 120.65 140.05 125.105ZM79.1767 129.561H49.5555C46.808 129.561 44.5757 131.703 44.5757 134.445C44.5757 136.93 46.3787 139.072 48.8686 139.415L49.5555 139.5H79.1767C81.9241 139.5 84.1564 137.272 84.1564 134.531C84.1564 131.789 81.9241 129.561 79.1767 129.561ZM92.3989 96.6582H49.5555C46.808 96.6582 44.5757 98.8859 44.5757 101.542C44.5757 104.027 46.3787 106.083 48.8686 106.426L49.5555 106.512H92.3989C95.1463 106.512 97.3786 104.284 97.3786 101.542C97.2928 98.8859 95.0605 96.6582 92.3989 96.6582ZM131.894 63.8411H49.5555C46.808 63.8411 44.5757 66.0689 44.5757 68.7251C44.5757 71.2099 46.3787 73.2663 48.8686 73.6091L49.5555 73.6948H131.894C134.641 73.6948 136.874 71.467 136.874 68.7251C136.874 65.9832 134.641 63.8411 131.894 63.8411ZM92.5706 30.5956H88.6211C85.8736 31.1954 83.4696 33.0804 82.2676 35.651L81.9241 36.5078C80.9797 38.9926 81.2373 41.7345 82.5251 44.1337C84.1564 47.047 87.2473 48.8463 90.5958 48.8463C95.6615 48.8463 99.8685 44.7335 99.8685 39.6781C99.8685 38.3072 99.5251 36.9362 98.9241 35.651L98.4089 34.7941L98.0655 34.28C96.7776 32.3093 94.8029 31.024 92.5706 30.5956Z" fill="#2C2C2C"/>
3
+ </svg>
@@ -0,0 +1,3 @@
1
+ <svg width="200" height="200" viewBox="0 0 200 200" fill="none" xmlns="http://www.w3.org/2000/svg" class="keep">
2
+ <path d="M108 167V94C108 92 109 90 110 90L175 67C178 66 182 68 182 72V153C182 155 181 157 179 158L113 182C111 183 108 181 108 179V167ZM33 45L100 22H103L167 44C179 49 179 50 167 54L103 75H100L28 50C27 50 27 47 28 47L33 45ZM92 181L25 157C23 156 22 154 22 152V72C22 68 25 66 29 67L95 90C96 90 97 92 97 93V178C97 181 95 182 92 181Z" fill="#1E3B9D"/>
3
+ </svg>
@@ -0,0 +1,3 @@
1
+ <svg width="200" height="200" viewBox="0 0 200 200" fill="none" xmlns="http://www.w3.org/2000/svg" class="keep">
2
+ <path d="M108 167V94C108 92 109 90 110 90L175 67C178 66 182 68 182 72V153C182 155 181 157 179 158L113 182C111 183 108 181 108 179V167ZM33 45L100 22H103L167 44C179 49 179 50 167 54L103 75H100L28 50C27 50 27 47 28 47L33 45ZM92 181L25 157C23 156 22 154 22 152V72C22 68 25 66 29 67L95 90C96 90 97 92 97 93V178C97 181 95 182 92 181Z" fill="#2C2C2C"/>
3
+ </svg>
@@ -0,0 +1,3 @@
1
+ <svg width="200" height="200" viewBox="0 0 200 200" fill="none" xmlns="http://www.w3.org/2000/svg" class="keep">
2
+ <path d="M174.922 99.9805C174.922 58.5547 141.328 24.9805 99.9023 24.9805C58.4766 24.9805 24.9023 58.5742 24.9023 100C24.9023 141.426 58.4961 175 99.9219 175C141.328 175 174.922 141.406 174.922 99.9805ZM109.336 133.164C98.9844 145.195 85.8984 149.062 84.3359 139.98C83.1445 133.164 89.3359 108.379 90.5859 99.043C90.9766 95.9961 87.4414 99.043 87.4414 99.043C87.4414 99.043 77.2852 106.836 74.9414 102.461C74.5898 101.758 77.0898 99.6289 78.0859 99.0625C78.0859 99.0625 99.2773 82.1094 106.211 85.4102C113.145 88.7109 103.789 109.609 103.086 112.695C102.402 115.801 98.0078 139.453 112.461 126.348C112.461 126.348 119.687 121.113 109.336 133.164ZM104.355 74.9609C100.684 74.9219 97.3242 72.8711 95.6055 69.6094C93.8867 66.3477 94.1211 62.4219 96.1719 59.375C98.2227 56.3281 101.797 54.6484 105.449 55.0195C110.781 55.5469 114.727 60.1758 114.434 65.5273C114.16 70.8594 109.707 75.0195 104.355 74.9609Z" fill="#1E3B9D"/>
3
+ </svg>
@@ -0,0 +1,3 @@
1
+ <svg width="200" height="200" viewBox="0 0 200 200" fill="none" xmlns="http://www.w3.org/2000/svg" class="keep">
2
+ <path d="M174.922 99.9805C174.922 58.5547 141.328 24.9805 99.9023 24.9805C58.4766 24.9805 24.9023 58.5742 24.9023 100C24.9023 141.426 58.4961 175 99.9219 175C141.328 175 174.922 141.406 174.922 99.9805ZM109.336 133.164C98.9844 145.195 85.8984 149.062 84.3359 139.98C83.1445 133.164 89.3359 108.379 90.5859 99.043C90.9766 95.9961 87.4414 99.043 87.4414 99.043C87.4414 99.043 77.2852 106.836 74.9414 102.461C74.5898 101.758 77.0898 99.6289 78.0859 99.0625C78.0859 99.0625 99.2773 82.1094 106.211 85.4102C113.145 88.7109 103.789 109.609 103.086 112.695C102.402 115.801 98.0078 139.453 112.461 126.348C112.461 126.348 119.687 121.113 109.336 133.164ZM104.355 74.9609C100.684 74.9219 97.3242 72.8711 95.6055 69.6094C93.8867 66.3477 94.1211 62.4219 96.1719 59.375C98.2227 56.3281 101.797 54.6484 105.449 55.0195C110.781 55.5469 114.727 60.1758 114.434 65.5273C114.16 70.8594 109.707 75.0195 104.355 74.9609Z" fill="#2C2C2C"/>
3
+ </svg>
@@ -0,0 +1,4 @@
1
+ <svg class="keep" width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <rect x="0.5" y="0.5" width="15" height="15" rx="4.5" stroke="#1E3B9D"/>
3
+ <path d="M4 8H12" stroke="#1E3B9D" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
4
+ </svg>
@@ -0,0 +1,5 @@
1
+ <svg class="keep" width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <rect x="0.5" y="0.5" width="15" height="15" rx="4.5" stroke="#1E3B9D"/>
3
+ <path d="M4 8H12" stroke="#1E3B9D" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
4
+ <path d="M8 4L8 12" stroke="#1E3B9D" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
5
+ </svg>
@@ -0,0 +1,4 @@
1
+ <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg" class="keep">
2
+ <path d="M6.66667 11.3333C9.244 11.3333 11.3333 9.244 11.3333 6.66667C11.3333 4.08934 9.244 2 6.66667 2C4.08934 2 2 4.08934 2 6.66667C2 9.244 4.08934 11.3333 6.66667 11.3333Z" stroke="#1E3B9D" stroke-linecap="round" stroke-linejoin="round"/>
3
+ <path d="M10 10L14 14" stroke="#1E3B9D" stroke-linecap="round" stroke-linejoin="round"/>
4
+ </svg>
@@ -0,0 +1,3 @@
1
+ export * from './index.vue';
2
+ export declare const HdBomTree: any;
3
+ export default HdBomTree;
@@ -0,0 +1,5 @@
1
+ import { withInstall } from "@handaotech-design/vue";
2
+ import BomTree from "./index.vue";
3
+ export * from "./index.vue";
4
+ export const HdBomTree = withInstall(BomTree);
5
+ export default HdBomTree;
@@ -0,0 +1,358 @@
1
+ <script lang="ts" setup>
2
+ import { nextTick, onBeforeUnmount, onMounted, ref, toRefs, watch } from 'vue'
3
+ import type { TreeProps } from 'ant-design-vue'
4
+ import { watchDebounced } from '@vueuse/shared'
5
+ import * as _ from 'lodash-es'
6
+ import type { DataNode } from 'ant-design-vue/es/vc-tree-select/interface'
7
+ import type { EventDataNode } from 'ant-design-vue/es/tree'
8
+ import HdGrayInput from '../gray-input'
9
+ import type { BomTreeConfig } from '../../models'
10
+
11
+ const props = defineProps<Props>()
12
+ const emits = defineEmits(['select'])
13
+ const COMPONENT_NAME = 'HdBomTree'
14
+ defineOptions({
15
+ name: COMPONENT_NAME,
16
+ })
17
+
18
+ type TreeNodeWithMeta = DataNode & {
19
+ parentKeys: string[]
20
+ }
21
+
22
+ interface Props {
23
+ treeData: TreeProps['treeData']
24
+ config: BomTreeConfig
25
+ }
26
+
27
+ const expandedKeys = ref<(string | number)[]>([])
28
+ const searchValue = ref<string>('')
29
+ const autoExpandParent = ref<boolean>(true)
30
+ const { treeData: _treeData } = toRefs(props)
31
+ const filteredTreeData = ref<TreeProps['treeData']>([])
32
+ const treeContainerHeight = ref<number>(0)
33
+ const treeContainerId = 'treeContainer'
34
+ let keyToNodeMap = new Map<string, TreeNodeWithMeta>()
35
+ const selectedKeys = ref<string[]>([])
36
+ const initTreeState = async () => {
37
+ searchValue.value = ''
38
+ filteredTreeData.value = _treeData.value
39
+ }
40
+
41
+ const onExpand = (keys: Key[]) => {
42
+ expandedKeys.value = keys
43
+ autoExpandParent.value = false
44
+ }
45
+
46
+ const updateTreeContainerHeight = () => {
47
+ const treeContainer = document.getElementById(treeContainerId)
48
+ if (treeContainer) {
49
+ treeContainerHeight.value = treeContainer.clientHeight
50
+ }
51
+ }
52
+
53
+ const buildKeyToNodeMap = (treeData: TreeProps['treeData']) => {
54
+ const keyMap = new Map<string, TreeNodeWithMeta>()
55
+ const traverse = (nodes: TreeProps['treeData'] = [], parentKeys: string[] = []) => {
56
+ for (const node of nodes) {
57
+ if (parentKeys) {
58
+ keyMap.set(node.key as string, {
59
+ ...node,
60
+ parentKeys: parentKeys || [],
61
+ } as any)
62
+ }
63
+ if (!_.isEmpty(node.children)) {
64
+ traverse(node.children, [...parentKeys, node.key as string])
65
+ }
66
+ }
67
+ }
68
+ traverse(treeData)
69
+ return keyMap
70
+ }
71
+
72
+ const filterTreeData = (data: TreeProps['treeData'], filteredKeys: string[]) => {
73
+ const getNodes = (result: any, node: any) => {
74
+ if (_.includes(filteredKeys, node.key)) {
75
+ result.push({ ...node })
76
+ return result
77
+ }
78
+ if (Array.isArray(node.children)) {
79
+ const children = node.children.reduce(getNodes, [])
80
+ if (!_.isEmpty(children)) {
81
+ result.push({ ...node, children })
82
+ }
83
+ }
84
+ return result
85
+ }
86
+ return (data || []).reduce(getNodes, [])
87
+ }
88
+
89
+ // 获取直接父节点的 key
90
+ const getParentKey = (key: string): string[] | undefined => {
91
+ const treeNode = keyToNodeMap.get(key)
92
+ return treeNode?.parentKeys || []
93
+ }
94
+
95
+ const selectFirstSelectableNode = () => {
96
+ const firstNode: any = _.find(Array.from(keyToNodeMap.values()), node => (node as any)?.selectable)
97
+ if (!firstNode) {
98
+ return
99
+ }
100
+
101
+ nextTick(() => {
102
+ expandedKeys.value = getParentKey(firstNode.key as string) as any
103
+ selectedKeys.value = firstNode ? [firstNode.key] as string[] : []
104
+ })
105
+ }
106
+
107
+ type Key = string | number
108
+ const onSelected = (keys: Key[], { node }: { node: EventDataNode }) => {
109
+ const key = node?.dataRef?.key
110
+ if (key) {
111
+ selectedKeys.value = [key as string]
112
+ }
113
+ else {
114
+ selectedKeys.value = []
115
+ }
116
+ }
117
+
118
+ onMounted(async () => {
119
+ window.addEventListener('resize', updateTreeContainerHeight)
120
+ await nextTick(() => {
121
+ updateTreeContainerHeight()
122
+ })
123
+ })
124
+
125
+ onBeforeUnmount(() => {
126
+ window.removeEventListener('resize', updateTreeContainerHeight)
127
+ })
128
+
129
+ watch(
130
+ () => _treeData.value,
131
+ async () => {
132
+ if (!_.isEmpty(_treeData.value)) {
133
+ keyToNodeMap = buildKeyToNodeMap(_treeData.value)
134
+ await initTreeState()
135
+ selectFirstSelectableNode()
136
+ }
137
+ else {
138
+ keyToNodeMap.clear()
139
+ await initTreeState()
140
+ }
141
+ },
142
+ {
143
+ immediate: true,
144
+ },
145
+ )
146
+
147
+ watchDebounced(
148
+ searchValue, (value: string) => {
149
+ let expanded: any[]
150
+ if (_.isEmpty(value)) {
151
+ expanded = getParentKey(selectedKeys.value[0]) || []
152
+ filteredTreeData.value = _treeData.value
153
+ }
154
+ else {
155
+ const filteredNodes: TreeProps['treeData'] = []
156
+ expanded = (Array.from(keyToNodeMap.values()))
157
+ .map((item: any) => {
158
+ if (hasSearchMatch(item.title)) {
159
+ filteredNodes.push(item)
160
+ return getParentKey(item.key)
161
+ }
162
+ return null
163
+ })
164
+ .filter((item, i, self) => item && self.indexOf(item) === i)
165
+ const filteredKeys = filteredNodes.map(item => item.key)
166
+ filteredTreeData.value = _.isEmpty(filteredKeys) ? [] : filterTreeData(_treeData.value, filteredKeys as unknown as string[])
167
+ }
168
+ expandedKeys.value = expanded
169
+ nextTick(() => {
170
+ expandedKeys.value = _.uniq(expanded.flat(1)) as any as string[]
171
+ })
172
+ }, { debounce: 500 })
173
+
174
+ watch(
175
+ () => selectedKeys.value,
176
+ () => {
177
+ if (selectedKeys.value && selectedKeys.value.length) {
178
+ return emits('select', keyToNodeMap.get(selectedKeys.value[0]))
179
+ }
180
+ },
181
+ )
182
+
183
+ function getIconClass(icon: string, isSelected: boolean) {
184
+ return isSelected ? `i-icon-${icon}-selected` : `i-icon-${icon}`
185
+ }
186
+
187
+ function getTitlePart(title: string, partType: 'before' | 'after') {
188
+ const _searchValue = searchValue.value || ''
189
+ const index = title.indexOf(_searchValue)
190
+
191
+ return {
192
+ before: title.substring(0, index),
193
+ after: title.substring(index + _searchValue.length),
194
+ }[partType]
195
+ }
196
+
197
+ function hasSearchMatch(title: string) {
198
+ return searchValue.value && title.includes(searchValue.value)
199
+ }
200
+ </script>
201
+
202
+ <template>
203
+ <div class="flex flex-col h-100%">
204
+ <div class="search-box">
205
+ <HdGrayInput
206
+ v-model:value="searchValue"
207
+ :placeholder="props.config?.filter?.placeholder || '输入关键词进行筛选(如名称/编号)'"
208
+ class="search-input"
209
+ >
210
+ <template #prefix>
211
+ <div class="i-icon-search w-16px h-16px" />
212
+ </template>
213
+ </HdGrayInput>
214
+ </div>
215
+ <div :id="treeContainerId" class="flex-grow tree-wrapper mt-12px overflow-y-hidden">
216
+ <div v-if="!_.isEmpty(filteredTreeData)">
217
+ <a-tree
218
+ :height="treeContainerHeight"
219
+ :expanded-keys="expandedKeys"
220
+ :auto-expand-parent="autoExpandParent"
221
+ :tree-data="filteredTreeData"
222
+ :block-node="true"
223
+ :selected-keys="selectedKeys"
224
+ @expand="onExpand"
225
+ @select="onSelected"
226
+ >
227
+ <template #title="{ title, dataRef }">
228
+ <div :class="`tree-node-tittle flex items-center ${dataRef.selectable ? 'selectable' : 'not-selectable'}`">
229
+ <div
230
+ v-if="!!dataRef.icon"
231
+ class="icon w-20px h-20px mr-4px min-w-20px"
232
+ :class="[getIconClass(dataRef.icon, selectedKeys.includes(dataRef.key))]"
233
+ />
234
+ <a-dropdown :trigger="['contextmenu']">
235
+ <div v-if="hasSearchMatch(title)" class="tree-node-text">
236
+ <span>{{ getTitlePart(title, 'before') }}</span>
237
+ <span class="highlight" style="background-color: #FFD499">{{ searchValue }}</span>
238
+ <span>{{ getTitlePart(title, 'after') }}</span>
239
+ </div>
240
+ <div v-else class="tree-node-text">
241
+ {{ title }}
242
+ </div>
243
+ <template #overlay>
244
+ <slot name="right-click" :tree-node="dataRef" />
245
+ </template>
246
+ </a-dropdown>
247
+ </div>
248
+ </template>
249
+ <template #switcherIcon="{ dataRef }">
250
+ <div
251
+ v-if="expandedKeys.includes(dataRef.key)" class="i-icon-remove-minus icon w-16px h-16px"
252
+ style="font-size: 20px;"
253
+ />
254
+ <div v-else class="i-icon-remove-plus icon w-16px h-16px" />
255
+ </template>
256
+ </a-tree>
257
+ </div>
258
+ <div v-show="_.isEmpty(filteredTreeData)" class="w-100% h-100% flex justify-center items-center">
259
+ <span>暂无数据</span>
260
+ </div>
261
+ </div>
262
+ </div>
263
+ </template>
264
+
265
+ <style scoped>
266
+ .tree-wrapper {
267
+ background-color: #fff;
268
+ }
269
+
270
+ .search-box {
271
+ padding: 0 16px;
272
+ }
273
+
274
+ :deep(.ant-tree-list) .ant-tree-treenode-motion {
275
+ width: 100%;
276
+ }
277
+ :deep(.ant-tree-list) .ant-tree-treenode {
278
+ width: 100%;
279
+ align-items: center;
280
+ color: #2C2C2C;
281
+ font-size: 16px;
282
+ display: flex;
283
+ justify-content: center;
284
+ padding: 4px 12px;
285
+ }
286
+ :deep(.ant-tree-list) .ant-tree-treenode .ant-tree-indent-unit {
287
+ width: 10px;
288
+ }
289
+ :deep(.ant-tree-list) .ant-tree-treenode .ant-tree-switcher {
290
+ width: 16px;
291
+ height: 16px;
292
+ padding: 0;
293
+ margin: 0 10px 0 0;
294
+ align-self: center;
295
+ line-height: 16px;
296
+ }
297
+ :deep(.ant-tree-list) .ant-tree-treenode .ant-tree-node-content-wrapper {
298
+ transition: none;
299
+ white-space: nowrap;
300
+ text-overflow: ellipsis;
301
+ margin-bottom: 0;
302
+ display: inline-flex;
303
+ overflow: visible !important;
304
+ flex: 1;
305
+ min-width: 0;
306
+ }
307
+ :deep(.ant-tree-list) .ant-tree-treenode .ant-tree-node-content-wrapper:hover {
308
+ background-color: #E9EBED;
309
+ }
310
+ :deep(.ant-tree-list) .ant-tree-treenode .ant-tree-node-content-wrapper .ant-tree-title {
311
+ text-overflow: ellipsis;
312
+ white-space: nowrap;
313
+ flex: 1;
314
+ min-width: 0;
315
+ }
316
+ :deep(.ant-tree-list) .ant-tree-treenode .ant-tree-node-content-wrapper .ant-tree-title .tree-node-tittle.selectable {
317
+ cursor: pointer;
318
+ }
319
+ :deep(.ant-tree-list) .ant-tree-treenode .ant-tree-node-content-wrapper .ant-tree-title .tree-node-tittle.not-selectable {
320
+ cursor: auto;
321
+ }
322
+ :deep(.ant-tree-list) .ant-tree-treenode:hover {
323
+ background-color: #E9EBED;
324
+ }
325
+ :deep(.ant-tree-list) .ant-tree-treenode .ant-tree-node-content-wrapper {
326
+ user-select: auto;
327
+ }
328
+ :deep(.ant-tree-list) .ant-tree-treenode.ant-tree-treenode-selected {
329
+ background-color: #EDF4FF;
330
+ border-radius: 4px;
331
+ color: #1E3B9D;
332
+ font-weight: 700;
333
+ }
334
+ :deep(.ant-tree-list) .ant-tree-treenode.ant-tree-treenode-selected .ant-tree-switcher, :deep(.ant-tree-list) .ant-tree-treenode.ant-tree-treenode-selected .ant-tree-node-content-wrapper {
335
+ background-color: #EDF4FF;
336
+ }
337
+ :deep(.ant-tree-list) .ant-tree-node-content-wrapper {
338
+ align-items: center;
339
+ padding: 0;
340
+ }
341
+ :deep(.ant-tree-list) .ant-tree-node-content-wrapper {
342
+ display: flex;
343
+ margin-bottom: -4px;
344
+ }
345
+ :deep(.ant-tree-list) .ant-tree-node-content-wrapper .ant-tree-title {
346
+ flex-grow: 1;
347
+ display: block;
348
+ }
349
+
350
+ .tree-node-text {
351
+ display: inline-block;
352
+ max-width: 100%;
353
+ overflow: hidden;
354
+ text-overflow: ellipsis;
355
+ white-space: nowrap;
356
+ vertical-align: middle;
357
+ }
358
+ </style>
@@ -0,0 +1,3 @@
1
+ export * from './index.vue';
2
+ export declare const HdBomWorkbench: any;
3
+ export default HdBomWorkbench;
@@ -0,0 +1,5 @@
1
+ import { withInstall } from "@handaotech-design/vue";
2
+ import BomWorkbench from "./index.vue";
3
+ export * from "./index.vue";
4
+ export const HdBomWorkbench = withInstall(BomWorkbench);
5
+ export default HdBomWorkbench;
@@ -0,0 +1,98 @@
1
+ <script lang="ts" setup>
2
+ import { ref, watch } from 'vue'
3
+ import * as _ from 'lodash-es'
4
+ import type { BomNode, BomTreeConfig, Optional, WorkBenchLayoutConfig } from '../../models'
5
+ import { convertBomDataToTree } from '../../utils'
6
+ import HdLeftRight from '../left-right/index'
7
+ import HdBomTree from '../bom-tree/index'
8
+
9
+ const props = defineProps<Props>()
10
+ const COMPONENT_NAME = 'HdBomWorkbench'
11
+ defineOptions({
12
+ name: COMPONENT_NAME,
13
+ })
14
+
15
+ interface Props {
16
+ moduleKey: string
17
+ bomData: Optional<BomNode[]>
18
+ treeConfig: BomTreeConfig
19
+ layoutConfig?: WorkBenchLayoutConfig
20
+ }
21
+ const bomDataForTree = ref<BomNode[]>()
22
+ const selectedNode = ref<BomNode>()
23
+
24
+ async function onSelected(data: BomNode) {
25
+ selectedNode.value = data
26
+ }
27
+
28
+ watch(
29
+ () => props.bomData,
30
+ () => {
31
+ if (_.isEmpty(props.bomData)) {
32
+ selectedNode.value = undefined
33
+ bomDataForTree.value = undefined
34
+ }
35
+ else {
36
+ bomDataForTree.value = convertBomDataToTree(props.bomData!, props.treeConfig.nodeConfig.rule)
37
+ }
38
+ },
39
+ { immediate: true },
40
+ )
41
+ </script>
42
+
43
+ <template>
44
+ <HdLeftRight
45
+ v-if="bomDataForTree"
46
+ :module-key="props.moduleKey"
47
+ :max-left-width="props?.layoutConfig?.maxLeftWidth"
48
+ >
49
+ <template #left>
50
+ <div class="left-content">
51
+ <div class="bom-tree-container">
52
+ <HdBomTree
53
+ :tree-data="bomDataForTree"
54
+ :config="props.treeConfig"
55
+ @select="(data: BomNode) => onSelected(data)"
56
+ >
57
+ <template #right-click>
58
+ <slot name="tree-right-click" :bom-node="selectedNode" />
59
+ </template>
60
+ </HdBomTree>
61
+ </div>
62
+ </div>
63
+ </template>
64
+ <template #right>
65
+ <div class="m-20px">
66
+ <slot name="content" :bom-node="selectedNode" />
67
+ </div>
68
+ </template>
69
+ </HdLeftRight>
70
+ </template>
71
+
72
+ <style scoped>
73
+ .v-h-center {
74
+ width: 100%;
75
+ height: 100%;
76
+ display: flex;
77
+ justify-content: center;
78
+ align-items: center;
79
+ transition: all 1s ease;
80
+ }
81
+
82
+ .left-content {
83
+ display: flex;
84
+ flex-direction: column;
85
+ height: 100%;
86
+ padding: 20px 0 16px 0;
87
+ }
88
+ .left-content .bom-tree-container {
89
+ flex-grow: 1;
90
+ }
91
+
92
+ :deep(.spinning-wrapper) {
93
+ height: 100%;
94
+ }
95
+ :deep(.spinning-wrapper) .ant-spin-container {
96
+ height: 100%;
97
+ }
98
+ </style>
@@ -0,0 +1,3 @@
1
+ export * from './index.vue';
2
+ export declare const HdGrayInput: any;
3
+ export default HdGrayInput;
@@ -0,0 +1,5 @@
1
+ import { withInstall } from "@handaotech-design/vue";
2
+ import GaryInput from "./index.vue";
3
+ export * from "./index.vue";
4
+ export const HdGrayInput = withInstall(GaryInput);
5
+ export default HdGrayInput;
@@ -0,0 +1,44 @@
1
+ <script setup lang="ts">
2
+ const COMPONENT_NAME = 'HdBomGrayInput'
3
+ defineOptions({
4
+ name: COMPONENT_NAME,
5
+ })
6
+ </script>
7
+
8
+ <template>
9
+ <span class="inline-block gray-a-input-wrapper">
10
+ <a-input
11
+ v-bind="$attrs"
12
+ >
13
+ <template v-for="(key, index) in Object.keys($slots)" :key="index" #[key]>
14
+ <slot :name="key" />
15
+ </template>
16
+ </a-input>
17
+ </span>
18
+ </template>
19
+
20
+ <style scoped>
21
+ .gray-a-input-wrapper {
22
+ width: 100%;
23
+ }
24
+
25
+ :deep(.ant-input),
26
+ :deep(.ant-input-affix-wrapper) {
27
+ background-color: #F5F5F5;
28
+ border-radius: 2px;
29
+ padding: 6px 12px;
30
+ font-size: 14px;
31
+ border-color: transparent;
32
+ }
33
+ :deep(.ant-input):hover,
34
+ :deep(.ant-input-affix-wrapper):hover {
35
+ border-color: #1E3B9D;
36
+ }
37
+ :deep(.ant-input):focus, :deep(.ant-input).ant-input-affix-wrapper-focused,
38
+ :deep(.ant-input-affix-wrapper):focus,
39
+ :deep(.ant-input-affix-wrapper).ant-input-affix-wrapper-focused {
40
+ border-color: #1E3B9D;
41
+ background-color: #fff;
42
+ box-shadow: none;
43
+ }
44
+ </style>
@@ -0,0 +1,4 @@
1
+ export * from './bom-tree';
2
+ export * from './bom-workbench';
3
+ export * from './gray-input';
4
+ export * from './left-right';
@@ -0,0 +1,4 @@
1
+ export * from "./bom-tree/index.js";
2
+ export * from "./bom-workbench/index.js";
3
+ export * from "./gray-input/index.js";
4
+ export * from "./left-right/index.js";
@@ -0,0 +1,3 @@
1
+ export * from './index.vue';
2
+ export declare const HdLeftRight: any;
3
+ export default HdLeftRight;