@financial-times/n-conversion-forms 26.0.0 → 27.0.0

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 (111) hide show
  1. package/.circleci/config.yml +4 -4
  2. package/.eslintignore +1 -0
  3. package/.github/workflows/gh-pages-deploy.yml +1 -0
  4. package/.storybook/main.js +0 -1
  5. package/__mocks__/@financial-times/o-expander.js +9 -0
  6. package/__mocks__/@financial-times/o-forms-input.js +11 -0
  7. package/__mocks__/@financial-times/o-forms.js +40 -0
  8. package/build-state/npm-shrinkwrap.json +294 -6334
  9. package/components/__snapshots__/b2c-partnership-confirmation.spec.js.snap +1 -1
  10. package/components/__snapshots__/confirmation.spec.js.snap +0 -3
  11. package/components/__snapshots__/debug.spec.js.snap +25 -13
  12. package/components/__snapshots__/delivery-postcode.spec.js.snap +1 -1
  13. package/components/__snapshots__/payment-term.spec.js.snap +1 -1
  14. package/components/__snapshots__/payment-type.spec.js.snap +19 -0
  15. package/components/__snapshots__/registration-confirmation.spec.js.snap +230 -74
  16. package/components/accept-terms.jsx +57 -36
  17. package/components/accept-terms.stories.js +28 -1
  18. package/components/b2c-partnership-confirmation.jsx +1 -1
  19. package/components/confirmation.jsx +15 -8
  20. package/components/confirmation.spec.js +1 -1
  21. package/components/debug.jsx +19 -12
  22. package/components/debug.stories.js +13 -0
  23. package/components/delivery-address.jsx +21 -58
  24. package/components/delivery-address.stories.js +7 -0
  25. package/components/delivery-city.jsx +4 -2
  26. package/components/delivery-city.stories.js +9 -0
  27. package/components/delivery-option.jsx +5 -3
  28. package/components/delivery-option.stories.js +7 -1
  29. package/components/delivery-postcode.jsx +32 -13
  30. package/components/delivery-postcode.stories.js +2 -1
  31. package/components/delivery-security-instructions.spec.js +3 -3
  32. package/components/graduation-date.spec.js +8 -8
  33. package/components/index.jsx +1 -1
  34. package/components/message.jsx +1 -1
  35. package/components/payment-term.jsx +152 -25
  36. package/components/payment-term.spec.js +46 -4
  37. package/components/payment-term.stories.js +69 -14
  38. package/components/payment-type.jsx +3 -1
  39. package/components/position.jsx +6 -3
  40. package/components/position.spec.js +15 -5
  41. package/components/registration-confirmation.jsx +111 -32
  42. package/components/responsibility.jsx +6 -3
  43. package/components/responsibility.spec.js +15 -5
  44. package/components/text-input.jsx +73 -0
  45. package/components/text-input.spec.js +118 -0
  46. package/components/text-input.stories.js +31 -0
  47. package/dist/accept-terms.js +15 -7
  48. package/dist/b2c-partnership-confirmation.js +1 -1
  49. package/dist/confirmation.js +11 -2
  50. package/dist/debug.js +6 -6
  51. package/dist/delivery-address.js +19 -32
  52. package/dist/delivery-city.js +4 -2
  53. package/dist/delivery-option.js +5 -2
  54. package/dist/delivery-postcode.js +31 -12
  55. package/dist/index.js +9 -9
  56. package/dist/message.js +1 -1
  57. package/dist/payment-term.js +117 -11
  58. package/dist/payment-type.js +5 -2
  59. package/dist/position.js +6 -2
  60. package/dist/registration-confirmation.js +87 -29
  61. package/dist/responsibility.js +6 -2
  62. package/dist/text-input.js +84 -0
  63. package/helpers/constants.js +7 -0
  64. package/helpers/deliveryAddressMap.js +167 -0
  65. package/helpers/index.js +7 -0
  66. package/helpers/index.spec.js +11 -0
  67. package/helpers/ncf-common-data.spec.js +34 -0
  68. package/helpers/ncf-countries.spec.js +136 -0
  69. package/helpers/supportedCountries.js +76 -0
  70. package/helpers/supportedPostcodeExamples.js +57 -0
  71. package/helpers/supportedPostcodeValidators.js +53 -0
  72. package/helpers/utilities.js +14 -0
  73. package/jest.config.js +8 -1
  74. package/main.scss +461 -0
  75. package/package.json +6 -3
  76. package/styles/confirmation.scss +122 -0
  77. package/styles/payment-term.scss +3 -0
  78. package/utils/app-banner.spec.js +68 -0
  79. package/utils/apple-pay.spec.js +177 -0
  80. package/utils/billing-country.spec.js +87 -0
  81. package/utils/billing-postcode.spec.js +138 -0
  82. package/utils/company-name.spec.js +3 -7
  83. package/utils/country.spec.js +87 -0
  84. package/utils/delivery-address-type.spec.js +24 -11
  85. package/utils/delivery-option-messages.js +15 -0
  86. package/utils/delivery-option-messages.spec.js +3 -3
  87. package/utils/delivery-option.spec.js +100 -15
  88. package/utils/delivery-postcode.spec.js +138 -0
  89. package/utils/delivery-start-date.spec.js +177 -0
  90. package/utils/email.spec.js +210 -0
  91. package/utils/event-notifier.spec.js +116 -0
  92. package/utils/form-element.spec.js +71 -0
  93. package/utils/loader.spec.js +161 -0
  94. package/utils/password.spec.js +65 -0
  95. package/utils/payment-term.js +25 -1
  96. package/utils/payment-term.spec.js +198 -0
  97. package/utils/payment-type.js +1 -1
  98. package/utils/payment-type.spec.js +136 -0
  99. package/utils/postcode.spec.js +122 -0
  100. package/utils/salesforce.spec.js +30 -0
  101. package/utils/submit.spec.js +81 -0
  102. package/utils/tracking.spec.js +174 -0
  103. package/utils/validation.js +2 -2
  104. package/utils/validation.spec.js +234 -0
  105. package/utils/zuora.spec.js +249 -0
  106. package/components/__snapshots__/b2c-partnership-payment-term.spec.js.snap +0 -193
  107. package/components/b2c-partnership-payment-term.jsx +0 -126
  108. package/components/b2c-partnership-payment-term.spec.js +0 -52
  109. package/components/b2c-partnership-payment-term.stories.js +0 -44
  110. package/dist/b2c-partnership-payment-term.js +0 -91
  111. package/styles/b2c-partnership-payment-term.scss +0 -20
@@ -13,6 +13,10 @@ var _propTypes = _interopRequireDefault(require("prop-types"));
13
13
 
14
14
  var _classnames = _interopRequireDefault(require("classnames"));
15
15
 
16
+ var _deliveryAddressMap = _interopRequireDefault(require("../helpers/deliveryAddressMap"));
17
+
18
+ var _supportedCountries = require("../helpers/supportedCountries");
19
+
16
20
  function DeliveryAddress(_ref) {
17
21
  var _ref$fieldId = _ref.fieldId,
18
22
  fieldId = _ref$fieldId === void 0 ? 'deliveryAddressFields' : _ref$fieldId,
@@ -29,31 +33,16 @@ function DeliveryAddress(_ref) {
29
33
  _ref$isHidden = _ref.isHidden,
30
34
  isHidden = _ref$isHidden === void 0 ? false : _ref$isHidden,
31
35
  _ref$country = _ref.country,
32
- country = _ref$country === void 0 ? 'GBR' : _ref$country;
36
+ country = _ref$country === void 0 ? 'GBR' : _ref$country,
37
+ _ref$addressType = _ref.addressType,
38
+ addressType = _ref$addressType === void 0 ? 'home' : _ref$addressType;
33
39
  var divClassNames = (0, _classnames["default"])([{
34
40
  ncf__hidden: isHidden
35
41
  }]);
36
42
  var inputWrapperClassNames = (0, _classnames["default"])(['o-forms-input', 'o-forms-input--text', {
37
43
  'o-forms-input--invalid': hasError
38
44
  }]);
39
- var addressLine3Title = {
40
- GBR: 'Address line 3',
41
- USA: 'APT/FL/STE',
42
- CAN: 'APT/FL/STE'
43
- };
44
- var addressLine3Prompt = {
45
- USA: 'Max. 6 characters. Please enter “Apartment 2C” as “Apt 2C”, “Floor 10 as FL 10”',
46
- CAN: 'Max. 6 characters. Please enter “Apartment 2C” as “Apt 2C”, “Floor 10 as FL 10”'
47
- };
48
- var addressLine3Placeholder = {
49
- USA: 'e.g Apt 2C / FL 10 / STE 50',
50
- CAN: 'e.g Apt 2C / FL 10 / STE 50'
51
- };
52
- var addressLine1Placeholder = {
53
- GBR: 'e.g. 10 Elm Street',
54
- USA: 'e.g. 10 Elm St.',
55
- CAN: 'e.g. 36 Poirier Blvd.'
56
- };
45
+ var FTShippingZone = (0, _supportedCountries.identifyFTShippingZone)(country);
57
46
 
58
47
  var addressLine1 = /*#__PURE__*/_react["default"].createElement("label", {
59
48
  className: "o-forms-field ncf__validation-error",
@@ -62,7 +51,7 @@ function DeliveryAddress(_ref) {
62
51
  className: "o-forms-title"
63
52
  }, /*#__PURE__*/_react["default"].createElement("span", {
64
53
  className: "o-forms-title__main"
65
- }, "Address line 1")), /*#__PURE__*/_react["default"].createElement("span", {
54
+ }, _deliveryAddressMap["default"][addressType].addressLine1Title[FTShippingZone] || 'Address line 1')), /*#__PURE__*/_react["default"].createElement("span", {
66
55
  className: inputWrapperClassNames
67
56
  }, /*#__PURE__*/_react["default"].createElement("input", {
68
57
  type: "text",
@@ -70,7 +59,7 @@ function DeliveryAddress(_ref) {
70
59
  name: "deliveryAddressLine1",
71
60
  "data-trackable": "field-deliveryAddressLine1",
72
61
  autoComplete: "address-line1",
73
- placeholder: addressLine1Placeholder[country],
62
+ placeholder: _deliveryAddressMap["default"][addressType].addressLine1Placeholder[FTShippingZone],
74
63
  maxLength: 50,
75
64
  "aria-required": "true",
76
65
  required: true,
@@ -95,7 +84,7 @@ function DeliveryAddress(_ref) {
95
84
  name: "deliveryAddressLine2",
96
85
  "data-trackable": "field-deliveryAddressLine2",
97
86
  autoComplete: "address-line2",
98
- placeholder: "",
87
+ placeholder: _deliveryAddressMap["default"][addressType].addressLine2Placeholder[FTShippingZone] || '',
99
88
  maxLength: 50,
100
89
  disabled: isDisabled,
101
90
  defaultValue: line2
@@ -108,9 +97,9 @@ function DeliveryAddress(_ref) {
108
97
  className: "o-forms-title"
109
98
  }, /*#__PURE__*/_react["default"].createElement("span", {
110
99
  className: "o-forms-title__main"
111
- }, addressLine3Title[country]), /*#__PURE__*/_react["default"].createElement("span", {
100
+ }, _deliveryAddressMap["default"][addressType].addressLine3Title[FTShippingZone]), /*#__PURE__*/_react["default"].createElement("span", {
112
101
  className: "o-forms-title__prompt"
113
- }, addressLine3Prompt[country])), /*#__PURE__*/_react["default"].createElement("span", {
102
+ }, _deliveryAddressMap["default"][addressType].addressLine3Prompt[FTShippingZone])), /*#__PURE__*/_react["default"].createElement("span", {
114
103
  className: inputWrapperClassNames
115
104
  }, /*#__PURE__*/_react["default"].createElement("input", {
116
105
  type: "text",
@@ -118,22 +107,19 @@ function DeliveryAddress(_ref) {
118
107
  name: "deliveryAddressLine3",
119
108
  "data-trackable": "field-deliveryAddressLine3",
120
109
  autoComplete: "address-line3",
121
- placeholder: addressLine3Placeholder[country] || 'e.g. Apt. 1',
110
+ placeholder: _deliveryAddressMap["default"][addressType].addressLine3Placeholder[FTShippingZone] || 'e.g. Apt. 1',
122
111
  maxLength: 50,
123
112
  disabled: isDisabled,
124
113
  defaultValue: line3
125
114
  })));
126
115
 
127
- var addressLines = {
128
- GBR: /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, ' ', addressLine1, addressLine2, addressLine3, ' '),
129
- USA: /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, ' ', addressLine1, addressLine3, addressLine2, ' '),
130
- CAN: /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, ' ', addressLine1, addressLine3, addressLine2, ' ')
131
- };
116
+ var addressLines = _deliveryAddressMap["default"][addressType].template(addressLine1, addressLine2, addressLine3, FTShippingZone);
117
+
132
118
  return /*#__PURE__*/_react["default"].createElement("div", {
133
119
  id: fieldId,
134
120
  "data-validate": "required",
135
121
  className: divClassNames
136
- }, addressLines[country]);
122
+ }, addressLines);
137
123
  }
138
124
 
139
125
  DeliveryAddress.propTypes = {
@@ -144,5 +130,6 @@ DeliveryAddress.propTypes = {
144
130
  line3: _propTypes["default"].string,
145
131
  isDisabled: _propTypes["default"].bool,
146
132
  isHidden: _propTypes["default"].bool,
147
- country: _propTypes["default"].oneOf(['GBR', 'USA', 'CAN'])
133
+ country: _propTypes["default"].oneOf(_supportedCountries.countriesSupportedISO),
134
+ addressType: _propTypes["default"].oneOf(['home', 'company', 'pobox'])
148
135
  };
@@ -13,6 +13,8 @@ var _propTypes = _interopRequireDefault(require("prop-types"));
13
13
 
14
14
  var _classnames = _interopRequireDefault(require("classnames"));
15
15
 
16
+ var _supportedCountries = require("../helpers/supportedCountries");
17
+
16
18
  function DeliveryCity(_ref) {
17
19
  var _ref$hasError = _ref.hasError,
18
20
  hasError = _ref$hasError === void 0 ? false : _ref$hasError,
@@ -47,7 +49,7 @@ function DeliveryCity(_ref) {
47
49
  name: "deliveryCity",
48
50
  "data-trackable": "field-deliveryCity",
49
51
  autoComplete: "address-level2",
50
- placeholder: inputPlaceholder[country],
52
+ placeholder: inputPlaceholder[country] || '',
51
53
  maxLength: 40,
52
54
  "aria-required": "true",
53
55
  required: true,
@@ -63,5 +65,5 @@ DeliveryCity.propTypes = {
63
65
  value: _propTypes["default"].string,
64
66
  isDisabled: _propTypes["default"].bool,
65
67
  maxlength: _propTypes["default"].number,
66
- country: _propTypes["default"].oneOf(['GBR', 'USA', 'CAN'])
68
+ country: _propTypes["default"].oneOf(_supportedCountries.countriesSupportedISO)
67
69
  };
@@ -15,6 +15,8 @@ var _classnames = _interopRequireDefault(require("classnames"));
15
15
 
16
16
  var _deliveryOptionMessages = require("../utils/delivery-option-messages");
17
17
 
18
+ var _supportedCountries = require("../helpers/supportedCountries");
19
+
18
20
  function DeliveryOption(_ref) {
19
21
  var _ref$fieldId = _ref.fieldId,
20
22
  fieldId = _ref$fieldId === void 0 ? 'deliveryOptionField' : _ref$fieldId,
@@ -28,6 +30,7 @@ function DeliveryOption(_ref) {
28
30
  var divClassName = (0, _classnames["default"])(['o-forms-field', 'ncf__delivery-option', {
29
31
  'ncf__delivery-option--single': isSingle
30
32
  }]);
33
+ var FTShippingZone = (0, _supportedCountries.identifyFTShippingZone)(country);
31
34
  return /*#__PURE__*/_react["default"].createElement("div", {
32
35
  id: fieldId,
33
36
  className: divClassName,
@@ -39,7 +42,7 @@ function DeliveryOption(_ref) {
39
42
  var value = option.value,
40
43
  isValidDeliveryOption = option.isValidDeliveryOption,
41
44
  isSelected = option.isSelected;
42
- var deliveryOptionValue = (0, _deliveryOptionMessages.getDeliveryOption)(productCode, option, country);
45
+ var deliveryOptionValue = (0, _deliveryOptionMessages.getDeliveryOption)(productCode, option, FTShippingZone);
43
46
 
44
47
  if (!isValidDeliveryOption || !deliveryOptionValue) {
45
48
  return null;
@@ -70,7 +73,7 @@ function DeliveryOption(_ref) {
70
73
  }
71
74
 
72
75
  DeliveryOption.propTypes = {
73
- country: _propTypes["default"].oneOf(['GBR', 'USA', 'CAN']).isRequired,
76
+ country: _propTypes["default"].oneOf(_supportedCountries.countriesSupportedISO).isRequired,
74
77
  productCode: _propTypes["default"].string,
75
78
  options: _propTypes["default"].arrayOf(_propTypes["default"].shape({
76
79
  value: _propTypes["default"].oneOf(['PV', 'HD', 'EV']),
@@ -13,18 +13,37 @@ var _propTypes = _interopRequireDefault(require("prop-types"));
13
13
 
14
14
  var _classnames = _interopRequireDefault(require("classnames"));
15
15
 
16
- var postcodeLabel = {
17
- USA: 'Zip Code',
18
- CAN: 'Postal Code'
19
- };
20
- var promptLabel = {
21
- USA: 'Please enter your 5 digit Zip Code',
22
- CAN: 'Please enter your 6 digit postal code'
23
- };
24
- var placeholderLabel = {
25
- USA: 'e.g. 60411',
26
- CAN: 'e.g. M4W 2C6'
27
- };
16
+ var _supportedCountries = require("../helpers/supportedCountries");
17
+
18
+ var _supportedPostcodeExamples = require("../helpers/supportedPostcodeExamples");
19
+
20
+ var postcodeLabel = Object.keys(_supportedCountries.countriesSupported).reduce(function (previous, countryCode) {
21
+ if (countryCode === 'USA') {
22
+ previous[countryCode] = 'Zip Code';
23
+ } else if (countryCode === 'GBR') {
24
+ previous[countryCode] = 'Postcode';
25
+ } else {
26
+ previous[countryCode] = 'Postal Code';
27
+ }
28
+
29
+ return previous;
30
+ }, {});
31
+ var promptLabel = Object.keys(_supportedCountries.countriesSupported).reduce(function (previous, countryCode) {
32
+ if (countryCode === 'USA') {
33
+ previous[countryCode] = 'Please enter your 5 digit Zip Code';
34
+ } else if (countryCode === 'CAN') {
35
+ previous[countryCode] = 'Please enter your 6 digit postal code';
36
+ } else if (countryCode !== 'GBR') {
37
+ //GBR has no label
38
+ previous[countryCode] = 'Please enter your postal code';
39
+ }
40
+
41
+ return previous;
42
+ }, {});
43
+ var placeholderLabel = Object.keys(_supportedPostcodeExamples.allSupportedPostcodeExamples).reduce(function (previous, countryCode) {
44
+ previous[countryCode] = 'e.g. ' + _supportedPostcodeExamples.allSupportedPostcodeExamples[countryCode];
45
+ return previous;
46
+ }, {});
28
47
 
29
48
  function DeliveryPostcode(_ref) {
30
49
  var _ref$value = _ref.value,
package/dist/index.js CHANGED
@@ -21,12 +21,6 @@ Object.defineProperty(exports, "B2CPartnershipConfirmation", {
21
21
  return _b2cPartnershipConfirmation.B2CPartnershipConfirmation;
22
22
  }
23
23
  });
24
- Object.defineProperty(exports, "B2cPartnershipPaymentTerm", {
25
- enumerable: true,
26
- get: function get() {
27
- return _b2cPartnershipPaymentTerm.B2cPartnershipPaymentTerm;
28
- }
29
- });
30
24
  Object.defineProperty(exports, "BillingCity", {
31
25
  enumerable: true,
32
26
  get: function get() {
@@ -333,6 +327,12 @@ Object.defineProperty(exports, "Submit", {
333
327
  return _submit.Submit;
334
328
  }
335
329
  });
330
+ Object.defineProperty(exports, "TextInput", {
331
+ enumerable: true,
332
+ get: function get() {
333
+ return _textInput.TextInput;
334
+ }
335
+ });
336
336
  Object.defineProperty(exports, "TrialBanner", {
337
337
  enumerable: true,
338
338
  get: function get() {
@@ -344,8 +344,6 @@ var _acceptTerms = require("./accept-terms");
344
344
 
345
345
  var _appBanner = require("./app-banner");
346
346
 
347
- var _b2cPartnershipPaymentTerm = require("./b2c-partnership-payment-term");
348
-
349
347
  var _billingCity = require("./billing-city");
350
348
 
351
349
  var _billingCountry = require("./billing-country");
@@ -450,4 +448,6 @@ var _graduationDate = require("./graduation-date");
450
448
 
451
449
  var _liteSubConfirmation = require("./lite-sub-confirmation");
452
450
 
453
- var _googleSignIn = require("./google-sign-in");
451
+ var _googleSignIn = require("./google-sign-in");
452
+
453
+ var _textInput = require("./text-input");
package/dist/message.js CHANGED
@@ -89,7 +89,7 @@ var actionType = _propTypes["default"].shape({
89
89
  link: _propTypes["default"].string.isRequired,
90
90
  isSecondary: _propTypes["default"].bool,
91
91
  text: _propTypes["default"].string,
92
- target: '_self'
92
+ target: _propTypes["default"].oneOf(['_self'])
93
93
  });
94
94
 
95
95
  Message.propTypes = {
@@ -15,6 +15,8 @@ var _propTypes = _interopRequireDefault(require("prop-types"));
15
15
 
16
16
  var _classnames = _interopRequireDefault(require("classnames"));
17
17
 
18
+ var _nPricing = require("@financial-times/n-pricing");
19
+
18
20
  function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
19
21
 
20
22
  function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
@@ -32,13 +34,54 @@ function PaymentTerm(_ref) {
32
34
  options = _ref$options === void 0 ? [] : _ref$options,
33
35
  _ref$isFixedTermOffer = _ref.isFixedTermOffer,
34
36
  isFixedTermOffer = _ref$isFixedTermOffer === void 0 ? false : _ref$isFixedTermOffer,
35
- displayName = _ref.displayName,
37
+ offerDisplayName = _ref.offerDisplayName,
36
38
  _ref$showLegal = _ref.showLegal,
37
39
  showLegal = _ref$showLegal === void 0 ? true : _ref$showLegal,
38
40
  _ref$largePrice = _ref.largePrice,
39
41
  largePrice = _ref$largePrice === void 0 ? false : _ref$largePrice,
40
42
  _ref$optionsInARow = _ref.optionsInARow,
41
43
  optionsInARow = _ref$optionsInARow === void 0 ? false : _ref$optionsInARow;
44
+
45
+ /**
46
+ * Compute monthly price for given term name
47
+ * @param {number} amount price in number format
48
+ * @param {string} currency country id of the currency
49
+ * @param {string} period PxY (yearly) or PxM (montly) where x is the amount of years/months
50
+ * @returns {string}
51
+ */
52
+ var getMontlyPriceFromPeriod = function getMontlyPriceFromPeriod(amount, currency, period) {
53
+ var periodObj = new _nPricing.Period(period);
54
+ var monthlyPrice = periodObj.calculatePrice('P1M', amount);
55
+ return new _nPricing.Monthly({
56
+ value: monthlyPrice,
57
+ currency: currency
58
+ }).getAmount('monthly');
59
+ };
60
+ /**
61
+ * returns period converted to time if found
62
+ * otherwise returns empty string to avoid show information not mapped
63
+ * @param {string} period PxY (yearly) or PxM (montly) where x is the amount of years/months
64
+ * @returns {string}
65
+ */
66
+
67
+
68
+ var getTimeFromPeriod = function getTimeFromPeriod(period) {
69
+ var freq = period.substring(period.length - 1) === 'Y' ? 'years' : 'months';
70
+ var amount = period.substring(1, period.length - 1);
71
+ return period ? "".concat(amount, " ").concat(freq) : '';
72
+ };
73
+
74
+ var isValidPeriod = function isValidPeriod(period) {
75
+ try {
76
+ // Period should throw an error if it is not properly provided
77
+ // in order to validate it, we just send in case type is string
78
+ new _nPricing.Period(typeof period === 'string' ? period : '');
79
+ return true;
80
+ } catch (e) {
81
+ return false;
82
+ }
83
+ };
84
+
42
85
  var nameMap = {
43
86
  annual: {
44
87
  title: 'Annual',
@@ -103,6 +146,30 @@ function PaymentTerm(_ref) {
103
146
  className: "ncf__payment-term__renews-text"
104
147
  }, textToDisplay);
105
148
  }
149
+ },
150
+ custom: {
151
+ price: function price(_price4) {
152
+ return /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, "Single", ' ', /*#__PURE__*/_react["default"].createElement("span", {
153
+ className: "ncf__payment-term__price ncf__strong"
154
+ }, _price4), ' ', "payment");
155
+ },
156
+ trialPrice: function trialPrice(_trialPrice, trialPeriod) {
157
+ return /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, "Unless you cancel during your trial you will be billed", ' ', /*#__PURE__*/_react["default"].createElement("span", {
158
+ className: "ncf__payment-term__price"
159
+ }, _trialPrice), " per ", trialPeriod, "after the trial period.");
160
+ },
161
+ monthlyPrice: function monthlyPrice(_monthlyPrice) {
162
+ return Boolean(_monthlyPrice) && /*#__PURE__*/_react["default"].createElement("span", {
163
+ className: "ncf__payment-term__equivalent-price"
164
+ }, "That\u2019s equivalent to", ' ', /*#__PURE__*/_react["default"].createElement("span", {
165
+ className: "ncf__payment-term__monthly-price"
166
+ }, _monthlyPrice), ' ', "per month");
167
+ },
168
+ renewsText: function renewsText(renewalPeriod) {
169
+ return Boolean(renewalPeriod) && /*#__PURE__*/_react["default"].createElement("p", {
170
+ className: "ncf__payment-term__renews-text"
171
+ }, "Renews every ", renewalPeriod, " unless cancelled");
172
+ }
106
173
  }
107
174
  };
108
175
 
@@ -122,14 +189,16 @@ function PaymentTerm(_ref) {
122
189
  defaultChecked: true
123
190
  });
124
191
 
125
- var showTrialCopyInTitle = option.isTrial && !isPrintOrBundle && !isEpaper;
126
- var defaultTitle = option.name ? nameMap[option.name].title : '';
127
- var title = isFixedTermOffer ? "".concat(displayName, " - ").concat(defaultTitle) : defaultTitle;
128
-
129
192
  var createDiscount = function createDiscount() {
130
193
  return option.discount && /*#__PURE__*/_react["default"].createElement("span", {
131
194
  className: "ncf__payment-term__discount"
132
- }, option.bestOffer ? 'Best offer -' : 'Save', " ", option.discount, " off RRP");
195
+ }, option.bestOffer ? 'Best offer' : "Save ".concat(option.discount, " off RRP"));
196
+ };
197
+
198
+ var createB2cDiscountCopy = function createB2cDiscountCopy() {
199
+ return option.name === 'annual' && option.b2cPartnership && option.b2cDiscountCopy && /*#__PURE__*/_react["default"].createElement("span", {
200
+ className: "ncf__payment-term__discount"
201
+ }, option.b2cDiscountCopy);
133
202
  };
134
203
 
135
204
  var createDescription = function createDescription() {
@@ -139,24 +208,59 @@ function PaymentTerm(_ref) {
139
208
  className: "ncf__payment-term__trial-price"
140
209
  }, option.trialPrice), /*#__PURE__*/_react["default"].createElement("br", null), nameMap[option.name] && nameMap[option.name].trialPrice(option.price)) : /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, nameMap[option.name] ? /*#__PURE__*/_react["default"].createElement("div", {
141
210
  className: "ncf__payment-term__description"
142
- }, nameMap[option.name].price(option.price), nameMap[option.name].monthlyPrice(option.monthlyPrice), nameMap[option.name].renewsText(isFixedTermOffer)) : /*#__PURE__*/_react["default"].createElement("div", null, /*#__PURE__*/_react["default"].createElement("span", {
211
+ }, nameMap[option.name].price(option.price), nameMap[option.name].monthlyPrice(option.monthlyPrice), nameMap[option.name].renewsText(isFixedTermOffer)) : // this should cover the cases different than annual, quarterly and monthly
212
+ // for those containing period on option.value, render custom template, for the rest keep legacy render
213
+ isValidPeriod(option.value) ? /*#__PURE__*/_react["default"].createElement("div", {
214
+ className: "ncf__payment-term__description"
215
+ }, nameMap['custom'].price(option.price), nameMap['custom'].monthlyPrice(option.monthlyPrice && option.monthlyPrice !== '0' ? Number(option.monthlyPrice) : getMontlyPriceFromPeriod(option.amount, option.currency, option.value)), nameMap['custom'].renewsText(getTimeFromPeriod(option.value))) : /*#__PURE__*/_react["default"].createElement("div", null, /*#__PURE__*/_react["default"].createElement("span", {
143
216
  className: largePrice ? 'ncf__payment-term__large-price' : ''
144
217
  }, option.price), option.chargeOnText && /*#__PURE__*/_react["default"].createElement("p", {
145
218
  className: "ncf__payment-term__charge-on-text"
146
219
  }, option.chargeOnText)));
147
220
  };
148
221
 
222
+ var getTermDisplayName = function getTermDisplayName() {
223
+ var showTrialCopyInTitle = option.isTrial && !isPrintOrBundle && !isEpaper;
224
+ var defaultTitle = option.name && nameMap[option.name] ? nameMap[option.name].title : '';
225
+ var title = isFixedTermOffer ? "".concat(offerDisplayName, " - ").concat(defaultTitle) : defaultTitle;
226
+ var termDisplayName = '';
227
+
228
+ if (showTrialCopyInTitle) {
229
+ var termName = option.displayName ? option.displayName : 'Premium Digital';
230
+ termDisplayName = "Trial: ".concat(termName, " - ");
231
+ }
232
+
233
+ var getTermPeriod = function getTermPeriod() {
234
+ // annual, quarterly and monthly
235
+ if (nameMap[option.name]) {
236
+ return title;
237
+ } // custom offer with period provided
238
+
239
+
240
+ if (isValidPeriod(option.value)) {
241
+ return getTimeFromPeriod(option.value);
242
+ } // custom legacy cases, where period is not provided
243
+
244
+
245
+ return option.title;
246
+ };
247
+
248
+ var termPeriod = getTermPeriod();
249
+ termDisplayName = "".concat(termDisplayName).concat(termPeriod, " ");
250
+ return termDisplayName;
251
+ };
252
+
149
253
  return /*#__PURE__*/_react["default"].createElement("div", {
150
254
  key: option.value,
151
255
  className: className
152
256
  }, /*#__PURE__*/_react["default"].createElement("input", props), /*#__PURE__*/_react["default"].createElement("label", {
153
257
  htmlFor: option.value,
154
258
  className: "o-forms-input__label ncf__payment-term__label"
155
- }, createDiscount(), /*#__PURE__*/_react["default"].createElement("span", {
259
+ }, createDiscount(), createB2cDiscountCopy(), /*#__PURE__*/_react["default"].createElement("span", {
156
260
  className: (0, _classnames["default"])(['ncf__payment-term__title', {
157
261
  'ncf__payment-term__title--large-price': largePrice
158
262
  }])
159
- }, showTrialCopyInTitle ? 'Trial: Premium Digital - ' : '', nameMap[option.name] ? title : option.title, ' ', option.subTitle && /*#__PURE__*/_react["default"].createElement("span", {
263
+ }, getTermDisplayName(), option.subTitle && /*#__PURE__*/_react["default"].createElement("span", {
160
264
  className: "ncf__regular ncf__payment-term__sub-title"
161
265
  }, option.subTitle)), createDescription()));
162
266
  };
@@ -191,6 +295,8 @@ PaymentTerm.propTypes = {
191
295
  isPrintOrBundle: _propTypes["default"].bool,
192
296
  isEpaper: _propTypes["default"].bool,
193
297
  options: _propTypes["default"].arrayOf(_propTypes["default"].shape({
298
+ b2cDiscountCopy: _propTypes["default"].string,
299
+ isB2cPartnership: _propTypes["default"].bool,
194
300
  discount: _propTypes["default"].string,
195
301
  isTrial: _propTypes["default"].bool,
196
302
  name: _propTypes["default"].string.isRequired,
@@ -198,7 +304,7 @@ PaymentTerm.propTypes = {
198
304
  selected: _propTypes["default"].bool,
199
305
  trialDuration: _propTypes["default"].string,
200
306
  trialPrice: _propTypes["default"].string,
201
- amount: _propTypes["default"].number,
307
+ amount: _propTypes["default"].string,
202
308
  trialAmount: _propTypes["default"].number,
203
309
  value: _propTypes["default"].string.isRequired,
204
310
  monthlyPrice: _propTypes["default"].string,
@@ -208,7 +314,7 @@ PaymentTerm.propTypes = {
208
314
  chargeOnText: _propTypes["default"].string
209
315
  })),
210
316
  isFixedTermOffer: _propTypes["default"].bool,
211
- displayName: _propTypes["default"].string,
317
+ offerDisplayName: _propTypes["default"].string,
212
318
  showLegal: _propTypes["default"].bool,
213
319
  largePrice: _propTypes["default"].bool,
214
320
  optionsInARow: _propTypes["default"].bool
@@ -189,7 +189,8 @@ function PaymentType(_ref) {
189
189
  type: 'checkbox',
190
190
  name: 'payFasterNextTime',
191
191
  value: 'true',
192
- required: false
192
+ required: false,
193
+ checked: true
193
194
  }, isSingleTermChecked && {
194
195
  defaultChecked: true
195
196
  });
@@ -201,7 +202,9 @@ function PaymentType(_ref) {
201
202
  className: "o-forms-input o-forms-input--radio-box ncf__payment-type-selector"
202
203
  }, createPaymentTypes()), /*#__PURE__*/_react["default"].createElement("div", {
203
204
  className: "o-forms-input__error"
204
- }, "Please enter a valid payment type"), createDirectDebitPanel(), createZuoraPanel(), isSingleTerm && /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement("label", {
205
+ }, "Please enter a valid payment type"), createDirectDebitPanel(), createZuoraPanel()), /*#__PURE__*/_react["default"].createElement("div", {
206
+ className: "o-forms-field"
207
+ }, isSingleTerm && /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement("label", {
205
208
  className: "o-forms-input o-forms-input--checkbox o-forms-input--suffix ncf__payment-type-pay-faster-next-time-checkbox",
206
209
  htmlFor: "payFasterNextTime"
207
210
  }, /*#__PURE__*/_react["default"].createElement("input", inputCheckProps), /*#__PURE__*/_react["default"].createElement("span", {
package/dist/position.js CHANGED
@@ -15,7 +15,8 @@ var _classnames = _interopRequireDefault(require("classnames"));
15
15
 
16
16
  var _nCommonStaticData = require("n-common-static-data");
17
17
 
18
- var defaultOptions = _nCommonStaticData.demographics.positions.positions;
18
+ var B2CPositions = _nCommonStaticData.demographics.positions.positions;
19
+ var B2BPositions = _nCommonStaticData.b2b.demographics.positions.positions;
19
20
 
20
21
  function Position(_ref) {
21
22
  var value = _ref.value,
@@ -29,8 +30,10 @@ function Position(_ref) {
29
30
  selectId = _ref$selectId === void 0 ? 'position' : _ref$selectId,
30
31
  _ref$selectName = _ref.selectName,
31
32
  selectName = _ref$selectName === void 0 ? 'position' : _ref$selectName,
33
+ _ref$isB2B = _ref.isB2B,
34
+ isB2B = _ref$isB2B === void 0 ? false : _ref$isB2B,
32
35
  _ref$options = _ref.options,
33
- options = _ref$options === void 0 ? defaultOptions : _ref$options,
36
+ options = _ref$options === void 0 ? isB2B ? B2BPositions : B2CPositions : _ref$options,
34
37
  _ref$isRequired = _ref.isRequired,
35
38
  isRequired = _ref$isRequired === void 0 ? true : _ref$isRequired,
36
39
  _ref$fieldLabel = _ref.fieldLabel,
@@ -81,6 +84,7 @@ Position.propTypes = {
81
84
  fieldId: _propTypes["default"].string,
82
85
  selectId: _propTypes["default"].string,
83
86
  selectName: _propTypes["default"].string,
87
+ isB2B: _propTypes["default"].bool,
84
88
  options: _propTypes["default"].arrayOf(_propTypes["default"].shape({
85
89
  code: _propTypes["default"].string,
86
90
  description: _propTypes["default"].string