@aarhus-university/au-lib-react-components 9.11.19 → 10.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.
Files changed (165) hide show
  1. package/.eslintrc.js +44 -0
  2. package/README.md +19 -20
  3. package/babel.config.js +7 -6
  4. package/build/umd/all.css +1 -1
  5. package/build/umd/all.css.map +1 -1
  6. package/build/umd/all.js +1 -1
  7. package/build/umd/all.js.map +1 -1
  8. package/build/umd/alphabox.js +1 -1
  9. package/build/umd/alphabox.js.map +1 -1
  10. package/build/umd/databox.js +1 -2
  11. package/build/umd/databox.js.map +1 -1
  12. package/build/umd/diagramme.js +1 -1
  13. package/build/umd/diagramme.js.map +1 -1
  14. package/build/umd/flowbox.js +1 -1
  15. package/build/umd/flowbox.js.map +1 -1
  16. package/build/umd/universe.js +1 -1
  17. package/build/umd/universe.js.map +1 -1
  18. package/package.json +66 -60
  19. package/src/components/{delphinus/AUAlertComponent.js → AUAlertComponent.tsx} +70 -85
  20. package/src/components/{AutoSuggestComponent.js → AUAutoSuggestComponent.js} +45 -19
  21. package/src/components/AUCalendarComponent.tsx +493 -0
  22. package/src/components/AUContentToggleComponent.tsx +33 -0
  23. package/src/components/AUDatepickerComponent.tsx +117 -0
  24. package/src/components/AUMobilePrefixComponent.tsx +15 -0
  25. package/src/components/{delphinus/AUModalComponent.js → AUModalComponent.tsx} +80 -94
  26. package/src/components/{form/AUReceiptComponent.js → AUReceiptComponent.tsx} +33 -40
  27. package/src/components/AUSpinnerComponent.tsx +67 -0
  28. package/src/components/{delphinus/AUSubNavComponent.js → AUSubNavComponent.tsx} +38 -53
  29. package/src/components/{form/AUSubmitButtonContainerComponent.js → AUSubmitButtonContainerComponent.tsx} +31 -39
  30. package/src/components/{delphinus/AUTabbedContentComponent.js → AUTabbedContentComponent.tsx} +145 -150
  31. package/src/components/{delphinus/AUTableComponent.js → AUTableComponent.tsx} +24 -28
  32. package/src/components/{delphinus/AUToastComponent.js → AUToastComponent.tsx} +104 -91
  33. package/src/components/{delphinus/AUToolbarComponent.js → AUToolbarComponent.tsx} +45 -48
  34. package/src/components/profile/AUProfileActions.js +128 -128
  35. package/src/components/profile/AUProfileAvatarComponent.js +83 -83
  36. package/src/components/profile/AUProfileAvatarV2Component.js +91 -91
  37. package/src/components/profile/AUProfileAvatarV3Component.tsx +42 -0
  38. package/src/components/profile/AUProfileContainerComponent.js +283 -283
  39. package/src/components/profile/AUProfileHooks.js +30 -30
  40. package/src/components/profile/AUProfileItemComponent.js +54 -54
  41. package/src/components/profile/AUProfileLanguageComponent.js +131 -131
  42. package/src/components/profile/{AUProfileLoginComponent.js → AUProfileLoginComponent.tsx} +3 -18
  43. package/src/components/profile/AUProfileMailComponent.js +307 -307
  44. package/src/components/profile/AUProfileMobileComponent.js +164 -164
  45. package/src/components/profile/AUProfileNameComponent.js +253 -253
  46. package/src/components/profile/AUProfileNextOfKinComponent.js +216 -216
  47. package/src/components/profile/AUProfileReducer.js +230 -230
  48. package/src/components/profile/AUProfileWidgetComponent.js +95 -95
  49. package/src/components/profile/AUProfileWidgetV2Component.js +116 -116
  50. package/src/components/profile/{AUProfileWidgetV3Component.js → AUProfileWidgetV3Component.tsx} +122 -130
  51. package/src/components/wrapping/AUEmbedComponent.js +47 -47
  52. package/src/{components → layout-2016/components}/alphabox/AlphaBoxComponent.js +28 -25
  53. package/src/{components → layout-2016/components}/alphabox/AlphaBoxContentComponent.js +25 -14
  54. package/src/{components → layout-2016/components/common}/AUCollapsibleComponent.js +1 -22
  55. package/src/{components → layout-2016/components/common}/AUSpinnerComponent.js +2 -24
  56. package/src/{components → layout-2016/components}/databox/DataBoxAlphabetComponent.js +1 -1
  57. package/src/{components → layout-2016/components}/databox/DataBoxAssociationComponent.js +2 -2
  58. package/src/{components → layout-2016/components}/databox/DataBoxButtonComponent.js +7 -3
  59. package/src/{components → layout-2016/components}/databox/DataBoxComponent.js +2 -2
  60. package/src/{components → layout-2016/components}/databox/DataBoxGroupingComponent.js +2 -0
  61. package/src/{components → layout-2016/components}/databox/DataBoxSearchResultComponent.js +1 -5
  62. package/src/{components → layout-2016/components}/databox/DataBoxStackedAssociationComponent.js +1 -5
  63. package/src/{components → layout-2016/components}/databox/DataBoxSuggestionComponent.js +0 -0
  64. package/src/{components → layout-2016/components/diagramme}/AUDiagrammeComponent.js +5 -6
  65. package/src/{components → layout-2016/components}/flowbox/FlowBoxComponent.js +8 -8
  66. package/src/{components → layout-2016/components}/flowbox/FlowBoxPhoneComponent.js +3 -5
  67. package/src/{components → layout-2016/components}/profile/AUProfileAvatar2016Component.js +6 -2
  68. package/src/{components → layout-2016/components}/universe/StaffTopComponent.js +4 -3
  69. package/src/{components → layout-2016/components}/universe/StudentTopComponent.js +0 -0
  70. package/src/{components → layout-2016/components}/universe/UniverseContainerComponent.js +11 -8
  71. package/src/layout-2016/lib/all.js +3 -0
  72. package/src/{lib → layout-2016/lib}/au-alphabox.js +1 -3
  73. package/src/{lib → layout-2016/lib}/au-databox.js +6 -9
  74. package/src/{lib → layout-2016/lib}/au-diagramme.js +2 -4
  75. package/src/{lib → layout-2016/lib}/au-flowbox.js +1 -3
  76. package/src/{lib → layout-2016/lib}/universe.js +0 -0
  77. package/src/lib/{helpers.js → helpers.ts} +31 -59
  78. package/src/{components/delphinus/hooks.js → lib/hooks.ts} +33 -28
  79. package/src/lib/{i18n.js → i18n.ts} +600 -601
  80. package/src/lib/{tracking.js → tracking.ts} +69 -65
  81. package/src/lib/{wrapping.js → wrapping.ts} +21 -16
  82. package/src/styles/_settings.scss +10 -10
  83. package/src/styles/alphabox.scss +222 -208
  84. package/src/styles/app.scss +7 -13
  85. package/src/styles/autosuggest.scss +57 -57
  86. package/src/styles/databox.scss +563 -563
  87. package/src/styles/diagramme.scss +119 -119
  88. package/src/styles/flowbox.scss +72 -72
  89. package/src/styles/maps.scss +395 -395
  90. package/tsconfig.json +47 -0
  91. package/types/common/interfaces/gui.d.ts +63 -0
  92. package/types/common/interfaces/model.d.ts +29 -0
  93. package/types/common/main.d.ts +5 -0
  94. package/types/common/package.json +5 -0
  95. package/types/common/payloads.d.ts +0 -0
  96. package/types/common/props.d.ts +165 -0
  97. package/{src/config/webpack.umd.config.js → webpack.config.js} +20 -16
  98. package/.eslintrc +0 -19
  99. package/build/dev.html +0 -329
  100. package/build/umd/auAuth.js +0 -2
  101. package/build/umd/auAuth.js.map +0 -1
  102. package/build/umd/databox.js.LICENSE.txt +0 -5
  103. package/build/umd/news.js +0 -2
  104. package/build/umd/news.js.map +0 -1
  105. package/src/all.js +0 -3
  106. package/src/app.js +0 -263
  107. package/src/components/AUAlertComponent.js +0 -158
  108. package/src/components/AUAmountComponent.js +0 -84
  109. package/src/components/AUBannerComponent.js +0 -99
  110. package/src/components/AUCalendarComponent.js +0 -393
  111. package/src/components/AUDatepickerComponent.js +0 -105
  112. package/src/components/AUFilterCheckboxComponent.js +0 -122
  113. package/src/components/AUFocusComponent.js +0 -55
  114. package/src/components/AUModalComponent.js +0 -94
  115. package/src/components/AUPaginationComponent.js +0 -103
  116. package/src/components/context/AUUserContextComponent.js +0 -91
  117. package/src/components/context/ImpersonateComponent.js +0 -54
  118. package/src/components/delphinus/AUCalendarComponent.js +0 -487
  119. package/src/components/delphinus/AUContentToggleComponent.js +0 -32
  120. package/src/components/delphinus/AUDatepickerComponent.js +0 -164
  121. package/src/components/delphinus/AULoginComponent.js +0 -65
  122. package/src/components/delphinus/AUSpinnerComponent.js +0 -114
  123. package/src/components/form/AUMobilePrefixComponent.js +0 -18
  124. package/src/components/news/EventLayout1Component.js +0 -94
  125. package/src/components/news/EventLayout2Component.js +0 -90
  126. package/src/components/news/EventLayout3Component.js +0 -68
  127. package/src/components/news/NewsCategoriesComponent.js +0 -21
  128. package/src/components/news/NewsCollageBannerComponent.js +0 -71
  129. package/src/components/news/NewsCollageBannerRSSComponent.js +0 -79
  130. package/src/components/news/NewsColumnsComponent.js +0 -125
  131. package/src/components/news/NewsLanguageChangeComponent.js +0 -74
  132. package/src/components/news/NewsLayout1Component.js +0 -80
  133. package/src/components/news/NewsLayout2Component.js +0 -80
  134. package/src/components/news/NewsLayout3Component.js +0 -81
  135. package/src/components/news/NewsLayout4Component.js +0 -80
  136. package/src/components/news/NewsLayout5Component.js +0 -61
  137. package/src/components/news/NewsLayout6Component.js +0 -55
  138. package/src/components/news/NewsLayout7Component.js +0 -58
  139. package/src/components/news/NewsLayout8Component.js +0 -57
  140. package/src/components/news/NewsListComponent.js +0 -291
  141. package/src/components/news/NewsPopUpComponent.js +0 -591
  142. package/src/components/news/NewsRSSComponent.js +0 -74
  143. package/src/components/news/NewsSocialComponent.js +0 -104
  144. package/src/components/news/NewsSubHeaderComponent.js +0 -19
  145. package/src/components/password/AUChangePasswordComponent.js +0 -177
  146. package/src/components/password/AUCurrentPasswordComponent.js +0 -72
  147. package/src/components/password/AUNewPasswordComponent.js +0 -143
  148. package/src/components/password/AUPasswordActions.js +0 -101
  149. package/src/components/password/AUPasswordHooks.js +0 -47
  150. package/src/components/password/AUPasswordReducer.js +0 -78
  151. package/src/components/password/AUPasswordRequirementsComponent.js +0 -29
  152. package/src/components/profile/AUProfileAvatarV3Component.js +0 -80
  153. package/src/config/webpack.dev.config.js +0 -47
  154. package/src/index.js +0 -6
  155. package/src/lib/au-auth.js +0 -227
  156. package/src/lib/au-news.js +0 -371
  157. package/src/lib/menu.js +0 -10
  158. package/src/lib/urlHandler.js +0 -63
  159. package/src/lib/validation.js +0 -181
  160. package/src/styles/alert.scss +0 -39
  161. package/src/styles/calendar.scss +0 -112
  162. package/src/styles/filtercheckbox.scss +0 -5
  163. package/src/styles/modal.scss +0 -35
  164. package/src/styles/pagination.scss +0 -11
  165. package/src/styles/spinner.scss +0 -30
@@ -1,216 +1,216 @@
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 AUMobilePrefixComponent from '../form/AUMobilePrefixComponent';
10
- import { useProfileForm, useMobilePrefix } from './AUProfileHooks';
11
- import {
12
- splitPhoneNumber,
13
- scrollTo,
14
- } from '../../lib/helpers';
15
- import { profileLabels } from '../../lib/i18n';
16
- import { renderValidation, validateForm } from '../../lib/validation';
17
-
18
- const AUProfileNextOfKinComponent = ({
19
- lang,
20
- routeProps: { history },
21
- path,
22
- countryCodes,
23
- nextOfKinName: pNextOfKinName,
24
- nextOfKinPhoneNumber,
25
- onSave,
26
- onSaveAction,
27
- saving,
28
- saved,
29
- dismissMessages,
30
- clear,
31
- }) => {
32
- const validationRules = [{
33
- message: profileLabels[lang].validName,
34
- rule: (fieldValue) => fieldValue.trim().length > 0,
35
- },
36
- {
37
- message: profileLabels[lang].validMobile,
38
- rule: (fieldValue) => fieldValue.trim().match(/^\+[1-9][0-9]{5,14}$/),
39
- }];
40
-
41
- const [nextOfKinName, setNextOfKinName] = useState(pNextOfKinName);
42
- const [prefix, mobile, setPrefix, setMobile] = useMobilePrefix(splitPhoneNumber, countryCodes, nextOfKinPhoneNumber);
43
- const [onCancel] = useProfileForm(saved, history, lang, clear);
44
- const [nokNameValidationMessages, setNokNameValidationMessages] = useState([]);
45
- const [nokMobileValidationMessages, setNokMobileValidationMessages] = useState([]);
46
- const [isNokNameValid, setIsNokNameValid] = useState(!!pNextOfKinName);
47
- const [isNokMobileValid, setIsNokMobileValid] = useState(!!nextOfKinPhoneNumber);
48
-
49
- const validateName = (value, alert = true) => {
50
- const [valid, messages] = validateForm(lang, value, [validationRules[0]]);
51
- setNextOfKinName(value);
52
- setNokNameValidationMessages(alert ? messages : []);
53
- setIsNokNameValid(valid);
54
- };
55
-
56
- const validateMobile = (value, alert = true) => {
57
- const [valid, messages] = validateForm(lang, prefix + value, [validationRules[1]]);
58
- setMobile(value);
59
- setNokMobileValidationMessages(alert ? messages : []);
60
- setIsNokMobileValid(valid);
61
- };
62
-
63
- const submit = (e) => {
64
- e.preventDefault();
65
- validateName(nextOfKinName, !isNokNameValid);
66
- validateMobile(mobile, !isNokMobileValid);
67
- if (isNokNameValid && isNokMobileValid) {
68
- onSave({
69
- nextOfKinName: nextOfKinName.trim(),
70
- nextOfKinPhoneNumber: prefix + mobile,
71
- }, onSaveAction);
72
- }
73
- };
74
-
75
- let nokNameValidationClassName = '';
76
- if (!isNokNameValid && nokNameValidationMessages.length) {
77
- nokNameValidationClassName = ' form-info--error';
78
- } else if (isNokNameValid) {
79
- nokNameValidationClassName = ' form-info--confirmed';
80
- }
81
-
82
- let nokMobileValidationClassName = '';
83
- if (!isNokMobileValid && nokMobileValidationMessages.length) {
84
- nokMobileValidationClassName = ' form-info--error';
85
- } else if (isNokMobileValid) {
86
- nokMobileValidationClassName = ' form-info--confirmed';
87
- }
88
-
89
- useEffect(() => {
90
- dismissMessages();
91
- scrollTo();
92
- document.getElementById('contact-name').focus();
93
- }, []);
94
-
95
- return [
96
- <div key="header" className="list-navigator">
97
- <h1 className="list-navigator__header">{profileLabels[lang].headerNextOfKin}</h1>
98
- <Link className="list-navigator__list-name" to={path}>{profileLabels[lang].headerContainer}</Link>
99
- </div>,
100
- <p key="paragraph">
101
- {profileLabels[lang].nextOfKinParagraph}
102
- </p>,
103
- <form key="form" className="form" noValidate="novalidate">
104
- <div className={`form__field${nokNameValidationClassName}`}>
105
- <label htmlFor="contact-name">
106
- {profileLabels[lang].nextOfKinName}
107
- {renderValidation(nokNameValidationMessages)}
108
- </label>
109
- <input
110
- type="text"
111
- id="contact-name"
112
- value={nextOfKinName}
113
- onChange={(e) => {
114
- validateName(e.target.value, nokNameValidationMessages.length);
115
- }}
116
- onKeyUp={(e) => {
117
- if (e.key === 'Enter') {
118
- validateName(e.target.value);
119
- }
120
- }}
121
- disabled={saving}
122
- />
123
- </div>
124
- <fieldset className="fieldset--not-radio-checkbox">
125
- <legend>
126
- <div className="fieldset__legend-wrapper">{profileLabels[lang].nextOfKinTelephone}</div>
127
- </legend>
128
- <div className="form__field">
129
- <label htmlFor="contact-country-code">{profileLabels[lang].countryCode}</label>
130
- <select
131
- id="contact-country-code"
132
- value={prefix}
133
- onChange={(e) => {
134
- setPrefix(e.target.value);
135
- }}
136
- >
137
- <AUMobilePrefixComponent countryCodes={countryCodes} important />
138
- <optgroup label="Alle lande">
139
- <AUMobilePrefixComponent countryCodes={countryCodes} />
140
- </optgroup>
141
- </select>
142
- </div>
143
- <div className={`form__field${nokMobileValidationClassName}`}>
144
- <label htmlFor="contact-phone">
145
- {profileLabels[lang].number}
146
- {renderValidation(nokMobileValidationMessages)}
147
- </label>
148
- <input
149
- type="tel"
150
- id="contact-phone"
151
- value={mobile}
152
- onChange={(e) => {
153
- validateMobile(e.target.value, nokMobileValidationMessages.length);
154
- }}
155
- onKeyUp={(e) => {
156
- if (e.key === 'Enter') {
157
- validateMobile(e.target.value);
158
- }
159
- }}
160
- disabled={saving}
161
- />
162
- </div>
163
- </fieldset>
164
- <AUSubmitButtonContainerComponent
165
- lang={lang}
166
- disabled={saving}
167
- onSubmit={submit}
168
- onCancel={onCancel}
169
- />
170
- </form>,
171
- ];
172
- };
173
-
174
- AUProfileNextOfKinComponent.defaultProps = {
175
- onSaveAction: (data, callback) => {
176
- const putData = async () => {
177
- let url = `${window.profileApiUri}/UpdateNextOfKin`;
178
- if (typeof window.API_AUID !== 'undefined') {
179
- url = `${url}?auid=${window.API_AUID}`;
180
- }
181
- const response = await fetch(url, {
182
- method: 'PUT',
183
- credentials: 'include',
184
- headers: {
185
- 'Content-Type': 'application/json',
186
- },
187
- body: JSON.stringify(data),
188
- });
189
- const json = await response.json();
190
- callback(response.ok, response.status, json);
191
-
192
- // clear context cache
193
- window.auAuth.setUserContext(window.API_AUID || 0, 'profile-clear-cache', true, () => {}, () => {}, true, window.authenticated);
194
- };
195
-
196
- putData();
197
- },
198
- };
199
-
200
- AUProfileNextOfKinComponent.propTypes = {
201
- lang: PropTypes.string.isRequired,
202
- routeProps: PropTypes.shape({}).isRequired,
203
- path: PropTypes.string.isRequired,
204
- countryCodes: PropTypes.arrayOf(PropTypes.shape({})).isRequired,
205
- nextOfKinName: PropTypes.string.isRequired,
206
- nextOfKinPhoneNumber: PropTypes.string.isRequired,
207
- onSave: PropTypes.func.isRequired,
208
- onSaveAction: PropTypes.func,
209
- saving: PropTypes.bool.isRequired,
210
- saved: PropTypes.bool.isRequired,
211
- dismissMessages: PropTypes.func.isRequired,
212
- clear: PropTypes.func.isRequired,
213
- };
214
-
215
- AUProfileNextOfKinComponent.displayName = 'AUProfileNextOfKinComponent';
216
- export default AUProfileNextOfKinComponent;
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 AUMobilePrefixComponent from '../form/AUMobilePrefixComponent';
10
+ import { useProfileForm, useMobilePrefix } from './AUProfileHooks';
11
+ import {
12
+ splitPhoneNumber,
13
+ scrollTo,
14
+ } from '../../lib/helpers';
15
+ import { profileLabels } from '../../lib/i18n';
16
+ import { renderValidation, validateForm } from '../../lib/validation';
17
+
18
+ const AUProfileNextOfKinComponent = ({
19
+ lang,
20
+ routeProps: { history },
21
+ path,
22
+ countryCodes,
23
+ nextOfKinName: pNextOfKinName,
24
+ nextOfKinPhoneNumber,
25
+ onSave,
26
+ onSaveAction,
27
+ saving,
28
+ saved,
29
+ dismissMessages,
30
+ clear,
31
+ }) => {
32
+ const validationRules = [{
33
+ message: profileLabels[lang].validName,
34
+ rule: (fieldValue) => fieldValue.trim().length > 0,
35
+ },
36
+ {
37
+ message: profileLabels[lang].validMobile,
38
+ rule: (fieldValue) => fieldValue.trim().match(/^\+[1-9][0-9]{5,14}$/),
39
+ }];
40
+
41
+ const [nextOfKinName, setNextOfKinName] = useState(pNextOfKinName);
42
+ const [prefix, mobile, setPrefix, setMobile] = useMobilePrefix(splitPhoneNumber, countryCodes, nextOfKinPhoneNumber);
43
+ const [onCancel] = useProfileForm(saved, history, lang, clear);
44
+ const [nokNameValidationMessages, setNokNameValidationMessages] = useState([]);
45
+ const [nokMobileValidationMessages, setNokMobileValidationMessages] = useState([]);
46
+ const [isNokNameValid, setIsNokNameValid] = useState(!!pNextOfKinName);
47
+ const [isNokMobileValid, setIsNokMobileValid] = useState(!!nextOfKinPhoneNumber);
48
+
49
+ const validateName = (value, alert = true) => {
50
+ const [valid, messages] = validateForm(lang, value, [validationRules[0]]);
51
+ setNextOfKinName(value);
52
+ setNokNameValidationMessages(alert ? messages : []);
53
+ setIsNokNameValid(valid);
54
+ };
55
+
56
+ const validateMobile = (value, alert = true) => {
57
+ const [valid, messages] = validateForm(lang, prefix + value, [validationRules[1]]);
58
+ setMobile(value);
59
+ setNokMobileValidationMessages(alert ? messages : []);
60
+ setIsNokMobileValid(valid);
61
+ };
62
+
63
+ const submit = (e) => {
64
+ e.preventDefault();
65
+ validateName(nextOfKinName, !isNokNameValid);
66
+ validateMobile(mobile, !isNokMobileValid);
67
+ if (isNokNameValid && isNokMobileValid) {
68
+ onSave({
69
+ nextOfKinName: nextOfKinName.trim(),
70
+ nextOfKinPhoneNumber: prefix + mobile,
71
+ }, onSaveAction);
72
+ }
73
+ };
74
+
75
+ let nokNameValidationClassName = '';
76
+ if (!isNokNameValid && nokNameValidationMessages.length) {
77
+ nokNameValidationClassName = ' form-info--error';
78
+ } else if (isNokNameValid) {
79
+ nokNameValidationClassName = ' form-info--confirmed';
80
+ }
81
+
82
+ let nokMobileValidationClassName = '';
83
+ if (!isNokMobileValid && nokMobileValidationMessages.length) {
84
+ nokMobileValidationClassName = ' form-info--error';
85
+ } else if (isNokMobileValid) {
86
+ nokMobileValidationClassName = ' form-info--confirmed';
87
+ }
88
+
89
+ useEffect(() => {
90
+ dismissMessages();
91
+ scrollTo();
92
+ document.getElementById('contact-name').focus();
93
+ }, []);
94
+
95
+ return [
96
+ <div key="header" className="list-navigator">
97
+ <h1 className="list-navigator__header">{profileLabels[lang].headerNextOfKin}</h1>
98
+ <Link className="list-navigator__list-name" to={path}>{profileLabels[lang].headerContainer}</Link>
99
+ </div>,
100
+ <p key="paragraph">
101
+ {profileLabels[lang].nextOfKinParagraph}
102
+ </p>,
103
+ <form key="form" className="form" noValidate="novalidate">
104
+ <div className={`form__field${nokNameValidationClassName}`}>
105
+ <label htmlFor="contact-name">
106
+ {profileLabels[lang].nextOfKinName}
107
+ {renderValidation(nokNameValidationMessages)}
108
+ </label>
109
+ <input
110
+ type="text"
111
+ id="contact-name"
112
+ value={nextOfKinName}
113
+ onChange={(e) => {
114
+ validateName(e.target.value, nokNameValidationMessages.length);
115
+ }}
116
+ onKeyUp={(e) => {
117
+ if (e.key === 'Enter') {
118
+ validateName(e.target.value);
119
+ }
120
+ }}
121
+ disabled={saving}
122
+ />
123
+ </div>
124
+ <fieldset className="fieldset--not-radio-checkbox">
125
+ <legend>
126
+ <div className="fieldset__legend-wrapper">{profileLabels[lang].nextOfKinTelephone}</div>
127
+ </legend>
128
+ <div className="form__field">
129
+ <label htmlFor="contact-country-code">{profileLabels[lang].countryCode}</label>
130
+ <select
131
+ id="contact-country-code"
132
+ value={prefix}
133
+ onChange={(e) => {
134
+ setPrefix(e.target.value);
135
+ }}
136
+ >
137
+ <AUMobilePrefixComponent countryCodes={countryCodes} important />
138
+ <optgroup label="Alle lande">
139
+ <AUMobilePrefixComponent countryCodes={countryCodes} />
140
+ </optgroup>
141
+ </select>
142
+ </div>
143
+ <div className={`form__field${nokMobileValidationClassName}`}>
144
+ <label htmlFor="contact-phone">
145
+ {profileLabels[lang].number}
146
+ {renderValidation(nokMobileValidationMessages)}
147
+ </label>
148
+ <input
149
+ type="tel"
150
+ id="contact-phone"
151
+ value={mobile}
152
+ onChange={(e) => {
153
+ validateMobile(e.target.value, nokMobileValidationMessages.length);
154
+ }}
155
+ onKeyUp={(e) => {
156
+ if (e.key === 'Enter') {
157
+ validateMobile(e.target.value);
158
+ }
159
+ }}
160
+ disabled={saving}
161
+ />
162
+ </div>
163
+ </fieldset>
164
+ <AUSubmitButtonContainerComponent
165
+ lang={lang}
166
+ disabled={saving}
167
+ onSubmit={submit}
168
+ onCancel={onCancel}
169
+ />
170
+ </form>,
171
+ ];
172
+ };
173
+
174
+ AUProfileNextOfKinComponent.defaultProps = {
175
+ onSaveAction: (data, callback) => {
176
+ const putData = async () => {
177
+ let url = `${window.profileApiUri}/UpdateNextOfKin`;
178
+ if (typeof window.API_AUID !== 'undefined') {
179
+ url = `${url}?auid=${window.API_AUID}`;
180
+ }
181
+ const response = await fetch(url, {
182
+ method: 'PUT',
183
+ credentials: 'include',
184
+ headers: {
185
+ 'Content-Type': 'application/json',
186
+ },
187
+ body: JSON.stringify(data),
188
+ });
189
+ const json = await response.json();
190
+ callback(response.ok, response.status, json);
191
+
192
+ // clear context cache
193
+ window.auAuth.setUserContext(window.API_AUID || 0, 'profile-clear-cache', true, () => {}, () => {}, true, window.authenticated);
194
+ };
195
+
196
+ putData();
197
+ },
198
+ };
199
+
200
+ AUProfileNextOfKinComponent.propTypes = {
201
+ lang: PropTypes.string.isRequired,
202
+ routeProps: PropTypes.shape({}).isRequired,
203
+ path: PropTypes.string.isRequired,
204
+ countryCodes: PropTypes.arrayOf(PropTypes.shape({})).isRequired,
205
+ nextOfKinName: PropTypes.string.isRequired,
206
+ nextOfKinPhoneNumber: PropTypes.string.isRequired,
207
+ onSave: PropTypes.func.isRequired,
208
+ onSaveAction: PropTypes.func,
209
+ saving: PropTypes.bool.isRequired,
210
+ saved: PropTypes.bool.isRequired,
211
+ dismissMessages: PropTypes.func.isRequired,
212
+ clear: PropTypes.func.isRequired,
213
+ };
214
+
215
+ AUProfileNextOfKinComponent.displayName = 'AUProfileNextOfKinComponent';
216
+ export default AUProfileNextOfKinComponent;