@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.
- package/COMPONENTS_SKILL.md +1847 -63
- package/dist/types/components/FileUploader/UploadStoreProvider/UploadStoreProvider.d.ts +4 -1
- package/dist/types/components/SDK-modal/document-link.d.ts +1 -3
- package/dist/types/components/SDK-modal/index.d.ts +4 -0
- package/dist/types/components/SDK-modal/inner-modal.d.ts +9 -0
- package/dist/types/components/SDK-modal/types.d.ts +4 -3
- package/dist/types/components/apply-perm-modal/index.d.ts +14 -5
- package/dist/types/components/confirm-again/index.d.ts +8 -1
- package/dist/types/components/copy/index.d.ts +9 -4
- package/dist/types/components/limit-credit-modal/index.d.ts +9 -3
- package/dist/types/components/status-tag/index.d.ts +4 -4
- package/dist/types/components/tag-group-filter/dataSizeFilter.d.ts +0 -1
- package/dist/types/components/tag-group-filter/index.d.ts +4 -1
- package/dist/types/index.d.ts +7 -5
- package/dist/types/locale/index.d.ts +18 -0
- package/dist/types/locale/modalHolder.d.ts +11 -0
- package/dist/types/locale/resolveLocale.d.ts +9 -0
- package/dist/types/locale/translations.d.ts +808 -0
- package/dist/types/locale/types.d.ts +32 -0
- package/es/components/FileUploader/Locale/useTranslate.js +34 -11
- package/es/components/FileUploader/UploadStoreProvider/UploadStoreProvider.js +5 -3
- package/es/components/FileUploader/hooks/useOnMountedResumeUnfinished.js +6 -3
- package/es/components/SDK-modal/document-link.js +5 -2
- package/es/components/SDK-modal/index.js +29 -2
- package/es/components/SDK-modal/inner-modal.js +23 -12
- package/es/components/apply-perm-modal/index.js +20 -8
- package/es/components/confirm-again/index.js +12 -2
- package/es/components/copy/index.js +21 -7
- package/es/components/data-table/index.js +15 -4
- package/es/components/dataset-batch-action/index.js +48 -25
- package/es/components/file-preview/data-table/index.js +4 -3
- package/es/components/file-preview/index.js +5 -4
- package/es/components/file-uploader/components/uploader-drop-zone.js +4 -2
- package/es/components/file-uploader/components/uploader-file-item.js +12 -9
- package/es/components/file-uploader/components/uploader-file-list.js +6 -3
- package/es/components/file-uploader/components/uploader.js +4 -2
- package/es/components/file-uploader/components/uploading-status.js +18 -12
- package/es/components/header/index.js +3 -1
- package/es/components/input-tag/index.js +5 -2
- package/es/components/limit-credit-modal/index.js +38 -19
- package/es/components/menu/index.js +5 -2
- package/es/components/notion-editor/code-block/languages.js +1 -1
- package/es/components/notion-editor/index.js +23 -13
- package/es/components/operator-chain/components/AddButton.js +3 -1
- package/es/components/operator-chain/components/IOCard.js +4 -1
- package/es/components/operator-chain/components/VirtualDropdown.js +6 -3
- package/es/components/permission-editor/index.js +1 -0
- package/es/components/permission-editor/permissionEditModal/index.js +7 -4
- package/es/components/permission-editor/permissionEditor/index.js +40 -75
- package/es/components/permission-editor/permissionViewPopover/index.js +5 -2
- package/es/components/status-tag/index.js +59 -9
- package/es/components/status-tag/index.module.scss.js +24 -8
- package/es/components/tag-group-filter/dataSizeFilter.js +6 -3
- package/es/components/tag-group-filter/index.js +2 -2
- package/es/components/tip-tap/bubble-menu.js +8 -3
- package/es/components/tip-tap/editor.js +5 -2
- package/es/components/tip-tap/extensions/index.js +1 -1
- package/es/components/tip-tap/toolbar/components/color-picker.js +3 -1
- package/es/components/tip-tap/toolbar/components/heading-dropdown.js +8 -5
- package/es/components/tip-tap/toolbar/components/link-button.js +4 -1
- package/es/components/tip-tap/toolbar/components/table-button.js +5 -2
- package/es/components/tip-tap/toolbar/index.js +4 -1
- package/es/components/uploadDrawer/fileUploadDrawer.js +6 -2
- package/es/components/uploadDrawer/fileUploadDrawerList.js +4 -1
- package/es/components/uploadDrawer/fileUploadDrawerListProgressButton.js +4 -2
- package/es/components/uploadDrawer/hooks/useCancelUpload.js +3 -1
- package/es/components/uploadDrawer/hooks/useFilterFiles.js +7 -4
- package/es/components/uploadDrawer/hooks/useFormatFiles.js +3 -1
- package/es/components/uploadDrawer/hooks/useResumeUnfinishedUploads.js +7 -6
- package/es/components/uploadDrawer/index.js +4 -2
- package/es/index.js +6 -5
- package/es/locale/index.js +64 -0
- package/es/locale/modalHolder.js +21 -0
- package/es/locale/resolveLocale.js +73 -0
- package/es/locale/translations.js +273 -0
- package/lib/index.js +1 -1
- 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:
|
|
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:
|
|
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
|
|
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:
|
|
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:
|
|
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
|
-
|
|
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 ?
|
|
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(
|
|
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:
|
|
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 };
|