@@ -79,6 +79,8 @@ class Browser extends DashboardView {
7979
8080 isUnique : false ,
8181 uniqueField : null ,
82+ markRequiredField : false ,
83+ requiredColumnFields : [ ]
8284 } ;
8385
8486 this . prefetchData = this . prefetchData . bind ( this ) ;
@@ -123,6 +125,7 @@ class Browser extends DashboardView {
123125 this . onDialogToggle = this . onDialogToggle . bind ( this ) ;
124126 this . abortAddRow = this . abortAddRow . bind ( this ) ;
125127 this . saveNewRow = this . saveNewRow . bind ( this ) ;
128+ this . setRequiredColumnFields = this . setRequiredColumnFields . bind ( this ) ;
126129 }
127130
128131 componentWillMount ( ) {
@@ -280,14 +283,26 @@ class Browser extends DashboardView {
280283 required,
281284 defaultValue
282285 } ;
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 ) => {
284295 this . showNote ( err . message , true ) ;
285296 } ) . finally ( ( ) => {
286297 this . setState ( { showAddColumnDialog : false } ) ;
287298 } ) ;
288299 }
289300
290301 addRow ( ) {
302+ if ( this . props . params . className === '_User' ) {
303+ // if User class row, then reload requiredFields
304+ this . setRequiredColumnFields ( ) ;
305+ }
291306 if ( ! this . state . newObject ) {
292307 const relation = this . state . relation ;
293308 this . setState ( {
@@ -304,6 +319,11 @@ class Browser extends DashboardView {
304319 newObject : null
305320 } ) ;
306321 }
322+ if ( this . state . markRequiredField ) {
323+ this . setState ( {
324+ markRequiredField : false
325+ } ) ;
326+ }
307327 }
308328
309329 saveNewRow ( ) {
@@ -312,6 +332,45 @@ class Browser extends DashboardView {
312332 return ;
313333 }
314334
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+ }
315374 obj . save ( null , { useMasterKey : true } ) . then (
316375 objectSaved => {
317376 let msg = objectSaved . className + ' with id \'' + objectSaved . id + '\' created' ;
@@ -483,6 +542,30 @@ class Browser extends DashboardView {
483542 delete filteredCounts [ source ] ;
484543 }
485544 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+ } ) ;
486569 }
487570
488571 async fetchRelation ( relation , filters = new List ( ) ) {
@@ -636,7 +719,27 @@ class Browser extends DashboardView {
636719 } else {
637720 obj . set ( attr , value ) ;
638721 }
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+
640743 this . setState ( {
641744 isNewObject : obj
642745 } ) ;
@@ -1076,6 +1179,8 @@ class Browser extends DashboardView {
10761179 onSaveNewRow = { this . saveNewRow }
10771180 onAbortAddRow = { this . abortAddRow }
10781181
1182+ markRequiredField = { this . state . markRequiredField }
1183+ requiredColumnFields = { this . state . requiredColumnFields }
10791184 columns = { columns }
10801185 className = { className }
10811186 fetchNextPage = { this . fetchNextPage }
0 commit comments