mirror of
https://github.com/alexmickelson/canvasManagement.git
synced 2026-03-25 23:28:33 -06:00
better assignment context menu
This commit is contained in:
@@ -11,6 +11,7 @@ import {
|
|||||||
useCanvasAssignmentsQuery,
|
useCanvasAssignmentsQuery,
|
||||||
useUpdateAssignmentInCanvasMutation,
|
useUpdateAssignmentInCanvasMutation,
|
||||||
useDeleteAssignmentFromCanvasMutation,
|
useDeleteAssignmentFromCanvasMutation,
|
||||||
|
useAddAssignmentToCanvasMutation,
|
||||||
} from "@/features/canvas/hooks/canvasAssignmentHooks";
|
} from "@/features/canvas/hooks/canvasAssignmentHooks";
|
||||||
import { useLocalCourseSettingsQuery } from "@/features/local/course/localCoursesHooks";
|
import { useLocalCourseSettingsQuery } from "@/features/local/course/localCoursesHooks";
|
||||||
import { baseCanvasUrl } from "@/features/canvas/services/canvasServiceUtils";
|
import { baseCanvasUrl } from "@/features/canvas/services/canvasServiceUtils";
|
||||||
@@ -35,12 +36,13 @@ export const AssignmentDayItemContextMenu: FC<{
|
|||||||
}> = ({ modalControl, item, moduleName }) => {
|
}> = ({ modalControl, item, moduleName }) => {
|
||||||
const { courseName } = useCourseContext();
|
const { courseName } = useCourseContext();
|
||||||
const calendarItems = useCalendarItemsContext();
|
const calendarItems = useCalendarItemsContext();
|
||||||
const createAssignment = useCreateAssignmentMutation();
|
const createAssignmentMutation = useCreateAssignmentMutation();
|
||||||
const deleteLocal = useDeleteAssignmentMutation();
|
const deleteLocalMutation = useDeleteAssignmentMutation();
|
||||||
|
const updateInCanvasMutation = useUpdateAssignmentInCanvasMutation();
|
||||||
|
const deleteFromCanvasMutation = useDeleteAssignmentFromCanvasMutation();
|
||||||
|
const addToCanvasMutation = useAddAssignmentToCanvasMutation();
|
||||||
const { data: canvasAssignments } = useCanvasAssignmentsQuery();
|
const { data: canvasAssignments } = useCanvasAssignmentsQuery();
|
||||||
const { data: settings } = useLocalCourseSettingsQuery();
|
const { data: settings } = useLocalCourseSettingsQuery();
|
||||||
const updateInCanvas = useUpdateAssignmentInCanvasMutation();
|
|
||||||
const deleteFromCanvas = useDeleteAssignmentFromCanvasMutation();
|
|
||||||
|
|
||||||
const [confirmingDelete, setConfirmingDelete] = useState(false);
|
const [confirmingDelete, setConfirmingDelete] = useState(false);
|
||||||
|
|
||||||
@@ -76,7 +78,7 @@ export const AssignmentDayItemContextMenu: FC<{
|
|||||||
(modules[moduleName]?.assignments ?? []).map((a) => a.name),
|
(modules[moduleName]?.assignments ?? []).map((a) => a.name),
|
||||||
);
|
);
|
||||||
const newName = getDuplicateName(item.name, existingNames);
|
const newName = getDuplicateName(item.name, existingNames);
|
||||||
createAssignment.mutate({
|
createAssignmentMutation.mutate({
|
||||||
courseName,
|
courseName,
|
||||||
moduleName,
|
moduleName,
|
||||||
assignmentName: newName,
|
assignmentName: newName,
|
||||||
@@ -86,13 +88,13 @@ export const AssignmentDayItemContextMenu: FC<{
|
|||||||
};
|
};
|
||||||
|
|
||||||
const handleDelete = () => {
|
const handleDelete = () => {
|
||||||
deleteLocal.mutate({ courseName, moduleName, assignmentName: item.name });
|
deleteLocalMutation.mutate({ courseName, moduleName, assignmentName: item.name });
|
||||||
handleClose();
|
handleClose();
|
||||||
};
|
};
|
||||||
|
|
||||||
const handleUpdateCanvas = () => {
|
const handleUpdateCanvas = () => {
|
||||||
if (assignmentInCanvas) {
|
if (assignmentInCanvas) {
|
||||||
updateInCanvas.mutate({
|
updateInCanvasMutation.mutate({
|
||||||
canvasAssignmentId: assignmentInCanvas.id,
|
canvasAssignmentId: assignmentInCanvas.id,
|
||||||
assignment: item as LocalAssignment,
|
assignment: item as LocalAssignment,
|
||||||
});
|
});
|
||||||
@@ -102,7 +104,7 @@ export const AssignmentDayItemContextMenu: FC<{
|
|||||||
|
|
||||||
const handleDeleteFromCanvas = () => {
|
const handleDeleteFromCanvas = () => {
|
||||||
if (assignmentInCanvas) {
|
if (assignmentInCanvas) {
|
||||||
deleteFromCanvas.mutate({
|
deleteFromCanvasMutation.mutate({
|
||||||
canvasAssignmentId: assignmentInCanvas.id,
|
canvasAssignmentId: assignmentInCanvas.id,
|
||||||
assignmentName: item.name,
|
assignmentName: item.name,
|
||||||
});
|
});
|
||||||
@@ -110,37 +112,44 @@ export const AssignmentDayItemContextMenu: FC<{
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const baseButtonClasses = "w-full text-left px-4 py-2";
|
const handleAddToCanvas = () => {
|
||||||
const normalHoverClasses = "hover:bg-slate-700 disabled:opacity-50";
|
addToCanvasMutation.mutate({
|
||||||
|
assignment: item as LocalAssignment,
|
||||||
|
moduleName,
|
||||||
|
});
|
||||||
|
handleClose();
|
||||||
|
};
|
||||||
|
|
||||||
|
const baseButtonClasses = " font-bold text-left py-1";
|
||||||
|
const normalButtonClass =
|
||||||
|
"hover:bg-blue-900 disabled:opacity-50 bg-blue-900/50 text-blue-50 border border-blue-800/70 rounded ";
|
||||||
const dangerClasses =
|
const dangerClasses =
|
||||||
"bg-rose-900/30 hover:bg-rose-950 disabled:opacity-50 text-rose-50";
|
"bg-rose-900/30 hover:bg-rose-950 disabled:opacity-50 text-rose-50 border border-rose-900/40 rounded";
|
||||||
return (
|
return (
|
||||||
<Modal modalControl={modalControl} backgroundCoverColor="bg-black/30">
|
<Modal modalControl={modalControl} backgroundCoverColor="bg-black/30">
|
||||||
{() => (
|
{() => (
|
||||||
<>
|
<div className="p-2">
|
||||||
<div className="text-center p-1 text-slate-200">
|
<div className="text-center p-1 text-slate-200 ">{item.name}</div>
|
||||||
{item.name}
|
<div className="flex flex-col gap-2">
|
||||||
</div>
|
|
||||||
{confirmingDelete ? (
|
{confirmingDelete ? (
|
||||||
<>
|
<>
|
||||||
<button
|
<div
|
||||||
disabled
|
className={``}
|
||||||
className={`${baseButtonClasses} ${normalHoverClasses}`}
|
|
||||||
>
|
>
|
||||||
Delete from disk?
|
Delete from disk?
|
||||||
|
</div>
|
||||||
|
<button
|
||||||
|
onClick={handleClose}
|
||||||
|
className={`unstyled ${baseButtonClasses} ${normalButtonClass}`}
|
||||||
|
>
|
||||||
|
Cancel
|
||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
onClick={handleDelete}
|
onClick={handleDelete}
|
||||||
className={`${baseButtonClasses} ${dangerClasses}`}
|
className={`unstyled ${baseButtonClasses} ${dangerClasses}`}
|
||||||
>
|
>
|
||||||
Yes, delete
|
Yes, delete
|
||||||
</button>
|
</button>
|
||||||
<button
|
|
||||||
onClick={handleClose}
|
|
||||||
className={`${baseButtonClasses} ${normalHoverClasses}`}
|
|
||||||
>
|
|
||||||
Cancel
|
|
||||||
</button>
|
|
||||||
</>
|
</>
|
||||||
) : (
|
) : (
|
||||||
<>
|
<>
|
||||||
@@ -150,21 +159,21 @@ export const AssignmentDayItemContextMenu: FC<{
|
|||||||
href={canvasUrl}
|
href={canvasUrl}
|
||||||
target="_blank"
|
target="_blank"
|
||||||
rel="noreferrer"
|
rel="noreferrer"
|
||||||
className="unstyled font-bold block px-3 py-1 hover:bg-slate-700 cursor-pointer"
|
className={` block px-3 ${baseButtonClasses} ${normalButtonClass}`}
|
||||||
onClick={handleClose}
|
onClick={handleClose}
|
||||||
>
|
>
|
||||||
View in Canvas
|
View in Canvas
|
||||||
</a>
|
</a>
|
||||||
<button
|
<button
|
||||||
onClick={handleUpdateCanvas}
|
onClick={handleUpdateCanvas}
|
||||||
disabled={updateInCanvas.isPending}
|
disabled={updateInCanvasMutation.isPending}
|
||||||
className="unstyled w-full text-left px-4 py-2 hover:bg-slate-700 disabled:opacity-50"
|
className={`unstyled ${baseButtonClasses} ${normalButtonClass}`}
|
||||||
>
|
>
|
||||||
Update in Canvas
|
Update in Canvas
|
||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
onClick={handleDeleteFromCanvas}
|
onClick={handleDeleteFromCanvas}
|
||||||
disabled={deleteFromCanvas.isPending}
|
disabled={deleteFromCanvasMutation.isPending}
|
||||||
className={`unstyled ${baseButtonClasses} ${dangerClasses}`}
|
className={`unstyled ${baseButtonClasses} ${dangerClasses}`}
|
||||||
>
|
>
|
||||||
Delete from Canvas
|
Delete from Canvas
|
||||||
@@ -172,22 +181,32 @@ export const AssignmentDayItemContextMenu: FC<{
|
|||||||
</>
|
</>
|
||||||
)}
|
)}
|
||||||
{!canvasUrl && (
|
{!canvasUrl && (
|
||||||
|
<>
|
||||||
|
<button
|
||||||
|
onClick={handleAddToCanvas}
|
||||||
|
disabled={addToCanvasMutation.isPending}
|
||||||
|
className={`unstyled ${baseButtonClasses} ${normalButtonClass}`}
|
||||||
|
>
|
||||||
|
Add to Canvas
|
||||||
|
</button>
|
||||||
<button
|
<button
|
||||||
onClick={() => setConfirmingDelete(true)}
|
onClick={() => setConfirmingDelete(true)}
|
||||||
className={`unstyled ${baseButtonClasses} ${dangerClasses}`}
|
className={`unstyled ${baseButtonClasses} ${dangerClasses}`}
|
||||||
>
|
>
|
||||||
Delete from Disk
|
Delete from Disk
|
||||||
</button>
|
</button>
|
||||||
|
</>
|
||||||
)}
|
)}
|
||||||
<button
|
<button
|
||||||
onClick={handleDuplicate}
|
onClick={handleDuplicate}
|
||||||
className={`unstyled ${baseButtonClasses} ${normalHoverClasses}`}
|
className={`unstyled ${baseButtonClasses} ${normalButtonClass}`}
|
||||||
>
|
>
|
||||||
Duplicate
|
Duplicate
|
||||||
</button>
|
</button>
|
||||||
</>
|
</>
|
||||||
)}
|
)}
|
||||||
</>
|
</div>
|
||||||
|
</div>
|
||||||
)}
|
)}
|
||||||
</Modal>
|
</Modal>
|
||||||
);
|
);
|
||||||
|
|||||||
Reference in New Issue
Block a user