remaining fixes

This commit is contained in:
Spynder 2025-05-07 00:02:24 +03:00
parent fba2fb0f5c
commit 177653d84a
4 changed files with 94 additions and 52 deletions

View File

@ -18,6 +18,8 @@ import {
ALLOWED_IMAGE_TYPES, ALLOWED_IMAGE_TYPES,
ALLOWED_VIDEO_TYPES, ALLOWED_VIDEO_TYPES,
} from "../components/media/MediaFormUtils"; } from "../components/media/MediaFormUtils";
import { LinkedItems } from "./LinkedItems";
import { mediaFields, MediaItem } from "../pages/article/types";
const MemoizedSimpleMDE = React.memo(MarkdownEditor); const MemoizedSimpleMDE = React.memo(MarkdownEditor);

View File

@ -69,6 +69,8 @@ type LinkedItemsProps<T> = {
extraField?: ExtraFieldConfig; extraField?: ExtraFieldConfig;
dragAllowed?: boolean; dragAllowed?: boolean;
onSave?: (items: T[]) => void; onSave?: (items: T[]) => void;
onUpdate?: () => void;
dontRecurse?: boolean;
}; };
const reorder = (list: any[], startIndex: number, endIndex: number) => { const reorder = (list: any[], startIndex: number, endIndex: number) => {
@ -88,6 +90,8 @@ export const LinkedItems = <T extends { id: number; [key: string]: any }>({
dragAllowed = false, dragAllowed = false,
type, type,
onSave, onSave,
onUpdate,
dontRecurse = false,
}: LinkedItemsProps<T>) => { }: LinkedItemsProps<T>) => {
const { language } = languageStore; const { language } = languageStore;
const { setArticleModalOpenAction, setArticleIdAction } = articleStore; const { setArticleModalOpenAction, setArticleIdAction } = articleStore;
@ -130,14 +134,25 @@ export const LinkedItems = <T extends { id: number; [key: string]: any }>({
setLinkedItems(reorderedItems); setLinkedItems(reorderedItems);
axiosInstance.post( if(parentResource === "sight" && childResource === "article") {
`${import.meta.env.VITE_KRBL_API}/route/${parentId}/station`, axiosInstance.post(
{ `${import.meta.env.VITE_KRBL_API}/sight/${parentId}/article/order`,
stations: reorderedItems.map((item) => ({ {
id: item.id, articles: reorderedItems.map((item) => ({
})), id: item.id,
} })),
); }
);
} else {
axiosInstance.post(
`${import.meta.env.VITE_KRBL_API}/route/${parentId}/station`,
{
stations: reorderedItems.map((item) => ({
id: item.id,
})),
}
);
}
}; };
useEffect(() => { useEffect(() => {
@ -227,6 +242,7 @@ export const LinkedItems = <T extends { id: number; [key: string]: any }>({
if (childResource === "article") { if (childResource === "article") {
setPageNum(pageNum + 1); setPageNum(pageNum + 1);
} }
onUpdate?.();
}); });
}) })
.catch((error) => { .catch((error) => {
@ -247,6 +263,7 @@ export const LinkedItems = <T extends { id: number; [key: string]: any }>({
) )
.then(() => { .then(() => {
setLinkedItems((prev) => prev.filter((item) => item.id !== itemId)); setLinkedItems((prev) => prev.filter((item) => item.id !== itemId));
onUpdate?.();
}) })
.catch((error) => { .catch((error) => {
console.error("Error unlinking item:", error); console.error("Error unlinking item:", error);
@ -495,8 +512,12 @@ export const LinkedItems = <T extends { id: number; [key: string]: any }>({
</Stack> </Stack>
</AccordionDetails> </AccordionDetails>
</Accordion> </Accordion>
<ArticleEditModal /> {!dontRecurse &&
<StationEditModal /> <>
<ArticleEditModal />
<StationEditModal />
</>
}
</> </>
); );
}; };

View File

@ -18,6 +18,8 @@ import {
} from "../../media/MediaFormUtils"; } from "../../media/MediaFormUtils";
import { axiosInstance } from "../../../providers/data"; import { axiosInstance } from "../../../providers/data";
import { TOKEN_KEY } from "../../../authProvider"; import { TOKEN_KEY } from "../../../authProvider";
import { LinkedItems } from "../../../components/LinkedItems";
import { mediaFields, MediaItem } from "../../../pages/article/types";
const MemoizedSimpleMDE = memo(MarkdownEditor); const MemoizedSimpleMDE = memo(MarkdownEditor);
@ -29,15 +31,17 @@ type MediaFile = {
}; };
const style = { const style = {
position: "absolute", marginLeft: "auto",
top: "50%", marginRight: "auto",
left: "50%", //position: "absolute",
transform: "translate(-50%, -50%)", //top: "50%",
//left: "50%",
//transform: "translate(-50%, -50%)",
width: "60%", width: "60%",
bgcolor: "background.paper", bgcolor: "background.paper",
border: "2px solid #000", border: "2px solid #000",
boxShadow: 24, boxShadow: 24,
p: 4, p: 4
}; };
export const ArticleEditModal = observer(() => { export const ArticleEditModal = observer(() => {
@ -68,46 +72,47 @@ export const ArticleEditModal = observer(() => {
}, []); }, []);
// Load existing media files when editing an article // Load existing media files when editing an article
useEffect(() => { const loadExistingMedia = async () => {
const loadExistingMedia = async () => { console.log("Called loadExistingMedia")
if (selectedArticleId) { if (selectedArticleId) {
try { try {
const response = await axiosInstance.get( const response = await axiosInstance.get(
`${ `${
import.meta.env.VITE_KRBL_API import.meta.env.VITE_KRBL_API
}/article/${selectedArticleId}/media` }/article/${selectedArticleId}/media`
); );
const existingMedia = response.data; const existingMedia = response.data;
// Convert existing media to MediaFile format // Convert existing media to MediaFile format
const mediaFiles = await Promise.all( const mediaFiles = await Promise.all(
existingMedia.map(async (media: any) => { existingMedia.map(async (media: any) => {
const response = await fetch( const response = await fetch(
`${import.meta.env.VITE_KRBL_MEDIA}${ `${import.meta.env.VITE_KRBL_MEDIA}${
media.id media.id
}/download?token=${localStorage.getItem(TOKEN_KEY)}` }/download?token=${localStorage.getItem(TOKEN_KEY)}`
); );
const blob = await response.blob(); const blob = await response.blob();
const file = new File([blob], media.filename, { const file = new File([blob], media.filename, {
type: media.media_type === 1 ? "image/jpeg" : "video/mp4", type: media.media_type === 1 ? "image/jpeg" : "video/mp4",
}); });
return { return {
file, file,
preview: URL.createObjectURL(blob), preview: URL.createObjectURL(blob),
uploading: false, uploading: false,
mediaId: media.id, mediaId: media.id,
}; };
}) })
); );
setMediaFiles(mediaFiles); setMediaFiles(mediaFiles);
} catch (error) { } catch (error) {
console.error("Error loading existing media:", error); console.error("Error loading existing media:", error);
}
} }
}; }
};
useEffect(() => {
loadExistingMedia(); loadExistingMedia();
}, [selectedArticleId]); }, [selectedArticleId]);
@ -264,6 +269,7 @@ export const ArticleEditModal = observer(() => {
onClose={() => setArticleModalOpenAction(false)} onClose={() => setArticleModalOpenAction(false)}
aria-labelledby="modal-modal-title" aria-labelledby="modal-modal-title"
aria-describedby="modal-modal-description" aria-describedby="modal-modal-description"
sx={{overflow: "auto"}}
> >
<Box sx={style}> <Box sx={style}>
<Edit <Edit
@ -309,6 +315,19 @@ export const ArticleEditModal = observer(() => {
/> />
)} )}
/> />
{selectedArticleId && (
<LinkedItems<MediaItem>
type="edit"
parentId={selectedArticleId}
parentResource="article"
childResource="media"
fields={mediaFields}
title="медиа"
dontRecurse
onUpdate={loadExistingMedia}
/>
)}
</Box> </Box>
{/* Dropzone для медиа файлов */} {/* Dropzone для медиа файлов */}

View File

@ -978,14 +978,14 @@ export const SightEdit = observer(() => {
</Paper> </Paper>
</Box> </Box>
</Edit> </Edit>
{!leftArticleId && ( {/* {!leftArticleId && (
<CreateSightArticle <CreateSightArticle
parentId={sightId!} parentId={sightId!}
parentResource="sight" parentResource="sight"
childResource="article" childResource="article"
title="левую статью" title="левую статью"
/> />
)} )} */}
{leftArticleId && ( {leftArticleId && (
<Button <Button
variant="outlined" variant="outlined"