More actions for generation sheet
This commit is contained in:
@ -20,9 +20,6 @@ struct MainView: App {
|
||||
@StateObject
|
||||
private var notifications: NotificationSender = .init()
|
||||
|
||||
@State
|
||||
private var language: ContentLanguage = .english
|
||||
|
||||
@StateObject
|
||||
private var selection: SelectedContent = .init()
|
||||
|
||||
@ -131,7 +128,7 @@ struct MainView: App {
|
||||
}
|
||||
.toolbar {
|
||||
ToolbarItem {
|
||||
Picker("", selection: $language) {
|
||||
Picker("", selection: $selection.language) {
|
||||
Text("English")
|
||||
.tag(ContentLanguage.english)
|
||||
Text("German")
|
||||
@ -180,13 +177,13 @@ struct MainView: App {
|
||||
}
|
||||
}
|
||||
.navigationTitle("")
|
||||
.environment(\.language, language)
|
||||
.environment(\.language, selection.language)
|
||||
.environmentObject(content)
|
||||
.environmentObject(selection)
|
||||
.onAppear(perform: loadContent)
|
||||
.sheet(isPresented: $showAddSheet) {
|
||||
addItemSheet
|
||||
.environment(\.language, language)
|
||||
.environment(\.language, selection.language)
|
||||
.environmentObject(content)
|
||||
.environmentObject(selection)
|
||||
}
|
||||
@ -195,13 +192,14 @@ struct MainView: App {
|
||||
.environmentObject(content)
|
||||
}
|
||||
.sheet(isPresented: $showSettingsSheet) {
|
||||
SettingsSheet(language: $language)
|
||||
SettingsSheet(language: $selection.language)
|
||||
.environmentObject(content)
|
||||
.presentedWindowStyle(.titleBar)
|
||||
}
|
||||
.sheet(isPresented: $showGenerationSheet) {
|
||||
GenerationContentView()
|
||||
.environmentObject(content)
|
||||
.environmentObject(selection)
|
||||
}
|
||||
.sheet(isPresented: $showPreviewSheet) {
|
||||
WebsitePreviewSheet()
|
||||
|
@ -2,6 +2,9 @@ import Foundation
|
||||
|
||||
final class SelectedContent: ObservableObject {
|
||||
|
||||
@Published
|
||||
var language: ContentLanguage = .english
|
||||
|
||||
@Published
|
||||
var tab: MainViewTab = .posts
|
||||
|
||||
|
@ -9,6 +9,9 @@ struct GenerationContentView: View {
|
||||
@EnvironmentObject
|
||||
private var content: Content
|
||||
|
||||
@EnvironmentObject
|
||||
private var selection: SelectedContent
|
||||
|
||||
@Environment(\.dismiss)
|
||||
private var dismiss
|
||||
|
||||
@ -74,18 +77,34 @@ struct GenerationContentView: View {
|
||||
text: "external files",
|
||||
statusWhenNonEmpty: .nominal,
|
||||
items: content.results.externalFiles) { $0.id }
|
||||
GenerationStringIssuesView(
|
||||
GenerationIssuesView(
|
||||
text: "empty pages",
|
||||
statusWhenNonEmpty: .warning,
|
||||
items: content.results.emptyPages) { "\($0.pageId) (\($0.language))" }
|
||||
GenerationStringIssuesView(
|
||||
text: "draft pages",
|
||||
items: $content.results.emptyPages) { pageId in
|
||||
HStack {
|
||||
Text("\(pageId.pageId) (\(pageId.language))")
|
||||
Spacer()
|
||||
Button("Show") {
|
||||
show(page: pageId.pageId,
|
||||
language: pageId.language)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
GenerationIssuesActionView(
|
||||
title: "draft pages",
|
||||
statusWhenNonEmpty: .warning,
|
||||
items: draftPages) { $0.id }
|
||||
GenerationStringIssuesView(
|
||||
text: "draft posts",
|
||||
items: draftPages,
|
||||
buttonText: "Show",
|
||||
itemText: { $0.id },
|
||||
action: { show($0) })
|
||||
GenerationIssuesActionView(
|
||||
title: "draft posts",
|
||||
statusWhenNonEmpty: .warning,
|
||||
items: draftPosts) { $0.id }
|
||||
items: draftPosts,
|
||||
buttonText: "Show",
|
||||
itemText: { $0.id },
|
||||
action: { show($0) })
|
||||
GenerationIssuesView(
|
||||
text: "additional output files",
|
||||
statusWhenNonEmpty: .warning,
|
||||
@ -147,6 +166,31 @@ struct GenerationContentView: View {
|
||||
}
|
||||
content.results.unusedFilesInOutput.remove(unusedFile)
|
||||
}
|
||||
|
||||
private func show(page pageId: String, language: ContentLanguage? = nil) {
|
||||
guard let page = content.page(pageId) else {
|
||||
return
|
||||
}
|
||||
show(page, language: language)
|
||||
}
|
||||
|
||||
private func show(_ page: Page, language: ContentLanguage? = nil) {
|
||||
selection.page = page
|
||||
if let language {
|
||||
selection.language = language
|
||||
}
|
||||
selection.tab = .pages
|
||||
dismiss()
|
||||
}
|
||||
|
||||
private func show(_ post: Post, language: ContentLanguage? = nil) {
|
||||
selection.post = post
|
||||
if let language {
|
||||
selection.language = language
|
||||
}
|
||||
selection.tab = .posts
|
||||
dismiss()
|
||||
}
|
||||
}
|
||||
|
||||
#Preview {
|
||||
|
@ -0,0 +1,76 @@
|
||||
import SwiftUI
|
||||
|
||||
struct GenerationIssuesActionView<S, T>: View where S: Collection, T: Hashable & Comparable, S.Element == T {
|
||||
|
||||
let title: String
|
||||
|
||||
let statusWhenNonEmpty: IssueStatus
|
||||
|
||||
let items: S
|
||||
|
||||
let buttonText: String
|
||||
|
||||
let itemText: (T) -> String
|
||||
|
||||
let action: (T) -> Void
|
||||
|
||||
@State
|
||||
private var showList = false
|
||||
|
||||
var status: IssueStatus {
|
||||
items.isEmpty ? .nominal : statusWhenNonEmpty
|
||||
}
|
||||
|
||||
init(title: String, statusWhenNonEmpty: IssueStatus = .error, items: S, buttonText: String, itemText: @escaping (T) -> String, action: @escaping (T) -> Void) {
|
||||
self.title = title
|
||||
self.statusWhenNonEmpty = statusWhenNonEmpty
|
||||
self.items = items
|
||||
self.buttonText = buttonText
|
||||
self.itemText = itemText
|
||||
self.action = action
|
||||
}
|
||||
|
||||
var body: some View {
|
||||
HStack {
|
||||
Button(action: showListIfNonEmpty) {
|
||||
Image(systemSymbol: status.symbol)
|
||||
.foregroundStyle(status.color)
|
||||
}.buttonStyle(.plain)
|
||||
Text("\(items.count) \(title)")
|
||||
}
|
||||
.sheet(isPresented: $showList) {
|
||||
VStack {
|
||||
Text("\(items.count) \(title)")
|
||||
.font(.title)
|
||||
List(items.sorted(), id: \.self) { item in
|
||||
HStack {
|
||||
Text(itemText(item))
|
||||
Spacer()
|
||||
Button(buttonText) { action(item) }
|
||||
}
|
||||
}
|
||||
.frame(minHeight: 400)
|
||||
Button("Close") { showList = false }
|
||||
}.padding()
|
||||
}
|
||||
}
|
||||
|
||||
private func showListIfNonEmpty() {
|
||||
guard !items.isEmpty else {
|
||||
return
|
||||
}
|
||||
showList = true
|
||||
}
|
||||
}
|
||||
|
||||
extension GenerationIssuesActionView where S == Set<String> {
|
||||
|
||||
init(title: String, statusWhenNonEmpty: IssueStatus = .error, items: Set<String>, buttonText: String, action: @escaping (T) -> Void) {
|
||||
self.title = title
|
||||
self.statusWhenNonEmpty = statusWhenNonEmpty
|
||||
self.items = items
|
||||
self.buttonText = buttonText
|
||||
self.itemText = { $0 }
|
||||
self.action = action
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user