@linzjs/lui 21.44.2 → 21.44.4

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.
package/CHANGELOG.md CHANGED
@@ -1,3 +1,17 @@
1
+ ## [21.44.4](https://github.com/linz/lui/compare/v21.44.3...v21.44.4) (2024-08-28)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * **LuiSearchBox:** search results panel closed when click arrows to scroll up and down ([#1151](https://github.com/linz/lui/issues/1151)) ([d75b9a1](https://github.com/linz/lui/commit/d75b9a1fe525db4b1bec56142d326ac3000108da))
7
+
8
+ ## [21.44.3](https://github.com/linz/lui/compare/v21.44.2...v21.44.3) (2024-08-27)
9
+
10
+
11
+ ### Bug Fixes
12
+
13
+ * **LuiPagination:** pagination component improvements ([#1152](https://github.com/linz/lui/issues/1152)) ([139e3e8](https://github.com/linz/lui/commit/139e3e8375b2fa8b92fe262e01d4f59dde1465df))
14
+
1
15
  ## [21.44.2](https://github.com/linz/lui/compare/v21.44.1...v21.44.2) (2024-08-27)
2
16
 
3
17
 
@@ -1,10 +1,23 @@
1
- /// <reference types="react" />
2
1
  import './LuiPagination.scss';
2
+ import React from 'react';
3
3
  declare type PaginationProps = {
4
4
  totalPages: number;
5
5
  currentPage: number;
6
6
  onPageChange: (page: number) => void;
7
7
  isMobileLayout?: boolean | null;
8
+ animate?: boolean;
8
9
  };
9
- export declare const LuiPagination: ({ totalPages, currentPage, onPageChange, isMobileLayout, }: PaginationProps) => JSX.Element;
10
+ /**
11
+ * @description Pagination component for navigating through a list of items with multiple pages.
12
+ * @param currentPage - The currently selected page.
13
+ * @param totalPages - The total number of pages.
14
+ * @param onPageChange - Callback function that is triggered when a new page is selected.
15
+ * It uses the selected page number as an argument.
16
+ * @param isMobileLayout - Optional prop to override the responsive layout.
17
+ * By default, the responsive layout will be used, which shows the full component
18
+ * when the components container is >= 500px, and a mobile layout when < 500px.
19
+ * @param animate - Optional prop to enable or disable the animation when navigating through pages.
20
+ * A panning animation is shown for number values between two ellipsis buttons.
21
+ */
22
+ export declare const LuiPagination: React.ForwardRefExoticComponent<PaginationProps & React.RefAttributes<HTMLDivElement>>;
10
23
  export {};
package/dist/index.js CHANGED
@@ -42541,11 +42541,11 @@ var LuiSearchInput = function (props) {
42541
42541
  return __generator(this, function (_b) {
42542
42542
  switch (_b.label) {
42543
42543
  case 0:
42544
- if (!(input !== '' && input.length >= props.minCharactersForSearch)) return [3 /*break*/, 5];
42544
+ if (!(input !== '' && input.length >= props.minCharactersForSearch)) return [3 /*break*/, 6];
42545
42545
  setIsLoading(true);
42546
42546
  _b.label = 1;
42547
42547
  case 1:
42548
- _b.trys.push([1, , 3, 4]);
42548
+ _b.trys.push([1, 3, 4, 5]);
42549
42549
  return [4 /*yield*/, props.getOptions(input)];
42550
42550
  case 2:
42551
42551
  results_1 = _b.sent();
@@ -42555,12 +42555,17 @@ var LuiSearchInput = function (props) {
42555
42555
  if (!selectedIdInResults) {
42556
42556
  setSelectedId(items.length ? items[0].id : '');
42557
42557
  }
42558
- return [3 /*break*/, 4];
42558
+ return [3 /*break*/, 5];
42559
42559
  case 3:
42560
+ _b.sent();
42561
+ // failed to get results, clear the last search results to avoid misleading
42562
+ setResults([]);
42563
+ return [3 /*break*/, 5];
42564
+ case 4:
42560
42565
  setIsLoading(false);
42561
42566
  return [7 /*endfinally*/];
42562
- case 4: return [3 /*break*/, 6];
42563
- case 5:
42567
+ case 5: return [3 /*break*/, 7];
42568
+ case 6:
42564
42569
  if (input !== '' &&
42565
42570
  input.length < props.minCharactersForSearch &&
42566
42571
  results.length > 0) {
@@ -42571,8 +42576,8 @@ var LuiSearchInput = function (props) {
42571
42576
  (_a = props.onClearCallback) === null || _a === void 0 ? void 0 : _a.call(props);
42572
42577
  setResults([]);
42573
42578
  }
42574
- _b.label = 6;
42575
- case 6: return [2 /*return*/];
42579
+ _b.label = 7;
42580
+ case 7: return [2 /*return*/];
42576
42581
  }
42577
42582
  });
42578
42583
  });
@@ -58458,51 +58463,57 @@ var LuiCounter = React__default["default"].forwardRef(function (props, ref) {
58458
58463
  return (React__default["default"].createElement(React__default["default"].Fragment, null, !(selectedNum === 0 && !countZero) && (React__default["default"].createElement("span", __assign({ ref: ref, className: determineCounterClassname(), "data-testid": "lui-counter-number-".concat(shape), title: title !== null && title !== void 0 ? title : "".concat(selectedNum, " of ").concat(totalNum, " rows selected") }, rest), selectedNum.toLocaleString()))));
58459
58464
  });
58460
58465
 
58461
- var css_248z$8 = "/**\n @deprecated\n */\n/**\n @deprecated\n */\n/**\n @deprecated\n */\n.lui-pagination-override-mobile .lui-pagination-desktop {\n display: none;\n visibility: hidden;\n opacity: 0;\n}\n.lui-pagination-override-mobile .lui-pagination-mobile {\n display: flex;\n}\n\n.lui-pagination-override-desktop .lui-pagination-mobile {\n display: none;\n visibility: hidden;\n opacity: 0;\n}\n.lui-pagination-override-desktop .lui-pagination-desktop {\n display: flex;\n}\n\n.lui-pagination-controller {\n container-type: inline-size;\n}\n@container (min-width: 500px) {\n .lui-pagination-controller .lui-pagination-mobile {\n display: none;\n visibility: hidden;\n opacity: 0;\n }\n .lui-pagination-controller .lui-pagination-desktop {\n display: flex;\n }\n}\n@container (max-width: 499px) {\n .lui-pagination-controller .lui-pagination-desktop {\n display: none;\n visibility: hidden;\n opacity: 0;\n }\n .lui-pagination-controller .lui-pagination-mobile {\n display: flex;\n }\n}\n\n.lui-pagination {\n display: flex;\n user-select: none;\n justify-content: center;\n}\n.lui-pagination-page-counter {\n display: flex;\n align-items: center;\n margin-left: 0.75rem;\n margin-right: 0.75rem;\n}\n.lui-pagination .lui-button {\n color: #2a292c;\n height: 40px;\n padding: 0.5rem 0.75rem;\n vertical-align: top;\n}\n.lui-pagination .lui-button .lui-pagination-navigation-icon {\n padding-top: 1px;\n}\n.lui-pagination .lui-button .lui-pagination-navigation-icon path {\n fill: #2a292c;\n}\n.lui-pagination .lui-button:hover {\n color: #2a292c;\n}\n.lui-pagination .lui-button-selected {\n background-color: #007198;\n color: #ffffff;\n}\n.lui-pagination-ellipsis {\n pointer-events: none;\n}\n.lui-pagination-navigate-disabled {\n pointer-events: none;\n}\n.lui-pagination-navigate-disabled .lui-pagination-navigation-icon {\n padding-top: 1px;\n}\n.lui-pagination-navigate-disabled .lui-pagination-navigation-icon path {\n fill: #989189 !important;\n}";
58466
+ var css_248z$8 = "/**\n @deprecated\n */\n/**\n @deprecated\n */\n/**\n @deprecated\n */\n.lui-pagination-override-mobile .lui-pagination-desktop {\n display: none;\n visibility: hidden;\n opacity: 0;\n}\n.lui-pagination-override-mobile .lui-pagination-mobile {\n display: flex;\n}\n\n.lui-pagination-override-desktop .lui-pagination-mobile {\n display: none;\n visibility: hidden;\n opacity: 0;\n}\n.lui-pagination-override-desktop .lui-pagination-desktop {\n display: flex;\n}\n\n.lui-pagination-controller {\n container-type: inline-size;\n}\n@container (min-width: 500px) {\n .lui-pagination-controller .lui-pagination-mobile {\n display: none;\n visibility: hidden;\n opacity: 0;\n }\n .lui-pagination-controller .lui-pagination-desktop {\n display: flex;\n }\n}\n@container (max-width: 499px) {\n .lui-pagination-controller .lui-pagination-desktop {\n display: none;\n visibility: hidden;\n opacity: 0;\n }\n .lui-pagination-controller .lui-pagination-mobile {\n display: flex;\n }\n}\n\n.lui-pagination {\n display: flex;\n user-select: none;\n justify-content: center;\n}\n.lui-pagination-page-counter {\n display: flex;\n align-items: center;\n margin-left: 0.75rem;\n margin-right: 0.75rem;\n}\n.lui-pagination .lui-button {\n color: #2a292c;\n height: 40px;\n padding: 0.5rem 0.75rem;\n vertical-align: top;\n}\n.lui-pagination .lui-button .lui-pagination-navigation-icon {\n padding-top: 1px;\n}\n.lui-pagination .lui-button .lui-pagination-navigation-icon path {\n fill: #2a292c;\n}\n.lui-pagination .lui-button-selected {\n background-color: #007198;\n color: #ffffff;\n}\n.lui-pagination-ellipsis {\n pointer-events: none;\n}\n.lui-pagination-navigate-disabled {\n pointer-events: none;\n}\n.lui-pagination-navigate-disabled .lui-pagination-navigation-icon {\n padding-top: 1px;\n}\n.lui-pagination-navigate-disabled .lui-pagination-navigation-icon path {\n fill: #989189 !important;\n}\n\n.pan-left {\n transition: transform 0.3s ease-in-out, opacity 0.3s ease-in-out;\n transform: perspective(1000px) rotateY(20deg) translateX(-10px);\n opacity: 0.5;\n}\n\n.pan-right {\n transition: transform 0.3s ease-in-out, opacity 0.3s ease-in-out;\n transform: perspective(1000px) rotateY(-20deg) translateX(10px);\n opacity: 0.5;\n}";
58462
58467
  styleInject(css_248z$8);
58463
58468
 
58464
- var LuiPagination = function (_a) {
58465
- var totalPages = _a.totalPages, currentPage = _a.currentPage, onPageChange = _a.onPageChange, _b = _a.isMobileLayout, isMobileLayout = _b === void 0 ? null : _b;
58469
+ /**
58470
+ * @description Pagination component for navigating through a list of items with multiple pages.
58471
+ * @param currentPage - The currently selected page.
58472
+ * @param totalPages - The total number of pages.
58473
+ * @param onPageChange - Callback function that is triggered when a new page is selected.
58474
+ * It uses the selected page number as an argument.
58475
+ * @param isMobileLayout - Optional prop to override the responsive layout.
58476
+ * By default, the responsive layout will be used, which shows the full component
58477
+ * when the components container is >= 500px, and a mobile layout when < 500px.
58478
+ * @param animate - Optional prop to enable or disable the animation when navigating through pages.
58479
+ * A panning animation is shown for number values between two ellipsis buttons.
58480
+ */
58481
+ var LuiPagination = React.forwardRef(function (_a, ref) {
58482
+ var currentPage = _a.currentPage, totalPages = _a.totalPages, onPageChange = _a.onPageChange, _b = _a.isMobileLayout, isMobileLayout = _b === void 0 ? null : _b, _c = _a.animate, animate = _c === void 0 ? true : _c;
58483
+ var _d = React.useState(null), panDirection = _d[0], setPanDirection = _d[1];
58466
58484
  var visibleCount = 6; // potentially can be refined further, has issues if set to smaller values
58485
+ totalPages = Math.round(totalPages); // Ensure that totalPages is always a whole number
58467
58486
  var mobileLayoutOverride = function () {
58468
- if (isMobileLayout !== null) {
58469
- if (isMobileLayout) {
58487
+ switch (isMobileLayout) {
58488
+ case true:
58470
58489
  return 'lui-pagination-override-mobile';
58471
- }
58472
- else {
58490
+ case false:
58473
58491
  return 'lui-pagination-override-desktop';
58474
- }
58492
+ default:
58493
+ return 'lui-pagination-controller';
58475
58494
  }
58476
- return 'lui-pagination-controller';
58477
- };
58478
- var navigateButtonBefore = function () {
58479
- return (React__default["default"].createElement(LuiButton, { level: "tertiary", key: "lui-pagination-button-navigate-before", className: currentPage > 1
58480
- ? 'lui-pagination-navigate'
58481
- : 'lui-pagination-navigate-disabled', "data-testid": currentPage > 1
58482
- ? 'lui-pagination-navigate-before'
58483
- : 'lui-pagination-navigate-before-disabled', onClick: function () { return handlePaginationPageChange(currentPage - 1); } },
58484
- React__default["default"].createElement(LuiIcon, { name: "ic_keyboard_arrow_left", alt: "Previous page", size: "md", className: "lui-pagination-navigation-icon" })));
58485
- };
58486
- var navigateButtonAfter = function () {
58487
- return (React__default["default"].createElement(LuiButton, { level: "tertiary", key: "lui-pagination-button-navigate-after", className: currentPage < totalPages
58488
- ? 'lui-pagination-navigate'
58489
- : 'lui-pagination-navigate-disabled', "data-testid": currentPage < totalPages
58490
- ? 'lui-pagination-navigate-after'
58491
- : 'lui-pagination-navigate-after-disabled', onClick: function () { return handlePaginationPageChange(currentPage + 1); } },
58492
- React__default["default"].createElement(LuiIcon, { name: "ic_keyboard_arrow_right", alt: "Next page", size: "md", className: "lui-pagination-navigation-icon" })));
58493
58495
  };
58494
58496
  var handlePaginationPageChange = function (pageNumber) {
58495
58497
  if (pageNumber > 0 && pageNumber <= totalPages) {
58496
- // setCurrentPage(pageNumber);
58497
- onPageChange(pageNumber);
58498
+ if (pageNumber > currentPage) {
58499
+ setPanDirection('right');
58500
+ }
58501
+ else if (pageNumber < currentPage) {
58502
+ setPanDirection('left');
58503
+ }
58504
+ else {
58505
+ setPanDirection(null);
58506
+ }
58507
+ setTimeout(function () {
58508
+ setPanDirection(null);
58509
+ onPageChange(pageNumber);
58510
+ }, 300); // Adjust the timeout to match the CSS transition duration
58498
58511
  }
58499
58512
  };
58500
58513
  var renderPaginationNumbers = function () {
58501
58514
  var paginationArray = [];
58502
- // calculate values before and after the currently selected page
58503
58515
  var startPage = Math.max(1, currentPage - 1);
58504
58516
  var endPage = Math.min(totalPages, currentPage + 1);
58505
- // trail pages at the beginning and end if close to the end
58506
58517
  if (currentPage <= visibleCount - 2) {
58507
58518
  startPage = 1;
58508
58519
  endPage = Math.min(totalPages, startPage + visibleCount - 2);
@@ -58511,24 +58522,21 @@ var LuiPagination = function (_a) {
58511
58522
  endPage = totalPages;
58512
58523
  startPage = Math.max(2, endPage - visibleCount + 2);
58513
58524
  }
58514
- // starting page if away from the start
58525
+ paginationArray.push(navigateButtonBefore());
58515
58526
  if (startPage > 1) {
58516
58527
  paginationArray.push(React__default["default"].createElement(LuiButton, { level: "tertiary", key: "lui-pagination-navigation-start", onClick: function () { return handlePaginationPageChange(1); } },
58517
58528
  React__default["default"].createElement("b", null, "1")));
58518
- // add ellipsis if start away from beginning
58519
58529
  if (startPage > 2) {
58520
58530
  paginationArray.push(React__default["default"].createElement(LuiButton, { level: "tertiary", className: "lui-pagination-ellipsis", key: "lui-pagination-ellipsis-start", "data-testid": "lui-pagination-ellipsis" }, '...'));
58521
58531
  }
58522
58532
  }
58523
58533
  var _loop_1 = function (i) {
58524
- paginationArray.push(React__default["default"].createElement(LuiButton, { level: "tertiary", key: "lui-pagination-button-".concat(i), className: i === currentPage ? 'lui-button-selected' : '', onClick: function () { return handlePaginationPageChange(i); } },
58534
+ paginationArray.push(React__default["default"].createElement(LuiButton, { level: "tertiary", key: "lui-pagination-button-".concat(i), className: "".concat(i === currentPage ? 'lui-button-selected' : ''), onClick: function () { return handlePaginationPageChange(i); } },
58525
58535
  React__default["default"].createElement("b", null, i)));
58526
58536
  };
58527
- // add all the visible page numbers
58528
58537
  for (var i = startPage; i <= endPage; i++) {
58529
58538
  _loop_1(i);
58530
58539
  }
58531
- // show ellipsis if away from the end
58532
58540
  if (endPage < totalPages) {
58533
58541
  if (endPage < totalPages - 1) {
58534
58542
  paginationArray.push(React__default["default"].createElement(LuiButton, { level: "tertiary", className: "lui-pagination-ellipsis", key: "lui-pagination-ellipsis-end", "data-testid": "lui-pagination-ellipsis" }, '...'));
@@ -58536,12 +58544,45 @@ var LuiPagination = function (_a) {
58536
58544
  paginationArray.push(React__default["default"].createElement(LuiButton, { level: "tertiary", key: "lui-pagination-button-last", onClick: function () { return handlePaginationPageChange(totalPages); } },
58537
58545
  React__default["default"].createElement("b", null, totalPages)));
58538
58546
  }
58539
- // add back and forward icons to the beginning and end
58540
- paginationArray.unshift(navigateButtonBefore());
58541
58547
  paginationArray.push(navigateButtonAfter());
58542
- return paginationArray;
58548
+ var ellipsisStart = -1;
58549
+ var ellipsisEnd = -1;
58550
+ paginationArray.forEach(function (button, index) {
58551
+ if (button.props.children === '...') {
58552
+ if (ellipsisStart === -1) {
58553
+ ellipsisStart = index;
58554
+ }
58555
+ else {
58556
+ ellipsisEnd = index;
58557
+ }
58558
+ }
58559
+ });
58560
+ return paginationArray.map(function (button, index) {
58561
+ if (index > ellipsisStart && index < ellipsisEnd) {
58562
+ return React__default["default"].cloneElement(button, {
58563
+ className: "".concat(button.props.className, " ").concat(panDirection && animate ? "pan-".concat(panDirection) : '')
58564
+ });
58565
+ }
58566
+ return button;
58567
+ });
58568
+ };
58569
+ var navigateButtonBefore = function () {
58570
+ return (React__default["default"].createElement(LuiButton, { level: "tertiary", key: "lui-pagination-button-navigate-before", className: currentPage > 1
58571
+ ? 'lui-pagination-navigate'
58572
+ : 'lui-pagination-navigate-disabled', "data-testid": currentPage > 1
58573
+ ? 'lui-pagination-navigate-before'
58574
+ : 'lui-pagination-navigate-before-disabled', onClick: function () { return handlePaginationPageChange(currentPage - 1); } },
58575
+ React__default["default"].createElement(LuiIcon, { name: "ic_keyboard_arrow_left", alt: "Previous page", size: "md", className: "lui-pagination-navigation-icon" })));
58543
58576
  };
58544
- return (React__default["default"].createElement("div", { className: mobileLayoutOverride() },
58577
+ var navigateButtonAfter = function () {
58578
+ return (React__default["default"].createElement(LuiButton, { level: "tertiary", key: "lui-pagination-button-navigate-after", className: currentPage < totalPages
58579
+ ? 'lui-pagination-navigate'
58580
+ : 'lui-pagination-navigate-disabled', "data-testid": currentPage < totalPages
58581
+ ? 'lui-pagination-navigate-after'
58582
+ : 'lui-pagination-navigate-after-disabled', onClick: function () { return handlePaginationPageChange(currentPage + 1); } },
58583
+ React__default["default"].createElement(LuiIcon, { name: "ic_keyboard_arrow_right", alt: "Next page", size: "md", className: "lui-pagination-navigation-icon" })));
58584
+ };
58585
+ return (React__default["default"].createElement("div", { className: mobileLayoutOverride(), ref: ref },
58545
58586
  (mobileLayoutOverride() === 'lui-pagination-override-mobile' ||
58546
58587
  mobileLayoutOverride() === 'lui-pagination-controller') && (React__default["default"].createElement("div", { className: "lui-pagination-mobile lui-pagination" },
58547
58588
  React__default["default"].createElement(React__default["default"].Fragment, null,
@@ -58567,7 +58608,7 @@ var LuiPagination = function (_a) {
58567
58608
  (mobileLayoutOverride() === 'lui-pagination-override-desktop' ||
58568
58609
  mobileLayoutOverride() === 'lui-pagination-controller') && (React__default["default"].createElement("div", { className: "lui-pagination-desktop lui-pagination" },
58569
58610
  React__default["default"].createElement("div", { className: "pagination" }, renderPaginationNumbers())))));
58570
- };
58611
+ });
58571
58612
 
58572
58613
  var css_248z$7 = "/**\n @deprecated\n */\n/**\n @deprecated\n */\n/**\n @deprecated\n */\n.Separator {\n background-color: #eaeaea;\n position: absolute;\n display: flex;\n justify-content: space-around;\n transition-property: background-color;\n transition-delay: 750ms;\n transition-duration: 0ms;\n}\n.Separator-arrows {\n align-self: center;\n position: relative;\n opacity: 0;\n transition-property: opacity;\n transition-delay: 750ms;\n transition-duration: 0ms;\n}\n.Separator:focus-within, .Separator:hover, .Separator:focus, .Separator:active {\n background-color: #73c8e1;\n transition-delay: 0ms;\n transition-duration: 0ms;\n}\n.Separator:focus-within .Separator-arrows, .Separator:hover .Separator-arrows, .Separator:focus .Separator-arrows, .Separator:active .Separator-arrows {\n opacity: 1;\n transition-delay: 0ms;\n transition-duration: 0ms;\n display: inline-block;\n}";
58573
58614
  styleInject(css_248z$7);