woocommerce/plugins/woocommerce-blocks/assets/js/products-block.js

1524 lines
44 KiB
JavaScript
Raw Normal View History

/******/ (function(modules) { // webpackBootstrap
/******/ // The module cache
/******/ var installedModules = {};
/******/
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/
/******/ // Check if module is in cache
/******/ if(installedModules[moduleId]) {
/******/ return installedModules[moduleId].exports;
/******/ }
/******/ // Create a new module (and put it into the cache)
/******/ var module = installedModules[moduleId] = {
/******/ i: moduleId,
/******/ l: false,
/******/ exports: {}
/******/ };
/******/
/******/ // Execute the module function
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/
/******/ // Flag the module as loaded
/******/ module.l = true;
/******/
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/
/******/
/******/ // expose the modules object (__webpack_modules__)
/******/ __webpack_require__.m = modules;
/******/
/******/ // expose the module cache
/******/ __webpack_require__.c = installedModules;
/******/
/******/ // define getter function for harmony exports
/******/ __webpack_require__.d = function(exports, name, getter) {
/******/ if(!__webpack_require__.o(exports, name)) {
/******/ Object.defineProperty(exports, name, {
/******/ configurable: false,
/******/ enumerable: true,
/******/ get: getter
/******/ });
/******/ }
/******/ };
/******/
/******/ // getDefaultExport function for compatibility with non-harmony modules
/******/ __webpack_require__.n = function(module) {
/******/ var getter = module && module.__esModule ?
/******/ function getDefault() { return module['default']; } :
/******/ function getModuleExports() { return module; };
/******/ __webpack_require__.d(getter, 'a', getter);
/******/ return getter;
/******/ };
/******/
/******/ // Object.prototype.hasOwnProperty.call
/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
/******/
/******/ // __webpack_public_path__
/******/ __webpack_require__.p = "";
/******/
/******/ // Load entry module and return exports
/******/ return __webpack_require__(__webpack_require__.s = 0);
/******/ })
/************************************************************************/
/******/ ([
/* 0 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }();
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
2018-02-15 18:16:14 +00:00
var _specificSelect = __webpack_require__(1);
var _categorySelect = __webpack_require__(2);
var _attributeSelect = __webpack_require__(3);
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var __ = wp.i18n.__;
var _wp$blocks = wp.blocks,
registerBlockType = _wp$blocks.registerBlockType,
InspectorControls = _wp$blocks.InspectorControls,
BlockControls = _wp$blocks.BlockControls;
var _wp$components = wp.components,
Toolbar = _wp$components.Toolbar,
withAPIData = _wp$components.withAPIData,
Dropdown = _wp$components.Dropdown;
var RangeControl = InspectorControls.RangeControl,
ToggleControl = InspectorControls.ToggleControl,
SelectControl = InspectorControls.SelectControl;
2018-02-15 18:16:14 +00:00
/**
* A setting has the following properties:
* title - Display title of the setting.
* description - Display description of the setting.
* value - Display setting slug to set when selected.
* group_container - (optional) If set the setting is a parent container.
*/
var PRODUCTS_BLOCK_DISPLAY_SETTINGS = {
'specific': {
title: __('Individual products'),
description: __('Hand-pick which products to display'),
value: 'specific'
},
'category': {
title: __('Product category'),
description: __('Display products from a specific category or multiple categories'),
value: 'category'
},
'filter': {
title: __('Filter products'),
description: __('E.g. featured products, or products with a specific attribute like size or color'),
value: 'filter',
group_container: 'filter'
},
'featured': {
title: __('Featured products'),
description: '',
value: 'featured'
},
'best_sellers': {
title: __('Best sellers'),
description: '',
value: 'best_sellers'
},
'best_rated': {
title: __('Best rated'),
description: '',
value: 'best_rated'
},
'on_sale': {
title: __('On sale'),
description: '',
value: 'on_sale'
},
'attribute': {
title: __('Attribute'),
description: '',
value: 'attribute'
},
'all': {
title: __('All products'),
description: __('Display all products ordered chronologically'),
value: 'all'
}
};
/**
2018-02-15 18:16:14 +00:00
* One option from the list of all available ways to display products.
*/
2018-02-15 18:16:14 +00:00
var ProductsBlockSettingsEditorDisplayOption = function (_React$Component) {
_inherits(ProductsBlockSettingsEditorDisplayOption, _React$Component);
2018-02-15 18:16:14 +00:00
function ProductsBlockSettingsEditorDisplayOption() {
_classCallCheck(this, ProductsBlockSettingsEditorDisplayOption);
2018-02-15 18:16:14 +00:00
return _possibleConstructorReturn(this, (ProductsBlockSettingsEditorDisplayOption.__proto__ || Object.getPrototypeOf(ProductsBlockSettingsEditorDisplayOption)).apply(this, arguments));
}
2018-02-15 18:16:14 +00:00
_createClass(ProductsBlockSettingsEditorDisplayOption, [{
key: 'render',
value: function render() {
2018-02-15 18:16:14 +00:00
var _this2 = this;
return wp.element.createElement(
'div',
2018-02-15 18:16:14 +00:00
{ className: 'wc-products-display-option value-' + this.props.value, onClick: function onClick() {
_this2.props.update_display_callback(_this2.props.value);
} },
wp.element.createElement(
2018-02-15 18:16:14 +00:00
'h4',
null,
this.props.title
),
2018-02-15 18:16:14 +00:00
wp.element.createElement(
'p',
null,
this.props.description
)
);
}
}]);
2018-02-15 18:16:14 +00:00
return ProductsBlockSettingsEditorDisplayOption;
}(React.Component);
2018-02-15 18:16:14 +00:00
/**
* A list of all available ways to display products.
*/
2018-02-15 18:16:14 +00:00
var ProductsBlockSettingsEditorDisplayOptions = function (_React$Component2) {
_inherits(ProductsBlockSettingsEditorDisplayOptions, _React$Component2);
2018-02-15 18:16:14 +00:00
function ProductsBlockSettingsEditorDisplayOptions() {
_classCallCheck(this, ProductsBlockSettingsEditorDisplayOptions);
2018-02-15 18:16:14 +00:00
return _possibleConstructorReturn(this, (ProductsBlockSettingsEditorDisplayOptions.__proto__ || Object.getPrototypeOf(ProductsBlockSettingsEditorDisplayOptions)).apply(this, arguments));
}
2018-02-15 18:16:14 +00:00
_createClass(ProductsBlockSettingsEditorDisplayOptions, [{
key: 'render',
value: function render() {
var classes = 'display-settings-container';
if (this.props.existing) {
classes += ' existing';
}
2018-02-15 18:16:14 +00:00
var display_settings = [];
for (var setting_key in PRODUCTS_BLOCK_DISPLAY_SETTINGS) {
display_settings.push(wp.element.createElement(ProductsBlockSettingsEditorDisplayOption, _extends({}, PRODUCTS_BLOCK_DISPLAY_SETTINGS[setting_key], { update_display_callback: this.props.update_display_callback })));
}
2018-02-15 18:16:14 +00:00
var description = null;
if (!this.props.existing) {
description = wp.element.createElement(
'p',
null,
__('Choose which products you\'d like to display:')
);
}
2018-02-15 18:16:14 +00:00
return wp.element.createElement(
'div',
{ className: classes },
description,
display_settings
);
}
}]);
2018-02-15 18:16:14 +00:00
return ProductsBlockSettingsEditorDisplayOptions;
}(React.Component);
/**
2018-02-15 18:16:14 +00:00
* The products block when in Edit mode.
*/
2018-02-15 18:16:14 +00:00
var ProductsBlockSettingsEditor = function (_React$Component3) {
_inherits(ProductsBlockSettingsEditor, _React$Component3);
/**
* Constructor.
*/
2018-02-15 18:16:14 +00:00
function ProductsBlockSettingsEditor(props) {
_classCallCheck(this, ProductsBlockSettingsEditor);
2018-02-15 18:16:14 +00:00
var _this4 = _possibleConstructorReturn(this, (ProductsBlockSettingsEditor.__proto__ || Object.getPrototypeOf(ProductsBlockSettingsEditor)).call(this, props));
2018-02-15 18:16:14 +00:00
_this4.state = {
display: props.selected_display,
menu_visible: props.selected_display ? false : true,
expanded_group: ''
};
2018-02-15 18:16:14 +00:00
_this4.updateDisplay = _this4.updateDisplay.bind(_this4);
return _this4;
}
/**
2018-02-15 18:16:14 +00:00
* Update the display settings for the block.
*
2018-02-15 18:16:14 +00:00
* @param value String
*/
2018-02-15 18:16:14 +00:00
_createClass(ProductsBlockSettingsEditor, [{
key: 'updateDisplay',
value: function updateDisplay(value) {
2018-02-15 18:16:14 +00:00
// If not a group update display.
var new_state = {
display: value,
menu_visible: false,
expanded_group: ''
};
var is_group = 'undefined' !== PRODUCTS_BLOCK_DISPLAY_SETTINGS[value].group_container && PRODUCTS_BLOCK_DISPLAY_SETTINGS[value].group_container;
if (is_group) {
2018-02-19 19:57:37 +00:00
// If the group has not been expanded, expand it.
2018-02-15 18:16:14 +00:00
new_state = {
menu_visible: true,
expanded_group: value
2018-02-19 19:57:37 +00:00
// If the group has already been expanded, collapse it.
};if (this.state.expanded_group === PRODUCTS_BLOCK_DISPLAY_SETTINGS[value].group_container) {
new_state.expanded_group = '';
}
2018-02-15 18:16:14 +00:00
}
2018-02-15 18:16:14 +00:00
this.setState(new_state);
2018-02-15 18:16:14 +00:00
// Only update the display setting if a non-group setting was selected.
if (!is_group) {
2018-02-15 18:16:14 +00:00
this.props.update_display_callback(value);
}
}
/**
2018-02-15 18:16:14 +00:00
* Render the display settings dropdown and any extra contextual settings.
*/
}, {
key: 'render',
value: function render() {
2018-02-15 18:16:14 +00:00
var _this5 = this;
2018-02-15 18:16:14 +00:00
var extra_settings = null;
if ('specific' === this.state.display) {
2018-02-16 19:40:19 +00:00
extra_settings = wp.element.createElement(_specificSelect.ProductsSpecificSelect, this.props);
2018-02-15 18:16:14 +00:00
} else if ('category' === this.state.display) {
extra_settings = wp.element.createElement(_categorySelect.ProductsCategorySelect, this.props);
} else if ('attribute' === this.state.display) {
extra_settings = wp.element.createElement(_attributeSelect.ProductsAttributeSelect, null);
}
2018-02-15 18:16:14 +00:00
var menu = this.state.menu_visible ? wp.element.createElement(ProductsBlockSettingsEditorDisplayOptions, { existing: this.state.display ? true : false, update_display_callback: this.updateDisplay }) : null;
2018-02-15 18:16:14 +00:00
var heading = null;
if (this.state.display) {
var menu_link = wp.element.createElement(
'a',
{ onClick: function onClick() {
_this5.setState({ menu_visible: true });
} },
__('Display different products')
);
if (this.state.menu_visible) {
menu_link = wp.element.createElement(
'a',
{ onClick: function onClick() {
_this5.setState({ menu_visible: false });
} },
__('Cancel')
);
}
heading = wp.element.createElement(
'div',
{ className: 'settings-heading' },
wp.element.createElement(
'div',
{ className: 'currently-displayed' },
__('Displaying '),
wp.element.createElement(
'strong',
null,
__(PRODUCTS_BLOCK_DISPLAY_SETTINGS[this.state.display].title)
)
),
wp.element.createElement(
'div',
{ className: 'change-display' },
menu_link
)
);
}
return wp.element.createElement(
'div',
{ className: 'wc-product-display-settings ' + (this.state.expanded_group ? 'expanded-group-' + this.state.expanded_group : '') },
wp.element.createElement(
'h4',
null,
__('Products')
),
heading,
menu,
extra_settings,
wp.element.createElement(
'div',
{ className: 'block-footer' },
wp.element.createElement(
'button',
{ type: 'button', className: 'button button-large', onClick: this.props.done_callback },
__('Done')
)
)
);
}
}]);
return ProductsBlockSettingsEditor;
}(React.Component);
/**
* One product in the product block preview.
*/
2018-02-15 18:16:14 +00:00
var ProductPreview = function (_React$Component4) {
_inherits(ProductPreview, _React$Component4);
function ProductPreview() {
_classCallCheck(this, ProductPreview);
return _possibleConstructorReturn(this, (ProductPreview.__proto__ || Object.getPrototypeOf(ProductPreview)).apply(this, arguments));
}
_createClass(ProductPreview, [{
key: 'render',
value: function render() {
var _props = this.props,
attributes = _props.attributes,
product = _props.product;
var image = null;
if (product.images.length) {
image = wp.element.createElement('img', { src: product.images[0].src });
}
var title = null;
if (attributes.display_title) {
title = wp.element.createElement(
'div',
{ className: 'product-title' },
product.name
);
}
var price = null;
if (attributes.display_price) {
price = wp.element.createElement(
'div',
{ className: 'product-price' },
product.price
);
}
var add_to_cart = null;
if (attributes.display_add_to_cart) {
add_to_cart = wp.element.createElement(
'span',
{ className: 'product-add-to-cart' },
__('Add to cart')
);
}
return wp.element.createElement(
'div',
{ className: 'product-preview' },
image,
title,
price,
add_to_cart
);
}
}]);
return ProductPreview;
}(React.Component);
/**
* Renders a preview of what the block will look like with current settings.
*/
2018-02-15 18:16:14 +00:00
var ProductsBlockPreview = withAPIData(function (_ref) {
var attributes = _ref.attributes;
var columns = attributes.columns,
rows = attributes.rows,
order = attributes.order,
display = attributes.display,
display_setting = attributes.display_setting,
layout = attributes.layout;
var query = {
per_page: 'list' === layout ? rows : rows * columns,
orderby: order
};
// @todo These will likely need to be modified to work with the final version of the category/product picker attributes.
if ('specific' === display) {
query.include = JSON.stringify(display_setting);
query.orderby = 'include';
} else if ('category' === display) {
query.category = display_setting.join(',');
}
var query_string = '?';
var _iteratorNormalCompletion = true;
var _didIteratorError = false;
var _iteratorError = undefined;
try {
for (var _iterator = Object.keys(query)[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
var key = _step.value;
query_string += key + '=' + query[key] + '&';
}
} catch (err) {
_didIteratorError = true;
_iteratorError = err;
} finally {
try {
if (!_iteratorNormalCompletion && _iterator.return) {
_iterator.return();
}
} finally {
if (_didIteratorError) {
throw _iteratorError;
}
}
}
return {
products: '/wc/v2/products' + query_string
};
2018-02-15 18:16:14 +00:00
})(function (_ref2) {
var products = _ref2.products,
attributes = _ref2.attributes;
if (!products.data) {
return __('Loading');
}
if (0 === products.data.length) {
return __('No products found');
}
var classes = "wc-products-block-preview " + attributes.layout + " cols-" + attributes.columns;
return wp.element.createElement(
'div',
{ className: classes },
products.data.map(function (product) {
return wp.element.createElement(ProductPreview, { key: product.id, product: product, attributes: attributes });
})
);
});
/**
* Register and run the products block.
*/
registerBlockType('woocommerce/products', {
title: __('Products'),
icon: 'universal-access-alt', // @todo Needs a good icon.
category: 'widgets',
attributes: {
/**
* Layout to use. 'grid' or 'list'.
*/
layout: {
type: 'string',
default: 'grid'
},
/**
* Number of columns.
*/
columns: {
type: 'number',
default: 3
},
/**
* Number of rows.
*/
rows: {
type: 'number',
default: 1
},
/**
* Whether to display product titles.
*/
display_title: {
type: 'boolean',
default: true
},
/**
* Whether to display prices.
*/
display_price: {
type: 'boolean',
default: true
},
/**
* Whether to display Add to Cart buttons.
*/
display_add_to_cart: {
type: 'boolean',
default: false
},
/**
* Order to use for products. 'date', or 'title'.
*/
order: {
type: 'string',
default: 'date'
},
/**
* What types of products to display. 'all', 'specific', or 'category'.
*/
display: {
type: 'string',
default: ''
},
/**
* Which products to display if 'display' is 'specific' or 'category'. Array of product ids or category slugs depending on setting.
*/
display_setting: {
type: 'array',
default: []
},
/**
* Whether the block is in edit or preview mode.
*/
edit_mode: {
type: 'boolean',
default: true
}
},
/**
* Renders and manages the block.
*/
edit: function edit(props) {
var attributes = props.attributes,
className = props.className,
focus = props.focus,
setAttributes = props.setAttributes,
setFocus = props.setFocus;
var layout = attributes.layout,
rows = attributes.rows,
columns = attributes.columns,
display_title = attributes.display_title,
display_price = attributes.display_price,
display_add_to_cart = attributes.display_add_to_cart,
order = attributes.order,
display = attributes.display,
display_setting = attributes.display_setting,
edit_mode = attributes.edit_mode;
/**
* Get the components for the sidebar settings area that is rendered while focused on a Products block.
*
* @return Component
*/
function getInspectorControls() {
return wp.element.createElement(
InspectorControls,
{ key: 'inspector' },
wp.element.createElement(
'h3',
null,
__('Layout')
),
wp.element.createElement(RangeControl, {
label: __('Columns'),
value: columns,
onChange: function onChange(value) {
return setAttributes({ columns: value });
},
min: 1,
max: 6
}),
wp.element.createElement(RangeControl, {
label: __('Rows'),
value: rows,
onChange: function onChange(value) {
return setAttributes({ rows: value });
},
min: 1,
max: 6
}),
wp.element.createElement(ToggleControl, {
label: __('Display title'),
checked: display_title,
onChange: function onChange() {
return setAttributes({ display_title: !display_title });
}
}),
wp.element.createElement(ToggleControl, {
label: __('Display price'),
checked: display_price,
onChange: function onChange() {
return setAttributes({ display_price: !display_price });
}
}),
wp.element.createElement(ToggleControl, {
label: __('Display add to cart button'),
checked: display_add_to_cart,
onChange: function onChange() {
return setAttributes({ display_add_to_cart: !display_add_to_cart });
}
}),
wp.element.createElement(SelectControl, {
key: 'query-panel-select',
label: __('Order'),
value: order,
options: [{
label: __('Newness'),
value: 'date'
}, {
label: __('Title'),
value: 'title'
}],
onChange: function onChange(value) {
return setAttributes({ order: value });
}
})
);
};
/**
* Get the components for the toolbar area that appears on top of the block when focused.
*
* @return Component
*/
function getToolbarControls() {
var layoutControls = [{
icon: 'list-view',
title: __('List View'),
onClick: function onClick() {
return setAttributes({ layout: 'list' });
},
isActive: layout === 'list'
}, {
icon: 'grid-view',
title: __('Grid View'),
onClick: function onClick() {
return setAttributes({ layout: 'grid' });
},
isActive: layout === 'grid'
}];
var editButton = [{
icon: 'edit',
title: __('Edit'),
onClick: function onClick() {
return setAttributes({ edit_mode: !edit_mode });
},
isActive: edit_mode
}];
return wp.element.createElement(
BlockControls,
{ key: 'controls' },
wp.element.createElement(Toolbar, { controls: layoutControls }),
wp.element.createElement(Toolbar, { controls: editButton })
);
}
/**
* Get the block preview component for preview mode.
*
* @return Component
*/
function getPreview() {
return wp.element.createElement(ProductsBlockPreview, { attributes: attributes });
}
/**
* Get the block edit component for edit mode.
*
* @return Component
*/
function getSettingsEditor() {
return wp.element.createElement(ProductsBlockSettingsEditor, {
selected_display: display,
selected_display_setting: display_setting,
update_display_callback: function update_display_callback(value) {
return setAttributes({ display: value });
},
update_display_setting_callback: function update_display_setting_callback(value) {
return setAttributes({ display_setting: value });
},
done_callback: function done_callback() {
return setAttributes({ edit_mode: false });
}
});
}
return [!!focus ? getInspectorControls() : null, !!focus ? getToolbarControls() : null, edit_mode ? getSettingsEditor() : getPreview()];
},
/**
* Save the block content in the post content. Block content is saved as a products shortcode.
*
* @return string
*/
save: function save(props) {
var _props$attributes = props.attributes,
layout = _props$attributes.layout,
rows = _props$attributes.rows,
columns = _props$attributes.columns,
display_title = _props$attributes.display_title,
display_price = _props$attributes.display_price,
display_add_to_cart = _props$attributes.display_add_to_cart,
order = _props$attributes.order,
display = _props$attributes.display,
display_setting = _props$attributes.display_setting,
className = _props$attributes.className;
var shortcode_atts = new Map();
shortcode_atts.set('orderby', order);
shortcode_atts.set('limit', 'grid' === layout ? rows * columns : rows);
shortcode_atts.set('class', 'list' === layout ? className + ' list-layout' : className);
if ('grid' === layout) {
shortcode_atts.set('columns', columns);
}
if (!display_title) {
shortcode_atts.set('show_title', 0);
}
if (!display_price) {
shortcode_atts.set('show_price', 0);
}
if (!display_add_to_cart) {
shortcode_atts.set('show_add_to_cart', 0);
}
if ('specific' === display) {
shortcode_atts.set('include', display_setting.join(','));
}
if ('category' === display) {
shortcode_atts.set('category', display_setting.join(','));
}
// Build the shortcode string out of the set shortcode attributes.
var shortcode = '[products';
var _iteratorNormalCompletion2 = true;
var _didIteratorError2 = false;
var _iteratorError2 = undefined;
try {
for (var _iterator2 = shortcode_atts[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
2018-02-15 18:16:14 +00:00
var _ref3 = _step2.value;
2018-02-15 18:16:14 +00:00
var _ref4 = _slicedToArray(_ref3, 2);
2018-02-15 18:16:14 +00:00
var key = _ref4[0];
var value = _ref4[1];
shortcode += ' ' + key + '="' + value + '"';
}
} catch (err) {
_didIteratorError2 = true;
_iteratorError2 = err;
} finally {
try {
if (!_iteratorNormalCompletion2 && _iterator2.return) {
_iterator2.return();
}
} finally {
if (_didIteratorError2) {
throw _iteratorError2;
}
}
}
shortcode += ']';
return shortcode;
}
});
2018-02-15 18:16:14 +00:00
/***/ }),
/* 1 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var __ = wp.i18n.__;
var _wp$components = wp.components,
Toolbar = _wp$components.Toolbar,
withAPIData = _wp$components.withAPIData,
Dropdown = _wp$components.Dropdown;
/**
* When the display mode is 'Specific products' search for and add products to the block.
*
* @todo Add the functionality and everything.
*/
var ProductsSpecificSelect = exports.ProductsSpecificSelect = function (_React$Component) {
_inherits(ProductsSpecificSelect, _React$Component);
/**
* Constructor.
*/
function ProductsSpecificSelect(props) {
_classCallCheck(this, ProductsSpecificSelect);
var _this = _possibleConstructorReturn(this, (ProductsSpecificSelect.__proto__ || Object.getPrototypeOf(ProductsSpecificSelect)).call(this, props));
_this.state = {
2018-02-16 19:40:19 +00:00
selectedProducts: props.selected_display_setting || []
2018-02-15 18:16:14 +00:00
};
return _this;
}
_createClass(ProductsSpecificSelect, [{
2018-02-16 19:40:19 +00:00
key: "addProduct",
value: function addProduct(id) {
var selectedProducts = this.state.selectedProducts;
selectedProducts.push(id);
2018-02-15 18:16:14 +00:00
2018-02-16 19:40:19 +00:00
this.setState({
selectedProducts: selectedProducts
});
this.props.update_display_setting_callback(selectedProducts);
}
}, {
key: "removeProduct",
value: function removeProduct(id) {
var oldProducts = this.state.selectedProducts;
var newProducts = [];
var _iteratorNormalCompletion = true;
var _didIteratorError = false;
var _iteratorError = undefined;
try {
for (var _iterator = oldProducts[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
var productId = _step.value;
if (productId !== id) {
newProducts.push(productId);
}
}
} catch (err) {
_didIteratorError = true;
_iteratorError = err;
} finally {
try {
if (!_iteratorNormalCompletion && _iterator.return) {
_iterator.return();
}
} finally {
if (_didIteratorError) {
throw _iteratorError;
}
}
}
2018-02-15 18:16:14 +00:00
this.setState({
2018-02-16 19:40:19 +00:00
selectedProducts: newProducts
2018-02-15 18:16:14 +00:00
});
2018-02-16 19:40:19 +00:00
this.props.update_display_setting_callback(newProducts);
2018-02-15 18:16:14 +00:00
}
}, {
key: "render",
value: function render() {
return wp.element.createElement(
"div",
{ className: "product-specific-select" },
2018-02-16 19:40:19 +00:00
wp.element.createElement(ProductsSpecificSearchField, { addProductCallback: this.addProduct.bind(this) }),
wp.element.createElement(ProductSpecificSelectedProducts, { products: this.state.selectedProducts, removeProductCallback: this.removeProduct.bind(this) })
);
}
}]);
return ProductsSpecificSelect;
}(React.Component);
/**
* Product search area
*/
var ProductsSpecificSearchField = function (_React$Component2) {
_inherits(ProductsSpecificSearchField, _React$Component2);
function ProductsSpecificSearchField(props) {
_classCallCheck(this, ProductsSpecificSearchField);
var _this2 = _possibleConstructorReturn(this, (ProductsSpecificSearchField.__proto__ || Object.getPrototypeOf(ProductsSpecificSearchField)).call(this, props));
_this2.state = {
searchText: ''
};
_this2.updateSearchResults = _this2.updateSearchResults.bind(_this2);
return _this2;
}
_createClass(ProductsSpecificSearchField, [{
key: "updateSearchResults",
value: function updateSearchResults(evt) {
this.setState({
searchText: evt.target.value
});
}
}, {
key: "render",
value: function render() {
var _this3 = this;
return wp.element.createElement(
"div",
{ className: "product-search" },
wp.element.createElement("input", { type: "text", value: this.state.searchText, placeholder: __('Search for products to display'), onChange: this.updateSearchResults }),
2018-02-15 18:16:14 +00:00
wp.element.createElement(
2018-02-16 19:40:19 +00:00
"span",
{ className: "cancel", onClick: function onClick() {
_this3.setState({ searchText: '' });
} },
"X"
2018-02-15 18:16:14 +00:00
),
2018-02-16 19:40:19 +00:00
wp.element.createElement(ProductSpecificSearchResults, { searchString: this.state.searchText, addProductCallback: this.props.addProductCallback })
2018-02-15 18:16:14 +00:00
);
}
}]);
2018-02-16 19:40:19 +00:00
return ProductsSpecificSearchField;
2018-02-15 18:16:14 +00:00
}(React.Component);
2018-02-16 19:40:19 +00:00
/**
* Product search results based on the text entered into the textbox.
*/
var ProductSpecificSearchResults = withAPIData(function (props) {
if (!props.searchString.length) {
return {
products: []
};
}
2018-02-15 18:16:14 +00:00
return {
2018-02-16 19:40:19 +00:00
products: '/wc/v2/products?per_page=10&search=' + props.searchString
2018-02-15 18:16:14 +00:00
};
2018-02-16 19:40:19 +00:00
})(function (_ref) {
var products = _ref.products,
addProductCallback = _ref.addProductCallback;
2018-02-15 18:16:14 +00:00
if (!products.data) {
2018-02-16 19:40:19 +00:00
return null;
2018-02-15 18:16:14 +00:00
}
if (0 === products.data.length) {
return __('No products found');
}
2018-02-16 19:40:19 +00:00
return wp.element.createElement(
"div",
{ role: "menu", className: "product-search-results", "aria-orientation": "vertical", "aria-label": "{ __( 'Products list' ) }" },
wp.element.createElement(
2018-02-15 18:16:14 +00:00
"ul",
null,
2018-02-16 19:40:19 +00:00
products.data.map(function (product) {
2018-02-15 18:16:14 +00:00
return wp.element.createElement(
"li",
null,
wp.element.createElement(
"button",
2018-02-16 19:40:19 +00:00
{ type: "button", className: "components-button", id: 'product-' + product.id, onClick: function onClick() {
addProductCallback(product.id);
} },
2018-02-15 18:16:14 +00:00
wp.element.createElement("img", { src: product.images[0].src, width: "30px" }),
2018-02-16 19:40:19 +00:00
wp.element.createElement(
"span",
{ className: "product-name" },
product.name
),
wp.element.createElement(
"a",
null,
__('Add')
)
2018-02-15 18:16:14 +00:00
)
);
})
2018-02-16 19:40:19 +00:00
)
2018-02-15 18:16:14 +00:00
);
});
2018-02-16 19:40:19 +00:00
/**
* List preview of selected products.
*/
var ProductSpecificSelectedProducts = withAPIData(function (props) {
2018-02-15 18:16:14 +00:00
2018-02-16 19:40:19 +00:00
if (!props.products.length) {
return {
products: []
};
2018-02-15 18:16:14 +00:00
}
2018-02-16 19:40:19 +00:00
return {
products: '/wc/v2/products?include=' + props.products.join(',')
};
})(function (_ref2) {
var products = _ref2.products,
removeProductCallback = _ref2.removeProductCallback;
if (!products.data) {
return null;
}
if (0 === products.data.length) {
return __('No products selected');
}
2018-02-15 18:16:14 +00:00
return wp.element.createElement(
"div",
2018-02-16 19:40:19 +00:00
{ role: "menu", className: "selected-products", "aria-orientation": "vertical", "aria-label": "{ __( 'Products list' ) }" },
wp.element.createElement(
"ul",
null,
products.data.map(function (product) {
return wp.element.createElement(
"li",
null,
wp.element.createElement(
"button",
{ type: "button", className: "components-button", id: 'product-' + product.id },
wp.element.createElement("img", { src: product.images[0].src, width: "30px" }),
wp.element.createElement(
"span",
{ className: "product-name" },
product.name
),
wp.element.createElement(
"a",
{ onClick: function onClick() {
removeProductCallback(product.id);
} },
__('X')
)
)
);
})
)
2018-02-15 18:16:14 +00:00
);
2018-02-16 19:40:19 +00:00
});
2018-02-15 18:16:14 +00:00
/***/ }),
/* 2 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
2018-02-15 18:16:14 +00:00
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var __ = wp.i18n.__;
var _wp$components = wp.components,
Toolbar = _wp$components.Toolbar,
withAPIData = _wp$components.withAPIData,
2018-02-19 19:57:37 +00:00
Dropdown = _wp$components.Dropdown,
Dashicon = _wp$components.Dashicon;
2018-02-15 18:16:14 +00:00
/**
* When the display mode is 'Product category' search for and select product categories to pull products from.
*/
var ProductsCategorySelect = exports.ProductsCategorySelect = function (_React$Component) {
_inherits(ProductsCategorySelect, _React$Component);
/**
* Constructor.
*/
function ProductsCategorySelect(props) {
_classCallCheck(this, ProductsCategorySelect);
var _this = _possibleConstructorReturn(this, (ProductsCategorySelect.__proto__ || Object.getPrototypeOf(ProductsCategorySelect)).call(this, props));
_this.state = {
selectedCategories: props.selected_display_setting,
2018-02-19 19:57:37 +00:00
openAccordion: null,
2018-02-15 18:16:14 +00:00
filterQuery: ''
};
_this.checkboxChange = _this.checkboxChange.bind(_this);
2018-02-19 19:57:37 +00:00
_this.accordionToggle = _this.accordionToggle.bind(_this);
2018-02-15 18:16:14 +00:00
_this.filterResults = _this.filterResults.bind(_this);
return _this;
}
/**
* Handle checkbox toggle.
*
* @param Checked? boolean checked
* @param Categories array categories
2018-02-15 18:16:14 +00:00
*/
_createClass(ProductsCategorySelect, [{
key: "checkboxChange",
value: function checkboxChange(checked, categories) {
2018-02-15 18:16:14 +00:00
var selectedCategories = this.state.selectedCategories;
selectedCategories = selectedCategories.filter(function (category) {
return !categories.includes(category);
});
if (checked) {
var _selectedCategories;
(_selectedCategories = selectedCategories).push.apply(_selectedCategories, _toConsumableArray(categories));
2018-02-15 18:16:14 +00:00
}
this.setState({
selectedCategories: selectedCategories
});
this.props.update_display_setting_callback(selectedCategories);
}
2018-02-19 20:07:32 +00:00
/**
* Handle accordion toggle.
*
* @param Category ID category
*/
2018-02-19 19:57:37 +00:00
}, {
key: "accordionToggle",
value: function accordionToggle(category) {
var value = category;
if (value === this.state.openAccordion) {
value = null;
}
this.setState({
openAccordion: value
});
}
2018-02-15 18:16:14 +00:00
/**
* Filter categories.
*
* @param Event object evt
*/
}, {
key: "filterResults",
value: function filterResults(evt) {
this.setState({
filterQuery: evt.target.value
});
}
/**
* Render the list of categories and the search input.
*/
}, {
key: "render",
value: function render() {
return wp.element.createElement(
"div",
{ className: "product-category-select" },
wp.element.createElement(ProductCategoryFilter, { filterResults: this.filterResults }),
2018-02-19 19:57:37 +00:00
wp.element.createElement(ProductCategoryList, {
filterQuery: this.state.filterQuery,
selectedCategories: this.state.selectedCategories,
checkboxChange: this.checkboxChange,
accordionToggle: this.accordionToggle,
openAccordion: this.state.openAccordion
})
2018-02-15 18:16:14 +00:00
);
}
}]);
return ProductsCategorySelect;
}(React.Component);
/**
* The category search input.
*/
var ProductCategoryFilter = function ProductCategoryFilter(_ref) {
var filterResults = _ref.filterResults;
return wp.element.createElement(
"div",
null,
wp.element.createElement("input", { id: "product-category-search", type: "search", placeholder: __('Search for categories'), onChange: filterResults })
);
};
/**
* Fetch and build a tree of product categories.
*/
var ProductCategoryList = withAPIData(function (props) {
return {
categories: '/wc/v2/products/categories'
};
})(function (_ref2) {
var categories = _ref2.categories,
filterQuery = _ref2.filterQuery,
selectedCategories = _ref2.selectedCategories,
2018-02-19 19:57:37 +00:00
checkboxChange = _ref2.checkboxChange,
accordionToggle = _ref2.accordionToggle,
openAccordion = _ref2.openAccordion;
2018-02-15 18:16:14 +00:00
if (!categories.data) {
return __('Loading');
}
if (0 === categories.data.length) {
return __('No categories found');
}
var handleCategoriesToCheck = function handleCategoriesToCheck(evt, parent, categories) {
var ids = getCategoryChildren(parent, categories).map(function (category) {
return category.id;
});
ids.push(parent.id);
checkboxChange(evt.target.checked, ids);
};
var getCategoryChildren = function getCategoryChildren(parent, categories) {
var children = [];
categories.filter(function (category) {
return category.parent === parent.id;
}).forEach(function (category) {
children.push(category);
children.push.apply(children, _toConsumableArray(getCategoryChildren(category, categories)));
});
return children;
};
var categoryHasChildren = function categoryHasChildren(parent, categories) {
return !!getCategoryChildren(parent, categories).length;
};
2018-02-19 19:57:37 +00:00
var AccordionButton = function AccordionButton(_ref3) {
var category = _ref3.category,
categories = _ref3.categories;
2018-02-19 19:57:37 +00:00
var icon = 'arrow-down-alt2';
if (openAccordion === category.id) {
2018-02-19 19:57:37 +00:00
icon = 'arrow-up-alt2';
}
var style = null;
if (!categoryHasChildren(category, categories)) {
style = {
visibility: 'hidden'
};
};
2018-02-19 19:57:37 +00:00
return wp.element.createElement(
"button",
{ onClick: function onClick() {
return accordionToggle(category.id);
}, style: style, type: "button", className: "product-category-accordion-toggle" },
2018-02-19 19:57:37 +00:00
wp.element.createElement(Dashicon, { icon: icon })
);
};
var CategoryTree = function CategoryTree(_ref4) {
var categories = _ref4.categories,
parent = _ref4.parent;
2018-02-15 18:16:14 +00:00
var filteredCategories = categories.filter(function (category) {
return category.parent === parent;
});
return filteredCategories.length > 0 && wp.element.createElement(
"ul",
null,
filteredCategories.map(function (category) {
return wp.element.createElement(
"li",
2018-02-19 19:57:37 +00:00
{ key: category.id, className: openAccordion === category.id ? 'product-category-accordion-open' : '' },
2018-02-15 18:16:14 +00:00
wp.element.createElement(
"label",
{ htmlFor: 'product-category-' + category.id },
wp.element.createElement("input", { type: "checkbox",
id: 'product-category-' + category.id,
value: category.id,
checked: selectedCategories.includes(category.id),
onChange: function onChange(evt) {
return handleCategoriesToCheck(evt, category, categories);
}
2018-02-15 18:16:14 +00:00
}),
" ",
2018-02-19 19:57:37 +00:00
category.name,
wp.element.createElement(
"span",
{ className: "product-category-count" },
category.count
),
0 === category.parent && wp.element.createElement(AccordionButton, { category: category, categories: categories })
2018-02-15 18:16:14 +00:00
),
wp.element.createElement(CategoryTree, { categories: categories, parent: category.id })
);
})
);
};
var categoriesData = categories.data;
if ('' !== filterQuery) {
categoriesData = categoriesData.filter(function (category) {
return category.slug.includes(filterQuery.toLowerCase());
});
}
return wp.element.createElement(
"div",
2018-02-19 19:57:37 +00:00
{ className: "product-categories-list" },
2018-02-15 18:16:14 +00:00
wp.element.createElement(CategoryTree, { categories: categoriesData, parent: 0 })
);
});
/***/ }),
/* 3 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var __ = wp.i18n.__;
var _wp$components = wp.components,
Toolbar = _wp$components.Toolbar,
withAPIData = _wp$components.withAPIData,
Dropdown = _wp$components.Dropdown;
/**
* When the display mode is 'Attribute' search for and select product attributes to pull products from.
*/
var ProductsAttributeSelect = exports.ProductsAttributeSelect = function (_React$Component) {
_inherits(ProductsAttributeSelect, _React$Component);
function ProductsAttributeSelect() {
_classCallCheck(this, ProductsAttributeSelect);
return _possibleConstructorReturn(this, (ProductsAttributeSelect.__proto__ || Object.getPrototypeOf(ProductsAttributeSelect)).apply(this, arguments));
}
_createClass(ProductsAttributeSelect, [{
key: "render",
value: function render() {
return wp.element.createElement(
"div",
{ className: "product-attribute-select" },
"TODO: Attribute select screen"
);
}
}]);
return ProductsAttributeSelect;
}(React.Component);
/***/ })
/******/ ]);