Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Migrate product component for Orders page #15982

Merged
merged 27 commits into from
Oct 29, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
13c1b96
Product component handlers and query results
RaimondasSapola Oct 14, 2019
32529a3
Updated handler php doc
RaimondasSapola Oct 14, 2019
d73f89e
order product component assets
RaimondasSapola Oct 14, 2019
49a5c25
Minor CR fixes
RaimondasSapola Oct 15, 2019
195116c
Add product to cart action
RaimondasSapola Oct 16, 2019
4fa9163
Add product to cart submission assets
RaimondasSapola Oct 16, 2019
60df5e3
add product handling
RaimondasSapola Oct 21, 2019
0777615
Add product frontend handling to submit product data
RaimondasSapola Oct 21, 2019
37fec25
rename html IDs to kebab-case. Fix missing argument in getErrorMessag…
zuk3975 Oct 21, 2019
4bc6275
Implements products list rendering after adding to cart
zuk3975 Oct 21, 2019
6aacb5d
Rename product searcher and move to product controller. WIP refactori…
zuk3975 Oct 21, 2019
f2a4796
Refactoring products block js
zuk3975 Oct 22, 2019
037d368
Switch js products and combination to object with id instead of array
zuk3975 Oct 23, 2019
132806b
refactoring customization fields. Added todo
zuk3975 Oct 23, 2019
241ab2d
mvp of customization fields adding
zuk3975 Oct 23, 2019
9e16f48
Moves cartrules rendering parts to renderer
zuk3975 Oct 24, 2019
f9f6144
Remove unused methods
zuk3975 Oct 24, 2019
451ba7e
implement events on addProduct action
zuk3975 Oct 24, 2019
9c8323a
Adds customer renderer.
zuk3975 Oct 24, 2019
2e24c95
Trigger cart info update after product is added to cart.
zuk3975 Oct 24, 2019
f4aebb3
Fix private method
zuk3975 Oct 24, 2019
8708d9b
Modifies api route names
zuk3975 Oct 24, 2019
e5411fa
Adds remove product from cart action
zuk3975 Oct 24, 2019
8c29ecb
Initialize event listeners instead of calling them multiple times
zuk3975 Oct 25, 2019
6302ca5
refactoring
zuk3975 Oct 25, 2019
ed1948d
Implement delay on search and request abort. Implement addCustomizati…
zuk3975 Oct 29, 2019
15358be
add const for customization field types
zuk3975 Oct 29, 2019
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion admin-dev/themes/new-theme/js/fos_js_routes.json
Original file line number Diff line number Diff line change
@@ -1 +1 @@
{"base_url":"","routes":{"admin_cart_rules_search":{"tokens":[["text","\/sell\/catalog\/cart-rules\/search"]],"defaults":[],"requirements":[],"hosttokens":[],"methods":["GET"],"schemes":[]},"admin_customers_search":{"tokens":[["text","\/sell\/customers\/search"]],"defaults":[],"requirements":[],"hosttokens":[],"methods":["GET"],"schemes":[]},"admin_customers_carts":{"tokens":[["text","\/carts"],["variable","\/","\\d+","customerId"],["text","\/sell\/customers"]],"defaults":[],"requirements":{"customerId":"\\d+"},"hosttokens":[],"methods":["GET"],"schemes":[]},"admin_customers_orders":{"tokens":[["text","\/orders"],["variable","\/","\\d+","customerId"],["text","\/sell\/customers"]],"defaults":[],"requirements":{"customerId":"\\d+"},"hosttokens":[],"methods":["GET"],"schemes":[]},"admin_carts_info":{"tokens":[["text","\/info"],["variable","\/","\\d+","cartId"],["text","\/sell\/orders\/carts"]],"defaults":[],"requirements":{"cartId":"\\d+"},"hosttokens":[],"methods":["GET"],"schemes":[]},"admin_carts_create":{"tokens":[["text","\/sell\/orders\/carts\/new"]],"defaults":[],"requirements":[],"hosttokens":[],"methods":["POST"],"schemes":[]},"admin_carts_edit_addresses":{"tokens":[["text","\/addresses"],["variable","\/","\\d+","cartId"],["text","\/sell\/orders\/carts"]],"defaults":[],"requirements":{"cartId":"\\d+"},"hosttokens":[],"methods":["POST"],"schemes":[]},"admin_carts_edit_carrier":{"tokens":[["text","\/carrier"],["variable","\/","\\d+","cartId"],["text","\/sell\/orders\/carts"]],"defaults":[],"requirements":{"cartId":"\\d+"},"hosttokens":[],"methods":["POST"],"schemes":[]},"admin_carts_set_free_shipping":{"tokens":[["text","\/rules\/free-shipping"],["variable","\/","\\d+","cartId"],["text","\/sell\/orders\/carts"]],"defaults":[],"requirements":{"cartId":"\\d+"},"hosttokens":[],"methods":["POST"],"schemes":[]},"admin_carts_add_rule":{"tokens":[["text","\/rules\/add"],["variable","\/","[^\/]++","cartId"],["text","\/sell\/orders\/carts"]],"defaults":[],"requirements":[],"hosttokens":[],"methods":["POST"],"schemes":[]},"admin_carts_delete_rule":{"tokens":[["text","\/delete"],["variable","\/","[^\/]++","cartRuleId"],["text","\/rules"],["variable","\/","[^\/]++","cartId"],["text","\/sell\/orders\/carts"]],"defaults":[],"requirements":[],"hosttokens":[],"methods":["POST"],"schemes":[]},"admin_orders_duplicate_cart":{"tokens":[["text","\/duplicate-cart"],["variable","\/","\\d+","orderId"],["text","\/sell\/orders\/orders"]],"defaults":[],"requirements":{"orderId":"\\d+"},"hosttokens":[],"methods":["POST"],"schemes":[]}},"prefix":"","host":"localhost","port":"","scheme":"http","locale":[]}
{"base_url":"","routes":{"admin_products_search":{"tokens":[["text","\/sell\/catalog\/products\/search"]],"defaults":[],"requirements":[],"hosttokens":[],"methods":["GET"],"schemes":[]},"admin_cart_rules_search":{"tokens":[["text","\/sell\/catalog\/cart-rules\/search"]],"defaults":[],"requirements":[],"hosttokens":[],"methods":["GET"],"schemes":[]},"admin_customers_view":{"tokens":[["text","\/view"],["variable","\/","\\d+","customerId"],["text","\/sell\/customers"]],"defaults":[],"requirements":{"customerId":"\\d+"},"hosttokens":[],"methods":["GET","POST"],"schemes":[]},"admin_customers_search":{"tokens":[["text","\/sell\/customers\/search"]],"defaults":[],"requirements":[],"hosttokens":[],"methods":["GET"],"schemes":[]},"admin_customers_carts":{"tokens":[["text","\/carts"],["variable","\/","\\d+","customerId"],["text","\/sell\/customers"]],"defaults":[],"requirements":{"customerId":"\\d+"},"hosttokens":[],"methods":["GET"],"schemes":[]},"admin_customers_orders":{"tokens":[["text","\/orders"],["variable","\/","\\d+","customerId"],["text","\/sell\/customers"]],"defaults":[],"requirements":{"customerId":"\\d+"},"hosttokens":[],"methods":["GET"],"schemes":[]},"admin_carts_view":{"tokens":[["text","\/view"],["variable","\/","\\d+","cartId"],["text","\/sell\/orders\/carts"]],"defaults":[],"requirements":{"cartId":"\\d+"},"hosttokens":[],"methods":["GET"],"schemes":[]},"admin_carts_info":{"tokens":[["text","\/info"],["variable","\/","\\d+","cartId"],["text","\/sell\/orders\/carts"]],"defaults":[],"requirements":{"cartId":"\\d+"},"hosttokens":[],"methods":["GET"],"schemes":[]},"admin_carts_create":{"tokens":[["text","\/sell\/orders\/carts\/new"]],"defaults":[],"requirements":[],"hosttokens":[],"methods":["POST"],"schemes":[]},"admin_carts_edit_addresses":{"tokens":[["text","\/addresses"],["variable","\/","\\d+","cartId"],["text","\/sell\/orders\/carts"]],"defaults":[],"requirements":{"cartId":"\\d+"},"hosttokens":[],"methods":["POST"],"schemes":[]},"admin_carts_edit_carrier":{"tokens":[["text","\/carrier"],["variable","\/","\\d+","cartId"],["text","\/sell\/orders\/carts"]],"defaults":[],"requirements":{"cartId":"\\d+"},"hosttokens":[],"methods":["POST"],"schemes":[]},"admin_carts_set_free_shipping":{"tokens":[["text","\/rules\/free-shipping"],["variable","\/","\\d+","cartId"],["text","\/sell\/orders\/carts"]],"defaults":[],"requirements":{"cartId":"\\d+"},"hosttokens":[],"methods":["POST"],"schemes":[]},"admin_carts_add_cart_rule":{"tokens":[["text","\/cart-rules"],["variable","\/","[^\/]++","cartId"],["text","\/sell\/orders\/carts"]],"defaults":[],"requirements":[],"hosttokens":[],"methods":["POST"],"schemes":[]},"admin_carts_delete_cart_rule":{"tokens":[["text","\/delete"],["variable","\/","[^\/]++","cartRuleId"],["text","\/cart-rules"],["variable","\/","[^\/]++","cartId"],["text","\/sell\/orders\/carts"]],"defaults":[],"requirements":[],"hosttokens":[],"methods":["POST"],"schemes":[]},"admin_carts_add_product":{"tokens":[["text","\/products"],["variable","\/","\\d+","cartId"],["text","\/sell\/orders\/carts"]],"defaults":[],"requirements":{"cartId":"\\d+","productId":"\\d+"},"hosttokens":[],"methods":["POST"],"schemes":[]},"admin_carts_delete_product":{"tokens":[["text","\/delete-product"],["variable","\/","\\d+","cartId"],["text","\/sell\/orders\/carts"]],"defaults":[],"requirements":{"cartId":"\\d+"},"hosttokens":[],"methods":["POST"],"schemes":[]},"admin_orders_view":{"tokens":[["text","\/view"],["variable","\/","[^\/]++","orderId"],["text","\/sell\/orders\/orders"]],"defaults":[],"requirements":[],"hosttokens":[],"methods":[],"schemes":[]},"admin_orders_duplicate_cart":{"tokens":[["text","\/duplicate-cart"],["variable","\/","\\d+","orderId"],["text","\/sell\/orders\/orders"]],"defaults":[],"requirements":{"orderId":"\\d+"},"hosttokens":[],"methods":["POST"],"schemes":[]}},"prefix":"","host":"localhost","port":"","scheme":"http","locale":[]}
12 changes: 1 addition & 11 deletions admin-dev/themes/new-theme/js/pages/order/create.js
Original file line number Diff line number Diff line change
Expand Up @@ -27,15 +27,5 @@ import CreateOrderPage from './create/create-order-page';
const $ = window.$;

$(document).ready(() => {
const createOrderPage = new CreateOrderPage();

createOrderPage.listenForCustomerSearch();
createOrderPage.listenForCustomerSelect();
createOrderPage.listenForCartSelect();
createOrderPage.listenForOrderSelect();
createOrderPage.listenForCartEdit();
createOrderPage.listenForCartLoading();
createOrderPage.listenForCartRuleSearch();
createOrderPage.listenForCartRuleSelect();
createOrderPage.listenForCartRuleRemove();
new CreateOrderPage();
});
83 changes: 77 additions & 6 deletions admin-dev/themes/new-theme/js/pages/order/create/cart-editor.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
import createOrderPageMap from "./create-order-map";

/**
* 2007-2019 PrestaShop SA and Contributors
*
Expand Down Expand Up @@ -42,6 +40,9 @@ export default class CartEditor {

/**
* Changes cart addresses
*
* @param {Number} cartId
* @param {Object} addresses
*/
changeCartAddresses(cartId, addresses) {
$.post(this.router.generate('admin_carts_edit_addresses', {cartId}), addresses).then((cartInfo) => {
Expand All @@ -52,12 +53,12 @@ export default class CartEditor {
/**
* Modifies cart delivery option
*
* @param cartId
* @param value
* @param {Number} cartId
* @param {Number} value
*/
changeDeliveryOption(cartId, value) {
$.post(this.router.generate('admin_carts_edit_carrier', {cartId}), {
carrier_id: value,
carrierId: value,
}).then((cartInfo) => {
EventEmitter.emit(eventMap.cartDeliveryOptionChanged, cartInfo);
});
Expand All @@ -71,9 +72,79 @@ export default class CartEditor {
*/
setFreeShipping(cartId, value) {
$.post(this.router.generate('admin_carts_set_free_shipping', {cartId}), {
free_shipping: value,
freeShipping: value,
}).then((cartInfo) => {
EventEmitter.emit(eventMap.cartFreeShippingSet, cartInfo);
});
}

/**
* Adds cart rule to cart
*
* @param {Number} cartRuleId
* @param {Number} cartId
*/
addCartRuleToCart(cartRuleId, cartId) {
$.post(this.router.generate('admin_carts_add_cart_rule', {cartId}), {
cartRuleId,
}).then((cartInfo) => {
EventEmitter.emit(eventMap.cartRuleAdded, cartInfo);
}).catch((response) => {
EventEmitter.emit(eventMap.cartRuleFailedToAdd, response.responseJSON.message);
});
}

/**
* Removes cart rule from cart
*
* @param {Number} cartRuleId
* @param {Number} cartId
*/
removeCartRuleFromCart(cartRuleId, cartId) {
$.post(this.router.generate('admin_carts_delete_cart_rule', {
cartId,
cartRuleId,
})).then((cartInfo) => {
EventEmitter.emit(eventMap.cartRuleRemoved, cartInfo);
}).catch((response) => {
showErrorMessage(response.responseJSON.message);
});
}

/**
* Adds product to cart
*
* @param {Number} cartId
* @param {FormData} product
*/
addProduct(cartId, product) {
$.ajax(this.router.generate('admin_carts_add_product', {cartId}), {
method: 'POST',
data: product,
processData: false,
contentType: false,
}).then((cartInfo) => {
EventEmitter.emit(eventMap.productAddedToCart, cartInfo);
}).catch((response) => {
showErrorMessage(response.responseJSON.message);
});
}

/**
* Removes product from cart
*
* @param {Number} cartId
* @param {Object} product
*/
removeProductFromCart(cartId, product) {
$.post(this.router.generate('admin_carts_delete_product', {cartId}), {
productId: product.productId,
attributeId: product.attributeId,
customizationId: product.customizationId,
}).then((cartInfo) => {
EventEmitter.emit(eventMap.productRemovedFromCart, cartInfo);
}).catch((response) => {
showErrorMessage(response.responseJSON.message);
});
}
}
178 changes: 44 additions & 134 deletions admin-dev/themes/new-theme/js/pages/order/create/cart-rule-manager.js
Original file line number Diff line number Diff line change
Expand Up @@ -23,11 +23,12 @@
* International Registered Trademark & Property of PrestaShop SA
*/

import Router from '../../../components/router';
import createOrderMap from './create-order-map';
import CartEditor from './cart-editor';
import CartRulesRenderer from './cart-rules-renderer';
import createOrderMap from './create-order-map';
import {EventEmitter} from '../../../components/event-emitter';
import eventMap from './event-map';
import Router from '../../../components/router';

const $ = window.$;

Expand All @@ -38,182 +39,91 @@ export default class CartRuleManager {
constructor() {
this.router = new Router();
this.$searchInput = $(createOrderMap.cartRuleSearchInput);
this.$searchResultBox = $(createOrderMap.cartRulesSearchResultBox);
this.cartRulesRenderer = new CartRulesRenderer();
this.cartEditor = new CartEditor();

this._initListeners();

return {
onCartRuleSearch: () => {
this._search();
},
onCartRuleSelect: (cartRuleId, cartId) => {
this._addCartRuleToCart(cartRuleId, cartId);
},
onDoneSearchingCartRule: () => {
this._hideResultsDropdown();
},
onCartRuleRemove: (cartRuleId, cartId) => {
this._removeCartRuleFromCart(cartRuleId, cartId);
},
search: () => this._search(),
stopSearching: () => this.cartRulesRenderer.hideResultsDropdown(),
addCartRuleToCart: (cartRuleId, cartId) => this.cartEditor.addCartRuleToCart(cartRuleId, cartId),
removeCartRuleFromCart: (cartRuleId, cartId) => this.cartEditor.removeCartRuleFromCart(cartRuleId, cartId),
};
}

/**
* Searches for cart rules by search phrase
* Initiates event listeners for cart rule actions
*
* @private
*/
_search() {
const searchPhrase = this.$searchInput.val();
if (searchPhrase.length < 3) {
return;
}

$.get(this.router.generate('admin_cart_rules_search'), {
search_phrase: searchPhrase,
}).then((cartRules) => {
this._renderSearchResults(cartRules);
}).catch((e) => {
showErrorMessage(e.responseJSON.message);
});
_initListeners() {
this._onCartRuleSearch();
this._onAddCartRuleToCart();
this._onAddCartRuleToCartFailure();
this._onRemoveCartRuleFromCart();
}

/**
* Adds cart rule to cart
*
* @param cartRuleId
* @param cartId
* Listens for cart rule search action
*
* @private
*/
_addCartRuleToCart(cartRuleId, cartId) {
$.post(this.router.generate('admin_carts_add_rule', {cartId}), {
cart_rule_id: cartRuleId,
}).then((cartInfo) => {
this.cartRulesRenderer.render(cartInfo.cartRules, cartInfo.products.length === 0);
}).catch((e) => {
this._displayErrorMessage(e.responseJSON.message);
_onCartRuleSearch() {
EventEmitter.on(eventMap.cartRuleSearched, (cartRules) => {
this.cartRulesRenderer.renderSearchResults(cartRules);
});
}

/**
* Removes cart rule from cart
*
* @param cartRuleId
* @param cartId
* Listens event of add cart rule to cart action
*
* @private
*/
_removeCartRuleFromCart(cartRuleId, cartId) {
$.post(this.router.generate('admin_carts_delete_rule', {
cartId,
cartRuleId,
})).then((cartInfo) => {
EventEmitter.emit(eventMap.cartRuleRemoved, cartInfo);
}).catch((e) => {
showErrorMessage(e.responseJSON.message);
_onAddCartRuleToCart() {
EventEmitter.on(eventMap.cartRuleAdded, (cartInfo) => {
matks marked this conversation as resolved.
Show resolved Hide resolved
matks marked this conversation as resolved.
Show resolved Hide resolved
this.cartRulesRenderer.renderCartRulesBlock(cartInfo.cartRules, cartInfo.products.length === 0);
});
}

/**
* Displays error message
*
* @param message
* Listens event when add cart rule to cart fails
*
* @private
*/
_displayErrorMessage(message) {
$(createOrderMap.cartRuleErrorText).text(message);
this._showErrorBlock();
_onAddCartRuleToCartFailure() {
EventEmitter.on(eventMap.cartRuleFailedToAdd, (message) => {
matks marked this conversation as resolved.
Show resolved Hide resolved
this.cartRulesRenderer.displayErrorMessage(message);
});
}

/**
* Shows error block
* Listens event for remove cart rule from cart action
*
* @private
*/
_showErrorBlock() {
$(createOrderMap.cartRuleErrorBlock).removeClass('d-none');
_onRemoveCartRuleFromCart() {
EventEmitter.on(eventMap.cartRuleRemoved, (cartInfo) => {
this.cartRulesRenderer.renderCartRulesBlock(cartInfo.cartRules, cartInfo.products.length === 0);
});
}

/**
* Responsible for rendering search results dropdown
*
* @param searchResults
* Searches for cart rules by search phrase
*
* @private
*/
_renderSearchResults(searchResults) {
this._clearSearchResults();
if (searchResults.cart_rules.length === 0) {
this._renderNotFound();

_search(searchPhrase) {
if (searchPhrase.length < 3) {
return;
}
this._renderFoundCartRules(searchResults.cart_rules);
}

/**
* Renders found cart rules after search
*
* @param cartRules
*
* @private
*/
_renderFoundCartRules(cartRules) {
const $cartRuleTemplate = $($(createOrderMap.foundCartRuleTemplate).html());
for (const key in cartRules) {
const $template = $cartRuleTemplate.clone();
const cartRule = cartRules[key];

let cartRuleName = cartRule.name;
if (cartRule.code !== '') {
cartRuleName = `${cartRule.name} - ${cartRule.code}`;
}

$template.text(cartRuleName);
$template.data('cart-rule-id', cartRule.cartRuleId);
this.$searchResultBox.append($template);
}

this._showResultsDropdown();
}

/**
* Renders warning that no cart rule was found
*
* @private
*/
_renderNotFound() {
const $template = $($(createOrderMap.cartRulesNotFoundTemplate).html()).clone();
this.$searchResultBox.html($template);

this._showResultsDropdown();
}

/**
* Empties cart rule search results block
*
* @private
*/
_clearSearchResults() {
this.$searchResultBox.empty();
}

/**
* Displays cart rules search result dropdown
*
* @private
*/
_showResultsDropdown() {
this.$searchResultBox.removeClass('d-none');
}

/**
* Hides cart rules search result dropdown
*
* @private
*/
_hideResultsDropdown() {
this.$searchResultBox.addClass('d-none');
$.get(this.router.generate('admin_cart_rules_search'), {
search_phrase: searchPhrase,
}).then((cartRules) => {
EventEmitter.emit(eventMap.cartRuleSearched, cartRules);
}).catch((e) => {
showErrorMessage(e.responseJSON.message);
});
}
}
Loading