130 lines
3.8 KiB
Swift
130 lines
3.8 KiB
Swift
import SwiftUI
|
|
import SFSafeSymbols
|
|
|
|
private struct TextWithSymbol: Comparable, Identifiable {
|
|
|
|
let symbol: SFSymbol
|
|
|
|
let color: Color
|
|
|
|
let text: String
|
|
|
|
static func < (lhs: TextWithSymbol, rhs: TextWithSymbol) -> Bool {
|
|
lhs.text < rhs.text
|
|
}
|
|
|
|
var id: String {
|
|
text
|
|
}
|
|
}
|
|
|
|
struct PageContentResultsView: View {
|
|
|
|
@Environment(\.language)
|
|
private var language
|
|
|
|
@ObservedObject
|
|
var results: PageGenerationResults
|
|
|
|
private var totalFileCount: Int {
|
|
results.usedFiles.count + results.missingFiles.count + results.missingLinkedFiles.count
|
|
}
|
|
|
|
private var allFiles: [TextWithSymbol] {
|
|
results.usedFiles.map {
|
|
TextWithSymbol(
|
|
symbol: $0.type.category.symbol,
|
|
color: .blue,
|
|
text: $0.id)
|
|
}
|
|
+ results.missingFiles.keys.map {
|
|
TextWithSymbol(
|
|
symbol: .questionmarkCircleFill,
|
|
color: .red,
|
|
text: $0)
|
|
}
|
|
+ results.missingLinkedFiles.keys.map {
|
|
TextWithSymbol(
|
|
symbol: .questionmarkCircleFill,
|
|
color: .red,
|
|
text: $0)
|
|
}
|
|
}
|
|
|
|
private var totalLinkCount: Int {
|
|
results.externalLinks.count +
|
|
results.missingLinkedPages.count +
|
|
results.linkedPages.count
|
|
}
|
|
|
|
private var allLinks: [TextWithSymbol] {
|
|
results.externalLinks.map {
|
|
TextWithSymbol(
|
|
symbol: .network,
|
|
color: .blue,
|
|
text: $0)
|
|
}
|
|
+ results.missingLinkedPages.keys.map {
|
|
TextWithSymbol(
|
|
symbol: .questionmarkCircleFill,
|
|
color: .red,
|
|
text: $0)
|
|
}
|
|
+ results.linkedPages.map {
|
|
TextWithSymbol(
|
|
symbol: .docBadgePlus,
|
|
color: .blue,
|
|
text: $0.title(in: language))
|
|
}
|
|
}
|
|
|
|
var body: some View {
|
|
HStack {
|
|
PopupWithList(
|
|
symbol: .photoOnRectangleAngled,
|
|
text: "\(totalFileCount) files", canShowPopup: totalFileCount > 0) {
|
|
Text("Files")
|
|
.font(.title)
|
|
List {
|
|
ForEach(allFiles.sorted()) { file in
|
|
HStack {
|
|
Image(systemSymbol: file.symbol)
|
|
.frame(width: 18)
|
|
.foregroundStyle(file.color)
|
|
Text(file.text)
|
|
}
|
|
}
|
|
}
|
|
.frame(minHeight: 400)
|
|
}
|
|
|
|
PopupWithList(
|
|
symbol: .photoOnRectangleAngled,
|
|
text: "\(totalLinkCount) links", canShowPopup: totalLinkCount > 0) {
|
|
Text("Links")
|
|
.font(.title)
|
|
List {
|
|
ForEach(allLinks.sorted()) { file in
|
|
HStack {
|
|
Image(systemSymbol: file.symbol)
|
|
.frame(width: 18)
|
|
.foregroundStyle(file.color)
|
|
Text(file.text)
|
|
}
|
|
}
|
|
}
|
|
.frame(minHeight: 400)
|
|
}
|
|
|
|
if !results.invalidCommands.isEmpty {
|
|
TextWithPopup(
|
|
symbol: .exclamationmarkTriangleFill,
|
|
title: "Invalid commands",
|
|
text: "\(results.invalidCommands.count) invalid commands",
|
|
items: results.invalidCommands.map { $0.markdown }.sorted())
|
|
.foregroundStyle(.red)
|
|
}
|
|
}
|
|
}
|
|
}
|