cnhis-design-vue 3.1.1 → 3.1.4-beta.1

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 (216) hide show
  1. package/CHANGELOG.md +46 -0
  2. package/env.d.ts +8 -4
  3. package/es/packages/big-table/index.d.ts +2038 -0
  4. package/es/packages/big-table/index.mjs +1 -0
  5. package/es/packages/big-table/index2.mjs +14 -0
  6. package/es/packages/big-table/src/BigTable.mjs +2 -0
  7. package/es/packages/big-table/src/BigTable.vue.d.ts +2052 -0
  8. package/es/packages/big-table/src/BigTable.vue_vue_type_script_setup_true_lang.mjs +2315 -0
  9. package/es/packages/big-table/src/BigTable2.mjs +4 -0
  10. package/es/packages/big-table/src/bigTableEmits.d.ts +2 -0
  11. package/es/packages/big-table/src/bigTableEmits.mjs +1 -0
  12. package/{packages/big-table/src/bigTableEmits.ts → es/packages/big-table/src/bigTableEmits2.mjs} +48 -48
  13. package/es/packages/big-table/src/bigTableProps.d.ts +194 -0
  14. package/es/packages/big-table/src/bigTableProps.mjs +1 -0
  15. package/{packages/big-table/src/bigTableProps.ts → es/packages/big-table/src/bigTableProps2.mjs} +116 -125
  16. package/es/packages/big-table/src/bigTableState.d.ts +55 -0
  17. package/es/packages/big-table/src/bigTableState.mjs +1 -0
  18. package/es/packages/big-table/src/bigTableState2.mjs +51 -0
  19. package/es/packages/big-table/src/components/NoData.mjs +2 -0
  20. package/es/packages/big-table/src/components/NoData.vue.d.ts +51 -0
  21. package/es/packages/big-table/src/components/NoData.vue_vue_type_script_setup_true_lang.mjs +72 -0
  22. package/es/packages/big-table/src/components/NoData2.mjs +4 -0
  23. package/es/packages/big-table/src/components/SvgIcon.mjs +2 -0
  24. package/es/packages/big-table/src/components/SvgIcon.vue.d.ts +43 -0
  25. package/es/packages/big-table/src/components/SvgIcon.vue_vue_type_script_setup_true_lang.mjs +34 -0
  26. package/es/packages/big-table/src/components/SvgIcon2.mjs +4 -0
  27. package/es/packages/big-table/src/components/TextOverTooltip.mjs +2 -0
  28. package/es/packages/big-table/src/components/TextOverTooltip.vue.d.ts +560 -0
  29. package/es/packages/big-table/src/components/TextOverTooltip.vue_vue_type_script_setup_true_lang.mjs +74 -0
  30. package/es/packages/big-table/src/components/TextOverTooltip2.mjs +4 -0
  31. package/es/packages/big-table/src/components/edit-form/edit-date.d.ts +34 -0
  32. package/es/packages/big-table/src/components/edit-form/edit-date.mjs +88 -0
  33. package/es/packages/big-table/src/components/edit-form/edit-input.d.ts +43 -0
  34. package/es/packages/big-table/src/components/edit-form/edit-input.mjs +51 -0
  35. package/es/packages/big-table/src/components/edit-form/edit-select-table.d.ts +35 -0
  36. package/es/packages/big-table/src/components/edit-form/edit-select.d.ts +35 -0
  37. package/es/packages/big-table/src/components/edit-form/edit-select.mjs +89 -0
  38. package/es/packages/big-table/src/hooks/useBatchEditing.d.ts +17 -0
  39. package/es/packages/big-table/src/hooks/useBatchEditing.mjs +1 -0
  40. package/es/packages/big-table/src/hooks/useBatchEditing2.mjs +284 -0
  41. package/es/packages/big-table/src/hooks/useEdit.d.ts +171 -0
  42. package/es/packages/big-table/src/hooks/useEdit.mjs +1 -0
  43. package/es/packages/big-table/src/hooks/useEdit2.mjs +108 -0
  44. package/es/packages/big-table/src/hooks/useFormat.d.ts +29 -0
  45. package/es/packages/big-table/src/hooks/useFormat.mjs +1 -0
  46. package/{packages/big-table/src/hooks/useFormat.ts → es/packages/big-table/src/hooks/useFormat2.mjs} +480 -612
  47. package/es/packages/big-table/src/hooks/useNestTable.d.ts +8 -0
  48. package/es/packages/big-table/src/hooks/useNestTable.mjs +1 -0
  49. package/{packages/big-table/src/hooks/useNestTable.ts → es/packages/big-table/src/hooks/useNestTable2.mjs} +84 -109
  50. package/es/packages/big-table/src/hooks/useTableParse.d.ts +6 -0
  51. package/es/packages/big-table/src/hooks/useTableParse.mjs +1 -0
  52. package/es/packages/big-table/src/hooks/useTableParse2.mjs +135 -0
  53. package/es/packages/big-table/src/utils.d.ts +54 -0
  54. package/es/packages/big-table/src/utils.mjs +1 -0
  55. package/{packages/big-table/src/utils.ts → es/packages/big-table/src/utils2.mjs} +597 -705
  56. package/es/packages/big-table/style/index.css +448 -0
  57. package/{packages/big-table/src/assets/style/table-base.less → es/packages/big-table/style/index.less} +292 -10
  58. package/es/packages/button-print/index.d.ts +7373 -0
  59. package/es/packages/button-print/index.mjs +1 -0
  60. package/es/packages/button-print/index2.mjs +11 -0
  61. package/es/packages/button-print/src/ButtonPrint.mjs +2 -0
  62. package/es/packages/button-print/src/ButtonPrint.vue.d.ts +7372 -0
  63. package/es/packages/button-print/src/ButtonPrint.vue_vue_type_script_setup_true_lang.mjs +452 -0
  64. package/es/packages/button-print/src/ButtonPrint2.mjs +4 -0
  65. package/es/packages/button-print/src/components/IdentityVerification.mjs +2 -0
  66. package/es/packages/button-print/src/components/IdentityVerification.vue.d.ts +4785 -0
  67. package/es/packages/button-print/src/components/IdentityVerification.vue_vue_type_script_setup_true_lang.mjs +126 -0
  68. package/es/packages/button-print/src/components/IdentityVerification2.mjs +4 -0
  69. package/es/packages/button-print/src/utils/print.es.min.d.ts +2 -0
  70. package/es/packages/button-print/src/utils/print.es.min.mjs +1 -0
  71. package/es/packages/button-print/src/utils/print.es.min2.mjs +2080 -0
  72. package/es/packages/button-print/style/index.css +26 -0
  73. package/es/packages/button-print/style/index.less +32 -0
  74. package/es/packages/drag-layout/index.d.ts +20061 -0
  75. package/es/packages/drag-layout/index.mjs +1 -0
  76. package/es/packages/drag-layout/index2.mjs +11 -0
  77. package/es/packages/drag-layout/src/DragFormLeftItem.mjs +2 -0
  78. package/es/packages/drag-layout/src/DragFormLeftItem.vue.d.ts +7959 -0
  79. package/es/packages/drag-layout/src/DragFormLeftItem.vue_vue_type_script_setup_true_lang.mjs +122 -0
  80. package/es/packages/drag-layout/src/DragFormLeftItem2.mjs +4 -0
  81. package/es/packages/drag-layout/src/DragFormRightItem.mjs +2 -0
  82. package/es/packages/drag-layout/src/DragFormRightItem.vue.d.ts +3213 -0
  83. package/es/packages/drag-layout/src/DragFormRightItem.vue_vue_type_script_setup_true_lang.mjs +267 -0
  84. package/es/packages/drag-layout/src/DragFormRightItem2.mjs +4 -0
  85. package/es/packages/drag-layout/src/DragLayout.mjs +2 -0
  86. package/es/packages/drag-layout/src/DragLayout.vue.d.ts +20069 -0
  87. package/es/packages/drag-layout/src/DragLayout.vue_vue_type_script_setup_true_lang.mjs +657 -0
  88. package/es/packages/drag-layout/src/DragLayout2.mjs +4 -0
  89. package/es/packages/drag-layout/style/index.css +175 -0
  90. package/es/packages/drag-layout/style/index.less +208 -0
  91. package/es/packages/field-set/index.d.ts +2647 -0
  92. package/es/packages/field-set/index.mjs +1 -0
  93. package/es/packages/field-set/index2.mjs +11 -0
  94. package/es/packages/field-set/src/FieldSet.mjs +2 -0
  95. package/es/packages/field-set/src/FieldSet.vue.d.ts +2599 -0
  96. package/es/packages/field-set/src/FieldSet.vue_vue_type_script_setup_true_lang.mjs +330 -0
  97. package/es/packages/field-set/src/FieldSet2.mjs +4 -0
  98. package/es/packages/field-set/style/index.css +162 -0
  99. package/es/packages/field-set/style/index.less +172 -0
  100. package/es/packages/grid/index.d.ts +3 -0
  101. package/es/packages/grid/index.mjs +1 -0
  102. package/es/packages/grid/index2.mjs +11 -0
  103. package/es/packages/grid/src/Grid.d.ts +2 -0
  104. package/es/packages/grid/src/Grid.mjs +28 -0
  105. package/es/packages/grid/src/hooks.d.ts +1 -0
  106. package/es/packages/grid/src/hooks.mjs +1 -0
  107. package/es/packages/grid/src/hooks2.mjs +165 -0
  108. package/es/packages/grid/style/index.css +0 -0
  109. package/es/packages/grid/style/index.less +1 -0
  110. package/es/packages/index.css +1004 -0
  111. package/es/packages/index.d.ts +35622 -0
  112. package/es/packages/index.less +1205 -0
  113. package/es/packages/index.mjs +7 -0
  114. package/es/packages/index2.mjs +37 -0
  115. package/es/packages/select-person/index.d.ts +3500 -0
  116. package/es/packages/select-person/index.mjs +1 -0
  117. package/es/packages/select-person/index2.mjs +11 -0
  118. package/es/packages/select-person/src/SearchTree.mjs +2 -0
  119. package/es/packages/select-person/src/SearchTree.vue.d.ts +344 -0
  120. package/es/packages/select-person/src/SearchTree.vue_vue_type_script_setup_true_lang.mjs +231 -0
  121. package/es/packages/select-person/src/SearchTree2.mjs +4 -0
  122. package/es/packages/select-person/src/SelectPerson.mjs +2 -0
  123. package/es/packages/select-person/src/SelectPerson.vue.d.ts +3501 -0
  124. package/es/packages/select-person/src/SelectPerson.vue_vue_type_script_setup_true_lang.mjs +892 -0
  125. package/es/packages/select-person/src/SelectPerson2.mjs +4 -0
  126. package/es/packages/select-person/src/utils/index.d.ts +12 -0
  127. package/es/packages/select-person/src/utils/index.mjs +1 -0
  128. package/{packages/select-person/src/utils/index.js → es/packages/select-person/src/utils/index2.mjs} +57 -66
  129. package/es/packages/select-person/style/index.css +193 -0
  130. package/es/packages/select-person/style/index.less +229 -0
  131. package/{packages/big-table → es}/src/assets/iconfont/iconfont.ttf +0 -0
  132. package/{packages/big-table → es}/src/assets/img/failure.png +0 -0
  133. package/{packages/big-table → es}/src/assets/img/icon-asc.png +0 -0
  134. package/{packages/big-table → es}/src/assets/img/icon-desc.png +0 -0
  135. package/{packages/big-table → es}/src/assets/img/no-permission.png +0 -0
  136. package/{packages/big-table → es}/src/assets/img/nodata.png +0 -0
  137. package/{packages/big-table → es}/src/assets/img/notfound.png +0 -0
  138. package/{packages/big-table → es}/src/assets/img/qr.png +0 -0
  139. package/{packages/big-table → es}/src/assets/img/video_default_cover.png +0 -0
  140. package/{packages/big-table → es}/src/assets/img/xb_big.png +0 -0
  141. package/{packages/big-table → es}/src/assets/img/xb_small.png +0 -0
  142. package/es/src/core/create.d.ts +1 -0
  143. package/es/src/core/create.mjs +1 -0
  144. package/es/src/core/create2.mjs +8 -0
  145. package/es/src/global/variable.d.ts +2 -0
  146. package/es/src/global/variable.mjs +1 -0
  147. package/es/src/global/variable2.mjs +4 -0
  148. package/es/src/types/index.d.ts +4 -0
  149. package/es/src/types/index.mjs +1 -0
  150. package/es/src/utils/clickoutside.d.ts +18 -0
  151. package/es/src/utils/clickoutside.mjs +1 -0
  152. package/es/src/utils/clickoutside2.mjs +48 -0
  153. package/es/src/utils/crypto.d.ts +7 -0
  154. package/es/src/utils/crypto.mjs +1 -0
  155. package/{src/utils/crypto.js → es/src/utils/crypto2.mjs} +25 -25
  156. package/es/src/utils/index.d.ts +4 -0
  157. package/es/src/utils/index.mjs +1 -0
  158. package/es/src/utils/index2.mjs +27 -0
  159. package/es/src/utils/vexutils.d.ts +5 -0
  160. package/es/src/utils/vexutils.mjs +3 -0
  161. package/es/src/utils/vexutils2.mjs +729 -0
  162. package/global.d.ts +8 -0
  163. package/package.json +54 -21
  164. package/yarn-error.log +122 -0
  165. package/es/big-table/index.css +0 -587
  166. package/es/big-table/index.js +0 -41710
  167. package/es/button-print/index.css +0 -617
  168. package/es/button-print/index.js +0 -8363
  169. package/es/drag-layout/index.css +0 -850
  170. package/es/drag-layout/index.js +0 -13104
  171. package/es/field-set/index.css +0 -1048
  172. package/es/field-set/index.js +0 -351
  173. package/es/grid/index.css +0 -1049
  174. package/es/grid/index.js +0 -30819
  175. package/es/index.css +0 -1323
  176. package/es/index.js +0 -46945
  177. package/es/select-person/index.css +0 -1323
  178. package/es/select-person/index.js +0 -13191
  179. package/packages/big-table/index.ts +0 -17
  180. package/packages/big-table/src/BigTable.vue +0 -2598
  181. package/packages/big-table/src/assets/iconfont/iconfont.less +0 -22
  182. package/packages/big-table/src/assets/style/table-global.less +0 -171
  183. package/packages/big-table/src/bigTableState.ts +0 -63
  184. package/packages/big-table/src/components/NoData.vue +0 -90
  185. package/packages/big-table/src/components/TextOverTooltip.vue +0 -110
  186. package/packages/big-table/src/components/edit-form/edit-date.vue +0 -75
  187. package/packages/big-table/src/components/edit-form/edit-input.vue +0 -39
  188. package/packages/big-table/src/components/edit-form/edit-select-table.vue +0 -133
  189. package/packages/big-table/src/components/edit-form/edit-select.vue +0 -96
  190. package/packages/big-table/src/hooks/useBatchEditing.ts +0 -574
  191. package/packages/big-table/src/hooks/useEdit.ts +0 -131
  192. package/packages/big-table/src/hooks/useTableParse.ts +0 -169
  193. package/packages/button-print/index.ts +0 -15
  194. package/packages/button-print/src/ButtonPrint.vue +0 -488
  195. package/packages/button-print/src/components/IdentityVerification.vue +0 -120
  196. package/packages/button-print/src/interfaces.ts +0 -19
  197. package/packages/button-print/src/utils/print.es.min.js +0 -1
  198. package/packages/drag-layout/index.ts +0 -15
  199. package/packages/drag-layout/src/DragFormLeftItem.vue +0 -131
  200. package/packages/drag-layout/src/DragFormRightItem.vue +0 -277
  201. package/packages/drag-layout/src/DragLayout.vue +0 -712
  202. package/packages/field-set/index.ts +0 -15
  203. package/packages/field-set/src/FieldSet.vue +0 -471
  204. package/packages/grid/index.ts +0 -20
  205. package/packages/grid/src/Grid.tsx +0 -18
  206. package/packages/grid/src/hooks.ts +0 -167
  207. package/packages/index.ts +0 -41
  208. package/packages/select-person/index.ts +0 -11
  209. package/packages/select-person/src/SelectPerson.vue +0 -1104
  210. package/packages/select-person/src/search-tree.vue +0 -326
  211. package/src/component/svg/index.vue +0 -49
  212. package/src/core/create.js +0 -5
  213. package/src/global/variable.ts +0 -2
  214. package/src/utils/clickoutside.ts +0 -80
  215. package/src/utils/vexutils.js +0 -811
  216. package/tsconfig.node.json +0 -8
@@ -1,2598 +0,0 @@
1
- <template>
2
- <div
3
- class="big-table custom-big-table"
4
- :class="{
5
- mt: state.visibleCheckAllWrap || state.visibleTreeCheck || state.hasRefresh,
6
- 'expand-padding': !props.isNestTable,
7
- }"
8
- :style="{ height: state.tableHeight }"
9
- >
10
- <div v-if="state.hasRefresh && !props.isNestTable" class="check-wrap">
11
- <p class="check-wrap-title">
12
- <span>系统检测到有数据更新,</span>
13
- <span class="check-wrap-btn" @click="refreshTable">点击查看</span>
14
- </p>
15
- </div>
16
- <!-- 全选 选择框 -->
17
- <div
18
- v-show="state.visibleCheckAllWrap && !props.isInlineOperating && !props.isNestTable"
19
- class="check-wrap"
20
- >
21
- <p class="check-wrap-title">
22
- <span>已勾选数据共{{ allSelectedLength }}条</span>
23
- <span v-show="state.visibleCheckAllWrapMore">
24
- (当前页{{ state.currentPageSelectedLength }}条)
25
- </span>
26
- </p>
27
- <template v-if="state.visibleCheckAllWrapMore && !props.asyncCount">
28
- <p v-if="!visibleCancelCheckAllBtn" class="check-wrap-btn" @click="handleCheckAll">
29
- <span v-if="pageVO.total > maxCheckSize">
30
- <!-- {{ `最大勾选“${tableName}” ${maxCheckSize}条数据` }} -->
31
- {{ `勾选全部页 ${maxCheckSize}条数据` }}
32
- </span>
33
- <span v-else>
34
- <!-- {{ $t("1.9.598", { name: tableName, total }) }} -->
35
- {{ `勾选全部页 ${pageVO.total}条数据` }}
36
- </span>
37
- </p>
38
- <p v-else class="check-wrap-btn" @click="handleCancelAllCheck">取消全部勾选</p>
39
- </template>
40
- </div>
41
- <!-- 树状表格已选 -->
42
- <div
43
- v-show="state.visibleTreeCheck && !props.isInlineOperating && !props.isNestTable"
44
- class="check-wrap"
45
- >
46
- <p class="check-wrap-title">
47
- <span>已勾选数据共{{ state.treeTableLength }}条</span>
48
- </p>
49
- </div>
50
-
51
- <CGrid
52
- ref="xGrid"
53
- border
54
- show-overflow
55
- show-header-overflow
56
- highlight-hover-row
57
- highlight-current-row
58
- show-footer-overflow="title"
59
- keep-source
60
- height="auto"
61
- resizable
62
- auto-resize
63
- :seq-config="handleSeqConfig"
64
- :tree-config="treeConfig"
65
- :row-id="handleRowId"
66
- :row-class-name="getRowClassName"
67
- :show-footer="showFooter && !props.isInlineOperating"
68
- :footer-method="footerMethod"
69
- :sort-config="{ trigger: 'cell', remote: true }"
70
- :span-method="colspanMethod"
71
- :footer-span-method="footerRowspanMethod"
72
- :tooltip-config="{ enterable: false }"
73
- :checkbox-config="{
74
- checkField: 'checked',
75
- labelField: 'checked',
76
- checkMethod: checkMethod,
77
- trigger: 'cell',
78
- reserve: true,
79
- highlight: true,
80
- }"
81
- :radio-config="{
82
- checkField: 'checked',
83
- trigger: 'cell',
84
- reserve: true,
85
- highlight: true,
86
- }"
87
- :scroll-x="{ enabled: false }"
88
- :scroll-y="{ gt: 50 }"
89
- :row-style="getRowStyle"
90
- :edit-config="state.editConfig"
91
- :expand-config="{
92
- lazy: true,
93
- accordion: columnConfig && columnConfig.accordion,
94
- loadMethod: loadExpandMethod,
95
- toggleMethod: toggleExpandMethod,
96
- iconOpen: 'iconfont icon-a-xitongtubiaozhediejian',
97
- iconClose: 'iconfont icon-a-xitongtubiaotianjia',
98
- }"
99
- :keyboard-config="columnConfig.keyboardConfig || {}"
100
- :edit-rules="columnConfig.editRules || {}"
101
- @cell-dblclick="rowdblclick"
102
- @cell-click="handlerClickRow"
103
- @checkbox-change="selectionChange"
104
- @checkbox-all="selectionChangeAll"
105
- @radio-change="radioOnChange"
106
- @sort-change="sortChange"
107
- @scroll="handlerScroll"
108
- @cell-mouseenter="handleCellMouseenter"
109
- >
110
- <template #empty>
111
- <div v-if="state.isShowEmpty">
112
- <NoData
113
- :no-data-img="props.emptyItems.noDataImg"
114
- :no-data-tip="props.emptyItems.noDataTip"
115
- :show-img="!props.isNestTable"
116
- ></NoData>
117
- </div>
118
- </template>
119
- <!-- 修复 vxe-table升级3.x版本 原自定义checkbox样式失效 -->
120
- <template #tooltip_checkbox="{ row, checked }">
121
- <n-tooltip v-if="row.forbiddenBatchSelect" trigger="hover" placement="right">
122
- <template #trigger>
123
- <i class="disabled-checked-tips"></i>
124
- </template>
125
- {{ row.forbiddenBatchSelectReason }}
126
- </n-tooltip>
127
- <n-checkbox v-else class="tooltip-checkbox-item" :checked="checked"></n-checkbox>
128
- </template>
129
- <template #tooltip_footer="{ column }">
130
- <!-- 分组统计 -->
131
- <template v-if="groupCountFields && groupCountFields.length">
132
- <span v-html="state.groupText"></span>
133
- </template>
134
- <!-- 一般统计 -->
135
- <n-tooltip v-else trigger="hover">
136
- <template #trigger>
137
- {{ getFooterTitle(column) }}
138
- </template>
139
- <div v-html="getFooterTooltipTitle(column)"></div>
140
- </n-tooltip>
141
- </template>
142
- <!-- 子列表嵌套 -->
143
- <template #nest_table_content="{ row, rowIndex, $rowIndex, column }">
144
- <slot name="content" :data="{ row, rowIndex, $rowIndex, column }"></slot>
145
- </template>
146
- </CGrid>
147
- <!-- `${refreshRow}条更新` -->
148
- <div
149
- v-show="props.refreshRow > 0 && !props.isNestTable"
150
- class="refresh"
151
- @click="hanldeClickRefresh"
152
- >
153
- <NIcon size="14" :component="SyncOutline" />
154
- <p class="refresh-row">{{ refreshRow }}条更新</p>
155
- </div>
156
- </div>
157
- </template>
158
-
159
- <script lang="tsx">
160
- import create from '@/core/create.js';
161
- export default create({
162
- name: "BigTable"
163
- })
164
- </script>
165
-
166
- <script lang="tsx" setup>
167
- import { computed, nextTick, onMounted, reactive, ref, useAttrs, watch, isReactive, shallowReactive, onActivated, onUnmounted } from "vue";
168
- // import { useRoute } from 'vue-router';
169
- import bigTableState from "./bigTableState";
170
- import bigTableProps from "./bigTableProps";
171
- import bigTableEmits from "./bigTableEmits";
172
- import { useFormat } from "./hooks/useFormat";
173
- import { useTableParse } from "./hooks/useTableParse";
174
- import { useBatchEditing } from "./hooks/useBatchEditing";
175
- import { useNestTable } from "./hooks/useNestTable";
176
- import { useEdit, comps } from './hooks/useEdit';
177
- import { SettingsSharp, SyncOutline, CopyOutline, CaretDown, CaretForward } from "@vicons/ionicons5";
178
- import NoData from "./components/NoData.vue";
179
- import TextOverTooltip from "./components/TextOverTooltip.vue";
180
- import SvgIcon from '@/component/svg/index.vue';
181
- import {
182
- NButton,
183
- NCheckbox,
184
- NCheckboxGroup,
185
- NSpin,
186
- NTooltip,
187
- NInputGroup,
188
- NInput,
189
- NSpace,
190
- NIcon,
191
- NProgress,
192
- NSwitch,
193
- NPopover,
194
- NDropdown,
195
- NPopconfirm
196
- } from "naive-ui";
197
- import { useMessage } from 'naive-ui'
198
- import CGrid from '~/grid';
199
- import vexutils from '@/utils/vexutils.js';
200
- import {
201
- getEvaluate,
202
- getMapVal,
203
- getageShowType,
204
- reScrollFilterWrap,
205
- showFilter,
206
- handleGroupColums,
207
- handlerInitSearchItem,
208
- generateEditRender,
209
- getFooterGroup,
210
- checkMethod,
211
- flattenRow,
212
- intersectRow,
213
- removeCheckedDisabledRows,
214
- setFilterStatus,
215
- getRowStyle,
216
- handleTableHeight,
217
- handleName,
218
- handleImgArr,
219
- handleImgSrc,
220
- modalDetailImage,
221
- getCandidateComponents,
222
- handleQrCodeContent,
223
- getInlineEditBtn,
224
- isCopy,
225
- handleTableImageSize,
226
- setDefaultFormData,
227
- hideFilterWrap,
228
- mergeConObjFn,
229
- isLink,
230
- setTableConfig,
231
- setTreeGroupTitle,
232
- setVisibleCheckAllWrap
233
- } from './utils'
234
-
235
- import xb_big from './assets/img/xb_big.png'
236
- import qr from './assets/img/qr.png'
237
- import { PROPERTY_TYPES } from '@babel/types';
238
-
239
- let _hideAllWrap: any = null;
240
- let _beforeSearchConvert: any = [];
241
- let addInlineEditPrimaryKey: any = '';
242
-
243
- const GROUP_TITLE_KEY = "group-show-title";
244
-
245
- // const route = useRoute();
246
-
247
- (window as any).$message = useMessage()
248
-
249
- const xGrid: any = ref(null);
250
-
251
- const state: any = reactive(bigTableState);
252
-
253
- const emit = defineEmits(bigTableEmits);
254
-
255
- const props = defineProps(bigTableProps);
256
-
257
- const { formatData, htmlToText, getBtnStyle }: any = useFormat(state);
258
- const { imgs2imgArr, parseDurationValue, parseCombinationValue, formatFieldText } = useTableParse(formatData);
259
- const {
260
- allSelectedLength,
261
- checkOperateCurrentTable,
262
- setRowStatus,
263
- resetBatchOperationRowStatus,
264
- checkListFormUnionSettingParamsList,
265
- handleClickCancelBtnByInline,
266
- setAllRowInlineStatus,
267
- hideSelectCloumns,
268
- handleEditFormLength,
269
- resetOperationRowStatus,
270
- recordClickBtnInfo,
271
- getInlineOpreateRow
272
- }: any = useBatchEditing(props, state, emit, xGrid);
273
- const { initEditTable, activeMethod, deleteRow, onClickSelectTable, onFormChange, getDefaultValue } = useEdit(props, state, emit, xGrid)
274
-
275
- const {
276
- isAboutNestTable,
277
- isExpandTable,
278
- handleRowId,
279
- toggleExpandMethod,
280
- loadExpandMethod,
281
- nestHandleClickRow
282
- } = useNestTable(props, state, emit);
283
-
284
- const attr = useAttrs();
285
-
286
- /**
287
- * computed
288
- */
289
- const currentCheckedKeys = computed(() => {
290
- return state.checkedRows?.map((row: any) => row[props.primaryKey]) || [];
291
- });
292
- const visibleCancelCheckAllBtn = computed(() => {
293
- let isCurrentPageAllCheck = state.currentPageSelectedLength === state.curAbleCheckedLen;
294
- let isMaxChecked = currentCheckedKeys.value.length === props.maxCheckSize;
295
- let isCheckedTotal = currentCheckedKeys.value.length === props.pageVO.total;
296
-
297
- return isMaxChecked || !isCurrentPageAllCheck || isCheckedTotal;
298
- });
299
- const singleCheckedKey = computed(() => {
300
- const checkedKeys: any = currentCheckedKeys.value || [];
301
- return checkedKeys.length == 1 ? checkedKeys[0] : "";
302
- });
303
- const tableNoSetting = computed(() => {
304
- let { noSetting } = getOtherConfigInit() || {};
305
- return noSetting || props.showSettings?.hideSettingBtn == 1;
306
- });
307
- const isScanMultiTable = computed(() => {
308
- return props.columnConfig?.isScanMultiTable;
309
- });
310
- //来自batchEditing.js
311
- const configuration = computed(() => {
312
- return {
313
- userInfo: props.userInfo || {},
314
- sysImageSize: props.sysImageSize || {},
315
- // switchConfig: this.switchConfig || {},
316
- // hospitalConfigData: this.iconObj || {}
317
- };
318
- });
319
- const handlePrimaryKey = computed(() => {
320
- return state.isTree > 0 ? props.primaryKey || "theUniqueKey" : "theUniqueKey";
321
- });
322
- const handleSeqConfig = computed(() => {
323
- if (props.isNestTable) return { startIndex: 0 };
324
- if (props.isBatchEditing) {
325
- return { startIndex: 0 };
326
- }
327
- let startIndex = (props.pageVO.pageIndex - 1) * props.pageVO.pageSize;
328
- return { startIndex: startIndex < 0 ? 0 : startIndex };
329
- });
330
- const treeConfig = computed(() => {
331
- let result = null;
332
- switch (Number(state.isTree)) {
333
- case 1:
334
- case 3:
335
- result = {
336
- children: "childrenList",
337
- accordion: state.openOnly > 0,
338
- reserve: true,
339
- };
340
- break;
341
- case 2:
342
- result = {
343
- lazy: true,
344
- reserve: true,
345
- children: "childrenList",
346
- hasChild: "hasChildren",
347
- loadMethod: loadChildrenMethod,
348
- accordion: state.openOnly > 0,
349
- };
350
- break;
351
- default:
352
- break;
353
- }
354
- return result;
355
- });
356
-
357
- const hideAllWrap = (e: any) => {
358
- const path = e.path || (e.composedPath && e.composedPath());
359
- const noWrap = (className: string) => {
360
- return !path.some((p: any) => {
361
- return p.className && p.className.includes && p.className.includes(className);
362
- });
363
- };
364
-
365
- let notFilterWrap = noWrap('big-table-filter-wrap');
366
- if (notFilterWrap) {
367
- hideFilterWrap(state, props);
368
- }
369
- }
370
- const bindDocumentClick = () => {
371
- _hideAllWrap = hideAllWrap.bind(this);
372
- window.document.addEventListener('click', _hideAllWrap, true);
373
- }
374
- const unBindDocumentClick = () => {
375
- window.document.removeEventListener('click', _hideAllWrap, true);
376
- }
377
- onMounted(() => {
378
- bindDocumentClick();
379
- state.tableHeight = handleTableHeight(state, props) || 'auto';
380
-
381
- // // 子列表在mounted后初始化 直接watch无法触发
382
- if (!props.isNestTable) return;
383
- loadColumn(props.columnConfig);
384
- loadData(props.data);
385
- });
386
- onUnmounted(() => {
387
- unBindDocumentClick();
388
- })
389
- onActivated(() => {
390
- // 行编辑状态下 切换tab 再切回 需要重置页面样式
391
- removeInsert();
392
- })
393
- const removeInsert = async () => {
394
- if (state.isTree != 0) return false;
395
-
396
- const vxeTable = xGrid.value;
397
- // let { row } = this.getInlineOpreateRow();
398
- let { tableData } = vxeTable.getTableData();
399
- if (tableData && tableData.length) {
400
- tableData.forEach((row: any) => {
401
- if (row?.__isInsertRow) {
402
- vxeTable.remove(row);
403
- }
404
- });
405
- }
406
- if (!state.originFormatList?.length) return;
407
-
408
- await vxeTable.loadData(state.originFormatList);
409
- resetBatchOperationRowStatus();
410
- }
411
- // 加载表格头部
412
- const loadColumn = (config: any) => {
413
- setTableConfig(config, state);
414
- // this.hasOnlyIcon = config.hasOnlyIcon;
415
- let columns = formatColumns(config);
416
- columns = handleGroupColums(columns, props);
417
- xGrid.value && xGrid.value.reloadColumn(columns);
418
-
419
- setGroupTreeExpand();
420
- resetTableInlineEditStatus();
421
- };
422
- // 加载表格内容
423
- const loadData = async (data: any) => {
424
- state.isShowEmpty = !data?.length;
425
-
426
- const list = JSON.parse(JSON.stringify(data));
427
- // console.log("list--------------", list);
428
- let table = xGrid.value;
429
- if (!table) return;
430
- let formatList = setChecklist(list);
431
- state.originFormatList = formatList;
432
-
433
- setGroupTitleToFristColumnFieldData(formatList);
434
- state.curAbleCheckedLen = list.filter((item: any) => checkMethod({ row: item })).length;
435
-
436
- // 非子列表触发
437
- if (!props.isNestTable) {
438
- await handleFormTheUniqueKey();
439
- }
440
-
441
- formatList = formatList.map((v: any) => {
442
- return {
443
- ...v,
444
- selectTableShow: false,
445
- selectTableDisable: false
446
- }
447
- })
448
-
449
- // reloadData 替换 loadData 保存setting之后需要表格重新reload
450
- // loadData 加载数据
451
- // reloadData 加载数据并清除所有状态
452
- // 暂时 不知道是否影响其它????
453
- // 还是用loadData较好,树表展开需要在更新数据后保留上一次的状态
454
- // table.clearSort(); // <-- table.loadData 不会清空sort选项,导致sortChange重复触发
455
- await table.loadData(formatList);
456
- // initEditTable()
457
-
458
-
459
- table.setCurrentRow({});
460
- setCurrentPageRowChecked();
461
-
462
- setGroupTreeExpand();
463
- resetTableInlineEditStatus();
464
- };
465
- const setGroupTitleToFristColumnFieldData = (formatList: any) => {
466
- if (state.isTree != 3) return;
467
- let table = xGrid.value;
468
- let key = table.getTableColumn().tableColumn?.find((column: any) => {
469
- return !!column.property;
470
- }).property;
471
-
472
- setTreeGroupTitle(formatList, key, GROUP_TITLE_KEY);
473
- };
474
- const setCurrentPageRowChecked = () => {
475
- let table = xGrid.value;
476
- if (!table) return;
477
- let currentPageTableData = table.getTableData()?.tableData;
478
- let currentPageSelectedRows = currentPageTableData.filter((row: any) => {
479
- return (row[props.primaryKey] ? currentCheckedKeys.value.includes(row[props.primaryKey]) : false)
480
- });
481
- setCurrentCheckedLength();
482
- if (!currentPageSelectedRows || !currentPageSelectedRows.length) {
483
- table.setAllCheckboxRow(false);
484
- return;
485
- }
486
- table.setCheckboxRow(currentPageSelectedRows, true);
487
- };
488
- const setCurrentCheckedLength = () => {
489
- let table = xGrid.value;
490
- let currentPageTableData = table.getTableData().fullData;
491
- let currentPageSelectedRows = currentPageTableData.filter((row: any) => {
492
- return currentCheckedKeys.value.includes(row[props.primaryKey]);
493
- });
494
-
495
- state.currentPageSelectedLength = currentPageSelectedRows.length;
496
- };
497
- // 列数据解析逻辑
498
- const formatColumns = (map: any) => {
499
- /**
500
- * 针对 bigTable 的设置列
501
- * type: 列的类型
502
- * field: 列字段名(注:属性层级越深,渲染性能将直线下降)
503
- * title: 列标题(支持开启国际化)
504
- * width: 列宽度(如果为空则均匀分配剩余宽度,如果全部列固定了,可能会存在宽屏下不会铺满,可以配合 "%" 或者 "min-width" 布局)
505
- * minWidth: 最小列宽度;会自动将剩余空间按比例分配
506
- * resizable: 列是否允许拖动列宽调整大小
507
- * visible: 列是否显示
508
- * fixed: 将列固定在左侧或者右侧(注意:固定列应该放在左右两侧的位置)
509
- * align: 列对齐方式
510
- * headerAlign: 表头列的对齐方式
511
- * footerAlign: 表尾列的对齐方式
512
- * formatter: 格式化显示内容 Function({cellValue, row, column})
513
- * sortable: 是否允许列排序
514
- */
515
- // 配置列表
516
- let { selectType } = getOtherConfigInit() || {};
517
- let { isBatchSelect, fieldList = [], showButtonTop, isScanMultiTable, isEdit = false, editConfig = {} } = map;
518
- if (isEdit) {
519
- state.editConfig = Object.assign(state.editConfig, editConfig, {
520
- // mode: 'cell',
521
- // autoClear: true,
522
- // activeMethod
523
- })
524
- }
525
- if (selectType) {
526
- // 有设置 selectType 强制可选。
527
- isBatchSelect = 1;
528
- }
529
- selectType = selectType || "checkbox";
530
- // 扫码弹框 设置为radio
531
- let { listType } = props.tableOptions;
532
- if (listType == "scanList") {
533
- selectType = "radio";
534
- }
535
- state.selectType = selectType;
536
- let tableHeight = props.styleSetting?.tableHeight || "table-simple";
537
- let checkMinWidth = state.checkWidth[tableHeight] || "30";
538
- const checkboxSlot = {
539
- default: (data: any) => {
540
- return checkMethod(data) ? null : (
541
- <NTooltip placement="right" trigger="hover"
542
- >
543
- {{
544
- default: () => data.row.forbiddenBatchSelectReason,
545
- trigger: () => <i class="disabled-checked-tips"></i>
546
- }}
547
- </NTooltip>
548
- );
549
- }
550
- };
551
- let checkVisible = (isBatchSelect == 1 && !props.isNestTable && !isScanMultiTable) || false;
552
- let columns = [
553
- {
554
- fixed: "left",
555
- align: "center",
556
- visible: isScanMultiTable || false,
557
- width: "60",
558
- slots: {
559
- header: () => "操作",
560
- default: scanMultiOperate,
561
- },
562
- },
563
- {
564
- type: "seq",
565
- fixed: props.isNestTable ? "" : "left",
566
- align: "center",
567
- resizable: true,
568
- width: "34",
569
- showOverflow: true,
570
- slots: {
571
- header: () => {
572
- return [
573
- tableNoSetting.value ? null : <NIcon size="14" color="#777" component={SettingsSharp} onClick={() => showDrawer()} />
574
- ];
575
- },
576
- },
577
- },
578
- {
579
- type: selectType,
580
- fixed: props.isNestTable ? "" : "left",
581
- align: "center",
582
- visible: checkVisible,
583
- resizable: false,
584
- width: checkMinWidth,
585
- slots: selectType === 'checkbox' ? checkboxSlot : null,
586
- // 修复 vxe-table升级3.x版本 原自定义checkbox样式失效
587
- // slots:
588
- // selectType === "checkbox"
589
- // ? {
590
- // checkbox: "tooltip_checkbox",
591
- // }
592
- // : null,
593
- showOverflow: true,
594
- },
595
- ];
596
- // let showOperatorColumn = true;
597
- // if (showButtonTop == 1) {
598
- // showOperatorColumn = hasOnlyIcon;
599
- // }
600
-
601
- const currentColumns = fieldList.map((item: any, index: number) => {
602
- let filterField = item?.fieldSetting?.mapping?.type === "manual" && item.isMerge != 1;
603
- // 是否排序 1 不可排序
604
- let notParticipatingSort = item?.fieldSetting?.notParticipatingSort || "";
605
- // 有子列表fixed会遮盖 所以主表不设置fixed
606
- let fixed = isAboutNestTable.value
607
- ? ""
608
- : item.isFixed
609
- ? item.isFixed == 1
610
- ? "left"
611
- : "right"
612
- : "";
613
- let sortable = props.isNestTable
614
- ? false
615
- : !filterField && item.isSort == 1 && notParticipatingSort != 1 && item.isMerge != 1;
616
- let treeNode = props.isNestTable ? false : state.isTree != 0 ? index === 0 : false;
617
- let type = index === 0 && props.showNestTable ? "expand" : "";
618
-
619
- // 扫码打开的table只展示
620
- if (isScanMultiTable) {
621
- fixed = "";
622
- sortable = false;
623
- treeNode = false;
624
- type = "";
625
- }
626
-
627
- const col = Object.assign(item, {
628
- visible: item.columnName == "operatorColumn" ? showButtonTop == 0 : item.isShow == 1,
629
- field: item.columnName,
630
- title: handleName(item, "title"),
631
- minWidth: item.colWidth,
632
- fixed: fixed,
633
-
634
- sortable: sortable,
635
- // 参数 "column.remote-sort" 已废弃,请使用 "sort-config.remote"
636
- // remoteSort: !filterField && item.isSort == 1 && notParticipatingSort != 1,
637
-
638
- headerClassName: "mycolumn", // 文本溢出处理('tooltip' vxe-table当前版本存在bug)
639
- // showHeaderOverflow: "title",
640
- showOverflow: "title",
641
- treeNode: treeNode,
642
- type: type,
643
- // slots: {
644
- // default: (params: any) => {
645
- // return formatter(params, item);
646
- // },
647
- // },
648
- slots: {
649
- edit: (params: any) => {
650
- if (isEdit && item.isEdit && item.columnName !== 'operatorColumn') {
651
- return formatterEdit(params, item)
652
- } else {
653
- return <span>{params.row[item.columnName]}</span>
654
- }
655
- },
656
- default: (params: any) => {
657
- if(!isEdit || item.columnName === 'operatorColumn' || !item.isEdit) {
658
- return formatter(params, item)
659
- } else if (isEdit && item.isEdit && item.checkEditStatus && item.checkEditStatus(params)) {
660
- return formatterEdit(params, item)
661
- } else {
662
- return <span>{getDefaultValue(params, item)}</span>
663
- }
664
- }
665
- },
666
- editRender: isEdit ? {} : generateEditRender(item)
667
- });
668
-
669
- if (filterField && !props.isNestTable && !isScanMultiTable) {
670
- state.filterFields[item.columnName] = Object.assign(
671
- {},
672
- vexutils.clone(item, true),
673
- {
674
- visible: false,
675
- left: "initial",
676
- right: "initial",
677
- top: "initial",
678
- indeterminate: false,
679
- checkAll: false,
680
- searchFilterText: "",
681
- searchFilterCONVERT: [],
682
- filterSort: "",
683
- }
684
- );
685
- let field = state.filterFields[item.columnName];
686
- handlerInitSearchItem([field]);
687
- col.slots.header = formatterHeader(item);
688
- } else {
689
- col.slots.header = toolTipTitle(item);
690
- }
691
-
692
- if (!isScanMultiTable) {
693
- col.slots.footer = "tooltip_footer";
694
- }
695
-
696
- // 主表设置expand
697
- if (props.showNestTable && state.isTree == 0 && props.curNestColumnConfig?.isTree == 0) {
698
- col.slots.content = "nest_table_content";
699
- }
700
-
701
- return col;
702
- });
703
- columns.push(...currentColumns);
704
- state.columnLen = currentColumns.filter((item: any) => item.visible).length;
705
- return columns;
706
- };
707
- const formatterEdit = (params: any, col: any) => {
708
- let { row, column, $rowIndex, rowIndex } = params
709
- let formType = column.formType || col.formType || ''
710
- let formatMap = column.formatMap || col.formatMap || null
711
- if (!formType) return null
712
- if (formType === 'custom') {
713
- return col.slotFn(params)
714
- }
715
- const Comp = comps[formType] || ''
716
- if (!Comp) return null
717
- const propsData: any = {
718
- col,
719
- row,
720
- index: $rowIndex,
721
- // vModel: [row[col.columnName], formType === 'date' ? 'formattedValue' :'value'],
722
- type: formType,
723
- onFormChange
724
- }
725
- if (formType === 'date') {
726
- propsData.defaultFormattedValue = row[col.columnName]
727
- } else if(formatMap){
728
- propsData.defaultValue = row[formatMap.value]
729
- } else {
730
- propsData.defaultValue = row[col.columnName]
731
- }
732
- if (formType === 'select') {
733
- propsData.onSetOptions = (options: any[]) => (row[`${col.columnName}_options`] = options)
734
- }
735
- return <Comp {...propsData} />
736
- }
737
- const getEditBtn = (row: any, col: any, index: number) => {
738
- return col.tileBtnList?.map((btn: any) => {
739
- if (btn.settingObj[0].trigger_type === 'DELETE') {
740
- return <NPopconfirm
741
- onPositiveClick={() => deleteRow(row, col, index)}
742
- >
743
- {{
744
- trigger: () => <NButton color={btn.settingObj[0].color || '#999'} text>{btn.name}</NButton>,
745
- default: () => '是否确认删除?'
746
- }}
747
- </NPopconfirm>
748
- } else {
749
- return null
750
- }
751
- })
752
- }
753
- // 表格渲染逻辑
754
- const formatter = (params: any, col: any) => {
755
- let { row, column, $rowIndex } = params;
756
- let own = column?._own || column?.own || col;
757
- let attrType = own?.attrType || "";
758
-
759
- // 批量行编辑
760
- let formUnionItem = showEditForm(row, column, $rowIndex);
761
- if (formUnionItem) {
762
- let dynamicProps = initBatchDynamicProps(formUnionItem, row, column, $rowIndex);
763
- if (dynamicProps) {
764
- // console.log(dynamicProps);
765
- // loading 使用
766
- emit("setWaitEditKeys", column.property);
767
- return null
768
- // return [
769
- // <EditForm class={`js-inlineEditForm`} key={row[props.primaryKey] + $rowIndex + column.property} data-key={row[props.primaryKey] + $rowIndex + column.property} {...dynamicProps}></EditForm>
770
- // ];
771
- }
772
- }
773
-
774
- if (vexutils.has(row, GROUP_TITLE_KEY)) {
775
- return row[GROUP_TITLE_KEY];
776
- }
777
- if (attrType == "PICTURE" || attrType == "HEADPORTRAIT") {
778
- return getPicture(row, own, attrType);
779
- }
780
- if (attrType == "COLOR") {
781
- return getColor(row, own);
782
- }
783
- if (attrType == "EVALUATE") {
784
- return getEvaluate(row, own);
785
- }
786
- if (attrType == "MAP") {
787
- return getMapVal(row, own);
788
- }
789
- if (attrType == "DATE" || attrType == "TASKDATE") {
790
- return getDate(row, own);
791
- }
792
- if (attrType == "PERCENTAGE") {
793
- return getPercentage(row, own);
794
- }
795
- if (attrType == "VIDEO") {
796
- return getvideoList(row, own);
797
- }
798
- // 选人组件数据展示解析
799
- if (attrType == "CANDIDATE_COMPONENTS") {
800
- return getCandidateComponents(row, own);
801
- }
802
- if (attrType == "AGE") {
803
- return getageShowType(row, own);
804
- }
805
- if (attrType === "COUNTDOWN") {
806
- return <NTooltip>
807
- {{
808
- trigger: () => <span innerHTML={row[own.columnName + "_countdown"] || ""} />,
809
- default: () => row[own.columnName + "_countdownTip"]
810
- }}
811
- </NTooltip>
812
- }
813
- // 时长
814
- if (attrType === "DURATION") {
815
- const value = row[own.columnName];
816
- const duration = own?.fieldSetting?.duration;
817
- return parseDurationValue(value, duration);
818
- }
819
- // 组合组件
820
- if (attrType === "COMBINATION") {
821
- const value = row[own.columnName];
822
- const params = own.fieldSetting || {};
823
- const data = parseCombinationValue(value, params);
824
- return data ? [<span title={data}>{data}</span>] : "";
825
- }
826
- if (attrType === "PASSWORD") {
827
- const value = row[own.columnName];
828
- return [<password-com value={value} styleSetting={props.styleSetting} />];
829
- }
830
- // 二维码
831
- if (attrType === "QR_CODE") {
832
- return getOrCode(row, own, attrType);
833
- }
834
- if (column.property === "operatorColumn") {
835
- if (props.columnConfig.isEdit && !row.initRow) {
836
- return getEditBtn(row, col, $rowIndex)
837
- }
838
-
839
- if (state.showButtonTop != 0 || props.isBatchEditing) return;
840
- const inlineBtnList = generateInlineBtnList(row, $rowIndex);
841
- const tileBtnList = getTileBtnList(row, $rowIndex);
842
- const foldBtnList = getFoldBtnList(row, $rowIndex);
843
- return [
844
- <span>
845
- {tileBtnList}
846
- {foldBtnList}
847
- {inlineBtnList}
848
- </span>
849
- ];
850
- }
851
-
852
- if (isLink(props, own, row) && !isScanMultiTable.value) {
853
- if (own.btnLinkSwitch) {
854
- let disabled = false;
855
- let curBtn = row.btnList?.find((v: any) => v.name == own.columnName);
856
- if (curBtn && "authorizedMark" in curBtn) {
857
- if (!curBtn.authorizedMark) {
858
- disabled = true;
859
- }
860
- }
861
- return getBtnLinkSwitch(row, own, disabled, $rowIndex);
862
- } else {
863
- return getField(row, own, $rowIndex, true);
864
- }
865
- } else {
866
- return getField(row, own, $rowIndex, false);
867
- }
868
- };
869
- // 表头渲染逻辑
870
- const formatterHeader = (item: any) => {
871
- let field = state.filterFields[item.columnName];
872
- return () => {
873
- return [
874
- <div class="filter-box">
875
- {toolTipTitle(item, "format")}
876
- <i
877
- class={[
878
- "vxe-filter--icon",
879
- "vxe-filter--btn",
880
- "vxe-icon--funnel",
881
- { active: field.visible || field.filterSort },
882
- { checked: field.CONVERT?.length },
883
- ]}
884
- onClick={event => showFilter(field, item.columnName, event, props, state)}
885
- />
886
- {field.visible ? (
887
- <teleport to={props.filterDomPortal}>
888
- <div
889
- class="big-table-filter-wrap"
890
- style={{
891
- left: field.left,
892
- right: field.right,
893
- top: field.top,
894
- width: state.filterWidth + state.distance + "px",
895
- }}
896
- >
897
- <div class="sort-list" style={{ display: field.isSort ? "block" : "none" }}>
898
- <div
899
- class={["sort-item", { active: field.filterSort === "asc" }]}
900
- onClick={() => handlefilterBoxClickSort("asc", field)}
901
- >
902
- <i class="sort-icon sort-icon-asc" />
903
- <span class="sort-text">升序 A to Z</span>
904
- </div>
905
- <div
906
- class={["sort-item", { active: field.filterSort === "desc" }]}
907
- onClick={() => handlefilterBoxClickSort("desc", field)}
908
- >
909
- <i class="sort-icon sort-icon-asc" />
910
- <span class="sort-text">降序 Z to A</span>
911
- </div>
912
- </div>
913
-
914
- <div class="filter-header">
915
- <i class="filter-header-icon vxe-filter--btn vxe-icon--funnel" />
916
- <span class="filter-header-text">筛选</span>
917
- </div>
918
-
919
- {field.setting.showSetting.length > 5 ? (
920
- <div class="checkbox-wrap checkbox-wrap--search">
921
- <div class="check-search-wrap">
922
- <NInputGroup>
923
- <NInput
924
- style={{ width: "50%" }}
925
- placeholder="字段搜索"
926
- class="check-seach-input"
927
- />
928
- <NButton
929
- type="primary"
930
- onClick={(val: any) => {
931
- handleFilterSeach(val, field);
932
- }}
933
- >
934
- 搜索
935
- </NButton>
936
- </NInputGroup>
937
- </div>
938
- </div>
939
- ) : (
940
- ""
941
- )}
942
- <div class="checkbox-box">
943
- <div
944
- class="checkbox-wrap js-checkbox-wrap"
945
- style={{ height: state.filterHeight + state.distance + "px" }}
946
- >
947
- {!field.searchFilterText ? (
948
- <div class="ant-checkbox-group">
949
- <NCheckbox
950
- indeterminate={field.indeterminate}
951
- checked={field.checkAll}
952
- onUpdateChecked={(val: any) => {
953
- handleFilterChangeAll(val, field);
954
- }}
955
- >
956
- 全选
957
- </NCheckbox>
958
- </div>
959
- ) : (
960
- ""
961
- )}
962
-
963
- {!field.searchFilterText ? (
964
- <NCheckboxGroup
965
- value={field.CONVERT}
966
- onUpdateValue={(val: any) => handleFilterChange(val, item.columnName, field)}
967
- >
968
- <NSpace item-style="display: flex;">
969
- {field.setting.showSetting.map((item: any) => {
970
- return <NCheckbox value={item.value} label={item.label} />;
971
- })}
972
- </NSpace>
973
- </NCheckboxGroup>
974
- ) : (
975
- <NCheckboxGroup
976
- value={field.searchFilterCONVERT}
977
- onUpdateValue={(val: any) =>
978
- handleFilterSearchChange(val, item.columnName, field)
979
- }
980
- >
981
- <NSpace item-style="display: flex;">
982
- {field.setting.showSetting
983
- .filter((item: any) => {
984
- if (!field.searchFilterText) return item;
985
- let reg = new RegExp(field.searchFilterText);
986
- return reg.test(item.label);
987
- })
988
- .map((item: any) => {
989
- return <NCheckbox value={item.value} label={item.label} />;
990
- })}
991
- </NSpace>
992
- </NCheckboxGroup>
993
- )}
994
- </div>
995
- </div>
996
-
997
- <div
998
- class="checkbox-btn-wrap"
999
- style={{ justifyContent: field.CONVERT.length ? "space-between" : "flex-end" }}
1000
- >
1001
- {field.CONVERT.length ? (
1002
- <div class="checkbox-btn-status">
1003
- <span>已选择{field.CONVERT.length}项</span>
1004
- <NButton
1005
- class="checkbox-btn checkbox-btn-clear"
1006
- text
1007
- onClick={() => handleFilterClearAll(field)}
1008
- >
1009
- 清空
1010
- </NButton>
1011
- </div>
1012
- ) : null}
1013
- <div>
1014
- <NButton class="checkbox-btn" onClick={() => handleCancelFilter()}>
1015
- 取消
1016
- </NButton>
1017
- <NButton class="checkbox-btn" type="primary" onClick={() => handleFilter(field)}>
1018
- 确定
1019
- </NButton>
1020
- </div>
1021
- </div>
1022
- <div
1023
- class="arrows-icon"
1024
- // onmousedown={(e: any) => {
1025
- // onmousedownFunc(e);
1026
- // }}
1027
- ></div>
1028
- </div>
1029
- </teleport>
1030
- ) : (
1031
- ""
1032
- )}
1033
- </div>,
1034
- ];
1035
- };
1036
- };
1037
- const handlefilterBoxClickSort = (sort: any, field: any) => {
1038
- if (field.filterSort === sort) {
1039
- sort = null;
1040
- } else {
1041
- xGrid.value.clearSort();
1042
- }
1043
-
1044
- field.filterSort = sort;
1045
- emit("sortChange", { prop: field.columnName, order: sort });
1046
- };
1047
- const handleFilterSeach = (val: any, field: any) => {
1048
- field.searchFilterText = val;
1049
-
1050
- if (val === "") {
1051
- field.checkAll = field.CONVERT.length === field.setting.showSetting.length;
1052
- field.indeterminate =
1053
- !!field.CONVERT.length && field.CONVERT.length !== field.setting.showSetting.length;
1054
- return;
1055
- }
1056
-
1057
- field.searchFilterCONVERT = field.setting.showSetting
1058
- .filter((item: any) => {
1059
- return field.searchFilterText === item.label && field.CONVERT.includes(item.value);
1060
- })
1061
- .map((item: any) => item.value);
1062
-
1063
- _beforeSearchConvert = field.searchFilterCONVERT;
1064
- };
1065
- const handleFilterChangeAll = (e: any, field: any) => {
1066
- reScrollFilterWrap();
1067
- let checked = e.target.checked;
1068
- field.indeterminate = false;
1069
- field.checkAll = checked;
1070
-
1071
- state.filterFields[field.columnName].CONVERT = checked
1072
- ? field.setting.showSetting.map((item: any) => {
1073
- return item.value;
1074
- })
1075
- : [];
1076
- };
1077
- const handleFilterChange = (value: any, name: any, field: any) => {
1078
- reScrollFilterWrap();
1079
- state.filterFields[name].CONVERT = value;
1080
-
1081
- field.checkAll = value.length === field.setting.showSetting.length;
1082
- field.indeterminate = !!value.length && value.length !== field.setting.showSetting.length;
1083
- };
1084
- const handleFilterSearchChange = (value: any, columnName: any, field: any) => {
1085
- reScrollFilterWrap();
1086
- /* filter-check-group value更新 触发 主check-group value同步更新 */
1087
- let isAdd = _beforeSearchConvert.length < value.length;
1088
- if (isAdd) {
1089
- let addItems = value.filter((item: any) => {
1090
- return !_beforeSearchConvert.includes(item);
1091
- });
1092
- state.filterFields[columnName].CONVERT.push(...addItems);
1093
- } else {
1094
- let removeItems = _beforeSearchConvert.filter((item: any) => {
1095
- return !value.includes(item);
1096
- });
1097
- state.filterFields[columnName].CONVERT = state.filterFields[columnName].CONVERT.filter(
1098
- (item: any) => {
1099
- return !removeItems.includes(item);
1100
- }
1101
- );
1102
- }
1103
-
1104
- field.searchFilterCONVERT = value;
1105
- _beforeSearchConvert = vexutils.clone(value, true);
1106
- };
1107
- const handleFilterClearAll = (field: any) => {
1108
- field.indeterminate = false;
1109
- field.checkAll = false;
1110
- state.filterFields[field.columnName].CONVERT = [];
1111
- if (field.searchFilterCONVERT) {
1112
- state.filterFields[field.columnName].searchFilterCONVERT = [];
1113
- }
1114
- handleFilter(field);
1115
- };
1116
- const handleCancelFilter = () => {
1117
- hideFilterWrap(state, props);
1118
- };
1119
- const handleFilter = (field: any) => {
1120
- let conObj = mergeConObjFn(state, props);
1121
- emit("onSave", conObj, false, [], [], { isBigTable: true });
1122
- field.visible = false;
1123
- };
1124
- const onmousedownFunc = (e: any) => {
1125
- state.startX = e.screenX;
1126
- maskInsert();
1127
- };
1128
- const maskInsert = () => {
1129
- let mask = state.mask || maskCreate();
1130
- document.body.appendChild(mask);
1131
- };
1132
- const maskCreate = () => {
1133
- if (state.mask) return state.mask;
1134
- const mask: any = document.createElement("div");
1135
- mask.style = "position:fixed;top:0;bottom:0;left:0;right:0;z-index:99999;cursor:nw-resize";
1136
- mask.addEventListener("mousemove", maskMove);
1137
- mask.addEventListener("mouseup", maskUp);
1138
- state.mask = mask;
1139
- return mask;
1140
- };
1141
- const maskMove = (e: any) => {
1142
- state.distance = e.screenX - state.startX;
1143
- };
1144
- const maskUp = (e: any) => {
1145
- state.filterHeight = state.filterHeight + state.distance;
1146
- state.filterWidth = state.filterWidth + state.distance;
1147
- state.distance = 0;
1148
- state.startX = 0;
1149
- const mask = state.mask;
1150
- if (!mask) return;
1151
- mask.parentNode && mask.parentNode.removeChild(mask);
1152
- mask.removeEventListener("mousemove", maskMove);
1153
- mask.removeEventListener("mouseup", maskUp);
1154
- state.mask = null;
1155
- };
1156
- const setGroupTreeExpand = () => {
1157
- let isExpand = state.isTree == 1 && state.isExpand == 1 && state.total < 1001;
1158
- if (state.isTree == 3 || isExpand) {
1159
- let table = xGrid.value;
1160
- nextTick(() => {
1161
- table.setAllTreeExpand(true);
1162
- });
1163
- }
1164
- };
1165
- const resetTableInlineEditStatus = () => {
1166
- if (!checkOperateCurrentTable()) return false;
1167
- handleClickCancelBtnByInline();
1168
- };
1169
- const toolTipTitle = (item: any, type?: any) => {
1170
- // let feildDescribe =
1171
- // (item.fieldSetting && this.$t(item.fieldSetting?.feildDescribeI18n)) ||
1172
- // item.fieldSetting?.feildDescribe ||
1173
- // "";
1174
- let name = item.formTitle || item.alias || item.title;
1175
- // let tooltipTitle = feildDescribe || item.alias;
1176
- let tooltipTitle = item.alias;
1177
- let isAlias = false;
1178
- if (props.tableOptions?.dataSourceType == "guage") {
1179
- tooltipTitle = item.alias || item.title;
1180
- }
1181
- if (name && tooltipTitle && name !== tooltipTitle) {
1182
- isAlias = !!tooltipTitle;
1183
- }
1184
-
1185
- if (type === "format") return <TextOverTooltip tooltipTitle={tooltipTitle} content={name} isAlias={isAlias} />
1186
- return () => {
1187
- return [
1188
- <TextOverTooltip tooltipTitle={tooltipTitle} content={name} isAlias={isAlias}>
1189
- {item.treeNode && state.isTree == 1 ? <NIcon component={state.isExpand && state.total < 1001 ? CaretDown : CaretForward} onClick={(e: any) => triggerExpand(e, state.isExpand)} /> : ''}
1190
- </TextOverTooltip>
1191
- ];
1192
- };
1193
- };
1194
- // 针对非异步加载的树
1195
- const triggerExpand = (e: any, isExpand: any) => {
1196
- e.preventDefault();
1197
- e.stopPropagation();
1198
- let table = xGrid.value;
1199
- if (state.total > 1000) {
1200
- (window as any).$message.warning("当前数据量超过1000条,无法全部展开!");
1201
- } else {
1202
- state.isExpand = !isExpand;
1203
- if (isExpand) {
1204
- table.clearTreeExpand();
1205
- } else {
1206
- emit("triggerSpinning", true);
1207
- setTimeout(() => {
1208
- table.setAllTreeExpand(true).then(() => {
1209
- emit("triggerSpinning", false);
1210
- });
1211
- }, 100);
1212
- }
1213
- }
1214
- };
1215
- const getOtherConfigInit = () => {
1216
- let tableOptions: any = attr?.tableOptions || props.tableOptions || {};
1217
- const config = tableOptions?.config || {};
1218
- return config || undefined;
1219
- };
1220
- //刷新列表
1221
- const refreshTable = () => {
1222
- state.hasRefresh = false;
1223
- emit("refreshTable");
1224
- // this.DELETE_TABLE_REFRESH_CACHE(this.tableParams.tableId);
1225
- };
1226
- /* 全选相关 */
1227
- const handleCheckAll = () => {
1228
- if (props.pageVO.total > props.maxCheckSize) {
1229
- let text = `当前列表共${props.pageVO.total}条数据,为了确保系统安全,只能单次操作${props.maxCheckSize}条,你可以通过高级筛选过滤再次尝试`;
1230
- (window as any).$message.warning(text);
1231
- // return false;
1232
- }
1233
- emit("selectionChangeAll");
1234
- };
1235
- const handleCancelAllCheck = () => {
1236
- emit("selectionChangeAllCancel");
1237
- };
1238
- const getRowClassName = () => {
1239
- return state.selectType === "checkbox"
1240
- ? ({ row }: { row: any }) => {
1241
- const k = singleCheckedKey.value;
1242
- return k && k === row[props.primaryKey] ? "single--checked" : "";
1243
- }
1244
- : () => {};
1245
- };
1246
- // 统计
1247
- const footerMethod = ({ columns, data }: { columns: any; data: any }) => {
1248
- // 原统计逻辑
1249
- if (!props.groupCountFields || !props.groupCountFields.length) {
1250
- return [
1251
- columns.map((column: any, index: number) => {
1252
- if (index === 0) {
1253
- // return that.$root.$t('1.1.8.2.5');
1254
- return null;
1255
- // return demo();
1256
- }
1257
- return null;
1258
- // return demo();
1259
- }),
1260
- ];
1261
- }
1262
- // 分组统计
1263
- let groupText = getFooterGroup(columns, data, props);
1264
- let groupColumns = columns.map((column: any, index: number) => {
1265
- if (index === 0) {
1266
- // return that.$root.$t('1.1.8.2.5');
1267
- // return demo();
1268
- return null;
1269
- } else if (index === 1) {
1270
- return groupText;
1271
- }
1272
- return null;
1273
- // return demo();
1274
- });
1275
- emit("setGroupText", groupText);
1276
- state.groupText = groupText;
1277
- return [groupColumns];
1278
- };
1279
- // 懒加载树子节点
1280
- const loadChildrenMethod = ({ row }: { row: any }) => {
1281
- // vxe-table v2.x 未根据 checkMethod 禁用逻辑 直接根据父级决定子级checked状态
1282
- // 所以先设置 父级 checked false 再 恢复原状 顺便选中子级
1283
- const fixCheckedStatus = (children: any) => {
1284
- const needFix =
1285
- state.selectType == "checkbox" &&
1286
- row.checked &&
1287
- children.findIndex((item: any) => !checkMethod({ row: item })) >= 0;
1288
- if (needFix) {
1289
- needFix && (row.checked = false);
1290
- setTimeout(() => {
1291
- xGrid.value?.setCheckboxRow(row, true);
1292
- }, 0);
1293
- }
1294
- };
1295
- if (state.isTree == 2) {
1296
- const { tableId, page, pageSize, autograph, isTreeOrList } = props.tableParams;
1297
- const params = {
1298
- levelLazyLoadPrimaryKeyValue: row[props.primaryKey],
1299
- tableId,
1300
- page,
1301
- pageSize,
1302
- autograph,
1303
- isTreeOrList,
1304
- };
1305
-
1306
- return getAsyncTableData(params).then(({ data }: any) => {
1307
- if (data.result == "SUCCESS") {
1308
- let cloneRows = JSON.parse(JSON.stringify(data.map.rows));
1309
- let { fieldList, btnList, showButtonTop } = props.columnConfig;
1310
- let rowNodes = formatData({
1311
- tableList: data.map.rows,
1312
- fieldList,
1313
- btnList,
1314
- oldtableData: cloneRows,
1315
- showButtonTop,
1316
- });
1317
- rowNodes = setChecklist(rowNodes);
1318
- emit("refreshOldTableData", cloneRows);
1319
- fixCheckedStatus(rowNodes);
1320
- return rowNodes;
1321
- }
1322
- });
1323
- } else {
1324
- fixCheckedStatus(row.childrenList);
1325
- return Promise.resolve(row.childrenList);
1326
- }
1327
- };
1328
- // 懒加载请求子集
1329
- const getAsyncTableData = (params: any) => {
1330
- return Promise.resolve();
1331
- // return this.axios.post('/tableReader/getTableData', this.$qs.stringify(params));
1332
- };
1333
- const setChecklist = (list: any) => {
1334
- return list.map((i: any) => {
1335
- i["checked"] = i.checked || false;
1336
- if (state.isTree == 2) {
1337
- const treeNodeKey = state.levelLazyLoadSetting.childCountKey;
1338
- const { isTreeOrList = "" } = props.tableParams;
1339
- if (treeNodeKey && Number(i[treeNodeKey]) > 0) {
1340
- // isTreeOrList != 'LIST' && this.$set(i, 'hasChildren', true);
1341
- isTreeOrList != "LIST" && (i["hasChildren"] = true);
1342
- }
1343
- }
1344
- if (i.childrenList && i.childrenList.length) {
1345
- i.childrenList = setChecklist(i.childrenList);
1346
- }
1347
- // 处理富文本字段,转为字符串,判断是否为富文本,中转标志_temp+id,/<[^>]+>/g.test(i[item].replace(/<span (.*?)>(.*?)<\/span>$/g, ""))处理过大文本会卡住,replace的问题,直接判断有没有p元素就行
1348
- Object.keys(i).map(item => {
1349
- if (
1350
- i[item] &&
1351
- typeof i[item] == "string" &&
1352
- i[item].indexOf("<p") !== -1 &&
1353
- item.indexOf("_temp_" + i.id) === -1
1354
- ) {
1355
- i[item + "_temp_" + i.id] = i[item] || "";
1356
- i[item] = htmlToText(i[item]);
1357
- }
1358
- });
1359
- return {
1360
- ...i,
1361
- };
1362
- });
1363
- };
1364
- // 分组列表,合并分组标题单元格
1365
- const colspanMethod = ({ row, column, _rowIndex, _columnIndex }: any) => {
1366
- if (state.isTree != 3) {
1367
- return {
1368
- rowspan: 1,
1369
- colspan: 1,
1370
- };
1371
- }
1372
-
1373
- let xTree = xGrid.value;
1374
- let fristKeyIndex = xTree.getTableColumn().tableColumn.findIndex((column: any) => {
1375
- return !!column.property;
1376
- });
1377
- let colspan = xTree.getTableColumn().tableColumn.length - fristKeyIndex;
1378
- if (row.childrenList && row.childrenList.length && xTree) {
1379
- if (column.treeNode) {
1380
- return {
1381
- rowspan: 1,
1382
- colspan: colspan,
1383
- };
1384
- } else if (!column.property) {
1385
- return {
1386
- rowspan: 1,
1387
- colspan: 1,
1388
- };
1389
- } else {
1390
- return {
1391
- rowspan: 0,
1392
- colspan: 0,
1393
- };
1394
- }
1395
- }
1396
- };
1397
- // 表尾合并
1398
- const footerRowspanMethod = (obj: any) => {
1399
- // 不是分组统计 不需要合并col
1400
- if (!props.groupCountFields || !props.groupCountFields.length) return { rowspan: 1, colspan: 1 };
1401
- let { $rowIndex, _columnIndex, column } = obj;
1402
- let len = state.columnLen || 99;
1403
- let { isBatchSelect } = props.columnConfig;
1404
- if ($rowIndex === 0) {
1405
- // 有 checkbox radio
1406
- if (isBatchSelect == 1) {
1407
- if (_columnIndex === 0) {
1408
- return { rowspan: 1, colspan: 2 };
1409
- } else if (_columnIndex === 1) {
1410
- return { rowspan: 1, colspan: 0 };
1411
- } else if (_columnIndex === 2) {
1412
- return { rowspan: 1, colspan: len };
1413
- }
1414
- return { rowspan: 1, colspan: 0 };
1415
- }
1416
- if (_columnIndex === 0) {
1417
- return { rowspan: 1, colspan: 1 };
1418
- } else if (_columnIndex === 1) {
1419
- return { rowspan: 1, colspan: len };
1420
- }
1421
- return { rowspan: 1, colspan: 0 };
1422
- }
1423
- };
1424
- // 行双击
1425
- const rowdblclick = ({ row, column }: any) => {
1426
- if (isScanMultiTable.value || !!props.isInlineOperating) return false;
1427
- if (vexutils.has(row, GROUP_TITLE_KEY)) return false;
1428
- emit("setNestTableClick", props.isNestTable);
1429
- emit("rowdblclick", row, column, true, true);
1430
- };
1431
- const pubCheckChange = (rows: any[] = []) => {
1432
- state.treeTableLength = rows.filter(item => {
1433
- let isGroupRow = vexutils.has(item, GROUP_TITLE_KEY);
1434
- return !isGroupRow;
1435
- }).length;
1436
- state.visibleTreeCheck = rows.length > 1;
1437
- emit('selectionChange', rows);
1438
- }
1439
- const updateAddCheckedRows = (rows: any, isTree: boolean = false) => {
1440
- let obj = {
1441
- isUpdate: true,
1442
- updateRows: rows,
1443
- isTree
1444
- };
1445
- if (isTree) {
1446
- Object.assign(obj, {
1447
- isTree,
1448
- isCheckedChange: true,
1449
- checkedRows: state.checkedRows
1450
- });
1451
- }
1452
- emit('selectionChangeLocal', obj);
1453
- }
1454
- const removeCheckedRows = (rows: any, isCheckedChange?: any) => {
1455
- removeCheckedDisabledRows(state);
1456
- let checkedRows = state.checkedRows;
1457
- let needRemoveIndexs = [];
1458
-
1459
- for (let i = 0; i < rows.length; i++) {
1460
- let row = rows[i];
1461
- let removeIndex = currentCheckedKeys.value.findIndex((item: any) => {
1462
- return item === row[props.primaryKey];
1463
- });
1464
-
1465
- removeIndex >= 0 && needRemoveIndexs.push(removeIndex);
1466
- }
1467
-
1468
- needRemoveIndexs.sort((a, b) => b - a); // 从后往前删除
1469
-
1470
- emit('selectionChangeLocal', {
1471
- isAdd: false,
1472
- isCheckedChange,
1473
- needRemoveIndexs,
1474
- newCheckedRows: [], // 防止报错
1475
- checkedRows
1476
- });
1477
- }
1478
- const setCheckedMehod = (setChecked: any, row: any) => {
1479
- if (setChecked) {
1480
- updateAddCheckedRows(row);
1481
- return;
1482
- }
1483
- // 跨页时 清空之前
1484
- if (props.pageVO.pageIndex != state.lastPageIndex) {
1485
- updateAddCheckedRows(row);
1486
- return;
1487
- }
1488
- if (currentCheckedKeys.value.includes(row[props.primaryKey])) {
1489
- removeCheckedRows([row]);
1490
- return;
1491
- }
1492
- updateAddCheckedRows(row);
1493
- }
1494
- //行点击
1495
- const handlerClickRow = (data: any) => {
1496
- // console.log("data.", data);
1497
- if (isScanMultiTable.value || props.isInlineOperating) return false;
1498
- if (vexutils.has(data?.row, GROUP_TITLE_KEY)) return false;
1499
- if (state.isTriggerSelectionChange && state.isTree == 0) return false;
1500
- let table = xGrid.value;
1501
-
1502
- // 嵌套表与主表click切换时需要清除上次的选中
1503
- isAboutNestTable.value && emit('resetNestLastClickTable', table);
1504
-
1505
- let { row, $event = {}, $rowIndex } = data;
1506
- // 点击主表格展开行按钮 不需要触发选中行
1507
- let { className } = $event.target || {};
1508
- if (className && vexutils.isString(className) && className.includes('vxe-table--expand-btn')) return;
1509
-
1510
- // 记录上次点击table信息 用于清除
1511
- isAboutNestTable.value && emit('setNestLastClickTable', table, props.isNestTable, row[handleRowId.value], row);
1512
-
1513
- emit('setNestTableClick', false);
1514
-
1515
- // 子列表中点击行 需要特别处理行级按钮
1516
- if (props.isNestTable) {
1517
- table?.setAllCheckboxRow(false);
1518
- nestHandleClickRow(table, data);
1519
- return;
1520
- }
1521
-
1522
- let forbiddenBatchSelect = !checkMethod(data);
1523
- // 如果该行禁止批量多选,则选择/取消单行 并触发单击事件
1524
- if (state.selectType == 'checkbox' && forbiddenBatchSelect) {
1525
- table?.setAllCheckboxRow(false);
1526
- const value = getRowClassName()({ row }) == 'single--checked' ? [] : [row];
1527
- state.checkedRows = value;
1528
- pubCheckChange(value);
1529
- emit('handlerClickRow', row, $rowIndex);
1530
- return;
1531
- }
1532
- state.visibleCheckAllWrap = false;
1533
- state.visibleCheckAllWrapMore = false;
1534
-
1535
- let checked = false;
1536
- if (state.selectType == 'radio') {
1537
- checked = table.isCheckedByRadioRow(row);
1538
- } else {
1539
- checked = table.isCheckedByCheckboxRow(row);
1540
- }
1541
- // 如果是点击 radio 选中的,处理冲突。先执行 radioOnChange 再 handlerClickRow
1542
- if (state.isradioChange) {
1543
- checked = false;
1544
- state.isradioChange = false;
1545
- }
1546
- let checkedRow = table.getCheckboxRecords();
1547
- let rowLen = state.checkedRows.filter((item: any) => !vexutils.has(item, GROUP_TITLE_KEY)).length;
1548
- let newRow: any[] = [];
1549
- if (state.isTree != 0) {
1550
- // 点击树形表格的按钮 不需要触发选中行
1551
- let { className } = $event.target || {};
1552
- if (className && className.includes('vxe-tree--node-btn')) return;
1553
- // 树表格,点击行无需选中复选框
1554
- if (state.selectType === 'checkbox') {
1555
- let rowVal = {};
1556
- if (!state.isTriggerSelectionChange) {
1557
- table.setAllCheckboxRow(false);
1558
- state.checkedRows = [row];
1559
- pubCheckChange([row]);
1560
- rowVal = row;
1561
- } else {
1562
- if (checkedRow.length > 1) return false;
1563
- rowVal = checked || (checkedRow.length === 1 && !checked) ? checkedRow[0] : {};
1564
- state.checkedRows = [rowVal];
1565
- }
1566
- updateAddCheckedRows(rowVal, true);
1567
- // 需要选中行
1568
- emit('handlerClickRow', rowVal);
1569
- return;
1570
- }
1571
- let newTheUniqueKeyArr: any[] = [];
1572
- flattenRow(row, newRow, newTheUniqueKeyArr, handleRowId.value);
1573
- let res = intersectRow(checkedRow, newTheUniqueKeyArr, handleRowId.value);
1574
- if (!res) {
1575
- rowLen = 1;
1576
- } else {
1577
- rowLen = checkedRow.filter((item: any) => !vexutils.has(item, GROUP_TITLE_KEY)).length;
1578
- }
1579
- }
1580
- table.setAllCheckboxRow(false);
1581
- // 全选后/数据大于一条 单击行只剩这一行 取消其他
1582
- // 只有一条选中 单击行 取消选中
1583
- let setChecked = checked;
1584
- if (rowLen > 1) {
1585
- state.selectType != 'radio' && table.setCheckboxRow([row], true);
1586
- state.isTree != 0 && state.selectType != 'radio' && pubCheckChange(newRow);
1587
- state.selectType != 'radio' && emit('handlerClickRow', row, $rowIndex);
1588
- } else {
1589
- setChecked = !setChecked;
1590
- if (!setChecked) {
1591
- table.clearCurrentRow();
1592
- state.selectType == 'radio' && table.clearRadioRow();
1593
- state.isTree != 0 && state.selectType != 'radio' && pubCheckChange([]);
1594
- } else {
1595
- state.selectType == 'radio' && table.setRadioRow(row);
1596
- state.isTree != 0 && state.selectType != 'radio' && pubCheckChange(newRow);
1597
- }
1598
- state.selectType != 'radio' && table.setCheckboxRow([row], setChecked);
1599
- }
1600
- if (state.isTree != 0) {
1601
- setChecked && emit('handlerClickRow', row, $rowIndex);
1602
- return;
1603
- }
1604
-
1605
- setCheckedMehod(setChecked, row);
1606
- if (setChecked || rowLen > 1 || !rowLen) {
1607
- state.checkedRows = [row];
1608
- }
1609
- if (!setChecked && rowLen === 1) {
1610
- state.checkedRows = [];
1611
- }
1612
- setCurrentCheckedLength();
1613
- state.lastPageIndex = props.pageVO.pageIndex;
1614
- setChecked && emit('handlerClickRow', row, $rowIndex);
1615
- };
1616
- const addCheckedRows = (rows: any) => {
1617
- removeCheckedDisabledRows(state);
1618
- let checkedRows = state.checkedRows;
1619
-
1620
- if (currentCheckedKeys.value.length + rows.length > props.maxCheckSize) {
1621
- (window as any).$message.warning(`为了保证系统安全,单次操作数据量限额为${props.maxCheckSize}条,你可以通过高级筛选过滤后再次尝试`);
1622
- return false;
1623
- }
1624
-
1625
- let newCheckedRows = rows.filter((row: any) => {
1626
- return !currentCheckedKeys.value.includes(row[props.primaryKey]);
1627
- });
1628
- checkedRows.push(...newCheckedRows);
1629
-
1630
- emit('selectionChangeLocal', {
1631
- isAdd: true,
1632
- isCheckedChange: true,
1633
- newCheckedRows,
1634
- checkedRows
1635
- });
1636
- }
1637
- const treeTableSelectionChange = (records: any) => {
1638
- if (state.isTree == 0) {
1639
- return false;
1640
- }
1641
-
1642
- pubCheckChange(records);
1643
- return true;
1644
- }
1645
- const selectionChange = ({ checked, row, records }: any) => {
1646
- // HACK: 防止点击多选框时,触发cell-click(行选中)事件
1647
- // $event.stopPropagation、$event.preventDefault,点击多选框列的空白处触发多选事件,无法阻止事件冒泡触发cell-click事件
1648
- let table = xGrid.value;
1649
- table.clearCurrentRow();
1650
- state.isTriggerSelectionChange = true;
1651
- setTimeout(() => {
1652
- state.isTriggerSelectionChange = false;
1653
- }, 0);
1654
-
1655
- if (treeTableSelectionChange(records)) return;
1656
-
1657
- if (checked) {
1658
- addCheckedRows([row]);
1659
- } else {
1660
- removeCheckedRows([row], true);
1661
- }
1662
-
1663
- setCurrentCheckedLength();
1664
- };
1665
- const selectionChangeAll = ({ checked, records }: any) => {
1666
- if (treeTableSelectionChange(records)) return;
1667
- if (checked) {
1668
- addCheckedRows(records);
1669
- } else {
1670
- removeCheckedRows(props.data);
1671
- }
1672
- setCurrentCheckedLength();
1673
- };
1674
- // 单选
1675
- const radioOnChange = (rowData: any = {}) => {
1676
- let { data, row, $rowIndex } = rowData;
1677
- emit("selectionChange", [{ ...row }]);
1678
- // this.isradioChange = true;
1679
- };
1680
- // 排序
1681
- const sortChange = ({ property, order }: any) => {
1682
- if (props.isInlineOperating) return false;
1683
- // 重置自定义表头排序
1684
- Object.values(state.filterFields).forEach((item: any) => (item.filterSort = null));
1685
-
1686
- emit("sortChange", { prop: property, order });
1687
- };
1688
- const showDrawer = () => {
1689
- const theads =
1690
- xGrid.value.$el.childNodes[0].childNodes[1].childNodes[0].getElementsByClassName("mycolumn");
1691
- emit("setNestTableClickSetting", props.isNestTable);
1692
- emit("showDrawer", theads);
1693
- };
1694
- let scrollEvent = (params: any) => {
1695
- emit('scroll', params)
1696
- }
1697
- const initScroll = () => {
1698
- const { throttle = false, throttleTime = 800, throttleOptions = {} } = props.columnConfig?.scrollConfig || {}
1699
- if (throttle) {
1700
- scrollEvent = vexutils.throttle(scrollEvent, throttleTime, throttleOptions)
1701
- }
1702
- }
1703
- initScroll()
1704
- const handlerScroll = (params: any) => {
1705
- if (params.isX) {
1706
- hideFilterWrap(state, props);
1707
- }
1708
- scrollEvent(params)
1709
- };
1710
- const handleCellMouseenter = ({ column, $event }: any) => {
1711
- // vxe-table@2.10+ 触发tooltip给vxe-cell父节点设置了title 导致显示有误
1712
- if (column.showOverflow === 'title') {
1713
- const target = $event?.currentTarget;
1714
- const cls = target?.className;
1715
- const bodyCls = ' vxe-body--column ';
1716
- if (cls && ` ${cls} `.includes(bodyCls) && target && target.hasAttribute('title')) {
1717
- const cellElem = target.querySelector('.vxe-cell');
1718
- if (cellElem && cellElem.hasAttribute('title')) {
1719
- cellElem.removeAttribute('title');
1720
- }
1721
- // 行编辑时 去掉tooltip title
1722
- if (props.isInlineOperating) {
1723
- if (target && target.hasAttribute('title')) {
1724
- target.removeAttribute('title');
1725
- }
1726
- }
1727
- }
1728
- }
1729
- };
1730
- const getFooterTooltipTitle = (column: any) => {
1731
- let t = "";
1732
-
1733
- if (vexutils.has(props.sumData, column.property)) {
1734
- t += `<p class="table-footer-tooltip-label-wrap">
1735
- <span class="table-footer-tooltip-label">求和:</span>
1736
- ${vexutils.round(Number(props.sumData[column.property]), 4)}
1737
- </p>`;
1738
- }
1739
- if (vexutils.has(props.avgData, column.property)) {
1740
- t += `<p class="table-footer-tooltip-label-wrap">
1741
- <span class="table-footer-tooltip-label">平均值:</span>
1742
- ${vexutils.round(Number(props.avgData[column.property]), 4)}</p>`;
1743
- }
1744
-
1745
- return t;
1746
- };
1747
- const getFooterTitle = (column: any) => {
1748
- if (vexutils.has(props.sumData, column.property)) {
1749
- return vexutils.round(Number(props.sumData[column.property]), 2);
1750
- }
1751
- if (vexutils.has(props.avgData, column.property)) {
1752
- return vexutils.round(Number(props.avgData[column.property]), 2);
1753
- }
1754
- // return demo();
1755
- };
1756
- const hanldeClickRefresh = () => {
1757
- emit("pubTableRefresh");
1758
- };
1759
- /**
1760
- * 删除选中scan数据
1761
- */
1762
- const confirmScanMulti = (params: any) => {
1763
- let{row, $rowIndex} = params || {}
1764
- if(!row) return;
1765
- emit("scanMultiRemove", $rowIndex, params)
1766
- let vxeTable = xGrid.value;
1767
- vxeTable.remove(row);
1768
- }
1769
- const scanMultiOperate = (params: any) => {
1770
- return <NPopconfirm
1771
- onPositiveClick={() =>confirmScanMulti(params)}>
1772
- {{
1773
- trigger: () => <SvgIcon class="scan-multi-delete" iconClass="shanchu" />,
1774
- default: () => '是否确认删除?'
1775
- }}
1776
- </NPopconfirm>
1777
- };
1778
- /**
1779
- * 判断是否渲染EditForm
1780
- * @param {*} row
1781
- * @param {*} column
1782
- * @returns
1783
- */
1784
- const showEditForm = (row: any, column: any, $rowIndex: any) => {
1785
- if (!props.isMatchComponent || props.isNestTable || isScanMultiTable.value) return false;
1786
- if (props.isBatchEditing || props.isInlineEditing || props.isInlineAdding) {
1787
- let matchObj = state.editColumnMap[column.property];
1788
- if (!matchObj || !matchObj.matchItem || !matchObj.fieldItem) return false;
1789
- // 批量编辑 未选择全部行编辑
1790
- if (props.isBatchEditing && !props.isEditAllRow) {
1791
- let matchIndex = state.checkedRows.findIndex(
1792
- (v: any) => v[props.primaryKey] == row[props.primaryKey]
1793
- );
1794
- if (matchIndex < 0) return false;
1795
- }
1796
- if (props.isInlineEditing || props.isInlineAdding) {
1797
- if ($rowIndex !== 0) return false;
1798
- }
1799
- return matchObj.matchItem;
1800
- }
1801
- return false;
1802
- };
1803
- /**
1804
- * 初始化props
1805
- * @param {*} unionItem
1806
- * @param {*} row
1807
- * @param {*} column
1808
- * @param {*} $rowIndex
1809
- * @returns
1810
- */
1811
- const initBatchDynamicProps = (unionItem: any, row: any, column: any, $rowIndex: any) => {
1812
- let id = row[props.primaryKey];
1813
- let dynamicPropsCache = props.batchDynamicPropsCache[id];
1814
- if (dynamicPropsCache && dynamicPropsCache[unionItem.tableField]) {
1815
- return dynamicPropsCache[unionItem.tableField];
1816
- }
1817
- let matchObj = state.editColumnMap[column.property];
1818
- let { fieldItem = {} } = matchObj || {};
1819
- let defaultCombinationForm = {};
1820
- if (!props.isInlineAdding) {
1821
- let originalRow = props.pageIndexOldtableData.find(
1822
- (item: any) => item[props.primaryKey] == row[props.primaryKey]
1823
- );
1824
- defaultCombinationForm = setDefaultFormData(column.property, fieldItem, originalRow);
1825
- }
1826
- let tempFieldItem = JSON.parse(JSON.stringify(fieldItem));
1827
- let defaultForm = {
1828
- fieldList: [tempFieldItem],
1829
- defaultCombinationForm,
1830
- };
1831
- let dynamicProps = {
1832
- props: {
1833
- formPrimaryKey: id,
1834
- defaultForm,
1835
- banRequest: true,
1836
- propsFormBtn: true,
1837
- propsDelSetting: true,
1838
- parentConfig: {
1839
- is_edit: "1",
1840
- },
1841
- configuration: configuration.value,
1842
- isPure: true,
1843
- isOpenShortcut: false,
1844
- cacheUniqueKey: state.cacheUniqueKey,
1845
- styleSetting: {},
1846
- },
1847
- on: {
1848
- handleSubmit: handleSubmitEditForm,
1849
- banSubmit: banSubmit,
1850
- },
1851
- };
1852
- emit("setBatchDynamicPropsCache", {
1853
- primaryKey: row[props.primaryKey],
1854
- tableField: unionItem.tableField,
1855
- dynamicProps,
1856
- });
1857
- return dynamicProps;
1858
- };
1859
- /**
1860
- * 单个form提交成功数据
1861
- * @param {*} obj formData
1862
- */
1863
- const handleSubmitEditForm = (obj: any = {}) => {
1864
- // 单行编辑
1865
- if (props.isInlineEditing || props.isInlineAdding) {
1866
- emit("submitEditFormSuccess", obj);
1867
- return;
1868
- }
1869
-
1870
- // 批量编辑
1871
- if (props.isBatchEditing) {
1872
- emit("submitEditFormSuccessBatch", obj);
1873
- return;
1874
- }
1875
- };
1876
- /**
1877
- * 单个form提交失败
1878
- * @param {*} obj
1879
- */
1880
- const banSubmit = (obj: any) => {
1881
- // 单行编辑
1882
- if (props.isInlineEditing || props.isInlineAdding) {
1883
- emit("submitEditFormError");
1884
- return;
1885
- }
1886
- // 批量编辑
1887
- if (props.isBatchEditing) {
1888
- emit("submitEditFormErrorBatch", obj);
1889
- return;
1890
- }
1891
- };
1892
- /**
1893
- * 避免每次点击都查询
1894
- * 初始化查一次 行编辑 表单search用
1895
- */
1896
- // 避免每次点击都查询
1897
- const handleFormTheUniqueKey = async () => {
1898
- emit("initInlineEditFormConfig", {
1899
- listFormUnionSetting: props.listFormUnionSetting,
1900
- inlineEditFormConfig: props.inlineEditFormConfig,
1901
- });
1902
- let hasEditRow = props.btnList?.find((item: any) => {
1903
- let trigger_type = item.settingObj && item.settingObj[0]?.trigger_type;
1904
- if (item.isShow == 1 && trigger_type == "EDIT_ROW") return true;
1905
- return false;
1906
- });
1907
- if (!hasEditRow) return;
1908
- // await this.handleFieldTheUniqueKey();
1909
- };
1910
- const handlePreView = (data: any, i: any, e: any) => {
1911
- e.preventDefault();
1912
- e.stopPropagation();
1913
- if (!data) data = xb_big;
1914
- emit("handlePreView", data, i);
1915
- };
1916
- /**
1917
- * tsx渲染表格
1918
- */
1919
- // 图片jsx:当图片类型为头像时,显示的是圆形
1920
- const getPicture = (row: any, item: any, type: any) => {
1921
- return [
1922
- <div class={["img-wrap", type === "HEADPORTRAIT" ? "img-circle" : ""]}>
1923
- {handleImgArr(row[item.columnName], type, imgs2imgArr).map((v: any, i: any) => (
1924
- <img
1925
- key={i}
1926
- src={handleImgSrc(v, props.sysImageSize, "LIST_FIELD_SMALL")}
1927
- style={modalDetailImage(props.sysImageSize, "LIST_FIELD_SMALL", "36px")}
1928
- onClick={(e: any) => handlePreView(row[item.columnName], i, e)}
1929
- />
1930
- ))}
1931
- </div>,
1932
- ];
1933
- };
1934
- // 字段颜色jsx
1935
- const getColor = (row: any, item: any) => {
1936
- let color = row[item.columnName];
1937
- // color = row.color;
1938
- if (color?.includes("-")) {
1939
- let colorName = color.split("-")[1];
1940
- color = vexutils.oldColorMap(colorName);
1941
- }
1942
- return [
1943
- <div class="color-wrap" style="height: 100%; padding: 4px;">
1944
- <div style={{ background: color, height: "100%" }} />
1945
- </div>,
1946
- ];
1947
- };
1948
- // 日期显示格式化
1949
- const getDate = (row: any, item: any) => {
1950
- let obj: any = row[item.columnName] || "";
1951
- if (!vexutils.isEmpty(obj)) {
1952
- if (vexutils.isObject(obj) && "tooltip" in obj) {
1953
- return [
1954
- <n-tooltip>
1955
- {{
1956
- trigger: () => <span>{(obj as any).value}</span>
1957
- }}
1958
- <span innerHTML={(obj as any).tooltip} />
1959
- </n-tooltip>
1960
- ];
1961
- }
1962
- }
1963
- return [<span innerHTML={obj}></span>];
1964
- };
1965
- // 百分数格式化
1966
- const getPercentage = (row: any, item: any) => {
1967
- let value = row[item.columnName];
1968
- if (!value && value !== 0) return;
1969
- let percentValue = value;
1970
-
1971
- let SPANTAG_REGEXP = /<\/?span.*?>/g;
1972
- if (SPANTAG_REGEXP.test(value)) {
1973
- let d = document.createElement("span");
1974
- d.innerHTML = value;
1975
- value = d.textContent;
1976
- percentValue = value;
1977
- }
1978
-
1979
- if (value && vexutils.isString(value) && value.includes("%")) {
1980
- percentValue = Number(value.replace("%", ""));
1981
- }
1982
- let strokeColor = "#52c41a";
1983
- if (percentValue < 15) {
1984
- strokeColor = "#ff5500";
1985
- } else if (percentValue < 50) {
1986
- strokeColor = "#ff8b01";
1987
- } else if (percentValue < 90) {
1988
- strokeColor = "#1890ff";
1989
- }
1990
- if (percentValue > 100) {
1991
- percentValue = 100;
1992
- } else if (percentValue < 0) {
1993
- percentValue = 0;
1994
- }
1995
- return [
1996
- <div class="percent-wrap">
1997
- <span class="percent-value">{percentValue}%</span>
1998
- <NProgress percentage={percentValue} showIndicator={false} color={strokeColor} />
1999
- </div>,
2000
- ];
2001
- };
2002
- const getvideoList = (row: any, item: any) => {
2003
- let res = row[item.columnName];
2004
- if (Array.isArray(res)) {
2005
- res = JSON.stringify(res);
2006
- }
2007
- /** string */
2008
- return null;
2009
- // return [<video-list columnName={item.columnName} stlist={res} />];
2010
- };
2011
- const getOrCode = (row: any, item: any, type: any) => {
2012
- let src = qr;
2013
- return [
2014
- <span class="bigTable-qr-span" onClick={(e: any) => qrCodeEvent(e, row, item)}>
2015
- <img class="bigTable-qr-img" src={src} />
2016
- <span>
2017
- <SvgIcon iconClass="fangda" />
2018
- </span>
2019
- </span>,
2020
- ];
2021
- };
2022
- const qrCodeEvent = (e: any, row: any, item: any) => {
2023
- e.preventDefault();
2024
- e.stopPropagation();
2025
- let data = handleQrCodeContent(row, item);
2026
- emit("qrCodeEvent", data);
2027
- };
2028
- // 行内编辑对应生成的(保存、取消)按钮
2029
- const generateInlineBtnList = (row: any, index: any) => {
2030
- if (props.isNestTable) return;
2031
- /*
2032
- 操作列,存在行内编辑的情况
2033
- 前端插入【保存、取消】按钮
2034
- */
2035
- let inlineEditBtnList = [];
2036
- inlineEditBtnList.push(...getInlineEditBtn(row, "tileBtnList"));
2037
- inlineEditBtnList.push(...getInlineEditBtn(row, "foldBtnList"));
2038
- if (!inlineEditBtnList?.length) return;
2039
-
2040
- return [
2041
- <span>
2042
- <NButton
2043
- style={{ display: row.__isInlineEditing ? "inline-block" : "none" }}
2044
- onClick={(e: any) => {
2045
- e.stopPropagation();
2046
- emit("SET_SAVE_ROW_STATUS", true);
2047
- // this.SET_SAVE_ROW_STATUS(true);
2048
- }}
2049
- class="btn-custom-class row-btn"
2050
- size="small"
2051
- text
2052
- >
2053
- {{default: () => '保存'}}
2054
- </NButton>
2055
- <NButton
2056
- style={{ display: row.__isInlineEditing ? "inline-block" : "none" }}
2057
- onClick={(e: any) => {
2058
- e.stopPropagation();
2059
- emit("SET_CANCEL_ROW_STATUS", true);
2060
- // this.SET_CANCEL_ROW_STATUS(true);
2061
- }}
2062
- class="btn-custom-class row-btn"
2063
- size="small"
2064
- text
2065
- >
2066
- {{default: () => '取消'}}
2067
- </NButton>
2068
- </span>,
2069
- ];
2070
- };
2071
- // 按钮 jsx
2072
- const getTileBtnList = (row: any, index: number) => {
2073
- return [
2074
- (row.tileBtnList?.length &&
2075
- row.tileBtnList.map((btn: any, j: any) => {
2076
- return (
2077
- btn.isShow == "1" &&
2078
- btn.type != "LINK" && (
2079
- <NButton
2080
- key={btn.sid}
2081
- onClick={(e: any) => clickBtn(row, btn, index, e, j)}
2082
- class="btn-custom-class row-btn"
2083
- style={{
2084
- ...getBtnStyle(btn),
2085
- ...{
2086
- display: !row.__isInlineEditing ? "inline-block" : "none",
2087
- },
2088
- }}
2089
- disabled={row.__isDisableInlineEdit}
2090
- // type={
2091
- // btn.showStyle == "none_bg" || btn.showStyle === "only_icon" ? "link" : "primary"
2092
- // }
2093
- ghost={btn.showStyle == "white_bg"}
2094
- size="small"
2095
- // title={handleName(btn)}
2096
- // {getBtnIcon(btn)}
2097
- // {btn.showStyle === "only_icon" ? "" : handleName(btn)}
2098
- >
2099
- {{default: () => [getBtnIcon(btn), btn.showStyle === 'only_icon' ? '' : handleName(btn)]}}
2100
- </NButton>
2101
- )
2102
- );
2103
- })) ||
2104
- "",
2105
- ];
2106
- };
2107
- // 按钮事件
2108
- const clickBtn = (row: any, btn: any, index: number, e: any, j: any) => {
2109
- e.preventDefault();
2110
- e.stopPropagation();
2111
- recordClickBtnInfo(row, index);
2112
- emit("setNestTableClick", props.isNestTable);
2113
- emit("setCurRowIndex", index);
2114
- emit("clickBtn", row, btn, row[handlePrimaryKey.value], index);
2115
- // this.handleTopBtnTracher(btn, j);
2116
- };
2117
- // 按钮 jsx
2118
- const getBtnIcon = (btn: any, mr = "8px") => {
2119
- let icon;
2120
- if (btn.icon) {
2121
- if (state.btnIcons[btn.icon]) {
2122
- icon = <a-icon type={state.btnIcons[btn.icon]} />;
2123
- } else {
2124
- icon = (
2125
- <NTooltip
2126
- >
2127
- {{
2128
- trigger: () => <SvgIcon iconClass={btn.icon} style={{ marginRight: mr}} />,
2129
- default: () => handleName(btn)
2130
- }}
2131
- </NTooltip>
2132
- );
2133
- }
2134
- } else if (btn.iconSetting) {
2135
- icon = (
2136
- <SvgIcon
2137
- iconClass={JSON.parse(btn.iconSetting).icon}
2138
- style={{
2139
- marginRight: mr,
2140
- }}
2141
- />
2142
- );
2143
- }
2144
- return [icon];
2145
- };
2146
- // 按钮 jsx
2147
- const getFoldBtnList = (row: any, index: number) => {
2148
- const getOptions = () => {
2149
- return row.foldBtnList.map((b: any, j: any) => {
2150
- return {
2151
- label: `${handleName(b)}${getBtnIcon(b, "0")}`,
2152
- key: b.sid,
2153
- props: {
2154
- onClick: (e: any) => {
2155
- clickBtn(row, b, index, e.domEvent, j)
2156
- }
2157
- }
2158
- }
2159
- })
2160
- }
2161
- return [
2162
- (row.foldBtnList?.length && (
2163
- <NDropdown
2164
- style={{ display: !row.__isInlineEditing ? "inline-block" : "none" }}
2165
- disabled={props.isInlineOperating}
2166
- options={getOptions()}
2167
- >
2168
- <NButton size="small" style="margin-left: 8px">
2169
- {{default: () => '更多 ...'}}
2170
- </NButton>
2171
- </NDropdown>
2172
- )) ||
2173
- "",
2174
- ];
2175
- };
2176
- const switchBtnOnChange = (e: any, r: any, i: any, index: any) => {
2177
- emit('switchBtnOnChange', e, r, i, index);
2178
- }
2179
- const getBtnLinkSwitch = (row: any, item: any, disabled: any, index: any) => {
2180
- // 树表不能用索引取值,注意:row 是解析后的值。
2181
- let cur = state.isTree !== 0 ? row : props.oldtableData[index];
2182
- let key = cur[item.columnName];
2183
- if (typeof key === "string") {
2184
- if (key && key.startsWith("###{")) {
2185
- let temp = JSON.parse(key.replace("###", ""));
2186
- key = temp.tooltip || temp.value; // temp.tooltip 日期的处理
2187
- }
2188
- }
2189
- return [<NSwitch value={key == item.btnLinkSwitchDefVal} disabled={disabled} onUpdateValue={(e: boolean) => switchBtnOnChange(e, row, item, index)} />];
2190
- };
2191
- // 字段显示 jsx
2192
- const getField = (row: any, item: any, index: any, isLink: boolean) => {
2193
- const html = formatFieldText(row, item, props.columnConfig.fieldList, props.fieldListOriginal);
2194
-
2195
- const content = [
2196
- isLink && html ? (
2197
- <a onClick={(e: any) => linkDetail(row, item, index, e)} innerHTML={html} />
2198
- ) : (
2199
- <span class="domPropsInnerHTML-span" innerHTML={html} />
2200
- ),
2201
- ];
2202
-
2203
- if (isCopy(item, row)) {
2204
- return [
2205
- <NPopover
2206
- placement="right"
2207
- trigger="hover"
2208
- arrowPointToCenter
2209
- >
2210
- {{
2211
- trigger: () => content
2212
- }}
2213
- <NIcon component={CopyOutline} onClick={(e: any) => hanldeCopyContent(e, row[item.columnName])} />
2214
- </NPopover>,
2215
- ];
2216
- } else {
2217
- return [content];
2218
- }
2219
- };
2220
- // 链接按钮详情
2221
- const linkDetail = (row: any, col: any, index: any, e: any) => {
2222
- if (props.isInlineOperating) return false;
2223
- let vxeTable = xGrid.value;
2224
- e.preventDefault();
2225
- // e.stopPropagation();
2226
- // 方晶晶验收2.5.12需求, 要求link字段第一次可选中checkbox, 第二次点击不取消选中
2227
- let isCheckedByCheckboxRow = vxeTable.isCheckedByCheckboxRow(row);
2228
- if (isCheckedByCheckboxRow) {
2229
- e.stopPropagation();
2230
- }
2231
- vxeTable.setCurrentRow(row);
2232
- emit("setNestTableClick", props.isNestTable);
2233
- emit("setCurRowIndex", index);
2234
- emit("linkDetail", row, col, row[handlePrimaryKey.value], null, false, index);
2235
- };
2236
- const hanldeCopyContent = (e: any, value: any) => {
2237
- e.preventDefault();
2238
- e.stopPropagation();
2239
- emit("hanldeCopyContent", e, value);
2240
- };
2241
- // 获取checkbox已选行
2242
- const getCheckboxRecords = () => {
2243
- let res = [];
2244
- if (xGrid.value) {
2245
- res = xGrid.value.getCheckboxRecords();
2246
- }
2247
- return res;
2248
- }
2249
- const handleClickEditBtnByInline = async () => {
2250
- if (!checkListFormUnionSettingParamsList()) {
2251
- handleClickCancelBtnByInline();
2252
- return false;
2253
- }
2254
-
2255
- let vxeTable = xGrid.value;
2256
-
2257
- let { row, rowIndex } = getInlineOpreateRow();
2258
- recordClickBtnInfo(row, rowIndex);
2259
-
2260
- // HACK: 重置非当前表单的行内编辑状态(多列表场景)
2261
-
2262
- await (props as any).resetInlineEdit();
2263
- await vxeTable.loadData([row]);
2264
- emit('handleClickBtnByInline', {
2265
- type: 'EDIT',
2266
- listFormUnionSetting: props.listFormUnionSetting,
2267
- inlineEditFormConfig: props.inlineEditFormConfig,
2268
- inlineEditOriginalTableRow: props.oldtableData[rowIndex]
2269
- });
2270
- // vxeTable.setActiveRow(row);
2271
- setAllRowInlineStatus(true);
2272
- row['__isInlineEditing'] = true;
2273
-
2274
- setRowStatus(vxeTable.$el, 0, '66');
2275
- }
2276
- /* 多选相关 */
2277
- const setAllCheckedRows = (rows: any) => {
2278
- if (props.isNestTable) return;
2279
- if (rows && rows.length) {
2280
- const copy = vexutils.handleBigArrayCopy(rows);
2281
- state.checkedRows = Object.freeze(copy);
2282
-
2283
- let table = xGrid.value;
2284
- table.setAllCheckboxRow(true);
2285
- }
2286
- }
2287
- const setTalbeScrollTo = () => {
2288
- let table = xGrid.value;
2289
- if (!table) return;
2290
- table.scrollTo(table.getScroll().scrollLeft, 0);
2291
- }
2292
- const submitInlineForm = () => {
2293
- let error = props.inlineError;
2294
- if (error) {
2295
- (props as any).resetEditRowStatus();
2296
- emit('triggerSpinning', false);
2297
- return false;
2298
- }
2299
-
2300
- let { formId } = props.listFormUnionSetting;
2301
- let { id } = props.inlineOriginalTableRow;
2302
- if (!formId) {
2303
- console.log('缺少formId');
2304
- emit('triggerSpinning', false);
2305
- return;
2306
- }
2307
- if (state.isSaveForm) return false;
2308
- state.isSaveForm = true;
2309
-
2310
- let params = Object.assign({}, props.inlineFormData, {
2311
- formId,
2312
- id,
2313
- editMode: 'row'
2314
- });
2315
- params = JSON.parse(JSON.stringify(params));
2316
-
2317
- let noChangePrimaryKey = params[handleRowId.value] === addInlineEditPrimaryKey;
2318
- if (props.isInlineAdding && noChangePrimaryKey) {
2319
- delete params[handleRowId.value];
2320
- }
2321
-
2322
- (props as any).submitForm(params)
2323
- .then(async ({ data }: any) => {
2324
- emit('triggerSpinning', false);
2325
- if (data.result !== 'SUCCESS') {
2326
- state.isSaveForm = false;
2327
- (window as any).$message.error(data.resultMsg);
2328
- (props as any).resetEditRowStatus();
2329
- return false;
2330
- }
2331
-
2332
- await (props as any).resetInlineEdit();
2333
- resetOperationRowStatus();
2334
- emit('pubTableReload');
2335
- })
2336
- .finally(() => {
2337
- state.isSaveForm = false;
2338
- emit('triggerSpinning', false);
2339
- (props as any).resetEditRowStatus();
2340
- });
2341
- }
2342
- const handleClickAddBtnByInline = async () => {
2343
- if (!checkListFormUnionSettingParamsList()) {
2344
- handleClickCancelBtnByInline();
2345
- return false;
2346
- }
2347
- // 去掉更新后台时间
2348
- // let userInfo = await this.GetRealtimeSysParams();
2349
- // userInfo &&
2350
- // Object.assign(this.configuration, {
2351
- // userInfo
2352
- // });
2353
-
2354
- await (props as any).resetInlineEdit();
2355
- emit('handleClickBtnByInline', {
2356
- type: 'ADD',
2357
- listFormUnionSetting: props.listFormUnionSetting,
2358
- inlineEditFormConfig: props.inlineEditFormConfig
2359
- });
2360
-
2361
- addInlineEditPrimaryKey = Date.now();
2362
- let formData = {
2363
- [handleRowId.value]: addInlineEditPrimaryKey,
2364
- __isInsertRow: true
2365
- };
2366
- let { paramsList } = props.listFormUnionSetting;
2367
- paramsList.forEach((item: any) => {
2368
- formData[item.tableField] = undefined;
2369
- });
2370
-
2371
- let vxeTable = xGrid.value;
2372
- await vxeTable.insert(formData);
2373
- await vxeTable.loadData([formData]);
2374
- setAllRowInlineStatus(true);
2375
- setRowStatus(vxeTable.$el, 0, '66');
2376
- }
2377
- const handleClickSaveBtnByInline = () => {
2378
- if (props.spinning) return false;
2379
- emit('handleClickBtnByInline', { type: 'SAVE' });
2380
-
2381
- let formDom: any = document.querySelectorAll('.js-inlineEditForm');
2382
- let sliceLen = handleEditFormLength();
2383
- // HACK: vxeTable行内编辑时复制的DOM节点,无需触发提交
2384
- formDom = [...formDom].slice(0, sliceLen);
2385
- formDom.forEach((item: any) => {
2386
- item.__vue__.handleSubmitForm();
2387
- });
2388
- }
2389
- const removeInlineAddRow = () => {
2390
- if (!props.isInlineAdding) return false;
2391
-
2392
- const vxeTable = xGrid.value;
2393
- let { tableData } = vxeTable.getTableData();
2394
- vxeTable.remove(tableData[0]);
2395
- }
2396
-
2397
- /**
2398
- * wacth
2399
- */
2400
- watch(
2401
- () => props.columnConfig,
2402
- (config: any) => {
2403
- nextTick(() => {
2404
- if (!config || !Object.keys(config).length) return;
2405
- loadColumn(config);
2406
- });
2407
- },
2408
- { immediate: true }
2409
- );
2410
- watch(
2411
- () => props.data,
2412
- value => {
2413
- nextTick(() => {
2414
- loadData(value);
2415
- });
2416
- },
2417
- { immediate: true }
2418
- );
2419
- watch(
2420
- () => currentCheckedKeys,
2421
- val => {
2422
- setVisibleCheckAllWrap(state, props, currentCheckedKeys.value);
2423
- }
2424
- )
2425
- watch(
2426
- () => props.quickSearchConfig,
2427
- val => {
2428
- setFilterStatus(state, props);
2429
- },
2430
- { deep: true }
2431
- )
2432
- watch(
2433
- () => props.tableDataCache,
2434
- val => {
2435
- setAllCheckedRows(val);
2436
- },
2437
- { deep: true }
2438
- )
2439
- watch(
2440
- () => props.pageVO.pageSize,
2441
- val => {
2442
- if (props.isNestTable) return;
2443
- setVisibleCheckAllWrap(state, props, currentCheckedKeys.value);
2444
- resetTableInlineEditStatus();
2445
- }
2446
- )
2447
- watch(
2448
- () => props.pageVO.pageIndex,
2449
- val => {
2450
- if (props.isNestTable) return;
2451
- setTalbeScrollTo();
2452
- resetTableInlineEditStatus();
2453
- }
2454
- )
2455
- watch(
2456
- () => props.styleSetting.tableHeight,
2457
- val => {
2458
- if (props.isNestTable) return;
2459
- if (Object.keys(props.columnConfig).length > 0) {
2460
- loadColumn(props.columnConfig);
2461
- loadData(props.data);
2462
- setTalbeScrollTo();
2463
- }
2464
- }
2465
- )
2466
- watch(
2467
- () => props.sysImageSize,
2468
- val => {
2469
- const v = props.styleSetting?.tableHeight === 'table-simple' ? '26' : '22';
2470
- nextTick(() => {
2471
- handleTableImageSize(val, 'LIST_FIELD_SMALL', v + 'px');
2472
- });
2473
- },
2474
- { deep: true, immediate: true }
2475
- )
2476
- // 监听行内编辑表单,是否已校验并组装数据完毕
2477
- watch(
2478
- () => props.inlineEditFormSubmitDone,
2479
- val => {
2480
- if (!val || props.isNestTable) return;
2481
- if (state.isTree != 0 || !props.isMatchComponent) return false;
2482
- if (!checkOperateCurrentTable()) return false;
2483
- submitInlineForm()
2484
- }
2485
- )
2486
- // 监听行内编辑按钮的触发状态
2487
- watch(
2488
- () => props.isInlineEditing,
2489
- val => {
2490
- if (!val || props.isNestTable) return;
2491
- if (state.isTree != 0 || !props.isMatchComponent) return false;
2492
- if (!checkOperateCurrentTable()) return false;
2493
- submitInlineForm()
2494
- }
2495
- )
2496
- // 监听行内新增按钮的触发状态
2497
- watch(
2498
- () => props.isInlineAdding,
2499
- val => {
2500
- if (!val || props.isNestTable) return false;
2501
- if (state.isTree != 0 || !props.isMatchComponent) return false;
2502
- if (!checkOperateCurrentTable()) {
2503
- resetOperationRowStatus();
2504
- return false;
2505
- }
2506
-
2507
- hideSelectCloumns();
2508
- handleClickAddBtnByInline();
2509
- }
2510
- )
2511
- watch(
2512
- () => props.isInlineSave,
2513
- val => {
2514
- if (!val || props.isNestTable) return false;
2515
- if (state.isTree != 0 || !props.isMatchComponent) return false;
2516
- if (!checkOperateCurrentTable()) return false;
2517
- handleClickSaveBtnByInline();
2518
- }
2519
- )
2520
- watch(
2521
- () => props.isInlineCancel,
2522
- val => {
2523
- if (!val || props.isNestTable) return false;
2524
- if (state.isTree != 0 || !props.isMatchComponent) return false;
2525
- if (!checkOperateCurrentTable()) return false;
2526
-
2527
- removeInlineAddRow();
2528
- handleClickCancelBtnByInline();
2529
- }
2530
- )
2531
- // watch(
2532
- // () => route,
2533
- // val => {
2534
- // resetTableInlineEditStatus();
2535
- // }
2536
- // )
2537
- watch(
2538
- () => props.tableRefreshCache,
2539
- (val, oldVal) => {
2540
- if (props.isNestTable) return;
2541
- const { orgId } = props?.userInfo?.map?.sysParams || {};
2542
- // 增加判断老旧数据是否相同,判断orgId是否相等
2543
- if (val != oldVal && props.tableParams && val[props.tableParams.tableId] && orgId == val[props.tableParams.tableId]) {
2544
- state.hasRefresh = true;
2545
- }
2546
- },
2547
- { immediate: true, deep: true }
2548
- )
2549
- watch(
2550
- () => props.tableParams.tableId,
2551
- val => {
2552
- nextTick(() => {
2553
- if (val && props.tableRefreshCache[val]) {
2554
- state.hasRefresh = true;
2555
- }
2556
- });
2557
- }
2558
- )
2559
-
2560
- // defineExpose
2561
- const setCurrentRow = (row:any) => {
2562
- xGrid.value.setCurrentRow(row);
2563
- }
2564
- // loadColumnAndData
2565
- const loadColumnAndData = (data: any, config: any) => {
2566
- setTableConfig(config, state);
2567
- let columns = formatColumns(config);
2568
- columns = handleGroupColums(columns, props);
2569
- const list = setChecklist(data);
2570
- state.curAbleCheckedLen = list.filter((item: any) => checkMethod({ row: item })).length;
2571
-
2572
- if (!xGrid.value) return;
2573
-
2574
- Promise.all([xGrid.value.loadData(list), xGrid.value.reloadColumn(columns)]).then(() => {
2575
- console.log('列表加载完成');
2576
- setGroupTitleToFristColumnFieldData(list);
2577
- setGroupTreeExpand();
2578
- });
2579
- }
2580
- // 清除多选
2581
- const clearChecked = () => {
2582
- state.checkedRows = [];
2583
- xGrid.value.clearCheckboxReserve();
2584
- xGrid.value.clearCheckboxRow();
2585
- xGrid.value.clearRadioReserve();
2586
- xGrid.value.clearRadioRow();
2587
- state.visibleTreeCheck = false;
2588
- state.treeTableLength = 0;
2589
- }
2590
- defineExpose({
2591
- formatData,
2592
- xGrid
2593
- })
2594
-
2595
- </script>
2596
- <style lang="less" src="./assets/style/table-base.less"></style>
2597
- <style lang="less" src="./assets/style/table-global.less">
2598
- </style>