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
@@ -4,6 +4,7 @@ import {BaseSchema, SchemaTpl} from '../Schema';
4
4
  import {getPropValue} from '../utils/helper';
5
5
  import {filter} from '../utils/tpl';
6
6
  import {BadgeSchema, withBadge} from '../components/Badge';
7
+ import Link from '../components/Link';
7
8
 
8
9
  /**
9
10
  * Link 链接展示控件。
@@ -29,16 +30,32 @@ export interface LinkSchema extends BaseSchema {
29
30
  * 角标
30
31
  */
31
32
  badge?: BadgeSchema;
33
+
34
+ /**
35
+ * a标签原生target属性
36
+ */
37
+ htmlTarget?: string;
38
+
39
+ /**
40
+ * 图标
41
+ */
42
+ icon?: string;
43
+
44
+ /**
45
+ * 图标位置
46
+ */
47
+ position?: string;
32
48
  }
33
49
 
34
50
  export interface LinkProps
35
51
  extends RendererProps,
36
52
  Omit<LinkSchema, 'type' | 'className'> {}
37
53
 
38
- export class LinkField extends React.Component<LinkProps, object> {
54
+ export class LinkCmpt extends React.Component<LinkProps, object> {
39
55
  static defaultProps = {
40
- className: '',
41
- blank: false
56
+ blank: true,
57
+ disabled: false,
58
+ htmlTarget: '_self'
42
59
  };
43
60
 
44
61
  render() {
@@ -48,25 +65,33 @@ export class LinkField extends React.Component<LinkProps, object> {
48
65
  href,
49
66
  classnames: cx,
50
67
  blank,
68
+ disabled,
51
69
  htmlTarget,
52
70
  data,
53
71
  render,
54
72
  translate: __,
55
- title
73
+ title,
74
+ icon,
75
+ position
56
76
  } = this.props;
57
77
 
58
78
  let value = getPropValue(this.props);
59
79
  const finnalHref = href ? filter(href, data, '| raw') : '';
80
+ const text = body ? render('body', body) : finnalHref || value || __('link');
60
81
 
61
82
  return (
62
- <a
63
- href={finnalHref || value}
64
- target={htmlTarget || (blank ? '_blank' : '_self')}
65
- className={cx('Link', className)}
83
+ <Link
84
+ className={className}
85
+ href={href}
86
+ body={text}
87
+ blank={blank}
88
+ disabled={disabled}
66
89
  title={title}
90
+ htmlTarget={htmlTarget}
91
+ icon={icon}
92
+ position={position}
67
93
  >
68
- {body ? render('body', body) : finnalHref || value || __('link')}
69
- </a>
94
+ </Link>
70
95
  );
71
96
  }
72
97
  }
@@ -76,4 +101,4 @@ export class LinkField extends React.Component<LinkProps, object> {
76
101
  })
77
102
  // @ts-ignore 类型没搞定
78
103
  @withBadge
79
- export class LinkFieldRenderer extends LinkField {}
104
+ export class LinkFieldRenderer extends LinkCmpt {}
@@ -6,7 +6,7 @@ import {Renderer, RendererProps} from '../factory';
6
6
  import {BaseSchema, SchemaTpl} from '../Schema';
7
7
  import Ansi from 'ansi-to-react';
8
8
  import {filter} from '../utils/tpl';
9
- import {buildApi} from '../utils/api';
9
+ import {buildApi, isApiOutdated} from '../utils/api';
10
10
 
11
11
  /**
12
12
  * 日志展示组件
@@ -14,7 +14,7 @@ import {buildApi} from '../utils/api';
14
14
  */
15
15
  export interface LogSchema extends BaseSchema {
16
16
  /**
17
- * 指定为 link 链接展示控件
17
+ * 指定为 log 链接展示控件
18
18
  */
19
19
  type: 'log';
20
20
 
@@ -100,10 +100,20 @@ export class Log extends React.Component<LogProps, LogState> {
100
100
  }
101
101
  }
102
102
 
103
- componentDidUpdate() {
103
+ componentDidUpdate(prevProps: LogProps) {
104
104
  if (this.autoScroll && this.logRef && this.logRef.current) {
105
105
  this.logRef.current.scrollTop = this.logRef.current.scrollHeight;
106
106
  }
107
+ if (
108
+ isApiOutdated(
109
+ prevProps.source,
110
+ this.props.source,
111
+ prevProps.data,
112
+ this.props.data
113
+ )
114
+ ) {
115
+ this.loadLogs();
116
+ }
107
117
  }
108
118
 
109
119
  // 如果向上滚动就停止自动滚动,除非滚到底部
@@ -118,6 +128,9 @@ export class Log extends React.Component<LogProps, LogState> {
118
128
  const {source, data, env, translate: __, encoding} = this.props;
119
129
  // 因为这里返回结果是流式的,和普通 api 请求不一样,如果直接用 fetcher 经过 responseAdaptor 可能会导致出错,所以就直接 fetch 了
120
130
  const api = buildApi(source, data);
131
+ if (!api.url) {
132
+ return;
133
+ }
121
134
  const res = await fetch(api.url);
122
135
  if (res.status === 200) {
123
136
  const body = res.body;
@@ -1,15 +1,18 @@
1
1
  import React from 'react';
2
+ import {findDOMNode} from 'react-dom';
2
3
  import {Renderer, RendererEnv, RendererProps} from '../factory';
3
4
  import getExprProperties from '../utils/filter-schema';
4
5
  import {filter, evalExpression} from '../utils/tpl';
5
6
  import {
7
+ guid,
6
8
  autobind,
7
9
  createObject,
8
10
  findTree,
9
11
  isUnfolded,
10
12
  mapTree,
11
13
  someTree,
12
- spliceTree
14
+ spliceTree,
15
+ findTreeIndex
13
16
  } from '../utils/helper';
14
17
  import {ScopedContext, IScopedContext} from '../Scoped';
15
18
  import {themeable, ThemeProps} from '../theme';
@@ -22,6 +25,8 @@ import {
22
25
  } from '../components/WithRemoteConfig';
23
26
  import {Payload} from '../types';
24
27
  import Spinner from '../components/Spinner';
28
+ import {isEffectiveApi} from '../utils/api';
29
+ import {Badge, BadgeSchema} from '../components/Badge';
25
30
 
26
31
  export type NavItemSchema = {
27
32
  /**
@@ -81,6 +86,31 @@ export interface NavSchema extends BaseSchema {
81
86
  * true 为垂直排列,false 为水平排列类似如 tabs。
82
87
  */
83
88
  stacked?: boolean;
89
+
90
+ /**
91
+ * 更多操作菜单列表
92
+ */
93
+ itemActions?: SchemaCollection;
94
+
95
+ /**
96
+ * 可拖拽
97
+ */
98
+ draggable?: boolean;
99
+
100
+ /**
101
+ * 保存排序的 api
102
+ */
103
+ saveOrderApi?: SchemaApi;
104
+
105
+ /**
106
+ * 角标
107
+ */
108
+ itemBadge?: BadgeSchema;
109
+
110
+ /**
111
+ * 仅允许同层级拖拽
112
+ */
113
+ dragOnSameLevel?: boolean;
84
114
  }
85
115
 
86
116
  export interface Link {
@@ -97,23 +127,44 @@ export interface Link {
97
127
  loading?: boolean;
98
128
  loaded?: boolean;
99
129
  [propName: string]: any;
130
+ itemBadge?: BadgeSchema;
100
131
  }
101
132
  export interface Links extends Array<Link> {}
102
133
 
103
134
  export interface NavigationState {
104
- links: Links;
135
+ links?: Links;
105
136
  error?: string;
137
+ dropIndicator?: {
138
+ top: number;
139
+ left: number;
140
+ width: number;
141
+ height?: number;
142
+ opacity?: number;
143
+ };
106
144
  }
107
145
 
108
146
  export interface NavigationProps
109
147
  extends ThemeProps,
110
148
  Omit<NavSchema, 'type' | 'className'> {
111
149
  onSelect?: (item: Link) => void | false;
112
- onToggle?: (item: Link) => void;
150
+ onToggle?: (item: Link, forceFold?: boolean) => void;
151
+ onDragUpdate?: (dropInfo: IDropInfo) => void;
113
152
  togglerClassName?: string;
114
153
  links?: Array<Link>;
115
154
  loading?: boolean;
116
- render: RendererProps['render']
155
+ render: RendererProps['render'];
156
+ env: RendererEnv;
157
+ data: Object;
158
+ reload?: any;
159
+ }
160
+
161
+ export interface IDropInfo {
162
+ dragLink: Link | null;
163
+ nodeId: string;
164
+ position: string;
165
+ rect: DOMRect;
166
+ height: number;
167
+ left: number;
117
168
  }
118
169
 
119
170
  export class Navigation extends React.Component<
@@ -124,14 +175,154 @@ export class Navigation extends React.Component<
124
175
  indentSize: 24
125
176
  };
126
177
 
178
+ dragNode: {
179
+ node: HTMLElement;
180
+ link: Link | null;
181
+ } | null;
182
+ dropInfo: IDropInfo | null;
183
+ startPoint: {
184
+ y: number;
185
+ x: number;
186
+ } = {
187
+ y: 0,
188
+ x: 0
189
+ };
190
+ state: NavigationState = {};
191
+
127
192
  @autobind
128
193
  handleClick(link: Link) {
129
194
  this.props.onSelect?.(link);
130
195
  }
131
196
 
132
197
  @autobind
133
- toggleLink(target: Link) {
134
- this.props.onToggle?.(target);
198
+ toggleLink(target: Link, forceFold?: boolean) {
199
+ this.props.onToggle?.(target, forceFold);
200
+ }
201
+
202
+ @autobind
203
+ getDropInfo(e: DragEvent, id: string, depth: number): IDropInfo {
204
+ const {dragOnSameLevel, indentSize} = this.props;
205
+ let rect = (e.target as HTMLElement).getBoundingClientRect();
206
+ const dragLink = this.dragNode?.link as Link;
207
+ const {top, height, width} = rect;
208
+ let {clientY, clientX} = e;
209
+ const left = depth * (parseInt(indentSize as any, 10) ?? 24);
210
+ const deltaX = left + width * .2;
211
+ let position;
212
+ if (clientY >= top + height / 2 ) {
213
+ position = 'bottom';
214
+ } else {
215
+ position = 'top';
216
+ }
217
+ if (!dragOnSameLevel && position === 'bottom' && clientX >= this.startPoint.x + deltaX) {
218
+ position = 'self';
219
+ }
220
+ return {
221
+ nodeId: id,
222
+ dragLink,
223
+ position,
224
+ rect,
225
+ height,
226
+ left
227
+ };
228
+ }
229
+ @autobind
230
+ updateDropIndicator(e: DragEvent) {
231
+ const {dragOnSameLevel} = this.props;
232
+ const target = e.target as HTMLElement; // a标签
233
+ const targetId = target.getAttribute('data-id') as string;
234
+ const targetDepth = Number(target.getAttribute('data-depth'));
235
+ if (dragOnSameLevel
236
+ && this.dragNode?.node.parentElement !== target.parentElement?.parentElement
237
+ ) {
238
+ this.setState({dropIndicator: undefined});
239
+ this.dropInfo = null;
240
+ return;
241
+ }
242
+ this.dropInfo = this.getDropInfo(e, targetId, targetDepth);
243
+ let {position, rect, dragLink, height, left} = this.dropInfo;
244
+ if (targetId === dragLink?.__id) {
245
+ this.setState({dropIndicator: undefined});
246
+ this.dropInfo = null;
247
+ return;
248
+ }
249
+ const ul = (findDOMNode(this) as HTMLElement).firstChild as HTMLElement;
250
+ if (position === 'self') {
251
+ this.setState({
252
+ dropIndicator: {
253
+ top: rect.top - ul.getBoundingClientRect().top,
254
+ left,
255
+ width: ul.getBoundingClientRect().width - left,
256
+ height,
257
+ opacity: .2
258
+ }
259
+ });
260
+ } else {
261
+ this.setState({
262
+ dropIndicator: {
263
+ top: (position === 'bottom' ? rect.top + rect.height : rect.top) - ul.getBoundingClientRect().top,
264
+ left,
265
+ width: ul.getBoundingClientRect().width - left
266
+ }
267
+ });
268
+ }
269
+ }
270
+
271
+ @autobind
272
+ handleDragStart(link: Link) {
273
+ return (e: React.DragEvent) => {
274
+ e.stopPropagation();
275
+ const currentTarget = e.currentTarget as HTMLElement;
276
+ e.dataTransfer.effectAllowed = 'copyMove';
277
+ e.dataTransfer.setDragImage(currentTarget, 0, 0);
278
+ this.dragNode = {
279
+ node: currentTarget,
280
+ link: link
281
+ };
282
+ this.dropInfo = null;
283
+ this.startPoint = {
284
+ x: e.clientX,
285
+ y: e.clientY
286
+ };
287
+ currentTarget.addEventListener('dragend', this.handleDragEnd);
288
+ document.body.addEventListener('dragover', this.handleDragOver);
289
+ };
290
+ }
291
+
292
+ @autobind
293
+ handleDragOver(e: DragEvent) {
294
+ e.preventDefault();
295
+ e.stopPropagation();
296
+ if (!this.dragNode) {
297
+ return;
298
+ }
299
+ const target = e.target as HTMLElement;
300
+ const id = target.getAttribute('data-id');
301
+ if (!id) {
302
+ return;
303
+ }
304
+ this.updateDropIndicator(e);
305
+ }
306
+
307
+ @autobind
308
+ handleDragEnd(e: DragEvent) {
309
+ e.preventDefault();
310
+ e.stopPropagation();
311
+ this.setState({
312
+ dropIndicator: undefined
313
+ });
314
+ const currentTarget = e.currentTarget as HTMLElement;
315
+ const id = currentTarget.getAttribute('data-id');
316
+ let nodeId = this.dropInfo?.nodeId;
317
+ if (!this.dropInfo || !nodeId || id === nodeId) {
318
+ return;
319
+ }
320
+ currentTarget.removeEventListener('dragend', this.handleDragEnd);
321
+ document.body.removeEventListener('dragover', this.handleDragOver);
322
+
323
+ this.props.onDragUpdate?.(this.dropInfo);
324
+ this.dragNode = null;
325
+ this.dropInfo = null;
135
326
  }
136
327
 
137
328
  renderItem(link: Link, index: number, depth = 1) {
@@ -139,72 +330,107 @@ export class Navigation extends React.Component<
139
330
  return null;
140
331
  }
141
332
  const isActive: boolean = !!link.active;
142
- const {disabled, togglerClassName, classnames: cx, indentSize} = this.props;
333
+ const {
334
+ disabled,
335
+ togglerClassName,
336
+ classnames: cx,
337
+ indentSize,
338
+ render,
339
+ itemActions,
340
+ draggable,
341
+ links,
342
+ itemBadge,
343
+ data: defaultData
344
+ } = this.props;
143
345
  const hasSub =
144
346
  (link.defer && !link.loaded) || (link.children && link.children.length);
145
-
146
347
  return (
147
348
  <li
148
- key={index}
349
+ key={link.__id}
350
+ data-id={link.__id}
149
351
  className={cx('Nav-item', link.className, {
150
352
  'is-disabled': disabled || link.disabled || link.loading,
151
353
  'is-active': isActive,
152
354
  'is-unfolded': link.unfolded,
153
355
  'has-sub': hasSub
154
356
  })}
357
+ onDragStart={this.handleDragStart(link)}
155
358
  >
156
- <a
157
- onClick={this.handleClick.bind(this, link)}
158
- style={{paddingLeft: depth * (parseInt(indentSize as any, 10) ?? 24)}}
159
- >
160
- {generateIcon(cx, link.icon, 'Nav-itemIcon')}
359
+ <Badge classnames={cx} badge={itemBadge} data={createObject(defaultData, link)}>
360
+ <a
361
+ data-id={link.__id}
362
+ data-depth={depth}
363
+ onClick={this.handleClick.bind(this, link)}
364
+ style={{paddingLeft: depth * (parseInt(indentSize as any, 10) ?? 24)}}
365
+ >
366
+ {!disabled && draggable && links && links.length > 1 ? (
367
+ <div className={cx('Nav-itemDrager')}
368
+ draggable
369
+ onMouseDown={e => {this.toggleLink(link, true); e.stopPropagation()}}
370
+ >
371
+ <Icon icon="drag-bar" className="icon" />
372
+ </div>
373
+ ) : null}
374
+ {link.loading ? (
375
+ <Spinner
376
+ size="sm"
377
+ show
378
+ icon="reload"
379
+ spinnerClassName={cx('Nav-spinner')}
380
+ />
381
+ ) : hasSub ? (
382
+ <span
383
+ onClick={() => this.toggleLink(link)}
384
+ className={cx('Nav-itemToggler', togglerClassName)}
385
+ >
386
+ <Icon icon="caret" className="icon" />
387
+ </span>
388
+ ) : null}
389
+ {generateIcon(cx, link.icon, 'Nav-itemIcon')}
390
+ {
391
+ link.label && (typeof link.label === 'string'
392
+ ? link.label
393
+ : render('inline', link.label as SchemaCollection))
394
+ }
395
+ </a>
161
396
  {
162
- link.label && (typeof link.label === 'string'
163
- ? link.label
164
- : this.props.render('inline', link.label as SchemaCollection))
397
+ // 更多操作
398
+ itemActions
399
+ ? <div className={cx('Nav-item-atcions')}>
400
+ {
401
+ render('inline', itemActions, {data: createObject(defaultData, link)})
402
+ }
403
+ </div> : null
165
404
  }
166
- </a>
167
-
168
- {link.loading ? (
169
- <Spinner
170
- size="sm"
171
- show
172
- icon="reload"
173
- spinnerClassName={cx('Nav-spinner')}
174
- />
175
- ) : hasSub ? (
176
- <span
177
- onClick={() => this.toggleLink(link)}
178
- className={cx('Nav-itemToggler', togglerClassName)}
179
- >
180
- <Icon icon="caret" className="icon" />
181
- </span>
182
- ) : null}
183
-
184
- {Array.isArray(link.children) && link.children.length ? (
185
- <ul className={cx('Nav-subItems')}>
186
- {link.children.map((link, index) =>
187
- this.renderItem(link, index, depth + 1)
188
- )}
189
- </ul>
190
- ) : null}
405
+ {Array.isArray(link.children) && link.children.length ? (
406
+ <ul className={cx('Nav-subItems')}>
407
+ {link.children.map((link, index) =>
408
+ this.renderItem(link, index, depth + 1)
409
+ )}
410
+ </ul>
411
+ ) : null}
412
+ </Badge>
191
413
  </li>
192
414
  );
193
415
  }
194
416
 
195
417
  render(): JSX.Element {
196
418
  const {className, stacked, classnames: cx, links, loading} = this.props;
197
-
419
+ const {dropIndicator} = this.state;
198
420
  return (
199
- <ul
200
- className={cx('Nav', className, stacked ? 'Nav--stacked' : 'Nav--tabs')}
201
- >
202
- {Array.isArray(links)
203
- ? links.map((item, index) => this.renderItem(item, index))
204
- : null}
205
-
206
- <Spinner show={!!loading} overlay icon="reload" />
207
- </ul>
421
+ <div className={cx('Nav')}>
422
+ <ul className={cx('Nav-list', className, stacked ? 'Nav-list--stacked' : 'Nav-list--tabs')}>
423
+ {Array.isArray(links)
424
+ ? links.map((item, index) => this.renderItem(item, index))
425
+ : null}
426
+
427
+ <Spinner show={!!loading} overlay icon="reload" />
428
+ </ul>
429
+ {(dropIndicator
430
+ ? <div className={cx('Nav-dropIndicator')} style={dropIndicator} />
431
+ : null
432
+ )}
433
+ </div>
208
434
  );
209
435
  }
210
436
  }
@@ -253,7 +479,8 @@ const ConditionBuilderWithRemoteOptions = withRemoteConfig({
253
479
  link.hasOwnProperty('to') &&
254
480
  env &&
255
481
  env.isCurrentUrl(filter(link.to as string, data))
256
- ))
482
+ )),
483
+ __id: guid()
257
484
  };
258
485
 
259
486
  item.unfolded =
@@ -310,12 +537,14 @@ const ConditionBuilderWithRemoteOptions = withRemoteConfig({
310
537
  data?: any;
311
538
  unfoldedField?: string;
312
539
  foldedField?: string;
540
+ reload?: any;
313
541
  }
314
542
  > {
315
543
  constructor(props: any) {
316
544
  super(props);
317
545
  this.toggleLink = this.toggleLink.bind(this);
318
546
  this.handleSelect = this.handleSelect.bind(this);
547
+ this.dragUpdate = this.dragUpdate.bind(this);
319
548
  }
320
549
 
321
550
  componentDidMount() {
@@ -332,7 +561,7 @@ const ConditionBuilderWithRemoteOptions = withRemoteConfig({
332
561
  }
333
562
  }
334
563
 
335
- toggleLink(target: Link) {
564
+ toggleLink(target: Link, forceFold?: boolean) {
336
565
  const {config, updateConfig, deferLoad} = this.props;
337
566
 
338
567
  if (target.defer && !target.loaded) {
@@ -343,7 +572,7 @@ const ConditionBuilderWithRemoteOptions = withRemoteConfig({
343
572
  target === link
344
573
  ? {
345
574
  ...link,
346
- unfolded: !link.unfolded
575
+ unfolded: forceFold ? false : !link.unfolded
347
576
  }
348
577
  : link
349
578
  ),
@@ -352,6 +581,60 @@ const ConditionBuilderWithRemoteOptions = withRemoteConfig({
352
581
  }
353
582
  }
354
583
 
584
+ async dragUpdate(dropInfo: IDropInfo) {
585
+ let links = this.props.config;
586
+ const {nodeId, dragLink, position} = dropInfo;
587
+ if (dragLink) {
588
+ // 删除原节点
589
+ const sourceIdx = findTreeIndex(links, link => link.__id === dragLink.__id) as number[];
590
+ links = spliceTree(links, sourceIdx, 1);
591
+
592
+ if (position === 'self') {
593
+ // 插入到对应节点的children中
594
+ mapTree(links, (link) => {
595
+ if (link.__id === nodeId) {
596
+ if (!link.children) {
597
+ link.children = [];
598
+ }
599
+ link.children.push(dragLink);
600
+ }
601
+ return link;
602
+ })
603
+ } else {
604
+ // 找到需要插入的节点
605
+ const idx = findTreeIndex(links, link => link.__id === nodeId) as number[];
606
+ // 插入节点之后
607
+ if (position === 'bottom') {
608
+ idx.push(idx.pop() as number + 1);
609
+ }
610
+ links = spliceTree(links, idx, 0, dragLink);
611
+ }
612
+ }
613
+ this.props.updateConfig(links, 'update');
614
+ await this.saveOrder(mapTree(links, (link: Link) => {
615
+ // 清除内部加的字段
616
+ for (let key in link) {
617
+ if (/^__.*$/.test(key)) {
618
+ delete link[key];
619
+ }
620
+ }
621
+ return link;
622
+ }));
623
+ }
624
+
625
+ async saveOrder(links: Links) {
626
+ const {saveOrderApi, env, data, reload} = this.props;
627
+ if (saveOrderApi && isEffectiveApi(saveOrderApi)) {
628
+ await env.fetcher(saveOrderApi as SchemaApi,
629
+ createObject(data, {data: links}),
630
+ {method: 'post'}
631
+ );
632
+ reload();
633
+ } else {
634
+ env.alert('NAV saveOrderApi is required!');
635
+ }
636
+ }
637
+
355
638
  handleSelect(link: Link) {
356
639
  const {onSelect, env, data} = this.props;
357
640
  if (onSelect && onSelect(link) === false) {
@@ -372,7 +655,6 @@ const ConditionBuilderWithRemoteOptions = withRemoteConfig({
372
655
 
373
656
  render() {
374
657
  const {loading, config, deferLoad, updateConfig, ...rest} = this.props;
375
-
376
658
  return (
377
659
  <ThemedNavigation
378
660
  {...rest}
@@ -381,6 +663,7 @@ const ConditionBuilderWithRemoteOptions = withRemoteConfig({
381
663
  disabled={loading}
382
664
  onSelect={this.handleSelect}
383
665
  onToggle={this.toggleLink}
666
+ onDragUpdate={this.dragUpdate}
384
667
  />
385
668
  );
386
669
  }
@@ -442,6 +725,7 @@ export class NavigationRenderer extends React.Component<RendererProps> {
442
725
  return (
443
726
  <ConditionBuilderWithRemoteOptions
444
727
  {...rest}
728
+ reload={this.reload}
445
729
  remoteConfigRef={this.remoteConfigRef}
446
730
  />
447
731
  );
@@ -371,6 +371,8 @@ export default class Page extends React.Component<PageProps> {
371
371
  JSON.stringify(props.cssVars) !== JSON.stringify(prevProps.cssVars)
372
372
  ) {
373
373
  this.updateVarStyle();
374
+ } else if (props.defaultData !== prevProps.defaultData) {
375
+ store.reInitData(props.defaultData);
374
376
  }
375
377
  }
376
378
 
@@ -663,7 +665,7 @@ export default class Page extends React.Component<PageProps> {
663
665
  onAction: this.handleAction,
664
666
  onQuery: initApi ? this.handleQuery : undefined,
665
667
  onChange: this.handleChange,
666
- loading: store.loading
668
+ pageLoading: store.loading
667
669
  };
668
670
 
669
671
  const hasAside = Array.isArray(regions)