@mxmweb/zui 1.1.13 → 1.3.0

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 (130) hide show
  1. package/README.md +61 -3
  2. package/assets/style.css +1 -0
  3. package/cluster_enter.d.ts +25 -0
  4. package/index.js +33 -0
  5. package/package.json +24 -39
  6. package/.editorconfig +0 -38
  7. package/.prettierignore +0 -16
  8. package/.prettierrc +0 -17
  9. package/.releaserc.json +0 -36
  10. package/CHANGELOG.md +0 -58
  11. package/CONTRIBUTING.md +0 -111
  12. package/NPMREADME.md +0 -0
  13. package/bash.exe.stackdump +0 -40
  14. package/components.json +0 -21
  15. package/dist/Preview.d.ts +0 -3
  16. package/dist/README.md +0 -4
  17. package/dist/assets/style.css +0 -1
  18. package/dist/containers/DashboardContainer.d.ts +0 -35
  19. package/dist/containers/DockContainer.d.ts +0 -24
  20. package/dist/elements/Button.d.ts +0 -17
  21. package/dist/elements/CustomDock.d.ts +0 -25
  22. package/dist/elements/DropDownButton.d.ts +0 -24
  23. package/dist/elements/DropdownMenu.d.ts +0 -17
  24. package/dist/elements/GoggleNavbar.d.ts +0 -31
  25. package/dist/elements/Uploader/UploadItem.d.ts +0 -35
  26. package/dist/elements/Uploader/example.d.ts +0 -7
  27. package/dist/elements/Uploader/index.d.ts +0 -9
  28. package/dist/elements/Uploader/styles.d.ts +0 -65
  29. package/dist/elements/Uploader/types.d.ts +0 -87
  30. package/dist/elements/Uploader/utils.d.ts +0 -31
  31. package/dist/elements/Uploader.d.ts +0 -2
  32. package/dist/examples/DockContainerExample.d.ts +0 -3
  33. package/dist/icons/Icon.d.ts +0 -7
  34. package/dist/icons/Icon.tsx +0 -82
  35. package/dist/icons/index.d.ts +0 -13
  36. package/dist/icons/index.tsx +0 -92
  37. package/dist/icons/lazyIndex.d.ts +0 -7
  38. package/dist/icons/lazyIndex.tsx +0 -49
  39. package/dist/icons/rag/csv.svg +0 -3
  40. package/dist/icons/rag/document.svg +0 -3
  41. package/dist/icons/rag/excel.svg +0 -3
  42. package/dist/icons/rag/file.svg +0 -3
  43. package/dist/icons/rag/folder.svg +0 -5
  44. package/dist/icons/rag/json.svg +0 -3
  45. package/dist/icons/rag/knowledgebase.svg +0 -3
  46. package/dist/icons/rag/netretrive.svg +0 -3
  47. package/dist/icons/rag/odf.svg +0 -7
  48. package/dist/icons/rag/pdf.svg +0 -3
  49. package/dist/icons/rag/pic.svg +0 -3
  50. package/dist/icons/rag/ppt.svg +0 -3
  51. package/dist/icons/rag/think.svg +0 -6
  52. package/dist/icons/rag/txt.svg +0 -3
  53. package/dist/icons/rag/url.svg +0 -3
  54. package/dist/icons/rag/word.svg +0 -3
  55. package/dist/icons/rag/wps.svg +0 -3
  56. package/dist/icons/rag/zip.svg +0 -7
  57. package/dist/index.js +0 -2299
  58. package/dist/lib_enter.d.ts +0 -13
  59. package/dist/main.d.ts +0 -1
  60. package/dist/mock.csv +0 -16
  61. package/dist/mock_/345/211/257/346/234/254.csv +0 -16
  62. package/dist/package.json +0 -30
  63. package/dist/theme/styledTheme.d.ts +0 -101
  64. package/dist/vite.svg +0 -1
  65. package/eslint.config.js +0 -92
  66. package/index.html +0 -13
  67. package/postcss.config.cjs +0 -19
  68. package/public/mock.csv +0 -16
  69. package/public/mock_/345/211/257/346/234/254.csv +0 -16
  70. package/public/vite.svg +0 -1
  71. package/src/Preview.tsx +0 -15
  72. package/src/assets/img/excel.png +0 -0
  73. package/src/assets/img/img.png +0 -0
  74. package/src/assets/img/pdf.png +0 -0
  75. package/src/assets/img/ppt.png +0 -0
  76. package/src/assets/img/txt.png +0 -0
  77. package/src/assets/img/word.png +0 -0
  78. package/src/containers/DashboardContainer.tsx +0 -507
  79. package/src/containers/DockContainer.tsx +0 -186
  80. package/src/containers/style.css +0 -37
  81. package/src/elements/Button.tsx +0 -118
  82. package/src/elements/CustomDock.tsx +0 -287
  83. package/src/elements/DropDownButton.tsx +0 -249
  84. package/src/elements/DropdownMenu.tsx +0 -184
  85. package/src/elements/GoggleNavbar.tsx +0 -184
  86. package/src/elements/Uploader/README.md +0 -249
  87. package/src/elements/Uploader/UploadItem.tsx +0 -298
  88. package/src/elements/Uploader/example.tsx +0 -95
  89. package/src/elements/Uploader/index.tsx +0 -702
  90. package/src/elements/Uploader/styles.tsx +0 -291
  91. package/src/elements/Uploader/types.ts +0 -119
  92. package/src/elements/Uploader/utils.ts +0 -200
  93. package/src/elements/Uploader.tsx +0 -3
  94. package/src/examples/DockContainerExample.tsx +0 -237
  95. package/src/icons/Icon.tsx +0 -82
  96. package/src/icons/index.tsx +0 -92
  97. package/src/icons/lazyIndex.tsx +0 -49
  98. package/src/icons/rag/csv.svg +0 -3
  99. package/src/icons/rag/document.svg +0 -3
  100. package/src/icons/rag/excel.svg +0 -3
  101. package/src/icons/rag/file.svg +0 -3
  102. package/src/icons/rag/folder.svg +0 -5
  103. package/src/icons/rag/json.svg +0 -3
  104. package/src/icons/rag/knowledgebase.svg +0 -3
  105. package/src/icons/rag/netretrive.svg +0 -3
  106. package/src/icons/rag/odf.svg +0 -7
  107. package/src/icons/rag/pdf.svg +0 -3
  108. package/src/icons/rag/pic.svg +0 -3
  109. package/src/icons/rag/ppt.svg +0 -3
  110. package/src/icons/rag/think.svg +0 -6
  111. package/src/icons/rag/txt.svg +0 -3
  112. package/src/icons/rag/url.svg +0 -3
  113. package/src/icons/rag/word.svg +0 -3
  114. package/src/icons/rag/wps.svg +0 -3
  115. package/src/icons/rag/zip.svg +0 -7
  116. package/src/lib_enter.ts +0 -27
  117. package/src/main.tsx +0 -11
  118. package/src/style.css +0 -9
  119. package/src/theme/styledTheme.tsx +0 -253
  120. package/src/type.d.ts +0 -0
  121. package/src/types/images.d.ts +0 -12
  122. package/src/types/svg-modules.d.ts +0 -24
  123. package/src/vite-env.d.ts +0 -11
  124. package/tailwind.config.js +0 -170
  125. package/tsconfig.app.json +0 -29
  126. package/tsconfig.app.tsbuildinfo +0 -11
  127. package/tsconfig.json +0 -13
  128. package/tsconfig.node.json +0 -22
  129. package/tsconfig.node.tsbuildinfo +0 -1
  130. package/vite.config.ts +0 -165
@@ -1,298 +0,0 @@
1
- import React from 'react';
2
- import { File, X, AlertCircle, ChevronDown, ChevronRight, Trash } from 'lucide-react';
3
- import { FormXviwer } from '@mxmweb/xviewer';
4
- import '@mxmweb/xviewer/style.css';
5
- import { type UploadItem as UploadItemType, type UploadStatus } from './types';
6
- import { formatFileSize } from './utils';
7
- import {
8
- UploadItem as StyledUploadItem,
9
- FileIcon,
10
- FileInfo,
11
- FileName,
12
- FileSize,
13
- ProgressBar,
14
- StatusIcon,
15
- RemoveButton,
16
- ExpandButton,
17
- FormContainer,
18
- UploadItemContainer
19
- } from './styles';
20
- import { type AppTheme } from '../../theme/styledTheme';
21
- import { createGlobalStyle } from 'styled-components';
22
-
23
- // 内部开关:控制是否启用“展开/收起”交互(默认关闭,表单始终展示)
24
- const ENABLE_ITEM_FORM_EXPAND = false;
25
-
26
- interface UploadItemProps {
27
- item: UploadItemType;
28
- index: number;
29
- theme: AppTheme;
30
- itemForm: any[];
31
- onRemove: (id: string) => void;
32
- onToggleExpand: (id: string) => void;
33
- onFormDataChange: (id: string, formData: Record<string, any>) => void;
34
- icons?: {
35
- // 文件项状态图标配置
36
- itemStatus?: {
37
- pending?: React.ReactNode; // 上传前/待上传
38
- uploading?: React.ReactNode; // 上传中
39
- success?: React.ReactNode; // 上传成功
40
- error?: React.ReactNode; // 上传失败
41
- };
42
- // 文件类型图标配置
43
- fileType?: {
44
- default?: React.ReactNode; // 默认文件图标
45
- image?: React.ReactNode; // 图片文件
46
- document?: React.ReactNode; // 文档文件
47
- spreadsheet?: React.ReactNode; // 表格文件
48
- archive?: React.ReactNode; // 压缩文件
49
- video?: React.ReactNode; // 视频文件
50
- audio?: React.ReactNode; // 音频文件
51
- };
52
- };
53
- }
54
-
55
- /**
56
- * 获取文件类型图标
57
- * @param fileType - 文件类型
58
- * @param icons - 图标配置
59
- * @returns 文件类型图标
60
- */
61
- const getFileTypeIcon = (fileType: string, icons?: UploadItemProps['icons']) => {
62
- if (!icons?.fileType) {
63
- return <File size={20} />;
64
- }
65
-
66
- // 根据文件类型返回对应图标
67
- if (fileType.startsWith('image/')) {
68
- return icons.fileType.image || <File size={20} />;
69
- } else if (fileType.includes('document') || fileType.includes('pdf') || fileType.includes('text')) {
70
- return icons.fileType.document || <File size={20} />;
71
- } else if (fileType.includes('spreadsheet') || fileType.includes('excel') || fileType.includes('csv')) {
72
- return icons.fileType.spreadsheet || <File size={20} />;
73
- } else if (fileType.includes('zip') || fileType.includes('rar') || fileType.includes('7z')) {
74
- return icons.fileType.archive || <File size={20} />;
75
- } else if (fileType.startsWith('video/')) {
76
- return icons.fileType.video || <File size={20} />;
77
- } else if (fileType.startsWith('audio/')) {
78
- return icons.fileType.audio || <File size={20} />;
79
- }
80
-
81
- return icons.fileType.default || <File size={20} />;
82
- };
83
-
84
- /**
85
- * 获取状态显示组件
86
- * @param status - 上传状态
87
- * @param theme - 主题
88
- * @param icons - 图标配置
89
- * @returns 状态显示组件
90
- */
91
- const getStatusDisplay = (status: UploadStatus, theme: AppTheme, icons?: UploadItemProps['icons']) => {
92
- // 如果配置了状态图标,优先使用配置的图标
93
- if (icons?.itemStatus) {
94
- switch (status) {
95
- case 'error':
96
- return icons.itemStatus.error || <AlertCircle size={20} />;
97
- case 'uploading':
98
- return icons.itemStatus.uploading || <span style={{ fontSize: '12px', color: theme?.colors?.primary || '#007bff' }}>上传中...</span>;
99
- case 'success':
100
- return icons.itemStatus.success || null;
101
- case 'pending':
102
- return icons.itemStatus.pending || <span style={{ fontSize: '12px', color: theme?.colors?.warning || '#FFA500' }}>等待中</span>;
103
- default:
104
- return null;
105
- }
106
- }
107
-
108
- // 默认状态显示
109
- switch (status) {
110
- case 'error':
111
- return <AlertCircle size={20} />;
112
- case 'uploading':
113
- return <span style={{ fontSize: '12px', color: theme?.colors?.primary || '#007bff' }}>上传中...</span>;
114
- case 'pending':
115
- return <span style={{ fontSize: '12px', color: theme?.colors?.warning || '#FFA500' }}>等待中</span>;
116
- default:
117
- return null;
118
- }
119
- };
120
-
121
- const GlobalStyles = createGlobalStyle`
122
- .upload-item-container .upload-item {
123
- padding: 0px !important;
124
- }
125
-
126
- .upload-item-container .list-item {
127
- padding: 0px !important;
128
- }
129
- `;
130
- /**
131
- * 独立的上传项组件
132
- * 每个上传项都有独立的表单数据管理,展开/收起时保持数据状态
133
- */
134
- const UploadItem: React.FC<UploadItemProps> = ({
135
- item,
136
- index,
137
- theme,
138
- itemForm,
139
- onRemove,
140
- onToggleExpand,
141
- onFormDataChange,
142
- icons,
143
- }) => {
144
- return (
145
-
146
-
147
- <UploadItemContainer $theme={theme} $status={item.status} $hasForm={itemForm.length > 0}>
148
- <StyledUploadItem $theme={theme} $status={item.status} $hasForm={itemForm.length > 0}>
149
- {/* 索引计数 - 带高亮线设计 */}
150
- {/* <div style={{
151
- position: 'relative',
152
- marginRight: '12px',
153
- display: 'flex',
154
- alignItems: 'center',
155
- justifyContent: 'center',
156
- width: '24px',
157
- height: '24px'
158
- }}>
159
- <div style={{
160
- position: 'absolute',
161
- width: '2px',
162
- height: '16px',
163
- background: theme?.colors?.primary || '#007bff',
164
- borderRadius: '1px'
165
- }} />
166
- <span style={{
167
- color: theme?.colors?.primary || '#007bff',
168
- fontSize: '11px',
169
- fontWeight: '600',
170
- zIndex: 1,
171
- background: theme?.colors?.background || '#f8f9fa',
172
- padding: '0 2px'
173
- }}>
174
- {index + 1} .
175
- </span>
176
- </div> */}
177
-
178
- <FileIcon $theme={theme}>
179
- {getFileTypeIcon(item.type, icons)}
180
- </FileIcon>
181
-
182
- <FileInfo>
183
- <div className='flex items-center gap-1 line-clamp-1'>
184
- <FileName $theme={theme}>{item.name}</FileName>
185
- <FileSize $theme={theme}>{formatFileSize(item.size)}</FileSize>
186
- </div>
187
-
188
- {item.status === 'uploading' && (
189
- <ProgressBar $theme={theme} $progress={item.progress} />
190
- )}
191
-
192
- {item.status === 'error' && item.error && (
193
- <div style={{ color: theme?.colors?.error || '#FF0000', fontSize: '12px', marginTop: '4px' }}>
194
- {typeof item.error === 'string' ? item.error : String(item.error)}
195
- </div>
196
- )}
197
- </FileInfo>
198
-
199
- {/* 状态显示 */}
200
- {(() => {
201
- const statusDisplay = getStatusDisplay(item.status, theme, icons);
202
- return statusDisplay && (
203
- <StatusIcon $theme={theme} $status={item.status}>
204
- {statusDisplay}
205
- </StatusIcon>
206
- );
207
- })()}
208
-
209
- {/* 展开/收起按钮(可开关) - 只在上传完成后显示 */}
210
- {ENABLE_ITEM_FORM_EXPAND && itemForm.length > 0 && item.status === 'success' && (
211
- <ExpandButton
212
- $theme={theme}
213
- onClick={() => onToggleExpand(item.id)}
214
- title={item.isExpanded ? '收起表单' : '展开表单'}
215
- >
216
- {item.isExpanded ? <ChevronDown size={16} /> : <ChevronRight size={16} />}
217
- </ExpandButton>
218
- )}
219
-
220
- <RemoveButton
221
- $theme={theme}
222
- onClick={() => onRemove(item.id)}
223
- title="移除文件"
224
- >
225
- <Trash size={16} />
226
- </RemoveButton>
227
- </StyledUploadItem>
228
-
229
- {/* 文件项关联表单 - 当关闭展开功能时,始终展示;开启时遵循展开状态 */}
230
- {((!ENABLE_ITEM_FORM_EXPAND && itemForm.length > 0) ||
231
- (ENABLE_ITEM_FORM_EXPAND && item.isExpanded && itemForm.length > 0)) && (
232
- <FormContainer
233
- $theme={theme}
234
- $hasError={item.status === 'error'}
235
- className='list-my'
236
- >
237
- <FormXviwer
238
- formItems={itemForm}
239
- initialValues={item.formData || {}}
240
- size="sm"
241
- formProps={{ component: false }} // 禁用 <form> 标签,避免表单嵌套
242
- eventsEmit={(eventName: string, data: any) => {
243
- console.log('FormXviwer Event:', eventName, data);
244
-
245
- // 添加命名空间前缀,避免与外部表单事件冲突
246
- const namespacedEventName = `uploader_form:${eventName}`;
247
-
248
- switch (eventName) {
249
- case 'form:submit':
250
- onFormDataChange(item.id, data.values);
251
- break;
252
- case 'form:change':
253
- // 实时更新表单数据,确保展开/收起时数据不丢失
254
- onFormDataChange(item.id, data.values);
255
- break;
256
- case 'form:fieldChange':
257
- // 单个字段变化时也更新数据
258
- if (data.field && data.value !== undefined) {
259
- const updatedFormData = {
260
- ...item.formData,
261
- [data.field]: data.value
262
- };
263
- onFormDataChange(item.id, updatedFormData);
264
- }
265
- break;
266
- case 'form:reset':
267
- // 表单重置时清空数据
268
- onFormDataChange(item.id, {});
269
- break;
270
- case 'form:validate':
271
- // 表单验证时保持数据
272
- if (data.values) {
273
- onFormDataChange(item.id, data.values);
274
- }
275
- break;
276
- }
277
-
278
- // 转发命名空间事件给外部
279
- if (typeof onFormDataChange === 'function') {
280
- // 这里可以触发一个自定义事件,让外部知道内部表单发生了变化
281
- // 但不直接转发所有事件,避免冲突
282
- }
283
- }}
284
- styles={{ theme }}
285
- style={{
286
- padding: '0px'
287
- }}
288
- // 添加key确保组件重新渲染时保持状态
289
- key={`form-${item.id}-${ENABLE_ITEM_FORM_EXPAND ? item.isExpanded : 'always'}`}
290
- />
291
- </FormContainer>
292
- )}
293
- </UploadItemContainer>
294
-
295
- );
296
- };
297
-
298
- export default UploadItem;
@@ -1,95 +0,0 @@
1
- import React from 'react';
2
- import Uploader from './index';
3
- import { defaultTheme } from '../../theme/styledTheme';
4
-
5
- /**
6
- * Uploader组件使用示例
7
- * 展示如何配置独立表单数据管理
8
- */
9
- const UploaderExample: React.FC = () => {
10
- // 表单配置示例
11
- const itemForm = [
12
- {
13
- name: 'name',
14
- label: '文件名',
15
- type: 'input',
16
- placeholder: '请输入文件名'
17
- },
18
- {
19
- name: 'description',
20
- label: '文件描述',
21
- type: 'textarea',
22
- placeholder: '请输入文件描述'
23
- },
24
- {
25
- name: 'category',
26
- label: '文件分类',
27
- type: 'select',
28
- options: [
29
- { label: '文档', value: 'document' },
30
- { label: '图片', value: 'image' },
31
- { label: '视频', value: 'video' },
32
- { label: '其他', value: 'other' }
33
- ]
34
- },
35
- {
36
- name: 'tags',
37
- label: '标签',
38
- type: 'input',
39
- placeholder: '请输入标签,用逗号分隔'
40
- }
41
- ];
42
-
43
- // 事件处理
44
- const handleEvents = (eventName: string, data: any) => {
45
- console.log('Uploader Event:', eventName, data);
46
-
47
- switch (eventName) {
48
- case 'uploader:start':
49
- console.log('开始上传:', data.items);
50
- break;
51
- case 'uploader:progress':
52
- console.log('上传进度:', data.item);
53
- break;
54
- case 'uploader:success':
55
- console.log('上传成功:', data.item);
56
- break;
57
- case 'uploader:error':
58
- console.log('上传失败:', data.item, data.error);
59
- break;
60
- case 'uploader:complete':
61
- console.log('上传完成:', data.items);
62
- break;
63
- case 'uploader:formDataChange':
64
- console.log('表单数据变化:', data.itemId, data.formData);
65
- break;
66
- }
67
- };
68
-
69
- return (
70
- <div style={{ padding: '20px', maxWidth: '800px', margin: '0 auto' }}>
71
- <h2>文件上传器示例</h2>
72
- <p>每个上传项都有独立的表单数据管理,上传完成后会自动填充文件名</p>
73
-
74
- <Uploader
75
- multiple={true}
76
- accept="*/*"
77
- maxSize={50} // 50MB
78
- maxFiles={5}
79
- autoUpload={true}
80
- url="http://localhost:3000/api/upload" // 替换为实际的上传接口
81
- headers={{
82
- 'Authorization': 'Bearer your-token-here'
83
- }}
84
- queryParams={{
85
- 'folder': 'uploads'
86
- }}
87
- itemForm={itemForm}
88
- styles={{ theme: defaultTheme }}
89
- eventsEmit={handleEvents}
90
- />
91
- </div>
92
- );
93
- };
94
-
95
- export default UploaderExample;