amis 1.9.1-beta.0 → 1.9.1-beta.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (278) hide show
  1. package/lib/RootRenderer.js +10 -2
  2. package/lib/RootRenderer.js.map +2 -2
  3. package/lib/Schema.d.ts +3 -2
  4. package/lib/Schema.js.map +1 -1
  5. package/lib/SchemaRenderer.js +6 -9
  6. package/lib/SchemaRenderer.js.map +2 -2
  7. package/lib/actions/CmptAction.js +4 -4
  8. package/lib/actions/CmptAction.js.map +2 -2
  9. package/lib/components/Button.d.ts +11 -10
  10. package/lib/components/Button.js +2 -2
  11. package/lib/components/Button.js.map +2 -2
  12. package/lib/components/CalendarMobile.d.ts +40 -40
  13. package/lib/components/Checkbox.js +1 -1
  14. package/lib/components/Checkbox.js.map +2 -2
  15. package/lib/components/ContextMenu.d.ts +4 -0
  16. package/lib/components/ContextMenu.js +23 -7
  17. package/lib/components/ContextMenu.js.map +2 -2
  18. package/lib/components/DatePicker.d.ts +40 -40
  19. package/lib/components/DateRangePicker.d.ts +40 -40
  20. package/lib/components/Form.d.ts +22 -0
  21. package/lib/components/Form.js +44 -0
  22. package/lib/components/Form.js.map +13 -0
  23. package/lib/components/FormField.d.ts +65 -0
  24. package/lib/components/FormField.js +48 -0
  25. package/lib/components/FormField.js.map +13 -0
  26. package/lib/components/InputBox.d.ts +10 -10
  27. package/lib/components/InputBox.js +4 -3
  28. package/lib/components/InputBox.js.map +2 -2
  29. package/lib/components/InputBoxWithSuggestion.d.ts +280 -0
  30. package/lib/components/InputBoxWithSuggestion.js +65 -0
  31. package/lib/components/InputBoxWithSuggestion.js.map +13 -0
  32. package/lib/components/ListGroup.d.ts +10 -10
  33. package/lib/components/PickerContainer.d.ts +4 -2
  34. package/lib/components/PickerContainer.js +28 -5
  35. package/lib/components/PickerContainer.js.map +2 -2
  36. package/lib/components/Radios.d.ts +10 -10
  37. package/lib/components/ResultBox.d.ts +40 -40
  38. package/lib/components/Select.d.ts +195 -202
  39. package/lib/components/Select.js +7 -3
  40. package/lib/components/Select.js.map +2 -2
  41. package/lib/components/Textarea.d.ts +568 -2
  42. package/lib/components/Textarea.js +129 -1
  43. package/lib/components/Textarea.js.map +2 -2
  44. package/lib/components/Toast.js +11 -9
  45. package/lib/components/Toast.js.map +2 -2
  46. package/lib/components/UserSelect.d.ts +500 -0
  47. package/lib/components/UserSelect.js +559 -0
  48. package/lib/components/UserSelect.js.map +13 -0
  49. package/lib/components/UserTabSelect.d.ts +320 -0
  50. package/lib/components/UserTabSelect.js +163 -0
  51. package/lib/components/UserTabSelect.js.map +13 -0
  52. package/lib/components/WithRemoteConfig.d.ts +7 -0
  53. package/lib/components/WithRemoteConfig.js +22 -13
  54. package/lib/components/WithRemoteConfig.js.map +2 -2
  55. package/lib/components/calendar/DaysView.d.ts +26 -1
  56. package/lib/components/calendar/DaysView.js +60 -19
  57. package/lib/components/calendar/DaysView.js.map +2 -2
  58. package/lib/components/calendar/TimeView.d.ts +1 -1
  59. package/lib/components/calendar/TimeView.js +10 -3
  60. package/lib/components/calendar/TimeView.js.map +2 -2
  61. package/lib/components/formula/Picker.js +4 -4
  62. package/lib/components/formula/Picker.js.map +2 -2
  63. package/lib/components/icons.d.ts +7 -1
  64. package/lib/components/icons.js +17 -1
  65. package/lib/components/icons.js.map +2 -2
  66. package/lib/components/index.d.ts +2 -1
  67. package/lib/components/index.js +3 -1
  68. package/lib/components/index.js.map +2 -2
  69. package/lib/components/json-schema/Array.d.ts +3 -0
  70. package/lib/components/json-schema/Array.js +125 -0
  71. package/lib/components/json-schema/Array.js.map +13 -0
  72. package/lib/components/json-schema/Item.d.ts +3 -0
  73. package/lib/components/json-schema/Item.js +34 -0
  74. package/lib/components/json-schema/Item.js.map +13 -0
  75. package/lib/components/json-schema/Object.d.ts +3 -0
  76. package/lib/components/json-schema/Object.js +178 -0
  77. package/lib/components/json-schema/Object.js.map +13 -0
  78. package/lib/components/json-schema/index.d.ts +279 -0
  79. package/lib/components/json-schema/index.js +16 -0
  80. package/lib/components/json-schema/index.js.map +13 -0
  81. package/lib/components/schema-editor/Array.js +2 -2
  82. package/lib/components/schema-editor/Array.js.map +2 -2
  83. package/lib/components/schema-editor/Common.d.ts +2 -0
  84. package/lib/components/schema-editor/Common.js +39 -3
  85. package/lib/components/schema-editor/Common.js.map +2 -2
  86. package/lib/components/schema-editor/Object.js +2 -2
  87. package/lib/components/schema-editor/Object.js.map +2 -2
  88. package/lib/components/schema-editor/index.d.ts +45 -41
  89. package/lib/components/schema-editor/index.js +5 -5
  90. package/lib/components/schema-editor/index.js.map +2 -2
  91. package/lib/components/table/ItemActionsWrapper.d.ts +10 -0
  92. package/lib/components/table/ItemActionsWrapper.js +25 -0
  93. package/lib/components/table/ItemActionsWrapper.js.map +13 -0
  94. package/lib/components/table/index.d.ts +48 -41
  95. package/lib/components/table/index.js +46 -18
  96. package/lib/components/table/index.js.map +2 -2
  97. package/lib/helper.css +125 -124
  98. package/lib/helper.css.map +1 -1
  99. package/lib/hooks/use-validation-resolver.d.ts +1 -0
  100. package/lib/hooks/use-validation-resolver.js +49 -0
  101. package/lib/hooks/use-validation-resolver.js.map +13 -0
  102. package/lib/icons/department.js +17 -0
  103. package/lib/icons/menu.js +9 -0
  104. package/lib/icons/post.js +15 -0
  105. package/lib/icons/role.js +14 -0
  106. package/lib/icons/user-remove.js +12 -0
  107. package/lib/index.d.ts +2 -0
  108. package/lib/index.js +3 -1
  109. package/lib/index.js.map +2 -2
  110. package/lib/locale/de-DE.js +11 -1
  111. package/lib/locale/de-DE.js.map +2 -2
  112. package/lib/locale/en-US.js +12 -1
  113. package/lib/locale/en-US.js.map +2 -2
  114. package/lib/locale/zh-CN.js +14 -3
  115. package/lib/locale/zh-CN.js.map +2 -2
  116. package/lib/renderers/Action.js +25 -11
  117. package/lib/renderers/Action.js.map +2 -2
  118. package/lib/renderers/CRUD.js +5 -1
  119. package/lib/renderers/CRUD.js.map +2 -2
  120. package/lib/renderers/Dialog.js +9 -3
  121. package/lib/renderers/Dialog.js.map +2 -2
  122. package/lib/renderers/Drawer.js +5 -1
  123. package/lib/renderers/Drawer.js.map +2 -2
  124. package/lib/renderers/Form/InputDate.d.ts +2 -2
  125. package/lib/renderers/Form/InputDate.js.map +2 -2
  126. package/lib/renderers/Form/JSONSchema.d.ts +23 -0
  127. package/lib/renderers/Form/JSONSchema.js +44 -0
  128. package/lib/renderers/Form/JSONSchema.js.map +13 -0
  129. package/lib/renderers/Form/JSONSchemaEditor.d.ts +2 -3
  130. package/lib/renderers/Form/JSONSchemaEditor.js +9 -24
  131. package/lib/renderers/Form/JSONSchemaEditor.js.map +2 -2
  132. package/lib/renderers/Form/Options.js +11 -5
  133. package/lib/renderers/Form/Options.js.map +2 -2
  134. package/lib/renderers/Form/Textarea.d.ts +1 -8
  135. package/lib/renderers/Form/Textarea.js +11 -75
  136. package/lib/renderers/Form/Textarea.js.map +2 -2
  137. package/lib/renderers/Form/UserSelect.d.ts +54 -0
  138. package/lib/renderers/Form/UserSelect.js +197 -0
  139. package/lib/renderers/Form/UserSelect.js.map +13 -0
  140. package/lib/renderers/Form/index.d.ts +1 -1
  141. package/lib/renderers/Form/index.js +88 -42
  142. package/lib/renderers/Form/index.js.map +2 -2
  143. package/lib/renderers/Form/wrapControl.js.map +2 -2
  144. package/lib/renderers/Log.d.ts +28 -0
  145. package/lib/renderers/Log.js +110 -20
  146. package/lib/renderers/Log.js.map +2 -2
  147. package/lib/renderers/Page.js +5 -1
  148. package/lib/renderers/Page.js.map +2 -2
  149. package/lib/renderers/Service.js +5 -1
  150. package/lib/renderers/Service.js.map +2 -2
  151. package/lib/renderers/Table-v2/index.d.ts +14 -2
  152. package/lib/renderers/Table-v2/index.js +33 -3
  153. package/lib/renderers/Table-v2/index.js.map +2 -2
  154. package/lib/renderers/Wizard.js +37 -14
  155. package/lib/renderers/Wizard.js.map +2 -2
  156. package/lib/store/form.js +65 -45
  157. package/lib/store/form.js.map +2 -2
  158. package/lib/themes/ang-ie11.css +576 -24
  159. package/lib/themes/ang.css +553 -12
  160. package/lib/themes/ang.css.map +1 -1
  161. package/lib/themes/antd-ie11.css +576 -24
  162. package/lib/themes/antd.css +553 -12
  163. package/lib/themes/antd.css.map +1 -1
  164. package/lib/themes/cxd-ie11.css +576 -24
  165. package/lib/themes/cxd.css +553 -12
  166. package/lib/themes/cxd.css.map +1 -1
  167. package/lib/themes/dark-ie11.css +576 -24
  168. package/lib/themes/dark.css +553 -12
  169. package/lib/themes/dark.css.map +1 -1
  170. package/lib/themes/default-ie11.css +576 -24
  171. package/lib/themes/default.css +553 -12
  172. package/lib/themes/default.css.map +1 -1
  173. package/lib/utils/api.js +1 -1
  174. package/lib/utils/api.js.map +2 -2
  175. package/lib/utils/renderer-event.js.map +2 -2
  176. package/package.json +2 -1
  177. package/schema.json +552 -5
  178. package/scss/_properties.scss +20 -8
  179. package/scss/components/_input-box.scss +22 -1
  180. package/scss/components/_json-schema.scss +124 -0
  181. package/scss/components/_log.scss +37 -5
  182. package/scss/components/form/_date-range.scss +1 -0
  183. package/scss/components/form/_select.scss +9 -0
  184. package/scss/components/form/_transfer.scss +19 -3
  185. package/scss/components/form/_user-select.scss +422 -0
  186. package/scss/helper/background/_background-color.scss +125 -124
  187. package/scss/themes/_common.scss +2 -0
  188. package/sdk/ang-ie11.css +670 -24
  189. package/sdk/ang.css +647 -12
  190. package/sdk/antd-ie11.css +670 -24
  191. package/sdk/antd.css +647 -12
  192. package/sdk/barcode.js +51 -51
  193. package/sdk/charts.js +14 -14
  194. package/sdk/codemirror.js +7 -7
  195. package/sdk/color-picker.js +65 -65
  196. package/sdk/cropperjs.js +2 -2
  197. package/sdk/cxd-ie11.css +670 -24
  198. package/sdk/cxd.css +647 -12
  199. package/sdk/dark-ie11.css +670 -24
  200. package/sdk/dark.css +647 -12
  201. package/sdk/exceljs.js +1 -1
  202. package/sdk/helper.css +125 -124
  203. package/sdk/helper.css.map +1 -1
  204. package/sdk/locale/de-DE.js +11 -1
  205. package/sdk/markdown.js +69 -69
  206. package/sdk/papaparse.js +1 -1
  207. package/sdk/renderers/Form/CityDB.js +1 -1
  208. package/sdk/rest.js +16 -16
  209. package/sdk/rich-text.js +62 -62
  210. package/sdk/sdk-ie11.css +670 -24
  211. package/sdk/sdk.css +647 -12
  212. package/sdk/sdk.js +1653 -1637
  213. package/sdk/thirds/hls.js/hls.js +1 -1
  214. package/sdk/thirds/mpegts.js/mpegts.js +1 -1
  215. package/sdk/tinymce.js +57 -57
  216. package/src/RootRenderer.tsx +27 -15
  217. package/src/Schema.ts +5 -1
  218. package/src/SchemaRenderer.tsx +1 -4
  219. package/src/actions/CmptAction.ts +4 -4
  220. package/src/components/Button.tsx +3 -0
  221. package/src/components/Checkbox.tsx +2 -1
  222. package/src/components/ContextMenu.tsx +25 -7
  223. package/src/components/Form.tsx +70 -0
  224. package/src/components/FormField.tsx +127 -0
  225. package/src/components/InputBox.tsx +4 -1
  226. package/src/components/InputBoxWithSuggestion.tsx +113 -0
  227. package/src/components/PickerContainer.tsx +20 -5
  228. package/src/components/Select.tsx +18 -10
  229. package/src/components/Textarea.tsx +234 -2
  230. package/src/components/Toast.tsx +19 -18
  231. package/src/components/UserSelect.tsx +850 -0
  232. package/src/components/UserTabSelect.tsx +261 -0
  233. package/src/components/WithRemoteConfig.tsx +35 -11
  234. package/src/components/calendar/DaysView.tsx +117 -49
  235. package/src/components/calendar/TimeView.tsx +11 -6
  236. package/src/components/formula/Picker.tsx +2 -1
  237. package/src/components/icons.tsx +17 -1
  238. package/src/components/index.tsx +3 -1
  239. package/src/components/json-schema/Array.tsx +216 -0
  240. package/src/components/json-schema/Item.tsx +47 -0
  241. package/src/components/json-schema/Object.tsx +339 -0
  242. package/src/components/json-schema/index.tsx +44 -0
  243. package/src/components/schema-editor/Array.tsx +3 -1
  244. package/src/components/schema-editor/Common.tsx +61 -4
  245. package/src/components/schema-editor/Object.tsx +3 -1
  246. package/src/components/schema-editor/index.tsx +12 -5
  247. package/src/components/table/ItemActionsWrapper.tsx +32 -0
  248. package/src/components/table/index.tsx +115 -58
  249. package/src/hooks/use-validation-resolver.ts +45 -0
  250. package/src/icons/department.svg +17 -0
  251. package/src/icons/menu.svg +2 -0
  252. package/src/icons/post.svg +15 -0
  253. package/src/icons/role.svg +14 -0
  254. package/src/icons/user-remove.svg +12 -0
  255. package/src/index.tsx +2 -0
  256. package/src/locale/de-DE.ts +11 -1
  257. package/src/locale/en-US.ts +12 -1
  258. package/src/locale/zh-CN.ts +14 -3
  259. package/src/renderers/Action.tsx +10 -9
  260. package/src/renderers/CRUD.tsx +5 -1
  261. package/src/renderers/Dialog.tsx +9 -3
  262. package/src/renderers/Drawer.tsx +5 -1
  263. package/src/renderers/Form/InputDate.tsx +9 -4
  264. package/src/renderers/Form/JSONSchema.tsx +56 -0
  265. package/src/renderers/Form/JSONSchemaEditor.tsx +8 -27
  266. package/src/renderers/Form/Options.tsx +17 -7
  267. package/src/renderers/Form/Textarea.tsx +7 -117
  268. package/src/renderers/Form/UserSelect.tsx +263 -0
  269. package/src/renderers/Form/index.tsx +28 -18
  270. package/src/renderers/Form/wrapControl.tsx +0 -1
  271. package/src/renderers/Log.tsx +213 -19
  272. package/src/renderers/Page.tsx +6 -1
  273. package/src/renderers/Service.tsx +5 -1
  274. package/src/renderers/Table-v2/index.tsx +65 -2
  275. package/src/renderers/Wizard.tsx +24 -10
  276. package/src/store/form.ts +24 -17
  277. package/src/utils/api.ts +1 -1
  278. package/src/utils/renderer-event.ts +0 -2
@@ -0,0 +1,261 @@
1
+ /**
2
+ * @file 移动端人员、部门、角色、岗位选择
3
+ * @author fex
4
+ */
5
+
6
+ import React from 'react';
7
+ import {themeable, ThemeProps} from '../theme';
8
+ import {LocaleProps, localeable} from '../locale';
9
+ import {ResultBox} from '../components';
10
+ import UserSelect from './UserSelect';
11
+ import {Option} from '../renderers/Form/Options';
12
+ import Sortable from 'sortablejs';
13
+ import PopUp from '../components/PopUp';
14
+ import {Icon} from '../components/icons';
15
+ import {autobind, findTree} from '../utils/helper';
16
+ import {default as Tabs, Tab} from './Tabs';
17
+ import {UserSelectProps} from './UserSelect';
18
+ import {PlainObject} from '../types';
19
+ import {resolveVariableAndFilter} from '../utils/tpl-builtin';
20
+
21
+ export interface UserSelectTop extends UserSelectProps {
22
+ title: string;
23
+ deferApi?: string;
24
+ searchApi?: string;
25
+ searchable?: boolean;
26
+ searchParam?: PlainObject;
27
+ searchTerm?: string;
28
+ }
29
+ export interface UserTabSelectProps extends ThemeProps, LocaleProps {
30
+ tabOptions?: Array<UserSelectTop>;
31
+ multiple?: boolean;
32
+ placeholder?: string;
33
+ valueField?: string;
34
+ labelField?: string;
35
+ selection?: Array<Option>;
36
+ data?: PlainObject;
37
+ onChange: (value: Array<Option> | Option) => void;
38
+ onSearch?: (
39
+ term: string,
40
+ cancelExecutor: Function,
41
+ paramObj?: PlainObject
42
+ ) => Promise<any[]> | undefined;
43
+ deferLoad: (
44
+ data?: Object,
45
+ isRef?: boolean,
46
+ param?: PlainObject
47
+ ) => Promise<Option[]>;
48
+ }
49
+
50
+ export interface UserTabSelectState {
51
+ isOpened: boolean;
52
+ isSearch: boolean;
53
+ isSelectOpened: boolean;
54
+ inputValue: string;
55
+ breadList: Array<any>;
56
+ options: Array<Option>;
57
+ tempSelection: Array<Option>;
58
+ selection: Array<Option>;
59
+ searchList: Array<Option>;
60
+ searchLoading: boolean;
61
+ isEdit: boolean;
62
+ activeKey: number;
63
+ }
64
+
65
+ export class UserTabSelect extends React.Component<
66
+ UserTabSelectProps,
67
+ UserTabSelectState
68
+ > {
69
+ cancelSearch?: Function;
70
+ sortable?: Sortable;
71
+ unmounted = false;
72
+
73
+ constructor(props: UserTabSelectProps) {
74
+ super(props);
75
+ this.state = {
76
+ isOpened: false,
77
+ isSelectOpened: false,
78
+ inputValue: '',
79
+ options: [],
80
+ breadList: [],
81
+ searchList: [],
82
+ tempSelection: [],
83
+ selection: props.selection ? props.selection : [],
84
+ isSearch: false,
85
+ searchLoading: false,
86
+ isEdit: false,
87
+ activeKey: 0
88
+ };
89
+ }
90
+
91
+ static defaultProps = {};
92
+
93
+ componentDidMount() {}
94
+
95
+ componentDidUpdate(prevProps: UserTabSelectProps) {}
96
+
97
+ componentWillUnmount() {
98
+ this.unmounted = true;
99
+ }
100
+
101
+ @autobind
102
+ onClose() {
103
+ this.setState({
104
+ isOpened: false,
105
+ isSearch: false,
106
+ inputValue: '',
107
+ searchList: [],
108
+ searchLoading: false,
109
+ activeKey: 0
110
+ });
111
+ }
112
+
113
+ @autobind
114
+ onOpen() {
115
+ const {selection} = this.state;
116
+ this.setState({
117
+ isOpened: true,
118
+ tempSelection: selection.slice()
119
+ });
120
+ }
121
+
122
+ @autobind
123
+ handleBack() {
124
+ this.onClose();
125
+ const {onChange} = this.props;
126
+ onChange(this.state.selection);
127
+ }
128
+
129
+ @autobind
130
+ handleSelectChange(option: Option | Array<Option>, isReplace?: boolean) {
131
+ const {multiple, valueField = 'value'} = this.props;
132
+ let selection = this.state.selection.slice();
133
+ let selectionVals = selection.map((option: Option) => option[valueField]);
134
+ if (isReplace && Array.isArray(option)) {
135
+ selection = option.slice();
136
+ } else if (!Array.isArray(option)) {
137
+ let pos = selectionVals.indexOf(option[valueField]);
138
+ if (pos !== -1) {
139
+ selection.splice(selection.indexOf(option), 1);
140
+ } else {
141
+ if (multiple) {
142
+ selection.push(option);
143
+ } else {
144
+ selection = [option];
145
+ }
146
+ }
147
+ }
148
+
149
+ this.setState({
150
+ selection: selection
151
+ });
152
+ return false;
153
+ }
154
+
155
+ @autobind
156
+ handleTabChange(key: number) {
157
+ this.setState({
158
+ activeKey: key
159
+ });
160
+ }
161
+
162
+ render() {
163
+ let {
164
+ classnames: cx,
165
+ translate: __,
166
+ onChange,
167
+ placeholder = '请选择',
168
+ tabOptions,
169
+ onSearch,
170
+ deferLoad,
171
+ data
172
+ } = this.props;
173
+ const {activeKey, isOpened, selection} = this.state;
174
+
175
+ return (
176
+ <div className={cx('UserTabSelect')}>
177
+ <ResultBox
178
+ className={cx('UserTabSelect-input', isOpened ? 'is-active' : '')}
179
+ allowInput={false}
180
+ result={selection}
181
+ onResultChange={value => this.handleSelectChange(value, true)}
182
+ onResultClick={this.onOpen}
183
+ placeholder={placeholder}
184
+ useMobileUI
185
+ />
186
+ <PopUp
187
+ isShow={isOpened}
188
+ className={cx(`UserTabSelect-popup`)}
189
+ onHide={this.onClose}
190
+ showClose={false}
191
+ >
192
+ <div className={cx('UserTabSelect-wrap')}>
193
+ <div className={cx('UserSelect-navbar')}>
194
+ <span className="left-arrow-box" onClick={this.handleBack}>
195
+ <Icon icon="left-arrow" className="icon" />
196
+ </span>
197
+ <div className={cx('UserSelect-navbar-title')}>人员选择</div>
198
+ </div>
199
+ <Tabs
200
+ mode="tiled"
201
+ className={cx('UserTabSelect-tabs')}
202
+ onSelect={this.handleTabChange}
203
+ activeKey={activeKey}
204
+ >
205
+ {tabOptions?.map((item: UserSelectTop, index: number) => {
206
+ return (
207
+ <Tab
208
+ {...this.props}
209
+ eventKey={index}
210
+ key={index}
211
+ title={item.title}
212
+ className="TabsTransfer-tab"
213
+ >
214
+ <UserSelect
215
+ selection={selection}
216
+ showResultBox={false}
217
+ {...item}
218
+ options={
219
+ typeof item.options === 'string' && data
220
+ ? resolveVariableAndFilter(
221
+ item.options,
222
+ data,
223
+ '| raw'
224
+ )
225
+ : item.options
226
+ }
227
+ multiple
228
+ controlled
229
+ onChange={this.handleSelectChange}
230
+ onSearch={(input: string, cancelExecutor: Function) =>
231
+ item.searchable && onSearch
232
+ ? onSearch(input, cancelExecutor, {
233
+ searchApi: item.searchApi,
234
+ searchParam: item.searchParam,
235
+ searchTerm: item.searchTerm
236
+ })
237
+ : undefined
238
+ }
239
+ deferLoad={(
240
+ data?: PlainObject,
241
+ isRef?: boolean,
242
+ param?: PlainObject
243
+ ) =>
244
+ deferLoad(data, isRef, {
245
+ deferApi: item.deferApi,
246
+ ...(param || {})
247
+ })
248
+ }
249
+ />
250
+ </Tab>
251
+ );
252
+ })}
253
+ </Tabs>
254
+ </div>
255
+ </PopUp>
256
+ </div>
257
+ );
258
+ }
259
+ }
260
+
261
+ export default themeable(localeable(UserTabSelect));
@@ -5,7 +5,7 @@
5
5
  import React from 'react';
6
6
  import hoistNonReactStatic from 'hoist-non-react-statics';
7
7
  import debounce from 'lodash/debounce';
8
- import {Api, Payload} from '../types';
8
+ import {Api, ApiObject, Payload} from '../types';
9
9
  import {SchemaApi, SchemaTokenizeableString} from '../Schema';
10
10
  import {withStore} from './WithStore';
11
11
 
@@ -24,7 +24,12 @@ import {
24
24
  tokenize
25
25
  } from '../utils/tpl-builtin';
26
26
  import {reaction} from 'mobx';
27
- import {createObject, findIndex, findTreeIndex} from '../utils/helper';
27
+ import {
28
+ createObject,
29
+ findIndex,
30
+ findTreeIndex,
31
+ isObject
32
+ } from '../utils/helper';
28
33
 
29
34
  export const Store = types
30
35
  .model('RemoteConfigStore')
@@ -123,6 +128,8 @@ export interface RemoteOptionsProps<T = any> {
123
128
  }
124
129
 
125
130
  export interface WithRemoteConfigSettings {
131
+ sourceField?: string;
132
+
126
133
  /**
127
134
  * 从接口返回数据适配到配置
128
135
  */
@@ -163,6 +170,16 @@ export interface WithRemoteConfigSettings {
163
170
  config: any,
164
171
  props: any
165
172
  ) => any;
173
+
174
+ injectedPropsFilter?: (
175
+ injectedProps: {
176
+ config: any;
177
+ loading?: boolean;
178
+ deferLoad: (term: string) => any;
179
+ updateConfig: (config: any) => void;
180
+ },
181
+ props: any
182
+ ) => any;
166
183
  }
167
184
 
168
185
  export function withRemoteConfig<P = any>(
@@ -210,16 +227,16 @@ export function withRemoteConfig<P = any>(
210
227
  props.store.setComponent(this);
211
228
  this.deferLoadConfig = this.deferLoadConfig.bind(this);
212
229
  props.remoteConfigRef?.(this);
230
+ props.store.setData(props.data);
231
+ this.syncConfig();
213
232
  }
214
233
 
215
234
  componentDidMount() {
216
235
  const env: RendererEnv = this.props.env || this.context;
217
- const {store, source, data} = this.props;
218
-
219
- store.setData(data);
236
+ const {store, data} = this.props;
237
+ const source = (this.props as any)[config.sourceField || 'source'];
220
238
 
221
239
  if (isPureVariable(source)) {
222
- this.syncConfig();
223
240
  this.toDispose.push(
224
241
  reaction(
225
242
  () =>
@@ -233,7 +250,7 @@ export function withRemoteConfig<P = any>(
233
250
  );
234
251
  } else if (env && isEffectiveApi(source, data)) {
235
252
  this.loadConfig();
236
- source.autoRefresh !== false &&
253
+ (source as ApiObject).autoRefresh !== false &&
237
254
  this.toDispose.push(
238
255
  reaction(
239
256
  () => {
@@ -268,7 +285,8 @@ export function withRemoteConfig<P = any>(
268
285
 
269
286
  async loadConfig(ctx = this.props.data) {
270
287
  const env: RendererEnv = this.props.env || this.context;
271
- const {store, source} = this.props;
288
+ const {store} = this.props;
289
+ const source = (this.props as any)[config.sourceField || 'source'];
272
290
 
273
291
  if (env && isEffectiveApi(source, ctx)) {
274
292
  await store.load(env, source, ctx, config);
@@ -303,7 +321,8 @@ export function withRemoteConfig<P = any>(
303
321
  }
304
322
 
305
323
  syncConfig() {
306
- const {store, source, data} = this.props;
324
+ const {store, data} = this.props;
325
+ const source = (this.props as any)[config.sourceField || 'source'];
307
326
 
308
327
  if (isPureVariable(source)) {
309
328
  store.setConfig(
@@ -311,11 +330,14 @@ export function withRemoteConfig<P = any>(
311
330
  config,
312
331
  'syncConfig'
313
332
  );
333
+ } else if (isObject(source) && !isEffectiveApi(source, data)) {
334
+ store.setConfig(source, config, 'syncConfig');
314
335
  }
315
336
  }
316
337
 
317
338
  async deferLoadConfig(item: any) {
318
- const {store, source, data, deferApi} = this.props;
339
+ const {store, data, deferApi} = this.props;
340
+ const source = (this.props as any)[config.sourceField || 'source'];
319
341
  const env: RendererEnv = this.props.env || this.context;
320
342
  const indexes = findTreeIndex(store.config, a => a === item)!;
321
343
 
@@ -375,7 +397,9 @@ export function withRemoteConfig<P = any>(
375
397
  {...(env && isEffectiveApi(autoComplete) && this.loadOptions
376
398
  ? {loadOptions: this.loadOptions}
377
399
  : {})}
378
- {...injectedProps}
400
+ {...(config.injectedPropsFilter
401
+ ? config.injectedPropsFilter(injectedProps, this.props)
402
+ : injectedProps)}
379
403
  />
380
404
  );
381
405
  }
@@ -4,6 +4,7 @@ import moment from 'moment';
4
4
  import React from 'react';
5
5
  import Downshift from 'downshift';
6
6
  import findIndex from 'lodash/findIndex';
7
+ import merge from 'lodash/merge';
7
8
  import {LocaleProps, localeable} from '../../locale';
8
9
  import {ClassNamesFn} from '../../theme';
9
10
  import {isMobile, convertArrayValueToMoment} from '../../utils/helper';
@@ -11,6 +12,8 @@ import Picker from '../Picker';
11
12
  import {PickerOption} from '../PickerColumn';
12
13
  import {DateType} from './Calendar';
13
14
 
15
+ import type {TimeScale} from './TimeView';
16
+
14
17
  interface CustomDaysViewProps extends LocaleProps {
15
18
  classPrefix?: string;
16
19
  prevIcon?: string;
@@ -31,7 +34,12 @@ interface CustomDaysViewProps extends LocaleProps {
31
34
  setDateTimeState: (state: any) => void;
32
35
  showTime: () => void;
33
36
  setTime: (type: string, amount: number) => void;
34
- scrollToTop: (type: string, amount: number, i: number, lable?: string) => void;
37
+ scrollToTop: (
38
+ type: string,
39
+ amount: number,
40
+ i: number,
41
+ lable?: string
42
+ ) => void;
35
43
  subtractTime: (
36
44
  amount: number,
37
45
  type: string,
@@ -61,9 +69,33 @@ interface CustomDaysViewProps extends LocaleProps {
61
69
  hideHeader?: boolean;
62
70
  getColumns: (types: DateType[], dateBoundary: void) => any;
63
71
  getDateBoundary: (currentDate: moment.Moment) => any;
72
+ timeConstraints?: any;
64
73
  }
65
74
 
66
75
  export class CustomDaysView extends React.Component<CustomDaysViewProps> {
76
+ timeConstraints = {
77
+ hours: {
78
+ min: 0,
79
+ max: 23,
80
+ step: 1
81
+ },
82
+ minutes: {
83
+ min: 0,
84
+ max: 59,
85
+ step: 1
86
+ },
87
+ seconds: {
88
+ min: 0,
89
+ max: 59,
90
+ step: 1
91
+ },
92
+ milliseconds: {
93
+ min: 0,
94
+ max: 999,
95
+ step: 1
96
+ }
97
+ };
98
+
67
99
  state: {
68
100
  columns: {options: PickerOption[]}[];
69
101
  types: DateType[];
@@ -177,21 +209,20 @@ export class CustomDaysView extends React.Component<CustomDaysViewProps> {
177
209
  columns,
178
210
  types,
179
211
  pickerValue: currentDate.toArray(),
180
- uniqueTag: 0,
212
+ uniqueTag: 0
213
+ };
214
+
215
+ if (this.props.timeConstraints) {
216
+ this.timeConstraints = merge(this.timeConstraints, props.timeConstraints);
181
217
  }
182
218
  }
183
219
 
184
220
  componentWillMount() {
185
- this.setState({uniqueTag: (new Date()).valueOf()})
221
+ this.setState({uniqueTag: new Date().valueOf()});
186
222
  }
187
223
 
188
224
  componentDidMount() {
189
- const {
190
- timeFormat,
191
- selectedDate,
192
- viewDate,
193
- isEndDate,
194
- } = this.props;
225
+ const {timeFormat, selectedDate, viewDate, isEndDate} = this.props;
195
226
  const formatMap = {
196
227
  hours: 'HH',
197
228
  minutes: 'mm',
@@ -207,9 +238,14 @@ export class CustomDaysView extends React.Component<CustomDaysViewProps> {
207
238
  ? 'seconds'
208
239
  : '';
209
240
  if (type) {
210
- this.scrollToTop(type, parseInt(date.format(formatMap[type]), 10), i, 'init')
241
+ this.scrollToTop(
242
+ type,
243
+ parseInt(date.format(formatMap[type]), 10),
244
+ i,
245
+ 'init'
246
+ );
211
247
  }
212
- })
248
+ });
213
249
  }
214
250
 
215
251
  updateSelectedDate = (event: React.MouseEvent<any>) => {
@@ -246,17 +282,14 @@ export class CustomDaysView extends React.Component<CustomDaysViewProps> {
246
282
  this.props.updateSelectedDate(event, true);
247
283
  };
248
284
 
249
- showTime = () =>{
250
- const {selectedDate, viewDate, timeFormat} = this.props
285
+ showTime = () => {
286
+ const {selectedDate, viewDate, timeFormat} = this.props;
251
287
  return (
252
- <div
253
- key="stb"
254
- className="rdtShowTime"
255
- >
288
+ <div key="stb" className="rdtShowTime">
256
289
  {(selectedDate || viewDate || moment()).format(timeFormat)}
257
290
  </div>
258
- )
259
- }
291
+ );
292
+ };
260
293
 
261
294
  setTime = (
262
295
  type: 'hours' | 'minutes' | 'seconds' | 'milliseconds',
@@ -279,13 +312,19 @@ export class CustomDaysView extends React.Component<CustomDaysViewProps> {
279
312
  type: 'hours' | 'minutes' | 'seconds' | 'milliseconds',
280
313
  value: number,
281
314
  i: number,
282
- label?: string,
315
+ label?: string
283
316
  ) => {
284
- let elf: any = document.getElementById(`${this.state.uniqueTag}-${i}-input`);
285
- elf.parentNode.scrollTo({
286
- top: value * 28,
317
+ const elf: any = document.getElementById(
318
+ `${this.state.uniqueTag}-${i}-input`
319
+ );
320
+ const {min, step} = this.timeConstraints[type];
321
+ const offset = (value - min) / step;
322
+ const height = 28; /** 单个选项的高度 */
323
+
324
+ elf?.parentNode?.scrollTo({
325
+ top: offset * height,
287
326
  behavior: label === 'init' ? 'auto' : 'smooth'
288
- })
327
+ });
289
328
  };
290
329
 
291
330
  confirm = () => {
@@ -456,15 +495,17 @@ export class CustomDaysView extends React.Component<CustomDaysViewProps> {
456
495
  return <td {...props}>{currentDate.date()}</td>;
457
496
  };
458
497
 
459
- computedTimeOptions(total: number) {
460
- const times: {label: string; value: string}[] = [];
498
+ /** 时间选择器数据源 */
499
+ computedTimeOptions(timeScale: TimeScale) {
500
+ const {min, max, step} = this.timeConstraints?.[timeScale];
461
501
 
462
- for (let t = 0; t < total; t++) {
463
- const label = t < 10 ? `0${t}` : `${t}`;
464
- times.push({label, value: label});
465
- }
502
+ return Array.from({length: max - min + 1}, (item, index) => {
503
+ const value = (index + min)
504
+ .toString()
505
+ .padStart(timeScale !== 'milliseconds' ? 2 : 3, '0');
466
506
 
467
- return times;
507
+ return index % step === 0 ? {label: value, value} : undefined;
508
+ }).filter((item): item is {label: string; value: string} => !!item);
468
509
  }
469
510
 
470
511
  renderTimes = () => {
@@ -478,8 +519,9 @@ export class CustomDaysView extends React.Component<CustomDaysViewProps> {
478
519
 
479
520
  const date = selectedDate || (isEndDate ? viewDate.endOf('day') : viewDate);
480
521
  const inputs: Array<React.ReactNode> = [];
522
+ const timeConstraints = this.timeConstraints;
481
523
 
482
- inputs.push(this.showTime())
524
+ inputs.push(this.showTime());
483
525
 
484
526
  timeFormat.split(':').forEach((format, i) => {
485
527
  const type = /h/i.test(format)
@@ -490,11 +532,9 @@ export class CustomDaysView extends React.Component<CustomDaysViewProps> {
490
532
  ? 'seconds'
491
533
  : '';
492
534
  if (type) {
493
- const min = 0;
494
- const max = type === 'hours' ? 23 : 59;
495
- const hours = this.computedTimeOptions(24);
496
- const times = this.computedTimeOptions(60);
497
- const options = type === 'hours' ? hours : times;
535
+ const min = timeConstraints[type].min;
536
+ const max = timeConstraints[type].max;
537
+ const options = this.computedTimeOptions(type);
498
538
  const formatMap = {
499
539
  hours: 'HH',
500
540
  minutes: 'mm',
@@ -525,7 +565,12 @@ export class CustomDaysView extends React.Component<CustomDaysViewProps> {
525
565
  )
526
566
  });
527
567
  return (
528
- <div className={cx('CalendarInputWrapper', 'CalendarInputWrapperMT')}>
568
+ <div
569
+ className={cx(
570
+ 'CalendarInputWrapper',
571
+ 'CalendarInputWrapperMT'
572
+ )}
573
+ >
529
574
  {/* <input
530
575
  type="text"
531
576
  value={date.format(formatMap[type])}
@@ -534,24 +579,31 @@ export class CustomDaysView extends React.Component<CustomDaysViewProps> {
534
579
  max={max}
535
580
  {...inputProps}
536
581
  /> */}
537
- <div
582
+ <div
538
583
  className={cx(
539
584
  'CalendarInput-sugs',
540
- type === 'hours' ? 'CalendarInput-sugsHours' : 'CalendarInput-sugsTimes'
541
- )}
585
+ type === 'hours'
586
+ ? 'CalendarInput-sugsHours'
587
+ : 'CalendarInput-sugsTimes'
588
+ )}
542
589
  id={`${this.state.uniqueTag}-${i}-input`}
543
590
  >
544
591
  {options.map(option => {
545
592
  return (
546
593
  <div
547
594
  key={option.value}
548
- className={cx(
549
- 'CalendarInput-sugsItem',
550
- {'is-highlight': option.value === date.format(formatMap[type])}
551
- )}
595
+ className={cx('CalendarInput-sugsItem', {
596
+ 'is-highlight': selectedDate
597
+ ? option.value === date.format(formatMap[type])
598
+ : option.value === options?.[0]?.value
599
+ })}
552
600
  onClick={() => {
553
601
  this.setTime(type, parseInt(option.value, 10));
554
- this.scrollToTop(type, parseInt(option.value, 10), i);
602
+ this.scrollToTop(
603
+ type,
604
+ parseInt(option.value, 10),
605
+ i
606
+ );
555
607
  closeMenu();
556
608
  }}
557
609
  >
@@ -649,7 +701,13 @@ export class CustomDaysView extends React.Component<CustomDaysViewProps> {
649
701
  };
650
702
 
651
703
  render() {
652
- const {viewDate: date, useMobileUI, embed, timeFormat, classnames: cx} = this.props;
704
+ const {
705
+ viewDate: date,
706
+ useMobileUI,
707
+ embed,
708
+ timeFormat,
709
+ classnames: cx
710
+ } = this.props;
653
711
  const locale = date.localeData();
654
712
  const __ = this.props.translate;
655
713
  if (isMobile() && useMobileUI && !embed) {
@@ -718,9 +776,19 @@ export class CustomDaysView extends React.Component<CustomDaysViewProps> {
718
776
  return (
719
777
  <>
720
778
  <div className={timeFormat ? 'rdtDays' : ''}>
721
- <table className={timeFormat ? 'rdtDaysPart' : ''}>{tableChildren}</table>
779
+ <table className={timeFormat ? 'rdtDaysPart' : ''}>
780
+ {tableChildren}
781
+ </table>
722
782
  {timeFormat ? (
723
- <div className={timeFormat.toLowerCase().indexOf('s') > 0 ? "rdtTimePartWithS" : "rdtTimePart"}>{this.renderTimes()}</div>
783
+ <div
784
+ className={
785
+ timeFormat.toLowerCase().indexOf('s') > 0
786
+ ? 'rdtTimePartWithS'
787
+ : 'rdtTimePart'
788
+ }
789
+ >
790
+ {this.renderTimes()}
791
+ </div>
724
792
  ) : null}
725
793
  </div>
726
794
  <table>{this.renderFooter()}</table>