@@ -46,20 +46,35 @@ <h2>Giỏ hàng</h2>
4646 < tbody th:each ="cart : ${carts} ">
4747 < form id ="removeFromCart " th:action ="@{/cart/{id}/delete(id=${cart.productId})} "
4848 th:method ="POST ">
49- < tr >
49+ < tr th:id =" ${cart.productId} " >
5050 < td >
5151 < a th:href ="@{/san-pham/{slug}(slug=${cart.slug})} ">
52- < img alt =""
53- th:src ="@{/{url}(url=${cart.image})} "/>
52+ < img alt =""
53+ th:src ="@{/{url}(url=${cart.image})} "/>
5454 </ a >
5555 </ td >
5656 < td > < a th:href ="@{/san-pham/{slug}(slug=${cart.slug})} " th:text ="${cart.name} "> </ a >
5757 < div class ="mobile-cart-content row ">
5858 < div class ="col ">
5959 < div class ="qty-box ">
6060 < div class ="input-group ">
61- < input type ="text " name ="quantity " class ="form-control input-number "
61+ < span class ="input-group-prepend ">
62+ < button type ="button " class ="btn quantity-left-minus minus1 "
63+ data-type ="minus "
64+ data-field ="">
65+ < i class ="ti-angle-left "> </ i >
66+ </ button >
67+ </ span >
68+
69+ < input type ="text " name ="quantity " class ="form-control input-number qty1 "
6270 value ="1 " th:value ="${cart.quantity} ">
71+
72+ < span class ="input-group-prepend ">
73+ < button type ="button " class ="btn quantity-right-plus plus1 "
74+ data-type ="plus " data-field ="">
75+ < i class ="ti-angle-right "> </ i >
76+ </ button >
77+ </ span >
6378 </ div >
6479 </ div >
6580 </ div >
@@ -81,8 +96,24 @@ <h2 th:text="${#numbers.formatDecimal(cart.price, 0, 'COMMA', 0, 'POINT') + '
8196 < td >
8297 < div class ="qty-box ">
8398 < div class ="input-group ">
84- < input type ="number " name ="quantity " class ="form-control input-number "
99+ < span class ="input-group-prepend ">
100+ < button type ="button " class ="btn quantity-left-minus minus "
101+ data-type ="minus "
102+ data-field ="">
103+ < i class ="ti-angle-left "> </ i >
104+ </ button >
105+ </ span >
106+
107+ < input type ="text " name ="quantity " class ="form-control input-number qty "
85108 value ="1 " th:value ="${cart.quantity} ">
109+ < input type ="hidden " class ="product_amount " th:value ="${cart.amount} ">
110+
111+ < span class ="input-group-prepend ">
112+ < button type ="button " class ="btn quantity-right-plus plus "
113+ data-type ="plus " data-field ="">
114+ < i class ="ti-angle-right "> </ i >
115+ </ button >
116+ </ span >
86117 </ div >
87118 </ div >
88119 </ td >
@@ -91,7 +122,7 @@ <h2 th:text="${#numbers.formatDecimal(cart.price, 0, 'COMMA', 0, 'POINT') + '
91122 class ="ti-close "> </ i > </ a >
92123 </ td >
93124 < td >
94- < h2 class ="td-color "
125+ < h2 class ="itemTotal td-color "
95126 th:text ="${#numbers.formatDecimal(cart.price * cart.quantity, 0, 'COMMA', 0, 'POINT') + ' ₫'} "> </ h2 >
96127 </ td >
97128 </ tr >
@@ -104,7 +135,7 @@ <h2 th:text="${#numbers.formatDecimal(cart.price, 0, 'COMMA', 0, 'POINT') + '
104135 < tr >
105136 < td > Thành tiền :</ td >
106137 < td >
107- < h2 th:text ="${#numbers.formatDecimal(total, 0, 'COMMA', 0, 'POINT') + ' ₫'} "> </ h2 >
138+ < h2 id =" cartTotal " th:text ="${#numbers.formatDecimal(total, 0, 'COMMA', 0, 'POINT') + ' ₫'} "> </ h2 >
108139 </ td >
109140 </ tr >
110141 </ tfoot >
@@ -129,5 +160,118 @@ <h2 th:text="${#numbers.formatDecimal(total, 0, 'COMMA', 0, 'POINT') + ' ₫'}">
129160 < div th:replace ="layouts/frontend/nosidebar-footer :: footer "> </ div >
130161</ div >
131162
163+
164+ < div layout:fragment ="customScript ">
165+ < script th:inline ="javascript ">
166+ /*<![CDATA[*/
167+
168+ function separateComma ( val ) {
169+ return new Intl . NumberFormat ( 'vi-VN' , { maximumFractionDigits : 0 } ) . format ( val ) ;
170+ }
171+
172+ function debounce ( func , wait ) {
173+ var timeout ;
174+
175+ return function ( ) {
176+ var context = this ,
177+ args = arguments ;
178+
179+ var executeFunction = function ( ) {
180+ func . apply ( context , args ) ;
181+ } ;
182+
183+ clearTimeout ( timeout ) ;
184+ timeout = setTimeout ( executeFunction , wait ) ;
185+ } ;
186+ }
187+
188+ $ ( function ( ) {
189+
190+ $ ( ".plus" ) . on ( "click" , function ( ) {
191+ var self = this ;
192+ var qty = $ ( self ) . closest ( "tr" ) . find ( ".qty" ) ;
193+ var maxQty = $ ( self ) . closest ( "tr" ) . find ( ".product_amount" ) . val ( ) ;
194+
195+ if ( parseInt ( qty . val ( ) ) <= parseInt ( maxQty ) ) {
196+ qty . val ( + parseInt ( qty . val ( ) ) + 1 ) ;
197+ $ ( self ) . closest ( "tr" ) . find ( ".minus" ) . attr ( "disabled" , false ) ;
198+ //Trigger change event
199+ qty . trigger ( "change" ) ;
200+ } else {
201+ $ ( self ) . attr ( "disabled" , true ) ;
202+ }
203+ } ) ;
204+
205+ $ ( ".minus" ) . on ( "click" , function ( ) {
206+ var self = this ;
207+ var qty = $ ( self ) . closest ( "tr" ) . find ( ".qty" ) ;
208+
209+ if ( parseInt ( qty . val ( ) ) < 2 ) {
210+ $ ( self ) . attr ( "disabled" , true ) ;
211+ } else {
212+ qty . val ( + parseInt ( qty . val ( ) ) - 1 ) ;
213+ $ ( self ) . closest ( "tr" ) . find ( ".plus" ) . attr ( "disabled" , false ) ;
214+ //Trigger change event
215+ qty . trigger ( "change" ) ;
216+ }
217+ } ) ;
218+
219+ $ ( ".qty" ) . on ( "change" , debounce ( function ( e ) {
220+ console . log ( "qty change" ) ;
221+
222+ var self = this ;
223+ var oldQty = $ ( self ) . val ( ) ;
224+ var maxQty = $ ( self ) . closest ( "tr" ) . find ( ".product_amount" ) . val ( ) ;
225+
226+ if ( parseInt ( $ ( self ) . val ( ) ) <= 0 || isNaN ( $ ( self ) . val ( ) ) ) {
227+ $ ( self ) . val ( 1 ) ;
228+ }
229+
230+ if ( parseInt ( $ ( self ) . val ( ) ) >= maxQty ) {
231+ $ ( self ) . val ( maxQty ) ;
232+ }
233+
234+ $ ( self ) . closest ( "tr" ) . find ( ".plus" ) . attr ( "disabled" , false ) ;
235+ $ ( self ) . closest ( "tr" ) . find ( ".minus" ) . attr ( "disabled" , false ) ;
236+
237+ var id = $ ( self ) . closest ( "tr" ) . attr ( 'id' ) ;
238+ var qty = $ ( self ) . val ( ) ;
239+
240+ $ . ajax ( {
241+ "url" : "/cart/update" ,
242+ "method" : "POST" ,
243+ "data" : {
244+ "productId" : id ,
245+ "quantity" : qty ,
246+ }
247+ } ) . done ( function ( json ) {
248+ // console.log(json);
249+
250+ if ( json . status === true ) {
251+ // $('#itemTotal').html(json.itemTotal);
252+ $ ( '#cartTotal' ) . html ( separateComma ( json . cartTotal ) + ' ₫' ) ;
253+ $ ( '.cart_qty_cls' ) . html ( json . cartCount ) ;
254+ $ ( self ) . closest ( "tr" ) . find ( ".itemTotal" ) . html ( separateComma ( json . itemTotal ) + ' ₫' ) ;
255+ } else {
256+ $ ( self ) . val ( oldQty ) ;
257+ Swal . fire ( {
258+ toast : true ,
259+ position : "top-end" ,
260+ showConfirmButton : false ,
261+ timer : 3000 ,
262+ icon : "error" ,
263+ title : json . message ,
264+ } ) ;
265+ }
266+ } ) . error ( function ( ) {
267+ $ ( self ) . val ( oldQty ) ;
268+ } ) ;
269+ } , 300 ) ) ;
270+ } ) ;
271+
272+ /*]]>*/
273+ </ script >
274+ </ div >
275+
132276</ body >
133277</ html >
0 commit comments