Browse Source

Shop basket progress

Vova Tkach 5 years ago
parent
commit
2a63dd79e2

+ 1 - 1
assets/template/header_html_file.go

@@ -49,7 +49,7 @@ var VarHeaderHtmlFile = []byte(`<!doctype html>
 								<a class="nav-link{{if eq $.Data.Module "404"}} active{{end}}" href="/not-existent-page/">404</a>
 							</li>
 							<li class="nav-item">
-								<a id="basket-nav-btn" class="nav-link" href="" onclick="window&&window.frontend&&frontend.ShopOpenBasket(this);return false;">Basket <span class="badge badge-pill badge-primary">0</span></a>
+								<a id="basket-nav-btn" class="nav-link" href="" onclick="window&&window.frontend&&frontend.ShopBasketOpen(this);return false;">Basket <span class="badge badge-pill badge-primary">0</span></a>
 							</li>
 						</ul>
 					</div>

+ 29 - 10
assets/template/scripts_js_file.go

@@ -51,11 +51,11 @@ var VarScriptsJsFile = []byte(`(function(window, $) {
 
 		// Public
 		return {
-			ShopOpenBasket: function(object) {
+			ShopBasketOpen: function(object) {
 				if(!$(object).hasClass('click-blocked')) {
 					$(object).addClass('click-blocked');
 
-					ShopSetBasketNavBtnProductsCount(0);
+					// ShopSetBasketNavBtnProductsCount(0);
 					console.log('ShopOpenBasket', object);
 
 					$(object).removeClass('click-blocked');
@@ -63,17 +63,36 @@ var VarScriptsJsFile = []byte(`(function(window, $) {
 				return false;
 			},
 
-			// TODO: add product to basket or count++ if already in basket
-			// Update products counter in header nav bar button
-			// Automatically open basket popup
-			ShopAddProductToBasket: function(object, product_id) {
+			ShopBasketProductPlus: function(object, product_id) {
 				if(!$(object).hasClass('click-blocked')) {
 					$(object).addClass('click-blocked');
+					$.ajax({
+						type: "GET",
+						url: '/shop/basket/plus/' + product_id + '/'
+					}).done(function(data) {
+						console.log('AJAX', data, product_id);
+					}).fail(function(xhr, status, error) {
+						console.log('AJAX', xhr.responseText, product_id);
+					}).always(function() {
+						$(object).removeClass('click-blocked');
+					});
+				}
+				return false;
+			},
 
-					ShopSetBasketNavBtnProductsCount(product_id);
-					console.log('ShopAddProductToBasket', object, product_id);
-
-					$(object).removeClass('click-blocked');
+			ShopBasketProductMinus: function(object, product_id) {
+				if(!$(object).hasClass('click-blocked')) {
+					$(object).addClass('click-blocked');
+					$.ajax({
+						type: "GET",
+						url: '/shop/basket/minus/' + product_id + '/'
+					}).done(function(data) {
+						console.log('AJAX', data, product_id);
+					}).fail(function(xhr, status, error) {
+						console.log('AJAX', xhr.responseText, product_id);
+					}).always(function() {
+						$(object).removeClass('click-blocked');
+					});
 				}
 				return false;
 			},

+ 1 - 1
assets/template/shop_category_html_file.go

@@ -28,7 +28,7 @@ var VarShopCategoryHtmlFile = []byte(`{{template "header.html" .}}
 						<div class="card-text">{{.Briefly}}</div>
 					</div>
 					<div class="card-footer">
-						<span class="price">{{.PriceFormat "%.2f"}} {{.Currency.Code}}</span><a href="{{.Permalink}}" class="btn btn-success" onclick="window&&window.frontend&&frontend.ShopAddProductToBasket(this, {{.Id}});return false;">Buy</a>
+						<span class="price">{{.PriceFormat "%.2f"}} {{.Currency.Code}}</span><a href="{{.Permalink}}" class="btn btn-success" onclick="window&&window.frontend&&frontend.ShopBasketProductPlus(this, {{.Id}});return false;">Buy</a>
 					</div>
 				</div>
 			{{end}}

+ 1 - 1
assets/template/shop_html_file.go

@@ -28,7 +28,7 @@ var VarShopHtmlFile = []byte(`{{template "header.html" .}}
 						<div class="card-text">{{.Briefly}}</div>
 					</div>
 					<div class="card-footer">
-						<span class="price">{{.PriceFormat "%.2f"}} {{.Currency.Code}}</span><a href="{{.Permalink}}" class="btn btn-success" onclick="window&&window.frontend&&frontend.ShopAddProductToBasket(this, {{.Id}});return false;">Buy</a>
+						<span class="price">{{.PriceFormat "%.2f"}} {{.Currency.Code}}</span><a href="{{.Permalink}}" class="btn btn-success" onclick="window&&window.frontend&&frontend.ShopBasketProductPlus(this, {{.Id}});return false;">Buy</a>
 					</div>
 				</div>
 			{{end}}

+ 2 - 2
assets/template/shop_product_html_file.go

@@ -49,7 +49,7 @@ var VarShopProductHtmlFile = []byte(`{{template "header.html" .}}
 						{{end}}
 						<div class="card mt-3{{if not $.Data.Shop.Product.HaveVariations}} mt-sm-3 mt-md-0 mt-lg-0{{end}}">
 							<div class="card-body">
-								<h3 class="price mb-0 mr-4">{{$.Data.Shop.Product.PriceFormat "%.2f"}} {{$.Data.Shop.Product.Currency.Code}}</h3><a href="" class="btn btn-success btn-buy" onclick="window&&window.frontend&&frontend.ShopAddProductToBasket(this, {{$.Data.Shop.Product.Id}});return false;">Buy</a>
+								<h3 class="price mb-0 mr-4">{{$.Data.Shop.Product.PriceFormat "%.2f"}} {{$.Data.Shop.Product.Currency.Code}}</h3><a href="" class="btn btn-success btn-buy" onclick="window&&window.frontend&&frontend.ShopBasketProductPlus(this, {{$.Data.Shop.Product.Id}});return false;">Buy</a>
 							</div>
 						</div>
 						<div class="card mt-3">
@@ -117,7 +117,7 @@ var VarShopProductHtmlFile = []byte(`{{template "header.html" .}}
 							</div>
 							<div class="card mt-3">
 								<div class="card-body">
-									<h3 class="price mb-0 mr-4">{{$.Data.Shop.Product.PriceFormat "%.2f"}} {{$.Data.Shop.Product.Currency.Code}}</h3><a href="" class="btn btn-success btn-buy" onclick="window&&window.frontend&&frontend.ShopAddProductToBasket(this, {{$.Data.Shop.Product.Id}});return false;">Buy</a>
+									<h3 class="price mb-0 mr-4">{{$.Data.Shop.Product.PriceFormat "%.2f"}} {{$.Data.Shop.Product.Currency.Code}}</h3><a href="" class="btn btn-success btn-buy" onclick="window&&window.frontend&&frontend.ShopBasketProductPlus(this, {{$.Data.Shop.Product.Id}});return false;">Buy</a>
 								</div>
 							</div>
 						</div>

+ 49 - 5
engine/basket/session.go

@@ -2,14 +2,17 @@ package basket
 
 import (
 	"encoding/json"
+	"html"
 
 	"golang-fave/engine/sqlw"
+	"golang-fave/utils"
 )
 
 type session struct {
-	Products map[int]*product `json:"products"`
-	Currency *currency        `json:"currency"`
-	Total    float64          `json:"total"`
+	Products   map[int]*product `json:"products"`
+	Currency   *currency        `json:"currency"`
+	TotalSum   float64          `json:"total_sum"`
+	TotalCount int              `json:"total_count"`
 }
 
 func (this *session) String() string {
@@ -28,24 +31,65 @@ func (this *session) Info(db *sqlw.DB, currency_id int) {
 func (this *session) Plus(db *sqlw.DB, product_id int) {
 	if p, ok := this.Products[product_id]; ok == true {
 		p.Quantity++
+		p.Sum = p.Price * float64(p.Quantity)
+		this.updateTotals()
 		return
 	}
-	// Check and insert
-	// Load from DB
+	row := &utils.MySql_shop_product{}
+	if err := db.QueryRow(`
+		SELECT
+			shop_products.id,
+			shop_products.name,
+			shop_products.price
+		FROM
+			shop_products
+		WHERE
+			shop_products.active = 1 AND
+			shop_products.id = ?
+		LIMIT 1;`,
+		product_id,
+	).Scan(
+		&row.A_id,
+		&row.A_name,
+		&row.A_price,
+	); err == nil {
+		// Load product image here
+		this.Products[product_id] = &product{
+			Id:       row.A_id,
+			Name:     html.EscapeString(row.A_name),
+			Image:    "",
+			Price:    row.A_price,
+			Quantity: 1,
+			Sum:      row.A_price,
+		}
+		this.updateTotals()
+	}
 }
 
 func (this *session) Minus(db *sqlw.DB, product_id int) {
 	if p, ok := this.Products[product_id]; ok == true {
 		if p.Quantity > 1 {
 			p.Quantity--
+			p.Sum = p.Price * float64(p.Quantity)
 		} else {
 			delete(this.Products, product_id)
 		}
+		this.updateTotals()
 	}
 }
 
 func (this *session) Remove(db *sqlw.DB, product_id int) {
 	if _, ok := this.Products[product_id]; ok == true {
 		delete(this.Products, product_id)
+		this.updateTotals()
+	}
+}
+
+func (this *session) updateTotals() {
+	this.TotalSum = 0
+	this.TotalCount = 0
+	for _, product := range this.Products {
+		this.TotalSum += product.Price * float64(product.Quantity)
+		this.TotalCount += product.Quantity
 	}
 }

+ 1 - 1
hosts/localhost/template/header.html

@@ -47,7 +47,7 @@
 								<a class="nav-link{{if eq $.Data.Module "404"}} active{{end}}" href="/not-existent-page/">404</a>
 							</li>
 							<li class="nav-item">
-								<a id="basket-nav-btn" class="nav-link" href="" onclick="window&&window.frontend&&frontend.ShopOpenBasket(this);return false;">Basket <span class="badge badge-pill badge-primary">0</span></a>
+								<a id="basket-nav-btn" class="nav-link" href="" onclick="window&&window.frontend&&frontend.ShopBasketOpen(this);return false;">Basket <span class="badge badge-pill badge-primary">0</span></a>
 							</li>
 						</ul>
 					</div>

+ 29 - 10
hosts/localhost/template/scripts.js

@@ -49,11 +49,11 @@
 
 		// Public
 		return {
-			ShopOpenBasket: function(object) {
+			ShopBasketOpen: function(object) {
 				if(!$(object).hasClass('click-blocked')) {
 					$(object).addClass('click-blocked');
 
-					ShopSetBasketNavBtnProductsCount(0);
+					// ShopSetBasketNavBtnProductsCount(0);
 					console.log('ShopOpenBasket', object);
 
 					$(object).removeClass('click-blocked');
@@ -61,17 +61,36 @@
 				return false;
 			},
 
-			// TODO: add product to basket or count++ if already in basket
-			// Update products counter in header nav bar button
-			// Automatically open basket popup
-			ShopAddProductToBasket: function(object, product_id) {
+			ShopBasketProductPlus: function(object, product_id) {
 				if(!$(object).hasClass('click-blocked')) {
 					$(object).addClass('click-blocked');
+					$.ajax({
+						type: "GET",
+						url: '/shop/basket/plus/' + product_id + '/'
+					}).done(function(data) {
+						console.log('AJAX', data, product_id);
+					}).fail(function(xhr, status, error) {
+						console.log('AJAX', xhr.responseText, product_id);
+					}).always(function() {
+						$(object).removeClass('click-blocked');
+					});
+				}
+				return false;
+			},
 
-					ShopSetBasketNavBtnProductsCount(product_id);
-					console.log('ShopAddProductToBasket', object, product_id);
-
-					$(object).removeClass('click-blocked');
+			ShopBasketProductMinus: function(object, product_id) {
+				if(!$(object).hasClass('click-blocked')) {
+					$(object).addClass('click-blocked');
+					$.ajax({
+						type: "GET",
+						url: '/shop/basket/minus/' + product_id + '/'
+					}).done(function(data) {
+						console.log('AJAX', data, product_id);
+					}).fail(function(xhr, status, error) {
+						console.log('AJAX', xhr.responseText, product_id);
+					}).always(function() {
+						$(object).removeClass('click-blocked');
+					});
 				}
 				return false;
 			},

+ 1 - 1
hosts/localhost/template/shop-category.html

@@ -26,7 +26,7 @@
 						<div class="card-text">{{.Briefly}}</div>
 					</div>
 					<div class="card-footer">
-						<span class="price">{{.PriceFormat "%.2f"}} {{.Currency.Code}}</span><a href="{{.Permalink}}" class="btn btn-success" onclick="window&&window.frontend&&frontend.ShopAddProductToBasket(this, {{.Id}});return false;">Buy</a>
+						<span class="price">{{.PriceFormat "%.2f"}} {{.Currency.Code}}</span><a href="{{.Permalink}}" class="btn btn-success" onclick="window&&window.frontend&&frontend.ShopBasketProductPlus(this, {{.Id}});return false;">Buy</a>
 					</div>
 				</div>
 			{{end}}

+ 2 - 2
hosts/localhost/template/shop-product.html

@@ -47,7 +47,7 @@
 						{{end}}
 						<div class="card mt-3{{if not $.Data.Shop.Product.HaveVariations}} mt-sm-3 mt-md-0 mt-lg-0{{end}}">
 							<div class="card-body">
-								<h3 class="price mb-0 mr-4">{{$.Data.Shop.Product.PriceFormat "%.2f"}} {{$.Data.Shop.Product.Currency.Code}}</h3><a href="" class="btn btn-success btn-buy" onclick="window&&window.frontend&&frontend.ShopAddProductToBasket(this, {{$.Data.Shop.Product.Id}});return false;">Buy</a>
+								<h3 class="price mb-0 mr-4">{{$.Data.Shop.Product.PriceFormat "%.2f"}} {{$.Data.Shop.Product.Currency.Code}}</h3><a href="" class="btn btn-success btn-buy" onclick="window&&window.frontend&&frontend.ShopBasketProductPlus(this, {{$.Data.Shop.Product.Id}});return false;">Buy</a>
 							</div>
 						</div>
 						<div class="card mt-3">
@@ -115,7 +115,7 @@
 							</div>
 							<div class="card mt-3">
 								<div class="card-body">
-									<h3 class="price mb-0 mr-4">{{$.Data.Shop.Product.PriceFormat "%.2f"}} {{$.Data.Shop.Product.Currency.Code}}</h3><a href="" class="btn btn-success btn-buy" onclick="window&&window.frontend&&frontend.ShopAddProductToBasket(this, {{$.Data.Shop.Product.Id}});return false;">Buy</a>
+									<h3 class="price mb-0 mr-4">{{$.Data.Shop.Product.PriceFormat "%.2f"}} {{$.Data.Shop.Product.Currency.Code}}</h3><a href="" class="btn btn-success btn-buy" onclick="window&&window.frontend&&frontend.ShopBasketProductPlus(this, {{$.Data.Shop.Product.Id}});return false;">Buy</a>
 								</div>
 							</div>
 						</div>

+ 1 - 1
hosts/localhost/template/shop.html

@@ -26,7 +26,7 @@
 						<div class="card-text">{{.Briefly}}</div>
 					</div>
 					<div class="card-footer">
-						<span class="price">{{.PriceFormat "%.2f"}} {{.Currency.Code}}</span><a href="{{.Permalink}}" class="btn btn-success" onclick="window&&window.frontend&&frontend.ShopAddProductToBasket(this, {{.Id}});return false;">Buy</a>
+						<span class="price">{{.PriceFormat "%.2f"}} {{.Currency.Code}}</span><a href="{{.Permalink}}" class="btn btn-success" onclick="window&&window.frontend&&frontend.ShopBasketProductPlus(this, {{.Id}});return false;">Buy</a>
 					</div>
 				</div>
 			{{end}}

+ 1 - 1
modules/module_shop.go

@@ -444,7 +444,7 @@ func (this *Modules) RegisterModule_Shop() *Module {
 			// Render template
 			wrap.RenderFrontEnd("shop-category", fetdata.New(wrap, false, row, rou), http.StatusOK)
 			return
-		} else if len(wrap.UrlArgs) >= 3 && wrap.UrlArgs[0] == "shop" && wrap.UrlArgs[1] == "basket" && (wrap.UrlArgs[2] == "info" || wrap.UrlArgs[2] == "add" || wrap.UrlArgs[2] == "update" || wrap.UrlArgs[2] == "remove") {
+		} else if len(wrap.UrlArgs) >= 3 && wrap.UrlArgs[0] == "shop" && wrap.UrlArgs[1] == "basket" && (wrap.UrlArgs[2] == "info" || wrap.UrlArgs[2] == "plus" || wrap.UrlArgs[2] == "minus" || wrap.UrlArgs[2] == "remove") {
 			if wrap.UrlArgs[2] == "info" {
 				wrap.W.WriteHeader(http.StatusOK)
 				wrap.W.Header().Set("Cache-Control", "no-cache, no-store, must-revalidate")