@shopgate/engage 7.29.0-alpha.5 → 7.29.0-alpha.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/development/components/DevelopmentTools/hooks.js +2 -2
- package/package.json +7 -7
- package/page/components/ResponsiveWidgetImage/ResponsiveWidgetImage.js +7 -0
- package/page/components/ResponsiveWidgetImage/index.js +1 -0
- package/page/components/WidgetHeadline/WidgetHeadline.js +7 -0
- package/page/components/WidgetHeadline/index.js +1 -0
- package/page/components/Widgets/Widgets.js +2 -2
- package/page/components/Widgets/helpers.js +7 -7
- package/page/components/index.js +1 -1
- package/page/helpers/index.d.ts +8 -0
- package/page/helpers/index.js +6 -1
- package/page/widgets/CategoryList/CategoryList.js +2 -2
- package/page/widgets/CategoryList/hooks.js +4 -2
- package/page/widgets/Headline/Headline.js +2 -3
- package/page/widgets/Image/Image.js +2 -2
- package/page/widgets/Image/hooks.js +1 -6
- package/page/widgets/ImageRow/ImageRow.js +4 -0
- package/page/widgets/ImageRow/hooks.js +14 -0
- package/page/widgets/ImageRow/index.js +1 -0
- package/page/widgets/ImageSlider/ImageSlider.js +2 -2
- package/page/widgets/ProductList/ProductList.js +2 -2
- package/page/widgets/ProductList/hooks.js +3 -1
- package/page/widgets/ProductSlider/ProductSlider.js +3 -3
- package/page/widgets/ProductSlider/hooks.js +3 -1
- package/page/widgets/RichText/RichText.js +3 -0
- package/page/widgets/RichText/hooks.js +10 -0
- package/page/widgets/RichText/index.js +1 -0
- package/page/widgets/index.js +1 -1
- package/page/widgets/widgets.json +9 -3
|
@@ -4,5 +4,5 @@ import{useEffect,useCallback}from'react';/**
|
|
|
4
4
|
*
|
|
5
5
|
* @param {string} shortcut - Shortcut string using mac-style notation, e.g. 'cmd+i'.
|
|
6
6
|
* @param {Function} callback - Function to call when the shortcut is triggered.
|
|
7
|
-
*/export function useShortcut(shortcut,callback){var normalizeShortcut=useCallback(function(){return shortcut.toLowerCase().split('+').map(function(k){return k.trim();}).sort().join('+');},[shortcut]);var handleKeyDown=useCallback(function(event){var keys=[];if(event.ctrlKey)keys.push('ctrl');if(event.metaKey)keys.push('cmd');// Treat meta as cmd
|
|
8
|
-
if(event.altKey)keys.push('alt');if(event.shiftKey)keys.push('shift');var key=event.key.toLowerCase();if(!['control','meta','alt','shift'].includes(key)){keys.push(key);}var pressed=keys.sort().join('+');if(pressed===normalizeShortcut()){event.preventDefault();callback(event);}},[callback,normalizeShortcut]);useEffect(function(){window.addEventListener('keydown',handleKeyDown);return function(){return window.removeEventListener('keydown',handleKeyDown);};},[handleKeyDown]);}
|
|
7
|
+
*/export function useShortcut(shortcut,callback){var normalizeShortcut=useCallback(function(){return shortcut.toLowerCase().split('+').map(function(k){return k.trim();}).sort().join('+');},[shortcut]);var handleKeyDown=useCallback(function(event){var _event$key;var keys=[];if(event.ctrlKey)keys.push('ctrl');if(event.metaKey)keys.push('cmd');// Treat meta as cmd
|
|
8
|
+
if(event.altKey)keys.push('alt');if(event.shiftKey)keys.push('shift');var key=(_event$key=event.key)===null||_event$key===void 0?void 0:_event$key.toLowerCase();if(!['control','meta','alt','shift'].includes(key)){keys.push(key);}var pressed=keys.sort().join('+');if(pressed===normalizeShortcut()){event.preventDefault();callback(event);}},[callback,normalizeShortcut]);useEffect(function(){window.addEventListener('keydown',handleKeyDown);return function(){return window.removeEventListener('keydown',handleKeyDown);};},[handleKeyDown]);}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@shopgate/engage",
|
|
3
|
-
"version": "7.29.0-alpha.
|
|
3
|
+
"version": "7.29.0-alpha.7",
|
|
4
4
|
"description": "Shopgate's ENGAGE library.",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"author": "Shopgate <support@shopgate.com>",
|
|
@@ -17,12 +17,12 @@
|
|
|
17
17
|
"dependencies": {
|
|
18
18
|
"@emotion/react": "^11.14.0",
|
|
19
19
|
"@shopgate/native-modules": "1.0.0-beta.25",
|
|
20
|
-
"@shopgate/pwa-common": "7.29.0-alpha.
|
|
21
|
-
"@shopgate/pwa-common-commerce": "7.29.0-alpha.
|
|
22
|
-
"@shopgate/pwa-core": "7.29.0-alpha.
|
|
23
|
-
"@shopgate/pwa-ui-ios": "7.29.0-alpha.
|
|
24
|
-
"@shopgate/pwa-ui-material": "7.29.0-alpha.
|
|
25
|
-
"@shopgate/pwa-ui-shared": "7.29.0-alpha.
|
|
20
|
+
"@shopgate/pwa-common": "7.29.0-alpha.7",
|
|
21
|
+
"@shopgate/pwa-common-commerce": "7.29.0-alpha.7",
|
|
22
|
+
"@shopgate/pwa-core": "7.29.0-alpha.7",
|
|
23
|
+
"@shopgate/pwa-ui-ios": "7.29.0-alpha.7",
|
|
24
|
+
"@shopgate/pwa-ui-material": "7.29.0-alpha.7",
|
|
25
|
+
"@shopgate/pwa-ui-shared": "7.29.0-alpha.7",
|
|
26
26
|
"@stripe/react-stripe-js": "^1.16.5",
|
|
27
27
|
"@stripe/stripe-js": "^1.3.1",
|
|
28
28
|
"@virtuous/conductor": "~2.5.0",
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
var _excluded=["src","alt","breakpoint"];function _extends(){_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;};return _extends.apply(this,arguments);}function _objectWithoutProperties(source,excluded){if(source==null)return{};var target=_objectWithoutPropertiesLoose(source,excluded);var key,i;if(Object.getOwnPropertySymbols){var sourceSymbolKeys=Object.getOwnPropertySymbols(source);for(i=0;i<sourceSymbolKeys.length;i++){key=sourceSymbolKeys[i];if(excluded.indexOf(key)>=0)continue;if(!Object.prototype.propertyIsEnumerable.call(source,key))continue;target[key]=source[key];}}return target;}function _objectWithoutPropertiesLoose(source,excluded){if(source==null)return{};var target={};var sourceKeys=Object.keys(source);var key,i;for(i=0;i<sourceKeys.length;i++){key=sourceKeys[i];if(excluded.indexOf(key)>=0)continue;target[key]=source[key];}return target;}import React,{useMemo}from'react';import PropTypes from'prop-types';import{useTheme}from'@shopgate/engage/styles';import{parseImageUrl}from"../../helpers";/** @typedef {import('@shopgate/engage/styles').Theme} Theme */ /** @typedef {Theme['breakpoints']['keys'][0]} Breakpoint */ /** @typedef {React.ImgHTMLAttributes<HTMLImageElement>} ImgProps */ /** @typedef {{breakpoint: Breakpoint} & ImgProps} ResponsiveImageProps */ /**
|
|
2
|
+
* The ResponsiveWidgetImage component renders an image that adapts to different screen sizes.
|
|
3
|
+
* It uses the <picture> element to provide a higher resolution image for medium and larger screens.
|
|
4
|
+
*
|
|
5
|
+
* @param {ResponsiveImageProps} props The component props.
|
|
6
|
+
* @returns {JSX.Element}
|
|
7
|
+
*/var ResponsiveWidgetImage=function ResponsiveWidgetImage(_ref){var src=_ref.src,alt=_ref.alt,breakpoint=_ref.breakpoint,imgProps=_objectWithoutProperties(_ref,_excluded);var _useTheme=useTheme(),breakpoints=_useTheme.breakpoints;var src2x=useMemo(function(){return parseImageUrl(src,true);},[src]);return React.createElement("picture",null,React.createElement("source",{media:"(width >= ".concat(breakpoints.values[breakpoint],"px)"),srcSet:src2x}),React.createElement("img",_extends({src:src,alt:alt,loading:"lazy"},imgProps)));};ResponsiveWidgetImage.defaultProps={alt:null,breakpoint:'md'};export default ResponsiveWidgetImage;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export{default}from"./ResponsiveWidgetImage";
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
function _extends(){_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;};return _extends.apply(this,arguments);}import React,{useMemo}from'react';import{makeStyles}from'@shopgate/engage/styles';import{Typography}from'@shopgate/engage/components';import PropTypes from'prop-types';var useStyles=makeStyles()(function(theme){return{root:{padding:theme.spacing(2)}};});/**
|
|
2
|
+
* The WidgetHeadline is used to display a headline for the widget.
|
|
3
|
+
* @param {Object} props The component props.
|
|
4
|
+
* @param {Object} props.headline The headline props.
|
|
5
|
+
* @returns {JSX.Element}
|
|
6
|
+
*/var WidgetHeadline=function WidgetHeadline(_ref){var headline=_ref.headline,className=_ref.className;var _useStyles=useStyles(),classes=_useStyles.classes,cx=_useStyles.cx,css=_useStyles.css;var _headline$typography=headline.typography,typography=_headline$typography===void 0?'h3':_headline$typography,text=headline.text,textAlign=headline.textAlign,bold=headline.bold,italic=headline.italic,underline=headline.underline;var styles=useMemo(function(){return _extends({},bold&&{fontWeight:'bold'},{},italic&&{fontStyle:'italic'},{},underline&&{textDecoration:'underline'});},[bold,italic,underline]);if(!text)return null;return React.createElement(Typography,{variant:typography,align:textAlign// && increases the specificity of the styles which guarantees that defaults are overridden
|
|
7
|
+
,className:cx(css({'&&':_extends({},styles)}),classes.root,className)},text);};WidgetHeadline.defaultProps={className:null};export default WidgetHeadline;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export{default}from"./WidgetHeadline";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
function _defineProperty(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true});}else{obj[key]=value;}return obj;}import React,{useMemo,useRef}from'react';import PropTypes from'prop-types';import{makeStyles}from'@shopgate/engage/styles';import{useRoute,useThemeWidgets}from'@shopgate/engage/core/hooks';import{PAGE_PREVIEW_PATTERN}from'@shopgate/engage/page/constants';import{ConditionalWrapper}from'@shopgate/engage/components';import WidgetsPreviewProvider from"./WidgetsPreviewProvider";import Widget from"./Widget";import Overlay from"./Overlay";import{usePreviewIframeCommunication}from"./hooks";/**
|
|
1
|
+
function _defineProperty(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true});}else{obj[key]=value;}return obj;}import React,{useMemo,useRef}from'react';import PropTypes from'prop-types';import{makeStyles}from'@shopgate/engage/styles';import{useRoute,useThemeWidgets}from'@shopgate/engage/core/hooks';import{PAGE_PREVIEW_PATTERN}from'@shopgate/engage/page/constants';import{ConditionalWrapper}from'@shopgate/engage/components';import WidgetsPreviewProvider from"./WidgetsPreviewProvider";import Widget from"./Widget";import Overlay from"./Overlay";import{checkScheduled}from"./helpers";import{usePreviewIframeCommunication}from"./hooks";/**
|
|
2
2
|
* @typedef {import('./types').WidgetDefinition} WidgetDefinition
|
|
3
3
|
*/var PLACEHOLDER_COMPONENT='@shopgate/widgetsInternal/Placeholder';var useStyles=makeStyles()({preview:{'& *':{scrollbarWidth:'thin'}}});/**
|
|
4
4
|
* The Widgets component renders a list of widgets.
|
|
@@ -8,4 +8,4 @@ function _defineProperty(obj,key,value){if(key in obj){Object.defineProperty(obj
|
|
|
8
8
|
*/var Widgets=function Widgets(_ref){var _ref$widgets=_ref.widgets,widgetsProp=_ref$widgets===void 0?[]:_ref$widgets;var _useStyles=useStyles(),classes=_useStyles.classes,cx=_useStyles.cx;var _useRoute=useRoute(),pattern=_useRoute.pattern;var widgetsRef=useRef(null);var isPreview=pattern===PAGE_PREVIEW_PATTERN;var widgetComponents=useThemeWidgets('v2');usePreviewIframeCommunication(isPreview);// Create sanitized widgets array that only includes widgets with valid components.
|
|
9
9
|
var widgets=useMemo(function(){if(isPreview){// All widgets are allowed in preview mode.
|
|
10
10
|
return widgetsProp;}// Remove widgets that do not have a valid component.
|
|
11
|
-
return widgetsProp.filter(function(widget){return!!widgetComponents[widget.widgetConfigDefinitionCode];});},[isPreview,widgetComponents,widgetsProp]);if(!Array.isArray(widgets)||widgets.length===0){return null;}return React.createElement(ConditionalWrapper,{condition:isPreview,wrapper:function wrapper(children){return React.createElement(WidgetsPreviewProvider,null,children,React.createElement(Overlay,{containerRef:widgetsRef}));}},React.createElement("div",{className:cx('engage__widgets',_defineProperty({},classes.preview,isPreview)),ref:widgetsRef},widgets.map(function(widget){var component=widgetComponents[widget.widgetConfigDefinitionCode]||widgetComponents[PLACEHOLDER_COMPONENT];return React.createElement(Widget,{key:widget.code,definition:widget,isPreview:isPreview,component:component,isCustomLegacyWidget:widget.isCustomLegacyWidget});})));};Widgets.defaultProps={widgets:null};export default Widgets;
|
|
11
|
+
return widgetsProp.filter(function(widget){return!!widgetComponents[widget.widgetConfigDefinitionCode]&&checkScheduled({from:widget===null||widget===void 0?void 0:widget.visibility.scheduleStartDate,to:widget===null||widget===void 0?void 0:widget.visibility.scheduleEndDate}).isActive;});},[isPreview,widgetComponents,widgetsProp]);if(!Array.isArray(widgets)||widgets.length===0){return null;}return React.createElement(ConditionalWrapper,{condition:isPreview,wrapper:function wrapper(children){return React.createElement(WidgetsPreviewProvider,null,children,React.createElement(Overlay,{containerRef:widgetsRef}));}},React.createElement("div",{className:cx('engage__widgets',_defineProperty({},classes.preview,isPreview)),ref:widgetsRef},widgets.map(function(widget){var component=widgetComponents[widget.widgetConfigDefinitionCode]||widgetComponents[PLACEHOLDER_COMPONENT];return React.createElement(Widget,{key:widget.code,definition:widget,isPreview:isPreview,component:component,isCustomLegacyWidget:widget.isCustomLegacyWidget});})));};Widgets.defaultProps={widgets:null};export default Widgets;
|
|
@@ -4,19 +4,19 @@ import{PAGE_PREVIEW_PATTERN}from'@shopgate/engage/page/constants';/**
|
|
|
4
4
|
* @returns {HTMLElement|null}
|
|
5
5
|
*/export var getScrollContainer=function getScrollContainer(){return document.querySelector(".route__".concat(PAGE_PREVIEW_PATTERN.replace(/^\/+/,'')));};/**
|
|
6
6
|
* @typedef {Object} ScheduledParams
|
|
7
|
-
* @
|
|
8
|
-
* @
|
|
9
|
-
* @
|
|
7
|
+
* @property {string} [from] The start date of the scheduling in ISO format.
|
|
8
|
+
* @property {string} [to] The end date of the scheduling in ISO format.
|
|
9
|
+
* @property {number} [timezoneOffset] The timezone offset in minutes. If not provided, the local
|
|
10
10
|
* timezone offset will be used.
|
|
11
11
|
*/ /**
|
|
12
12
|
* @typedef {Object} ScheduledStatus
|
|
13
|
-
* @
|
|
14
|
-
* @
|
|
13
|
+
* @property {boolean} isScheduled Indicates if the widget is scheduled.
|
|
14
|
+
* @property {boolean} isActive Indicates if the widget is currently active within the
|
|
15
15
|
* scheduled time frame.
|
|
16
|
-
* @
|
|
16
|
+
* @property {boolean} isExpired Indicates if the scheduled time frame has expired.
|
|
17
17
|
*/ /**
|
|
18
18
|
* Retrieves the scheduling status of a widget based on the provided parameters.
|
|
19
|
-
* @param {ScheduledParams} params The parameters for the function.
|
|
19
|
+
* @param {ScheduledParams} [params] The parameters for the function.
|
|
20
20
|
* @returns {ScheduledStatus} An object containing the scheduling status.
|
|
21
21
|
*/export function checkScheduled(){var _ref=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{},from=_ref.from,to=_ref.to,timezoneOffset=_ref.timezoneOffset;var now=new Date();// Convert current time to provided or local timezone
|
|
22
22
|
var localOffset=timezoneOffset!==null&&timezoneOffset!==void 0?timezoneOffset:-now.getTimezoneOffset();// in minutes
|
package/page/components/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export{default as NotFound}from"./NotFound";export{default as Widgets}from"./Widgets";
|
|
1
|
+
export{default as NotFound}from"./NotFound";export{default as Widgets}from"./Widgets";export{default as ResponsiveWidgetImage}from"./ResponsiveWidgetImage";
|
package/page/helpers/index.d.ts
CHANGED
|
@@ -45,3 +45,11 @@ export type GetProductSearchParamsFromProductsInputConfigReturnValue = {
|
|
|
45
45
|
export declare function getProductSearchParamsFromProductsInputConfig(
|
|
46
46
|
products: ProductsWidgetInputConfig
|
|
47
47
|
): GetProductSearchParamsFromProductsInputConfigReturnValue;
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Helper to parse the image URL to return a high resolution version if required.
|
|
51
|
+
*/
|
|
52
|
+
export declare function parseImageUrl(
|
|
53
|
+
url: string,
|
|
54
|
+
useHighRes?: boolean
|
|
55
|
+
): string;
|
package/page/helpers/index.js
CHANGED
|
@@ -9,4 +9,9 @@
|
|
|
9
9
|
* @param {ProductsWidgetInputConfig} products Config object of the "Products" input.
|
|
10
10
|
* @returns {GetProductSearchParamsFromProductsInputConfigReturnValue}
|
|
11
11
|
*/export var getProductSearchParamsFromProductsInputConfig=function getProductSearchParamsFromProductsInputConfig(){var products=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};var _ref=products||{},productSelectorType=_ref.productSelectorType,productsBrand=_ref.productsBrand,productsCategory=_ref.productsCategory,productsItemNumbers=_ref.productsItemNumbers,productsManualItemNumbers=_ref.productsManualItemNumbers,productsSelectorItemNumbers=_ref.productsSelectorItemNumbers,productsSearchTerm=_ref.productsSearchTerm;var productsSearchType=productSelectorType;/** @type {string|string[]} */var productsSearchValue='';switch(productSelectorType){case'brand':productsSearchValue=productsBrand;break;case'category':productsSearchValue=productsCategory;break;// Kept for backward compatibility - was replaces by 'manualItemNumbers' and 'productSelector'
|
|
12
|
-
case'itemNumbers':productsSearchValue=productsItemNumbers.split(',').map(function(item){return item.trim();});break;case'manualItemNumbers':productsSearchValue=productsManualItemNumbers;break;case'productSelector':productsSearchValue=productsSelectorItemNumbers;break;case'searchTerm':default:productsSearchValue=productsSearchTerm;}if(['itemNumbers','manualItemNumbers','productSelector'].includes(productSelectorType)){productsSearchType='productIds';}return{productsSearchType:productsSearchType,productsSearchValue:productsSearchValue};}
|
|
12
|
+
case'itemNumbers':productsSearchValue=productsItemNumbers.split(',').map(function(item){return item.trim();});break;case'manualItemNumbers':productsSearchValue=productsManualItemNumbers;break;case'productSelector':productsSearchValue=productsSelectorItemNumbers;break;case'searchTerm':default:productsSearchValue=productsSearchTerm;}if(['itemNumbers','manualItemNumbers','productSelector'].includes(productSelectorType)){productsSearchType='productIds';}return{productsSearchType:productsSearchType,productsSearchValue:productsSearchValue};};/**
|
|
13
|
+
* Parses the image URL to return a high resolution version if required.
|
|
14
|
+
* @param {string} url The original image URL.
|
|
15
|
+
* @param {boolean} useHighRes Whether to return a high resolution version.
|
|
16
|
+
* @returns {string} The parsed image URL.
|
|
17
|
+
*/export var parseImageUrl=function parseImageUrl(url,useHighRes){if(!url||!useHighRes){return url;}var match=url.match(/^(.*)\.([^./]+)$/);return!match?url:"".concat(match[1],"@2x.").concat(match[2]);};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import React from'react';import{CategoryList}from'@shopgate/engage/category/components';import{useCategoryListWidget}from"./hooks";/**
|
|
1
|
+
import React from'react';import{CategoryList}from'@shopgate/engage/category/components';import{makeStyles}from'@shopgate/engage/styles';import{useCategoryListWidget}from"./hooks";import WidgetHeadline from"../../components/WidgetHeadline";var useStyles=makeStyles()(function(theme){return{headline:{paddingBottom:theme.spacing(0)}};});/**
|
|
2
2
|
* The CategoryListWidget is used to display category lists.
|
|
3
3
|
* @returns {JSX.Element}
|
|
4
|
-
*/var CategoryListWidget=function CategoryListWidget(){var _useCategoryListWidge=useCategoryListWidget(),parentCategory=_useCategoryListWidge.parentCategory,categories=_useCategoryListWidge.categories,showImages=_useCategoryListWidge.showImages;if(!categories){return null;}return React.createElement(CategoryList,{categories:categories,parentCategory:parentCategory,showLeftSideImages:showImages});};export default CategoryListWidget;
|
|
4
|
+
*/var CategoryListWidget=function CategoryListWidget(){var _useStyles=useStyles(),classes=_useStyles.classes;var _useCategoryListWidge=useCategoryListWidget(),parentCategory=_useCategoryListWidge.parentCategory,categories=_useCategoryListWidge.categories,showImages=_useCategoryListWidge.showImages,showHeadline=_useCategoryListWidge.showHeadline,headline=_useCategoryListWidge.headline;if(!categories){return null;}return React.createElement(React.Fragment,null,showHeadline&&headline&&categories.length?React.createElement(WidgetHeadline,{headline:headline,className:classes.headline}):null,React.createElement(CategoryList,{categories:categories,parentCategory:parentCategory,showLeftSideImages:showImages}));};export default CategoryListWidget;
|
|
@@ -3,12 +3,14 @@ import _camelCase from"lodash/camelCase";import{useEffect,useMemo}from'react';im
|
|
|
3
3
|
* @property {string} category The parent category ID to display categories for.
|
|
4
4
|
* @property {string} [sort] The sort order for categories
|
|
5
5
|
* @property {boolean} [showImages] Whether to display images for categories.
|
|
6
|
+
* @property {boolean} [showHeadline] Whether to show the headline.
|
|
7
|
+
* @property {Object} [headline] The headline to be displayed.
|
|
6
8
|
*/ /**
|
|
7
9
|
* @typedef {ReturnType< typeof import('@shopgate/engage/page/hooks')
|
|
8
10
|
* .useWidget<CategoryListWidgetConfig> >} UseWidgetReturnType
|
|
9
11
|
*/ // eslint-disable-next-line valid-jsdoc
|
|
10
12
|
/**
|
|
11
13
|
* Hook to access the Category List widget configuration and data.
|
|
12
|
-
*/export var useCategoryListWidget=function useCategoryListWidget(){/** @type {UseWidgetReturnType} */var _useWidget=useWidget(),config=_useWidget.config;var dispatch=useDispatch();var category=config.category,sort=config.sort,showImages=config.showImages;var sortCC=useMemo(function(){return _camelCase(sort);},[sort]);// Get the parent category object from the selected category
|
|
14
|
+
*/export var useCategoryListWidget=function useCategoryListWidget(){/** @type {UseWidgetReturnType} */var _useWidget=useWidget(),config=_useWidget.config;var dispatch=useDispatch();var category=config.category,sort=config.sort,showImages=config.showImages,_config$showHeadline=config.showHeadline,showHeadline=_config$showHeadline===void 0?false:_config$showHeadline,headline=config.headline;var sortCC=useMemo(function(){return _camelCase(sort);},[sort]);// Get the parent category object from the selected category
|
|
13
15
|
var parentCategory=useSelector(function(state){return category?getCategory(state,{categoryId:category}):null;});// Get category children of the selected category (pipeline handles sorting)
|
|
14
|
-
var categories=useSelector(function(state){return typeof category==='string'?getCategoriesById(state,{categoryId:category}):null;});var sortedCategories=useMemo(function(){if(!categories){return[];}if(sortCC==='relevance'){return categories;}var isAsc=sortCC==='nameAsc';return[].concat(categories).sort(function(a,b){return a.name.localeCompare(b.name,undefined,{sensitivity:'base'})*(isAsc?1:-1);});},[categories,sortCC]);useEffect(function(){dispatch(fetchCategoryOrRootCategories(category));},[category,dispatch]);return{parentCategory:parentCategory,showImages:showImages,categories:sortedCategories};};
|
|
16
|
+
var categories=useSelector(function(state){return typeof category==='string'?getCategoriesById(state,{categoryId:category}):null;});var sortedCategories=useMemo(function(){if(!categories){return[];}if(sortCC==='relevance'){return categories;}var isAsc=sortCC==='nameAsc';return[].concat(categories).sort(function(a,b){return a.name.localeCompare(b.name,undefined,{sensitivity:'base'})*(isAsc?1:-1);});},[categories,sortCC]);useEffect(function(){dispatch(fetchCategoryOrRootCategories(category));},[category,dispatch]);return{parentCategory:parentCategory,showImages:showImages,categories:sortedCategories,showHeadline:showHeadline,headline:headline};};
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
import React from'react';import WidgetHeadline from"../../components/WidgetHeadline";import{useWidget}from"../../hooks";/**
|
|
2
2
|
* The HeadlineWidget is used to display a headline text.
|
|
3
3
|
* @returns {JSX.Element}
|
|
4
|
-
*/var Headline=function Headline(){var
|
|
5
|
-
,{className:cx(css({'&&':_extends({},styles)}),classes.root),variant:variant,align:align,gutterBottom:true},headline);};export default Headline;
|
|
4
|
+
*/var Headline=function Headline(){var _useWidget=useWidget(),config=_useWidget.config;var headline=config.headline;if(!headline)return null;return React.createElement(WidgetHeadline,{headline:headline});};export default Headline;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import React from'react';import{makeStyles}from'@shopgate/engage/styles';import{Link,ConditionalWrapper}from'@shopgate/engage/components';import{useImageWidget}from"./hooks";var useStyles=makeStyles()(function(){return{link:{},image:{width:'100%'}};});/**
|
|
1
|
+
import React from'react';import{makeStyles}from'@shopgate/engage/styles';import{Link,ConditionalWrapper}from'@shopgate/engage/components';import{ResponsiveWidgetImage}from'@shopgate/engage/page/components';import{useImageWidget}from"./hooks";var useStyles=makeStyles()(function(){return{link:{},image:{width:'100%'}};});/**
|
|
2
2
|
* The ImageWidget is used to display a image.
|
|
3
3
|
* @returns {JSX.Element}
|
|
4
|
-
*/var Image=function Image(){var _useStyles=useStyles(),cx=_useStyles.cx,classes=_useStyles.classes;var _useImageWidget=useImageWidget(),link=_useImageWidget.link,altText=_useImageWidget.altText,url=_useImageWidget.url;if(!url)return null;return React.createElement(ConditionalWrapper,{condition:!!link,wrapper:function wrapper(children){return React.createElement(Link,{href:link,className:cx(classes.link)},children);}},React.createElement(
|
|
4
|
+
*/var Image=function Image(){var _useStyles=useStyles(),cx=_useStyles.cx,classes=_useStyles.classes;var _useImageWidget=useImageWidget(),link=_useImageWidget.link,altText=_useImageWidget.altText,url=_useImageWidget.url;if(!url)return null;return React.createElement(ConditionalWrapper,{condition:!!link,wrapper:function wrapper(children){return React.createElement(Link,{href:link,className:cx(classes.link)},children);}},React.createElement(ResponsiveWidgetImage,{src:url,alt:altText,className:cx(classes.image)}));};export default Image;
|
|
@@ -1,9 +1,4 @@
|
|
|
1
1
|
import{useWidget}from'@shopgate/engage/page/hooks';import{useResponsiveValue}from'@shopgate/engage/styles';/**
|
|
2
|
-
* Parses the image URL to return a high resolution version if required.
|
|
3
|
-
* @param {string} url The original image URL.
|
|
4
|
-
* @param {boolean} useHighRes Whether to return a high resolution version.
|
|
5
|
-
* @returns {string} The parsed image URL.
|
|
6
|
-
*/var parseImageUrl=function parseImageUrl(url,useHighRes){if(!url||!useHighRes){return url;}var match=url.match(/^(.*)\.([^./]+)$/);return!match?url:"".concat(match[1],"@2x.").concat(match[2]);};/**
|
|
7
2
|
* @typedef {Object} ImageWidgetConfig
|
|
8
3
|
* @property {Object} image The image object.
|
|
9
4
|
* @property {string} image.url The image URL.
|
|
@@ -21,4 +16,4 @@ import{useWidget}from'@shopgate/engage/page/hooks';import{useResponsiveValue}fro
|
|
|
21
16
|
/**
|
|
22
17
|
* Hook to access the Image widget configuration and data.
|
|
23
18
|
* Handles responsive image URLs and alt texts.
|
|
24
|
-
*/export var useImageWidget=function useImageWidget(){/** @type {UseWidgetReturnType} */var _useWidget=useWidget(),config=_useWidget.config;var _ref=config||{},image=_ref.image,imageWide=_ref.imageWide,link=_ref.link,useImageWide=_ref.useImageWide;var
|
|
19
|
+
*/export var useImageWidget=function useImageWidget(){/** @type {UseWidgetReturnType} */var _useWidget=useWidget(),config=_useWidget.config;var _ref=config||{},image=_ref.image,imageWide=_ref.imageWide,link=_ref.link,useImageWide=_ref.useImageWide;var resolved=useResponsiveValue({xs:{url:image===null||image===void 0?void 0:image.url,altText:image===null||image===void 0?void 0:image.altText},md:{url:useImageWide&&(imageWide===null||imageWide===void 0?void 0:imageWide.url)?imageWide.url:image===null||image===void 0?void 0:image.url,altText:useImageWide&&(imageWide===null||imageWide===void 0?void 0:imageWide.altText)?imageWide.altText:image===null||image===void 0?void 0:image.altText}});return{url:resolved.url,altText:resolved.altText,link:link};};
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
function _defineProperty(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true});}else{obj[key]=value;}return obj;}import React from'react';import{makeStyles}from'@shopgate/engage/styles';import{Link,ConditionalWrapper,Grid}from'@shopgate/engage/components';import{useImageWidget}from"./hooks";import ResponsiveWidgetImage from"../../components/ResponsiveWidgetImage";var useStyles=makeStyles()(function(theme){return{imageContainer:{width:'100%',display:'flex',overflowX:'hidden',alignItems:'flex-start',flexWrap:'wrap'},image:{maxWidth:'100%',height:'auto',flexShrink:1,display:'block',width:'100%',objectFit:'contain'},itemContainerDense:_defineProperty(_defineProperty({},theme.breakpoints.down('md'),{flex:'1 1 33%'}),theme.breakpoints.up('md'),{flex:'1 1 16%'}),itemContainerDefault:_defineProperty(_defineProperty({},theme.breakpoints.down('md'),{flex:'1 1 50%'}),theme.breakpoints.up('md'),{flex:'1 1 25%'}),itemContainerNoWrap:{flex:' 1 1 0%'}};});/**
|
|
2
|
+
* The ImageRowWidget is used to display images in one or more rows.
|
|
3
|
+
* @returns {JSX.Element}
|
|
4
|
+
*/var ImageRow=function ImageRow(){var _useStyles=useStyles(),cx=_useStyles.cx,classes=_useStyles.classes;var _useImageWidget=useImageWidget(),images=_useImageWidget.images,imageWrapping=_useImageWidget.imageWrapping;if(images.length===0)return null;return React.createElement(Grid,{className:cx(classes.imageContainer),component:"div"},images.map(function(img){return React.createElement(Grid.Item,{key:img.url,component:"div",className:cx(_defineProperty(_defineProperty(_defineProperty({},classes.itemContainerDefault,imageWrapping==='responsiveDefault'),classes.itemContainerDense,imageWrapping==='responsiveDense'),classes.itemContainerNoWrap,imageWrapping==='responsiveNoWrap'))},React.createElement(ConditionalWrapper,{condition:!!img.link,wrapper:function wrapper(children){return React.createElement(Link,{href:img.link,className:cx(classes.image)},children);}},React.createElement(ResponsiveWidgetImage,{src:img.url,alt:img.altText,className:cx(classes.image)})));}));};export default ImageRow;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import{useWidget}from'@shopgate/engage/page/hooks';import{useMemo}from'react';/**
|
|
2
|
+
* @typedef {Object} ImageWidgetConfig
|
|
3
|
+
* @property {Array} images The images array.
|
|
4
|
+
* @property {string} imageWrapping The imageWrapping setting,
|
|
5
|
+
* one of: responsiveDefault | responsiveDense | responsiveNoWrap.
|
|
6
|
+
* @property {string} [link] The optional link URL.
|
|
7
|
+
*/ /**
|
|
8
|
+
* @typedef {ReturnType< typeof import('@shopgate/engage/page/hooks')
|
|
9
|
+
* .useWidget<ImageWidgetConfig> >} UseWidgetReturnType
|
|
10
|
+
*/ // eslint-disable-next-line valid-jsdoc
|
|
11
|
+
/**
|
|
12
|
+
* Hook to access the Image widget configuration and data.
|
|
13
|
+
* Handles responsive image URLs and alt texts.
|
|
14
|
+
*/export var useImageWidget=function useImageWidget(){/** @type {UseWidgetReturnType} */var _useWidget=useWidget(),config=_useWidget.config;var _ref=config||{},_ref$images=_ref.images,images=_ref$images===void 0?[]:_ref$images,imageWrapping=_ref.imageWrapping;var mappedImages=useMemo(function(){return images.map(function(_ref2){var image=_ref2.image,link=_ref2.link;var _ref3=image||{},url=_ref3.url,altText=_ref3.altText;return{url:url,altText:altText,link:link};}).filter(function(img){return img.url;});},[images]);return{images:mappedImages,imageWrapping:imageWrapping};};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export{default}from"./ImageRow";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
function _extends(){_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;};return _extends.apply(this,arguments);}import React from'react';import{makeStyles}from'@shopgate/engage/styles';import{Swiper,Link,ConditionalWrapper}from'@shopgate/engage/components';import{useImageSliderWidget}from"./hooks";var useStyles=makeStyles()({image:{touchAction:'none',width:'100%'}});/**
|
|
1
|
+
function _extends(){_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;};return _extends.apply(this,arguments);}import React from'react';import{makeStyles}from'@shopgate/engage/styles';import{Swiper,Link,ConditionalWrapper}from'@shopgate/engage/components';import{ResponsiveWidgetImage}from'@shopgate/engage/page/components';import{useImageSliderWidget}from"./hooks";var useStyles=makeStyles()({image:{touchAction:'none',width:'100%'}});/**
|
|
2
2
|
* The ImageSliderWidget is used to display an image slider.
|
|
3
3
|
* @returns {JSX.Element}
|
|
4
|
-
*/var ImageSliderWidget=function ImageSliderWidget(){var _useStyles=useStyles(),classes=_useStyles.classes;var _useImageSliderWidget=useImageSliderWidget(),slides=_useImageSliderWidget.slides,swiperProps=_useImageSliderWidget.swiperProps;if(slides.length===0){return null;}return React.createElement(Swiper,_extends({indicators:true},swiperProps),slides.map(function(slide){if(!slide.image.url){return null;}return React.createElement(Swiper.Item,{key:slide.image.url},React.createElement(ConditionalWrapper,{condition:!!slide.link,wrapper:function wrapper(children){return React.createElement(Link,{href:slide.link},children);}},React.createElement(
|
|
4
|
+
*/var ImageSliderWidget=function ImageSliderWidget(){var _useStyles=useStyles(),classes=_useStyles.classes;var _useImageSliderWidget=useImageSliderWidget(),slides=_useImageSliderWidget.slides,swiperProps=_useImageSliderWidget.swiperProps;if(slides.length===0){return null;}return React.createElement(Swiper,_extends({indicators:true},swiperProps),slides.map(function(slide){if(!slide.image.url){return null;}return React.createElement(Swiper.Item,{key:slide.image.url},React.createElement(ConditionalWrapper,{condition:!!slide.link,wrapper:function wrapper(children){return React.createElement(Link,{href:slide.link},children);}},React.createElement(ResponsiveWidgetImage,{className:classes.image,src:slide.image.url,alt:slide.image.altText||''})));}));};export default ImageSliderWidget;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import React from'react';import{ActionButton,I18n}from'@shopgate/engage/components';import{ProductGrid}from'@shopgate/engage/product/components';import{useWidgetProducts}from'@shopgate/engage/page/hooks';import{makeStyles}from'@shopgate/engage/styles';import{useProductListWidget}from"./hooks";var useStyles=makeStyles()({root:{// Prevent that the ActionButton margin messes with the layout of the sibling widgets
|
|
1
|
+
import React from'react';import{ActionButton,I18n}from'@shopgate/engage/components';import{ProductGrid}from'@shopgate/engage/product/components';import{useWidgetProducts}from'@shopgate/engage/page/hooks';import{makeStyles}from'@shopgate/engage/styles';import{useProductListWidget}from"./hooks";import WidgetHeadline from"../../components/WidgetHeadline";var useStyles=makeStyles()({root:{// Prevent that the ActionButton margin messes with the layout of the sibling widgets
|
|
2
2
|
overflow:'hidden'},grid:{'&&':{marginTop:0}}});/**
|
|
3
3
|
* The ProductListWidget is used to display product lists.
|
|
4
4
|
* @returns {JSX.Element}
|
|
5
|
-
*/var ProductListWidget=function ProductListWidget(){var _useStyles=useStyles(),classes=_useStyles.classes;var _useProductListWidget=useProductListWidget(),productsSearchType=_useProductListWidget.productsSearchType,productsSearchValue=_useProductListWidget.productsSearchValue,sort=_useProductListWidget.sort,productCount=_useProductListWidget.productCount,showLoadMore=_useProductListWidget.showLoadMore,flags=_useProductListWidget.flags;var _useWidgetProducts=useWidgetProducts({type:productsSearchType,value:productsSearchValue,limit:productCount,sort:sort}),fetchNext=_useWidgetProducts.fetchNext,hasNext=_useWidgetProducts.hasNext,isFetching=_useWidgetProducts.isFetching,results=_useWidgetProducts.results;return React.createElement("div",{className:classes.root},React.createElement(ProductGrid,{products:results,flags:flags,scope:"widgets",infiniteLoad:false,className:classes.grid}),hasNext&&showLoadMore&&React.createElement(ActionButton,{loading:isFetching,onClick:fetchNext},React.createElement(I18n.Text,{string:"common.load_more"})));};export default ProductListWidget;
|
|
5
|
+
*/var ProductListWidget=function ProductListWidget(){var _useStyles=useStyles(),classes=_useStyles.classes;var _useProductListWidget=useProductListWidget(),productsSearchType=_useProductListWidget.productsSearchType,productsSearchValue=_useProductListWidget.productsSearchValue,sort=_useProductListWidget.sort,productCount=_useProductListWidget.productCount,showLoadMore=_useProductListWidget.showLoadMore,flags=_useProductListWidget.flags,showHeadline=_useProductListWidget.showHeadline,headline=_useProductListWidget.headline;var _useWidgetProducts=useWidgetProducts({type:productsSearchType,value:productsSearchValue,limit:productCount,sort:sort}),fetchNext=_useWidgetProducts.fetchNext,hasNext=_useWidgetProducts.hasNext,isFetching=_useWidgetProducts.isFetching,results=_useWidgetProducts.results;return React.createElement("div",{className:classes.root},showHeadline&&headline&&results.length?React.createElement(WidgetHeadline,{headline:headline}):null,React.createElement(ProductGrid,{products:results,flags:flags,scope:"widgets",infiniteLoad:false,className:classes.grid}),hasNext&&showLoadMore&&React.createElement(ActionButton,{loading:isFetching,onClick:fetchNext},React.createElement(I18n.Text,{string:"common.load_more"})));};export default ProductListWidget;
|
|
@@ -10,10 +10,12 @@ import _camelCase from"lodash/camelCase";function _extends(){_extends=Object.ass
|
|
|
10
10
|
* @property {boolean} showName Whether to display product names
|
|
11
11
|
* @property {boolean} showPrice Whether to display product prices
|
|
12
12
|
* @property {boolean} showRating Whether to display product ratings
|
|
13
|
+
* @property {boolean} [showHeadline] Whether to show the headline.
|
|
14
|
+
* @property {Object} [headline] The headline to be displayed.
|
|
13
15
|
*/ /**
|
|
14
16
|
* @typedef {ReturnType< typeof import('@shopgate/engage/page/hooks')
|
|
15
17
|
* .useWidget<ProductListWidgetConfig> >} UseWidgetReturnType
|
|
16
18
|
*/ // eslint-disable-next-line valid-jsdoc
|
|
17
19
|
/**
|
|
18
20
|
* Hook to access the Product List widget configuration.
|
|
19
|
-
*/export var useProductListWidget=function useProductListWidget(){/** @type {UseWidgetReturnType} */var _useWidget=useWidget(),config=_useWidget.config;var products=config.products,productCount=config.productCount,sort=config.sort,_config$loadMoreButto=config.loadMoreButton,loadMoreButton=_config$loadMoreButto===void 0?false:_config$loadMoreButto,_config$showName=config.showName,showName=_config$showName===void 0?false:_config$showName,_config$showPrice=config.showPrice,showPrice=_config$showPrice===void 0?false:_config$showPrice,_config$showRating=config.showRating,showRating=_config$showRating===void 0?false:_config$showRating;var productSearchParams=useMemo(function(){return getProductSearchParamsFromProductsInputConfig(products);},[products]);var flags=useMemo(function(){return{name:showName,price:showPrice,reviews:showRating};},[showName,showPrice,showRating]);return _extends({},productSearchParams,{sort:_camelCase(sort),productCount:productCount,showLoadMore:loadMoreButton,flags:flags});};
|
|
21
|
+
*/export var useProductListWidget=function useProductListWidget(){/** @type {UseWidgetReturnType} */var _useWidget=useWidget(),config=_useWidget.config;var products=config.products,productCount=config.productCount,sort=config.sort,_config$loadMoreButto=config.loadMoreButton,loadMoreButton=_config$loadMoreButto===void 0?false:_config$loadMoreButto,_config$showName=config.showName,showName=_config$showName===void 0?false:_config$showName,_config$showPrice=config.showPrice,showPrice=_config$showPrice===void 0?false:_config$showPrice,_config$showRating=config.showRating,showRating=_config$showRating===void 0?false:_config$showRating,_config$showHeadline=config.showHeadline,showHeadline=_config$showHeadline===void 0?false:_config$showHeadline,headline=config.headline;var productSearchParams=useMemo(function(){return getProductSearchParamsFromProductsInputConfig(products);},[products]);var flags=useMemo(function(){return{name:showName,price:showPrice,reviews:showRating};},[showName,showPrice,showRating]);return _extends({},productSearchParams,{sort:_camelCase(sort),productCount:productCount,showLoadMore:loadMoreButton,flags:flags,showHeadline:showHeadline,headline:headline});};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
function _extends(){_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;};return _extends.apply(this,arguments);}function _defineProperty(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true});}else{obj[key]=value;}return obj;}import React,{useMemo}from'react';import{ProductSlider}from'@shopgate/engage/product/components';import{useWidgetProducts}from'@shopgate/engage/page/hooks';import{useTheme}from'@shopgate/engage/styles';import{useProductSliderWidget}from"./hooks";/**
|
|
1
|
+
function _extends(){_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;};return _extends.apply(this,arguments);}function _defineProperty(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true});}else{obj[key]=value;}return obj;}import React,{useMemo}from'react';import{ProductSlider}from'@shopgate/engage/product/components';import{useWidgetProducts}from'@shopgate/engage/page/hooks';import{useTheme}from'@shopgate/engage/styles';import{useProductSliderWidget}from"./hooks";import WidgetHeadline from"../../components/WidgetHeadline";/**
|
|
2
2
|
* The ProductSliderWidget is used to display a product slider.
|
|
3
3
|
* @returns {JSX.Element}
|
|
4
|
-
*/var ProductSliderWidget=function ProductSliderWidget(){var _useProductSliderWidg=useProductSliderWidget(),productsSearchType=_useProductSliderWidg.productsSearchType,productsSearchValue=_useProductSliderWidg.productsSearchValue,sort=_useProductSliderWidg.sort,productCount=_useProductSliderWidg.productCount,swiperProps=_useProductSliderWidg.swiperProps,productItemProps=_useProductSliderWidg.productItemProps,isPreview=_useProductSliderWidg.isPreview;var _useWidgetProducts=useWidgetProducts({type:productsSearchType,value:productsSearchValue,limit:productCount,sort:sort}),results=_useWidgetProducts.results;var theme=useTheme();var productIds=useMemo(function(){return results===null||results===void 0?void 0:results.map(function(result){return result.id;});},[results]);if(!productIds||!productIds.length){return null;}return React.createElement(ProductSlider,_extends({productIds:productIds,scope:"widgets",productItemProps:productItemProps,slidesPerView:2.3// Improves interaction with the slider in the CMS preview iframe
|
|
5
|
-
},isPreview?{touchStartPreventDefault:true}:{},{breakpoints:_defineProperty(_defineProperty(_defineProperty({},theme.breakpoints.values.sm,{slidesPerView:3.3}),theme.breakpoints.values.md,{slidesPerView:4.3}),theme.breakpoints.values.lg,{slidesPerView:5.3})},swiperProps));};export default ProductSliderWidget;
|
|
4
|
+
*/var ProductSliderWidget=function ProductSliderWidget(){var _useProductSliderWidg=useProductSliderWidget(),productsSearchType=_useProductSliderWidg.productsSearchType,productsSearchValue=_useProductSliderWidg.productsSearchValue,sort=_useProductSliderWidg.sort,productCount=_useProductSliderWidg.productCount,swiperProps=_useProductSliderWidg.swiperProps,productItemProps=_useProductSliderWidg.productItemProps,isPreview=_useProductSliderWidg.isPreview,showHeadline=_useProductSliderWidg.showHeadline,headline=_useProductSliderWidg.headline;var _useWidgetProducts=useWidgetProducts({type:productsSearchType,value:productsSearchValue,limit:productCount,sort:sort}),results=_useWidgetProducts.results;var theme=useTheme();var productIds=useMemo(function(){return results===null||results===void 0?void 0:results.map(function(result){return result.id;});},[results]);if(!productIds||!productIds.length){return null;}return React.createElement(React.Fragment,null,showHeadline&&headline&&productIds.length?React.createElement(WidgetHeadline,{headline:headline}):null,React.createElement(ProductSlider,_extends({productIds:productIds,scope:"widgets",productItemProps:productItemProps,slidesPerView:2.3// Improves interaction with the slider in the CMS preview iframe
|
|
5
|
+
},isPreview?{touchStartPreventDefault:true}:{},{breakpoints:_defineProperty(_defineProperty(_defineProperty({},theme.breakpoints.values.sm,{slidesPerView:3.3}),theme.breakpoints.values.md,{slidesPerView:4.3}),theme.breakpoints.values.lg,{slidesPerView:5.3})},swiperProps)));};export default ProductSliderWidget;
|
|
@@ -13,10 +13,12 @@ import _camelCase from"lodash/camelCase";function _extends(){_extends=Object.ass
|
|
|
13
13
|
* @property {boolean} [endlessSlider] Whether the slider should loop endlessly.
|
|
14
14
|
* @property {number} [sliderSpeed] The speed (in ms) for the slider autoplay.
|
|
15
15
|
* @property {boolean} [isPreview] Whether the widget is in preview mode.
|
|
16
|
+
* @property {boolean} [showHeadline] Whether to show the headline.
|
|
17
|
+
* @property {Object} [headline] The headline to be displayed.
|
|
16
18
|
*/ /**
|
|
17
19
|
* @typedef {ReturnType< typeof import('@shopgate/engage/page/hooks')
|
|
18
20
|
* .useWidget<ProductSliderWidgetConfig> >} UseWidgetReturnType
|
|
19
21
|
*/ // eslint-disable-next-line valid-jsdoc
|
|
20
22
|
/**
|
|
21
23
|
* Hook to access the Product Slider widget configuration.
|
|
22
|
-
*/export var useProductSliderWidget=function useProductSliderWidget(){/** @type {UseWidgetReturnType} */var _useWidget=useWidget(),config=_useWidget.config,isPreview=_useWidget.isPreview;var products=config.products,productCount=config.productCount,sort=config.sort,_config$showName=config.showName,showName=_config$showName===void 0?false:_config$showName,_config$showPrice=config.showPrice,showPrice=_config$showPrice===void 0?false:_config$showPrice,_config$showRating=config.showRating,showRating=_config$showRating===void 0?false:_config$showRating,_config$slideAutomati=config.slideAutomatic,slideAutomatic=_config$slideAutomati===void 0?true:_config$slideAutomati,_config$endlessSlider=config.endlessSlider,endlessSlider=_config$endlessSlider===void 0?true:_config$endlessSlider,_config$sliderSpeed=config.sliderSpeed,sliderSpeed=_config$sliderSpeed===void 0?7000:_config$sliderSpeed;var productSearchParams=useMemo(function(){return getProductSearchParamsFromProductsInputConfig(products);},[products]);var swiperProps=useMemo(function(){return{autoplay:slideAutomatic,delay:sliderSpeed,loop:endlessSlider};},[slideAutomatic,sliderSpeed,endlessSlider]);var productItemProps=useMemo(function(){return{hideName:!showName,hidePrice:!showPrice,hideRating:!showRating};},[showName,showPrice,showRating]);return _extends({},productSearchParams,{sort:_camelCase(sort),productCount:productCount,swiperProps:swiperProps,productItemProps:productItemProps,isPreview:isPreview});};
|
|
24
|
+
*/export var useProductSliderWidget=function useProductSliderWidget(){/** @type {UseWidgetReturnType} */var _useWidget=useWidget(),config=_useWidget.config,isPreview=_useWidget.isPreview;var products=config.products,productCount=config.productCount,sort=config.sort,_config$showName=config.showName,showName=_config$showName===void 0?false:_config$showName,_config$showPrice=config.showPrice,showPrice=_config$showPrice===void 0?false:_config$showPrice,_config$showRating=config.showRating,showRating=_config$showRating===void 0?false:_config$showRating,_config$slideAutomati=config.slideAutomatic,slideAutomatic=_config$slideAutomati===void 0?true:_config$slideAutomati,_config$endlessSlider=config.endlessSlider,endlessSlider=_config$endlessSlider===void 0?true:_config$endlessSlider,_config$sliderSpeed=config.sliderSpeed,sliderSpeed=_config$sliderSpeed===void 0?7000:_config$sliderSpeed,_config$showHeadline=config.showHeadline,showHeadline=_config$showHeadline===void 0?false:_config$showHeadline,headline=config.headline;var productSearchParams=useMemo(function(){return getProductSearchParamsFromProductsInputConfig(products);},[products]);var swiperProps=useMemo(function(){return{autoplay:slideAutomatic,delay:sliderSpeed,loop:endlessSlider};},[slideAutomatic,sliderSpeed,endlessSlider]);var productItemProps=useMemo(function(){return{hideName:!showName,hidePrice:!showPrice,hideRating:!showRating};},[showName,showPrice,showRating]);return _extends({},productSearchParams,{sort:_camelCase(sort),productCount:productCount,swiperProps:swiperProps,productItemProps:productItemProps,isPreview:isPreview,showHeadline:showHeadline,headline:headline});};
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import React from'react';import{HtmlSanitizer}from'@shopgate/engage/components';import{makeStyles}from'@shopgate/engage/styles';import{useRichTextWidget}from"./hooks";var useStyles=makeStyles()(function(){return{html:{'& > p:first-child':{marginTop:0},'& p':{marginTop:17,marginBottom:17},'ul, ol':{paddingLeft:'40px'},'ul li':{listStyleType:'disc'},'ol li':{listStyleType:'decimal'}}};});/**
|
|
2
|
+
* @returns {JSX.Element}
|
|
3
|
+
*/var RichText=function RichText(){var _useRichTextWidget=useRichTextWidget(),richText=_useRichTextWidget.richText;var _useStyles=useStyles(),cx=_useStyles.cx,classes=_useStyles.classes;if(!richText)return null;return React.createElement(HtmlSanitizer,{processStyles:true,settings:{html:richText},className:cx(classes.html)},richText);};export default RichText;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import{useWidget}from'@shopgate/engage/page/hooks';/**
|
|
2
|
+
* @typedef {Object} RichTextWidgetConfig
|
|
3
|
+
* @property {string} text The rich text content.
|
|
4
|
+
*/ /**
|
|
5
|
+
* @typedef {ReturnType< typeof import('@shopgate/engage/page/hooks')
|
|
6
|
+
* .useWidget<RichTextWidgetConfig> >} UseWidgetReturnType
|
|
7
|
+
*/ // eslint-disable-next-line valid-jsdoc
|
|
8
|
+
/**
|
|
9
|
+
* Hook to access the Image widget configuration and data.
|
|
10
|
+
*/export var useRichTextWidget=function useRichTextWidget(){/** @type {UseWidgetReturnType} */var _useWidget=useWidget(),config=_useWidget.config;return{richText:config===null||config===void 0?void 0:config.text};};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export{default}from"./RichText";
|
package/page/widgets/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export{default as PlaceholderWidget}from"./Placeholder";export{default as ProductListWidget}from"./ProductList";export{default as CategoryListWidget}from"./CategoryList";export{default as HtmlWidget}from"./HTML";export{default as ProductSliderWidget}from"./ProductSlider";export{default as HeadlineWidget}from"./Headline";export{default as ImageWidget}from"./Image";export{default as ImageSliderWidget}from"./ImageSlider";
|
|
1
|
+
export{default as PlaceholderWidget}from"./Placeholder";export{default as ProductListWidget}from"./ProductList";export{default as CategoryListWidget}from"./CategoryList";export{default as HtmlWidget}from"./HTML";export{default as ProductSliderWidget}from"./ProductSlider";export{default as HeadlineWidget}from"./Headline";export{default as ImageWidget}from"./Image";export{default as ImageRowWidget}from"./ImageRow";export{default as ImageSliderWidget}from"./ImageSlider";export{default as RichTextWidget}from"./RichText";
|
|
@@ -1,7 +1,4 @@
|
|
|
1
1
|
{
|
|
2
|
-
"@shopgate/widgetsInternal/Placeholder": {
|
|
3
|
-
"path": "@shopgate/engage/page/widgets/Placeholder"
|
|
4
|
-
},
|
|
5
2
|
"@shopgate/widgets/productListWidget": {
|
|
6
3
|
"path": "@shopgate/engage/page/widgets/ProductList"
|
|
7
4
|
},
|
|
@@ -20,7 +17,16 @@
|
|
|
20
17
|
"@shopgate/widgets/imageWidget": {
|
|
21
18
|
"path": "@shopgate/engage/page/widgets/Image"
|
|
22
19
|
},
|
|
20
|
+
"@shopgate/widgets/imageRowWidget": {
|
|
21
|
+
"path": "@shopgate/engage/page/widgets/ImageRow"
|
|
22
|
+
},
|
|
23
23
|
"@shopgate/widgets/imageSliderWidget": {
|
|
24
24
|
"path": "@shopgate/engage/page/widgets/ImageSlider"
|
|
25
|
+
},
|
|
26
|
+
"@shopgate/widgets/richTextWidget": {
|
|
27
|
+
"path": "@shopgate/engage/page/widgets/RichText"
|
|
28
|
+
},
|
|
29
|
+
"@shopgate/widgetsInternal/Placeholder": {
|
|
30
|
+
"path": "@shopgate/engage/page/widgets/Placeholder"
|
|
25
31
|
}
|
|
26
32
|
}
|