@aarhus-university/au-lib-react-components 9.11.18 → 10.0.1

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} +33 -58
  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 +52 -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,150 +1,145 @@
1
- /* eslint-env browser */
2
- /* eslint-disable max-len */
3
- import React, { useEffect, useRef } from 'react';
4
- import PropTypes from 'prop-types';
5
- import {
6
- BrowserRouter as Router,
7
- Switch,
8
- Route,
9
- NavLink,
10
- useLocation,
11
- } from 'react-router-dom';
12
- import { setTabbedContent, isBelowViewportLimit, destroyTabs } from '@aarhus-university/au-designsystem-delphinus/source/js/components/tabs';
13
-
14
- const Routes = ({ onRouteChange, content }) => {
15
- const location = useLocation();
16
- useEffect(() => {
17
- onRouteChange(location);
18
- }, [location]);
19
-
20
- return (
21
- <Switch>
22
- {content}
23
- </Switch>
24
- );
25
- };
26
-
27
- Routes.displayName = 'Routes';
28
- Routes.propTypes = {
29
- onRouteChange: PropTypes.func.isRequired,
30
- content: PropTypes.element.isRequired,
31
- };
32
-
33
- let windowInnerWidth = 0;
34
- let tabbedObject = null;
35
-
36
- const AUTabbedContentComponent = ({
37
- tabKey,
38
- tabs,
39
- tabContent,
40
- children,
41
- focus,
42
- initial,
43
- lang,
44
- callback,
45
- withRouter,
46
- classNames,
47
- }) => {
48
- const tabsElement = useRef();
49
-
50
- const setTabs = () => {
51
- if (isBelowViewportLimit(tabbedObject.domElement.classList)) {
52
- if (!tabbedObject.rendered) {
53
- setTabbedContent(tabKey, tabbedObject.domElement, initial, focus, callback);
54
- tabbedObject.rendered = true;
55
- }
56
- } else if (tabbedObject.rendered) {
57
- destroyTabs(tabbedObject.domElement);
58
- tabbedObject.rendered = false;
59
- }
60
- };
61
-
62
- useEffect(() => {
63
- if (!withRouter) {
64
- tabbedObject = {
65
- domElement: tabsElement.current,
66
- rendered: false,
67
- };
68
- setTabs();
69
- windowInnerWidth = window.innerWidth;
70
- window.addEventListener('resize', () => {
71
- if (windowInnerWidth > 0 && window.innerWidth !== windowInnerWidth) {
72
- windowInnerWidth = window.innerWidth;
73
- setTabs();
74
- }
75
- });
76
- }
77
- }, []);
78
-
79
- if (withRouter) {
80
- const renderRouteTabs = tabs.map((tab) => (
81
- <NavLink
82
- key={tab.href}
83
- to={tab.href}
84
- className="nav__item"
85
- activeClassName="nav__item--active"
86
- dangerouslySetInnerHTML={{ __html: tab.text }}
87
- />
88
- ));
89
- const renderContent = tabContent.map((content, index) => <Route key={tabs[index].href} exact path={tabs[index].href}>{content}</Route>);
90
-
91
- return (
92
- <Router>
93
- <div ref={tabsElement} className={classNames}>
94
- <div className="nav nav--has-active-item">
95
- <div className="nav__items">
96
- {renderRouteTabs}
97
- </div>
98
- </div>
99
- <Routes content={renderContent} onRouteChange={() => callback()} />
100
- </div>
101
- </Router>
102
- );
103
- }
104
-
105
- // eslint-disable-next-line jsx-a11y/control-has-associated-label
106
- const renderTabs = tabs.map((tab) => <a key={tab.href} href={tab.href} className="nav__item" data-gtm={tab.dataGtm} dangerouslySetInnerHTML={{ __html: tab.text }} />);
107
-
108
- return (
109
- <div ref={tabsElement} className={classNames}>
110
- <div className="nav nav--has-active-item">
111
- <div className="nav__items">
112
- {renderTabs}
113
- </div>
114
- <button type="button" className="nav__toggle">{lang === 'da' ? 'Mere' : 'More'}</button>
115
- </div>
116
- {children}
117
- </div>
118
- );
119
- };
120
-
121
- AUTabbedContentComponent.defaultProps = {
122
- tabKey: 0,
123
- children: null,
124
- tabContent: null,
125
- focus: true,
126
- initial: 0,
127
- lang: 'da',
128
- callback: () => { },
129
- withRouter: false,
130
- classNames: 'tabbed-content',
131
- };
132
-
133
- AUTabbedContentComponent.propTypes = {
134
- tabKey: PropTypes.number,
135
- tabs: PropTypes.arrayOf(PropTypes.shape({
136
- text: PropTypes.string.isRequired,
137
- href: PropTypes.string.isRequired,
138
- })).isRequired,
139
- tabContent: PropTypes.arrayOf(PropTypes.element),
140
- children: PropTypes.element,
141
- focus: PropTypes.bool,
142
- initial: PropTypes.number,
143
- lang: PropTypes.string,
144
- callback: PropTypes.func,
145
- withRouter: PropTypes.bool,
146
- classNames: PropTypes.string,
147
- };
148
-
149
- AUTabbedContentComponent.displayName = 'AUTabbedContentComponent';
150
- export default AUTabbedContentComponent;
1
+ /* eslint-env browser */
2
+ /* eslint-disable max-len */
3
+ import React, { useEffect, useRef, FC } from 'react';
4
+ import {
5
+ BrowserRouter as Router,
6
+ Routes,
7
+ Route,
8
+ NavLink,
9
+ useLocation,
10
+ } from 'react-router-dom';
11
+ import { setTabbedContent, isBelowViewportLimit, destroyTabs } from '@aarhus-university/au-designsystem-delphinus/source/js/components/tabs';
12
+
13
+ const TabRoutes: FC<TabRoutesProps> = ({ onRouteChange, content }: TabRoutesProps) => {
14
+ const location = useLocation();
15
+ useEffect(() => {
16
+ onRouteChange(location);
17
+ }, [location]);
18
+
19
+ return (
20
+ <Routes>
21
+ {content}
22
+ </Routes>
23
+ );
24
+ };
25
+
26
+ TabRoutes.displayName = 'Routes';
27
+
28
+ let windowInnerWidth = 0;
29
+ let tabbedObject: ITabbedObject | null = null;
30
+
31
+ const AUTabbedContentComponent: FC<AUTabbedContentComponentProps> = ({
32
+ tabKey,
33
+ tabs,
34
+ tabContent,
35
+ children,
36
+ focus,
37
+ initial,
38
+ lang,
39
+ callback,
40
+ withRouter,
41
+ classNames,
42
+ }: AUTabbedContentComponentProps) => {
43
+ const tabsElement = useRef<HTMLDivElement>(null);
44
+
45
+ const setTabs = () => {
46
+ if (tabbedObject != null) {
47
+ if (isBelowViewportLimit(tabbedObject.domElement.classList)) {
48
+ if (!tabbedObject.rendered) {
49
+ setTabbedContent(tabKey as number, tabbedObject.domElement, initial, focus, callback);
50
+ tabbedObject.rendered = true;
51
+ }
52
+ } else if (tabbedObject.rendered) {
53
+ destroyTabs(tabbedObject.domElement);
54
+ tabbedObject.rendered = false;
55
+ }
56
+ }
57
+ };
58
+
59
+ useEffect(() => {
60
+ if (!withRouter) {
61
+ tabbedObject = {
62
+ domElement: tabsElement.current as HTMLElement,
63
+ rendered: false,
64
+ };
65
+ setTabs();
66
+ windowInnerWidth = window.innerWidth;
67
+ window.addEventListener('resize', () => {
68
+ if (windowInnerWidth > 0 && window.innerWidth !== windowInnerWidth) {
69
+ windowInnerWidth = window.innerWidth;
70
+ setTabs();
71
+ }
72
+ });
73
+ }
74
+ }, []);
75
+
76
+ if (withRouter) {
77
+ const renderRouteTabs = tabs.map((tab) => (
78
+ <NavLink
79
+ key={tab.href}
80
+ to={tab.href}
81
+ className={({ isActive }) => (isActive ? 'nav__item nav__item--active' : 'nav__item')}
82
+ dangerouslySetInnerHTML={{ __html: tab.text }}
83
+ />
84
+ ));
85
+ const renderContent = (tabContent || []).map((content, index: number) => (
86
+ <Route
87
+ key={tabs[index].href}
88
+ path={tabs[index].href}
89
+ >
90
+ {content}
91
+ </Route>
92
+ ));
93
+
94
+ return (
95
+ <Router>
96
+ <div ref={tabsElement} className={classNames}>
97
+ <div className="nav nav--has-active-item">
98
+ <div className="nav__items">
99
+ {renderRouteTabs}
100
+ </div>
101
+ </div>
102
+ <TabRoutes
103
+ content={renderContent}
104
+ onRouteChange={() => {
105
+ if (typeof callback === 'function') {
106
+ callback();
107
+ }
108
+ }}
109
+ />
110
+ </div>
111
+ </Router>
112
+ );
113
+ }
114
+
115
+ // eslint-disable-next-line jsx-a11y/control-has-associated-label
116
+ const renderTabs = tabs.map((tab: ITabbedTab) => <a key={tab.href} href={tab.href} className="nav__item" data-gtm={tab.dataGtm} dangerouslySetInnerHTML={{ __html: tab.text }} />);
117
+
118
+ return (
119
+ <div ref={tabsElement} className={classNames}>
120
+ <div className="nav nav--has-active-item">
121
+ <div className="nav__items">
122
+ {renderTabs}
123
+ </div>
124
+ <button type="button" className="nav__toggle">{lang === 'da' ? 'Mere' : 'More'}</button>
125
+ </div>
126
+ {children}
127
+ </div>
128
+ );
129
+ };
130
+
131
+ AUTabbedContentComponent.defaultProps = {
132
+ tabKey: 0,
133
+ children: null,
134
+ tabContent: null,
135
+ focus: true,
136
+ initial: 0,
137
+ lang: 'da',
138
+ // eslint-disable-next-line @typescript-eslint/no-empty-function
139
+ callback: () => { },
140
+ withRouter: false,
141
+ classNames: 'tabbed-content',
142
+ };
143
+
144
+ AUTabbedContentComponent.displayName = 'AUTabbedContentComponent';
145
+ export default AUTabbedContentComponent;
@@ -1,28 +1,24 @@
1
- import React, { useLayoutEffect, useRef } from 'react';
2
- import PropTypes from 'prop-types';
3
- import { setResponsiveTable } from '@aarhus-university/au-designsystem-delphinus/source/js/components/table';
4
-
5
-
6
- const AUTableComponent = ({ children, className }) => {
7
- const tableRef = useRef(null);
8
- useLayoutEffect(() => {
9
- const element = tableRef.current;
10
- if (element) {
11
- setResponsiveTable(element);
12
- }
13
- }, []);
14
-
15
- return (
16
- <table ref={tableRef} className={className}>
17
- {children}
18
- </table>
19
- );
20
- };
21
-
22
- AUTableComponent.propTypes = {
23
- className: PropTypes.string.isRequired,
24
- children: PropTypes.element.isRequired,
25
- };
26
-
27
- AUTableComponent.displayName = 'AUTableComponent';
28
- export default AUTableComponent;
1
+ import React, { useLayoutEffect, useRef, FC } from 'react';
2
+ import { setResponsiveTable } from '@aarhus-university/au-designsystem-delphinus/source/js/components/table';
3
+
4
+ const AUTableComponent: FC<AUTableComponentProps> = ({
5
+ children,
6
+ className,
7
+ }: AUTableComponentProps) => {
8
+ const tableRef = useRef<HTMLTableElement>(null);
9
+ useLayoutEffect(() => {
10
+ const element = tableRef.current;
11
+ if (element) {
12
+ setResponsiveTable(element);
13
+ }
14
+ }, []);
15
+
16
+ return (
17
+ <table ref={tableRef} className={className}>
18
+ {children}
19
+ </table>
20
+ );
21
+ };
22
+
23
+ AUTableComponent.displayName = 'AUTableComponent';
24
+ export default AUTableComponent;
@@ -1,91 +1,104 @@
1
- /* eslint-env browser */
2
- import React, { useEffect, useLayoutEffect, useRef } from 'react';
3
- import PropTypes from 'prop-types';
4
-
5
- const dismissTimeout = 5000;
6
- let timeoutId = null;
7
- const AUToastComponent = ({ message: pMessage, dismiss, onOpen }) => {
8
- const { type, message } = pMessage;
9
- const toastRef = useRef(null);
10
- const persistent = type !== 'confirm';
11
-
12
- const moveOut = (element) => {
13
- const moveOutClass = 'toast-notification--move-out';
14
- element.classList.add(moveOutClass);
15
- const moveOutElement = document.querySelector(`.${moveOutClass}`);
16
- if (moveOutElement) {
17
- moveOutElement.addEventListener('animationend', () => {
18
- dismiss();
19
- });
20
- }
21
- };
22
-
23
- useEffect(() => {
24
- onOpen();
25
- }, []);
26
-
27
- useLayoutEffect(() => {
28
- const element = toastRef.current;
29
- if (!persistent) {
30
- if (element) {
31
- element.addEventListener('animationend', () => {
32
- timeoutId = setTimeout(() => {
33
- moveOut(element);
34
- }, dismissTimeout);
35
- });
36
- element.addEventListener('mouseenter', () => {
37
- if (timeoutId) {
38
- clearTimeout(timeoutId);
39
- element.addEventListener('mouseleave', () => {
40
- moveOut(element);
41
- });
42
- }
43
- });
44
- }
45
- } else {
46
- element.querySelector('button').focus();
47
- }
48
- }, []);
49
-
50
- let className = `theme--normal toast-notification toast-notification--${type}`;
51
- if (persistent) {
52
- className = `${className} toast-notification--persistent`;
53
- }
54
- return (
55
- <div ref={toastRef} className={className}>
56
- <div className="toast-notification__content">
57
- <p dangerouslySetInnerHTML={{ __html: message }} />
58
- </div>
59
- {
60
- persistent && (
61
- <button
62
- type="button"
63
- className="button"
64
- onClick={() => {
65
- moveOut(toastRef.current);
66
- }}
67
- >
68
- OK
69
- </button>
70
- )
71
- }
72
- </div>
73
- );
74
- };
75
-
76
- AUToastComponent.defaultProps = {
77
- dismiss: () => {},
78
- onOpen: () => {},
79
- };
80
-
81
- AUToastComponent.propTypes = {
82
- message: PropTypes.shape({
83
- type: PropTypes.string.isRequired,
84
- message: PropTypes.string.isRequired,
85
- }).isRequired,
86
- dismiss: PropTypes.func,
87
- onOpen: PropTypes.func,
88
- };
89
-
90
- AUToastComponent.displayName = 'AUToastComponent';
91
- export default AUToastComponent;
1
+ /* eslint-env browser */
2
+ import React, {
3
+ useEffect, useLayoutEffect, useRef, FC,
4
+ } from 'react';
5
+ import PropTypes from 'prop-types';
6
+
7
+ const dismissTimeout = 5000;
8
+ let timeoutId: NodeJS.Timeout | null = null;
9
+
10
+ const AUToastComponent: FC<AUToastComponentProps> = ({
11
+ message: pMessage,
12
+ dismiss,
13
+ onOpen,
14
+ }: AUToastComponentProps) => {
15
+ const { type, message } = pMessage;
16
+ const toastRef = useRef<HTMLDivElement>(null);
17
+ const persistent = type !== 'confirm';
18
+
19
+ const moveOut = (element: HTMLElement): void => {
20
+ const moveOutClass = 'toast-notification--move-out';
21
+ element.classList.add(moveOutClass);
22
+ const moveOutElement = document.querySelector(`.${moveOutClass}`);
23
+ if (moveOutElement && typeof dismiss === 'function') {
24
+ moveOutElement.addEventListener('animationend', () => {
25
+ dismiss();
26
+ });
27
+ }
28
+ };
29
+
30
+ useEffect(() => {
31
+ if (typeof onOpen === 'function') {
32
+ onOpen();
33
+ }
34
+ }, []);
35
+
36
+ useLayoutEffect(() => {
37
+ const element = toastRef.current;
38
+ if (!persistent) {
39
+ if (element) {
40
+ element.addEventListener('animationend', () => {
41
+ timeoutId = setTimeout(() => {
42
+ moveOut(element);
43
+ }, dismissTimeout);
44
+ });
45
+ element.addEventListener('mouseenter', () => {
46
+ if (timeoutId) {
47
+ clearTimeout(timeoutId);
48
+ element.addEventListener('mouseleave', () => {
49
+ moveOut(element);
50
+ });
51
+ }
52
+ });
53
+ }
54
+ } else {
55
+ element?.querySelector('button')?.focus();
56
+ }
57
+ }, []);
58
+
59
+ let className = `theme--normal toast-notification toast-notification--${type}`;
60
+ if (persistent) {
61
+ className = `${className} toast-notification--persistent`;
62
+ }
63
+ return (
64
+ <div ref={toastRef} className={className}>
65
+ <div className="toast-notification__content">
66
+ <p dangerouslySetInnerHTML={{ __html: message }} />
67
+ </div>
68
+ {
69
+ persistent && (
70
+ <button
71
+ type="button"
72
+ className="button"
73
+ onClick={() => {
74
+ if (toastRef.current) {
75
+ moveOut(toastRef.current);
76
+ }
77
+ }}
78
+ >
79
+ OK
80
+ </button>
81
+ )
82
+ }
83
+ </div>
84
+ );
85
+ };
86
+
87
+ AUToastComponent.defaultProps = {
88
+ // eslint-disable-next-line @typescript-eslint/no-empty-function
89
+ dismiss: () => { },
90
+ // eslint-disable-next-line @typescript-eslint/no-empty-function
91
+ onOpen: () => { },
92
+ };
93
+
94
+ AUToastComponent.propTypes = {
95
+ message: PropTypes.shape({
96
+ type: PropTypes.string.isRequired,
97
+ message: PropTypes.string.isRequired,
98
+ }).isRequired,
99
+ dismiss: PropTypes.func,
100
+ onOpen: PropTypes.func,
101
+ };
102
+
103
+ AUToastComponent.displayName = 'AUToastComponent';
104
+ export default AUToastComponent;
@@ -1,48 +1,45 @@
1
- /* eslint-disable react/no-array-index-key */
2
- /* eslint-env browser */
3
- import React, { useEffect } from 'react';
4
- import PropTypes from 'prop-types';
5
- import { setToolbars, setToolbarToggle } from '@aarhus-university/au-designsystem-delphinus/source/js/components/toolbar';
6
-
7
- let windowInnerWidth = 0;
8
- const AUToolbarComponent = ({ lang, elements }) => {
9
- useEffect(() => {
10
- setToolbars();
11
- setToolbarToggle();
12
- windowInnerWidth = window.innerWidth;
13
- window.addEventListener('resize', () => {
14
- if (windowInnerWidth > 0 && window.innerWidth !== windowInnerWidth) {
15
- windowInnerWidth = window.innerWidth;
16
- setToolbars();
17
- }
18
- });
19
- }, []);
20
-
21
- const renderElements = elements.map((e, i) => <React.Fragment key={i}>{e}</React.Fragment>);
22
- const label = lang === 'da' ? 'Muligheder' : 'Options';
23
-
24
- return (
25
- <div className="toolbar">
26
- <div className="toolbar__items">
27
- {renderElements}
28
- </div>
29
- <button
30
- type="button"
31
- className="toolbar__toggle"
32
- title={label}
33
- aria-haspopup="true"
34
- >
35
- {label}
36
- </button>
37
- </div>
38
- );
39
- };
40
-
41
- AUToolbarComponent.displayName = 'AUToolbarComponent';
42
-
43
- AUToolbarComponent.propTypes = {
44
- lang: PropTypes.string.isRequired,
45
- elements: PropTypes.arrayOf(PropTypes.element).isRequired,
46
- };
47
-
48
- export default AUToolbarComponent;
1
+ /* eslint-disable react/no-array-index-key */
2
+ /* eslint-env browser */
3
+ import React, { useEffect, FC } from 'react';
4
+ import { setToolbars, setToolbarToggle } from '@aarhus-university/au-designsystem-delphinus/source/js/components/toolbar';
5
+
6
+ let windowInnerWidth = 0;
7
+
8
+ const AUToolbarComponent: FC<AUToolbarComponentProps> = ({
9
+ lang,
10
+ elements,
11
+ }: AUToolbarComponentProps) => {
12
+ useEffect(() => {
13
+ setToolbars();
14
+ setToolbarToggle();
15
+ windowInnerWidth = window.innerWidth;
16
+ window.addEventListener('resize', () => {
17
+ if (windowInnerWidth > 0 && window.innerWidth !== windowInnerWidth) {
18
+ windowInnerWidth = window.innerWidth;
19
+ setToolbars();
20
+ }
21
+ });
22
+ }, []);
23
+
24
+ const renderElements = elements.map((e, i) => <React.Fragment key={i}>{e}</React.Fragment>);
25
+ const label = lang === 'da' ? 'Muligheder' : 'Options';
26
+
27
+ return (
28
+ <div className="toolbar">
29
+ <div className="toolbar__items">
30
+ {renderElements}
31
+ </div>
32
+ <button
33
+ type="button"
34
+ className="toolbar__toggle"
35
+ title={label}
36
+ aria-haspopup="true"
37
+ >
38
+ {label}
39
+ </button>
40
+ </div>
41
+ );
42
+ };
43
+
44
+ AUToolbarComponent.displayName = 'AUToolbarComponent';
45
+ export default AUToolbarComponent;