@@ -2,7 +2,7 @@ import { Cancel } from "@mui/icons-material";
22import {
33 Card ,
44 CardContent ,
5- Grid ,
5+ Grid2 ,
66 IconButton ,
77 MenuItem ,
88 Select ,
@@ -32,11 +32,30 @@ import theme from "types/theme";
3232import { newWritingSystem } from "types/writingSystem" ;
3333import { NormalizedTextField } from "utilities/fontComponents" ;
3434
35- export const buttonIdSelectFile = "create-project-select-file" ;
36- export const buttonIdSubmit = "create-project-submit" ;
37- export const fieldIdName = "create-project-name" ;
38- export const formId = "create-project-form" ;
39- export const selectIdVern = "create-proj-select-vern" ;
35+ export enum CreateProjectId {
36+ ButtonSelectFile = "create-project-select-file" ,
37+ ButtonSubmit = "create-project-submit" ,
38+ FieldName = "create-project-name" ,
39+ Form = "create-project-form" ,
40+ SelectVern = "create-proj-select-vern" ,
41+ }
42+
43+ export enum CreateProjectTextId {
44+ Create = "createProject.create" ,
45+ CreateSuccess = "createProject.success" ,
46+ LangAnalysis = "projectSettings.language.analysisLanguage" ,
47+ LangAnalysisInfo = "createProject.language" ,
48+ LangVernacular = "projectSettings.language.vernacularLanguage" ,
49+ Name = "createProject.name" ,
50+ NameTaken = "createProject.nameTaken" ,
51+ Required = "login.required" ,
52+ SelectLanguage = "createProject.languageSelect" ,
53+ SelectOther = "createProject.languageOptionOther" ,
54+ Upload = "createProject.upload?" ,
55+ UploadBrowse = "buttons.browse" ,
56+ UploadInfo = "createProject.uploadFormat" ,
57+ UploadSelected = "createProject.fileSelected" ,
58+ }
4059
4160const vernIdNone = "selectLanguageOptionNone" ;
4261const vernIdOther = "selectLanguageOptionOther" ;
@@ -133,7 +152,7 @@ export default function CreateProject(): ReactElement {
133152
134153 const menuItems = [
135154 < MenuItem key = { vernIdNone } value = { vernIdNone } >
136- { t ( "createProject.languageSelect" ) }
155+ { t ( CreateProjectTextId . SelectLanguage ) }
137156 </ MenuItem > ,
138157 ] ;
139158 menuItems . push (
@@ -145,7 +164,7 @@ export default function CreateProject(): ReactElement {
145164 ) ;
146165 menuItems . push (
147166 < MenuItem key = { vernIdOther } value = { vernIdOther } >
148- { t ( "createProject.languageOptionOther" ) }
167+ { t ( CreateProjectTextId . SelectOther ) }
149168 </ MenuItem >
150169 ) ;
151170
@@ -161,7 +180,12 @@ export default function CreateProject(): ReactElement {
161180 } ;
162181
163182 return (
164- < Select defaultValue = { vernIdNone } id = { selectIdVern } onChange = { onChange } >
183+ < Select
184+ data-testid = { CreateProjectId . SelectVern }
185+ defaultValue = { vernIdNone }
186+ id = { CreateProjectId . SelectVern }
187+ onChange = { onChange }
188+ >
165189 { menuItems }
166190 </ Select >
167191 ) ;
@@ -199,27 +223,33 @@ export default function CreateProject(): ReactElement {
199223
200224 return (
201225 < Card style = { { width : "100%" , maxWidth : 450 } } >
202- < form id = { formId } onSubmit = { ( e ) => createProject ( e ) } >
226+ < form
227+ data-testid = { CreateProjectId . Form }
228+ id = { CreateProjectId . Form }
229+ onSubmit = { ( e ) => createProject ( e ) }
230+ >
203231 < CardContent >
204232 { /* Title */ }
205233 < Typography variant = "h5" align = "center" gutterBottom >
206- { t ( "createProject.create" ) }
234+ { t ( CreateProjectTextId . Create ) }
207235 </ Typography >
236+
208237 { /* Project name */ }
209238 < NormalizedTextField
210- id = { fieldIdName }
211- label = { t ( "createProject.name" ) }
239+ id = { CreateProjectId . FieldName }
240+ label = { t ( CreateProjectTextId . Name ) }
212241 value = { name }
213242 onChange = { updateName }
214243 variant = "outlined"
215244 style = { { width : "100%" , marginBottom : theme . spacing ( 2 ) } }
216245 margin = "normal"
217246 error = { error [ "empty" ] || error [ "nameTaken" ] }
218247 helperText = {
219- ( error [ "empty" ] && t ( "login.required" ) ) ||
220- ( error [ "nameTaken" ] && t ( "createProject.nameTaken" ) )
248+ ( error [ "empty" ] && t ( CreateProjectTextId . Required ) ) ||
249+ ( error [ "nameTaken" ] && t ( CreateProjectTextId . NameTaken ) )
221250 }
222251 />
252+
223253 { /* File upload */ }
224254 < div
225255 style = { {
@@ -232,20 +262,21 @@ export default function CreateProject(): ReactElement {
232262 style = { { marginTop : theme . spacing ( 2 ) } }
233263 display = "inline"
234264 >
235- { t ( "createProject.upload?" ) }
265+ { t ( CreateProjectTextId . Upload ) }
236266 </ Typography >
237267 < FileInputButton
238268 updateFile = { ( file : File ) => updateLanguageData ( file ) }
239269 accept = ".zip"
240270 buttonProps = { {
241- id : buttonIdSelectFile ,
242- style : { margin : theme . spacing ( 1 ) } ,
271+ "data-testid" : CreateProjectId . ButtonSelectFile ,
272+ id : CreateProjectId . ButtonSelectFile ,
273+ sx : { m : 1 } ,
243274 } }
244275 >
245- { t ( "buttons.browse" ) }
276+ { t ( CreateProjectTextId . UploadBrowse ) }
246277 </ FileInputButton >
247278 < Typography variant = "caption" display = "block" >
248- < Trans i18nKey = "createProject.uploadFormat" >
279+ < Trans i18nKey = { CreateProjectTextId . UploadInfo } >
249280 FillerTextA
250281 < a href = "https://code.google.com/archive/p/lift-standard/" >
251282 FillerTextB
@@ -256,16 +287,19 @@ export default function CreateProject(): ReactElement {
256287 { /* Uploaded file name and remove button */ }
257288 { languageData && (
258289 < Typography variant = "body2" style = { { margin : theme . spacing ( 1 ) } } >
259- { t ( "createProject.fileSelected" , { val : languageData . name } ) }
290+ { t ( CreateProjectTextId . UploadSelected , {
291+ val : languageData . name ,
292+ } ) }
260293 < IconButton size = "small" onClick = { ( ) => updateLanguageData ( ) } >
261294 < Cancel />
262295 </ IconButton >
263296 </ Typography >
264297 ) }
265298 </ div >
299+
266300 { /* Vernacular language picker */ }
267301 < Typography style = { { marginTop : theme . spacing ( 1 ) } } >
268- { t ( "projectSettings.language.vernacularLanguage" ) }
302+ { t ( CreateProjectTextId . LangVernacular ) }
269303 </ Typography >
270304 { vernLangSelect ( ) }
271305 { ( vernLangIsOther || ! vernLangOptions . length ) && (
@@ -280,12 +314,13 @@ export default function CreateProject(): ReactElement {
280314 t = { languagePickerStrings_en }
281315 />
282316 ) }
317+
283318 { /* Analysis language picker */ }
284319 < Typography style = { { marginTop : theme . spacing ( 1 ) } } >
285- { t ( "projectSettings.language.analysisLanguage" ) }
320+ { t ( CreateProjectTextId . LangAnalysis ) }
286321 </ Typography >
287322 { languageData ? (
288- t ( "createProject.language" )
323+ t ( CreateProjectTextId . LangAnalysisInfo )
289324 ) : (
290325 < LanguagePicker
291326 value = { analysisLang . bcp47 }
@@ -298,24 +333,29 @@ export default function CreateProject(): ReactElement {
298333 t = { languagePickerStrings_en }
299334 />
300335 ) }
336+
301337 { /* Form submission button */ }
302- < Grid
338+ < Grid2
303339 container
304340 justifyContent = "flex-end"
305341 style = { { marginTop : theme . spacing ( 1 ) } }
306342 >
307343 < LoadingDoneButton
308- buttonProps = { { color : "primary" , id : buttonIdSubmit } }
344+ buttonProps = { {
345+ "data-testid" : CreateProjectId . ButtonSubmit ,
346+ id : CreateProjectId . ButtonSubmit ,
347+ type : "submit" ,
348+ } }
309349 disabled = {
310350 ! name . trim ( ) || ! vernLang . bcp47 || vernLang . bcp47 === undBcp47
311351 }
312352 done = { success }
313- doneText = { t ( "createProject.success" ) }
353+ doneText = { t ( CreateProjectTextId . CreateSuccess ) }
314354 loading = { loading }
315355 >
316- { t ( "createProject.create" ) }
356+ { t ( CreateProjectTextId . Create ) }
317357 </ LoadingDoneButton >
318- </ Grid >
358+ </ Grid2 >
319359 </ CardContent >
320360 </ form >
321361 </ Card >
0 commit comments