@aarhus-university/au-lib-react-components 9.11.17 → 9.12.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 (148) hide show
  1. package/.eslintrc +18 -18
  2. package/README.md +20 -20
  3. package/babel.config.js +6 -6
  4. package/build/dev.html +328 -328
  5. package/build/umd/all.css +2 -2
  6. package/build/umd/all.css.map +1 -1
  7. package/build/umd/all.js +1 -1
  8. package/build/umd/alphabox.js +1 -1
  9. package/build/umd/alphabox.js.map +1 -1
  10. package/build/umd/auAuth.js +1 -1
  11. package/build/umd/auAuth.js.map +1 -1
  12. package/build/umd/databox.js +2 -2
  13. package/build/umd/databox.js.LICENSE.txt +5 -5
  14. package/build/umd/databox.js.map +1 -1
  15. package/build/umd/diagramme.js +1 -1
  16. package/build/umd/flowbox.js +1 -1
  17. package/build/umd/flowbox.js.map +1 -1
  18. package/build/umd/news.js +1 -1
  19. package/build/umd/news.js.map +1 -1
  20. package/build/umd/universe.js +1 -1
  21. package/build/umd/universe.js.map +1 -1
  22. package/package.json +60 -60
  23. package/src/all.js +3 -3
  24. package/src/app.js +263 -263
  25. package/src/components/AUAlertComponent.js +158 -158
  26. package/src/components/AUAmountComponent.js +84 -84
  27. package/src/components/AUBannerComponent.js +99 -99
  28. package/src/components/AUCalendarComponent.js +393 -393
  29. package/src/components/AUCollapsibleComponent.js +173 -173
  30. package/src/components/AUDatepickerComponent.js +105 -105
  31. package/src/components/AUDiagrammeComponent.js +310 -310
  32. package/src/components/AUFilterCheckboxComponent.js +122 -122
  33. package/src/components/AUFocusComponent.js +55 -55
  34. package/src/components/AUModalComponent.js +94 -94
  35. package/src/components/AUPaginationComponent.js +103 -103
  36. package/src/components/AUSpinnerComponent.js +125 -125
  37. package/src/components/AutoSuggestComponent.js +157 -132
  38. package/src/components/alphabox/AlphaBoxComponent.js +145 -140
  39. package/src/components/alphabox/AlphaBoxContentComponent.js +136 -125
  40. package/src/components/context/AUUserContextComponent.js +91 -91
  41. package/src/components/context/ImpersonateComponent.js +54 -54
  42. package/src/components/databox/DataBoxAlphabetComponent.js +144 -144
  43. package/src/components/databox/DataBoxAssociationComponent.js +122 -122
  44. package/src/components/databox/DataBoxButtonComponent.js +153 -153
  45. package/src/components/databox/DataBoxComponent.js +297 -297
  46. package/src/components/databox/DataBoxGroupingComponent.js +62 -62
  47. package/src/components/databox/DataBoxSearchResultComponent.js +40 -40
  48. package/src/components/databox/DataBoxStackedAssociationComponent.js +58 -58
  49. package/src/components/databox/DataBoxSuggestionComponent.js +39 -39
  50. package/src/components/delphinus/AUAlertComponent.js +85 -85
  51. package/src/components/delphinus/AUCalendarComponent.js +487 -487
  52. package/src/components/delphinus/AUContentToggleComponent.js +32 -32
  53. package/src/components/delphinus/AUDatepickerComponent.js +164 -164
  54. package/src/components/delphinus/AULoginComponent.js +65 -65
  55. package/src/components/delphinus/AUModalComponent.js +94 -94
  56. package/src/components/delphinus/AUSpinnerComponent.js +114 -114
  57. package/src/components/delphinus/AUSubNavComponent.js +53 -53
  58. package/src/components/delphinus/AUTabbedContentComponent.js +150 -150
  59. package/src/components/delphinus/AUTableComponent.js +28 -28
  60. package/src/components/delphinus/AUToastComponent.js +91 -91
  61. package/src/components/delphinus/AUToolbarComponent.js +48 -48
  62. package/src/components/delphinus/hooks.js +28 -28
  63. package/src/components/flowbox/FlowBoxComponent.js +126 -126
  64. package/src/components/flowbox/FlowBoxPhoneComponent.js +106 -106
  65. package/src/components/form/AUMobilePrefixComponent.js +18 -18
  66. package/src/components/form/AUReceiptComponent.js +40 -40
  67. package/src/components/form/AUSubmitButtonContainerComponent.js +39 -39
  68. package/src/components/news/EventLayout1Component.js +94 -94
  69. package/src/components/news/EventLayout2Component.js +90 -90
  70. package/src/components/news/EventLayout3Component.js +68 -68
  71. package/src/components/news/NewsCategoriesComponent.js +21 -21
  72. package/src/components/news/NewsCollageBannerComponent.js +71 -71
  73. package/src/components/news/NewsCollageBannerRSSComponent.js +79 -79
  74. package/src/components/news/NewsColumnsComponent.js +125 -125
  75. package/src/components/news/NewsLanguageChangeComponent.js +74 -74
  76. package/src/components/news/NewsLayout1Component.js +80 -80
  77. package/src/components/news/NewsLayout2Component.js +80 -80
  78. package/src/components/news/NewsLayout3Component.js +81 -81
  79. package/src/components/news/NewsLayout4Component.js +80 -80
  80. package/src/components/news/NewsLayout5Component.js +61 -61
  81. package/src/components/news/NewsLayout6Component.js +55 -55
  82. package/src/components/news/NewsLayout7Component.js +58 -58
  83. package/src/components/news/NewsLayout8Component.js +57 -57
  84. package/src/components/news/NewsListComponent.js +291 -291
  85. package/src/components/news/NewsPopUpComponent.js +591 -591
  86. package/src/components/news/NewsRSSComponent.js +74 -74
  87. package/src/components/news/NewsSocialComponent.js +104 -104
  88. package/src/components/news/NewsSubHeaderComponent.js +19 -19
  89. package/src/components/password/AUChangePasswordComponent.js +190 -177
  90. package/src/components/password/AUCurrentPasswordComponent.js +72 -72
  91. package/src/components/password/AUNewPasswordComponent.js +143 -143
  92. package/src/components/password/AUPasswordActions.js +101 -101
  93. package/src/components/password/AUPasswordHooks.js +47 -47
  94. package/src/components/password/AUPasswordReducer.js +78 -78
  95. package/src/components/password/AUPasswordRequirementsComponent.js +29 -29
  96. package/src/components/profile/AUProfileActions.js +128 -128
  97. package/src/components/profile/AUProfileAvatar2016Component.js +99 -99
  98. package/src/components/profile/AUProfileAvatarComponent.js +83 -83
  99. package/src/components/profile/AUProfileAvatarV2Component.js +91 -91
  100. package/src/components/profile/AUProfileAvatarV3Component.js +80 -80
  101. package/src/components/profile/AUProfileContainerComponent.js +283 -283
  102. package/src/components/profile/AUProfileHooks.js +30 -30
  103. package/src/components/profile/AUProfileItemComponent.js +54 -54
  104. package/src/components/profile/AUProfileLanguageComponent.js +131 -131
  105. package/src/components/profile/AUProfileLoginComponent.js +41 -41
  106. package/src/components/profile/AUProfileMailComponent.js +307 -307
  107. package/src/components/profile/AUProfileMobileComponent.js +164 -164
  108. package/src/components/profile/AUProfileNameComponent.js +253 -253
  109. package/src/components/profile/AUProfileNextOfKinComponent.js +216 -216
  110. package/src/components/profile/AUProfileReducer.js +230 -230
  111. package/src/components/profile/AUProfileWidgetComponent.js +95 -95
  112. package/src/components/profile/AUProfileWidgetV2Component.js +116 -116
  113. package/src/components/profile/AUProfileWidgetV3Component.js +130 -130
  114. package/src/components/universe/StaffTopComponent.js +362 -362
  115. package/src/components/universe/StudentTopComponent.js +137 -137
  116. package/src/components/universe/UniverseContainerComponent.js +62 -62
  117. package/src/components/wrapping/AUEmbedComponent.js +47 -47
  118. package/src/config/webpack.dev.config.js +47 -47
  119. package/src/config/webpack.umd.config.js +86 -85
  120. package/src/index.js +6 -6
  121. package/src/lib/au-alphabox.js +102 -102
  122. package/src/lib/au-auth.js +227 -227
  123. package/src/lib/au-databox.js +403 -403
  124. package/src/lib/au-diagramme.js +87 -87
  125. package/src/lib/au-flowbox.js +95 -95
  126. package/src/lib/au-news.js +371 -371
  127. package/src/lib/helpers.js +222 -216
  128. package/src/lib/i18n.js +603 -601
  129. package/src/lib/menu.js +10 -10
  130. package/src/lib/tracking.js +65 -65
  131. package/src/lib/universe.js +9 -9
  132. package/src/lib/urlHandler.js +63 -63
  133. package/src/lib/validation.js +219 -181
  134. package/src/lib/wrapping.js +16 -16
  135. package/src/styles/_settings.scss +10 -10
  136. package/src/styles/alert.scss +39 -39
  137. package/src/styles/alphabox.scss +222 -208
  138. package/src/styles/app.scss +13 -13
  139. package/src/styles/autosuggest.scss +57 -57
  140. package/src/styles/calendar.scss +111 -111
  141. package/src/styles/databox.scss +563 -563
  142. package/src/styles/diagramme.scss +119 -119
  143. package/src/styles/filtercheckbox.scss +4 -4
  144. package/src/styles/flowbox.scss +72 -72
  145. package/src/styles/maps.scss +395 -395
  146. package/src/styles/modal.scss +34 -34
  147. package/src/styles/pagination.scss +10 -10
  148. package/src/styles/spinner.scss +30 -30
@@ -1,177 +1,190 @@
1
- /* eslint-env browser */
2
- /* eslint-disable max-len */
3
- import React, { useEffect } from 'react';
4
- import PropTypes from 'prop-types';
5
- import AUPasswordRequirementsComponent from './AUPasswordRequirementsComponent';
6
- import AUReceiptComponent from '../form/AUReceiptComponent';
7
- import CurrentPasswordComponent from './AUCurrentPasswordComponent';
8
- import AUNewPasswordComponent from './AUNewPasswordComponent';
9
- import { validatePassword } from '../../lib/validation';
10
- import { useAUPassword, useAUPasswordValidation } from './AUPasswordHooks';
11
- import { passwordLabels } from '../../lib/i18n';
12
-
13
- const AUChangePasswordComponent = ({
14
- user: {
15
- preferredLanguage,
16
- },
17
- password: {
18
- saving,
19
- saved,
20
- },
21
- dismissMessages,
22
- messages,
23
- onSave,
24
- onSaveAction,
25
- gotoLink,
26
- }) => {
27
- const [
28
- { currentPassword, setCurrentPassword },
29
- { newPassword, setNewPassword },
30
- { confirmPassword, setConfirmPassword },
31
- ] = useAUPassword();
32
-
33
- const [
34
- { currentPasswordValidationMessages, setCurrentPasswordValidationMessages },
35
- {
36
- newPasswordValidated,
37
- setNewPasswordValidated,
38
- newPasswordValidationMessages,
39
- setNewPasswordValidationMessages,
40
- },
41
- {
42
- confirmPasswordValidated,
43
- setConfirmPasswordValidated,
44
- confirmPasswordValidationMessages,
45
- setConfirmPasswordValidationMessages,
46
- },
47
- ] = useAUPasswordValidation();
48
-
49
- useEffect(() => {
50
- dismissMessages();
51
- }, []);
52
-
53
- const handleSubmit = () => {
54
- if (currentPassword === '') {
55
- setCurrentPasswordValidationMessages([passwordLabels[preferredLanguage].currentPassword]);
56
- } else {
57
- const v = validatePassword(preferredLanguage, newPassword, confirmPassword, false, true);
58
- setNewPasswordValidated(v.newPasswordValid);
59
- setNewPasswordValidationMessages(v.newPasswordMessages);
60
- setConfirmPasswordValidated(v.confirmPasswordValid);
61
- setConfirmPasswordValidationMessages(v.confirmPasswordMessages);
62
- if (v.newPasswordValid && v.confirmPasswordValid) {
63
- onSave({
64
- oldPassword: currentPassword,
65
- password: newPassword,
66
- }, onSaveAction);
67
- }
68
- }
69
- };
70
-
71
- if (saved) {
72
- return (
73
- <div className="page__content__block">
74
- <AUReceiptComponent
75
- receiptText={passwordLabels[preferredLanguage].receipt}
76
- buttons={[{
77
- gotoLink,
78
- gotoText: passwordLabels[preferredLanguage].goto,
79
- }]}
80
- />
81
- </div>
82
- );
83
- }
84
-
85
- return (
86
- <div className="page__content__block">
87
- <h1>{passwordLabels[preferredLanguage].changePassword}</h1>
88
- <p>{passwordLabels[preferredLanguage].changePasswordInfo}</p>
89
- <form
90
- className="form"
91
- noValidate="novalidate"
92
- onSubmit={(e) => {
93
- e.preventDefault();
94
- handleSubmit();
95
- }}
96
- >
97
- <CurrentPasswordComponent
98
- lang={preferredLanguage}
99
- saving={saving}
100
- errorMessages={messages.filter((x) => x.type === 'LdapFailedAuthenticationException').map((x) => x.message)}
101
- setErrorMessages={dismissMessages}
102
- currentPassword={currentPassword}
103
- setCurrentPassword={setCurrentPassword}
104
- currentPasswordValidationMessages={currentPasswordValidationMessages}
105
- setCurrentPasswordValidationMessages={setCurrentPasswordValidationMessages}
106
- />
107
- <hr />
108
- <div className="row row--wrap-reverse row--equal-height-items">
109
- <AUNewPasswordComponent
110
- lang={preferredLanguage}
111
- saving={saving}
112
- errorMessages={messages.filter((x) => x.type === 'LdapPasswordUsedBeforeException').map((x) => x.message)}
113
- setErrorMessages={dismissMessages}
114
- newPassword={newPassword}
115
- newPasswordValidated={newPasswordValidated}
116
- newPasswordValidationMessages={newPasswordValidationMessages}
117
- setNewPassword={setNewPassword}
118
- setNewPasswordValidated={setNewPasswordValidated}
119
- setNewPasswordValidationMessages={setNewPasswordValidationMessages}
120
- confirmPassword={confirmPassword}
121
- confirmPasswordValidated={confirmPasswordValidated}
122
- confirmPasswordValidationMessages={confirmPasswordValidationMessages}
123
- setConfirmPassword={setConfirmPassword}
124
- setConfirmPasswordValidated={setConfirmPasswordValidated}
125
- setConfirmPasswordValidationMessages={setConfirmPasswordValidationMessages}
126
- />
127
- <AUPasswordRequirementsComponent lang={preferredLanguage} />
128
- </div>
129
- </form>
130
- </div>
131
- );
132
- };
133
-
134
- AUChangePasswordComponent.displayName = 'AUChangePasswordComponent';
135
-
136
- AUChangePasswordComponent.defaultProps = {
137
- onSaveAction: (data, callback) => {
138
- const putData = async () => {
139
- let url = `${window.profileApiUri}/ChangePassword`;
140
- if (typeof window.API_AUID !== 'undefined') {
141
- url = `${url}?auid=${window.API_AUID}`;
142
- }
143
- const response = await fetch(url, {
144
- method: 'PUT',
145
- credentials: 'include',
146
- headers: {
147
- 'Content-Type': 'application/json',
148
- },
149
- body: JSON.stringify(data),
150
- });
151
- const json = await response.json();
152
- callback(response.ok, response.status, json);
153
- };
154
-
155
- putData();
156
- },
157
- };
158
-
159
- AUChangePasswordComponent.propTypes = {
160
- password: PropTypes.shape({
161
- saving: PropTypes.bool.isRequired,
162
- saved: PropTypes.bool.isRequired,
163
- }).isRequired,
164
- user: PropTypes.shape({
165
- preferredLanguage: PropTypes.string.isRequired,
166
- }).isRequired,
167
- onSave: PropTypes.func.isRequired,
168
- onSaveAction: PropTypes.func,
169
- dismissMessages: PropTypes.func.isRequired,
170
- messages: PropTypes.arrayOf(PropTypes.shape({
171
- type: PropTypes.string.isRequired,
172
- message: PropTypes.string.isRequired,
173
- })).isRequired,
174
- gotoLink: PropTypes.string.isRequired,
175
- };
176
-
177
- export default AUChangePasswordComponent;
1
+ /* eslint-env browser */
2
+ /* eslint-disable max-len */
3
+ import React, { useEffect } from 'react';
4
+ import PropTypes from 'prop-types';
5
+ import AUPasswordRequirementsComponent from './AUPasswordRequirementsComponent';
6
+ import AUReceiptComponent from '../form/AUReceiptComponent';
7
+ import CurrentPasswordComponent from './AUCurrentPasswordComponent';
8
+ import AUNewPasswordComponent from './AUNewPasswordComponent';
9
+ import { validatePassword } from '../../lib/validation';
10
+ import { useAUPassword, useAUPasswordValidation } from './AUPasswordHooks';
11
+ import { passwordLabels } from '../../lib/i18n';
12
+
13
+ const AUChangePasswordComponent = ({
14
+ user: {
15
+ preferredLanguage,
16
+ },
17
+ password: {
18
+ saving,
19
+ saved,
20
+ },
21
+ dismissMessages,
22
+ messages,
23
+ onSave,
24
+ onSaveAction,
25
+ gotoLink,
26
+ isPwned,
27
+ }) => {
28
+ const [
29
+ { currentPassword, setCurrentPassword },
30
+ { newPassword, setNewPassword },
31
+ { confirmPassword, setConfirmPassword },
32
+ ] = useAUPassword();
33
+
34
+ const [
35
+ { currentPasswordValidationMessages, setCurrentPasswordValidationMessages },
36
+ {
37
+ newPasswordValidated,
38
+ setNewPasswordValidated,
39
+ newPasswordValidationMessages,
40
+ setNewPasswordValidationMessages,
41
+ },
42
+ {
43
+ confirmPasswordValidated,
44
+ setConfirmPasswordValidated,
45
+ confirmPasswordValidationMessages,
46
+ setConfirmPasswordValidationMessages,
47
+ },
48
+ ] = useAUPasswordValidation();
49
+
50
+ useEffect(() => {
51
+ dismissMessages();
52
+ }, []);
53
+
54
+ const handleSubmit = () => {
55
+ if (currentPassword === '') {
56
+ setCurrentPasswordValidationMessages([passwordLabels[preferredLanguage].currentPassword]);
57
+ } else {
58
+ const v = validatePassword(
59
+ preferredLanguage,
60
+ newPassword,
61
+ confirmPassword,
62
+ false,
63
+ true,
64
+ isPwned,
65
+ );
66
+ setNewPasswordValidated(v.newPasswordValid);
67
+ setNewPasswordValidationMessages(v.newPasswordMessages);
68
+ setConfirmPasswordValidated(v.confirmPasswordValid);
69
+ setConfirmPasswordValidationMessages(v.confirmPasswordMessages);
70
+ if (v.newPasswordValid && v.confirmPasswordValid) {
71
+ onSave({
72
+ oldPassword: currentPassword,
73
+ password: newPassword,
74
+ }, onSaveAction);
75
+ }
76
+ }
77
+ };
78
+
79
+ if (saved) {
80
+ return (
81
+ <div className="page__content__block">
82
+ <AUReceiptComponent
83
+ receiptText={passwordLabels[preferredLanguage].receipt}
84
+ buttons={[{
85
+ gotoLink,
86
+ gotoText: passwordLabels[preferredLanguage].goto,
87
+ }]}
88
+ />
89
+ </div>
90
+ );
91
+ }
92
+
93
+ return (
94
+ <div className="page__content__block">
95
+ <h1>{passwordLabels[preferredLanguage].changePassword}</h1>
96
+ <p>{passwordLabels[preferredLanguage].changePasswordInfo}</p>
97
+ <form
98
+ className="form"
99
+ noValidate="novalidate"
100
+ onSubmit={(e) => {
101
+ e.preventDefault();
102
+ handleSubmit();
103
+ }}
104
+ >
105
+ <CurrentPasswordComponent
106
+ lang={preferredLanguage}
107
+ saving={saving}
108
+ errorMessages={messages.filter((x) => x.type === 'LdapFailedAuthenticationException').map((x) => x.message)}
109
+ setErrorMessages={dismissMessages}
110
+ currentPassword={currentPassword}
111
+ setCurrentPassword={setCurrentPassword}
112
+ currentPasswordValidationMessages={currentPasswordValidationMessages}
113
+ setCurrentPasswordValidationMessages={setCurrentPasswordValidationMessages}
114
+ />
115
+ <hr />
116
+ <div className="row row--wrap-reverse row--equal-height-items">
117
+ <AUNewPasswordComponent
118
+ lang={preferredLanguage}
119
+ saving={saving}
120
+ errorMessages={messages.filter((x) => x.type === 'LdapPasswordUsedBeforeException').map((x) => x.message)}
121
+ setErrorMessages={dismissMessages}
122
+ newPassword={newPassword}
123
+ newPasswordValidated={newPasswordValidated}
124
+ newPasswordValidationMessages={newPasswordValidationMessages}
125
+ setNewPassword={setNewPassword}
126
+ setNewPasswordValidated={setNewPasswordValidated}
127
+ setNewPasswordValidationMessages={setNewPasswordValidationMessages}
128
+ confirmPassword={confirmPassword}
129
+ confirmPasswordValidated={confirmPasswordValidated}
130
+ confirmPasswordValidationMessages={confirmPasswordValidationMessages}
131
+ setConfirmPassword={setConfirmPassword}
132
+ setConfirmPasswordValidated={setConfirmPasswordValidated}
133
+ setConfirmPasswordValidationMessages={setConfirmPasswordValidationMessages}
134
+ />
135
+ <AUPasswordRequirementsComponent lang={preferredLanguage} />
136
+ </div>
137
+ </form>
138
+ </div>
139
+ );
140
+ };
141
+
142
+ AUChangePasswordComponent.displayName = 'AUChangePasswordComponent';
143
+
144
+ AUChangePasswordComponent.defaultProps = {
145
+ onSaveAction: (data, callback) => {
146
+ const putData = async () => {
147
+ let url = `${window.profileApiUri}/ChangePassword`;
148
+ if (typeof window.API_AUID !== 'undefined') {
149
+ url = `${url}?auid=${window.API_AUID}`;
150
+ }
151
+ const response = await fetch(url, {
152
+ method: 'PUT',
153
+ credentials: 'include',
154
+ headers: {
155
+ 'Content-Type': 'application/json',
156
+ },
157
+ body: JSON.stringify(data),
158
+ });
159
+ const json = await response.json();
160
+ callback(response.ok, response.status, json);
161
+ };
162
+
163
+ putData();
164
+ },
165
+ };
166
+
167
+ AUChangePasswordComponent.defaultProps = {
168
+ isPwned: null,
169
+ };
170
+
171
+ AUChangePasswordComponent.propTypes = {
172
+ password: PropTypes.shape({
173
+ saving: PropTypes.bool.isRequired,
174
+ saved: PropTypes.bool.isRequired,
175
+ }).isRequired,
176
+ user: PropTypes.shape({
177
+ preferredLanguage: PropTypes.string.isRequired,
178
+ }).isRequired,
179
+ onSave: PropTypes.func.isRequired,
180
+ onSaveAction: PropTypes.func,
181
+ dismissMessages: PropTypes.func.isRequired,
182
+ messages: PropTypes.arrayOf(PropTypes.shape({
183
+ type: PropTypes.string.isRequired,
184
+ message: PropTypes.string.isRequired,
185
+ })).isRequired,
186
+ gotoLink: PropTypes.string.isRequired,
187
+ isPwned: PropTypes.func,
188
+ };
189
+
190
+ export default AUChangePasswordComponent;
@@ -1,72 +1,72 @@
1
- /* eslint-disable jsx-a11y/label-has-associated-control */
2
- /* eslint-disable jsx-a11y/label-has-for */
3
- import React, { useState, useEffect } from 'react';
4
- import PropTypes from 'prop-types';
5
- import { renderValidation } from '../../lib/validation';
6
- import { passwordLabels } from '../../lib/i18n';
7
-
8
- const AUCurrentPasswordComponent = ({
9
- lang,
10
- saving,
11
- errorMessages,
12
- setErrorMessages,
13
- currentPassword,
14
- setCurrentPassword,
15
- currentPasswordValidationMessages,
16
- setCurrentPasswordValidationMessages,
17
- }) => {
18
- const [errorMessagesSet, setErrorMessagesSet] = useState(false);
19
-
20
- useEffect(() => {
21
- if (errorMessages.length > 0 && !errorMessagesSet) {
22
- setCurrentPasswordValidationMessages([]);
23
- setErrorMessagesSet(true);
24
- } else if (errorMessages.length === 0 && errorMessagesSet) {
25
- setErrorMessagesSet(false);
26
- }
27
- });
28
-
29
- let currentPasswordValidationClassName = '';
30
- if (errorMessages.length > 0 || currentPasswordValidationMessages.length > 0) {
31
- currentPasswordValidationClassName = ' form-info--error';
32
- }
33
-
34
- return (
35
- <div className={`form__field${currentPasswordValidationClassName}`}>
36
- <label htmlFor="current-password">
37
- {passwordLabels[lang].currentPassword}
38
- {renderValidation(errorMessages)}
39
- </label>
40
- <input
41
- type="password"
42
- id="current-password"
43
- value={currentPassword}
44
- onChange={(e) => {
45
- setCurrentPassword(e.target.value);
46
- setCurrentPasswordValidationMessages([]);
47
- setErrorMessages();
48
- }}
49
- disabled={saving}
50
- />
51
- {renderValidation(currentPasswordValidationMessages)}
52
- </div>
53
- );
54
- };
55
-
56
- AUCurrentPasswordComponent.defaultProps = {
57
- errorMessages: [],
58
- setErrorMessages: () => {},
59
- };
60
-
61
- AUCurrentPasswordComponent.displayName = 'AUCurrentPasswordComponent';
62
- AUCurrentPasswordComponent.propTypes = {
63
- lang: PropTypes.string.isRequired,
64
- saving: PropTypes.bool.isRequired,
65
- errorMessages: PropTypes.arrayOf(PropTypes.string),
66
- setErrorMessages: PropTypes.func,
67
- currentPassword: PropTypes.string.isRequired,
68
- setCurrentPassword: PropTypes.func.isRequired,
69
- currentPasswordValidationMessages: PropTypes.arrayOf(PropTypes.string).isRequired,
70
- setCurrentPasswordValidationMessages: PropTypes.func.isRequired,
71
- };
72
- export default AUCurrentPasswordComponent;
1
+ /* eslint-disable jsx-a11y/label-has-associated-control */
2
+ /* eslint-disable jsx-a11y/label-has-for */
3
+ import React, { useState, useEffect } from 'react';
4
+ import PropTypes from 'prop-types';
5
+ import { renderValidation } from '../../lib/validation';
6
+ import { passwordLabels } from '../../lib/i18n';
7
+
8
+ const AUCurrentPasswordComponent = ({
9
+ lang,
10
+ saving,
11
+ errorMessages,
12
+ setErrorMessages,
13
+ currentPassword,
14
+ setCurrentPassword,
15
+ currentPasswordValidationMessages,
16
+ setCurrentPasswordValidationMessages,
17
+ }) => {
18
+ const [errorMessagesSet, setErrorMessagesSet] = useState(false);
19
+
20
+ useEffect(() => {
21
+ if (errorMessages.length > 0 && !errorMessagesSet) {
22
+ setCurrentPasswordValidationMessages([]);
23
+ setErrorMessagesSet(true);
24
+ } else if (errorMessages.length === 0 && errorMessagesSet) {
25
+ setErrorMessagesSet(false);
26
+ }
27
+ });
28
+
29
+ let currentPasswordValidationClassName = '';
30
+ if (errorMessages.length > 0 || currentPasswordValidationMessages.length > 0) {
31
+ currentPasswordValidationClassName = ' form-info--error';
32
+ }
33
+
34
+ return (
35
+ <div className={`form__field${currentPasswordValidationClassName}`}>
36
+ <label htmlFor="current-password">
37
+ {passwordLabels[lang].currentPassword}
38
+ {renderValidation(errorMessages)}
39
+ </label>
40
+ <input
41
+ type="password"
42
+ id="current-password"
43
+ value={currentPassword}
44
+ onChange={(e) => {
45
+ setCurrentPassword(e.target.value);
46
+ setCurrentPasswordValidationMessages([]);
47
+ setErrorMessages();
48
+ }}
49
+ disabled={saving}
50
+ />
51
+ {renderValidation(currentPasswordValidationMessages)}
52
+ </div>
53
+ );
54
+ };
55
+
56
+ AUCurrentPasswordComponent.defaultProps = {
57
+ errorMessages: [],
58
+ setErrorMessages: () => {},
59
+ };
60
+
61
+ AUCurrentPasswordComponent.displayName = 'AUCurrentPasswordComponent';
62
+ AUCurrentPasswordComponent.propTypes = {
63
+ lang: PropTypes.string.isRequired,
64
+ saving: PropTypes.bool.isRequired,
65
+ errorMessages: PropTypes.arrayOf(PropTypes.string),
66
+ setErrorMessages: PropTypes.func,
67
+ currentPassword: PropTypes.string.isRequired,
68
+ setCurrentPassword: PropTypes.func.isRequired,
69
+ currentPasswordValidationMessages: PropTypes.arrayOf(PropTypes.string).isRequired,
70
+ setCurrentPasswordValidationMessages: PropTypes.func.isRequired,
71
+ };
72
+ export default AUCurrentPasswordComponent;