@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,76 +1,78 @@
1
- /* eslint-env browser */
2
- /* eslint jsx-a11y/click-events-have-key-events: 0 */
3
- /* eslint jsx-a11y/no-noninteractive-element-interactions: 0 */
4
- /* eslint jsx-a11y/no-static-element-interactions: 0 */
5
- import React from 'react';
6
- import ReactDOM from 'react-dom';
7
- import PropTypes from 'prop-types';
8
- import { hideModal } from '@aarhus-university/au-designsystem-delphinus/source/js/components/modal-view';
9
-
10
- const AUModalComponent = (props) => {
11
- const {
12
- domId,
13
- content,
14
- children,
15
- onClose,
16
- closeButton,
17
- lang,
18
- sender,
19
- className,
20
- } = props;
21
-
22
- return [
23
- ReactDOM.createPortal(
24
- <div
25
- key={0}
26
- id={domId}
27
- className={className}
28
- >
29
- <div className="modal-view__wrapper theme--normal">
30
- {
31
- closeButton && (
32
- <button
33
- type="button"
34
- className="modal-view__close button button--icon button--icon--hide-label"
35
- data-icon=""
36
- onClick={() => {
37
- if (typeof onClose === 'function') {
38
- onClose();
39
- }
40
- hideModal(domId, sender);
41
- }}
42
- >
43
- {lang === 'da' ? 'Luk' : 'Close'}
44
- </button>
45
- )
46
- }
47
- {children || content}
48
- </div>
49
- </div>,
50
- document.querySelector('body'),
51
- ),
52
- ];
53
- };
54
-
55
- AUModalComponent.defaultProps = {
56
- children: null,
57
- content: null,
58
- onClose: null,
59
- closeButton: true,
60
- lang: 'da',
61
- className: 'modal-view',
62
- };
63
-
64
- AUModalComponent.propTypes = {
65
- domId: PropTypes.string.isRequired,
66
- children: PropTypes.element,
67
- content: PropTypes.element,
68
- onClose: PropTypes.func,
69
- closeButton: PropTypes.bool,
70
- lang: PropTypes.string,
71
- sender: PropTypes.element.isRequired,
72
- className: PropTypes.string,
73
- };
74
-
75
- AUModalComponent.displayName = 'AUModalComponent';
76
- export default AUModalComponent;
1
+ /* eslint-env browser */
2
+ /* eslint jsx-a11y/click-events-have-key-events: 0 */
3
+ /* eslint jsx-a11y/no-noninteractive-element-interactions: 0 */
4
+ /* eslint jsx-a11y/no-static-element-interactions: 0 */
5
+ import React, { FC, useLayoutEffect } from 'react';
6
+ import ReactDOM from 'react-dom';
7
+ import { hideModal } from '@aarhus-university/au-designsystem-delphinus/source/js/components/modal-view';
8
+
9
+ export {
10
+ hideModal,
11
+ };
12
+
13
+ const AUModalComponent: FC<AUModalComponentProps> = ({
14
+ domId,
15
+ children,
16
+ onClose,
17
+ closeButton,
18
+ closeButtonDisabled,
19
+ lang,
20
+ sender,
21
+ className,
22
+ }: AUModalComponentProps) => {
23
+ useLayoutEffect(() => {
24
+ const modalView = document.getElementById(domId);
25
+ if (modalView) {
26
+ const header = modalView.querySelector('.modal-view__header');
27
+ if (header && !header.getAttribute('id')) {
28
+ header.setAttribute('id', `${domId}-header`);
29
+ modalView.setAttribute('aria-labelledby', `${domId}-header`);
30
+ }
31
+ }
32
+ });
33
+
34
+ return (
35
+ ReactDOM.createPortal(
36
+ <div
37
+ key={0}
38
+ id={domId}
39
+ className={className}
40
+ >
41
+ <div className="modal-view__wrapper theme--normal">
42
+ {
43
+ closeButton && (
44
+ <button
45
+ type="button"
46
+ disabled={closeButtonDisabled}
47
+ className="modal-view__close button button--icon button--icon--hide-label"
48
+ data-icon=""
49
+ data-gtm="au-btn-modal-close"
50
+ title={lang === 'da' ? 'Luk' : 'Close'}
51
+ onClick={() => {
52
+ if (typeof onClose === 'function') {
53
+ onClose();
54
+ }
55
+ hideModal(domId, sender);
56
+ }}
57
+ >
58
+ {lang === 'da' ? 'Luk' : 'Close'}
59
+ </button>
60
+ )
61
+ }
62
+ {children}
63
+ </div>
64
+ </div>,
65
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
66
+ document.querySelector('body')!,
67
+ )
68
+ );
69
+ };
70
+
71
+ AUModalComponent.defaultProps = {
72
+ closeButton: true,
73
+ lang: 'da',
74
+ className: 'modal-view',
75
+ };
76
+
77
+ AUModalComponent.displayName = 'AUModalComponent';
78
+ export default AUModalComponent;
@@ -1,40 +1,33 @@
1
- import React from 'react';
2
- import PropTypes from 'prop-types';
3
-
4
- const AUReceiptComponent = ({
5
- receiptText,
6
- helpText,
7
- showGoTo,
8
- buttons,
9
- }) => {
10
- const renderButtons = buttons.map((btn) => <a key={btn.gotoLink} href={btn.gotoLink} className="button">{btn.gotoText}</a>);
11
- return (
12
- <div className="receipt">
13
- <div className="receipt__icon" data-icon="" />
14
- <h1 className="receipt__header" dangerouslySetInnerHTML={{ __html: receiptText }} />
15
- {helpText}
16
- {
17
- showGoTo && (
18
- <div className="receipt__post-action">
19
- {renderButtons}
20
- </div>
21
- )
22
- }
23
- </div>
24
- );
25
- };
26
-
27
- AUReceiptComponent.defaultProps = {
28
- showGoTo: true,
29
- helpText: null,
30
- buttons: [],
31
- };
32
-
33
- AUReceiptComponent.propTypes = {
34
- receiptText: PropTypes.string.isRequired,
35
- helpText: PropTypes.element,
36
- showGoTo: PropTypes.bool,
37
- buttons: PropTypes.arrayOf(PropTypes.shape({})),
38
- };
39
- AUReceiptComponent.displayName = 'AUReceiptComponent';
40
- export default AUReceiptComponent;
1
+ import React, { FC } from 'react';
2
+
3
+ const AUReceiptComponent: FC<AUReceiptComponentProps> = ({
4
+ receiptText,
5
+ helpText,
6
+ showGoTo,
7
+ buttons,
8
+ }: AUReceiptComponentProps) => {
9
+ const renderButtons = buttons.map((btn) => <a key={btn.gotoLink} href={btn.gotoLink} className="button">{btn.gotoText}</a>);
10
+ return (
11
+ <div className="receipt">
12
+ <div className="receipt__icon" data-icon="" />
13
+ <h1 className="receipt__header" dangerouslySetInnerHTML={{ __html: receiptText }} />
14
+ {helpText}
15
+ {
16
+ showGoTo && (
17
+ <div className="receipt__post-action">
18
+ {renderButtons}
19
+ </div>
20
+ )
21
+ }
22
+ </div>
23
+ );
24
+ };
25
+
26
+ AUReceiptComponent.defaultProps = {
27
+ showGoTo: true,
28
+ helpText: null,
29
+ buttons: [],
30
+ };
31
+
32
+ AUReceiptComponent.displayName = 'AUReceiptComponent';
33
+ export default AUReceiptComponent;
@@ -0,0 +1,64 @@
1
+ /* eslint-env browser */
2
+ import React, { useEffect, FC } from 'react';
3
+ import { isElementInViewport } from '@aarhus-university/au-designsystem-delphinus/source/js/components/helpers';
4
+
5
+ const AUSpinnerComponent: FC<AUSpinnerComponentProps> = ({
6
+ domID,
7
+ className,
8
+ children,
9
+ visible,
10
+ loaded,
11
+ loadingCondition,
12
+ height,
13
+ init,
14
+ onLoad,
15
+ }: AUSpinnerComponentProps) => {
16
+ const lazyLoad = (): void => {
17
+ const element = document.getElementById(domID as string);
18
+ if (element
19
+ && !loaded
20
+ && loadingCondition
21
+ && (visible || isElementInViewport(element))) {
22
+ onLoad();
23
+ }
24
+ };
25
+
26
+ useEffect(() => {
27
+ window.addEventListener('scroll', () => {
28
+ lazyLoad();
29
+ });
30
+ }, []);
31
+
32
+ useEffect(() => {
33
+ lazyLoad();
34
+ });
35
+
36
+ if (!loaded) {
37
+ if (init === 'table') {
38
+ return (
39
+ <div id={domID} className={`processing-state processing-state--init-table ${className}`} style={{ minHeight: height }} />
40
+ );
41
+ }
42
+ if (init === 'box') {
43
+ return (
44
+ <div id={domID} className={`processing-state processing-state--init-box ${className}`} style={{ minHeight: height }} />
45
+ );
46
+ }
47
+ return (
48
+ <div id={domID} className={`processing-state ${className}`} style={{ minHeight: height }} />
49
+ );
50
+ }
51
+
52
+ return children;
53
+ };
54
+
55
+ AUSpinnerComponent.defaultProps = {
56
+ domID: 'au-spinner-component',
57
+ visible: false,
58
+ className: '',
59
+ height: 'auto',
60
+ init: '',
61
+ };
62
+
63
+ AUSpinnerComponent.displayName = 'AUSpinnerComponent';
64
+ export default AUSpinnerComponent;
@@ -1,53 +1,38 @@
1
- /* eslint-env browser */
2
- import React, { useEffect, useRef } from 'react';
3
- import PropTypes from 'prop-types';
4
- import { setSubNavToggle } from '@aarhus-university/au-designsystem-delphinus/source/js/components/nav';
5
-
6
- const AUSubNavComponent = ({
7
- children,
8
- className,
9
- dataIcon,
10
- text,
11
- ariaLabel,
12
- id,
13
- }) => {
14
- const buttonRef = useRef();
15
- useEffect(() => {
16
- const subNavBtns = document.querySelectorAll('.sub-nav > button.nav__item');
17
- setSubNavToggle(subNavBtns, buttonRef.current);
18
- }, []);
19
-
20
- return (
21
- <div className="sub-nav">
22
- <button
23
- ref={buttonRef}
24
- id={id}
25
- type="button"
26
- className={className}
27
- data-icon={dataIcon}
28
- aria-label={ariaLabel}
29
- aria-expanded={false}
30
- >
31
- {text}
32
- </button>
33
- {children}
34
- </div>
35
- );
36
- };
37
-
38
- AUSubNavComponent.propTypes = {
39
- ariaLabel: null,
40
- id: null,
41
- };
42
-
43
- AUSubNavComponent.propTypes = {
44
- children: PropTypes.element.isRequired,
45
- className: PropTypes.string.isRequired,
46
- dataIcon: PropTypes.string.isRequired,
47
- text: PropTypes.string.isRequired,
48
- ariaLabel: PropTypes.string,
49
- id: PropTypes.string,
50
- };
51
-
52
- AUSubNavComponent.displayName = 'AUSubNavComponent';
53
- export default AUSubNavComponent;
1
+ /* eslint-env browser */
2
+ import React, { useEffect, useRef, FC } from 'react';
3
+ import { setSubNavToggle } from '@aarhus-university/au-designsystem-delphinus/source/js/components/nav';
4
+
5
+ const AUSubNavComponent: FC<AUSubNavComponentProps> = ({
6
+ children,
7
+ className,
8
+ dataIcon,
9
+ text,
10
+ ariaLabel,
11
+ id,
12
+ }: AUSubNavComponentProps) => {
13
+ const buttonRef = useRef<HTMLButtonElement>(null);
14
+ useEffect(() => {
15
+ const subNavBtns = document.querySelectorAll('.sub-nav > button.nav__item');
16
+ setSubNavToggle(subNavBtns, buttonRef.current as Element);
17
+ }, []);
18
+
19
+ return (
20
+ <div className="sub-nav">
21
+ <button
22
+ ref={buttonRef}
23
+ id={id}
24
+ type="button"
25
+ className={className}
26
+ data-icon={dataIcon}
27
+ aria-label={ariaLabel}
28
+ aria-expanded={false}
29
+ >
30
+ {text}
31
+ </button>
32
+ {children}
33
+ </div>
34
+ );
35
+ };
36
+
37
+ AUSubNavComponent.displayName = 'AUSubNavComponent';
38
+ export default AUSubNavComponent;
@@ -1,39 +1,31 @@
1
- import React from 'react';
2
- import PropTypes from 'prop-types';
3
- import { profileLabels } from '../../lib/i18n';
4
-
5
- const AUSubmitButtonContainerComponent = ({
6
- lang,
7
- disabled,
8
- onSubmit,
9
- onCancel,
10
- }) => (
11
- <div className="submit button-container">
12
- <button
13
- type="submit"
14
- className={`button${disabled ? ' button--processing' : ''}`}
15
- disabled={disabled}
16
- onClick={onSubmit}
17
- >
18
- {profileLabels[lang].save}
19
- </button>
20
- <button
21
- type="button"
22
- className="button button--text"
23
- disabled={disabled}
24
- onClick={onCancel}
25
- >
26
- {profileLabels[lang].cancel}
27
- </button>
28
- </div>
29
- );
30
-
31
- AUSubmitButtonContainerComponent.propTypes = {
32
- lang: PropTypes.string.isRequired,
33
- disabled: PropTypes.bool.isRequired,
34
- onSubmit: PropTypes.func.isRequired,
35
- onCancel: PropTypes.func.isRequired,
36
- };
37
-
38
- AUSubmitButtonContainerComponent.displayName = 'AUSubmitButtonContainerComponent';
39
- export default AUSubmitButtonContainerComponent;
1
+ import React, { FC } from 'react';
2
+ import { profileLabels } from '../lib/i18n';
3
+
4
+ const AUSubmitButtonContainerComponent: FC<AUSubmitButtonContainerComponentProps> = ({
5
+ lang,
6
+ disabled,
7
+ onSubmit,
8
+ onCancel,
9
+ }: AUSubmitButtonContainerComponentProps) => (
10
+ <div className="submit button-container">
11
+ <button
12
+ type="submit"
13
+ className={`button${disabled ? ' button--processing' : ''}`}
14
+ disabled={disabled}
15
+ onClick={onSubmit}
16
+ >
17
+ {profileLabels[lang].save}
18
+ </button>
19
+ <button
20
+ type="button"
21
+ className="button button--text"
22
+ disabled={disabled}
23
+ onClick={onCancel}
24
+ >
25
+ {profileLabels[lang].cancel}
26
+ </button>
27
+ </div>
28
+ );
29
+
30
+ AUSubmitButtonContainerComponent.displayName = 'AUSubmitButtonContainerComponent';
31
+ export default AUSubmitButtonContainerComponent;
@@ -0,0 +1,145 @@
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;