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_VIDEO_TYPES,
} from "../components/media/MediaFormUtils";
import { LinkedItems } from "./LinkedItems";
import { mediaFields, MediaItem } from "../pages/article/types";
const MemoizedSimpleMDE = React.memo(MarkdownEditor);

View File

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

View File

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

View File

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