amis 1.5.2 → 1.5.6-beta.0
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 -3
- 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 +3 -3
- package/lib/renderers/Form/InputFile.js.map +2 -2
- package/lib/renderers/Form/InputImage.js +1 -1
- package/lib/renderers/Form/InputImage.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 +65 -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 +18 -18
- package/sdk/rich-text.js +62 -62
- package/sdk/sdk-ie11.css +296 -33
- package/sdk/sdk.css +314 -33
- package/sdk/sdk.js +1190 -1186
- 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 -3
- 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 +7 -3
- package/src/renderers/Form/InputImage.tsx +1 -1
- 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
package/src/RootRenderer.tsx
CHANGED
@@ -184,12 +184,12 @@ export class RootRenderer extends React.Component<RootRendererProps> {
|
|
184
184
|
return;
|
185
185
|
}
|
186
186
|
|
187
|
-
store.closeDialog();
|
187
|
+
store.closeDialog(true);
|
188
188
|
}
|
189
189
|
|
190
|
-
handleDialogClose() {
|
190
|
+
handleDialogClose(confirmed = false) {
|
191
191
|
const store = this.store;
|
192
|
-
store.closeDialog();
|
192
|
+
store.closeDialog(confirmed);
|
193
193
|
}
|
194
194
|
|
195
195
|
handleDrawerConfirm(values: object[], action: Action, ...args: Array<any>) {
|
@@ -0,0 +1,203 @@
|
|
1
|
+
import React from 'react';
|
2
|
+
import {isClickOnInput} from '../utils/helper';
|
3
|
+
import {ClassNamesFn, themeable, ThemeProps} from '../theme';
|
4
|
+
export interface CardProps extends ThemeProps {
|
5
|
+
className?: string;
|
6
|
+
headerClassName?: string;
|
7
|
+
titleClassName?: string;
|
8
|
+
subTitleClassName?: string;
|
9
|
+
descriptionClassName?: string;
|
10
|
+
avatarTextStyle?: object;
|
11
|
+
avatarTextClassName?: string;
|
12
|
+
avatarClassName?: string;
|
13
|
+
secondaryClassName?: string;
|
14
|
+
imageClassName?: string;
|
15
|
+
bodyClassName?: string;
|
16
|
+
footerClassName?: string;
|
17
|
+
media?: React.ReactNode;
|
18
|
+
mediaPosition?: 'top' | 'left' | 'right' | 'bottom';
|
19
|
+
toolbar?: React.ReactNode;
|
20
|
+
children?: React.ReactNode;
|
21
|
+
actions?: React.ReactNode;
|
22
|
+
title?: string | JSX.Element;
|
23
|
+
subTitle?: string | JSX.Element;
|
24
|
+
subTitlePlaceholder?: string | JSX.Element;
|
25
|
+
description?: string | JSX.Element;
|
26
|
+
descriptionPlaceholder?: string | JSX.Element;
|
27
|
+
avatar?: string;
|
28
|
+
avatarText?: string | JSX.Element;
|
29
|
+
secondary?: string | JSX.Element;
|
30
|
+
onClick?: (e: React.MouseEvent<HTMLDivElement>) => void;
|
31
|
+
classnames: ClassNamesFn;
|
32
|
+
}
|
33
|
+
|
34
|
+
export class Card extends React.Component<CardProps> {
|
35
|
+
static defaultProps: Partial<CardProps> = {
|
36
|
+
className: '',
|
37
|
+
avatarClassName: '',
|
38
|
+
headerClassName: '',
|
39
|
+
footerClassName: '',
|
40
|
+
secondaryClassName: '',
|
41
|
+
avatarTextClassName: '',
|
42
|
+
bodyClassName: '',
|
43
|
+
titleClassName: '',
|
44
|
+
subTitleClassName: '',
|
45
|
+
descriptionClassName: '',
|
46
|
+
imageClassName: '',
|
47
|
+
mediaPosition: 'left'
|
48
|
+
};
|
49
|
+
|
50
|
+
constructor(props: CardProps) {
|
51
|
+
super(props);
|
52
|
+
this.handleClick = this.handleClick.bind(this);
|
53
|
+
}
|
54
|
+
|
55
|
+
handleClick(e: React.MouseEvent<HTMLDivElement>) {
|
56
|
+
if (isClickOnInput(e)) {
|
57
|
+
return;
|
58
|
+
}
|
59
|
+
|
60
|
+
this.props.onClick && this.props.onClick(e);
|
61
|
+
}
|
62
|
+
|
63
|
+
render() {
|
64
|
+
const {
|
65
|
+
classnames: cx,
|
66
|
+
className,
|
67
|
+
headerClassName,
|
68
|
+
bodyClassName,
|
69
|
+
titleClassName,
|
70
|
+
subTitleClassName,
|
71
|
+
descriptionClassName,
|
72
|
+
avatarClassName,
|
73
|
+
avatarTextStyle,
|
74
|
+
imageClassName,
|
75
|
+
avatarTextClassName,
|
76
|
+
secondaryClassName,
|
77
|
+
footerClassName,
|
78
|
+
media,
|
79
|
+
mediaPosition,
|
80
|
+
actions,
|
81
|
+
children,
|
82
|
+
onClick,
|
83
|
+
toolbar,
|
84
|
+
title,
|
85
|
+
subTitle,
|
86
|
+
subTitlePlaceholder,
|
87
|
+
description,
|
88
|
+
descriptionPlaceholder,
|
89
|
+
secondary,
|
90
|
+
avatar,
|
91
|
+
avatarText
|
92
|
+
} = this.props;
|
93
|
+
|
94
|
+
let heading = null;
|
95
|
+
const isShowHeading =
|
96
|
+
avatar ||
|
97
|
+
avatarText ||
|
98
|
+
title ||
|
99
|
+
subTitle ||
|
100
|
+
subTitlePlaceholder ||
|
101
|
+
description ||
|
102
|
+
descriptionPlaceholder ||
|
103
|
+
toolbar;
|
104
|
+
if (isShowHeading) {
|
105
|
+
heading = (
|
106
|
+
<div className={cx('Card-heading', headerClassName)}>
|
107
|
+
{avatar ? (
|
108
|
+
<span className={cx('Card-avtar', avatarClassName)}>
|
109
|
+
<img className={cx('Card-img', imageClassName)} src={avatar} />
|
110
|
+
</span>
|
111
|
+
) : avatarText ? (
|
112
|
+
<span
|
113
|
+
className={cx('Card-avtarText', avatarTextClassName)}
|
114
|
+
style={avatarTextStyle}
|
115
|
+
>
|
116
|
+
{avatarText}
|
117
|
+
</span>
|
118
|
+
) : null}
|
119
|
+
<div className={cx('Card-meta')}>
|
120
|
+
{title ? (
|
121
|
+
<div className={cx('Card-title', titleClassName)}>{title}</div>
|
122
|
+
) : null}
|
123
|
+
{subTitle || subTitlePlaceholder ? (
|
124
|
+
<div className={cx('Card-subTitle', subTitleClassName)}>
|
125
|
+
{subTitle
|
126
|
+
? subTitle
|
127
|
+
: subTitlePlaceholder
|
128
|
+
? subTitlePlaceholder
|
129
|
+
: null}
|
130
|
+
</div>
|
131
|
+
) : null}
|
132
|
+
{description || descriptionPlaceholder ? (
|
133
|
+
<div className={cx('Card-desc', descriptionClassName)}>
|
134
|
+
{description
|
135
|
+
? description
|
136
|
+
: descriptionPlaceholder
|
137
|
+
? descriptionPlaceholder
|
138
|
+
: null}
|
139
|
+
</div>
|
140
|
+
) : null}
|
141
|
+
</div>
|
142
|
+
{toolbar}
|
143
|
+
</div>
|
144
|
+
);
|
145
|
+
}
|
146
|
+
|
147
|
+
const body = children;
|
148
|
+
|
149
|
+
return (
|
150
|
+
<div
|
151
|
+
onClick={this.handleClick}
|
152
|
+
className={cx('Card', className, {
|
153
|
+
'Card--link': onClick
|
154
|
+
})}
|
155
|
+
>
|
156
|
+
{media ? (
|
157
|
+
<div className={cx(`Card-multiMedia--${mediaPosition}`)}>
|
158
|
+
{media}
|
159
|
+
<div className={cx('Card-multiMedia-flex')}>
|
160
|
+
{heading}
|
161
|
+
{body ? (
|
162
|
+
<div className={cx('Card-body', bodyClassName)}>{body}</div>
|
163
|
+
) : null}
|
164
|
+
{secondary || actions ? (
|
165
|
+
<div className={cx('Card-footer-wrapper', footerClassName)}>
|
166
|
+
{secondary ? (
|
167
|
+
<div className={cx('Card-secondary', secondaryClassName)}>
|
168
|
+
{secondary}
|
169
|
+
</div>
|
170
|
+
) : null}
|
171
|
+
{actions ? (
|
172
|
+
<div className={cx('Card-actions-wrapper')}>{actions}</div>
|
173
|
+
) : null}
|
174
|
+
</div>
|
175
|
+
) : null}
|
176
|
+
</div>
|
177
|
+
</div>
|
178
|
+
) : (
|
179
|
+
<div>
|
180
|
+
{heading}
|
181
|
+
{body ? (
|
182
|
+
<div className={cx('Card-body', bodyClassName)}>{body}</div>
|
183
|
+
) : null}
|
184
|
+
{secondary || actions ? (
|
185
|
+
<div className={cx('Card-footer-wrapper', footerClassName)}>
|
186
|
+
{secondary ? (
|
187
|
+
<div className={cx('Card-secondary', secondaryClassName)}>
|
188
|
+
{secondary}
|
189
|
+
</div>
|
190
|
+
) : null}
|
191
|
+
{actions ? (
|
192
|
+
<div className={cx('Card-actions-wrapper')}>{actions}</div>
|
193
|
+
) : null}
|
194
|
+
</div>
|
195
|
+
) : null}
|
196
|
+
</div>
|
197
|
+
)}
|
198
|
+
</div>
|
199
|
+
);
|
200
|
+
}
|
201
|
+
}
|
202
|
+
|
203
|
+
export default themeable(Card);
|
@@ -227,7 +227,7 @@ export class Collapse extends React.Component<CollapseProps, CollapseState> {
|
|
227
227
|
{
|
228
228
|
'is-active': !this.state.collapsed,
|
229
229
|
[`Collapse--${size}`]: size,
|
230
|
-
'Collapse--disabled': disabled
|
230
|
+
'Collapse--disabled': disabled,
|
231
231
|
'Collapse--title-bottom': headerPosition === 'bottom'
|
232
232
|
},
|
233
233
|
className
|
@@ -278,6 +278,17 @@ export interface DateProps extends LocaleProps, ThemeProps {
|
|
278
278
|
borderMode?: 'full' | 'half' | 'none';
|
279
279
|
// 是否为内嵌模式,如果开启就不是 picker 了,直接页面点选。
|
280
280
|
embed?: boolean;
|
281
|
+
schedules?: Array<{
|
282
|
+
startTime: Date,
|
283
|
+
endTime: Date,
|
284
|
+
content: any,
|
285
|
+
className?: string
|
286
|
+
}>;
|
287
|
+
scheduleClassNames?: Array<string>;
|
288
|
+
largeMode?: boolean;
|
289
|
+
onScheduleClick?: (scheduleData: any) => void;
|
290
|
+
|
291
|
+
useMobileUI?: boolean;
|
281
292
|
|
282
293
|
// 下面那个千万不要写,写了就会导致 keyof DateProps 得到的结果是 string | number;
|
283
294
|
// [propName: string]: any;
|
@@ -302,7 +313,8 @@ export class DatePicker extends React.Component<DateProps, DatePickerState> {
|
|
302
313
|
viewMode: 'days' as 'years' | 'months' | 'days' | 'time',
|
303
314
|
shortcuts: '',
|
304
315
|
closeOnSelect: true,
|
305
|
-
overlayPlacement: 'auto'
|
316
|
+
overlayPlacement: 'auto',
|
317
|
+
scheduleClassNames: ['bg-warning', 'bg-danger', 'bg-success', 'bg-info', 'bg-secondary']
|
306
318
|
};
|
307
319
|
state: DatePickerState = {
|
308
320
|
isOpened: false,
|
@@ -546,20 +558,46 @@ export class DatePicker extends React.Component<DateProps, DatePickerState> {
|
|
546
558
|
format,
|
547
559
|
borderMode,
|
548
560
|
embed,
|
549
|
-
minDate
|
561
|
+
minDate,
|
562
|
+
schedules,
|
563
|
+
largeMode,
|
564
|
+
scheduleClassNames,
|
565
|
+
onScheduleClick
|
550
566
|
} = this.props;
|
551
567
|
|
552
568
|
const __ = this.props.translate;
|
553
569
|
const isOpened = this.state.isOpened;
|
554
570
|
let date: moment.Moment | undefined = this.state.value;
|
555
571
|
|
572
|
+
|
556
573
|
if (embed) {
|
574
|
+
let schedulesData: DateProps['schedules'] = undefined;
|
575
|
+
if (schedules && Array.isArray(schedules)) {
|
576
|
+
// 设置日程颜色
|
577
|
+
let index = 0;
|
578
|
+
schedulesData = schedules.map((schedule: any) => {
|
579
|
+
let className = schedule.className;
|
580
|
+
if (!className && scheduleClassNames) {
|
581
|
+
className = scheduleClassNames[index];
|
582
|
+
index++;
|
583
|
+
if (index >= scheduleClassNames.length) {
|
584
|
+
index = 0;
|
585
|
+
}
|
586
|
+
}
|
587
|
+
return {
|
588
|
+
...schedule,
|
589
|
+
className
|
590
|
+
};
|
591
|
+
});
|
592
|
+
}
|
557
593
|
return (
|
558
594
|
<div
|
559
595
|
className={cx(
|
560
596
|
`DateCalendar`,
|
561
597
|
{
|
562
|
-
'is-disabled': disabled
|
598
|
+
'is-disabled': disabled,
|
599
|
+
'ScheduleCalendar': schedulesData,
|
600
|
+
'ScheduleCalendar-large': largeMode
|
563
601
|
},
|
564
602
|
className
|
565
603
|
)}
|
@@ -578,6 +616,9 @@ export class DatePicker extends React.Component<DateProps, DatePickerState> {
|
|
578
616
|
locale={locale}
|
579
617
|
minDate={minDate}
|
580
618
|
// utc={utc}
|
619
|
+
schedules={schedulesData}
|
620
|
+
largeMode={largeMode}
|
621
|
+
onScheduleClick={onScheduleClick}
|
581
622
|
/>
|
582
623
|
</div>
|
583
624
|
);
|
@@ -0,0 +1,145 @@
|
|
1
|
+
/**
|
2
|
+
* @file Picker
|
3
|
+
* @description 移动端列滚动选择器
|
4
|
+
*/
|
5
|
+
import React, {
|
6
|
+
memo,
|
7
|
+
ReactNode,
|
8
|
+
useState
|
9
|
+
} from 'react';
|
10
|
+
import {uncontrollable} from 'uncontrollable';
|
11
|
+
|
12
|
+
import {themeable, ThemeProps} from '../theme';
|
13
|
+
import {localeable, LocaleProps} from '../locale';
|
14
|
+
|
15
|
+
import Button from './Button';
|
16
|
+
import {PickerColumnItem, default as Column} from './PickerColumn';
|
17
|
+
|
18
|
+
export type PickerValue = string | number;
|
19
|
+
|
20
|
+
export interface PickerProps extends ThemeProps, LocaleProps {
|
21
|
+
title?: String | ReactNode,
|
22
|
+
labelField?: string;
|
23
|
+
className?: string;
|
24
|
+
showToolbar?: boolean;
|
25
|
+
defaultValue?: PickerValue[];
|
26
|
+
value?: PickerValue[];
|
27
|
+
swipeDuration?: number;
|
28
|
+
visibleItemCount?: number;
|
29
|
+
itemHeight?: number;
|
30
|
+
columns: PickerColumnItem[] | PickerColumnItem;
|
31
|
+
onChange?: (
|
32
|
+
value?: PickerValue[],
|
33
|
+
index?: number,
|
34
|
+
confirm?: boolean
|
35
|
+
) => void;
|
36
|
+
onClose?: (
|
37
|
+
value?: PickerValue[]
|
38
|
+
) => void;
|
39
|
+
onConfirm?: (
|
40
|
+
value?: PickerValue[]
|
41
|
+
) => void;
|
42
|
+
}
|
43
|
+
|
44
|
+
function fixToArray(data: any) {
|
45
|
+
if (!Array.isArray(data)) {
|
46
|
+
return [data];
|
47
|
+
}
|
48
|
+
return data;
|
49
|
+
}
|
50
|
+
|
51
|
+
const Picker = memo<PickerProps>((props) => {
|
52
|
+
const {
|
53
|
+
labelField,
|
54
|
+
visibleItemCount = 5,
|
55
|
+
value = [],
|
56
|
+
swipeDuration = 1000,
|
57
|
+
columns = [],
|
58
|
+
itemHeight = 30,
|
59
|
+
showToolbar = true,
|
60
|
+
className='',
|
61
|
+
classnames: cx,
|
62
|
+
classPrefix: ns,
|
63
|
+
translate: __
|
64
|
+
} = props;
|
65
|
+
|
66
|
+
const _columns = fixToArray(columns);
|
67
|
+
const [innerValue, setInnerValue] = useState<PickerValue[]>(
|
68
|
+
fixToArray(props.value === undefined ? props.defaultValue || [] : value )
|
69
|
+
);
|
70
|
+
|
71
|
+
const close = () => {
|
72
|
+
if (props.onClose) {
|
73
|
+
props.onClose(innerValue);
|
74
|
+
}
|
75
|
+
};
|
76
|
+
|
77
|
+
const confirm = () => {
|
78
|
+
if (props.onConfirm) {
|
79
|
+
props.onConfirm(innerValue);
|
80
|
+
}
|
81
|
+
};
|
82
|
+
|
83
|
+
const onChange = (itemValue: PickerValue, columnIndex: number, confirm?: boolean) => {
|
84
|
+
const nextInnerValue = [...innerValue];
|
85
|
+
nextInnerValue[columnIndex] = itemValue;
|
86
|
+
setInnerValue(nextInnerValue);
|
87
|
+
if (props.onChange) {
|
88
|
+
props.onChange(nextInnerValue, columnIndex, confirm);
|
89
|
+
}
|
90
|
+
};
|
91
|
+
|
92
|
+
const renderColumnItem = (item: PickerColumnItem, index: number) => {
|
93
|
+
return (
|
94
|
+
<Column
|
95
|
+
{...item}
|
96
|
+
classnames={cx}
|
97
|
+
classPrefix={ns}
|
98
|
+
labelField={labelField}
|
99
|
+
itemHeight={itemHeight}
|
100
|
+
swipeDuration={swipeDuration}
|
101
|
+
visibleItemCount={visibleItemCount}
|
102
|
+
value={innerValue[index]}
|
103
|
+
onChange={(val: string | number, i, confirm) => {
|
104
|
+
onChange(val, index, confirm);
|
105
|
+
}}
|
106
|
+
/>)
|
107
|
+
};
|
108
|
+
|
109
|
+
const wrapHeight = itemHeight * +visibleItemCount;
|
110
|
+
const frameStyle = {height: `${itemHeight}px`};
|
111
|
+
const columnsStyle = {height: `${wrapHeight}px`};
|
112
|
+
const maskStyle = {
|
113
|
+
backgroundSize: `100% ${(wrapHeight - itemHeight) / 2}px`
|
114
|
+
};
|
115
|
+
|
116
|
+
return (
|
117
|
+
<div
|
118
|
+
className={cx(className, 'PickerColumns', 'PickerColumns-popOver')}
|
119
|
+
>
|
120
|
+
{showToolbar && <div className={cx('PickerColumns-toolbar')}>
|
121
|
+
<Button className="PickerColumns-cancel" level="default" onClick={close}>
|
122
|
+
{__('cancel')}
|
123
|
+
</Button>
|
124
|
+
<Button className="PickerColumns-confirm" level="primary" onClick={confirm}>
|
125
|
+
{__('confirm')}
|
126
|
+
</Button>
|
127
|
+
</div>}
|
128
|
+
<div className={cx('PickerColumns-columns')} style={columnsStyle}>
|
129
|
+
{
|
130
|
+
_columns.map((column: PickerColumnItem, index: number) => renderColumnItem(column, index))
|
131
|
+
}
|
132
|
+
<div className={cx('PickerColumns-mask')} style={maskStyle}></div>
|
133
|
+
<div className={cx('PickerColumns-frame')} style={frameStyle}></div>
|
134
|
+
</div>
|
135
|
+
</div>
|
136
|
+
);
|
137
|
+
});
|
138
|
+
|
139
|
+
export default themeable(
|
140
|
+
localeable(
|
141
|
+
uncontrollable(Picker, {
|
142
|
+
value: 'onChange'
|
143
|
+
})
|
144
|
+
)
|
145
|
+
);
|