From 8ac2a367db4d19d3523364a648d081f36096fee1 Mon Sep 17 00:00:00 2001 From: Jeffrey Fisher Date: Fri, 8 Jun 2018 15:43:51 -0400 Subject: [PATCH 1/7] [DEV-3192] Fix populating default bucket data to meet min required bucket values --- src/program/ProgramInit.js | 53 +++++++++++++++---- test/program/ProgramInitTest.js | 93 ++++++++++++++++++++++++++++++++- 2 files changed, 136 insertions(+), 10 deletions(-) diff --git a/src/program/ProgramInit.js b/src/program/ProgramInit.js index e363c9f..9d76a69 100644 --- a/src/program/ProgramInit.js +++ b/src/program/ProgramInit.js @@ -56,14 +56,49 @@ module.exports = Class( 'ProgramInit', { const defaults = program.defaults || {}; - // initialize to an array with a single element of the default value - return Promise.resolve( - Object.keys( defaults ).reduce( - ( data, key ) => ( data[ key ] === undefined ) - ? ( data[ key ] = [ defaults[ key ] ], data ) - : data, - doc_data || {} - ) - ); + var data = {}, + groups = program.meta.groups; + + Object.keys( program.groupExclusiveFields ).forEach( function( group, index ) + { + var length = program.groupExclusiveFields[ group ].length; + + while ( length-- ) + { + var field = program.groupExclusiveFields[ group ][ length ], + defaultValue; + + if ( defaults.hasOwnProperty(field) ) + { + defaultValue = defaults[ field ]; + // Initialize with existing document data if any + data[ field ] = doc_data[ field ] ? doc_data[ field ] : []; + + // If no document data, initialize with default value + if ( !doc_data[ field ] ) + { + data[ field ][ 0 ] = defaultValue; + } + + // If min rows on the group is greater than the data + // currently in the bucket, then populate the rest + // of the data with the default data until the + // arrays are the same length + if ( groups.hasOwnProperty( group ) && + data[ field ].length < groups[ group ].min ) + { + var index = data[ field ].length; + + while ( index < groups[ group ].min ) + { + data[ field ][ index ] = defaultValue; + index++; + } + } + } + } + }); + + return Promise.resolve( data ); }, } ); diff --git a/test/program/ProgramInitTest.js b/test/program/ProgramInitTest.js index 581a5c4..fe65914 100644 --- a/test/program/ProgramInitTest.js +++ b/test/program/ProgramInitTest.js @@ -34,6 +34,12 @@ describe( 'ProgramInit', () => { label: "initializes defaults", defaults: { a: "one", b: "two" }, + meta: { + groups: {} + }, + groupExclusiveFields: { + Something: [ "a", "b" ] + }, doc_data: {}, expected: { a: [ "one" ], @@ -43,18 +49,33 @@ describe( 'ProgramInit', () => { label: "does nothing with no data or defaults", defaults: {}, + meta: { + groups: {} + }, + groupExclusiveFields: {}, doc_data: {}, expected: {}, }, { label: "produces empty object given undefined data", defaults: {}, + meta: { + groups: {} + }, + groupExclusiveFields: {}, doc_data: undefined, expected: {}, }, { label: "keeps existing data with defaults", defaults: { foo: "init" }, + meta: { + groups: {} + }, + groupExclusiveFields: { + Something: [ "foo" ], + SomethingElse: [ "bar" ] + }, doc_data: { bar: [ "baz" ] }, expected: { foo: [ "init" ], @@ -64,6 +85,12 @@ describe( 'ProgramInit', () => { label: "keeps existing doc data with no defaults", defaults: {}, + meta: { + groups: {} + }, + groupExclusiveFields: { + Something: [ "foo" ], + }, doc_data: { foo: [ "bar" ] }, expected: { foo: [ "bar" ], @@ -72,12 +99,74 @@ describe( 'ProgramInit', () => { label: "does not overwrite existing data with defaults", defaults: { foo: "init" }, + meta: { + groups: {} + }, + groupExclusiveFields: { + Something: [ "foo" ] + }, doc_data: { foo: [ "bar" ] }, expected: { foo: [ "bar" ], }, }, - ].forEach( ({ label, doc_data, id, defaults, expected }) => + { + label: "does not overwrite existing data with defaults and multiple rows", + defaults: { foo: "init" }, + meta: { + groups: { + Something: { + min: 3 + } + } + }, + groupExclusiveFields: { + Something: [ "foo" ] + }, + doc_data: { foo: [ "bar", "baz", "test" ] }, + expected: { + foo: [ "bar", "baz", "test" ], + }, + }, + { + label: "initializes with default bucket data", + defaults: { foo: "init" }, + meta: { + groups: { + Something: { + min: 5 + } + } + }, + groupExclusiveFields: { + Something: [ "foo" ] + }, + doc_data: {}, + expected: { + foo: [ "init", "init", "init", "init", "init" ], + }, + }, + { + label: "fix missing bucket data values", + defaults: { foo: "init" }, + meta: { + groups: { + Something: { + min: 5 + } + } + }, + groupExclusiveFields: { + Something: [ "foo" ] + }, + doc_data: { + foo: [ "1", "2", "3", "4" ], + }, + expected: { + foo: [ "1", "2", "3", "4", "init" ], + }, + }, + ].forEach( ({ label, doc_data, id, defaults, meta, groupExclusiveFields, expected }) => { it( label, () => { @@ -86,6 +175,8 @@ describe( 'ProgramInit', () => const program = { id: "foo", defaults: defaults, + meta: meta, + groupExclusiveFields : groupExclusiveFields }; return expect( sut.init( program, doc_data ) ) From 345e570e67c3d92b5228053fad89128f565daa4c Mon Sep 17 00:00:00 2001 From: Jeffrey Fisher Date: Tue, 12 Jun 2018 13:50:41 -0400 Subject: [PATCH 2/7] [DEV-3192] Fix hiding the header when all contents are hidden --- src/ui/group/GroupUi.js | 10 ++++++-- src/ui/group/StackedGroupUi.js | 45 ++++++++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+), 2 deletions(-) diff --git a/src/ui/group/GroupUi.js b/src/ui/group/GroupUi.js index 21824f8..de11c33 100644 --- a/src/ui/group/GroupUi.js +++ b/src/ui/group/GroupUi.js @@ -792,7 +792,7 @@ module.exports = Class( 'GroupUi' ) }, - 'public hideField': function( field, index ) + 'virtual public hideField': function( field, index ) { if ( this.isFieldVisible( field, index ) === false ) { @@ -814,7 +814,13 @@ module.exports = Class( 'GroupUi' ) }, - 'public showField': function( field, index ) + 'protected hasVisibleField'( index ) + { + return this._visCount[ index ] > 0 ? true : false; + }, + + + 'virtual public showField': function( field, index ) { if ( this.isFieldVisible( field, index ) === true ) { diff --git a/src/ui/group/StackedGroupUi.js b/src/ui/group/StackedGroupUi.js index 0da7145..f5c3edf 100644 --- a/src/ui/group/StackedGroupUi.js +++ b/src/ui/group/StackedGroupUi.js @@ -100,4 +100,49 @@ module.exports = Class( 'StackedGroupUi' ) return this.__super( index ); }, + + + /** + * Hide the header if there are no visible fields + * + * @param field + * @param index + */ + 'public override hideField'( field, index ) + { + this.__super( field, index ); + + if ( !this.hasVisibleField( index ) ) + { + const header = this._$container.find( 'dl' )[ index ]; + var attribute = header.getAttribute( 'class' ); + + attribute = attribute.includes( ' hidden ' ) ? attribute : attribute + ' hidden '; + + header.setAttribute( 'class', attribute ); + } + }, + + + /** + * Show the header if there are visible fields + * + * @param field + * @param index + */ + 'public override showField'( field, index ) + { + this.__super( field, index ); + + if ( this.hasVisibleField( index ) ) + { + const header = this._$container.find( 'dl' )[ index ]; + var attribute = header.getAttribute( 'class' ); + + attribute = attribute.includes( ' hidden ' ) ? attribute.replace(' hidden ', '') : attribute; + + header.setAttribute( 'class', attribute ); + } + + } } ); From 3e32442a43cf586ca1c662f1e379d9e99025f634 Mon Sep 17 00:00:00 2001 From: Jeffrey Fisher Date: Tue, 12 Jun 2018 14:52:36 -0400 Subject: [PATCH 3/7] [DEV-3192] fixed default value initialization --- src/program/ProgramInit.js | 45 +++++++++++++++++++------------------- 1 file changed, 23 insertions(+), 22 deletions(-) diff --git a/src/program/ProgramInit.js b/src/program/ProgramInit.js index 9d76a69..a4eb634 100644 --- a/src/program/ProgramInit.js +++ b/src/program/ProgramInit.js @@ -66,34 +66,35 @@ module.exports = Class( 'ProgramInit', while ( length-- ) { var field = program.groupExclusiveFields[ group ][ length ], - defaultValue; + defaultValue = {}; if ( defaults.hasOwnProperty(field) ) { defaultValue = defaults[ field ]; - // Initialize with existing document data if any - data[ field ] = doc_data[ field ] ? doc_data[ field ] : []; + } - // If no document data, initialize with default value - if ( !doc_data[ field ] ) + // Initialize with existing document data if any + data[ field ] = doc_data[ field ] ? doc_data[ field ] : []; + + // If no document data, initialize with default value + if ( !doc_data[ field ] ) + { + data[ field ][ 0 ] = defaultValue; + } + + // If min rows on the group is greater than the data + // currently in the bucket, then populate the rest + // of the data with the default data until the + // arrays are the same length + if ( groups.hasOwnProperty( group ) && + data[ field ].length < groups[ group ].min ) + { + var index = data[ field ].length; + + while ( index < groups[ group ].min ) { - data[ field ][ 0 ] = defaultValue; - } - - // If min rows on the group is greater than the data - // currently in the bucket, then populate the rest - // of the data with the default data until the - // arrays are the same length - if ( groups.hasOwnProperty( group ) && - data[ field ].length < groups[ group ].min ) - { - var index = data[ field ].length; - - while ( index < groups[ group ].min ) - { - data[ field ][ index ] = defaultValue; - index++; - } + data[ field ][ index ] = defaultValue; + index++; } } } From 94f76c5a771dc882c63e2a2c04b307416baab048 Mon Sep 17 00:00:00 2001 From: Jeffrey Fisher Date: Tue, 12 Jun 2018 15:20:14 -0400 Subject: [PATCH 4/7] [DEV-3192] fixed test cases --- src/program/ProgramInit.js | 45 ++++++++++++++++----------------- test/program/ProgramInitTest.js | 19 +++----------- 2 files changed, 26 insertions(+), 38 deletions(-) diff --git a/src/program/ProgramInit.js b/src/program/ProgramInit.js index a4eb634..9d76a69 100644 --- a/src/program/ProgramInit.js +++ b/src/program/ProgramInit.js @@ -66,35 +66,34 @@ module.exports = Class( 'ProgramInit', while ( length-- ) { var field = program.groupExclusiveFields[ group ][ length ], - defaultValue = {}; + defaultValue; if ( defaults.hasOwnProperty(field) ) { defaultValue = defaults[ field ]; - } + // Initialize with existing document data if any + data[ field ] = doc_data[ field ] ? doc_data[ field ] : []; - // Initialize with existing document data if any - data[ field ] = doc_data[ field ] ? doc_data[ field ] : []; - - // If no document data, initialize with default value - if ( !doc_data[ field ] ) - { - data[ field ][ 0 ] = defaultValue; - } - - // If min rows on the group is greater than the data - // currently in the bucket, then populate the rest - // of the data with the default data until the - // arrays are the same length - if ( groups.hasOwnProperty( group ) && - data[ field ].length < groups[ group ].min ) - { - var index = data[ field ].length; - - while ( index < groups[ group ].min ) + // If no document data, initialize with default value + if ( !doc_data[ field ] ) { - data[ field ][ index ] = defaultValue; - index++; + data[ field ][ 0 ] = defaultValue; + } + + // If min rows on the group is greater than the data + // currently in the bucket, then populate the rest + // of the data with the default data until the + // arrays are the same length + if ( groups.hasOwnProperty( group ) && + data[ field ].length < groups[ group ].min ) + { + var index = data[ field ].length; + + while ( index < groups[ group ].min ) + { + data[ field ][ index ] = defaultValue; + index++; + } } } } diff --git a/test/program/ProgramInitTest.js b/test/program/ProgramInitTest.js index fe65914..a2d6d93 100644 --- a/test/program/ProgramInitTest.js +++ b/test/program/ProgramInitTest.js @@ -68,7 +68,10 @@ describe( 'ProgramInit', () => }, { label: "keeps existing data with defaults", - defaults: { foo: "init" }, + defaults: { + foo: "init", + bar: "test" + }, meta: { groups: {} }, @@ -82,20 +85,6 @@ describe( 'ProgramInit', () => bar: [ "baz" ], }, }, - { - label: "keeps existing doc data with no defaults", - defaults: {}, - meta: { - groups: {} - }, - groupExclusiveFields: { - Something: [ "foo" ], - }, - doc_data: { foo: [ "bar" ] }, - expected: { - foo: [ "bar" ], - }, - }, { label: "does not overwrite existing data with defaults", defaults: { foo: "init" }, From b72fb4b2c764d0f002969d790cfc4f812d96ea57 Mon Sep 17 00:00:00 2001 From: Jeffrey Fisher Date: Thu, 14 Jun 2018 17:22:11 -0400 Subject: [PATCH 5/7] [DEV-3192] Added check for no doc_data --- src/program/ProgramInit.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/program/ProgramInit.js b/src/program/ProgramInit.js index 9d76a69..6b54174 100644 --- a/src/program/ProgramInit.js +++ b/src/program/ProgramInit.js @@ -72,10 +72,10 @@ module.exports = Class( 'ProgramInit', { defaultValue = defaults[ field ]; // Initialize with existing document data if any - data[ field ] = doc_data[ field ] ? doc_data[ field ] : []; + data[ field ] = doc_data && doc_data[ field ] ? doc_data[ field ] : []; // If no document data, initialize with default value - if ( !doc_data[ field ] ) + if ( !doc_data || !doc_data[ field ] ) { data[ field ][ 0 ] = defaultValue; } From e079a5eb0aaec45aa264eb4c478f454bff0cd97e Mon Sep 17 00:00:00 2001 From: Jeffrey Fisher Date: Fri, 15 Jun 2018 13:35:06 -0400 Subject: [PATCH 6/7] [DEV-3192] Simplified logic and corrected issue with bucket data --- src/program/ProgramInit.js | 59 +++++++++++++++++----------------- src/ui/group/GroupUi.js | 21 ++++++++++-- src/ui/group/StackedGroupUi.js | 10 ++---- 3 files changed, 51 insertions(+), 39 deletions(-) diff --git a/src/program/ProgramInit.js b/src/program/ProgramInit.js index 6b54174..ce9477a 100644 --- a/src/program/ProgramInit.js +++ b/src/program/ProgramInit.js @@ -56,44 +56,45 @@ module.exports = Class( 'ProgramInit', { const defaults = program.defaults || {}; - var data = {}, - groups = program.meta.groups; + let data = doc_data || {}; + let groups = program.meta.groups; - Object.keys( program.groupExclusiveFields ).forEach( function( group, index ) + Object.keys( program.groupExclusiveFields ).forEach( group => { - var length = program.groupExclusiveFields[ group ].length; + let length = program.groupExclusiveFields[ group ].length; while ( length-- ) { - var field = program.groupExclusiveFields[ group ][ length ], - defaultValue; + let field = program.groupExclusiveFields[ group ][ length ]; + let defaultValue; - if ( defaults.hasOwnProperty(field) ) + if ( !defaults.hasOwnProperty( field )) { - defaultValue = defaults[ field ]; - // Initialize with existing document data if any - data[ field ] = doc_data && doc_data[ field ] ? doc_data[ field ] : []; + continue; + } - // If no document data, initialize with default value - if ( !doc_data || !doc_data[ field ] ) + defaultValue = defaults[ field ]; + // Initialize with existing document data if any + + // If no document data, initialize with default value + if ( data[ field ] === undefined ) + { + data[ field ] = [ defaultValue ]; + } + + // If min rows on the group is greater than the data + // currently in the bucket, then populate the rest + // of the data with the default data until the + // arrays are the same length + if ( groups.hasOwnProperty( group ) && + data[ field ].length < groups[ group ].min ) + { + let index = data[ field ].length; + + while ( index < groups[ group ].min ) { - data[ field ][ 0 ] = defaultValue; - } - - // If min rows on the group is greater than the data - // currently in the bucket, then populate the rest - // of the data with the default data until the - // arrays are the same length - if ( groups.hasOwnProperty( group ) && - data[ field ].length < groups[ group ].min ) - { - var index = data[ field ].length; - - while ( index < groups[ group ].min ) - { - data[ field ][ index ] = defaultValue; - index++; - } + data[ field ][ index ] = defaultValue; + index++; } } } diff --git a/src/ui/group/GroupUi.js b/src/ui/group/GroupUi.js index de11c33..ac506a8 100644 --- a/src/ui/group/GroupUi.js +++ b/src/ui/group/GroupUi.js @@ -791,7 +791,12 @@ module.exports = Class( 'GroupUi' ) : $element; }, - + /** + * Hides the field based on field name and index + * + * @param field + * @param index + */ 'virtual public hideField': function( field, index ) { if ( this.isFieldVisible( field, index ) === false ) @@ -813,13 +818,25 @@ module.exports = Class( 'GroupUi' ) .applyStyle( this._naStyler ); }, - + /** + * Returns a boolean depending on if there are visible fields + * based off of the visCount + * + * @param index + * @returns {boolean} + */ 'protected hasVisibleField'( index ) { return this._visCount[ index ] > 0 ? true : false; }, + /** + * Shows the field based on field name and index + * + * @param field + * @param index + */ 'virtual public showField': function( field, index ) { if ( this.isFieldVisible( field, index ) === true ) diff --git a/src/ui/group/StackedGroupUi.js b/src/ui/group/StackedGroupUi.js index f5c3edf..bf0eb9b 100644 --- a/src/ui/group/StackedGroupUi.js +++ b/src/ui/group/StackedGroupUi.js @@ -115,11 +115,8 @@ module.exports = Class( 'StackedGroupUi' ) if ( !this.hasVisibleField( index ) ) { const header = this._$container.find( 'dl' )[ index ]; - var attribute = header.getAttribute( 'class' ); - attribute = attribute.includes( ' hidden ' ) ? attribute : attribute + ' hidden '; - - header.setAttribute( 'class', attribute ); + header.classList.add( 'hidden' ); } }, @@ -137,11 +134,8 @@ module.exports = Class( 'StackedGroupUi' ) if ( this.hasVisibleField( index ) ) { const header = this._$container.find( 'dl' )[ index ]; - var attribute = header.getAttribute( 'class' ); - attribute = attribute.includes( ' hidden ' ) ? attribute.replace(' hidden ', '') : attribute; - - header.setAttribute( 'class', attribute ); + header.classList.remove( 'hidden' ); } } From 8600c3beb71dd9b54ddf32efb634e696d761a08a Mon Sep 17 00:00:00 2001 From: Jeffrey Fisher Date: Tue, 19 Jun 2018 09:57:50 -0400 Subject: [PATCH 7/7] [DEV-3192] Renamed variables and added test case --- src/program/ProgramInit.js | 18 ++++++++---------- test/program/ProgramInitTest.js | 14 ++++++++++++++ 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/src/program/ProgramInit.js b/src/program/ProgramInit.js index ce9477a..d4db00f 100644 --- a/src/program/ProgramInit.js +++ b/src/program/ProgramInit.js @@ -55,31 +55,29 @@ module.exports = Class( 'ProgramInit', 'public init'( program, doc_data ) { const defaults = program.defaults || {}; - - let data = doc_data || {}; - let groups = program.meta.groups; + const data = doc_data || {}; + const groups = program.meta.groups; Object.keys( program.groupExclusiveFields ).forEach( group => { - let length = program.groupExclusiveFields[ group ].length; + let i = program.groupExclusiveFields[ group ].length; - while ( length-- ) + while ( i-- ) { - let field = program.groupExclusiveFields[ group ][ length ]; - let defaultValue; + const field = program.groupExclusiveFields[ group ][ i ]; + const default_value = defaults[ field ]; if ( !defaults.hasOwnProperty( field )) { continue; } - defaultValue = defaults[ field ]; // Initialize with existing document data if any // If no document data, initialize with default value if ( data[ field ] === undefined ) { - data[ field ] = [ defaultValue ]; + data[ field ] = [ default_value ]; } // If min rows on the group is greater than the data @@ -93,7 +91,7 @@ module.exports = Class( 'ProgramInit', while ( index < groups[ group ].min ) { - data[ field ][ index ] = defaultValue; + data[ field ][ index ] = default_value; index++; } } diff --git a/test/program/ProgramInitTest.js b/test/program/ProgramInitTest.js index a2d6d93..8d3ee90 100644 --- a/test/program/ProgramInitTest.js +++ b/test/program/ProgramInitTest.js @@ -85,6 +85,20 @@ describe( 'ProgramInit', () => bar: [ "baz" ], }, }, + { + label: "keeps existing data with no defaults", + defaults: {}, + meta: { + groups: {} + }, + groupExclusiveFields: { + SomethingElse: [ "bar" ] + }, + doc_data: { bar: [ "baz" ] }, + expected: { + bar: [ "baz" ], + }, + }, { label: "does not overwrite existing data with defaults", defaults: { foo: "init" },