diff --git a/backend/stacks/handler.go b/backend/stacks/handler.go index 7748eeb..76c0b4a 100644 --- a/backend/stacks/handler.go +++ b/backend/stacks/handler.go @@ -147,10 +147,10 @@ func (h *StackHandler) deleteImageFromStack(w http.ResponseWriter, r *http.Reque func (h *StackHandler) deleteImageStackSchemaItem(w http.ResponseWriter, r *http.Request) { ctx := r.Context() - stringImageID := chi.URLParam(r, "stackID") + stringStackID := chi.URLParam(r, "stackID") stringSchemaItemID := chi.URLParam(r, "schemaItemID") - imageID, err := uuid.Parse(stringImageID) + stackID, err := uuid.Parse(stringStackID) if err != nil { w.WriteHeader(http.StatusBadRequest) return @@ -169,8 +169,9 @@ func (h *StackHandler) deleteImageStackSchemaItem(w http.ResponseWriter, r *http return } - stack, err := h.stackModel.Get(ctx, schemaItemID) + stack, err := h.stackModel.Get(ctx, stackID) if err != nil { + h.logger.Error("could not get stack model", "err", err) w.WriteHeader(http.StatusInternalServerError) return } @@ -185,7 +186,7 @@ func (h *StackHandler) deleteImageStackSchemaItem(w http.ResponseWriter, r *http // manipulations. So we could create a middleware. // If you repeat this 3 times, then organise it :) - err = h.stackModel.DeleteSchemaItem(ctx, schemaItemID, imageID) + err = h.stackModel.DeleteSchemaItem(ctx, stackID, schemaItemID) if err != nil { h.logger.Warn("failed to delete image from list", "error", err) w.WriteHeader(http.StatusInternalServerError) diff --git a/frontend/src/contexts/SearchImageContext.tsx b/frontend/src/contexts/SearchImageContext.tsx index 7f122d9..a4dd6ff 100644 --- a/frontend/src/contexts/SearchImageContext.tsx +++ b/frontend/src/contexts/SearchImageContext.tsx @@ -7,7 +7,13 @@ import { createResource, useContext, } from "solid-js"; -import { deleteImage, deleteImageFromStack, getUserImages, JustTheImageWhatAreTheseNames } from "../network"; +import { + deleteImage, + deleteImageFromStack, + deleteStackItem, + getUserImages, + JustTheImageWhatAreTheseNames, +} from "../network"; export type SearchImageStore = { imagesByDate: Accessor< @@ -21,40 +27,41 @@ export type SearchImageStore = { onRefetchImages: () => void; onDeleteImage: (imageID: string) => void; onDeleteImageFromStack: (stackID: string, imageID: string) => void; + onDeleteStackItem: (stackID: string, schemaItemID: string) => void; }; const SearchImageContext = createContext(); export const SearchImageContextProvider: Component = (props) => { const [data, { refetch }] = createResource(getUserImages); - const sortedImages = createMemo>( - () => { - const d = data(); - if (d == null) { - return []; + const sortedImages = createMemo< + ReturnType + >(() => { + const d = data(); + if (d == null) { + return []; + } + + // Sorted by day. But we could potentially add more in the future. + const buckets: Record = {}; + + for (const image of d.UserImages) { + if (image.CreatedAt == null) { + continue; } - // Sorted by day. But we could potentially add more in the future. - const buckets: Record = {}; - - for (const image of d.UserImages) { - if (image.CreatedAt == null) { - continue; - } - - const date = new Date(image.CreatedAt).toDateString(); - if (!(date in buckets)) { - buckets[date] = []; - } - - buckets[date].push(image); + const date = new Date(image.CreatedAt).toDateString(); + if (!(date in buckets)) { + buckets[date] = []; } - return Object.entries(buckets) - .map(([date, images]) => ({ date: new Date(date), images })) - .sort((a, b) => b.date.getTime() - a.date.getTime()); - }, - ); + buckets[date].push(image); + } + + return Object.entries(buckets) + .map(([date, images]) => ({ date: new Date(date), images })) + .sort((a, b) => b.date.getTime() - a.date.getTime()); + }); return ( = (props) => { }, onDeleteImageFromStack: (stackID: string, imageID: string) => { deleteImageFromStack(stackID, imageID).then(refetch); - } + }, + onDeleteStackItem: (stackID: string, schemaItemID: string) => { + deleteStackItem(stackID, schemaItemID).then(refetch); + }, }} > {props.children} diff --git a/frontend/src/network/index.ts b/frontend/src/network/index.ts index 2c7147f..13e009c 100644 --- a/frontend/src/network/index.ts +++ b/frontend/src/network/index.ts @@ -121,6 +121,18 @@ export const deleteImageFromStack = async (listID: string, imageID: string): Pro await fetch(request); } +export const deleteStackItem = async ( + stackID: string, + schemaItemID: string, +): Promise => { + const request = await getBaseAuthorizedRequest({ + path: `stacks/${stackID}/${schemaItemID}`, + method: "DELETE", + }); + + await fetch(request); +} + export const deleteList = async (listID: string): Promise => { const request = await getBaseAuthorizedRequest({ path: `stacks/${listID}`, diff --git a/frontend/src/pages/list/index.tsx b/frontend/src/pages/list/index.tsx index e0e6964..1f7927b 100644 --- a/frontend/src/pages/list/index.tsx +++ b/frontend/src/pages/list/index.tsx @@ -57,6 +57,59 @@ const DeleteButton: Component<{ onDelete: () => void }> = (props) => { ); }; +const DeleteSchemaItemButton: Component<{ + onDelete: () => void; + itemName: string; +}> = (props) => { + const [isOpen, setIsOpen] = createSignal(false); + + return ( + <> + + + + + +
+ + + Delete Column + + + Are you sure you want to delete the column " + {props.itemName}"? This will remove this column + and all its data from the list. + +
+ + + + +
+
+
+
+
+ + ); +}; + const DeleteListButton: Component<{ onDelete: () => void }> = (props) => { const [isOpen, setIsOpen] = createSignal(false); @@ -107,17 +160,22 @@ export const List: Component = () => { const { listId } = useParams(); const nav = useNavigate(); - const { stacks, onDeleteImageFromStack } = useSearchImageContext(); + const { stacks, onDeleteImageFromStack, onDeleteStackItem } = + useSearchImageContext(); const [accessToken] = createResource(getAccessToken); const list = () => stacks().find((l) => l.ID === listId); const handleDeleteList = async () => { - await deleteList(listId) + await deleteList(listId); nav("/"); }; + const handleDeleteSchemaItem = (schemaItemId: string) => { + onDeleteStackItem(listId, schemaItemId); + }; + return ( @@ -151,15 +209,25 @@ export const List: Component = () => { {(item, index) => ( - {item.Item} +
+ {item.Item} + + handleDeleteSchemaItem( + item.ID, + ) + } + itemName={item.Item} + /> +
)}
@@ -169,10 +237,11 @@ export const List: Component = () => { {(image, rowIndex) => (
@@ -199,13 +268,14 @@ export const List: Component = () => { {(item, colIndex) => (