@@ -5,7 +5,7 @@ class CartRemoveButton extends HTMLElement {
5
5
this . addEventListener ( 'click' , ( event ) => {
6
6
event . preventDefault ( ) ;
7
7
const cartItems = this . closest ( 'cart-items' ) || this . closest ( 'cart-drawer-items' ) ;
8
- cartItems . updateQuantity ( this . dataset . index , 0 ) ;
8
+ cartItems . updateQuantity ( this . dataset . index , 0 , event ) ;
9
9
} ) ;
10
10
}
11
11
}
@@ -76,6 +76,7 @@ class CartItems extends HTMLElement {
76
76
this . updateQuantity (
77
77
index ,
78
78
inputValue ,
79
+ event ,
79
80
document . activeElement . getAttribute ( 'name' ) ,
80
81
event . target . dataset . quantityVariantId
81
82
) ;
@@ -143,7 +144,7 @@ class CartItems extends HTMLElement {
143
144
] ;
144
145
}
145
146
146
- updateQuantity ( line , quantity , name , variantId ) {
147
+ updateQuantity ( line , quantity , event , name , variantId ) {
147
148
this . enableLoading ( line ) ;
148
149
149
150
const body = JSON . stringify ( {
@@ -152,60 +153,66 @@ class CartItems extends HTMLElement {
152
153
sections : this . getSectionsToRender ( ) . map ( ( section ) => section . section ) ,
153
154
sections_url : window . location . pathname ,
154
155
} ) ;
156
+ const eventTarget = event . currentTarget instanceof CartRemoveButton ? 'clear' : 'change' ;
155
157
156
158
fetch ( `${ routes . cart_change_url } ` , { ...fetchConfig ( ) , ...{ body } } )
157
159
. then ( ( response ) => {
158
160
return response . text ( ) ;
159
161
} )
160
162
. then ( ( state ) => {
161
- const parsedState = JSON . parse ( state ) ;
162
- const quantityElement =
163
- document . getElementById ( `Quantity-${ line } ` ) || document . getElementById ( `Drawer-quantity-${ line } ` ) ;
164
- const items = document . querySelectorAll ( '.cart-item' ) ;
165
-
166
- if ( parsedState . errors ) {
167
- quantityElement . value = quantityElement . getAttribute ( 'value' ) ;
168
- this . updateLiveRegions ( line , parsedState . errors ) ;
169
- return ;
170
- }
171
-
172
- this . classList . toggle ( 'is-empty' , parsedState . item_count === 0 ) ;
173
- const cartDrawerWrapper = document . querySelector ( 'cart-drawer' ) ;
174
- const cartFooter = document . getElementById ( 'main-cart-footer' ) ;
175
-
176
- if ( cartFooter ) cartFooter . classList . toggle ( 'is-empty' , parsedState . item_count === 0 ) ;
177
- if ( cartDrawerWrapper ) cartDrawerWrapper . classList . toggle ( 'is-empty' , parsedState . item_count === 0 ) ;
178
-
179
- this . getSectionsToRender ( ) . forEach ( ( section ) => {
180
- const elementToReplace =
181
- document . getElementById ( section . id ) . querySelector ( section . selector ) || document . getElementById ( section . id ) ;
182
- elementToReplace . innerHTML = this . getSectionInnerHTML (
183
- parsedState . sections [ section . section ] ,
184
- section . selector
185
- ) ;
186
- } ) ;
187
- const updatedValue = parsedState . items [ line - 1 ] ? parsedState . items [ line - 1 ] . quantity : undefined ;
188
- let message = '' ;
189
- if ( items . length === parsedState . items . length && updatedValue !== parseInt ( quantityElement . value ) ) {
190
- if ( typeof updatedValue === 'undefined' ) {
191
- message = window . cartStrings . error ;
192
- } else {
193
- message = window . cartStrings . quantityError . replace ( '[quantity]' , updatedValue ) ;
163
+
164
+ CartPerformance . measure ( `${ eventTarget } :paint-updated-sections"` , ( ) => {
165
+ const parsedState = JSON . parse ( state ) ;
166
+ const quantityElement =
167
+ document . getElementById ( `Quantity-${ line } ` ) || document . getElementById ( `Drawer-quantity-${ line } ` ) ;
168
+ const items = document . querySelectorAll ( '.cart-item' ) ;
169
+
170
+ if ( parsedState . errors ) {
171
+ quantityElement . value = quantityElement . getAttribute ( 'value' ) ;
172
+ this . updateLiveRegions ( line , parsedState . errors ) ;
173
+ return ;
194
174
}
195
- }
196
- this . updateLiveRegions ( line , message ) ;
197
-
198
- const lineItem =
199
- document . getElementById ( `CartItem-${ line } ` ) || document . getElementById ( `CartDrawer-Item-${ line } ` ) ;
200
- if ( lineItem && lineItem . querySelector ( `[name="${ name } "]` ) ) {
201
- cartDrawerWrapper
202
- ? trapFocus ( cartDrawerWrapper , lineItem . querySelector ( `[name="${ name } "]` ) )
203
- : lineItem . querySelector ( `[name="${ name } "]` ) . focus ( ) ;
204
- } else if ( parsedState . item_count === 0 && cartDrawerWrapper ) {
205
- trapFocus ( cartDrawerWrapper . querySelector ( '.drawer__inner-empty' ) , cartDrawerWrapper . querySelector ( 'a' ) ) ;
206
- } else if ( document . querySelector ( '.cart-item' ) && cartDrawerWrapper ) {
207
- trapFocus ( cartDrawerWrapper , document . querySelector ( '.cart-item__name' ) ) ;
208
- }
175
+
176
+ this . classList . toggle ( 'is-empty' , parsedState . item_count === 0 ) ;
177
+ const cartDrawerWrapper = document . querySelector ( 'cart-drawer' ) ;
178
+ const cartFooter = document . getElementById ( 'main-cart-footer' ) ;
179
+
180
+ if ( cartFooter ) cartFooter . classList . toggle ( 'is-empty' , parsedState . item_count === 0 ) ;
181
+ if ( cartDrawerWrapper ) cartDrawerWrapper . classList . toggle ( 'is-empty' , parsedState . item_count === 0 ) ;
182
+
183
+ this . getSectionsToRender ( ) . forEach ( ( section ) => {
184
+ const elementToReplace =
185
+ document . getElementById ( section . id ) . querySelector ( section . selector ) || document . getElementById ( section . id ) ;
186
+ elementToReplace . innerHTML = this . getSectionInnerHTML (
187
+ parsedState . sections [ section . section ] ,
188
+ section . selector
189
+ ) ;
190
+ } ) ;
191
+ const updatedValue = parsedState . items [ line - 1 ] ? parsedState . items [ line - 1 ] . quantity : undefined ;
192
+ let message = '' ;
193
+ if ( items . length === parsedState . items . length && updatedValue !== parseInt ( quantityElement . value ) ) {
194
+ if ( typeof updatedValue === 'undefined' ) {
195
+ message = window . cartStrings . error ;
196
+ } else {
197
+ message = window . cartStrings . quantityError . replace ( '[quantity]' , updatedValue ) ;
198
+ }
199
+ }
200
+ this . updateLiveRegions ( line , message ) ;
201
+
202
+ const lineItem =
203
+ document . getElementById ( `CartItem-${ line } ` ) || document . getElementById ( `CartDrawer-Item-${ line } ` ) ;
204
+ if ( lineItem && lineItem . querySelector ( `[name="${ name } "]` ) ) {
205
+ cartDrawerWrapper
206
+ ? trapFocus ( cartDrawerWrapper , lineItem . querySelector ( `[name="${ name } "]` ) )
207
+ : lineItem . querySelector ( `[name="${ name } "]` ) . focus ( ) ;
208
+ } else if ( parsedState . item_count === 0 && cartDrawerWrapper ) {
209
+ trapFocus ( cartDrawerWrapper . querySelector ( '.drawer__inner-empty' ) , cartDrawerWrapper . querySelector ( 'a' ) ) ;
210
+ } else if ( document . querySelector ( '.cart-item' ) && cartDrawerWrapper ) {
211
+ trapFocus ( cartDrawerWrapper , document . querySelector ( '.cart-item__name' ) ) ;
212
+ }
213
+ } ) ;
214
+
215
+ CartPerformance . measureFromEvent ( `${ eventTarget } :click-event` , event ) ;
209
216
210
217
publish ( PUB_SUB_EVENTS . cartUpdate , { source : 'cart-items' , cartData : parsedState , variantId : variantId } ) ;
211
218
} )
0 commit comments