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
@@ -45,6 +45,7 @@ export const Column = types
45
45
  checkdisable: false,
46
46
  isPrimary: false,
47
47
  searchable: types.maybe(types.frozen()),
48
+ enableSearch: true,
48
49
  sortable: false,
49
50
  filterable: types.optional(types.frozen(), undefined),
50
51
  fixed: '',
@@ -66,8 +67,13 @@ export const Column = types
66
67
 
67
68
  table.persistSaveToggledColumns();
68
69
  },
70
+
69
71
  setToggled(value: boolean) {
70
72
  self.toggled = value;
73
+ },
74
+
75
+ setEnableSearch(value: boolean) {
76
+ self.enableSearch = value;
71
77
  }
72
78
  }));
73
79
 
@@ -292,6 +298,10 @@ export const TableStore = iRendererStore
292
298
  keepItemSelectionOnPageChange: false
293
299
  })
294
300
  .views(self => {
301
+ function getColumnsExceptBuiltinTypes() {
302
+ return self.columns.filter(item => !/^__/.test(item.type));
303
+ }
304
+
295
305
  function getForms() {
296
306
  return self.formsRef.map(item => ({
297
307
  store: getStoreById(item.id) as IFormStore,
@@ -414,8 +424,8 @@ export const TableStore = iRendererStore
414
424
  return getMovedRows().length;
415
425
  }
416
426
 
417
- function getHoverIndex(): number {
418
- return self.rows.findIndex(item => item.isHover);
427
+ function getHovedRow(): IRow | undefined {
428
+ return flattenTree<IRow>(self.rows).find((item: IRow) => item.isHover);
419
429
  }
420
430
 
421
431
  function getUnSelectedRows() {
@@ -499,11 +509,46 @@ export const TableStore = iRendererStore
499
509
  });
500
510
  }
501
511
 
512
+ function getFirstToggledColumnIndex() {
513
+ const column = self.columns.find(
514
+ column => !/^__/.test(column.type) && column.toggled
515
+ );
516
+
517
+ return column == null ? null : column.index;
518
+ }
519
+
520
+ function getSearchableColumns() {
521
+ return self.columns.filter(
522
+ column => column.searchable && isObject(column.searchable)
523
+ );
524
+ }
525
+
526
+ function getActivedSearchableColumns() {
527
+ return self.columns.filter(
528
+ column =>
529
+ column.searchable &&
530
+ isObject(column.searchable) &&
531
+ column.enableSearch
532
+ );
533
+ }
534
+
502
535
  return {
536
+ get columnsData() {
537
+ return getColumnsExceptBuiltinTypes();
538
+ },
539
+
503
540
  get forms() {
504
541
  return getForms();
505
542
  },
506
543
 
544
+ get searchableColumns() {
545
+ return getSearchableColumns();
546
+ },
547
+
548
+ get activedSearchableColumns() {
549
+ return getSearchableColumns().filter(column => column.enableSearch);
550
+ },
551
+
507
552
  get filteredColumns() {
508
553
  return getFilteredColumns();
509
554
  },
@@ -583,8 +628,8 @@ export const TableStore = iRendererStore
583
628
  return getMovedRows();
584
629
  },
585
630
 
586
- get hoverIndex() {
587
- return getHoverIndex();
631
+ get hoverRow() {
632
+ return getHovedRow();
588
633
  },
589
634
 
590
635
  get disabledHeadCheckbox() {
@@ -598,6 +643,10 @@ export const TableStore = iRendererStore
598
643
  return maxLength === selectedLength;
599
644
  },
600
645
 
646
+ get firstToggledColumnIndex() {
647
+ return getFirstToggledColumnIndex();
648
+ },
649
+
601
650
  getData,
602
651
 
603
652
  get columnGroup() {
@@ -984,11 +1033,16 @@ export const TableStore = iRendererStore
984
1033
  }
985
1034
  }
986
1035
 
1036
+ // 记录最近一次点击的多选框,主要用于 shift 多选时判断上一个选的是什么
1037
+ let lastCheckedRow: any = null;
1038
+
987
1039
  function toggle(row: IRow) {
988
1040
  if (!row.checkable) {
989
1041
  return;
990
1042
  }
991
1043
 
1044
+ lastCheckedRow = row;
1045
+
992
1046
  const idx = self.selectedRows.indexOf(row);
993
1047
 
994
1048
  if (self.multiple) {
@@ -1000,6 +1054,50 @@ export const TableStore = iRendererStore
1000
1054
  }
1001
1055
  }
1002
1056
 
1057
+ // 按住 shift 的时候点击选项
1058
+ function toggleShift(row: IRow) {
1059
+ // 如果是同一个或非 multiple 模式下就和不用 shift 一样
1060
+ if (!lastCheckedRow || row === lastCheckedRow || !self.multiple) {
1061
+ toggle(row);
1062
+ return;
1063
+ }
1064
+
1065
+ const maxLength = self.maxKeepItemSelectionLength;
1066
+ const checkableRows = self.checkableRows;
1067
+ const lastCheckedRowIndex = checkableRows.findIndex(
1068
+ row => row === lastCheckedRow
1069
+ );
1070
+ const rowIndex = checkableRows.findIndex(rowItem => row === rowItem);
1071
+ const minIndex =
1072
+ lastCheckedRowIndex > rowIndex ? rowIndex : lastCheckedRowIndex;
1073
+ const maxIndex =
1074
+ lastCheckedRowIndex > rowIndex ? lastCheckedRowIndex : rowIndex;
1075
+
1076
+ const rows = checkableRows.slice(minIndex, maxIndex);
1077
+ rows.push(row); // 将当前行也加入进行判断
1078
+ for (const rowItem of rows) {
1079
+ const idx = self.selectedRows.indexOf(rowItem);
1080
+ if (idx === -1) {
1081
+ // 如果上一个是选中状态,则将之间的所有 check 都变成可选
1082
+ if (lastCheckedRow.checked) {
1083
+ if (maxLength) {
1084
+ if (self.selectedRows.length < maxLength) {
1085
+ self.selectedRows.push(rowItem);
1086
+ }
1087
+ } else {
1088
+ self.selectedRows.push(rowItem);
1089
+ }
1090
+ }
1091
+ } else {
1092
+ if (!lastCheckedRow.checked) {
1093
+ self.selectedRows.splice(idx, 1);
1094
+ }
1095
+ }
1096
+ }
1097
+
1098
+ lastCheckedRow = row;
1099
+ }
1100
+
1003
1101
  function updateCheckDisable() {
1004
1102
  if (!self.data) {
1005
1103
  return;
@@ -1134,6 +1232,7 @@ export const TableStore = iRendererStore
1134
1232
  updateSelected,
1135
1233
  toggleAll,
1136
1234
  toggle,
1235
+ toggleShift,
1137
1236
  toggleExpandAll,
1138
1237
  toggleExpanded,
1139
1238
  collapseAllAtDepth,
package/src/utils/api.ts CHANGED
@@ -22,6 +22,8 @@ interface ApiCacheConfig extends ApiObject {
22
22
 
23
23
  const apiCaches: Array<ApiCacheConfig> = [];
24
24
 
25
+ const isIE = !!(document as any).documentMode;
26
+
25
27
  export function normalizeApi(
26
28
  api: Api,
27
29
  defaultMethod: string = 'get'
@@ -80,7 +82,9 @@ export function buildApi(
80
82
  );
81
83
  api.url =
82
84
  tokenize(api.url.substring(0, idx + 1), data, '| url_encode') +
83
- qsstringify((api.query = dataMapping(params, data))) +
85
+ qsstringify(
86
+ (api.query = dataMapping(params, data, undefined, api.convertKeyToPath))
87
+ ) +
84
88
  (~hashIdx ? api.url.substring(hashIdx) : '');
85
89
  } else {
86
90
  api.url = tokenize(api.url, data, '| url_encode');
@@ -91,7 +95,12 @@ export function buildApi(
91
95
  }
92
96
 
93
97
  if (api.data) {
94
- api.body = api.data = dataMapping(api.data, data);
98
+ api.body = api.data = dataMapping(
99
+ api.data,
100
+ data,
101
+ undefined,
102
+ api.convertKeyToPath
103
+ );
95
104
  } else if (api.method === 'post' || api.method === 'put') {
96
105
  api.body = api.data = cloneObject(data);
97
106
  }
@@ -136,7 +145,7 @@ export function buildApi(
136
145
  }
137
146
 
138
147
  if (api.headers) {
139
- api.headers = dataMapping(api.headers, data);
148
+ api.headers = dataMapping(api.headers, data, undefined, false);
140
149
  }
141
150
 
142
151
  if (api.requestAdaptor && typeof api.requestAdaptor === 'string') {
@@ -246,7 +255,9 @@ export function responseAdaptor(ret: fetcherResult, api: ApiObject) {
246
255
  items: payload.data
247
256
  }
248
257
  : payload.data) || {}
249
- )
258
+ ),
259
+ undefined,
260
+ api.convertKeyToPath
250
261
  );
251
262
  }
252
263
 
@@ -293,6 +304,15 @@ export function wrapFetcher(
293
304
  api
294
305
  );
295
306
  }
307
+ // IE 下 get 请求会被缓存,所以自动加个时间戳
308
+ if (isIE && api && api.method?.toLocaleLowerCase() === 'get') {
309
+ const timeStamp = `_t=${Date.now()}`;
310
+ if (api.url.indexOf('?') === -1) {
311
+ api.url = api.url + `?${timeStamp}`;
312
+ } else {
313
+ api.url = api.url + `&${timeStamp}`;
314
+ }
315
+ }
296
316
  return wrapAdaptor(fn(api), api);
297
317
  };
298
318
  }
@@ -0,0 +1,90 @@
1
+ /**
2
+ * 处理接口返回附件的情况,好几个地方用
3
+ * @param response
4
+ * @param __
5
+ * @returns
6
+ */
7
+
8
+ export default function attachmentAdpator(response: any, __: Function) {
9
+ if (response && response.headers && response.headers['content-disposition']) {
10
+ const disposition = response.headers['content-disposition'];
11
+ let filename = '';
12
+
13
+ if (disposition && disposition.indexOf('attachment') !== -1) {
14
+ // disposition 有可能是 attachment; filename="??.xlsx"; filename*=UTF-8''%E4%B8%AD%E6%96%87.xlsx
15
+ // 这种情况下最后一个才是正确的文件名
16
+ let filenameRegex = /filename[^;=\n]*=((['"]).*?\2|[^;\n]*)$/;
17
+
18
+ let matches = disposition.match(filenameRegex);
19
+ if (matches && matches.length) {
20
+ filename = matches[1].replace(`UTF-8''`, '').replace(/['"]/g, '');
21
+ }
22
+
23
+ // 很可能是中文被 url-encode 了
24
+ if (filename && filename.replace(/[^%]/g, '').length > 2) {
25
+ filename = decodeURIComponent(filename);
26
+ }
27
+
28
+ let type = response.headers['content-type'];
29
+ let blob =
30
+ response.data.toString() === '[object Blob]'
31
+ ? response.data
32
+ : new Blob([response.data], {type: type});
33
+ if (typeof (window.navigator as any).msSaveBlob !== 'undefined') {
34
+ // IE workaround for "HTML7007: One or more blob URLs were revoked by closing the blob for which they were created. These URLs will no longer resolve as the data backing the URL has been freed."
35
+ (window.navigator as any).msSaveBlob(blob, filename);
36
+ } else {
37
+ let URL = window.URL || (window as any).webkitURL;
38
+ let downloadUrl = URL.createObjectURL(blob);
39
+ if (filename) {
40
+ // use HTML5 a[download] attribute to specify filename
41
+ let a = document.createElement('a');
42
+ // safari doesn't support this yet
43
+ if (typeof a.download === 'undefined') {
44
+ (window as any).location = downloadUrl;
45
+ } else {
46
+ a.href = downloadUrl;
47
+ a.download = filename;
48
+ document.body.appendChild(a);
49
+ a.click();
50
+ }
51
+ } else {
52
+ (window as any).location = downloadUrl;
53
+ }
54
+ setTimeout(function () {
55
+ URL.revokeObjectURL(downloadUrl);
56
+ }, 100); // cleanup
57
+ }
58
+
59
+ return {
60
+ ...response,
61
+ data: {
62
+ status: 0,
63
+ msg: __('Embed.downloading')
64
+ }
65
+ };
66
+ }
67
+ } else if (response.data.toString() === '[object Blob]') {
68
+ return new Promise((resolve, reject) => {
69
+ let reader = new FileReader();
70
+ reader.addEventListener('loadend', e => {
71
+ const text = reader.result as string;
72
+
73
+ try {
74
+ resolve({
75
+ ...response,
76
+ data: {
77
+ ...JSON.parse(text)
78
+ }
79
+ });
80
+ } catch (e) {
81
+ reject(e);
82
+ }
83
+ });
84
+
85
+ reader.readAsText(response.data);
86
+ });
87
+ }
88
+
89
+ return response;
90
+ }
@@ -0,0 +1,41 @@
1
+ /**
2
+ * 后续好多地方可能都要支持 action,所以提取公共功能
3
+ */
4
+
5
+ import {RendererProps} from '../factory';
6
+ import {ActionSchema, AjaxActionSchema} from '../renderers/Action';
7
+ import {normalizeApi, str2function} from './api';
8
+
9
+ export default function handleAction(
10
+ e: React.MouseEvent<any>,
11
+ action: ActionSchema,
12
+ props: RendererProps,
13
+ data?: any
14
+ ) {
15
+ // https://reactjs.org/docs/legacy-event-pooling.html
16
+ e.persist();
17
+
18
+ const onAction = props.onAction;
19
+ let onClick: any = action.onClick;
20
+
21
+ if (typeof onClick === 'string') {
22
+ onClick = str2function(onClick, 'event', 'props');
23
+ }
24
+ const result: any = onClick && onClick(e, props);
25
+
26
+ if (e.isDefaultPrevented() || result === false || !onAction) {
27
+ return;
28
+ }
29
+
30
+ e.preventDefault();
31
+
32
+ // download 是一种 ajax 的简写
33
+ if (action.actionType === 'download') {
34
+ action.actionType = 'ajax';
35
+ const api = normalizeApi((action as AjaxActionSchema).api);
36
+ api.responseType = 'blob';
37
+ (action as AjaxActionSchema).api = api;
38
+ }
39
+
40
+ onAction(e, action, data || props.data);
41
+ }
@@ -181,7 +181,8 @@ export function getVariable(
181
181
  export function setVariable(
182
182
  data: {[propName: string]: any},
183
183
  key: string,
184
- value: any
184
+ value: any,
185
+ convertKeyToPath?: boolean
185
186
  ) {
186
187
  data = data || {};
187
188
 
@@ -190,7 +191,7 @@ export function setVariable(
190
191
  return;
191
192
  }
192
193
 
193
- const parts = keyToPath(key);
194
+ const parts = convertKeyToPath !== false ? keyToPath(key) : [key];
194
195
  const last = parts.pop() as string;
195
196
 
196
197
  while (parts.length) {
@@ -1617,7 +1618,7 @@ export function detectPropValueChanged<
1617
1618
 
1618
1619
  // 去掉字符串中的 html 标签,不完全准确但效率比较高
1619
1620
  export function removeHTMLTag(str: string) {
1620
- return str.replace(/<\/?[^>]+(>|$)/g, '');
1621
+ return typeof str === 'string' ? str.replace(/<\/?[^>]+(>|$)/g, '') : str;
1621
1622
  }
1622
1623
 
1623
1624
  /**
@@ -383,10 +383,26 @@ export const filters: {
383
383
  first: input => input && input[0],
384
384
  nth: (input, nth = 0) => input && input[nth],
385
385
  last: input => input && (input.length ? input[input.length - 1] : null),
386
- minus: (input, step = 1) =>
387
- stripNumber((parseInt(input, 10) || 0) - parseInt(step, 10)),
388
- plus: (input, step = 1) =>
389
- stripNumber((parseInt(input, 10) || 0) + parseInt(step, 10)),
386
+ minus(input, step = 1) {
387
+ return stripNumber(
388
+ (Number(input) || 0) - Number(getStrOrVariable(step, this))
389
+ );
390
+ },
391
+ plus(input, step = 1) {
392
+ return stripNumber(
393
+ (Number(input) || 0) + Number(getStrOrVariable(step, this))
394
+ );
395
+ },
396
+ times(input, step = 1) {
397
+ return stripNumber(
398
+ (Number(input) || 0) * Number(getStrOrVariable(step, this))
399
+ );
400
+ },
401
+ division(input, step = 1) {
402
+ return stripNumber(
403
+ (Number(input) || 0) / Number(getStrOrVariable(step, this))
404
+ );
405
+ },
390
406
  count: (input: any) =>
391
407
  Array.isArray(input) || typeof input === 'string' ? input.length : 0,
392
408
  sum: (input, field) => {
@@ -866,10 +882,13 @@ export function resolveMapping(
866
882
  export function dataMapping(
867
883
  to: any,
868
884
  from: PlainObject = {},
869
- ignoreFunction: boolean | ((key: string, value: any) => boolean) = false
885
+ ignoreFunction: boolean | ((key: string, value: any) => boolean) = false,
886
+ convertKeyToPath?: boolean
870
887
  ): any {
871
888
  if (Array.isArray(to)) {
872
- return to.map(item => dataMapping(item, from, ignoreFunction));
889
+ return to.map(item =>
890
+ dataMapping(item, from, ignoreFunction, convertKeyToPath)
891
+ );
873
892
  } else if (typeof to === 'string') {
874
893
  return resolveMapping(to, from);
875
894
  } else if (!isPlainObject(to)) {
@@ -883,7 +902,7 @@ export function dataMapping(
883
902
 
884
903
  if (typeof ignoreFunction === 'function' && ignoreFunction(key, value)) {
885
904
  // 如果被ignore,不做数据映射处理。
886
- setVariable(ret, key, value);
905
+ setVariable(ret, key, value, convertKeyToPath);
887
906
  } else if (key === '&' && value === '$$') {
888
907
  ret = {
889
908
  ...ret,
@@ -900,7 +919,8 @@ export function dataMapping(
900
919
  dataMapping(
901
920
  value[keys[0]],
902
921
  createObject(from, raw),
903
- ignoreFunction
922
+ ignoreFunction,
923
+ convertKeyToPath
904
924
  )
905
925
  )
906
926
  : resolveMapping(value, from);
@@ -919,10 +939,10 @@ export function dataMapping(
919
939
  };
920
940
  }
921
941
  } else if (value === '$$') {
922
- setVariable(ret, key, from);
942
+ setVariable(ret, key, from, convertKeyToPath);
923
943
  } else if (value && value[0] === '$') {
924
944
  const v = resolveMapping(value, from);
925
- setVariable(ret, key, v);
945
+ setVariable(ret, key, v, convertKeyToPath);
926
946
 
927
947
  if (v === '__undefined') {
928
948
  deleteVariable(ret, key);
@@ -952,26 +972,37 @@ export function dataMapping(
952
972
  const mapping = value[keys[0]];
953
973
 
954
974
  (ret as PlainObject)[key] = arr.map((raw: object) =>
955
- dataMapping(mapping, createObject(from, raw), ignoreFunction)
975
+ dataMapping(
976
+ mapping,
977
+ createObject(from, raw),
978
+ ignoreFunction,
979
+ convertKeyToPath
980
+ )
956
981
  );
957
982
  } else if (isPlainObject(value)) {
958
- setVariable(ret, key, dataMapping(value, from, ignoreFunction));
983
+ setVariable(
984
+ ret,
985
+ key,
986
+ dataMapping(value, from, ignoreFunction, convertKeyToPath),
987
+ convertKeyToPath
988
+ );
959
989
  } else if (Array.isArray(value)) {
960
990
  setVariable(
961
991
  ret,
962
992
  key,
963
993
  value.map((value: any) =>
964
994
  isPlainObject(value)
965
- ? dataMapping(value, from, ignoreFunction)
995
+ ? dataMapping(value, from, ignoreFunction, convertKeyToPath)
966
996
  : resolveMapping(value, from)
967
- )
997
+ ),
998
+ convertKeyToPath
968
999
  );
969
1000
  } else if (typeof value == 'string' && ~value.indexOf('$')) {
970
- setVariable(ret, key, resolveMapping(value, from));
1001
+ setVariable(ret, key, resolveMapping(value, from), convertKeyToPath);
971
1002
  } else if (typeof value === 'function' && ignoreFunction !== true) {
972
- setVariable(ret, key, value(from));
1003
+ setVariable(ret, key, value(from), convertKeyToPath);
973
1004
  } else {
974
- setVariable(ret, key, value);
1005
+ setVariable(ret, key, value, convertKeyToPath);
975
1006
 
976
1007
  if (value === '__undefined') {
977
1008
  deleteVariable(ret, key);
@@ -14,6 +14,79 @@ const makeRegexp = (reg: string | RegExp) => {
14
14
 
15
15
  return /^$/;
16
16
  };
17
+ import memoize from 'lodash/memoize';
18
+ import isPlainObject from 'lodash/isPlainObject';
19
+
20
+ const makeUrlRegexp = memoize(function (options: any) {
21
+ options = {
22
+ schemes: ['http', 'https', 'ftp', 'sftp'],
23
+ allowLocal: true,
24
+ allowDataUrl: false,
25
+ ...(isPlainObject(options) ? options : {})
26
+ };
27
+
28
+ // https://github.com/ansman/validate.js/blob/master/validate.js#L1098-L1164
29
+ let {schemes, allowLocal, allowDataUrl} = options;
30
+
31
+ if (!Array.isArray(schemes)) {
32
+ schemes = ['http', 'https', 'ftp', 'sftp'];
33
+ }
34
+
35
+ let regex =
36
+ '^' +
37
+ // protocol identifier
38
+ '(?:(?:' +
39
+ schemes.join('|') +
40
+ ')://)' +
41
+ // user:pass authentication
42
+ '(?:\\S+(?::\\S*)?@)?' +
43
+ '(?:';
44
+
45
+ var tld = '(?:\\.(?:[a-z\\u00a1-\\uffff]{2,}))';
46
+
47
+ if (allowLocal) {
48
+ tld += '?';
49
+ } else {
50
+ regex +=
51
+ // IP address exclusion
52
+ // private & local networks
53
+ '(?!(?:10|127)(?:\\.\\d{1,3}){3})' +
54
+ '(?!(?:169\\.254|192\\.168)(?:\\.\\d{1,3}){2})' +
55
+ '(?!172\\.(?:1[6-9]|2\\d|3[0-1])(?:\\.\\d{1,3}){2})';
56
+ }
57
+
58
+ regex +=
59
+ // IP address dotted notation octets
60
+ // excludes loopback network 0.0.0.0
61
+ // excludes reserved space >= 224.0.0.0
62
+ // excludes network & broacast addresses
63
+ // (first & last IP address of each class)
64
+ '(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])' +
65
+ '(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}' +
66
+ '(?:\\.(?:[1-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))' +
67
+ '|' +
68
+ // host name
69
+ '(?:(?:[a-z\\u00a1-\\uffff0-9]-*)*[a-z\\u00a1-\\uffff0-9]+)' +
70
+ // domain name
71
+ '(?:\\.(?:[a-z\\u00a1-\\uffff0-9]-*)*[a-z\\u00a1-\\uffff0-9]+)*' +
72
+ tld +
73
+ ')' +
74
+ // port number
75
+ '(?::\\d{2,5})?' +
76
+ // resource path
77
+ '(?:[/?#]\\S*)?' +
78
+ '$';
79
+
80
+ if (allowDataUrl) {
81
+ // RFC 2397
82
+ var mediaType = '\\w+\\/[-+.\\w]+(?:;[\\w=]+)*';
83
+ var urlchar = "[A-Za-z0-9-_.!~\\*'();\\/?:@&=+$,%]*";
84
+ var dataurl = 'data:(?:' + mediaType + ')?(?:;base64)?,' + urlchar;
85
+ regex = '(?:' + regex + ')|(?:^' + dataurl + '$)';
86
+ }
87
+
88
+ return new RegExp(regex, 'i');
89
+ });
17
90
 
18
91
  export interface ValidateFn {
19
92
  (
@@ -55,12 +128,8 @@ export const validations: {
55
128
  /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))$/i
56
129
  );
57
130
  },
58
- isUrl: function (values, value) {
59
- return validations.matchRegexp(
60
- values,
61
- value,
62
- /^(https?|s?ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i
63
- );
131
+ isUrl: function (values, value, options) {
132
+ return validations.matchRegexp(values, value, makeUrlRegexp(options));
64
133
  },
65
134
  isTrue: function (values, value) {
66
135
  return value === true;
@@ -282,9 +351,8 @@ export function validate(
282
351
  }
283
352
 
284
353
  const fn = validations[ruleName];
285
- const args = (Array.isArray(rules[ruleName])
286
- ? rules[ruleName]
287
- : [rules[ruleName]]
354
+ const args = (
355
+ Array.isArray(rules[ruleName]) ? rules[ruleName] : [rules[ruleName]]
288
356
  ).map((item: any) => {
289
357
  if (typeof item === 'string' && isPureVariable(item)) {
290
358
  return resolveVariableAndFilter(item, values, '|raw');
@@ -356,9 +424,9 @@ const splitValidations = function (str: string): Array<string> {
356
424
  .map(str => (/^__\d+$/.test(str) ? placeholder[str] : str.trim()));
357
425
  };
358
426
 
359
- export function str2rules(
360
- validations: string | {[propName: string]: any}
361
- ): {[propName: string]: any} {
427
+ export function str2rules(validations: string | {[propName: string]: any}): {
428
+ [propName: string]: any;
429
+ } {
362
430
  if (typeof validations === 'string') {
363
431
  return validations
364
432
  ? splitValidations(validations).reduce(function (