diff --git a/package.json b/package.json index acdb97b75..fae246be8 100644 --- a/package.json +++ b/package.json @@ -18,10 +18,10 @@ "@emotion/react": "11.11.1", "@emotion/styled": "11.11.0", "@graasp/chatbox": "3.0.1", - "@graasp/query-client": "2.2.1", - "@graasp/sdk": "3.3.0", - "@graasp/translations": "1.21.1", - "@graasp/ui": "4.3.0", + "@graasp/query-client": "2.3.0", + "@graasp/sdk": "3.4.1", + "@graasp/translations": "1.22.1", + "@graasp/ui": "4.3.1", "@mui/icons-material": "5.14.19", "@mui/lab": "5.0.0-alpha.151", "@mui/material": "5.14.19", @@ -145,7 +145,7 @@ "prettier": "3.1.0", "rollup-plugin-visualizer": "5.11.0", "typescript": "5.3.2", - "vite": "5.0.5", + "vite": "5.0.12", "vite-plugin-checker": "0.6.2", "vite-plugin-istanbul": "5.0.0" }, diff --git a/src/components/common/PlayerViewButton.tsx b/src/components/common/PlayerViewButton.tsx index dc469de4f..182b252b1 100644 --- a/src/components/common/PlayerViewButton.tsx +++ b/src/components/common/PlayerViewButton.tsx @@ -22,7 +22,7 @@ const PlayerViewButton = ({ itemId }: Props): JSX.Element => { const { t: translateBuilder } = useBuilderTranslation(); const onClick = () => { - redirect(buildGraaspPlayerView(itemId), { + redirect(window, buildGraaspPlayerView(itemId), { name: buildPlayerTabName(itemId), openInNewTab: true, }); diff --git a/src/components/item/publish/ItemPublishTab.tsx b/src/components/item/publish/ItemPublishTab.tsx index 98526f116..29aacdece 100644 --- a/src/components/item/publish/ItemPublishTab.tsx +++ b/src/components/item/publish/ItemPublishTab.tsx @@ -188,7 +188,7 @@ const ItemPublishTab = ({ const handleClick = () => { const url = CC_LICENSE_ABOUT_URL; - redirect(url, { openInNewTab: true }); + redirect(window, url, { openInNewTab: true }); }; const displayItemValidationMessage = () => { diff --git a/src/components/item/sharing/ItemSharingTab.tsx b/src/components/item/sharing/ItemSharingTab.tsx index 937b44385..dd17838fc 100644 --- a/src/components/item/sharing/ItemSharingTab.tsx +++ b/src/components/item/sharing/ItemSharingTab.tsx @@ -6,6 +6,7 @@ import Typography from '@mui/material/Typography'; import { DiscriminatedItem, ItemMembership, + PermissionLevelCompare, isPseudonymizedMember, } from '@graasp/sdk'; import { Loader } from '@graasp/ui'; @@ -32,6 +33,27 @@ type Props = { item: DiscriminatedItem; memberships?: ItemMembership[]; }; +interface PermissionMap { + [key: string]: ItemMembership; +} + +const selectHighestMemberships = ( + memberships: ItemMembership[], +): ItemMembership[] => { + const permissionMap = memberships.reduce((acc, curr) => { + const { member, permission } = curr; + + if ( + !acc[member.id] || + PermissionLevelCompare.gt(permission, acc[member.id].permission) + ) { + acc[member.id] = curr; + } + return acc; + }, {}); + + return Object.values(permissionMap); +}; const ItemSharingTab = ({ item, memberships }: Props): JSX.Element => { const { t: translateBuilder } = useBuilderTranslation(); @@ -89,7 +111,7 @@ const ItemSharingTab = ({ item, memberships }: Props): JSX.Element => { emptyMessage={translateBuilder( BUILDER.SHARING_AUTHORIZED_MEMBERS_EMPTY_MESSAGE, )} - memberships={authorizedMemberships} + memberships={selectHighestMemberships(authorizedMemberships)} readOnly={!canEditSettings} /> @@ -104,7 +126,7 @@ const ItemSharingTab = ({ item, memberships }: Props): JSX.Element => { { useEffect(() => { - redirectToSavedUrl(HOME_PATH); + redirectToSavedUrl(window, HOME_PATH); }, []); return ; diff --git a/src/components/main/itemSelectionModal/AccessibleNavigationTree.tsx b/src/components/main/itemSelectionModal/AccessibleNavigationTree.tsx index 094441ec5..9f11f1a6a 100644 --- a/src/components/main/itemSelectionModal/AccessibleNavigationTree.tsx +++ b/src/components/main/itemSelectionModal/AccessibleNavigationTree.tsx @@ -2,6 +2,8 @@ import { useState } from 'react'; import { Pagination, Stack } from '@mui/material'; +import { PermissionLevel } from '@graasp/sdk'; + import { hooks } from '@/config/queryClient'; import RowMenu, { RowMenuProps } from './RowMenu'; @@ -24,7 +26,10 @@ const AccessibleNavigationTree = ({ // todo: to change with real recent items (most used) const [page, setPage] = useState(1); // todo: show only items with admin rights - const { data: accessibleItems } = hooks.useAccessibleItems({}, { page }); + const { data: accessibleItems } = hooks.useAccessibleItems( + { permissions: [PermissionLevel.Write, PermissionLevel.Admin] }, + { page }, + ); const nbPages = accessibleItems ? Math.ceil(accessibleItems.totalCount / PAGE_SIZE) diff --git a/src/components/main/itemSelectionModal/RootNavigationTree.tsx b/src/components/main/itemSelectionModal/RootNavigationTree.tsx index 438afd766..0efd7db5c 100644 --- a/src/components/main/itemSelectionModal/RootNavigationTree.tsx +++ b/src/components/main/itemSelectionModal/RootNavigationTree.tsx @@ -1,6 +1,6 @@ import { Typography } from '@mui/material'; -import { DiscriminatedItem, ItemType } from '@graasp/sdk'; +import { DiscriminatedItem, ItemType, PermissionLevel } from '@graasp/sdk'; import { useBuilderTranslation } from '@/config/i18n'; import { hooks } from '@/config/queryClient'; @@ -29,7 +29,11 @@ const RootNavigationTree = ({ const { t: translateBuilder } = useBuilderTranslation(); // todo: to change with real recent items (most used) - const { data: recentItems } = hooks.useAccessibleItems({}, { pageSize: 5 }); + const { data: recentItems } = hooks.useAccessibleItems( + // you can move into an item you have at least write permission + { permissions: [PermissionLevel.Admin, PermissionLevel.Write] }, + { pageSize: 5 }, + ); const recentFolders = recentItems?.data?.filter( ({ type }) => type === ItemType.FOLDER, ); diff --git a/src/langs/ar.json b/src/langs/ar.json index 12b02bc71..aaadc4611 100644 --- a/src/langs/ar.json +++ b/src/langs/ar.json @@ -116,7 +116,7 @@ "ITEM_SETTINGS_VISIBILITY_PSEUDONYMIZED_LABEL": "اسم مستعار", "ITEM_SETTINGS_VISIBILITY_PSEUDONYMIZED_SCHEMA_PSEUDONYM_AND_PASSWORD_LABEL": "الأُسم المستعار وكلمة المرور", "ITEM_SETTINGS_VISIBILITY_PSEUDONYMIZED_SCHEMA_PSEUDONYM_LABEL": "الأُسم المستعار", - "ITEM_SETTINGS_VISIBILITY_PSEUDONYMIZED_SCHEMA_SELECT_MESSSAGE": "يمكن الوصول إلى هذا العنصر إذا قدم الزائر ملفًا", + "ITEM_SETTINGS_VISIBILITY_PSEUDONYMIZED_SCHEMA_SELECT_MESSAGE": "يمكن الوصول إلى هذا العنصر إذا قدم الزائر ملفًا", "ITEM_SETTINGS_VISIBILITY_PUBLIC_INFORMATIONS": "هذا العنصر عام. يمكن لأي شخص الوصول إليه.\n ملاحظة: لن يتم نشر العناصر تلقائيًا إذا قمت بتغيير حالة الظهور من عام إلى آخرين.", "ITEM_SETTINGS_VISIBILITY_PUBLIC_LABEL": "عام", "ITEM_SETTINGS_VISIBILITY_TITLE": "حالة الظّهور", diff --git a/src/langs/de.json b/src/langs/de.json index bd3a03015..e65eaedf9 100644 --- a/src/langs/de.json +++ b/src/langs/de.json @@ -116,7 +116,7 @@ "ITEM_SETTINGS_VISIBILITY_PSEUDONYMIZED_LABEL": "Zugriff mit Pseudonym", "ITEM_SETTINGS_VISIBILITY_PSEUDONYMIZED_SCHEMA_PSEUDONYM_AND_PASSWORD_LABEL": "Pseudonym und Passwort", "ITEM_SETTINGS_VISIBILITY_PSEUDONYMIZED_SCHEMA_PSEUDONYM_LABEL": "Pseudonym", - "ITEM_SETTINGS_VISIBILITY_PSEUDONYMIZED_SCHEMA_SELECT_MESSSAGE": "Auf dieses Element kann zugegriffen werden, wenn der Besucher eine angibt", + "ITEM_SETTINGS_VISIBILITY_PSEUDONYMIZED_SCHEMA_SELECT_MESSAGE": "Auf dieses Element kann zugegriffen werden, wenn der Besucher eine angibt", "ITEM_SETTINGS_VISIBILITY_PUBLIC_INFORMATIONS": "Dieser Artikel ist öffentlich. Jeder kann darauf zugreifen.\n Hinweis: Die Veröffentlichung von Elementen wird automatisch aufgehoben, wenn Sie den Sichtbarkeitsstatus von „Öffentlich“ auf „Andere“ ändern.", "ITEM_SETTINGS_VISIBILITY_PUBLIC_LABEL": "Öffentlich zugänglich", "ITEM_SETTINGS_VISIBILITY_TITLE": "Sichtbarkeit", diff --git a/src/langs/en.json b/src/langs/en.json index 3b41f0742..43afc5312 100644 --- a/src/langs/en.json +++ b/src/langs/en.json @@ -116,7 +116,7 @@ "ITEM_SETTINGS_VISIBILITY_PSEUDONYMIZED_LABEL": "Pseudonymized", "ITEM_SETTINGS_VISIBILITY_PSEUDONYMIZED_SCHEMA_PSEUDONYM_AND_PASSWORD_LABEL": "Pseudonym and Password", "ITEM_SETTINGS_VISIBILITY_PSEUDONYMIZED_SCHEMA_PSEUDONYM_LABEL": "Pseudonym", - "ITEM_SETTINGS_VISIBILITY_PSEUDONYMIZED_SCHEMA_SELECT_MESSSAGE": "This item is accessible if the visitor provides a ", + "ITEM_SETTINGS_VISIBILITY_PSEUDONYMIZED_SCHEMA_SELECT_MESSAGE": "This item is accessible if the visitor provides a ", "ITEM_SETTINGS_VISIBILITY_PUBLIC_INFORMATIONS": "This item is public. Anyone can access it.\n Note: Items will be unpublished automatically if you change the visibility state from public to others.", "ITEM_SETTINGS_VISIBILITY_PUBLIC_LABEL": "Public", "ITEM_SETTINGS_VISIBILITY_TITLE": "Visibility", diff --git a/src/langs/es.json b/src/langs/es.json index efe9f8205..e1ed9cade 100644 --- a/src/langs/es.json +++ b/src/langs/es.json @@ -116,7 +116,7 @@ "ITEM_SETTINGS_VISIBILITY_PSEUDONYMIZED_LABEL": "Seudónimo", "ITEM_SETTINGS_VISIBILITY_PSEUDONYMIZED_SCHEMA_PSEUDONYM_AND_PASSWORD_LABEL": "Seudónimo y Contraseña", "ITEM_SETTINGS_VISIBILITY_PSEUDONYMIZED_SCHEMA_PSEUDONYM_LABEL": "Seudónimo", - "ITEM_SETTINGS_VISIBILITY_PSEUDONYMIZED_SCHEMA_SELECT_MESSSAGE": "Este elemento es accesible si el visitante proporciona una", + "ITEM_SETTINGS_VISIBILITY_PSEUDONYMIZED_SCHEMA_SELECT_MESSAGE": "Este elemento es accesible si el visitante proporciona una", "ITEM_SETTINGS_VISIBILITY_PUBLIC_INFORMATIONS": "Este artículo es público. Cualquiera puede acceder a él.\n Nota: Los elementos dejarán de publicarse automáticamente si cambia el estado de visibilidad de público a otros.", "ITEM_SETTINGS_VISIBILITY_PUBLIC_LABEL": "Público", "ITEM_SETTINGS_VISIBILITY_TITLE": "Visibilidad", diff --git a/src/langs/fr.json b/src/langs/fr.json index 7b25b0f66..6cb80fa07 100644 --- a/src/langs/fr.json +++ b/src/langs/fr.json @@ -116,7 +116,7 @@ "ITEM_SETTINGS_VISIBILITY_PSEUDONYMIZED_LABEL": "Pseudomisé", "ITEM_SETTINGS_VISIBILITY_PSEUDONYMIZED_SCHEMA_PSEUDONYM_AND_PASSWORD_LABEL": "Pseudonyme et Mot de passe", "ITEM_SETTINGS_VISIBILITY_PSEUDONYMIZED_SCHEMA_PSEUDONYM_LABEL": "Pseudonyme", - "ITEM_SETTINGS_VISIBILITY_PSEUDONYMIZED_SCHEMA_SELECT_MESSSAGE": "Cet élément est accessible si le visiteur fournit un", + "ITEM_SETTINGS_VISIBILITY_PSEUDONYMIZED_SCHEMA_SELECT_MESSAGE": "Cet élément est accessible si le visiteur fournit un", "ITEM_SETTINGS_VISIBILITY_PUBLIC_INFORMATIONS": "Cet élément est public. N'importe quel visiteur peut accéder à cet élément.", "ITEM_SETTINGS_VISIBILITY_PUBLIC_LABEL": "Public", "ITEM_SETTINGS_VISIBILITY_TITLE": "Visibilité", diff --git a/src/langs/it.json b/src/langs/it.json index c38f993c3..a3e661319 100644 --- a/src/langs/it.json +++ b/src/langs/it.json @@ -116,7 +116,7 @@ "ITEM_SETTINGS_VISIBILITY_PSEUDONYMIZED_LABEL": "Pseudonimizzato", "ITEM_SETTINGS_VISIBILITY_PSEUDONYMIZED_SCHEMA_PSEUDONYM_AND_PASSWORD_LABEL": "Pseudonimo e password", "ITEM_SETTINGS_VISIBILITY_PSEUDONYMIZED_SCHEMA_PSEUDONYM_LABEL": "Pseudonimo", - "ITEM_SETTINGS_VISIBILITY_PSEUDONYMIZED_SCHEMA_SELECT_MESSSAGE": "Questo elemento è accessibile se il visitatore fornisce a", + "ITEM_SETTINGS_VISIBILITY_PSEUDONYMIZED_SCHEMA_SELECT_MESSAGE": "Questo elemento è accessibile se il visitatore fornisce a", "ITEM_SETTINGS_VISIBILITY_PUBLIC_INFORMATIONS": "Questo elemento è pubblico. Chiunque può accedervi.\n Nota: la pubblicazione degli elementi verrà annullata automaticamente se si modifica lo stato di visibilità da pubblico ad altri.", "ITEM_SETTINGS_VISIBILITY_PUBLIC_LABEL": "Pubblico", "ITEM_SETTINGS_VISIBILITY_TITLE": "Visibilità", diff --git a/yarn.lock b/yarn.lock index 99ee242a1..a972607ef 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1233,12 +1233,12 @@ __metadata: languageName: node linkType: hard -"@graasp/query-client@npm:2.2.1": - version: 2.2.1 - resolution: "@graasp/query-client@npm:2.2.1" +"@graasp/query-client@npm:2.3.0": + version: 2.3.0 + resolution: "@graasp/query-client@npm:2.3.0" dependencies: - "@graasp/sdk": "npm:3.3.0" - "@graasp/translations": "npm:1.21.1" + "@graasp/sdk": "npm:3.4.1" + "@graasp/translations": "npm:1.22.1" axios: "npm:0.27.2" crypto-js: "npm:4.2.0" http-status-codes: "npm:2.3.0" @@ -1247,7 +1247,7 @@ __metadata: uuid: "npm:9.0.1" peerDependencies: react: ^17.0.0 || ^18.0.0 - checksum: bad1c3a4163f38e45f0f64d8beb28eb6ca6fd4cf123d971be9421a6012d0d2860c71cc0c71b14bf7d46ea3afe73355a32823e037d0216caa8154905d0d408f8f + checksum: 7cbf30cc71c27e19b50d896899b2bed3de924c4d7b0d09346198ee07c0d640261908fdb718cce11b00888f2333b581e175ca2d31bac766163b27ef069a29abfa languageName: node linkType: hard @@ -1264,25 +1264,24 @@ __metadata: languageName: node linkType: hard -"@graasp/sdk@npm:3.4.0": - version: 3.4.0 - resolution: "@graasp/sdk@npm:3.4.0" +"@graasp/sdk@npm:3.4.1": + version: 3.4.1 + resolution: "@graasp/sdk@npm:3.4.1" dependencies: - "@graasp/etherpad-api": "npm:2.1.1" date-fns: "npm:3.2.0" js-cookie: "npm:3.0.5" uuid: "npm:9.0.1" validator: "npm:13.11.0" - checksum: 00bd8d449e8c1bcb4750ddce9dc0eefc23d917d042d5d7db6c1007c7380904de3bc7e9bde43325736df69f3dc584d15717dac01769e06a9f71e1e1133075f7f7 + checksum: 6bf2d3fbb28d61a457a534628620982a656258ab2e5c101294da8e7e4327eacff526378983c4e06a85f0115e0547325f9dbece793f7f4bc6129aa8909a42a24b languageName: node linkType: hard -"@graasp/translations@npm:1.21.1": - version: 1.21.1 - resolution: "@graasp/translations@npm:1.21.1" +"@graasp/translations@npm:1.22.1": + version: 1.22.1 + resolution: "@graasp/translations@npm:1.22.1" dependencies: - i18next: "npm:23.7.7" - checksum: d95ac9cf2f2a587d6779d5b28f9c95f2f5410d3d28235b78cdf4e8ad36acd6b6ca4ac90831a6b28fecd91c6fad080f1230ab72c88295cf7742725bfa8a10c416 + i18next: "npm:23.7.16" + checksum: 29043007a9926ff54236101c41ceb92eead09d8ce99edf46943790171f3275fb2cc1acd552bfa605247c42b4866bbf1f83dd889da3f571d388eca5f2dd598e17 languageName: node linkType: hard @@ -1295,11 +1294,11 @@ __metadata: languageName: node linkType: hard -"@graasp/ui@npm:4.3.0": - version: 4.3.0 - resolution: "@graasp/ui@npm:4.3.0" +"@graasp/ui@npm:4.3.1": + version: 4.3.1 + resolution: "@graasp/ui@npm:4.3.1" dependencies: - "@graasp/sdk": "npm:3.4.0" + "@graasp/sdk": "npm:3.4.1" http-status-codes: "npm:2.3.0" katex: "npm:0.16.9" lodash.truncate: "npm:4.4.2" @@ -1332,7 +1331,7 @@ __metadata: optional: true ag-grid-react: optional: true - checksum: 5538861e5d4d58e6105bb0e84d03238eecbc28bf5c2112557ed7ca5725a3025a4c09e06f4f050b9805595256c5227081696c12a90fc0e266fb8801d4c895d28d + checksum: b5cf0290dda520c2bd65c2834c415ac3d376569a2a2765f1b1bd855cb1a8e5d582c94213433383b8b632f598007d96a774cbacf10702f3c14f1def563e677409 languageName: node linkType: hard @@ -6311,10 +6310,10 @@ __metadata: "@emotion/react": "npm:11.11.1" "@emotion/styled": "npm:11.11.0" "@graasp/chatbox": "npm:3.0.1" - "@graasp/query-client": "npm:2.2.1" - "@graasp/sdk": "npm:3.3.0" - "@graasp/translations": "npm:1.21.1" - "@graasp/ui": "npm:4.3.0" + "@graasp/query-client": "npm:2.3.0" + "@graasp/sdk": "npm:3.4.1" + "@graasp/translations": "npm:1.22.1" + "@graasp/ui": "npm:4.3.1" "@mui/icons-material": "npm:5.14.19" "@mui/lab": "npm:5.0.0-alpha.151" "@mui/material": "npm:5.14.19" @@ -6398,7 +6397,7 @@ __metadata: typescript: "npm:5.3.2" uuid: "npm:9.0.1" validator: "npm:13.11.0" - vite: "npm:5.0.5" + vite: "npm:5.0.12" vite-plugin-checker: "npm:0.6.2" vite-plugin-istanbul: "npm:5.0.0" languageName: unknown @@ -6686,12 +6685,12 @@ __metadata: languageName: node linkType: hard -"i18next@npm:23.7.7": - version: 23.7.7 - resolution: "i18next@npm:23.7.7" +"i18next@npm:23.7.16": + version: 23.7.16 + resolution: "i18next@npm:23.7.16" dependencies: "@babel/runtime": "npm:^7.23.2" - checksum: c8d112f5bbe62b3402b0fc47094f85e6ae6f939ff0b3299c5f2b3d30e05125184ae3faa10abfc14e21ea7f8dc78526455c251dc7e5eb40cf1a204257f22e6071 + checksum: 77e74c07a73316f6fb6678a5a3e8ce58a6e66be457dd1ccd23941e9fc57ad8e1da55193fa6328c70b86073337b776cd267f3c13c6309f548b3116f27a1e41787 languageName: node linkType: hard @@ -11843,9 +11842,9 @@ __metadata: languageName: node linkType: hard -"vite@npm:5.0.5": - version: 5.0.5 - resolution: "vite@npm:5.0.5" +"vite@npm:5.0.12": + version: 5.0.12 + resolution: "vite@npm:5.0.12" dependencies: esbuild: "npm:^0.19.3" fsevents: "npm:~2.3.3" @@ -11879,7 +11878,7 @@ __metadata: optional: true bin: vite: bin/vite.js - checksum: f4cd6e6e38448bdb6dd4dc36c0b34a5c42944d88961b9df246e75a4c3237196b1c64b1afc563524405d1fe3f34e728b9dbfd8cbc5af4e0a03371033d8057fdfe + checksum: ed0bb26a0d0c8e1dae0b70af9e36adffd7e15d80297443fe4da762596dc81570bad7f0291f590a57c1553f5e435338d8c7ffc483bd9431a95c09d9ac90665fad languageName: node linkType: hard