1+ import Modal from "@/src/components/shared/modal/Modal" ;
2+ import { selectModal } from "@/src/reduxStore/states/modal" ;
3+ import { selectVisibleAttributesDataBrowser } from "@/src/reduxStore/states/pages/settings" ;
4+ import { selectProjectId } from "@/src/reduxStore/states/project" ;
5+ import { createEvaluationGroups , getEvaluationSets } from "@/src/services/base/playground" ;
6+ import { ModalButton , ModalEnum } from "@/src/types/shared/modal" ;
7+ import { useCallback , useEffect , useRef , useState } from "react" ;
8+ import { useDispatch , useSelector } from "react-redux" ;
9+
10+ const ACCEPT_BUTTON = { buttonCaption : 'Create' , useButton : true } ;
11+
12+ type CreateEvaluationGroupModalProps = {
13+ refetchEvaluationGroups : ( ) => void ;
14+ }
15+
16+ export default function CreateEvaluationGroupModal ( props : CreateEvaluationGroupModalProps ) {
17+ const dispatch = useDispatch ( ) ;
18+
19+ const projectId = useSelector ( selectProjectId ) ;
20+
21+ const [ acceptButton , setAcceptButton ] = useState < ModalButton > ( ACCEPT_BUTTON ) ;
22+ const [ name , setName ] = useState ( "" ) ;
23+ const [ evaluationSets , setEvaluationSets ] = useState ( [ ] ) ;
24+ const [ selectedSets , setSelectedSets ] = useState ( [ ] ) ;
25+ const evaluationGroupModalState = useSelector ( selectModal ( ModalEnum . EVALUATION_GROUP ) ) ;
26+
27+ const createEvaluationGroupPost = useCallback ( ( ) => {
28+ createEvaluationGroups ( projectId , selectedSets . map ( ( set ) => set . id ) , name , ( res ) => {
29+ props . refetchEvaluationGroups ( ) ;
30+ } ) ;
31+ } , [ name , selectedSets , projectId ] ) ;
32+
33+ useEffect ( ( ) => {
34+ if ( ! evaluationGroupModalState . open ) {
35+ setName ( "" ) ;
36+ setSelectedSets ( [ ] ) ;
37+ }
38+ } , [ evaluationGroupModalState . open , dispatch ] ) ;
39+
40+ useEffect ( ( ) => {
41+ setAcceptButton ( { ...acceptButton , emitFunction : createEvaluationGroupPost , disabled : selectedSets . length === 0 || name === "" } ) ;
42+ } , [ createEvaluationGroupPost , name , selectedSets ] ) ;
43+
44+ useEffect ( ( ) => {
45+ if ( ! evaluationGroupModalState . open ) return
46+ getEvaluationSets ( projectId , ( res ) => {
47+ setEvaluationSets ( res ) ;
48+ } ) ;
49+ } , [ projectId , evaluationGroupModalState . open ] ) ;
50+
51+ return < Modal modalName = { ModalEnum . EVALUATION_GROUP } acceptButton = { acceptButton } className = "md:max-w-6xl" >
52+ < div className = "h-full" >
53+ < div className = "flex flex-grow justify-center text-lg leading-6 text-gray-900 font-medium" > Create new evaluation group</ div >
54+ < div className = "bg-white grid overflow-hidden min-h-full grid-cols-2 h-[calc(100vh-200px)] overflow-y-scroll" >
55+ < div className = "flex flex-col gap-y-2 m-3" >
56+ < div className = "flex items-center" >
57+ < span className = "mr-4" > Execution</ span >
58+ </ div >
59+ < input placeholder = "Enter name..."
60+ className = "placeholder-italic w-full p-2 line-height-textarea border rounded-md border-gray-300 focus:outline-none focus:ring-2 focus:ring-gray-300 focus:ring-offset-2 focus:ring-offset-gray-100"
61+ onChange = { ( event : any ) => { setName ( event . target . value ) ; } }
62+ value = { name }
63+ />
64+ < div className = "flex items-center" >
65+ < span className = "mr-4" > Selected results</ span >
66+ </ div >
67+ { selectedSets && selectedSets . map ( ( set , index ) => ( < div key = { set . id } className = "bg-white overflow-hidden shadow rounded-lg border p-2 relative hover:border-red-400 hover:border-opacity-50 cursor-pointer transition-all duration-200 ease-in-out"
68+ onClick = { ( ) => {
69+ setEvaluationSets ( [ ...evaluationSets , set ] ) ;
70+ const newSelectedSets = selectedSets . filter ( ( item ) => item . id !== set . id ) ;
71+ setSelectedSets ( newSelectedSets ) ;
72+ } } >
73+ { set . question }
74+ </ div > ) ) }
75+ </ div >
76+ < div className = "h-full border-gray-300 border-l" >
77+ < div > Evaluation sets</ div >
78+ { evaluationSets && evaluationSets . map ( ( set , index ) => ( < div key = { set . id } className = "bg-white overflow-hidden shadow rounded-lg border m-4 p-2 relative hover:border-green-400 hover:border-opacity-30 cursor-pointer transition-all duration-200 ease-in-out"
79+ onClick = { ( ) => {
80+ setSelectedSets ( [ ...selectedSets , set ] ) ;
81+ const newEvaluationSets = evaluationSets . filter ( ( item ) => item . id !== set . id ) ;
82+ setEvaluationSets ( newEvaluationSets ) ;
83+ } } >
84+ { set . question }
85+ </ div > ) ) }
86+ </ div >
87+ </ div >
88+ </ div >
89+ </ Modal >
90+ }
0 commit comments