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.
Files changed (68) hide show
  1. package/lib/components/Collapse.js +1 -1
  2. package/lib/components/Collapse.js.map +2 -2
  3. package/lib/components/DatePicker.d.ts +178 -84
  4. package/lib/components/DatePicker.js +25 -4
  5. package/lib/components/DatePicker.js.map +2 -2
  6. package/lib/components/calendar/Calendar.d.ts +8 -0
  7. package/lib/components/calendar/Calendar.js +4 -1
  8. package/lib/components/calendar/Calendar.js.map +2 -2
  9. package/lib/components/calendar/DaysView.d.ts +8 -0
  10. package/lib/components/calendar/DaysView.js +71 -0
  11. package/lib/components/calendar/DaysView.js.map +2 -2
  12. package/lib/index.js +1 -1
  13. package/lib/renderers/Form/InputDate.d.ts +25 -0
  14. package/lib/renderers/Form/InputDate.js +48 -3
  15. package/lib/renderers/Form/InputDate.js.map +2 -2
  16. package/lib/renderers/Status.js +1 -1
  17. package/lib/renderers/Status.js.map +2 -2
  18. package/lib/themes/ang-ie11.css +78 -1
  19. package/lib/themes/ang.css +78 -1
  20. package/lib/themes/ang.css.map +1 -1
  21. package/lib/themes/antd-ie11.css +78 -2
  22. package/lib/themes/antd.css +78 -2
  23. package/lib/themes/antd.css.map +1 -1
  24. package/lib/themes/cxd-ie11.css +86 -1
  25. package/lib/themes/cxd.css +86 -1
  26. package/lib/themes/cxd.css.map +1 -1
  27. package/lib/themes/dark-ie11.css +78 -1
  28. package/lib/themes/dark.css +78 -1
  29. package/lib/themes/dark.css.map +1 -1
  30. package/lib/themes/default.css +86 -1
  31. package/lib/themes/default.css.map +1 -1
  32. package/package.json +2 -2
  33. package/schema.json +52 -7
  34. package/scss/_properties.scss +1 -1
  35. package/scss/components/_calendar.scss +81 -0
  36. package/scss/components/_toast.scss +3 -0
  37. package/scss/themes/_antd-variables.scss +0 -2
  38. package/scss/themes/_common.scss +1 -0
  39. package/scss/themes/_cxd-variables.scss +9 -0
  40. package/sdk/ang-ie11.css +90 -1
  41. package/sdk/ang.css +90 -1
  42. package/sdk/antd-ie11.css +89 -0
  43. package/sdk/antd.css +90 -2
  44. package/sdk/charts.js +15 -15
  45. package/sdk/color-picker.js +65 -65
  46. package/sdk/cropperjs.js +2 -2
  47. package/sdk/cxd-ie11.css +90 -1
  48. package/sdk/cxd.css +98 -1
  49. package/sdk/dark-ie11.css +90 -1
  50. package/sdk/dark.css +90 -1
  51. package/sdk/exceljs.js +1 -1
  52. package/sdk/markdown.js +69 -69
  53. package/sdk/papaparse.js +1 -1
  54. package/sdk/renderers/Form/CityDB.js +1 -1
  55. package/sdk/rest.js +18 -18
  56. package/sdk/rich-text.js +62 -62
  57. package/sdk/sdk-ie11.css +90 -1
  58. package/sdk/sdk.css +98 -1
  59. package/sdk/sdk.js +1182 -1182
  60. package/sdk/thirds/hls.js/hls.js +1 -1
  61. package/sdk/thirds/mpegts.js/mpegts.js +1 -1
  62. package/sdk/tinymce.js +57 -57
  63. package/src/components/Collapse.tsx +1 -1
  64. package/src/components/DatePicker.tsx +41 -3
  65. package/src/components/calendar/Calendar.tsx +12 -1
  66. package/src/components/calendar/DaysView.tsx +89 -0
  67. package/src/renderers/Form/InputDate.tsx +83 -2
  68. 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 || collapsable === false,
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
  );
@@ -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">{placeholder}</span>
95
+ <span className="text-muted" key="status-value">
96
+ {placeholder}
97
+ </span>
96
98
  );
97
99
  let wrapClassName: string = '';
98
100