4
4
*/
5
5
6
6
define ( [
7
- " jquery" ,
7
+ ' jquery' ,
8
8
'Magento_Ui/js/modal/confirm' ,
9
9
'Magento_Ui/js/modal/alert' ,
10
- "mage/translate" ,
11
- "prototype" ,
12
- "Magento_Catalog/catalog/product/composite/configure" ,
10
+ 'mage/template' ,
11
+ 'text!Magento_Sales/templates/order/create/shipping/reload.html' ,
12
+ 'text!Magento_Sales/templates/order/create/payment/reload.html' ,
13
+ 'mage/translate' ,
14
+ 'prototype' ,
15
+ 'Magento_Catalog/catalog/product/composite/configure' ,
13
16
'Magento_Ui/js/lib/view/utils/async'
14
- ] , function ( jQuery , confirm , alert ) {
17
+ ] , function ( jQuery , confirm , alert , template , shippingTemplate , paymentTemplate ) {
15
18
16
19
window . AdminOrder = new Class . create ( ) ;
17
20
@@ -29,7 +32,7 @@ define([
29
32
this . gridProducts = $H ( { } ) ;
30
33
this . gridProductsGift = $H ( { } ) ;
31
34
this . billingAddressContainer = '' ;
32
- this . shippingAddressContainer = '' ;
35
+ this . shippingAddressContainer = '' ;
33
36
this . isShippingMethodReseted = data . shipping_method_reseted ? data . shipping_method_reseted : false ;
34
37
this . overlayData = $H ( { } ) ;
35
38
this . giftMessageDataChanged = false ;
@@ -39,7 +42,19 @@ define([
39
42
this . isOnlyVirtualProduct = false ;
40
43
this . excludedPaymentMethods = [ ] ;
41
44
this . summarizePrice = true ;
42
- this . timerId = null ;
45
+ this . shippingTemplate = template ( shippingTemplate , {
46
+ data : {
47
+ title : jQuery . mage . __ ( 'Shipping Method' ) ,
48
+ linkText : jQuery . mage . __ ( 'Get shipping methods and rates' )
49
+ }
50
+ } ) ;
51
+ this . paymentTemplate = template ( paymentTemplate , {
52
+ data : {
53
+ title : jQuery . mage . __ ( 'Payment Method' ) ,
54
+ linkText : jQuery . mage . __ ( 'Get available payment methods' )
55
+ }
56
+ } ) ;
57
+
43
58
jQuery . async ( '#order-items' , ( function ( ) {
44
59
this . dataArea = new OrderFormArea ( 'data' , $ ( this . getAreaId ( 'data' ) ) , this ) ;
45
60
this . itemsArea = Object . extend ( new OrderFormArea ( 'items' , $ ( this . getAreaId ( 'items' ) ) , this ) , {
@@ -168,43 +183,51 @@ define([
168
183
169
184
var data = this . serializeData ( container ) ;
170
185
data [ el . name ] = id ;
171
- if ( this . isShippingField ( container ) && ! this . isShippingMethodReseted ) {
186
+
187
+ this . resetPaymentMethod ( ) ;
188
+ if ( this . isShippingField ( container ) && ! this . isShippingMethodReseted ) {
172
189
this . resetShippingMethod ( data ) ;
173
- }
174
- else {
190
+ } else {
175
191
this . saveData ( data ) ;
176
192
}
177
193
} ,
178
194
179
- isShippingField : function ( fieldId ) {
180
- if ( this . shippingAsBilling ) {
195
+ /**
196
+ * Checks if the field belongs to the shipping address.
197
+ *
198
+ * @param {String } fieldId
199
+ * @return {Boolean }
200
+ */
201
+ isShippingField : function ( fieldId ) {
202
+ if ( this . shippingAsBilling ) {
181
203
return fieldId . include ( 'billing' ) ;
182
204
}
205
+
183
206
return fieldId . include ( 'shipping' ) ;
184
207
} ,
185
208
186
- isBillingField : function ( fieldId ) {
209
+ /**
210
+ * Checks if the field belongs to the billing address.
211
+ *
212
+ * @param {String } fieldId
213
+ * @return {Boolean }
214
+ */
215
+ isBillingField : function ( fieldId ) {
187
216
return fieldId . include ( 'billing' ) ;
188
217
} ,
189
218
190
- bindAddressFields : function ( container ) {
191
- var fields = $ ( container ) . select ( 'input' , 'select' , 'textarea' ) ;
192
- for ( var i = 0 ; i < fields . length ; i ++ ) {
193
- Event . observe ( fields [ i ] , 'change' , this . triggerChangeEvent . bind ( this ) ) ;
194
- }
195
- } ,
196
-
197
219
/**
198
- * Calls changing address field handler after timeout to prevent multiple simultaneous calls .
220
+ * Binds events on container form fields .
199
221
*
200
- * @param {Event } event
222
+ * @param {String } container
201
223
*/
202
- triggerChangeEvent : function ( event ) {
203
- if ( this . timerId ) {
204
- window . clearTimeout ( this . timerId ) ;
205
- }
224
+ bindAddressFields : function ( container ) {
225
+ var fields = $ ( container ) . select ( 'input' , 'select' , 'textarea' ) ,
226
+ i ;
206
227
207
- this . timerId = window . setTimeout ( this . changeAddressField . bind ( this ) , 500 , event ) ;
228
+ for ( i = 0 ; i < fields . length ; i ++ ) {
229
+ jQuery ( fields [ i ] ) . change ( this . changeAddressField . bind ( this ) ) ;
230
+ }
208
231
} ,
209
232
210
233
/**
@@ -218,7 +241,8 @@ define([
218
241
matchRes = field . name . match ( re ) ,
219
242
type ,
220
243
name ,
221
- data ;
244
+ data ,
245
+ resetShipping = false ;
222
246
223
247
if ( ! matchRes ) {
224
248
return ;
@@ -234,20 +258,31 @@ define([
234
258
}
235
259
data = data . toObject ( ) ;
236
260
237
- if ( type === 'billing' && this . shippingAsBilling || type === 'shipping' && ! this . shippingAsBilling ) {
261
+ if ( type === 'billing' && this . shippingAsBilling ) {
262
+ this . syncAddressField ( this . shippingAddressContainer , field . name , field . value ) ;
263
+ resetShipping = true ;
264
+ }
265
+
266
+ if ( type === 'shipping' && ! this . shippingAsBilling ) {
267
+ resetShipping = true ;
268
+ }
269
+
270
+ if ( resetShipping ) {
238
271
data [ 'reset_shipping' ] = true ;
239
272
}
240
273
241
274
data [ 'order[' + type + '_address][customer_address_id]' ] = null ;
242
- data [ 'shipping_as_billing' ] = jQuery ( '[name="shipping_same_as_billing"]' ) . is ( ':checked' ) ? 1 : 0 ;
275
+ data [ 'shipping_as_billing' ] = + this . shippingAsBilling ;
243
276
244
277
if ( name === 'customer_address_id' ) {
245
278
data [ 'order[' + type + '_address][customer_address_id]' ] =
246
279
$ ( 'order-' + type + '_address_customer_address_id' ) . value ;
247
280
}
248
281
282
+ this . resetPaymentMethod ( ) ;
283
+
249
284
if ( data [ 'reset_shipping' ] ) {
250
- this . resetShippingMethod ( data ) ;
285
+ this . resetShippingMethod ( ) ;
251
286
} else {
252
287
this . saveData ( data ) ;
253
288
@@ -257,7 +292,28 @@ define([
257
292
}
258
293
} ,
259
294
260
- fillAddressFields : function ( container , data ) {
295
+ /**
296
+ * Set address container form field value.
297
+ *
298
+ * @param {String } container - container ID
299
+ * @param {String } fieldName - form field name
300
+ * @param {* } fieldValue - form field value
301
+ */
302
+ syncAddressField : function ( container , fieldName , fieldValue ) {
303
+ var syncName ;
304
+
305
+ if ( this . isBillingField ( fieldName ) ) {
306
+ syncName = fieldName . replace ( 'billing' , 'shipping' ) ;
307
+ }
308
+
309
+ $ ( container ) . select ( '[name="' + syncName + '"]' ) . each ( function ( element ) {
310
+ if ( ~ [ 'input' , 'textarea' , 'select' ] . indexOf ( element . tagName . toLowerCase ( ) ) ) {
311
+ element . value = fieldValue ;
312
+ }
313
+ } ) ;
314
+ } ,
315
+
316
+ fillAddressFields : function ( container , data ) {
261
317
var regionIdElem = false ;
262
318
var regionIdElemValue = false ;
263
319
@@ -298,10 +354,15 @@ define([
298
354
fields [ i ] . setValue ( data [ name ] ? data [ name ] : '' ) ;
299
355
}
300
356
301
- if ( fields [ i ] . changeUpdater ) fields [ i ] . changeUpdater ( ) ;
357
+ if ( fields [ i ] . changeUpdater ) {
358
+ fields [ i ] . changeUpdater ( ) ;
359
+ }
360
+
302
361
if ( name == 'region' && data [ 'region_id' ] && ! data [ 'region' ] ) {
303
362
fields [ i ] . value = data [ 'region_id' ] ;
304
363
}
364
+
365
+ jQuery ( fields [ i ] ) . trigger ( 'change' ) ;
305
366
}
306
367
} ,
307
368
@@ -332,46 +393,83 @@ define([
332
393
}
333
394
} ,
334
395
335
- setShippingAsBilling : function ( flag ) {
336
- var data ;
337
- var areasToLoad = [ 'billing_method' , 'shipping_address' , 'totals' , 'giftmessage' ] ;
396
+ /**
397
+ * Equals shipping and billing addresses.
398
+ *
399
+ * @param {Boolean } flag
400
+ */
401
+ setShippingAsBilling : function ( flag ) {
402
+ var data ,
403
+ areasToLoad = [ 'billing_method' , 'shipping_address' , 'shipping_method' , 'totals' , 'giftmessage' ] ;
404
+
338
405
this . disableShippingAddress ( flag ) ;
339
- if ( flag ) {
340
- data = this . serializeData ( this . billingAddressContainer ) ;
341
- } else {
342
- data = this . serializeData ( this . shippingAddressContainer ) ;
343
- }
344
- areasToLoad . push ( 'shipping_method' ) ;
406
+ data = this . serializeData ( flag ? this . billingAddressContainer : this . shippingAddressContainer ) ;
345
407
data = data . toObject ( ) ;
346
408
data [ 'shipping_as_billing' ] = flag ? 1 : 0 ;
347
409
data [ 'reset_shipping' ] = 1 ;
348
410
this . loadArea ( areasToLoad , true , data ) ;
349
411
} ,
350
412
351
- resetShippingMethod : function ( data ) {
352
- var areasToLoad = [ 'billing_method' , 'shipping_address' , 'totals' , 'giftmessage' , 'items' ] ;
353
- if ( ! this . isOnlyVirtualProduct ) {
354
- areasToLoad . push ( 'shipping_method' ) ;
355
- areasToLoad . push ( 'shipping_address' ) ;
413
+ /**
414
+ * Replace shipping method area.
415
+ */
416
+ resetShippingMethod : function ( ) {
417
+ if ( ! this . isOnlyVirtualProduct ) {
418
+ $ ( this . getAreaId ( 'shipping_method' ) ) . update ( this . shippingTemplate ) ;
356
419
}
420
+ } ,
357
421
358
- data [ 'reset_shipping' ] = 1 ;
359
- this . isShippingMethodReseted = true ;
360
- this . loadArea ( areasToLoad , true , data ) ;
422
+ /**
423
+ * Replace payment method area.
424
+ */
425
+ resetPaymentMethod : function ( ) {
426
+ $ ( this . getAreaId ( 'billing_method' ) ) . update ( this . paymentTemplate ) ;
361
427
} ,
362
428
363
- loadShippingRates : function ( ) {
429
+ /**
430
+ * Loads shipping options according to address data.
431
+ *
432
+ * @return {Boolean }
433
+ */
434
+ loadShippingRates : function ( ) {
435
+ var addressContainer = this . shippingAsBilling ?
436
+ 'billingAddressContainer' :
437
+ 'shippingAddressContainer' ,
438
+ data = this . serializeData ( this [ addressContainer ] ) . toObject ( ) ;
439
+
440
+ data [ 'collect_shipping_rates' ] = 1 ;
364
441
this . isShippingMethodReseted = false ;
365
- this . loadArea ( [ 'shipping_method' , 'totals' ] , true , { collect_shipping_rates : 1 } ) ;
442
+ this . loadArea ( [ 'shipping_method' , 'totals' ] , true , data ) ;
443
+
444
+ return false ;
366
445
} ,
367
446
368
- setShippingMethod : function ( method ) {
447
+ setShippingMethod : function ( method ) {
369
448
var data = { } ;
449
+
370
450
data [ 'order[shipping_method]' ] = method ;
371
- this . loadArea ( [ 'shipping_method' , 'totals' , 'billing_method' ] , true , data ) ;
451
+ this . loadArea ( [
452
+ 'shipping_method' ,
453
+ 'totals' ,
454
+ 'billing_method'
455
+ ] , true , data ) ;
372
456
} ,
373
457
374
- switchPaymentMethod : function ( method ) {
458
+ /**
459
+ * Updates available payment
460
+ * methods list according to order data.
461
+ *
462
+ * @return boolean
463
+ */
464
+ loadPaymentMethods : function ( ) {
465
+ var data = this . serializeData ( this . billingAddressContainer ) . toObject ( ) ;
466
+
467
+ this . loadArea ( [ 'billing_method' , 'totals' ] , true , data ) ;
468
+
469
+ return false ;
470
+ } ,
471
+
472
+ switchPaymentMethod : function ( method ) {
375
473
jQuery ( '#edit_form' )
376
474
. off ( 'submitOrder' )
377
475
. on ( 'submitOrder' , function ( ) {
@@ -1149,9 +1247,15 @@ define([
1149
1247
|| this . excludedPaymentMethods . indexOf ( this . paymentMethod ) == - 1 ) ;
1150
1248
} ,
1151
1249
1152
- serializeData : function ( container ) {
1153
- var fields = $ ( container ) . select ( 'input' , 'select' , 'textarea' ) ;
1154
- var data = Form . serializeElements ( fields , true ) ;
1250
+ /**
1251
+ * Serializes container form elements data.
1252
+ *
1253
+ * @param {String } container
1254
+ * @return {Object }
1255
+ */
1256
+ serializeData : function ( container ) {
1257
+ var fields = $ ( container ) . select ( 'input' , 'select' , 'textarea' ) ,
1258
+ data = Form . serializeElements ( fields , true ) ;
1155
1259
1156
1260
return $H ( data ) ;
1157
1261
} ,
@@ -1442,6 +1546,4 @@ define([
1442
1546
return this . _label ;
1443
1547
}
1444
1548
} ;
1445
-
1446
1549
} ) ;
1447
-
0 commit comments