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.
- package/README.md +5 -0
- package/lib/RootRenderer.d.ts +1 -1
- package/lib/RootRenderer.js +4 -3
- package/lib/RootRenderer.js.map +2 -2
- package/lib/components/Card.d.ts +96 -0
- package/lib/components/Card.js +85 -0
- package/lib/components/Card.js.map +13 -0
- package/lib/components/Collapse.js +1 -1
- package/lib/components/Collapse.js.map +2 -2
- package/lib/components/DatePicker.d.ts +179 -84
- package/lib/components/DatePicker.js +25 -4
- package/lib/components/DatePicker.js.map +2 -2
- package/lib/components/DateRangePicker.d.ts +84 -84
- package/lib/components/MonthRangePicker.d.ts +84 -84
- package/lib/components/Picker.d.ts +503 -0
- package/lib/components/Picker.js +65 -0
- package/lib/components/Picker.js.map +13 -0
- package/lib/components/PickerColumn.d.ts +29 -459
- package/lib/components/PickerColumn.js +35 -44
- package/lib/components/PickerColumn.js.map +2 -2
- package/lib/components/Progress.js +1 -1
- package/lib/components/Progress.js.map +2 -2
- package/lib/components/Select.d.ts +238 -238
- package/lib/components/Select.js +9 -2
- package/lib/components/Select.js.map +2 -2
- package/lib/components/Selection.js +1 -4
- package/lib/components/Selection.js.map +2 -2
- package/lib/components/Switch.d.ts +6 -6
- package/lib/components/Switch.js.map +2 -2
- package/lib/components/calendar/Calendar.d.ts +8 -0
- package/lib/components/calendar/Calendar.js +19 -1
- package/lib/components/calendar/Calendar.js.map +2 -2
- package/lib/components/calendar/DaysView.d.ts +8 -0
- package/lib/components/calendar/DaysView.js +71 -0
- package/lib/components/calendar/DaysView.js.map +2 -2
- package/lib/components/calendar/TimeView.d.ts +10 -0
- package/lib/components/calendar/TimeView.js +55 -2
- package/lib/components/calendar/TimeView.js.map +2 -2
- package/lib/components/calendar/YearsView.d.ts +9 -0
- package/lib/components/calendar/YearsView.js +19 -0
- package/lib/components/calendar/YearsView.js.map +2 -2
- package/lib/index.js +1 -1
- package/lib/renderers/CRUD.d.ts +1 -1
- package/lib/renderers/CRUD.js +4 -4
- package/lib/renderers/CRUD.js.map +2 -2
- package/lib/renderers/Card.d.ts +81 -13
- package/lib/renderers/Card.js +178 -81
- package/lib/renderers/Card.js.map +2 -2
- package/lib/renderers/Dialog.d.ts +2 -2
- package/lib/renderers/Dialog.js +7 -7
- package/lib/renderers/Dialog.js.map +2 -2
- package/lib/renderers/Drawer.js +2 -2
- package/lib/renderers/Drawer.js.map +2 -2
- package/lib/renderers/Form/DiffEditor.d.ts +145 -37
- package/lib/renderers/Form/Editor.d.ts +144 -36
- package/lib/renderers/Form/Formula.js +5 -5
- package/lib/renderers/Form/Formula.js.map +2 -2
- package/lib/renderers/Form/InputCity.d.ts +84 -84
- package/lib/renderers/Form/InputDate.d.ts +25 -0
- package/lib/renderers/Form/InputDate.js +48 -3
- package/lib/renderers/Form/InputDate.js.map +2 -2
- package/lib/renderers/Form/InputFile.js +2 -2
- package/lib/renderers/Form/InputFile.js.map +2 -2
- package/lib/renderers/Form/Item.d.ts +1 -1
- package/lib/renderers/Form/Item.js +4 -3
- package/lib/renderers/Form/Item.js.map +2 -2
- package/lib/renderers/Form/index.d.ts +1 -1
- package/lib/renderers/Form/index.js +13 -2
- package/lib/renderers/Form/index.js.map +2 -2
- package/lib/renderers/Form/wrapControl.js +3 -2
- package/lib/renderers/Form/wrapControl.js.map +2 -2
- package/lib/renderers/Page.d.ts +3 -3
- package/lib/renderers/Page.js +4 -3
- package/lib/renderers/Page.js.map +2 -2
- package/lib/renderers/Status.js +1 -1
- package/lib/renderers/Status.js.map +2 -2
- package/lib/renderers/Wizard.d.ts +1 -1
- package/lib/renderers/Wizard.js +93 -36
- package/lib/renderers/Wizard.js.map +2 -2
- package/lib/store/combo.d.ts +160 -40
- package/lib/store/form.d.ts +64 -16
- package/lib/store/formItem.d.ts +4 -2
- package/lib/store/formItem.js +11 -6
- package/lib/store/formItem.js.map +2 -2
- package/lib/store/table.d.ts +128 -32
- package/lib/themes/ang-ie11.css +255 -31
- package/lib/themes/ang.css +255 -31
- package/lib/themes/ang.css.map +1 -1
- package/lib/themes/antd-ie11.css +255 -32
- package/lib/themes/antd.css +255 -32
- package/lib/themes/antd.css.map +1 -1
- package/lib/themes/cxd-ie11.css +263 -31
- package/lib/themes/cxd.css +263 -31
- package/lib/themes/cxd.css.map +1 -1
- package/lib/themes/dark-ie11.css +255 -31
- package/lib/themes/dark.css +255 -31
- package/lib/themes/dark.css.map +1 -1
- package/lib/themes/default.css +263 -31
- package/lib/themes/default.css.map +1 -1
- package/lib/utils/helper.d.ts +7 -0
- package/lib/utils/helper.js +33 -1
- package/lib/utils/helper.js.map +2 -2
- package/package.json +2 -2
- package/schema.json +209 -20
- package/scss/_properties.scss +14 -3
- package/scss/components/_calendar.scss +81 -0
- package/scss/components/_card.scss +155 -15
- package/scss/components/_nav.scss +1 -1
- package/scss/components/_picker-columns.scss +20 -14
- package/scss/components/_toast.scss +3 -0
- package/scss/components/form/_file.scss +2 -2
- package/scss/components/form/_selection.scss +4 -0
- package/scss/components/form/_switch.scss +6 -0
- package/scss/themes/_antd-variables.scss +0 -2
- package/scss/themes/_common.scss +1 -0
- package/scss/themes/_cxd-variables.scss +9 -0
- package/sdk/ang-ie11.css +296 -33
- package/sdk/ang.css +306 -33
- package/sdk/antd-ie11.css +295 -32
- package/sdk/antd.css +306 -34
- package/sdk/charts.js +13 -13
- package/sdk/color-picker.js +69 -65
- package/sdk/cropperjs.js +2 -2
- package/sdk/cxd-ie11.css +296 -33
- package/sdk/cxd.css +314 -33
- package/sdk/dark-ie11.css +296 -33
- package/sdk/dark.css +306 -33
- package/sdk/exceljs.js +1 -1
- package/sdk/markdown.js +69 -69
- package/sdk/papaparse.js +1 -1
- package/sdk/renderers/Form/CityDB.js +1 -1
- package/sdk/rest.js +16 -20
- package/sdk/rich-text.js +62 -62
- package/sdk/sdk-ie11.css +296 -33
- package/sdk/sdk.css +314 -33
- package/sdk/sdk.js +1218 -1214
- package/sdk/thirds/hls.js/hls.js +1 -1
- package/sdk/thirds/mpegts.js/mpegts.js +1 -1
- package/sdk/tinymce.js +57 -57
- package/src/RootRenderer.tsx +3 -3
- package/src/components/Card.tsx +203 -0
- package/src/components/Collapse.tsx +1 -1
- package/src/components/DatePicker.tsx +44 -3
- package/src/components/Picker.tsx +145 -0
- package/src/components/PickerColumn.tsx +58 -95
- package/src/components/Progress.tsx +1 -1
- package/src/components/Select.tsx +17 -12
- package/src/components/Selection.tsx +1 -4
- package/src/components/Switch.tsx +7 -7
- package/src/components/calendar/Calendar.tsx +30 -1
- package/src/components/calendar/DaysView.tsx +91 -0
- package/src/components/calendar/TimeView.tsx +80 -5
- package/src/components/calendar/YearsView.tsx +44 -1
- package/src/renderers/CRUD.tsx +3 -4
- package/src/renderers/Card.tsx +299 -191
- package/src/renderers/Dialog.tsx +8 -8
- package/src/renderers/Drawer.tsx +2 -2
- package/src/renderers/Form/Formula.tsx +7 -5
- package/src/renderers/Form/InputDate.tsx +83 -2
- package/src/renderers/Form/InputFile.tsx +6 -2
- package/src/renderers/Form/Item.tsx +2 -2
- package/src/renderers/Form/index.tsx +14 -2
- package/src/renderers/Form/wrapControl.tsx +5 -2
- package/src/renderers/Page.tsx +11 -10
- package/src/renderers/Status.tsx +3 -1
- package/src/renderers/Wizard.tsx +52 -12
- package/src/store/formItem.ts +12 -6
- 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
|
26
|
-
|
27
|
-
style?: CSSProperties;
|
28
|
-
index?: number;
|
29
|
-
labelField: string;
|
22
|
+
export interface PickerColumnItem {
|
23
|
+
labelField?: string;
|
30
24
|
readonly?: boolean;
|
31
|
-
value
|
32
|
-
swipeDuration?: number
|
33
|
-
visibleItemCount?: number
|
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
|
-
|
43
|
-
onConfirm?: () => void;
|
44
|
-
}
|
36
|
+
};
|
45
37
|
|
46
|
-
export interface
|
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 = '
|
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
|
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 (!
|
100
|
+
if (!options) {
|
132
101
|
return;
|
133
102
|
}
|
134
103
|
|
135
104
|
for (let i = index; i < count; i += 1) {
|
136
|
-
if (!isOptionDisabled(
|
105
|
+
if (!isOptionDisabled(options[i])) return i;
|
137
106
|
}
|
138
107
|
for (let i = index - 1; i >= 0; i -= 1) {
|
139
|
-
if (!isOptionDisabled(
|
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
|
-
|
160
|
-
|
161
|
-
|
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
|
-
|
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) &&
|
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 (
|
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
|
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
|
-
|
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
|
-
|
403
|
-
|
404
|
-
|
405
|
-
|
369
|
+
ref={wrapper}
|
370
|
+
style={wrapperStyle}
|
371
|
+
className={props.classnames('PickerColumns-columnWrapper')}
|
372
|
+
onTransitionEnd={stopMomentum}
|
406
373
|
>
|
407
|
-
|
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
|
-
|
425
|
-
|
426
|
-
|
427
|
-
})
|
428
|
-
)
|
388
|
+
uncontrollable(PickerColumn, {
|
389
|
+
value: 'onChange'
|
390
|
+
})
|
429
391
|
);
|
392
|
+
|
@@ -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
|
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
|
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
|
-
<
|
921
|
-
|
922
|
-
labelField=
|
923
|
-
|
924
|
-
|
925
|
-
|
926
|
-
|
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
|
-
|
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
|
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?:
|
31
|
+
onChange?: (checked: boolean | string | number) => void;
|
32
|
+
value?: boolean | string | number;
|
33
33
|
inline?: boolean;
|
34
|
-
trueValue?:
|
35
|
-
falseValue?:
|
34
|
+
trueValue?: boolean | string | number;
|
35
|
+
falseValue?: boolean | string | number;
|
36
36
|
disabled?: boolean;
|
37
37
|
readOnly?: boolean;
|
38
|
-
onText?:
|
39
|
-
offText?:
|
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
|
|