11import React , { useState , useRef } from 'react' ;
22import { CreateProjectWorkspaceDialog , onCreatePayload } from './CreateProjectWorkspaceDialog' ;
3- import { Member , MemberRoles } from '../../lib/api/types/shared/members' ;
3+ import { MemberRoles } from '../../lib/api/types/shared/members' ;
44import { ErrorDialogHandle } from '../Shared/ErrorMessageBox' ;
5- import { InputDomRef } from '@ui5/webcomponents-react' ;
5+
6+ import { useForm } from "react-hook-form" ;
7+ import { zodResolver } from "@hookform/resolvers/zod" ;
8+ import { validationSchemaProjectWorkspace } from "../../lib/api/validations/schemas.ts" ;
9+ import { CreateDialogProps } from "./CreateWorkspaceDialogContainer.tsx" ;
610
711
812
913
1014export const CreateProjectWorkspaceDialogWrapper : React . FC < { spyFormBody ?: ( data : any ) => { } } > = ( { spyFormBody} ) => {
1115 const [ isOpen , setIsOpen ] = useState ( true ) ;
12- const [ members , setMembers ] = useState < Member [ ] > ( [ {
13- 14- roles : [ MemberRoles . admin ] ,
15- kind : "User"
16- } ] ) ;
16+
1717 const errorDialogRef = useRef < ErrorDialogHandle > ( null ) ;
18- const nameInputRef = useRef < InputDomRef > ( null ) ;
19- const displayNameInputRef = useRef < InputDomRef > ( null ) ;
20- const chargingTargetInputRef = useRef < InputDomRef > ( null ) ; const handleCreate = async ( ) => {
18+
19+ const {
20+ register,
21+ handleSubmit,
22+ setValue,
23+ formState : { errors } ,
24+ watch
25+ } = useForm < CreateDialogProps > ( {
26+ // @ts -ignore
27+ resolver : zodResolver ( validationSchemaProjectWorkspace ) ,
28+ defaultValues : {
29+ name : "" ,
30+ displayName : "" ,
31+ chargingTarget : "" ,
32+ members :
[ { name :
'[email protected] ' , roles :
[ MemberRoles . admin ] , kind :
"User" } ] , 33+ }
34+ } ) ;
35+
36+ const handleCreate = async ( {
37+ name,
38+ displayName,
39+ chargingTarget,
40+ members,
41+ } : onCreatePayload ) => {
2142 const payload : onCreatePayload = {
22- name : nameInputRef . current ?. value || '' ,
23- displayName : displayNameInputRef . current ?. value || '' ,
24- chargingTarget : chargingTargetInputRef . current ?. value || '' ,
43+ name : name ,
44+ displayName : displayName ,
45+ chargingTarget : chargingTarget ,
2546 members : members
2647 } ;
2748
@@ -33,13 +54,12 @@ export const CreateProjectWorkspaceDialogWrapper: React.FC<{ spyFormBody?: (data
3354 isOpen = { isOpen }
3455 setIsOpen = { setIsOpen }
3556 titleText = "Create Project Workspace"
36- onCreate = { handleCreate }
57+ onCreate = { handleSubmit ( handleCreate ) }
3758 errorDialogRef = { errorDialogRef }
38- members = { members }
39- setMembers = { setMembers }
40- nameInputRef = { nameInputRef }
41- displayNameInputRef = { displayNameInputRef }
42- chargingTargetInputRef = { chargingTargetInputRef }
59+ members = { watch ( 'members' ) }
60+ register = { register }
61+ errors = { errors }
62+ setValue = { setValue }
4363 />
4464 ) ;
4565} ;
@@ -55,9 +75,9 @@ describe('CreateProjectWorkspaceDialog', () => {
55755676 . should ( 'be.visible' ) ;
5777 cy . get ( 'ui5-button[icon="delete"]' ) . find ( 'button' ) . click ( { force : true } ) ;
58- cy . get ( 'div[data-component-name="AnalyticalTableContainerWithScrollbar "]' )
59- 60- . should ( 'not.exist ' ) ;
78+ cy . get ( 'span[id="members-error "]' )
79+ . contains ( 'You need to have at least one member assigned. ' )
80+ . should ( 'be.visible ' ) ;
6181 } ) ;
6282
6383 it ( 'should add a new member and display it in the table' , ( ) => {
@@ -75,21 +95,21 @@ describe('CreateProjectWorkspaceDialog', () => {
7595 const stubFn = cy . stub ( ) . as ( 'stubFn' ) ;
7696 cy . mount ( < CreateProjectWorkspaceDialogWrapper spyFormBody = { stubFn } /> , { } ) ;
7797
78- cy . get ( 'ui5-input[id*="project- name-input "]' ) . find ( 'input[id*="inner"]' )
79- . type ( 'brand-new-workspace-test -01' , { force : true } ) ;
80- cy . get ( 'ui5-input[id*="project-displayname-input "]' ) . find ( 'input[id*="inner"]' )
98+ cy . get ( 'ui5-input[id*="name"]' ) . find ( 'input[id*="inner"]' )
99+ . type ( 'brand--01' , { force : true } ) ;
100+ cy . get ( 'ui5-input[id*="displayName "]' ) . find ( 'input[id*="inner"]' )
81101 . type ( 'Brand new workspace number one' , { force : true } ) ;
82- cy . get ( 'ui5-input[id*="project-chargingtarget-input "]' ) . find ( 'input[id*="inner"]' )
102+ cy . get ( 'ui5-input[id*="chargingTarget "]' ) . find ( 'input[id*="inner"]' )
83103 . type ( 'Charging target 1000' , { force : true } ) ;
84- cy . get ( 'ui5-input[id*="member- email-input "]' ) . find ( 'input[id*="inner"]' )
104+ cy . get ( 'ui5-input[id*="email"]' ) . find ( 'input[id*="inner"]' )
85105 . type ( '[email protected] ' , { force :
true } ) ; 86106 cy . get ( 'ui5-button:contains("Add")' )
87107 . click ( { force : true } ) ;
88108 cy . get ( 'ui5-button:contains("Create")' )
89109 . click ( { force : true } ) ;
90110
91111 cy . get ( '@stubFn' ) . should ( 'have.been.calledWith' , {
92- name : 'brand-new-workspace-test -01' ,
112+ name : 'brand--01' ,
93113 displayName : 'Brand new workspace number one' ,
94114 chargingTarget : 'Charging target 1000' ,
95115 members : [
0 commit comments