amis 1.5.1 → 1.5.5

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 (168) hide show
  1. package/README.md +5 -0
  2. package/lib/RootRenderer.d.ts +1 -1
  3. package/lib/RootRenderer.js +4 -3
  4. package/lib/RootRenderer.js.map +2 -2
  5. package/lib/components/Card.d.ts +96 -0
  6. package/lib/components/Card.js +85 -0
  7. package/lib/components/Card.js.map +13 -0
  8. package/lib/components/Collapse.js +1 -1
  9. package/lib/components/Collapse.js.map +2 -2
  10. package/lib/components/DatePicker.d.ts +179 -84
  11. package/lib/components/DatePicker.js +25 -4
  12. package/lib/components/DatePicker.js.map +2 -2
  13. package/lib/components/DateRangePicker.d.ts +84 -84
  14. package/lib/components/MonthRangePicker.d.ts +84 -84
  15. package/lib/components/Picker.d.ts +503 -0
  16. package/lib/components/Picker.js +65 -0
  17. package/lib/components/Picker.js.map +13 -0
  18. package/lib/components/PickerColumn.d.ts +29 -459
  19. package/lib/components/PickerColumn.js +35 -44
  20. package/lib/components/PickerColumn.js.map +2 -2
  21. package/lib/components/Progress.js +1 -1
  22. package/lib/components/Progress.js.map +2 -2
  23. package/lib/components/Select.d.ts +238 -238
  24. package/lib/components/Select.js +9 -2
  25. package/lib/components/Select.js.map +2 -2
  26. package/lib/components/Selection.js +1 -4
  27. package/lib/components/Selection.js.map +2 -2
  28. package/lib/components/Switch.d.ts +6 -6
  29. package/lib/components/Switch.js.map +2 -2
  30. package/lib/components/calendar/Calendar.d.ts +8 -0
  31. package/lib/components/calendar/Calendar.js +19 -1
  32. package/lib/components/calendar/Calendar.js.map +2 -2
  33. package/lib/components/calendar/DaysView.d.ts +8 -0
  34. package/lib/components/calendar/DaysView.js +71 -0
  35. package/lib/components/calendar/DaysView.js.map +2 -2
  36. package/lib/components/calendar/TimeView.d.ts +10 -0
  37. package/lib/components/calendar/TimeView.js +55 -2
  38. package/lib/components/calendar/TimeView.js.map +2 -2
  39. package/lib/components/calendar/YearsView.d.ts +9 -0
  40. package/lib/components/calendar/YearsView.js +19 -0
  41. package/lib/components/calendar/YearsView.js.map +2 -2
  42. package/lib/index.js +1 -1
  43. package/lib/renderers/CRUD.d.ts +1 -1
  44. package/lib/renderers/CRUD.js +4 -4
  45. package/lib/renderers/CRUD.js.map +2 -2
  46. package/lib/renderers/Card.d.ts +81 -13
  47. package/lib/renderers/Card.js +178 -81
  48. package/lib/renderers/Card.js.map +2 -2
  49. package/lib/renderers/Dialog.d.ts +2 -2
  50. package/lib/renderers/Dialog.js +7 -7
  51. package/lib/renderers/Dialog.js.map +2 -2
  52. package/lib/renderers/Drawer.js +2 -2
  53. package/lib/renderers/Drawer.js.map +2 -2
  54. package/lib/renderers/Form/DiffEditor.d.ts +145 -37
  55. package/lib/renderers/Form/Editor.d.ts +144 -36
  56. package/lib/renderers/Form/Formula.js +5 -5
  57. package/lib/renderers/Form/Formula.js.map +2 -2
  58. package/lib/renderers/Form/InputCity.d.ts +84 -84
  59. package/lib/renderers/Form/InputDate.d.ts +25 -0
  60. package/lib/renderers/Form/InputDate.js +48 -3
  61. package/lib/renderers/Form/InputDate.js.map +2 -2
  62. package/lib/renderers/Form/InputFile.js +2 -2
  63. package/lib/renderers/Form/InputFile.js.map +2 -2
  64. package/lib/renderers/Form/Item.d.ts +1 -1
  65. package/lib/renderers/Form/Item.js +4 -3
  66. package/lib/renderers/Form/Item.js.map +2 -2
  67. package/lib/renderers/Form/index.d.ts +1 -1
  68. package/lib/renderers/Form/index.js +13 -2
  69. package/lib/renderers/Form/index.js.map +2 -2
  70. package/lib/renderers/Form/wrapControl.js +3 -2
  71. package/lib/renderers/Form/wrapControl.js.map +2 -2
  72. package/lib/renderers/Page.d.ts +3 -3
  73. package/lib/renderers/Page.js +4 -3
  74. package/lib/renderers/Page.js.map +2 -2
  75. package/lib/renderers/Status.js +1 -1
  76. package/lib/renderers/Status.js.map +2 -2
  77. package/lib/renderers/Wizard.d.ts +1 -1
  78. package/lib/renderers/Wizard.js +93 -36
  79. package/lib/renderers/Wizard.js.map +2 -2
  80. package/lib/store/combo.d.ts +160 -40
  81. package/lib/store/form.d.ts +64 -16
  82. package/lib/store/formItem.d.ts +4 -2
  83. package/lib/store/formItem.js +11 -6
  84. package/lib/store/formItem.js.map +2 -2
  85. package/lib/store/table.d.ts +128 -32
  86. package/lib/themes/ang-ie11.css +255 -31
  87. package/lib/themes/ang.css +255 -31
  88. package/lib/themes/ang.css.map +1 -1
  89. package/lib/themes/antd-ie11.css +255 -32
  90. package/lib/themes/antd.css +255 -32
  91. package/lib/themes/antd.css.map +1 -1
  92. package/lib/themes/cxd-ie11.css +263 -31
  93. package/lib/themes/cxd.css +263 -31
  94. package/lib/themes/cxd.css.map +1 -1
  95. package/lib/themes/dark-ie11.css +255 -31
  96. package/lib/themes/dark.css +255 -31
  97. package/lib/themes/dark.css.map +1 -1
  98. package/lib/themes/default.css +263 -31
  99. package/lib/themes/default.css.map +1 -1
  100. package/lib/utils/helper.d.ts +7 -0
  101. package/lib/utils/helper.js +33 -1
  102. package/lib/utils/helper.js.map +2 -2
  103. package/package.json +2 -2
  104. package/schema.json +209 -20
  105. package/scss/_properties.scss +14 -3
  106. package/scss/components/_calendar.scss +81 -0
  107. package/scss/components/_card.scss +155 -15
  108. package/scss/components/_nav.scss +1 -1
  109. package/scss/components/_picker-columns.scss +20 -14
  110. package/scss/components/_toast.scss +3 -0
  111. package/scss/components/form/_file.scss +2 -2
  112. package/scss/components/form/_selection.scss +4 -0
  113. package/scss/components/form/_switch.scss +6 -0
  114. package/scss/themes/_antd-variables.scss +0 -2
  115. package/scss/themes/_common.scss +1 -0
  116. package/scss/themes/_cxd-variables.scss +9 -0
  117. package/sdk/ang-ie11.css +296 -33
  118. package/sdk/ang.css +306 -33
  119. package/sdk/antd-ie11.css +295 -32
  120. package/sdk/antd.css +306 -34
  121. package/sdk/charts.js +13 -13
  122. package/sdk/color-picker.js +69 -65
  123. package/sdk/cropperjs.js +2 -2
  124. package/sdk/cxd-ie11.css +296 -33
  125. package/sdk/cxd.css +314 -33
  126. package/sdk/dark-ie11.css +296 -33
  127. package/sdk/dark.css +306 -33
  128. package/sdk/exceljs.js +1 -1
  129. package/sdk/markdown.js +69 -69
  130. package/sdk/papaparse.js +1 -1
  131. package/sdk/renderers/Form/CityDB.js +1 -1
  132. package/sdk/rest.js +16 -20
  133. package/sdk/rich-text.js +62 -62
  134. package/sdk/sdk-ie11.css +296 -33
  135. package/sdk/sdk.css +314 -33
  136. package/sdk/sdk.js +1218 -1214
  137. package/sdk/thirds/hls.js/hls.js +1 -1
  138. package/sdk/thirds/mpegts.js/mpegts.js +1 -1
  139. package/sdk/tinymce.js +57 -57
  140. package/src/RootRenderer.tsx +3 -3
  141. package/src/components/Card.tsx +203 -0
  142. package/src/components/Collapse.tsx +1 -1
  143. package/src/components/DatePicker.tsx +44 -3
  144. package/src/components/Picker.tsx +145 -0
  145. package/src/components/PickerColumn.tsx +58 -95
  146. package/src/components/Progress.tsx +1 -1
  147. package/src/components/Select.tsx +17 -12
  148. package/src/components/Selection.tsx +1 -4
  149. package/src/components/Switch.tsx +7 -7
  150. package/src/components/calendar/Calendar.tsx +30 -1
  151. package/src/components/calendar/DaysView.tsx +91 -0
  152. package/src/components/calendar/TimeView.tsx +80 -5
  153. package/src/components/calendar/YearsView.tsx +44 -1
  154. package/src/renderers/CRUD.tsx +3 -4
  155. package/src/renderers/Card.tsx +299 -191
  156. package/src/renderers/Dialog.tsx +8 -8
  157. package/src/renderers/Drawer.tsx +2 -2
  158. package/src/renderers/Form/Formula.tsx +7 -5
  159. package/src/renderers/Form/InputDate.tsx +83 -2
  160. package/src/renderers/Form/InputFile.tsx +6 -2
  161. package/src/renderers/Form/Item.tsx +2 -2
  162. package/src/renderers/Form/index.tsx +14 -2
  163. package/src/renderers/Form/wrapControl.tsx +5 -2
  164. package/src/renderers/Page.tsx +11 -10
  165. package/src/renderers/Status.tsx +3 -1
  166. package/src/renderers/Wizard.tsx +52 -12
  167. package/src/store/formItem.ts +12 -6
  168. package/src/utils/helper.ts +34 -0
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * @file Picker
3
- * @description 移动端选择器
3
+ * @description 移动端列滚动选择器
4
4
  */
5
5
  import React, {
6
6
  useEffect,
@@ -8,8 +8,7 @@ import React, {
8
8
  useRef,
9
9
  useImperativeHandle,
10
10
  useCallback,
11
- forwardRef,
12
- CSSProperties
11
+ forwardRef
13
12
  } from 'react';
14
13
  import isObject from 'lodash/isObject';
15
14
  import cloneDeep from 'lodash/cloneDeep';
@@ -18,37 +17,25 @@ import {uncontrollable} from 'uncontrollable';
18
17
  import {useSetState, useUpdateEffect} from '../hooks';
19
18
  import {range} from '../utils/helper';
20
19
  import {themeable, ThemeProps} from '../theme';
21
- import {localeable, LocaleProps} from '../locale';
22
20
  import useTouch from '../hooks/use-touch';
23
- import Button from './Button';
24
21
 
25
- export interface PickerColumnProps extends ThemeProps, LocaleProps {
26
- mobileClassName?: string;
27
- style?: CSSProperties;
28
- index?: number;
29
- labelField: string;
22
+ export interface PickerColumnItem {
23
+ labelField?: string;
30
24
  readonly?: boolean;
31
- value: any;
32
- swipeDuration?: number | string;
33
- visibleItemCount?: number | string;
25
+ value?: PickerOption;
26
+ swipeDuration?: number;
27
+ visibleItemCount?: number;
28
+ itemHeight?: number;
34
29
  options?: PickerOption[];
35
- children?: any;
36
30
  optionRender?: (option: string | object | PickerOption) => React.ReactNode;
37
31
  onChange?: (
38
32
  value?: PickerOption | string,
39
33
  index?: number,
40
34
  confirm?: boolean
41
35
  ) => void;
42
- onClose?: () => void;
43
- onConfirm?: () => void;
44
- }
36
+ };
45
37
 
46
- export interface Column {
47
- values?: string[];
48
- className?: string;
49
- children?: Column[];
50
- disabled?: boolean;
51
- }
38
+ export interface PickerColumnProps extends PickerColumnItem, ThemeProps {}
52
39
 
53
40
  export type PickerOption = string | number | PickerObjectOption;
54
41
 
@@ -77,23 +64,17 @@ function getElementTranslateY(element: HTMLElement | null) {
77
64
  function isOptionDisabled(option: PickerOption) {
78
65
  return isObject(option) && option.disabled;
79
66
  }
80
-
67
+
81
68
  const PickerColumn = forwardRef<{}, PickerColumnProps>((props, ref) => {
82
69
  const {
83
- onClose,
84
- onConfirm,
85
- mobileClassName,
86
70
  visibleItemCount = 5,
71
+ itemHeight = 30,
87
72
  value,
88
73
  swipeDuration = 1000,
89
- labelField = 'value',
90
- translate: __,
74
+ labelField = 'text',
91
75
  options = [],
92
76
  classnames: cx
93
77
  } = props;
94
- let itemHeight = 24;
95
-
96
- const defaultIndex = options.findIndex(item => item === value);
97
78
 
98
79
  const root = useRef(null);
99
80
  const menuItemRef = useRef(null);
@@ -105,21 +86,9 @@ const PickerColumn = forwardRef<{}, PickerColumnProps>((props, ref) => {
105
86
  const touchStartTime = useRef(0);
106
87
  const momentumOffset = useRef(0);
107
88
 
108
- if (menuItemRef.current) {
109
- //@ts-ignore
110
- itemHeight = menuItemRef.current.getBoundingClientRect().height;
111
- }
112
-
113
- const [state, updateState] = useSetState({
114
- index: defaultIndex,
115
- offset: 0,
116
- duration: 0,
117
- options: cloneDeep(options)
118
- });
119
-
120
89
  const touch = useTouch();
121
-
122
- const count = state.options.length;
90
+ const count = options.length;
91
+ const defaultIndex = options.findIndex(item => item === value);
123
92
 
124
93
  const baseOffset = useMemo(() => {
125
94
  // 默认转入第一个选项的位置
@@ -128,20 +97,27 @@ const PickerColumn = forwardRef<{}, PickerColumnProps>((props, ref) => {
128
97
 
129
98
  const adjustIndex = (index: number) => {
130
99
  index = range(index, 0, count);
131
- if (!state.options) {
100
+ if (!options) {
132
101
  return;
133
102
  }
134
103
 
135
104
  for (let i = index; i < count; i += 1) {
136
- if (!isOptionDisabled(state.options[i])) return i;
105
+ if (!isOptionDisabled(options[i])) return i;
137
106
  }
138
107
  for (let i = index - 1; i >= 0; i -= 1) {
139
- if (!isOptionDisabled(state.options[i])) return i;
108
+ if (!isOptionDisabled(options[i])) return i;
140
109
  }
141
110
 
142
111
  return null;
143
112
  };
144
113
 
114
+ const [state, updateState] = useSetState({
115
+ index: adjustIndex(defaultIndex) || 0,
116
+ offset: 0,
117
+ duration: 0,
118
+ options: cloneDeep(options)
119
+ });
120
+
145
121
  /**
146
122
  *
147
123
  * @param index 索引
@@ -156,9 +132,14 @@ const PickerColumn = forwardRef<{}, PickerColumnProps>((props, ref) => {
156
132
  updateState({index});
157
133
 
158
134
  if (emitChange && props.onChange) {
159
- setTimeout(() => {
160
- props.onChange?.(options[index], index, confirm);
161
- }, 0);
135
+ requestAnimationFrame(
136
+ () => {
137
+ props.onChange?.(options[index], index, confirm);
138
+ }
139
+ );
140
+ // setTimeout(() => {
141
+ // props.onChange?.(options[index], index, confirm);
142
+ // }, 0);
162
143
  }
163
144
  };
164
145
 
@@ -175,7 +156,8 @@ const PickerColumn = forwardRef<{}, PickerColumnProps>((props, ref) => {
175
156
  const setOptions = (options: Array<PickerOption>) => {
176
157
  if (JSON.stringify(options) !== JSON.stringify(state.options)) {
177
158
  updateState({options});
178
- setIndex(defaultIndex, true);
159
+ const index = options.findIndex(item => item === value) || 0;
160
+ setIndex(index, true, true);
179
161
  }
180
162
  };
181
163
 
@@ -189,7 +171,7 @@ const PickerColumn = forwardRef<{}, PickerColumnProps>((props, ref) => {
189
171
  };
190
172
 
191
173
  const getOptionText = (option: [] | PickerOption) => {
192
- if (isObject(option) && props.labelField in option) {
174
+ if (isObject(option) && labelField in option) {
193
175
  //@ts-ignore
194
176
  return option[labelField];
195
177
  }
@@ -298,6 +280,10 @@ const PickerColumn = forwardRef<{}, PickerColumnProps>((props, ref) => {
298
280
  };
299
281
 
300
282
  const renderOptions = () => {
283
+ const style = {
284
+ height: `${itemHeight}px`,
285
+ lineHeight: `${itemHeight}px`
286
+ };
301
287
  return state.options.map((option, index: number) => {
302
288
  const text: string | PickerOption = getOptionText(option);
303
289
  const disabled = isOptionDisabled(option);
@@ -305,6 +291,7 @@ const PickerColumn = forwardRef<{}, PickerColumnProps>((props, ref) => {
305
291
  const data = {
306
292
  role: 'button',
307
293
  key: index,
294
+ style,
308
295
  tabIndex: disabled ? -1 : 0,
309
296
  className: props.classnames(`PickerColumns-columnItem`, {
310
297
  'is-disabled': disabled,
@@ -314,7 +301,7 @@ const PickerColumn = forwardRef<{}, PickerColumnProps>((props, ref) => {
314
301
  onClickItem(index);
315
302
  }
316
303
  };
317
-
304
+
318
305
  const childData = {
319
306
  className: 'text-ellipsis',
320
307
  children: text
@@ -335,7 +322,7 @@ const PickerColumn = forwardRef<{}, PickerColumnProps>((props, ref) => {
335
322
  const setValue = (value: string) => {
336
323
  const {options} = state;
337
324
  for (let i = 0; i < options.length; i += 1) {
338
- if (getOptionText(options[i]) === value) {
325
+ if (options[i] === value) {
339
326
  return setIndex(i);
340
327
  }
341
328
  }
@@ -348,7 +335,7 @@ const PickerColumn = forwardRef<{}, PickerColumnProps>((props, ref) => {
348
335
  );
349
336
 
350
337
  useEffect(() => {
351
- setIndex(defaultIndex, true);
338
+ setIndex(defaultIndex);
352
339
  }, [defaultIndex]);
353
340
 
354
341
  useUpdateEffect(() => {
@@ -369,61 +356,37 @@ const PickerColumn = forwardRef<{}, PickerColumnProps>((props, ref) => {
369
356
  transitionDuration: `${state.duration}ms`,
370
357
  transitionProperty: state.duration ? 'all' : 'none'
371
358
  };
372
-
373
- const wrapHeight = itemHeight * +visibleItemCount;
374
- const frameStyle = {height: `${itemHeight}px`};
375
- const columnsStyle = {height: `${wrapHeight}px`};
376
- const maskStyle = {
377
- backgroundSize: `100% ${(wrapHeight - itemHeight) / 2}px`
378
- };
379
-
380
359
  return (
381
- <div
382
- className={cx(mobileClassName, 'PickerColumns', 'PickerColumns-popOver')}
383
- >
384
- <div className={cx('PickerColumns-toolbar')}>
385
- <Button level="default" onClick={onClose}>
386
- {__('cancel')}
387
- </Button>
388
- <Button level="primary" onClick={onConfirm}>
389
- {__('confirm')}
390
- </Button>
391
- </div>
392
- <div className={cx('PickerColumns-columns')} style={columnsStyle}>
393
- <div
360
+ <div
394
361
  ref={root}
395
- className={props.classnames(props.className)}
362
+ className={props.classnames('PickerColumns', props.className)}
396
363
  onTouchStart={onTouchStart}
397
364
  onTouchMove={onTouchMove}
398
365
  onTouchEnd={onTouchEnd}
399
366
  onTouchCancel={onTouchEnd}
400
- >
367
+ >
401
368
  <ul
402
- ref={wrapper}
403
- style={wrapperStyle}
404
- className={props.classnames('PickerColumns-columnWrapper')}
405
- onTransitionEnd={stopMomentum}
369
+ ref={wrapper}
370
+ style={wrapperStyle}
371
+ className={props.classnames('PickerColumns-columnWrapper')}
372
+ onTransitionEnd={stopMomentum}
406
373
  >
407
- {renderOptions()}
374
+ {renderOptions()}
408
375
  </ul>
409
- </div>
410
- <div className={cx('PickerColumns-mask')} style={maskStyle}></div>
411
- <div className={cx('PickerColumns-frame')} style={frameStyle}></div>
412
376
  </div>
413
- </div>
414
377
  );
415
378
  });
416
379
 
417
380
  PickerColumn.defaultProps = {
418
381
  options: [],
419
382
  visibleItemCount: 5,
420
- swipeDuration: 1000
383
+ swipeDuration: 1000,
384
+ itemHeight: 30
421
385
  };
422
386
 
423
387
  export default themeable(
424
- localeable(
425
- uncontrollable(PickerColumn, {
426
- value: 'onChange'
427
- })
428
- )
388
+ uncontrollable(PickerColumn, {
389
+ value: 'onChange'
390
+ })
429
391
  );
392
+
@@ -118,7 +118,7 @@ export class Progress extends React.Component<ProgressProps, Object> {
118
118
  };
119
119
 
120
120
  viewValue = [
121
- <div className={cx(prefixCls)}>
121
+ <div className={cx(prefixCls)} key="circle">
122
122
  <Circle
123
123
  percent={value}
124
124
  strokeColor=""
@@ -36,7 +36,7 @@ import {LocaleProps, localeable} from '../locale';
36
36
  import Spinner from './Spinner';
37
37
  import {Option, Options} from '../Schema';
38
38
  import {RemoteOptionsProps, withRemoteConfig} from './WithRemoteConfig';
39
- import PickerColumn from './PickerColumn';
39
+ import Picker from './Picker';
40
40
 
41
41
  export {Option, Options};
42
42
 
@@ -569,7 +569,10 @@ export class Select extends React.Component<SelectProps, SelectState> {
569
569
  );
570
570
  }
571
571
 
572
- handlePickerChange(selectItem: any, index: number, confirm: boolean) {
572
+ handlePickerChange(selectItem: any, index: number, confirm?: boolean) {
573
+ if (!this.props.multiple) {
574
+ selectItem = selectItem[0];
575
+ }
573
576
  this.setState({
574
577
  pickerSelectItem: selectItem
575
578
  });
@@ -916,20 +919,22 @@ export class Select extends React.Component<SelectProps, SelectState> {
916
919
  };
917
920
 
918
921
  const mobileUI = isMobile() && useMobileUI;
922
+ const column = {
923
+ labelField: 'label',
924
+ options: filtedOptions
925
+ };
919
926
  const menu = mobileUI ? (
920
- <PickerColumn
921
- mobileClassName={mobileClassName}
922
- labelField={'label'}
923
- readonly={false}
924
- className={'PickerColumns-column'}
925
- value={value && value[0]}
926
- swipeDuration={1000}
927
- visibleItemCount={5}
928
- options={filtedOptions}
927
+ <Picker
928
+ className={cx('PickerColumns-column', mobileClassName)}
929
+ labelField='label'
930
+ value={value[0]}
931
+ translate={this.props.translate}
932
+ locale={this.props.locale}
933
+ columns={[column]}
929
934
  onChange={checkAll ? noop : this.handlePickerChange}
930
935
  onClose={this.close}
931
936
  onConfirm={this.confirm}
932
- ></PickerColumn>
937
+ />
933
938
  ) : (
934
939
  <div
935
940
  ref={this.menu}
@@ -126,10 +126,7 @@ export class BaseSelection<
126
126
 
127
127
  @autobind
128
128
  toggleAll() {
129
- const {value, onChange, option2value, options, multiple} = this.props;
130
- if (multiple) {
131
- return;
132
- }
129
+ const {value, onChange, option2value, options} = this.props;
133
130
 
134
131
  let valueArray: Array<Option> = [];
135
132
 
@@ -28,15 +28,15 @@ interface SwitchProps {
28
28
  className?: string;
29
29
  classPrefix: string;
30
30
  classnames: ClassNamesFn;
31
- onChange?: (checked: boolean) => void;
32
- value?: any;
31
+ onChange?: (checked: boolean | string | number) => void;
32
+ value?: boolean | string | number;
33
33
  inline?: boolean;
34
- trueValue?: any;
35
- falseValue?: any;
34
+ trueValue?: boolean | string | number;
35
+ falseValue?: boolean | string | number;
36
36
  disabled?: boolean;
37
37
  readOnly?: boolean;
38
- onText?: string;
39
- offText?: string;
38
+ onText?: React.ReactNode;
39
+ offText?: React.ReactNode;
40
40
  checked?: boolean;
41
41
  }
42
42
 
@@ -59,7 +59,7 @@ export class Switch extends React.PureComponent<SwitchProps, any> {
59
59
  return;
60
60
  }
61
61
 
62
- onChange(e.currentTarget.checked ? trueValue : falseValue);
62
+ onChange(e.currentTarget.checked ? trueValue! : falseValue!);
63
63
  }
64
64
 
65
65
  render() {
@@ -7,6 +7,7 @@ import CustomCalendarContainer from './CalendarContainer';
7
7
  import cx from 'classnames';
8
8
  import moment from 'moment';
9
9
  import {themeable, ThemeOutterProps, ThemeProps} from '../../theme';
10
+ import {convertDateArrayToDate} from "../../utils/helper";
10
11
 
11
12
  interface BaseDatePickerProps
12
13
  extends Omit<ReactDatePicker.DatetimepickerProps, 'viewMode'> {
@@ -28,6 +29,14 @@ interface BaseDatePickerProps
28
29
  year?: number,
29
30
  date?: moment.Moment
30
31
  ) => JSX.Element;
32
+ schedules?: Array<{
33
+ startTime: Date;
34
+ endTime: Date;
35
+ content: string | React.ReactElement;
36
+ color?: string;
37
+ }>;
38
+ largeMode?: boolean;
39
+ onScheduleClick?: (scheduleData: any) => void;
31
40
  }
32
41
 
33
42
  class BaseDatePicker extends ReactDatePicker {
@@ -82,7 +91,10 @@ class BaseDatePicker extends ReactDatePicker {
82
91
  'nextIcon',
83
92
  'isEndDate',
84
93
  'classnames',
85
- 'minDate'
94
+ 'minDate',
95
+ 'schedules',
96
+ 'largeMode',
97
+ 'onScheduleClick'
86
98
  ].forEach(key => (props[key] = (this.props as any)[key]));
87
99
 
88
100
  return props;
@@ -180,6 +192,22 @@ class BaseDatePicker extends ReactDatePicker {
180
192
  that.props.onChange(date);
181
193
  };
182
194
 
195
+ onConfirm = (value: number[], types: string[]) => {
196
+ const currentDate = (this.state.selectedDate || this.state.viewDate || moment()).clone();
197
+
198
+ const date = convertDateArrayToDate(value, types, currentDate);
199
+
200
+ if (!this.props.value) {
201
+ this.setState({
202
+ selectedDate: date,
203
+ inputValue: date!.format(this.state.inputFormat)
204
+ });
205
+ }
206
+ this.props.onChange && this.props.onChange(date);
207
+ this.props.onClose && this.props.onClose();
208
+ }
209
+
210
+
183
211
  render() {
184
212
  const Component = CustomCalendarContainer as any;
185
213
  const viewProps = this.getComponentProps();
@@ -191,6 +219,7 @@ class BaseDatePicker extends ReactDatePicker {
191
219
  ];
192
220
  }
193
221
 
222
+ viewProps.onConfirm = this.onConfirm;
194
223
  return (
195
224
  <div className={cx('rdt rdtStatic rdtOpen', this.props.className)}>
196
225
  <div key="dt" className="rdtPicker">
@@ -5,6 +5,7 @@ import React from 'react';
5
5
  import Downshift from 'downshift';
6
6
  import {LocaleProps, localeable} from '../../locale';
7
7
  import {ClassNamesFn} from '../../theme';
8
+ import find from 'lodash/find';
8
9
 
9
10
  interface CustomDaysViewProps extends LocaleProps {
10
11
  classPrefix?: string;
@@ -39,6 +40,14 @@ interface CustomDaysViewProps extends LocaleProps {
39
40
  updateSelectedDate: (event: React.MouseEvent<any>, close?: boolean) => void;
40
41
  handleClickOutside: () => void;
41
42
  classnames: ClassNamesFn;
43
+ schedules?: Array<{
44
+ startTime: Date,
45
+ endTime: Date,
46
+ content: any,
47
+ className?: string
48
+ }>;
49
+ largeMode?: boolean;
50
+ onScheduleClick?: (scheduleData: any) => void;
42
51
  }
43
52
 
44
53
  export class CustomDaysView extends DaysView {
@@ -117,6 +126,88 @@ export class CustomDaysView extends DaysView {
117
126
  };
118
127
 
119
128
  renderDay = (props: any, currentDate: moment.Moment) => {
129
+ if (this.props.schedules) {
130
+ let schedule: any[] = [];
131
+ this.props.schedules.forEach((item: any) => {
132
+ if (currentDate.isSameOrAfter(moment(item.startTime).subtract(1, 'days')) && currentDate.isSameOrBefore(item.endTime)) {
133
+ schedule.push(item);
134
+ }
135
+ });
136
+ if (schedule.length > 0) {
137
+ const cx = this.props.classnames;
138
+ const __ = this.props.translate;
139
+ // 日程数据
140
+ const scheduleData = {
141
+ scheduleData: schedule.map((item: any) => {
142
+ return {
143
+ ...item,
144
+ time: moment(item.startTime).format('YYYY-MM-DD HH:mm:ss') + ' - ' + moment(item.endTime).format('YYYY-MM-DD HH:mm:ss'),
145
+ }
146
+ }),
147
+ currentDate
148
+ };
149
+
150
+ // 放大模式
151
+ if (this.props.largeMode) {
152
+ let showSchedule: any[] = [];
153
+ for (let i = 0; i < schedule.length; i++) {
154
+ if (showSchedule.length > 3) {
155
+ break;
156
+ }
157
+ if (moment(schedule[i].startTime).isSame(currentDate, 'day')) {
158
+ showSchedule.push(schedule[i]);
159
+ }
160
+ else if (currentDate.weekday() === 0) {
161
+ // 周一重新设置日程
162
+ showSchedule.push({
163
+ ...schedule[i],
164
+ width: moment(schedule[i].endTime).date() - currentDate.date()
165
+ });
166
+ }
167
+ }
168
+ [0, 1, 2].forEach((i: number) => {
169
+ const findSchedule = find(schedule, (item: any) => item.height === i);
170
+ if (findSchedule && findSchedule !== showSchedule[i] && currentDate.weekday() !== 0) {
171
+ // 生成一个空白格占位
172
+ showSchedule.splice(i, 0, {
173
+ width: 1,
174
+ className: 'bg-transparent',
175
+ content: ''
176
+ });
177
+ }
178
+ else {
179
+ showSchedule[i] && (showSchedule[i].height = i);
180
+ }
181
+ });
182
+ // 最多展示3个
183
+ showSchedule = showSchedule.slice(0, 3);
184
+ const scheduleDiv = showSchedule.map((item: any, index: number) => {
185
+ const width = item.width || Math.min(moment(item.endTime).diff(moment(item.startTime), 'days') + 1, 7 - moment(item.startTime).weekday());
186
+ return <div key={props.key + 'content' + index}
187
+ className={cx('ScheduleCalendar-large-schedule-content', item.className)}
188
+ style={{width: width + '00%'}}
189
+ onClick={() => this.props.onScheduleClick && this.props.onScheduleClick(scheduleData)}>
190
+ <div className={cx('ScheduleCalendar-text-overflow')}>{item.content}</div>
191
+ </div>;
192
+ });
193
+ return <td {...props}>
194
+ <div className={cx('ScheduleCalendar-large-day-wrap')}>
195
+ <div className={cx('ScheduleCalendar-large-schedule-header')}>{currentDate.date()}</div>
196
+ {scheduleDiv}
197
+ {schedule.length > 3 && <div className={cx('ScheduleCalendar-large-schedule-footer')}>{schedule.length - 3} {__('more')}</div>}
198
+ </div>
199
+ </td>
200
+ }
201
+
202
+ // 正常模式
203
+ const ScheduleIcon = <span className={cx('ScheduleCalendar-icon', schedule[0].className)}
204
+ onClick={() => this.props.onScheduleClick && this.props.onScheduleClick(scheduleData)}></span>;
205
+ return <td {...props}>
206
+ {currentDate.date()}
207
+ {ScheduleIcon}
208
+ </td>;
209
+ }
210
+ }
120
211
  return <td {...props}>{currentDate.date()}</td>;
121
212
  };
122
213