@@ -5,6 +5,7 @@ import { AccessTypes, EditAccessModelInput } from '@/gql/generated/graphql';
55import { useMutation , useQuery } from '@tanstack/react-query' ;
66import {
77 Button ,
8+ Combobox ,
89 Divider ,
910 Icon ,
1011 Select ,
@@ -130,14 +131,23 @@ const AccessModelForm: React.FC<AccessModelProps> = ({
130131 } ) ;
131132 const [ selectedResources , setSelectedResources ] = useState < string [ ] > ( [ ] ) ;
132133 const [ showSelectAll , setShowSelectAll ] = useState ( false ) ;
133- const [ availableResources , setAvailableResources ] = useState < any [ ] > ( [ ] ) ;
134+
135+ const [ availableResources , setAvailableResources ] = useState <
136+ { label : string ; value : string ; schema : [ ] } [ ]
137+ > ( [ ] ) ;
138+
139+ const [ selectedFields , setSelectedFields ] = useState <
140+ { label : string ; value : string } [ ]
141+ > ( [ ] ) ;
134142
135143 useEffect ( ( ) => {
136144 if ( data ) {
137145 setAvailableResources (
138- data . datasetResources . filter (
139- ( resource : any ) => ! selectedResources . includes ( resource . id )
140- )
146+ data . datasetResources . map ( ( field : any ) => ( {
147+ label : field . name ,
148+ value : field . id ,
149+ schema : field . schema ,
150+ } ) )
141151 ) ;
142152 }
143153 } , [ data , selectedResources ] ) ;
@@ -147,43 +157,54 @@ const AccessModelForm: React.FC<AccessModelProps> = ({
147157 refetch ( ) ;
148158 setAccessModelData ( {
149159 dataset : params . id ,
150- name : accessModelDetails . accessModel . name ,
151- description : accessModelDetails . accessModel . description ,
152- type : accessModelDetails . accessModel . type ,
160+ name : accessModelDetails ? .accessModel . name ,
161+ description : accessModelDetails ? .accessModel . description ,
162+ type : accessModelDetails ? .accessModel . type ,
153163 resources : [ ] ,
154- accessModelId : accessModelDetails . accessModel . id ,
164+ accessModelId : accessModelDetails ? .accessModel . id ,
155165 } ) ;
156166 }
157167 } , [ accessModelId ] ) ;
158168
159169 const [ resId , setResId ] = useState ( '' ) ;
160170
161171 // Inside handleAddResource function
162- const handleAddResource = ( resourceId : string ) => {
163- if ( resourceId !== '' ) {
164- setSelectedResources ( ( prev ) => [ ...prev , resourceId ] ) ;
165- setResId ( '' ) ;
166- setAvailableResources ( ( prev ) =>
167- prev . filter ( ( item ) => item . id !== resourceId )
168- ) ; // Filter out the selected resource
169- }
172+ const handleAddResource = ( resourceId : any ) => {
173+ setSelectedResources ( resourceId ) ;
174+ setResId ( '' ) ;
175+ setAvailableResources ( resourceId ) ; // Filter out the selected resource
176+ setSelectedFields ( resourceId ) ;
170177 } ;
171178
172- const handleRemoveResource = ( resourceId : string ) => {
173- setSelectedResources ( ( prev ) => prev . filter ( ( id ) => id !== resourceId ) ) ;
174- setResId ( '' ) ;
179+ const handleRemoveResource = ( resourceId : any ) => {
180+ // Filter out the selected resource from selectedResources
181+ setSelectedResources ( ( prevResources ) =>
182+ prevResources . filter ( ( resource : any ) => resource . value !== resourceId )
183+ ) ;
184+
185+ // Filter out the selected fields associated with the removed resource
186+ setSelectedFields ( ( prevFields ) =>
187+ prevFields . filter ( ( field ) => field . value . split ( '.' ) [ 0 ] !== resourceId )
188+ ) ;
189+ // Remove the corresponding resource from accessModelData.resources
175190 setAccessModelData ( ( prevData : any ) => ( {
176191 ...prevData ,
177192 resources : prevData . resources . filter (
178- ( resource : any ) => resource . resource !== resourceId
193+ ( resource : any ) => resource . id !== resourceId
179194 ) ,
180195 } ) ) ;
181196 } ;
182197
183198 const handleSelectAll = ( ) => {
184- const allResourceIds =
185- data ?. datasetResources . map ( ( resource : any ) => resource . id ) || [ ] ;
186- setSelectedResources ( allResourceIds ) ;
199+ const allResources =
200+ data ?. datasetResources . map ( ( resource : any ) => ( {
201+ label : resource . name ,
202+ value : resource . id ,
203+ schema : resource . schema ,
204+ } ) ) || [ ] ;
205+ setSelectedFields ( allResources ) ;
206+
207+ setSelectedResources ( allResources ) ;
187208 setShowSelectAll ( false ) ;
188209 } ;
189210
@@ -202,8 +223,6 @@ const AccessModelForm: React.FC<AccessModelProps> = ({
202223
203224 const [ isSheetOpen , setIsSheetOpen ] = useState ( false ) ;
204225
205- console . log ( accessModelDetails ) ;
206-
207226 return (
208227 < div className = "rounded-2 border-2 border-solid border-baseGraySlateSolid6 px-6 py-8" >
209228 < div className = "mb-6 flex flex-wrap items-center justify-between gap-6" >
@@ -346,34 +365,19 @@ const AccessModelForm: React.FC<AccessModelProps> = ({
346365 </ div >
347366
348367 < div className = "flex flex-wrap items-center gap-5" >
349- < Select
350- name = { 'resourceSelection' }
351- className = "w-4/5"
352- options = {
353- availableResources . length > 0
354- ? [
355- { label : 'Select' , value : '' } ,
356- ...availableResources . map ( ( item ) => ( {
357- label : item . name ,
358- value : item . id ,
359- } ) ) ,
360- ]
361- : [ { label : 'Select' , value : '' } ] // Render only 'Select' when no resources are available
362- }
363- label = { 'Select the Resources to be added to the Access Type' }
364- onChange = { ( e ) => setResId ( e ) }
365- required
366- value = { resId }
367- helpText = "Only Resources added will be part of this Access Type. After adding select the Fields and Rows to be included"
368- />
368+ < div className = "w-full" >
369+ < Combobox
370+ displaySelected
371+ label = { 'Select Fields of the Resource' }
372+ list = { availableResources }
373+ selectedValue = { selectedFields }
374+ name = { '' }
375+ helpText = { 'Use the dropdown to add specific fields' }
376+ onChange = { ( e : any ) => handleAddResource ( e ) }
377+ />
378+ </ div >
369379
370380 < div className = "flex h-fit w-fit items-center gap-5" >
371- < Button onClick = { ( ) => handleAddResource ( resId ) } kind = "secondary" >
372- < span className = "flex items-center gap-1" >
373- < Text > Add</ Text >
374- < Icon source = { Icons . plus } size = { 24 } />
375- </ span >
376- </ Button >
377381 < Button onClick = { handleSelectAll } kind = "secondary" >
378382 < span className = "flex items-center gap-1" >
379383 < Text > Select All</ Text >
@@ -382,9 +386,9 @@ const AccessModelForm: React.FC<AccessModelProps> = ({
382386 </ Button >
383387 </ div >
384388 </ div >
385- { selectedResources . map ( ( resourceId , index ) => {
389+ { selectedResources ? .map ( ( resourceId : any , index ) => {
386390 const selectedResource = data ?. datasetResources . find (
387- ( resource : any ) => resource . id === resourceId
391+ ( resource : any ) => resource . id === resourceId . value
388392 ) ;
389393
390394 if ( ! selectedResource || ! selectedResource . schema ) {
0 commit comments