@zjlab-fe/data-hub-ui 0.21.6 → 0.22.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/dist/types/components/tip-tap/extensions/index.d.ts +1 -1
- package/es/assets/cardImg.png.js +3 -0
- package/es/assets/closeBtn.png.js +3 -0
- package/es/assets/icon-tag-header.png.js +3 -0
- package/es/assets/source.png.js +3 -0
- package/es/components/FileUploader/FileUploadModal.js +24 -0
- package/es/components/FileUploader/FileUploader.js +20 -0
- package/es/components/FileUploader/FileUploaderImpl/FileUploader.js +34 -0
- package/es/components/FileUploader/FileUploaderImpl/FileUploaderContextProvider.js +46 -0
- package/es/components/FileUploader/FileUploaderImpl/FileUploaderFileReceiver.css.js +36 -0
- package/es/components/FileUploader/FileUploaderImpl/FileUploaderFileReceiver.js +57 -0
- package/es/components/FileUploader/FileUploaderImpl/FileUploaderFileReceiverContainer.js +24 -0
- package/es/components/FileUploader/FileUploaderImpl/FileUploaderFileReceiverDesc.js +9 -0
- package/es/components/FileUploader/FileUploaderImpl/FileUploaderList.js +46 -0
- package/es/components/FileUploader/FileUploaderImpl/FileUploaderListItem.js +46 -0
- package/es/components/FileUploader/FileUploaderImpl/FileUploaderListItemFail.js +21 -0
- package/es/components/FileUploader/FileUploaderImpl/FileUploaderListItemPaused.js +20 -0
- package/es/components/FileUploader/FileUploaderImpl/FileUploaderListItemUploading.js +43 -0
- package/es/components/FileUploader/FileUploaderImpl/FileUploaderlListItemFinished.js +32 -0
- package/es/components/FileUploader/Locale/translations.js +52 -0
- package/es/components/FileUploader/Locale/useTranslate.js +16 -0
- package/es/components/FileUploader/UploadStoreProvider/UploadStoreProvider.js +31 -0
- package/es/components/FileUploader/UploadStoreProvider/uploadStoreReducer.js +62 -0
- package/es/components/FileUploader/UploadStoreProvider/useOnFileAllUploaded.js +31 -0
- package/es/components/FileUploader/UploadStoreProvider/useSaveUnfinishedUploads.js +42 -0
- package/es/components/FileUploader/UploadStoreProvider/useSetupMergingEvent.js +45 -0
- package/es/components/FileUploader/hooks/useCancelUpload.js +40 -0
- package/es/components/FileUploader/hooks/useCurrentFile.js +61 -0
- package/es/components/FileUploader/hooks/useCurrentFileOnUploading.js +52 -0
- package/es/components/FileUploader/hooks/useCurrentFileSetupAndBackUp.js +39 -0
- package/es/components/FileUploader/hooks/useFormatFiles.js +64 -0
- package/es/components/FileUploader/hooks/useFormatFilesFindDuplicates.js +75 -0
- package/es/components/FileUploader/hooks/useFormatFilesRemoveDuplicates.js +21 -0
- package/es/components/FileUploader/hooks/useHandleChunkCompletion.js +31 -0
- package/es/components/FileUploader/hooks/useOnMounted.js +24 -0
- package/es/components/FileUploader/hooks/useOnMountedResumeUnfinished.js +58 -0
- package/es/components/FileUploader/hooks/useRetryUpload.js +33 -0
- package/es/components/FileUploader/hooks/useUploadChunk.js +46 -0
- package/es/components/FileUploader/icons/CloseFilled.js +7 -0
- package/es/components/FileUploader/icons/UnkownFileIcon.js +7 -0
- package/es/components/FileUploader/icons/UploadIcon.js +7 -0
- package/es/components/FileUploader/index.css.js +532 -0
- package/es/components/FileUploader/index.js +23 -0
- package/es/components/FileUploader/types.js +13 -0
- package/es/components/FileUploader/utils/calcDisplaySize.js +20 -0
- package/es/components/FileUploader/utils/checkExpiryTime.js +15 -0
- package/es/components/FileUploader/utils/createFileToUpload.js +60 -0
- package/es/components/FileUploader/utils/fileDB/addFilesToIndexdb.js +14 -0
- package/es/components/FileUploader/utils/fileDB/deleteFileInStore.js +18 -0
- package/es/components/FileUploader/utils/fileDB/deleteObjectStore.js +25 -0
- package/es/components/FileUploader/utils/fileDB/index.js +77 -0
- package/es/components/FileUploader/utils/fileDB/openDBAndRetrieveData.js +90 -0
- package/es/components/FileUploader/utils/fileDB/retrieveExistingData.js +49 -0
- package/es/components/FileUploader/utils/modalConfig.css.js +20 -0
- package/es/components/FileUploader/utils/modalConfig.js +32 -0
- package/es/components/FileUploader/utils/retrieveAllFiles.js +70 -0
- package/es/components/FileUploader/utils/splitFileIntoChunk.js +15 -0
- package/es/components/SDK-modal/document-link.js +8 -0
- package/es/components/SDK-modal/index.js +25 -0
- package/es/components/SDK-modal/index.module.scss.js +49 -0
- package/es/components/SDK-modal/inner-modal.js +59 -0
- package/es/components/SDK-modal/locale/translations.js +17 -0
- package/es/components/apply-perm-modal/index.js +53 -0
- package/es/components/apply-perm-modal/index.module.scss.js +96 -0
- package/es/components/auth-tag/index.js +23 -0
- package/es/components/bench-card/index.js +20 -0
- package/es/components/bench-card/index.module.scss.js +48 -0
- package/es/components/confirm-again/index.js +15 -0
- package/es/components/confirm-again/index.scss.js +37 -0
- package/es/components/copy/index.js +41 -0
- package/es/components/copy/index.module.scss.js +15 -0
- package/es/components/corpus-card/index.js +88 -0
- package/es/components/corpus-card/index.module.scss.js +171 -0
- package/es/components/feature-card/classNames.js +72 -0
- package/es/components/feature-card/components.js +48 -0
- package/es/components/feature-card/context.js +13 -0
- package/es/components/feature-card/index.css.js +655 -0
- package/es/components/feature-card/index.js +48 -0
- package/es/components/file-preview/data-table/index.js +94 -0
- package/es/components/file-preview/data-table/index.module.scss.js +54 -0
- package/es/components/file-preview/excel-preview/index.js +132 -0
- package/es/components/file-preview/excel-preview/index.module.scss.js +11 -0
- package/es/components/file-preview/excel-preview/utils.js +46 -0
- package/es/components/file-preview/img-preview/index.js +18 -0
- package/es/components/file-preview/img-preview/index.module.scss.js +17 -0
- package/es/components/file-preview/index.js +124 -0
- package/es/components/file-preview/index.module.scss.js +32 -0
- package/es/components/file-preview/json-preview/index.js +166 -0
- package/es/components/file-preview/markdown-preview/index.js +53 -0
- package/es/components/file-preview/markdown-preview/index.module.scss.js +1055 -0
- package/es/components/file-preview/parquet-preview/index.js +54 -0
- package/es/components/file-preview/pdf-preview/index.js +215 -0
- package/es/components/file-preview/pdf-preview/index.module.scss.js +16 -0
- package/es/components/file-preview/table-preview/index.js +43 -0
- package/es/components/file-preview/table-preview/index.module.scss.js +11 -0
- package/es/components/file-preview/txt-preview/index.js +24 -0
- package/es/components/file-preview/util.js +94 -0
- package/es/components/file-uploader/components/circle-progress.css.js +39 -0
- package/es/components/file-uploader/components/circle-progress.js +12 -0
- package/es/components/file-uploader/components/hooks/use-drop-zone.js +74 -0
- package/es/components/file-uploader/components/hooks/use-file-validation.js +52 -0
- package/es/components/file-uploader/components/icons.js +19 -0
- package/es/components/file-uploader/components/theme.css.js +64 -0
- package/es/components/file-uploader/components/uploader-drop-zone.css.js +66 -0
- package/es/components/file-uploader/components/uploader-drop-zone.js +74 -0
- package/es/components/file-uploader/components/uploader-file-item.css.js +186 -0
- package/es/components/file-uploader/components/uploader-file-item.js +63 -0
- package/es/components/file-uploader/components/uploader-file-list.css.js +43 -0
- package/es/components/file-uploader/components/uploader-file-list.js +27 -0
- package/es/components/file-uploader/components/uploader.css.js +20 -0
- package/es/components/file-uploader/components/uploader.js +51 -0
- package/es/components/file-uploader/components/uploading-status.css.js +52 -0
- package/es/components/file-uploader/components/uploading-status.js +54 -0
- package/es/components/file-uploader/components/utils/directory-reader.js +65 -0
- package/es/components/file-uploader/constants.js +31 -0
- package/es/components/file-uploader/context/action-registry.js +69 -0
- package/es/components/file-uploader/context/file-state-store.js +83 -0
- package/es/components/file-uploader/context/handler-registry.js +119 -0
- package/es/components/file-uploader/context/upload-context.js +36 -0
- package/es/components/file-uploader/context/upload-provider.js +77 -0
- package/es/components/file-uploader/context/upload-reducer.js +21 -0
- package/es/components/file-uploader/context/use-upload-engine.js +440 -0
- package/es/components/file-uploader/engine/queue-callbacks.js +257 -0
- package/es/components/file-uploader/engine/queue-manager.js +195 -0
- package/es/components/file-uploader/engine/queue-uploader.js +25 -0
- package/es/components/file-uploader/hooks/use-upload.js +327 -0
- package/es/components/file-uploader/utils/chunk-handlers.js +66 -0
- package/es/components/file-uploader/utils/ensure-handlers.js +53 -0
- package/es/components/file-uploader/utils/error-handler.js +84 -0
- package/es/components/file-uploader/utils/upload-controllers.js +43 -0
- package/es/components/file-uploader/utils/upload-handler.js +68 -0
- package/es/components/file-uploader/utils/validate-handlers.js +16 -0
- package/es/components/floating-label-input/index.js +46 -0
- package/es/components/floating-label-input/index.module.scss.js +30 -0
- package/es/components/floating-layer/index.js +15 -0
- package/es/components/floating-layer/index.scss.js +31 -0
- package/es/components/header/index.js +10 -0
- package/es/components/header/index.module.scss.js +16 -0
- package/es/components/input-tag/index.js +65 -0
- package/es/components/menu/index.js +96 -0
- package/es/components/menu/index.module.scss.js +188 -0
- package/es/components/model-card/index.js +20 -0
- package/es/components/model-card/index.module.scss.js +116 -0
- package/es/components/notion-editor/code-block/index.js +18 -0
- package/es/components/notion-editor/code-block/languageDetector.js +134 -0
- package/es/components/notion-editor/code-block/languages.js +42 -0
- package/es/components/notion-editor/index.js +258 -0
- package/es/components/notion-editor/index.scss.js +421 -0
- package/es/components/notion-editor/parseMarkdown.js +184 -0
- package/es/components/operator-chain/components/AddButton.js +20 -0
- package/es/components/operator-chain/components/IOCard.js +8 -0
- package/es/components/operator-chain/components/SingleCard.js +12 -0
- package/es/components/operator-chain/components/VirtualDropdown.js +56 -0
- package/es/components/operator-chain/index.js +83 -0
- package/es/components/operator-chain/index.module.scss.js +232 -0
- package/es/components/permission-editor/index.js +9 -0
- package/es/components/permission-editor/permissionEditModal/index.js +37 -0
- package/es/components/permission-editor/permissionEditor/index.js +253 -0
- package/es/components/permission-editor/permissionEditor/index.module.scss.js +22 -0
- package/es/components/permission-editor/permissionViewPopover/index.js +9 -0
- package/es/components/popover-select/index.js +42 -0
- package/es/components/popover-select/index.module.scss.js +22 -0
- package/es/components/radio-card/index.js +24 -0
- package/es/components/radio-card/index.scss.js +58 -0
- package/es/components/section-heading/classNames.js +22 -0
- package/es/components/section-heading/components.js +27 -0
- package/es/components/section-heading/context.js +13 -0
- package/es/components/section-heading/index.css.js +648 -0
- package/es/components/section-heading/index.js +37 -0
- package/es/components/status-tag/index.js +31 -0
- package/es/components/tag-group-filter/dataSizeFilter.js +100 -0
- package/es/components/tag-group-filter/index.js +53 -0
- package/es/components/tag-group-filter/index.module.scss.js +134 -0
- package/es/components/tag-group-filter/tagFilter.js +19 -0
- package/es/components/tag-view/index.js +138 -0
- package/es/components/tag-view/index.module.scss.js +56 -0
- package/es/components/tag-view/useSize.js +41 -0
- package/es/components/tip-tap/bubble-menu.js +47 -0
- package/es/components/tip-tap/editor.js +34 -0
- package/es/components/tip-tap/extensions/index.js +133 -0
- package/es/components/tip-tap/extensions/markdown-paste.js +148 -0
- package/es/components/tip-tap/icons/index.js +29 -0
- package/es/components/tip-tap/reader.js +15 -0
- package/es/components/tip-tap/styles/editor.css.js +863 -0
- package/es/components/tip-tap/toolbar/components/color-picker.js +76 -0
- package/es/components/tip-tap/toolbar/components/heading-dropdown.js +44 -0
- package/es/components/tip-tap/toolbar/components/image-button.js +26 -0
- package/es/components/tip-tap/toolbar/components/link-button.js +107 -0
- package/es/components/tip-tap/toolbar/components/table-button.js +37 -0
- package/es/components/tip-tap/toolbar/components/toolbar-button.js +7 -0
- package/es/components/tip-tap/toolbar/index.js +39 -0
- package/es/components/uploadDrawer/UploadStoreProvider.js +61 -0
- package/es/components/uploadDrawer/fileUploadDrawer.js +66 -0
- package/es/components/uploadDrawer/fileUploadDrawerFileDragger.js +71 -0
- package/es/components/uploadDrawer/fileUploadDrawerList.js +54 -0
- package/es/components/uploadDrawer/fileUploadDrawerListProgressButton.js +54 -0
- package/es/components/uploadDrawer/hooks/useCancelUpload.js +37 -0
- package/es/components/uploadDrawer/hooks/useFilterFiles.js +107 -0
- package/es/components/uploadDrawer/hooks/useFinishUpload.js +33 -0
- package/es/components/uploadDrawer/hooks/useFormatFiles.js +54 -0
- package/es/components/uploadDrawer/hooks/useProgressButtonRef.js +22 -0
- package/es/components/uploadDrawer/hooks/useRemoveFilesInUploadQueue.js +21 -0
- package/es/components/uploadDrawer/hooks/useResumeUnfinishedUploads.js +52 -0
- package/es/components/uploadDrawer/hooks/useRetryUpload.js +35 -0
- package/es/components/uploadDrawer/hooks/useSaveUnfinishedUploads.js +42 -0
- package/es/components/uploadDrawer/hooks/useSetupUpload.js +80 -0
- package/es/components/uploadDrawer/hooks/useUploadFileToOSS.js +23 -0
- package/es/components/uploadDrawer/index.css.js +511 -0
- package/es/components/uploadDrawer/index.js +43 -0
- package/es/components/uploadDrawer/utils/calcDisplaySize.js +19 -0
- package/es/components/uploadDrawer/utils/constant.js +16 -0
- package/es/components/uploadDrawer/utils/createFileToUpload.js +51 -0
- package/es/components/uploadDrawer/utils/fileDB/deleteFileInStore.js +28 -0
- package/es/components/uploadDrawer/utils/fileDB/deleteObjectStore.js +28 -0
- package/es/components/uploadDrawer/utils/fileDB/handleAddFilesToDB.js +37 -0
- package/es/components/uploadDrawer/utils/fileDB/index.js +9 -0
- package/es/components/uploadDrawer/utils/fileDB/openDB.js +111 -0
- package/es/components/uploadDrawer/utils/retrieveAllFiles.js +110 -0
- package/es/components/uploadDrawer/utils/shouldCreateNewFile.js +13 -0
- package/es/components/uploadDrawer/utils/splitFileIntoChunk.js +15 -0
- package/es/index.js +42 -1
- package/es/lib/utils.js +8 -0
- package/lib/index.js +1 -1
- package/package.json +164 -154
- package/rollup.es.config.mjs +177 -0
- package/tsconfig.rollup.json +7 -0
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
|
+
import React, { useState, useRef } from 'react';
|
|
3
|
+
import { Input, Select } from 'antd';
|
|
4
|
+
import { "filter-popup" as filter_popup, "filter-popup-top" as filter_popup_top, "virtual-dropdown-container" as virtual_dropdown_container, "virtual-dropdown-content" as virtual_dropdown_content, "virtual-dropdown-items" as virtual_dropdown_items, "virtual-dropdown-item" as virtual_dropdown_item } from '../index.module.scss.js';
|
|
5
|
+
|
|
6
|
+
const { Search } = Input;
|
|
7
|
+
const ITEM_HEIGHT = 32;
|
|
8
|
+
const FIXED_HEIGHT = 420;
|
|
9
|
+
function VirtualDropdown({ menu, onItemClick, onSelect, onInputChange }) {
|
|
10
|
+
const [scrollTop, setScrollTop] = useState(0);
|
|
11
|
+
const [selectedType, setSelectedType] = useState('');
|
|
12
|
+
const [searchValue, setSearchValue] = useState('');
|
|
13
|
+
const containerRef = useRef(null);
|
|
14
|
+
// 从menu中提取唯一的类型选项
|
|
15
|
+
const typeOptions = React.useMemo(() => {
|
|
16
|
+
const typeMap = new Map();
|
|
17
|
+
menu.forEach((item) => {
|
|
18
|
+
if (item.typeId && item.type) {
|
|
19
|
+
typeMap.set(item.typeId.toString(), item.type);
|
|
20
|
+
}
|
|
21
|
+
});
|
|
22
|
+
const options = Array.from(typeMap.entries()).map(([value, label]) => ({
|
|
23
|
+
label,
|
|
24
|
+
value: Number(value),
|
|
25
|
+
}));
|
|
26
|
+
// 添加默认的"全部"选项
|
|
27
|
+
return [{ label: '全部类型', value: '' }, ...options];
|
|
28
|
+
}, [menu]);
|
|
29
|
+
const visibleCount = Math.ceil(FIXED_HEIGHT / ITEM_HEIGHT);
|
|
30
|
+
const startIndex = Math.floor(scrollTop / ITEM_HEIGHT);
|
|
31
|
+
const endIndex = Math.min(startIndex + visibleCount, menu.length);
|
|
32
|
+
const offsetY = startIndex * ITEM_HEIGHT;
|
|
33
|
+
const handleScroll = (e) => {
|
|
34
|
+
setScrollTop(e.currentTarget.scrollTop);
|
|
35
|
+
};
|
|
36
|
+
const handleSelectChange = (value) => {
|
|
37
|
+
setSelectedType(value);
|
|
38
|
+
onSelect === null || onSelect === void 0 ? void 0 : onSelect(Number(value));
|
|
39
|
+
};
|
|
40
|
+
const handleInputChange = (e) => {
|
|
41
|
+
const value = e.target.value;
|
|
42
|
+
setSearchValue(value);
|
|
43
|
+
onInputChange === null || onInputChange === void 0 ? void 0 : onInputChange(value);
|
|
44
|
+
};
|
|
45
|
+
const filteredMenu = menu.filter((item) => {
|
|
46
|
+
const typeMatch = !selectedType || item.typeId === Number(selectedType);
|
|
47
|
+
const searchMatch = !searchValue || (item.title || item.id).toLowerCase().includes(searchValue.toLowerCase());
|
|
48
|
+
return typeMatch && searchMatch;
|
|
49
|
+
});
|
|
50
|
+
const visibleItems = filteredMenu.slice(startIndex, endIndex);
|
|
51
|
+
return (jsxs("div", { className: filter_popup, children: [jsxs("div", { className: filter_popup_top, children: [jsx(Select, { placeholder: "\u9009\u62E9\u7C7B\u578B", style: { width: 140 }, allowClear: true, onChange: handleSelectChange, options: typeOptions, defaultValue: '' }), jsx(Search, { placeholder: "\u641C\u7D22\u7B97\u5B50", style: { width: 200 }, allowClear: true, onChange: handleInputChange })] }), jsx("div", { ref: containerRef, onScroll: handleScroll, className: virtual_dropdown_container, style: {
|
|
52
|
+
maxHeight: FIXED_HEIGHT,
|
|
53
|
+
}, children: jsx("div", { className: virtual_dropdown_content, style: { height: filteredMenu.length * ITEM_HEIGHT }, children: jsx("div", { className: virtual_dropdown_items, style: { transform: `translateY(${offsetY}px)` }, children: visibleItems.map((item) => (jsx("div", { onClick: () => onItemClick(item.id), className: virtual_dropdown_item, children: item.title || item.id }, item.id))) }) }) })] }));
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export { VirtualDropdown as default };
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
|
|
2
|
+
import { forwardRef, useState, useImperativeHandle, useEffect } from 'react';
|
|
3
|
+
import SingleCard from './components/SingleCard.js';
|
|
4
|
+
import AddButton from './components/AddButton.js';
|
|
5
|
+
import IOCard from './components/IOCard.js';
|
|
6
|
+
import { "card-line-container" as card_line_container } from './index.module.scss.js';
|
|
7
|
+
|
|
8
|
+
var index = forwardRef(function OperatorChain({ type = 'default', defaultValues = [], menu = [], isEdit = false, onClick, onChange, onActive, }, ref) {
|
|
9
|
+
const [activeCardIndex, setActiveCardIndex] = useState(null);
|
|
10
|
+
const [cards, setCards] = useState(() => {
|
|
11
|
+
// 初始化时直接处理 defaultValues
|
|
12
|
+
const initialCards = defaultValues.length
|
|
13
|
+
? defaultValues.map(({ id, title, description }) => ({ id, title, description }))
|
|
14
|
+
: [];
|
|
15
|
+
// 如果是 dataIO 类型,直接添加 IMPORT/EXPORT 节点
|
|
16
|
+
if (type === 'dataIO') {
|
|
17
|
+
return [{ id: 'IMPORT' }, ...initialCards, { id: 'EXPORT' }];
|
|
18
|
+
}
|
|
19
|
+
return initialCards;
|
|
20
|
+
});
|
|
21
|
+
const handleClick = (index, id) => {
|
|
22
|
+
setActiveCardIndex(index);
|
|
23
|
+
onClick === null || onClick === void 0 ? void 0 : onClick(id || '');
|
|
24
|
+
};
|
|
25
|
+
const handleDelete = (index, id) => {
|
|
26
|
+
const updatedCards = [...cards];
|
|
27
|
+
updatedCards.splice(index, 1);
|
|
28
|
+
setCards(updatedCards);
|
|
29
|
+
if (activeCardIndex === index) {
|
|
30
|
+
setActiveCardIndex(null);
|
|
31
|
+
}
|
|
32
|
+
else if (activeCardIndex !== null && activeCardIndex > index) {
|
|
33
|
+
setActiveCardIndex((prev) => prev - 1);
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
const handleAdd = (index, id) => {
|
|
37
|
+
const newCard = menu.find((item) => item.id === id);
|
|
38
|
+
if (newCard) {
|
|
39
|
+
const updatedCards = [...cards];
|
|
40
|
+
updatedCards.splice(index + 1, 0, newCard);
|
|
41
|
+
setCards(updatedCards);
|
|
42
|
+
setActiveCardIndex(index + 1);
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
useImperativeHandle(ref, () => ({
|
|
46
|
+
getCards: () => [...cards],
|
|
47
|
+
getActiveCardId: () => {
|
|
48
|
+
if (activeCardIndex === null || activeCardIndex < 0 || activeCardIndex >= cards.length) {
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
return cards[activeCardIndex].id;
|
|
52
|
+
},
|
|
53
|
+
}));
|
|
54
|
+
useEffect(() => {
|
|
55
|
+
const newCards = defaultValues.length
|
|
56
|
+
? defaultValues.map(({ id, title, description }) => ({ id, title, description }))
|
|
57
|
+
: [];
|
|
58
|
+
if (type === 'dataIO') {
|
|
59
|
+
setCards([{ id: 'IMPORT' }, ...newCards, { id: 'EXPORT' }]);
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
setCards(newCards);
|
|
63
|
+
}
|
|
64
|
+
}, [defaultValues, type]);
|
|
65
|
+
useEffect(() => {
|
|
66
|
+
// 只在非初始化时触发 onChange
|
|
67
|
+
if (cards.length > 0 || defaultValues.length === 0) {
|
|
68
|
+
onChange === null || onChange === void 0 ? void 0 : onChange(cards);
|
|
69
|
+
}
|
|
70
|
+
}, [cards, onChange, defaultValues.length]);
|
|
71
|
+
useEffect(() => {
|
|
72
|
+
// 当激活卡片变化时触发 onActive 回调
|
|
73
|
+
if (activeCardIndex === null || activeCardIndex < 0 || activeCardIndex >= cards.length) {
|
|
74
|
+
onActive === null || onActive === void 0 ? void 0 : onActive(null);
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
onActive === null || onActive === void 0 ? void 0 : onActive(cards[activeCardIndex].id);
|
|
78
|
+
}
|
|
79
|
+
}, [activeCardIndex, cards, onActive]);
|
|
80
|
+
return (jsxs("div", { style: { display: 'flex', flexDirection: 'column', padding: 20 }, children: [cards.map((card, index) => (jsx("div", { children: card.id === 'IMPORT' ? (jsx(IOCard, { id: card.id, isActive: activeCardIndex === index, onClick: (id) => handleClick(index, id) })) : null }, index))), jsx("div", { className: type === 'dataIO' ? card_line_container : null, children: cards.map((card, index) => (jsxs("div", { style: { marginLeft: '15px' }, children: [card.id === 'IMPORT' && (jsx(AddButton, { menu: menu, onClick: (id) => handleAdd(index, id), isEdit: isEdit })), card.id !== 'IMPORT' && card.id !== 'EXPORT' && (jsxs(Fragment, { children: [jsx(SingleCard, { isEdit: isEdit, isActive: activeCardIndex === index, onClick: (id) => handleClick(index, id), onDelete: (id) => handleDelete(index), title: card.title, description: card.description, id: card.id }), jsx(AddButton, { menu: menu, onClick: (id) => handleAdd(index, id), isEdit: isEdit })] }))] }, index))) }), cards.map((card, index) => (jsx("div", { children: card.id === 'EXPORT' ? (jsx(IOCard, { id: card.id, isActive: activeCardIndex === index, onClick: (id) => handleClick(index, id) })) : null }, index)))] }));
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
export { index as default };
|
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
var style = document.createElement('style');
|
|
2
|
+
style.textContent = `@charset "UTF-8";
|
|
3
|
+
.index-module__card-body___2yy9w {
|
|
4
|
+
box-sizing: border-box;
|
|
5
|
+
display: flex;
|
|
6
|
+
flex-direction: column;
|
|
7
|
+
justify-content: center;
|
|
8
|
+
align-items: flex-start;
|
|
9
|
+
padding: 12px 16px 12px 20px;
|
|
10
|
+
gap: 4px;
|
|
11
|
+
isolation: isolate;
|
|
12
|
+
position: relative;
|
|
13
|
+
width: 260px;
|
|
14
|
+
height: 82px;
|
|
15
|
+
background: #ffffff;
|
|
16
|
+
border: 1px solid #edf2fc;
|
|
17
|
+
box-shadow: 0px 2px 8px rgba(7, 35, 76, 0.1);
|
|
18
|
+
border-radius: 8px;
|
|
19
|
+
cursor: pointer;
|
|
20
|
+
transition: border-color 0.3s;
|
|
21
|
+
}
|
|
22
|
+
.index-module__card-body___2yy9w::before {
|
|
23
|
+
content: "";
|
|
24
|
+
position: absolute;
|
|
25
|
+
width: 3px;
|
|
26
|
+
height: 58px;
|
|
27
|
+
left: 1px;
|
|
28
|
+
top: 12px;
|
|
29
|
+
background: rgba(23, 117, 254, 0.5);
|
|
30
|
+
border-radius: 0px 8px 8px 0px;
|
|
31
|
+
flex: none;
|
|
32
|
+
order: 2;
|
|
33
|
+
flex-grow: 0;
|
|
34
|
+
z-index: 2;
|
|
35
|
+
}
|
|
36
|
+
.index-module__card-body___2yy9w.index-module__hover___6yqUE {
|
|
37
|
+
display: flex;
|
|
38
|
+
flex-direction: column;
|
|
39
|
+
justify-content: center;
|
|
40
|
+
align-items: flex-start;
|
|
41
|
+
padding: 12px 16px 12px 20px;
|
|
42
|
+
gap: 4px;
|
|
43
|
+
isolation: isolate;
|
|
44
|
+
background: #ffffff;
|
|
45
|
+
border: 1px solid rgba(23, 117, 254, 0.3);
|
|
46
|
+
box-shadow: 0px 8px 24px rgba(7, 35, 76, 0.15);
|
|
47
|
+
border-radius: 8px;
|
|
48
|
+
}
|
|
49
|
+
.index-module__card-body___2yy9w.index-module__active___0YZNX {
|
|
50
|
+
display: flex;
|
|
51
|
+
flex-direction: column;
|
|
52
|
+
justify-content: center;
|
|
53
|
+
align-items: flex-start;
|
|
54
|
+
padding: 12px 16px 12px 20px;
|
|
55
|
+
gap: 4px;
|
|
56
|
+
isolation: isolate;
|
|
57
|
+
background: #ffffff;
|
|
58
|
+
border: 1px solid #1775fe;
|
|
59
|
+
box-shadow: 0px 2px 8px rgba(7, 35, 76, 0.1);
|
|
60
|
+
border-radius: 8px;
|
|
61
|
+
}
|
|
62
|
+
.index-module__card-body___2yy9w.index-module__active___0YZNX::before {
|
|
63
|
+
background: #1775fe;
|
|
64
|
+
}
|
|
65
|
+
.index-module__card-body___2yy9w .index-module__delete-btn-container___6Lsv3 {
|
|
66
|
+
position: absolute;
|
|
67
|
+
top: 0px;
|
|
68
|
+
right: 0;
|
|
69
|
+
cursor: pointer;
|
|
70
|
+
color: #1775fe;
|
|
71
|
+
opacity: 0;
|
|
72
|
+
transform: translateX(0);
|
|
73
|
+
transition: all 0.3s ease;
|
|
74
|
+
}
|
|
75
|
+
.index-module__card-body___2yy9w:hover .index-module__delete-btn-container___6Lsv3 {
|
|
76
|
+
opacity: 1;
|
|
77
|
+
transform: translateX(0);
|
|
78
|
+
}
|
|
79
|
+
.index-module__active___0YZNX {
|
|
80
|
+
border-color: #1775fe !important;
|
|
81
|
+
background-color: #ffffff !important;
|
|
82
|
+
}
|
|
83
|
+
.index-module__iocard___On10h {
|
|
84
|
+
display: flex;
|
|
85
|
+
align-items: center;
|
|
86
|
+
gap: 8px;
|
|
87
|
+
width: 284px;
|
|
88
|
+
}
|
|
89
|
+
.index-module__iocard___On10h::before {
|
|
90
|
+
content: "";
|
|
91
|
+
box-sizing: border-box;
|
|
92
|
+
width: 16px;
|
|
93
|
+
height: 16px;
|
|
94
|
+
border: 2px solid #99a1af;
|
|
95
|
+
background: radial-gradient(circle, #99a1af 0 30%, transparent 30% 70%, #99a1af 70% 100%);
|
|
96
|
+
border-radius: 50%;
|
|
97
|
+
flex: none;
|
|
98
|
+
}
|
|
99
|
+
.index-module__iocard-body___6BzLs {
|
|
100
|
+
box-sizing: border-box;
|
|
101
|
+
display: flex;
|
|
102
|
+
flex-direction: row;
|
|
103
|
+
justify-content: center;
|
|
104
|
+
align-items: center;
|
|
105
|
+
padding: 10px 0px;
|
|
106
|
+
gap: 10px;
|
|
107
|
+
width: 260px;
|
|
108
|
+
height: 40px;
|
|
109
|
+
background: #ffffff;
|
|
110
|
+
border: 1px solid #eaf1fe;
|
|
111
|
+
box-shadow: 0px 2px 8px rgba(7, 35, 76, 0.1);
|
|
112
|
+
border-radius: 16777200px;
|
|
113
|
+
cursor: pointer;
|
|
114
|
+
transition: border-color 0.3s;
|
|
115
|
+
}
|
|
116
|
+
.index-module__iocard-body___6BzLs:hover {
|
|
117
|
+
border: 1px solid rgba(23, 117, 254, 0.3);
|
|
118
|
+
/* 投影1 */
|
|
119
|
+
box-shadow: 0px 8px 24px rgba(7, 35, 76, 0.15);
|
|
120
|
+
border-radius: 16777200px;
|
|
121
|
+
}
|
|
122
|
+
.index-module__iocard-body___6BzLs.index-module__active___0YZNX {
|
|
123
|
+
background: #ffffff;
|
|
124
|
+
border: 1px solid #1775fe;
|
|
125
|
+
box-shadow: 0px 2px 8px rgba(7, 35, 76, 0.1);
|
|
126
|
+
border-radius: 16777200px;
|
|
127
|
+
}
|
|
128
|
+
.index-module__card-title___7aaE0 {
|
|
129
|
+
width: 224px;
|
|
130
|
+
height: 20px;
|
|
131
|
+
font-style: normal;
|
|
132
|
+
font-weight: 500;
|
|
133
|
+
font-size: 14px;
|
|
134
|
+
line-height: 20px;
|
|
135
|
+
color: #222427;
|
|
136
|
+
position: relative;
|
|
137
|
+
}
|
|
138
|
+
.index-module__card-description___UlkWG {
|
|
139
|
+
width: 224px;
|
|
140
|
+
height: 34px;
|
|
141
|
+
font-style: normal;
|
|
142
|
+
font-weight: 400;
|
|
143
|
+
font-size: 12px;
|
|
144
|
+
color: #565b63;
|
|
145
|
+
overflow: hidden;
|
|
146
|
+
display: -webkit-box;
|
|
147
|
+
-webkit-line-clamp: 2;
|
|
148
|
+
line-clamp: 2;
|
|
149
|
+
text-overflow: ellipsis;
|
|
150
|
+
min-height: 40px;
|
|
151
|
+
-webkit-box-orient: vertical;
|
|
152
|
+
}
|
|
153
|
+
.index-module__divider-block___PZ78i {
|
|
154
|
+
width: 260px;
|
|
155
|
+
height: 20px;
|
|
156
|
+
transition: all 0.3s;
|
|
157
|
+
}
|
|
158
|
+
.index-module__card-divider___SG2-r {
|
|
159
|
+
width: 260px;
|
|
160
|
+
height: 20px;
|
|
161
|
+
opacity: 0;
|
|
162
|
+
transition: opacity 0.3s ease;
|
|
163
|
+
}
|
|
164
|
+
.index-module__divider-block___PZ78i:hover .index-module__card-divider___SG2-r {
|
|
165
|
+
opacity: 1;
|
|
166
|
+
}
|
|
167
|
+
.index-module__dropdown-menu___3Bqbj {
|
|
168
|
+
width: 200px !important;
|
|
169
|
+
max-height: 200px !important;
|
|
170
|
+
overflow-y: auto !important;
|
|
171
|
+
}
|
|
172
|
+
.index-module__virtual-dropdown-container___V9-Ly {
|
|
173
|
+
overflow-y: auto;
|
|
174
|
+
position: relative;
|
|
175
|
+
width: 100%;
|
|
176
|
+
}
|
|
177
|
+
.index-module__virtual-dropdown-content___NM-r1 {
|
|
178
|
+
position: relative;
|
|
179
|
+
}
|
|
180
|
+
.index-module__virtual-dropdown-items___Eo3-C {
|
|
181
|
+
position: absolute;
|
|
182
|
+
width: 100%;
|
|
183
|
+
}
|
|
184
|
+
.index-module__virtual-dropdown-item___le2A5 {
|
|
185
|
+
height: 32px;
|
|
186
|
+
padding: 0 12px;
|
|
187
|
+
display: flex;
|
|
188
|
+
align-items: center;
|
|
189
|
+
cursor: pointer;
|
|
190
|
+
transition: background-color 0.2s;
|
|
191
|
+
}
|
|
192
|
+
.index-module__virtual-dropdown-item___le2A5:hover {
|
|
193
|
+
background-color: #f5f5f5;
|
|
194
|
+
}
|
|
195
|
+
.index-module__card-line-container___Xup5i {
|
|
196
|
+
margin-left: 7px;
|
|
197
|
+
width: 284px;
|
|
198
|
+
border-left: 1px dashed #99a1af;
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* 筛选面板css
|
|
202
|
+
*/
|
|
203
|
+
.index-module__filter-popup___ERPmR {
|
|
204
|
+
/* 选项 */
|
|
205
|
+
/* Auto layout */
|
|
206
|
+
display: flex;
|
|
207
|
+
flex-direction: column;
|
|
208
|
+
align-items: flex-start;
|
|
209
|
+
padding: 12px 0px;
|
|
210
|
+
gap: 8px;
|
|
211
|
+
width: 372px;
|
|
212
|
+
height: 456px;
|
|
213
|
+
background: #ffffff;
|
|
214
|
+
/* drop-shadow/0.12+0.8+0.5 */
|
|
215
|
+
box-shadow: 0px 3px 6px -4px rgba(0, 0, 0, 0.12), 0px 6px 16px rgba(0, 0, 0, 0.08), 0px 9px 28px 8px rgba(0, 0, 0, 0.05);
|
|
216
|
+
border-radius: 2px;
|
|
217
|
+
}
|
|
218
|
+
.index-module__filter-popup-top___VryEA {
|
|
219
|
+
/* Frame 2147223236 */
|
|
220
|
+
/* Auto layout */
|
|
221
|
+
display: flex;
|
|
222
|
+
flex-direction: row;
|
|
223
|
+
align-items: flex-start;
|
|
224
|
+
padding: 0px 12px;
|
|
225
|
+
gap: 8px;
|
|
226
|
+
height: 32px;
|
|
227
|
+
}`;
|
|
228
|
+
document.head.appendChild(style);
|
|
229
|
+
|
|
230
|
+
var card_body = "index-module__card-body___2yy9w";var active = "index-module__active___0YZNX";var delete_btn_container = "index-module__delete-btn-container___6Lsv3";var iocard = "index-module__iocard___On10h";var iocard_body = "index-module__iocard-body___6BzLs";var card_title = "index-module__card-title___7aaE0";var card_description = "index-module__card-description___UlkWG";var divider_block = "index-module__divider-block___PZ78i";var card_divider = "index-module__card-divider___SG2-r";var virtual_dropdown_container = "index-module__virtual-dropdown-container___V9-Ly";var virtual_dropdown_content = "index-module__virtual-dropdown-content___NM-r1";var virtual_dropdown_items = "index-module__virtual-dropdown-items___Eo3-C";var virtual_dropdown_item = "index-module__virtual-dropdown-item___le2A5";var card_line_container = "index-module__card-line-container___Xup5i";var filter_popup = "index-module__filter-popup___ERPmR";var filter_popup_top = "index-module__filter-popup-top___VryEA";
|
|
231
|
+
|
|
232
|
+
export { active, card_body as "card-body", card_description as "card-description", card_divider as "card-divider", card_line_container as "card-line-container", card_title as "card-title", delete_btn_container as "delete-btn-container", divider_block as "divider-block", filter_popup as "filter-popup", filter_popup_top as "filter-popup-top", iocard, iocard_body as "iocard-body", virtual_dropdown_container as "virtual-dropdown-container", virtual_dropdown_content as "virtual-dropdown-content", virtual_dropdown_item as "virtual-dropdown-item", virtual_dropdown_items as "virtual-dropdown-items" };
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { __awaiter } from 'tslib';
|
|
2
|
+
import { jsx } from 'react/jsx-runtime';
|
|
3
|
+
import { useState, useEffect } from 'react';
|
|
4
|
+
import { Modal, Button, message } from 'antd';
|
|
5
|
+
import PermissionEditor from '../permissionEditor/index.js';
|
|
6
|
+
|
|
7
|
+
const PermissionEditModal = ({ open, onCancel, onSave, initialPermissions = [], }) => {
|
|
8
|
+
const [selectedPermissions, setSelectedPermissions] = useState(initialPermissions);
|
|
9
|
+
const [loading, setLoading] = useState(false);
|
|
10
|
+
// 当 modal 打开时重置权限状态
|
|
11
|
+
useEffect(() => {
|
|
12
|
+
if (open) {
|
|
13
|
+
setSelectedPermissions(initialPermissions);
|
|
14
|
+
}
|
|
15
|
+
}, [open, initialPermissions]);
|
|
16
|
+
const handleSave = () => __awaiter(void 0, void 0, void 0, function* () {
|
|
17
|
+
try {
|
|
18
|
+
onSave === null || onSave === void 0 ? void 0 : onSave(selectedPermissions);
|
|
19
|
+
onCancel();
|
|
20
|
+
}
|
|
21
|
+
catch (error) {
|
|
22
|
+
message.error('权限更新失败');
|
|
23
|
+
console.error('保存权限失败:', error);
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
const handleCancel = () => {
|
|
27
|
+
// 重置为初始状态
|
|
28
|
+
setSelectedPermissions(initialPermissions);
|
|
29
|
+
onCancel();
|
|
30
|
+
};
|
|
31
|
+
return (jsx(Modal, { title: `编辑权限`, open: open, onCancel: handleCancel, width: 600, destroyOnClose: true, footer: [
|
|
32
|
+
jsx(Button, { onClick: handleCancel, children: "\u53D6\u6D88" }, "cancel"),
|
|
33
|
+
jsx(Button, { type: "primary", loading: loading, onClick: handleSave, children: "\u4FDD\u5B58" }, "save"),
|
|
34
|
+
], children: jsx("div", { style: { padding: '16px 0' }, children: jsx(PermissionEditor, { initialPermissions: selectedPermissions, onChange: setSelectedPermissions, editable: true }) }) }));
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
export { PermissionEditModal as default };
|
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
import { jsx, Fragment, jsxs } from 'react/jsx-runtime';
|
|
2
|
+
import React from 'react';
|
|
3
|
+
import { Tag, Flex } from 'antd';
|
|
4
|
+
import { unEditable, tagReadonly } from './index.module.scss.js';
|
|
5
|
+
import { CheckCircleOutlined } from '@ant-design/icons';
|
|
6
|
+
|
|
7
|
+
const permissionTags = [
|
|
8
|
+
{
|
|
9
|
+
label: '数据权限',
|
|
10
|
+
value: 'agentic',
|
|
11
|
+
readOnly: false,
|
|
12
|
+
children: [
|
|
13
|
+
{
|
|
14
|
+
label: '检索智能体',
|
|
15
|
+
value: '13',
|
|
16
|
+
readOnly: false,
|
|
17
|
+
},
|
|
18
|
+
],
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
label: '工作台权限',
|
|
22
|
+
value: 'workbench',
|
|
23
|
+
readOnly: false,
|
|
24
|
+
children: [
|
|
25
|
+
{
|
|
26
|
+
label: '语料生产服务',
|
|
27
|
+
value: '20',
|
|
28
|
+
readOnly: false,
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
label: '语料质量评估',
|
|
32
|
+
value: '18',
|
|
33
|
+
readOnly: false,
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
label: '可视化工作流',
|
|
37
|
+
value: '1',
|
|
38
|
+
readOnly: false,
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
label: '文档标注',
|
|
42
|
+
value: '8',
|
|
43
|
+
readOnly: false,
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
label: '模型训练',
|
|
47
|
+
value: '19',
|
|
48
|
+
readOnly: false,
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
label: '计量中心',
|
|
52
|
+
value: '23',
|
|
53
|
+
readOnly: false,
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
label: '模型部署',
|
|
57
|
+
value: '21',
|
|
58
|
+
readOnly: true,
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
label: '模型管理',
|
|
62
|
+
value: '22',
|
|
63
|
+
readOnly: true,
|
|
64
|
+
},
|
|
65
|
+
],
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
label: '语料检索权限',
|
|
69
|
+
value: 'corpus_index',
|
|
70
|
+
readOnly: false,
|
|
71
|
+
children: [
|
|
72
|
+
{
|
|
73
|
+
label: '文献语料检索',
|
|
74
|
+
value: '14',
|
|
75
|
+
readOnly: false,
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
label: '网页语料筛选',
|
|
79
|
+
value: '15',
|
|
80
|
+
readOnly: false,
|
|
81
|
+
},
|
|
82
|
+
],
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
label: '语料生产权限',
|
|
86
|
+
value: 'corpus_product',
|
|
87
|
+
readOnly: false,
|
|
88
|
+
children: [
|
|
89
|
+
{
|
|
90
|
+
label: '文档语料生产',
|
|
91
|
+
value: '16',
|
|
92
|
+
readOnly: false,
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
label: '网页语料生产',
|
|
96
|
+
value: '17',
|
|
97
|
+
readOnly: false,
|
|
98
|
+
},
|
|
99
|
+
],
|
|
100
|
+
},
|
|
101
|
+
];
|
|
102
|
+
const PermissionEditor = ({ initialPermissions = [], onChange, editable = true, }) => {
|
|
103
|
+
// 将新格式转换为内部使用的扁平化格式
|
|
104
|
+
const convertToFlatFormat = (permissions) => {
|
|
105
|
+
const flatTags = [];
|
|
106
|
+
permissions.forEach((module) => {
|
|
107
|
+
// 添加权限列表中的所有子权限
|
|
108
|
+
flatTags.push(...module.grentedList);
|
|
109
|
+
// 查找对应的父级标签
|
|
110
|
+
const parentTag = permissionTags.find((tag) => tag.value === module.module);
|
|
111
|
+
if (parentTag) {
|
|
112
|
+
if (parentTag.children.length === 0) {
|
|
113
|
+
// 如果是没有子级的模块(如 agentic),直接添加父模块
|
|
114
|
+
flatTags.push(module.module);
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
// 如果有子级,检查是否所有可选的子权限都被选中
|
|
118
|
+
const availableChildren = parentTag.children.filter((child) => !child.readOnly);
|
|
119
|
+
const availableChildValues = availableChildren.map((child) => child.value);
|
|
120
|
+
// 检查是否所有可选子级都在权限列表中
|
|
121
|
+
const allAvailableChildrenSelected = availableChildValues.length > 0 &&
|
|
122
|
+
availableChildValues.every((childValue) => module.grentedList.includes(childValue));
|
|
123
|
+
if (allAvailableChildrenSelected) {
|
|
124
|
+
flatTags.push(module.module);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
});
|
|
129
|
+
return flatTags;
|
|
130
|
+
};
|
|
131
|
+
// 将扁平化格式转换为新格式
|
|
132
|
+
const convertToModuleFormat = (flatTags) => {
|
|
133
|
+
const modules = [];
|
|
134
|
+
permissionTags.forEach((tag) => {
|
|
135
|
+
const modulePermissions = [];
|
|
136
|
+
// 检查子权限
|
|
137
|
+
tag.children.forEach((child) => {
|
|
138
|
+
if (flatTags.includes(child.value)) {
|
|
139
|
+
modulePermissions.push(child.value);
|
|
140
|
+
}
|
|
141
|
+
});
|
|
142
|
+
// 只有在以下情况下才添加模块:
|
|
143
|
+
// 1. 模块没有子级且父级被选中(如 agentic)
|
|
144
|
+
// 2. 模块有子级且有子权限被选中
|
|
145
|
+
if (tag.children.length === 0) {
|
|
146
|
+
// 没有子级的模块,只有父级被选中时才添加
|
|
147
|
+
if (flatTags.includes(tag.value)) {
|
|
148
|
+
modules.push({
|
|
149
|
+
module: tag.value,
|
|
150
|
+
grentedList: [],
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
else {
|
|
155
|
+
// 1.有子级的模块,只有有子权限被选中时才添加
|
|
156
|
+
// if (modulePermissions.length > 0) {
|
|
157
|
+
// modules.push({
|
|
158
|
+
// module: tag.value,
|
|
159
|
+
// grentedList: modulePermissions,
|
|
160
|
+
// });
|
|
161
|
+
// }
|
|
162
|
+
// 2.无论有没有子权限时都添加
|
|
163
|
+
modules.push({
|
|
164
|
+
module: tag.value,
|
|
165
|
+
grentedList: modulePermissions,
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
});
|
|
169
|
+
return modules;
|
|
170
|
+
};
|
|
171
|
+
const [selectedTags, setSelectedTags] = React.useState(convertToFlatFormat(initialPermissions));
|
|
172
|
+
const handleChange = (tag, checked, readOnly) => {
|
|
173
|
+
// 如果整体不可编辑或者标签只读,则不处理
|
|
174
|
+
if (!editable || readOnly)
|
|
175
|
+
return;
|
|
176
|
+
// 查找当前操作的标签
|
|
177
|
+
const currentTag = permissionTags.find((t) => t.value === tag);
|
|
178
|
+
let nextSelectedTags;
|
|
179
|
+
if (currentTag && currentTag.children.length > 0) {
|
|
180
|
+
// 如果是父级标签且有子级
|
|
181
|
+
if (checked) {
|
|
182
|
+
// 选中父级时,同时选中所有非只读的子级
|
|
183
|
+
const childValues = currentTag.children
|
|
184
|
+
.filter((child) => !child.readOnly)
|
|
185
|
+
.map((child) => child.value);
|
|
186
|
+
nextSelectedTags = Array.from(new Set([...selectedTags, tag, ...childValues]));
|
|
187
|
+
}
|
|
188
|
+
else {
|
|
189
|
+
// 取消父级时,同时取消所有子级
|
|
190
|
+
const childValues = currentTag.children.map((child) => child.value);
|
|
191
|
+
nextSelectedTags = selectedTags.filter((t) => t !== tag && !childValues.includes(t));
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
else {
|
|
195
|
+
// 子级标签的操作
|
|
196
|
+
if (checked) {
|
|
197
|
+
nextSelectedTags = [...selectedTags, tag];
|
|
198
|
+
// 检查是否需要自动选中父级
|
|
199
|
+
const parentTag = permissionTags.find((parent) => parent.children.some((child) => child.value === tag));
|
|
200
|
+
if (parentTag) {
|
|
201
|
+
// 获取所有非只读的子级
|
|
202
|
+
const availableChildren = parentTag.children.filter((child) => !child.readOnly);
|
|
203
|
+
const availableChildValues = availableChildren.map((child) => child.value);
|
|
204
|
+
// 检查是否所有可选的子级都已被选中
|
|
205
|
+
const allAvailableChildrenSelected = availableChildValues.every((childValue) => nextSelectedTags.includes(childValue));
|
|
206
|
+
// 如果所有可选子级都被选中,且父级未被选中,则自动选中父级
|
|
207
|
+
if (allAvailableChildrenSelected && !nextSelectedTags.includes(parentTag.value)) {
|
|
208
|
+
nextSelectedTags = [...nextSelectedTags, parentTag.value];
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
else {
|
|
213
|
+
nextSelectedTags = selectedTags.filter((t) => t !== tag);
|
|
214
|
+
// 如果取消的是子级,检查是否需要取消父级
|
|
215
|
+
const parentTag = permissionTags.find((parent) => parent.children.some((child) => child.value === tag));
|
|
216
|
+
if (parentTag && selectedTags.includes(parentTag.value)) {
|
|
217
|
+
// 如果父级是选中状态,取消父级
|
|
218
|
+
nextSelectedTags = nextSelectedTags.filter((t) => t !== parentTag.value);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
const modulePermissions = convertToModuleFormat(nextSelectedTags);
|
|
223
|
+
console.log('You are interested in: ', nextSelectedTags);
|
|
224
|
+
setSelectedTags(nextSelectedTags);
|
|
225
|
+
onChange === null || onChange === void 0 ? void 0 : onChange(modulePermissions);
|
|
226
|
+
};
|
|
227
|
+
return (jsx(Fragment, { children: permissionTags.map((tag) => {
|
|
228
|
+
var _a;
|
|
229
|
+
const isSelected = selectedTags.includes(tag.value);
|
|
230
|
+
return (jsxs("div", { style: { width: '100%', margin: '8px 0' }, className: !editable ? unEditable : '', children: [jsx("span", { style: { fontSize: '16px', fontWeight: 500, marginRight: 8 }, children: tag.label }), editable && (jsx(Tag.CheckableTag, { checked: isSelected, onChange: (checked) => handleChange(tag.value, checked, tag.readOnly), style: {
|
|
231
|
+
cursor: tag.readOnly ? 'not-allowed' : 'pointer',
|
|
232
|
+
opacity: tag.readOnly ? 0.7 : 1,
|
|
233
|
+
margin: '5px 0',
|
|
234
|
+
paddingBlock: 0,
|
|
235
|
+
color: isSelected ? '#FFFFFF' : '#a8a8a8',
|
|
236
|
+
paddingInline: 0,
|
|
237
|
+
height: 18,
|
|
238
|
+
width: 18,
|
|
239
|
+
border: 0,
|
|
240
|
+
borderRadius: '50%',
|
|
241
|
+
}, className: tag.readOnly ? tagReadonly : '', children: jsx(CheckCircleOutlined, { style: { fontSize: '18px' }, title: isSelected ? '取消全选' : '全选' }) }, tag.value)), jsx(Flex, { gap: 5, wrap: true, align: "center", children: (_a = tag.children) === null || _a === void 0 ? void 0 : _a.map((child) => {
|
|
242
|
+
const isChildSelected = selectedTags.includes(child.value);
|
|
243
|
+
return (jsx(Tag.CheckableTag, { checked: isChildSelected, onChange: (checked) => handleChange(child.value, checked, child.readOnly), style: {
|
|
244
|
+
cursor: child.readOnly ? 'not-allowed' : 'pointer',
|
|
245
|
+
opacity: child.readOnly ? 0.7 : 1,
|
|
246
|
+
margin: '5px 0',
|
|
247
|
+
border: '1px solid #979797',
|
|
248
|
+
}, className: child.readOnly ? tagReadonly : '', children: child.label }, child.value));
|
|
249
|
+
}) })] }, tag.value));
|
|
250
|
+
}) }));
|
|
251
|
+
};
|
|
252
|
+
|
|
253
|
+
export { PermissionEditor as default };
|