1
- import { Box , Stack } from '@mui/material' ;
1
+ import { Stack } from '@mui/material' ;
2
2
import { memoize } from 'lodash' ;
3
+ import { SetRequired } from 'type-fest' ;
3
4
import { RoleLabels } from '~/api/schema.graphql' ;
4
5
import { labelFrom } from '~/common' ;
5
6
import {
8
9
} from '../../../components/Dialog/DialogForm' ;
9
10
import {
10
11
EmailField ,
11
- FieldGroup ,
12
12
matchFieldIfSame ,
13
13
SecuredField ,
14
14
SubmitError ,
@@ -18,10 +18,12 @@ import { AutocompleteField } from '../../../components/form/AutocompleteField';
18
18
import { useSession } from '../../../components/Session' ;
19
19
import { UserFormFragment } from './UserForm.graphql' ;
20
20
21
- export type UserFormProps < T , R = void > = DialogFormProps < T , R > & {
21
+ export type UserFormProps < T , R = void > = SetRequired <
22
+ DialogFormProps < T , R > ,
23
+ 'fieldsPrefix'
24
+ > & {
22
25
/** The pre-existing user to edit */
23
26
user ?: UserFormFragment ;
24
- prefix : string ;
25
27
} ;
26
28
27
29
const decorators = memoize ( ( prefix : string ) => [
@@ -32,7 +34,6 @@ const decorators = memoize((prefix: string) => [
32
34
33
35
export const UserForm = < T , R = void > ( {
34
36
user,
35
- prefix,
36
37
...rest
37
38
} : UserFormProps < T , R > ) => {
38
39
const { session } = useSession ( ) ;
@@ -42,112 +43,106 @@ export const UserForm = <T, R = void>({
42
43
maxWidth : 'sm' ,
43
44
} }
44
45
{ ...rest }
45
- decorators = { decorators ( prefix ) }
46
+ decorators = { decorators ( rest . fieldsPrefix ) }
46
47
>
47
48
< SubmitError />
48
- < FieldGroup prefix = { prefix } >
49
- < Stack >
50
- < Stack direction = "row" spacing = { 2 } >
51
- < Box flex = { 1 } >
52
- < SecuredField obj = { user } name = "realFirstName" >
53
- { ( props ) => (
54
- < TextField
55
- label = "First Name"
56
- placeholder = "Enter First Name"
57
- required
58
- { ...props }
59
- />
60
- ) }
61
- </ SecuredField >
62
- </ Box >
63
- < Box flex = { 1 } >
64
- < SecuredField obj = { user } name = "realLastName" >
65
- { ( props ) => (
66
- < TextField
67
- label = "Last Name"
68
- placeholder = "Enter Last Name"
69
- required
70
- { ...props }
71
- />
72
- ) }
73
- </ SecuredField >
74
- </ Box >
75
- </ Stack >
76
- < Stack direction = "row" spacing = { 2 } >
77
- < SecuredField obj = { user } name = "displayFirstName" >
78
- { ( props ) => (
79
- < TextField
80
- label = "Public First Name"
81
- placeholder = "Enter Public First Name"
82
- required
83
- { ...props }
84
- />
85
- ) }
86
- </ SecuredField >
87
- < SecuredField obj = { user } name = "displayLastName" >
88
- { ( props ) => (
89
- < TextField
90
- label = "Public Last Name"
91
- placeholder = "Enter Public Last Name"
92
- required
93
- { ...props }
94
- />
95
- ) }
96
- </ SecuredField >
97
- </ Stack >
98
- < SecuredField obj = { user } name = "email" >
99
- { ( props ) => < EmailField { ...props } required = { false } /> }
100
- </ SecuredField >
101
- < SecuredField obj = { user } name = "title" >
49
+ < Stack >
50
+ < Stack direction = "row" spacing = { 2 } >
51
+ < SecuredField obj = { user } name = "realFirstName" >
102
52
{ ( props ) => (
103
- < TextField label = "Title" placeholder = "Enter Title" { ...props } />
53
+ < TextField
54
+ label = "First Name"
55
+ placeholder = "Enter First Name"
56
+ required
57
+ { ...props }
58
+ />
104
59
) }
105
60
</ SecuredField >
106
- < SecuredField obj = { user } name = "phone " >
61
+ < SecuredField obj = { user } name = "realLastName " >
107
62
{ ( props ) => (
108
63
< TextField
109
- label = "Phone "
110
- placeholder = "Enter Phone Number "
111
- type = "tel"
64
+ label = "Last Name "
65
+ placeholder = "Enter Last Name "
66
+ required
112
67
{ ...props }
113
68
/>
114
69
) }
115
70
</ SecuredField >
116
- { /*TODO: Replace with timezone autocomplete #307 */ }
117
- { /*<SecuredField obj={user} name="timezone">*/ }
118
- { /* {(props) => (*/ }
119
- { /* <TextField label="Timezone" placeholder="Enter Timezone" {...props} />*/ }
120
- { /* )}*/ }
121
- { /*</SecuredField>*/ }
122
- < SecuredField obj = { user } name = "about" >
71
+ </ Stack >
72
+ < Stack direction = "row" spacing = { 2 } >
73
+ < SecuredField obj = { user } name = "displayFirstName" >
123
74
{ ( props ) => (
124
75
< TextField
125
- label = "About"
126
- multiline
127
- placeholder = "Enter About"
128
- minRows = { 2 }
76
+ label = "Public First Name"
77
+ placeholder = "Enter Public First Name"
78
+ required
129
79
{ ...props }
130
80
/>
131
81
) }
132
82
</ SecuredField >
133
- < SecuredField obj = { user } name = "roles " >
83
+ < SecuredField obj = { user } name = "displayLastName " >
134
84
{ ( props ) => (
135
- < AutocompleteField
136
- multiple
137
- options = {
138
- user ?. roles . assignableRoles ??
139
- session ?. roles . assignableRoles ??
140
- [ ]
141
- }
142
- getOptionLabel = { labelFrom ( RoleLabels ) }
143
- label = "Roles"
144
- variant = "outlined"
85
+ < TextField
86
+ label = "Public Last Name"
87
+ placeholder = "Enter Public Last Name"
88
+ required
145
89
{ ...props }
146
90
/>
147
91
) }
148
92
</ SecuredField >
149
93
</ Stack >
150
- </ FieldGroup >
94
+ < SecuredField obj = { user } name = "email" >
95
+ { ( props ) => < EmailField { ...props } required = { false } /> }
96
+ </ SecuredField >
97
+ < SecuredField obj = { user } name = "title" >
98
+ { ( props ) => (
99
+ < TextField label = "Title" placeholder = "Enter Title" { ...props } />
100
+ ) }
101
+ </ SecuredField >
102
+ < SecuredField obj = { user } name = "phone" >
103
+ { ( props ) => (
104
+ < TextField
105
+ label = "Phone"
106
+ placeholder = "Enter Phone Number"
107
+ type = "tel"
108
+ { ...props }
109
+ />
110
+ ) }
111
+ </ SecuredField >
112
+ { /*TODO: Replace with timezone autocomplete #307 */ }
113
+ { /*<SecuredField obj={user} name="timezone">*/ }
114
+ { /* {(props) => (*/ }
115
+ { /* <TextField label="Timezone" placeholder="Enter Timezone" {...props} />*/ }
116
+ { /* )}*/ }
117
+ { /*</SecuredField>*/ }
118
+ < SecuredField obj = { user } name = "about" >
119
+ { ( props ) => (
120
+ < TextField
121
+ label = "About"
122
+ multiline
123
+ placeholder = "Enter About"
124
+ minRows = { 2 }
125
+ { ...props }
126
+ />
127
+ ) }
128
+ </ SecuredField >
129
+ < SecuredField obj = { user } name = "roles" >
130
+ { ( props ) => (
131
+ < AutocompleteField
132
+ multiple
133
+ options = {
134
+ user ?. roles . assignableRoles ??
135
+ session ?. roles . assignableRoles ??
136
+ [ ]
137
+ }
138
+ getOptionLabel = { labelFrom ( RoleLabels ) }
139
+ label = "Roles"
140
+ variant = "outlined"
141
+ { ...props }
142
+ />
143
+ ) }
144
+ </ SecuredField >
145
+ </ Stack >
151
146
</ DialogForm >
152
147
) ;
153
148
} ;
0 commit comments