@aarhus-university/au-lib-react-components 8.20.2 → 8.82.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 (167) hide show
  1. package/.eslintrc.js +44 -0
  2. package/README.md +19 -20
  3. package/babel.config.js +7 -0
  4. package/build/umd/all.css +1 -2
  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 -6
  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 -65
  19. package/src/components/AUAlertComponent.tsx +70 -0
  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} +78 -76
  26. package/src/components/{form/AUReceiptComponent.js → AUReceiptComponent.tsx} +33 -40
  27. package/src/components/AUSpinnerComponent.tsx +64 -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/AUTabbedContentComponent.tsx +145 -0
  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 -113
  35. package/src/components/profile/AUProfileAvatarComponent.js +83 -83
  36. package/src/components/profile/AUProfileAvatarV2Component.js +91 -0
  37. package/src/components/profile/AUProfileAvatarV3Component.tsx +42 -0
  38. package/src/components/profile/AUProfileContainerComponent.js +283 -285
  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 -299
  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 -210
  48. package/src/components/profile/AUProfileWidgetComponent.js +95 -95
  49. package/src/components/profile/AUProfileWidgetV2Component.js +116 -0
  50. package/src/components/profile/AUProfileWidgetV3Component.tsx +122 -0
  51. package/src/components/wrapping/AUEmbedComponent.js +47 -47
  52. package/src/{components → layout-2016/components}/alphabox/AlphaBoxComponent.js +29 -28
  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} +41 -66
  78. package/src/{components/delphinus/hooks.js → lib/hooks.ts} +33 -26
  79. package/src/lib/{i18n.js → i18n.ts} +600 -595
  80. package/src/lib/tracking.ts +69 -0
  81. package/src/lib/{wrapping.js → wrapping.ts} +21 -16
  82. package/src/styles/_settings.scss +11 -11
  83. package/src/styles/alphabox.scss +222 -209
  84. package/src/styles/app.scss +7 -12
  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 +396 -0
  90. package/tsconfig.json +47 -0
  91. package/types/common/interfaces.d.ts +91 -0
  92. package/types/common/main.d.ts +4 -0
  93. package/types/common/package.json +5 -0
  94. package/types/common/payloads.d.ts +0 -0
  95. package/types/common/props.d.ts +165 -0
  96. package/webpack.config.js +89 -0
  97. package/.eslintrc +0 -19
  98. package/DOCUMENTATION.md +0 -369
  99. package/build/cjs/auAuth.js +0 -2
  100. package/build/cjs/auAuth.js.map +0 -1
  101. package/build/dev.html +0 -329
  102. package/build/umd/auAuth.js +0 -2
  103. package/build/umd/auAuth.js.map +0 -1
  104. package/build/umd/news.js +0 -2
  105. package/build/umd/news.js.map +0 -1
  106. package/src/all.js +0 -3
  107. package/src/app.js +0 -263
  108. package/src/components/AUAlertComponent.js +0 -158
  109. package/src/components/AUAmountComponent.js +0 -84
  110. package/src/components/AUBannerComponent.js +0 -99
  111. package/src/components/AUCalendarComponent.js +0 -393
  112. package/src/components/AUDatepickerComponent.js +0 -105
  113. package/src/components/AUFilterCheckboxComponent.js +0 -122
  114. package/src/components/AUFocusComponent.js +0 -55
  115. package/src/components/AUModalComponent.js +0 -94
  116. package/src/components/AUPaginationComponent.js +0 -103
  117. package/src/components/context/AUUserContextComponent.js +0 -91
  118. package/src/components/context/ImpersonateComponent.js +0 -54
  119. package/src/components/delphinus/AUCalendarComponent.js +0 -422
  120. package/src/components/delphinus/AUContentToggleComponent.js +0 -32
  121. package/src/components/delphinus/AUDatepickerComponent.js +0 -113
  122. package/src/components/delphinus/AULoginComponent.js +0 -65
  123. package/src/components/delphinus/AUSpinnerComponent.js +0 -114
  124. package/src/components/delphinus/AUTabbedContentComponent.js +0 -53
  125. package/src/components/form/AUMobilePrefixComponent.js +0 -18
  126. package/src/components/news/EventLayout1Component.js +0 -94
  127. package/src/components/news/EventLayout2Component.js +0 -90
  128. package/src/components/news/EventLayout3Component.js +0 -68
  129. package/src/components/news/NewsCategoriesComponent.js +0 -21
  130. package/src/components/news/NewsCollageBannerComponent.js +0 -71
  131. package/src/components/news/NewsColumnsComponent.js +0 -125
  132. package/src/components/news/NewsLanguageChangeComponent.js +0 -74
  133. package/src/components/news/NewsLayout1Component.js +0 -80
  134. package/src/components/news/NewsLayout2Component.js +0 -80
  135. package/src/components/news/NewsLayout3Component.js +0 -81
  136. package/src/components/news/NewsLayout4Component.js +0 -80
  137. package/src/components/news/NewsLayout5Component.js +0 -61
  138. package/src/components/news/NewsLayout6Component.js +0 -55
  139. package/src/components/news/NewsLayout7Component.js +0 -58
  140. package/src/components/news/NewsLayout8Component.js +0 -57
  141. package/src/components/news/NewsListComponent.js +0 -291
  142. package/src/components/news/NewsPopUpComponent.js +0 -591
  143. package/src/components/news/NewsRSSComponent.js +0 -74
  144. package/src/components/news/NewsSocialComponent.js +0 -104
  145. package/src/components/news/NewsSubHeaderComponent.js +0 -19
  146. package/src/components/password/AUChangePasswordComponent.js +0 -177
  147. package/src/components/password/AUCurrentPasswordComponent.js +0 -72
  148. package/src/components/password/AUNewPasswordComponent.js +0 -143
  149. package/src/components/password/AUPasswordActions.js +0 -101
  150. package/src/components/password/AUPasswordHooks.js +0 -47
  151. package/src/components/password/AUPasswordReducer.js +0 -78
  152. package/src/components/password/AUPasswordRequirementsComponent.js +0 -29
  153. package/src/config/webpack.cjs.config.js +0 -75
  154. package/src/config/webpack.dev.config.js +0 -61
  155. package/src/config/webpack.umd.config.js +0 -107
  156. package/src/index.js +0 -6
  157. package/src/lib/au-auth.js +0 -221
  158. package/src/lib/au-news.js +0 -306
  159. package/src/lib/menu.js +0 -10
  160. package/src/lib/urlHandler.js +0 -63
  161. package/src/lib/validation.js +0 -181
  162. package/src/styles/alert.scss +0 -39
  163. package/src/styles/calendar.scss +0 -112
  164. package/src/styles/filtercheckbox.scss +0 -5
  165. package/src/styles/modal.scss +0 -35
  166. package/src/styles/pagination.scss +0 -11
  167. package/src/styles/spinner.scss +0 -30
@@ -1,6 +1,6 @@
1
1
  import React from 'react';
2
2
  import PropTypes from 'prop-types';
3
- import { sortAlphaObj } from '../../lib/helpers';
3
+ import { sortAlphaObj } from '../../../lib/helpers';
4
4
 
5
5
  const DataBoxStackedAssociationComponent = (props) => {
6
6
  const { assoc } = props;
@@ -44,10 +44,6 @@ const DataBoxStackedAssociationComponent = (props) => {
44
44
  );
45
45
  };
46
46
 
47
- DataBoxStackedAssociationComponent.defaultProps = {
48
-
49
- };
50
-
51
47
  DataBoxStackedAssociationComponent.propTypes = {
52
48
  assoc: PropTypes.shape({
53
49
  items: PropTypes.arrayOf(PropTypes.shape({})).isRequired,
@@ -2,7 +2,6 @@
2
2
  /* eslint no-mixed-operators: 0 */
3
3
  import React from 'react';
4
4
  import PropTypes from 'prop-types';
5
- import axios from 'axios';
6
5
 
7
6
  const diagrammeLabels = {
8
7
  da: {
@@ -82,16 +81,16 @@ class AUDiagrammeComponent extends React.PureComponent {
82
81
  response.lines.forEach((value, key) => {
83
82
  promises.push(new Promise((resolve) => {
84
83
  const url = `https://eddiprod.au.dk/EDDI/webservices/StudieoversigtService2.cfc?method=GetStudiediagramData&lang=en&allowOrigin=true&linjeid=${value.id}`;
85
- axios.get(url).then((promise) => {
86
- const periodType = promise.data.DiagramMetaData.DATA[0] ? promise.data.DiagramMetaData.DATA[0][3] : '';
84
+ fetch(url).then((promise) => promise.json()).then((data) => {
85
+ const periodType = data.DiagramMetaData.DATA[0] ? data.DiagramMetaData.DATA[0][3] : '';
87
86
  const node = {
88
87
  name: lang === 'da' ? value.name : value.nameEnglish,
89
88
  periodType,
90
- table: AUDiagrammeComponent.diagrammeParse(promise.data, lang),
91
- list: AUDiagrammeComponent.diagrammeParse(promise.data, lang, 'list'),
89
+ table: AUDiagrammeComponent.diagrammeParse(data, lang),
90
+ list: AUDiagrammeComponent.diagrammeParse(data, lang, 'list'),
92
91
  };
93
92
  nodes[key] = node;
94
- resolve(promise.data);
93
+ resolve(data);
95
94
  });
96
95
  }));
97
96
  });
@@ -5,7 +5,7 @@
5
5
  import React from 'react';
6
6
  import PropTypes from 'prop-types';
7
7
  import FlowBoxPhoneComponent from './FlowBoxPhoneComponent';
8
- import { flowboxLabels as labels } from '../../lib/i18n';
8
+ import { flowboxLabels as labels } from '../../../lib/i18n';
9
9
 
10
10
  class FlowBoxComponent extends React.Component {
11
11
  constructor(props) {
@@ -20,23 +20,23 @@ class FlowBoxComponent extends React.Component {
20
20
  this.handleSelectChange = this.handleSelectChange.bind(this);
21
21
  }
22
22
 
23
- nextNode(child) {
23
+ handleSelectChange(event) {
24
+ const { node } = this.state;
25
+ const child = node.children.find((n) => n.name === event.target.value);
24
26
  this.setState({
25
27
  node: child,
26
28
  });
27
29
  }
28
30
 
29
- prevNode(node) {
31
+ nextNode(child) {
30
32
  this.setState({
31
- node: node.parent,
33
+ node: child,
32
34
  });
33
35
  }
34
36
 
35
- handleSelectChange(event) {
36
- const { node } = this.state;
37
- const child = node.children.find((n) => n.name === event.target.value);
37
+ prevNode(node) {
38
38
  this.setState({
39
- node: child,
39
+ node: node.parent,
40
40
  });
41
41
  }
42
42
 
@@ -1,9 +1,8 @@
1
1
  /* eslint-env browser */
2
2
  import React from 'react';
3
3
  import PropTypes from 'prop-types';
4
- import axios from 'axios';
5
- import AUSpinnerComponent from '../AUSpinnerComponent';
6
- import { flowboxLabels as labels } from '../../lib/i18n';
4
+ import AUSpinnerComponent from '../common/AUSpinnerComponent';
5
+ import { flowboxLabels as labels } from '../../../lib/i18n';
7
6
 
8
7
  class FlowBoxPhoneComponent extends React.Component {
9
8
  constructor(props) {
@@ -16,8 +15,7 @@ class FlowBoxPhoneComponent extends React.Component {
16
15
  componentDidMount() {
17
16
  const { phone } = this.props;
18
17
  const iPureUrl = `https://ipure.nfit.au.dk/searchPeople.php?mode=json&q=${phone}`;
19
- axios.get(iPureUrl).then((promise) => {
20
- const persons = promise.data;
18
+ fetch(iPureUrl).then((promise) => promise.json()).then((persons) => {
21
19
  this.setState({
22
20
  persons,
23
21
  }, () => {
@@ -1,8 +1,11 @@
1
1
  /* eslint-env browser */
2
2
  import React from 'react';
3
3
  import PropTypes from 'prop-types';
4
- import AUProfileWidgetComponent from './AUProfileWidgetComponent';
5
- import AUUserContextComponent from '../context/AUUserContextComponent';
4
+ import AUProfileWidgetComponent from '../../../components/profile/AUProfileWidgetComponent';
5
+
6
+ // TODO: Re-implement portal context i staff portal and mitstudie
7
+ // before upgrading this lib-component!
8
+ const AUUserContextComponent = null;
6
9
 
7
10
  const AUProfileAvatar2016Component = ({
8
11
  lang,
@@ -63,6 +66,7 @@ const AUProfileAvatar2016Component = ({
63
66
  onLoad(userContext);
64
67
  }}
65
68
  handleError={(status, json) => {
69
+ // eslint-disable-next-line no-console
66
70
  console.log(status, json);
67
71
  }}
68
72
  spinner={false}
@@ -6,10 +6,10 @@
6
6
  import React from 'react';
7
7
  import ReactDOM from 'react-dom';
8
8
  import PropTypes from 'prop-types';
9
- import AUCollapsibleComponent from '../AUCollapsibleComponent';
10
- import AUProfileLoginComponent from '../profile/AUProfileLoginComponent';
9
+ import AUCollapsibleComponent from '../common/AUCollapsibleComponent';
10
+ import AUProfileLoginComponent from '../../../components/profile/AUProfileLoginComponent';
11
11
  import AUProfileAvatar2016Component from '../profile/AUProfileAvatar2016Component';
12
- import { getCookie, setCookie } from '../../lib/helpers';
12
+ import { getCookie, setCookie } from '../../../lib/helpers';
13
13
 
14
14
  const parseBurgerLinks = (elements) => {
15
15
  const links = [];
@@ -94,6 +94,7 @@ class StaffTopComponent extends React.Component {
94
94
  onLoad({ ...user, ...{ auId: json.auId } });
95
95
  });
96
96
  }).catch((err) => {
97
+ // eslint-disable-next-line no-console
97
98
  console.log(err);
98
99
  });
99
100
  }
@@ -1,7 +1,6 @@
1
1
  /* eslint-env browser */
2
2
  import React, { useState } from 'react';
3
- import axios from 'axios';
4
- import { universeLabels, profileLabels } from '../../lib/i18n';
3
+ import { universeLabels, profileLabels } from '../../../lib/i18n';
5
4
  import StaffTopComponent from './StaffTopComponent';
6
5
  import StudentTopComponent from './StudentTopComponent';
7
6
 
@@ -26,9 +25,11 @@ const UniverseContainerComponent = () => {
26
25
  lang={lang}
27
26
  user={user}
28
27
  promiseHandler={(callback) => {
29
- axios.get(universeGlobalContentPath).then((promise) => {
30
- callback(promise.data);
31
- });
28
+ fetch(universeGlobalContentPath).then(
29
+ (promise) => promise.json(),
30
+ ).then(
31
+ (data) => callback(data),
32
+ );
32
33
  }}
33
34
  onLoad={(context) => {
34
35
  setUser(context);
@@ -45,9 +46,11 @@ const UniverseContainerComponent = () => {
45
46
  lang={lang}
46
47
  user={user}
47
48
  promiseHandler={(callback) => {
48
- axios.get(universeGlobalContentPath).then((promise) => {
49
- callback(promise.data);
50
- });
49
+ fetch(universeGlobalContentPath).then(
50
+ (promise) => promise.json(),
51
+ ).then(
52
+ (data) => callback(data),
53
+ );
51
54
  }}
52
55
  universeLabels={universeLabels}
53
56
  profileLabels={profileLabels}
@@ -0,0 +1,3 @@
1
+ import '../../styles/app.scss';
2
+ import './au-databox';
3
+ import './au-alphabox';
@@ -89,9 +89,7 @@ class AUAlphabox {
89
89
  const mountNode = document.querySelector(box.config.container);
90
90
  const visible = mountNode && getComputedStyle(mountNode).visibility !== 'hidden';
91
91
  if (visible) {
92
- ReactDOM.render(
93
- <AlphaBoxComponent box={box} />, mountNode,
94
- );
92
+ ReactDOM.render(<AlphaBoxComponent box={box} />, mountNode);
95
93
  box.loaded = true;
96
94
  }
97
95
  }
@@ -6,7 +6,6 @@
6
6
  /* eslint-env browser */
7
7
  import React from 'react';
8
8
  import ReactDOM from 'react-dom';
9
- import axios from 'axios';
10
9
  import DataBoxComponent from '../components/databox/DataBoxComponent';
11
10
 
12
11
  const defaultOptions = {
@@ -58,8 +57,8 @@ class AUDataboxParser {
58
57
  const promises = [];
59
58
  sourceArr.forEach((s) => {
60
59
  promises.push(new Promise((resolve) => {
61
- axios.get(s).then((promise) => {
62
- resolve(promise.data);
60
+ fetch(s).then((promise) => promise.json()).then((data) => {
61
+ resolve(data);
63
62
  });
64
63
  }));
65
64
  });
@@ -380,12 +379,10 @@ class AUDatabox {
380
379
  box.config.stacked = true;
381
380
  }
382
381
  if (visible) {
383
- ReactDOM.render(
384
- <DataBoxComponent
385
- box={box}
386
- parse={parser[box.data.mode]}
387
- />, mountNode,
388
- );
382
+ ReactDOM.render(<DataBoxComponent
383
+ box={box}
384
+ parse={parser[box.data.mode]}
385
+ />, mountNode);
389
386
  box.loaded = true;
390
387
  }
391
388
 
@@ -4,8 +4,7 @@
4
4
  /* eslint-env browser */
5
5
  import React from 'react';
6
6
  import ReactDOM from 'react-dom';
7
- import axios from 'axios';
8
- import AUDiagrammeComponent from '../components/AUDiagrammeComponent';
7
+ import AUDiagrammeComponent from '../components/diagramme/AUDiagrammeComponent';
9
8
 
10
9
  const defaultOptions = {
11
10
  config: {
@@ -64,8 +63,7 @@ class AUDiagramme {
64
63
  table.id = i;
65
64
  AUDiagramme.mergeOptions(table);
66
65
  const url = `https://eddiprod.au.dk/EDDI/webservices/StudieoversigtService2.cfc?method=getLinjeListByDokordningId&tjekForVisningIstudieDiagram=true&allowOrigin=true&dokordningId=${table.config.courseID}`;
67
- axios.get(url).then((promise) => {
68
- const { data } = promise;
66
+ fetch(url).then((promise) => promise.json()).then((data) => {
69
67
  const mountNode = document.querySelector(table.config.container);
70
68
  if (mountNode) {
71
69
  ReactDOM.render(
@@ -85,9 +85,7 @@ class AUFlowbox {
85
85
  };
86
86
  AUFlowbox.parse(box);
87
87
  const mountNode = document.querySelector(box.config.container);
88
- ReactDOM.render(
89
- <FlowBoxComponent box={box} lang={this.lang} />, mountNode,
90
- );
88
+ ReactDOM.render(<FlowBoxComponent box={box} lang={this.lang} />, mountNode);
91
89
  }
92
90
  }
93
91
  }
File without changes
@@ -1,7 +1,8 @@
1
1
  /* eslint-env browser */
2
2
  /* NO IMPORTS! */
3
3
 
4
- const { serviceScopeProfile } = window; // Sættes pr. webapp
4
+ // eslint-disable-next-line no-control-regex
5
+ const emailRegex = /(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])/;
5
6
 
6
7
  const sortAlphaObj = (a, b) => {
7
8
  if (typeof a.name !== 'undefined' && typeof b.name !== 'undefined') {
@@ -10,7 +11,7 @@ const sortAlphaObj = (a, b) => {
10
11
  return 0;
11
12
  };
12
13
 
13
- const isElementInViewport = (element) => {
14
+ const isElementInViewport = (element: HTMLElement): boolean => {
14
15
  if (element === null) {
15
16
  return false;
16
17
  }
@@ -23,7 +24,7 @@ const isElementInViewport = (element) => {
23
24
  && rect.top < (window.innerHeight || document.documentElement.clientHeight);
24
25
  };
25
26
 
26
- const isElementPartlyInViewport = (element) => {
27
+ const isElementPartlyInViewport = (element: HTMLElement): boolean => {
27
28
  let top = element.offsetTop;
28
29
  let left = element.offsetLeft;
29
30
  const width = element.offsetWidth;
@@ -31,7 +32,7 @@ const isElementPartlyInViewport = (element) => {
31
32
 
32
33
  let offsetElement = element;
33
34
  while (offsetElement.offsetParent) {
34
- offsetElement = element.offsetParent;
35
+ offsetElement = element.offsetParent as HTMLElement;
35
36
  top += element.offsetTop;
36
37
  left += element.offsetLeft;
37
38
  }
@@ -44,7 +45,14 @@ const isElementPartlyInViewport = (element) => {
44
45
  );
45
46
  };
46
47
 
47
- const setCookie = (cookieName, value, maxAge = null, exdays = null, path = ';path=/;domain=au.dk') => {
48
+ const setCookie = (
49
+ cookieName: string,
50
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
51
+ value: any,
52
+ maxAge: number | null = null,
53
+ exdays: number | null = null,
54
+ path = ';path=/;domain=au.dk',
55
+ ): void => {
48
56
  let cookieValue = encodeURI(value);
49
57
  if (exdays != null) {
50
58
  const exdate = new Date();
@@ -57,8 +65,8 @@ const setCookie = (cookieName, value, maxAge = null, exdays = null, path = ';pat
57
65
  document.cookie = `${cookieName}=${cookieValue}${path}`;
58
66
  };
59
67
 
60
- const getCookie = (cookieName) => {
61
- let cookieValue = document.cookie;
68
+ const getCookie = (cookieName: string): string | null => {
69
+ let cookieValue: string | null = document.cookie;
62
70
  let cookieStart = cookieValue.indexOf(` ${cookieName}=`);
63
71
  if (cookieStart === -1) {
64
72
  cookieStart = cookieValue.indexOf(`${cookieName}=`);
@@ -76,7 +84,7 @@ const getCookie = (cookieName) => {
76
84
  return cookieValue;
77
85
  };
78
86
 
79
- const addToSessionStorage = (key, data) => {
87
+ const addToSessionStorage = (key: string, data: unknown): unknown => {
80
88
  if (window.sessionStorage) {
81
89
  sessionStorage.setItem(key, JSON.stringify(data));
82
90
  }
@@ -84,7 +92,7 @@ const addToSessionStorage = (key, data) => {
84
92
  return data;
85
93
  };
86
94
 
87
- const getFromSessionStorage = (key) => {
95
+ const getFromSessionStorage = (key: string): unknown | null => {
88
96
  if (window.sessionStorage) {
89
97
  const data = sessionStorage.getItem(key);
90
98
  if (data) {
@@ -95,7 +103,7 @@ const getFromSessionStorage = (key) => {
95
103
  return null;
96
104
  };
97
105
 
98
- const addToLocalStorage = (key, data) => {
106
+ const addToLocalStorage = (key: string, data: unknown): unknown => {
99
107
  if (window.localStorage) {
100
108
  localStorage.setItem(key, JSON.stringify(data));
101
109
  }
@@ -103,7 +111,7 @@ const addToLocalStorage = (key, data) => {
103
111
  return data;
104
112
  };
105
113
 
106
- const getFromLocalStorage = (key) => {
114
+ const getFromLocalStorage = (key: string): unknown | null => {
107
115
  if (window.localStorage) {
108
116
  const data = localStorage.getItem(key);
109
117
  if (data) {
@@ -114,35 +122,8 @@ const getFromLocalStorage = (key) => {
114
122
  return null;
115
123
  };
116
124
 
117
- const setContextInSession = (key, data, clearPrevious = true) => {
118
- if (clearPrevious) {
119
- Object.entries(window.sessionStorage).forEach((entry) => {
120
- const entryKey = entry[0];
121
- if (entryKey.includes('user-context')) {
122
- window.sessionStorage.removeItem(entryKey);
123
- }
124
- });
125
- }
126
- window.sessionStorage.setItem(`user-context-${key}`, data);
127
- };
128
-
129
- const getContextFromSession = (key = '', any = false) => {
130
- if (any) {
131
- let foundContext = null;
132
- Object.entries(window.sessionStorage).forEach((entry) => {
133
- const entryKey = entry[0];
134
- if (entryKey.includes('user-context')) {
135
- foundContext = window.sessionStorage.getItem(entryKey);
136
- }
137
- });
138
- return foundContext;
139
- }
140
-
141
- return window.sessionStorage.getItem(`user-context-${key}`);
142
- };
143
-
144
125
  // Credits: http://blog.vishalon.net/index.php/javascript-getting-and-setting-caret-position-in-textarea/
145
- const setCaretPosition = (element, pos) => {
126
+ const setCaretPosition = (element: HTMLInputElement, pos: number): void => {
146
127
  // Modern browsers
147
128
  if (element && element.setSelectionRange) {
148
129
  element.focus();
@@ -150,23 +131,26 @@ const setCaretPosition = (element, pos) => {
150
131
  }
151
132
  };
152
133
 
153
- const splitPhoneNumber = (countryCodes, phoneNumber) => {
154
- const countryCodeFound = (code) => countryCodes.filter(
134
+ const splitPhoneNumber = (countryCodes: ICountryCode[], phoneNumber: string): IPhoneNumber => {
135
+ const countryCodeFound = (code: string) => countryCodes.filter(
155
136
  (x) => x.code === parseInt(code, 10),
156
137
  ).length > 0;
157
138
 
158
- const findPrefix = () => {
159
- const skip = '+';
160
- let count = 1;
161
- let prefix = countryCodes.find((x) => x.important).code;
162
- while (count < phoneNumber.length) {
163
- const split = phoneNumber.substring(skip.length, skip.length + count);
164
- if (countryCodeFound(split)) {
165
- prefix = split;
139
+ const findPrefix = (): string => {
140
+ if (countryCodes.length > 0) {
141
+ const skip = '';
142
+ let count = 1;
143
+ let prefix = `${countryCodes.find((x) => x.important)?.code}`;
144
+ while (count < phoneNumber.length) {
145
+ const split = phoneNumber.substring(skip.length, skip.length + count);
146
+ if (countryCodeFound(split)) {
147
+ prefix = split;
148
+ }
149
+ count += 1;
166
150
  }
167
- count += 1;
151
+ return skip + prefix;
168
152
  }
169
- return skip + prefix;
153
+ return '';
170
154
  };
171
155
 
172
156
  const prefix = findPrefix();
@@ -176,25 +160,21 @@ const splitPhoneNumber = (countryCodes, phoneNumber) => {
176
160
  };
177
161
  };
178
162
 
179
- const prettyPrintPhone = (countryCodes, phone) => {
163
+ const prettyPrintPhone = (countryCodes: ICountryCode[], phone: string) => {
180
164
  if (phone) {
181
165
  const { prefix, number } = splitPhoneNumber(countryCodes, phone);
182
- return `${prefix} ${number.match(/\d{1,2}/g).join(' ')}`;
166
+ if (prefix) {
167
+ return `${prefix} ${number?.match(/\d{1,2}/g)?.join(' ')}`;
168
+ }
169
+ return number?.match(/\d{1,2}/g)?.join(' ');
183
170
  }
184
171
  return '';
185
172
  };
186
173
 
187
- const getAccessToken = (auAuth, serviceScope, callback) => {
188
- auAuth.getAccessToken([serviceScope]).then((accessToken) => {
189
- callback(accessToken.accessToken);
190
- });
191
- };
192
-
193
- const parseError = (errorArray) => errorArray.map((e) => e.errorMessage).join(', ');
194
-
195
174
  const scrollTo = (x = 0, y = 0) => window.scrollTo(x, y);
196
175
 
197
176
  export {
177
+ emailRegex,
198
178
  sortAlphaObj,
199
179
  isElementInViewport,
200
180
  isElementPartlyInViewport,
@@ -205,12 +185,7 @@ export {
205
185
  addToSessionStorage,
206
186
  getFromSessionStorage,
207
187
  setCaretPosition,
208
- getAccessToken,
209
- serviceScopeProfile,
210
188
  splitPhoneNumber,
211
189
  prettyPrintPhone,
212
- parseError,
213
190
  scrollTo,
214
- setContextInSession,
215
- getContextFromSession,
216
191
  };
@@ -1,26 +1,33 @@
1
- import { useState, useEffect } from 'react';
2
- import { showModal, hideModal } from '@aarhus-university/au-designsystem-delphinus/source/js/components/modal-view';
3
-
4
- const useModal = (domId, initialState, showCondition = true, hideCondition = false) => {
5
- const [modal, setModal] = useState({ modal: initialState, sender: null });
6
-
7
- useEffect(() => {
8
- if (modal.modal && modal.sender && showCondition) {
9
- showModal(domId, modal.sender, () => {
10
- setModal({ modal: false, sender: null });
11
- });
12
- }
13
-
14
- if (modal.modal && modal.sender && hideCondition) {
15
- hideModal(domId, modal.sender, () => {
16
- setModal({ modal: false, sender: null });
17
- });
18
- }
19
- });
20
-
21
- return [modal, setModal];
22
- };
23
-
24
- export {
25
- useModal,
26
- };
1
+ /* eslint-disable import/prefer-default-export */
2
+ import { useState, useEffect } from 'react';
3
+ import { showModal, hideModal } from '@aarhus-university/au-designsystem-delphinus/source/js/components/modal-view';
4
+
5
+ const useModal = (
6
+ domId: string,
7
+ initialState: boolean,
8
+ showCondition = true,
9
+ hideCondition = false,
10
+ closeable = true,
11
+ ): [IModal, (modal: IModal) => void] => {
12
+ const [modal, setModal] = useState<IModal>({ modal: initialState, sender: null });
13
+
14
+ useEffect(() => {
15
+ if (modal.modal && modal.sender && showCondition) {
16
+ showModal(domId, modal.sender, () => {
17
+ setModal({ modal: false, sender: null });
18
+ }, closeable);
19
+ }
20
+
21
+ if (modal.modal && modal.sender && hideCondition) {
22
+ hideModal(domId, modal.sender, () => {
23
+ setModal({ modal: false, sender: null });
24
+ });
25
+ }
26
+ });
27
+
28
+ return [modal, setModal];
29
+ };
30
+
31
+ export {
32
+ useModal,
33
+ };