1- import { useContext } from "react" ;
1+ import { useContext , useRef } from "react" ;
22import styled from "@emotion/styled" ;
33import DxcButton from "../button/Button" ;
44import DxcSelect from "../select/Select" ;
55import PaginatorPropsType from "./types" ;
66import { HalstackLanguageContext } from "../HalstackContext" ;
7+ import { responsiveSizes } from "../common/variables" ;
8+ import useWidth from "../utils/useWidth" ;
9+ import { isResponsive } from "./utils" ;
10+
11+ const DxcPaginatorContainer = styled . div < { width : number } > `
12+ display: flex;
13+ justify-content: ${ ( { width } ) => ( isResponsive ( width ) ? "center" : "flex-end" ) } ;
14+ flex-wrap: ${ ( { width } ) => ( isResponsive ( width ) ? "wrap" : "nowrap" ) } ;
15+ gap: ${ ( { width } ) => ( isResponsive ( width ) ? "var(--spacing-gap-s)" : "0" ) } ;
16+ align-items: center;
17+ width: 100%;
18+ min-height: 48px;
19+ box-sizing: border-box;
20+ font-family: var(--typography-font-family);
21+ font-size: var(--typography-label-m);
22+ font-weight: var(--typography-label-regular);
23+ background-color: var(--color-bg-neutral-lighter);
24+ color: var(--color-fg-neutral-dark);
25+ padding: var(--spacing-padding-xs) var(--spacing-padding-xl);
26+ ` ;
27+
28+ const ItemsPerPageContainer = styled . span < { width : number } > `
29+ display: flex;
30+ align-items: center;
31+ gap: var(--spacing-gap-s);
32+ margin-right: ${ ( { width } ) => ( isResponsive ( width ) ? "0" : "var(--spacing-gap-ml)" ) } ;
33+ ` ;
34+
35+ const SelectContainer = styled . div `
36+ min-width: 6.25rem;
37+ ` ;
38+
39+ const TotalItemsContainer = styled . span < { width : number } > `
40+ margin-right: ${ ( { width } ) => ( isResponsive ( width ) ? "0" : "var(--spacing-gap-xxl)" ) } ;
41+ ` ;
42+
43+ const GoToPageContainer = styled . div `
44+ display: flex;
45+ align-items: center;
46+ gap: var(--spacing-gap-ml);
47+ ` ;
48+
49+ const ButtonsContainer = styled . div `
50+ display: flex;
51+ align-items: center;
52+ gap: var(--spacing-gap-s);
53+ flex-shrink: 0;
54+ ` ;
55+
56+ const PageToSelectContainer = styled . span < { width : number } > `
57+ display: flex;
58+ align-items: center;
59+ gap: var(--spacing-gap-s);
60+ flex-shrink: 0;
61+ flex-wrap: wrap;
62+ ` ;
763
864const DxcPaginator = ( {
965 currentPage = 1 ,
@@ -26,58 +82,13 @@ const DxcPaginator = ({
2682
2783 const translatedLabels = useContext ( HalstackLanguageContext ) ;
2884
29- const DxcPaginatorContainer = styled . div `
30- display: flex;
31- justify-content: flex-end;
32- align-items: center;
33- width: 100%;
34- min-height: 48px;
35- box-sizing: border-box;
36- font-family: var(--typography-font-family);
37- font-size: var(--typography-label-m);
38- font-weight: var(--typography-label-regular);
39- background-color: var(--color-bg-neutral-lighter);
40- color: var(--color-fg-neutral-dark);
41- padding: var(--spacing-padding-xs) var(--spacing-padding-xl);
42- ` ;
43-
44- const ItemsPerPageContainer = styled . span `
45- display: flex;
46- align-items: center;
47- gap: var(--spacing-gap-s);
48- margin-right: var(--spacing-gap-ml);
49- ` ;
50-
51- const SelectContainer = styled . div `
52- min-width: 6.25rem;
53- ` ;
54-
55- const TotalItemsContainer = styled . span `
56- margin-right: var(--spacing-gap-xxl);
57- ` ;
58-
59- const GoToPageContainer = styled . div `
60- display: flex;
61- align-items: center;
62- gap: var(--spacing-gap-ml);
63- ` ;
64-
65- const ButtonsContainer = styled . div `
66- display: flex;
67- align-items: center;
68- gap: var(--spacing-gap-s);
69- ` ;
70-
71- const PageToSelectContainer = styled . span `
72- display: flex;
73- align-items: center;
74- gap: var(--spacing-gap-s);
75- ` ;
85+ const containerRef = useRef < HTMLDivElement | null > ( null ) ;
86+ const width = useWidth ( containerRef ) ;
7687
7788 return (
78- < DxcPaginatorContainer >
89+ < DxcPaginatorContainer ref = { containerRef } width = { width } >
7990 { itemsPerPageOptions && (
80- < ItemsPerPageContainer >
91+ < ItemsPerPageContainer width = { width } >
8192 < span > { translatedLabels . paginator . itemsPerPageText } </ span >
8293 < SelectContainer >
8394 < DxcSelect
@@ -95,7 +106,7 @@ const DxcPaginator = ({
95106 </ SelectContainer >
96107 </ ItemsPerPageContainer >
97108 ) }
98- < TotalItemsContainer >
109+ < TotalItemsContainer width = { width } >
99110 { translatedLabels . paginator . minToMaxOfText ( minItemsPerPage , maxItemsPerPage , totalItems ) }
100111 </ TotalItemsContainer >
101112 < GoToPageContainer >
@@ -127,8 +138,10 @@ const DxcPaginator = ({
127138 </ ButtonsContainer >
128139 ) }
129140 { showGoToPage ? (
130- < PageToSelectContainer >
131- < span > { translatedLabels . paginator . goToPageText } </ span >
141+ < PageToSelectContainer width = { width } >
142+ { ( width >= Number ( responsiveSizes . small ) * 16 || ! onPageChange ) && (
143+ < span > { translatedLabels . paginator . goToPageText } </ span >
144+ ) }
132145 < SelectContainer >
133146 < DxcSelect
134147 options = { Array . from ( Array ( totalPages ) , ( e , num ) => ( {
0 commit comments