@aarhus-university/au-lib-react-components 8.20.0 → 8.80.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 (168) 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.js +80 -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 +0 -2
  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.js +130 -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} +40 -66
  78. package/src/lib/hooks.ts +33 -0
  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 +64 -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 +138 -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/delphinus/hooks.js +0 -25
  126. package/src/components/form/AUMobilePrefixComponent.js +0 -18
  127. package/src/components/news/EventLayout1Component.js +0 -94
  128. package/src/components/news/EventLayout2Component.js +0 -90
  129. package/src/components/news/EventLayout3Component.js +0 -68
  130. package/src/components/news/NewsCategoriesComponent.js +0 -21
  131. package/src/components/news/NewsCollageBannerComponent.js +0 -71
  132. package/src/components/news/NewsColumnsComponent.js +0 -125
  133. package/src/components/news/NewsLanguageChangeComponent.js +0 -74
  134. package/src/components/news/NewsLayout1Component.js +0 -80
  135. package/src/components/news/NewsLayout2Component.js +0 -80
  136. package/src/components/news/NewsLayout3Component.js +0 -81
  137. package/src/components/news/NewsLayout4Component.js +0 -80
  138. package/src/components/news/NewsLayout5Component.js +0 -61
  139. package/src/components/news/NewsLayout6Component.js +0 -55
  140. package/src/components/news/NewsLayout7Component.js +0 -58
  141. package/src/components/news/NewsLayout8Component.js +0 -57
  142. package/src/components/news/NewsListComponent.js +0 -291
  143. package/src/components/news/NewsPopUpComponent.js +0 -591
  144. package/src/components/news/NewsRSSComponent.js +0 -74
  145. package/src/components/news/NewsSocialComponent.js +0 -104
  146. package/src/components/news/NewsSubHeaderComponent.js +0 -19
  147. package/src/components/password/AUChangePasswordComponent.js +0 -177
  148. package/src/components/password/AUCurrentPasswordComponent.js +0 -72
  149. package/src/components/password/AUNewPasswordComponent.js +0 -143
  150. package/src/components/password/AUPasswordActions.js +0 -101
  151. package/src/components/password/AUPasswordHooks.js +0 -47
  152. package/src/components/password/AUPasswordReducer.js +0 -78
  153. package/src/components/password/AUPasswordRequirementsComponent.js +0 -29
  154. package/src/config/webpack.cjs.config.js +0 -75
  155. package/src/config/webpack.dev.config.js +0 -61
  156. package/src/config/webpack.umd.config.js +0 -107
  157. package/src/index.js +0 -6
  158. package/src/lib/au-auth.js +0 -221
  159. package/src/lib/au-news.js +0 -306
  160. package/src/lib/menu.js +0 -10
  161. package/src/lib/urlHandler.js +0 -63
  162. package/src/lib/validation.js +0 -181
  163. package/src/styles/alert.scss +0 -39
  164. package/src/styles/calendar.scss +0 -112
  165. package/src/styles/filtercheckbox.scss +0 -5
  166. package/src/styles/modal.scss +0 -35
  167. package/src/styles/pagination.scss +0 -11
  168. 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,13 @@ 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
+ value: string,
51
+ maxAge: number | null = null,
52
+ exdays: number | null = null,
53
+ path = ';path=/;domain=au.dk',
54
+ ): void => {
48
55
  let cookieValue = encodeURI(value);
49
56
  if (exdays != null) {
50
57
  const exdate = new Date();
@@ -57,8 +64,8 @@ const setCookie = (cookieName, value, maxAge = null, exdays = null, path = ';pat
57
64
  document.cookie = `${cookieName}=${cookieValue}${path}`;
58
65
  };
59
66
 
60
- const getCookie = (cookieName) => {
61
- let cookieValue = document.cookie;
67
+ const getCookie = (cookieName: string): string | null => {
68
+ let cookieValue: string | null = document.cookie;
62
69
  let cookieStart = cookieValue.indexOf(` ${cookieName}=`);
63
70
  if (cookieStart === -1) {
64
71
  cookieStart = cookieValue.indexOf(`${cookieName}=`);
@@ -76,7 +83,7 @@ const getCookie = (cookieName) => {
76
83
  return cookieValue;
77
84
  };
78
85
 
79
- const addToSessionStorage = (key, data) => {
86
+ const addToSessionStorage = (key: string, data: unknown): unknown => {
80
87
  if (window.sessionStorage) {
81
88
  sessionStorage.setItem(key, JSON.stringify(data));
82
89
  }
@@ -84,7 +91,7 @@ const addToSessionStorage = (key, data) => {
84
91
  return data;
85
92
  };
86
93
 
87
- const getFromSessionStorage = (key) => {
94
+ const getFromSessionStorage = (key: string): unknown | null => {
88
95
  if (window.sessionStorage) {
89
96
  const data = sessionStorage.getItem(key);
90
97
  if (data) {
@@ -95,7 +102,7 @@ const getFromSessionStorage = (key) => {
95
102
  return null;
96
103
  };
97
104
 
98
- const addToLocalStorage = (key, data) => {
105
+ const addToLocalStorage = (key: string, data: unknown): unknown => {
99
106
  if (window.localStorage) {
100
107
  localStorage.setItem(key, JSON.stringify(data));
101
108
  }
@@ -103,7 +110,7 @@ const addToLocalStorage = (key, data) => {
103
110
  return data;
104
111
  };
105
112
 
106
- const getFromLocalStorage = (key) => {
113
+ const getFromLocalStorage = (key: string): unknown | null => {
107
114
  if (window.localStorage) {
108
115
  const data = localStorage.getItem(key);
109
116
  if (data) {
@@ -114,35 +121,8 @@ const getFromLocalStorage = (key) => {
114
121
  return null;
115
122
  };
116
123
 
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
124
  // Credits: http://blog.vishalon.net/index.php/javascript-getting-and-setting-caret-position-in-textarea/
145
- const setCaretPosition = (element, pos) => {
125
+ const setCaretPosition = (element: HTMLInputElement, pos: number): void => {
146
126
  // Modern browsers
147
127
  if (element && element.setSelectionRange) {
148
128
  element.focus();
@@ -150,23 +130,26 @@ const setCaretPosition = (element, pos) => {
150
130
  }
151
131
  };
152
132
 
153
- const splitPhoneNumber = (countryCodes, phoneNumber) => {
154
- const countryCodeFound = (code) => countryCodes.filter(
133
+ const splitPhoneNumber = (countryCodes: ICountryCode[], phoneNumber: string): IPhoneNumber => {
134
+ const countryCodeFound = (code: string) => countryCodes.filter(
155
135
  (x) => x.code === parseInt(code, 10),
156
136
  ).length > 0;
157
137
 
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;
138
+ const findPrefix = (): string => {
139
+ if (countryCodes.length > 0) {
140
+ const skip = '';
141
+ let count = 1;
142
+ let prefix = countryCodes.find((x) => x.important)?.code;
143
+ while (count < phoneNumber.length) {
144
+ const split = phoneNumber.substring(skip.length, skip.length + count);
145
+ if (countryCodeFound(split)) {
146
+ prefix = parseInt(split, 10);
147
+ }
148
+ count += 1;
166
149
  }
167
- count += 1;
150
+ return skip + prefix;
168
151
  }
169
- return skip + prefix;
152
+ return '';
170
153
  };
171
154
 
172
155
  const prefix = findPrefix();
@@ -176,25 +159,21 @@ const splitPhoneNumber = (countryCodes, phoneNumber) => {
176
159
  };
177
160
  };
178
161
 
179
- const prettyPrintPhone = (countryCodes, phone) => {
162
+ const prettyPrintPhone = (countryCodes: ICountryCode[], phone: string) => {
180
163
  if (phone) {
181
164
  const { prefix, number } = splitPhoneNumber(countryCodes, phone);
182
- return `${prefix} ${number.match(/\d{1,2}/g).join(' ')}`;
165
+ if (prefix) {
166
+ return `${prefix} ${number?.match(/\d{1,2}/g)?.join(' ')}`;
167
+ }
168
+ return number?.match(/\d{1,2}/g)?.join(' ');
183
169
  }
184
170
  return '';
185
171
  };
186
172
 
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
173
  const scrollTo = (x = 0, y = 0) => window.scrollTo(x, y);
196
174
 
197
175
  export {
176
+ emailRegex,
198
177
  sortAlphaObj,
199
178
  isElementInViewport,
200
179
  isElementPartlyInViewport,
@@ -205,12 +184,7 @@ export {
205
184
  addToSessionStorage,
206
185
  getFromSessionStorage,
207
186
  setCaretPosition,
208
- getAccessToken,
209
- serviceScopeProfile,
210
187
  splitPhoneNumber,
211
188
  prettyPrintPhone,
212
- parseError,
213
189
  scrollTo,
214
- setContextInSession,
215
- getContextFromSession,
216
190
  };
@@ -0,0 +1,33 @@
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
+ };