amis 1.3.5-beta.3 → 1.4.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 (280) hide show
  1. package/lib/components/Badge.d.ts +15 -2
  2. package/lib/components/Badge.js +47 -4
  3. package/lib/components/Badge.js.map +2 -2
  4. package/lib/components/Button.d.ts +24 -22
  5. package/lib/components/Button.js +13 -7
  6. package/lib/components/Button.js.map +2 -2
  7. package/lib/components/Checkbox.d.ts +1 -1
  8. package/lib/components/Checkbox.js +1 -1
  9. package/lib/components/Checkbox.js.map +2 -2
  10. package/lib/components/Drawer.js +1 -1
  11. package/lib/components/Drawer.js.map +2 -2
  12. package/lib/components/Modal.js +1 -1
  13. package/lib/components/Modal.js.map +2 -2
  14. package/lib/components/RichText.d.ts +6 -4
  15. package/lib/components/RichText.js +241 -27
  16. package/lib/components/RichText.js.map +2 -2
  17. package/lib/components/Select.d.ts +7 -0
  18. package/lib/components/Select.js.map +2 -2
  19. package/lib/components/Steps.d.ts +3 -3
  20. package/lib/components/Steps.js.map +1 -1
  21. package/lib/components/WithRemoteConfig.d.ts +8 -0
  22. package/lib/components/WithRemoteConfig.js +28 -2
  23. package/lib/components/WithRemoteConfig.js.map +2 -2
  24. package/lib/components/calendar/DaysView.js +2 -2
  25. package/lib/components/calendar/DaysView.js.map +2 -2
  26. package/lib/components/condition-builder/Field.js +0 -1
  27. package/lib/components/condition-builder/Field.js.map +2 -2
  28. package/lib/components/condition-builder/Value.js +2 -1
  29. package/lib/components/condition-builder/Value.js.map +2 -2
  30. package/lib/components/condition-builder/types.d.ts +5 -0
  31. package/lib/components/condition-builder/types.js.map +1 -1
  32. package/lib/components/icons.js +2 -0
  33. package/lib/components/icons.js.map +2 -2
  34. package/lib/factory.d.ts +5 -1
  35. package/lib/factory.js +9 -4
  36. package/lib/factory.js.map +2 -2
  37. package/lib/helper.css.map +1 -1
  38. package/lib/icons/loading-outline.js +7 -0
  39. package/lib/index.d.ts +1 -0
  40. package/lib/index.js +2 -1
  41. package/lib/index.js.map +2 -2
  42. package/lib/locale/de-DE.js +1 -0
  43. package/lib/locale/de-DE.js.map +2 -2
  44. package/lib/locale/en-US.js +2 -1
  45. package/lib/locale/en-US.js.map +2 -2
  46. package/lib/locale/zh-CN.js +2 -1
  47. package/lib/locale/zh-CN.js.map +2 -2
  48. package/lib/renderers/Action.d.ts +15 -1
  49. package/lib/renderers/Action.js +13 -6
  50. package/lib/renderers/Action.js.map +2 -2
  51. package/lib/renderers/CRUD.d.ts +2 -2
  52. package/lib/renderers/CRUD.js +11 -20
  53. package/lib/renderers/CRUD.js.map +2 -2
  54. package/lib/renderers/Card.js +11 -11
  55. package/lib/renderers/Card.js.map +2 -2
  56. package/lib/renderers/Collapse.d.ts +1 -1
  57. package/lib/renderers/Collapse.js +5 -1
  58. package/lib/renderers/Collapse.js.map +2 -2
  59. package/lib/renderers/Dialog.d.ts +0 -252
  60. package/lib/renderers/Dialog.js +3 -2
  61. package/lib/renderers/Dialog.js.map +2 -2
  62. package/lib/renderers/Drawer.js +2 -1
  63. package/lib/renderers/Drawer.js.map +2 -2
  64. package/lib/renderers/DropDownButton.d.ts +8 -0
  65. package/lib/renderers/DropDownButton.js +6 -4
  66. package/lib/renderers/DropDownButton.js.map +2 -2
  67. package/lib/renderers/Form/ButtonGroupSelect.js +3 -0
  68. package/lib/renderers/Form/ButtonGroupSelect.js.map +2 -2
  69. package/lib/renderers/Form/Combo.d.ts +2 -0
  70. package/lib/renderers/Form/Combo.js +16 -1
  71. package/lib/renderers/Form/Combo.js.map +2 -2
  72. package/lib/renderers/Form/DiffEditor.d.ts +0 -2
  73. package/lib/renderers/Form/Editor.d.ts +0 -2
  74. package/lib/renderers/Form/Editor.js +1 -1
  75. package/lib/renderers/Form/Editor.js.map +2 -2
  76. package/lib/renderers/Form/InputExcel.d.ts +5 -0
  77. package/lib/renderers/Form/InputExcel.js +24 -3
  78. package/lib/renderers/Form/InputExcel.js.map +2 -2
  79. package/lib/renderers/Form/InputImage.d.ts +8 -0
  80. package/lib/renderers/Form/InputImage.js +2 -1
  81. package/lib/renderers/Form/InputImage.js.map +2 -2
  82. package/lib/renderers/Form/InputNumber.d.ts +19 -5
  83. package/lib/renderers/Form/InputNumber.js +69 -7
  84. package/lib/renderers/Form/InputNumber.js.map +2 -2
  85. package/lib/renderers/Form/InputRange.js +7 -2
  86. package/lib/renderers/Form/InputRange.js.map +2 -2
  87. package/lib/renderers/Form/InputTable.d.ts +23 -5
  88. package/lib/renderers/Form/InputTable.js +32 -3
  89. package/lib/renderers/Form/InputTable.js.map +2 -2
  90. package/lib/renderers/Form/Options.js +3 -1
  91. package/lib/renderers/Form/Options.js.map +2 -2
  92. package/lib/renderers/Form/index.js +0 -10
  93. package/lib/renderers/Form/index.js.map +2 -2
  94. package/lib/renderers/Form/wrapControl.js +3 -3
  95. package/lib/renderers/Form/wrapControl.js.map +2 -2
  96. package/lib/renderers/Json.js +5 -1
  97. package/lib/renderers/Json.js.map +2 -2
  98. package/lib/renderers/List.d.ts +5 -0
  99. package/lib/renderers/List.js +20 -14
  100. package/lib/renderers/List.js.map +2 -2
  101. package/lib/renderers/Nav.d.ts +52 -22
  102. package/lib/renderers/Nav.js +100 -15
  103. package/lib/renderers/Nav.js.map +2 -2
  104. package/lib/renderers/Page.d.ts +6 -0
  105. package/lib/renderers/Page.js +11 -3
  106. package/lib/renderers/Page.js.map +2 -2
  107. package/lib/renderers/Service.d.ts +10 -1
  108. package/lib/renderers/Service.js +85 -3
  109. package/lib/renderers/Service.js.map +2 -2
  110. package/lib/renderers/Steps.d.ts +4 -4
  111. package/lib/renderers/Steps.js +5 -2
  112. package/lib/renderers/Steps.js.map +2 -2
  113. package/lib/renderers/Table/TableBody.d.ts +5 -3
  114. package/lib/renderers/Table/TableBody.js +17 -11
  115. package/lib/renderers/Table/TableBody.js.map +2 -2
  116. package/lib/renderers/Table/TableCell.js +6 -2
  117. package/lib/renderers/Table/TableCell.js.map +2 -2
  118. package/lib/renderers/Table/TableContent.d.ts +3 -1
  119. package/lib/renderers/Table/TableContent.js +6 -2
  120. package/lib/renderers/Table/TableContent.js.map +2 -2
  121. package/lib/renderers/Table/TableRow.d.ts +1 -1
  122. package/lib/renderers/Table/TableRow.js +14 -13
  123. package/lib/renderers/Table/TableRow.js.map +2 -2
  124. package/lib/renderers/Table/index.d.ts +28 -3
  125. package/lib/renderers/Table/index.js +92 -52
  126. package/lib/renderers/Table/index.js.map +2 -2
  127. package/lib/schemaExtend.d.ts +1 -0
  128. package/lib/schemaExtend.js +59 -0
  129. package/lib/schemaExtend.js.map +13 -0
  130. package/lib/store/app.d.ts +0 -1
  131. package/lib/store/combo.d.ts +0 -2
  132. package/lib/store/crud.d.ts +3 -3
  133. package/lib/store/crud.js +41 -36
  134. package/lib/store/crud.js.map +2 -2
  135. package/lib/store/form.d.ts +0 -1
  136. package/lib/store/formItem.js +10 -6
  137. package/lib/store/formItem.js.map +2 -2
  138. package/lib/store/modal.d.ts +1 -1
  139. package/lib/store/modal.js +4 -0
  140. package/lib/store/modal.js.map +2 -2
  141. package/lib/store/root.d.ts +0 -1
  142. package/lib/store/service.d.ts +0 -1
  143. package/lib/store/service.js +0 -13
  144. package/lib/store/service.js.map +2 -2
  145. package/lib/store/table.d.ts +1 -2
  146. package/lib/store/table.js +44 -3
  147. package/lib/store/table.js.map +2 -2
  148. package/lib/themes/ang-ie11.css +624 -71
  149. package/lib/themes/ang.css +624 -71
  150. package/lib/themes/ang.css.map +1 -1
  151. package/lib/themes/antd-ie11.css +624 -71
  152. package/lib/themes/antd.css +624 -71
  153. package/lib/themes/antd.css.map +1 -1
  154. package/lib/themes/cxd-ie11.css +732 -191
  155. package/lib/themes/cxd.css +732 -191
  156. package/lib/themes/cxd.css.map +1 -1
  157. package/lib/themes/dark-ie11.css +624 -71
  158. package/lib/themes/dark.css +624 -71
  159. package/lib/themes/dark.css.map +1 -1
  160. package/lib/themes/default.css +732 -191
  161. package/lib/themes/default.css.map +1 -1
  162. package/lib/utils/api.js +12 -0
  163. package/lib/utils/api.js.map +2 -2
  164. package/lib/utils/attachmentAdpator.d.ts +7 -0
  165. package/lib/utils/attachmentAdpator.js +82 -0
  166. package/lib/utils/attachmentAdpator.js.map +13 -0
  167. package/lib/utils/helper.d.ts +2 -0
  168. package/lib/utils/helper.js +14 -1
  169. package/lib/utils/helper.js.map +2 -2
  170. package/lib/utils/resize-sensor.js +6 -0
  171. package/lib/utils/resize-sensor.js.map +2 -2
  172. package/lib/utils/tpl-builtin.d.ts +1 -0
  173. package/lib/utils/tpl-builtin.js +24 -8
  174. package/lib/utils/tpl-builtin.js.map +2 -2
  175. package/lib/utils/validations.js +62 -5
  176. package/lib/utils/validations.js.map +2 -2
  177. package/package.json +1 -2
  178. package/schema.json +561 -171
  179. package/scss/_mixins.scss +29 -0
  180. package/scss/_properties.scss +29 -11
  181. package/scss/components/_badge.scss +67 -2
  182. package/scss/components/_button.scss +35 -3
  183. package/scss/components/_image-gallery.scss +1 -1
  184. package/scss/components/_list.scss +8 -0
  185. package/scss/components/_markdown.scss +266 -0
  186. package/scss/components/_nav.scss +109 -35
  187. package/scss/components/_spinner.scss +6 -2
  188. package/scss/components/_table.scss +4 -0
  189. package/scss/components/form/_form.scss +3 -17
  190. package/scss/components/form/_group.scss +4 -0
  191. package/scss/components/form/_number.scss +12 -1
  192. package/scss/themes/_common.scss +1 -0
  193. package/scss/themes/_cxd-variables.scss +20 -20
  194. package/sdk/ang-ie11.css +769 -76
  195. package/sdk/ang.css +785 -76
  196. package/sdk/antd-ie11.css +759 -68
  197. package/sdk/antd.css +785 -76
  198. package/sdk/charts.js +13 -13
  199. package/sdk/color-picker.js +67 -67
  200. package/sdk/cropperjs.js +2 -2
  201. package/sdk/cxd-ie11.css +1243 -552
  202. package/sdk/cxd.css +893 -196
  203. package/sdk/dark-ie11.css +769 -76
  204. package/sdk/dark.css +785 -76
  205. package/sdk/exceljs.js +1 -1
  206. package/sdk/helper.css.map +1 -1
  207. package/sdk/locale/de-DE.js +1 -0
  208. package/sdk/markdown.js +69 -69
  209. package/sdk/papaparse.js +1 -1
  210. package/sdk/renderers/Form/CityDB.js +1 -1
  211. package/sdk/rest.js +22 -24
  212. package/sdk/rich-text.js +62 -64
  213. package/sdk/sdk-ie11.css +1243 -552
  214. package/sdk/sdk.css +893 -196
  215. package/sdk/sdk.js +1123 -1111
  216. package/sdk/thirds/hls.js/hls.js +1 -1
  217. package/sdk/thirds/mpegts.js/mpegts.js +1 -1
  218. package/sdk/tinymce.js +57 -57
  219. package/sdk.zip +0 -0
  220. package/src/components/Badge.tsx +111 -20
  221. package/src/components/Button.tsx +23 -7
  222. package/src/components/Checkbox.tsx +5 -2
  223. package/src/components/Drawer.tsx +3 -2
  224. package/src/components/Modal.tsx +3 -2
  225. package/src/components/RichText.tsx +280 -24
  226. package/src/components/Select.tsx +1 -0
  227. package/src/components/Steps.tsx +3 -3
  228. package/src/components/WithRemoteConfig.tsx +37 -2
  229. package/src/components/calendar/DaysView.tsx +2 -2
  230. package/src/components/condition-builder/Field.tsx +1 -2
  231. package/src/components/condition-builder/Value.tsx +3 -0
  232. package/src/components/condition-builder/types.ts +6 -0
  233. package/src/components/icons.tsx +2 -0
  234. package/src/factory.tsx +13 -3
  235. package/src/icons/loading-outline.svg +4 -0
  236. package/src/index.tsx +2 -0
  237. package/src/locale/de-DE.ts +1 -0
  238. package/src/locale/en-US.ts +2 -1
  239. package/src/locale/zh-CN.ts +2 -1
  240. package/src/renderers/Action.tsx +84 -14
  241. package/src/renderers/CRUD.tsx +13 -33
  242. package/src/renderers/Card.tsx +21 -15
  243. package/src/renderers/Collapse.tsx +5 -1
  244. package/src/renderers/Dialog.tsx +3 -2
  245. package/src/renderers/Drawer.tsx +2 -1
  246. package/src/renderers/DropDownButton.tsx +21 -4
  247. package/src/renderers/Form/ButtonGroupSelect.tsx +3 -0
  248. package/src/renderers/Form/Combo.tsx +7 -0
  249. package/src/renderers/Form/Editor.tsx +19 -20
  250. package/src/renderers/Form/InputExcel.tsx +28 -3
  251. package/src/renderers/Form/InputImage.tsx +23 -8
  252. package/src/renderers/Form/InputNumber.tsx +113 -18
  253. package/src/renderers/Form/InputRange.tsx +5 -2
  254. package/src/renderers/Form/InputTable.tsx +88 -9
  255. package/src/renderers/Form/Options.tsx +3 -1
  256. package/src/renderers/Form/index.tsx +0 -15
  257. package/src/renderers/Form/wrapControl.tsx +2 -2
  258. package/src/renderers/Json.tsx +10 -1
  259. package/src/renderers/List.tsx +32 -19
  260. package/src/renderers/Nav.tsx +165 -36
  261. package/src/renderers/Page.tsx +20 -1
  262. package/src/renderers/Service.tsx +101 -3
  263. package/src/renderers/Steps.tsx +12 -9
  264. package/src/renderers/Table/TableBody.tsx +29 -10
  265. package/src/renderers/Table/TableCell.tsx +15 -1
  266. package/src/renderers/Table/TableContent.tsx +7 -1
  267. package/src/renderers/Table/TableRow.tsx +18 -17
  268. package/src/renderers/Table/index.tsx +112 -27
  269. package/src/schemaExtend.ts +66 -0
  270. package/src/store/crud.ts +34 -38
  271. package/src/store/formItem.ts +10 -6
  272. package/src/store/modal.ts +4 -0
  273. package/src/store/service.ts +0 -19
  274. package/src/store/table.ts +48 -0
  275. package/src/utils/api.ts +11 -0
  276. package/src/utils/attachmentAdpator.ts +90 -0
  277. package/src/utils/helper.ts +16 -0
  278. package/src/utils/resize-sensor.ts +7 -0
  279. package/src/utils/tpl-builtin.ts +36 -17
  280. package/src/utils/validations.ts +80 -12
package/sdk.zip ADDED
Binary file
@@ -17,7 +17,7 @@ export interface BadgeSchema extends BaseSchema {
17
17
  /**
18
18
  * 文本内容
19
19
  */
20
- text?: string;
20
+ text?: string | number;
21
21
 
22
22
  /**
23
23
  * 大小
@@ -27,13 +27,23 @@ export interface BadgeSchema extends BaseSchema {
27
27
  /**
28
28
  * 角标类型
29
29
  */
30
- mode?: 'text' | 'dot';
30
+ mode?: 'text' | 'dot' | 'ribbon';
31
+
32
+ /**
33
+ * 角标位置,优先级大于position
34
+ */
35
+ offset?: [number | string, number | string];
31
36
 
32
37
  /**
33
38
  * 角标位置
34
39
  */
35
40
  position?: 'top-right' | 'top-left' | 'bottom-right' | 'bottom-left';
36
41
 
42
+ /**
43
+ * 封顶的数字值
44
+ */
45
+ overflowCount?: number;
46
+
37
47
  /**
38
48
  * 动态控制是否显示
39
49
  */
@@ -50,6 +60,11 @@ export interface BadgeSchema extends BaseSchema {
50
60
  style?: {
51
61
  [propName: string]: any;
52
62
  };
63
+
64
+ /**
65
+ * 提示类型
66
+ */
67
+ level?: 'info' | 'warning' | 'success' | 'danger';
53
68
  }
54
69
 
55
70
  export interface BadgeProps {
@@ -65,6 +80,62 @@ export class Badge extends React.Component<BadgeProps, object> {
65
80
  super(props);
66
81
  }
67
82
 
83
+ renderBadge(
84
+ text: any,
85
+ size: number,
86
+ position: any,
87
+ offsetStyle: any,
88
+ sizeStyle: any,
89
+ animationElement: any
90
+ ) {
91
+ const {classnames: cx, badge} = this.props;
92
+ const {
93
+ mode = 'dot',
94
+ level = 'danger',
95
+ style
96
+ } = badge as BadgeSchema;
97
+ switch(mode) {
98
+ case 'dot':
99
+ return (
100
+ <span
101
+ className={cx('Badge-dot', `Badge--${position}`, `Badge--${level}`)}
102
+ style={{...offsetStyle, ...sizeStyle, ...style}}
103
+ >
104
+ {animationElement}
105
+ </span>
106
+ );
107
+ case 'text':
108
+ return (
109
+ <span
110
+ className={cx('Badge-text', `Badge--${position}`, `Badge--${level}`)}
111
+ style={{...offsetStyle, ...sizeStyle, ...style}}
112
+ >
113
+ {text}
114
+ {animationElement}
115
+ </span>
116
+ );
117
+ case 'ribbon':
118
+ const outSize = size * Math.sqrt(2) + 5;
119
+ return (
120
+ <div
121
+ className={cx('Badge-ribbon-out', `Badge-ribbon-out--${position}`)}
122
+ style={{width: outSize, height: outSize}}
123
+ >
124
+ <span
125
+ className={cx('Badge-ribbon', `Badge-ribbon--${position}`, `Badge--${level}`)}
126
+ style={{...sizeStyle, ...style}}
127
+ >
128
+ {text}
129
+ {animationElement}
130
+ </span>
131
+ </div>
132
+
133
+ );
134
+ default:
135
+ return null;
136
+ }
137
+ }
138
+
68
139
  render() {
69
140
  const badge = this.props.badge;
70
141
  if (!badge) {
@@ -81,7 +152,9 @@ export class Badge extends React.Component<BadgeProps, object> {
81
152
  text,
82
153
  size,
83
154
  style,
155
+ offset,
84
156
  position = 'top-right',
157
+ overflowCount = 99,
85
158
  visibleOn,
86
159
  className,
87
160
  animation
@@ -99,6 +172,8 @@ export class Badge extends React.Component<BadgeProps, object> {
99
172
  if (typeof size === 'undefined') {
100
173
  if (mode === 'dot') {
101
174
  size = 6;
175
+ } else if (mode === 'ribbon'){
176
+ size = 12;
102
177
  } else {
103
178
  size = 16;
104
179
  }
@@ -111,6 +186,12 @@ export class Badge extends React.Component<BadgeProps, object> {
111
186
  height: size,
112
187
  lineHeight: size + 'px'
113
188
  };
189
+ // 当text、overflowCount都为number类型时,进行封顶值处理
190
+ if (typeof text === 'number' && typeof overflowCount === 'number') {
191
+ text = (
192
+ (text as number) > (overflowCount as number) ? `${overflowCount}+` : text
193
+ ) as string | number;
194
+ }
114
195
 
115
196
  if (!text) {
116
197
  isDisplay = false;
@@ -121,6 +202,25 @@ export class Badge extends React.Component<BadgeProps, object> {
121
202
  sizeStyle = {width: size, height: size};
122
203
  }
123
204
 
205
+ if (mode === 'ribbon') {
206
+ sizeStyle = {
207
+ height: size,
208
+ lineHeight: size + 'px',
209
+ fontSize: size
210
+ };
211
+ }
212
+
213
+ let offsetStyle = {};
214
+ // 如果设置了offset属性,offset在position为'top-right'的基础上进行translate定位
215
+ if (offset && offset.length) {
216
+ position = 'top-right';
217
+ const left = `calc(50% + ${parseInt(offset[0] as string, 10)}px)`;
218
+ const right = `calc(-50% + ${parseInt(offset[1] as string, 10)}px)`;
219
+ offsetStyle = {
220
+ transform: `translate(${left}, ${right})`,
221
+ };
222
+ }
223
+
124
224
  let animationBackground = 'var(--danger)';
125
225
 
126
226
  if (style && style.background) {
@@ -145,24 +245,15 @@ export class Badge extends React.Component<BadgeProps, object> {
145
245
  return (
146
246
  <div className={cx('Badge', className)}>
147
247
  {children}
148
- {isDisplay ? (
149
- mode === 'dot' ? (
150
- <span
151
- className={cx('Badge-dot', `Badge--${position}`)}
152
- style={{...sizeStyle, ...style}}
153
- >
154
- {animationElement}
155
- </span>
156
- ) : (
157
- <span
158
- className={cx('Badge-text', `Badge--${position}`)}
159
- style={{...sizeStyle, ...style}}
160
- >
161
- {text}
162
- {animationElement}
163
- </span>
164
- )
165
- ) : null}
248
+ {isDisplay ?
249
+ this.renderBadge(
250
+ text,
251
+ size,
252
+ position,
253
+ offsetStyle,
254
+ sizeStyle,
255
+ animationElement
256
+ ) : null}
166
257
  </div>
167
258
  );
168
259
  }
@@ -7,7 +7,7 @@ import React from 'react';
7
7
  import TooltipWrapper, {TooltipObject, Trigger} from './TooltipWrapper';
8
8
  import {pickEventsProps} from '../utils/helper';
9
9
  import {ClassNamesFn, themeable} from '../theme';
10
-
10
+ import {Icon} from './icons';
11
11
  interface ButtonProps extends React.DOMAttributes<HTMLButtonElement> {
12
12
  id?: string;
13
13
  className?: string;
@@ -16,7 +16,7 @@ interface ButtonProps extends React.DOMAttributes<HTMLButtonElement> {
16
16
  type: 'button' | 'reset' | 'submit';
17
17
  level: string; // 'link' | 'primary' | 'secondary' | 'info' | 'success' | 'warning' | 'danger' | 'light' | 'dark' | 'default';
18
18
  tooltip?: string | TooltipObject;
19
- placement: 'top' | 'right' | 'bottom' | 'left';
19
+ tooltipPlacement: 'top' | 'right' | 'bottom' | 'left';
20
20
  tooltipContainer?: any;
21
21
  tooltipTrigger: Trigger | Array<Trigger>;
22
22
  tooltipRootClose: boolean;
@@ -29,6 +29,8 @@ interface ButtonProps extends React.DOMAttributes<HTMLButtonElement> {
29
29
  classnames: ClassNamesFn;
30
30
  componentClass: React.ReactType;
31
31
  overrideClassName?: boolean;
32
+ loading?: boolean;
33
+ loadingClassName?: string;
32
34
  }
33
35
 
34
36
  export class Button extends React.Component<ButtonProps> {
@@ -37,14 +39,14 @@ export class Button extends React.Component<ButtonProps> {
37
39
  | 'componentClass'
38
40
  | 'level'
39
41
  | 'type'
40
- | 'placement'
42
+ | 'tooltipPlacement'
41
43
  | 'tooltipTrigger'
42
44
  | 'tooltipRootClose'
43
45
  > = {
44
46
  componentClass: 'button',
45
47
  level: 'default',
46
48
  type: 'button',
47
- placement: 'top',
49
+ tooltipPlacement: 'top',
48
50
  tooltipTrigger: ['hover', 'focus'],
49
51
  tooltipRootClose: false
50
52
  };
@@ -64,13 +66,15 @@ export class Button extends React.Component<ButtonProps> {
64
66
  active,
65
67
  iconOnly,
66
68
  href,
69
+ loading,
70
+ loadingClassName,
67
71
  overrideClassName,
68
72
  ...rest
69
73
  } = this.props;
70
74
 
71
75
  if (href) {
72
76
  Comp = 'a';
73
- } else if (Comp === 'button' && disabled) {
77
+ } else if ((Comp === 'button' && disabled) || loading) {
74
78
  Comp = 'div';
75
79
  }
76
80
 
@@ -95,6 +99,18 @@ export class Button extends React.Component<ButtonProps> {
95
99
  )}
96
100
  disabled={disabled}
97
101
  >
102
+ {loading && !disabled ? (
103
+ <span
104
+ className={cx(
105
+ overrideClassName
106
+ ? ''
107
+ : {[`Button--loading Button--loading--${level}`]: level},
108
+ loadingClassName
109
+ )}
110
+ >
111
+ <Icon icon="loading-outline" className="icon" />
112
+ </span>
113
+ ) : null}
98
114
  {children}
99
115
  </Comp>
100
116
  );
@@ -103,7 +119,7 @@ export class Button extends React.Component<ButtonProps> {
103
119
  render() {
104
120
  const {
105
121
  tooltip,
106
- placement,
122
+ tooltipPlacement,
107
123
  tooltipContainer,
108
124
  tooltipTrigger,
109
125
  tooltipRootClose,
@@ -114,7 +130,7 @@ export class Button extends React.Component<ButtonProps> {
114
130
 
115
131
  return (
116
132
  <TooltipWrapper
117
- placement={placement}
133
+ placement={tooltipPlacement}
118
134
  tooltip={disabled ? disabledTip : tooltip}
119
135
  container={tooltipContainer}
120
136
  trigger={tooltipTrigger}
@@ -15,7 +15,7 @@ interface CheckboxProps {
15
15
  label?: string;
16
16
  labelClassName?: string;
17
17
  className?: string;
18
- onChange?: (value: any) => void;
18
+ onChange?: (value: any, shift?: boolean) => void;
19
19
  value?: any;
20
20
  inline?: boolean;
21
21
  trueValue?: any;
@@ -48,7 +48,10 @@ export class Checkbox extends React.Component<CheckboxProps, any> {
48
48
  return;
49
49
  }
50
50
 
51
- onChange(e.currentTarget.checked ? trueValue : falseValue);
51
+ onChange(
52
+ e.currentTarget.checked ? trueValue : falseValue,
53
+ (e.nativeEvent as MouseEvent).shiftKey
54
+ );
52
55
  }
53
56
 
54
57
  render() {
@@ -8,7 +8,8 @@ import React from 'react';
8
8
  import Transition, {
9
9
  ENTERED,
10
10
  ENTERING,
11
- EXITING
11
+ EXITING,
12
+ EXITED
12
13
  } from 'react-transition-group/Transition';
13
14
  import Portal from 'react-overlays/Portal';
14
15
  import {Icon} from './icons';
@@ -230,7 +231,7 @@ export class Drawer extends React.Component<DrawerProps, DrawerState> {
230
231
  >
231
232
  <Icon icon="close" className="icon" />
232
233
  </a>
233
- {children}
234
+ {status === EXITED ? null : children}
234
235
  </div>
235
236
  </div>
236
237
  );
@@ -8,7 +8,8 @@ import React from 'react';
8
8
  import Transition, {
9
9
  ENTERED,
10
10
  ENTERING,
11
- EXITING
11
+ EXITING,
12
+ EXITED
12
13
  } from 'react-transition-group/Transition';
13
14
  import Portal from 'react-overlays/Portal';
14
15
  import {current, addModal, removeModal} from './ModalManager';
@@ -264,7 +265,7 @@ export class Modal extends React.Component<ModalProps, ModalState> {
264
265
  fadeStyles[status]
265
266
  )}
266
267
  >
267
- {children}
268
+ {status === EXITED ? null : children}
268
269
  </div>
269
270
  </div>
270
271
  </Portal>
@@ -7,7 +7,7 @@
7
7
  import React from 'react';
8
8
 
9
9
  // @ts-ignore
10
- import FroalaEditorComponent from 'react-froala-wysiwyg';
10
+ import FroalaEditor from 'froala-editor';
11
11
  // @ts-ignore
12
12
  import Froala from 'froala-editor/js/froala_editor.min.js';
13
13
  import 'froala-editor/js/plugins/align.min';
@@ -45,51 +45,307 @@ import 'froala-editor/js/languages/zh_cn.js';
45
45
  import 'froala-editor/css/froala_style.min.css';
46
46
  import 'froala-editor/css/froala_editor.pkgd.min.css';
47
47
 
48
- export default class FroalaEditor extends React.Component<any, any> {
49
- oldModel: any = null;
48
+ export interface FroalaEditorComponentProps {
49
+ config: any;
50
+ model: string;
51
+ onModelChange: (value: string) => void;
52
+ }
50
53
 
51
- constructor(props: any) {
54
+ // 代码来源于:https://github.com/froala/react-froala-wysiwyg/blob/master/lib/FroalaEditorFunctionality.jsx
55
+ // 改动原因是model 同步有些问题,有时候不更新,所以基于官方代码改造一下。
56
+ // 目前发现的问题是,如果 model 数据修改,如果此时 editor 还没有初始化完成则不会同步成功
57
+ class FroalaEditorComponent extends React.Component<FroalaEditorComponentProps> {
58
+ listeningEvents: any;
59
+ element: any;
60
+ editor: any;
61
+ config: any;
62
+ editorInitialized: any;
63
+ INNER_HTML_ATTR: any;
64
+ hasSpecialTag: any;
65
+ oldModel: any;
66
+ el: any;
67
+ _initEvents: any;
68
+
69
+ constructor(props: FroalaEditorComponentProps) {
52
70
  super(props);
53
- Froala.VIDEO_PROVIDERS = [
54
- {
55
- test_regex: /.*/,
56
- url_regex: '',
57
- url_text: '',
58
- html: '<span class="fr-video fr-dvb fr-draggable" contenteditable="false" draggable="true"><video class="fr-draggable" controls="" data-msg="ok" data-status="0" src="{url}" style="width: 600px;"></video></span>'
59
- }
60
- ];
61
71
 
62
- this.state = {
63
- model: this.props.model
72
+ this.listeningEvents = [];
73
+ this.element = null;
74
+ this.editor = null;
75
+ this.config = {
76
+ immediateReactModelUpdate: false,
77
+ reactIgnoreAttrs: null
64
78
  };
65
- this.handleModelChange = this.handleModelChange.bind(this);
79
+
80
+ this.editorInitialized = false;
81
+ this.INNER_HTML_ATTR = 'innerHTML';
82
+
83
+ this.oldModel = null;
84
+ }
85
+
86
+ // After first time render.
87
+ componentDidMount() {
88
+ this.createEditor();
89
+ }
90
+
91
+ componentWillUnmount() {
92
+ this.destroyEditor();
66
93
  }
67
94
 
68
95
  componentDidUpdate() {
69
96
  if (JSON.stringify(this.oldModel) == JSON.stringify(this.props.model)) {
70
97
  return;
71
98
  }
72
- this.handleModelChange(this.props.model);
99
+
100
+ this.setContent();
101
+ }
102
+
103
+ // Return cloned object
104
+ clone(item: any) {
105
+ const me = this;
106
+ if (!item) {
107
+ return item;
108
+ } // null, undefined values check
109
+
110
+ let types = [Number, String, Boolean],
111
+ result: any;
112
+
113
+ // normalizing primitives if someone did new String('aaa'), or new Number('444');
114
+ types.forEach(function (type) {
115
+ if (item instanceof type) {
116
+ result = type(item);
117
+ }
118
+ });
119
+
120
+ if (typeof result == 'undefined') {
121
+ if (Object.prototype.toString.call(item) === '[object Array]') {
122
+ result = [];
123
+ item.forEach(function (child: any, index: number, array: Array<any>) {
124
+ result[index] = me.clone(child);
125
+ });
126
+ } else if (typeof item == 'object') {
127
+ // testing that this is DOM
128
+ if (item.nodeType && typeof item.cloneNode == 'function') {
129
+ result = item.cloneNode(true);
130
+ } else if (!item.prototype) {
131
+ // check that this is a literal
132
+ if (item instanceof Date) {
133
+ result = new Date(item);
134
+ } else {
135
+ // it is an object literal
136
+ result = {};
137
+ for (var i in item) {
138
+ result[i] = me.clone(item[i]);
139
+ }
140
+ }
141
+ } else {
142
+ if (false && item.constructor) {
143
+ result = new item.constructor();
144
+ } else {
145
+ result = item;
146
+ }
147
+ }
148
+ } else {
149
+ result = item;
150
+ }
151
+ }
152
+ return result;
153
+ }
154
+
155
+ createEditor() {
156
+ if (this.editorInitialized) {
157
+ return;
158
+ }
159
+
160
+ this.config = this.clone(this.props.config || this.config);
161
+ this.config = {...this.config};
162
+
163
+ this.element = this.el;
164
+
165
+ if (this.props.model) {
166
+ this.element.innerHTML = this.props.model;
167
+ }
168
+
169
+ this.setContent(true);
170
+
171
+ // Default initialized.
172
+ this.registerEvent(
173
+ 'initialized',
174
+ this.config.events && this.config.events.initialized
175
+ );
176
+
177
+ // Check if events are set.
178
+ if (!this.config.events) this.config.events = {};
179
+ this.config.events.initialized = () => this.initListeners();
180
+
181
+ this.editor = new FroalaEditor(this.element, this.config);
182
+ }
183
+
184
+ setContent(firstTime?: boolean) {
185
+ if (this.props.model || this.props.model == '') {
186
+ this.oldModel = this.props.model;
187
+
188
+ if (this.editorInitialized) {
189
+ this.setNormalTagContent(firstTime);
190
+ } else {
191
+ if (!this._initEvents) this._initEvents = [];
192
+ this._initEvents.push(() => this.setNormalTagContent());
193
+ }
194
+ }
195
+ }
196
+
197
+ setNormalTagContent(firstTime?: boolean) {
198
+ let self = this;
199
+
200
+ function htmlSet() {
201
+ self.editor.html && self.editor.html.set(self.props.model || '');
202
+ if (self.editorInitialized && self.editor.undo) {
203
+ //This will reset the undo stack everytime the model changes externally. Can we fix this?
204
+ self.editor.undo.reset();
205
+ self.editor.undo.saveStep();
206
+ }
207
+ }
208
+
209
+ if (firstTime) {
210
+ if (this.config.initOnClick) {
211
+ this.registerEvent('initializationDelayed', () => {
212
+ htmlSet();
213
+ });
214
+
215
+ this.registerEvent('initialized', () => {
216
+ this.editorInitialized = true;
217
+ });
218
+ } else {
219
+ this.registerEvent('initialized', () => {
220
+ this.editorInitialized = true;
221
+ htmlSet();
222
+ });
223
+ }
224
+ } else {
225
+ htmlSet();
226
+ }
73
227
  }
74
228
 
75
- handleModelChange(model: string) {
229
+ destroyEditor() {
230
+ if (this.element) {
231
+ this.editor.destroy && this.editor.destroy();
232
+ this.listeningEvents.length = 0;
233
+ this.element = null;
234
+ this.editorInitialized = false;
235
+ }
236
+ }
237
+
238
+ getEditor() {
239
+ if (this.element) {
240
+ return this.editor;
241
+ }
242
+
243
+ return null;
244
+ }
245
+
246
+ updateModel() {
76
247
  if (!this.props.onModelChange) {
77
248
  return;
78
249
  }
79
- this.oldModel = model;
80
- this.props.onModelChange(model);
81
- this.setState({
82
- model: model
250
+
251
+ let modelContent = '';
252
+
253
+ if (this.hasSpecialTag) {
254
+ let attributeNodes = this.element.attributes;
255
+ let attrs: any = {};
256
+
257
+ for (let i = 0; i < attributeNodes.length; i++) {
258
+ let attrName = attributeNodes[i].name;
259
+ if (
260
+ this.config.reactIgnoreAttrs &&
261
+ this.config.reactIgnoreAttrs.indexOf(attrName) != -1
262
+ ) {
263
+ continue;
264
+ }
265
+ attrs[attrName] = attributeNodes[i].value;
266
+ }
267
+
268
+ if (this.element.innerHTML) {
269
+ attrs[this.INNER_HTML_ATTR] = this.element.innerHTML;
270
+ }
271
+
272
+ modelContent = attrs;
273
+ } else {
274
+ let returnedHtml = this.editor.html.get();
275
+ if (typeof returnedHtml === 'string') {
276
+ modelContent = returnedHtml;
277
+ }
278
+ }
279
+
280
+ this.oldModel = modelContent;
281
+ this.props.onModelChange(modelContent);
282
+ }
283
+
284
+ initListeners() {
285
+ let self = this;
286
+
287
+ // bind contentChange and keyup event to froalaModel
288
+ this.editor.events.on('contentChanged', function () {
289
+ self.updateModel();
83
290
  });
291
+ if (this.config.immediateReactModelUpdate) {
292
+ this.editor.events.on('keyup', function () {
293
+ self.updateModel();
294
+ });
295
+ }
296
+
297
+ // Call init events.
298
+ if (this._initEvents) {
299
+ for (let i = 0; i < this._initEvents.length; i++) {
300
+ this._initEvents[i].call(this.editor);
301
+ }
302
+ }
303
+ }
304
+
305
+ // register event on jquery editor element
306
+ registerEvent(eventName: string, callback: Function) {
307
+ if (!eventName || !callback) {
308
+ return;
309
+ }
310
+
311
+ if (eventName == 'initialized') {
312
+ if (!this._initEvents) this._initEvents = [];
313
+ this._initEvents.push(callback);
314
+ } else {
315
+ if (!this.config.events) {
316
+ this.config.events = {};
317
+ }
318
+
319
+ this.config.events[eventName] = callback;
320
+ }
321
+ }
322
+
323
+ render() {
324
+ return (
325
+ <textarea ref={el => (this.el = el)}>{this.props.children}</textarea>
326
+ );
327
+ }
328
+ }
329
+
330
+ export default class extends React.Component<any, any> {
331
+ constructor(props: any) {
332
+ super(props);
333
+ Froala.VIDEO_PROVIDERS = [
334
+ {
335
+ test_regex: /.*/,
336
+ url_regex: '',
337
+ url_text: '',
338
+ html: '<span class="fr-video fr-dvb fr-draggable" contenteditable="false" draggable="true"><video class="fr-draggable" controls="" data-msg="ok" data-status="0" src="{url}" style="width: 600px;"></video></span>'
339
+ }
340
+ ];
84
341
  }
85
342
 
86
343
  render() {
87
344
  return (
88
345
  <FroalaEditorComponent
89
- tag="textarea"
90
346
  config={this.props.config}
91
- model={this.state.model}
92
- onModelChange={this.handleModelChange}
347
+ model={this.props.model}
348
+ onModelChange={this.props.onModelChange}
93
349
  />
94
350
  );
95
351
  }
@@ -1107,6 +1107,7 @@ export const SelectWithRemoteOptions = withRemoteConfig<Array<Options>>({
1107
1107
  > {
1108
1108
  render() {
1109
1109
  const {loading, config, deferLoad, updateConfig, ...rest} = this.props;
1110
+
1110
1111
  return (
1111
1112
  <EnhancedSelect
1112
1113
  {...rest}