@jobber/components 4.78.3 → 4.78.5-JOB-86464.6

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.
@@ -15,6 +15,7 @@ export declare const SEARCH_DEBOUNCE_DELAY: number;
15
15
  export declare const DATA_LIST_FILTERING_SPINNER_TEST_ID = "ATL-DataList-filteringSpinner";
16
16
  export declare const DATA_LIST_LOADING_MORE_SPINNER_TEST_ID = "ATL-DataList-loadingMoreSpinner";
17
17
  export declare const DATA_LOAD_MORE_TEST_ID = "ATL-DataList-LoadMore-trigger";
18
+ export declare const DATA_LIST_STICKY_HEADER_TEST_ID = "ATL-DataList-stickyHeader";
18
19
  export declare const TRANSITION_DURATION_IN_SECONDS: number;
19
20
  export declare const TRANSITION_DELAY_IN_SECONDS: number;
20
21
  export {};
@@ -144,6 +144,7 @@ const SEARCH_DEBOUNCE_DELAY = design.tokens["timing-slowest"];
144
144
  const DATA_LIST_FILTERING_SPINNER_TEST_ID = "ATL-DataList-filteringSpinner";
145
145
  const DATA_LIST_LOADING_MORE_SPINNER_TEST_ID = "ATL-DataList-loadingMoreSpinner";
146
146
  const DATA_LOAD_MORE_TEST_ID = "ATL-DataList-LoadMore-trigger";
147
+ const DATA_LIST_STICKY_HEADER_TEST_ID = "ATL-DataList-stickyHeader";
147
148
  const TRANSITION_DURATION_IN_SECONDS = design.tokens["timing-base"] / 1000;
148
149
  const TRANSITION_DELAY_IN_SECONDS = design.tokens["timing-quick"] / 1000;
149
150
 
@@ -304,13 +305,13 @@ styleInject_es.styleInject(css_248z$8);
304
305
  function DataListSortingOptions({ options, selectedOption, onSelectChange, onClose, optionsListRef, dataListHeaderTileRef, }) {
305
306
  useRefocusOnActivator.useRefocusOnActivator(!optionsListRef.current);
306
307
  useOnKeyDown.useOnKeyDown(() => onClose(), "Escape");
307
- React__default["default"].useEffect(() => {
308
+ React.useEffect(() => {
308
309
  document.addEventListener("mousedown", handleClickOutside);
309
310
  return () => {
310
311
  document.removeEventListener("mousedown", handleClickOutside);
311
312
  };
312
313
  }, [optionsListRef, dataListHeaderTileRef, onClose]);
313
- return (React__default["default"].createElement("ul", { className: styles$8.optionsList, ref: optionsListRef }, options.map((option, index) => (React__default["default"].createElement("li", { className: styles$8.option, key: index, onClick: () => onSelectChange(option), onKeyDown: event => handleKeyDown(event, option), tabIndex: 0, "data-value": option.id },
314
+ return (React__default["default"].createElement("ul", { className: styles$8.optionsList, ref: optionsListRef }, options.map(option => (React__default["default"].createElement("li", { className: styles$8.option, key: option.id, onClick: () => onSelectChange(option), onKeyDown: event => handleKeyDown(event, option), tabIndex: 0, "data-value": option.id },
314
315
  option.label,
315
316
  option.label === (selectedOption === null || selectedOption === void 0 ? void 0 : selectedOption.label) && (React__default["default"].createElement(Icon.Icon, { name: "checkmark", color: "blue" })))))));
316
317
  function handleKeyDown(event, option) {
@@ -320,9 +321,9 @@ function DataListSortingOptions({ options, selectedOption, onSelectChange, onClo
320
321
  }
321
322
  function handleClickOutside(event) {
322
323
  var _a, _b;
323
- const isClickInsideOptions = (_a = optionsListRef.current) === null || _a === void 0 ? void 0 : _a.contains(event.target);
324
- const isClickInsideHeader = (_b = dataListHeaderTileRef.current) === null || _b === void 0 ? void 0 : _b.contains(event.target);
325
- if (!isClickInsideOptions && !isClickInsideHeader) {
324
+ const isClickInside = ((_a = optionsListRef.current) === null || _a === void 0 ? void 0 : _a.contains(event.target)) ||
325
+ ((_b = dataListHeaderTileRef.current) === null || _b === void 0 ? void 0 : _b.contains(event.target));
326
+ if (!isClickInside) {
326
327
  onClose();
327
328
  }
328
329
  }
@@ -332,9 +333,9 @@ function DataListSortingOptions({ options, selectedOption, onSelectChange, onClo
332
333
  function DataListHeaderTile({ headers, headerKey, visible = false, }) {
333
334
  useRefocusOnActivator.useRefocusOnActivator(visible);
334
335
  const { sorting } = useDataListContext();
335
- const [isDropDownOpen, setIsDropDownOpen] = React__default["default"].useState(false);
336
+ const [isDropDownOpen, setIsDropDownOpen] = React.useState(false);
336
337
  const optionsListRef = useFocusTrap.useFocusTrap(isDropDownOpen);
337
- const dataListHeaderTileRef = React__default["default"].useRef(null);
338
+ const dataListHeaderTileRef = React.useRef(null);
338
339
  const sortableItem = sorting === null || sorting === void 0 ? void 0 : sorting.sortable.find(item => item.key === headerKey);
339
340
  const isSortable = Boolean(sortableItem);
340
341
  const sortingState = sorting === null || sorting === void 0 ? void 0 : sorting.state;
@@ -344,15 +345,15 @@ function DataListHeaderTile({ headers, headerKey, visible = false, }) {
344
345
  }), onClick: handleOnClick, ref: dataListHeaderTileRef },
345
346
  React__default["default"].createElement(Text.Text, { maxLines: "single" }, headers[headerKey]),
346
347
  isSortable && (sortableItem === null || sortableItem === void 0 ? void 0 : sortableItem.options) && isDropDownOpen && (React__default["default"].createElement(DataListSortingOptions, { options: sortableItem.options, selectedOption: (sorting === null || sorting === void 0 ? void 0 : sorting.state) || null, onSelectChange: handleSelectChange, onClose: () => setIsDropDownOpen(false), optionsListRef: optionsListRef, dataListHeaderTileRef: dataListHeaderTileRef })),
347
- (sortingState === null || sortingState === void 0 ? void 0 : sortingState.key) === headerKey ? (React__default["default"].createElement(DataListSortingArrows, { order: sortingState.order })) : (sortingState === null || sortingState === void 0 ? void 0 : sortingState.key) !== headerKey && isSortable ? (React__default["default"].createElement(DataListSortingArrows, { order: "none" })) : null));
348
- function toggleSorting(newSortingKey, newId, newLabel, newOrder) {
348
+ isSortable && (React__default["default"].createElement(DataListSortingArrows, { order: (sortingState === null || sortingState === void 0 ? void 0 : sortingState.key) === headerKey ? sortingState.order : "none" }))));
349
+ function toggleSorting(newSortingKey, newId, newLabel) {
349
350
  const isSameKey = newSortingKey === (sortingState === null || sortingState === void 0 ? void 0 : sortingState.key);
350
351
  const isDescending = (sortingState === null || sortingState === void 0 ? void 0 : sortingState.order) === "desc";
351
- if (isSameKey && isDescending && newOrder === undefined) {
352
+ if (isSameKey && isDescending) {
352
353
  sorting === null || sorting === void 0 ? void 0 : sorting.onSort(undefined);
353
354
  return;
354
355
  }
355
- const sortingOrder = newOrder || (isSameKey && !isDescending ? "desc" : "asc");
356
+ const sortingOrder = isSameKey ? "desc" : "asc";
356
357
  setSorting(newSortingKey, newId, newLabel, sortingOrder);
357
358
  }
358
359
  function setSorting(newSortingKey, newId, newLabel, newOrder) {
@@ -371,11 +372,8 @@ function DataListHeaderTile({ headers, headerKey, visible = false, }) {
371
372
  setIsDropDownOpen(!isDropDownOpen);
372
373
  }
373
374
  else {
374
- const headerValue = headers[headerKey];
375
375
  const id = ((_b = (_a = sortableItem === null || sortableItem === void 0 ? void 0 : sortableItem.options) === null || _a === void 0 ? void 0 : _a[0]) === null || _b === void 0 ? void 0 : _b.id) || headerKey;
376
- if (headerValue !== undefined) {
377
- toggleSorting(id, headerKey, headerValue);
378
- }
376
+ toggleSorting(id, headerKey, headers[headerKey]);
379
377
  }
380
378
  }
381
379
  function handleSelectChange(newSortOption) {
@@ -1019,7 +1017,7 @@ function DataListStickyHeader({ children }) {
1019
1017
  ref.current && observer.unobserve(ref.current);
1020
1018
  };
1021
1019
  }, [handleObserver, ref.current]);
1022
- return (React__default["default"].createElement("div", { ref: ref, className: classnames__default["default"](styles$5.header, { [styles$5.stuck]: isStuck }) }, children));
1020
+ return (React__default["default"].createElement("div", { "data-testid": DATA_LIST_STICKY_HEADER_TEST_ID, ref: ref, className: classnames__default["default"](styles$5.header, { [styles$5.stuck]: isStuck }) }, children));
1023
1021
  }
1024
1022
 
1025
1023
  var css_248z$4 = ".tj0MOMhLEEY- {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-align: center;\n align-items: center;\n}\n\n.SaPMOnvw-3c- {\n --transition-properties: var(--timing-base) ease-in-out;\n --button-offset: calc(var(--space-largest) - var(--space-smaller));\n\n position: absolute;\n top: 50%;\n right: calc((16px * 3) - (16px / 4));\n right: calc(calc(16px * 3) - calc(16px / 4));\n right: var(--button-offset);\n visibility: hidden;\n width: 0;\n padding: calc(16px / 4) 0;\n padding: var(--space-smaller) 0;\n background-color: rgba(255, 255, 255, 1);\n background-color: var(--color-surface);\n opacity: 0;\n -webkit-transform: translateY(-50%);\n transform: translateY(-50%);\n transition: opacity 200ms ease-in-out,\n width 200ms ease-in-out, visibility 200ms ease-in-out;\n transition: opacity var(--transition-properties),\n width var(--transition-properties), visibility var(--transition-properties);\n}\n\n._3S1-91v2SYI- {\n visibility: visible;\n width: calc(100% - var(--button-offset));\n opacity: 1;\n}\n\n@media (min-width: 768px) {\n\n.SaPMOnvw-3c-,\n._3S1-91v2SYI- {\n position: static;\n visibility: visible;\n width: auto;\n padding: 0;\n background-color: transparent;\n opacity: 1;\n -webkit-transform: none;\n transform: none;\n transition: none;\n}\n }\n\n@media (--medium-screens-and-up) {\n\n.SaPMOnvw-3c-,\n._3S1-91v2SYI- {\n position: static;\n visibility: visible;\n width: auto;\n padding: 0;\n background-color: transparent;\n opacity: 1;\n -webkit-transform: none;\n transform: none;\n transition: none;\n}\n }\n\n._9GlBktsUALw- {\n display: block;\n}\n\n@media (min-width: 768px) {\n\n._9GlBktsUALw- {\n display: none;\n}\n }\n\n@media (--medium-screens-and-up) {\n\n._9GlBktsUALw- {\n display: none;\n}\n }\n\n/*\n * No Filters Styling\n *\n * When there are no filters, the search input is always visible.\n * ------------------------------------------------------------------------- */\n\n._3Pjrt42x454- .SaPMOnvw-3c- {\n position: static;\n visibility: visible;\n width: auto;\n opacity: 1;\n transition: none;\n}\n\n@media (min-width: 768px) {\n\n._3Pjrt42x454- .SaPMOnvw-3c- {\n max-width: 30%;\n}\n }\n\n@media (--medium-screens-and-up) {\n\n._3Pjrt42x454- .SaPMOnvw-3c- {\n max-width: 30%;\n}\n }\n\n._3Pjrt42x454- ._9GlBktsUALw- {\n display: none;\n}\n";
@@ -1233,6 +1231,7 @@ function DataList(_a) {
1233
1231
  const emptyStateComponents = getCompoundComponents(props.children, DataListEmptyState);
1234
1232
  const itemActionComponent = getCompoundComponent(props.children, DataListItemActions);
1235
1233
  const bulkActionsComponent = getCompoundComponent(props.children, DataListBulkActions);
1234
+ const shouldRenderStickyHeader = !!filterComponent || !!searchComponent;
1236
1235
  return (React__default["default"].createElement(DataListContext.Provider, { value: Object.assign(Object.assign({ searchComponent,
1237
1236
  filterComponent,
1238
1237
  layoutComponents,
@@ -1245,7 +1244,7 @@ function DataList(_a) {
1245
1244
  registerLayout }, props), { selected,
1246
1245
  // T !== DataListObject
1247
1246
  sorting: sorting }) },
1248
- React__default["default"].createElement(InternalDataList, null)));
1247
+ React__default["default"].createElement(InternalDataList, { shouldRenderStickyHeader: shouldRenderStickyHeader })));
1249
1248
  function registerLayoutBreakpoints(size) {
1250
1249
  setLayoutBreakpoints(prev => sortBreakpoints([...prev, size]));
1251
1250
  }
@@ -1253,7 +1252,7 @@ function DataList(_a) {
1253
1252
  setLayouts(prev => (Object.assign(Object.assign({}, prev), { [size]: children })));
1254
1253
  }
1255
1254
  }
1256
- function InternalDataList() {
1255
+ function InternalDataList({ shouldRenderStickyHeader, }) {
1257
1256
  const { data, title, totalCount, loadingState = "none", layoutComponents, } = useDataListContext();
1258
1257
  const backToTopRef = React.useRef(null);
1259
1258
  const initialLoading = loadingState === "initial";
@@ -1264,12 +1263,12 @@ function InternalDataList() {
1264
1263
  title && React__default["default"].createElement(Heading.Heading, { level: 3 }, title),
1265
1264
  React__default["default"].createElement(DataListTotalCount, { totalCount: totalCount, loading: initialLoading })),
1266
1265
  React__default["default"].createElement("div", { ref: backToTopRef }),
1267
- React__default["default"].createElement(DataListStickyHeader, null,
1266
+ shouldRenderStickyHeader && (React__default["default"].createElement(DataListStickyHeader, null,
1268
1267
  React__default["default"].createElement("div", { className: styles$g.headerFilters },
1269
1268
  React__default["default"].createElement(InternalDataListFilters, null),
1270
1269
  React__default["default"].createElement(InternalDataListSearch, null)),
1271
1270
  React__default["default"].createElement(InternalDataListStatusBar, null),
1272
- React__default["default"].createElement(DataListHeader, null)),
1271
+ React__default["default"].createElement(DataListHeader, null))),
1273
1272
  initialLoading && React__default["default"].createElement(DataListLoadingState, null),
1274
1273
  showEmptyState && React__default["default"].createElement(InternalDataListEmptyState, null),
1275
1274
  layoutComponents,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jobber/components",
3
- "version": "4.78.3",
3
+ "version": "4.78.5-JOB-86464.6+7e7ac9fa",
4
4
  "license": "MIT",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -20,7 +20,7 @@
20
20
  ],
21
21
  "dependencies": {
22
22
  "@jobber/design": "^0.53.0",
23
- "@jobber/formatters": "*",
23
+ "@jobber/formatters": "^0.2.2",
24
24
  "@jobber/hooks": "^2.8.2",
25
25
  "@popperjs/core": "^2.0.6",
26
26
  "@std-proposal/temporal": "0.0.1",
@@ -84,5 +84,5 @@
84
84
  "> 1%",
85
85
  "IE 10"
86
86
  ],
87
- "gitHead": "3caaa43e03388b7d034d0606dc803218394929c2"
87
+ "gitHead": "7e7ac9fa0bde548e99b05903093a6de447884f63"
88
88
  }