@onewelcome/react-lib-components 1.3.0 → 1.4.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 (90) hide show
  1. package/dist/Button/IconButton.d.ts +2 -1
  2. package/dist/DataGrid/DataGrid.d.ts +1 -0
  3. package/dist/DataGrid/DataGridActions/DataGridActions.d.ts +2 -1
  4. package/dist/Form/Form.d.ts +3 -3
  5. package/dist/Notifications/SlideInModal/SlideInModal.d.ts +1 -1
  6. package/dist/Tabs/Tab.d.ts +5 -9
  7. package/dist/Tabs/TabButton.d.ts +3 -6
  8. package/dist/Tabs/Tabs.d.ts +1 -2
  9. package/dist/react-lib-components.cjs.development.js +437 -392
  10. package/dist/react-lib-components.cjs.development.js.map +1 -1
  11. package/dist/react-lib-components.cjs.production.min.js +1 -1
  12. package/dist/react-lib-components.cjs.production.min.js.map +1 -1
  13. package/dist/react-lib-components.esm.js +438 -393
  14. package/dist/react-lib-components.esm.js.map +1 -1
  15. package/package.json +1 -1
  16. package/src/Breadcrumbs/Breadcrumbs.tsx +46 -38
  17. package/src/Button/BaseButton.tsx +23 -20
  18. package/src/Button/Button.tsx +40 -40
  19. package/src/Button/IconButton.tsx +28 -28
  20. package/src/ContextMenu/ContextMenu.tsx +161 -160
  21. package/src/ContextMenu/ContextMenuItem.tsx +55 -49
  22. package/src/DataGrid/DataGrid.tsx +1 -0
  23. package/src/DataGrid/DataGridActions/DataGridActions.module.scss +1 -1
  24. package/src/DataGrid/DataGridActions/DataGridActions.test.tsx +4 -2
  25. package/src/DataGrid/DataGridActions/DataGridActions.tsx +95 -87
  26. package/src/DataGrid/DataGridActions/DataGridColumnsToggle.tsx +64 -64
  27. package/src/DataGrid/DataGridBody/DataGridCell.tsx +42 -44
  28. package/src/DataGrid/DataGridBody/DataGridRow.tsx +29 -29
  29. package/src/DataGrid/DataGridHeader/DataGridHeader.tsx +78 -78
  30. package/src/DataGrid/DataGridHeader/DataGridHeaderCell.tsx +48 -48
  31. package/src/Form/Checkbox/Checkbox.tsx +134 -130
  32. package/src/Form/Fieldset/Fieldset.tsx +81 -78
  33. package/src/Form/Form.tsx +9 -4
  34. package/src/Form/FormControl/FormControl.module.scss +1 -20
  35. package/src/Form/FormControl/FormControl.tsx +36 -35
  36. package/src/Form/FormGroup/FormGroup.tsx +62 -62
  37. package/src/Form/FormHelperText/FormHelperText.tsx +19 -18
  38. package/src/Form/FormSelectorWrapper/FormSelectorWrapper.tsx +58 -53
  39. package/src/Form/Input/Input.tsx +90 -87
  40. package/src/Form/Label/Label.tsx +17 -16
  41. package/src/Form/Radio/Radio.tsx +91 -91
  42. package/src/Form/Select/Option.tsx +66 -60
  43. package/src/Form/Select/Select.tsx +207 -209
  44. package/src/Form/Textarea/Textarea.tsx +51 -53
  45. package/src/Form/Toggle/Toggle.tsx +26 -23
  46. package/src/Form/Wrapper/CheckboxWrapper/CheckboxWrapper.tsx +51 -43
  47. package/src/Form/Wrapper/InputWrapper/InputWrapper.tsx +112 -106
  48. package/src/Form/Wrapper/RadioWrapper/RadioWrapper.tsx +67 -62
  49. package/src/Form/Wrapper/SelectWrapper/SelectWrapper.tsx +42 -37
  50. package/src/Form/Wrapper/TextareaWrapper/TextareaWrapper.tsx +94 -94
  51. package/src/Form/Wrapper/Wrapper/Wrapper.tsx +73 -73
  52. package/src/Icon/Icon.tsx +19 -16
  53. package/src/Link/Link.tsx +68 -63
  54. package/src/Notifications/BaseModal/BaseModal.tsx +68 -68
  55. package/src/Notifications/BaseModal/BaseModalActions/BaseModalActions.tsx +13 -10
  56. package/src/Notifications/BaseModal/BaseModalContent/BaseModalContent.tsx +33 -25
  57. package/src/Notifications/BaseModal/BaseModalHeader/BaseModalHeader.tsx +20 -17
  58. package/src/Notifications/Dialog/Dialog.tsx +83 -83
  59. package/src/Notifications/Dialog/DialogActions/DialogActions.tsx +17 -14
  60. package/src/Notifications/Dialog/DialogTitle/DialogTitle.tsx +15 -12
  61. package/src/Notifications/DiscardChangesModal/DiscardChangesDialog/DiscardChangesDialog.tsx +40 -40
  62. package/src/Notifications/SlideInModal/SlideInModal.module.scss +5 -5
  63. package/src/Notifications/SlideInModal/SlideInModal.test.tsx +7 -2
  64. package/src/Notifications/SlideInModal/SlideInModal.tsx +47 -27
  65. package/src/Pagination/Pagination.tsx +169 -169
  66. package/src/Popover/Popover.module.scss +1 -0
  67. package/src/Popover/Popover.tsx +43 -33
  68. package/src/ProgressBar/ProgressBar.tsx +17 -14
  69. package/src/Skeleton/Skeleton.tsx +23 -20
  70. package/src/StatusIndicator/StatusIndicator.tsx +18 -15
  71. package/src/Tabs/{TabPanel.module.scss → Tab.module.scss} +1 -1
  72. package/src/Tabs/Tab.test.tsx +1 -39
  73. package/src/Tabs/Tab.tsx +16 -10
  74. package/src/Tabs/TabButton.module.scss +0 -4
  75. package/src/Tabs/TabButton.test.tsx +3 -31
  76. package/src/Tabs/TabButton.tsx +35 -49
  77. package/src/Tabs/Tabs.test.tsx +40 -33
  78. package/src/Tabs/Tabs.tsx +107 -101
  79. package/src/TextEllipsis/TextEllipsis.tsx +50 -41
  80. package/src/Tiles/Tile.tsx +58 -56
  81. package/src/Tiles/Tiles.tsx +44 -41
  82. package/src/Tooltip/Tooltip.tsx +101 -100
  83. package/src/Typography/Typography.tsx +47 -44
  84. package/src/Wizard/BaseWizardSteps/BaseWizardSteps.tsx +55 -52
  85. package/src/Wizard/WizardSteps/WizardSteps.tsx +25 -22
  86. package/src/mixins.module.scss +2 -2
  87. package/src/util/helper.test.tsx +0 -28
  88. package/dist/Tabs/TabPanel.d.ts +0 -8
  89. package/src/Tabs/TabPanel.test.tsx +0 -92
  90. package/src/Tabs/TabPanel.tsx +0 -43
@@ -14,17 +14,17 @@
14
14
  * limitations under the License.
15
15
  */
16
16
 
17
- @import "../../mixins.module.scss";
17
+ @use "../../mixins.module.scss";
18
18
 
19
19
  .slide-in-modal {
20
20
  justify-content: flex-end;
21
21
 
22
22
  visibility: visible;
23
23
 
24
- @include transition(transform, 0.5s, ease-in-out);
24
+ @include mixins.transition(transform, 0.5s, ease-in-out);
25
25
  transform: translate(120%);
26
26
 
27
- &.hidden {
27
+ &.hide {
28
28
  visibility: hidden;
29
29
  }
30
30
 
@@ -32,13 +32,13 @@
32
32
  visibility: visible;
33
33
  transform: translate(0%);
34
34
 
35
- .backdrop-slide {
35
+ #backdrop-slide {
36
36
  background-color: transparent;
37
37
  }
38
38
  }
39
39
  }
40
40
 
41
- .backdrop-slide {
41
+ #backdrop-slide {
42
42
  background-color: transparent;
43
43
  }
44
44
 
@@ -49,12 +49,17 @@ describe("SlideInModal should render", () => {
49
49
  it("makes modal content's container visible after opening transition ends", () => {
50
50
  const { slideInModal, rerender } = createSlideInModal();
51
51
 
52
- expect(slideInModal).toHaveClass("hidden");
52
+ expect(slideInModal).toHaveClass("hide");
53
53
 
54
54
  rerender(<SlideInModal {...defaultParams} open />);
55
55
  fireEvent.transitionEnd(slideInModal);
56
56
 
57
- expect(slideInModal).not.toHaveClass("hidden");
57
+ expect(slideInModal).not.toHaveClass("hide");
58
+
59
+ rerender(<SlideInModal {...defaultParams} open={false} />);
60
+ fireEvent.transitionEnd(slideInModal);
61
+
62
+ expect(slideInModal).toHaveClass("hide");
58
63
  });
59
64
  });
60
65
 
@@ -14,39 +14,59 @@
14
14
  * limitations under the License.
15
15
  */
16
16
 
17
- import React, { TransitionEventHandler, useState, useRef } from "react";
17
+ import React, {
18
+ ForwardRefRenderFunction,
19
+ TransitionEventHandler,
20
+ useState,
21
+ useRef,
22
+ useCallback,
23
+ useEffect
24
+ } from "react";
18
25
  import { Props as ModalProps, Modal } from "../Modal/Modal";
19
26
  import classes from "./SlideInModal.module.scss";
20
27
 
21
- export const SlideInModal = React.forwardRef<HTMLDivElement, ModalProps>(
22
- ({ children, id, open, ...rest }: ModalProps, ref) => {
23
- const [classHideOnTransition, setClassHideOnTransition] = useState<string>("hidden");
24
- const containerRef = useRef(null);
28
+ const SlideInModalComponent: ForwardRefRenderFunction<HTMLDivElement, ModalProps> = (
29
+ { children, id, open, ...rest }: ModalProps,
30
+ ref
31
+ ) => {
32
+ const [classHideOnTransition, setClassHideOnTransition] = useState<string>("hide");
33
+ const [controlledOpen, setControlledOpen] = useState(false);
34
+ const containerRef = useRef(null);
25
35
 
26
- const onTransitionEnd: TransitionEventHandler<HTMLDivElement> = e => {
36
+ const onTransitionEnd: TransitionEventHandler<HTMLDivElement> = useCallback(
37
+ e => {
27
38
  if (e.target === containerRef.current) {
28
- setClassHideOnTransition(prev => (prev ? "" : "hidden"));
39
+ setClassHideOnTransition(prev => (prev ? "" : "hide"));
40
+ if (!open && controlledOpen) {
41
+ setControlledOpen(false);
42
+ }
29
43
  }
30
- };
44
+ },
45
+ [open]
46
+ );
31
47
 
32
- return (
33
- <Modal
34
- {...rest}
35
- id={id}
36
- open={open}
37
- className={`${classes["slide-in-modal"]} ${open ? classes["visible"] : ""} ${
38
- !open ? classes[classHideOnTransition] : ""
39
- }`}
40
- containerProps={{ className: classes["container"] }}
41
- backdropProps={{ className: classes["backdrop-slide"] }}
42
- forceContainerOpen
43
- onTransitionEnd={onTransitionEnd}
44
- ref={ref || containerRef}
45
- >
46
- {children}
47
- </Modal>
48
- );
49
- }
50
- );
48
+ useEffect(() => {
49
+ open && setControlledOpen(open);
50
+ }, [open]);
51
+
52
+ return (
53
+ <Modal
54
+ {...rest}
55
+ id={id}
56
+ open={controlledOpen}
57
+ className={`${classes["slide-in-modal"]} ${open ? classes["visible"] : ""} ${
58
+ !open ? classes[classHideOnTransition] : ""
59
+ }`}
60
+ containerProps={{ className: classes["container"] }}
61
+ backdropProps={{ id: classes["backdrop-slide"] }}
62
+ onTransitionEnd={onTransitionEnd}
63
+ ref={ref || containerRef}
64
+ >
65
+ {children}
66
+ </Modal>
67
+ );
68
+ };
51
69
 
52
70
  export { Props } from "../Modal/Modal";
71
+
72
+ export const SlideInModal = React.forwardRef(SlideInModalComponent);
@@ -14,7 +14,7 @@
14
14
  * limitations under the License.
15
15
  */
16
16
 
17
- import React, { ComponentPropsWithRef, Fragment, useState } from "react";
17
+ import React, { ForwardRefRenderFunction, ComponentPropsWithRef, Fragment, useState } from "react";
18
18
  import classes from "./Pagination.module.scss";
19
19
  import readyclasses from "../readyclasses.module.scss";
20
20
  import { IconButton } from "../Button/IconButton";
@@ -53,183 +53,183 @@ export interface Props extends Omit<ComponentPropsWithRef<"div">, "translate"> {
53
53
  onPageSizeChange: (pageSize: PageSize) => void;
54
54
  }
55
55
 
56
- export const Pagination = React.forwardRef<HTMLDivElement, Props>(
57
- (
58
- {
59
- totalElements,
60
- pageSize = 10,
61
- translate = DefaultTranslations,
62
- currentPage,
63
- className,
64
- onPageChange,
65
- onPageSizeChange,
66
- ...rest
67
- }: Props,
68
- ref
69
- ) => {
70
- /** We use an internal state variable, because we don't want to fire onCurrentPageChange whenever onChange fires on the input. Rather, only when the Enter key is pressed. */
71
- const [internalCurrentPage, setInternalCurrentPage] = useState(currentPage?.toString() || "1");
72
- const calculateAmountOfPages = () => {
73
- if (!totalElements) return 1;
74
-
75
- if (Math.ceil(totalElements / pageSize) < 1) {
76
- return 1;
77
- }
78
-
79
- return Math.ceil(totalElements / pageSize);
80
- };
81
-
82
- const onEnterListener = (event: React.KeyboardEvent<HTMLInputElement>) => {
83
- if (event.code === "Enter") {
84
- onPageChange(Number(internalCurrentPage));
85
- }
86
- };
87
-
88
- const renderCurrentPageTranslation = () => {
89
- const amountOfPages = calculateAmountOfPages();
90
-
91
- if (amountOfPages) {
92
- const splitCurrentPageTranslation = translate.currentPage.split(" ");
93
-
94
- return splitCurrentPageTranslation.map(string => {
95
- if (string.includes("%1")) {
96
- return (
97
- <Fragment key={string}>
98
- <Label
99
- id="current-value-input-label"
100
- htmlFor="current-value-input"
101
- className={`${readyclasses["sr-only"]} ${classes["current-value-input-label"]}`}
102
- >
103
- {translate.currentPageLabel}
104
- </Label>
105
- <Input
106
- aria-labelledby="current-value-input-label"
107
- key="input"
108
- id="current-value-input"
109
- type="text"
110
- size={currentPage?.toString().length}
111
- max={calculateAmountOfPages()}
112
- wrapperProps={{ className: classes["current-value-input"] }}
113
- onKeyUp={onEnterListener}
114
- onBlur={(event: React.ChangeEvent<HTMLInputElement>) =>
115
- onPageChange(Number(event.target.value))
116
- }
117
- onChange={(e: React.ChangeEvent<HTMLInputElement>) =>
118
- setInternalCurrentPage(e.target.value)
119
- }
120
- name="current-value-input"
121
- value={internalCurrentPage}
122
- className={`${classes["form-element"]} ${classes["current-page-input"]}`}
123
- />
124
- </Fragment>
125
- );
126
- }
127
-
128
- if (string.includes("%2")) {
129
- return (
130
- <div key={string}>
131
- <strong>{string.replace("%2", amountOfPages.toString())}</strong>&nbsp;
132
- </div>
133
- );
134
- }
135
-
136
- return <div key={string}>{string}&nbsp;</div>;
137
- });
138
- }
139
-
140
- return null;
141
- };
142
-
143
- const onPageSizeChangeHandler = (event: React.ChangeEvent<HTMLSelectElement>) => {
144
- const pageSizeNumber = Number(event.target.value) as PageSize;
145
- onPageSizeChange(pageSizeNumber);
146
- };
147
-
148
- const onPageChangeHandler = (pageToGoTo: number) => {
149
- onPageChange(pageToGoTo);
150
- };
151
-
152
- return (
153
- <div
154
- {...rest}
155
- ref={ref}
156
- className={`${classes["pagination-wrapper"]} ${className ? className : ""}`}
157
- >
158
- {totalElements && (
159
- <div className={classes["total"]}>
160
- <span tabIndex={0}>
161
- {translate.totalItems}: <span>{totalElements}</span>
162
- </span>
163
- </div>
164
- )}
165
- <div className={classes["pagination"]}>
166
- {pageSize && (
167
- <div className={classes["per-page"]}>
168
- <Label id="page-size-select-label">{translate.itemsPerPage}</Label>
169
- <Select
170
- labeledBy="page-size-select-label"
171
- className={`${classes["form-element"]} ${classes["page-size-select"]}`}
172
- value={pageSize.toString()}
173
- onChange={onPageSizeChangeHandler}
56
+ const PaginationComponent: ForwardRefRenderFunction<HTMLDivElement, Props> = (
57
+ {
58
+ totalElements,
59
+ pageSize = 10,
60
+ translate = DefaultTranslations,
61
+ currentPage,
62
+ className,
63
+ onPageChange,
64
+ onPageSizeChange,
65
+ ...rest
66
+ }: Props,
67
+ ref
68
+ ) => {
69
+ /** We use an internal state variable, because we don't want to fire onCurrentPageChange whenever onChange fires on the input. Rather, only when the Enter key is pressed. */
70
+ const [internalCurrentPage, setInternalCurrentPage] = useState(currentPage?.toString() || "1");
71
+ const calculateAmountOfPages = () => {
72
+ if (!totalElements) return 1;
73
+
74
+ if (Math.ceil(totalElements / pageSize) < 1) {
75
+ return 1;
76
+ }
77
+
78
+ return Math.ceil(totalElements / pageSize);
79
+ };
80
+
81
+ const onEnterListener = (event: React.KeyboardEvent<HTMLInputElement>) => {
82
+ if (event.code === "Enter") {
83
+ onPageChange(Number(internalCurrentPage));
84
+ }
85
+ };
86
+
87
+ const renderCurrentPageTranslation = () => {
88
+ const amountOfPages = calculateAmountOfPages();
89
+
90
+ if (amountOfPages) {
91
+ const splitCurrentPageTranslation = translate.currentPage.split(" ");
92
+
93
+ return splitCurrentPageTranslation.map(string => {
94
+ if (string.includes("%1")) {
95
+ return (
96
+ <Fragment key={string}>
97
+ <Label
98
+ id="current-value-input-label"
99
+ htmlFor="current-value-input"
100
+ className={`${readyclasses["sr-only"]} ${classes["current-value-input-label"]}`}
174
101
  >
175
- <Option value="10">10</Option>
176
- <Option value="25">25</Option>
177
- <Option value="50">50</Option>
178
- </Select>
102
+ {translate.currentPageLabel}
103
+ </Label>
104
+ <Input
105
+ aria-labelledby="current-value-input-label"
106
+ key="input"
107
+ id="current-value-input"
108
+ type="text"
109
+ size={currentPage?.toString().length}
110
+ max={calculateAmountOfPages()}
111
+ wrapperProps={{ className: classes["current-value-input"] }}
112
+ onKeyUp={onEnterListener}
113
+ onBlur={(event: React.ChangeEvent<HTMLInputElement>) =>
114
+ onPageChange(Number(event.target.value))
115
+ }
116
+ onChange={(e: React.ChangeEvent<HTMLInputElement>) =>
117
+ setInternalCurrentPage(e.target.value)
118
+ }
119
+ name="current-value-input"
120
+ value={internalCurrentPage}
121
+ className={`${classes["form-element"]} ${classes["current-page-input"]}`}
122
+ />
123
+ </Fragment>
124
+ );
125
+ }
126
+
127
+ if (string.includes("%2")) {
128
+ return (
129
+ <div key={string}>
130
+ <strong>{string.replace("%2", amountOfPages.toString())}</strong>&nbsp;
179
131
  </div>
180
- )}
181
- <Fragment>
182
- {!!((currentPage && currentPage > 2) || (currentPage && currentPage > 1)) && (
183
- <div className={classes["previous"]}>
184
- {currentPage > 2 && (
185
- <IconButton
186
- title="first"
187
- onClick={() => onPageChangeHandler(0)}
188
- data-paginate="first"
189
- >
190
- <Icon icon={Icons.NavigationFirst} />
191
- </IconButton>
192
- )}
193
- {currentPage > 1 && (
194
- <IconButton
195
- title="previous"
196
- onClick={() => onPageChangeHandler(currentPage - 1)}
197
- data-paginate="previous"
198
- >
199
- <Icon icon={Icons.ChevronLeft} />
200
- </IconButton>
201
- )}
202
- </div>
203
- )}
204
- {totalElements && !!calculateAmountOfPages() && (
205
- <div className={classes["page"]}>{renderCurrentPageTranslation()}</div>
206
- )}
207
- <div className={classes["next"]}>
208
- {!!(
209
- (currentPage !== undefined && currentPage < calculateAmountOfPages()!) ||
210
- (currentPage !== undefined && !totalElements)
211
- ) && (
132
+ );
133
+ }
134
+
135
+ return <div key={string}>{string}&nbsp;</div>;
136
+ });
137
+ }
138
+
139
+ return null;
140
+ };
141
+
142
+ const onPageSizeChangeHandler = (event: React.ChangeEvent<HTMLSelectElement>) => {
143
+ const pageSizeNumber = Number(event.target.value) as PageSize;
144
+ onPageSizeChange(pageSizeNumber);
145
+ };
146
+
147
+ const onPageChangeHandler = (pageToGoTo: number) => {
148
+ onPageChange(pageToGoTo);
149
+ };
150
+
151
+ return (
152
+ <div
153
+ {...rest}
154
+ ref={ref}
155
+ className={`${classes["pagination-wrapper"]} ${className ? className : ""}`}
156
+ >
157
+ {totalElements && (
158
+ <div className={classes["total"]}>
159
+ <span tabIndex={0}>
160
+ {translate.totalItems}: <span>{totalElements}</span>
161
+ </span>
162
+ </div>
163
+ )}
164
+ <div className={classes["pagination"]}>
165
+ {pageSize && (
166
+ <div className={classes["per-page"]}>
167
+ <Label id="page-size-select-label">{translate.itemsPerPage}</Label>
168
+ <Select
169
+ labeledBy="page-size-select-label"
170
+ className={`${classes["form-element"]} ${classes["page-size-select"]}`}
171
+ value={pageSize.toString()}
172
+ onChange={onPageSizeChangeHandler}
173
+ >
174
+ <Option value="10">10</Option>
175
+ <Option value="25">25</Option>
176
+ <Option value="50">50</Option>
177
+ </Select>
178
+ </div>
179
+ )}
180
+ <Fragment>
181
+ {!!((currentPage && currentPage > 2) || (currentPage && currentPage > 1)) && (
182
+ <div className={classes["previous"]}>
183
+ {currentPage > 2 && (
212
184
  <IconButton
213
- title="next"
214
- onClick={() => onPageChangeHandler(currentPage + 1)}
215
- data-paginate="next"
185
+ title="first"
186
+ onClick={() => onPageChangeHandler(0)}
187
+ data-paginate="first"
216
188
  >
217
- <Icon icon={Icons.ChevronRight} />
189
+ <Icon icon={Icons.NavigationFirst} />
218
190
  </IconButton>
219
191
  )}
220
- {!!(currentPage && totalElements && currentPage < calculateAmountOfPages()! - 1) && (
192
+ {currentPage > 1 && (
221
193
  <IconButton
222
- title="last"
223
- onClick={() => onPageChangeHandler(totalElements / pageSize)}
224
- data-paginate="last"
194
+ title="previous"
195
+ onClick={() => onPageChangeHandler(currentPage - 1)}
196
+ data-paginate="previous"
225
197
  >
226
- <Icon icon={Icons.NavigationLast} />
198
+ <Icon icon={Icons.ChevronLeft} />
227
199
  </IconButton>
228
200
  )}
229
201
  </div>
230
- </Fragment>
231
- </div>
202
+ )}
203
+ {totalElements && !!calculateAmountOfPages() && (
204
+ <div className={classes["page"]}>{renderCurrentPageTranslation()}</div>
205
+ )}
206
+ <div className={classes["next"]}>
207
+ {!!(
208
+ (currentPage !== undefined && currentPage < calculateAmountOfPages()!) ||
209
+ (currentPage !== undefined && !totalElements)
210
+ ) && (
211
+ <IconButton
212
+ title="next"
213
+ onClick={() => onPageChangeHandler(currentPage + 1)}
214
+ data-paginate="next"
215
+ >
216
+ <Icon icon={Icons.ChevronRight} />
217
+ </IconButton>
218
+ )}
219
+ {!!(currentPage && totalElements && currentPage < calculateAmountOfPages()! - 1) && (
220
+ <IconButton
221
+ title="last"
222
+ onClick={() => onPageChangeHandler(totalElements / pageSize)}
223
+ data-paginate="last"
224
+ >
225
+ <Icon icon={Icons.NavigationLast} />
226
+ </IconButton>
227
+ )}
228
+ </div>
229
+ </Fragment>
232
230
  </div>
233
- );
234
- }
235
- );
231
+ </div>
232
+ );
233
+ };
234
+
235
+ export const Pagination = React.forwardRef(PaginationComponent);
@@ -20,6 +20,7 @@
20
20
  $transition-property: transform, opacity;
21
21
 
22
22
  position: fixed;
23
+ z-index: 1;
23
24
  pointer-events: none;
24
25
  background-color: var(--light);
25
26
  border-radius: 8px;
@@ -14,7 +14,14 @@
14
14
  * limitations under the License.
15
15
  */
16
16
 
17
- import React, { ComponentPropsWithRef, ReactNode, RefObject, useEffect, useRef } from "react";
17
+ import React, {
18
+ ForwardRefRenderFunction,
19
+ ComponentPropsWithRef,
20
+ ReactNode,
21
+ RefObject,
22
+ useEffect,
23
+ useRef
24
+ } from "react";
18
25
  import { Offset, Placement, usePosition } from "../hooks/usePosition";
19
26
  import classes from "./Popover.module.scss";
20
27
 
@@ -27,42 +34,45 @@ export interface Props extends ComponentPropsWithRef<"div"> {
27
34
  transformOrigin?: Placement;
28
35
  }
29
36
 
30
- export const Popover = React.forwardRef<HTMLDivElement, Props>(
31
- ({ children, className, show, placement, offset, transformOrigin, anchorEl, ...rest }, ref) => {
32
- const elToBePositioned = useRef<HTMLDivElement>(null);
37
+ const PopoverComponent: ForwardRefRenderFunction<HTMLDivElement, Props> = (
38
+ { children, className, show, placement, offset, transformOrigin, anchorEl, ...rest },
39
+ ref
40
+ ) => {
41
+ const elToBePositioned = useRef<HTMLDivElement>(null);
33
42
 
34
- if (show === undefined) {
35
- throw new Error('Please make sure to define the "show" property on your Popover component');
36
- }
43
+ if (show === undefined) {
44
+ throw new Error('Please make sure to define the "show" property on your Popover component');
45
+ }
37
46
 
38
- const { top, left, right, bottom, calculatePosition } = usePosition({
39
- elementToBePositioned: elToBePositioned,
40
- relativeElement: anchorEl,
41
- offset: offset,
42
- placement: placement,
43
- transformOrigin: transformOrigin
44
- });
47
+ const { top, left, right, bottom, calculatePosition } = usePosition({
48
+ elementToBePositioned: elToBePositioned,
49
+ relativeElement: anchorEl,
50
+ offset: offset,
51
+ placement: placement,
52
+ transformOrigin: transformOrigin
53
+ });
45
54
 
46
- useEffect(() => {
47
- window.addEventListener("resize", calculatePosition);
55
+ useEffect(() => {
56
+ window.addEventListener("resize", calculatePosition);
48
57
 
49
- return () => window.removeEventListener("resize", calculatePosition);
50
- }, []);
58
+ return () => window.removeEventListener("resize", calculatePosition);
59
+ }, []);
51
60
 
52
- useEffect(() => {
53
- calculatePosition();
54
- }, [show]);
61
+ useEffect(() => {
62
+ calculatePosition();
63
+ }, [show]);
55
64
 
56
- return (
57
- <div ref={ref} {...rest}>
58
- <div
59
- ref={elToBePositioned}
60
- className={`${classes.popover} ${className ?? ""} ${show ? classes.show : ""}`}
61
- style={{ top: top, left: left, right: right, bottom: bottom }}
62
- >
63
- {children}
64
- </div>
65
+ return (
66
+ <div ref={ref} {...rest}>
67
+ <div
68
+ ref={elToBePositioned}
69
+ className={`${classes.popover} ${className ?? ""} ${show ? classes.show : ""}`}
70
+ style={{ top: top, left: left, right: right, bottom: bottom }}
71
+ >
72
+ {children}
65
73
  </div>
66
- );
67
- }
68
- );
74
+ </div>
75
+ );
76
+ };
77
+
78
+ export const Popover = React.forwardRef(PopoverComponent);
@@ -14,7 +14,7 @@
14
14
  * limitations under the License.
15
15
  */
16
16
 
17
- import React, { ComponentPropsWithRef } from "react";
17
+ import React, { ForwardRefRenderFunction, ComponentPropsWithRef } from "react";
18
18
  import { Typography } from "../Typography/Typography";
19
19
  import classes from "./ProgressBar.module.scss";
20
20
 
@@ -22,17 +22,20 @@ export interface Props extends Omit<ComponentPropsWithRef<"span">, "children"> {
22
22
  placeholderText: string;
23
23
  }
24
24
 
25
- export const ProgressBar = React.forwardRef<HTMLSpanElement, Props>(
26
- ({ placeholderText, ...rest }: Props, ref) => {
27
- return (
28
- <span {...rest} ref={ref} role="progressbar">
29
- <span className={classes["progress-bar"]}>
30
- <span className={classes["bar"]} />
31
- </span>
32
- <Typography className={classes["placeholder"]} spacing={{ marginBottom: 0 }} variant="body">
33
- {placeholderText}
34
- </Typography>
25
+ const ProgressBarComponent: ForwardRefRenderFunction<HTMLSpanElement, Props> = (
26
+ { placeholderText, ...rest }: Props,
27
+ ref
28
+ ) => {
29
+ return (
30
+ <span {...rest} ref={ref} role="progressbar">
31
+ <span className={classes["progress-bar"]}>
32
+ <span className={classes["bar"]} />
35
33
  </span>
36
- );
37
- }
38
- );
34
+ <Typography className={classes["placeholder"]} spacing={{ marginBottom: 0 }} variant="body">
35
+ {placeholderText}
36
+ </Typography>
37
+ </span>
38
+ );
39
+ };
40
+
41
+ export const ProgressBar = React.forwardRef(ProgressBarComponent);