@shopgate/pwa-ui-shared 7.30.0-alpha.6 → 7.30.0-alpha.8

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.
Files changed (266) hide show
  1. package/AccordionContainer/index.js +39 -5
  2. package/AccordionContainer/spec.js +25 -2
  3. package/ActionButton/index.js +63 -7
  4. package/ActionButton/spec.js +59 -2
  5. package/ActionButton/style.js +22 -1
  6. package/AddToCartButton/index.js +184 -27
  7. package/AddToCartButton/mock.js +18 -4
  8. package/AddToCartButton/spec.js +51 -2
  9. package/AddToCartButton/style.js +127 -11
  10. package/Availability/index.js +34 -2
  11. package/Availability/spec.js +41 -1
  12. package/Availability/style.js +19 -1
  13. package/Button/index.js +76 -5
  14. package/Button/spec.js +33 -1
  15. package/Button/style.js +130 -21
  16. package/ButtonLink/connector.js +11 -2
  17. package/ButtonLink/index.js +44 -6
  18. package/ButtonLink/spec.js +23 -1
  19. package/Card/index.js +19 -2
  20. package/Card/style.js +11 -1
  21. package/CardList/components/Item/index.js +26 -2
  22. package/CardList/components/Item/style.js +7 -1
  23. package/CardList/index.js +34 -3
  24. package/CartTotalLine/components/Amount/index.js +28 -2
  25. package/CartTotalLine/components/Amount/style.js +8 -1
  26. package/CartTotalLine/components/Hint/index.js +23 -2
  27. package/CartTotalLine/components/Hint/style.js +12 -1
  28. package/CartTotalLine/components/Label/index.js +36 -2
  29. package/CartTotalLine/components/Label/style.js +17 -1
  30. package/CartTotalLine/components/Spacer/index.js +16 -2
  31. package/CartTotalLine/index.js +39 -2
  32. package/CartTotalLine/style.js +31 -1
  33. package/Checkbox/index.js +31 -2
  34. package/Checkbox/style.js +18 -1
  35. package/Chip/index.js +61 -2
  36. package/Chip/spec.js +24 -1
  37. package/Chip/style.js +71 -3
  38. package/ContextMenu/ContextMenu.hooks.js +6 -2
  39. package/ContextMenu/ContextMenuProvider.context.js +9 -3
  40. package/ContextMenu/ContextMenuProvider.js +21 -2
  41. package/ContextMenu/components/Item/index.js +67 -5
  42. package/ContextMenu/components/Item/style.js +32 -3
  43. package/ContextMenu/components/Position/index.js +61 -10
  44. package/ContextMenu/components/Position/style.js +11 -1
  45. package/ContextMenu/index.js +124 -3
  46. package/ContextMenu/spec.js +101 -2
  47. package/ContextMenu/style.js +45 -1
  48. package/Dialog/components/BasicDialog/index.js +5 -1
  49. package/Dialog/components/HtmlContentDialog/index.js +22 -2
  50. package/Dialog/components/HtmlContentDialog/spec.js +59 -1
  51. package/Dialog/components/PipelineErrorDialog/index.js +114 -25
  52. package/Dialog/components/PipelineErrorDialog/spec.js +92 -12
  53. package/Dialog/components/TextMessageDialog/index.js +28 -2
  54. package/Dialog/components/TextMessageDialog/spec.js +59 -1
  55. package/Dialog/components/VariantSelectModal/connector.js +11 -2
  56. package/Dialog/components/VariantSelectModal/index.js +65 -6
  57. package/Dialog/components/VariantSelectModal/spec.js +51 -2
  58. package/Dialog/constants.js +6 -1
  59. package/Dialog/index.js +114 -7
  60. package/Dialog/spec.js +81 -3
  61. package/DiscountBadge/index.js +30 -2
  62. package/DiscountBadge/spec.js +19 -1
  63. package/DiscountBadge/style.js +34 -2
  64. package/FavoritesButton/connector.js +18 -3
  65. package/FavoritesButton/index.js +118 -15
  66. package/FavoritesButton/mock.js +50 -4
  67. package/FavoritesButton/spec.js +120 -2
  68. package/FavoritesButton/style.js +26 -1
  69. package/Form/Builder/builders/buildCountryList.js +40 -6
  70. package/Form/Builder/builders/buildFormDefaults.js +35 -6
  71. package/Form/Builder/builders/buildFormElements.js +68 -10
  72. package/Form/Builder/builders/buildProvinceList.js +19 -2
  73. package/Form/Builder/builders/buildValidationErrorList.js +7 -2
  74. package/Form/Builder/classes/ActionListener/constants.js +22 -2
  75. package/Form/Builder/classes/ActionListener/index.js +441 -93
  76. package/Form/Builder/classes/ActionListener/spec.js +321 -19
  77. package/Form/Builder/components/CheckboxElement.js +35 -3
  78. package/Form/Builder/components/CountryElement.js +40 -3
  79. package/Form/Builder/components/ProvinceElement.js +40 -3
  80. package/Form/Builder/components/RadioElement.js +41 -3
  81. package/Form/Builder/components/SelectElement.js +39 -3
  82. package/Form/Builder/components/TextElement.js +49 -4
  83. package/Form/Builder/elementTypes.js +11 -1
  84. package/Form/Builder/index.js +298 -52
  85. package/Form/Builder/iso-3166-2.js +4943 -1
  86. package/Form/Builder/spec.js +300 -16
  87. package/Form/Checkbox/index.js +66 -4
  88. package/Form/Checkbox/style.js +25 -2
  89. package/Form/InfoField/index.js +50 -2
  90. package/Form/InfoField/spec.js +9 -1
  91. package/Form/InfoField/style.js +11 -1
  92. package/Form/Password/index.js +51 -6
  93. package/Form/Password/spec.js +34 -1
  94. package/Form/Password/style.js +11 -1
  95. package/Form/RadioGroup/components/Item/index.js +59 -3
  96. package/Form/RadioGroup/components/Item/style.js +32 -2
  97. package/Form/RadioGroup/index.js +101 -9
  98. package/Form/RadioGroup/spec.js +83 -3
  99. package/Form/RadioGroup/style.js +18 -2
  100. package/Form/Select/index.js +158 -10
  101. package/Form/Select/spec.js +36 -5
  102. package/Form/Select/style.js +27 -1
  103. package/Form/SelectContextChoices/index.js +77 -3
  104. package/Form/SelectContextChoices/spec.js +33 -4
  105. package/Form/SelectContextChoices/style.js +23 -1
  106. package/Form/TextField/index.js +92 -8
  107. package/Form/TextField/spec.js +110 -1
  108. package/Form/TextField/style.js +66 -8
  109. package/Form/index.js +54 -13
  110. package/FormElement/components/ErrorText/index.js +31 -2
  111. package/FormElement/components/ErrorText/style.js +13 -1
  112. package/FormElement/components/Label/index.js +35 -2
  113. package/FormElement/components/Label/style.js +76 -8
  114. package/FormElement/components/Placeholder/index.js +26 -2
  115. package/FormElement/components/Placeholder/style.js +48 -6
  116. package/FormElement/components/Underline/index.js +18 -2
  117. package/FormElement/components/Underline/style.js +51 -4
  118. package/FormElement/index.js +91 -6
  119. package/FormElement/spec.js +67 -2
  120. package/FormElement/style.js +13 -2
  121. package/Glow/index.js +90 -7
  122. package/Glow/spec.js +9 -1
  123. package/Glow/style.js +18 -1
  124. package/IndicatorCircle/index.js +33 -3
  125. package/IndicatorCircle/spec.js +28 -1
  126. package/IndicatorCircle/style.js +57 -3
  127. package/LoadingIndicator/index.js +29 -2
  128. package/LoadingIndicator/style.js +20 -1
  129. package/Manufacturer/index.js +20 -2
  130. package/Manufacturer/style.js +5 -1
  131. package/MessageBar/index.js +36 -2
  132. package/MessageBar/spec.js +79 -1
  133. package/MessageBar/style.js +38 -1
  134. package/NoResults/components/Icon/index.js +130 -2
  135. package/NoResults/components/Icon/style.js +17 -1
  136. package/NoResults/index.js +46 -2
  137. package/NoResults/style.js +31 -1
  138. package/Placeholder/index.js +25 -3
  139. package/Placeholder/style.js +11 -1
  140. package/PlaceholderLabel/index.js +27 -2
  141. package/PlaceholderLabel/spec.js +19 -1
  142. package/PlaceholderLabel/style.js +12 -1
  143. package/PlaceholderParagraph/index.js +36 -2
  144. package/PlaceholderParagraph/spec.js +19 -1
  145. package/Price/index.js +88 -7
  146. package/Price/style.js +22 -1
  147. package/PriceInfo/index.js +20 -2
  148. package/PriceInfo/style.js +5 -1
  149. package/PriceStriked/index.js +83 -12
  150. package/PriceStriked/style.js +33 -3
  151. package/ProductProperties/index.js +32 -2
  152. package/ProgressBar/index.js +101 -13
  153. package/ProgressBar/spec.js +13 -1
  154. package/ProgressBar/style.js +83 -2
  155. package/RadioButton/index.js +18 -2
  156. package/RadioButton/spec.js +21 -1
  157. package/RadioButton/style.js +21 -1
  158. package/RatingNumber/index.js +29 -2
  159. package/RatingStars/constants.js +2 -1
  160. package/RatingStars/index.js +130 -12
  161. package/RatingStars/spec.js +90 -3
  162. package/RatingStars/style.js +51 -2
  163. package/Ripple/components/RippleAnimation/index.js +88 -6
  164. package/Ripple/index.js +218 -40
  165. package/Ripple/style.js +18 -1
  166. package/RippleButton/index.js +52 -5
  167. package/RippleButton/spec.js +45 -1
  168. package/ScannerOverlay/components/CameraOverlay/index.js +13 -2
  169. package/ScannerOverlay/components/CameraOverlay/style.js +41 -1
  170. package/ScannerOverlay/components/ScannerBar/components/FlashlightButton/index.js +34 -2
  171. package/ScannerOverlay/components/ScannerBar/components/FlashlightButton/style.js +28 -1
  172. package/ScannerOverlay/components/ScannerBar/components/ScannerInstructions/index.js +11 -2
  173. package/ScannerOverlay/components/ScannerBar/index.js +31 -2
  174. package/ScannerOverlay/components/ScannerBar/style.js +20 -1
  175. package/ScannerOverlay/index.js +47 -7
  176. package/Sheet/components/Header/components/SearchBar/index.js +46 -2
  177. package/Sheet/components/Header/components/SearchBar/spec.js +21 -3
  178. package/Sheet/components/Header/components/SearchBar/style.js +47 -1
  179. package/Sheet/components/Header/index.js +75 -7
  180. package/Sheet/components/Header/spec.js +14 -1
  181. package/Sheet/components/Header/style.js +50 -1
  182. package/Sheet/index.js +170 -17
  183. package/Sheet/spec.js +85 -5
  184. package/Sheet/style.js +143 -2
  185. package/TaxDisclaimer/index.js +34 -4
  186. package/TaxDisclaimer/spec.js +31 -3
  187. package/TaxDisclaimer/style.js +9 -1
  188. package/TextField/components/ErrorText/index.js +33 -2
  189. package/TextField/components/ErrorText/style.js +25 -3
  190. package/TextField/components/FormElement/index.js +19 -2
  191. package/TextField/components/FormElement/style.js +32 -4
  192. package/TextField/components/Hint/index.js +21 -2
  193. package/TextField/components/Hint/style.js +40 -5
  194. package/TextField/components/Label/index.js +32 -3
  195. package/TextField/components/Label/style.js +68 -8
  196. package/TextField/components/Underline/index.js +19 -2
  197. package/TextField/components/Underline/style.js +51 -4
  198. package/TextField/index.js +189 -27
  199. package/TextField/spec.js +128 -3
  200. package/TextField/style.js +34 -4
  201. package/ToggleIcon/index.js +58 -8
  202. package/ToggleIcon/spec.js +35 -1
  203. package/icons/AccountBoxIcon.js +11 -2
  204. package/icons/AddMoreIcon.js +11 -2
  205. package/icons/ArrowDropIcon.js +11 -2
  206. package/icons/ArrowIcon.js +21 -2
  207. package/icons/BarcodeScannerIcon.js +11 -2
  208. package/icons/BoxIcon.js +11 -2
  209. package/icons/BrowseIcon.js +11 -2
  210. package/icons/BurgerIcon.js +11 -2
  211. package/icons/CalendarIcon.js +15 -3
  212. package/icons/CartCouponIcon.js +72 -2
  213. package/icons/CartIcon.js +11 -2
  214. package/icons/CartPlusIcon.js +11 -2
  215. package/icons/CheckIcon.js +11 -2
  216. package/icons/CheckedIcon.js +11 -2
  217. package/icons/ChevronIcon.js +11 -2
  218. package/icons/CreditCardIcon.js +11 -2
  219. package/icons/CrossIcon.js +11 -2
  220. package/icons/DescriptionIcon.js +11 -2
  221. package/icons/FilterIcon.js +11 -2
  222. package/icons/FlashDisabledIcon.js +11 -2
  223. package/icons/FlashEnabledIcon.js +11 -2
  224. package/icons/GridIcon.js +11 -2
  225. package/icons/HeartIcon.js +11 -2
  226. package/icons/HeartOutlineIcon.js +11 -2
  227. package/icons/HeartPlusIcon.js +12 -2
  228. package/icons/HeartPlusOutlineIcon.js +12 -2
  229. package/icons/HomeIcon.js +11 -2
  230. package/icons/InfoIcon.js +11 -2
  231. package/icons/InfoOutlineIcon.js +11 -2
  232. package/icons/ListIcon.js +11 -2
  233. package/icons/LocalShippingIcon.js +11 -2
  234. package/icons/LocationIcon.js +13 -3
  235. package/icons/LocatorIcon.js +11 -2
  236. package/icons/LockIcon.js +11 -2
  237. package/icons/LogoutIcon.js +11 -2
  238. package/icons/MagnifierIcon.js +11 -2
  239. package/icons/MapMarkerIcon.js +24 -3
  240. package/icons/MoreIcon.js +11 -2
  241. package/icons/MoreVertIcon.js +11 -2
  242. package/icons/NotificationIcon.js +14 -3
  243. package/icons/PersonIcon.js +12 -2
  244. package/icons/PhoneIcon.js +13 -3
  245. package/icons/PlaceholderIcon.js +11 -2
  246. package/icons/RadioCheckedIcon.js +11 -2
  247. package/icons/RadioUncheckedIcon.js +11 -2
  248. package/icons/SecurityIcon.js +11 -2
  249. package/icons/ShippingMethodIcon.js +18 -3
  250. package/icons/ShoppingCartIcon.js +11 -2
  251. package/icons/SortIcon.js +11 -2
  252. package/icons/StarHalfIcon.js +18 -2
  253. package/icons/StarIcon.js +18 -2
  254. package/icons/StarOutlineIcon.js +11 -2
  255. package/icons/StopIcon.js +11 -2
  256. package/icons/TickIcon.js +11 -2
  257. package/icons/TimeIcon.js +14 -3
  258. package/icons/TrashIcon.js +11 -2
  259. package/icons/TrashOutlineIcon.js +12 -2
  260. package/icons/UncheckedIcon.js +11 -2
  261. package/icons/ViewListIcon.js +11 -2
  262. package/icons/VisibilityIcon.js +11 -2
  263. package/icons/VisibilityOffIcon.js +11 -2
  264. package/icons/WarningIcon.js +11 -2
  265. package/index.js +13 -1
  266. package/package.json +5 -5
package/Chip/style.js CHANGED
@@ -1,10 +1,78 @@
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;}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{css}from'glamor';import{responsiveMediaQuery}from'@shopgate/engage/styles';import{hasNewServices}from'@shopgate/engage/core/helpers';import{themeConfig}from'@shopgate/engage';/**
1
+ import { css } from 'glamor';
2
+ import { responsiveMediaQuery } from '@shopgate/engage/styles';
3
+ import { hasNewServices } from '@shopgate/engage/core/helpers';
4
+ import { themeConfig } from '@shopgate/engage';
5
+
6
+ /**
2
7
  * Gets a basic style object for the chip layout.
3
8
  * @param {boolean} hasRemoveButton Whether this chip has a remove button.
4
9
  * @returns {Object} The style object.
5
- */var chipBase=function chipBase(){var hasRemoveButton=arguments.length>0&&arguments[0]!==undefined?arguments[0]:true;return{display:'flex',alignItems:'center',borderRadius:26,outline:0,height:26,paddingRight:themeConfig.variables.gap.small,paddingLeft:themeConfig.variables.gap.small*(hasRemoveButton?0.5:1),marginRight:5,marginTop:4,marginBottom:4,minWidth:0};};/**
10
+ */
11
+ const chipBase = (hasRemoveButton = true) => ({
12
+ display: 'flex',
13
+ alignItems: 'center',
14
+ borderRadius: 26,
15
+ outline: 0,
16
+ height: 26,
17
+ paddingRight: themeConfig.variables.gap.small,
18
+ paddingLeft: themeConfig.variables.gap.small * (hasRemoveButton ? 0.5 : 1),
19
+ marginRight: 5,
20
+ marginTop: 4,
21
+ marginBottom: 4,
22
+ minWidth: 0
23
+ });
24
+
25
+ /**
6
26
  * Gets a style class for the chip layout.
7
27
  * @param {boolean} hasRemoveButton Whether this chip has a remove button.
8
28
  * @param {boolean} inverted Whether the colors of the chip are inverted.
9
29
  * @returns {string} The style class name.
10
- */var chip=function chip(){var hasRemoveButton=arguments.length>0&&arguments[0]!==undefined?arguments[0]:true;var inverted=arguments.length>1&&arguments[1]!==undefined?arguments[1]:false;return css(_extends({},chipBase(hasRemoveButton),{},hasNewServices()?{backgroundColor:inverted?'var(--color-primary)':'var(--color-primary-contrast)',color:inverted?'var(--color-primary-contrast)':'var(--color-primary)'}:{backgroundColor:inverted?'var(--color-secondary)':'var(--color-secondary-contrast)',color:inverted?'var(--color-secondary-contrast)':'var(--color-secondary)','--color-text-high-emphasis':inverted?'var(--color-secondary-contrast)':'var(--color-secondary)'})).toString();};var removeButton=css(_defineProperty({flexShrink:0,padding:0},responsiveMediaQuery('>xs',{webOnly:true}),{padding:'0 5px',fontSize:'1.125rem'})).toString();var name=css(_defineProperty({paddingLeft:themeConfig.variables.gap.small*0.5,paddingRight:themeConfig.variables.gap.small*0.5,paddingTop:3,paddingBottom:3,fontSize:12,fontWeight:500,textOverflow:'ellipsis',maxWidth:'100%',whiteSpace:'nowrap',overflow:'hidden',display:'block',lineHeight:'1',color:'inherit'},responsiveMediaQuery('>xs',{webOnly:true}),{fontSize:'0.875rem',lineHeight:'1.25rem',padding:'6px 8px 6px 0'})).toString();export default{chip:chip,removeButton:removeButton,name:name};
30
+ */
31
+ const chip = (hasRemoveButton = true, inverted = false) => css({
32
+ ...chipBase(hasRemoveButton),
33
+ ...(hasNewServices() ? {
34
+ backgroundColor: inverted ? 'var(--color-primary)' : 'var(--color-primary-contrast)',
35
+ color: inverted ? 'var(--color-primary-contrast)' : 'var(--color-primary)'
36
+ } : {
37
+ backgroundColor: inverted ? 'var(--color-secondary)' : 'var(--color-secondary-contrast)',
38
+ color: inverted ? 'var(--color-secondary-contrast)' : 'var(--color-secondary)',
39
+ '--color-text-high-emphasis': inverted ? 'var(--color-secondary-contrast)' : 'var(--color-secondary)'
40
+ })
41
+ }).toString();
42
+ const removeButton = css({
43
+ flexShrink: 0,
44
+ padding: 0,
45
+ [responsiveMediaQuery('>xs', {
46
+ webOnly: true
47
+ })]: {
48
+ padding: '0 5px',
49
+ fontSize: '1.125rem'
50
+ }
51
+ }).toString();
52
+ const name = css({
53
+ paddingLeft: themeConfig.variables.gap.small * 0.5,
54
+ paddingRight: themeConfig.variables.gap.small * 0.5,
55
+ paddingTop: 3,
56
+ paddingBottom: 3,
57
+ fontSize: 12,
58
+ fontWeight: 500,
59
+ textOverflow: 'ellipsis',
60
+ maxWidth: '100%',
61
+ whiteSpace: 'nowrap',
62
+ overflow: 'hidden',
63
+ display: 'block',
64
+ lineHeight: '1',
65
+ color: 'inherit',
66
+ [responsiveMediaQuery('>xs', {
67
+ webOnly: true
68
+ })]: {
69
+ fontSize: '0.875rem',
70
+ lineHeight: '1.25rem',
71
+ padding: '6px 8px 6px 0'
72
+ }
73
+ }).toString();
74
+ export default {
75
+ chip,
76
+ removeButton,
77
+ name
78
+ };
@@ -1,4 +1,8 @@
1
- import{useContext}from'react';import ContextMenuContext from"./ContextMenuProvider.context";// eslint-disable-next-line valid-jsdoc
1
+ import { useContext } from 'react';
2
+ import ContextMenuContext from "./ContextMenuProvider.context";
3
+
4
+ // eslint-disable-next-line valid-jsdoc
2
5
  /**
3
6
  * Returns the value of the context menu provider state.
4
- */export var useContextMenu=function useContextMenu(){return useContext(ContextMenuContext);};
7
+ */
8
+ export const useContextMenu = () => useContext(ContextMenuContext);
@@ -1,7 +1,13 @@
1
- import{createContext}from'react';/**
1
+ import { createContext } from 'react';
2
+
3
+ /**
2
4
  * @typedef {Object} ContextMenuContextType
3
5
  * @property {(event: React.MouseEvent<HTMLButtonElement>) => void} handleMenuToggle
4
6
  * Toggles visibility of the ContextMenu.
5
- */ /**
7
+ */
8
+
9
+ /**
6
10
  * @type {ContextMenuContextType}
7
- */var initialContext={};export default createContext(initialContext);
11
+ */
12
+ const initialContext = {};
13
+ export default /*#__PURE__*/createContext(initialContext);
@@ -1,8 +1,27 @@
1
- import React,{useMemo}from'react';import PropTypes from'prop-types';import Context from"./ContextMenuProvider.context";/**
1
+ import React, { useMemo } from 'react';
2
+ import PropTypes from 'prop-types';
3
+ import Context from "./ContextMenuProvider.context";
4
+
5
+ /**
2
6
  * The Context Menu Provider
3
7
  *
4
8
  * @param {Object} props The component props.
5
9
  * @param {Object} props.children The component props.
6
10
  * @param {Object} props.handleMenuToggle Toggles visibility of the ContextMenu.
7
11
  * @returns {JSX}
8
- */var ContextMenuProvider=function ContextMenuProvider(_ref){var children=_ref.children,handleMenuToggle=_ref.handleMenuToggle;var value=useMemo(function(){return{handleMenuToggle:handleMenuToggle};},[handleMenuToggle]);return React.createElement(Context.Provider,{value:value},children);};ContextMenuProvider.defaultProps={handleMenuToggle:function handleMenuToggle(){}};export default ContextMenuProvider;
12
+ */
13
+ const ContextMenuProvider = ({
14
+ children,
15
+ handleMenuToggle
16
+ }) => {
17
+ const value = useMemo(() => ({
18
+ handleMenuToggle
19
+ }), [handleMenuToggle]);
20
+ return /*#__PURE__*/React.createElement(Context.Provider, {
21
+ value: value
22
+ }, children);
23
+ };
24
+ ContextMenuProvider.defaultProps = {
25
+ handleMenuToggle: () => {}
26
+ };
27
+ export default ContextMenuProvider;
@@ -1,16 +1,78 @@
1
- import React,{useCallback}from'react';import PropTypes from'prop-types';import noop from'lodash/noop';import classNames from'classnames';import Glow from"../../../Glow";import{getItemClass}from"./style";import{useContextMenu}from"../../ContextMenu.hooks";/**
1
+ import React, { useCallback } from 'react';
2
+ import PropTypes from 'prop-types';
3
+ import noop from 'lodash/noop';
4
+ import classNames from 'classnames';
5
+ import Glow from "../../../Glow";
6
+ import { getItemClass } from "./style";
7
+ import { useContextMenu } from "../../ContextMenu.hooks";
8
+
9
+ /**
2
10
  * A delay in ms after that the closeMenu callback gets triggered.
3
11
  * @type {number}
4
- */var CLOSE_DELAY=250;/**
12
+ */
13
+ const CLOSE_DELAY = 250;
14
+
15
+ /**
5
16
  * The Context Menu Item component.
6
17
  * @param {Object} props The component props.
7
18
  * @returns {JSX.Element}
8
- */var Item=function Item(_ref){var children=_ref.children,onClick=_ref.onClick,disabled=_ref.disabled,autoClose=_ref.autoClose,className=_ref.className;var _useContextMenu=useContextMenu(),handleMenuToggle=_useContextMenu.handleMenuToggle;/**
19
+ */
20
+ const Item = ({
21
+ children,
22
+ onClick,
23
+ disabled,
24
+ autoClose,
25
+ className
26
+ }) => {
27
+ const {
28
+ handleMenuToggle
29
+ } = useContextMenu();
30
+
31
+ /**
9
32
  * Handles the click event.
10
33
  * @param {Event} event The click event.
11
34
  * @returns {void}
12
- */var handleClick=useCallback(function(event){event.persist();setTimeout(function(){if(autoClose){handleMenuToggle(event);}setTimeout(function(){onClick(event);},0);},autoClose?CLOSE_DELAY:0);},[autoClose,handleMenuToggle,onClick]);/**
35
+ */
36
+ const handleClick = useCallback(event => {
37
+ event.persist();
38
+ setTimeout(() => {
39
+ if (autoClose) {
40
+ handleMenuToggle(event);
41
+ }
42
+ setTimeout(() => {
43
+ onClick(event);
44
+ }, 0);
45
+ }, autoClose ? CLOSE_DELAY : 0);
46
+ }, [autoClose, handleMenuToggle, onClick]);
47
+
48
+ /**
13
49
  * Handles the keypress event for screen readers.
14
50
  * @param {Event} event The click event.
15
51
  * @returns {void}
16
- */var handleKeyPress=useCallback(function(event){if(event.key==='Enter'||event.key===' '){event.preventDefault();handleClick(event);}},[handleClick]);return React.createElement(Glow,{disabled:disabled},React.createElement("div",{className:classNames(getItemClass(disabled),className),onClick:disabled?noop:handleClick,"data-test-id":"contextMenuButton","aria-disabled":disabled,role:"button",tabIndex:disabled?-1:0,onKeyDown:!disabled?handleKeyPress:undefined},children));};Item.defaultProps={autoClose:true,children:null,className:'',onClick:function onClick(){},disabled:false};export default Item;
52
+ */
53
+ const handleKeyPress = useCallback(event => {
54
+ if (event.key === 'Enter' || event.key === ' ') {
55
+ event.preventDefault();
56
+ handleClick(event);
57
+ }
58
+ }, [handleClick]);
59
+ return /*#__PURE__*/React.createElement(Glow, {
60
+ disabled: disabled
61
+ }, /*#__PURE__*/React.createElement("div", {
62
+ className: classNames(getItemClass(disabled), className),
63
+ onClick: disabled ? noop : handleClick,
64
+ "data-test-id": "contextMenuButton",
65
+ "aria-disabled": disabled,
66
+ role: "button",
67
+ tabIndex: disabled ? -1 : 0,
68
+ onKeyDown: !disabled ? handleKeyPress : undefined
69
+ }, children));
70
+ };
71
+ Item.defaultProps = {
72
+ autoClose: true,
73
+ children: null,
74
+ className: '',
75
+ onClick: () => {},
76
+ disabled: false
77
+ };
78
+ export default Item;
@@ -1,5 +1,34 @@
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{css}from'glamor';import Color from'color';import{themeConfig}from'@shopgate/pwa-common/helpers/config';import{getCSSCustomProp}from'@shopgate/engage/styles';/**
1
+ import { css } from 'glamor';
2
+ import Color from 'color';
3
+ import { themeConfig } from '@shopgate/pwa-common/helpers/config';
4
+ import { getCSSCustomProp } from '@shopgate/engage/styles';
5
+
6
+ /**
2
7
  * Get the item class.
3
- * @param {bool} disabled Disabled.
8
+ * @param {boolean} disabled Disabled.
4
9
  * @returns {string}
5
- */export var getItemClass=function getItemClass(disabled){var background=themeConfig.colors.shade8;var customPropColor=getCSSCustomProp('--color-primary');if(customPropColor){background=Color(customPropColor).alpha(0.04);}return css(_extends({position:'relative',whiteSpace:'nowrap',marginBottom:2,padding:"".concat(themeConfig.variables.gap.big*0.875,"px ").concat(themeConfig.variables.gap.big*1.375,"px"),lineHeight:1,zIndex:1,color:disabled?'var(--color-text-low-emphasis)':'inherits'},!disabled?{cursor:'pointer',':hover':{background:background}}:{cursor:'default'})).toString();};
10
+ */
11
+ export const getItemClass = disabled => {
12
+ let background = themeConfig.colors.shade8;
13
+ const customPropColor = getCSSCustomProp('--color-primary');
14
+ if (customPropColor) {
15
+ background = Color(customPropColor).alpha(0.04);
16
+ }
17
+ return css({
18
+ position: 'relative',
19
+ whiteSpace: 'nowrap',
20
+ marginBottom: 2,
21
+ padding: `${themeConfig.variables.gap.big * 0.875}px ${themeConfig.variables.gap.big * 1.375}px`,
22
+ lineHeight: 1,
23
+ zIndex: 1,
24
+ color: disabled ? 'var(--color-text-low-emphasis)' : 'inherits',
25
+ ...(!disabled ? {
26
+ cursor: 'pointer',
27
+ ':hover': {
28
+ background
29
+ }
30
+ } : {
31
+ cursor: 'default'
32
+ })
33
+ }).toString();
34
+ };
@@ -1,16 +1,67 @@
1
- function _typeof(obj){if(typeof Symbol==="function"&&typeof Symbol.iterator==="symbol"){_typeof=function _typeof(obj){return typeof obj;};}else{_typeof=function _typeof(obj){return obj&&typeof Symbol==="function"&&obj.constructor===Symbol&&obj!==Symbol.prototype?"symbol":typeof obj;};}return _typeof(obj);}function _slicedToArray(arr,i){return _arrayWithHoles(arr)||_iterableToArrayLimit(arr,i)||_nonIterableRest();}function _nonIterableRest(){throw new TypeError("Invalid attempt to destructure non-iterable instance");}function _iterableToArrayLimit(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"]!=null)_i["return"]();}finally{if(_d)throw _e;}}return _arr;}function _arrayWithHoles(arr){if(Array.isArray(arr))return arr;}function _classCallCheck(instance,Constructor){if(!(instance instanceof Constructor)){throw new TypeError("Cannot call a class as a 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);}}function _createClass(Constructor,protoProps,staticProps){if(protoProps)_defineProperties(Constructor.prototype,protoProps);if(staticProps)_defineProperties(Constructor,staticProps);return Constructor;}function _callSuper(_this,derived,args){function isNativeReflectConstruct(){if(typeof Reflect==="undefined"||!Reflect.construct)return false;if(Reflect.construct.sham)return false;if(typeof Proxy==="function")return true;try{return!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}));}catch(e){return false;}}derived=_getPrototypeOf(derived);return _possibleConstructorReturn(_this,isNativeReflectConstruct()?Reflect.construct(derived,args||[],_getPrototypeOf(_this).constructor):derived.apply(_this,args));}function _possibleConstructorReturn(self,call){if(call&&(_typeof(call)==="object"||typeof call==="function")){return call;}return _assertThisInitialized(self);}function _assertThisInitialized(self){if(self===void 0){throw new ReferenceError("this hasn't been initialised - super() hasn't been called");}return self;}function _getPrototypeOf(o){_getPrototypeOf=Object.setPrototypeOf?Object.getPrototypeOf:function _getPrototypeOf(o){return o.__proto__||Object.getPrototypeOf(o);};return _getPrototypeOf(o);}function _inherits(subClass,superClass){if(typeof superClass!=="function"&&superClass!==null){throw new TypeError("Super expression must either be null or a function");}subClass.prototype=Object.create(superClass&&superClass.prototype,{constructor:{value:subClass,writable:true,configurable:true}});if(superClass)_setPrototypeOf(subClass,superClass);}function _setPrototypeOf(o,p){_setPrototypeOf=Object.setPrototypeOf||function _setPrototypeOf(o,p){o.__proto__=p;return o;};return _setPrototypeOf(o,p);}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,{Component}from'react';import PropTypes from'prop-types';import clamp from'lodash/clamp';import styles from"./style";/**
1
+ import React, { Component } from 'react';
2
+ import PropTypes from 'prop-types';
3
+ import clamp from 'lodash/clamp';
4
+ import styles from "./style";
5
+
6
+ /**
2
7
  * The Context Menu Position component.
3
- */var Position=/*#__PURE__*/function(_Component){/**
8
+ */
9
+ class Position extends Component {
10
+ /**
4
11
  * The Constructor.
5
12
  * @param {Object} props The component props.
6
- */function Position(props){var _this2;_classCallCheck(this,Position);_this2=_callSuper(this,Position,[props]);_this2.elementRef=null;return _this2;}/**
13
+ */
14
+ constructor(props) {
15
+ super(props);
16
+ this.elementRef = null;
17
+ }
18
+
19
+ /**
7
20
  * Calculate and apply the correct menu position after mounting.
8
- */_inherits(Position,_Component);return _createClass(Position,[{key:"componentDidMount",value:function componentDidMount(){var offset=this.props.offset;// Get ref to the actual child DOM element and calculate bounding rect.
9
- var _this$elementRef$chil=_slicedToArray(this.elementRef.childNodes,1),child=_this$elementRef$chil[0];var bounds=child.getBoundingClientRect();// Get window dimensions
10
- var width=window.innerWidth;var height=window.innerHeight;// Get the outer gap from styles
11
- var gap=styles.outerGap;// Calculate clamped menu position
12
- var left=clamp(offset.left,0,width-bounds.width-gap*2);var top=clamp(offset.top-gap,0,height-bounds.height-gap*2);// Assign position directly w/o re-rendering the component
13
- this.elementRef.style.left="".concat(left,"px");this.elementRef.style.top="".concat(top,"px");}/**
21
+ */
22
+ componentDidMount() {
23
+ const {
24
+ offset
25
+ } = this.props;
26
+
27
+ // Get ref to the actual child DOM element and calculate bounding rect.
28
+ const [child] = this.elementRef.childNodes;
29
+ const bounds = child.getBoundingClientRect();
30
+
31
+ // Get window dimensions
32
+ const width = window.innerWidth;
33
+ const height = window.innerHeight;
34
+
35
+ // Get the outer gap from styles
36
+ const gap = styles.outerGap;
37
+
38
+ // Calculate clamped menu position
39
+ const left = clamp(offset.left, 0, width - bounds.width - gap * 2);
40
+ const top = clamp(offset.top - gap, 0, height - bounds.height - gap * 2);
41
+
42
+ // Assign position directly w/o re-rendering the component
43
+ this.elementRef.style.left = `${left}px`;
44
+ this.elementRef.style.top = `${top}px`;
45
+ }
46
+
47
+ /**
14
48
  * Renders the component.
15
49
  * @returns {JSX}
16
- */},{key:"render",value:function render(){var _this3=this;return React.createElement("div",{ref:function ref(_ref){_this3.elementRef=_ref;},className:styles.container},this.props.children);}}]);}(Component);_defineProperty(Position,"defaultProps",{children:null,offset:{top:0,left:0}});export default Position;
50
+ */
51
+ render() {
52
+ return /*#__PURE__*/React.createElement("div", {
53
+ ref: ref => {
54
+ this.elementRef = ref;
55
+ },
56
+ className: styles.container
57
+ }, this.props.children);
58
+ }
59
+ }
60
+ Position.defaultProps = {
61
+ children: null,
62
+ offset: {
63
+ top: 0,
64
+ left: 0
65
+ }
66
+ };
67
+ export default Position;
@@ -1 +1,11 @@
1
- import{css}from'glamor';import{themeConfig}from'@shopgate/pwa-common/helpers/config';var outerGap=themeConfig.variables.gap.small;var container=css({position:'absolute',margin:outerGap}).toString();export default{container:container,outerGap:outerGap};
1
+ import { css } from 'glamor';
2
+ import { themeConfig } from '@shopgate/pwa-common/helpers/config';
3
+ const outerGap = themeConfig.variables.gap.small;
4
+ const container = css({
5
+ position: 'absolute',
6
+ margin: outerGap
7
+ }).toString();
8
+ export default {
9
+ container,
10
+ outerGap
11
+ };
@@ -1,4 +1,17 @@
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;}function _slicedToArray(arr,i){return _arrayWithHoles(arr)||_iterableToArrayLimit(arr,i)||_nonIterableRest();}function _nonIterableRest(){throw new TypeError("Invalid attempt to destructure non-iterable instance");}function _iterableToArrayLimit(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"]!=null)_i["return"]();}finally{if(_d)throw _e;}}return _arr;}function _arrayWithHoles(arr){if(Array.isArray(arr))return arr;}import React,{useState,useEffect,useRef,useCallback}from'react';import PropTypes from'prop-types';import{ConnectedReactPortal}from'@shopgate/engage/components';import classNames from'classnames';import Backdrop from'@shopgate/pwa-common/components/Backdrop';import{FocusTrap}from'@shopgate/engage/a11y/components';import{i18n}from'@shopgate/engage/core';import MoreVertIcon from"../icons/MoreVertIcon";import Position from"./components/Position";import Item from"./components/Item";import styles from"./style";import ContextMenuProvider from"./ContextMenuProvider";/**
1
+ import React, { useState, useEffect, useRef, useCallback } from 'react';
2
+ import PropTypes from 'prop-types';
3
+ import { ConnectedReactPortal } from '@shopgate/engage/components';
4
+ import classNames from 'classnames';
5
+ import Backdrop from '@shopgate/pwa-common/components/Backdrop';
6
+ import { FocusTrap } from '@shopgate/engage/a11y/components';
7
+ import { i18n } from '@shopgate/engage/core';
8
+ import MoreVertIcon from "../icons/MoreVertIcon";
9
+ import Position from "./components/Position";
10
+ import Item from "./components/Item";
11
+ import styles from "./style";
12
+ import ContextMenuProvider from "./ContextMenuProvider";
13
+
14
+ /**
2
15
  * The Context Menu component.
3
16
  * @param {Object} props The component props.
4
17
  * @param {Object} props.children The menu items.
@@ -11,7 +24,115 @@ function _defineProperty(obj,key,value){if(key in obj){Object.defineProperty(obj
11
24
  * @param {boolean} props.scroll Whether the menu should be scrollable.
12
25
  * @param {boolean} props.showToggle Whether the toggle button should be shown.
13
26
  * @returns {JSX}
14
- */var ContextMenu=function ContextMenu(props){var children=props.children,classes=props.classes,disabled=props.disabled,showToggle=props.showToggle,scroll=props.scroll,isOpened=props.isOpened,onStateChange=props.onStateChange;var _useState=useState(isOpened),_useState2=_slicedToArray(_useState,2),active=_useState2[0],setActive=_useState2[1];var elementRef=useRef(null);var menuRef=useRef(null);useEffect(function(){if(typeof isOpened==='boolean'&&active!==isOpened){setActive(isOpened);}},[active,isOpened]);useEffect(function(){if(active&&menuRef.current){menuRef.current.focus();}},[active]);/**
27
+ */
28
+ const ContextMenu = props => {
29
+ const {
30
+ children,
31
+ classes,
32
+ disabled,
33
+ showToggle,
34
+ scroll,
35
+ isOpened,
36
+ onStateChange
37
+ } = props;
38
+ const [active, setActive] = useState(isOpened);
39
+ const elementRef = useRef(null);
40
+ const menuRef = useRef(null);
41
+ useEffect(() => {
42
+ if (typeof isOpened === 'boolean' && active !== isOpened) {
43
+ setActive(isOpened);
44
+ }
45
+ }, [active, isOpened]);
46
+ useEffect(() => {
47
+ if (active && menuRef.current) {
48
+ menuRef.current.focus();
49
+ }
50
+ }, [active]);
51
+
52
+ /**
15
53
  * Handles the menu toggle.
16
54
  * @param {Object} e The event object.
17
- */var handleMenuToggle=useCallback(function(e){if(e){e.preventDefault();e.stopPropagation();}if(elementRef.current){setActive(function(prevActive){var newState=!prevActive;if(onStateChange){onStateChange({active:newState});}return newState;});}},[onStateChange]);var offset=elementRef.current?elementRef.current.getBoundingClientRect():{top:0,left:0};var useScroll=typeof scroll==='boolean'&&!!scroll;return React.createElement("div",{"data-test-id":"contextMenu",ref:elementRef,className:classNames(styles.container,classes.container,'ui-shared__context-menu')},showToggle&&React.createElement("button",{className:classNames(styles.button,classes.button,_defineProperty({},styles.disabled,disabled)),onClick:handleMenuToggle,disabled:disabled,type:"button","aria-label":i18n.text('navigation.open_menu'),"aria-haspopup":"true","aria-expanded":active,"aria-controls":"contextMenuDialog"},React.createElement(MoreVertIcon,{"aria-hidden":true})),React.createElement(ConnectedReactPortal,{isOpened:active},React.createElement(FocusTrap,{active:active},React.createElement("div",{className:styles.overlay},React.createElement(Backdrop,{isVisible:true,level:0,opacity:0,onClick:handleMenuToggle}),React.createElement(Position,{offset:offset},React.createElement(ContextMenuProvider,{handleMenuToggle:handleMenuToggle},React.createElement("div",{className:classNames(styles.menu,_defineProperty({},styles.scrollable,useScroll)),ref:menuRef,tabIndex:"-1","aria-modal":"true",role:"dialog"},children,React.createElement("button",{onClick:handleMenuToggle,className:"sr-only","aria-label":i18n.text('common.close'),type:"button"},i18n.text('common.close')))))))));};ContextMenu.defaultProps={children:null,classes:{container:'',button:''},disabled:false,showToggle:true,isOpened:null,onStateChange:null,scroll:null};ContextMenu.Item=Item;export default ContextMenu;
55
+ */
56
+ const handleMenuToggle = useCallback(e => {
57
+ if (e) {
58
+ e.preventDefault();
59
+ e.stopPropagation();
60
+ }
61
+ if (elementRef.current) {
62
+ setActive(prevActive => {
63
+ const newState = !prevActive;
64
+ if (onStateChange) {
65
+ onStateChange({
66
+ active: newState
67
+ });
68
+ }
69
+ return newState;
70
+ });
71
+ }
72
+ }, [onStateChange]);
73
+ const offset = elementRef.current ? elementRef.current.getBoundingClientRect() : {
74
+ top: 0,
75
+ left: 0
76
+ };
77
+ const useScroll = typeof scroll === 'boolean' && !!scroll;
78
+ return /*#__PURE__*/React.createElement("div", {
79
+ "data-test-id": "contextMenu",
80
+ ref: elementRef,
81
+ className: classNames(styles.container, classes.container, 'ui-shared__context-menu')
82
+ }, showToggle && /*#__PURE__*/React.createElement("button", {
83
+ className: classNames(styles.button, classes.button, {
84
+ [styles.disabled]: disabled
85
+ }),
86
+ onClick: handleMenuToggle,
87
+ disabled: disabled,
88
+ type: "button",
89
+ "aria-label": i18n.text('navigation.open_menu'),
90
+ "aria-haspopup": "true",
91
+ "aria-expanded": active,
92
+ "aria-controls": "contextMenuDialog"
93
+ }, /*#__PURE__*/React.createElement(MoreVertIcon, {
94
+ "aria-hidden": true
95
+ })), /*#__PURE__*/React.createElement(ConnectedReactPortal, {
96
+ isOpened: active
97
+ }, /*#__PURE__*/React.createElement(FocusTrap, {
98
+ active: active
99
+ }, /*#__PURE__*/React.createElement("div", {
100
+ className: styles.overlay
101
+ }, /*#__PURE__*/React.createElement(Backdrop, {
102
+ isVisible: true,
103
+ level: 0,
104
+ opacity: 0,
105
+ onClick: handleMenuToggle
106
+ }), /*#__PURE__*/React.createElement(Position, {
107
+ offset: offset
108
+ }, /*#__PURE__*/React.createElement(ContextMenuProvider, {
109
+ handleMenuToggle: handleMenuToggle
110
+ }, /*#__PURE__*/React.createElement("div", {
111
+ className: classNames(styles.menu, {
112
+ [styles.scrollable]: useScroll
113
+ }),
114
+ ref: menuRef,
115
+ tabIndex: "-1",
116
+ "aria-modal": "true",
117
+ role: "dialog"
118
+ }, children, /*#__PURE__*/React.createElement("button", {
119
+ onClick: handleMenuToggle,
120
+ className: "sr-only",
121
+ "aria-label": i18n.text('common.close'),
122
+ type: "button"
123
+ }, i18n.text('common.close')))))))));
124
+ };
125
+ ContextMenu.defaultProps = {
126
+ children: null,
127
+ classes: {
128
+ container: '',
129
+ button: ''
130
+ },
131
+ disabled: false,
132
+ showToggle: true,
133
+ isOpened: null,
134
+ onStateChange: null,
135
+ scroll: null
136
+ };
137
+ ContextMenu.Item = Item;
138
+ export default ContextMenu;
@@ -1,3 +1,102 @@
1
- import React from'react';import{mount,shallow}from'enzyme';import{act}from'react-dom/test-utils';import Backdrop from'@shopgate/pwa-common/components/Backdrop';import ContextMenu from"./index";jest.mock('@shopgate/engage/components');global.requestAnimationFrame=function(fn){return fn();};jest.useFakeTimers();describe('<ContextMenu />',function(){var mockItemAClick=jest.fn();var mockItemBClick=jest.fn();var numMenuItems=2;describe('Snapshot test',function(){it('should match snapshot',function(){var wrapper=shallow(React.createElement(ContextMenu,{isOpened:true},React.createElement(ContextMenu.Item,{onClick:mockItemAClick,className:"menu-active-item"},'Item A'),React.createElement(ContextMenu.Item,{onClick:mockItemBClick,className:"menu-active-item"},'Item B')));expect(wrapper).toMatchSnapshot();});it('should match snapshot without toggle',function(){var wrapper=shallow(React.createElement(ContextMenu,{isOpened:true,showToggle:false},React.createElement(ContextMenu.Item,{onClick:mockItemAClick,className:"menu-active-item"},'Item A')));expect(wrapper).toMatchSnapshot();});});describe('Given the component was mounted to the DOM',function(){var renderedElement;/**
1
+ import React from 'react';
2
+ import { mount, shallow } from 'enzyme';
3
+ import { act } from 'react-dom/test-utils';
4
+ import Backdrop from '@shopgate/pwa-common/components/Backdrop';
5
+ import ContextMenu from "./index";
6
+ jest.mock('@shopgate/engage/components');
7
+ global.requestAnimationFrame = fn => fn();
8
+ jest.useFakeTimers();
9
+ describe('<ContextMenu />', () => {
10
+ const mockItemAClick = jest.fn();
11
+ const mockItemBClick = jest.fn();
12
+ const numMenuItems = 2;
13
+ describe('Snapshot test', () => {
14
+ it('should match snapshot', () => {
15
+ const wrapper = shallow(/*#__PURE__*/React.createElement(ContextMenu, {
16
+ isOpened: true
17
+ }, /*#__PURE__*/React.createElement(ContextMenu.Item, {
18
+ onClick: mockItemAClick,
19
+ className: "menu-active-item"
20
+ }, 'Item A'), /*#__PURE__*/React.createElement(ContextMenu.Item, {
21
+ onClick: mockItemBClick,
22
+ className: "menu-active-item"
23
+ }, 'Item B')));
24
+ expect(wrapper).toMatchSnapshot();
25
+ });
26
+ it('should match snapshot without toggle', () => {
27
+ const wrapper = shallow(/*#__PURE__*/React.createElement(ContextMenu, {
28
+ isOpened: true,
29
+ showToggle: false
30
+ }, /*#__PURE__*/React.createElement(ContextMenu.Item, {
31
+ onClick: mockItemAClick,
32
+ className: "menu-active-item"
33
+ }, 'Item A')));
34
+ expect(wrapper).toMatchSnapshot();
35
+ });
36
+ });
37
+ describe('Given the component was mounted to the DOM', () => {
38
+ let renderedElement;
39
+
40
+ /**
2
41
  * The view component
3
- */var renderComponent=function renderComponent(){renderedElement=mount(React.createElement(ContextMenu,null,React.createElement(ContextMenu.Item,{onClick:mockItemAClick},"Item A"),React.createElement(ContextMenu.Item,{onClick:mockItemBClick},"Item B")));};beforeEach(renderComponent);it('should match snapshot',function(){expect(renderedElement).toMatchSnapshot();});it('should have active state set to false',function(){expect(renderedElement.find('ConnectedReactPortal').prop('isOpened')).toBe(null);});it('should render the toggle button',function(){expect(renderedElement.find('button').length).toBe(1);});it('should not render any context menu items',function(){expect(renderedElement.find(ContextMenu.Item).length).toBe(0);});describe('Given toggle button gets clicked',function(){beforeEach(function(){renderedElement.find('button').simulate('click');renderedElement.update();});it('should have active state set to true',function(){expect(renderedElement.find('ConnectedReactPortal').prop('isOpened')).toBe(true);});it('should render the actual context menu w/ items',function(){expect(renderedElement.find(ContextMenu.Item).length).toBe(numMenuItems);});describe('Given the first item gets clicked',function(){beforeEach(function(){act(function(){renderedElement.find(ContextMenu.Item).first().children().find('[data-test-id="contextMenuButton"]').first().simulate('click');jest.runAllTimers();});});it('should call the related click handler',function(){expect(mockItemAClick).toBeCalled();});it('should close the context menu',function(){renderedElement.update();expect(renderedElement.find(ContextMenu.Item).length).toBe(0);});});describe('Given the backdrop gets clicked',function(){beforeEach(function(){renderedElement.find(Backdrop).children().find('[onClick]').simulate('click');});it('should have active state reset to false',function(){expect(renderedElement.find('ConnectedReactPortal').prop('isOpened')).toBe(false);});it('should close the context menu',function(){expect(renderedElement.find(ContextMenu.Item).length).toBe(0);});});});});});
42
+ */
43
+ const renderComponent = () => {
44
+ renderedElement = mount(/*#__PURE__*/React.createElement(ContextMenu, null, /*#__PURE__*/React.createElement(ContextMenu.Item, {
45
+ onClick: mockItemAClick
46
+ }, "Item A"), /*#__PURE__*/React.createElement(ContextMenu.Item, {
47
+ onClick: mockItemBClick
48
+ }, "Item B")));
49
+ };
50
+ beforeEach(renderComponent);
51
+ it('should match snapshot', () => {
52
+ expect(renderedElement).toMatchSnapshot();
53
+ });
54
+ it('should have active state set to false', () => {
55
+ expect(renderedElement.find('ConnectedReactPortal').prop('isOpened')).toBe(null);
56
+ });
57
+ it('should render the toggle button', () => {
58
+ expect(renderedElement.find('button').length).toBe(1);
59
+ });
60
+ it('should not render any context menu items', () => {
61
+ expect(renderedElement.find(ContextMenu.Item).length).toBe(0);
62
+ });
63
+ describe('Given toggle button gets clicked', () => {
64
+ beforeEach(() => {
65
+ renderedElement.find('button').simulate('click');
66
+ renderedElement.update();
67
+ });
68
+ it('should have active state set to true', () => {
69
+ expect(renderedElement.find('ConnectedReactPortal').prop('isOpened')).toBe(true);
70
+ });
71
+ it('should render the actual context menu w/ items', () => {
72
+ expect(renderedElement.find(ContextMenu.Item).length).toBe(numMenuItems);
73
+ });
74
+ describe('Given the first item gets clicked', () => {
75
+ beforeEach(() => {
76
+ act(() => {
77
+ renderedElement.find(ContextMenu.Item).first().children().find('[data-test-id="contextMenuButton"]').first().simulate('click');
78
+ jest.runAllTimers();
79
+ });
80
+ });
81
+ it('should call the related click handler', () => {
82
+ expect(mockItemAClick).toBeCalled();
83
+ });
84
+ it('should close the context menu', () => {
85
+ renderedElement.update();
86
+ expect(renderedElement.find(ContextMenu.Item).length).toBe(0);
87
+ });
88
+ });
89
+ describe('Given the backdrop gets clicked', () => {
90
+ beforeEach(() => {
91
+ renderedElement.find(Backdrop).children().find('[onClick]').simulate('click');
92
+ });
93
+ it('should have active state reset to false', () => {
94
+ expect(renderedElement.find('ConnectedReactPortal').prop('isOpened')).toBe(false);
95
+ });
96
+ it('should close the context menu', () => {
97
+ expect(renderedElement.find(ContextMenu.Item).length).toBe(0);
98
+ });
99
+ });
100
+ });
101
+ });
102
+ });