diff --git a/src/components/managers/archive/archive.tsx b/src/components/managers/archive/archive.tsx index 4a41141..86c312f 100644 --- a/src/components/managers/archive/archive.tsx +++ b/src/components/managers/archive/archive.tsx @@ -1,6 +1,6 @@ -import { Alert, Divider, Grid, Snackbar } from '@mui/material'; +import { Alert, AppBar, Button, Grid, Snackbar, Toolbar } from '@mui/material'; import { Layout } from 'components/login/layout'; -import { FC, useEffect } from 'react'; +import { FC, useEffect, useState } from 'react'; import { CreateArchive } from './createArchive/createArchive'; import { fetchArchives } from './fetcharchive'; import { ListArchive } from './listArchive/listArchive'; @@ -21,6 +21,10 @@ export const Archive: FC = () => { setArchive, updateArchiveInformation, } = fetchArchives(); + const [isCreateArchiveModalOpen, setIsCreateArchiveModalOpen] = useState(false); + + const handleOpenCreateArchiveModal = () => setIsCreateArchiveModalOpen(true); + const handleCloseCreateArchiveModal = () => setIsCreateArchiveModalOpen(false); useEffect(() => { const handleScroll = () => { @@ -43,12 +47,29 @@ export const Archive: FC = () => { return ( + + + + + - - - - + = ({ fetchArchive, showMessage }) => { +export const CreateArchive: FC = ({ fetchArchive, showMessage, open, close }) => { const initialArchiveState: common_ArchiveNew = { archive: { heading: '', @@ -53,6 +53,11 @@ export const CreateArchive: FC = ({ fetchArchive, showMessage }) const mediaPreview = (newSelectedMedia: common_MediaFull[]) => { if (newSelectedMedia.length === 0) return; const selectedMedia = newSelectedMedia[0]; + const isDuplicate = archive.itemsInsert?.some((item) => item.mediaId === selectedMedia.id); + if (isDuplicate) { + showMessage('This media is already in the archive', 'error'); + return; + } setMediaId(selectedMedia.id); const previewMediaUrl = selectedMedia.media?.thumbnail?.mediaUrl; setMedia(previewMediaUrl); @@ -65,6 +70,14 @@ export const CreateArchive: FC = ({ fetchArchive, showMessage }) return; } + if (mediaId && selectedItemIndex === null) { + const isDuplicate = archive.itemsInsert?.some((item) => item.mediaId === mediaId); + if (isDuplicate) { + showMessage('This media is already in the archive', 'error'); + return; + } + } + const newItem: common_ArchiveItemInsert = { mediaId: mediaId, url: url, @@ -158,6 +171,7 @@ export const CreateArchive: FC = ({ fetchArchive, showMessage }) fetchArchive(50, 0); setMediaItem([]); showMessage('archive created', 'success'); + close(); } else { showMessage('add item to the archive', 'error'); } @@ -165,103 +179,107 @@ export const CreateArchive: FC = ({ fetchArchive, showMessage }) showMessage('archive cannot be created ', 'error'); } }; - return ( - - - - create new archive - - - - - - {mediaItem.map((media, id) => ( - - - - toggleModal(id)} - /> - removeMediaItem(id)} className={styles.delete_item}> - - - - - - {archive.itemsInsert?.[id]?.url && isValidUrl(archive.itemsInsert[id].url) && ( - + + + + + create new archive + + + + + + {mediaItem.map((media, id) => ( + + + + toggleModal(id)} /> - )} + removeMediaItem(id)} className={styles.delete_item}> + + + + + + {archive.itemsInsert?.[id]?.url && isValidUrl(archive.itemsInsert[id].url) && ( + + )} + + ))} + + + + + - ))} + + + + - - - - - - - + + - - - + - - - + ); }; diff --git a/src/components/managers/archive/fetcharchive.ts b/src/components/managers/archive/fetcharchive.ts index c1647f7..69b4191 100644 --- a/src/components/managers/archive/fetcharchive.ts +++ b/src/components/managers/archive/fetcharchive.ts @@ -99,8 +99,6 @@ export const fetchArchives = ( showMessage('Item removed from archive', 'success'); updateArchiveInformation(archiveId, updatedArchiveEntry); return updatedArchiveEntry; - } else { - showMessage('Item cannot be removed from archive', 'error'); } return archiveEntry; }).filter((archiveEntry) => archiveEntry !== null) as common_ArchiveFull[] diff --git a/src/components/managers/archive/interfaces/interfaces.ts b/src/components/managers/archive/interfaces/interfaces.ts index 4e4075d..e3a8d14 100644 --- a/src/components/managers/archive/interfaces/interfaces.ts +++ b/src/components/managers/archive/interfaces/interfaces.ts @@ -14,6 +14,8 @@ export interface ArchiveModalInterface { } export interface createArchives { + open: boolean; + close: () => void; fetchArchive: (limit: number, offset: number) => void; showMessage: (message: string, severity: 'success' | 'error') => void; } diff --git a/src/components/managers/archive/listArchive/archiveTable.tsx b/src/components/managers/archive/listArchive/archiveTable.tsx index a9e0754..39072a4 100644 --- a/src/components/managers/archive/listArchive/archiveTable.tsx +++ b/src/components/managers/archive/listArchive/archiveTable.tsx @@ -85,15 +85,20 @@ export const ArchiveTable: FC = ({ /> ), }, - { accessorKey: 'archiveItem.title', header: 'Description' }, + { accessorKey: 'archiveItem.name', header: 'Description' }, { accessorKey: 'archiveItem.url', header: 'URL', - Cell: ({ cell }) => ( - - go to link - - ), + Cell: ({ cell }) => { + const url = cell.getValue() as string; + return url ? ( + + go to link + + ) : ( + 'no link' + ); + }, }, { accessorKey: 'id', diff --git a/src/components/managers/archive/listArchive/listArchive.tsx b/src/components/managers/archive/listArchive/listArchive.tsx index 311ee14..fd0ac6e 100644 --- a/src/components/managers/archive/listArchive/listArchive.tsx +++ b/src/components/managers/archive/listArchive/listArchive.tsx @@ -1,5 +1,5 @@ import DeleteIcon from '@mui/icons-material/Delete'; -import { Box, Button, Divider, Grid, TextField } from '@mui/material'; +import { Box, Button, Grid, TextField, Typography } from '@mui/material'; import { common_MediaFull } from 'api/proto-http/admin'; import { common_ArchiveFull, common_ArchiveItemFull } from 'api/proto-http/frontend'; import { CopyToClipboard } from 'components/common/copyToClipboard'; @@ -95,12 +95,14 @@ export const ListArchive: FC = ({ if (entry.items?.some((item) => item.archiveItem?.media?.id === mediaId)) { return showMessage('this media is already added', 'error'), entry; } + const tempId = Date.now(); const newItem = { + id: tempId, archiveId, archiveItem: { media: { id: mediaId, media: { thumbnail: { mediaUrl: media } } }, url, - name, + name: title, }, } as common_ArchiveItemFull; const updatedItems = [...(entry.items || []), newItem]; @@ -142,8 +144,8 @@ export const ListArchive: FC = ({ }, }, } as common_MediaFull, - url: url || item.archiveItem?.url, - name: title || item.archiveItem?.name, + url: url, + name: title, }, }; @@ -204,10 +206,27 @@ export const ListArchive: FC = ({ }; return ( - - {archive.map((entry) => ( + + {archive.map((entry, id) => ( - + + + + total number of items: {entry.items?.length} + + + + + archive № {archive.length - id} + + = ({ /> ) : ( - {entry.items?.slice(0, 4).map((item, index) => ( + {entry.items?.slice(-4).map((item, index) => ( @@ -301,7 +320,6 @@ export const ListArchive: FC = ({ - ))} { if (!url) return false; + + if (!url.match(/^https?:\/\//)) return false; + try { new URL(url); return true;