@aarhus-university/au-lib-react-components 12.6.2 → 12.6.3

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 (109) hide show
  1. package/.eslintrc.js +35 -35
  2. package/.storybook/main.js +34 -34
  3. package/.storybook/preview.js +17 -17
  4. package/README.md +19 -19
  5. package/__tests__/jest/AUButtonComponent.test.tsx +165 -165
  6. package/__tests__/jest/AUDynamicContentComponent.test.tsx +386 -386
  7. package/__tests__/jest/AUErrorComponent.test.tsx +142 -142
  8. package/__tests__/jest/AUModalComponent.test.tsx +186 -186
  9. package/__tests__/jest/AUNotificationComponent.test.tsx +115 -115
  10. package/__tests__/jest/AUSpinnerComponent.test.tsx +57 -57
  11. package/__tests__/jest/AUToolbarComponent.test.tsx +46 -46
  12. package/__tests__/jest/context.test.ts +25 -25
  13. package/__tests__/jest/helpers.test.ts +15 -15
  14. package/__tests__/jest/setupTests.ts +2 -2
  15. package/babel.config.js +8 -8
  16. package/build/umd/all.css +2 -2
  17. package/build/umd/all.js +1 -1
  18. package/build/umd/alphabox.js +1 -1
  19. package/build/umd/databox.js +1 -1
  20. package/build/umd/diagramme.js +1 -1
  21. package/build/umd/flowbox.js +1 -1
  22. package/build/umd/flowbox.js.map +1 -1
  23. package/build/umd/universe.js +1 -1
  24. package/build-storybook.log +386 -386
  25. package/esbuild.mjs +22 -22
  26. package/package.json +107 -107
  27. package/src/components/AUAlertComponent.tsx +128 -128
  28. package/src/components/AUAutoSuggestComponent.js +148 -148
  29. package/src/components/AUButtonComponent.tsx +99 -99
  30. package/src/components/AUCalendarComponent.tsx +497 -497
  31. package/src/components/AUCharacterCountComponent.tsx +56 -56
  32. package/src/components/AUComboBoxComponent.tsx +195 -195
  33. package/src/components/AUContentToggleComponent.tsx +50 -50
  34. package/src/components/AUDatepickerComponent.tsx +124 -124
  35. package/src/components/AUDialogModalComponent.tsx +124 -124
  36. package/src/components/AUDynamicContentComponent.tsx +137 -137
  37. package/src/components/AUEditorComponent.tsx +126 -126
  38. package/src/components/AUErrorComponent.tsx +73 -73
  39. package/src/components/AUMobilePrefixComponent.tsx +20 -20
  40. package/src/components/AUModalComponent.tsx +72 -72
  41. package/src/components/AUNotificationComponent.tsx +44 -44
  42. package/src/components/AUReceiptComponent.tsx +34 -34
  43. package/src/components/AUSpinnerComponent.tsx +40 -40
  44. package/src/components/AUStepComponent.tsx +75 -75
  45. package/src/components/AUSubNavComponent.tsx +57 -57
  46. package/src/components/AUSubmitButtonContainerComponent.tsx +38 -38
  47. package/src/components/AUTabbedContentComponent.tsx +154 -154
  48. package/src/components/AUTableComponent.tsx +29 -29
  49. package/src/components/AUToastComponent.tsx +104 -104
  50. package/src/components/AUToolbarComponent.tsx +108 -108
  51. package/src/components/AUTruncatorComponent.tsx +141 -141
  52. package/src/components/wrapping/AUEmbedComponent.js +47 -47
  53. package/src/layout-2016/components/alphabox/AlphaBoxComponent.js +142 -142
  54. package/src/layout-2016/components/alphabox/AlphaBoxContentComponent.js +136 -136
  55. package/src/layout-2016/components/common/AUCollapsibleComponent.js +152 -152
  56. package/src/layout-2016/components/common/AUSpinnerComponent.js +103 -103
  57. package/src/layout-2016/components/databox/DataBoxAlphabetComponent.js +144 -144
  58. package/src/layout-2016/components/databox/DataBoxAssociationComponent.js +122 -122
  59. package/src/layout-2016/components/databox/DataBoxButtonComponent.js +157 -157
  60. package/src/layout-2016/components/databox/DataBoxComponent.js +297 -297
  61. package/src/layout-2016/components/databox/DataBoxGroupingComponent.js +64 -64
  62. package/src/layout-2016/components/databox/DataBoxSearchResultComponent.js +36 -36
  63. package/src/layout-2016/components/databox/DataBoxStackedAssociationComponent.js +54 -54
  64. package/src/layout-2016/components/databox/DataBoxSuggestionComponent.js +39 -39
  65. package/src/layout-2016/components/diagramme/AUDiagrammeComponent.js +309 -309
  66. package/src/layout-2016/components/flowbox/FlowBoxComponent.js +126 -126
  67. package/src/layout-2016/components/flowbox/FlowBoxPhoneComponent.js +104 -104
  68. package/src/layout-2016/lib/all.js +3 -3
  69. package/src/layout-2016/lib/au-alphabox.js +99 -99
  70. package/src/layout-2016/lib/au-databox.js +399 -399
  71. package/src/layout-2016/lib/au-diagramme.js +85 -85
  72. package/src/layout-2016/lib/au-flowbox.js +116 -119
  73. package/src/lib/context.tsx +59 -59
  74. package/src/lib/dates.ts +52 -52
  75. package/src/lib/helpers.ts +208 -208
  76. package/src/lib/hooks.ts +157 -157
  77. package/src/lib/i18n.ts +600 -600
  78. package/src/lib/portals.tsx +150 -150
  79. package/src/lib/tinymce.ts +84 -84
  80. package/src/lib/wrapping.ts +21 -21
  81. package/src/styles/_settings.scss +10 -10
  82. package/src/styles/alphabox.scss +222 -222
  83. package/src/styles/app.scss +7 -7
  84. package/src/styles/autosuggest.scss +57 -57
  85. package/src/styles/databox.scss +563 -563
  86. package/src/styles/diagramme.scss +119 -119
  87. package/src/styles/flowbox.scss +72 -72
  88. package/src/styles/maps.scss +395 -395
  89. package/stories/AUAlertComponent.stories.tsx +133 -133
  90. package/stories/AUAutoSuggestComponent.stories.tsx +95 -95
  91. package/stories/AUButtonComponent.stories.tsx +139 -139
  92. package/stories/AUCharacterCountComponent.stories.tsx +121 -121
  93. package/stories/AUComboBoxComponent.stories.tsx +101 -101
  94. package/stories/AUContentToggleComponent.stories.tsx +87 -87
  95. package/stories/AUDialogModalComponent.stories.tsx +75 -75
  96. package/stories/AUDynamicContentComponent.stories.tsx +119 -119
  97. package/stories/AUEditorComponent.stories.tsx +66 -66
  98. package/stories/AUErrorComponent.stories.tsx +132 -132
  99. package/stories/AUModalComponent.stories.tsx +160 -160
  100. package/stories/AUNotificationComponent.stories.tsx +151 -151
  101. package/stories/AUSpinnerComponent.stories.tsx +44 -44
  102. package/stories/AUStepComponent.stories.tsx +91 -91
  103. package/stories/AUToolbarComponent.stories.tsx +389 -389
  104. package/stories/AUTruncatorComponent.stories.tsx +123 -123
  105. package/stories/lib/helpers.tsx +146 -146
  106. package/tsconfig.json +46 -46
  107. package/webpack.config.js +88 -88
  108. package/.claude/settings.local.json +0 -12
  109. package/.vscode/settings.json +0 -22
@@ -1,148 +1,148 @@
1
- /* eslint-disable @typescript-eslint/no-empty-function */
2
- import React from 'react';
3
- import PropTypes from 'prop-types';
4
- import Autosuggest from 'react-autosuggest';
5
- import debounce from 'lodash.debounce';
6
-
7
- class AUAutoSuggestComponent extends React.Component {
8
- constructor(props) {
9
- super(props);
10
- this.state = {
11
- value: '',
12
- suggestions: [],
13
- noSuggestions: false,
14
- };
15
-
16
- this.onChange = this.onChange.bind(this);
17
- this.onSuggestionsFetchRequested = debounce(this.onSuggestionsFetchRequested.bind(this), 400);
18
- this.onSuggestionsClearRequested = this.onSuggestionsClearRequested.bind(this);
19
- this.onSuggestionSelected = this.onSuggestionSelected.bind(this);
20
- }
21
-
22
- onChange(_, { newValue }) {
23
- const { setQuery } = this.props;
24
- this.setState({
25
- value: newValue,
26
- }, () => {
27
- setQuery(newValue);
28
- });
29
- }
30
-
31
- onSuggestionsFetchRequested({ value }) {
32
- const { getSuggestions, collection } = this.props;
33
- getSuggestions(value, collection, (suggestions) => {
34
- this.setState({
35
- suggestions,
36
- noSuggestions: suggestions.length === 0 && value.trim() !== '' && value.trim().length > 1,
37
- });
38
- });
39
- }
40
-
41
- onSuggestionsClearRequested() {
42
- this.setState({
43
- suggestions: [],
44
- });
45
- }
46
-
47
- onSuggestionSelected(event, { suggestion }) {
48
- const { setResults, clearInput } = this.props;
49
- setResults([suggestion]);
50
- if (clearInput) {
51
- this.setState({
52
- value: '',
53
- });
54
- }
55
- }
56
-
57
- render() {
58
- const { value, suggestions, noSuggestions } = this.state;
59
- const {
60
- placeholder,
61
- getSuggestionValue,
62
- renderSuggestion,
63
- id,
64
- theme,
65
- type,
66
- initialValue,
67
- disabled,
68
- noResultsText,
69
- } = this.props;
70
- const inputProps = {
71
- placeholder,
72
- value: initialValue || value,
73
- id,
74
- type,
75
- disabled,
76
- 'aria-label': placeholder,
77
- onChange: this.onChange,
78
- };
79
-
80
- return (
81
- <>
82
- <Autosuggest
83
- suggestions={suggestions}
84
- onSuggestionsFetchRequested={this.onSuggestionsFetchRequested}
85
- onSuggestionsClearRequested={this.onSuggestionsClearRequested}
86
- onSuggestionSelected={this.onSuggestionSelected}
87
- getSuggestionValue={getSuggestionValue}
88
- renderSuggestion={renderSuggestion}
89
- inputProps={inputProps}
90
- theme={theme}
91
- />
92
- {
93
- (noSuggestions && noResultsText) && (
94
- <p className="no-results">
95
- <em>{noResultsText}</em>
96
- </p>
97
- )
98
- }
99
- </>
100
- );
101
- }
102
- }
103
-
104
- AUAutoSuggestComponent.displayName = 'AUAutoSuggestComponent';
105
-
106
- AUAutoSuggestComponent.defaultProps = {
107
- id: 'autosuggest1',
108
- theme: {
109
- container: 'autosuggest',
110
- containerOpen: 'autosuggest--open',
111
- input: 'autosuggest__input',
112
- inputOpen: 'autosuggest__input--open',
113
- inputFocused: 'autosuggest__input--focused',
114
- suggestionsContainer: 'autosuggest__suggestions',
115
- suggestionsContainerOpen: 'autosuggest__suggestions--open',
116
- suggestionsList: 'autosuggest__suggestions__list',
117
- suggestion: 'autosuggest__suggestions__list__item',
118
- suggestionFirst: 'autosuggest__suggestions__list--first',
119
- suggestionHighlighted: 'autosuggest__suggestions__list--highlighted',
120
- sectionContainer: 'autosuggest__section',
121
- sectionContainerFirst: 'autosuggest__section--first',
122
- sectionTitle: 'autosuggest__section__title',
123
- },
124
- clearInput: false,
125
- type: 'text',
126
- initialValue: '',
127
- disabled: false,
128
- setQuery: () => { },
129
- noResultsText: '',
130
- };
131
-
132
- AUAutoSuggestComponent.propTypes = {
133
- setQuery: PropTypes.func,
134
- getSuggestions: PropTypes.func.isRequired,
135
- getSuggestionValue: PropTypes.func.isRequired,
136
- renderSuggestion: PropTypes.func.isRequired,
137
- setResults: PropTypes.func.isRequired,
138
- collection: PropTypes.arrayOf(PropTypes.shape({})).isRequired,
139
- placeholder: PropTypes.string.isRequired,
140
- id: PropTypes.string,
141
- theme: PropTypes.shape({}),
142
- clearInput: PropTypes.bool,
143
- type: PropTypes.string,
144
- initialValue: PropTypes.string,
145
- disabled: PropTypes.bool,
146
- noResultsText: PropTypes.string,
147
- };
148
- export default AUAutoSuggestComponent;
1
+ /* eslint-disable @typescript-eslint/no-empty-function */
2
+ import React from 'react';
3
+ import PropTypes from 'prop-types';
4
+ import Autosuggest from 'react-autosuggest';
5
+ import debounce from 'lodash.debounce';
6
+
7
+ class AUAutoSuggestComponent extends React.Component {
8
+ constructor(props) {
9
+ super(props);
10
+ this.state = {
11
+ value: '',
12
+ suggestions: [],
13
+ noSuggestions: false,
14
+ };
15
+
16
+ this.onChange = this.onChange.bind(this);
17
+ this.onSuggestionsFetchRequested = debounce(this.onSuggestionsFetchRequested.bind(this), 400);
18
+ this.onSuggestionsClearRequested = this.onSuggestionsClearRequested.bind(this);
19
+ this.onSuggestionSelected = this.onSuggestionSelected.bind(this);
20
+ }
21
+
22
+ onChange(_, { newValue }) {
23
+ const { setQuery } = this.props;
24
+ this.setState({
25
+ value: newValue,
26
+ }, () => {
27
+ setQuery(newValue);
28
+ });
29
+ }
30
+
31
+ onSuggestionsFetchRequested({ value }) {
32
+ const { getSuggestions, collection } = this.props;
33
+ getSuggestions(value, collection, (suggestions) => {
34
+ this.setState({
35
+ suggestions,
36
+ noSuggestions: suggestions.length === 0 && value.trim() !== '' && value.trim().length > 1,
37
+ });
38
+ });
39
+ }
40
+
41
+ onSuggestionsClearRequested() {
42
+ this.setState({
43
+ suggestions: [],
44
+ });
45
+ }
46
+
47
+ onSuggestionSelected(event, { suggestion }) {
48
+ const { setResults, clearInput } = this.props;
49
+ setResults([suggestion]);
50
+ if (clearInput) {
51
+ this.setState({
52
+ value: '',
53
+ });
54
+ }
55
+ }
56
+
57
+ render() {
58
+ const { value, suggestions, noSuggestions } = this.state;
59
+ const {
60
+ placeholder,
61
+ getSuggestionValue,
62
+ renderSuggestion,
63
+ id,
64
+ theme,
65
+ type,
66
+ initialValue,
67
+ disabled,
68
+ noResultsText,
69
+ } = this.props;
70
+ const inputProps = {
71
+ placeholder,
72
+ value: initialValue || value,
73
+ id,
74
+ type,
75
+ disabled,
76
+ 'aria-label': placeholder,
77
+ onChange: this.onChange,
78
+ };
79
+
80
+ return (
81
+ <>
82
+ <Autosuggest
83
+ suggestions={suggestions}
84
+ onSuggestionsFetchRequested={this.onSuggestionsFetchRequested}
85
+ onSuggestionsClearRequested={this.onSuggestionsClearRequested}
86
+ onSuggestionSelected={this.onSuggestionSelected}
87
+ getSuggestionValue={getSuggestionValue}
88
+ renderSuggestion={renderSuggestion}
89
+ inputProps={inputProps}
90
+ theme={theme}
91
+ />
92
+ {
93
+ (noSuggestions && noResultsText) && (
94
+ <p className="no-results">
95
+ <em>{noResultsText}</em>
96
+ </p>
97
+ )
98
+ }
99
+ </>
100
+ );
101
+ }
102
+ }
103
+
104
+ AUAutoSuggestComponent.displayName = 'AUAutoSuggestComponent';
105
+
106
+ AUAutoSuggestComponent.defaultProps = {
107
+ id: 'autosuggest1',
108
+ theme: {
109
+ container: 'autosuggest',
110
+ containerOpen: 'autosuggest--open',
111
+ input: 'autosuggest__input',
112
+ inputOpen: 'autosuggest__input--open',
113
+ inputFocused: 'autosuggest__input--focused',
114
+ suggestionsContainer: 'autosuggest__suggestions',
115
+ suggestionsContainerOpen: 'autosuggest__suggestions--open',
116
+ suggestionsList: 'autosuggest__suggestions__list',
117
+ suggestion: 'autosuggest__suggestions__list__item',
118
+ suggestionFirst: 'autosuggest__suggestions__list--first',
119
+ suggestionHighlighted: 'autosuggest__suggestions__list--highlighted',
120
+ sectionContainer: 'autosuggest__section',
121
+ sectionContainerFirst: 'autosuggest__section--first',
122
+ sectionTitle: 'autosuggest__section__title',
123
+ },
124
+ clearInput: false,
125
+ type: 'text',
126
+ initialValue: '',
127
+ disabled: false,
128
+ setQuery: () => { },
129
+ noResultsText: '',
130
+ };
131
+
132
+ AUAutoSuggestComponent.propTypes = {
133
+ setQuery: PropTypes.func,
134
+ getSuggestions: PropTypes.func.isRequired,
135
+ getSuggestionValue: PropTypes.func.isRequired,
136
+ renderSuggestion: PropTypes.func.isRequired,
137
+ setResults: PropTypes.func.isRequired,
138
+ collection: PropTypes.arrayOf(PropTypes.shape({})).isRequired,
139
+ placeholder: PropTypes.string.isRequired,
140
+ id: PropTypes.string,
141
+ theme: PropTypes.shape({}),
142
+ clearInput: PropTypes.bool,
143
+ type: PropTypes.string,
144
+ initialValue: PropTypes.string,
145
+ disabled: PropTypes.bool,
146
+ noResultsText: PropTypes.string,
147
+ };
148
+ export default AUAutoSuggestComponent;
@@ -1,99 +1,99 @@
1
- import React, {
2
- FC, MouseEvent, RefObject,
3
- } from 'react';
4
-
5
- type Props = {
6
- label: string;
7
- disabled?: boolean;
8
- size?: 'small' | 'default' | 'large';
9
- type?: 'default' | 'text' | 'dimmed';
10
- icon?: '' | 'add' | 'attachment' | 'award' | 'bike' | 'bookmark' | 'brand-linkedin' | 'brand-mendeley' | 'brand-orcid' | 'brand-researchgate' | 'brand-twitter' | 'calendar' | 'camera' | 'car' | 'class' | 'close' | 'collapse' | 'confirm' | 'confirm-circle' | 'context-menu' | 'copy' | 'current-semester' | 'dark-mode' | 'delphinus' | 'delete' | 'design' | 'download' | 'edit' | 'email' | 'exam' | 'expand' | 'failed' | 'failed-circle' | 'file' | 'filter' | 'finish' | 'heart' | 'hide' | 'infinity' | 'info' | 'info-circle' | 'instructor' | 'instructor-with-class' | 'language' | 'location' | 'link-chain' | 'link-internal' | 'link-external' | 'link-external-square' | 'lms-course-common' | 'lms-course-sections' | 'lms-course-additional' | 'lms-course-merge-with' | 'lms-course-merged' | 'mailbox' | 'menu' | 'news' | 'next' | 'note' | 'notifications' | 'passed-exemption' | 'phone' | 'phone-landline' | 'previous' | 'print' | 'public-transport' | 'receipt' | 'refresh' | 'reorder' | 'replay' | 'route' | 'search' | 'season-autumn' | 'season-christmas' | 'season-easter' | 'season-halloween' | 'season-spring' | 'season-summer' | 'season-winter' | 'send' | 'settings' | 'source-system' | 'student-place-accepted' | 'student-place-not-offered' | 'student-place-offered' | 'student-place-rejected' | 'student-place-standby' | 'sign-in' | 'sign-out' | 'spock' | 'sync' | 'theme-chooser' | 'tip' | 'tools' | 'tooltip' | 'upload' | 'user-profile' | 'user-impersonation' | 'view' | 'viewport-default' | 'viewport-medium' | 'viewport-wide' | 'walking' | 'warning' | 'warning-triangle';
11
- iconPosition?: 'left' | 'right';
12
- hideLabel?: boolean;
13
- mode?: 'none' | 'ireversable-action' | 'confirmable-action' | 'processing' | 'ireversable-action processing' | 'confirmable-action processing', // (sic)
14
- btnRef?: React.RefObject<HTMLButtonElement>;
15
- classNames?: string[];
16
- ariaExpanded?: boolean;
17
- ariaHasPopup?: boolean;
18
- asSubmit?: boolean;
19
- onClick?: (
20
- event: React.MouseEvent<HTMLButtonElement>,
21
- ref: React.RefObject<HTMLButtonElement> | undefined,
22
- ) => void;
23
- };
24
-
25
- const AUButtonComponent: FC<Props> = ({
26
- label,
27
- disabled = false,
28
- size = 'default',
29
- type = 'default',
30
- icon = '',
31
- iconPosition = 'left',
32
- hideLabel = false,
33
- mode = 'none',
34
- btnRef,
35
- classNames = [],
36
- ariaExpanded = false,
37
- ariaHasPopup = undefined,
38
- asSubmit = false,
39
- onClick = (
40
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
41
- _event: MouseEvent<HTMLButtonElement>,
42
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
43
- _ref: RefObject<HTMLButtonElement> | undefined,
44
- ) => {
45
- // eslint-disable-next-line no-console
46
- // console.log(event, ref);
47
- },
48
- }) => {
49
- const sizeClass = size === 'default' ? '' : `button--${size}`;
50
- const typeClass = type === 'default' ? '' : `button--${type}`;
51
- let iconClass = '';
52
- if (icon) {
53
- iconClass = `button--icon icon-${icon}`;
54
- if (iconPosition) {
55
- iconClass = `${iconClass} button--icon--${iconPosition}`;
56
- }
57
-
58
- if (hideLabel) {
59
- iconClass = `${iconClass} button--icon--hide-label`;
60
- }
61
- }
62
- let modeClass = '';
63
- if (mode && mode !== 'none') {
64
- modeClass = mode.includes(' ') ? mode.split(' ').map((m) => `button--${m}`).join(' ') : `button--${mode}`;
65
- }
66
-
67
- return (
68
- <button
69
- ref={btnRef}
70
- type={asSubmit ? 'submit' : 'button'}
71
- disabled={disabled}
72
- className={[
73
- 'button',
74
- sizeClass,
75
- typeClass,
76
- iconClass,
77
- modeClass,
78
- disabled && !mode?.includes('processing') ? 'visually-disabled' : '',
79
- ].concat(classNames || []).join(' ').replace(/\s+/g, ' ').trim()}
80
- title={icon && hideLabel ? label : undefined}
81
- aria-expanded={ariaExpanded}
82
- aria-haspopup={ariaHasPopup}
83
- onClick={(event: MouseEvent<HTMLButtonElement>) => {
84
- if (typeof onClick !== 'undefined') {
85
- onClick(event, btnRef);
86
- }
87
- }}
88
- >
89
- {label}
90
- </button>
91
- );
92
- };
93
-
94
- AUButtonComponent.displayName = 'AUButtonComponent';
95
- export default AUButtonComponent;
96
-
97
- export {
98
- Props,
99
- };
1
+ import React, {
2
+ FC, MouseEvent, RefObject,
3
+ } from 'react';
4
+
5
+ type Props = {
6
+ label: string;
7
+ disabled?: boolean;
8
+ size?: 'small' | 'default' | 'large';
9
+ type?: 'default' | 'text' | 'dimmed';
10
+ icon?: '' | 'add' | 'attachment' | 'award' | 'bike' | 'bookmark' | 'brand-linkedin' | 'brand-mendeley' | 'brand-orcid' | 'brand-researchgate' | 'brand-twitter' | 'calendar' | 'camera' | 'car' | 'class' | 'close' | 'collapse' | 'confirm' | 'confirm-circle' | 'context-menu' | 'copy' | 'current-semester' | 'dark-mode' | 'delphinus' | 'delete' | 'design' | 'download' | 'edit' | 'email' | 'exam' | 'expand' | 'failed' | 'failed-circle' | 'file' | 'filter' | 'finish' | 'heart' | 'hide' | 'infinity' | 'info' | 'info-circle' | 'instructor' | 'instructor-with-class' | 'language' | 'location' | 'link-chain' | 'link-internal' | 'link-external' | 'link-external-square' | 'lms-course-common' | 'lms-course-sections' | 'lms-course-additional' | 'lms-course-merge-with' | 'lms-course-merged' | 'mailbox' | 'menu' | 'news' | 'next' | 'note' | 'notifications' | 'passed-exemption' | 'phone' | 'phone-landline' | 'previous' | 'print' | 'public-transport' | 'receipt' | 'refresh' | 'reorder' | 'replay' | 'route' | 'search' | 'season-autumn' | 'season-christmas' | 'season-easter' | 'season-halloween' | 'season-spring' | 'season-summer' | 'season-winter' | 'send' | 'settings' | 'source-system' | 'student-place-accepted' | 'student-place-not-offered' | 'student-place-offered' | 'student-place-rejected' | 'student-place-standby' | 'sign-in' | 'sign-out' | 'spock' | 'sync' | 'theme-chooser' | 'tip' | 'tools' | 'tooltip' | 'upload' | 'user-profile' | 'user-impersonation' | 'view' | 'viewport-default' | 'viewport-medium' | 'viewport-wide' | 'walking' | 'warning' | 'warning-triangle';
11
+ iconPosition?: 'left' | 'right';
12
+ hideLabel?: boolean;
13
+ mode?: 'none' | 'ireversable-action' | 'confirmable-action' | 'processing' | 'ireversable-action processing' | 'confirmable-action processing', // (sic)
14
+ btnRef?: React.RefObject<HTMLButtonElement>;
15
+ classNames?: string[];
16
+ ariaExpanded?: boolean;
17
+ ariaHasPopup?: boolean;
18
+ asSubmit?: boolean;
19
+ onClick?: (
20
+ event: React.MouseEvent<HTMLButtonElement>,
21
+ ref: React.RefObject<HTMLButtonElement> | undefined,
22
+ ) => void;
23
+ };
24
+
25
+ const AUButtonComponent: FC<Props> = ({
26
+ label,
27
+ disabled = false,
28
+ size = 'default',
29
+ type = 'default',
30
+ icon = '',
31
+ iconPosition = 'left',
32
+ hideLabel = false,
33
+ mode = 'none',
34
+ btnRef,
35
+ classNames = [],
36
+ ariaExpanded = false,
37
+ ariaHasPopup = undefined,
38
+ asSubmit = false,
39
+ onClick = (
40
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
41
+ _event: MouseEvent<HTMLButtonElement>,
42
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
43
+ _ref: RefObject<HTMLButtonElement> | undefined,
44
+ ) => {
45
+ // eslint-disable-next-line no-console
46
+ // console.log(event, ref);
47
+ },
48
+ }) => {
49
+ const sizeClass = size === 'default' ? '' : `button--${size}`;
50
+ const typeClass = type === 'default' ? '' : `button--${type}`;
51
+ let iconClass = '';
52
+ if (icon) {
53
+ iconClass = `button--icon icon-${icon}`;
54
+ if (iconPosition) {
55
+ iconClass = `${iconClass} button--icon--${iconPosition}`;
56
+ }
57
+
58
+ if (hideLabel) {
59
+ iconClass = `${iconClass} button--icon--hide-label`;
60
+ }
61
+ }
62
+ let modeClass = '';
63
+ if (mode && mode !== 'none') {
64
+ modeClass = mode.includes(' ') ? mode.split(' ').map((m) => `button--${m}`).join(' ') : `button--${mode}`;
65
+ }
66
+
67
+ return (
68
+ <button
69
+ ref={btnRef}
70
+ type={asSubmit ? 'submit' : 'button'}
71
+ disabled={disabled}
72
+ className={[
73
+ 'button',
74
+ sizeClass,
75
+ typeClass,
76
+ iconClass,
77
+ modeClass,
78
+ disabled && !mode?.includes('processing') ? 'visually-disabled' : '',
79
+ ].concat(classNames || []).join(' ').replace(/\s+/g, ' ').trim()}
80
+ title={icon && hideLabel ? label : undefined}
81
+ aria-expanded={ariaExpanded}
82
+ aria-haspopup={ariaHasPopup}
83
+ onClick={(event: MouseEvent<HTMLButtonElement>) => {
84
+ if (typeof onClick !== 'undefined') {
85
+ onClick(event, btnRef);
86
+ }
87
+ }}
88
+ >
89
+ {label}
90
+ </button>
91
+ );
92
+ };
93
+
94
+ AUButtonComponent.displayName = 'AUButtonComponent';
95
+ export default AUButtonComponent;
96
+
97
+ export {
98
+ Props,
99
+ };