diff --git a/src/components/cases/documents-tab.tsx b/src/components/cases/documents-tab.tsx
index 5cbbe3c..14d0dc9 100644
--- a/src/components/cases/documents-tab.tsx
+++ b/src/components/cases/documents-tab.tsx
@@ -298,13 +298,15 @@ export function CaseDocumentsTab({ caseId }: { caseId: string }) {
const deleteFolder = async (full: string) => {
const inFolder = docs.filter((d) => (d.folder || "") === full || (d.folder || "").startsWith(`${full}/`));
- if (inFolder.length && !confirm(`Folder "${full}" contains ${inFolder.length} file(s). Delete folder and all its files?`)) return;
- if (!inFolder.length && !confirm(`Delete empty folder "${full}"?`)) return;
- if (inFolder.length) {
- await supabase.storage.from("case-documents").remove(inFolder.map((d) => d.storage_path));
- await supabase.from("documents").delete().in("id", inFolder.map((d) => d.id));
+ const hasSubfolders = folders.some((f) => f.startsWith(`${full}/`));
+ if (inFolder.length || hasSubfolders) {
+ toast.error("Folder is not empty", {
+ description: "Move or delete its contents before deleting the folder.",
+ });
+ return;
}
- await supabase.from("document_folders").delete().eq("case_id", caseId).or(`path.eq.${full},path.like.${full}/%`);
+ if (!confirm(`Delete empty folder "${full}"?`)) return;
+ await supabase.from("document_folders").delete().eq("case_id", caseId).eq("path", full);
toast.success("Folder deleted");
load();
};
@@ -553,9 +555,6 @@ export function CaseDocumentsTab({ caseId }: { caseId: string }) {
-
))}
diff --git a/supabase/migrations/20260428003554_2a6c3c06-60aa-4155-998c-a442a62a5e01.sql b/supabase/migrations/20260428003554_2a6c3c06-60aa-4155-998c-a442a62a5e01.sql
new file mode 100644
index 0000000..5c368ac
--- /dev/null
+++ b/supabase/migrations/20260428003554_2a6c3c06-60aa-4155-998c-a442a62a5e01.sql
@@ -0,0 +1,10 @@
+-- Allow updates to documents (for moving between folders) and document_folders (for renaming/moving folders)
+CREATE POLICY documents_update_case ON public.documents
+FOR UPDATE TO authenticated
+USING (can_access_case(case_id, auth.uid()))
+WITH CHECK (can_access_case(case_id, auth.uid()));
+
+CREATE POLICY df_update_case ON public.document_folders
+FOR UPDATE TO authenticated
+USING (can_access_case(case_id, auth.uid()))
+WITH CHECK (can_access_case(case_id, auth.uid()));
\ No newline at end of file