feffery_antd_components 0.1.6 → 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 (109) hide show
  1. package/DESCRIPTION +1 -1
  2. package/Project.toml +1 -1
  3. package/README.md +2 -2
  4. package/build/lib/feffery_antd_components/AntdAffix.py +54 -0
  5. package/build/lib/feffery_antd_components/AntdAlert.py +58 -0
  6. package/build/lib/feffery_antd_components/AntdAnchor.py +60 -0
  7. package/build/lib/feffery_antd_components/AntdAvatar.py +79 -0
  8. package/build/lib/feffery_antd_components/AntdBackTop.py +52 -0
  9. package/build/lib/feffery_antd_components/AntdBadge.py +70 -0
  10. package/build/lib/feffery_antd_components/AntdBreadcrumb.py +74 -0
  11. package/build/lib/feffery_antd_components/AntdButton.py +68 -0
  12. package/build/lib/feffery_antd_components/AntdCalendar.py +75 -0
  13. package/build/lib/feffery_antd_components/AntdCard.py +86 -0
  14. package/build/lib/feffery_antd_components/AntdCardGrid.py +52 -0
  15. package/build/lib/feffery_antd_components/AntdCarousel.py +56 -0
  16. package/build/lib/feffery_antd_components/AntdCascader.py +93 -0
  17. package/build/lib/feffery_antd_components/AntdCheckbox.py +71 -0
  18. package/build/lib/feffery_antd_components/AntdCheckboxGroup.py +79 -0
  19. package/build/lib/feffery_antd_components/AntdCol.py +146 -0
  20. package/build/lib/feffery_antd_components/AntdCollapse.py +79 -0
  21. package/build/lib/feffery_antd_components/AntdComment.py +88 -0
  22. package/build/lib/feffery_antd_components/AntdContent.py +50 -0
  23. package/build/lib/feffery_antd_components/AntdCountdown.py +72 -0
  24. package/build/lib/feffery_antd_components/AntdDatePicker.py +95 -0
  25. package/build/lib/feffery_antd_components/AntdDateRangePicker.py +91 -0
  26. package/build/lib/feffery_antd_components/AntdDescriptionItem.py +58 -0
  27. package/build/lib/feffery_antd_components/AntdDescriptions.py +76 -0
  28. package/build/lib/feffery_antd_components/AntdDivider.py +62 -0
  29. package/build/lib/feffery_antd_components/AntdDraggerUpload.py +84 -0
  30. package/build/lib/feffery_antd_components/AntdDrawer.py +72 -0
  31. package/build/lib/feffery_antd_components/AntdDropdown.py +84 -0
  32. package/build/lib/feffery_antd_components/AntdEmpty.py +54 -0
  33. package/build/lib/feffery_antd_components/AntdFooter.py +50 -0
  34. package/build/lib/feffery_antd_components/AntdForm.py +72 -0
  35. package/build/lib/feffery_antd_components/AntdFormItem.py +84 -0
  36. package/build/lib/feffery_antd_components/AntdHeader.py +50 -0
  37. package/build/lib/feffery_antd_components/AntdIcon.py +48 -0
  38. package/build/lib/feffery_antd_components/AntdImage.py +62 -0
  39. package/build/lib/feffery_antd_components/AntdInput.py +101 -0
  40. package/build/lib/feffery_antd_components/AntdInputNumber.py +101 -0
  41. package/build/lib/feffery_antd_components/AntdLayout.py +50 -0
  42. package/build/lib/feffery_antd_components/AntdMentions.py +76 -0
  43. package/build/lib/feffery_antd_components/AntdMenu.py +81 -0
  44. package/build/lib/feffery_antd_components/AntdMessage.py +56 -0
  45. package/build/lib/feffery_antd_components/AntdModal.py +88 -0
  46. package/build/lib/feffery_antd_components/AntdNotification.py +60 -0
  47. package/build/lib/feffery_antd_components/AntdPageHeader.py +62 -0
  48. package/build/lib/feffery_antd_components/AntdPagination.py +95 -0
  49. package/build/lib/feffery_antd_components/AntdParagraph.py +70 -0
  50. package/build/lib/feffery_antd_components/AntdPasteImage.py +52 -0
  51. package/build/lib/feffery_antd_components/AntdPopconfirm.py +80 -0
  52. package/build/lib/feffery_antd_components/AntdPopover.py +74 -0
  53. package/build/lib/feffery_antd_components/AntdProgress.py +88 -0
  54. package/build/lib/feffery_antd_components/AntdRadio.py +54 -0
  55. package/build/lib/feffery_antd_components/AntdRadioGroup.py +89 -0
  56. package/build/lib/feffery_antd_components/AntdRate.py +60 -0
  57. package/build/lib/feffery_antd_components/AntdResult.py +52 -0
  58. package/build/lib/feffery_antd_components/AntdRibbon.py +54 -0
  59. package/build/lib/feffery_antd_components/AntdRow.py +72 -0
  60. package/build/lib/feffery_antd_components/AntdSelect.py +121 -0
  61. package/build/lib/feffery_antd_components/AntdSider.py +68 -0
  62. package/build/lib/feffery_antd_components/AntdSkeleton.py +86 -0
  63. package/build/lib/feffery_antd_components/AntdSlider.py +68 -0
  64. package/build/lib/feffery_antd_components/AntdSpace.py +60 -0
  65. package/build/lib/feffery_antd_components/AntdSpin.py +68 -0
  66. package/build/lib/feffery_antd_components/AntdStatistic.py +74 -0
  67. package/build/lib/feffery_antd_components/AntdSteps.py +72 -0
  68. package/build/lib/feffery_antd_components/AntdSwitch.py +75 -0
  69. package/build/lib/feffery_antd_components/AntdTabPane.py +66 -0
  70. package/build/lib/feffery_antd_components/AntdTable.py +264 -0
  71. package/build/lib/feffery_antd_components/AntdTabs.py +81 -0
  72. package/build/lib/feffery_antd_components/AntdTag.py +54 -0
  73. package/build/lib/feffery_antd_components/AntdTestLink.py +58 -0
  74. package/build/lib/feffery_antd_components/AntdText.py +72 -0
  75. package/build/lib/feffery_antd_components/AntdTimePicker.py +95 -0
  76. package/build/lib/feffery_antd_components/AntdTimeRangePicker.py +95 -0
  77. package/build/lib/feffery_antd_components/AntdTimeline.py +68 -0
  78. package/build/lib/feffery_antd_components/AntdTitle.py +74 -0
  79. package/build/lib/feffery_antd_components/AntdTooltip.py +64 -0
  80. package/build/lib/feffery_antd_components/AntdTransfer.py +99 -0
  81. package/build/lib/feffery_antd_components/AntdTree.py +103 -0
  82. package/build/lib/feffery_antd_components/AntdTreeSelect.py +107 -0
  83. package/build/lib/feffery_antd_components/AntdTypography.py +50 -0
  84. package/build/lib/feffery_antd_components/AntdUpload.py +92 -0
  85. package/build/lib/feffery_antd_components/AntdWatermark.py +64 -0
  86. package/build/lib/feffery_antd_components/Link.py +58 -0
  87. package/build/lib/feffery_antd_components/__init__.py +53 -0
  88. package/build/lib/feffery_antd_components/_imports_.py +161 -0
  89. package/build/lib/feffery_antd_components/feffery_antd_components.min.js +344 -0
  90. package/build/lib/feffery_antd_components/metadata.json +15596 -0
  91. package/build/lib/feffery_antd_components/package-info.json +81 -0
  92. package/feffery_antd_components/AntdDraggerUpload.py +6 -4
  93. package/feffery_antd_components/AntdImage.py +2 -2
  94. package/feffery_antd_components/AntdTable.py +8 -2
  95. package/feffery_antd_components/AntdUpload.py +16 -4
  96. package/feffery_antd_components/feffery_antd_components.min.js +13 -13
  97. package/feffery_antd_components/metadata.json +117 -25
  98. package/feffery_antd_components/package-info.json +1 -1
  99. package/package.json +1 -1
  100. package/src/FefferyAntdComponents.jl +3 -3
  101. package/src/jl/'feffery'_antddraggerupload.jl +2 -1
  102. package/src/jl/'feffery'_antdimage.jl +2 -2
  103. package/src/jl/'feffery'_antdtable.jl +6 -2
  104. package/src/jl/'feffery'_antdupload.jl +9 -2
  105. package/src/lib/components/AntdDraggerUpload.react.js +41 -11
  106. package/src/lib/components/AntdImage.react.js +8 -2
  107. package/src/lib/components/AntdTable.react.js +32 -2
  108. package/src/lib/components/AntdUpload.react.js +78 -24
  109. package/usage.py +63 -1203
package/usage.py CHANGED
@@ -1,33 +1,79 @@
1
1
  import dash
2
2
  import numpy as np
3
3
  from dash import html
4
+ from flask import request
4
5
  import feffery_antd_components as fac
5
6
  from dash.dependencies import Input, Output, State
6
7
 
7
8
  app = dash.Dash(__name__)
8
9
 
10
+
11
+ @app.server.route('/upload/', methods=['POST'])
12
+ def upload():
13
+ '''
14
+ 构建文件上传服务
15
+ :return:
16
+ '''
17
+
18
+ # 获取上传id参数,用于指向保存路径
19
+ uploadId = request.values.get('uploadId')
20
+
21
+ # 获取上传的文件名称
22
+ filename = request.files['file'].filename
23
+
24
+ print({'filename': filename})
25
+
26
+ return {'filename': filename}
27
+
28
+
29
+ @app.callback(
30
+ Output('output', 'children'),
31
+ Input('input', 'lastUploadTaskRecord')
32
+ )
33
+ def test(lastUploadTaskRecord):
34
+ if lastUploadTaskRecord:
35
+ print(lastUploadTaskRecord)
36
+
37
+ return dash.no_update
38
+
9
39
  app.layout = html.Div(
10
40
  [
11
- fac.AntdPasteImage(
12
- id='test',
13
- style={
14
- 'height': '500px',
15
- 'width': '800px',
16
- 'marginBottom': '100px'
17
- }
41
+
42
+ fac.AntdUpload(
43
+ id='input',
44
+ apiUrl='/upload/',
45
+ directory=True
46
+ ),
47
+
48
+ html.Div(
49
+ id='output'
18
50
  ),
19
51
 
20
- html.Div(id='test-output'),
21
- fac.AntdWatermark(
22
- html.Div(
23
- style={
24
- 'width': '800px',
25
- 'height': '400px'
52
+ fac.AntdTable(
53
+ columns=[
54
+ {
55
+ 'title': '图片字段测试',
56
+ 'dataIndex': '图片字段测试',
57
+ 'width': '200px',
58
+ 'renderOptions': {
59
+ 'renderType': 'image'
60
+ }
26
61
  }
27
- ),
28
- content='水印测试',
29
- fontSize=28
62
+ ],
63
+ data=[
64
+ {
65
+ '图片字段测试': {
66
+ 'src': 'https://gw.alipayobjects.com/zos/rmsportal/KDpgvguMpGfqaHPjicRK.svg',
67
+ 'height': '100%'
68
+ }
69
+ }
70
+ ] * 100,
71
+ bordered=True,
72
+ style={
73
+ 'width': '300px'
74
+ }
30
75
  ),
76
+
31
77
  fac.AntdTable(
32
78
  selectedRowKeys=['2', '4'],
33
79
  rowSelectionWidth='4rem',
@@ -72,9 +118,7 @@ app.layout = html.Div(
72
118
  'width': '33.33%'
73
119
  }
74
120
  ],
75
- sticky={
76
- 'offsetHeader': 800
77
- },
121
+ sticky=True,
78
122
  pagination={
79
123
  'pageSize': 100
80
124
  },
@@ -104,1132 +148,6 @@ app.layout = html.Div(
104
148
  style={
105
149
  # 'width': '800px'
106
150
  }
107
- ),
108
-
109
-
110
- fac.AntdImage(
111
- src='https://gw.alipayobjects.com/zos/antfincdn/LlvErxo8H9/photo-1503185912284-5271ff81b9a8.webp'
112
- ),
113
-
114
- fac.AntdRate(
115
- count=10,
116
- tooltips=[f'等级{i + 1}' for i in range(10)]
117
- ),
118
-
119
- fac.AntdButton(
120
- '触发对话框',
121
- type='primary',
122
- id='modal-demo-trigger-1'
123
- ),
124
-
125
- fac.AntdModal(
126
- fac.AntdText('对话框内容测试'),
127
- id='modal-demo-1',
128
- visible=False,
129
- title={
130
- 'content': '标题测试',
131
- 'prefixIcon': 'search'
132
- },
133
- renderFooter=True
134
- ),
135
-
136
- fac.AntdTree(
137
- id='tree-demo',
138
- treeData=[
139
- {
140
- 'title': '重庆市',
141
- 'key': '重庆市',
142
- 'children': [
143
- {
144
- 'title': '渝北区',
145
- 'key': '渝北区'
146
- },
147
- {
148
- 'title': '江北区',
149
- 'key': '江北区',
150
- 'disabled': True
151
- }
152
- ]
153
- },
154
- {
155
- 'title': '北京市',
156
- 'key': '北京市',
157
- 'children': [
158
- {
159
- 'title': '西城区',
160
- 'key': '西城区'
161
- },
162
- {
163
- 'title': '东城区',
164
- 'key': '东城区'
165
- }
166
- ]
167
- },
168
- {
169
- 'title': '四川省',
170
- 'key': '四川省',
171
- 'children': [
172
- {
173
- 'title': '成都市',
174
- 'key': '成都市',
175
- 'children': [
176
- {
177
- 'title': '天府新区',
178
- 'key': '天府新区'
179
- }
180
- ]
181
- }
182
- ]
183
- }
184
- ],
185
- multiple=True,
186
- checkable=True
187
- ),
188
-
189
- fac.AntdParagraph('巴拉巴拉'*100, style={'textIndent': '2em'}),
190
-
191
- fac.AntdTable(
192
- miniChartHeight=60,
193
- miniChartAnimation=False,
194
- summaryRowContents=[{'content': '测试', 'align': 'center'}] *
195
- 5+[{'content': '测试测试', 'colSpan': 2, 'align': 'center'}],
196
- summaryRowFixed=True,
197
- columns=[
198
- {
199
- 'title': 'status-badge示例',
200
- 'dataIndex': 'status-badge示例',
201
- # 'width': '25%',
202
- 'renderOptions': {
203
- 'renderType': 'status-badge'
204
- }
205
- },
206
- {
207
- 'title': 'mini-bar示例',
208
- 'dataIndex': 'mini-bar示例',
209
- # 'width': '25%',
210
- 'renderOptions': {
211
- 'renderType': 'mini-bar'
212
- }
213
- },
214
- {
215
- 'title': 'ellipsis内容省略示例',
216
- 'dataIndex': 'ellipsis内容省略示例',
217
- 'renderOptions': {'renderType': 'ellipsis'}
218
- },
219
- {
220
- # 注意,mini-progress模式接受的输入应当在0到1之间
221
- 'title': 'mini-progress示例',
222
- 'dataIndex': 'mini-progress示例',
223
- # 'width': '25%',
224
- 'renderOptions': {
225
- 'renderType': 'mini-progress'
226
- }
227
- },
228
- {
229
- # 注意,mini-ring-progress模式接受的输入应当在0到1之间
230
- 'title': 'mini-ring-progress示例',
231
- 'dataIndex': 'mini-ring-progress示例',
232
- # 'width': '25%',
233
- 'renderOptions': {
234
- 'renderType': 'mini-ring-progress'
235
- }
236
- },
237
- {
238
- 'title': 'mini-area示例',
239
- 'dataIndex': 'mini-area示例',
240
- # 'width': '25%',
241
- 'renderOptions': {
242
- 'renderType': 'mini-area'
243
- }
244
- },
245
- {
246
- 'title': 'mini-line示例',
247
- 'dataIndex': 'mini-line示例',
248
- # 'width': '25%',
249
- 'renderOptions': {
250
- 'renderType': 'mini-line'
251
- }
252
- },
253
- ],
254
- data=[
255
- {
256
- 'key': i,
257
- 'ellipsis内容省略示例': '这是一段废话,用来演示超长内容再渲染巴拉巴拉巴拉巴拉巴拉巴拉巴拉巴拉',
258
- 'status-badge示例': {
259
- 'status': 'processing',
260
- 'text': '处理中'
261
- },
262
- 'mini-line示例': np.random.randint(1, 20, 10),
263
- 'mini-bar示例': np.random.randint(1, 20, 10),
264
- 'mini-progress示例': np.random.rand(),
265
- 'mini-ring-progress示例': np.random.rand(),
266
- 'mini-area示例': np.random.randint(1, 20, 10)
267
- }
268
- for i in range(50)
269
- ],
270
- maxHeight=400,
271
- # maxWidth=800,
272
- bordered=True,
273
- containerId='docs-content' # 绑定局部滚动容器以确保悬浮层正常显示
274
- ),
275
-
276
- html.Div(
277
- [
278
- fac.AntdAlert(
279
- description='好样的',
280
- message=[
281
- html.Div(
282
- [
283
- fac.AntdText(
284
- '这是一段测试文字,'
285
- ),
286
- fac.AntdText(
287
- '加粗',
288
- strong=True
289
- ),
290
- html.A(
291
- '链接',
292
- href='/'
293
- )
294
- ]
295
- )
296
- ],
297
- showIcon=True
298
- )
299
- ]
300
- ),
301
-
302
-
303
- html.Div(
304
- [
305
- fac.AntdAlert(
306
- description='这是一段辅助说明文字',
307
- message=[
308
- '君不见黄河之水天上来',
309
- '奔流到海不复回',
310
- '君不见高堂明镜悲白发',
311
- '朝如青丝暮成雪',
312
- '人生得意须尽欢',
313
- '莫使金樽空对月',
314
- '天生我材必有用',
315
- '千金散尽还复来'
316
- ],
317
- showIcon=True,
318
- messageRenderMode='loop-text'
319
- )
320
- ]
321
- ),
322
-
323
-
324
- fac.AntdTabs(
325
- [
326
- fac.AntdTabPane(
327
- html.Div(
328
- '标签页1测试',
329
- style={
330
- 'backgroundColor': 'rgba(241, 241, 241, 0.4)',
331
- 'height': '200px',
332
- 'display': 'flex',
333
- 'justifyContent': 'center',
334
- 'alignItems': 'center'
335
- }
336
- ),
337
- tab='标签页1',
338
- key='标签页1',
339
- titleSideInfoPopover={
340
- 'title': '标签页1说明',
341
- 'content': '这是标签页1的说明文字内容示例'
342
- }
343
- ),
344
- fac.AntdTabPane(
345
- html.Div(
346
- fac.AntdButton('标签页2测试', type='primary'),
347
- style={
348
- 'backgroundColor': 'rgba(241, 241, 241, 0.4)',
349
- 'height': '200px',
350
- 'display': 'flex',
351
- 'justifyContent': 'center',
352
- 'alignItems': 'center'
353
- }
354
- ),
355
- tab='标签页2',
356
- key='标签页2',
357
- titleSideInfoPopover={
358
- 'title': '标签页2说明',
359
- 'content': '这是标签页2的说明文字内容示例'
360
- }
361
- ),
362
- fac.AntdTabPane(
363
- html.Div(
364
- fac.AntdButton('标签页3测试', type='dashed'),
365
- style={
366
- 'backgroundColor': 'rgba(241, 241, 241, 0.4)',
367
- 'height': '200px',
368
- 'display': 'flex',
369
- 'justifyContent': 'center',
370
- 'alignItems': 'center'
371
- }
372
- ),
373
- tab='标签页3',
374
- key='标签页3',
375
- titleSideInfoPopover={
376
- 'title': '标签页3说明',
377
- 'content': '这是标签页3的说明文字内容示例'
378
- }
379
- )
380
- ]
381
- ),
382
-
383
- html.Div(
384
- [
385
- fac.AntdAlert(
386
- '这是一段辅助说明文字',
387
- message=','.join([
388
- '君不见黄河之水天上来',
389
- '奔流到海不复回',
390
- '君不见高堂明镜悲白发',
391
- '朝如青丝暮成雪',
392
- '人生得意须尽欢',
393
- '莫使金樽空对月',
394
- '天生我材必有用',
395
- '千金散尽还复来'
396
- ]) + '。',
397
- description='这是跑马灯模式示例',
398
- showIcon=True,
399
- messageRenderMode='marquee'
400
- )
401
- ]
402
- ),
403
-
404
- fac.AntdRadioGroup(
405
- options=[
406
- {
407
- 'label': f'选项{i}',
408
- 'value': f'选项{i}'
409
- }
410
- for i in range(5)
411
- ],
412
- defaultValue='选项1'
413
- ),
414
-
415
- fac.AntdSpace(
416
- [
417
- html.Div(
418
- '输入框',
419
- style={
420
- 'height': '32px',
421
- 'lineHeight': '32px',
422
- 'backgroundColor': 'rgb(241, 241, 241)',
423
- 'paddingLeft': '8px',
424
- 'paddingRight': '8px',
425
- 'borderTopLeftRadius': '5px',
426
- 'borderBottomLeftRadius': '5px',
427
- }
428
- ),
429
- fac.AntdInput(
430
- style={
431
- 'width': '100px'
432
- }
433
- )
434
- ],
435
- size=0
436
- ),
437
-
438
- html.Div(
439
- style={
440
- 'height': '200px'
441
- }
442
- ),
443
-
444
- fac.AntdRadioGroup(
445
- options=[
446
- {
447
- 'label': f'选项{i}',
448
- 'value': f'选项{i}'
449
- }
450
- for i in range(5)
451
- ],
452
- direction='vertical',
453
- defaultValue='选项1'
454
- ),
455
-
456
- fac.AntdPopover(
457
- fac.AntdButton(
458
- '鼠标悬浮于此',
459
- type='primary'
460
- ),
461
- content=[
462
- fac.AntdButton(
463
- '鼠标悬浮于此',
464
- type='primary'
465
- ),
466
- fac.AntdButton(
467
- '鼠标悬浮于此',
468
- type='primary'
469
- ),
470
- fac.AntdButton(
471
- '鼠标悬浮于此',
472
- type='primary'
473
- ),
474
- fac.AntdTimeline(
475
- items=[
476
- {
477
- 'content': '训练数据导入',
478
- 'icon': 'md-cloud-upload',
479
- 'iconStyle': {
480
- 'fontSize': '18px'
481
- }
482
- },
483
- {
484
- 'content': '模型训练',
485
- 'icon': 'antd-clock-circle',
486
- 'iconStyle': {
487
- 'fontSize': '18px'
488
- }
489
- },
490
- {
491
- 'content': '模型持久化',
492
- 'icon': 'fc-accept-database',
493
- 'iconStyle': {
494
- 'fontSize': '18px'
495
- }
496
- },
497
- {
498
- 'content': '模型发布',
499
- 'icon': 'md-cloud-done',
500
- 'iconStyle': {
501
- 'fontSize': '18px'
502
- }
503
- }
504
- ],
505
- style={
506
- 'margin': '20px'
507
- }
508
- )
509
- ],
510
- title={
511
- 'content': '标题前缀图标测试',
512
- 'prefixIcon': 'fc-search'
513
- }
514
- ),
515
-
516
- fac.AntdProgress(
517
- percent=80
518
- ),
519
- html.Div(
520
- style={
521
- 'height': '100px'
522
- }
523
- ),
524
- html.Div(
525
- [
526
-
527
- html.Div(
528
- [
529
-
530
- html.Div(
531
- fac.AntdMenu(
532
- menuItems=[
533
- {
534
- 'component': 'SubMenu',
535
- 'props': {
536
- 'key': f'{sub_menu}',
537
- 'title': f'子菜单{sub_menu}'
538
- },
539
- 'children': [
540
- {
541
- 'component': 'ItemGroup',
542
- 'props': {
543
- 'key': f'{sub_menu}-{item_group}',
544
- 'title': f'菜单项分组{sub_menu}-{item_group}'
545
- },
546
- 'children': [
547
- {
548
- 'component': 'Item',
549
- 'props': {
550
- 'key': f'{sub_menu}-{item_group}-{item}',
551
- 'title': f'菜单项{sub_menu}-{item_group}-{item}'
552
- }
553
- }
554
- for item in range(1, 3)
555
- ]
556
- }
557
- for item_group in range(1, 3)
558
- ]
559
- }
560
- for sub_menu in range(1, 5)
561
- ],
562
- mode='horizontal'
563
- ),
564
- style={
565
- 'width': '250px'
566
- }
567
- ),
568
-
569
- html.Div(
570
- fac.AntdMenu(
571
- menuItems=[
572
- {
573
- 'component': 'SubMenu',
574
- 'props': {
575
- 'key': f'{sub_menu}',
576
- 'title': f'子菜单{sub_menu}'
577
- },
578
- 'children': [
579
- {
580
- 'component': 'ItemGroup',
581
- 'props': {
582
- 'key': f'{sub_menu}-{item_group}',
583
- 'title': f'菜单项分组{sub_menu}-{item_group}'
584
- },
585
- 'children': [
586
- {
587
- 'component': 'Item',
588
- 'props': {
589
- 'key': f'{sub_menu}-{item_group}-{item}',
590
- 'title': f'菜单项{sub_menu}-{item_group}-{item}'
591
- }
592
- }
593
- for item in range(1, 3)
594
- ]
595
- }
596
- for item_group in range(1, 3)
597
- ]
598
- }
599
- for sub_menu in range(1, 5)
600
- ]
601
- ),
602
- style={
603
- 'width': '250px'
604
- }
605
- ),
606
-
607
-
608
- fac.AntdTable(
609
- columns=[
610
- {
611
- 'title': '字段示例1',
612
- 'dataIndex': '字段示例1'
613
- },
614
- {
615
- 'title': '字段示例2',
616
- 'dataIndex': '字段示例2'
617
- },
618
- {
619
- 'title': '字段示例3',
620
- 'dataIndex': '字段示例3'
621
- }
622
- ],
623
- data=[
624
- {
625
- '字段示例1': i,
626
- '字段示例2': i,
627
- '字段示例3': i
628
- }
629
- for i in range(30)
630
- ]
631
- ),
632
-
633
- fac.AntdSpace(
634
- [
635
- fac.AntdButton(
636
- [
637
- fac.AntdIcon(
638
- icon='md-power-settings-new'
639
- ),
640
- 'md-power-settings-new'
641
- ]
642
- ),
643
- fac.AntdButton(
644
- [
645
- fac.AntdIcon(
646
- icon='md-layers'
647
- ),
648
- 'md-layers'
649
- ],
650
- type='primary'
651
- ),
652
- fac.AntdButton(
653
- [
654
- fac.AntdIcon(
655
- icon='fc-repair'
656
- ),
657
- 'fc-repair'
658
- ],
659
- type='dashed'
660
- )
661
- ]
662
- ),
663
-
664
- fac.AntdTable(
665
- columns=[
666
- {
667
- 'title': 'ellipsis内容省略示例',
668
- 'dataIndex': 'ellipsis内容省略示例',
669
- 'renderOptions': {'renderType': 'copyable'}
670
- }
671
- ],
672
- data=[
673
- {
674
- 'key': i,
675
- 'ellipsis内容省略示例': '这是一段废话,用来演示超长内容再渲染巴拉巴拉巴拉巴拉巴拉巴拉巴拉巴拉'
676
- }
677
- for i in range(5)
678
- ],
679
- bordered=True,
680
- style={
681
- 'width': '250px'
682
- }
683
- ),
684
- fac.AntdTitle(
685
- 'AntdIcon测试区域',
686
- level=4
687
- ),
688
- fac.AntdSpace(
689
- [
690
- fac.AntdButton(
691
- [
692
- fac.AntdIcon(icon='search', style={
693
- 'marginRight': '5px'}),
694
- '搜索'
695
- ]
696
- ),
697
-
698
- fac.AntdAvatar(
699
- mode='icon',
700
- icon='fc-vlc'
701
- )
702
- ]
703
- ),
704
- fac.AntdBreadcrumb(
705
- items=[
706
- {
707
- 'title': 'feffery-components仓库主页',
708
- 'href': 'https://github.com/CNFeffery/feffery-dash-components',
709
- 'target': '_blank',
710
- 'icon': 'github'
711
- },
712
- {
713
- 'title': 'feffery-antd-components文档首页',
714
- 'href': '/',
715
- 'target': '_blank',
716
- 'icon': 'home'
717
- },
718
- {
719
- 'title': 'AntdBreadcrumb文档页',
720
- 'href': '/AntdBreadcrumb',
721
- 'target': '_blank',
722
- 'icon': 'fc-approval'
723
- }
724
- ]
725
- ),
726
-
727
- fac.AntdDraggerUpload(
728
- apiUrl='/upload/',
729
- fileMaxSize=1,
730
- fileListMaxLength=1,
731
- text='拖拽上传示例',
732
- hint='点击或拖拽文件至此处进行上传'
733
- ),
734
-
735
-
736
- fac.AntdDropdown(
737
- title='触发点',
738
- menuItems=[
739
- {
740
- 'title': '子页面1',
741
- 'icon': 'global'
742
- },
743
- {
744
- 'title': '子页面1',
745
- 'icon': 'fc-plus'
746
- },
747
- {
748
- 'title': '子页面2'
749
- },
750
- {
751
- 'isDivider': True
752
- },
753
- {
754
- 'title': '子页面3-1'
755
- },
756
- {
757
- 'title': '子页面3-2'
758
- }
759
- ]
760
- ),
761
-
762
- fac.AntdRadioGroup(
763
- options=[
764
- {
765
- 'label': f'选项{i}',
766
- 'value': f'选项{i}'
767
- }
768
- for i in range(5)
769
- ],
770
- direction='vertical',
771
- defaultValue='选项1'
772
- ),
773
-
774
- html.Div(
775
- fac.AntdMenu(
776
- menuItems=[
777
- {
778
- 'component': 'Item',
779
- 'props': {
780
- 'key': f'图标{icon}',
781
- 'title': f'图标{icon}',
782
- 'icon': icon
783
- }
784
- }
785
- for icon in [
786
- 'home',
787
- 'cloud-upload',
788
- 'bar-chart',
789
- 'pie-chart',
790
- 'dot-chart',
791
- 'line-chart',
792
- 'apartment',
793
- 'app-store',
794
- 'app-store-add',
795
- 'bell',
796
- 'calculator',
797
- 'calendar',
798
- 'database',
799
- 'history',
800
- 'fc-services',
801
- 'fc-questions',
802
- 'fc-organization'
803
- ]
804
- ],
805
- mode='inline'
806
- ),
807
- style={
808
- 'width': '250px'
809
- }
810
- ),
811
- fac.AntdButton(
812
- '触发全局提示框', id='message-trigger-button-demo1', type='primary'),
813
- html.Div(id='message-container-demo1'),
814
-
815
- fac.AntdPopover(
816
- fac.AntdButton(
817
- '鼠标悬浮于此',
818
- type='primary'
819
- ),
820
- content=[
821
- fac.AntdButton(
822
- '鼠标悬浮于此',
823
- type='primary'
824
- ),
825
- fac.AntdButton(
826
- '鼠标悬浮于此',
827
- type='primary'
828
- ),
829
- fac.AntdButton(
830
- '鼠标悬浮于此',
831
- type='primary'
832
- ),
833
- fac.AntdTimeline(
834
- items=[
835
- {
836
- 'content': '训练数据导入',
837
- 'icon': 'md-cloud-upload',
838
- 'iconStyle': {
839
- 'fontSize': '18px'
840
- }
841
- },
842
- {
843
- 'content': '模型训练',
844
- 'icon': 'antd-clock-circle',
845
- 'iconStyle': {
846
- 'fontSize': '18px'
847
- }
848
- },
849
- {
850
- 'content': '模型持久化',
851
- 'icon': 'fc-accept-database',
852
- 'iconStyle': {
853
- 'fontSize': '18px'
854
- }
855
- },
856
- {
857
- 'content': '模型发布',
858
- 'icon': 'md-cloud-done',
859
- 'iconStyle': {
860
- 'fontSize': '18px'
861
- }
862
- }
863
- ],
864
- style={
865
- 'margin': '20px'
866
- }
867
- )
868
- ],
869
- title={
870
- 'content': '标题前缀图标测试',
871
- 'prefixIcon': 'fc-search'
872
- }
873
- ),
874
-
875
-
876
- fac.AntdTimeline(
877
- items=[
878
- {
879
- 'content': '训练数据导入',
880
- 'icon': 'md-cloud-upload',
881
- 'iconStyle': {
882
- 'fontSize': '18px'
883
- }
884
- },
885
- {
886
- 'content': '模型训练',
887
- 'icon': 'clock-circle',
888
- 'iconStyle': {
889
- 'fontSize': '18px'
890
- }
891
- },
892
- {
893
- 'content': '模型持久化',
894
- 'icon': 'fc-accept-database',
895
- 'iconStyle': {
896
- 'fontSize': '18px'
897
- }
898
- },
899
- {
900
- 'content': '模型发布',
901
- 'icon': 'md-cloud-done',
902
- 'iconStyle': {
903
- 'fontSize': '18px'
904
- }
905
- }
906
- ],
907
- style={
908
- 'margin': '20px'
909
- }
910
- ),
911
-
912
-
913
- fac.AntdTree(
914
- treeData=[
915
- {
916
- 'title': '负责人A',
917
- 'key': '负责人A',
918
- 'icon': 'user',
919
- 'children': [
920
- {
921
- 'title': '数仓1',
922
- 'key': '数仓1',
923
- 'icon': 'database',
924
- 'children': [
925
- {
926
- 'title': f'业务表1-{i}',
927
- 'key': f'业务表1-{i}',
928
- 'icon': 'table'
929
- }
930
- for i in range(5)
931
- ]
932
- },
933
- {
934
- 'title': '数仓2',
935
- 'key': '数仓2',
936
- 'icon': 'database',
937
- 'children': [
938
- {
939
- 'title': f'业务表2-{i}',
940
- 'key': f'业务表2-{i}',
941
- 'icon': 'fc-search'
942
- }
943
- for i in range(5)
944
- ]
945
- }
946
- ]
947
- }
948
- ],
949
- # 设置默认全部展开
950
- defaultExpandAll=True,
951
- checkable=True
952
- ),
953
-
954
-
955
- fac.AntdStatistic(
956
- title='统计数值示例',
957
- titleTooltip='这是一段指标说明内容巴拉巴拉'*10,
958
- value=1332971
959
- ),
960
- html.Div(
961
- id='password-md5-demo-output'
962
- ),
963
- fac.AntdInput(
964
- id='password-md5-demo',
965
- placeholder='输入框测试',
966
- mode='password',
967
- passwordUseMd5=True
968
- ),
969
-
970
- fac.AntdTreeSelect(
971
- treeData=[
972
- {
973
- "title": "Node1",
974
- "value": "0-0",
975
- "key": "0-0",
976
- "children": [
977
- {
978
- "title": "Child Node1",
979
- "value": "0-0-0",
980
- "key": "0-0-0"
981
- }
982
- ]
983
- },
984
- {
985
- "title": "Node2",
986
- "value": "0-1",
987
- "key": "0-1",
988
- "children": [
989
- {
990
- "title": "Child Node3",
991
- "value": "0-1-0",
992
- "key": "0-1-0"
993
- },
994
- {
995
- "title": "Child Node4",
996
- "value": "0-1-1",
997
- "key": "0-1-1"
998
- },
999
- {
1000
- "title": "Child Node5",
1001
- "value": "0-1-2",
1002
- "key": "0-1-2"
1003
- }
1004
- ]
1005
- }
1006
- ],
1007
- style={
1008
- 'width': '250px'
1009
- }
1010
- ),
1011
- # 需要relative
1012
- fac.AntdTooltip(
1013
- fac.AntdButton(
1014
- 'click事件',
1015
- type='primary'
1016
- ),
1017
- title='这是一段AntdTooltip提示示例',
1018
- trigger='click'
1019
- ),
1020
-
1021
- # 需要relative
1022
- fac.AntdTimeRangePicker(
1023
- allowClear=True,
1024
- hourStep=3,
1025
- minuteStep=10,
1026
- secondStep=10
1027
- ),
1028
- # 需要relative
1029
- fac.AntdTimePicker(
1030
- allowClear=True,
1031
- hourStep=3,
1032
- minuteStep=10,
1033
- secondStep=10
1034
- ),
1035
-
1036
- # 需要relative
1037
- fac.AntdPopover(
1038
- fac.AntdButton(
1039
- 'click事件',
1040
- type='primary'
1041
- ),
1042
- title='这是一段AntdTooltip提示示例',
1043
- trigger='click'
1044
- ),
1045
-
1046
- # 需要relative
1047
- fac.AntdPopconfirm(
1048
- fac.AntdButton(
1049
- '点击触发',
1050
- type='primary'
1051
- ),
1052
- title='气泡确认测试'
1053
- ),
1054
-
1055
- # 需要relative
1056
- fac.AntdDropdown(
1057
- title='触发点',
1058
- trigger='click',
1059
- menuItems=[
1060
- {
1061
- 'title': '子页面1'
1062
- },
1063
- {
1064
- 'title': '子页面2'
1065
- },
1066
- {
1067
- 'isDivider': True
1068
- },
1069
- {
1070
- 'title': '子页面3-1'
1071
- },
1072
- {
1073
- 'title': '子页面3-2'
1074
- }
1075
- ]
1076
- ),
1077
-
1078
- # 需要relative
1079
- fac.AntdMentions(
1080
- options=[
1081
- {
1082
- 'label': '费弗里',
1083
- 'value': '费弗里'
1084
- },
1085
- {
1086
- 'label': '小A',
1087
- 'value': '小A'
1088
- },
1089
- {
1090
- 'label': 'liz',
1091
- 'value': 'liz'
1092
- }
1093
- ],
1094
- style={
1095
- 'width': '400px'
1096
- }
1097
- ),
1098
-
1099
- fac.AntdCascader(
1100
- options=[
1101
- {
1102
- 'value': '节点1',
1103
- 'label': '节点1',
1104
- 'children': [
1105
- {
1106
- 'value': '节点1-1',
1107
- 'label': '节点1-1'
1108
- },
1109
- {
1110
- 'value': '节点1-2',
1111
- 'label': '节点1-2',
1112
- 'children': [
1113
- {
1114
- 'value': '节点1-2-1',
1115
- 'label': '节点1-2-1'
1116
- },
1117
- {
1118
- 'value': '节点1-2-2',
1119
- 'label': '节点1-2-2'
1120
- }
1121
- ]
1122
- }
1123
- ]
1124
- },
1125
- {
1126
- 'value': '节点2',
1127
- 'label': '节点2',
1128
- 'children': [
1129
- {
1130
- 'value': '节点2-1',
1131
- 'label': '节点2-1'
1132
- },
1133
- {
1134
- 'value': '节点2-2',
1135
- 'label': '节点2-2'
1136
- }
1137
- ]
1138
- }
1139
- ],
1140
- style={
1141
- 'width': '300px'
1142
- }
1143
- ),
1144
- fac.AntdTable(
1145
- columns=[
1146
- {
1147
- 'title': f'字段{i}',
1148
- 'dataIndex': f'字段{i}'
1149
- }
1150
- for i in range(1, 6)
1151
- ],
1152
- data=[
1153
- {
1154
- f'字段{i}': np.random.randint(1, 5)
1155
- for i in range(1, 6)
1156
- }
1157
- for _ in range(10)
1158
- ],
1159
- filterOptions={
1160
- '字段1': {
1161
- 'filterMode': 'keyword'
1162
- },
1163
- '字段3': {
1164
- 'filterMode': 'checkbox',
1165
- 'filterCustomItems': [1, 2, 3]
1166
- }
1167
- }
1168
- ),
1169
-
1170
- fac.AntdSelect(
1171
- placeholder='请选择国家:',
1172
- options=[
1173
- {'label': '中国', 'value': '中国'},
1174
- {'label': '美国', 'value': '美国'},
1175
- {'label': '俄罗斯', 'value': '俄罗斯'},
1176
- {'label': '德国', 'value': '德国', 'disabled': True},
1177
- {'label': '加拿大', 'value': '加拿大'}
1178
- ],
1179
- style={
1180
- # 使用css样式固定宽度
1181
- 'width': '200px'
1182
- }
1183
- ),
1184
-
1185
- # 需要relative
1186
- fac.AntdDatePicker(
1187
- defaultValue='2021-01-01 23:00:00',
1188
- showTime=True
1189
- ),
1190
-
1191
- # 需要relative
1192
- fac.AntdDateRangePicker(
1193
- defaultValue=['2021-01-01 17:00:00',
1194
- '2021-01-09 18:00:00'],
1195
- showTime=True
1196
- ),
1197
-
1198
-
1199
- fac.AntdComment(
1200
- id='comment-demo',
1201
- authorName='费弗里',
1202
- authorNameHref='https://github.com/CNFeffery/feffery-antd-components',
1203
- publishTime={
1204
- 'value': '2022-01-01 19:29:01',
1205
- 'format': 'YYYY-MM-DD hh:mm:ss'
1206
- },
1207
- commentContent='我希望feffery-components项目系列组件可以帮助更多人快速开发心仪的网站应用!😀',
1208
- showDelete=True
1209
- ),
1210
-
1211
- html.Div(id='comment-output-demo'),
1212
-
1213
- html.Div(
1214
- style={
1215
- 'height': '1000px'
1216
- }
1217
- )
1218
-
1219
- ],
1220
- style={
1221
- 'padding': '100px 200px',
1222
- 'position': 'relative'
1223
- },
1224
- id='container-demo'
1225
- )
1226
- ],
1227
- style={
1228
- 'margin': '100px',
1229
- 'border': '1px solid grey',
1230
- 'height': '800px',
1231
- 'overflowY': 'auto'
1232
- }
1233
151
  )
1234
152
  ],
1235
153
  style={
@@ -1238,63 +156,5 @@ app.layout = html.Div(
1238
156
  }
1239
157
  )
1240
158
 
1241
-
1242
- @app.callback(
1243
- Output('password-md5-demo-output', 'children'),
1244
- Input('password-md5-demo', 'md5Value')
1245
- )
1246
- def test(md5Value):
1247
-
1248
- return md5Value
1249
-
1250
-
1251
- @app.callback(
1252
- Output('comment-output-demo', 'children'),
1253
- [Input('comment-demo', 'replyClicks'),
1254
- Input('comment-demo', 'deleteClicks')]
1255
- )
1256
- def test_(replyClicks, deleteClicks):
1257
-
1258
- return f'{replyClicks} - {deleteClicks}'
1259
-
1260
-
1261
- @app.callback(
1262
- Output('message-container-demo1', 'children'),
1263
- Input('message-trigger-button-demo1', 'nClicks'),
1264
- prevent_initial_call=True
1265
- )
1266
- def message_demo1(nClicks):
1267
-
1268
- return fac.AntdMessage(
1269
- content='全局提示框示例',
1270
- icon='fc-overtime',
1271
- duration=0
1272
- )
1273
-
1274
-
1275
- @app.callback(
1276
- Output('modal-demo-1', 'visible'),
1277
- Input('modal-demo-trigger-1', 'nClicks'),
1278
- prevent_initial_call=True
1279
- )
1280
- def modal_demo_callback1(nClicks):
1281
- return True
1282
-
1283
-
1284
- @app.callback(
1285
- Output('test-output', 'children'),
1286
- Input('test', 'currentPastedImages')
1287
- )
1288
- def paste_image_test(currentPastedImages):
1289
-
1290
- if currentPastedImages:
1291
- return [
1292
- html.Img(
1293
- src=currentPastedImage
1294
- )
1295
- for currentPastedImage in currentPastedImages
1296
- ]
1297
-
1298
-
1299
159
  if __name__ == '__main__':
1300
160
  app.run_server(debug=True)