@@ -4,6 +4,7 @@ import {RadioButton, Select} from '@gravity-ui/uikit';
44import _ from 'lodash' ;
55
66import { ObjectIndependentInputProps } from '../../../core' ;
7+ import { TogglerCard } from '../../components' ;
78import { block } from '../../utils' ;
89
910import './useOneOf.scss' ;
@@ -68,17 +69,49 @@ export const useOneOf = ({props, onTogglerChange}: UseOneOfParams) => {
6869 [ spec . description , spec . viewSpec . order , specProperties ] ,
6970 ) ;
7071
71- const selectToggler = React . useMemo (
72- ( ) =>
72+ const togglerType = React . useMemo ( ( ) => {
73+ if ( spec . viewSpec . oneOfParams ?. toggler === 'card' && options . length < 3 ) {
74+ return 'card' ;
75+ }
76+
77+ if (
7378 spec . viewSpec . oneOfParams ?. toggler !== 'radio' &&
7479 ( spec . viewSpec . oneOfParams ?. toggler === 'select' ||
7580 options . length > 3 ||
76- _ . some ( options , ( { title} ) => title . length > MAX_TAB_TITLE_LENGTH ) ) ,
77- [ options , spec . viewSpec . oneOfParams ?. toggler ] ,
78- ) ;
81+ _ . some ( options , ( { title} ) => title . length > MAX_TAB_TITLE_LENGTH ) )
82+ ) {
83+ return 'select' ;
84+ }
85+
86+ return 'radio' ;
87+ } , [ options , spec . viewSpec . oneOfParams ?. toggler ] ) ;
7988
8089 const togglerInput = React . useMemo ( ( ) => {
81- if ( selectToggler ) {
90+ if ( togglerType === 'card' ) {
91+ return (
92+ < div className = { b ( 'card' ) } >
93+ { options . map ( ( { value} ) => {
94+ const onClick = ( ) => {
95+ onOneOfChange ( [ value ] ) ;
96+ } ;
97+
98+ return (
99+ < TogglerCard
100+ title = { specProperties [ value ] ?. viewSpec . layoutTitle || '' }
101+ disabled = { spec . viewSpec . disabled }
102+ text = { spec . description ?. [ value ] || '' }
103+ description = { specProperties [ value ] ?. viewSpec . layoutDescription }
104+ onClick = { onClick }
105+ selected = { oneOfValue === value }
106+ key = { value }
107+ />
108+ ) ;
109+ } ) }
110+ </ div >
111+ ) ;
112+ }
113+
114+ if ( togglerType === 'select' ) {
82115 return (
83116 < Select
84117 width = "max"
@@ -106,14 +139,23 @@ export const useOneOf = ({props, onTogglerChange}: UseOneOfParams) => {
106139 ) ) }
107140 </ RadioButton >
108141 ) ;
109- } , [ selectToggler , oneOfValue , spec . viewSpec . disabled , name , options , onOneOfChange ] ) ;
142+ } , [
143+ togglerType ,
144+ oneOfValue ,
145+ spec . viewSpec . disabled ,
146+ name ,
147+ options ,
148+ onOneOfChange ,
149+ specProperties ,
150+ ] ) ;
110151
111152 const toggler = React . useMemo ( ( ) => {
112153 if ( Layout ) {
113154 return (
114155 < div
115156 className = { b ( 'toggler' , {
116- radio : ! selectToggler ,
157+ radio : togglerType === 'radio' ,
158+ card : togglerType === 'card' ,
117159 } ) }
118160 >
119161 < Layout { ...props } > { togglerInput } </ Layout >
@@ -122,7 +164,7 @@ export const useOneOf = ({props, onTogglerChange}: UseOneOfParams) => {
122164 }
123165
124166 return < div > { togglerInput } </ div > ;
125- } , [ Layout , togglerInput , selectToggler , props ] ) ;
167+ } , [ Layout , togglerInput , togglerType , props ] ) ;
126168
127169 return { oneOfValue, specProperties, toggler, togglerInput} ;
128170} ;
0 commit comments