@@ -953,26 +953,23 @@ function buildSearchParams(searchParams, data) {
953953 return searchParams ;
954954}
955955
956- function setDeepData ( data , propertyPath , value , modelValue = null ) {
956+ function getDeepData ( data , propertyPath ) {
957957 const finalData = JSON . parse ( JSON . stringify ( data ) ) ;
958958 let currentLevelData = finalData ;
959959 const parts = propertyPath . split ( '.' ) ;
960960 for ( let i = 0 ; i < parts . length - 1 ; i ++ ) {
961961 currentLevelData = currentLevelData [ parts [ i ] ] ;
962962 }
963963 const finalKey = parts [ parts . length - 1 ] ;
964- if ( currentLevelData instanceof Array ) {
965- if ( null === value ) {
966- const index = currentLevelData . indexOf ( modelValue ) ;
967- if ( index > - 1 ) {
968- currentLevelData . splice ( index , 1 ) ;
969- }
970- }
971- else {
972- currentLevelData . push ( value ) ;
973- }
974- return finalData ;
975- }
964+ return {
965+ currentLevelData,
966+ finalData,
967+ finalKey,
968+ parts
969+ } ;
970+ }
971+ function setDeepData ( data , propertyPath , value ) {
972+ const { currentLevelData, finalData, finalKey, parts } = getDeepData ( data , propertyPath ) ;
976973 if ( typeof currentLevelData !== 'object' ) {
977974 const lastPart = parts . pop ( ) ;
978975 throw new Error ( `Cannot set data-model="${ propertyPath } ". The parent "${ parts . join ( '.' ) } " data does not appear to be an object (it's "${ currentLevelData } "). Did you forget to add exposed={"${ lastPart } "} to its LiveProp?` ) ;
@@ -995,10 +992,12 @@ function doesDeepPropertyExist(data, propertyPath) {
995992}
996993function normalizeModelName ( model ) {
997994 return model
995+ . replace ( / \[ ] $ / , '' )
998996 . split ( '[' )
999997 . map ( function ( s ) {
1000998 return s . replace ( ']' , '' ) ;
1001- } ) . join ( '.' ) ;
999+ } )
1000+ . join ( '.' ) ;
10021001}
10031002
10041003function haveRenderedValuesChanged ( originalDataJson , currentDataJson , newDataJson ) {
@@ -1069,18 +1068,10 @@ class default_1 extends Controller {
10691068 window . removeEventListener ( 'beforeunload' , this . markAsWindowUnloaded ) ;
10701069 }
10711070 update ( event ) {
1072- let value = this . _getValueFromElement ( event . target ) ;
1073- if ( event . target . type === 'checkbox' && ! event . target . checked ) {
1074- value = null ;
1075- }
1076- this . _updateModelFromElement ( event . target , value , true ) ;
1071+ this . _updateModelFromElement ( event . target , this . _getValueFromElement ( event . target ) , true ) ;
10771072 }
10781073 updateDefer ( event ) {
1079- let value = this . _getValueFromElement ( event . target ) ;
1080- if ( event . target . type === 'checkbox' && ! event . target . checked ) {
1081- value = null ;
1082- }
1083- this . _updateModelFromElement ( event . target , value , false ) ;
1074+ this . _updateModelFromElement ( event . target , this . _getValueFromElement ( event . target ) , false ) ;
10841075 }
10851076 action ( event ) {
10861077 const rawAction = event . currentTarget . dataset . actionName ;
@@ -1141,9 +1132,28 @@ class default_1 extends Controller {
11411132 }
11421133 throw new Error ( `The update() method could not be called for "${ clonedElement . outerHTML } ": the element must either have a "data-model" or "name" attribute set to the model name.` ) ;
11431134 }
1144- this . $updateModel ( model , value , shouldRender , element . hasAttribute ( 'name' ) ? element . getAttribute ( 'name' ) : null , { } , this . _getValueFromElement ( element ) ) ;
1135+ if ( element instanceof HTMLInputElement && element . type === 'checkbox' && ! element . checked ) {
1136+ value = null ;
1137+ }
1138+ if ( / \[ ] $ / . test ( model ) ) {
1139+ const { currentLevelData, finalKey } = getDeepData ( this . dataValue , normalizeModelName ( model ) ) ;
1140+ const currentValue = currentLevelData [ finalKey ] ;
1141+ if ( currentValue instanceof Array ) {
1142+ if ( null === value ) {
1143+ const index = currentValue . indexOf ( this . _getValueFromElement ( element ) ) ;
1144+ if ( index > - 1 ) {
1145+ currentValue . splice ( index , 1 ) ;
1146+ }
1147+ }
1148+ else {
1149+ currentValue . push ( value ) ;
1150+ }
1151+ }
1152+ value = currentValue ;
1153+ }
1154+ this . $updateModel ( model , value , shouldRender , element . hasAttribute ( 'name' ) ? element . getAttribute ( 'name' ) : null , { } ) ;
11451155 }
1146- $updateModel ( model , value , shouldRender = true , extraModelName = null , options = { } , modelValue = null ) {
1156+ $updateModel ( model , value , shouldRender = true , extraModelName = null , options = { } ) {
11471157 const directives = parseDirectives ( model ) ;
11481158 if ( directives . length > 1 ) {
11491159 throw new Error ( `The data-model="${ model } " format is invalid: it does not support multiple directives (i.e. remove any spaces).` ) ;
@@ -1165,11 +1175,10 @@ class default_1 extends Controller {
11651175 this . _dispatchEvent ( 'live:update-model' , {
11661176 modelName,
11671177 extraModelName : normalizedExtraModelName ,
1168- value,
1169- modelValue
1178+ value
11701179 } ) ;
11711180 }
1172- this . dataValue = setDeepData ( this . dataValue , modelName , value , modelValue ) ;
1181+ this . dataValue = setDeepData ( this . dataValue , modelName , value ) ;
11731182 directive . modifiers . forEach ( ( modifier => {
11741183 switch ( modifier . name ) {
11751184 default :
@@ -1485,7 +1494,7 @@ class default_1 extends Controller {
14851494 }
14861495 this . $updateModel ( foundModelName , event . detail . value , false , null , {
14871496 dispatch : false
1488- } , event . detail . modelValue ) ;
1497+ } ) ;
14891498 }
14901499 _shouldChildLiveElementUpdate ( fromEl , toEl ) {
14911500 if ( ! fromEl . dataset . originalData ) {
0 commit comments