@@ -329,14 +329,14 @@ function orEmptyArray(v) {
329
329
var expressionCache = { } ;
330
330
331
331
function evaluateInternal ( expression , context ) {
332
- var parsedExpression = expressionCache [ expression ] ;
333
- if ( ! parsedExpression ) {
334
- parsedExpression = parser . parse ( expression ) ;
335
- expressionCache [ expression ] = parsedExpression ;
336
- }
332
+ var parsedExpression = expressionCache [ expression ] ;
333
+ if ( ! parsedExpression ) {
334
+ parsedExpression = parser . parse ( expression ) ;
335
+ expressionCache [ expression ] = parsedExpression ;
336
+ }
337
337
338
- var variables = parsedExpression . variables ( ) ;
339
- var boundVariables = bindVariables ( variables , context ) ;
338
+ var variables = parsedExpression . variables ( ) ;
339
+ var boundVariables = bindVariables ( variables , context ) ;
340
340
341
341
var result ;
342
342
try {
@@ -655,18 +655,23 @@ function orEmptyArray(v) {
655
655
self . getPrepopData = function ( conf ) {
656
656
var source = conf . source ;
657
657
if ( source . url ) {
658
+ var failedValidation = false ;
658
659
var url = ( config . prepopUrlPrefix || window . location . href ) + source . url ;
659
660
var params = [ ] ;
660
661
_ . each ( source . params || [ ] , function ( param ) {
661
662
var value ;
662
663
if ( param . type && param . type == 'computed' ) {
663
664
// evaluate the expression against the context.
664
665
value = ecodata . forms . expressionEvaluator . evaluateUntyped ( param . expression , context ) ;
666
+ if ( param . required && ! value ) {
667
+ failedValidation = true ;
668
+ }
665
669
}
666
670
else {
667
671
// Treat it as a literal
668
672
value = param . value ;
669
673
}
674
+
670
675
// Unroll the array to prevent jQuery appending [] to the array typed parameter name.
671
676
if ( _ . isArray ( value ) ) {
672
677
for ( var i = 0 ; i < value . length ; i ++ ) {
@@ -677,6 +682,9 @@ function orEmptyArray(v) {
677
682
params . push ( { name :param . name , value : value } ) ;
678
683
}
679
684
} ) ;
685
+ if ( failedValidation ) {
686
+ return $ . Deferred ( ) . resolve ( source . defaultValue || null ) ;
687
+ }
680
688
return $ . ajax ( url , { data :params , dataType :source . dataType || 'json' } ) ;
681
689
}
682
690
var deferred = $ . Deferred ( ) ;
@@ -690,6 +698,14 @@ function orEmptyArray(v) {
690
698
else if ( source && source . hasOwnProperty ( 'literal' ) ) {
691
699
data = source [ 'literal' ] ;
692
700
}
701
+
702
+ // Support for converting array typed values to lookup tables.
703
+ // e.g. MERIT has a list of data sets that we want to be selectable from a list then
704
+ // the full data set to be available for lookup by id (using the lookupTable data type)
705
+ if ( source [ 'index-by' ] ) {
706
+ data = _ . indexBy ( data , source [ 'index-by' ] )
707
+ }
708
+
693
709
deferred . resolve ( data ) ;
694
710
return deferred ;
695
711
} ;
@@ -844,6 +860,7 @@ function orEmptyArray(v) {
844
860
}
845
861
}
846
862
else if ( metadata . constraints . type == 'pre-populated' ) {
863
+ console . log ( "******************** Encountered pre-pop constraints for " + self . getName ( ) + "***************************************" )
847
864
var defaultConstraints = metadata . constraints . defaults || [ ] ;
848
865
var constraintsObservable = ko . observableArray ( defaultConstraints ) ;
849
866
if ( ! includeExcludeDefined ) {
@@ -898,14 +915,15 @@ function orEmptyArray(v) {
898
915
self . displayOptions = metadata . displayOptions ;
899
916
}
900
917
self . load = function ( data ) {
918
+ console . log ( "Loading data for " + self . getName ( ) + " : " + data )
919
+ self ( data ) ;
901
920
if ( constraintsInititaliser ) {
902
921
constraintsInititaliser . always ( function ( ) {
922
+ console . log ( "Re-Loading data for " + self . getName ( ) + " : " + data )
903
923
self ( data ) ;
904
924
} )
905
925
}
906
- else {
907
- self ( data ) ;
908
- }
926
+
909
927
}
910
928
} ;
911
929
0 commit comments