@@ -79,6 +79,8 @@ class Browser extends DashboardView {
79
79
80
80
isUnique : false ,
81
81
uniqueField : null ,
82
+ markRequiredField : false ,
83
+ requiredColumnFields : [ ]
82
84
} ;
83
85
84
86
this . prefetchData = this . prefetchData . bind ( this ) ;
@@ -123,6 +125,7 @@ class Browser extends DashboardView {
123
125
this . onDialogToggle = this . onDialogToggle . bind ( this ) ;
124
126
this . abortAddRow = this . abortAddRow . bind ( this ) ;
125
127
this . saveNewRow = this . saveNewRow . bind ( this ) ;
128
+ this . setRequiredColumnFields = this . setRequiredColumnFields . bind ( this ) ;
126
129
}
127
130
128
131
componentWillMount ( ) {
@@ -280,14 +283,26 @@ class Browser extends DashboardView {
280
283
required,
281
284
defaultValue
282
285
} ;
283
- this . props . schema . dispatch ( ActionTypes . ADD_COLUMN , payload ) . catch ( ( err ) => {
286
+ this . props . schema . dispatch ( ActionTypes . ADD_COLUMN , payload ) . then ( ( ) => {
287
+ // if new required field column is added, then add field in requiredColumn
288
+ if ( required ) {
289
+ let requiredCols = [ ...this . state . requiredColumnFields , name ] ;
290
+ this . setState ( {
291
+ requiredColumnFields : requiredCols
292
+ } ) ;
293
+ }
294
+ } ) . catch ( ( err ) => {
284
295
this . showNote ( err . message , true ) ;
285
296
} ) . finally ( ( ) => {
286
297
this . setState ( { showAddColumnDialog : false } ) ;
287
298
} ) ;
288
299
}
289
300
290
301
addRow ( ) {
302
+ if ( this . props . params . className === '_User' ) {
303
+ // if User class row, then reload requiredFields
304
+ this . setRequiredColumnFields ( ) ;
305
+ }
291
306
if ( ! this . state . newObject ) {
292
307
const relation = this . state . relation ;
293
308
this . setState ( {
@@ -304,6 +319,11 @@ class Browser extends DashboardView {
304
319
newObject : null
305
320
} ) ;
306
321
}
322
+ if ( this . state . markRequiredField ) {
323
+ this . setState ( {
324
+ markRequiredField : false
325
+ } ) ;
326
+ }
307
327
}
308
328
309
329
saveNewRow ( ) {
@@ -312,6 +332,45 @@ class Browser extends DashboardView {
312
332
return ;
313
333
}
314
334
335
+ // check if required fields are missing
336
+ const className = this . props . params . className ;
337
+ let requiredCols = [ ] ;
338
+ if ( className ) {
339
+ let classColumns = this . props . schema . data . get ( 'classes' ) . get ( className ) ;
340
+ classColumns . forEach ( ( { required } , name ) => {
341
+ if ( name === 'objectId' || this . state . isUnique && name !== this . state . uniqueField ) {
342
+ return ;
343
+ }
344
+ if ( ! ! required ) {
345
+ requiredCols . push ( name ) ;
346
+ }
347
+ if ( className === '_User' && ( name === 'username' || name === 'password' ) ) {
348
+ if ( ! obj . get ( 'authData' ) ) {
349
+ requiredCols . push ( name ) ;
350
+ }
351
+ }
352
+ if ( className === '_Role' && ( name === 'name' || name === 'ACL' ) ) {
353
+ requiredCols . push ( name ) ;
354
+ }
355
+ } ) ;
356
+ }
357
+ if ( requiredCols . length ) {
358
+ for ( let idx = 0 ; idx < requiredCols . length ; idx ++ ) {
359
+ const name = requiredCols [ idx ] ;
360
+ if ( ! obj . get ( name ) ) {
361
+ this . showNote ( "Please enter all required fields" , true ) ;
362
+ this . setState ( {
363
+ markRequiredField : true
364
+ } ) ;
365
+ return ;
366
+ }
367
+ }
368
+ }
369
+ if ( this . state . markRequiredField ) {
370
+ this . setState ( {
371
+ markRequiredField : false
372
+ } ) ;
373
+ }
315
374
obj . save ( null , { useMasterKey : true } ) . then (
316
375
objectSaved => {
317
376
let msg = objectSaved . className + ' with id \'' + objectSaved . id + '\' created' ;
@@ -483,6 +542,30 @@ class Browser extends DashboardView {
483
542
delete filteredCounts [ source ] ;
484
543
}
485
544
this . setState ( { data : data , filters, lastMax : MAX_ROWS_FETCHED , filteredCounts : filteredCounts } ) ;
545
+ this . setRequiredColumnFields ( ) ;
546
+ }
547
+
548
+ setRequiredColumnFields ( ) {
549
+ if ( ! this . props . schema . data . get ( 'classes' ) ) {
550
+ return ;
551
+ }
552
+ let classes = this . props . schema . data . get ( 'classes' ) ;
553
+ const { className } = this . props . params ;
554
+ let requiredCols = [ ] ;
555
+ classes . get ( className ) . forEach ( ( { required } , name ) => {
556
+ if ( ! ! required ) {
557
+ requiredCols . push ( name ) ;
558
+ }
559
+ if ( className === '_User' && ( name === 'username' || name === 'password' || name === 'authData' ) ) {
560
+ requiredCols . push ( name ) ;
561
+ }
562
+ if ( className === '_Role' && ( name === 'name' || name === 'ACL' ) ) {
563
+ requiredCols . push ( name ) ;
564
+ }
565
+ } ) ;
566
+ this . setState ( {
567
+ requiredColumnFields : requiredCols
568
+ } ) ;
486
569
}
487
570
488
571
async fetchRelation ( relation , filters = new List ( ) ) {
@@ -636,7 +719,27 @@ class Browser extends DashboardView {
636
719
} else {
637
720
obj . set ( attr , value ) ;
638
721
}
639
- if ( isNewObject ) {
722
+
723
+ if ( isNewObject ) {
724
+ // for dynamically changing required placeholder text for _User class new row object
725
+ if ( obj . className === '_User' && attr === 'authData' && value !== undefined ) {
726
+ // username & password are not required
727
+ this . setState ( {
728
+ requiredColumnFields : this . state . requiredColumnFields . filter ( field => field !== 'username' && field !== 'password' )
729
+ } )
730
+ }
731
+
732
+ if ( obj . className === '_User' && ( attr === 'username' || attr === 'password' ) && value !== undefined ) {
733
+ // authData is not required
734
+ this . setState ( {
735
+ requiredColumnFields : this . state . requiredColumnFields . filter ( field => field !== 'authData' )
736
+ } )
737
+ }
738
+
739
+ if ( obj . className === '_User' && obj . get ( 'username' ) === undefined && obj . get ( 'password' ) === undefined && obj . get ( 'authData' ) === undefined ) {
740
+ this . setRequiredColumnFields ( ) ;
741
+ }
742
+
640
743
this . setState ( {
641
744
isNewObject : obj
642
745
} ) ;
@@ -1076,6 +1179,8 @@ class Browser extends DashboardView {
1076
1179
onSaveNewRow = { this . saveNewRow }
1077
1180
onAbortAddRow = { this . abortAddRow }
1078
1181
1182
+ markRequiredField = { this . state . markRequiredField }
1183
+ requiredColumnFields = { this . state . requiredColumnFields }
1079
1184
columns = { columns }
1080
1185
className = { className }
1081
1186
fetchNextPage = { this . fetchNextPage }
0 commit comments