@zjlab-fe/data-hub-ui 0.32.5 → 0.33.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 (77) hide show
  1. package/COMPONENTS_SKILL.md +1847 -63
  2. package/dist/types/components/FileUploader/UploadStoreProvider/UploadStoreProvider.d.ts +4 -1
  3. package/dist/types/components/SDK-modal/document-link.d.ts +1 -3
  4. package/dist/types/components/SDK-modal/index.d.ts +4 -0
  5. package/dist/types/components/SDK-modal/inner-modal.d.ts +9 -0
  6. package/dist/types/components/SDK-modal/types.d.ts +4 -3
  7. package/dist/types/components/apply-perm-modal/index.d.ts +14 -5
  8. package/dist/types/components/confirm-again/index.d.ts +8 -1
  9. package/dist/types/components/copy/index.d.ts +9 -4
  10. package/dist/types/components/limit-credit-modal/index.d.ts +9 -3
  11. package/dist/types/components/status-tag/index.d.ts +4 -4
  12. package/dist/types/components/tag-group-filter/dataSizeFilter.d.ts +0 -1
  13. package/dist/types/components/tag-group-filter/index.d.ts +4 -1
  14. package/dist/types/index.d.ts +7 -5
  15. package/dist/types/locale/index.d.ts +18 -0
  16. package/dist/types/locale/modalHolder.d.ts +11 -0
  17. package/dist/types/locale/resolveLocale.d.ts +9 -0
  18. package/dist/types/locale/translations.d.ts +808 -0
  19. package/dist/types/locale/types.d.ts +32 -0
  20. package/es/components/FileUploader/Locale/useTranslate.js +34 -11
  21. package/es/components/FileUploader/UploadStoreProvider/UploadStoreProvider.js +5 -3
  22. package/es/components/FileUploader/hooks/useOnMountedResumeUnfinished.js +6 -3
  23. package/es/components/SDK-modal/document-link.js +5 -2
  24. package/es/components/SDK-modal/index.js +29 -2
  25. package/es/components/SDK-modal/inner-modal.js +23 -12
  26. package/es/components/apply-perm-modal/index.js +20 -8
  27. package/es/components/confirm-again/index.js +12 -2
  28. package/es/components/copy/index.js +21 -7
  29. package/es/components/data-table/index.js +15 -4
  30. package/es/components/dataset-batch-action/index.js +48 -25
  31. package/es/components/file-preview/data-table/index.js +4 -3
  32. package/es/components/file-preview/index.js +5 -4
  33. package/es/components/file-uploader/components/uploader-drop-zone.js +4 -2
  34. package/es/components/file-uploader/components/uploader-file-item.js +12 -9
  35. package/es/components/file-uploader/components/uploader-file-list.js +6 -3
  36. package/es/components/file-uploader/components/uploader.js +4 -2
  37. package/es/components/file-uploader/components/uploading-status.js +18 -12
  38. package/es/components/header/index.js +3 -1
  39. package/es/components/input-tag/index.js +5 -2
  40. package/es/components/limit-credit-modal/index.js +38 -19
  41. package/es/components/menu/index.js +5 -2
  42. package/es/components/notion-editor/code-block/languages.js +1 -1
  43. package/es/components/notion-editor/index.js +23 -13
  44. package/es/components/operator-chain/components/AddButton.js +3 -1
  45. package/es/components/operator-chain/components/IOCard.js +4 -1
  46. package/es/components/operator-chain/components/VirtualDropdown.js +6 -3
  47. package/es/components/permission-editor/index.js +1 -0
  48. package/es/components/permission-editor/permissionEditModal/index.js +7 -4
  49. package/es/components/permission-editor/permissionEditor/index.js +40 -75
  50. package/es/components/permission-editor/permissionViewPopover/index.js +5 -2
  51. package/es/components/status-tag/index.js +59 -9
  52. package/es/components/status-tag/index.module.scss.js +24 -8
  53. package/es/components/tag-group-filter/dataSizeFilter.js +6 -3
  54. package/es/components/tag-group-filter/index.js +2 -2
  55. package/es/components/tip-tap/bubble-menu.js +8 -3
  56. package/es/components/tip-tap/editor.js +5 -2
  57. package/es/components/tip-tap/extensions/index.js +1 -1
  58. package/es/components/tip-tap/toolbar/components/color-picker.js +3 -1
  59. package/es/components/tip-tap/toolbar/components/heading-dropdown.js +8 -5
  60. package/es/components/tip-tap/toolbar/components/link-button.js +4 -1
  61. package/es/components/tip-tap/toolbar/components/table-button.js +5 -2
  62. package/es/components/tip-tap/toolbar/index.js +4 -1
  63. package/es/components/uploadDrawer/fileUploadDrawer.js +6 -2
  64. package/es/components/uploadDrawer/fileUploadDrawerList.js +4 -1
  65. package/es/components/uploadDrawer/fileUploadDrawerListProgressButton.js +4 -2
  66. package/es/components/uploadDrawer/hooks/useCancelUpload.js +3 -1
  67. package/es/components/uploadDrawer/hooks/useFilterFiles.js +7 -4
  68. package/es/components/uploadDrawer/hooks/useFormatFiles.js +3 -1
  69. package/es/components/uploadDrawer/hooks/useResumeUnfinishedUploads.js +7 -6
  70. package/es/components/uploadDrawer/index.js +4 -2
  71. package/es/index.js +6 -5
  72. package/es/locale/index.js +64 -0
  73. package/es/locale/modalHolder.js +21 -0
  74. package/es/locale/resolveLocale.js +73 -0
  75. package/es/locale/translations.js +273 -0
  76. package/lib/index.js +1 -1
  77. package/package.json +7 -3
@@ -2,8 +2,11 @@ import { jsxs, jsx } from 'react/jsx-runtime';
2
2
  import { useEditorState } from '@tiptap/react';
3
3
  import { useState, useRef, useEffect } from 'react';
4
4
  import { IconTable } from '../../icons/index.js';
5
+ import { useLocale } from '../../../../locale/index.js';
5
6
 
6
7
  function TableButton({ editor }) {
8
+ const { locale } = useLocale();
9
+ const texts = locale.TipTap;
7
10
  const [isOpen, setIsOpen] = useState(false);
8
11
  const [hoveredCell, setHoveredCell] = useState({ row: 0, col: 0 });
9
12
  const dropdownRef = useRef(null);
@@ -27,11 +30,11 @@ function TableButton({ editor }) {
27
30
  editor.chain().focus().insertTable({ rows, cols, withHeaderRow: true }).run();
28
31
  setIsOpen(false);
29
32
  }
30
- return (jsxs("div", { className: `tip-tap-dropdown ${isOpen ? 'tip-tap-dropdown--open' : ''}`, ref: dropdownRef, children: [jsxs("button", { className: `tip-tap-btn ${(editorState === null || editorState === void 0 ? void 0 : editorState.isActive) ? 'tip-tap-btn--active' : ''}`, onClick: () => setIsOpen(!isOpen), type: "button", children: [jsx(IconTable, {}), jsx("span", { className: "tip-tap-tooltip", children: "\u63D2\u5165\u8868\u683C" })] }), jsx("div", { className: "tip-tap-dropdown__menu", style: { padding: 0 }, children: jsxs("div", { className: "tip-tap-table-menu", children: [jsx("div", { className: "tip-tap-table-menu__label", children: "\u9009\u62E9\u8868\u683C\u5927\u5C0F" }), jsx("div", { className: "tip-tap-table-menu__grid", children: Array.from({ length: 36 }, (_, i) => {
33
+ return (jsxs("div", { className: `tip-tap-dropdown ${isOpen ? 'tip-tap-dropdown--open' : ''}`, ref: dropdownRef, children: [jsxs("button", { className: `tip-tap-btn ${(editorState === null || editorState === void 0 ? void 0 : editorState.isActive) ? 'tip-tap-btn--active' : ''}`, onClick: () => setIsOpen(!isOpen), type: "button", children: [jsx(IconTable, {}), jsx("span", { className: "tip-tap-tooltip", children: texts.insertTable })] }), jsx("div", { className: "tip-tap-dropdown__menu", style: { padding: 0 }, children: jsxs("div", { className: "tip-tap-table-menu", children: [jsx("div", { className: "tip-tap-table-menu__label", children: texts.selectTableSize }), jsx("div", { className: "tip-tap-table-menu__grid", children: Array.from({ length: 36 }, (_, i) => {
31
34
  const row = Math.floor(i / 6) + 1;
32
35
  const col = (i % 6) + 1;
33
36
  return (jsx("button", { className: `tip-tap-table-menu__cell ${row <= hoveredCell.row && col <= hoveredCell.col ? 'tip-tap-table-menu__cell--active' : ''}`, onMouseEnter: () => setHoveredCell({ row, col }), onClick: () => handleInsertTable(row, col), type: "button" }, i));
34
- }) }), jsx("div", { className: "tip-tap-table-menu__size", children: hoveredCell.row > 0 ? `${hoveredCell.row} × ${hoveredCell.col}` : '选择大小' })] }) })] }));
37
+ }) }), jsx("div", { className: "tip-tap-table-menu__size", children: hoveredCell.row > 0 ? `${hoveredCell.row} × ${hoveredCell.col}` : texts.selectSize })] }) })] }));
35
38
  }
36
39
 
37
40
  export { TableButton };
@@ -7,8 +7,11 @@ import { ColorPicker } from './components/color-picker.js';
7
7
  import { LinkButton } from './components/link-button.js';
8
8
  import { ImageButton } from './components/image-button.js';
9
9
  import { TableButton } from './components/table-button.js';
10
+ import { useLocale } from '../../../locale/index.js';
10
11
 
11
12
  function Toolbar({ editor, className = '' }) {
13
+ const { locale } = useLocale();
14
+ const texts = locale.TipTap;
12
15
  // 使用 useEditorState 来同步编辑器状态
13
16
  const editorState = useEditorState({
14
17
  editor,
@@ -33,7 +36,7 @@ function Toolbar({ editor, className = '' }) {
33
36
  canRedo: ctx.editor.can().redo(),
34
37
  }),
35
38
  });
36
- return (jsxs("div", { className: `tip-tap-toolbar ${className}`, children: [jsxs("div", { className: "tip-tap-toolbar__group", children: [jsx(ToolbarButton, { icon: jsx(IconUndo, {}), tooltip: "\u64A4\u9500", onClick: () => editor.chain().focus().undo().run(), disabled: !(editorState === null || editorState === void 0 ? void 0 : editorState.canUndo) }), jsx(ToolbarButton, { icon: jsx(IconRedo, {}), tooltip: "\u91CD\u505A", onClick: () => editor.chain().focus().redo().run(), disabled: !(editorState === null || editorState === void 0 ? void 0 : editorState.canRedo) })] }), jsx("div", { className: "tip-tap-toolbar__divider" }), jsxs("div", { className: "tip-tap-toolbar__group", children: [jsx(ToolbarButton, { icon: jsx(IconBold, {}), tooltip: "\u7C97\u4F53", onClick: () => editor.chain().focus().toggleBold().run(), active: editorState === null || editorState === void 0 ? void 0 : editorState.isBold }), jsx(ToolbarButton, { icon: jsx(IconItalic, {}), tooltip: "\u659C\u4F53", onClick: () => editor.chain().focus().toggleItalic().run(), active: editorState === null || editorState === void 0 ? void 0 : editorState.isItalic }), jsx(ToolbarButton, { icon: jsx(IconUnderline, {}), tooltip: "\u4E0B\u5212\u7EBF", onClick: () => editor.chain().focus().toggleUnderline().run(), active: editorState === null || editorState === void 0 ? void 0 : editorState.isUnderline }), jsx(ToolbarButton, { icon: jsx(IconStrikethrough, {}), tooltip: "\u5220\u9664\u7EBF", onClick: () => editor.chain().focus().toggleStrike().run(), active: editorState === null || editorState === void 0 ? void 0 : editorState.isStrike })] }), jsx("div", { className: "tip-tap-toolbar__divider" }), jsx(HeadingDropdown, { editor: editor }), jsx("div", { className: "tip-tap-toolbar__divider" }), jsxs("div", { className: "tip-tap-toolbar__group", children: [jsx(ColorPicker, { editor: editor, type: "textColor", tooltip: "\u6587\u5B57\u989C\u8272" }), jsx(ColorPicker, { editor: editor, type: "highlight", tooltip: "\u80CC\u666F\u9AD8\u4EAE" })] }), jsx("div", { className: "tip-tap-toolbar__divider" }), jsxs("div", { className: "tip-tap-toolbar__group", children: [jsx(ToolbarButton, { icon: jsx(IconAlignLeft, {}), tooltip: "\u5DE6\u5BF9\u9F50", onClick: () => editor.chain().focus().setTextAlign('left').run(), active: editorState === null || editorState === void 0 ? void 0 : editorState.isAlignLeft }), jsx(ToolbarButton, { icon: jsx(IconAlignCenter, {}), tooltip: "\u5C45\u4E2D\u5BF9\u9F50", onClick: () => editor.chain().focus().setTextAlign('center').run(), active: editorState === null || editorState === void 0 ? void 0 : editorState.isAlignCenter }), jsx(ToolbarButton, { icon: jsx(IconAlignRight, {}), tooltip: "\u53F3\u5BF9\u9F50", onClick: () => editor.chain().focus().setTextAlign('right').run(), active: editorState === null || editorState === void 0 ? void 0 : editorState.isAlignRight })] }), jsx("div", { className: "tip-tap-toolbar__divider" }), jsxs("div", { className: "tip-tap-toolbar__group", children: [jsx(ToolbarButton, { icon: jsx(IconListBullet, {}), tooltip: "\u65E0\u5E8F\u5217\u8868", onClick: () => editor.chain().focus().toggleBulletList().run(), active: editorState === null || editorState === void 0 ? void 0 : editorState.isBulletList }), jsx(ToolbarButton, { icon: jsx(IconListNumbered, {}), tooltip: "\u6709\u5E8F\u5217\u8868", onClick: () => editor.chain().focus().toggleOrderedList().run(), active: editorState === null || editorState === void 0 ? void 0 : editorState.isOrderedList })] }), jsx("div", { className: "tip-tap-toolbar__divider" }), jsxs("div", { className: "tip-tap-toolbar__group", children: [jsx(ToolbarButton, { icon: jsx(IconQuote, {}), tooltip: "\u5F15\u7528", onClick: () => editor.chain().focus().toggleBlockquote().run(), active: editorState === null || editorState === void 0 ? void 0 : editorState.isBlockquote }), jsx(ToolbarButton, { icon: jsx(IconCode, {}), tooltip: "\u4EE3\u7801\u5757", onClick: () => editor.chain().focus().toggleCodeBlock().run(), active: editorState === null || editorState === void 0 ? void 0 : editorState.isCodeBlock }), jsx(ToolbarButton, { icon: jsx(IconMinus, {}), tooltip: "\u5206\u5272\u7EBF", onClick: () => editor.chain().focus().setHorizontalRule().run() })] }), jsx("div", { className: "tip-tap-toolbar__divider" }), jsxs("div", { className: "tip-tap-toolbar__group", children: [jsx(LinkButton, { editor: editor }), jsx(ImageButton, { editor: editor }), jsx(TableButton, { editor: editor })] })] }));
39
+ return (jsxs("div", { className: `tip-tap-toolbar ${className}`, children: [jsxs("div", { className: "tip-tap-toolbar__group", children: [jsx(ToolbarButton, { icon: jsx(IconUndo, {}), tooltip: texts.undo, onClick: () => editor.chain().focus().undo().run(), disabled: !(editorState === null || editorState === void 0 ? void 0 : editorState.canUndo) }), jsx(ToolbarButton, { icon: jsx(IconRedo, {}), tooltip: texts.redo, onClick: () => editor.chain().focus().redo().run(), disabled: !(editorState === null || editorState === void 0 ? void 0 : editorState.canRedo) })] }), jsx("div", { className: "tip-tap-toolbar__divider" }), jsxs("div", { className: "tip-tap-toolbar__group", children: [jsx(ToolbarButton, { icon: jsx(IconBold, {}), tooltip: texts.bold, onClick: () => editor.chain().focus().toggleBold().run(), active: editorState === null || editorState === void 0 ? void 0 : editorState.isBold }), jsx(ToolbarButton, { icon: jsx(IconItalic, {}), tooltip: texts.italic, onClick: () => editor.chain().focus().toggleItalic().run(), active: editorState === null || editorState === void 0 ? void 0 : editorState.isItalic }), jsx(ToolbarButton, { icon: jsx(IconUnderline, {}), tooltip: texts.underline, onClick: () => editor.chain().focus().toggleUnderline().run(), active: editorState === null || editorState === void 0 ? void 0 : editorState.isUnderline }), jsx(ToolbarButton, { icon: jsx(IconStrikethrough, {}), tooltip: texts.strike, onClick: () => editor.chain().focus().toggleStrike().run(), active: editorState === null || editorState === void 0 ? void 0 : editorState.isStrike })] }), jsx("div", { className: "tip-tap-toolbar__divider" }), jsx(HeadingDropdown, { editor: editor }), jsx("div", { className: "tip-tap-toolbar__divider" }), jsxs("div", { className: "tip-tap-toolbar__group", children: [jsx(ColorPicker, { editor: editor, type: "textColor", tooltip: texts.textColor }), jsx(ColorPicker, { editor: editor, type: "highlight", tooltip: texts.highlight })] }), jsx("div", { className: "tip-tap-toolbar__divider" }), jsxs("div", { className: "tip-tap-toolbar__group", children: [jsx(ToolbarButton, { icon: jsx(IconAlignLeft, {}), tooltip: texts.alignLeft, onClick: () => editor.chain().focus().setTextAlign('left').run(), active: editorState === null || editorState === void 0 ? void 0 : editorState.isAlignLeft }), jsx(ToolbarButton, { icon: jsx(IconAlignCenter, {}), tooltip: texts.alignCenter, onClick: () => editor.chain().focus().setTextAlign('center').run(), active: editorState === null || editorState === void 0 ? void 0 : editorState.isAlignCenter }), jsx(ToolbarButton, { icon: jsx(IconAlignRight, {}), tooltip: texts.alignRight, onClick: () => editor.chain().focus().setTextAlign('right').run(), active: editorState === null || editorState === void 0 ? void 0 : editorState.isAlignRight })] }), jsx("div", { className: "tip-tap-toolbar__divider" }), jsxs("div", { className: "tip-tap-toolbar__group", children: [jsx(ToolbarButton, { icon: jsx(IconListBullet, {}), tooltip: texts.bulletList, onClick: () => editor.chain().focus().toggleBulletList().run(), active: editorState === null || editorState === void 0 ? void 0 : editorState.isBulletList }), jsx(ToolbarButton, { icon: jsx(IconListNumbered, {}), tooltip: texts.orderedList, onClick: () => editor.chain().focus().toggleOrderedList().run(), active: editorState === null || editorState === void 0 ? void 0 : editorState.isOrderedList })] }), jsx("div", { className: "tip-tap-toolbar__divider" }), jsxs("div", { className: "tip-tap-toolbar__group", children: [jsx(ToolbarButton, { icon: jsx(IconQuote, {}), tooltip: texts.quote, onClick: () => editor.chain().focus().toggleBlockquote().run(), active: editorState === null || editorState === void 0 ? void 0 : editorState.isBlockquote }), jsx(ToolbarButton, { icon: jsx(IconCode, {}), tooltip: texts.codeBlock, onClick: () => editor.chain().focus().toggleCodeBlock().run(), active: editorState === null || editorState === void 0 ? void 0 : editorState.isCodeBlock }), jsx(ToolbarButton, { icon: jsx(IconMinus, {}), tooltip: texts.divider, onClick: () => editor.chain().focus().setHorizontalRule().run() })] }), jsx("div", { className: "tip-tap-toolbar__divider" }), jsxs("div", { className: "tip-tap-toolbar__group", children: [jsx(LinkButton, { editor: editor }), jsx(ImageButton, { editor: editor }), jsx(TableButton, { editor: editor })] })] }));
37
40
  }
38
41
 
39
42
  export { Toolbar as default };
@@ -11,9 +11,13 @@ import { useFormatFiles } from './hooks/useFormatFiles.js';
11
11
  import { useUploadFileToOSS } from './hooks/useUploadFileToOSS.js';
12
12
  import { useResumeUnfinishedUploads } from './hooks/useResumeUnfinishedUploads.js';
13
13
  import { FileUploadDrawerContext } from './index.js';
14
+ import { useLocale } from '../../locale/index.js';
14
15
 
15
- function FileUploadDrawer({ open, identifier, accept, dragAreaDescription, footer, title = '数据上传', showFinished = false, directory = false, onClose, }) {
16
+ function FileUploadDrawer({ open, identifier, accept, dragAreaDescription, footer, title, showFinished = false, directory = false, onClose, }) {
16
17
  var _a, _b;
18
+ const { locale, t } = useLocale();
19
+ const texts = locale.UploadDrawer;
20
+ const resolvedTitle = title !== null && title !== void 0 ? title : texts.title;
17
21
  const uploadStore = useContext(UploadStoreContext);
18
22
  const setUploadsStore = useContext(UploadStoreDispatchContext);
19
23
  const { onSuccess } = useContext(FileUploadDrawerContext);
@@ -47,7 +51,7 @@ function FileUploadDrawer({ open, identifier, accept, dragAreaDescription, foote
47
51
  uploadFileToOSS(fileToUpload, onSuccess);
48
52
  }
49
53
  }, [identifier, onSuccess, uploadFileToOSS, uploadStore]);
50
- return (jsxs(Drawer, { className: "mylib-upload-drawer", open: open, title: title, width: 480, onClose: onClose, footer: footer, children: [jsx(FileUploadDrawerFileDragger, { directory: directory, accept: accept, dragAreaDescription: dragAreaDescription, onFileReceived: onFileReceived }), raws.length === 0 && ((_a = uploadStore[identifier]) === null || _a === void 0 ? void 0 : _a.length) === 0 && (jsx(Empty, { className: "mt-20", description: "\u6682\u65E0\u4E0A\u4F20\u5185\u5BB9" })), raws.length > 0 && (jsxs("div", { className: "flex justify-center gap-4 mt-4", children: [jsx(LoadingOutlined, {}), "\u9884\u68C0\u4E0A\u4F20\u6587\u4EF6\u4E2D(", raws.length, ")"] })), ((_b = uploadStore[identifier]) === null || _b === void 0 ? void 0 : _b.length) > 0 && (jsx(FileUploading, { showFinished: showFinished, identifier: identifier }))] }));
54
+ return (jsxs(Drawer, { className: "mylib-upload-drawer", open: open, title: resolvedTitle, width: 480, onClose: onClose, footer: footer, children: [jsx(FileUploadDrawerFileDragger, { directory: directory, accept: accept, dragAreaDescription: dragAreaDescription, onFileReceived: onFileReceived }), raws.length === 0 && ((_a = uploadStore[identifier]) === null || _a === void 0 ? void 0 : _a.length) === 0 && (jsx(Empty, { className: "mt-20", description: texts.empty })), raws.length > 0 && (jsxs("div", { className: "flex justify-center gap-4 mt-4", children: [jsx(LoadingOutlined, {}), t(texts.prechecking, { count: raws.length })] })), ((_b = uploadStore[identifier]) === null || _b === void 0 ? void 0 : _b.length) > 0 && (jsx(FileUploading, { showFinished: showFinished, identifier: identifier }))] }));
51
55
  function onFileReceived(files) {
52
56
  return __awaiter(this, void 0, void 0, function* () {
53
57
  setRaws((prev) => [...prev, ...files]);
@@ -8,6 +8,7 @@ import FileUploadDrawerListProgressButton from './fileUploadDrawerListProgressBu
8
8
  import { Flex, Button } from 'antd';
9
9
  import { useRetryUpload } from './hooks/useRetryUpload.js';
10
10
  import { useCancelUpload } from './hooks/useCancelUpload.js';
11
+ import { useLocale } from '../../locale/index.js';
11
12
 
12
13
  function FileUploading({ identifier, showFinished, }) {
13
14
  const uploadContext = useContext(UploadStoreContext);
@@ -38,9 +39,11 @@ function FileUploading({ identifier, showFinished, }) {
38
39
  }
39
40
  }
40
41
  function FileListItem({ identifier, file, showFinished, onButtonClick }) {
42
+ const { locale } = useLocale();
43
+ const texts = locale.UploadDrawer;
41
44
  const setUploadsStore = useContext(UploadStoreDispatchContext);
42
45
  const showDelete = typeof showFinished === 'object' && showFinished.withDelete;
43
- return (jsx("div", { className: "mb-2 last:mb-0", children: jsxs("div", { className: "px-4 my-2 relative flex justify-between items-center", children: [jsxs(Flex, { align: "center", gap: ".5rem", title: file.fileName, children: [jsx(FileTextOutlined, {}), jsx("span", { className: "truncate w-40", children: file.fileName })] }), jsxs(Flex, { align: "center", gap: ".5rem", children: [jsx(FileUploadDrawerListProgressButton, { status: file.fileStatus, percent: Number(file.percentage.toFixed(0)), onClick: () => onButtonClick(file) }), file.fileStatus === FILE_UPLOAD_STATUS.FINISHED && showDelete && (jsx(Button, { type: "text", size: "large", className: "px-3", disabled: showDelete.disabled, title: `${showDelete.disabled ? '删除-已禁用' : '删除'}`, onClick: () => onDelete(file, showDelete.onDelete), children: jsx(DeleteOutlined, {}) }))] })] }) }));
46
+ return (jsx("div", { className: "mb-2 last:mb-0", children: jsxs("div", { className: "px-4 my-2 relative flex justify-between items-center", children: [jsxs(Flex, { align: "center", gap: ".5rem", title: file.fileName, children: [jsx(FileTextOutlined, {}), jsx("span", { className: "truncate w-40", children: file.fileName })] }), jsxs(Flex, { align: "center", gap: ".5rem", children: [jsx(FileUploadDrawerListProgressButton, { status: file.fileStatus, percent: Number(file.percentage.toFixed(0)), onClick: () => onButtonClick(file) }), file.fileStatus === FILE_UPLOAD_STATUS.FINISHED && showDelete && (jsx(Button, { type: "text", size: "large", className: "px-3", disabled: showDelete.disabled, title: showDelete.disabled ? texts.removeDisabled : texts.remove, onClick: () => onDelete(file, showDelete.onDelete), children: jsx(DeleteOutlined, {}) }))] })] }) }));
44
47
  function onDelete(file, onDeleteImpl) {
45
48
  return __awaiter(this, void 0, void 0, function* () {
46
49
  const result = yield onDeleteImpl(file.fileName);
@@ -5,6 +5,7 @@ import { useState } from 'react';
5
5
  import { FILE_UPLOAD_STATUS } from './utils/constant.js';
6
6
  import 'tslib';
7
7
  import { useProgressButtonRef } from './hooks/useProgressButtonRef.js';
8
+ import { useLocale } from '../../locale/index.js';
8
9
 
9
10
  // 进度条样式属性
10
11
  const progressStyleProps = {
@@ -14,7 +15,8 @@ const progressStyleProps = {
14
15
  strokeLinecap: 'butt',
15
16
  };
16
17
  function FileUploadDrawerListProgressButton({ percent, status, onClick, }) {
17
- // 使用自定义 hook 获取按钮引用和悬停状态
18
+ const { locale } = useLocale();
19
+ const texts = locale.UploadDrawer;
18
20
  const { progressButtonRef, buttonInHover } = useProgressButtonRef();
19
21
  // 状态用于跟踪是否正在取消上传
20
22
  const [isCanceling, setIsCanceling] = useState(false);
@@ -31,7 +33,7 @@ function FileUploadDrawerListProgressButton({ percent, status, onClick, }) {
31
33
  } })) }));
32
34
  }
33
35
  // 默认情况下显示进度按钮
34
- return (jsx(Button, { type: "text", shape: "circle", disabled: isCanceling, ref: progressButtonRef, title: status === FILE_UPLOAD_STATUS.PAUSED ? '继续下载' : '取消下载', onClick: () => {
36
+ return (jsx(Button, { type: "text", shape: "circle", disabled: isCanceling, ref: progressButtonRef, title: status === FILE_UPLOAD_STATUS.PAUSED ? texts.continue : texts.cancelDownload, onClick: () => {
35
37
  onClick();
36
38
  if (status === FILE_UPLOAD_STATUS.UPLOADING) {
37
39
  setIsCanceling(true);
@@ -5,9 +5,11 @@ import { useContext } from 'react';
5
5
  import { UploadStoreDispatchContext } from '../UploadStoreProvider.js';
6
6
  import { App } from 'antd';
7
7
  import { FileUploadDrawerContext } from '../index.js';
8
+ import { useLocale } from '../../../locale/index.js';
8
9
 
9
10
  function useCancelUpload() {
10
11
  const { message } = App.useApp();
12
+ const { locale } = useLocale();
11
13
  const { identifier, onCancelUpload } = useContext(FileUploadDrawerContext);
12
14
  const uploadsDispatch = useContext(UploadStoreDispatchContext);
13
15
  return function cancelUpload(file) {
@@ -22,7 +24,7 @@ function useCancelUpload() {
22
24
  deleteFile(file);
23
25
  }
24
26
  else {
25
- message.error(result.reason || '取消失败');
27
+ message.error(result.reason || locale.UploadDrawer.cancelFailed);
26
28
  }
27
29
  });
28
30
  };
@@ -5,6 +5,7 @@ import { GB } from '../utils/constant.js';
5
5
  import { calcDisplaySize } from '../utils/calcDisplaySize.js';
6
6
  import { UploadStoreContext } from '../UploadStoreProvider.js';
7
7
  import { FileUploadDrawerContext } from '../index.js';
8
+ import { useLocale } from '../../../locale/index.js';
8
9
 
9
10
  /**
10
11
  * useFilterFiles hook用于过滤上传文件
@@ -14,6 +15,8 @@ import { FileUploadDrawerContext } from '../index.js';
14
15
  */
15
16
  function useFilterFiles() {
16
17
  const { message, modal } = App.useApp();
18
+ const { locale, t } = useLocale();
19
+ const texts = locale.UploadDrawer;
17
20
  const uploadStore = useContext(UploadStoreContext);
18
21
  const { identifier, maxSizePerFile = 10 * GB, uploadHistory = [], root, } = useContext(FileUploadDrawerContext);
19
22
  return function filterFiles(files) {
@@ -38,7 +41,7 @@ function useFilterFiles() {
38
41
  const oversizedFiles = files.filter((file) => file.size > maxSizePerFile).map((file) => file.name);
39
42
  if (oversizedFiles.length) {
40
43
  const maxSizeDisplay = calcDisplaySize(maxSizePerFile);
41
- message.warning(`以下文件大小超过${maxSizeDisplay}:${oversizedFiles.join(', ')}`);
44
+ message.warning(t(texts.sizeExceeded, { maxSize: maxSizeDisplay, files: oversizedFiles.join(', ') }));
42
45
  }
43
46
  return oversizedFiles;
44
47
  }
@@ -55,9 +58,9 @@ function useFilterFiles() {
55
58
  // duplicateFiles 现在包含了所有重复的文件或文件夹的名称
56
59
  if (duplicateFiles.length) {
57
60
  const userChoice = yield modal.confirm({
58
- title: '发现同名文件,是否覆盖?',
59
- okText: '覆盖',
60
- cancelText: '取消',
61
+ title: texts.duplicateTitle,
62
+ okText: texts.overwrite,
63
+ cancelText: texts.cancel,
61
64
  });
62
65
  return [userChoice, duplicateFiles];
63
66
  }
@@ -8,9 +8,11 @@ import { useFilterFiles } from './useFilterFiles.js';
8
8
  import { useRemoveFilesInUploadQueue } from './useRemoveFilesInUploadQueue.js';
9
9
  import { UploadStoreDispatchContext } from '../UploadStoreProvider.js';
10
10
  import { FileUploadDrawerContext } from '../index.js';
11
+ import { useLocale } from '../../../locale/index.js';
11
12
 
12
13
  function useFormatFiles() {
13
14
  const { message } = App.useApp();
15
+ const { locale } = useLocale();
14
16
  const { identifier, root, getUploadUrls } = useContext(FileUploadDrawerContext);
15
17
  const uploadsDispatch = useContext(UploadStoreDispatchContext);
16
18
  const filterFiles = useFilterFiles();
@@ -22,7 +24,7 @@ function useFormatFiles() {
22
24
  updateUploadQueue(uploadableFiles);
23
25
  handleAddFilesToDB(identifier, uploadableFiles);
24
26
  if (uploadableFiles.length < filesToUpload.length) {
25
- message.info('部分文件获取上传地址失败');
27
+ message.info(locale.UploadDrawer.getUrlFailed);
26
28
  }
27
29
  });
28
30
  };
@@ -5,9 +5,12 @@ import { UploadStoreDispatchContext } from '../UploadStoreProvider.js';
5
5
  import { FILE_UPLOAD_STATUS } from '../utils/constant.js';
6
6
  import { openDB } from '../utils/fileDB/openDB.js';
7
7
  import { useRetryUpload } from './useRetryUpload.js';
8
+ import { useLocale } from '../../../locale/index.js';
8
9
 
9
10
  function useResumeUnfinishedUploads(identifier) {
10
11
  const { message, modal } = App.useApp();
12
+ const { locale } = useLocale();
13
+ const texts = locale.UploadDrawer;
11
14
  const setUploadStore = useContext(UploadStoreDispatchContext);
12
15
  const retryUpload = useRetryUpload();
13
16
  return useCallback(() => __awaiter(this, void 0, void 0, function* () {
@@ -18,19 +21,17 @@ function useResumeUnfinishedUploads(identifier) {
18
21
  if (unfinishedFiles.length) {
19
22
  // 如果有未完成的文件,显示确认对话框
20
23
  modal.confirm({
21
- title: '提示',
22
- content: '检测到未完成上传任务,是否继续上传?',
24
+ title: texts.notice,
25
+ content: texts.unfinishedContent,
23
26
  onOk() {
24
- // 用户确认继续上传,重试每个未完成的文件
25
27
  unfinishedFiles.forEach(retryUpload);
26
28
  },
27
29
  onCancel() {
28
- // 用户取消,显示提示信息
29
- message.info('点击上传按钮手动继续');
30
+ message.info(texts.resumeManually);
30
31
  },
31
32
  });
32
33
  }
33
- }), [identifier, setUploadStore, retryUpload, modal, message]);
34
+ }), [identifier, setUploadStore, retryUpload, modal, message, texts]);
34
35
  function reloadSaveData(identifier) {
35
36
  return __awaiter(this, void 0, void 0, function* () {
36
37
  // 从数据库获取文件信息
@@ -7,6 +7,7 @@ import { createContext, useContext } from 'react';
7
7
  import { GB } from './utils/constant.js';
8
8
  import useStyle from './index.css.js';
9
9
  import { Drawer, Alert } from 'antd';
10
+ import { useLocale } from '../../locale/index.js';
10
11
 
11
12
  useStyle();
12
13
  const FileUploadDrawerContext = createContext({
@@ -20,10 +21,11 @@ const FileUploadDrawerContext = createContext({
20
21
  * @deprecated This component is deprecated and will be removed in future releases.
21
22
  */
22
23
  function FileUploadDrawer(props) {
23
- // 检测是否在 UploadStoreProvider 内使用
24
24
  const uploadStore = useContext(UploadStoreContext);
25
+ const { locale } = useLocale();
26
+ const texts = locale.UploadDrawer;
25
27
  if (uploadStore === TEMP_STORE) {
26
- return (jsx(Drawer, { open: props.open, onClose: props.onClose, title: "\u6570\u636E\u4E0A\u4F20", children: jsx(Alert, { message: "FileUploadDrawer \u5FC5\u987B\u5728 UploadStoreProvider \u5185\u4F7F\u7528", type: "warning" }) }));
28
+ return (jsx(Drawer, { open: props.open, onClose: props.onClose, title: texts.title, children: jsx(Alert, { message: texts.mustUseProvider, type: "warning" }) }));
27
29
  }
28
30
  const { identifier, maxSizePerFile = 10 * GB, directory = false, root = '', uploadHistory = [], onSuccess, getUploadUrls, onCancelUpload, onOnePartDone, onAllPartDone, onClose, dragAreaDescription, accept, open, footer, title, showFinished, } = props;
29
31
  const contextValue = {
package/es/index.js CHANGED
@@ -13,8 +13,8 @@ export { UploaderProgressBar } from './components/file-uploader/components/uploa
13
13
  export { useUpload } from './components/file-uploader/hooks/use-upload.js';
14
14
  export { UploadStatus } from './components/file-uploader/constants.js';
15
15
  export { default as FilePreview } from './components/file-preview/index.js';
16
- export { default as Copy, copy } from './components/copy/index.js';
17
- export { default as ConfirmAgain } from './components/confirm-again/index.js';
16
+ export { default as Copy, copy, useCopy } from './components/copy/index.js';
17
+ export { default as ConfirmAgain, useConfirmAgain } from './components/confirm-again/index.js';
18
18
  export { default as FloatingLayer } from './components/floating-layer/index.js';
19
19
  export { default as BenchCard } from './components/bench-card/index.js';
20
20
  export { default as AuthTag } from './components/auth-tag/index.js';
@@ -28,16 +28,17 @@ export { default as TipTapReader } from './components/tip-tap/reader.js';
28
28
  export { default as PermissionEditModal } from './components/permission-editor/permissionEditModal/index.js';
29
29
  export { default as PermissionViewPopover } from './components/permission-editor/permissionViewPopover/index.js';
30
30
  export { default as PermissionEditor } from './components/permission-editor/permissionEditor/index.js';
31
- export { default as ApplyPermModal } from './components/apply-perm-modal/index.js';
31
+ export { default as ApplyPermModal, useApplyPermModal } from './components/apply-perm-modal/index.js';
32
32
  export { default as Menu } from './components/menu/index.js';
33
33
  export { default as RadioCard } from './components/radio-card/index.js';
34
34
  export { default as OperatorChain } from './components/operator-chain/index.js';
35
35
  export { default as CorpusCard } from './components/corpus-card/index.js';
36
36
  export { default as ModelCard } from './components/model-card/index.js';
37
37
  export { default as DataTable } from './components/data-table/index.js';
38
- export { default as SDKModal } from './components/SDK-modal/index.js';
38
+ export { default as SDKModal, useSDKModal } from './components/SDK-modal/index.js';
39
39
  export { default as TagView } from './components/tag-view/index.js';
40
40
  export { default as TagGroupFilter } from './components/tag-group-filter/index.js';
41
- export { default as LimitCreditModal } from './components/limit-credit-modal/index.js';
41
+ export { default as LimitCreditModal, useLimitCreditModal } from './components/limit-credit-modal/index.js';
42
42
  export { default as DatasetBatchAction, EDatasetBatchType } from './components/dataset-batch-action/index.js';
43
+ export { DataHubProvider } from './locale/index.js';
43
44
  export { default as UploadDrawerUploadStoreProvider } from './components/uploadDrawer/UploadStoreProvider.js';
@@ -0,0 +1,64 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import { createContext, useContext, useMemo } from 'react';
3
+ import { ConfigProvider, theme } from 'antd';
4
+ import antdEnUS from 'antd/locale/en_US';
5
+ import antdZhCN from 'antd/locale/zh_CN';
6
+ import { resolveLocaleData, interpolate, resolveIntlInput } from './resolveLocale.js';
7
+ import { DataHubModalProvider } from './modalHolder.js';
8
+
9
+ const LocaleContext = createContext({});
10
+ let warnedMissingMode = false;
11
+ let warnedLocaleMismatch = false;
12
+ function warnProviderConfiguration(message) {
13
+ if (process.env.NODE_ENV !== 'production') {
14
+ console.warn(`[DataHubProvider] ${message}`);
15
+ }
16
+ }
17
+ function resolveInternalTheme(dataHubTheme, antdMode) {
18
+ if (!dataHubTheme && antdMode === 'inherit')
19
+ return undefined;
20
+ const algorithm = (dataHubTheme === null || dataHubTheme === void 0 ? void 0 : dataHubTheme.darkMode) === undefined
21
+ ? undefined
22
+ : dataHubTheme.darkMode
23
+ ? theme.darkAlgorithm
24
+ : theme.defaultAlgorithm;
25
+ return Object.assign(Object.assign({}, (antdMode === 'isolated' ? { inherit: false } : {})), { token: dataHubTheme === null || dataHubTheme === void 0 ? void 0 : dataHubTheme.token, algorithm });
26
+ }
27
+ function DataHubProvider(props) {
28
+ var _a, _b;
29
+ const { intl, theme: dataHubTheme, children } = props;
30
+ const antdMode = (_a = props.antdMode) !== null && _a !== void 0 ? _a : 'inherit';
31
+ const parent = useContext(LocaleContext);
32
+ const outerAntdConfig = useContext(ConfigProvider.ConfigContext);
33
+ const mergedIntl = (_b = resolveIntlInput(intl)) !== null && _b !== void 0 ? _b : parent.intl;
34
+ const locale = useMemo(() => mergedIntl !== null && mergedIntl !== void 0 ? mergedIntl : (antdMode === 'inherit' ? resolveLocaleData(outerAntdConfig.locale) : resolveLocaleData()), [mergedIntl, antdMode, outerAntdConfig.locale]);
35
+ const internalAntdLocale = antdMode === 'isolated' ? (locale.locale === 'en' ? antdEnUS : antdZhCN) : undefined;
36
+ const internalTheme = useMemo(() => resolveInternalTheme(dataHubTheme, antdMode), [dataHubTheme, antdMode]);
37
+ if (process.env.NODE_ENV !== 'production') {
38
+ if (props.antdMode === undefined && !warnedMissingMode) {
39
+ warnedMissingMode = true;
40
+ warnProviderConfiguration('antdMode was not specified and defaults to "inherit". If the host uses another antd instance, such as antd 6, set antdMode="isolated" explicitly.');
41
+ }
42
+ if (antdMode === 'inherit' &&
43
+ locale.locale === 'zh' &&
44
+ !outerAntdConfig.locale &&
45
+ !warnedLocaleMismatch) {
46
+ warnedLocaleMismatch = true;
47
+ warnProviderConfiguration('data-hub-ui resolved locale to "zh", but the inherited antd context has no locale and internal antd components will fall back to English. If the host uses antd 6 or another antd instance, set antdMode="isolated".');
48
+ }
49
+ }
50
+ const value = useMemo(() => ({ intl: mergedIntl }), [mergedIntl]);
51
+ return (jsx(ConfigProvider, { locale: internalAntdLocale, theme: internalTheme, children: jsx(LocaleContext.Provider, { value: value, children: jsx(DataHubModalProvider, { children: children }) }) }));
52
+ }
53
+ function useLocale() {
54
+ const { intl } = useContext(LocaleContext);
55
+ const { locale: antdLocale } = useContext(ConfigProvider.ConfigContext);
56
+ const locale = useMemo(() => {
57
+ if (intl)
58
+ return intl;
59
+ return resolveLocaleData(antdLocale);
60
+ }, [intl, antdLocale]);
61
+ return { locale, t: interpolate };
62
+ }
63
+
64
+ export { DataHubProvider, useLocale };
@@ -0,0 +1,21 @@
1
+ import { jsxs } from 'react/jsx-runtime';
2
+ import { createContext, useMemo, useContext } from 'react';
3
+ import { Modal } from 'antd';
4
+
5
+ const DataHubModalContext = createContext(null);
6
+ function DataHubModalProvider(props) {
7
+ const [modal, contextHolder] = Modal.useModal();
8
+ const api = useMemo(() => ({
9
+ confirm: (config) => modal.confirm(config),
10
+ }), [modal]);
11
+ return (jsxs(DataHubModalContext.Provider, { value: api, children: [contextHolder, props.children] }));
12
+ }
13
+ function useDataHubModal() {
14
+ const modal = useContext(DataHubModalContext);
15
+ if (!modal) {
16
+ throw new Error('[data-hub-ui] Imperative modal hooks must be used within DataHubProvider.');
17
+ }
18
+ return modal;
19
+ }
20
+
21
+ export { DataHubModalProvider, useDataHubModal };
@@ -0,0 +1,73 @@
1
+ import { translations } from './translations.js';
2
+
3
+ function isMessageLeaf(value) {
4
+ if (!value || typeof value !== 'object')
5
+ return false;
6
+ const record = value;
7
+ return typeof record.zh === 'string' && typeof record.en === 'string';
8
+ }
9
+ function pickLang(source, lang) {
10
+ if (isMessageLeaf(source)) {
11
+ return source[lang];
12
+ }
13
+ if (source && typeof source === 'object') {
14
+ const result = {};
15
+ Object.keys(source).forEach((key) => {
16
+ result[key] = pickLang(source[key], lang);
17
+ });
18
+ return result;
19
+ }
20
+ return source;
21
+ }
22
+ function createLocaleData(lang) {
23
+ return Object.assign({ locale: lang }, pickLang(translations, lang));
24
+ }
25
+ const zhCN = createLocaleData('zh');
26
+ const enUS = createLocaleData('en');
27
+ const localeMap = {
28
+ zh: zhCN,
29
+ en: enUS,
30
+ };
31
+ function mapToLang(input) {
32
+ const value = (input || '').toLowerCase().replace(/_/g, '-');
33
+ if (value.startsWith('en'))
34
+ return 'en';
35
+ return 'zh';
36
+ }
37
+ function extractAntdLocaleName(antdLocale) {
38
+ if (!antdLocale)
39
+ return undefined;
40
+ if (typeof antdLocale === 'string')
41
+ return antdLocale;
42
+ if (typeof antdLocale === 'object') {
43
+ const record = antdLocale;
44
+ if (typeof record.locale === 'string')
45
+ return record.locale;
46
+ if (record.default !== undefined && record.default !== antdLocale) {
47
+ return extractAntdLocaleName(record.default);
48
+ }
49
+ }
50
+ return undefined;
51
+ }
52
+ function resolveIntlInput(intl) {
53
+ if (intl == null)
54
+ return undefined;
55
+ return localeMap[mapToLang(intl)];
56
+ }
57
+ function resolveLocaleData(antdLocale) {
58
+ const antdLocaleName = extractAntdLocaleName(antdLocale);
59
+ if (antdLocaleName) {
60
+ return localeMap[mapToLang(antdLocaleName)];
61
+ }
62
+ return zhCN;
63
+ }
64
+ function interpolate(template, params) {
65
+ if (!params)
66
+ return template;
67
+ return template.replace(/\{(\w+)\}/g, (_, key) => {
68
+ const val = params[key];
69
+ return val !== undefined ? String(val) : `{${key}}`;
70
+ });
71
+ }
72
+
73
+ export { createLocaleData, enUS, extractAntdLocaleName, interpolate, mapToLang, resolveIntlInput, resolveLocaleData, zhCN };