feffery_antd_components 0.1.4 → 0.1.7

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 (163) hide show
  1. package/DESCRIPTION +1 -1
  2. package/NAMESPACE +2 -0
  3. package/Project.toml +1 -1
  4. package/README.md +2 -2
  5. package/build/lib/feffery_antd_components/AntdAffix.py +54 -0
  6. package/build/lib/feffery_antd_components/AntdAlert.py +58 -0
  7. package/build/lib/feffery_antd_components/AntdAnchor.py +60 -0
  8. package/build/lib/feffery_antd_components/AntdAvatar.py +79 -0
  9. package/build/lib/feffery_antd_components/AntdBackTop.py +52 -0
  10. package/build/lib/feffery_antd_components/AntdBadge.py +70 -0
  11. package/build/lib/feffery_antd_components/AntdBreadcrumb.py +74 -0
  12. package/build/lib/feffery_antd_components/AntdButton.py +68 -0
  13. package/build/lib/feffery_antd_components/AntdCalendar.py +75 -0
  14. package/build/lib/feffery_antd_components/AntdCard.py +86 -0
  15. package/build/lib/feffery_antd_components/AntdCardGrid.py +52 -0
  16. package/build/lib/feffery_antd_components/AntdCarousel.py +56 -0
  17. package/build/lib/feffery_antd_components/AntdCascader.py +93 -0
  18. package/build/lib/feffery_antd_components/AntdCheckbox.py +71 -0
  19. package/build/lib/feffery_antd_components/AntdCheckboxGroup.py +79 -0
  20. package/build/lib/feffery_antd_components/AntdCol.py +146 -0
  21. package/build/lib/feffery_antd_components/AntdCollapse.py +79 -0
  22. package/build/lib/feffery_antd_components/AntdComment.py +88 -0
  23. package/build/lib/feffery_antd_components/AntdContent.py +50 -0
  24. package/build/lib/feffery_antd_components/AntdCountdown.py +72 -0
  25. package/build/lib/feffery_antd_components/AntdDatePicker.py +95 -0
  26. package/build/lib/feffery_antd_components/AntdDateRangePicker.py +91 -0
  27. package/build/lib/feffery_antd_components/AntdDescriptionItem.py +58 -0
  28. package/build/lib/feffery_antd_components/AntdDescriptions.py +76 -0
  29. package/build/lib/feffery_antd_components/AntdDivider.py +62 -0
  30. package/build/lib/feffery_antd_components/AntdDraggerUpload.py +84 -0
  31. package/build/lib/feffery_antd_components/AntdDrawer.py +72 -0
  32. package/build/lib/feffery_antd_components/AntdDropdown.py +84 -0
  33. package/build/lib/feffery_antd_components/AntdEmpty.py +54 -0
  34. package/build/lib/feffery_antd_components/AntdFooter.py +50 -0
  35. package/build/lib/feffery_antd_components/AntdForm.py +72 -0
  36. package/build/lib/feffery_antd_components/AntdFormItem.py +84 -0
  37. package/build/lib/feffery_antd_components/AntdHeader.py +50 -0
  38. package/build/lib/feffery_antd_components/AntdIcon.py +48 -0
  39. package/build/lib/feffery_antd_components/AntdImage.py +62 -0
  40. package/build/lib/feffery_antd_components/AntdInput.py +101 -0
  41. package/build/lib/feffery_antd_components/AntdInputNumber.py +101 -0
  42. package/build/lib/feffery_antd_components/AntdLayout.py +50 -0
  43. package/build/lib/feffery_antd_components/AntdMentions.py +76 -0
  44. package/build/lib/feffery_antd_components/AntdMenu.py +81 -0
  45. package/build/lib/feffery_antd_components/AntdMessage.py +56 -0
  46. package/build/lib/feffery_antd_components/AntdModal.py +88 -0
  47. package/build/lib/feffery_antd_components/AntdNotification.py +60 -0
  48. package/build/lib/feffery_antd_components/AntdPageHeader.py +62 -0
  49. package/build/lib/feffery_antd_components/AntdPagination.py +95 -0
  50. package/build/lib/feffery_antd_components/AntdParagraph.py +70 -0
  51. package/build/lib/feffery_antd_components/AntdPasteImage.py +52 -0
  52. package/build/lib/feffery_antd_components/AntdPopconfirm.py +80 -0
  53. package/build/lib/feffery_antd_components/AntdPopover.py +74 -0
  54. package/build/lib/feffery_antd_components/AntdProgress.py +88 -0
  55. package/build/lib/feffery_antd_components/AntdRadio.py +54 -0
  56. package/build/lib/feffery_antd_components/AntdRadioGroup.py +89 -0
  57. package/build/lib/feffery_antd_components/AntdRate.py +60 -0
  58. package/build/lib/feffery_antd_components/AntdResult.py +52 -0
  59. package/build/lib/feffery_antd_components/AntdRibbon.py +54 -0
  60. package/build/lib/feffery_antd_components/AntdRow.py +72 -0
  61. package/build/lib/feffery_antd_components/AntdSelect.py +121 -0
  62. package/build/lib/feffery_antd_components/AntdSider.py +68 -0
  63. package/build/lib/feffery_antd_components/AntdSkeleton.py +86 -0
  64. package/build/lib/feffery_antd_components/AntdSlider.py +68 -0
  65. package/build/lib/feffery_antd_components/AntdSpace.py +60 -0
  66. package/build/lib/feffery_antd_components/AntdSpin.py +68 -0
  67. package/build/lib/feffery_antd_components/AntdStatistic.py +74 -0
  68. package/build/lib/feffery_antd_components/AntdSteps.py +72 -0
  69. package/build/lib/feffery_antd_components/AntdSwitch.py +75 -0
  70. package/build/lib/feffery_antd_components/AntdTabPane.py +66 -0
  71. package/build/lib/feffery_antd_components/AntdTable.py +264 -0
  72. package/build/lib/feffery_antd_components/AntdTabs.py +81 -0
  73. package/build/lib/feffery_antd_components/AntdTag.py +54 -0
  74. package/build/lib/feffery_antd_components/AntdTestLink.py +58 -0
  75. package/build/lib/feffery_antd_components/AntdText.py +72 -0
  76. package/build/lib/feffery_antd_components/AntdTimePicker.py +95 -0
  77. package/build/lib/feffery_antd_components/AntdTimeRangePicker.py +95 -0
  78. package/build/lib/feffery_antd_components/AntdTimeline.py +68 -0
  79. package/build/lib/feffery_antd_components/AntdTitle.py +74 -0
  80. package/build/lib/feffery_antd_components/AntdTooltip.py +64 -0
  81. package/build/lib/feffery_antd_components/AntdTransfer.py +99 -0
  82. package/build/lib/feffery_antd_components/AntdTree.py +103 -0
  83. package/build/lib/feffery_antd_components/AntdTreeSelect.py +107 -0
  84. package/build/lib/feffery_antd_components/AntdTypography.py +50 -0
  85. package/build/lib/feffery_antd_components/AntdUpload.py +92 -0
  86. package/build/lib/feffery_antd_components/AntdWatermark.py +64 -0
  87. package/build/lib/feffery_antd_components/Link.py +58 -0
  88. package/build/lib/feffery_antd_components/__init__.py +53 -0
  89. package/build/lib/feffery_antd_components/_imports_.py +161 -0
  90. package/build/lib/feffery_antd_components/feffery_antd_components.min.js +344 -0
  91. package/build/lib/feffery_antd_components/metadata.json +15596 -0
  92. package/build/lib/feffery_antd_components/package-info.json +81 -0
  93. package/feffery_antd_components/AntdAnchor.py +9 -3
  94. package/feffery_antd_components/AntdButton.py +5 -3
  95. package/feffery_antd_components/AntdCascader.py +5 -3
  96. package/feffery_antd_components/AntdDatePicker.py +5 -3
  97. package/feffery_antd_components/AntdDateRangePicker.py +5 -3
  98. package/feffery_antd_components/AntdDraggerUpload.py +6 -4
  99. package/feffery_antd_components/AntdImage.py +2 -2
  100. package/feffery_antd_components/AntdInput.py +5 -3
  101. package/feffery_antd_components/AntdInputNumber.py +5 -3
  102. package/feffery_antd_components/AntdMentions.py +5 -3
  103. package/feffery_antd_components/AntdMessage.py +5 -3
  104. package/feffery_antd_components/AntdPasteImage.py +52 -0
  105. package/feffery_antd_components/AntdSelect.py +7 -3
  106. package/feffery_antd_components/AntdTable.py +27 -3
  107. package/feffery_antd_components/AntdTimePicker.py +5 -3
  108. package/feffery_antd_components/AntdTimeRangePicker.py +5 -3
  109. package/feffery_antd_components/AntdTree.py +6 -10
  110. package/feffery_antd_components/AntdTreeSelect.py +7 -3
  111. package/feffery_antd_components/AntdUpload.py +16 -4
  112. package/feffery_antd_components/AntdWatermark.py +64 -0
  113. package/feffery_antd_components/_imports_.py +4 -0
  114. package/feffery_antd_components/feffery_antd_components.min.js +13 -13
  115. package/feffery_antd_components/metadata.json +680 -43
  116. package/feffery_antd_components/package-info.json +18 -14
  117. package/package.json +18 -14
  118. package/src/FefferyAntdComponents.jl +5 -3
  119. package/src/jl/'feffery'_antdanchor.jl +4 -1
  120. package/src/jl/'feffery'_antdbutton.jl +2 -1
  121. package/src/jl/'feffery'_antdcascader.jl +2 -1
  122. package/src/jl/'feffery'_antddatepicker.jl +2 -1
  123. package/src/jl/'feffery'_antddaterangepicker.jl +2 -1
  124. package/src/jl/'feffery'_antddraggerupload.jl +2 -1
  125. package/src/jl/'feffery'_antdimage.jl +2 -2
  126. package/src/jl/'feffery'_antdinput.jl +2 -1
  127. package/src/jl/'feffery'_antdinputnumber.jl +2 -1
  128. package/src/jl/'feffery'_antdmentions.jl +2 -1
  129. package/src/jl/'feffery'_antdmessage.jl +2 -1
  130. package/src/jl/'feffery'_antdpasteimage.jl +28 -0
  131. package/src/jl/'feffery'_antdselect.jl +3 -1
  132. package/src/jl/'feffery'_antdtable.jl +19 -5
  133. package/src/jl/'feffery'_antdtimepicker.jl +2 -1
  134. package/src/jl/'feffery'_antdtimerangepicker.jl +2 -1
  135. package/src/jl/'feffery'_antdtree.jl +3 -5
  136. package/src/jl/'feffery'_antdtreeselect.jl +3 -1
  137. package/src/jl/'feffery'_antdupload.jl +9 -2
  138. package/src/jl/'feffery'_antdwatermark.jl +39 -0
  139. package/src/lib/components/AntdAnchor.react.js +18 -3
  140. package/src/lib/components/AntdButton.react.js +5 -1
  141. package/src/lib/components/AntdCascader.react.js +5 -0
  142. package/src/lib/components/AntdDatePicker.react.js +5 -0
  143. package/src/lib/components/AntdDateRangePicker.react.js +5 -0
  144. package/src/lib/components/AntdDraggerUpload.react.js +41 -11
  145. package/src/lib/components/AntdImage.react.js +8 -2
  146. package/src/lib/components/AntdInput.react.js +8 -0
  147. package/src/lib/components/AntdInputNumber.react.js +5 -0
  148. package/src/lib/components/AntdMentions.react.js +5 -0
  149. package/src/lib/components/AntdMessage.react.js +6 -1
  150. package/src/lib/components/AntdPasteImage.react.js +170 -0
  151. package/src/lib/components/AntdSelect.react.js +11 -0
  152. package/src/lib/components/AntdTable.react.js +69 -6
  153. package/src/lib/components/AntdTimePicker.react.js +5 -0
  154. package/src/lib/components/AntdTimeRangePicker.react.js +5 -0
  155. package/src/lib/components/AntdTree.react.js +6 -13
  156. package/src/lib/components/AntdTreeSelect.react.js +11 -0
  157. package/src/lib/components/AntdUpload.react.js +78 -24
  158. package/src/lib/components/AntdWatermark.react.js +115 -0
  159. package/src/lib/components/styles.css +12 -11
  160. package/src/lib/components/tabs/AntdTabs.react.js +4 -0
  161. package/src/lib/index.js +5 -1
  162. package/usage.py +76 -1033
  163. package/webpack.config.js +9 -3
@@ -5,7 +5,7 @@ import 'antd/dist/antd.css';
5
5
 
6
6
  const { Link } = Anchor;
7
7
 
8
- // 定义分割线组件AntdAnchor,api参数参考https://ant.design/components/anchor-cn/
8
+ // 定义锚点组件AntdAnchor,api参数参考https://ant.design/components/anchor-cn/
9
9
  export default class AntdAnchor extends Component {
10
10
  render() {
11
11
  // 取得必要属性或参数
@@ -17,6 +17,9 @@ export default class AntdAnchor extends Component {
17
17
  align,
18
18
  containerId,
19
19
  targetOffset,
20
+ affix,
21
+ bounds,
22
+ offsetTop,
20
23
  loading_state
21
24
  } = this.props;
22
25
 
@@ -66,7 +69,10 @@ export default class AntdAnchor extends Component {
66
69
  className={className}
67
70
  style={style}
68
71
  getContainer={containerId ? () => document.getElementById(containerId) : containerId}
69
- targetOffset={targetOffset}>
72
+ targetOffset={targetOffset}
73
+ affix={affix}
74
+ bounds={bounds}
75
+ offsetTop={offsetTop}>
70
76
  {linkDict}
71
77
  </Anchor>
72
78
  }
@@ -108,9 +114,18 @@ AntdAnchor.propTypes = {
108
114
  // 设置其绑定的容器id
109
115
  containerId: PropTypes.string,
110
116
 
111
- // 设置锚点位移偏移量
117
+ // 设置锚点位移偏移量,默认与offsetTop相同
112
118
  targetOffset: PropTypes.number,
113
119
 
120
+ // 设置是否开启“固定模式”,默认为true
121
+ affix: PropTypes.bool,
122
+
123
+ // 设置锚点区域的边界像素大小,默认为5
124
+ bounds: PropTypes.number,
125
+
126
+ // 设置距离窗口顶部触发锚定效果的指定像素偏移量
127
+ offsetTop: PropTypes.number,
128
+
114
129
  loading_state: PropTypes.shape({
115
130
  /**
116
131
  * Determines if the component is loading or not
@@ -22,7 +22,7 @@ export default class AntdButton extends Component {
22
22
  shape,
23
23
  size,
24
24
  nClicks,
25
- htmlType,
25
+ loading,
26
26
  loading_state
27
27
  } = this.props;
28
28
 
@@ -45,6 +45,7 @@ export default class AntdButton extends Component {
45
45
  // 更新nClicks
46
46
  setProps({ nClicks: nClicks })
47
47
  }}
48
+ loading={loading}
48
49
  data-dash-is-loading={
49
50
  (loading_state && loading_state.is_loading) || undefined
50
51
  }
@@ -95,6 +96,9 @@ AntdButton.propTypes = {
95
96
  // 记录按钮从渲染后开始被点击的次数,默认为0
96
97
  nClicks: PropTypes.number,
97
98
 
99
+ // 用于设置是否为按钮渲染“加载中不可点击”效果,默认为false
100
+ loading: PropTypes.bool,
101
+
98
102
  loading_state: PropTypes.shape({
99
103
  /**
100
104
  * Determines if the component is loading or not
@@ -33,6 +33,7 @@ export default class AntdCascader extends Component {
33
33
  maxTagCount,
34
34
  multiple,
35
35
  expandTrigger,
36
+ status,
36
37
  setProps,
37
38
  persistence,
38
39
  persisted_props,
@@ -71,6 +72,7 @@ export default class AntdCascader extends Component {
71
72
  persisted_props={persisted_props}
72
73
  persistence_type={persistence_type}
73
74
  expandTrigger={expandTrigger}
75
+ status={status}
74
76
  showSearch={filter}
75
77
  onChange={onSelect}
76
78
  data-dash-is-loading={
@@ -169,6 +171,9 @@ AntdCascader.propTypes = {
169
171
  // 设置子菜单展开交互方式,可选的有'click'和'hover',默认为'click'
170
172
  expandTrigger: PropTypes.oneOf(['click', 'hover']),
171
173
 
174
+ // 设置校验状态,可选的有'error'、'warning'
175
+ status: PropTypes.oneOf(['error', 'warning']),
176
+
172
177
  loading_state: PropTypes.shape({
173
178
  /**
174
179
  * Determines if the component is loading or not
@@ -54,6 +54,7 @@ export default class AntdDatePicker extends Component {
54
54
  defaultValue,
55
55
  bordered,
56
56
  size,
57
+ status,
57
58
  persistence,
58
59
  persisted_props,
59
60
  persistence_type,
@@ -90,6 +91,7 @@ export default class AntdDatePicker extends Component {
90
91
  value={value ? moment(value, format) : undefined}
91
92
  defaultValue={defaultValue ? moment(defaultValue, format) : undefined}
92
93
  showTime={showTime}
94
+ status={status}
93
95
  persistence={persistence}
94
96
  persisted_props={persisted_props}
95
97
  persistence_type={persistence_type}
@@ -156,6 +158,9 @@ AntdDatePicker.propTypes = {
156
158
  'small', 'middle', 'large'
157
159
  ]),
158
160
 
161
+ // 设置校验状态,可选的有'error'、'warning'
162
+ status: PropTypes.oneOf(['error', 'warning']),
163
+
159
164
  /**
160
165
  * Object that holds the loading state object coming from dash-renderer
161
166
  */
@@ -55,6 +55,7 @@ export default class AntdDateRangePicker extends Component {
55
55
  bordered,
56
56
  size,
57
57
  defaultPickerValue,
58
+ status,
58
59
  persistence,
59
60
  persisted_props,
60
61
  persistence_type,
@@ -101,6 +102,7 @@ export default class AntdDateRangePicker extends Component {
101
102
  [moment(defaultValue[0], format), moment(defaultValue[1], format)] :
102
103
  undefined
103
104
  }
105
+ status={status}
104
106
  persistence={persistence}
105
107
  persisted_props={persisted_props}
106
108
  persistence_type={persistence_type}
@@ -161,6 +163,9 @@ AntdDateRangePicker.propTypes = {
161
163
  // 设置日期面板默认的时间位置
162
164
  defaultPickerValue: PropTypes.string,
163
165
 
166
+ // 设置校验状态,可选的有'error'、'warning'
167
+ status: PropTypes.oneOf(['error', 'warning']),
168
+
164
169
  /**
165
170
  * Object that holds the loading state object coming from dash-renderer
166
171
  */
@@ -26,6 +26,7 @@ const AntdDraggerUpload = (props) => {
26
26
  fileListMaxLength,
27
27
  fileTypes,
28
28
  fileMaxSize,
29
+ showUploadList,
29
30
  multiple,
30
31
  directory,
31
32
  failedTooltipInfo,
@@ -65,16 +66,38 @@ const AntdDraggerUpload = (props) => {
65
66
 
66
67
  if (info.file.status === 'done') {
67
68
 
68
- // 更新任务记录
69
- setProps({
70
- lastUploadTaskRecord: {
71
- fileName: info.file.name,
72
- fileSize: info.file.size,
73
- completeTimestamp: new Date().getTime(),
74
- taskStatus: 'success',
75
- taskId: uploadId
69
+ // 检查是否为多文件上传模式
70
+ if (multiple || directory) {
71
+ // 检查上传列表中是否全部文件都已完成上传
72
+ if (info.fileList.every(file => file.status === 'done')) {
73
+ console.log(info.fileList)
74
+ // 更新任务记录
75
+ setProps({
76
+ lastUploadTaskRecord: info.fileList.map(
77
+ (file) => {
78
+ return {
79
+ fileName: file.name,
80
+ fileSize: file.size,
81
+ completeTimestamp: new Date().getTime(),
82
+ taskStatus: 'success',
83
+ taskId: uploadId
84
+ }
85
+ }
86
+ )
87
+ })
76
88
  }
77
- })
89
+ } else {
90
+ // 更新任务记录
91
+ setProps({
92
+ lastUploadTaskRecord: {
93
+ fileName: info.file.name,
94
+ fileSize: info.file.size,
95
+ completeTimestamp: new Date().getTime(),
96
+ taskStatus: 'success',
97
+ taskId: uploadId
98
+ }
99
+ })
100
+ }
78
101
  message.success(`${info.file.name} 上传成功!`);
79
102
  } else if (info.file.status === 'error') {
80
103
 
@@ -106,7 +129,11 @@ const AntdDraggerUpload = (props) => {
106
129
  )
107
130
 
108
131
  // 基于fileListMaxLength参数设置,对fileList状态进行更新
109
- updateFileList(info.fileList.slice(-fileListMaxLength))
132
+ if (fileListMaxLength) {
133
+ updateFileList(info.fileList.slice(-fileListMaxLength))
134
+ } else {
135
+ updateFileList(info.fileList)
136
+ }
110
137
  },
111
138
  };
112
139
 
@@ -187,6 +214,9 @@ AntdDraggerUpload.propTypes = {
187
214
  // 自定义上传失败文件鼠标悬浮tooltip文字内容,默认为'上传失败'
188
215
  failedTooltipInfo: PropTypes.string,
189
216
 
217
+ // 设置是否显示已上传文件列表,默认为true
218
+ showUploadList: PropTypes.bool,
219
+
190
220
  // 用于在每次文件上传动作完成后,记录相关的信息
191
221
  lastUploadTaskRecord: PropTypes.exact({
192
222
  // 记录文件名称
@@ -230,7 +260,7 @@ AntdDraggerUpload.propTypes = {
230
260
 
231
261
  // 设置默认参数
232
262
  AntdDraggerUpload.defaultProps = {
233
- fileListMaxLength: 3,
263
+ fileListMaxLength: null,
234
264
  fileMaxSize: 500,
235
265
  lastUploadTaskRecord: {},
236
266
  locale: 'zh-cn'
@@ -96,10 +96,16 @@ AntdImage.propTypes = {
96
96
  alt: PropTypes.string,
97
97
 
98
98
  // 设置像素宽度
99
- width: PropTypes.number,
99
+ width: PropTypes.oneOfType([
100
+ PropTypes.number,
101
+ PropTypes.string
102
+ ]),
100
103
 
101
104
  // 设置图像高度
102
- height: PropTypes.number,
105
+ height: PropTypes.oneOfType([
106
+ PropTypes.number,
107
+ PropTypes.string
108
+ ]),
103
109
 
104
110
  // 设置图片源地址,单个字符串传入时为单图片模式
105
111
  // 多个字符串数组传入时为多图片切换模式
@@ -43,6 +43,7 @@ export default class AntdInput extends Component {
43
43
  showCount,
44
44
  nClicksSearch,
45
45
  nSubmit,
46
+ status,
46
47
  setProps,
47
48
  loading_state,
48
49
  persistence,
@@ -82,6 +83,7 @@ export default class AntdInput extends Component {
82
83
  defaultValue={defaultValue}
83
84
  disabled={disabled}
84
85
  maxLength={maxLength}
86
+ status={status}
85
87
  onChange={onChange}
86
88
  onPressEnter={onPressEnter}
87
89
  persistence={persistence}
@@ -105,6 +107,7 @@ export default class AntdInput extends Component {
105
107
  defaultValue={defaultValue}
106
108
  disabled={disabled}
107
109
  maxLength={maxLength}
110
+ status={status}
108
111
  onSearch={onSearch}
109
112
  onChange={onChange}
110
113
  onPressEnter={onPressEnter}
@@ -130,6 +133,7 @@ export default class AntdInput extends Component {
130
133
  disabled={disabled}
131
134
  maxLength={maxLength}
132
135
  showCount={showCount}
136
+ status={status}
133
137
  onChange={onChange}
134
138
  onPressEnter={onPressEnter}
135
139
  persistence={persistence}
@@ -152,6 +156,7 @@ export default class AntdInput extends Component {
152
156
  value={value}
153
157
  defaultValue={defaultValue}
154
158
  maxLength={maxLength}
159
+ status={status}
155
160
  onChange={(e) => {
156
161
  // 若启用md5加密
157
162
  if (passwordUseMd5) {
@@ -254,6 +259,9 @@ AntdInput.propTypes = {
254
259
  // 记录search模式下搜索按钮被点按的次数
255
260
  nClicksSearch: PropTypes.number,
256
261
 
262
+ // 设置校验状态,可选的有'error'、'warning'
263
+ status: PropTypes.oneOf(['error', 'warning']),
264
+
257
265
  /**
258
266
  * Dash-assigned callback that should be called to report property changes
259
267
  * to Dash, to make them available for callbacks.
@@ -37,6 +37,7 @@ export default class AntdInputNumber extends Component {
37
37
  readOnly,
38
38
  stringMode,
39
39
  nSubmit,
40
+ status,
40
41
  setProps,
41
42
  persistence,
42
43
  persisted_props,
@@ -78,6 +79,7 @@ export default class AntdInputNumber extends Component {
78
79
  precision={precision}
79
80
  readOnly={readOnly}
80
81
  stringMode={stringMode}
82
+ status={status}
81
83
  onChange={onChange}
82
84
  onPressEnter={onPressEnter}
83
85
  onStep={onStep}
@@ -169,6 +171,9 @@ AntdInputNumber.propTypes = {
169
171
  // 记录聚焦于输入框内部时,enter键被点按的次数
170
172
  nSubmit: PropTypes.number,
171
173
 
174
+ // 设置校验状态,可选的有'error'、'warning'
175
+ status: PropTypes.oneOf(['error', 'warning']),
176
+
172
177
  loading_state: PropTypes.shape({
173
178
  /**
174
179
  * Determines if the component is loading or not
@@ -21,6 +21,7 @@ export default class AntdMentions extends Component {
21
21
  value,
22
22
  options,
23
23
  disabled,
24
+ status,
24
25
  setProps,
25
26
  loading_state
26
27
  } = this.props;
@@ -66,6 +67,7 @@ export default class AntdMentions extends Component {
66
67
  defaultValue={defaultValue}
67
68
  placement={placement}
68
69
  disabled={disabled}
70
+ status={status}
69
71
  onChange={onChange}
70
72
  onSelect={onSelect}
71
73
  getPopupContainer={(triggerNode) => triggerNode.parentNode.parentNode.parentNode}
@@ -136,6 +138,9 @@ AntdMentions.propTypes = {
136
138
  // 设置是否禁用,默认为false
137
139
  disabled: PropTypes.bool,
138
140
 
141
+ // 设置校验状态,可选的有'error'、'warning'
142
+ status: PropTypes.oneOf(['error', 'warning']),
143
+
139
144
  loading_state: PropTypes.shape({
140
145
  /**
141
146
  * Determines if the component is loading or not
@@ -17,6 +17,7 @@ export default class AntdMessage extends Component {
17
17
  type,
18
18
  duration,
19
19
  icon,
20
+ top,
20
21
  loading_state,
21
22
  setProps
22
23
  } = this.props;
@@ -25,7 +26,8 @@ export default class AntdMessage extends Component {
25
26
  className: className,
26
27
  style: style,
27
28
  content: content,
28
- duration: duration
29
+ duration: duration,
30
+ top: top
29
31
  }
30
32
 
31
33
  if (icon) {
@@ -91,6 +93,9 @@ AntdMessage.propTypes = {
91
93
  // 设置通知从显示到自动消失的时长(秒),默认为3,当传入0时表示不会自动消失
92
94
  duration: PropTypes.number,
93
95
 
96
+ // 设置消息距离顶端的像素距离,默认为8
97
+ top: PropTypes.number,
98
+
94
99
  // 设置自定义icon,与AntdIcon中支持的图标相对应
95
100
  icon: PropTypes.string,
96
101
 
@@ -0,0 +1,170 @@
1
+ import React, { useCallback } from 'react';
2
+ import PropTypes from 'prop-types';
3
+ import { Card, Button, ConfigProvider, Image as Image_ } from 'antd';
4
+ import zhCN from 'antd/lib/locale/zh_CN';
5
+ import { Gluejar } from '@charliewilco/gluejar'
6
+ import { DeleteOutlined } from '@ant-design/icons';
7
+ import './styles.css'
8
+ import 'antd/dist/antd.css';
9
+
10
+ const urlToBase64 = (url) => {
11
+ return new Promise((resolve, reject) => {
12
+ let image = new Image();
13
+ image.onload = function () {
14
+ let canvas = document.createElement('canvas');
15
+ canvas.width = this.naturalWidth;
16
+ canvas.height = this.naturalHeight;
17
+ // 将图片插入画布并开始绘制
18
+ canvas.getContext('2d').drawImage(image, 0, 0);
19
+ // result
20
+ let result = canvas.toDataURL('image/png')
21
+ resolve(result);
22
+ };
23
+ // CORS 策略,会存在跨域问题https://stackoverflow.com/questions/20424279/canvas-todataurl-securityerror
24
+ image.setAttribute("crossOrigin", 'Anonymous');
25
+ image.src = url;
26
+ // 图片加载失败的错误处理
27
+ image.onerror = () => {
28
+ reject(new Error('urlToBase64 error'));
29
+ };
30
+ }
31
+ )
32
+ }
33
+
34
+ // 定义图片粘贴组件AntdPasteImage,api参数参考https://github.com/charliewilco/react-gluejar
35
+ const AntdPasteImage = (props) => {
36
+ // 取得必要属性或参数
37
+ let {
38
+ id,
39
+ className,
40
+ style,
41
+ currentPastedImages,
42
+ deletedIdx,
43
+ imageHeight,
44
+ setProps,
45
+ loading_state
46
+ } = props;
47
+
48
+ const handlePaste = useCallback(async (files) => {
49
+ let results = []
50
+ for (let i = 0; i < files.images.length; i++) {
51
+ if (deletedIdx.indexOf(i) === -1) {
52
+ let result = await urlToBase64(files.images[i])
53
+ results.push(result)
54
+ }
55
+ }
56
+ setProps({
57
+ currentPastedImages: results
58
+ })
59
+ }, []);
60
+
61
+ const handleDelete = useCallback((idx) => {
62
+ if (!deletedIdx) {
63
+ deletedIdx = [idx]
64
+ } else if (deletedIdx.indexOf(idx) === -1) {
65
+ deletedIdx.push(idx)
66
+ }
67
+ setProps({
68
+ currentPastedImages: currentPastedImages.filter((value, idx) => deletedIdx.indexOf(idx) === -1),
69
+ deletedIdx: deletedIdx
70
+ })
71
+ }, []);
72
+
73
+ return (
74
+ <div id={id}
75
+ className={className}
76
+ style={style}
77
+ data-dash-is-loading={
78
+ (loading_state && loading_state.is_loading) || undefined
79
+ }>
80
+ <Gluejar
81
+ key={0}
82
+ onPaste={handlePaste}>
83
+ {({ images }) => {
84
+ if (images.length > 0) {
85
+ return (
86
+ <ConfigProvider locale={zhCN}>
87
+ <Card style={{ height: '100%', border: 'none' }}>
88
+ {
89
+ images.map((image, idx) => {
90
+ return deletedIdx.indexOf(idx) === -1 ? (
91
+ <Card.Grid
92
+ style={{ width: '25%', height: imageHeight, padding: 5, cursor: 'pointer', position: 'relative' }}
93
+ >
94
+ <Button shape="circle" size={"small"} icon={<DeleteOutlined />}
95
+ style={{ position: 'absolute', 'right': 10, top: 10, zIndex: 1 }}
96
+ onClick={() => handleDelete(idx)} />
97
+ <Image_ src={image}
98
+ key={idx}
99
+ alt={`Pasted: ${idx}`}
100
+ width={"100%"}
101
+ height={"100%"}
102
+ style={{ borderTop: '1px solid #f0f0f0', objectFit: 'contain' }} />
103
+ </Card.Grid>
104
+ ) : null
105
+ }
106
+ )
107
+ }
108
+ </Card>
109
+ </ConfigProvider>
110
+ );
111
+ }
112
+ return null;
113
+ }
114
+ }
115
+ </Gluejar>
116
+ </div >
117
+ );
118
+ }
119
+
120
+ // 定义参数或属性
121
+ AntdPasteImage.propTypes = {
122
+ // 部件id
123
+ id: PropTypes.string,
124
+
125
+ // css类名
126
+ className: PropTypes.string,
127
+
128
+ // 自定义css字典
129
+ style: PropTypes.object,
130
+
131
+ // 存储当前保存的所有图片的base64字符串
132
+ currentPastedImages: PropTypes.arrayOf(PropTypes.any),
133
+
134
+ // 记录生命周期内第几次接受新图片粘贴,进而辅助删除图片操作
135
+ deletedIdx: PropTypes.arrayOf(PropTypes.number),
136
+
137
+ // 设置每张图片块的像素高度,默认为200
138
+ imageHeight: PropTypes.number,
139
+
140
+ loading_state: PropTypes.shape({
141
+ /**
142
+ * Determines if the component is loading or not
143
+ */
144
+ is_loading: PropTypes.bool,
145
+ /**
146
+ * Holds which property is loading
147
+ */
148
+ prop_name: PropTypes.string,
149
+ /**
150
+ * Holds the name of the component that is loading
151
+ */
152
+ component_name: PropTypes.string
153
+ }),
154
+
155
+ /**
156
+ * Dash-assigned callback that should be called to report property changes
157
+ * to Dash, to make them available for callbacks.
158
+ */
159
+ setProps: PropTypes.func
160
+ };
161
+
162
+ // 设置默认参数
163
+ AntdPasteImage.defaultProps = {
164
+ className: 'feffery-paste-image-container',
165
+ imageHeight: 200,
166
+ currentPastedImages: [],
167
+ deletedIdx: []
168
+ }
169
+
170
+ export default AntdPasteImage;
@@ -38,6 +38,8 @@ export default class AntdSelect extends Component {
38
38
  maxTagCount,
39
39
  listHeight,
40
40
  colorsMode,
41
+ placement,
42
+ status,
41
43
  loading_state,
42
44
  persistence,
43
45
  persisted_props,
@@ -148,6 +150,8 @@ export default class AntdSelect extends Component {
148
150
  listHeight={listHeight}
149
151
  disabled={disabled}
150
152
  showSearch={true}
153
+ placement={placement}
154
+ status={status}
151
155
  persistence={persistence}
152
156
  persisted_props={persisted_props}
153
157
  persistence_type={persistence_type}
@@ -273,6 +277,13 @@ AntdSelect.propTypes = {
273
277
  // 色带模式下用于设置连续色带还是离散色带,可选的有'sequential'、'diverging'
274
278
  colorsMode: PropTypes.oneOf(['sequential', 'diverging']),
275
279
 
280
+ // 用于设置悬浮展开层的方位,可选的有'bottomLeft'、'bottomRight'、'topLeft'、'topRight'
281
+ // 默认为'bottomLeft'
282
+ placement: PropTypes.oneOf(['bottomLeft', 'bottomRight', 'topLeft', 'topRight']),
283
+
284
+ // 设置校验状态,可选的有'error'、'warning'
285
+ status: PropTypes.oneOf(['error', 'warning']),
286
+
276
287
  loading_state: PropTypes.shape({
277
288
  /**
278
289
  * Determines if the component is loading or not