diff --git a/src/components/App.tsx b/src/components/App.tsx index 3f7b01407..b12f7551b 100644 --- a/src/components/App.tsx +++ b/src/components/App.tsx @@ -12,6 +12,7 @@ import { SIGN_IN_PATH } from '@/config/externalPaths'; import { FAVORITE_ITEMS_PATH, HOME_PATH, + INFORMATION_PATH, ITEMS_PATH, PUBLISHED_ITEMS_PATH, PUBLISH_PATH, @@ -29,6 +30,7 @@ import SharedItems from './SharedItems'; import { useCurrentUserContext } from './context/CurrentUserContext'; import FavoriteItems from './main/FavoriteItems'; import Home from './main/Home'; +import ItemInformationScreen from './main/ItemScreens/ItemInformationScreen'; import ItemScreen from './main/ItemScreens/ItemScreen'; import ItemScreenLayout from './main/ItemScreens/ItemScreenLayout'; import PublishItemScreen from './main/ItemScreens/PublishItemScreen'; @@ -94,6 +96,7 @@ const App = (): JSX.Element => { } /> } /> } /> + } /> } /> } /> diff --git a/src/components/common/ItemMetadataButton.tsx b/src/components/common/ItemMetadataButton.tsx index 5123fede8..6a923dc26 100644 --- a/src/components/common/ItemMetadataButton.tsx +++ b/src/components/common/ItemMetadataButton.tsx @@ -1,37 +1,27 @@ +import { useNavigate } from 'react-router'; + import InfoIcon from '@mui/icons-material/Info'; import { IconButton, Tooltip } from '@mui/material'; +import { buildItemInformationPath } from '@/config/paths'; + import { useBuilderTranslation } from '../../config/i18n'; -import { - ITEM_INFORMATION_BUTTON_ID, - ITEM_INFORMATION_ICON_IS_OPEN_CLASS, -} from '../../config/selectors'; +import { ITEM_INFORMATION_BUTTON_ID } from '../../config/selectors'; import { BUILDER } from '../../langs/constants'; -import { useLayoutContext } from '../context/LayoutContext'; -const ItemMetadataButton = (): JSX.Element => { +const ItemMetadataButton = ({ id }: { id: string }): JSX.Element => { const { t: translateBuilder } = useBuilderTranslation(); - const { - isItemMetadataMenuOpen, - setIsItemMetadataMenuOpen, - setIsChatboxMenuOpen, - } = useLayoutContext(); + + const navigate = useNavigate(); const onClick = () => { - setIsItemMetadataMenuOpen(!isItemMetadataMenuOpen); - setIsChatboxMenuOpen(false); + navigate(buildItemInformationPath(id)); }; return ( - + diff --git a/src/components/context/LayoutContext.tsx b/src/components/context/LayoutContext.tsx index fd0f29c30..10172b7ac 100644 --- a/src/components/context/LayoutContext.tsx +++ b/src/components/context/LayoutContext.tsx @@ -12,8 +12,6 @@ interface LayoutContextInterface { setEditingItemId: (itemId: string | null) => void; isMainMenuOpen: boolean; setIsMainMenuOpen: (isOpen: boolean) => void; - isItemMetadataMenuOpen: boolean; - setIsItemMetadataMenuOpen: (isOpen: boolean) => void; isChatboxMenuOpen: boolean; setIsChatboxMenuOpen: (isOpen: boolean) => void; } @@ -31,10 +29,6 @@ export const LayoutContext = createContext({ setIsMainMenuOpen: () => { // do nothing }, - isItemMetadataMenuOpen: false, - setIsItemMetadataMenuOpen: () => { - // do nothing - }, isChatboxMenuOpen: false, setIsChatboxMenuOpen: () => { // do nothing @@ -55,7 +49,6 @@ export const LayoutContextProvider = ({ const [isMainMenuOpen, setIsMainMenuOpen] = useState(true); - const [isItemMetadataMenuOpen, setIsItemMetadataMenuOpen] = useState(false); // check query params to see if chat should be open const chatIsOpen = new URLSearchParams(window.location.search).get('chat') === ChatStatus.Open; @@ -69,18 +62,10 @@ export const LayoutContextProvider = ({ setEditingItemId, isMainMenuOpen, setIsMainMenuOpen, - isItemMetadataMenuOpen, - setIsItemMetadataMenuOpen, isChatboxMenuOpen, setIsChatboxMenuOpen, }), - [ - editingItemId, - isChatboxMenuOpen, - isItemMetadataMenuOpen, - isMainMenuOpen, - mode, - ], + [editingItemId, isChatboxMenuOpen, isMainMenuOpen, mode], ); return ( diff --git a/src/components/item/ItemMain.tsx b/src/components/item/ItemMain.tsx index f826c6a8a..023a3c0b0 100644 --- a/src/components/item/ItemMain.tsx +++ b/src/components/item/ItemMain.tsx @@ -9,7 +9,6 @@ import { ITEM_MAIN_CLASS } from '../../config/selectors'; import { BUILDER } from '../../langs/constants'; import Chatbox from '../common/Chatbox'; import { useLayoutContext } from '../context/LayoutContext'; -import ItemMetadataContent from './ItemMetadataContent'; import ItemPanel from './ItemPanel'; import ItemHeader from './header/ItemHeader'; @@ -57,13 +56,8 @@ type Props = { const ItemMain = ({ id, children, item }: Props): JSX.Element => { const { t: translateBuilder } = useBuilderTranslation(); - const { - isItemMetadataMenuOpen, - setIsItemMetadataMenuOpen, - isChatboxMenuOpen, - setIsChatboxMenuOpen, - isMainMenuOpen, - } = useLayoutContext(); + const { isChatboxMenuOpen, setIsChatboxMenuOpen, isMainMenuOpen } = + useLayoutContext(); return ( @@ -84,23 +78,7 @@ const ItemMain = ({ id, children, item }: Props): JSX.Element => { )} - - { - setIsItemMetadataMenuOpen(false); - }} - // todo - direction="rtl" - > - - {translateBuilder(BUILDER.ITEM_METADATA_TITLE)} - - - - - - - + {children} diff --git a/src/components/item/ItemMemberships.tsx b/src/components/item/ItemMemberships.tsx index 1e3a5e3ab..5e96ad76d 100644 --- a/src/components/item/ItemMemberships.tsx +++ b/src/components/item/ItemMemberships.tsx @@ -17,15 +17,10 @@ import { useCurrentUserContext } from '../context/CurrentUserContext'; type Props = { id?: string; - onClick: () => void; maxAvatar?: number; }; -const ItemMemberships = ({ - id, - maxAvatar = 2, - onClick, -}: Props): JSX.Element | null => { +const ItemMemberships = ({ id, maxAvatar = 2 }: Props): JSX.Element | null => { const { t: translateBuilder } = useBuilderTranslation(); const { data: memberships, isError } = hooks.useItemMemberships(id); const { data: currentUser } = useCurrentUserContext(); @@ -57,7 +52,7 @@ const ItemMemberships = ({ })} aria-label={translateBuilder(BUILDER.SHARED_MEMBERS_LABEL)} > - + {filteredMemberships.map(({ member, permission }) => { const badgeContent = permission === PermissionLevel.Read ? ( diff --git a/src/components/item/ItemMetadataContent.tsx b/src/components/item/ItemMetadataContent.tsx index 4afd1ef24..42cd577db 100644 --- a/src/components/item/ItemMetadataContent.tsx +++ b/src/components/item/ItemMetadataContent.tsx @@ -1,3 +1,4 @@ +import { Container } from '@mui/material'; import Table from '@mui/material/Table'; import TableBody from '@mui/material/TableBody'; import TableCell from '@mui/material/TableCell'; @@ -24,8 +25,8 @@ import { ITEM_PANEL_TABLE_ID, } from '../../config/selectors'; import { BUILDER } from '../../langs/constants'; -import { useLayoutContext } from '../context/LayoutContext'; import ItemMemberships from './ItemMemberships'; +import ThumbnailSetting from './settings/ThumbnailSetting'; const { useMember } = hooks; @@ -37,13 +38,8 @@ const ItemMetadataContent = ({ item }: Props): JSX.Element => { const { t: translateBuilder } = useBuilderTranslation(); const { t: translateCommon } = useCommonTranslation(); - const { setIsItemMetadataMenuOpen } = useLayoutContext(); const { data: creator } = useMember(item?.creator?.id); - const onClick = () => { - setIsItemMetadataMenuOpen(true); - }; - let size = null; let mimetype = null; if (item.type === ItemType.S3_FILE) { @@ -75,7 +71,9 @@ const ItemMetadataContent = ({ item }: Props): JSX.Element => { }; return ( - <> + + + {item.name} @@ -132,8 +130,8 @@ const ItemMetadataContent = ({ item }: Props): JSX.Element => { - - + + ); }; diff --git a/src/components/item/header/ItemHeaderActions.tsx b/src/components/item/header/ItemHeaderActions.tsx index d4ec4b940..3ec66dad5 100644 --- a/src/components/item/header/ItemHeaderActions.tsx +++ b/src/components/item/header/ItemHeaderActions.tsx @@ -32,12 +32,8 @@ type Props = { const ItemHeaderActions = ({ item }: Props): JSX.Element => { const { t: translateBuilder } = useBuilderTranslation(); - const { - editingItemId, - isChatboxMenuOpen, - setIsChatboxMenuOpen, - setIsItemMetadataMenuOpen, - } = useLayoutContext(); + const { editingItemId, isChatboxMenuOpen, setIsChatboxMenuOpen } = + useLayoutContext(); const { data: member } = useCurrentUserContext(); @@ -55,7 +51,6 @@ const ItemHeaderActions = ({ item }: Props): JSX.Element => { const onClickChatbox = () => { setIsChatboxMenuOpen(!isChatboxMenuOpen); - setIsItemMetadataMenuOpen(false); }; const renderItemActions = () => { @@ -101,7 +96,7 @@ const ItemHeaderActions = ({ item }: Props): JSX.Element => { // show only for content with tables : root or folders (item?.type === ItemType.FOLDER || !item?.id) && } - {item?.id && } + {item?.id && } ); }; diff --git a/src/components/item/settings/ItemSettings.tsx b/src/components/item/settings/ItemSettings.tsx index e2b85fec6..c55791da7 100644 --- a/src/components/item/settings/ItemSettings.tsx +++ b/src/components/item/settings/ItemSettings.tsx @@ -1,12 +1,21 @@ import { useEffect, useState } from 'react'; +import { Link } from 'react-router-dom'; import InfoIcon from '@mui/icons-material/Info'; -import { FormControlLabel, FormGroup, Switch, Tooltip } from '@mui/material'; +import { + Alert, + FormControlLabel, + FormGroup, + Switch, + Tooltip, +} from '@mui/material'; import Container from '@mui/material/Container'; import Typography from '@mui/material/Typography'; import { DiscriminatedItem, ItemType } from '@graasp/sdk'; +import { buildItemInformationPath } from '@/config/paths'; + import { DEFAULT_COLLAPSIBLE_SETTING, DEFAULT_PINNED_SETTING, @@ -27,7 +36,6 @@ import { BUILDER } from '../../../langs/constants'; import AdminChatSettings from './AdminChatSettings'; import FileSettings from './FileSettings'; import LinkSettings from './LinkSettings'; -import ThumbnailSetting from './ThumbnailSetting'; type Props = { item: DiscriminatedItem; @@ -203,6 +211,12 @@ const ItemSettings = ({ item }: Props): JSX.Element => { return ( + + {translateBuilder(BUILDER.UPDATE_THUMBNAIL_AT_INFO_ALERT)}{' '} + + {translateBuilder(BUILDER.UPDATE_THUMBNAIL_LINK_TEXT)} + + {translateBuilder(BUILDER.SETTINGS_TITLE)} @@ -215,7 +229,6 @@ const ItemSettings = ({ item }: Props): JSX.Element => { {renderSaveActionsSetting()} {renderSettingsPerType()} - ); diff --git a/src/components/item/settings/ThumbnailSetting.tsx b/src/components/item/settings/ThumbnailSetting.tsx index 84748732b..382201549 100644 --- a/src/components/item/settings/ThumbnailSetting.tsx +++ b/src/components/item/settings/ThumbnailSetting.tsx @@ -120,22 +120,10 @@ const ThumbnailSetting = ({ item }: Props): JSX.Element | null => { {uppy && ( )} - + {translateBuilder(BUILDER.SETTINGS_THUMBNAIL_TITLE)} - - {translateBuilder(BUILDER.SETTINGS_THUMBNAIL_SETTINGS_INFORMATIONS)} - - { maxWidth={THUMBNAIL_SETTING_MAX_WIDTH} maxHeight={THUMBNAIL_SETTING_MAX_HEIGHT} /> + + + {translateBuilder(BUILDER.SETTINGS_THUMBNAIL_SETTINGS_INFORMATIONS)} + {fileSource && ( { + const { item } = useOutletContext(); + + const navigate = useNavigate(); + const itemId = useShortenURLParams(ITEM_ID_PARAMS); + + const { t: translateBuilder } = useBuilderTranslation(); + + return ( + + + + + + + + ); +}; + +const WrappedItemInformationScreen = (): JSX.Element => + WrappedItemScreen(ItemInformationScreen); + +export default WrappedItemInformationScreen; diff --git a/src/components/main/ItemScreens/ItemScreen.tsx b/src/components/main/ItemScreens/ItemScreen.tsx index 4b9bc485b..166a10aff 100644 --- a/src/components/main/ItemScreens/ItemScreen.tsx +++ b/src/components/main/ItemScreens/ItemScreen.tsx @@ -1,6 +1,9 @@ import React from 'react'; import { useOutletContext } from 'react-router'; +import { ItemType } from '@graasp/sdk'; + +import FileUploader from '@/components/file/FileUploader'; import ItemContent from '@/components/item/ItemContent'; import ItemMain from '@/components/item/ItemMain'; @@ -10,9 +13,12 @@ const ItemPage = (): JSX.Element => { const { item, permission } = useOutletContext(); return ( - - - + <> + {item.type === ItemType.FOLDER ? : undefined} + + + + ); }; diff --git a/src/components/main/ItemScreens/ItemScreenLayout.tsx b/src/components/main/ItemScreens/ItemScreenLayout.tsx index 425cb9f53..f2852232c 100644 --- a/src/components/main/ItemScreens/ItemScreenLayout.tsx +++ b/src/components/main/ItemScreens/ItemScreenLayout.tsx @@ -1,7 +1,6 @@ import { useEffect } from 'react'; import { Outlet } from 'react-router'; -import { ItemType } from '@graasp/sdk'; import { Loader, useShortenURLParams } from '@graasp/ui'; import { ITEM_ID_PARAMS } from '@/config/paths'; @@ -12,7 +11,6 @@ import { getHighestPermissionForMemberFromMemberships } from '../../../utils/mem import ErrorAlert from '../../common/ErrorAlert'; import { useCurrentUserContext } from '../../context/CurrentUserContext'; import { useLayoutContext } from '../../context/LayoutContext'; -import FileUploader from '../../file/FileUploader'; import { UppyContextProvider } from '../../file/UppyContext'; import Main from '../Main'; import WrappedAuthItemScreen from './WrappedItemScreen'; @@ -56,7 +54,6 @@ const ItemScreen = (): JSX.Element => { return (
- {item.type === ItemType.FOLDER ? : undefined}
diff --git a/src/config/paths.ts b/src/config/paths.ts index 8a2eeedd9..bfaf47f82 100644 --- a/src/config/paths.ts +++ b/src/config/paths.ts @@ -12,9 +12,12 @@ export const ITEM_ID_PARAMS = 'itemId'; export const SHARE_PATH = 'share'; export const PUBLISH_PATH = 'publish'; export const SETTINGS_PATH = 'settings'; +export const INFORMATION_PATH = 'information'; export const buildItemSettingsPath = (id = ':itemId'): string => `${ITEMS_PATH}/${id}/${SETTINGS_PATH}`; export const buildItemSharePath = (id = ':itemId'): string => `${ITEMS_PATH}/${id}/${SHARE_PATH}`; export const buildItemPublishPath = (id = ':itemId'): string => `${ITEMS_PATH}/${id}/${PUBLISH_PATH}`; +export const buildItemInformationPath = (id = ':itemId'): string => + `${ITEMS_PATH}/${id}/${INFORMATION_PATH}`; diff --git a/src/langs/constants.ts b/src/langs/constants.ts index 87339e1c7..a1f37ea00 100644 --- a/src/langs/constants.ts +++ b/src/langs/constants.ts @@ -364,4 +364,6 @@ export const BUILDER = { "You can also find the items of this page in ''My Graasp''. This page will be unavailable soon.": "You can also find the items of this page in ''My Graasp''. This page will be unavailable soon.", BACK: 'BACK', + UPDATE_THUMBNAIL_AT_INFO_ALERT: 'UPDATE_THUMBNAIL_AT_INFO_ALERT', + UPDATE_THUMBNAIL_LINK_TEXT: 'UPDATE_THUMBNAIL_LINK_TEXT', }; diff --git a/src/langs/en.json b/src/langs/en.json index b784df833..9859a1f9a 100644 --- a/src/langs/en.json +++ b/src/langs/en.json @@ -303,5 +303,7 @@ "ROOT": "Root", "ITEM_SELECTION_NAVIGATION_RECENT_ITEMS": "Recent Items", "ITEM_SELECTION_NAVIGATION_PARENT": "Move above", - "BACK": "Back" + "BACK": "Back", + "UPDATE_THUMBNAIL_AT_INFO_ALERT": "Update thumbnail moved to information page,", + "UPDATE_THUMBNAIL_LINK_TEXT": "Check Here" }