@shopgate/pwa-ui-shared 7.30.0-alpha.7 → 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
@@ -1,16 +1,300 @@
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);}/* eslint-disable extra-rules/no-single-line-objects */import React from'react';import{mount}from'enzyme';import FormBuilder from'.';describe('<FormBuilder />',function(){it('should render empty form',function(){var wrapper=mount(React.createElement(FormBuilder,{config:{fields:{}},name:"foo",handleUpdate:function handleUpdate(){}}));expect(wrapper).toMatchSnapshot();});it('should render two text fields',function(){var wrapper=mount(React.createElement(FormBuilder,{config:{fields:{firstName:{label:'foo',type:'text',visible:true},lastName:{label:'bar',type:'text',visible:true}}},name:"foo",handleUpdate:function handleUpdate(){}}));expect(wrapper).toMatchSnapshot();expect(wrapper.find('TextField').length).toEqual(2);});it('should not render invisible field',function(){var wrapper=mount(React.createElement(FormBuilder,{config:{fields:{firstName:{label:'foo',type:'text',visible:false}}},name:"foo",handleUpdate:function handleUpdate(){}}));expect(wrapper).toMatchSnapshot();expect(wrapper.find('TextField').length).toEqual(0);});it('should hide element if setVisibilty rule applies',function(){var wrapper=mount(React.createElement(FormBuilder,{config:{fields:{foo:{label:'foo',type:'text',visible:true},bar:{label:'bar',type:'text',actions:[{type:'setVisibility',rules:[{context:'foo',type:'notIn',data:['abc']}]}]}}},name:"foo",handleUpdate:function handleUpdate(){}}));// Both should be visible at the beginning.
2
- expect(wrapper).toMatchSnapshot();expect(wrapper.find('TextField').length).toEqual(2);// Simulate user input to the text field.
3
- wrapper.find('input').first().simulate('change',{target:{value:'abc'}});// Second field should be hidden now.
4
- expect(wrapper).toMatchSnapshot();expect(wrapper.find('TextField').length).toEqual(1);});it('should reset value when rule applies',function(){var wrapper=mount(React.createElement(FormBuilder,{config:{fields:{foo:{label:'foo',type:'text',visible:true,"default":'default'},bar:{label:'bar',type:'text',"default":'default',actions:[{type:'setValue',params:{value:'cheat',type:'fixed'},rules:[{context:'foo',type:'notIn',data:['default']}]}]}}},name:"foo",handleUpdate:function handleUpdate(){}}));// Default values should be in the inputs.
5
- expect(wrapper).toMatchSnapshot();expect(wrapper.find('TextField').length).toEqual(2);expect(wrapper.find('input').at(0).props().value).toEqual('default');expect(wrapper.find('input').at(1).props().value).toEqual('default');// Simulate text input to trigger rule.
6
- wrapper.find('input').first().simulate('change',{target:{value:'abc'}});wrapper.update();// Second field should be hidden now.
7
- expect(wrapper).toMatchSnapshot();expect(wrapper.find('TextField').length).toEqual(2);expect(wrapper.find('input').at(0).props().value).toEqual('abc');expect(wrapper.find('input').at(1).props().value).toEqual('cheat');});it('should call onChange callback when input is changed',function(){var handleUpdate=jest.fn();var wrapper=mount(React.createElement(FormBuilder,{config:{fields:{foo:{label:'foo',type:'text',visible:true,"default":'default'}}},name:"foo",id:"foo",handleUpdate:handleUpdate}));// Should call with initial state.
8
- expect(wrapper).toMatchSnapshot();expect(handleUpdate).toHaveBeenCalledWith({foo:'default'},false);handleUpdate.mockClear();// Update input
9
- wrapper.find('input').first().simulate('change',{target:{value:'abc'}});// Should call with updated state.
10
- expect(handleUpdate).toHaveBeenCalledWith({foo:'abc'},false);});describe('FormBuilder::elementChangeHandler',function(){it('should take the updated state from action listener',function(){// Create mocked Form builder.
11
- var handleUpdate=jest.fn();var builder=new FormBuilder({validationErrors:[],config:{fields:{foo:{label:'foo',type:'text',visible:true,"default":'default'}}},handleUpdate:handleUpdate});builder.actionListener.notify=function(){return{formData:{foo:'bar'},errors:{},elementVisibility:{foo:true}};};// Trigger update
12
- builder.elementChangeHandler('foo','bar');// Test
13
- expect(handleUpdate).toHaveBeenCalledWith({foo:'bar'},false);});it('should consider backend validations',function(){// Create mocked Form builder.
14
- var handleUpdate=jest.fn();var builder=new FormBuilder({validationErrors:[{}],config:{fields:{foo:{label:'foo',type:'text',visible:true,"default":'default'}}},handleUpdate:handleUpdate});builder.actionListener.notify=function(){return{formData:{foo:'bar'},errors:{},elementVisibility:{foo:true}};};// Trigger update
15
- builder.elementChangeHandler('foo','bar');// Test
16
- expect(handleUpdate).toHaveBeenCalledWith({foo:'bar'},true);});});describe('FormBuilder::elementSortFunc',function(){var builder=new FormBuilder({validationErrors:[{}],config:{fields:{}},handleUpdate:jest.fn()});var field1={id:'foo',label:'foo'};var field2={id:'foo2',label:'foo2'};it('should keep sortOrder for undefined',function(){expect([field2,field1].sort(builder.elementSortFunc)).toEqual([field2,field1]);});it('should sort elements',function(){var fields=[_extends({},field1,{sortOrder:2}),_extends({},field2,{sortOrder:1})];expect(fields.sort(builder.elementSortFunc)).toEqual(fields.reverse());});it('should keep sortOrder',function(){var fields=[_extends({},field2,{sortOrder:1}),_extends({},field1,{sortOrder:2})];expect(fields.sort(builder.elementSortFunc)).toEqual([].concat(fields));});});});/* eslint-enable extra-rules/no-single-line-objects */
1
+ /* eslint-disable extra-rules/no-single-line-objects */
2
+ import React from 'react';
3
+ import { mount } from 'enzyme';
4
+ import FormBuilder from '.';
5
+ describe('<FormBuilder />', () => {
6
+ it('should render empty form', () => {
7
+ const wrapper = mount(/*#__PURE__*/React.createElement(FormBuilder, {
8
+ config: {
9
+ fields: {}
10
+ },
11
+ name: "foo",
12
+ handleUpdate: () => {}
13
+ }));
14
+ expect(wrapper).toMatchSnapshot();
15
+ });
16
+ it('should render two text fields', () => {
17
+ const wrapper = mount(/*#__PURE__*/React.createElement(FormBuilder, {
18
+ config: {
19
+ fields: {
20
+ firstName: {
21
+ label: 'foo',
22
+ type: 'text',
23
+ visible: true
24
+ },
25
+ lastName: {
26
+ label: 'bar',
27
+ type: 'text',
28
+ visible: true
29
+ }
30
+ }
31
+ },
32
+ name: "foo",
33
+ handleUpdate: () => {}
34
+ }));
35
+ expect(wrapper).toMatchSnapshot();
36
+ expect(wrapper.find('TextField').length).toEqual(2);
37
+ });
38
+ it('should not render invisible field', () => {
39
+ const wrapper = mount(/*#__PURE__*/React.createElement(FormBuilder, {
40
+ config: {
41
+ fields: {
42
+ firstName: {
43
+ label: 'foo',
44
+ type: 'text',
45
+ visible: false
46
+ }
47
+ }
48
+ },
49
+ name: "foo",
50
+ handleUpdate: () => {}
51
+ }));
52
+ expect(wrapper).toMatchSnapshot();
53
+ expect(wrapper.find('TextField').length).toEqual(0);
54
+ });
55
+ it('should hide element if setVisibilty rule applies', () => {
56
+ const wrapper = mount(/*#__PURE__*/React.createElement(FormBuilder, {
57
+ config: {
58
+ fields: {
59
+ foo: {
60
+ label: 'foo',
61
+ type: 'text',
62
+ visible: true
63
+ },
64
+ bar: {
65
+ label: 'bar',
66
+ type: 'text',
67
+ actions: [{
68
+ type: 'setVisibility',
69
+ rules: [{
70
+ context: 'foo',
71
+ type: 'notIn',
72
+ data: ['abc']
73
+ }]
74
+ }]
75
+ }
76
+ }
77
+ },
78
+ name: "foo",
79
+ handleUpdate: () => {}
80
+ }));
81
+
82
+ // Both should be visible at the beginning.
83
+ expect(wrapper).toMatchSnapshot();
84
+ expect(wrapper.find('TextField').length).toEqual(2);
85
+
86
+ // Simulate user input to the text field.
87
+ wrapper.find('input').first().simulate('change', {
88
+ target: {
89
+ value: 'abc'
90
+ }
91
+ });
92
+
93
+ // Second field should be hidden now.
94
+ expect(wrapper).toMatchSnapshot();
95
+ expect(wrapper.find('TextField').length).toEqual(1);
96
+ });
97
+ it('should reset value when rule applies', () => {
98
+ const wrapper = mount(/*#__PURE__*/React.createElement(FormBuilder, {
99
+ config: {
100
+ fields: {
101
+ foo: {
102
+ label: 'foo',
103
+ type: 'text',
104
+ visible: true,
105
+ default: 'default'
106
+ },
107
+ bar: {
108
+ label: 'bar',
109
+ type: 'text',
110
+ default: 'default',
111
+ actions: [{
112
+ type: 'setValue',
113
+ params: {
114
+ value: 'cheat',
115
+ type: 'fixed'
116
+ },
117
+ rules: [{
118
+ context: 'foo',
119
+ type: 'notIn',
120
+ data: ['default']
121
+ }]
122
+ }]
123
+ }
124
+ }
125
+ },
126
+ name: "foo",
127
+ handleUpdate: () => {}
128
+ }));
129
+
130
+ // Default values should be in the inputs.
131
+ expect(wrapper).toMatchSnapshot();
132
+ expect(wrapper.find('TextField').length).toEqual(2);
133
+ expect(wrapper.find('input').at(0).props().value).toEqual('default');
134
+ expect(wrapper.find('input').at(1).props().value).toEqual('default');
135
+
136
+ // Simulate text input to trigger rule.
137
+ wrapper.find('input').first().simulate('change', {
138
+ target: {
139
+ value: 'abc'
140
+ }
141
+ });
142
+ wrapper.update();
143
+
144
+ // Second field should be hidden now.
145
+ expect(wrapper).toMatchSnapshot();
146
+ expect(wrapper.find('TextField').length).toEqual(2);
147
+ expect(wrapper.find('input').at(0).props().value).toEqual('abc');
148
+ expect(wrapper.find('input').at(1).props().value).toEqual('cheat');
149
+ });
150
+ it('should call onChange callback when input is changed', () => {
151
+ const handleUpdate = jest.fn();
152
+ const wrapper = mount(/*#__PURE__*/React.createElement(FormBuilder, {
153
+ config: {
154
+ fields: {
155
+ foo: {
156
+ label: 'foo',
157
+ type: 'text',
158
+ visible: true,
159
+ default: 'default'
160
+ }
161
+ }
162
+ },
163
+ name: "foo",
164
+ id: "foo",
165
+ handleUpdate: handleUpdate
166
+ }));
167
+
168
+ // Should call with initial state.
169
+ expect(wrapper).toMatchSnapshot();
170
+ expect(handleUpdate).toHaveBeenCalledWith({
171
+ foo: 'default'
172
+ }, false);
173
+ handleUpdate.mockClear();
174
+
175
+ // Update input
176
+ wrapper.find('input').first().simulate('change', {
177
+ target: {
178
+ value: 'abc'
179
+ }
180
+ });
181
+
182
+ // Should call with updated state.
183
+ expect(handleUpdate).toHaveBeenCalledWith({
184
+ foo: 'abc'
185
+ }, false);
186
+ });
187
+ describe('FormBuilder::elementChangeHandler', () => {
188
+ it('should take the updated state from action listener', () => {
189
+ // Create mocked Form builder.
190
+ const handleUpdate = jest.fn();
191
+ const builder = new FormBuilder({
192
+ validationErrors: [],
193
+ config: {
194
+ fields: {
195
+ foo: {
196
+ label: 'foo',
197
+ type: 'text',
198
+ visible: true,
199
+ default: 'default'
200
+ }
201
+ }
202
+ },
203
+ handleUpdate
204
+ });
205
+ builder.actionListener.notify = () => ({
206
+ formData: {
207
+ foo: 'bar'
208
+ },
209
+ errors: {},
210
+ elementVisibility: {
211
+ foo: true
212
+ }
213
+ });
214
+
215
+ // Trigger update
216
+ builder.elementChangeHandler('foo', 'bar');
217
+
218
+ // Test
219
+ expect(handleUpdate).toHaveBeenCalledWith({
220
+ foo: 'bar'
221
+ }, false);
222
+ });
223
+ it('should consider backend validations', () => {
224
+ // Create mocked Form builder.
225
+ const handleUpdate = jest.fn();
226
+ const builder = new FormBuilder({
227
+ validationErrors: [{}],
228
+ config: {
229
+ fields: {
230
+ foo: {
231
+ label: 'foo',
232
+ type: 'text',
233
+ visible: true,
234
+ default: 'default'
235
+ }
236
+ }
237
+ },
238
+ handleUpdate
239
+ });
240
+ builder.actionListener.notify = () => ({
241
+ formData: {
242
+ foo: 'bar'
243
+ },
244
+ errors: {},
245
+ elementVisibility: {
246
+ foo: true
247
+ }
248
+ });
249
+
250
+ // Trigger update
251
+ builder.elementChangeHandler('foo', 'bar');
252
+
253
+ // Test
254
+ expect(handleUpdate).toHaveBeenCalledWith({
255
+ foo: 'bar'
256
+ }, true);
257
+ });
258
+ });
259
+ describe('FormBuilder::elementSortFunc', () => {
260
+ const builder = new FormBuilder({
261
+ validationErrors: [{}],
262
+ config: {
263
+ fields: {}
264
+ },
265
+ handleUpdate: jest.fn()
266
+ });
267
+ const field1 = {
268
+ id: 'foo',
269
+ label: 'foo'
270
+ };
271
+ const field2 = {
272
+ id: 'foo2',
273
+ label: 'foo2'
274
+ };
275
+ it('should keep sortOrder for undefined', () => {
276
+ expect([field2, field1].sort(builder.elementSortFunc)).toEqual([field2, field1]);
277
+ });
278
+ it('should sort elements', () => {
279
+ const fields = [{
280
+ ...field1,
281
+ sortOrder: 2
282
+ }, {
283
+ ...field2,
284
+ sortOrder: 1
285
+ }];
286
+ expect(fields.sort(builder.elementSortFunc)).toEqual(fields.reverse());
287
+ });
288
+ it('should keep sortOrder', () => {
289
+ const fields = [{
290
+ ...field2,
291
+ sortOrder: 1
292
+ }, {
293
+ ...field1,
294
+ sortOrder: 2
295
+ }];
296
+ expect(fields.sort(builder.elementSortFunc)).toEqual([...fields]);
297
+ });
298
+ });
299
+ });
300
+ /* eslint-enable extra-rules/no-single-line-objects */
@@ -1,4 +1,13 @@
1
- var _excluded=["name","label","onChange","className","errorText","translateErrorText","showErrorText","checkboxClassName"];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 _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;}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,{PureComponent}from'react';import PropTypes from'prop-types';import classNames from'classnames';import I18n from'@shopgate/pwa-common/components/I18n';import UICheckbox from'@shopgate/pwa-ui-shared/Checkbox';import FormElement from'@shopgate/pwa-ui-shared/FormElement';import style from"./style";/**
1
+ import _extends from "@babel/runtime/helpers/extends";
2
+ import React, { PureComponent } from 'react';
3
+ import PropTypes from 'prop-types';
4
+ import classNames from 'classnames';
5
+ import I18n from '@shopgate/pwa-common/components/I18n';
6
+ import UICheckbox from '@shopgate/pwa-ui-shared/Checkbox';
7
+ import FormElement from '@shopgate/pwa-ui-shared/FormElement';
8
+ import style from "./style";
9
+
10
+ /**
2
11
  * @typedef {Object} Props
3
12
  * @property {string} label Label for the checkbox
4
13
  * @property {string} name Name for the form element that's used as "htmlFor" attribute to create
@@ -11,10 +20,63 @@ var _excluded=["name","label","onChange","className","errorText","translateError
11
20
  * @property {boolean} [showErrorText] Whether to show the error text when present (default `true`)
12
21
  * @property {boolean} [translateErrorText] Whether `errorText` is a translation key
13
22
  * @property {Function} [onChange] Change handler for the checkbox
14
- */ /**
23
+ */
24
+
25
+ /**
15
26
  * A component that provides a styled checkbox field.
16
27
  * @extends {React.Component<Props>}
17
28
  * @returns {JSX.Element}
18
- */var Checkbox=/*#__PURE__*/function(_PureComponent){function Checkbox(){_classCallCheck(this,Checkbox);return _callSuper(this,Checkbox,arguments);}_inherits(Checkbox,_PureComponent);return _createClass(Checkbox,[{key:"render",value:/**
29
+ */
30
+ class Checkbox extends PureComponent {
31
+ /**
19
32
  * @return {JSX}
20
- */function render(){var _this$props=this.props,name=_this$props.name,label=_this$props.label,onChange=_this$props.onChange,className=_this$props.className,errorText=_this$props.errorText,translateErrorText=_this$props.translateErrorText,showErrorText=_this$props.showErrorText,checkboxClassName=_this$props.checkboxClassName,restProps=_objectWithoutProperties(_this$props,_excluded);return React.createElement(FormElement,{className:classNames(className,style.root,'checkbox','ui-shared__form__checkbox'),htmlFor:name,errorText:errorText,translateErrorText:translateErrorText,hasUnderline:false,hasPlaceholder:false,disabled:restProps.disabled,showErrorText:showErrorText},React.createElement(UICheckbox,_extends({},restProps,{className:checkboxClassName,name:name,onCheck:onChange,checkedClassName:"".concat(className," ").concat(style.checked),unCheckedClassName:className,labelPosition:"right",label:typeof label==='string'?React.createElement("div",{className:classNames(style.labelWrapper,'label')},React.createElement(I18n.Text,{className:style.label,string:label})):label})));}}]);}(PureComponent);_defineProperty(Checkbox,"defaultProps",{className:'',checkboxClassName:undefined,defaultChecked:undefined,errorText:'',label:'',onChange:function onChange(){},translateErrorText:true,disabled:false,showErrorText:true});export default Checkbox;
33
+ */
34
+ render() {
35
+ const {
36
+ name,
37
+ label,
38
+ onChange,
39
+ className,
40
+ errorText,
41
+ translateErrorText,
42
+ showErrorText,
43
+ checkboxClassName,
44
+ ...restProps
45
+ } = this.props;
46
+ return /*#__PURE__*/React.createElement(FormElement, {
47
+ className: classNames(className, style.root, 'checkbox', 'ui-shared__form__checkbox'),
48
+ htmlFor: name,
49
+ errorText: errorText,
50
+ translateErrorText: translateErrorText,
51
+ hasUnderline: false,
52
+ hasPlaceholder: false,
53
+ disabled: restProps.disabled,
54
+ showErrorText: showErrorText
55
+ }, /*#__PURE__*/React.createElement(UICheckbox, _extends({}, restProps, {
56
+ className: checkboxClassName,
57
+ name: name,
58
+ onCheck: onChange,
59
+ checkedClassName: `${className} ${style.checked}`,
60
+ unCheckedClassName: className,
61
+ labelPosition: "right",
62
+ label: typeof label === 'string' ? /*#__PURE__*/React.createElement("div", {
63
+ className: classNames(style.labelWrapper, 'label')
64
+ }, /*#__PURE__*/React.createElement(I18n.Text, {
65
+ className: style.label,
66
+ string: label
67
+ })) : label
68
+ })));
69
+ }
70
+ }
71
+ Checkbox.defaultProps = {
72
+ className: '',
73
+ checkboxClassName: undefined,
74
+ defaultChecked: undefined,
75
+ errorText: '',
76
+ label: '',
77
+ onChange: () => {},
78
+ translateErrorText: true,
79
+ disabled: false,
80
+ showErrorText: true
81
+ };
82
+ export default Checkbox;
@@ -1,2 +1,25 @@
1
- import{css}from'glamor';import{themeConfig}from'@shopgate/pwa-common/helpers/config';var root=css({marginLeft:-2,// Removes margin caused by svg.
2
- cursor:'pointer','& svg':{"float":'left'}}).toString();var label=css({lineHeight:1.6}).toString();var labelWrapper=css({marginLeft:themeConfig.variables.gap.xbig}).toString();var checked=css({color:"var(--color-primary, ".concat(themeConfig.colors.primary,")")}).toString();export default{root:root,label:label,labelWrapper:labelWrapper,checked:checked};
1
+ import { css } from 'glamor';
2
+ import { themeConfig } from '@shopgate/pwa-common/helpers/config';
3
+ const root = css({
4
+ marginLeft: -2,
5
+ // Removes margin caused by svg.
6
+ cursor: 'pointer',
7
+ '& svg': {
8
+ float: 'left'
9
+ }
10
+ }).toString();
11
+ const label = css({
12
+ lineHeight: 1.6
13
+ }).toString();
14
+ const labelWrapper = css({
15
+ marginLeft: themeConfig.variables.gap.xbig
16
+ }).toString();
17
+ const checked = css({
18
+ color: `var(--color-primary, ${themeConfig.colors.primary})`
19
+ }).toString();
20
+ export default {
21
+ root,
22
+ label,
23
+ labelWrapper,
24
+ checked
25
+ };
@@ -1,4 +1,52 @@
1
- import React from'react';import PropTypes from'prop-types';import Grid from'@shopgate/pwa-common/components/Grid';import FormElement from"../../FormElement";import style from"./style";/**
1
+ import React from 'react';
2
+ import PropTypes from 'prop-types';
3
+ import Grid from '@shopgate/pwa-common/components/Grid';
4
+ import FormElement from "../../FormElement";
5
+ import style from "./style";
6
+
7
+ /**
2
8
  * @param {Object} props .
3
9
  * @returns {JSX}
4
- */var InfoField=function InfoField(props){var className=props.className,label=props.label,errorText=props.errorText,leftElement=props.leftElement,rightElement=props.rightElement,hasUnderline=props.hasUnderline,children=props.children,hasValue=props.hasValue,showErrorText=props.showErrorText;return React.createElement(FormElement,{className:className,label:label,errorText:errorText,hasUnderline:hasUnderline,isFocused:false,hasValue:hasValue,showErrorText:showErrorText},React.createElement(Grid,null,leftElement&&React.createElement(Grid.Item,{grow:0,className:style.element},leftElement),React.createElement(Grid.Item,{grow:1,className:"".concat(style.info," info-field")},children),rightElement&&React.createElement(Grid.Item,{grow:0,className:style.element},rightElement)));};InfoField.defaultProps={className:'',errorText:'',hasUnderline:true,hasValue:false,label:'',leftElement:null,rightElement:null,showErrorText:true};export default InfoField;
10
+ */
11
+ const InfoField = props => {
12
+ const {
13
+ className,
14
+ label,
15
+ errorText,
16
+ leftElement,
17
+ rightElement,
18
+ hasUnderline,
19
+ children,
20
+ hasValue,
21
+ showErrorText
22
+ } = props;
23
+ return /*#__PURE__*/React.createElement(FormElement, {
24
+ className: className,
25
+ label: label,
26
+ errorText: errorText,
27
+ hasUnderline: hasUnderline,
28
+ isFocused: false,
29
+ hasValue: hasValue,
30
+ showErrorText: showErrorText
31
+ }, /*#__PURE__*/React.createElement(Grid, null, leftElement && /*#__PURE__*/React.createElement(Grid.Item, {
32
+ grow: 0,
33
+ className: style.element
34
+ }, leftElement), /*#__PURE__*/React.createElement(Grid.Item, {
35
+ grow: 1,
36
+ className: `${style.info} info-field`
37
+ }, children), rightElement && /*#__PURE__*/React.createElement(Grid.Item, {
38
+ grow: 0,
39
+ className: style.element
40
+ }, rightElement)));
41
+ };
42
+ InfoField.defaultProps = {
43
+ className: '',
44
+ errorText: '',
45
+ hasUnderline: true,
46
+ hasValue: false,
47
+ label: '',
48
+ leftElement: null,
49
+ rightElement: null,
50
+ showErrorText: true
51
+ };
52
+ export default InfoField;
@@ -1 +1,9 @@
1
- import React from'react';import{shallow}from'enzyme';import InfoField from"./index";describe('<InfoField>',function(){it('should render info field',function(){var wrapper=shallow(React.createElement(InfoField,null,'Some info text'));expect(wrapper).toMatchSnapshot();});});
1
+ import React from 'react';
2
+ import { shallow } from 'enzyme';
3
+ import InfoField from "./index";
4
+ describe('<InfoField>', () => {
5
+ it('should render info field', () => {
6
+ const wrapper = shallow(/*#__PURE__*/React.createElement(InfoField, null, 'Some info text'));
7
+ expect(wrapper).toMatchSnapshot();
8
+ });
9
+ });
@@ -1 +1,11 @@
1
- import{css}from'glamor';var info=css({paddingTop:24}).toString();var element=css({marginTop:16}).toString();export default{info:info,element:element};
1
+ import { css } from 'glamor';
2
+ const info = css({
3
+ paddingTop: 24
4
+ }).toString();
5
+ const element = css({
6
+ marginTop: 16
7
+ }).toString();
8
+ export default {
9
+ info,
10
+ element
11
+ };
@@ -1,10 +1,55 @@
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 _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 _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 ToggleIcon from"../../ToggleIcon";import VisibilityIcon from"../../icons/VisibilityIcon";import VisibilityOffIcon from"../../icons/VisibilityOffIcon";import TextField from"../TextField";import style from"./style";/**
1
+ import _extends from "@babel/runtime/helpers/extends";
2
+ import React, { Component } from 'react';
3
+ import ToggleIcon from "../../ToggleIcon";
4
+ import VisibilityIcon from "../../icons/VisibilityIcon";
5
+ import VisibilityOffIcon from "../../icons/VisibilityOffIcon";
6
+ import TextField from "../TextField";
7
+ import style from "./style";
8
+
9
+ /**
2
10
  * A component that provides a password field with visibility toggle.
3
- */var Password=/*#__PURE__*/function(_Component){/**
11
+ */
12
+ class Password extends Component {
13
+ /**
4
14
  * Initializes the component.
5
15
  * @param {Object} props The components props.
6
- */function Password(props){var _this2;_classCallCheck(this,Password);_this2=_callSuper(this,Password,[props]);/**
7
- * @param {boolean} isVisible The next isVisible state.
8
- */_defineProperty(_this2,"togglePasswordVisibility",function(isVisible){_this2.setState({isVisible:isVisible});});_this2.state={isVisible:false};return _this2;}_inherits(Password,_Component);return _createClass(Password,[{key:"render",value:/**
16
+ */
17
+ constructor(props) {
18
+ super(props);
19
+ /**
20
+ * @param {boolean} isVisible The next isVisible state.
21
+ */
22
+ this.togglePasswordVisibility = isVisible => {
23
+ this.setState({
24
+ isVisible
25
+ });
26
+ };
27
+ this.state = {
28
+ isVisible: false
29
+ };
30
+ }
31
+ /**
9
32
  * @return {*}
10
- */function render(){var isVisible=this.state.isVisible;return React.createElement(TextField,_extends({},this.props,{className:"ui-shared__form__password ".concat(this.props.className),rightElement:React.createElement(ToggleIcon,{on:isVisible,onIcon:React.createElement(VisibilityIcon,{size:24}),offIcon:React.createElement(VisibilityOffIcon,{size:24,className:style.visOff}),toggleHandler:this.togglePasswordVisibility}),type:isVisible?'text':'password'}));}}]);}(Component);export default Password;
33
+ */
34
+ render() {
35
+ const {
36
+ isVisible
37
+ } = this.state;
38
+ return /*#__PURE__*/React.createElement(TextField, _extends({}, this.props, {
39
+ className: `ui-shared__form__password ${this.props.className}`,
40
+ rightElement: /*#__PURE__*/React.createElement(ToggleIcon, {
41
+ on: isVisible,
42
+ onIcon: /*#__PURE__*/React.createElement(VisibilityIcon, {
43
+ size: 24
44
+ }),
45
+ offIcon: /*#__PURE__*/React.createElement(VisibilityOffIcon, {
46
+ size: 24,
47
+ className: style.visOff
48
+ }),
49
+ toggleHandler: this.togglePasswordVisibility
50
+ }),
51
+ type: isVisible ? 'text' : 'password'
52
+ }));
53
+ }
54
+ }
55
+ export default Password;
@@ -1 +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 React from'react';import{mount}from'enzyme';import Password from"./index";var inputProps={name:'test-input'};describe('<Password>',function(){it('should render a password field',function(){var wrapper=mount(React.createElement(Password,inputProps));expect(wrapper).toMatchSnapshot();expect(wrapper.find('input[type="password"]').length).toBe(1);});it('should trigger the onChange callback',function(){var onChangeMock=jest.fn();var wrapper=mount(React.createElement(Password,_extends({},inputProps,{onChange:onChangeMock})));wrapper.find('input').simulate('change',{target:{value:'a'}});expect(onChangeMock).toHaveBeenCalledTimes(2);expect(wrapper.find('input').props().value).toEqual('a');});it('should toggle password visibility',function(){var wrapper=mount(React.createElement(Password,inputProps));var input=wrapper.find('ToggleIcon');expect(wrapper.find('input[type="password"]').length).toBe(1);input.simulate('click');expect(wrapper.find('input[type="text"]').length).toBe(1);});});
1
+ import _extends from "@babel/runtime/helpers/extends";
2
+ import React from 'react';
3
+ import { mount } from 'enzyme';
4
+ import Password from "./index";
5
+ const inputProps = {
6
+ name: 'test-input'
7
+ };
8
+ describe('<Password>', () => {
9
+ it('should render a password field', () => {
10
+ const wrapper = mount(/*#__PURE__*/React.createElement(Password, inputProps));
11
+ expect(wrapper).toMatchSnapshot();
12
+ expect(wrapper.find('input[type="password"]').length).toBe(1);
13
+ });
14
+ it('should trigger the onChange callback', () => {
15
+ const onChangeMock = jest.fn();
16
+ const wrapper = mount(/*#__PURE__*/React.createElement(Password, _extends({}, inputProps, {
17
+ onChange: onChangeMock
18
+ })));
19
+ wrapper.find('input').simulate('change', {
20
+ target: {
21
+ value: 'a'
22
+ }
23
+ });
24
+ expect(onChangeMock).toHaveBeenCalledTimes(2);
25
+ expect(wrapper.find('input').props().value).toEqual('a');
26
+ });
27
+ it('should toggle password visibility', () => {
28
+ const wrapper = mount(/*#__PURE__*/React.createElement(Password, inputProps));
29
+ const input = wrapper.find('ToggleIcon');
30
+ expect(wrapper.find('input[type="password"]').length).toBe(1);
31
+ input.simulate('click');
32
+ expect(wrapper.find('input[type="text"]').length).toBe(1);
33
+ });
34
+ });
@@ -1 +1,11 @@
1
- import{css}from'glamor';import{themeConfig}from'@shopgate/pwa-common/helpers/config';var colors=themeConfig.colors;var visOff=css({color:colors.shade4}).toString();export default{visOff:visOff};
1
+ import { css } from 'glamor';
2
+ import { themeConfig } from '@shopgate/pwa-common/helpers/config';
3
+ const {
4
+ colors
5
+ } = themeConfig;
6
+ const visOff = css({
7
+ color: colors.shade4
8
+ }).toString();
9
+ export default {
10
+ visOff
11
+ };