dragging styling

This commit is contained in:
2024-09-20 08:57:33 -06:00
parent 65cdb15e1c
commit 2b6b345f88
5 changed files with 74 additions and 37 deletions

View File

@@ -28,7 +28,7 @@ export default function CourseCalendar() {
min-h-0 min-h-0
border-4 border-4
border-gray-900 border-gray-900
rounded-xl rounded-lg
bg-slate-950 bg-slate-950
p-1 p-1
" "

View File

@@ -17,6 +17,7 @@ import { LocalCoursePage } from "@/models/local/page/localCoursePage";
import { useCanvasAssignmentsQuery } from "@/hooks/canvas/canvasAssignmentHooks"; import { useCanvasAssignmentsQuery } from "@/hooks/canvas/canvasAssignmentHooks";
import { useCanvasQuizzesQuery } from "@/hooks/canvas/canvasQuizHooks"; import { useCanvasQuizzesQuery } from "@/hooks/canvas/canvasQuizHooks";
import { useCanvasPagesQuery } from "@/hooks/canvas/canvasPageHooks"; import { useCanvasPagesQuery } from "@/hooks/canvas/canvasPageHooks";
import DropTargetStyling from "./DropTargetStyling";
export default function Day({ day, month }: { day: string; month: number }) { export default function Day({ day, month }: { day: string; month: number }) {
const dayAsDate = getDateFromStringOrThrow( const dayAsDate = getDateFromStringOrThrow(
@@ -45,40 +46,42 @@ export default function Day({ day, month }: { day: string; month: number }) {
return ( return (
<div <div
className={" rounded-lg pb-4 m-1 " + meetingClasses + monthClass} className={" rounded-lg m-1 min-h-10 " + meetingClasses + monthClass}
onDrop={(e) => itemDrop(e, day)} onDrop={(e) => itemDrop(e, day)}
onDragOver={(e) => e.preventDefault()} onDragOver={(e) => e.preventDefault()}
> >
<DayTitle day={day} dayAsDate={dayAsDate} /> <DropTargetStyling draggingClassName="bg-slate-800 shadow-2xl ">
<div> <DayTitle day={day} dayAsDate={dayAsDate} />
{todaysAssignments.map(({ assignment, moduleName, status }) => ( <div>
<DraggableListItem {todaysAssignments.map(({ assignment, moduleName, status }) => (
key={assignment.name} <DraggableListItem
type={"assignment"} key={assignment.name}
moduleName={moduleName} type={"assignment"}
item={assignment} moduleName={moduleName}
status={status} item={assignment}
/> status={status}
))} />
{todaysQuizzes.map(({ quiz, moduleName, status }) => ( ))}
<DraggableListItem {todaysQuizzes.map(({ quiz, moduleName, status }) => (
key={quiz.name} <DraggableListItem
type={"quiz"} key={quiz.name}
moduleName={moduleName} type={"quiz"}
item={quiz} moduleName={moduleName}
status={status} item={quiz}
/> status={status}
))} />
{todaysPages.map(({ page, moduleName, status }) => ( ))}
<DraggableListItem {todaysPages.map(({ page, moduleName, status }) => (
key={page.name} <DraggableListItem
type={"page"} key={page.name}
moduleName={moduleName} type={"page"}
item={page} moduleName={moduleName}
status={status} item={page}
/> status={status}
))} />
</div> ))}
</div>
</DropTargetStyling>
</div> </div>
); );
} }
@@ -183,6 +186,7 @@ function DraggableListItem({
item: IModuleItem; item: IModuleItem;
}) { }) {
const { courseName } = useCourseContext(); const { courseName } = useCourseContext();
const { dragStart } = useDraggingContext();
return ( return (
<Link <Link
href={getModuleItemUrl(courseName, moduleName, type, item.name)} href={getModuleItemUrl(courseName, moduleName, type, item.name)}
@@ -206,6 +210,7 @@ function DraggableListItem({
sourceModuleName: moduleName, sourceModuleName: moduleName,
}) })
); );
dragStart();
}} }}
> >
{item.name} {item.name}

View File

@@ -0,0 +1,22 @@
import React, { ReactNode } from "react";
import { useDraggingContext } from "../context/draggingContext";
export default function DropTargetStyling({
children,
draggingClassName,
}: {
children: ReactNode;
draggingClassName: string;
}) {
const { isDragging } = useDraggingContext();
return (
<div
className={
"h-full transition-all duration-500 " +
(isDragging ? draggingClassName : "")
}
>
{children}
</div>
);
}

View File

@@ -1,5 +1,5 @@
"use client"; "use client";
import { ReactNode, useCallback, DragEvent } from "react"; import { ReactNode, useCallback, DragEvent, useState } from "react";
import { DraggingContext } from "./draggingContext"; import { DraggingContext } from "./draggingContext";
import { useUpdateQuizMutation } from "@/hooks/localCourse/quizHooks"; import { useUpdateQuizMutation } from "@/hooks/localCourse/quizHooks";
import { useLocalCourseSettingsQuery } from "@/hooks/localCourse/localCoursesHooks"; import { useLocalCourseSettingsQuery } from "@/hooks/localCourse/localCoursesHooks";
@@ -22,11 +22,13 @@ export default function DraggingContextProvider({
const updateAssignmentMutation = useUpdateAssignmentMutation(); const updateAssignmentMutation = useUpdateAssignmentMutation();
const updatePageMutation = useUpdatePageMutation(); const updatePageMutation = useUpdatePageMutation();
const { data: settings } = useLocalCourseSettingsQuery(); const { data: settings } = useLocalCourseSettingsQuery();
const [isDragging, setIsDragging] = useState(false);
const dragStart = useCallback(() => setIsDragging(true), []);
const itemDrop = useCallback( const itemDrop = useCallback(
(e: DragEvent<HTMLDivElement>, day: string | undefined) => { (e: DragEvent<HTMLDivElement>, day: string | undefined) => {
const rawData = e.dataTransfer.getData("draggableItem"); const rawData = e.dataTransfer.getData("draggableItem");
// console.log(rawData);
const itemBeingDragged = JSON.parse(rawData); const itemBeingDragged = JSON.parse(rawData);
if (itemBeingDragged && day) { if (itemBeingDragged && day) {
@@ -66,6 +68,7 @@ export default function DraggingContextProvider({
}); });
} }
} }
setIsDragging(false);
function updateAssignment(dayAsDate: Date) { function updateAssignment(dayAsDate: Date) {
const previousAssignment = itemBeingDragged.item as LocalAssignment; const previousAssignment = itemBeingDragged.item as LocalAssignment;
@@ -101,6 +104,8 @@ export default function DraggingContextProvider({
<DraggingContext.Provider <DraggingContext.Provider
value={{ value={{
itemDrop, itemDrop,
isDragging,
dragStart,
}} }}
> >
{children} {children}

View File

@@ -9,12 +9,17 @@ export interface DraggableItem {
} }
export interface DraggingContextInterface { export interface DraggingContextInterface {
itemDrop: (e: DragEvent<HTMLDivElement>,droppedOnDay?: string) => void; itemDrop: (e: DragEvent<HTMLDivElement>, droppedOnDay?: string) => void;
isDragging: boolean;
dragStart: () => void;
} }
const defaultDraggingValue: DraggingContextInterface = { const defaultDraggingValue: DraggingContextInterface = {
itemDrop: () => { }, itemDrop: () => {},
isDragging: false,
dragStart: () => {},
}; };
export const DraggingContext = createContext<DraggingContextInterface>(defaultDraggingValue); export const DraggingContext =
createContext<DraggingContextInterface>(defaultDraggingValue);
export function useDraggingContext() { export function useDraggingContext() {
return useContext(DraggingContext); return useContext(DraggingContext);