From e24038503bf4af01a668fa9a1ed5b9b51c3a4da5 Mon Sep 17 00:00:00 2001 From: Mike Gerwitz Date: Fri, 10 Aug 2018 15:25:29 -0400 Subject: [PATCH] [bugfix] DapiMediator: Wait for stack to clear before updating options This allows the UI to update before we add elements. This really isn't the best place to do this, but it will do for now. DEV-3257 --- src/client/dapi/DataApiMediator.js | 30 ++++++++++++++----------- test/client/dapi/DataApiMediatorTest.js | 2 ++ 2 files changed, 19 insertions(+), 13 deletions(-) diff --git a/src/client/dapi/DataApiMediator.js b/src/client/dapi/DataApiMediator.js index 89b600b..58f9fae 100644 --- a/src/client/dapi/DataApiMediator.js +++ b/src/client/dapi/DataApiMediator.js @@ -166,22 +166,26 @@ module.exports = Class( 'DataApiMediator', : this._getDefaultValue( val_label ) ); - indexes.forEach( ( _, i ) => - group.setOptions( name, i, val_label, existing[ i ] ) - ); - - - const update = this._populateWithMap( - dapi_manager, name, indexes, quote - ); - - update[ name ] = field_update; - // allow the stack to clear before setting data to allow any // existing bucket processing to complete before hooks are kicked // off yet again (which, in practice, could otherwise result in - // infinite recursion depending on what the hooks are doing) - setTimeout( () => quote.setData( update ) ); + // infinite recursion depending on what the hooks are doing), and to + // allow the UI to update with any new elements we might be about to + // populate + setTimeout( () => + { + indexes.forEach( ( _, i ) => + group.setOptions( name, i, val_label, existing[ i ] ) + ); + + const update = this._populateWithMap( + dapi_manager, name, indexes, quote + ); + + update[ name ] = field_update; + + quote.setData( update ); + } ); }, diff --git a/test/client/dapi/DataApiMediatorTest.js b/test/client/dapi/DataApiMediatorTest.js index 62e12b1..6bf2017 100644 --- a/test/client/dapi/DataApiMediatorTest.js +++ b/test/client/dapi/DataApiMediatorTest.js @@ -368,6 +368,8 @@ describe( "DataApiMediator", () => [name]: { setOptions( given_name, given_index, given_data, given_cur ) { + expect( stack_cleared ).to.be.true; + // index is implicitly tested by the given_cur line expect( given_name ).to.equal( name ); expect( given_data ).to.deep.equal( val_label );