-
-
Notifications
You must be signed in to change notification settings - Fork 139
Expand file tree
/
Copy pathColumnVisibilityPopover.swift
More file actions
105 lines (89 loc) · 2.79 KB
/
ColumnVisibilityPopover.swift
File metadata and controls
105 lines (89 loc) · 2.79 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
//
// ColumnVisibilityPopover.swift
// TablePro
//
import SwiftUI
struct ColumnVisibilityPopover: View {
let columns: [String]
let columnVisibilityManager: ColumnVisibilityManager
@State private var searchText = ""
private var filteredColumns: [String] {
if searchText.isEmpty {
return columns
}
return columns.filter { $0.localizedCaseInsensitiveContains(searchText) }
}
var body: some View {
VStack(spacing: 0) {
header
Divider()
if columns.count > 5 {
searchField
Divider()
}
columnList
}
.frame(width: 260)
.frame(maxHeight: 420)
}
private var headerTitle: String {
let visible = columns.count - columnVisibilityManager.hiddenCount
if columnVisibilityManager.hasHiddenColumns {
return "\(visible) of \(columns.count)"
}
return String(localized: "Columns")
}
private var header: some View {
HStack {
Text(headerTitle)
.font(.headline)
.foregroundStyle(.primary)
Spacer()
Button("Show All") {
columnVisibilityManager.showAll()
}
.buttonStyle(.plain)
.foregroundStyle(Color.accentColor)
.controlSize(.small)
.disabled(!columnVisibilityManager.hasHiddenColumns)
Button("Hide All") {
columnVisibilityManager.hideAll(columns)
}
.buttonStyle(.plain)
.foregroundStyle(Color.accentColor)
.controlSize(.small)
.disabled(columnVisibilityManager.hiddenCount == columns.count)
}
.padding(.horizontal, 12)
.padding(.vertical, 8)
}
private var searchField: some View {
TextField(String(localized: "Search columns..."), text: $searchText)
.textFieldStyle(.roundedBorder)
.controlSize(.small)
.padding(.horizontal, 12)
.padding(.vertical, 6)
}
private var columnList: some View {
ScrollView {
LazyVStack(alignment: .leading, spacing: 0) {
ForEach(filteredColumns, id: \.self) { column in
columnRow(column)
}
}
}
}
private func columnRow(_ column: String) -> some View {
Toggle(isOn: Binding(
get: { !columnVisibilityManager.hiddenColumns.contains(column) },
set: { _ in columnVisibilityManager.toggleColumn(column) }
)) {
Text(column)
.lineLimit(1)
.truncationMode(.tail)
}
.toggleStyle(.checkbox)
.padding(.horizontal, 12)
.padding(.vertical, 3)
}
}