@@ -63,28 +63,16 @@ export interface ConceptCardProps {
63
63
field : FieldItem ,
64
64
}
65
65
66
- export const GroupHeader = styled ( 'div' ) ( ( { theme } ) => ( {
67
- position : 'sticky' ,
68
- marginTop : '-8px' ,
69
- padding : '4px 4px' ,
70
- color : "rgba(0, 0, 0, 0.6)" ,
71
- fontSize : "12px" ,
72
- } ) ) ;
73
-
74
- export const GroupItems = styled ( 'ul' ) ( {
75
- padding : 0 ,
76
- } ) ;
77
-
78
66
const checkConceptIsEmpty = ( field : FieldItem ) => {
79
67
return field . name == "" &&
80
68
( ( field . source == "derived" && ! field . transform ?. description && ( field . transform as ConceptTransformation ) . code == "" )
81
69
|| ( field . source == "custom" ) )
82
70
}
83
71
84
- export const genFreshDerivedConcept = ( parentIDs : string [ ] ) => {
72
+ export const genFreshDerivedConcept = ( parentIDs : string [ ] , tableRef : string ) => {
85
73
return {
86
74
id : `concept-${ Date . now ( ) } ` , name : "" , type : "string" as Type ,
87
- source : "derived" , domain :[ ] ,
75
+ source : "derived" , domain :[ ] , tableRef : tableRef ,
88
76
transform : { parentIDs : parentIDs , code : "" , description : "" }
89
77
} as FieldItem
90
78
}
@@ -130,17 +118,16 @@ export const ConceptCard: FC<ConceptCardProps> = function ConceptCard({ field })
130
118
let border = "hidden" ;
131
119
132
120
const cursorStyle = isDragging ? "grabbing" : "grab" ;
133
- let editOption = field . source === "original" ? undefined : (
121
+ let editOption = field . source == "derived" && (
134
122
< Tooltip key = "edit-icon-button" title = "edit" >
135
123
< IconButton size = "small" key = "edit-icon-button"
136
124
color = "primary" aria-label = "Edit" component = "span"
137
125
onClick = { ( ) => { setEditMode ( ! editMode ) } } >
138
126
< EditIcon fontSize = "inherit" />
139
127
</ IconButton >
140
- </ Tooltip >
141
- ) ;
128
+ </ Tooltip > ) ;
142
129
143
- let deriveOption = (
130
+ let deriveOption = ( field . source == "derived" || field . source == "original" ) && (
144
131
< Tooltip key = "derive-icon-button" title = "derive new concept" >
145
132
< IconButton size = "small"
146
133
key = "derive-icon-button"
@@ -149,15 +136,14 @@ export const ConceptCard: FC<ConceptCardProps> = function ConceptCard({ field })
149
136
&& f . transform ?. parentIDs . includes ( field . id ) ) . length > 0 ) {
150
137
return
151
138
}
152
- handleUpdateConcept ( genFreshDerivedConcept ( [ field . id ] ) ) ;
139
+ handleUpdateConcept ( genFreshDerivedConcept ( [ field . id ] , field . tableRef ) ) ;
153
140
} } >
154
141
< ForkRightIcon fontSize = "inherit" sx = { { transform : "rotate(90deg)" } } />
155
142
</ IconButton >
156
143
</ Tooltip >
157
144
) ;
158
145
159
- let deleteOption = field . source == "original" ? "" :
160
- < IconButton size = "small"
146
+ let deleteOption = ! ( field . source == "original" ) && < IconButton size = "small"
161
147
key = "delete-icon-button"
162
148
color = "primary" aria-label = "Delete" component = "span"
163
149
disabled = { conceptShelfItems . filter ( f => f . source == "derived" && f . transform ?. parentIDs . includes ( field . id ) ) . length > 0 }
@@ -169,16 +155,13 @@ export const ConceptCard: FC<ConceptCardProps> = function ConceptCard({ field })
169
155
deleteOption ,
170
156
deriveOption ,
171
157
editOption ,
172
- //deleteOption
173
158
]
174
159
175
- const editModeCard = (
160
+ const editModeCard = field . source == "derived" && (
176
161
< CardContent className = "draggable-card-body-edit-mode" >
177
- { field . source == "derived" ? < DerivedConceptForm concept = { field } handleUpdateConcept = { handleUpdateConcept }
178
- handleDeleteConcept = { handleDeleteConcept }
179
- turnOffEditMode = { ( ) => { setEditMode ( false ) ; } } /> : field . source == "custom" ? < CustomConceptForm concept = { field } handleUpdateConcept = { handleUpdateConcept }
162
+ < DerivedConceptForm concept = { field } handleUpdateConcept = { handleUpdateConcept }
180
163
handleDeleteConcept = { handleDeleteConcept }
181
- turnOffEditMode = { ( ) => { setEditMode ( false ) ; } } /> : "" }
164
+ turnOffEditMode = { ( ) => { setEditMode ( false ) ; } } />
182
165
</ CardContent >
183
166
) ;
184
167
@@ -335,128 +318,6 @@ export const CodeEditor: FC<{ code: string; handleSaveCode: (code: string) => vo
335
318
</ Box >
336
319
}
337
320
338
- export const CustomConceptForm : FC < ConceptFormProps > = function CustomConceptForm ( { concept, handleUpdateConcept, handleDeleteConcept, turnOffEditMode } ) {
339
-
340
- const conceptShelfItems = useSelector ( ( state : DataFormulatorState ) => state . conceptShelfItems ) ;
341
-
342
- const [ name , setName ] = useState ( concept . name ) ;
343
- const handleNameChange = ( event : React . ChangeEvent < HTMLInputElement > ) => { setName ( event . target . value ) ; } ;
344
-
345
- const [ dtype , setDtype ] = useState ( concept . name == "" ? "auto" : concept . type as string ) ;
346
- const handleDtypeChange = ( event : SelectChangeEvent ) => { setDtype ( event . target . value ) ; } ;
347
-
348
- // if these two fields are changed from other places, update their values
349
- useEffect ( ( ) => { setDtype ( concept . type ) } , [ concept . type ] ) ;
350
-
351
- let typeList = TypeList
352
- let nameField = (
353
- < TextField key = "name-field" id = "name" label = "concept name" value = { name } sx = { { minWidth : 120 , maxWidth : 160 , flex : 1 } }
354
- FormHelperTextProps = { {
355
- style : { fontSize : 8 , marginTop : 0 , marginLeft : "auto" }
356
- } }
357
- multiline
358
- helperText = { conceptShelfItems . some ( f => f . name == name && f . id != concept . id ) ? "this name already exists" : "" }
359
- size = "small" onChange = { handleNameChange } required error = { name == "" || conceptShelfItems . some ( f => f . name == name && f . id != concept . id ) }
360
- /> )
361
-
362
- let typeField = (
363
- < FormControl key = "type-select" sx = { { width : 100 , marginLeft : "4px" } } size = "small" >
364
- < InputLabel id = "dtype-select-label" > data type</ InputLabel >
365
- < Select
366
- labelId = "dtype-select-label"
367
- id = "dtype-select"
368
- value = { dtype }
369
- label = "data type"
370
- onChange = { handleDtypeChange } >
371
- { typeList . map ( ( t , i ) => (
372
- < MenuItem value = { t } key = { `${ concept . id } -${ i } ` } >
373
- < Typography component = "span" sx = { { fontSize : "inherit" , marginLeft : "0px" } } > { t } </ Typography >
374
- </ MenuItem >
375
- ) ) }
376
- </ Select >
377
- </ FormControl >
378
- )
379
-
380
- let cardTopComponents = undefined ;
381
-
382
- let childrenConceptIDs = [ concept . id ] ;
383
- while ( true ) {
384
- let newChildrens = conceptShelfItems . filter ( f => f . source == "derived"
385
- && ! childrenConceptIDs . includes ( f . id )
386
- && f . transform ?. parentIDs . some ( pid => childrenConceptIDs . includes ( pid ) ) )
387
- . map ( f => f . id ) ;
388
- if ( newChildrens . length == 0 ) {
389
- break
390
- }
391
- childrenConceptIDs = [ ...childrenConceptIDs , ...newChildrens ] ;
392
- }
393
-
394
- cardTopComponents = [
395
- nameField ,
396
- typeField ,
397
- ]
398
-
399
- const checkCustomConceptDiff = ( ) => {
400
- let nameTypeNeq = ( concept . name != name || concept . type != dtype ) ;
401
- return ( nameTypeNeq ) ;
402
- }
403
-
404
- let saveDisabledMsg = [ ] ;
405
- if ( name == "" || conceptShelfItems . some ( f => f . name == name && f . id != concept . id ) ) {
406
- saveDisabledMsg . push ( "concept name is empty" )
407
- }
408
-
409
- return (
410
- < Box sx = { { display : "flex" , flexDirection : "column" } } >
411
- < Box component = "form" className = "concept-form"
412
- sx = { { display : "flex" , flexWrap : "wrap" , '& > :not(style)' : { margin : "4px" , /*width: '25ch'*/ } , } }
413
- noValidate
414
- autoComplete = "off" >
415
- < Box sx = { { overflowX : "clip" , display : "flex" , flexDirection : "row" , justifyContent : "flex-start" , alignItems : "baseline" } } >
416
- { cardTopComponents }
417
- </ Box >
418
- < ButtonGroup size = "small" sx = { { "& button" : { textTransform : "none" , padding : "2px 4px" , marginLeft : "4px" } , flexGrow : 1 , justifyContent : "right" } } >
419
- < IconButton size = "small"
420
- color = "primary" aria-label = "Delete" component = "span"
421
- disabled = { conceptShelfItems . filter ( f => f . source == "derived" && f . transform ?. parentIDs . includes ( concept . id ) ) . length > 0 }
422
- onClick = { ( ) => { handleDeleteConcept ( concept . id ) ; } } >
423
- < Tooltip title = "delete" >
424
- < DeleteIcon fontSize = "inherit" />
425
- </ Tooltip >
426
- </ IconButton >
427
- < Button size = "small" variant = "outlined" onClick = { ( ) => {
428
- setName ( concept . name ) ;
429
- setDtype ( concept . type ) ;
430
-
431
- if ( checkConceptIsEmpty ( concept ) ) {
432
- handleDeleteConcept ( concept . id ) ;
433
- }
434
- if ( turnOffEditMode ) {
435
- turnOffEditMode ( ) ;
436
- }
437
- } } >
438
- Cancel
439
- </ Button >
440
- < Button size = "small" variant = { checkCustomConceptDiff ( ) ? "contained" : "outlined" } disabled = { saveDisabledMsg . length > 0 || checkCustomConceptDiff ( ) == false } onClick = { ( ) => {
441
-
442
- let tmpConcept = duplicateField ( concept ) ;
443
- tmpConcept . name = name ;
444
- tmpConcept . type = dtype as Type ;
445
-
446
- if ( turnOffEditMode ) {
447
- turnOffEditMode ( ) ;
448
- }
449
- handleUpdateConcept ( tmpConcept ) ;
450
-
451
- //setName(""); setDtype("string" as Type); setExamples([]);
452
- } } >
453
- Save
454
- </ Button >
455
- </ ButtonGroup >
456
- </ Box >
457
- </ Box >
458
- ) ;
459
- }
460
321
461
322
export const DerivedConceptForm : FC < ConceptFormProps > = function DerivedConceptForm ( { concept, handleUpdateConcept, handleDeleteConcept, turnOffEditMode } ) {
462
323
@@ -497,9 +358,6 @@ export const DerivedConceptForm: FC<ConceptFormProps> = function DerivedConceptF
497
358
498
359
let dispatch = useDispatch ( ) ;
499
360
500
- const [ collapseCode , setCollapseCode ] = useState < boolean > ( true ) ;
501
- const [ collapseVisInspector , setCollapseVisInspector ] = useState < boolean > ( true ) ;
502
-
503
361
let [ dialogOpen , setDialogOpen ] = useState < boolean > ( false ) ;
504
362
let [ codeCandidates , setCodeCandidates ] = useState < string [ ] > ( [ ] ) ;
505
363
@@ -514,11 +372,8 @@ export const DerivedConceptForm: FC<ConceptFormProps> = function DerivedConceptF
514
372
}
515
373
} , [ transformCode ] ) ;
516
374
517
- // time stamps used to track functions from server
518
- const [ requestTimeStamp , setRequestTimeStamp ] = useState < number > ( 0 ) ;
519
375
const [ codeGenInProgress , setCodeGenInProgress ] = useState < boolean > ( false ) ;
520
376
521
- let typeList = TypeList
522
377
let nameField = (
523
378
< TextField key = "name-field" id = "name" fullWidth label = "concept name" value = { name } sx = { { minWidth : 120 , flex : 1 , paddingBottom : 1 } }
524
379
FormHelperTextProps = { {
@@ -605,9 +460,9 @@ export const DerivedConceptForm: FC<ConceptFormProps> = function DerivedConceptF
605
460
606
461
viewExamples = ( < Box key = "viewexample--box" width = "100%" sx = { { position : "relative" , } } >
607
462
< InputLabel shrink > illustration of the generated function</ InputLabel >
608
- < GroupItems sx = { { padding : "0px 0px 6px 0px" , margin : 0 } } >
463
+ < Box className = " GroupItems" sx = { { padding : "0px 0px 6px 0px" , margin : 0 } } >
609
464
{ simpleTableView ( transformResult , colNames , conceptShelfItems , 5 ) }
610
- </ GroupItems >
465
+ </ Box >
611
466
</ Box > )
612
467
}
613
468
0 commit comments