amis 1.3.5-beta.6 → 1.4.2-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 (352) hide show
  1. package/README.md +1 -1
  2. package/lib/Schema.d.ts +17 -0
  3. package/lib/Schema.js.map +1 -1
  4. package/lib/components/Alert.js +3 -1
  5. package/lib/components/Alert.js.map +2 -2
  6. package/lib/components/Badge.d.ts +16 -3
  7. package/lib/components/Badge.js +53 -4
  8. package/lib/components/Badge.js.map +2 -2
  9. package/lib/components/Button.d.ts +24 -22
  10. package/lib/components/Button.js +13 -7
  11. package/lib/components/Button.js.map +2 -2
  12. package/lib/components/Checkbox.d.ts +1 -1
  13. package/lib/components/Checkbox.js +1 -1
  14. package/lib/components/Checkbox.js.map +2 -2
  15. package/lib/components/Collapse.js +1 -1
  16. package/lib/components/Collapse.js.map +2 -2
  17. package/lib/components/DatePicker.js +1 -1
  18. package/lib/components/DatePicker.js.map +2 -2
  19. package/lib/components/DateRangePicker.js +1 -1
  20. package/lib/components/DateRangePicker.js.map +2 -2
  21. package/lib/components/Drawer.js +1 -1
  22. package/lib/components/Drawer.js.map +2 -2
  23. package/lib/components/InputBox.js +1 -1
  24. package/lib/components/InputBox.js.map +2 -2
  25. package/lib/components/Link.d.ts +91 -0
  26. package/lib/components/Link.js +44 -0
  27. package/lib/components/Link.js.map +13 -0
  28. package/lib/components/Modal.js +1 -1
  29. package/lib/components/Modal.js.map +2 -2
  30. package/lib/components/MonthRangePicker.js +1 -1
  31. package/lib/components/MonthRangePicker.js.map +2 -2
  32. package/lib/components/RichText.d.ts +6 -1
  33. package/lib/components/RichText.js +207 -8
  34. package/lib/components/RichText.js.map +2 -2
  35. package/lib/components/Select.d.ts +7 -0
  36. package/lib/components/Select.js +3 -0
  37. package/lib/components/Select.js.map +2 -2
  38. package/lib/components/SparkLine.d.ts +85 -84
  39. package/lib/components/SparkLine.js +2 -2
  40. package/lib/components/SparkLine.js.map +2 -2
  41. package/lib/components/Steps.d.ts +3 -3
  42. package/lib/components/Steps.js.map +1 -1
  43. package/lib/components/Toast.js +2 -2
  44. package/lib/components/Toast.js.map +2 -2
  45. package/lib/components/Tree.js +5 -3
  46. package/lib/components/Tree.js.map +2 -2
  47. package/lib/components/WithRemoteConfig.d.ts +8 -0
  48. package/lib/components/WithRemoteConfig.js +28 -2
  49. package/lib/components/WithRemoteConfig.js.map +2 -2
  50. package/lib/components/calendar/DaysView.js +2 -2
  51. package/lib/components/calendar/DaysView.js.map +2 -2
  52. package/lib/components/condition-builder/Field.js +0 -1
  53. package/lib/components/condition-builder/Field.js.map +2 -2
  54. package/lib/components/condition-builder/Value.js +2 -1
  55. package/lib/components/condition-builder/Value.js.map +2 -2
  56. package/lib/components/condition-builder/types.d.ts +5 -0
  57. package/lib/components/condition-builder/types.js.map +1 -1
  58. package/lib/components/icons.js +14 -0
  59. package/lib/components/icons.js.map +2 -2
  60. package/lib/factory.d.ts +5 -1
  61. package/lib/factory.js +9 -4
  62. package/lib/factory.js.map +2 -2
  63. package/lib/helper.css.map +1 -1
  64. package/lib/icons/clock.js +10 -0
  65. package/lib/icons/loading-outline.js +7 -0
  66. package/lib/icons/status-close.js +11 -0
  67. package/lib/icons/status-fail.js +11 -0
  68. package/lib/icons/status-info.js +10 -0
  69. package/lib/icons/status-success.js +11 -0
  70. package/lib/icons/status-warning.js +10 -0
  71. package/lib/index.js +1 -1
  72. package/lib/locale/de-DE.js +3 -0
  73. package/lib/locale/de-DE.js.map +2 -2
  74. package/lib/locale/en-US.js +4 -1
  75. package/lib/locale/en-US.js.map +2 -2
  76. package/lib/locale/zh-CN.js +5 -2
  77. package/lib/locale/zh-CN.js.map +2 -2
  78. package/lib/renderers/Action.d.ts +16 -1
  79. package/lib/renderers/Action.js +5 -5
  80. package/lib/renderers/Action.js.map +2 -2
  81. package/lib/renderers/CRUD.d.ts +2 -2
  82. package/lib/renderers/CRUD.js +32 -26
  83. package/lib/renderers/CRUD.js.map +2 -2
  84. package/lib/renderers/Collapse.d.ts +1 -1
  85. package/lib/renderers/Collapse.js +7 -3
  86. package/lib/renderers/Collapse.js.map +2 -2
  87. package/lib/renderers/Dialog.d.ts +0 -252
  88. package/lib/renderers/Dialog.js +1 -4
  89. package/lib/renderers/Dialog.js.map +2 -2
  90. package/lib/renderers/Drawer.js +0 -3
  91. package/lib/renderers/Drawer.js.map +2 -2
  92. package/lib/renderers/DropDownButton.d.ts +13 -1
  93. package/lib/renderers/DropDownButton.js +9 -5
  94. package/lib/renderers/DropDownButton.js.map +2 -2
  95. package/lib/renderers/Form/ButtonGroupSelect.js +3 -0
  96. package/lib/renderers/Form/ButtonGroupSelect.js.map +2 -2
  97. package/lib/renderers/Form/Checkbox.d.ts +5 -0
  98. package/lib/renderers/Form/Checkbox.js +4 -0
  99. package/lib/renderers/Form/Checkbox.js.map +2 -2
  100. package/lib/renderers/Form/Combo.js +2 -2
  101. package/lib/renderers/Form/Combo.js.map +2 -2
  102. package/lib/renderers/Form/DiffEditor.d.ts +0 -2
  103. package/lib/renderers/Form/Editor.d.ts +0 -2
  104. package/lib/renderers/Form/Editor.js +1 -1
  105. package/lib/renderers/Form/Editor.js.map +2 -2
  106. package/lib/renderers/Form/InputExcel.d.ts +5 -0
  107. package/lib/renderers/Form/InputExcel.js +24 -3
  108. package/lib/renderers/Form/InputExcel.js.map +2 -2
  109. package/lib/renderers/Form/InputFile.js +2 -2
  110. package/lib/renderers/Form/InputFile.js.map +2 -2
  111. package/lib/renderers/Form/InputImage.d.ts +8 -0
  112. package/lib/renderers/Form/InputImage.js +7 -4
  113. package/lib/renderers/Form/InputImage.js.map +2 -2
  114. package/lib/renderers/Form/InputTable.d.ts +23 -5
  115. package/lib/renderers/Form/InputTable.js +32 -3
  116. package/lib/renderers/Form/InputTable.js.map +2 -2
  117. package/lib/renderers/Form/Options.js +6 -3
  118. package/lib/renderers/Form/Options.js.map +2 -2
  119. package/lib/renderers/Form/Picker.js +2 -2
  120. package/lib/renderers/Form/Picker.js.map +2 -2
  121. package/lib/renderers/Form/wrapControl.js +2 -2
  122. package/lib/renderers/Form/wrapControl.js.map +2 -2
  123. package/lib/renderers/IFrame.js +2 -2
  124. package/lib/renderers/IFrame.js.map +2 -2
  125. package/lib/renderers/Image.d.ts +1 -0
  126. package/lib/renderers/Image.js +15 -1
  127. package/lib/renderers/Image.js.map +2 -2
  128. package/lib/renderers/Json.js +5 -1
  129. package/lib/renderers/Json.js.map +2 -2
  130. package/lib/renderers/Link.d.ts +16 -3
  131. package/lib/renderers/Link.js +16 -13
  132. package/lib/renderers/Link.js.map +2 -2
  133. package/lib/renderers/Log.d.ts +2 -2
  134. package/lib/renderers/Log.js +7 -1
  135. package/lib/renderers/Log.js.map +2 -2
  136. package/lib/renderers/Nav.d.ts +81 -25
  137. package/lib/renderers/Nav.js +272 -29
  138. package/lib/renderers/Nav.js.map +2 -2
  139. package/lib/renderers/Page.js +4 -1
  140. package/lib/renderers/Page.js.map +2 -2
  141. package/lib/renderers/Service.d.ts +10 -1
  142. package/lib/renderers/Service.js +85 -3
  143. package/lib/renderers/Service.js.map +2 -2
  144. package/lib/renderers/SparkLine.d.ts +4 -0
  145. package/lib/renderers/SparkLine.js.map +2 -2
  146. package/lib/renderers/Steps.d.ts +4 -4
  147. package/lib/renderers/Steps.js +5 -2
  148. package/lib/renderers/Steps.js.map +2 -2
  149. package/lib/renderers/Table/ColumnToggler.d.ts +113 -0
  150. package/lib/renderers/Table/ColumnToggler.js +216 -0
  151. package/lib/renderers/Table/ColumnToggler.js.map +13 -0
  152. package/lib/renderers/Table/ItemActionsWrapper.d.ts +11 -0
  153. package/lib/renderers/Table/ItemActionsWrapper.js +31 -0
  154. package/lib/renderers/Table/ItemActionsWrapper.js.map +13 -0
  155. package/lib/renderers/Table/TableBody.d.ts +5 -1
  156. package/lib/renderers/Table/TableBody.js +5 -1
  157. package/lib/renderers/Table/TableBody.js.map +2 -2
  158. package/lib/renderers/Table/TableCell.js +3 -1
  159. package/lib/renderers/Table/TableCell.js.map +2 -2
  160. package/lib/renderers/Table/TableContent.d.ts +1 -1
  161. package/lib/renderers/Table/TableContent.js +4 -0
  162. package/lib/renderers/Table/TableContent.js.map +2 -2
  163. package/lib/renderers/Table/index.d.ts +22 -4
  164. package/lib/renderers/Table/index.js +196 -81
  165. package/lib/renderers/Table/index.js.map +2 -2
  166. package/lib/store/app.d.ts +0 -1
  167. package/lib/store/combo.d.ts +0 -2
  168. package/lib/store/crud.d.ts +3 -3
  169. package/lib/store/crud.js +41 -36
  170. package/lib/store/crud.js.map +2 -2
  171. package/lib/store/form.d.ts +0 -1
  172. package/lib/store/modal.d.ts +1 -1
  173. package/lib/store/modal.js +4 -0
  174. package/lib/store/modal.js.map +2 -2
  175. package/lib/store/root.d.ts +0 -1
  176. package/lib/store/service.d.ts +0 -1
  177. package/lib/store/service.js +0 -13
  178. package/lib/store/service.js.map +2 -2
  179. package/lib/store/table.d.ts +258 -3
  180. package/lib/store/table.js +83 -7
  181. package/lib/store/table.js.map +2 -2
  182. package/lib/themes/ang-ie11.css +941 -98
  183. package/lib/themes/ang.css +941 -98
  184. package/lib/themes/ang.css.map +1 -1
  185. package/lib/themes/antd-ie11.css +941 -98
  186. package/lib/themes/antd.css +941 -98
  187. package/lib/themes/antd.css.map +1 -1
  188. package/lib/themes/cxd-ie11.css +1580 -411
  189. package/lib/themes/cxd.css +1580 -411
  190. package/lib/themes/cxd.css.map +1 -1
  191. package/lib/themes/dark-ie11.css +941 -98
  192. package/lib/themes/dark.css +941 -98
  193. package/lib/themes/dark.css.map +1 -1
  194. package/lib/themes/default.css +1580 -411
  195. package/lib/themes/default.css.map +1 -1
  196. package/lib/utils/api.js +16 -4
  197. package/lib/utils/api.js.map +2 -2
  198. package/lib/utils/attachmentAdpator.d.ts +7 -0
  199. package/lib/utils/attachmentAdpator.js +82 -0
  200. package/lib/utils/attachmentAdpator.js.map +13 -0
  201. package/lib/utils/handleAction.d.ts +7 -0
  202. package/lib/utils/handleAction.js +30 -0
  203. package/lib/utils/handleAction.js.map +13 -0
  204. package/lib/utils/helper.d.ts +1 -1
  205. package/lib/utils/helper.js +3 -3
  206. package/lib/utils/helper.js.map +2 -2
  207. package/lib/utils/tpl-builtin.d.ts +1 -1
  208. package/lib/utils/tpl-builtin.js +25 -15
  209. package/lib/utils/tpl-builtin.js.map +2 -2
  210. package/lib/utils/validations.js +62 -5
  211. package/lib/utils/validations.js.map +2 -2
  212. package/package.json +1 -2
  213. package/schema.json +633 -273
  214. package/scss/_mixins.scss +29 -0
  215. package/scss/_properties.scss +64 -13
  216. package/scss/_utilities.scss +4 -0
  217. package/scss/components/_badge.scss +67 -2
  218. package/scss/components/_button.scss +34 -3
  219. package/scss/components/_collapse.scss +26 -8
  220. package/scss/components/_column-toggler.scss +234 -0
  221. package/scss/components/_dropdown.scss +2 -1
  222. package/scss/components/_image-gallery.scss +1 -1
  223. package/scss/components/_images.scss +2 -1
  224. package/scss/components/_link.scss +6 -0
  225. package/scss/components/_markdown.scss +266 -0
  226. package/scss/components/_nav.scss +236 -154
  227. package/scss/components/_page.scss +5 -4
  228. package/scss/components/_progress.scss +2 -0
  229. package/scss/components/_spinner.scss +6 -2
  230. package/scss/components/_steps.scss +1 -1
  231. package/scss/components/_table.scss +25 -1
  232. package/scss/components/form/_color.scss +1 -0
  233. package/scss/components/form/_date-range.scss +2 -0
  234. package/scss/components/form/_date.scss +2 -0
  235. package/scss/components/form/_fieldset.scss +1 -2
  236. package/scss/components/form/_file.scss +5 -4
  237. package/scss/components/form/_group.scss +4 -0
  238. package/scss/components/form/_image.scss +7 -2
  239. package/scss/components/form/_list.scss +1 -0
  240. package/scss/components/form/_location.scss +1 -1
  241. package/scss/components/form/_text.scss +13 -0
  242. package/scss/components/form/_textarea.scss +10 -0
  243. package/scss/components/form/_transfer.scss +2 -0
  244. package/scss/themes/_common.scss +3 -0
  245. package/scss/themes/_cxd-colors.scss +56 -0
  246. package/scss/themes/_cxd-variables.scss +217 -92
  247. package/scss/themes/cxd.scss +366 -0
  248. package/sdk/ang-ie11.css +1192 -176
  249. package/sdk/ang.css +1175 -118
  250. package/sdk/antd-ie11.css +1177 -163
  251. package/sdk/antd.css +1175 -118
  252. package/sdk/charts.js +13 -13
  253. package/sdk/color-picker.js +67 -67
  254. package/sdk/cropperjs.js +2 -2
  255. package/sdk/cxd-ie11.css +2538 -1222
  256. package/sdk/cxd.css +1825 -401
  257. package/sdk/dark-ie11.css +1192 -176
  258. package/sdk/dark.css +1175 -118
  259. package/sdk/exceljs.js +1 -1
  260. package/sdk/helper.css.map +1 -1
  261. package/sdk/ie11-patch.css +1 -0
  262. package/sdk/locale/de-DE.js +3 -0
  263. package/sdk/markdown.js +69 -69
  264. package/sdk/papaparse.js +1 -1
  265. package/sdk/renderers/Form/CityDB.js +1 -1
  266. package/sdk/rest.js +22 -24
  267. package/sdk/rich-text.js +62 -64
  268. package/sdk/sdk-ie11.css +2538 -1222
  269. package/sdk/sdk.css +1825 -401
  270. package/sdk/sdk.js +1139 -1113
  271. package/sdk/thirds/hls.js/hls.js +1 -1
  272. package/sdk/thirds/mpegts.js/mpegts.js +1 -1
  273. package/sdk/tinymce.js +57 -57
  274. package/src/Schema.ts +18 -0
  275. package/src/components/Alert.tsx +3 -1
  276. package/src/components/Badge.tsx +124 -21
  277. package/src/components/Button.tsx +23 -7
  278. package/src/components/Checkbox.tsx +5 -2
  279. package/src/components/Collapse.tsx +14 -9
  280. package/src/components/DatePicker.tsx +1 -1
  281. package/src/components/DateRangePicker.tsx +23 -11
  282. package/src/components/Drawer.tsx +3 -2
  283. package/src/components/InputBox.tsx +1 -1
  284. package/src/components/Link.tsx +94 -0
  285. package/src/components/Modal.tsx +3 -2
  286. package/src/components/MonthRangePicker.tsx +10 -2
  287. package/src/components/RichText.tsx +244 -3
  288. package/src/components/Select.tsx +4 -0
  289. package/src/components/SparkLine.tsx +4 -1
  290. package/src/components/Steps.tsx +3 -3
  291. package/src/components/Toast.tsx +5 -5
  292. package/src/components/Tree.tsx +6 -8
  293. package/src/components/WithRemoteConfig.tsx +37 -2
  294. package/src/components/calendar/DaysView.tsx +2 -2
  295. package/src/components/condition-builder/Field.tsx +1 -2
  296. package/src/components/condition-builder/Value.tsx +3 -0
  297. package/src/components/condition-builder/types.ts +6 -0
  298. package/src/components/icons.tsx +15 -0
  299. package/src/factory.tsx +13 -3
  300. package/src/icons/clock.svg +1 -0
  301. package/src/icons/loading-outline.svg +4 -0
  302. package/src/icons/status-close.svg +10 -0
  303. package/src/icons/status-fail.svg +10 -0
  304. package/src/icons/status-info.svg +8 -0
  305. package/src/icons/status-success.svg +10 -0
  306. package/src/icons/status-warning.svg +8 -0
  307. package/src/locale/de-DE.ts +3 -0
  308. package/src/locale/en-US.ts +4 -1
  309. package/src/locale/zh-CN.ts +5 -2
  310. package/src/renderers/Action.tsx +71 -13
  311. package/src/renderers/CRUD.tsx +44 -59
  312. package/src/renderers/Collapse.tsx +6 -2
  313. package/src/renderers/Dialog.tsx +1 -5
  314. package/src/renderers/Drawer.tsx +0 -4
  315. package/src/renderers/DropDownButton.tsx +34 -12
  316. package/src/renderers/Form/ButtonGroupSelect.tsx +3 -0
  317. package/src/renderers/Form/Checkbox.tsx +8 -0
  318. package/src/renderers/Form/Combo.tsx +2 -3
  319. package/src/renderers/Form/Editor.tsx +19 -20
  320. package/src/renderers/Form/InputExcel.tsx +28 -3
  321. package/src/renderers/Form/InputFile.tsx +2 -1
  322. package/src/renderers/Form/InputImage.tsx +28 -10
  323. package/src/renderers/Form/InputTable.tsx +88 -9
  324. package/src/renderers/Form/Options.tsx +16 -5
  325. package/src/renderers/Form/Picker.tsx +3 -2
  326. package/src/renderers/Form/wrapControl.tsx +2 -2
  327. package/src/renderers/IFrame.tsx +2 -1
  328. package/src/renderers/Image.tsx +10 -0
  329. package/src/renderers/Json.tsx +10 -1
  330. package/src/renderers/Link.tsx +36 -11
  331. package/src/renderers/Log.tsx +16 -3
  332. package/src/renderers/Nav.tsx +340 -56
  333. package/src/renderers/Page.tsx +3 -1
  334. package/src/renderers/Service.tsx +101 -3
  335. package/src/renderers/SparkLine.tsx +5 -0
  336. package/src/renderers/Steps.tsx +12 -9
  337. package/src/renderers/Table/ColumnToggler.tsx +544 -0
  338. package/src/renderers/Table/ItemActionsWrapper.tsx +44 -0
  339. package/src/renderers/Table/TableBody.tsx +3 -2
  340. package/src/renderers/Table/TableCell.tsx +16 -1
  341. package/src/renderers/Table/TableContent.tsx +3 -1
  342. package/src/renderers/Table/index.tsx +240 -60
  343. package/src/store/crud.ts +34 -38
  344. package/src/store/modal.ts +4 -0
  345. package/src/store/service.ts +0 -19
  346. package/src/store/table.ts +103 -4
  347. package/src/utils/api.ts +24 -4
  348. package/src/utils/attachmentAdpator.ts +90 -0
  349. package/src/utils/handleAction.ts +41 -0
  350. package/src/utils/helper.ts +4 -3
  351. package/src/utils/tpl-builtin.ts +48 -17
  352. package/src/utils/validations.ts +80 -12
@@ -5,6 +5,7 @@ import {SchemaNode, Action, Schema} from '../../types';
5
5
  import forEach from 'lodash/forEach';
6
6
  import {filter} from '../../utils/tpl';
7
7
  import DropDownButton from '../DropDownButton';
8
+ import './ColumnToggler';
8
9
  import Checkbox from '../../components/Checkbox';
9
10
  import Button from '../../components/Button';
10
11
  import {TableStore, ITableStore, IColumn, IRow} from '../../store/table';
@@ -16,7 +17,9 @@ import {
16
17
  autobind,
17
18
  isArrayChildrenModified,
18
19
  getVariable,
19
- removeHTMLTag
20
+ removeHTMLTag,
21
+ eachTree,
22
+ isObject
20
23
  } from '../../utils/helper';
21
24
  import {
22
25
  isPureVariable,
@@ -35,6 +38,7 @@ import {HeadCellSearchDropDown} from './HeadCellSearchDropdown';
35
38
  import {TableContent} from './TableContent';
36
39
  import {
37
40
  BaseSchema,
41
+ SchemaApi,
38
42
  SchemaClassName,
39
43
  SchemaObject,
40
44
  SchemaTokenizeableString,
@@ -49,6 +53,9 @@ import {TableBody} from './TableBody';
49
53
  import {TplSchema} from '../Tpl';
50
54
  import {MappingSchema} from '../Mapping';
51
55
  import {isAlive, getSnapshot} from 'mobx-state-tree';
56
+ import ItemActionsWrapper from './ItemActionsWrapper';
57
+ import ColumnToggler from './ColumnToggler';
58
+ import {BadgeSchema} from '../../components/Badge';
52
59
 
53
60
  /**
54
61
  * 表格列,不指定类型时默认为文本类型。
@@ -97,7 +104,7 @@ export type TableColumnObject = {
97
104
  /**
98
105
  * 是否可快速搜索
99
106
  */
100
- searchable?: boolean;
107
+ searchable?: boolean | SchemaObject;
101
108
 
102
109
  /**
103
110
  * 配置是否默认展示
@@ -277,6 +284,16 @@ export interface TableSchema extends BaseSchema {
277
284
  * 行样式表表达式
278
285
  */
279
286
  rowClassNameExpr?: string;
287
+
288
+ /**
289
+ * 行角标
290
+ */
291
+ itemBadge?: BadgeSchema;
292
+
293
+ /**
294
+ * 开启查询区域,会根据列元素的searchable属性值,自动生成查询条件表单
295
+ */
296
+ autoGenerateFilter?: boolean;
280
297
  }
281
298
 
282
299
  export interface TableProps extends RendererProps {
@@ -344,8 +361,15 @@ export interface TableProps extends RendererProps {
344
361
  popOverContainer?: any;
345
362
  canAccessSuperData?: boolean;
346
363
  reUseRow?: boolean;
364
+ itemBadge?: BadgeSchema;
347
365
  }
348
366
 
367
+ type ExportExcelToolbar = SchemaNode & {
368
+ api?: SchemaApi;
369
+ columns?: string[];
370
+ filename?: string;
371
+ };
372
+
349
373
  /**
350
374
  * 将 url 转成绝对地址
351
375
  */
@@ -397,7 +421,8 @@ export default class Table extends React.Component<TableProps, object> {
397
421
  'popOverContainer',
398
422
  'headerToolbarClassName',
399
423
  'toolbarClassName',
400
- 'footerToolbarClassName'
424
+ 'footerToolbarClassName',
425
+ 'itemBadge'
401
426
  ];
402
427
  static defaultProps: Partial<TableProps> = {
403
428
  className: '',
@@ -470,6 +495,8 @@ export default class Table extends React.Component<TableProps, object> {
470
495
  this.handleMouseMove = this.handleMouseMove.bind(this);
471
496
  this.handleMouseLeave = this.handleMouseLeave.bind(this);
472
497
  this.subFormRef = this.subFormRef.bind(this);
498
+ this.handleColumnToggle = this.handleColumnToggle.bind(this);
499
+ this.renderAutoFilterForm = this.renderAutoFilterForm.bind(this);
473
500
 
474
501
  const {
475
502
  store,
@@ -648,8 +675,12 @@ export default class Table extends React.Component<TableProps, object> {
648
675
  ) {
649
676
  Table.syncRows(store, props, prevProps) && this.syncSelected();
650
677
  } else if (isArrayChildrenModified(prevProps.selected!, props.selected!)) {
678
+ const prevSelectedRows = store.selectedRows
679
+ .map(item => item.id)
680
+ .join(',');
651
681
  store.updateSelected(props.selected || [], props.valueField);
652
- this.syncSelected();
682
+ const selectedRows = store.selectedRows.map(item => item.id).join(',');
683
+ prevSelectedRows !== selectedRows && this.syncSelected();
653
684
  }
654
685
 
655
686
  this.updateTableInfoLazy();
@@ -682,8 +713,14 @@ export default class Table extends React.Component<TableProps, object> {
682
713
  onAction(e, action, ctx);
683
714
  }
684
715
 
685
- handleCheck(item: IRow) {
686
- item.toggle();
716
+ handleCheck(item: IRow, value: boolean, shift?: boolean) {
717
+ const {store} = this.props;
718
+ if (shift) {
719
+ store.toggleShift(item);
720
+ } else {
721
+ item.toggle();
722
+ }
723
+
687
724
  this.syncSelected();
688
725
  }
689
726
 
@@ -1098,7 +1135,7 @@ export default class Table extends React.Component<TableProps, object> {
1098
1135
 
1099
1136
  handleMouseMove(e: React.MouseEvent<any>) {
1100
1137
  const tr: HTMLElement = (e.target as HTMLElement).closest(
1101
- 'tr[data-index]'
1138
+ 'tr[data-id]'
1102
1139
  ) as HTMLElement;
1103
1140
 
1104
1141
  if (!tr) {
@@ -1116,20 +1153,20 @@ export default class Table extends React.Component<TableProps, object> {
1116
1153
  return;
1117
1154
  }
1118
1155
 
1119
- const index = parseInt(tr.getAttribute('data-index') as string, 10);
1156
+ const id = tr.getAttribute('data-id') as string;
1157
+ const row = store.hoverRow;
1120
1158
 
1121
- if (store.hoverIndex === index) {
1159
+ if (row?.id === id) {
1122
1160
  return;
1123
1161
  }
1124
- store.rows.forEach((item, key) => item.setIsHover(index === key));
1162
+ eachTree<IRow>(store.rows, (item: IRow) => item.setIsHover(item.id === id));
1125
1163
  }
1126
1164
 
1127
1165
  handleMouseLeave() {
1128
1166
  const store = this.props.store;
1167
+ const row = store.hoverRow;
1129
1168
 
1130
- if (~store.hoverIndex) {
1131
- store.rows[store.hoverIndex].setIsHover(false);
1132
- }
1169
+ row?.setIsHover(false);
1133
1170
  }
1134
1171
 
1135
1172
  draggingTr: HTMLTableRowElement;
@@ -1333,6 +1370,111 @@ export default class Table extends React.Component<TableProps, object> {
1333
1370
  document.removeEventListener('mouseup', this.handleColResizeMouseUp);
1334
1371
  }
1335
1372
 
1373
+ handleColumnToggle(columns: Array<IColumn>) {
1374
+ const {store} = this.props;
1375
+
1376
+ store.update({columns});
1377
+ }
1378
+
1379
+ renderAutoFilterForm(): React.ReactNode {
1380
+ const {
1381
+ render,
1382
+ store,
1383
+ onSearchableFromReset,
1384
+ onSearchableFromSubmit,
1385
+ onSearchableFromInit,
1386
+ classnames: cx,
1387
+ translate: __
1388
+ } = this.props;
1389
+ const searchableColumns = store.searchableColumns;
1390
+ const activedSearchableColumns = store.activedSearchableColumns;
1391
+
1392
+ if (!searchableColumns.length) {
1393
+ return null;
1394
+ }
1395
+
1396
+ const groupedSearchableColumns: Array<Record<string, any>> = [
1397
+ {body: [], md: 4},
1398
+ {body: [], md: 4},
1399
+ {body: [], md: 4}
1400
+ ];
1401
+
1402
+ activedSearchableColumns.forEach((column, index) => {
1403
+ groupedSearchableColumns[index % 3].body.push({
1404
+ ...column.searchable,
1405
+ name: column.searchable?.name ?? column.name,
1406
+ label: column.searchable?.label ?? column.label,
1407
+ mode: 'horizontal'
1408
+ });
1409
+ });
1410
+
1411
+ return render(
1412
+ 'searchable-form',
1413
+ {
1414
+ type: 'form',
1415
+ api: null,
1416
+ title: '',
1417
+ mode: 'normal',
1418
+ submitText: __('search'),
1419
+ body: [
1420
+ {
1421
+ type: 'grid',
1422
+ columns: groupedSearchableColumns
1423
+ }
1424
+ ],
1425
+ actions: [
1426
+ {
1427
+ type: 'dropdown-button',
1428
+ label: __('Table.searchFields'),
1429
+ className: cx('Table-searchableForm-dropdown', 'mr-2'),
1430
+ level: 'link',
1431
+ trigger: 'click',
1432
+ size: 'sm',
1433
+ align: 'right',
1434
+ buttons: searchableColumns.map(column => {
1435
+ return {
1436
+ type: 'checkbox',
1437
+ className: cx('Table-searchableForm-checkbox'),
1438
+ name: `__search_${column.searchable?.name ?? column.name}`,
1439
+ option: column.searchable?.label ?? column.label,
1440
+ value: column.enableSearch,
1441
+ badge: {
1442
+ offset: [-10, 5],
1443
+ visibleOn: `${
1444
+ column.toggable && !column.toggled && column.enableSearch
1445
+ }`
1446
+ },
1447
+ onChange: (value: boolean) => {
1448
+ column.setEnableSearch(value);
1449
+ }
1450
+ };
1451
+ })
1452
+ },
1453
+ {
1454
+ type: 'submit',
1455
+ label: __('search'),
1456
+ level: 'primary',
1457
+ className: 'w-18'
1458
+ },
1459
+ {
1460
+ type: 'reset',
1461
+ label: __('reset'),
1462
+ className: 'w-18'
1463
+ }
1464
+ ]
1465
+ },
1466
+ {
1467
+ key: 'searchable-form',
1468
+ panelClassName: cx('Table-searchableForm'),
1469
+ actionsClassName: cx('Table-searchableForm-footer'),
1470
+ onReset: onSearchableFromReset,
1471
+ onSubmit: onSearchableFromSubmit,
1472
+ onInit: onSearchableFromInit,
1473
+ formStore: undefined
1474
+ }
1475
+ );
1476
+ }
1477
+
1336
1478
  renderHeading() {
1337
1479
  let {
1338
1480
  title,
@@ -1422,7 +1564,8 @@ export default class Table extends React.Component<TableProps, object> {
1422
1564
  render,
1423
1565
  classPrefix: ns,
1424
1566
  resizable,
1425
- classnames: cx
1567
+ classnames: cx,
1568
+ autoGenerateFilter
1426
1569
  } = this.props;
1427
1570
 
1428
1571
  if (column.type === '__checkme') {
@@ -1469,7 +1612,7 @@ export default class Table extends React.Component<TableProps, object> {
1469
1612
 
1470
1613
  let affix = null;
1471
1614
 
1472
- if (column.searchable && column.name) {
1615
+ if (column.searchable && column.name && !autoGenerateFilter) {
1473
1616
  affix = (
1474
1617
  <HeadCellSearchDropDown
1475
1618
  {...this.props}
@@ -1622,7 +1765,8 @@ export default class Table extends React.Component<TableProps, object> {
1622
1765
  classnames: cx,
1623
1766
  checkOnItemClick,
1624
1767
  popOverContainer,
1625
- canAccessSuperData
1768
+ canAccessSuperData,
1769
+ itemBadge
1626
1770
  } = this.props;
1627
1771
 
1628
1772
  if (column.name && item.rowSpans[column.name] === 0) {
@@ -1710,7 +1854,13 @@ export default class Table extends React.Component<TableProps, object> {
1710
1854
  quickEditFormRef: this.subFormRef,
1711
1855
  prefix,
1712
1856
  onImageEnlarge: this.handleImageEnlarge,
1713
- canAccessSuperData
1857
+ canAccessSuperData,
1858
+ row: item,
1859
+ itemBadge,
1860
+ showBadge:
1861
+ !props.isHead &&
1862
+ itemBadge &&
1863
+ store.firstToggledColumnIndex === props.colIndex
1714
1864
  };
1715
1865
  delete subProps.label;
1716
1866
 
@@ -1945,23 +2095,29 @@ export default class Table extends React.Component<TableProps, object> {
1945
2095
  }
1946
2096
 
1947
2097
  return (
1948
- <DropDownButton
2098
+ <ColumnToggler
1949
2099
  {...rest}
1950
- tooltip={__('Table.columnsVisibility')}
2100
+ {...(isObject(config) ? config : {})}
2101
+ tooltip={config?.tooltip || __('Table.columnsVisibility')}
1951
2102
  tooltipContainer={
1952
2103
  env && env.getModalContainer ? env.getModalContainer : undefined
1953
2104
  }
1954
- align={config ? config.align : 'left'}
2105
+ align={config?.align ?? 'left'}
1955
2106
  isActived={store.hasColumnHidden()}
1956
2107
  classnames={cx}
1957
2108
  classPrefix={ns}
1958
2109
  key="columns-toggable"
1959
- size="sm"
1960
- label={<Icon icon="columns" className="icon m-r-none" />}
2110
+ size={config?.size || 'sm'}
2111
+ label={
2112
+ config?.label || <Icon icon="columns" className="icon m-r-none" />
2113
+ }
2114
+ draggable={config?.draggable}
2115
+ columns={store.columnsData}
2116
+ onColumnToggle={this.handleColumnToggle}
1961
2117
  >
1962
2118
  {store.toggableColumns.map(column => (
1963
2119
  <li
1964
- className={cx('DropDown-menuItem')}
2120
+ className={cx('ColumnToggler-menuItem')}
1965
2121
  key={column.index}
1966
2122
  onClick={column.toggleToggle}
1967
2123
  >
@@ -1970,7 +2126,7 @@ export default class Table extends React.Component<TableProps, object> {
1970
2126
  </Checkbox>
1971
2127
  </li>
1972
2128
  ))}
1973
- </DropDownButton>
2129
+ </ColumnToggler>
1974
2130
  );
1975
2131
  }
1976
2132
 
@@ -2004,7 +2160,7 @@ export default class Table extends React.Component<TableProps, object> {
2004
2160
  );
2005
2161
  }
2006
2162
 
2007
- renderExportExcel(toolbar: SchemaNode) {
2163
+ renderExportExcel(toolbar: ExportExcelToolbar) {
2008
2164
  const {
2009
2165
  store,
2010
2166
  env,
@@ -2028,8 +2184,8 @@ export default class Table extends React.Component<TableProps, object> {
2028
2184
  let tmpStore;
2029
2185
  let filename = 'data';
2030
2186
  // 支持配置 api 远程获取
2031
- if (typeof toolbar === 'object' && (toolbar as Schema).api) {
2032
- const res = await env.fetcher((toolbar as Schema).api, data);
2187
+ if (typeof toolbar === 'object' && toolbar.api) {
2188
+ const res = await env.fetcher(toolbar.api, data);
2033
2189
  if (!res.data) {
2034
2190
  env.notify('warning', __('placeholder.noData'));
2035
2191
  return;
@@ -2047,8 +2203,8 @@ export default class Table extends React.Component<TableProps, object> {
2047
2203
  rows = store.rows;
2048
2204
  }
2049
2205
 
2050
- if (typeof toolbar === 'object' && (toolbar as Schema).filename) {
2051
- filename = filter((toolbar as Schema).filename, data, '| raw');
2206
+ if (typeof toolbar === 'object' && toolbar.filename) {
2207
+ filename = filter(toolbar.filename, data, '| raw');
2052
2208
  }
2053
2209
 
2054
2210
  if (rows.length === 0) {
@@ -2062,7 +2218,17 @@ export default class Table extends React.Component<TableProps, object> {
2062
2218
  });
2063
2219
  worksheet.views = [{state: 'frozen', xSplit: 0, ySplit: 1}];
2064
2220
 
2065
- const firstRowLabels = columns.map(column => {
2221
+ const filteredColumns = toolbar.columns
2222
+ ? columns.filter(column => {
2223
+ const filterColumnsNames = toolbar.columns!;
2224
+ if (filterColumnsNames.indexOf(column.name) !== -1) {
2225
+ return true;
2226
+ }
2227
+ return false;
2228
+ })
2229
+ : columns;
2230
+
2231
+ const firstRowLabels = filteredColumns.map(column => {
2066
2232
  return column.label;
2067
2233
  });
2068
2234
  const firstRow = worksheet.getRow(1);
@@ -2077,14 +2243,15 @@ export default class Table extends React.Component<TableProps, object> {
2077
2243
  column: firstRowLabels.length
2078
2244
  }
2079
2245
  };
2246
+ // 用于 mapping source 的情况
2247
+ const remoteMappingCache: any = {};
2080
2248
  // 数据从第二行开始
2081
2249
  let rowIndex = 1;
2082
2250
  for (const row of rows) {
2083
2251
  rowIndex += 1;
2084
2252
  const sheetRow = worksheet.getRow(rowIndex);
2085
2253
  let columIndex = 0;
2086
- const cols = columns as any[]; // 为啥 ts 4.4 得这么做?
2087
- for (const column of cols) {
2254
+ for (const column of filteredColumns) {
2088
2255
  columIndex += 1;
2089
2256
  const name = column.name!;
2090
2257
  const value = getVariable(row.data, name);
@@ -2170,7 +2337,30 @@ export default class Table extends React.Component<TableProps, object> {
2170
2337
  };
2171
2338
  } else if (type === 'mapping') {
2172
2339
  // 拷贝自 Mapping.tsx
2173
- const map = (column as MappingSchema).map;
2340
+ let map = (column as MappingSchema).map;
2341
+ const source = (column as MappingSchema).source;
2342
+ if (source) {
2343
+ let sourceValue = source;
2344
+ if (isPureVariable(source)) {
2345
+ sourceValue = resolveVariableAndFilter(
2346
+ source as string,
2347
+ data,
2348
+ '| raw'
2349
+ );
2350
+ }
2351
+
2352
+ const mapKey = JSON.stringify(source);
2353
+ if (mapKey in remoteMappingCache) {
2354
+ map = remoteMappingCache[mapKey];
2355
+ } else {
2356
+ const res = await env.fetcher(sourceValue, data);
2357
+ if (res.data) {
2358
+ remoteMappingCache[mapKey] = res.data;
2359
+ map = res.data;
2360
+ }
2361
+ }
2362
+ }
2363
+
2174
2364
  if (
2175
2365
  typeof value !== 'undefined' &&
2176
2366
  map &&
@@ -2183,9 +2373,10 @@ export default class Table extends React.Component<TableProps, object> {
2183
2373
  : value === false && map['0']
2184
2374
  ? map['0']
2185
2375
  : map['*']); // 兼容平台旧用法:即 value 为 true 时映射 1 ,为 false 时映射 0
2186
- sheetRow.getCell(columIndex).value = viewValue;
2376
+ sheetRow.getCell(columIndex).value =
2377
+ removeHTMLTag(viewValue);
2187
2378
  } else {
2188
- sheetRow.getCell(columIndex).value = value;
2379
+ sheetRow.getCell(columIndex).value = removeHTMLTag(value);
2189
2380
  }
2190
2381
  } else {
2191
2382
  if ((column as TplSchema).tpl) {
@@ -2402,27 +2593,9 @@ export default class Table extends React.Component<TableProps, object> {
2402
2593
  if (!finalActions.length) {
2403
2594
  return null;
2404
2595
  }
2405
- const rowIndex = store.hoverIndex;
2406
- const heights = this.heights;
2407
- let height = 40;
2408
- let top = 0;
2409
-
2410
- if (heights && heights[rowIndex]) {
2411
- height = heights[rowIndex];
2412
- top += heights.header;
2413
- for (let i = rowIndex - 1; i >= 0; i--) {
2414
- top += heights[i];
2415
- }
2416
- }
2417
2596
 
2418
2597
  return (
2419
- <div
2420
- className={cx('Table-itemActions-wrap')}
2421
- style={{
2422
- top,
2423
- height
2424
- }}
2425
- >
2598
+ <ItemActionsWrapper store={store} classnames={cx}>
2426
2599
  <div className={cx('Table-itemActions')}>
2427
2600
  {finalActions.map((action, index) =>
2428
2601
  render(
@@ -2433,14 +2606,14 @@ export default class Table extends React.Component<TableProps, object> {
2433
2606
  },
2434
2607
  {
2435
2608
  key: index,
2436
- item: store.rows[rowIndex],
2437
- data: store.rows[rowIndex].locals,
2438
- rowIndex
2609
+ item: store.hoverRow,
2610
+ data: store.hoverRow!.locals,
2611
+ rowIndex: store.hoverRow!.index
2439
2612
  }
2440
2613
  )
2441
2614
  )}
2442
2615
  </div>
2443
- </div>
2616
+ </ItemActionsWrapper>
2444
2617
  );
2445
2618
  }
2446
2619
 
@@ -2503,7 +2676,13 @@ export default class Table extends React.Component<TableProps, object> {
2503
2676
  }
2504
2677
 
2505
2678
  render() {
2506
- const {className, store, classnames: cx, affixColumns} = this.props;
2679
+ const {
2680
+ className,
2681
+ store,
2682
+ classnames: cx,
2683
+ affixColumns,
2684
+ autoGenerateFilter
2685
+ } = this.props;
2507
2686
 
2508
2687
  this.renderedToolbars = []; // 用来记录哪些 toolbar 已经渲染了,已经渲染了就不重复渲染了。
2509
2688
  const heading = this.renderHeading();
@@ -2521,6 +2700,7 @@ export default class Table extends React.Component<TableProps, object> {
2521
2700
  'Table--unsaved': !!store.modified || !!store.moved
2522
2701
  })}
2523
2702
  >
2703
+ {autoGenerateFilter ? this.renderAutoFilterForm() : null}
2524
2704
  {header}
2525
2705
  {heading}
2526
2706
  <div
@@ -2554,7 +2734,7 @@ export default class Table extends React.Component<TableProps, object> {
2554
2734
  : null}
2555
2735
  </div>
2556
2736
  {this.renderTableContent()}
2557
- {~store.hoverIndex ? this.renderItemActions() : null}
2737
+ {store.hoverRow ? this.renderItemActions() : null}
2558
2738
  </div>
2559
2739
  {this.renderAffixHeader(tableClassName)}
2560
2740
  {footer}
package/src/store/crud.ts CHANGED
@@ -482,6 +482,39 @@ export const CRUDStore = ServiceStore.named('CRUDStore')
482
482
  self.reInitData(data);
483
483
  };
484
484
 
485
+ const exportAsCSV = async (
486
+ options: {loadDataOnce?: boolean; api?: Api; data?: any} = {}
487
+ ) => {
488
+ let items = options.loadDataOnce ? self.data.itemsRaw : self.data.items;
489
+
490
+ if (options.api) {
491
+ const env = getEnv(self);
492
+ const res = await env.fetcher(options.api, options.data);
493
+ if (!res.data) {
494
+ return;
495
+ }
496
+ if (Array.isArray(res.data)) {
497
+ items = res.data;
498
+ } else {
499
+ items = res.data.rows || res.data.items;
500
+ }
501
+ }
502
+
503
+ import('papaparse').then((papaparse: any) => {
504
+ const csvText = papaparse.unparse(items);
505
+ if (csvText) {
506
+ const blob = new Blob(
507
+ // 加上 BOM 这样 Excel 打开的时候就不会乱码
508
+ [new Uint8Array([0xef, 0xbb, 0xbf]), csvText],
509
+ {
510
+ type: 'text/plain;charset=utf-8'
511
+ }
512
+ );
513
+ saveAs(blob, 'data.csv');
514
+ }
515
+ });
516
+ };
517
+
485
518
  return {
486
519
  setPristineQuery,
487
520
  updateQuery,
@@ -495,44 +528,7 @@ export const CRUDStore = ServiceStore.named('CRUDStore')
495
528
  setUnSelectedItems,
496
529
  setInnerModalOpened,
497
530
  initFromScope,
498
- async exportAsCSV(options: {loadDataOnce?: boolean; api?: Api} = {}) {
499
- let items = options.loadDataOnce ? self.data.itemsRaw : self.data.items;
500
-
501
- if (!options.loadDataOnce && options.api) {
502
- const json = await self.fetchData(
503
- options.api,
504
- {
505
- ...self.query,
506
- page: undefined,
507
- perPage: undefined,
508
- op: 'export-csv'
509
- },
510
- {
511
- autoAppend: true
512
- }
513
- );
514
- if (
515
- json.ok &&
516
- (Array.isArray(json.data.items) || Array.isArray(json.data.rows))
517
- ) {
518
- items = json.data.items || json.data.rows;
519
- }
520
- }
521
-
522
- import('papaparse').then((papaparse: any) => {
523
- const csvText = papaparse.unparse(items);
524
- if (csvText) {
525
- const blob = new Blob(
526
- // 加上 BOM 这样 Excel 打开的时候就不会乱码
527
- [new Uint8Array([0xef, 0xbb, 0xbf]), csvText],
528
- {
529
- type: 'text/plain;charset=utf-8'
530
- }
531
- );
532
- saveAs(blob, 'data.csv');
533
- }
534
- });
535
- }
531
+ exportAsCSV
536
532
  };
537
533
  });
538
534
 
@@ -24,6 +24,10 @@ export const ModalStore = ServiceStore.named('ModalStore')
24
24
  setFormData(obj: any) {
25
25
  self.form = obj;
26
26
  },
27
+ reset() {
28
+ self.form = {};
29
+ self.reInitData({}, true);
30
+ },
27
31
 
28
32
  setResizeCoord(value: number) {
29
33
  self.resizeCoord = value;
@@ -140,24 +140,6 @@ export const ServiceStore = iRendererStore
140
140
  }
141
141
  });
142
142
 
143
- const fetchWSData = (ws: string, afterDataFetch: (data: any) => any) => {
144
- const env = getEnv(self);
145
-
146
- env.wsFetcher(
147
- ws,
148
- (data: any) => {
149
- self.updateData(data, undefined, false);
150
- setHasRemoteData();
151
- // 因为 WebSocket 只会获取纯数据,所以没有 msg 之类的
152
- afterDataFetch({ok: true, data: data});
153
- },
154
- (error: any) => {
155
- updateMessage(error, true);
156
- env.notify('error', error);
157
- }
158
- );
159
- };
160
-
161
143
  const setHasRemoteData = () => {
162
144
  self.hasRemoteData = true;
163
145
  };
@@ -505,7 +487,6 @@ export const ServiceStore = iRendererStore
505
487
  markBusying,
506
488
  fetchInitData,
507
489
  fetchData,
508
- fetchWSData,
509
490
  reInitData,
510
491
  updateMessage,
511
492
  clearMessage,