amis 1.8.0-beta.0 → 1.8.0-beta.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 (217) hide show
  1. package/lib/SchemaRenderer.js +19 -3
  2. package/lib/SchemaRenderer.js.map +2 -2
  3. package/lib/WithRootStore.d.ts +18 -0
  4. package/lib/WithStore.js +2 -1
  5. package/lib/WithStore.js.map +2 -2
  6. package/lib/actions/CmptAction.js +14 -3
  7. package/lib/actions/CmptAction.js.map +2 -2
  8. package/lib/components/BarCode.js +1 -1
  9. package/lib/components/BarCode.js.map +2 -2
  10. package/lib/components/DatePicker.d.ts +3 -0
  11. package/lib/components/DatePicker.js +56 -11
  12. package/lib/components/DatePicker.js.map +2 -2
  13. package/lib/components/DateRangePicker.d.ts +92 -84
  14. package/lib/components/DateRangePicker.js +198 -5
  15. package/lib/components/DateRangePicker.js.map +2 -2
  16. package/lib/components/MonthRangePicker.d.ts +84 -84
  17. package/lib/components/Progress.js +12 -9
  18. package/lib/components/Progress.js.map +2 -2
  19. package/lib/components/Radios.d.ts +1 -1
  20. package/lib/components/Radios.js +3 -5
  21. package/lib/components/Radios.js.map +2 -2
  22. package/lib/components/Range.d.ts +2 -2
  23. package/lib/components/Range.js +24 -11
  24. package/lib/components/Range.js.map +2 -2
  25. package/lib/components/Steps.d.ts +6 -0
  26. package/lib/components/Steps.js +13 -9
  27. package/lib/components/Steps.js.map +2 -2
  28. package/lib/components/calendar/Calendar.js +16 -12
  29. package/lib/components/calendar/Calendar.js.map +2 -2
  30. package/lib/components/calendar/YearsView.js +3 -3
  31. package/lib/components/calendar/YearsView.js.map +2 -2
  32. package/lib/components/formula/Editor.d.ts +3 -1
  33. package/lib/components/formula/Editor.js +20 -2
  34. package/lib/components/formula/Editor.js.map +2 -2
  35. package/lib/components/formula/Picker.d.ts +5 -0
  36. package/lib/components/formula/Picker.js +19 -4
  37. package/lib/components/formula/Picker.js.map +2 -2
  38. package/lib/factory.d.ts +4 -0
  39. package/lib/factory.js +8 -2
  40. package/lib/factory.js.map +2 -2
  41. package/lib/index.js +1 -1
  42. package/lib/locale/de-DE.js +13 -0
  43. package/lib/locale/de-DE.js.map +2 -2
  44. package/lib/locale/en-US.js +13 -0
  45. package/lib/locale/en-US.js.map +2 -2
  46. package/lib/locale/zh-CN.js +13 -0
  47. package/lib/locale/zh-CN.js.map +2 -2
  48. package/lib/renderers/Action.d.ts +2 -0
  49. package/lib/renderers/Action.js +23 -5
  50. package/lib/renderers/Action.js.map +2 -2
  51. package/lib/renderers/Carousel.d.ts +1 -0
  52. package/lib/renderers/Carousel.js +13 -1
  53. package/lib/renderers/Carousel.js.map +2 -2
  54. package/lib/renderers/Dialog.d.ts +4 -0
  55. package/lib/renderers/Dialog.js +4 -3
  56. package/lib/renderers/Dialog.js.map +2 -2
  57. package/lib/renderers/DropDownButton.d.ts +2 -0
  58. package/lib/renderers/DropDownButton.js +13 -4
  59. package/lib/renderers/DropDownButton.js.map +2 -2
  60. package/lib/renderers/Form/Checkboxes.d.ts +2 -2
  61. package/lib/renderers/Form/Checkboxes.js +2 -6
  62. package/lib/renderers/Form/Checkboxes.js.map +2 -2
  63. package/lib/renderers/Form/Combo.js +3 -2
  64. package/lib/renderers/Form/Combo.js.map +2 -2
  65. package/lib/renderers/Form/InputCity.d.ts +3 -0
  66. package/lib/renderers/Form/InputCity.js +44 -2
  67. package/lib/renderers/Form/InputCity.js.map +2 -2
  68. package/lib/renderers/Form/InputDateRange.d.ts +5 -0
  69. package/lib/renderers/Form/InputDateRange.js.map +2 -2
  70. package/lib/renderers/Form/InputFile.js +6 -3
  71. package/lib/renderers/Form/InputFile.js.map +2 -2
  72. package/lib/renderers/Form/InputFormula.d.ts +4 -0
  73. package/lib/renderers/Form/InputFormula.js +2 -2
  74. package/lib/renderers/Form/InputFormula.js.map +2 -2
  75. package/lib/renderers/Form/InputImage.js +6 -3
  76. package/lib/renderers/Form/InputImage.js.map +2 -2
  77. package/lib/renderers/Form/InputRange.js +13 -14
  78. package/lib/renderers/Form/InputRange.js.map +2 -2
  79. package/lib/renderers/Form/InputTable.js +4 -2
  80. package/lib/renderers/Form/InputTable.js.map +2 -2
  81. package/lib/renderers/Form/Item.d.ts +11 -6
  82. package/lib/renderers/Form/index.js +1 -1
  83. package/lib/renderers/Form/index.js.map +2 -2
  84. package/lib/renderers/Form/wrapControl.d.ts +9 -0
  85. package/lib/renderers/Form/wrapControl.js +1 -1
  86. package/lib/renderers/Form/wrapControl.js.map +2 -2
  87. package/lib/renderers/Nav.js +2 -2
  88. package/lib/renderers/Nav.js.map +2 -2
  89. package/lib/renderers/Page.js +2 -3
  90. package/lib/renderers/Page.js.map +2 -2
  91. package/lib/renderers/Progress.d.ts +1 -1
  92. package/lib/renderers/Progress.js +1 -1
  93. package/lib/renderers/Progress.js.map +2 -2
  94. package/lib/renderers/Steps.d.ts +8 -0
  95. package/lib/renderers/Steps.js +2 -2
  96. package/lib/renderers/Steps.js.map +2 -2
  97. package/lib/renderers/Table/TableRow.js +1 -1
  98. package/lib/renderers/Table/TableRow.js.map +2 -2
  99. package/lib/renderers/Table/index.js +7 -3
  100. package/lib/renderers/Table/index.js.map +2 -2
  101. package/lib/renderers/Tabs.d.ts +4 -0
  102. package/lib/renderers/Tabs.js +22 -6
  103. package/lib/renderers/Tabs.js.map +2 -2
  104. package/lib/renderers/Wizard.d.ts +6 -3
  105. package/lib/renderers/Wizard.js +257 -152
  106. package/lib/renderers/Wizard.js.map +2 -2
  107. package/lib/store/index.d.ts +5 -0
  108. package/lib/store/index.js +14 -0
  109. package/lib/store/index.js.map +2 -2
  110. package/lib/store/table.js +4 -4
  111. package/lib/store/table.js.map +2 -2
  112. package/lib/themes/ang-ie11.css +194 -23
  113. package/lib/themes/ang.css +193 -22
  114. package/lib/themes/ang.css.map +1 -1
  115. package/lib/themes/antd-ie11.css +194 -23
  116. package/lib/themes/antd.css +193 -22
  117. package/lib/themes/antd.css.map +1 -1
  118. package/lib/themes/cxd-ie11.css +194 -23
  119. package/lib/themes/cxd.css +193 -22
  120. package/lib/themes/cxd.css.map +1 -1
  121. package/lib/themes/dark-ie11.css +194 -23
  122. package/lib/themes/dark.css +193 -22
  123. package/lib/themes/dark.css.map +1 -1
  124. package/lib/themes/default-ie11.css +194 -23
  125. package/lib/themes/default.css +193 -22
  126. package/lib/themes/default.css.map +1 -1
  127. package/lib/types.d.ts +1 -1
  128. package/lib/types.js.map +1 -1
  129. package/lib/utils/columnsSplit.d.ts +1 -0
  130. package/lib/utils/columnsSplit.js +40 -0
  131. package/lib/utils/columnsSplit.js.map +13 -0
  132. package/lib/utils/debug.d.ts +1 -1
  133. package/lib/utils/debug.js +16 -22
  134. package/lib/utils/debug.js.map +2 -2
  135. package/package.json +1 -1
  136. package/schema.json +181 -30
  137. package/scss/_properties.scss +2 -2
  138. package/scss/components/_barcode.scss +1 -1
  139. package/scss/components/_carousel.scss +1 -0
  140. package/scss/components/_debug.scss +3 -3
  141. package/scss/components/_formula.scss +18 -0
  142. package/scss/components/_progress.scss +3 -8
  143. package/scss/components/_steps.scss +199 -8
  144. package/scss/components/form/_date.scss +14 -0
  145. package/scss/components/form/_editor.scss +2 -1
  146. package/sdk/ang-ie11.css +234 -25
  147. package/sdk/ang.css +233 -24
  148. package/sdk/antd-ie11.css +234 -25
  149. package/sdk/antd.css +233 -24
  150. package/sdk/barcode.js +51 -51
  151. package/sdk/charts.js +14 -14
  152. package/sdk/codemirror.js +7 -7
  153. package/sdk/color-picker.js +65 -65
  154. package/sdk/cropperjs.js +2 -2
  155. package/sdk/cxd-ie11.css +234 -25
  156. package/sdk/cxd.css +233 -24
  157. package/sdk/dark-ie11.css +234 -25
  158. package/sdk/dark.css +233 -24
  159. package/sdk/exceljs.js +1 -1
  160. package/sdk/locale/de-DE.js +13 -0
  161. package/sdk/markdown.js +69 -69
  162. package/sdk/papaparse.js +1 -1
  163. package/sdk/renderers/Form/CityDB.js +1 -1
  164. package/sdk/rest.js +17 -17
  165. package/sdk/rich-text.js +62 -62
  166. package/sdk/sdk-ie11.css +234 -25
  167. package/sdk/sdk.css +233 -24
  168. package/sdk/sdk.js +1290 -1288
  169. package/sdk/thirds/hls.js/hls.js +1 -1
  170. package/sdk/thirds/mpegts.js/mpegts.js +1 -1
  171. package/sdk/tinymce.js +57 -57
  172. package/src/SchemaRenderer.tsx +32 -14
  173. package/src/WithStore.tsx +3 -1
  174. package/src/actions/CmptAction.ts +18 -0
  175. package/src/components/BarCode.tsx +2 -2
  176. package/src/components/DatePicker.tsx +77 -22
  177. package/src/components/DateRangePicker.tsx +198 -4
  178. package/src/components/Progress.tsx +8 -12
  179. package/src/components/Radios.tsx +6 -17
  180. package/src/components/Range.tsx +26 -12
  181. package/src/components/Steps.tsx +28 -27
  182. package/src/components/calendar/Calendar.tsx +17 -12
  183. package/src/components/calendar/YearsView.tsx +3 -4
  184. package/src/components/formula/Editor.tsx +34 -3
  185. package/src/components/formula/Picker.tsx +28 -1
  186. package/src/factory.tsx +15 -2
  187. package/src/locale/de-DE.ts +13 -0
  188. package/src/locale/en-US.ts +13 -0
  189. package/src/locale/zh-CN.ts +13 -0
  190. package/src/renderers/Action.tsx +22 -1
  191. package/src/renderers/Carousel.tsx +8 -0
  192. package/src/renderers/Dialog.tsx +17 -3
  193. package/src/renderers/DropDownButton.tsx +14 -3
  194. package/src/renderers/Form/Checkboxes.tsx +5 -18
  195. package/src/renderers/Form/Combo.tsx +2 -3
  196. package/src/renderers/Form/InputCity.tsx +33 -4
  197. package/src/renderers/Form/InputDateRange.tsx +8 -1
  198. package/src/renderers/Form/InputFile.tsx +7 -3
  199. package/src/renderers/Form/InputFormula.tsx +7 -0
  200. package/src/renderers/Form/InputImage.tsx +7 -3
  201. package/src/renderers/Form/InputRange.tsx +18 -16
  202. package/src/renderers/Form/InputTable.tsx +6 -2
  203. package/src/renderers/Form/index.tsx +1 -1
  204. package/src/renderers/Form/wrapControl.tsx +1 -1
  205. package/src/renderers/Nav.tsx +1 -1
  206. package/src/renderers/Page.tsx +1 -2
  207. package/src/renderers/Progress.tsx +2 -2
  208. package/src/renderers/Steps.tsx +14 -0
  209. package/src/renderers/Table/TableRow.tsx +1 -1
  210. package/src/renderers/Table/index.tsx +11 -2
  211. package/src/renderers/Tabs.tsx +75 -28
  212. package/src/renderers/Wizard.tsx +154 -93
  213. package/src/store/index.ts +20 -0
  214. package/src/store/table.ts +4 -4
  215. package/src/types.ts +3 -1
  216. package/src/utils/columnsSplit.tsx +57 -0
  217. package/src/utils/debug.tsx +17 -24
@@ -11,11 +11,11 @@ import difference from 'lodash/difference';
11
11
  import React from 'react';
12
12
  import {uncontrollable} from 'uncontrollable';
13
13
 
14
- import {RendererProps} from '../factory';
15
14
  import Overlay from './Overlay';
16
- import {ThemeProps, themeable} from '../theme';
15
+ import type { ThemeProps } from '../theme'
16
+ import {themeable} from '../theme';
17
17
  import {autobind, camel} from '../utils/helper';
18
- import {
18
+ import type {
19
19
  MultipleValue,
20
20
  Value,
21
21
  FormatValue,
@@ -71,7 +71,7 @@ interface LabelProps extends ThemeProps {
71
71
  * @returns position.left
72
72
  */
73
73
  const valueToOffsetLeft = (value: any, min: number, max: number) =>
74
- (value * 100) / (max - min) + '%';
74
+ ((value - min) * 100) / (max - min) + '%';
75
75
 
76
76
  /**
77
77
  * 滑块handle
@@ -298,7 +298,7 @@ export class Range extends React.Component<RangeItemProps, any> {
298
298
  pageXToValue(pageX: number) {
299
299
  const {x, width} = this.getBoundingClient(this.trackRef.current as Element);
300
300
  const {max, min} = this.props;
301
- return ((pageX - x) * (max - min)) / width;
301
+ return ((pageX - x) * (max - min)) / width + min;
302
302
  }
303
303
 
304
304
  /**
@@ -366,16 +366,30 @@ export class Range extends React.Component<RangeItemProps, any> {
366
366
  */
367
367
  @autobind
368
368
  renderSteps() {
369
- const {max, min, step, showSteps, classnames: cx} = this.props;
370
- const steps = Math.floor((max - min) / step);
369
+ const {max, min, step, showSteps, classnames: cx, parts} = this.props;
370
+ let isShowSteps = showSteps;
371
+ // 只要设置了 parts 就展示分隔
372
+ if (parts > 1 || Array.isArray(parts)) {
373
+ isShowSteps = true;
374
+ }
375
+ // 总区间
376
+ const section = max - min;
377
+ // 总区间被平均分为多少块
378
+ const steps = parts > 1 ? parts : Math.floor(section / step);
379
+ // 平均分 每块的长度
380
+ const partLength = section / steps;
381
+ // parts为数组时,以0为起点(传入的值 - min)
382
+ const partLengthList = Array.isArray(parts)
383
+ ? parts.map(item => item - min)
384
+ : range(steps - 1).map(item => (item + 1) * partLength);
371
385
  return (
372
- showSteps && (
386
+ isShowSteps && (
373
387
  <div>
374
- {range(steps - 1).map(item => (
388
+ {partLengthList.map(item => (
375
389
  <span
376
390
  key={item}
377
391
  className={cx('InputRange-track-dot')}
378
- style={{left: ((item + 1) * 100) / steps + '%'}}
392
+ style={{left: (item * 100) / (max - min) + '%'}}
379
393
  ></span>
380
394
  ))}
381
395
  </div>
@@ -437,13 +451,13 @@ export class Range extends React.Component<RangeItemProps, any> {
437
451
  const traceActiveStyle = {
438
452
  width: valueToOffsetLeft(
439
453
  multiple
440
- ? (value as MultipleValue).max - (value as MultipleValue).min
454
+ ? (value as MultipleValue).max - (value as MultipleValue).min + min
441
455
  : value,
442
456
  min,
443
457
  max
444
458
  ),
445
459
  left: valueToOffsetLeft(
446
- multiple ? (value as MultipleValue).min : 0,
460
+ multiple ? (value as MultipleValue).min : min,
447
461
  min,
448
462
  max
449
463
  )
@@ -69,8 +69,12 @@ export interface StepsSchema extends BaseSchema {
69
69
  * 展示模式
70
70
  */
71
71
  mode?: 'horizontal' | 'vertical';
72
- }
73
72
 
73
+ /**
74
+ * 标签放置位置
75
+ */
76
+ labelPlacement?: 'horizontal' | 'vertical';
77
+ }
74
78
  export interface StepsProps extends ThemeProps {
75
79
  steps: StepSchema[];
76
80
  className: string;
@@ -81,6 +85,8 @@ export interface StepsProps extends ThemeProps {
81
85
  [propName: string]: StepStatus;
82
86
  };
83
87
  mode?: 'horizontal' | 'vertical';
88
+ labelPlacement?: 'horizontal' | 'vertical';
89
+ progressDot?: boolean;
84
90
  useMobileUI?: boolean;
85
91
  }
86
92
 
@@ -92,6 +98,8 @@ export function Steps(props: StepsProps) {
92
98
  current,
93
99
  status,
94
100
  mode = 'horizontal',
101
+ labelPlacement = 'horizontal',
102
+ progressDot = false,
95
103
  useMobileUI
96
104
  } = props;
97
105
  const FINISH_ICON = 'check';
@@ -129,48 +137,41 @@ export function Steps(props: StepsProps) {
129
137
 
130
138
  const mobileUI = useMobileUI && isMobile();
131
139
  return (
132
- <ul
133
- className={cx(
134
- 'Steps',
135
- `Steps--${mode}`,
136
- mobileUI ? 'Steps-mobile' : '',
137
- className
138
- )}
139
- >
140
+ <ul className={cx( // 纵向步骤条暂时不支持labelPlacement属性
141
+ 'Steps',
142
+ `Steps--Placement-${(progressDot || (labelPlacement === 'vertical' && mode != 'vertical')) ? 'vertical' : ''}`,
143
+ `Steps--${progressDot ? 'ProgressDot' : ''}`,
144
+ `Steps--${mode}`,
145
+ mobileUI ? 'Steps-mobile' : '', className)}>
140
146
  {stepsRow.map((step, i) => {
141
147
  const {stepStatus, icon} = getStepStatus(step, i);
142
-
143
148
  return (
144
149
  <li
145
150
  key={i}
146
- className={cx('StepsItem', `is-${stepStatus}`, step.className)}
151
+ className={cx('StepsItem', `is-${stepStatus}`, step.className, `StepsItem-${progressDot ? 'ProgressDot' : ''}`)}
147
152
  >
148
153
  <div className={cx('StepsItem-container')}>
149
- <div
150
- className={cx(
151
- 'StepsItem-containerIcon',
152
- i < current && 'is-success'
153
- )}
154
- >
155
- <span className={cx('StepsItem-icon')}>
156
- {icon ? <Icon icon={icon} className="icon" /> : i + 1}
157
- </span>
158
- </div>
154
+ <div className={cx('StepsItem-containerTail')}></div>
155
+ {progressDot ? <div className={cx('StepsItem-containerProgressDot')}></div>
156
+ : <div className={cx('StepsItem-containerIcon', i < current && 'is-success')}>
157
+ <span className={cx('StepsItem-icon')}>
158
+ {icon ? <Icon icon={icon} className="icon" /> : i + 1}
159
+ </span>
160
+ </div>}
159
161
  <div className={cx('StepsItem-containerWrapper')}>
160
162
  <div className={cx('StepsItem-body')}>
161
163
  <div
162
164
  className={cx(
163
165
  'StepsItem-title',
166
+ `StepsItem-${progressDot ? 'vertical-ProgressDot' : ''}`,
164
167
  i < current && 'is-success'
165
168
  )}
166
169
  >
167
- <span>{step.title}</span>
168
- <span className={cx('StepsItem-subTitle')}>
169
- {step.subTitle}
170
- </span>
170
+ <span className={cx('StepsItem-ellText')} title={String(step.title)}>{step.title}</span>
171
+ <span className={cx('StepsItem-subTitle', 'StepsItem-ellText')} title={String(step.subTitle)}>{step.subTitle}</span>
171
172
  </div>
172
- <div className={cx('StepsItem-description')}>
173
- {step.description}
173
+ <div className={cx('StepsItem-description', 'StepsItem-ellText')} title={String(step.description)}>
174
+ <span>{step.description}</span>
174
175
  </div>
175
176
  </div>
176
177
  </div>
@@ -161,18 +161,19 @@ class BaseDatePicker extends React.Component<
161
161
  updatedState = this.getStateFromProps(props);
162
162
  }
163
163
 
164
- if (updatedState.open === undefined) {
165
- if (typeof props.open !== 'undefined') {
166
- updatedState.open = props.open;
167
- } else if (
168
- prevProps.closeOnSelect &&
169
- this.state.currentView !== viewModes.TIME
170
- ) {
171
- updatedState.open = false;
172
- } else {
173
- updatedState.open = this.state.open;
174
- }
175
- }
164
+ // open 是外部控制了
165
+ // if (updatedState.open === undefined) {
166
+ // if (typeof props.open !== 'undefined') {
167
+ // updatedState.open = props.open;
168
+ // } else if (
169
+ // prevProps.closeOnSelect &&
170
+ // this.state.currentView !== viewModes.TIME
171
+ // ) {
172
+ // updatedState.open = false;
173
+ // } else {
174
+ // updatedState.open = this.state.open;
175
+ // }
176
+ // }
176
177
 
177
178
  if (props.viewMode !== prevProps.viewMode) {
178
179
  updatedState.currentView = props.viewMode;
@@ -236,6 +237,10 @@ class BaseDatePicker extends React.Component<
236
237
  updatedState.viewDate = moment(props.viewDate);
237
238
  }
238
239
 
240
+ if (Object.keys(updatedState).length) {
241
+ this.setState(updatedState);
242
+ }
243
+
239
244
  this.checkTZ(props);
240
245
  }
241
246
 
@@ -75,10 +75,6 @@ export class CustomYearsView extends React.Component<CustomYearsViewProps> {
75
75
  .clone()
76
76
  .set({year: year, month: irrelevantMonth, date: irrelevantDate});
77
77
 
78
- // Not sure what 'rdtOld' is for, commenting out for now as it's not working properly
79
- // if ( i === -1 | i === 10 )
80
- // classes += ' rdtOld';
81
-
82
78
  noOfDaysInYear = parseInt(currentYear.endOf('year').format('DDD'), 10);
83
79
  daysInYear = Array.from({length: noOfDaysInYear}, function (e, i) {
84
80
  return i + 1;
@@ -95,6 +91,9 @@ export class CustomYearsView extends React.Component<CustomYearsViewProps> {
95
91
 
96
92
  if (selectedDate && selectedDate.year() === year) classes += ' rdtActive';
97
93
 
94
+ // 第一个和最后一个置灰
95
+ if (i === -1 || i === 10) classes += ' text-muted';
96
+
98
97
  props = {
99
98
  'key': year,
100
99
  'data-value': year,
@@ -10,7 +10,7 @@ import {FormulaPlugin, editorFactory} from './plugin';
10
10
  import FuncList from './FuncList';
11
11
  import {VariableList} from './VariableList';
12
12
  import CodeMirrorEditor from '../CodeMirror';
13
- import {autobind} from '../../utils/helper';
13
+ import {autobind, eachTree} from '../../utils/helper';
14
14
  import {themeable, ThemeProps} from '../../theme';
15
15
  import {localeable, LocaleProps} from '../../locale';
16
16
 
@@ -133,8 +133,39 @@ export class FormulaEditor extends React.Component<
133
133
  variables: Array<VariableItem>,
134
134
  functions: Array<FuncGroup>
135
135
  ) {
136
- // todo 高亮原始文本
137
- return value;
136
+ if (!Array.isArray(variables) || !variables.length || !value) {
137
+ return;
138
+ }
139
+
140
+ const varMap: {
141
+ [propname: string]: string;
142
+ } = {};
143
+
144
+ eachTree(
145
+ variables,
146
+ item => item.value && (varMap[item.value] = item.label)
147
+ );
148
+ const vars = Object.keys(varMap).sort((a, b) => b.length - a.length);
149
+ let content = value || '';
150
+
151
+ // 标记方法调用
152
+ content = content.replace(/([A-Z]+)\s*\(/g, (_, func, pos) => {
153
+ return _?.replace(func, `<span class="c-func">${func}</span>`);
154
+ });
155
+
156
+ vars.forEach(v => {
157
+ let from = 0;
158
+ let idx = -1;
159
+ while (~(idx = content.indexOf(v, from))) {
160
+ content = content.replace(
161
+ v,
162
+ `<span class="c-field">${varMap[v]}</span>`
163
+ );
164
+ from = idx + v.length;
165
+ }
166
+ });
167
+
168
+ return {html: content};
138
169
  }
139
170
 
140
171
  componentWillUnmount() {
@@ -69,6 +69,11 @@ export interface FormulaPickerProps extends FormulaEditorProps {
69
69
  */
70
70
  disabled?: boolean;
71
71
 
72
+ /**
73
+ * 是否允许输入,否需要点击fx在弹窗中输入
74
+ */
75
+ allowInput?: boolean;
76
+
72
77
  /**
73
78
  * 占位文本
74
79
  */
@@ -96,12 +101,28 @@ export class FormulaPicker extends React.Component<FormulaPickerProps> {
96
101
  this.props.onChange?.(value);
97
102
  }
98
103
 
104
+ @autobind
105
+ renderFormulaValue(item: any) {
106
+ const {allowInput, classnames: cx} = this.props;
107
+ const html = {__html: item.html};
108
+ if (allowInput) {
109
+ return '';
110
+ }
111
+ return (
112
+ <div
113
+ className={cx('FormulaPicker-ResultBox')}
114
+ dangerouslySetInnerHTML={html}
115
+ ></div>
116
+ );
117
+ }
118
+
99
119
  render() {
100
120
  let {
101
121
  classnames: cx,
102
122
  value,
103
123
  translate: __,
104
124
  disabled,
125
+ allowInput,
105
126
  className,
106
127
  onChange,
107
128
  size,
@@ -186,9 +207,15 @@ export class FormulaPicker extends React.Component<FormulaPickerProps> {
186
207
  'FormulaPicker-input',
187
208
  isOpened ? 'is-active' : ''
188
209
  )}
189
- allowInput
210
+ allowInput={allowInput}
190
211
  clearable={clearable}
191
212
  value={value}
213
+ result={FormulaEditor.highlightValue(
214
+ value,
215
+ variables,
216
+ functions
217
+ )}
218
+ itemRender={this.renderFormulaValue}
192
219
  onResultChange={noop}
193
220
  onChange={this.handleConfirm}
194
221
  disabled={disabled}
package/src/factory.tsx CHANGED
@@ -42,6 +42,7 @@ import {
42
42
  RendererEvent
43
43
  } from './utils/renderer-event';
44
44
  import {runActions} from './actions/Action';
45
+ import {enableDebug} from './utils/debug';
45
46
 
46
47
  export interface TestFunc {
47
48
  (
@@ -152,6 +153,10 @@ export interface RenderOptions {
152
153
  * 过滤 html 标签,可用来添加 xss 保护逻辑
153
154
  */
154
155
  filterHtml?: (input: string) => string;
156
+ /**
157
+ * 是否开启 amis 调试
158
+ */
159
+ enableAMISDebug?: boolean;
155
160
  [propName: string]: any;
156
161
  }
157
162
 
@@ -271,6 +276,10 @@ const defaultOptions: RenderOptions = {
271
276
  affixOffsetBottom: 0,
272
277
  richTextToken: '',
273
278
  useMobileUI: true, // 是否启用移动端原生 UI
279
+ enableAMISDebug:
280
+ (window as any).enableAMISDebug ??
281
+ location.search.indexOf('amisDebug=1') !== -1 ??
282
+ false,
274
283
  loadRenderer,
275
284
  rendererEventListeners: [],
276
285
  fetcher() {
@@ -492,6 +501,10 @@ export function render(
492
501
  translate
493
502
  } as any;
494
503
 
504
+ if (options.enableAMISDebug) {
505
+ enableDebug();
506
+ }
507
+
495
508
  store = RendererStore.create({}, options);
496
509
  stores[options.session || 'global'] = store;
497
510
  }
@@ -518,13 +531,13 @@ export function render(
518
531
  // 进行文本替换
519
532
  if (env.replaceText && isObject(env.replaceText)) {
520
533
  const replaceKeys = Object.keys(env.replaceText);
521
- replaceKeys.sort().reverse(); // 避免用户将短的放前面
534
+ replaceKeys.sort((a, b) => b.length - a.length); // 避免用户将短的放前面
522
535
  const replaceTextIgnoreKeys = new Set(env.replaceTextIgnoreKeys || []);
523
536
  JSONTraverse(schema, (value: any, key: string, object: any) => {
524
537
  if (typeof value === 'string' && !replaceTextIgnoreKeys.has(key)) {
525
538
  for (const replaceKey of replaceKeys) {
526
539
  if (~value.indexOf(replaceKey)) {
527
- object[key] = value.replaceAll(
540
+ value = object[key] = value.replaceAll(
528
541
  replaceKey,
529
542
  env.replaceText[replaceKey]
530
543
  );
@@ -75,6 +75,19 @@ register('de-DE', {
75
75
  'Date.weekslater': '{{weeks}} Wochen später',
76
76
  'Date.yesterday': 'Gestern',
77
77
  'dateformat.year': 'YYYY',
78
+ 'DateRange.daysago': 'letzten {{days}} Tage',
79
+ 'DateRange.dayslater': 'innerhalb von {{days}} Tagen',
80
+ 'DateRange.weeksago': 'letzten {{weeks}} Wochen',
81
+ 'DateRange.weekslater': 'innerhalb von {{weeks}} Wochen',
82
+ 'DateRange.monthsago': 'letzten {{months}} Monate',
83
+ 'DateRange.monthslater': 'innerhalb von {{months}} Monaten',
84
+ 'DateRange.quartersago': 'letzten {{quarters}} Quartale',
85
+ 'DateRange.quarterslater': 'innerhalb von {{quarters}} Quartalen',
86
+ 'DateRange.yearsago': 'letzten {{years}} Jahre',
87
+ 'DateRange.yearslater': '{{years}} Jahren',
88
+ 'DateRange.hoursago': 'letzten {{hours}} Stunden',
89
+ 'DateRange.hourslater': 'innerhalb von {{hours}} Stunden',
90
+ 'DateRange.1dayago': 'Vor 1 Tag',
78
91
  'DateRange.1daysago': 'Vor 1 Tag',
79
92
  'DateRange.7daysago': 'Vor 7 Tagen',
80
93
  'DateRange.30daysago': 'Vor 30 Tagen',
@@ -72,6 +72,19 @@ register('en-US', {
72
72
  'Date.weekslater': '{{weeks}} week(s) later',
73
73
  'Date.yesterday': 'Yesterday',
74
74
  'dateformat.year': 'YYYY',
75
+ 'DateRange.daysago': 'Last {{days}} day(s)',
76
+ 'DateRange.dayslater': 'Within {{days}} day(s)',
77
+ 'DateRange.weeksago': 'Last {{weeks}} week(s)',
78
+ 'DateRange.weekslater': 'Within {{weeks}} week(s)',
79
+ 'DateRange.monthsago': 'Last {{months}} month(s)',
80
+ 'DateRange.monthslater': 'Within {{months}} month(s)',
81
+ 'DateRange.quartersago': 'Last {{quarters}} quarter(s)',
82
+ 'DateRange.quarterslater': 'Within {{quarters}} quarter(s)',
83
+ 'DateRange.yearsago': 'Last {{years}} year(s)',
84
+ 'DateRange.yearslater': 'Within {{years}} year(s)',
85
+ 'DateRange.hoursago': 'Last {{hours}} hour(s)',
86
+ 'DateRange.hourslater': 'Within {{hours}} hour(s)',
87
+ 'DateRange.1dayago': '1 day ago',
75
88
  'DateRange.1daysago': '1 day ago',
76
89
  'DateRange.7daysago': '7 days ago',
77
90
  'DateRange.30daysago': '30 days ago',
@@ -75,7 +75,20 @@ register('zh-CN', {
75
75
  'Date.weekslater': '{{weeks}}周后',
76
76
  'Date.yesterday': '昨天',
77
77
  'dateformat.year': 'YYYY年',
78
+ 'DateRange.daysago': '最近{{days}}天',
79
+ 'DateRange.dayslater': '{{days}}天以内',
80
+ 'DateRange.weeksago': '最近{{weeks}}周',
81
+ 'DateRange.weekslater': '{{weeks}}周以内',
82
+ 'DateRange.monthsago': '最近{{months}}月',
83
+ 'DateRange.monthslater': '{{months}}月以内',
84
+ 'DateRange.quartersago': '最近{{quarters}}季度',
85
+ 'DateRange.quarterslater': '{{quarters}}季度以内',
86
+ 'DateRange.yearsago': '最近{{years}}年',
87
+ 'DateRange.yearslater': '{{years}}年以内',
88
+ 'DateRange.hoursago': '最近{{hours}}小时',
89
+ 'DateRange.hourslater': '{{hours}}小时以内',
78
90
  'DateRange.1daysago': '最近1天',
91
+ 'DateRange.1dayago': '最近1天',
79
92
  'DateRange.7daysago': '最近7天',
80
93
  'DateRange.30daysago': '最近30天',
81
94
  'DateRange.90daysago': '最近90天',
@@ -753,6 +753,8 @@ export class Action extends React.Component<ActionProps, ActionState> {
753
753
  loading,
754
754
  body,
755
755
  render,
756
+ onMouseEnter,
757
+ onMouseLeave,
756
758
  classnames: cx,
757
759
  classPrefix: ns
758
760
  } = this.props;
@@ -768,7 +770,12 @@ export class Action extends React.Component<ActionProps, ActionState> {
768
770
  trigger={tooltipTrigger}
769
771
  rootClose={tooltipRootClose}
770
772
  >
771
- <div className={cx('Action', className)} onClick={this.handleAction}>
773
+ <div
774
+ className={cx('Action', className)}
775
+ onClick={this.handleAction}
776
+ onMouseEnter={onMouseEnter}
777
+ onMouseLeave={onMouseLeave}
778
+ >
772
779
  {render('body', body) as JSX.Element}
773
780
  </div>
774
781
  </TooltipWrapper>
@@ -814,6 +821,8 @@ export class Action extends React.Component<ActionProps, ActionState> {
814
821
  loadingClassName={loadingClassName}
815
822
  loading={loading}
816
823
  onClick={this.handleAction}
824
+ onMouseEnter={onMouseEnter}
825
+ onMouseLeave={onMouseLeave}
817
826
  type={type && ~allowedType.indexOf(type) ? type : 'button'}
818
827
  disabled={disabled}
819
828
  componentClass={isMenuItem ? 'a' : componentClass}
@@ -877,6 +886,16 @@ export class ActionRenderer extends React.Component<
877
886
  }
878
887
  }
879
888
 
889
+ @autobind
890
+ handleMouseEnter(e: React.MouseEvent<any>) {
891
+ this.props.dispatchEvent(e, this.props.data);
892
+ }
893
+
894
+ @autobind
895
+ handleMouseLeave(e: React.MouseEvent<any>) {
896
+ this.props.dispatchEvent(e, this.props.data);
897
+ }
898
+
880
899
  @autobind
881
900
  isCurrentAction(link: string) {
882
901
  const {env, data} = this.props;
@@ -892,6 +911,8 @@ export class ActionRenderer extends React.Component<
892
911
  env={env}
893
912
  disabled={disabled || btnDisabled}
894
913
  onAction={this.handleAction}
914
+ onMouseEnter={this.handleMouseEnter}
915
+ onMouseLeave={this.handleMouseLeave}
895
916
  loading={loading}
896
917
  isCurrentUrl={this.isCurrentAction}
897
918
  tooltipContainer={
@@ -278,6 +278,13 @@ export class Carousel extends React.Component<CarouselProps, CarouselState> {
278
278
  clearTimeout(this.durationTimeout as number);
279
279
  }
280
280
 
281
+ @autobind
282
+ changeSlide(index: number) {
283
+ this.setState({
284
+ current: index
285
+ });
286
+ }
287
+
281
288
  renderDots() {
282
289
  const {classnames: cx} = this.props;
283
290
  const {current, options} = this.state;
@@ -290,6 +297,7 @@ export class Carousel extends React.Component<CarouselProps, CarouselState> {
290
297
  {Array.from({length: options.length}).map((_, i) => (
291
298
  <span
292
299
  key={i}
300
+ onClick={() => this.changeSlide(i)}
293
301
  className={cx('Carousel-dot', current === i ? 'is-active' : '')}
294
302
  />
295
303
  ))}
@@ -90,6 +90,11 @@ export interface DialogSchema extends BaseSchema {
90
90
  * 是否显示错误信息
91
91
  */
92
92
  showErrorMsg?: boolean;
93
+
94
+ /**
95
+ * 是否显示 spinner
96
+ */
97
+ showLoading?: boolean;
93
98
  }
94
99
 
95
100
  export type DialogSchemaBase = Omit<DialogSchema, 'type'>;
@@ -424,13 +429,22 @@ export default class Dialog extends React.Component<DialogProps> {
424
429
  return null;
425
430
  }
426
431
 
427
- const {store, render, classnames: cx, showErrorMsg} = this.props;
432
+ const {
433
+ store,
434
+ render,
435
+ classnames: cx,
436
+ showErrorMsg,
437
+ showLoading
438
+ } = this.props;
428
439
 
429
440
  return (
430
441
  <div className={cx('Modal-footer')}>
431
- {store.loading || store.error ? (
442
+ {(showLoading !== false && store.loading) ||
443
+ (showErrorMsg !== false && store.error) ? (
432
444
  <div className={cx('Dialog-info')} key="info">
433
- <Spinner size="sm" key="info" show={store.loading} />
445
+ {showLoading !== false ? (
446
+ <Spinner size="sm" key="info" show={store.loading} />
447
+ ) : null}
434
448
  {store.error && showErrorMsg !== false ? (
435
449
  <span className={cx('Dialog-error')}>{store.msg}</span>
436
450
  ) : null}
@@ -147,12 +147,14 @@ export default class DropDownButton extends React.Component<
147
147
  };
148
148
 
149
149
  target: any;
150
+ timer: ReturnType<typeof setTimeout>;
150
151
  constructor(props: DropDownButtonProps) {
151
152
  super(props);
152
153
 
153
154
  this.open = this.open.bind(this);
154
155
  this.close = this.close.bind(this);
155
156
  this.toogle = this.toogle.bind(this);
157
+ this.keepOpen = this.keepOpen.bind(this);
156
158
  this.domRef = this.domRef.bind(this);
157
159
  }
158
160
 
@@ -183,9 +185,17 @@ export default class DropDownButton extends React.Component<
183
185
  }
184
186
 
185
187
  close() {
186
- this.setState({
187
- isOpened: false
188
- });
188
+ this.timer = setTimeout(() => {
189
+ this.setState({
190
+ isOpened: false
191
+ });
192
+ }, 200);
193
+ }
194
+
195
+ keepOpen() {
196
+ if (this.timer) {
197
+ clearTimeout(this.timer);
198
+ }
189
199
  }
190
200
 
191
201
  renderButton(
@@ -260,6 +270,7 @@ export default class DropDownButton extends React.Component<
260
270
  menuClassName
261
271
  )}
262
272
  onClick={closeOnClick ? this.close : noop}
273
+ onMouseEnter={this.keepOpen}
263
274
  ref={ref}
264
275
  >
265
276
  {children