diff --git a/cypress/e2e/item/trash/delete.cy.ts b/cypress/e2e/item/trash/delete.cy.ts index ed970696e..bc705094c 100644 --- a/cypress/e2e/item/trash/delete.cy.ts +++ b/cypress/e2e/item/trash/delete.cy.ts @@ -40,7 +40,6 @@ describe('Delete Items', () => { cy.wait('@deleteItems').then(({ request: { url } }) => { expect(url).to.contain(id); }); - cy.wait('@getRecycledItems'); }); it('delete many items', () => { diff --git a/cypress/e2e/item/trash/restore.cy.ts b/cypress/e2e/item/trash/restore.cy.ts index 55e00a214..573074237 100644 --- a/cypress/e2e/item/trash/restore.cy.ts +++ b/cypress/e2e/item/trash/restore.cy.ts @@ -36,7 +36,6 @@ describe('Restore Items', () => { cy.wait('@restoreItems').then(({ request: { url } }) => { expect(url).to.contain(id); }); - cy.wait('@getRecycledItems'); }); it('restore many items', () => { diff --git a/cypress/e2e/item/trash/viewTrash.cy.ts b/cypress/e2e/item/trash/viewTrash.cy.ts index 9ae82072f..d53d2c36f 100644 --- a/cypress/e2e/item/trash/viewTrash.cy.ts +++ b/cypress/e2e/item/trash/viewTrash.cy.ts @@ -5,20 +5,14 @@ import { PackedRecycledItemDataFactory, } from '@graasp/sdk'; -import { SortingOptions } from '@/components/table/types'; import { BUILDER } from '@/langs/constants'; import i18n, { BUILDER_NAMESPACE } from '../../../../src/config/i18n'; import { RECYCLE_BIN_PATH } from '../../../../src/config/paths'; import { - CREATE_ITEM_BUTTON_ID, - ITEM_SEARCH_INPUT_ID, PREVENT_GUEST_MESSAGE_ID, RECYCLED_ITEMS_ERROR_ALERT_ID, RECYCLED_ITEMS_ROOT_CONTAINER, - SORTING_ORDERING_SELECTOR_ASC, - SORTING_ORDERING_SELECTOR_DESC, - SORTING_SELECT_SELECTOR, buildItemCard, } from '../../../../src/config/selectors'; import { CURRENT_USER } from '../../../fixtures/members'; @@ -62,55 +56,11 @@ describe('View trash', () => { cy.visit(RECYCLE_BIN_PATH); }); - it('Empty search', () => { - i18n.changeLanguage(CURRENT_USER.extra.lang as string); - const searchText = 'mysearch'; - cy.get(`#${ITEM_SEARCH_INPUT_ID}`).type(searchText); - const text = i18n.t(BUILDER.TRASH_NO_ITEM_SEARCH, { - search: searchText, - ns: BUILDER_NAMESPACE, - }); - cy.get(`#${RECYCLED_ITEMS_ROOT_CONTAINER}`).should('contain', text); - }); - - it('New button should not exist', () => { - cy.get(`#${CREATE_ITEM_BUTTON_ID}`).should('not.exist'); - }); - it('check recycled item layout', () => { for (const { item } of recycledItemData) { cy.get(`#${buildItemCard(item.id)}`).should('be.visible'); } }); - - it('Sorting & Ordering', () => { - cy.get(`${SORTING_SELECT_SELECTOR} input`).should( - 'have.value', - SortingOptions.ItemUpdatedAt, - ); - cy.get(SORTING_ORDERING_SELECTOR_DESC).should('be.visible'); - - cy.get(SORTING_SELECT_SELECTOR).click(); - cy.get('li[data-value="item.name"]').click(); - - // check items are ordered by name - cy.get(`#${RECYCLED_ITEMS_ROOT_CONTAINER} h5`).then(($e) => { - recycledItemData.sort((a, b) => (a.item.name < b.item.name ? 1 : -1)); - for (let idx = 0; idx < recycledItemData.length; idx += 1) { - expect($e[idx].innerText).to.eq(recycledItemData[idx].item.name); - } - }); - - // change ordering - cy.get(SORTING_ORDERING_SELECTOR_DESC).click(); - cy.get(SORTING_ORDERING_SELECTOR_ASC).should('be.visible'); - cy.get(`#${RECYCLED_ITEMS_ROOT_CONTAINER} h5`).then(($e) => { - recycledItemData.reverse(); - for (let idx = 0; idx < recycledItemData.length; idx += 1) { - expect($e[idx].innerText).to.eq(recycledItemData[idx].item.name); - } - }); - }); }); describe('Error Handling', () => { diff --git a/cypress/support/commands.ts b/cypress/support/commands.ts index 1bd5473a3..c635288b2 100644 --- a/cypress/support/commands.ts +++ b/cypress/support/commands.ts @@ -62,12 +62,11 @@ import { mockGetMembersBy, mockGetMembershipRequestsForItem, mockGetOwnMembershipRequests, + mockGetOwnRecycledItemData, mockGetParents, mockGetPublicationStatus, mockGetPublishItemInformations, mockGetPublishItemsForMember, - mockGetRecycledItems, - mockGetSharedItems, mockGetShortLinksItem, mockImportH5p, mockImportZip, @@ -187,8 +186,6 @@ Cypress.Commands.add( mockGetAccessibleItems(cachedItems); - mockGetSharedItems({ items: cachedItems, member: currentMember }); - mockPostItem(cachedItems, postItemError); mockDeleteItems(allItems, deleteItemsError); @@ -282,7 +279,7 @@ Cypress.Commands.add( mockRecycleItems(items, recycleItemsError); - mockGetRecycledItems(recycledItemData, getRecycledItemsError); + mockGetOwnRecycledItemData(recycledItemData, getRecycledItemsError); mockRestoreItems(items, restoreItemsError); diff --git a/cypress/support/server.ts b/cypress/support/server.ts index d12f50e0b..065bad88c 100644 --- a/cypress/support/server.ts +++ b/cypress/support/server.ts @@ -29,7 +29,7 @@ import { FAILURE_MESSAGES } from '@graasp/translations'; import { StatusCodes } from 'http-status-codes'; import { v4 as uuidv4, v4 } from 'uuid'; -import { SETTINGS } from '../../src/config/constants'; +import { ITEM_PAGE_SIZE, SETTINGS } from '../../src/config/constants'; import { getMemberById } from '../../src/utils/member'; import { buildAppApiAccessTokenRoute, @@ -69,8 +69,7 @@ const { buildGetItemMembershipsForItemsRoute, buildGetItemTagsRoute, buildPostItemTagRoute, - buildPatchMemberRoute, - SHARED_ITEM_WITH_ROUTE, + buildPatchCurrentMemberRoute, buildEditItemMembershipRoute, buildDeleteItemMembershipRoute, buildPostItemFlagRoute, @@ -78,7 +77,6 @@ const { buildExportItemChatRoute, buildPostItemChatMessageRoute, buildClearItemChatRoute, - GET_RECYCLED_ITEMS_DATA_ROUTE, buildDeleteItemTagRoute, buildDeleteItemsRoute, buildGetMembersByIdRoute, @@ -190,46 +188,38 @@ export const mockGetAccessibleItems = (items: ItemForTest[]): void => { ).as('getAccessibleItems'); }; -export const mockGetRecycledItems = ( +export const mockGetOwnRecycledItemData = ( recycledItemData: RecycledItemData[], shouldThrowError: boolean, ): void => { cy.intercept( { method: HttpMethod.Get, - url: `${API_HOST}/${GET_RECYCLED_ITEMS_DATA_ROUTE}`, + pathname: `/items/recycled`, }, - (req) => { + ({ reply, url }) => { if (shouldThrowError) { - req.reply({ statusCode: StatusCodes.BAD_REQUEST }); + reply({ statusCode: StatusCodes.BAD_REQUEST }); return; } - req.reply(recycledItemData); - }, - ).as('getRecycledItems'); -}; + const params = new URL(url).searchParams; -export const mockGetSharedItems = ({ - items, - member, -}: { - items: ItemForTest[]; - member?: Member; -}): void => { - cy.intercept( - { - method: HttpMethod.Get, - url: `${API_HOST}/${SHARED_ITEM_WITH_ROUTE}`, - }, - (req) => { - if (!member) { - return req.reply({ statusCode: StatusCodes.UNAUTHORIZED }); - } - const shared = items.filter(({ creator }) => creator?.id !== member.id); - return req.reply(shared); + const page = parseInt(params.get('page') ?? '1', 10); + const pageSize = parseInt(params.get('pageSize') ?? '10', 10); + + const result = recycledItemData.slice( + (page - 1) * pageSize, + page * pageSize, + ); + + reply({ + data: result, + totalCount: recycledItemData.length, + pagination: { page: 1, pageSize: ITEM_PAGE_SIZE }, + }); }, - ).as('getSharedItems'); + ).as('getOwnRecycledItemData'); }; export const mockPostItem = ( @@ -766,7 +756,7 @@ export const mockEditMember = ( cy.intercept( { method: HttpMethod.Patch, - url: new RegExp(`${API_HOST}/${buildPatchMemberRoute(ID_FORMAT)}`), + url: new RegExp(`${API_HOST}/${buildPatchCurrentMemberRoute()}`), }, ({ reply }) => { if (shouldThrowError) { diff --git a/package.json b/package.json index b203d7cba..995b60fe5 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,7 @@ "@emotion/styled": "11.13.0", "@graasp/chatbox": "3.3.0", "@graasp/map": "1.19.0", - "@graasp/query-client": "4.0.0", + "@graasp/query-client": "4.2.0", "@graasp/sdk": "4.31.0", "@graasp/stylis-plugin-rtl": "2.2.0", "@graasp/translations": "1.39.0", diff --git a/src/components/common/DeleteButton.tsx b/src/components/common/DeleteButton.tsx index b6a0cadf0..8f13bcf70 100644 --- a/src/components/common/DeleteButton.tsx +++ b/src/components/common/DeleteButton.tsx @@ -1,6 +1,6 @@ import { useState } from 'react'; -import { PackedItem } from '@graasp/sdk'; +import { DiscriminatedItem } from '@graasp/sdk'; import { ActionButtonVariant, ColorVariantsType, @@ -13,7 +13,7 @@ import { BUILDER } from '../../langs/constants'; import DeleteItemDialog from '../main/DeleteItemDialog'; type Props = { - items: PackedItem[]; + items: DiscriminatedItem[]; color?: ColorVariantsType; id?: string; type?: ActionButtonVariant; diff --git a/src/components/main/DeleteItemDialog.tsx b/src/components/main/DeleteItemDialog.tsx index c4b46dff4..31c75c2b8 100644 --- a/src/components/main/DeleteItemDialog.tsx +++ b/src/components/main/DeleteItemDialog.tsx @@ -6,7 +6,7 @@ import { DialogTitle, } from '@mui/material'; -import { PackedItem } from '@graasp/sdk'; +import { DiscriminatedItem } from '@graasp/sdk'; import { Button } from '@graasp/ui'; import { useBuilderTranslation } from '../../config/i18n'; @@ -21,7 +21,7 @@ const descriptionId = 'alert-dialog-description'; type Props = { open?: boolean; handleClose: () => void; - items: PackedItem[]; + items: DiscriminatedItem[]; onConfirm?: () => void; }; diff --git a/src/components/main/list/ItemsTable.tsx b/src/components/main/list/ItemsTable.tsx index a27cbbb04..bf5dec1b2 100644 --- a/src/components/main/list/ItemsTable.tsx +++ b/src/components/main/list/ItemsTable.tsx @@ -29,7 +29,7 @@ const { useItem } = hooks; export type ItemsTableProps = { id?: string; items?: PackedItem[]; - showThumbnails?: boolean; + showThumbnail?: boolean; canMove?: boolean; enableMoveInBetween?: boolean; onCardClick?: (id: DiscriminatedItem['id']) => void; @@ -40,7 +40,7 @@ export type ItemsTableProps = { const ItemsTable = ({ id: tableId = '', items: rows = [], - showThumbnails = true, + showThumbnail = true, canMove = true, enableMoveInBetween = true, selectedIds = [], @@ -192,7 +192,7 @@ const ItemsTable = ({ isMovable={y.isMovable} enableMoveInBetween={enableMoveInBetween} itemsStatuses={itemsStatuses} - showThumbnails={showThumbnails} + showThumbnail={showThumbnail} isSelected={isSelected(droppedEl)} onThumbnailClick={() => { if ('id' in droppedEl) { diff --git a/src/components/main/list/ItemsTableCard.tsx b/src/components/main/list/ItemsTableCard.tsx index daf0a74a6..a3a74630c 100644 --- a/src/components/main/list/ItemsTableCard.tsx +++ b/src/components/main/list/ItemsTableCard.tsx @@ -19,7 +19,7 @@ type Props = { isDragging: boolean; isOver: boolean; isMovable: boolean; - showThumbnails: boolean; + showThumbnail: boolean; itemsStatuses: ItemsStatuses; enableMoveInBetween: boolean; onClick?: (id: string) => void; @@ -32,7 +32,7 @@ const ItemsTableCard = ({ isDragging, isOver, isMovable, - showThumbnails, + showThumbnail, itemsStatuses, enableMoveInBetween, onClick, @@ -51,6 +51,8 @@ const ItemsTableCard = ({ ); } + const thumbnailUrl = showThumbnail ? item.thumbnails?.medium : undefined; + return ( onClick?.(item.id)}> } footer={ { +const RecycledItemsScreenContent = (): JSX.Element => { const { t: translateBuilder } = useBuilderTranslation(); - const { data: recycledItems, isLoading, isError } = hooks.useRecycledItems(); - const options = useTranslatedSortingOptions(); - const { shouldDisplayItem } = useFilterItemsContext(); - const { sortBy, setSortBy, ordering, setOrdering, sortFn } = - useSorting({ - sortBy: SortingOptions.ItemUpdatedAt, - ordering: Ordering.DESC, - }); - const filteredData = recycledItems - ?.filter( - (d) => - shouldDisplayItem(d.type) && - d.name.toLowerCase().includes(searchText.toLocaleLowerCase()), - ) - ?.sort(sortFn); + + const { data, fetchNextPage, isLoading, isFetching } = + hooks.useInfiniteOwnRecycledItemData( + // todo: adapt page size given the user window height + { pageSize: ITEM_PAGE_SIZE }, + ); + const { selectedIds, toggleSelection } = useSelectionContext(); const DragSelection = useDragSelection({ containerId: CONTAINER_ID }); // render this when there is data from the query - if (recycledItems?.length) { - const hasSelection = selectedIds.length && filteredData?.length; - return ( - <> - - - {hasSelection ? ( - - ) : ( - - - - {sortBy && setSortBy && ( - - )} - - - - )} - - - { - // render the filtered data and when it is empty display that nothing matches the search - filteredData?.length ? ( - filteredData.map((item) => ( + if (data?.pages?.length) { + if (data.pages[0].data.length) { + const fetchedItems = data.pages + .flatMap((p) => p.data) + ?.map((p) => p.item); + + const totalFetchedItems = fetchedItems.length; + + const hasSelection = Boolean(selectedIds.length && fetchedItems.length); + return ( + <> + + + {hasSelection ? ( + + ) : ( + + {translateBuilder(BUILDER.TRASH_COUNT, { + count: data.pages[0].totalCount, + })} + + )} + + + {fetchedItems.map((item) => ( + toggleSelection(item.id)} isSelected={selectedIds.includes(item.id)} - showThumbnail={false} allowNavigation={false} footer={ @@ -114,19 +86,27 @@ const RecycledItemsScreenContent = ({ } /> - )) - ) : ( - - {translateBuilder(BUILDER.TRASH_NO_ITEM_SEARCH, { - search: searchText, - })} - - ) - } - - - {DragSelection} - + + ))} + {!isFetching && data.pages[0].totalCount > totalFetchedItems && ( + + + + )} + + + {DragSelection} + + ); + } + return ( + {translateBuilder(BUILDER.TRASH_NO_ITEM)} ); } @@ -134,36 +114,19 @@ const RecycledItemsScreenContent = ({ return ; } - if (isError) { - return ; - } - - return ( - {translateBuilder(BUILDER.TRASH_NO_ITEM)} - ); + return ; }; const RecycledItemsScreen = (): JSX.Element | null => { const { t: translateBuilder } = useBuilderTranslation(); - const itemSearch = useItemSearch(); return ( - {itemSearch.input} - - } > - + ); diff --git a/src/components/pages/recycleBin/RecycleBinSelectionToolbar.tsx b/src/components/pages/recycleBin/RecycleBinSelectionToolbar.tsx index 275887de9..e1fde2170 100644 --- a/src/components/pages/recycleBin/RecycleBinSelectionToolbar.tsx +++ b/src/components/pages/recycleBin/RecycleBinSelectionToolbar.tsx @@ -1,4 +1,4 @@ -import { PackedItem } from '@graasp/sdk'; +import { DiscriminatedItem } from '@graasp/sdk'; import DeleteButton from '@/components/common/DeleteButton'; import RestoreButton from '@/components/common/RestoreButton'; @@ -12,7 +12,7 @@ import { const RecycleBinSelectionToolbar = ({ items, }: { - items: PackedItem[]; + items: DiscriminatedItem[]; }): JSX.Element => { const { selectedIds, clearSelection } = useSelectionContext(); diff --git a/src/components/table/ItemCard.tsx b/src/components/table/ItemCard.tsx index 7487cafb8..1ddc04d2f 100644 --- a/src/components/table/ItemCard.tsx +++ b/src/components/table/ItemCard.tsx @@ -2,8 +2,8 @@ import { Box, Typography } from '@mui/material'; import Grid2 from '@mui/material/Unstable_Grid2/Grid2'; import { + DiscriminatedItem, ItemType, - PackedItem, formatDate, getLinkThumbnailUrl, } from '@graasp/sdk'; @@ -15,9 +15,8 @@ import { buildItemPath } from '@/config/paths'; import { ITEM_CARD_CLASS, buildItemCard } from '@/config/selectors'; type Props = { - item: PackedItem; + item: DiscriminatedItem; dense?: boolean; - showThumbnail?: boolean; footer: JSX.Element; isOver?: boolean; isDragging?: boolean; @@ -26,6 +25,7 @@ type Props = { isSelected?: boolean; allowNavigation?: boolean; onThumbnailClick?: () => void; + thumbnailUrl?: string; }; const ItemCard = ({ @@ -35,16 +35,14 @@ const ItemCard = ({ isDragging = false, isOver = false, isSelected = false, - showThumbnail = true, disabled, menu, allowNavigation = true, + thumbnailUrl, onThumbnailClick, }: Props): JSX.Element => { const { t: translateCommon } = useCommonTranslation(); - const thumbnailUrl = showThumbnail ? item.thumbnails?.medium : undefined; - const dateColumnFormatter = (value: string) => formatDate(value, { locale: i18n.language, diff --git a/src/components/table/useSorting.tsx b/src/components/table/useSorting.tsx index cffb1e711..51ba11bc9 100644 --- a/src/components/table/useSorting.tsx +++ b/src/components/table/useSorting.tsx @@ -1,6 +1,6 @@ import { Dispatch, useState } from 'react'; -import { PackedItem } from '@graasp/sdk'; +import { DiscriminatedItem } from '@graasp/sdk'; import { useBuilderTranslation } from '@/config/i18n'; import { Ordering } from '@/enums'; @@ -22,14 +22,14 @@ export const useSorting = ({ ordering: Ordering; setSortBy: Dispatch; setOrdering: Dispatch; - sortFn: (a: PackedItem, b: PackedItem) => number; + sortFn: (a: DiscriminatedItem, b: DiscriminatedItem) => number; } => { const [sortBy, setSortBy] = useState( s ?? (SortingOptions.ItemUpdatedAt as T), ); const [ordering, setOrdering] = useState(o); - const sortFn = (a: PackedItem, b: PackedItem) => { + const sortFn = (a: DiscriminatedItem, b: DiscriminatedItem) => { const f = ordering === Ordering.ASC ? 1 : -1; let value = 0; switch (sortBy) { diff --git a/src/langs/ar.json b/src/langs/ar.json index 02a34fbb1..f34153c82 100644 --- a/src/langs/ar.json +++ b/src/langs/ar.json @@ -451,7 +451,6 @@ "item.name": "اسم", "order": "طلب", "TRASH_NO_ITEM": "سلة المهملات فارغة.", - "TRASH_NO_ITEM_SEARCH": "لا يوجد عنصر محذوف لـ {{search}}", "BOOKMARKS_NO_ITEM": "لا يوجد عنصر مُضاف إلى الإشارات المرجعية", "BOOKMARKS_NO_ITEM_SEARCH": "لا يوجد عنصر مُضاف إلى قائمة الإشارات المرجعية لـ {{search}}", "UPLOAD_BETWEEN_FILES": "قم بتحميل ملفاتك هنا", diff --git a/src/langs/constants.ts b/src/langs/constants.ts index eb65dd8f8..54f75d3e6 100644 --- a/src/langs/constants.ts +++ b/src/langs/constants.ts @@ -104,7 +104,6 @@ export const BUILDER = { LIBRARY_SETTINGS_BUTTON_TITLE: 'LIBRARY_SETTINGS_BUTTON_TITLE', RECYCLE_ITEM_BUTTON: 'RECYCLE_ITEM_BUTTON', TRASH_NO_ITEM: 'TRASH_NO_ITEM', - TRASH_NO_ITEM_SEARCH: 'TRASH_NO_ITEM_SEARCH', BOOKMARKS_NO_ITEM: 'BOOKMARKS_NO_ITEM', BOOKMARKS_NO_ITEM_SEARCH: 'BOOKMARKS_NO_ITEM_SEARCH', RESTORE_ITEM_BUTTON: 'RESTORE_ITEM_BUTTON', @@ -604,4 +603,5 @@ export const BUILDER = { ACCESS_MANAGEMENT_TITLE: 'ACCESS_MANAGEMENT_TITLE', ITEM_LOGIN_SCHEMA_DISABLED_GUEST_ACCESS_MESSAGE: 'ITEM_LOGIN_SCHEMA_DISABLED_GUEST_ACCESS_MESSAGE', + TRASH_COUNT: 'TRASH_COUNT', }; diff --git a/src/langs/de.json b/src/langs/de.json index f191cd879..63acb2bd0 100644 --- a/src/langs/de.json +++ b/src/langs/de.json @@ -451,7 +451,6 @@ "item.name": "Name", "order": "Befehl", "TRASH_NO_ITEM": "Ihr Papierkorb ist leer.", - "TRASH_NO_ITEM_SEARCH": "Kein gelöschter Eintrag für {{search}}", "BOOKMARKS_NO_ITEM": "Kein mit Lesezeichen versehener Eintrag", "BOOKMARKS_NO_ITEM_SEARCH": "Kein Lesezeichen für {{search}}", "UPLOAD_BETWEEN_FILES": "Laden Sie Ihre Datei(en) hier hoch", diff --git a/src/langs/en.json b/src/langs/en.json index f6acace03..757841199 100644 --- a/src/langs/en.json +++ b/src/langs/en.json @@ -456,7 +456,6 @@ "item.name": "Name", "order": "Order", "TRASH_NO_ITEM": "You trash is empty.", - "TRASH_NO_ITEM_SEARCH": "No trashed item for {{search}}", "BOOKMARKS_NO_ITEM": "No bookmarked item", "BOOKMARKS_NO_ITEM_SEARCH": "No bookmarked item for {{search}}", "UPLOAD_BETWEEN_FILES": "Upload your file(s) here", @@ -497,5 +496,7 @@ "REQUEST_ACCESS_BUTTON": "Request access", "REQUEST_ACCESS_SENT_BUTTON": "Request sent", "ACCESS_MANAGEMENT_TITLE": "Access Management", - "ITEM_LOGIN_SCHEMA_DISABLED_GUEST_ACCESS_MESSAGE": "This guest cannot login because pseudonymized access is disabled." + "ITEM_LOGIN_SCHEMA_DISABLED_GUEST_ACCESS_MESSAGE": "This guest cannot login because pseudonymized access is disabled.", + "TRASH_COUNT_one": "You have one item in your trash.", + "TRASH_COUNT_other": "You have {{count}} items in your trash." } diff --git a/src/langs/es.json b/src/langs/es.json index 0be1e9779..c8e926269 100644 --- a/src/langs/es.json +++ b/src/langs/es.json @@ -451,7 +451,6 @@ "item.name": "Nombre", "order": "Orden", "TRASH_NO_ITEM": "Tu basura está vacía.", - "TRASH_NO_ITEM_SEARCH": "No hay elementos descartados para {{search}}", "BOOKMARKS_NO_ITEM": "Ningún elemento marcado", "BOOKMARKS_NO_ITEM_SEARCH": "No hay ningún elemento marcado como favorito para {{search}}", "UPLOAD_BETWEEN_FILES": "Sube tu(s) archivo(s) aquí", diff --git a/src/langs/fr.json b/src/langs/fr.json index 230eb8a5c..da2751f2c 100644 --- a/src/langs/fr.json +++ b/src/langs/fr.json @@ -456,7 +456,6 @@ "item.name": "Nom", "order": "Ordre", "TRASH_NO_ITEM": "La poubelle est vide.", - "TRASH_NO_ITEM_SEARCH": "Aucun élément de la corbeille ne correspond à {{search}}", "BOOKMARKS_NO_ITEM": "Aucun élément ajouté aux favoris", "BOOKMARKS_NO_ITEM_SEARCH": "Aucun élément favoris ne correspond à {{search}}", "UPLOAD_BETWEEN_FILES": "Téléchargez votre (vos) fichier(s) ici", @@ -496,5 +495,7 @@ "REQUEST_ACCESS_TITLE": "Demander l'accès à cet élément", "REQUEST_ACCESS_BUTTON": "Demander l'accès", "REQUEST_ACCESS_SENT_BUTTON": "Demande envoyée", - "ACCESS_MANAGEMENT_TITLE": "Gestion des accès" + "ACCESS_MANAGEMENT_TITLE": "Gestion des accès", + "TRASH_COUNT_one": "Il y a un élément dans la poubelle.", + "TRASH_COUNT_other": "Il y a {{count}} éléments dans la poubelle." } diff --git a/src/langs/it.json b/src/langs/it.json index 63a841dd2..640a3f6b9 100644 --- a/src/langs/it.json +++ b/src/langs/it.json @@ -451,7 +451,6 @@ "item.name": "Nome", "order": "Ordine", "TRASH_NO_ITEM": "Il tuo cestino è vuoto.", - "TRASH_NO_ITEM_SEARCH": "Nessun elemento nel cestino per {{search}}", "BOOKMARKS_NO_ITEM": "Nessun elemento aggiunto ai segnalibri", "BOOKMARKS_NO_ITEM_SEARCH": "Nessun elemento aggiunto ai segnalibri per {{search}}", "UPLOAD_BETWEEN_FILES": "Carica i tuoi file qui", diff --git a/yarn.lock b/yarn.lock index bd698680e..3b93698ce 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1637,19 +1637,19 @@ __metadata: languageName: node linkType: hard -"@graasp/query-client@npm:4.0.0": - version: 4.0.0 - resolution: "@graasp/query-client@npm:4.0.0" +"@graasp/query-client@npm:4.2.0": + version: 4.2.0 + resolution: "@graasp/query-client@npm:4.2.0" dependencies: - "@tanstack/react-query": "npm:5.59.0" - "@tanstack/react-query-devtools": "npm:5.59.0" + "@tanstack/react-query": "npm:5.59.8" + "@tanstack/react-query-devtools": "npm:5.59.8" axios: "npm:1.7.7" http-status-codes: "npm:2.3.0" peerDependencies: "@graasp/sdk": ^4.0.0 "@graasp/translations": "*" react: ^18.0.0 - checksum: 10/52ecdddfdea99a6cb6b8e35c64007968694debe980756964158b0c564534a43fbc439cc7f8b3432c1b0f27efd9205a20465aa5c38d40e7c82b355a44c1c1dbcb + checksum: 10/fdf06272486d4c9979459c00f7cb0d9f98c027deef0c948ff734679b46435658076aeede49d54730922f0d12e572cf9d3bac045e346ab38629a15fab6b30d00d languageName: node linkType: hard @@ -2560,10 +2560,10 @@ __metadata: languageName: node linkType: hard -"@tanstack/query-core@npm:5.59.0": - version: 5.59.0 - resolution: "@tanstack/query-core@npm:5.59.0" - checksum: 10/2e8fd7d9bdd62cabc1a2b20b2cf0c9275174ee5550170f224bd4e30fe2d01cc8d39a0dd03caae55ddb8aea259d991966bb54b581b4046fd67c621c081f4b0ba7 +"@tanstack/query-core@npm:5.59.6": + version: 5.59.6 + resolution: "@tanstack/query-core@npm:5.59.6" + checksum: 10/4cd634f957175dde80ed8f2b47eb14803d959073b6dccb7868f5dd6ddce26e41820b2dfc879dfc799de0726ae640201440c7d1d95113813bbcb25b03ec05949e languageName: node linkType: hard @@ -2574,26 +2574,26 @@ __metadata: languageName: node linkType: hard -"@tanstack/react-query-devtools@npm:5.59.0": - version: 5.59.0 - resolution: "@tanstack/react-query-devtools@npm:5.59.0" +"@tanstack/react-query-devtools@npm:5.59.8": + version: 5.59.8 + resolution: "@tanstack/react-query-devtools@npm:5.59.8" dependencies: "@tanstack/query-devtools": "npm:5.58.0" peerDependencies: - "@tanstack/react-query": ^5.59.0 + "@tanstack/react-query": ^5.59.8 react: ^18 || ^19 - checksum: 10/a4deb3fe97355fcb98febd3b9cd5e871f3756771eb9eb15a2a226a0a9fb0314502522f70d12f54c25aec7985eae77b82b39bce37f86ee0312da046f4f1822bcf + checksum: 10/1e84af45cd6c722b296aef39ac2e7c98ef0db8c963bc43ebd802adc7077d514d06189862b02351e85878616542877af64266965147d75470cf834a23a9ee07ea languageName: node linkType: hard -"@tanstack/react-query@npm:5.59.0": - version: 5.59.0 - resolution: "@tanstack/react-query@npm:5.59.0" +"@tanstack/react-query@npm:5.59.8": + version: 5.59.8 + resolution: "@tanstack/react-query@npm:5.59.8" dependencies: - "@tanstack/query-core": "npm:5.59.0" + "@tanstack/query-core": "npm:5.59.6" peerDependencies: react: ^18 || ^19 - checksum: 10/48963e7d0603958390db0087c018b71e87187ad84dea03279716b4869de83509027c37f65f3c6c4a1cd7b6f9f14250afffc2aeee5d481528e2308d937422ae41 + checksum: 10/246cfa18e991782c97631ab30fc95987be81c7a25b057b65c3530a06f9e8acc98475ce8def29486be8d4c8f9ad391b9cfa2195b89e11dcd82f43a4ca172154f6 languageName: node linkType: hard @@ -6472,7 +6472,7 @@ __metadata: "@emotion/styled": "npm:11.13.0" "@graasp/chatbox": "npm:3.3.0" "@graasp/map": "npm:1.19.0" - "@graasp/query-client": "npm:4.0.0" + "@graasp/query-client": "npm:4.2.0" "@graasp/sdk": "npm:4.31.0" "@graasp/stylis-plugin-rtl": "npm:2.2.0" "@graasp/translations": "npm:1.39.0"