1- import React from 'react' ;
1+ import React , { useState } from 'react' ;
22import {
33 Box ,
44 Flex ,
@@ -13,13 +13,20 @@ import {
1313 Textarea ,
1414 Switch ,
1515 Text ,
16+ MenuButton ,
17+ MenuList ,
18+ MenuItemOption ,
19+ MenuOptionGroup ,
20+ Button ,
21+ Menu ,
1622} from '@chakra-ui/react' ;
1723import {
1824 FaRegClone ,
1925 FaRegEye ,
2026 FaRegEyeSlash ,
2127 FaPlus ,
2228 FaTimes ,
29+ FaAngleDown ,
2330} from 'react-icons/fa' ;
2431import {
2532 ArrayInputOperations ,
@@ -30,6 +37,7 @@ import {
3037 TextAreaInputType ,
3138 SwitchInputType ,
3239 DateInputType ,
40+ MultiSelectInputType ,
3341} from '../constants' ;
3442import { copyTextToClipboard } from '../utils' ;
3543
@@ -39,13 +47,16 @@ const InputField = ({
3947 setVariables,
4048 fieldVisibility,
4149 setFieldVisibility,
50+ availableRoles,
4251 ...downshiftProps
4352} : any ) => {
4453 const props = {
4554 size : 'sm' ,
4655 ...downshiftProps ,
4756 } ;
48- const [ inputFieldVisibility , setInputFieldVisibility ] = React . useState <
57+ const [ availableUserRoles , setAvailableUserRoles ] =
58+ useState < string [ ] > ( availableRoles ) ;
59+ const [ inputFieldVisibility , setInputFieldVisibility ] = useState <
4960 Record < string , boolean >
5061 > ( {
5162 ROLES : false ,
@@ -54,7 +65,7 @@ const InputField = ({
5465 ALLOWED_ORIGINS : false ,
5566 roles : false ,
5667 } ) ;
57- const [ inputData , setInputData ] = React . useState < Record < string , string > > ( {
68+ const [ inputData , setInputData ] = useState < Record < string , string > > ( {
5869 ROLES : '' ,
5970 DEFAULT_ROLES : '' ,
6071 PROTECTED_ROLES : '' ,
@@ -116,7 +127,7 @@ const InputField = ({
116127 < InputGroup size = "sm" >
117128 < Input
118129 { ...props }
119- value = { variables [ inputType ] ?? '' }
130+ value = { variables [ inputType ] || '' }
120131 onChange = { (
121132 event : Event & {
122133 target : HTMLInputElement ;
@@ -221,7 +232,7 @@ const InputField = ({
221232 size = "xs"
222233 minW = "150px"
223234 placeholder = "add a new value"
224- value = { inputData [ inputType ] ?? '' }
235+ value = { inputData [ inputType ] || '' }
225236 onChange = { ( e : any ) => {
226237 setInputData ( { ...inputData , [ inputType ] : e . target . value } ) ;
227238 } }
@@ -278,6 +289,87 @@ const InputField = ({
278289 </ Select >
279290 ) ;
280291 }
292+ if ( Object . values ( MultiSelectInputType ) . includes ( inputType ) ) {
293+ return (
294+ < Flex w = "100%" style = { { position : 'relative' } } >
295+ < Flex
296+ border = "1px solid #e2e8f0"
297+ w = "100%"
298+ borderRadius = "var(--chakra-radii-sm)"
299+ p = "1% 0 0 2.5%"
300+ overflowX = { variables [ inputType ] . length > 3 ? 'scroll' : 'hidden' }
301+ overflowY = "hidden"
302+ justifyContent = "space-between"
303+ alignItems = "center"
304+ >
305+ < Flex justifyContent = "start" alignItems = "center" w = "100%" wrap = "wrap" >
306+ { variables [ inputType ] . map ( ( role : string , index : number ) => (
307+ < Box key = { index } margin = "0.5%" role = "group" >
308+ < Tag
309+ size = "sm"
310+ variant = "outline"
311+ colorScheme = "gray"
312+ minW = "fit-content"
313+ >
314+ < TagLabel cursor = "default" > { role } </ TagLabel >
315+ < TagRightIcon
316+ boxSize = "12px"
317+ as = { FaTimes }
318+ display = "none"
319+ cursor = "pointer"
320+ _groupHover = { { display : 'block' } }
321+ onClick = { ( ) =>
322+ updateInputHandler (
323+ inputType ,
324+ ArrayInputOperations . REMOVE ,
325+ role ,
326+ )
327+ }
328+ />
329+ </ Tag >
330+ </ Box >
331+ ) ) }
332+ </ Flex >
333+ < Menu matchWidth = { true } >
334+ < MenuButton px = "10px" py = "7.5px" >
335+ < FaAngleDown />
336+ </ MenuButton >
337+ < MenuList
338+ position = "absolute"
339+ top = "0"
340+ right = "0"
341+ zIndex = "10"
342+ maxH = "150"
343+ overflowX = "scroll"
344+ >
345+ < MenuOptionGroup
346+ title = { undefined }
347+ value = { variables [ inputType ] }
348+ type = "checkbox"
349+ onChange = { ( values : string [ ] | string ) => {
350+ setVariables ( {
351+ ...variables ,
352+ [ inputType ] : values ,
353+ } ) ;
354+ } }
355+ >
356+ { availableUserRoles . map ( ( role ) => {
357+ return (
358+ < MenuItemOption
359+ key = { `multiselect-menu-${ role } ` }
360+ value = { role }
361+ >
362+ { role }
363+ </ MenuItemOption >
364+ ) ;
365+ } ) }
366+ </ MenuOptionGroup >
367+ </ MenuList >
368+ </ Menu >
369+ </ Flex >
370+ </ Flex >
371+ ) ;
372+ }
281373 if ( Object . values ( TextAreaInputType ) . includes ( inputType ) ) {
282374 return (
283375 < Textarea
0 commit comments