amis 1.5.2 → 1.5.3
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/lib/components/Collapse.js +1 -1
- package/lib/components/Collapse.js.map +2 -2
- package/lib/components/DatePicker.d.ts +178 -84
- package/lib/components/DatePicker.js +25 -4
- package/lib/components/DatePicker.js.map +2 -2
- package/lib/components/calendar/Calendar.d.ts +8 -0
- package/lib/components/calendar/Calendar.js +4 -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/index.js +1 -1
- 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/Status.js +1 -1
- package/lib/renderers/Status.js.map +2 -2
- package/lib/themes/ang-ie11.css +78 -1
- package/lib/themes/ang.css +78 -1
- package/lib/themes/ang.css.map +1 -1
- package/lib/themes/antd-ie11.css +78 -2
- package/lib/themes/antd.css +78 -2
- package/lib/themes/antd.css.map +1 -1
- package/lib/themes/cxd-ie11.css +86 -1
- package/lib/themes/cxd.css +86 -1
- package/lib/themes/cxd.css.map +1 -1
- package/lib/themes/dark-ie11.css +78 -1
- package/lib/themes/dark.css +78 -1
- package/lib/themes/dark.css.map +1 -1
- package/lib/themes/default.css +86 -1
- package/lib/themes/default.css.map +1 -1
- package/package.json +2 -2
- package/schema.json +52 -7
- package/scss/_properties.scss +1 -1
- package/scss/components/_calendar.scss +81 -0
- package/scss/components/_toast.scss +3 -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 +90 -1
- package/sdk/ang.css +90 -1
- package/sdk/antd-ie11.css +89 -0
- package/sdk/antd.css +90 -2
- package/sdk/charts.js +15 -15
- package/sdk/color-picker.js +65 -65
- package/sdk/cropperjs.js +2 -2
- package/sdk/cxd-ie11.css +90 -1
- package/sdk/cxd.css +98 -1
- package/sdk/dark-ie11.css +90 -1
- package/sdk/dark.css +90 -1
- 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 +90 -1
- package/sdk/sdk.css +98 -1
- package/sdk/sdk.js +1182 -1182
- 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/components/Collapse.tsx +1 -1
- package/src/components/DatePicker.tsx +41 -3
- package/src/components/calendar/Calendar.tsx +12 -1
- package/src/components/calendar/DaysView.tsx +89 -0
- package/src/renderers/Form/InputDate.tsx +83 -2
- package/src/renderers/Status.tsx +3 -1
@@ -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,15 @@ 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;
|
281
290
|
|
282
291
|
// 下面那个千万不要写,写了就会导致 keyof DateProps 得到的结果是 string | number;
|
283
292
|
// [propName: string]: any;
|
@@ -302,7 +311,8 @@ export class DatePicker extends React.Component<DateProps, DatePickerState> {
|
|
302
311
|
viewMode: 'days' as 'years' | 'months' | 'days' | 'time',
|
303
312
|
shortcuts: '',
|
304
313
|
closeOnSelect: true,
|
305
|
-
overlayPlacement: 'auto'
|
314
|
+
overlayPlacement: 'auto',
|
315
|
+
scheduleClassNames: ['bg-warning', 'bg-danger', 'bg-success', 'bg-info', 'bg-secondary']
|
306
316
|
};
|
307
317
|
state: DatePickerState = {
|
308
318
|
isOpened: false,
|
@@ -546,7 +556,11 @@ export class DatePicker extends React.Component<DateProps, DatePickerState> {
|
|
546
556
|
format,
|
547
557
|
borderMode,
|
548
558
|
embed,
|
549
|
-
minDate
|
559
|
+
minDate,
|
560
|
+
schedules,
|
561
|
+
largeMode,
|
562
|
+
scheduleClassNames,
|
563
|
+
onScheduleClick
|
550
564
|
} = this.props;
|
551
565
|
|
552
566
|
const __ = this.props.translate;
|
@@ -554,12 +568,33 @@ export class DatePicker extends React.Component<DateProps, DatePickerState> {
|
|
554
568
|
let date: moment.Moment | undefined = this.state.value;
|
555
569
|
|
556
570
|
if (embed) {
|
571
|
+
let schedulesData: DateProps['schedules'] = undefined;
|
572
|
+
if (schedules && Array.isArray(schedules)) {
|
573
|
+
// 设置日程颜色
|
574
|
+
let index = 0;
|
575
|
+
schedulesData = schedules.map((schedule: any) => {
|
576
|
+
let className = schedule.className;
|
577
|
+
if (!className && scheduleClassNames) {
|
578
|
+
className = scheduleClassNames[index];
|
579
|
+
index++;
|
580
|
+
if (index >= scheduleClassNames.length) {
|
581
|
+
index = 0;
|
582
|
+
}
|
583
|
+
}
|
584
|
+
return {
|
585
|
+
...schedule,
|
586
|
+
className
|
587
|
+
};
|
588
|
+
});
|
589
|
+
}
|
557
590
|
return (
|
558
591
|
<div
|
559
592
|
className={cx(
|
560
593
|
`DateCalendar`,
|
561
594
|
{
|
562
|
-
'is-disabled': disabled
|
595
|
+
'is-disabled': disabled,
|
596
|
+
'ScheduleCalendar': schedulesData,
|
597
|
+
'ScheduleCalendar-large': largeMode
|
563
598
|
},
|
564
599
|
className
|
565
600
|
)}
|
@@ -578,6 +613,9 @@ export class DatePicker extends React.Component<DateProps, DatePickerState> {
|
|
578
613
|
locale={locale}
|
579
614
|
minDate={minDate}
|
580
615
|
// utc={utc}
|
616
|
+
schedules={schedulesData}
|
617
|
+
largeMode={largeMode}
|
618
|
+
onScheduleClick={onScheduleClick}
|
581
619
|
/>
|
582
620
|
</div>
|
583
621
|
);
|
@@ -28,6 +28,14 @@ interface BaseDatePickerProps
|
|
28
28
|
year?: number,
|
29
29
|
date?: moment.Moment
|
30
30
|
) => JSX.Element;
|
31
|
+
schedules?: Array<{
|
32
|
+
startTime: Date;
|
33
|
+
endTime: Date;
|
34
|
+
content: string | React.ReactElement;
|
35
|
+
color?: string;
|
36
|
+
}>;
|
37
|
+
largeMode?: boolean;
|
38
|
+
onScheduleClick?: (scheduleData: any) => void;
|
31
39
|
}
|
32
40
|
|
33
41
|
class BaseDatePicker extends ReactDatePicker {
|
@@ -82,7 +90,10 @@ class BaseDatePicker extends ReactDatePicker {
|
|
82
90
|
'nextIcon',
|
83
91
|
'isEndDate',
|
84
92
|
'classnames',
|
85
|
-
'minDate'
|
93
|
+
'minDate',
|
94
|
+
'schedules',
|
95
|
+
'largeMode',
|
96
|
+
'onScheduleClick'
|
86
97
|
].forEach(key => (props[key] = (this.props as any)[key]));
|
87
98
|
|
88
99
|
return props;
|
@@ -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,86 @@ 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
|
+
<div className={cx('ScheduleCalendar-text-overflow')}>{item.content}</div>
|
190
|
+
</div>;
|
191
|
+
});
|
192
|
+
return <td {...props} onClick={() => this.props.onScheduleClick && this.props.onScheduleClick(scheduleData)}>
|
193
|
+
<div className={cx('ScheduleCalendar-large-day-wrap')}>
|
194
|
+
<div className={cx('ScheduleCalendar-large-schedule-header')}>{currentDate.date()}</div>
|
195
|
+
{scheduleDiv}
|
196
|
+
{schedule.length > 3 && <div className={cx('ScheduleCalendar-large-schedule-footer')}>{schedule.length - 3} {__('more')}</div>}
|
197
|
+
</div>
|
198
|
+
</td>
|
199
|
+
}
|
200
|
+
|
201
|
+
// 正常模式
|
202
|
+
const ScheduleIcon = <span className={cx('ScheduleCalendar-icon', schedule[0].className)}></span>;
|
203
|
+
return <td {...props} onClick={() => this.props.onScheduleClick && this.props.onScheduleClick(scheduleData)}>
|
204
|
+
{currentDate.date()}
|
205
|
+
{ScheduleIcon}
|
206
|
+
</td>;
|
207
|
+
}
|
208
|
+
}
|
120
209
|
return <td {...props}>{currentDate.date()}</td>;
|
121
210
|
};
|
122
211
|
|
@@ -1,10 +1,12 @@
|
|
1
1
|
import React from 'react';
|
2
2
|
import {FormItem, FormControlProps, FormBaseControl} from './Item';
|
3
3
|
import cx from 'classnames';
|
4
|
-
import {filterDate} from '../../utils/tpl-builtin';
|
4
|
+
import {filterDate, isPureVariable, resolveVariableAndFilter} from '../../utils/tpl-builtin';
|
5
5
|
import moment from 'moment';
|
6
6
|
import 'moment/locale/zh-cn';
|
7
7
|
import DatePicker from '../../components/DatePicker';
|
8
|
+
import {SchemaObject} from '../../Schema';
|
9
|
+
import {createObject, anyChanged} from '../../utils/helper';
|
8
10
|
|
9
11
|
export interface InputDateBaseControlSchema extends FormBaseControl {
|
10
12
|
/**
|
@@ -85,6 +87,24 @@ export interface DateControlSchema extends InputDateBaseControlSchema {
|
|
85
87
|
* 限制最大日期
|
86
88
|
*/
|
87
89
|
maxDate?: string;
|
90
|
+
|
91
|
+
/**
|
92
|
+
* 日程
|
93
|
+
*/
|
94
|
+
schedules?: Array<{
|
95
|
+
startTime: Date,
|
96
|
+
endTime: Date,
|
97
|
+
content: any,
|
98
|
+
className?: string
|
99
|
+
}> | string;
|
100
|
+
/**
|
101
|
+
* 日程显示颜色自定义
|
102
|
+
*/
|
103
|
+
scheduleClassNames?: Array<string>;
|
104
|
+
/**
|
105
|
+
* 日程点击展示
|
106
|
+
*/
|
107
|
+
scheduleAction?: SchemaObject;
|
88
108
|
}
|
89
109
|
|
90
110
|
/**
|
@@ -267,6 +287,12 @@ export interface DateProps extends FormControlProps {
|
|
267
287
|
interface DateControlState {
|
268
288
|
minDate?: moment.Moment;
|
269
289
|
maxDate?: moment.Moment;
|
290
|
+
schedules?: Array<{
|
291
|
+
startTime: Date,
|
292
|
+
endTime: Date,
|
293
|
+
content: any,
|
294
|
+
className?: string
|
295
|
+
}>;
|
270
296
|
}
|
271
297
|
|
272
298
|
export default class DateControl extends React.PureComponent<
|
@@ -304,9 +330,18 @@ export default class DateControl extends React.PureComponent<
|
|
304
330
|
setPrinstineValue((utc ? moment.utc(date) : date).format(format));
|
305
331
|
}
|
306
332
|
|
333
|
+
let schedulesData = props.schedules;
|
334
|
+
if (typeof schedulesData === 'string') {
|
335
|
+
const resolved = resolveVariableAndFilter(schedulesData, data, '| raw');
|
336
|
+
if (Array.isArray(resolved)) {
|
337
|
+
schedulesData = resolved;
|
338
|
+
}
|
339
|
+
}
|
340
|
+
|
307
341
|
this.state = {
|
308
342
|
minDate: minDate ? filterDate(minDate, data, format) : undefined,
|
309
|
-
maxDate: maxDate ? filterDate(maxDate, data, format) : undefined
|
343
|
+
maxDate: maxDate ? filterDate(maxDate, data, format) : undefined,
|
344
|
+
schedules: schedulesData
|
310
345
|
};
|
311
346
|
}
|
312
347
|
|
@@ -334,6 +369,47 @@ export default class DateControl extends React.PureComponent<
|
|
334
369
|
: undefined
|
335
370
|
});
|
336
371
|
}
|
372
|
+
|
373
|
+
if (anyChanged(['schedules', 'data'], prevProps, props)
|
374
|
+
&& (typeof props.schedules === 'string' && isPureVariable(props.schedules))
|
375
|
+
) {
|
376
|
+
const schedulesData = resolveVariableAndFilter(props.schedules, props.data, '| raw');
|
377
|
+
const preSchedulesData = resolveVariableAndFilter(prevProps.schedules, prevProps.data, '| raw');
|
378
|
+
if (Array.isArray(schedulesData) && preSchedulesData !== schedulesData) {
|
379
|
+
this.setState({
|
380
|
+
schedules: schedulesData
|
381
|
+
})
|
382
|
+
}
|
383
|
+
}
|
384
|
+
}
|
385
|
+
|
386
|
+
// 日程点击事件
|
387
|
+
onScheduleClick(scheduleData: any) {
|
388
|
+
const {scheduleAction, onAction, data, translate: __} = this.props;
|
389
|
+
const defaultscheduleAction = {
|
390
|
+
actionType: 'dialog',
|
391
|
+
dialog: {
|
392
|
+
title: __('Schedule'),
|
393
|
+
actions: [],
|
394
|
+
body: {
|
395
|
+
type: 'table',
|
396
|
+
columns: [
|
397
|
+
{
|
398
|
+
name: 'time',
|
399
|
+
label: __('Time')
|
400
|
+
},
|
401
|
+
{
|
402
|
+
name: 'content',
|
403
|
+
label: __('Content')
|
404
|
+
}
|
405
|
+
],
|
406
|
+
data: '${scheduleData}'
|
407
|
+
}
|
408
|
+
}
|
409
|
+
};
|
410
|
+
|
411
|
+
onAction && onAction(null, scheduleAction || defaultscheduleAction, createObject(data, scheduleData));
|
412
|
+
|
337
413
|
}
|
338
414
|
|
339
415
|
render() {
|
@@ -348,6 +424,8 @@ export default class DateControl extends React.PureComponent<
|
|
348
424
|
format,
|
349
425
|
timeFormat,
|
350
426
|
valueFormat,
|
427
|
+
largeMode,
|
428
|
+
render,
|
351
429
|
...rest
|
352
430
|
} = this.props;
|
353
431
|
|
@@ -363,6 +441,9 @@ export default class DateControl extends React.PureComponent<
|
|
363
441
|
format={valueFormat || format}
|
364
442
|
{...this.state}
|
365
443
|
classnames={cx}
|
444
|
+
schedules={this.state.schedules}
|
445
|
+
largeMode={largeMode}
|
446
|
+
onScheduleClick={this.onScheduleClick.bind(this)}
|
366
447
|
/>
|
367
448
|
</div>
|
368
449
|
);
|
package/src/renderers/Status.tsx
CHANGED
@@ -92,7 +92,9 @@ export class StatusField extends React.Component<StatusProps, object> {
|
|
92
92
|
} = this.props;
|
93
93
|
let value = getPropValue(this.props);
|
94
94
|
let viewValue: React.ReactNode = (
|
95
|
-
<span className="text-muted">
|
95
|
+
<span className="text-muted" key="status-value">
|
96
|
+
{placeholder}
|
97
|
+
</span>
|
96
98
|
);
|
97
99
|
let wrapClassName: string = '';
|
98
100
|
|