@aarhus-university/au-lib-react-components 9.18.0 → 9.18.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.
Files changed (141) 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.js +1 -1
  7. package/build/umd/alphabox.js +1 -1
  8. package/build/umd/auAuth.js +1 -1
  9. package/build/umd/databox.js +2 -2
  10. package/build/umd/databox.js.LICENSE.txt +5 -5
  11. package/build/umd/diagramme.js +1 -1
  12. package/build/umd/flowbox.js +1 -1
  13. package/build/umd/news.js +1 -1
  14. package/build/umd/universe.js +1 -1
  15. package/package.json +60 -60
  16. package/src/all.js +3 -3
  17. package/src/app.js +263 -263
  18. package/src/components/AUAlertComponent.js +158 -158
  19. package/src/components/AUAmountComponent.js +84 -84
  20. package/src/components/AUBannerComponent.js +99 -99
  21. package/src/components/AUCalendarComponent.js +393 -393
  22. package/src/components/AUCollapsibleComponent.js +173 -173
  23. package/src/components/AUDatepickerComponent.js +105 -105
  24. package/src/components/AUDiagrammeComponent.js +310 -310
  25. package/src/components/AUFilterCheckboxComponent.js +122 -122
  26. package/src/components/AUFocusComponent.js +55 -55
  27. package/src/components/AUModalComponent.js +94 -94
  28. package/src/components/AUPaginationComponent.js +103 -103
  29. package/src/components/AUSpinnerComponent.js +125 -125
  30. package/src/components/AutoSuggestComponent.js +157 -157
  31. package/src/components/alphabox/AlphaBoxComponent.js +145 -145
  32. package/src/components/alphabox/AlphaBoxContentComponent.js +136 -136
  33. package/src/components/context/AUUserContextComponent.js +91 -91
  34. package/src/components/context/ImpersonateComponent.js +54 -54
  35. package/src/components/databox/DataBoxAlphabetComponent.js +144 -144
  36. package/src/components/databox/DataBoxAssociationComponent.js +122 -122
  37. package/src/components/databox/DataBoxButtonComponent.js +153 -153
  38. package/src/components/databox/DataBoxComponent.js +297 -297
  39. package/src/components/databox/DataBoxGroupingComponent.js +62 -62
  40. package/src/components/databox/DataBoxSearchResultComponent.js +40 -40
  41. package/src/components/databox/DataBoxStackedAssociationComponent.js +58 -58
  42. package/src/components/databox/DataBoxSuggestionComponent.js +39 -39
  43. package/src/components/delphinus/AUAlertComponent.js +85 -85
  44. package/src/components/delphinus/AUCalendarComponent.js +487 -487
  45. package/src/components/delphinus/AUContentToggleComponent.js +32 -32
  46. package/src/components/delphinus/AUDatepickerComponent.js +164 -164
  47. package/src/components/delphinus/AULoginComponent.js +65 -65
  48. package/src/components/delphinus/AUModalComponent.js +94 -94
  49. package/src/components/delphinus/AUSpinnerComponent.js +114 -114
  50. package/src/components/delphinus/AUSubNavComponent.js +53 -53
  51. package/src/components/delphinus/AUTabbedContentComponent.js +150 -150
  52. package/src/components/delphinus/AUTableComponent.js +28 -28
  53. package/src/components/delphinus/AUToastComponent.js +91 -91
  54. package/src/components/delphinus/AUToolbarComponent.js +48 -48
  55. package/src/components/delphinus/hooks.js +28 -28
  56. package/src/components/flowbox/FlowBoxComponent.js +126 -126
  57. package/src/components/flowbox/FlowBoxPhoneComponent.js +106 -106
  58. package/src/components/form/AUMobilePrefixComponent.js +18 -18
  59. package/src/components/form/AUReceiptComponent.js +40 -40
  60. package/src/components/form/AUSubmitButtonContainerComponent.js +39 -39
  61. package/src/components/news/EventLayout1Component.js +94 -94
  62. package/src/components/news/EventLayout2Component.js +90 -90
  63. package/src/components/news/EventLayout3Component.js +68 -68
  64. package/src/components/news/NewsCategoriesComponent.js +21 -21
  65. package/src/components/news/NewsCollageBannerComponent.js +71 -71
  66. package/src/components/news/NewsCollageBannerRSSComponent.js +79 -79
  67. package/src/components/news/NewsColumnsComponent.js +125 -125
  68. package/src/components/news/NewsLanguageChangeComponent.js +74 -74
  69. package/src/components/news/NewsLayout1Component.js +80 -80
  70. package/src/components/news/NewsLayout2Component.js +80 -80
  71. package/src/components/news/NewsLayout3Component.js +81 -81
  72. package/src/components/news/NewsLayout4Component.js +80 -80
  73. package/src/components/news/NewsLayout5Component.js +61 -61
  74. package/src/components/news/NewsLayout6Component.js +55 -55
  75. package/src/components/news/NewsLayout7Component.js +58 -58
  76. package/src/components/news/NewsLayout8Component.js +57 -57
  77. package/src/components/news/NewsListComponent.js +291 -291
  78. package/src/components/news/NewsPopUpComponent.js +591 -591
  79. package/src/components/news/NewsRSSComponent.js +74 -74
  80. package/src/components/news/NewsSocialComponent.js +104 -104
  81. package/src/components/news/NewsSubHeaderComponent.js +19 -19
  82. package/src/components/password/AUChangePasswordComponent.js +189 -189
  83. package/src/components/password/AUCurrentPasswordComponent.js +72 -72
  84. package/src/components/password/AUNewPasswordComponent.js +151 -151
  85. package/src/components/password/AUPasswordActions.js +101 -101
  86. package/src/components/password/AUPasswordHooks.js +47 -47
  87. package/src/components/password/AUPasswordReducer.js +78 -78
  88. package/src/components/password/AUPasswordRequirementsComponent.js +29 -29
  89. package/src/components/profile/AUProfileActions.js +128 -128
  90. package/src/components/profile/AUProfileAvatar2016Component.js +99 -99
  91. package/src/components/profile/AUProfileAvatarComponent.js +83 -83
  92. package/src/components/profile/AUProfileAvatarV2Component.js +91 -91
  93. package/src/components/profile/AUProfileAvatarV3Component.js +80 -80
  94. package/src/components/profile/AUProfileContainerComponent.js +283 -283
  95. package/src/components/profile/AUProfileHooks.js +30 -30
  96. package/src/components/profile/AUProfileItemComponent.js +54 -54
  97. package/src/components/profile/AUProfileLanguageComponent.js +131 -131
  98. package/src/components/profile/AUProfileLoginComponent.js +41 -41
  99. package/src/components/profile/AUProfileMailComponent.js +307 -307
  100. package/src/components/profile/AUProfileMobileComponent.js +164 -164
  101. package/src/components/profile/AUProfileNameComponent.js +253 -253
  102. package/src/components/profile/AUProfileNextOfKinComponent.js +216 -216
  103. package/src/components/profile/AUProfileReducer.js +230 -230
  104. package/src/components/profile/AUProfileWidgetComponent.js +95 -95
  105. package/src/components/profile/AUProfileWidgetV2Component.js +116 -116
  106. package/src/components/profile/AUProfileWidgetV3Component.js +130 -130
  107. package/src/components/universe/StaffTopComponent.js +366 -366
  108. package/src/components/universe/StudentTopComponent.js +137 -137
  109. package/src/components/universe/UniverseContainerComponent.js +62 -62
  110. package/src/components/wrapping/AUEmbedComponent.js +47 -47
  111. package/src/config/webpack.dev.config.js +47 -47
  112. package/src/config/webpack.umd.config.js +86 -86
  113. package/src/index.js +6 -6
  114. package/src/lib/au-alphabox.js +102 -102
  115. package/src/lib/au-auth.js +227 -227
  116. package/src/lib/au-databox.js +403 -403
  117. package/src/lib/au-diagramme.js +87 -87
  118. package/src/lib/au-flowbox.js +95 -95
  119. package/src/lib/au-news.js +371 -371
  120. package/src/lib/helpers.js +222 -222
  121. package/src/lib/i18n.js +605 -605
  122. package/src/lib/menu.js +10 -10
  123. package/src/lib/tracking.js +65 -65
  124. package/src/lib/universe.js +9 -9
  125. package/src/lib/urlHandler.js +63 -63
  126. package/src/lib/validation.js +219 -219
  127. package/src/lib/wrapping.js +16 -16
  128. package/src/styles/_settings.scss +10 -10
  129. package/src/styles/alert.scss +39 -39
  130. package/src/styles/alphabox.scss +222 -222
  131. package/src/styles/app.scss +13 -13
  132. package/src/styles/autosuggest.scss +57 -57
  133. package/src/styles/calendar.scss +111 -111
  134. package/src/styles/databox.scss +563 -563
  135. package/src/styles/diagramme.scss +119 -119
  136. package/src/styles/filtercheckbox.scss +4 -4
  137. package/src/styles/flowbox.scss +72 -72
  138. package/src/styles/maps.scss +395 -395
  139. package/src/styles/modal.scss +34 -34
  140. package/src/styles/pagination.scss +10 -10
  141. package/src/styles/spinner.scss +30 -30
@@ -1,253 +1,253 @@
1
- /* eslint-env browser */
2
- /* eslint-disable jsx-a11y/label-has-associated-control */
3
- /* eslint-disable jsx-a11y/label-has-for */
4
- /* eslint-disable max-len */
5
- import React, { useState, useEffect } from 'react';
6
- import PropTypes from 'prop-types';
7
- import { Link } from 'react-router-dom';
8
- import AUSubmitButtonContainerComponent from '../form/AUSubmitButtonContainerComponent';
9
- import { useProfileForm } from './AUProfileHooks';
10
- import { scrollTo } from '../../lib/helpers';
11
- import { profileLabels } from '../../lib/i18n';
12
- import { renderValidation, validateForm } from '../../lib/validation';
13
-
14
- const AUProfileNameComponent = ({
15
- lang,
16
- routeProps: { history },
17
- path,
18
- firstNames,
19
- lastName,
20
- hasChosenName: pHasChosenName,
21
- chosenFirstNames: pChosenFirstNames,
22
- chosenLastName: pChosenLastName,
23
- onSave,
24
- onSaveAction,
25
- saving,
26
- saved,
27
- dismissMessages,
28
- clear,
29
- }) => {
30
- const validationRules = [{
31
- message: profileLabels[lang].validFirstName,
32
- rule: (fieldValue) => fieldValue.trim().length > 0,
33
- },
34
- {
35
- message: profileLabels[lang].validLastName,
36
- rule: (fieldValue) => fieldValue.trim().length > 0,
37
- }];
38
-
39
- const [hasChosenName, setHasChosenName] = useState(pHasChosenName);
40
- const [chosenFirstNames, setChosenFirstNames] = useState(pChosenFirstNames);
41
- const [chosenLastName, setChosenLastName] = useState(pChosenLastName);
42
- const [firstNameValidationMessages, setFirstNameValidationMessages] = useState([]);
43
- const [lastNameValidationMessages, setLastNameValidationMessages] = useState([]);
44
- const [isFirstNameValid, setIsFirstNameValid] = useState(!pHasChosenName || (!!pChosenFirstNames));
45
- const [isLastNameValid, setIsLastNameValid] = useState(!pHasChosenName || (!!pChosenLastName));
46
- const [onCancel] = useProfileForm(saved, history, lang, clear);
47
-
48
- const validateFirstName = (value, alert = true) => {
49
- const [valid, messages] = validateForm(lang, value, [validationRules[0]]);
50
- setChosenFirstNames(value);
51
- setFirstNameValidationMessages(alert ? messages : []);
52
- setIsFirstNameValid(!hasChosenName || valid);
53
- };
54
-
55
- const validateLastName = (value, alert = true) => {
56
- const [valid, messages] = validateForm(lang, value, [validationRules[1]]);
57
- setChosenLastName(value);
58
- setLastNameValidationMessages(alert ? messages : []);
59
- setIsLastNameValid(!hasChosenName || valid);
60
- };
61
-
62
- const submit = (e) => {
63
- e.preventDefault();
64
- validateFirstName(chosenFirstNames, !isFirstNameValid);
65
- validateLastName(chosenLastName, !isLastNameValid);
66
- if (isFirstNameValid && isLastNameValid) {
67
- onSave({
68
- hasChosenName,
69
- chosenFirstNames: chosenFirstNames.trim(),
70
- chosenLastName: chosenLastName.trim(),
71
- }, onSaveAction);
72
- }
73
- };
74
-
75
- let firstNameValidationClassName = '';
76
- if (!isFirstNameValid && firstNameValidationMessages.length) {
77
- firstNameValidationClassName = ' form-info--error';
78
- } else if (isFirstNameValid) {
79
- firstNameValidationClassName = ' form-info--confirmed';
80
- }
81
-
82
- let lastNameValidationClassName = '';
83
- if (!isLastNameValid && lastNameValidationMessages.length) {
84
- lastNameValidationClassName = ' form-info--error';
85
- } else if (isLastNameValid) {
86
- lastNameValidationClassName = ' form-info--confirmed';
87
- }
88
-
89
- useEffect(() => {
90
- dismissMessages();
91
- scrollTo();
92
- const firstName = document.getElementById('first-name');
93
- if (firstName) {
94
- firstName.focus();
95
- }
96
- }, []);
97
-
98
- return [
99
- <div key="header" className="list-navigator">
100
- <h1 className="list-navigator__header">{profileLabels[lang].headerName}</h1>
101
- <Link className="list-navigator__list-name" to={path}>{profileLabels[lang].headerContainer}</Link>
102
- </div>,
103
- <form key="form" className="form" noValidate="novalidate">
104
- <fieldset>
105
- <legend>
106
- <div className="fieldset__legend-wrapper">
107
- {profileLabels[lang].legendName}
108
- <div className="form-info__hint">
109
- {profileLabels[lang].legendNameHint}
110
- </div>
111
- </div>
112
- </legend>
113
- <div className="form__field form__field--horizontal">
114
- <label htmlFor="default-display-name">
115
- {`${firstNames} ${lastName}`}
116
- <div className="form-info__hint">
117
- {profileLabels[lang].formNameHint}
118
- </div>
119
- </label>
120
- <input
121
- type="radio"
122
- id="default-display-name"
123
- checked={!hasChosenName}
124
- onChange={() => {
125
- setHasChosenName(false);
126
- setChosenFirstNames(firstNames);
127
- setChosenLastName(lastName);
128
- setIsFirstNameValid(true);
129
- setIsLastNameValid(true);
130
- }}
131
- disabled={saving}
132
- />
133
- </div>
134
- <div className="form__field form__field--horizontal">
135
- <label htmlFor="custom-display-name">
136
- {profileLabels[lang].formNameDisplayName}
137
- </label>
138
- <input
139
- type="radio"
140
- id="custom-display-name"
141
- checked={hasChosenName}
142
- onChange={() => {
143
- setHasChosenName(true);
144
- }}
145
- disabled={saving}
146
- />
147
- </div>
148
- </fieldset>
149
- {(() => {
150
- if (hasChosenName) {
151
- return [
152
- <div key="fn" className={`form__field${firstNameValidationClassName}`}>
153
- <label htmlFor="first-name">
154
- {profileLabels[lang].firstName}
155
- <div className="form-info__hint">
156
- {profileLabels[lang].firstNameHint}
157
- </div>
158
- {renderValidation(firstNameValidationMessages)}
159
- </label>
160
- <input
161
- type="text"
162
- id="first-name"
163
- value={chosenFirstNames}
164
- onChange={(e) => {
165
- validateFirstName(e.target.value, firstNameValidationMessages.length);
166
- }}
167
- onKeyUp={(e) => {
168
- if (e.key === 'Enter') {
169
- validateFirstName(e.target.value);
170
- }
171
- }}
172
- disabled={saving}
173
- />
174
- </div>,
175
- <div key="ln" className={`form__field${lastNameValidationClassName}`}>
176
- <label htmlFor="last-name">
177
- {profileLabels[lang].lastName}
178
- {renderValidation(lastNameValidationMessages)}
179
- </label>
180
- <input
181
- type="text"
182
- id="last-name"
183
- value={chosenLastName}
184
- onChange={(e) => {
185
- validateLastName(e.target.value, lastNameValidationMessages.length);
186
- }}
187
- onKeyUp={(e) => {
188
- if (e.key === 'Enter') {
189
- validateLastName(e.target.value);
190
- }
191
- }}
192
- disabled={saving}
193
- />
194
- </div>,
195
- ];
196
- }
197
- return null;
198
- })()}
199
- <AUSubmitButtonContainerComponent
200
- lang={lang}
201
- disabled={saving}
202
- onSubmit={submit}
203
- onCancel={onCancel}
204
- />
205
- </form>,
206
- ];
207
- };
208
-
209
- AUProfileNameComponent.defaultProps = {
210
- onSaveAction: (data, callback) => {
211
- const putData = async () => {
212
- let url = `${window.profileApiUri}/UpdatePersonNames`;
213
- if (typeof window.API_AUID !== 'undefined') {
214
- url = `${url}?auid=${window.API_AUID}`;
215
- }
216
- const response = await fetch(url, {
217
- method: 'PUT',
218
- credentials: 'include',
219
- headers: {
220
- 'Content-Type': 'application/json',
221
- },
222
- body: JSON.stringify(data),
223
- });
224
- const json = await response.json();
225
- callback(response.ok, response.status, json);
226
-
227
- // clear context cache
228
- window.auAuth.setUserContext(window.API_AUID || 0, 'profile-clear-cache', true, () => {}, () => {}, true, window.authenticated);
229
- };
230
-
231
- putData();
232
- },
233
- };
234
-
235
- AUProfileNameComponent.propTypes = {
236
- lang: PropTypes.string.isRequired,
237
- routeProps: PropTypes.shape({}).isRequired,
238
- path: PropTypes.string.isRequired,
239
- firstNames: PropTypes.string.isRequired,
240
- lastName: PropTypes.string.isRequired,
241
- hasChosenName: PropTypes.bool.isRequired,
242
- chosenFirstNames: PropTypes.string.isRequired,
243
- chosenLastName: PropTypes.string.isRequired,
244
- onSave: PropTypes.func.isRequired,
245
- onSaveAction: PropTypes.func,
246
- saving: PropTypes.bool.isRequired,
247
- saved: PropTypes.bool.isRequired,
248
- dismissMessages: PropTypes.func.isRequired,
249
- clear: PropTypes.func.isRequired,
250
- };
251
-
252
- AUProfileNameComponent.displayName = 'AUProfileNameComponent';
253
- export default AUProfileNameComponent;
1
+ /* eslint-env browser */
2
+ /* eslint-disable jsx-a11y/label-has-associated-control */
3
+ /* eslint-disable jsx-a11y/label-has-for */
4
+ /* eslint-disable max-len */
5
+ import React, { useState, useEffect } from 'react';
6
+ import PropTypes from 'prop-types';
7
+ import { Link } from 'react-router-dom';
8
+ import AUSubmitButtonContainerComponent from '../form/AUSubmitButtonContainerComponent';
9
+ import { useProfileForm } from './AUProfileHooks';
10
+ import { scrollTo } from '../../lib/helpers';
11
+ import { profileLabels } from '../../lib/i18n';
12
+ import { renderValidation, validateForm } from '../../lib/validation';
13
+
14
+ const AUProfileNameComponent = ({
15
+ lang,
16
+ routeProps: { history },
17
+ path,
18
+ firstNames,
19
+ lastName,
20
+ hasChosenName: pHasChosenName,
21
+ chosenFirstNames: pChosenFirstNames,
22
+ chosenLastName: pChosenLastName,
23
+ onSave,
24
+ onSaveAction,
25
+ saving,
26
+ saved,
27
+ dismissMessages,
28
+ clear,
29
+ }) => {
30
+ const validationRules = [{
31
+ message: profileLabels[lang].validFirstName,
32
+ rule: (fieldValue) => fieldValue.trim().length > 0,
33
+ },
34
+ {
35
+ message: profileLabels[lang].validLastName,
36
+ rule: (fieldValue) => fieldValue.trim().length > 0,
37
+ }];
38
+
39
+ const [hasChosenName, setHasChosenName] = useState(pHasChosenName);
40
+ const [chosenFirstNames, setChosenFirstNames] = useState(pChosenFirstNames);
41
+ const [chosenLastName, setChosenLastName] = useState(pChosenLastName);
42
+ const [firstNameValidationMessages, setFirstNameValidationMessages] = useState([]);
43
+ const [lastNameValidationMessages, setLastNameValidationMessages] = useState([]);
44
+ const [isFirstNameValid, setIsFirstNameValid] = useState(!pHasChosenName || (!!pChosenFirstNames));
45
+ const [isLastNameValid, setIsLastNameValid] = useState(!pHasChosenName || (!!pChosenLastName));
46
+ const [onCancel] = useProfileForm(saved, history, lang, clear);
47
+
48
+ const validateFirstName = (value, alert = true) => {
49
+ const [valid, messages] = validateForm(lang, value, [validationRules[0]]);
50
+ setChosenFirstNames(value);
51
+ setFirstNameValidationMessages(alert ? messages : []);
52
+ setIsFirstNameValid(!hasChosenName || valid);
53
+ };
54
+
55
+ const validateLastName = (value, alert = true) => {
56
+ const [valid, messages] = validateForm(lang, value, [validationRules[1]]);
57
+ setChosenLastName(value);
58
+ setLastNameValidationMessages(alert ? messages : []);
59
+ setIsLastNameValid(!hasChosenName || valid);
60
+ };
61
+
62
+ const submit = (e) => {
63
+ e.preventDefault();
64
+ validateFirstName(chosenFirstNames, !isFirstNameValid);
65
+ validateLastName(chosenLastName, !isLastNameValid);
66
+ if (isFirstNameValid && isLastNameValid) {
67
+ onSave({
68
+ hasChosenName,
69
+ chosenFirstNames: chosenFirstNames.trim(),
70
+ chosenLastName: chosenLastName.trim(),
71
+ }, onSaveAction);
72
+ }
73
+ };
74
+
75
+ let firstNameValidationClassName = '';
76
+ if (!isFirstNameValid && firstNameValidationMessages.length) {
77
+ firstNameValidationClassName = ' form-info--error';
78
+ } else if (isFirstNameValid) {
79
+ firstNameValidationClassName = ' form-info--confirmed';
80
+ }
81
+
82
+ let lastNameValidationClassName = '';
83
+ if (!isLastNameValid && lastNameValidationMessages.length) {
84
+ lastNameValidationClassName = ' form-info--error';
85
+ } else if (isLastNameValid) {
86
+ lastNameValidationClassName = ' form-info--confirmed';
87
+ }
88
+
89
+ useEffect(() => {
90
+ dismissMessages();
91
+ scrollTo();
92
+ const firstName = document.getElementById('first-name');
93
+ if (firstName) {
94
+ firstName.focus();
95
+ }
96
+ }, []);
97
+
98
+ return [
99
+ <div key="header" className="list-navigator">
100
+ <h1 className="list-navigator__header">{profileLabels[lang].headerName}</h1>
101
+ <Link className="list-navigator__list-name" to={path}>{profileLabels[lang].headerContainer}</Link>
102
+ </div>,
103
+ <form key="form" className="form" noValidate="novalidate">
104
+ <fieldset>
105
+ <legend>
106
+ <div className="fieldset__legend-wrapper">
107
+ {profileLabels[lang].legendName}
108
+ <div className="form-info__hint">
109
+ {profileLabels[lang].legendNameHint}
110
+ </div>
111
+ </div>
112
+ </legend>
113
+ <div className="form__field form__field--horizontal">
114
+ <label htmlFor="default-display-name">
115
+ {`${firstNames} ${lastName}`}
116
+ <div className="form-info__hint">
117
+ {profileLabels[lang].formNameHint}
118
+ </div>
119
+ </label>
120
+ <input
121
+ type="radio"
122
+ id="default-display-name"
123
+ checked={!hasChosenName}
124
+ onChange={() => {
125
+ setHasChosenName(false);
126
+ setChosenFirstNames(firstNames);
127
+ setChosenLastName(lastName);
128
+ setIsFirstNameValid(true);
129
+ setIsLastNameValid(true);
130
+ }}
131
+ disabled={saving}
132
+ />
133
+ </div>
134
+ <div className="form__field form__field--horizontal">
135
+ <label htmlFor="custom-display-name">
136
+ {profileLabels[lang].formNameDisplayName}
137
+ </label>
138
+ <input
139
+ type="radio"
140
+ id="custom-display-name"
141
+ checked={hasChosenName}
142
+ onChange={() => {
143
+ setHasChosenName(true);
144
+ }}
145
+ disabled={saving}
146
+ />
147
+ </div>
148
+ </fieldset>
149
+ {(() => {
150
+ if (hasChosenName) {
151
+ return [
152
+ <div key="fn" className={`form__field${firstNameValidationClassName}`}>
153
+ <label htmlFor="first-name">
154
+ {profileLabels[lang].firstName}
155
+ <div className="form-info__hint">
156
+ {profileLabels[lang].firstNameHint}
157
+ </div>
158
+ {renderValidation(firstNameValidationMessages)}
159
+ </label>
160
+ <input
161
+ type="text"
162
+ id="first-name"
163
+ value={chosenFirstNames}
164
+ onChange={(e) => {
165
+ validateFirstName(e.target.value, firstNameValidationMessages.length);
166
+ }}
167
+ onKeyUp={(e) => {
168
+ if (e.key === 'Enter') {
169
+ validateFirstName(e.target.value);
170
+ }
171
+ }}
172
+ disabled={saving}
173
+ />
174
+ </div>,
175
+ <div key="ln" className={`form__field${lastNameValidationClassName}`}>
176
+ <label htmlFor="last-name">
177
+ {profileLabels[lang].lastName}
178
+ {renderValidation(lastNameValidationMessages)}
179
+ </label>
180
+ <input
181
+ type="text"
182
+ id="last-name"
183
+ value={chosenLastName}
184
+ onChange={(e) => {
185
+ validateLastName(e.target.value, lastNameValidationMessages.length);
186
+ }}
187
+ onKeyUp={(e) => {
188
+ if (e.key === 'Enter') {
189
+ validateLastName(e.target.value);
190
+ }
191
+ }}
192
+ disabled={saving}
193
+ />
194
+ </div>,
195
+ ];
196
+ }
197
+ return null;
198
+ })()}
199
+ <AUSubmitButtonContainerComponent
200
+ lang={lang}
201
+ disabled={saving}
202
+ onSubmit={submit}
203
+ onCancel={onCancel}
204
+ />
205
+ </form>,
206
+ ];
207
+ };
208
+
209
+ AUProfileNameComponent.defaultProps = {
210
+ onSaveAction: (data, callback) => {
211
+ const putData = async () => {
212
+ let url = `${window.profileApiUri}/UpdatePersonNames`;
213
+ if (typeof window.API_AUID !== 'undefined') {
214
+ url = `${url}?auid=${window.API_AUID}`;
215
+ }
216
+ const response = await fetch(url, {
217
+ method: 'PUT',
218
+ credentials: 'include',
219
+ headers: {
220
+ 'Content-Type': 'application/json',
221
+ },
222
+ body: JSON.stringify(data),
223
+ });
224
+ const json = await response.json();
225
+ callback(response.ok, response.status, json);
226
+
227
+ // clear context cache
228
+ window.auAuth.setUserContext(window.API_AUID || 0, 'profile-clear-cache', true, () => {}, () => {}, true, window.authenticated);
229
+ };
230
+
231
+ putData();
232
+ },
233
+ };
234
+
235
+ AUProfileNameComponent.propTypes = {
236
+ lang: PropTypes.string.isRequired,
237
+ routeProps: PropTypes.shape({}).isRequired,
238
+ path: PropTypes.string.isRequired,
239
+ firstNames: PropTypes.string.isRequired,
240
+ lastName: PropTypes.string.isRequired,
241
+ hasChosenName: PropTypes.bool.isRequired,
242
+ chosenFirstNames: PropTypes.string.isRequired,
243
+ chosenLastName: PropTypes.string.isRequired,
244
+ onSave: PropTypes.func.isRequired,
245
+ onSaveAction: PropTypes.func,
246
+ saving: PropTypes.bool.isRequired,
247
+ saved: PropTypes.bool.isRequired,
248
+ dismissMessages: PropTypes.func.isRequired,
249
+ clear: PropTypes.func.isRequired,
250
+ };
251
+
252
+ AUProfileNameComponent.displayName = 'AUProfileNameComponent';
253
+ export default AUProfileNameComponent;