@financial-times/n-myft-ui 31.0.0 → 31.0.2

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.
@@ -61,14 +61,18 @@ const instantAlertsIconOff = ({ event, followPlusInstantAlerts }) => {
61
61
  });
62
62
  };
63
63
 
64
-
65
64
  const sendModalToggleEvent = ({ followPlusInstantAlerts }) => {
66
65
  const preferenceModalToggleEvent = new CustomEvent('myft.preference-modal.show-hide.toggle', { bubbles: true });
67
66
  followPlusInstantAlerts.dispatchEvent(preferenceModalToggleEvent);
68
67
  followPlusInstantAlerts.classList.toggle('n-myft-follow-button--instant-alerts--open');
69
-
70
68
  };
71
69
 
70
+ const sendModalHideEvent = ({ event, followPlusInstantAlerts }) => {
71
+ if (event.target !== followPlusInstantAlerts) {
72
+ const preferenceModalHideEvent = new CustomEvent('myft.preference-modal.hide', { detail: {targetElement: event.target}, bubbles: true });
73
+ followPlusInstantAlerts.dispatchEvent(preferenceModalHideEvent);
74
+ }
75
+ };
72
76
 
73
77
  export default () => {
74
78
  /**
@@ -88,5 +92,8 @@ export default () => {
88
92
  document.body.addEventListener('myft.user.followed.concept.load', (event) => instantAlertsIconLoad({event, followPlusInstantAlerts}));
89
93
 
90
94
  document.body.addEventListener('myft.user.followed.concept.update', (event) => instantAlertsIconUpdate({event, followPlusInstantAlerts}));
95
+
91
96
  document.body.addEventListener('myft.user.followed.concept.remove', (event) => instantAlertsIconOff({ event, followPlusInstantAlerts }));
97
+
98
+ document.addEventListener('click', (event) => sendModalHideEvent({event, followPlusInstantAlerts}));
92
99
  };
@@ -9,6 +9,13 @@ const renderError = ({ message, preferencesModal }) => {
9
9
  errorElement.innerHTML = message;
10
10
  };
11
11
 
12
+ const removeError = ({ preferencesModal }) => {
13
+ renderError({
14
+ message: "",
15
+ preferencesModal,
16
+ });
17
+ }
18
+
12
19
  /**
13
20
  * This preference modal is part of a test
14
21
  * Therefore we have built the positioning function to work within the known parameters of that test
@@ -75,6 +82,13 @@ const tracking = (conceptId) => {
75
82
  document.body.dispatchEvent(trackingEvent);
76
83
  };
77
84
 
85
+ const preferenceModalHide = ({ event, preferencesModal }) => {
86
+ if (!preferencesModal.contains(event.detail.targetElement)) {
87
+ preferencesModal.classList.remove('n-myft-ui__preferences-modal--show');
88
+ removeError({ preferencesModal });
89
+ }
90
+ };
91
+
78
92
  const preferenceModalShowAndHide = ({ event, preferencesModal, conceptId }) => {
79
93
  preferencesModal.classList.toggle('n-myft-ui__preferences-modal--show');
80
94
 
@@ -85,23 +99,25 @@ const preferenceModalShowAndHide = ({ event, preferencesModal, conceptId }) => {
85
99
 
86
100
  } else {
87
101
  // Remove existing errors when hiding the modal
88
- renderError({
89
- message: '',
90
- preferencesModal,
91
- });
102
+ removeError({ preferencesModal });
92
103
  }
93
104
  };
94
105
 
95
106
  const removeTopic = async ({ event, conceptId, preferencesModal }) => {
96
107
  event.target.setAttribute('disabled', true);
97
108
 
109
+ // remove error message before attempt to remove topic
110
+ removeError({ preferencesModal });
111
+
98
112
  try {
99
113
  await myFtClient.remove('user', null, 'followed', 'concept', conceptId, { token: csrfToken });
100
114
  preferenceModalShowAndHide({ preferencesModal });
101
115
  } catch (error) {
102
- renderError({ message: 'Sorry, we are unable to remove this topic. Please try again later or try from <a href="/myft">myFT</a>', preferencesModal });
116
+ renderError({
117
+ message: 'Sorry, we are unable to remove this topic. Please try again later or try from <a href="/myft">myFT</a>',
118
+ preferencesModal,
119
+ });
103
120
  }
104
-
105
121
  event.target.removeAttribute('disabled');
106
122
  };
107
123
 
@@ -169,6 +185,9 @@ const toggleInstantAlertsPreference = async ({ event, conceptId, preferencesModa
169
185
 
170
186
  instantAlertsCheckbox.setAttribute('disabled', true);
171
187
 
188
+ // remove error message before attempt to toggle instant alert
189
+ removeError({ preferencesModal });
190
+
172
191
  const data = {
173
192
  token: csrfToken
174
193
  };
@@ -188,7 +207,7 @@ const toggleInstantAlertsPreference = async ({ event, conceptId, preferencesModa
188
207
  } catch (error) {
189
208
  renderError({
190
209
  message: 'Sorry, we are unable to change your instant alert preference. Please try again later or try from <a href="/myft">myFT</a>',
191
- preferencesModal
210
+ preferencesModal,
192
211
  });
193
212
 
194
213
  instantAlertsCheckbox.checked = instantAlertsCheckbox.checked
@@ -245,6 +264,8 @@ export default () => {
245
264
 
246
265
  document.addEventListener('myft.preference-modal.show-hide.toggle', event => preferenceModalShowAndHide({ event, preferencesModal, conceptId }));
247
266
 
267
+ document.addEventListener('myft.preference-modal.hide', event => preferenceModalHide({ event, preferencesModal }));
268
+
248
269
  document.addEventListener('myft.user.preferred.preference.load', (event) => getAlertsPreferences({ event, preferencesModal }));
249
270
 
250
271
  document.body.addEventListener('myft.user.followed.concept.load', (event) => setCheckboxForAlertConcept({ event, preferencesModal }));
@@ -47,14 +47,39 @@
47
47
  color: oColorsByName('claret-60');
48
48
  }
49
49
 
50
+ .n-myft-ui__preferences-modal__remove-button:disabled {
51
+ opacity: 0.5;
52
+ }
53
+
50
54
  .n-myft-ui__preferences-modal--show {
51
55
  display: block;
52
56
  visibility: visible;
53
57
  }
54
58
 
59
+ // reference to the color/BG color of the error message
60
+ // components/o-message/src/scss/_brand.scss#L21 in origami
55
61
  .n-myft-ui__preferences-modal-error {
56
62
  display: block;
57
63
  @include oTypographySans($scale: -1, $weight: 'regular', $style: 'normal');
58
- color: oColorsByName('claret');
59
- text-align: center;
64
+ color: oColorsMix('black', 'crimson', $percentage: 12.5);
65
+ background-color: oColorsMix('crimson', $percentage: 10);
66
+ text-align: left;
67
+ padding: 8px 12px;
68
+ margin-top: 16px;
69
+
70
+ // use opacity to enforce CSS transition
71
+ opacity: 1;
72
+ transition: opacity 0.5s;
73
+
74
+ a {
75
+ @include oTypographySans($scale: -1, $weight: 'semibold', $style: 'normal');
76
+ color: oColorsMix('black', 'crimson', $percentage: 12.5);
77
+ text-decoration-color: oColorsMix('black', 'crimson', $percentage: 12.5);
78
+ }
79
+ }
80
+
81
+ .n-myft-ui__preferences-modal-error:empty {
82
+ opacity: 0;
83
+ padding: 0;
84
+ margin-top: 0;
60
85
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@financial-times/n-myft-ui",
3
- "version": "31.0.0",
3
+ "version": "31.0.2",
4
4
  "description": "Client side component for interaction with myft",
5
5
  "main": "server.js",
6
6
  "scripts": {