From 0867e85589b6df7b22ab727ac90c8288cc1830f8 Mon Sep 17 00:00:00 2001 From: oak Date: Fri, 25 Oct 2024 18:17:56 +0300 Subject: [PATCH 1/7] create archive modal created --- src/components/managers/archive/archive.tsx | 30 ++- .../archive/createArchive/createArchive.tsx | 180 +++++++++--------- .../managers/archive/interfaces/interfaces.ts | 2 + 3 files changed, 120 insertions(+), 92 deletions(-) diff --git a/src/components/managers/archive/archive.tsx b/src/components/managers/archive/archive.tsx index 4a41141c..59f8f3f1 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, Divider, 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,9 +47,29 @@ export const Archive: FC = () => { return ( + + + + + - + diff --git a/src/components/managers/archive/createArchive/createArchive.tsx b/src/components/managers/archive/createArchive/createArchive.tsx index f4c79287..b75c4604 100644 --- a/src/components/managers/archive/createArchive/createArchive.tsx +++ b/src/components/managers/archive/createArchive/createArchive.tsx @@ -1,5 +1,5 @@ import ClearIcon from '@mui/icons-material/Clear'; -import { Button, Grid, IconButton, TextField, Typography } from '@mui/material'; +import { Button, Dialog, Grid, IconButton, TextField, Typography } from '@mui/material'; import { addArchive } from 'api/archive'; import { common_ArchiveItemInsert, @@ -16,7 +16,7 @@ import { ArchiveModal } from '../archiveModal/archiveModal'; import { createArchives } from '../interfaces/interfaces'; import { isValidUrl } from '../utility/isValidUrl'; -export const CreateArchive: FC = ({ fetchArchive, showMessage }) => { +export const CreateArchive: FC = ({ fetchArchive, showMessage, open, close }) => { const initialArchiveState: common_ArchiveNew = { archive: { heading: '', @@ -167,101 +167,103 @@ export const CreateArchive: FC = ({ fetchArchive, showMessage }) }; 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/interfaces/interfaces.ts b/src/components/managers/archive/interfaces/interfaces.ts index 4e4075d9..e3a8d14d 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; } From 1b30b7babe32d8a779a0c785422549c3cf67d4ab Mon Sep 17 00:00:00 2001 From: oak Date: Mon, 28 Oct 2024 14:00:47 +0300 Subject: [PATCH 2/7] wip --- src/components/managers/archive/archive.tsx | 5 +--- .../archive/createArchive/createArchive.tsx | 2 +- .../archive/listArchive/listArchive.tsx | 28 +++++++++++++++---- 3 files changed, 24 insertions(+), 11 deletions(-) diff --git a/src/components/managers/archive/archive.tsx b/src/components/managers/archive/archive.tsx index 59f8f3f1..86c312f2 100644 --- a/src/components/managers/archive/archive.tsx +++ b/src/components/managers/archive/archive.tsx @@ -1,4 +1,4 @@ -import { Alert, AppBar, Button, Divider, Grid, Snackbar, Toolbar } from '@mui/material'; +import { Alert, AppBar, Button, Grid, Snackbar, Toolbar } from '@mui/material'; import { Layout } from 'components/login/layout'; import { FC, useEffect, useState } from 'react'; import { CreateArchive } from './createArchive/createArchive'; @@ -71,9 +71,6 @@ export const Archive: FC = () => { showMessage={showMessage} /> - - - = ({ fetchArchive, showMessage, o return ( - + create new archive diff --git a/src/components/managers/archive/listArchive/listArchive.tsx b/src/components/managers/archive/listArchive/listArchive.tsx index 311ee14d..dbb01a61 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'; @@ -204,10 +204,27 @@ export const ListArchive: FC = ({ }; return ( - - {archive.map((entry) => ( + + {archive.map((entry, id) => ( - + + + + total number of items: {entry.items?.length} + + + + + {archive.length - id} item + + = ({ /> ) : ( - {entry.items?.slice(0, 4).map((item, index) => ( + {entry.items?.slice(-4).map((item, index) => ( @@ -301,7 +318,6 @@ export const ListArchive: FC = ({ - ))} Date: Mon, 28 Oct 2024 14:40:16 +0300 Subject: [PATCH 3/7] remove newly added items from archive problem solved --- src/components/managers/archive/fetcharchive.ts | 2 -- src/components/managers/archive/listArchive/listArchive.tsx | 4 +++- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/managers/archive/fetcharchive.ts b/src/components/managers/archive/fetcharchive.ts index c1647f79..69b4191a 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/listArchive/listArchive.tsx b/src/components/managers/archive/listArchive/listArchive.tsx index dbb01a61..0db48383 100644 --- a/src/components/managers/archive/listArchive/listArchive.tsx +++ b/src/components/managers/archive/listArchive/listArchive.tsx @@ -95,7 +95,9 @@ 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 } } }, @@ -222,7 +224,7 @@ export const ListArchive: FC = ({ - {archive.length - id} item + archive № {archive.length - id} From 3ddbc238d897acfa53685b09d4b7ddf6862d4275 Mon Sep 17 00:00:00 2001 From: oak Date: Mon, 28 Oct 2024 14:44:03 +0300 Subject: [PATCH 4/7] archive display fixed --- src/components/managers/archive/listArchive/archiveTable.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/managers/archive/listArchive/archiveTable.tsx b/src/components/managers/archive/listArchive/archiveTable.tsx index a9e0754b..c78cb0bd 100644 --- a/src/components/managers/archive/listArchive/archiveTable.tsx +++ b/src/components/managers/archive/listArchive/archiveTable.tsx @@ -85,7 +85,7 @@ export const ArchiveTable: FC = ({ /> ), }, - { accessorKey: 'archiveItem.title', header: 'Description' }, + { accessorKey: 'archiveItem.name', header: 'Description' }, { accessorKey: 'archiveItem.url', header: 'URL', From 2743e17e054babc852f42665975b3cc8907e99b9 Mon Sep 17 00:00:00 2001 From: oak Date: Mon, 28 Oct 2024 15:09:21 +0300 Subject: [PATCH 5/7] name for newly added archive item is displayed now --- src/components/managers/archive/listArchive/listArchive.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/managers/archive/listArchive/listArchive.tsx b/src/components/managers/archive/listArchive/listArchive.tsx index 0db48383..47804eb9 100644 --- a/src/components/managers/archive/listArchive/listArchive.tsx +++ b/src/components/managers/archive/listArchive/listArchive.tsx @@ -102,7 +102,7 @@ export const ListArchive: FC = ({ archiveItem: { media: { id: mediaId, media: { thumbnail: { mediaUrl: media } } }, url, - name, + name: title, }, } as common_ArchiveItemFull; const updatedItems = [...(entry.items || []), newItem]; From df416b9b8c1bddbeeb232b3987815222e7d43406 Mon Sep 17 00:00:00 2001 From: oak Date: Mon, 28 Oct 2024 15:37:46 +0300 Subject: [PATCH 6/7] wip --- .../managers/archive/listArchive/archiveTable.tsx | 15 ++++++++++----- .../managers/archive/listArchive/listArchive.tsx | 4 ++-- src/features/utilitty/isValidUrl.ts | 3 +++ 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/src/components/managers/archive/listArchive/archiveTable.tsx b/src/components/managers/archive/listArchive/archiveTable.tsx index c78cb0bd..39072a44 100644 --- a/src/components/managers/archive/listArchive/archiveTable.tsx +++ b/src/components/managers/archive/listArchive/archiveTable.tsx @@ -89,11 +89,16 @@ export const ArchiveTable: FC = ({ { 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 47804eb9..fd0ac6ed 100644 --- a/src/components/managers/archive/listArchive/listArchive.tsx +++ b/src/components/managers/archive/listArchive/listArchive.tsx @@ -144,8 +144,8 @@ export const ListArchive: FC = ({ }, }, } as common_MediaFull, - url: url || item.archiveItem?.url, - name: title || item.archiveItem?.name, + url: url, + name: title, }, }; diff --git a/src/features/utilitty/isValidUrl.ts b/src/features/utilitty/isValidUrl.ts index dd80c326..0df047c0 100644 --- a/src/features/utilitty/isValidUrl.ts +++ b/src/features/utilitty/isValidUrl.ts @@ -1,5 +1,8 @@ export const isValidURL = (url: string | undefined): boolean => { if (!url) return false; + + if (!url.match(/^https?:\/\//)) return false; + try { new URL(url); return true; From c0f03574e6d07fce8a9ce8458da38b29352cdde4 Mon Sep 17 00:00:00 2001 From: oak Date: Mon, 28 Oct 2024 15:57:45 +0300 Subject: [PATCH 7/7] wip --- .../archive/createArchive/createArchive.tsx | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/components/managers/archive/createArchive/createArchive.tsx b/src/components/managers/archive/createArchive/createArchive.tsx index 514a7075..72f968a1 100644 --- a/src/components/managers/archive/createArchive/createArchive.tsx +++ b/src/components/managers/archive/createArchive/createArchive.tsx @@ -53,6 +53,11 @@ export const CreateArchive: FC = ({ fetchArchive, showMessage, o 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, o 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, o fetchArchive(50, 0); setMediaItem([]); showMessage('archive created', 'success'); + close(); } else { showMessage('add item to the archive', 'error'); } @@ -165,9 +179,11 @@ export const CreateArchive: FC = ({ fetchArchive, showMessage, o showMessage('archive cannot be created ', 'error'); } }; - return ( +