diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index e1a68a933b..58639598a4 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -35,6 +35,7 @@ jobs: sudo apt-get install -y libfuse-dev cmake re2c flex sqlite3 sudo apt-get install -y libssl-dev libsasl2-dev libldap2-dev libonig-dev sudo apt-get install -y libxml2 libxml2-dev libjwt-dev + sudo apt-get install -y libhiredis-dev - name: clone and build run: | diff --git a/frontend/src/components/dirent-detail/dirent-details/index.js b/frontend/src/components/dirent-detail/dirent-details/index.js index a5dc299888..572433758b 100644 --- a/frontend/src/components/dirent-detail/dirent-details/index.js +++ b/frontend/src/components/dirent-detail/dirent-details/index.js @@ -9,10 +9,13 @@ import DirDetails from './dir-details'; import FileDetails from './file-details'; import ObjectUtils from '../../../utils/object'; import { MetadataDetailsProvider } from '../../../metadata/hooks'; -import { Settings, AI } from '../../../metadata/components/metadata-details'; +import AIIcon from '../../../metadata/components/metadata-details/ai-icon'; +import SettingsIcon from '../../../metadata/components/metadata-details/settings-icon'; import './index.css'; +const { enableSeafileAI } = window.app.config; + class DirentDetails extends React.Component { constructor(props) { @@ -94,8 +97,8 @@ class DirentDetails extends React.Component { >
- - + {enableSeafileAI && } +
{this.renderImage()} diff --git a/frontend/src/components/dirent-detail/embedded-file-details/index.js b/frontend/src/components/dirent-detail/embedded-file-details/index.js index ecac2f5655..9ad2dfd549 100644 --- a/frontend/src/components/dirent-detail/embedded-file-details/index.js +++ b/frontend/src/components/dirent-detail/embedded-file-details/index.js @@ -8,10 +8,13 @@ import { Header, Body } from '../detail'; import FileDetails from '../dirent-details/file-details'; import { MetadataContext } from '../../../metadata'; import { MetadataDetailsProvider } from '../../../metadata/hooks'; -import { AI, Settings } from '../../../metadata/components/metadata-details'; +import AIIcon from '../../../metadata/components/metadata-details/ai-icon'; +import SettingsIcon from '../../../metadata/components/metadata-details/settings-icon'; import './index.css'; +const { enableSeafileAI } = window.app.config; + const EmbeddedFileDetails = ({ repoID, repoInfo, dirent, path, onClose, width = 300, className, component = {} }) => { const { headerComponent } = component; const [direntDetail, setDirentDetail] = useState(''); @@ -70,8 +73,8 @@ const EmbeddedFileDetails = ({ repoID, repoInfo, dirent, path, onClose, width =
{onClose && ( <> - - + {enableSeafileAI && } + )}
diff --git a/frontend/src/metadata/components/metadata-details/ai/index.js b/frontend/src/metadata/components/metadata-details/ai-icon.js similarity index 85% rename from frontend/src/metadata/components/metadata-details/ai/index.js rename to frontend/src/metadata/components/metadata-details/ai-icon.js index 5e6cc2fcaa..f6e1a627bf 100644 --- a/frontend/src/metadata/components/metadata-details/ai/index.js +++ b/frontend/src/metadata/components/metadata-details/ai-icon.js @@ -1,16 +1,16 @@ import React, { useCallback, useMemo, useState } from 'react'; import { Dropdown, DropdownToggle, DropdownMenu, DropdownItem } from 'reactstrap'; -import Icon from '../../../../components/icon'; -import { useMetadataDetails } from '../../../hooks'; -import { useMetadataStatus } from '../../../../hooks'; -import { gettext } from '../../../../utils/constants'; -import { Utils } from '../../../../utils/utils'; -import { getFileNameFromRecord, getFileObjIdFromRecord, getParentDirFromRecord, getRecordIdFromRecord } from '../../../utils/cell'; -import { getColumnByKey } from '../../../utils/column'; -import { PRIVATE_COLUMN_KEY } from '../constants'; -import { useMetadataAIOperations } from '../../../../hooks/metadata-ai-operation'; -import FileTagsDialog from '../../dialog/file-tags-dialog'; -import { checkIsDir } from '../../../utils/row'; +import Icon from '../../../components/icon'; +import { useMetadataDetails } from '../../hooks'; +import { useMetadataStatus } from '../../../hooks'; +import { gettext } from '../../../utils/constants'; +import { Utils } from '../../../utils/utils'; +import { getFileNameFromRecord, getFileObjIdFromRecord, getParentDirFromRecord, getRecordIdFromRecord } from '../../utils/cell'; +import { getColumnByKey } from '../../utils/column'; +import { PRIVATE_COLUMN_KEY } from './constants'; +import { useMetadataAIOperations } from '../../../hooks/metadata-ai-operation'; +import FileTagsDialog from '../dialog/file-tags-dialog'; +import { checkIsDir } from '../../utils/row'; const OPERATION = { GENERATE_DESCRIPTION: 'generate-description', @@ -19,7 +19,8 @@ const OPERATION = { FILE_DETAIL: 'file-detail', }; -const AI = () => { +const AIIcon = () => { + const [isMenuShow, setMenuShow] = useState(false); const [isFileTagsDialogShow, setFileTagsDialogShow] = useState(false); @@ -28,9 +29,7 @@ const AI = () => { const { onOCR, generateDescription, extractFileDetails } = useMetadataAIOperations(); const options = useMemo(() => { - if (!canModifyRecord) return []; - if (!record) return []; - if (checkIsDir(record)) return []; + if (!canModifyRecord || !record || checkIsDir(record)) return []; const descriptionColumn = getColumnByKey(columns, PRIVATE_COLUMN_KEY.FILE_DESCRIPTION); const fileName = getFileNameFromRecord(record); const isImage = Utils.imageCheck(fileName); @@ -135,11 +134,7 @@ const AI = () => { }, [columns, generateDescription, onOCR, extractFileDetails, onChange, onLocalRecordChange]); const renderDropdown = useCallback(() => { - if (!enableMetadata) return null; - if (!canModifyRecord) return null; - if (!record) return null; - if (options.length === 0) return null; - + if (!enableMetadata || !canModifyRecord || !record || options.length === 0) return null; return ( { ); }; -export default AI; +export default AIIcon; diff --git a/frontend/src/metadata/components/metadata-details/index.js b/frontend/src/metadata/components/metadata-details/index.js index 81c236b9ea..38ef0a2383 100644 --- a/frontend/src/metadata/components/metadata-details/index.js +++ b/frontend/src/metadata/components/metadata-details/index.js @@ -9,8 +9,6 @@ import { PRIVATE_COLUMN_KEY, IMAGE_PRIVATE_COLUMN_KEYS } from '../../constants'; import Location from './location'; import { useMetadataDetails } from '../../hooks'; import { checkIsDir } from '../../utils/row'; -import AI from './ai'; -import Settings from './settings'; import { FOLDER_NOT_DISPLAY_COLUMN_KEYS } from './constants'; import './index.css'; @@ -20,9 +18,7 @@ const MetadataDetails = () => { const displayColumns = useMemo(() => columns.filter(c => c.shown), [columns]); - if (isLoading) return null; - if (!record) return null; - if (!record._id) return null; + if (isLoading || !record || !record._id) return null; const fileName = getFileNameFromRecord(record); const isImage = Utils.imageCheck(fileName) || Utils.videoCheck(fileName); @@ -72,7 +68,3 @@ const MetadataDetails = () => { }; export default MetadataDetails; -export { - AI, - Settings, -}; diff --git a/frontend/src/metadata/components/metadata-details/settings/index.js b/frontend/src/metadata/components/metadata-details/settings-icon.js similarity index 73% rename from frontend/src/metadata/components/metadata-details/settings/index.js rename to frontend/src/metadata/components/metadata-details/settings-icon.js index 315d26dbf5..7e9f9caf0f 100644 --- a/frontend/src/metadata/components/metadata-details/settings/index.js +++ b/frontend/src/metadata/components/metadata-details/settings-icon.js @@ -1,12 +1,10 @@ import React, { useMemo, useCallback, useState } from 'react'; -import Icon from '../../../../components/icon'; -import HideColumnPopover from '../../popover/hidden-column-popover'; -import { useMetadataDetails } from '../../../hooks'; -import { useMetadataStatus } from '../../../../hooks'; +import Icon from '../../../components/icon'; +import HideColumnPopover from '../popover/hidden-column-popover'; +import { useMetadataDetails } from '../../hooks'; +import { useMetadataStatus } from '../../../hooks'; -import './index.css'; - -const Settings = () => { +const SettingsIcon = () => { const [isShowSetter, setShowSetter] = useState(false); const { enableMetadata } = useMetadataStatus(); @@ -18,9 +16,7 @@ const Settings = () => { }, [isShowSetter]); const target = useMemo(() => 'detail-control-settings-btn', []); - if (!enableMetadata) return null; - if (!canModifyDetails) return null; - if (!record) return null; + if (!enableMetadata || !canModifyDetails || !record) return null; return ( <> @@ -41,7 +37,6 @@ const Settings = () => { )} ); - }; -export default Settings; +export default SettingsIcon; diff --git a/frontend/src/metadata/components/metadata-details/settings/index.css b/frontend/src/metadata/components/metadata-details/settings/index.css deleted file mode 100644 index e69de29bb2..0000000000