From cb041eb6ed1ded3a38059cc81eaac62f18fdb356 Mon Sep 17 00:00:00 2001 From: Christoph Hagen Date: Sun, 4 May 2025 11:48:31 +0200 Subject: [PATCH] Add button to delete page --- CHDataManagement/Main/SelectedContent.swift | 7 ++++++ CHDataManagement/Model/Content.swift | 12 ++++++++++ CHDataManagement/Storage/Storage.swift | 23 +++++++++++++++++++ .../Views/Pages/PageDetailView.swift | 13 +++++++++++ 4 files changed, 55 insertions(+) diff --git a/CHDataManagement/Main/SelectedContent.swift b/CHDataManagement/Main/SelectedContent.swift index df53e63..1c4fa89 100644 --- a/CHDataManagement/Main/SelectedContent.swift +++ b/CHDataManagement/Main/SelectedContent.swift @@ -22,4 +22,11 @@ final class SelectedContent: ObservableObject { self.post = nil } } + + func remove(_ page: Page) { + if self.page == page { + self.page = nil + } + } + } diff --git a/CHDataManagement/Model/Content.swift b/CHDataManagement/Model/Content.swift index 4ceb9f9..76ba452 100644 --- a/CHDataManagement/Model/Content.swift +++ b/CHDataManagement/Model/Content.swift @@ -135,6 +135,18 @@ final class Content: ObservableObject { posts.remove(post) } + func remove(_ page: Page) { + pages.remove(page) + for post in posts { + if post.linkedPage == page { + post.linkedPage = nil + } + } + // TODO: Check for page links and other references in content + } + + // MARK: Loading + func file(withOutputPath: String) -> FileResource? { files.first { $0.absoluteUrl == withOutputPath } } diff --git a/CHDataManagement/Storage/Storage.swift b/CHDataManagement/Storage/Storage.swift index 1e4d8c0..731d76f 100644 --- a/CHDataManagement/Storage/Storage.swift +++ b/CHDataManagement/Storage/Storage.swift @@ -147,6 +147,29 @@ final class Storage: ObservableObject { return result } + /** + Completely delete a post file from the content folder + */ + func delete(page pageId: String) -> Bool { + guard let contentScope else { + return false + } + guard contentScope.deleteFile(at: pageMetadataPath(page: pageId)) else { + return false + } + // Move the existing content files + var result = true + for language in ContentLanguage.allCases { + // Copy as many files as possible, since metadata was already moved + // Don't fail early + if !contentScope.deleteFile(at: pageContentPath(page: pageId, language: language)) { + print("Failed to delete content file \(language) of page \(pageId)") + result = false + } + } + return result + } + // MARK: Posts private func postFileName(_ postId: String) -> String { diff --git a/CHDataManagement/Views/Pages/PageDetailView.swift b/CHDataManagement/Views/Pages/PageDetailView.swift index 2e9d64f..aa423c5 100644 --- a/CHDataManagement/Views/Pages/PageDetailView.swift +++ b/CHDataManagement/Views/Pages/PageDetailView.swift @@ -9,6 +9,9 @@ struct PageDetailView: View { @EnvironmentObject private var content: Content + @EnvironmentObject + private var selection: SelectedContent + @ObservedObject private var page: Page @@ -73,10 +76,20 @@ struct PageDetailView: View { page: page.localized(in: language), transferImage: transferImage) .id(page.id + language.rawValue) + DeleteButton(action: deletePage) } .padding() } } + + private func deletePage() { + guard content.storage.delete(page: page.id) else { + print("Page '\(page.id)': Failed to delete file in content folder") + return + } + content.remove(page) + selection.remove(page) + } } extension PageDetailView: MainContentView {