@@ -23,19 +23,22 @@ private struct NewListTableItemView: View {
23
23
let keyColumnName : String
24
24
let valueColumnName : String
25
25
let newItemInstruction : String
26
+ let validKeys : [ String ]
26
27
let headerView : AnyView ?
27
28
var completion : ( String , String ) -> Void
28
29
29
30
init (
30
31
_ keyColumnName: String ,
31
32
_ valueColumnName: String ,
32
33
_ newItemInstruction: String ,
34
+ validKeys: [ String ] ,
33
35
headerView: AnyView ? = nil ,
34
36
completion: @escaping ( String , String ) -> Void
35
37
) {
36
38
self . keyColumnName = keyColumnName
37
39
self . valueColumnName = valueColumnName
38
40
self . newItemInstruction = newItemInstruction
41
+ self . validKeys = validKeys
39
42
self . headerView = headerView
40
43
self . completion = completion
41
44
}
@@ -44,8 +47,18 @@ private struct NewListTableItemView: View {
44
47
VStack ( spacing: 0 ) {
45
48
Form {
46
49
Section {
47
- TextField ( keyColumnName, text: $key)
48
- . textFieldStyle ( . plain)
50
+ if validKeys. isEmpty {
51
+ TextField ( keyColumnName, text: $key)
52
+ . textFieldStyle ( . plain)
53
+ } else {
54
+ Picker ( keyColumnName, selection: $key) {
55
+ ForEach ( validKeys, id: \. self) { key in
56
+ Text ( key) . tag ( key)
57
+ }
58
+ Divider ( )
59
+ Text ( " No Selection " ) . tag ( " " )
60
+ }
61
+ }
49
62
TextField ( valueColumnName, text: $value)
50
63
. textFieldStyle ( . plain)
51
64
} header: {
@@ -84,6 +97,7 @@ private struct NewListTableItemView: View {
84
97
struct KeyValueTable < Header: View > : View {
85
98
@Binding var items : [ String : String ]
86
99
100
+ let validKeys : [ String ]
87
101
let keyColumnName : String
88
102
let valueColumnName : String
89
103
let newItemInstruction : String
@@ -95,65 +109,66 @@ struct KeyValueTable<Header: View>: View {
95
109
96
110
init (
97
111
items: Binding < [ String : String ] > ,
112
+ validKeys: [ String ] = [ ] ,
98
113
keyColumnName: String ,
99
114
valueColumnName: String ,
100
115
newItemInstruction: String ,
101
116
@ViewBuilder header: @escaping ( ) -> Header = { EmptyView ( ) }
102
117
) {
103
118
self . _items = items
119
+ self . validKeys = validKeys
104
120
self . keyColumnName = keyColumnName
105
121
self . valueColumnName = valueColumnName
106
122
self . newItemInstruction = newItemInstruction
107
123
self . header = header
108
124
}
109
125
110
126
var body : some View {
111
- VStack {
112
- Table ( tableItems, selection: $selection) {
113
- TableColumn ( keyColumnName) { item in
114
- Text ( item. key)
115
- }
116
- TableColumn ( valueColumnName) { item in
117
- Text ( item. value)
118
- }
127
+ Table ( tableItems, selection: $selection) {
128
+ TableColumn ( keyColumnName) { item in
129
+ Text ( item. key)
119
130
}
120
- . frame ( height: 200 )
121
- . actionBar {
122
- HStack ( spacing: 2 ) {
123
- Button {
124
- showingModal = true
125
- } label: {
126
- Image ( systemName: " plus " )
127
- }
131
+ TableColumn ( valueColumnName) { item in
132
+ Text ( item. value)
133
+ }
134
+ }
135
+ . frame ( height: 200 )
136
+ . actionBar {
137
+ HStack ( spacing: 2 ) {
138
+ Button {
139
+ showingModal = true
140
+ } label: {
141
+ Image ( systemName: " plus " )
142
+ }
128
143
129
- Divider ( )
130
- . frame ( minHeight: 15 )
144
+ Divider ( )
145
+ . frame ( minHeight: 15 )
131
146
132
- Button {
133
- removeItem ( )
134
- } label: {
135
- Image ( systemName: " minus " )
136
- }
137
- . disabled ( selection == nil )
138
- . opacity ( selection == nil ? 0.5 : 1 )
147
+ Button {
148
+ removeItem ( )
149
+ } label: {
150
+ Image ( systemName: " minus " )
139
151
}
140
- Spacer ( )
152
+ . disabled ( selection == nil )
153
+ . opacity ( selection == nil ? 0.5 : 1 )
141
154
}
142
- . sheet ( isPresented: $showingModal) {
143
- NewListTableItemView (
144
- keyColumnName,
145
- valueColumnName,
146
- newItemInstruction,
147
- headerView: AnyView ( header ( ) )
148
- ) { key, value in
149
- items [ key] = value
150
- updateTableItems ( )
151
- showingModal = false
152
- }
155
+ Spacer ( )
156
+ }
157
+ . sheet ( isPresented: $showingModal) {
158
+ NewListTableItemView (
159
+ keyColumnName,
160
+ valueColumnName,
161
+ newItemInstruction,
162
+ validKeys: validKeys,
163
+ headerView: AnyView ( header ( ) )
164
+ ) { key, value in
165
+ items [ key] = value
166
+ updateTableItems ( )
167
+ showingModal = false
153
168
}
154
- . clipShape ( RoundedRectangle ( cornerRadius: 6 ) )
155
- . onAppear ( perform: updateTableItems)
156
169
}
170
+ . cornerRadius ( 6 )
171
+ . onAppear ( perform: updateTableItems)
157
172
}
158
173
159
174
private func updateTableItems( ) {
0 commit comments