remaining fixes
This commit is contained in:
parent
fba2fb0f5c
commit
177653d84a
@ -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);
|
||||
|
||||
|
@ -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 />
|
||||
</>
|
||||
}
|
||||
</>
|
||||
);
|
||||
};
|
||||
|
@ -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 для медиа файлов */}
|
||||
|
@ -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"
|
||||
|
Loading…
Reference in New Issue
Block a user