@@ -23,19 +23,22 @@ private struct NewListTableItemView: View {
2323 let keyColumnName : String
2424 let valueColumnName : String
2525 let newItemInstruction : String
26+ let validKeys : [ String ]
2627 let headerView : AnyView ?
2728 var completion : ( String , String ) -> Void
2829
2930 init (
3031 _ keyColumnName: String ,
3132 _ valueColumnName: String ,
3233 _ newItemInstruction: String ,
34+ validKeys: [ String ] ,
3335 headerView: AnyView ? = nil ,
3436 completion: @escaping ( String , String ) -> Void
3537 ) {
3638 self . keyColumnName = keyColumnName
3739 self . valueColumnName = valueColumnName
3840 self . newItemInstruction = newItemInstruction
41+ self . validKeys = validKeys
3942 self . headerView = headerView
4043 self . completion = completion
4144 }
@@ -44,8 +47,18 @@ private struct NewListTableItemView: View {
4447 VStack ( spacing: 0 ) {
4548 Form {
4649 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+ }
4962 TextField ( valueColumnName, text: $value)
5063 . textFieldStyle ( . plain)
5164 } header: {
@@ -84,6 +97,7 @@ private struct NewListTableItemView: View {
8497struct KeyValueTable < Header: View > : View {
8598 @Binding var items : [ String : String ]
8699
100+ let validKeys : [ String ]
87101 let keyColumnName : String
88102 let valueColumnName : String
89103 let newItemInstruction : String
@@ -95,65 +109,66 @@ struct KeyValueTable<Header: View>: View {
95109
96110 init (
97111 items: Binding < [ String : String ] > ,
112+ validKeys: [ String ] = [ ] ,
98113 keyColumnName: String ,
99114 valueColumnName: String ,
100115 newItemInstruction: String ,
101116 @ViewBuilder header: @escaping ( ) -> Header = { EmptyView ( ) }
102117 ) {
103118 self . _items = items
119+ self . validKeys = validKeys
104120 self . keyColumnName = keyColumnName
105121 self . valueColumnName = valueColumnName
106122 self . newItemInstruction = newItemInstruction
107123 self . header = header
108124 }
109125
110126 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)
119130 }
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+ }
128143
129- Divider ( )
130- . frame ( minHeight: 15 )
144+ Divider ( )
145+ . frame ( minHeight: 15 )
131146
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 " )
139151 }
140- Spacer ( )
152+ . disabled ( selection == nil )
153+ . opacity ( selection == nil ? 0.5 : 1 )
141154 }
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
153168 }
154- . clipShape ( RoundedRectangle ( cornerRadius: 6 ) )
155- . onAppear ( perform: updateTableItems)
156169 }
170+ . cornerRadius ( 6 )
171+ . onAppear ( perform: updateTableItems)
157172 }
158173
159174 private func updateTableItems( ) {
0 commit comments