@shipengine/elements 2.21.0 → 2.23.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 (129) hide show
  1. package/cjs/components/grid-controller/grid-controller.cjs +49 -17
  2. package/cjs/components/grid-controller/grid-controller.styles.cjs +7 -2
  3. package/cjs/components/grid-controller/grid-footer.cjs +30 -15
  4. package/cjs/components/grid-controller/grid-footer.styles.cjs +24 -0
  5. package/cjs/components/grid-controller/index.cjs +1 -1
  6. package/cjs/components/grid-controller/sortable-header/index.cjs +9 -0
  7. package/cjs/components/grid-controller/{sortable-header.cjs → sortable-header/sortable-header.cjs} +3 -5
  8. package/cjs/components/grid-controller/sortable-header/sortable-header.styles.cjs +18 -0
  9. package/cjs/components/grid-filters/components/created-date-filter/created-date-filter.cjs +3 -0
  10. package/cjs/components/grid-filters/components/index.cjs +2 -0
  11. package/cjs/components/grid-filters/components/label-id-filter/label-id-filter.cjs +2 -0
  12. package/cjs/components/grid-filters/components/label-status-filter/index.cjs +9 -0
  13. package/cjs/components/grid-filters/components/label-status-filter/label-status-filter-schema.cjs +12 -0
  14. package/cjs/components/grid-filters/components/label-status-filter/label-status-filter.cjs +174 -0
  15. package/cjs/components/grid-filters/components/label-status-filter/label-status-filter.styles.cjs +21 -0
  16. package/cjs/components/grid-filters/components/shipment-id-filter/shipment-id-filter.cjs +2 -0
  17. package/cjs/components/grid-filters/components/tracking-status-filter/tracking-status-filter.cjs +23 -12
  18. package/cjs/components/grid-filters/grid-filters.cjs +12 -1
  19. package/cjs/elements/labels-grid/hooks/use-labels-grid.cjs +78 -31
  20. package/cjs/elements/labels-grid/hooks/use-tracking-status-filter.cjs +109 -0
  21. package/cjs/elements/labels-grid/labels-grid.cjs +56 -30
  22. package/cjs/elements/purchase-label/components/customs-forms/customs-forms.cjs +10 -3
  23. package/cjs/elements/purchase-label/components/fund-and-purchase/fund-and-purchase.cjs +22 -14
  24. package/cjs/elements/purchase-label/components/rate-form/rate-form.cjs +1 -1
  25. package/cjs/elements/purchase-label/components/rate-form/rate-view.cjs +4 -9
  26. package/cjs/elements/purchase-label/components/shipment-form/shipment-form.cjs +11 -5
  27. package/cjs/elements/purchase-label/configure-shipment.cjs +3 -1
  28. package/cjs/elements/purchase-label/hooks/use-rates-form.cjs +38 -16
  29. package/cjs/elements/purchase-label/purchase-label.cjs +0 -1
  30. package/cjs/elements/shipments-grid/hooks/use-shipments-grid.cjs +11 -6
  31. package/cjs/elements/shipments-grid/shipments-grid.cjs +67 -28
  32. package/cjs/hooks/index.cjs +3 -0
  33. package/cjs/hooks/use-configure-shipment.cjs +1 -34
  34. package/cjs/hooks/use-sortable-query.cjs +36 -0
  35. package/cjs/index.cjs +5 -0
  36. package/cjs/locales/en/common.cjs +3 -1
  37. package/cjs/locales/en/purchase-label.cjs +2 -1
  38. package/cjs/package.cjs +1 -1
  39. package/cjs/utilities/feature-flags/feature-flags.cjs +1 -1
  40. package/cjs/workflows/label-workflow/label-workflow.cjs +0 -1
  41. package/esm/components/grid-controller/grid-controller.js +51 -19
  42. package/esm/components/grid-controller/grid-controller.styles.js +7 -2
  43. package/esm/components/grid-controller/grid-footer.js +32 -17
  44. package/esm/components/grid-controller/grid-footer.styles.js +20 -0
  45. package/esm/components/grid-controller/index.js +1 -1
  46. package/esm/components/grid-controller/sortable-header/index.js +1 -0
  47. package/esm/components/grid-controller/{sortable-header.js → sortable-header/sortable-header.js} +3 -5
  48. package/esm/components/grid-controller/sortable-header/sortable-header.styles.js +14 -0
  49. package/esm/components/grid-filters/components/created-date-filter/created-date-filter.js +3 -0
  50. package/esm/components/grid-filters/components/index.js +1 -0
  51. package/esm/components/grid-filters/components/label-id-filter/label-id-filter.js +2 -0
  52. package/esm/components/grid-filters/components/label-status-filter/index.js +1 -0
  53. package/esm/components/grid-filters/components/label-status-filter/label-status-filter-schema.js +8 -0
  54. package/esm/components/grid-filters/components/label-status-filter/label-status-filter.js +170 -0
  55. package/esm/components/grid-filters/components/label-status-filter/label-status-filter.styles.js +17 -0
  56. package/esm/components/grid-filters/components/shipment-id-filter/shipment-id-filter.js +2 -0
  57. package/esm/components/grid-filters/components/tracking-status-filter/tracking-status-filter.js +23 -12
  58. package/esm/components/grid-filters/grid-filters.js +12 -1
  59. package/esm/elements/labels-grid/hooks/use-labels-grid.js +79 -32
  60. package/esm/elements/labels-grid/hooks/use-tracking-status-filter.js +105 -0
  61. package/esm/elements/labels-grid/labels-grid.js +57 -31
  62. package/esm/elements/purchase-label/components/customs-forms/customs-forms.js +10 -3
  63. package/esm/elements/purchase-label/components/fund-and-purchase/fund-and-purchase.js +22 -14
  64. package/esm/elements/purchase-label/components/rate-form/rate-form.js +1 -1
  65. package/esm/elements/purchase-label/components/rate-form/rate-view.js +4 -9
  66. package/esm/elements/purchase-label/components/shipment-form/shipment-form.js +11 -5
  67. package/esm/elements/purchase-label/configure-shipment.js +3 -1
  68. package/esm/elements/purchase-label/hooks/use-rates-form.js +38 -16
  69. package/esm/elements/purchase-label/purchase-label.js +0 -1
  70. package/esm/elements/shipments-grid/hooks/use-shipments-grid.js +11 -6
  71. package/esm/elements/shipments-grid/shipments-grid.js +68 -29
  72. package/esm/hooks/index.js +1 -0
  73. package/esm/hooks/use-configure-shipment.js +3 -36
  74. package/esm/hooks/use-sortable-query.js +32 -0
  75. package/esm/index.js +2 -0
  76. package/esm/locales/en/common.js +3 -1
  77. package/esm/locales/en/purchase-label.js +2 -1
  78. package/esm/package.js +1 -1
  79. package/esm/utilities/feature-flags/feature-flags.js +1 -1
  80. package/esm/workflows/label-workflow/label-workflow.js +0 -1
  81. package/package.json +15 -4
  82. package/types/src/components/grid-controller/grid-controller.d.ts +4 -1
  83. package/types/src/components/grid-controller/grid-controller.styles.d.ts +6 -1
  84. package/types/src/components/grid-controller/grid-footer.d.ts +9 -1
  85. package/types/src/components/grid-controller/grid-footer.styles.d.ts +16 -0
  86. package/types/src/components/grid-controller/sortable-header/index.d.ts +1 -0
  87. package/types/src/components/grid-controller/{sortable-header.d.ts → sortable-header/sortable-header.d.ts} +2 -2
  88. package/types/src/components/grid-controller/sortable-header/sortable-header.styles.d.ts +10 -0
  89. package/types/src/components/grid-filters/components/created-date-filter/created-date-filter.d.ts +2 -1
  90. package/types/src/components/grid-filters/components/index.d.ts +1 -0
  91. package/types/src/components/grid-filters/components/label-id-filter/label-id-filter.d.ts +2 -1
  92. package/types/src/components/grid-filters/components/label-status-filter/index.d.ts +1 -0
  93. package/types/src/components/grid-filters/components/label-status-filter/label-status-filter-schema.d.ts +12 -0
  94. package/types/src/components/grid-filters/components/label-status-filter/label-status-filter.d.ts +24 -0
  95. package/types/src/components/grid-filters/components/label-status-filter/label-status-filter.styles.d.ts +13 -0
  96. package/types/src/components/grid-filters/components/shipment-id-filter/shipment-id-filter.d.ts +2 -1
  97. package/types/src/components/grid-filters/components/tracking-status-filter/tracking-status-filter.d.ts +2 -1
  98. package/types/src/components/grid-filters/grid-filters.d.ts +4 -1
  99. package/types/src/elements/labels-grid/hooks/use-labels-grid.d.ts +5 -3
  100. package/types/src/elements/labels-grid/hooks/use-tracking-status-filter.d.ts +25 -0
  101. package/types/src/elements/labels-grid/labels-grid.d.ts +34 -20
  102. package/types/src/elements/manage-carriers/manage-carriers.d.ts +3 -0
  103. package/types/src/elements/manage-external-carriers/manage-external-carriers.d.ts +3 -0
  104. package/types/src/elements/manage-funding/manage-funding-element.d.ts +3 -0
  105. package/types/src/elements/manage-warehouses/manage-warehouses.d.ts +3 -0
  106. package/types/src/elements/payment-method-settings/payment-method-settings-element.d.ts +3 -0
  107. package/types/src/elements/purchase-label/components/fund-and-purchase/fund-and-purchase.d.ts +2 -2
  108. package/types/src/elements/purchase-label/hooks/use-rates-form.d.ts +1 -0
  109. package/types/src/elements/purchase-label/purchase-label.d.ts +12 -9
  110. package/types/src/elements/select-label-layout/select-label-layout-element.d.ts +3 -0
  111. package/types/src/elements/shipment-summary/shipment-summary.d.ts +3 -0
  112. package/types/src/elements/shipments-grid/hooks/use-shipments-grid.d.ts +13 -2
  113. package/types/src/elements/shipments-grid/shipments-grid.d.ts +41 -6
  114. package/types/src/elements/theme-creator/theme-creator.d.ts +3 -0
  115. package/types/src/elements/transaction-history/transaction-history-element.d.ts +3 -0
  116. package/types/src/elements/unit-settings/unit-settings-element.d.ts +3 -0
  117. package/types/src/elements/vat-settings/vat-settings-element.d.ts +3 -0
  118. package/types/src/elements/void-label/void-label.d.ts +34 -0
  119. package/types/src/hooks/index.d.ts +1 -0
  120. package/types/src/hooks/use-configure-shipment.d.ts +1 -2
  121. package/types/src/hooks/use-sortable-query.d.ts +13 -0
  122. package/types/src/index.d.ts +5 -0
  123. package/types/src/locales/en/index.d.ts +3 -0
  124. package/types/src/utilities/feature-flags/types.d.ts +5 -1
  125. package/types/src/workflows/account-settings/account-settings.d.ts +3 -0
  126. package/types/src/workflows/carrier-services/carrier-services.d.ts +3 -0
  127. package/types/src/workflows/connect-external-carrier/connect-external-carrier.d.ts +3 -0
  128. package/types/src/workflows/label-workflow/label-workflow.d.ts +11 -1
  129. package/types/src/workflows/onboarding/onboarding.d.ts +3 -0
@@ -21,15 +21,33 @@ const GridController = ({
21
21
  data,
22
22
  footerContent,
23
23
  onRowClick,
24
+ isLoading: _isLoading = false,
24
25
  useCheckboxes: _useCheckboxes = false,
25
26
  filters,
26
27
  emptyContent
27
28
  }) => {
28
29
  var _a, _b, _c;
29
30
  const [isChecked, setIsChecked] = React.useState((_a = data === null || data === void 0 ? void 0 : data.map(() => false)) !== null && _a !== void 0 ? _a : []);
30
- const getColumnHeaderContents = () => {
31
- return columns.map(column => column.headerContent);
32
- };
31
+ const columnHeaderContents = React.useMemo(() => columns.map(column => column.headerContent), [columns]);
32
+ const loadingRows = React.useMemo(() => {
33
+ const items = [];
34
+ for (let index = 0; index < 5; index++) {
35
+ items.push(jsxRuntime.jsx(giger.TableRow, Object.assign({
36
+ css: gridController_styles.styles.skeletonTableRow,
37
+ withHover: false
38
+ }, {
39
+ children: columnHeaderContents.map((item, index) => jsxRuntime.jsx(giger.TableBodyCell, {
40
+ children: item && jsxRuntime.jsx(giger.Skeleton, {
41
+ animation: giger.SkeletonAnimation.WAVE,
42
+ height: 16,
43
+ variant: giger.SkeletonVariant.RECT,
44
+ width: 72
45
+ })
46
+ }, index))
47
+ }), `loading-row-${index}`));
48
+ }
49
+ return items;
50
+ }, [columnHeaderContents]);
33
51
  const isAllChecked = React.useMemo(() => isChecked.length > 0 && isChecked.every(check => check), [isChecked]);
34
52
  const isIndeterminate = React.useMemo(() => isChecked.some(check => check), [isChecked]);
35
53
  const toggleCheckbox = React.useCallback(index => {
@@ -55,7 +73,7 @@ const GridController = ({
55
73
  children: filters
56
74
  })), data.length === 0 && emptyContent ? emptyContent : jsxRuntime.jsx(giger.Table, Object.assign({
57
75
  "data-testid": "grid",
58
- footer: footerContent && jsxRuntime.jsx(giger.TableFooter, Object.assign({
76
+ footer: footerContent && !_isLoading && jsxRuntime.jsx(giger.TableFooter, Object.assign({
59
77
  css: gridController_styles.styles.tableFooter
60
78
  }, {
61
79
  children: footerContent
@@ -70,7 +88,7 @@ const GridController = ({
70
88
  indeterminate: (_c = !isAllChecked && isIndeterminate) !== null && _c !== void 0 ? _c : false,
71
89
  onChange: event => toggleAllCheckboxes(event.target.checked)
72
90
  })
73
- })), getColumnHeaderContents().map((header, index) => jsxRuntime.jsx(giger.TableHeaderCell, Object.assign({
91
+ })), columnHeaderContents.map((header, index) => jsxRuntime.jsx(giger.TableHeaderCell, Object.assign({
74
92
  css: gridController_styles.styles.tableHeader
75
93
  }, {
76
94
  children: header
@@ -81,27 +99,41 @@ const GridController = ({
81
99
  tableStyles: gridController_styles.styles.table
82
100
  }, {
83
101
  children: jsxRuntime.jsx(giger.TableBody, {
84
- children: data.map((row, index) => {
102
+ children: _isLoading ? loadingRows : data.map((row, rowIndex) => {
85
103
  var _a;
86
- const allowOnClick = !!onRowClick && !(row === null || row === void 0 ? void 0 : row.disableOnRowClick);
104
+ const allowOnClick = !!onRowClick && !(row === null || row === void 0 ? void 0 : row.disableOnRowClick) || !row.isLoading;
87
105
  return jsxRuntime.jsxs(giger.TableRow, Object.assign({
106
+ css: row.isLoading && gridController_styles.styles.skeletonTableRow,
88
107
  "data-testid": "grid-row",
89
- onClick: allowOnClick ? () => onRowClick(row) : undefined,
90
- withHover: !(row === null || row === void 0 ? void 0 : row.disableOnRowClick)
108
+ onClick: allowOnClick ? () => onRowClick === null || onRowClick === void 0 ? void 0 : onRowClick(row) : undefined,
109
+ withHover: allowOnClick
91
110
  }, {
92
111
  children: [_useCheckboxes && jsxRuntime.jsx(giger.TableBodyCell, Object.assign({
93
112
  css: row === null || row === void 0 ? void 0 : row.bodyCellStyles
94
113
  }, {
95
114
  children: jsxRuntime.jsx(giger.Checkbox, {
96
- checked: (_a = isChecked[index]) !== null && _a !== void 0 ? _a : false,
97
- onChange: () => toggleCheckbox(index)
115
+ checked: (_a = isChecked[rowIndex]) !== null && _a !== void 0 ? _a : false,
116
+ onChange: () => toggleCheckbox(rowIndex)
98
117
  })
99
- })), columns.filter(column => column.renderCellContent).map((column, index) => jsxRuntime.jsx(giger.TableBodyCell, Object.assign({
100
- css: row === null || row === void 0 ? void 0 : row.bodyCellStyles
101
- }, {
102
- children: column.renderCellContent(row)
103
- }), index))]
104
- }), index);
118
+ })), columns.filter(column => column.renderCellContent).map((column, index) => {
119
+ if (row.isLoading) {
120
+ return jsxRuntime.jsx(giger.TableBodyCell, Object.assign({
121
+ css: row === null || row === void 0 ? void 0 : row.bodyCellStyles
122
+ }, {
123
+ children: jsxRuntime.jsx(giger.Skeleton, {
124
+ animation: giger.SkeletonAnimation.WAVE,
125
+ height: 24,
126
+ variant: giger.SkeletonVariant.RECT
127
+ })
128
+ }), index);
129
+ }
130
+ return jsxRuntime.jsx(giger.TableBodyCell, Object.assign({
131
+ css: row === null || row === void 0 ? void 0 : row.bodyCellStyles
132
+ }, {
133
+ children: column.renderCellContent(row)
134
+ }), index);
135
+ })]
136
+ }), rowIndex);
105
137
  })
106
138
  })
107
139
  }))]
@@ -9,8 +9,12 @@ const styles = styles$1.createStyles({
9
9
  width: styles$1.scopeTheme(theme).spacing(6)
10
10
  }),
11
11
  filters: theme => ({
12
+ backgroundColor: styles$1.scopeTheme(theme).palette.white,
12
13
  borderBottom: `1px solid ${styles$1.scopeTheme(theme).palette.gray[200]}`,
13
- padding: `${styles$1.scopeTheme(theme).spacing()}px ${styles$1.scopeTheme(theme).spacing(2)}px`
14
+ padding: styles$1.scopeTheme(theme).spacing()
15
+ }),
16
+ skeletonTableRow: () => ({
17
+ height: "68px"
14
18
  }),
15
19
  table: {
16
20
  tableLayout: "initial"
@@ -26,7 +30,8 @@ const styles = styles$1.createStyles({
26
30
  border: "none"
27
31
  },
28
32
  wrapper: theme => Object.assign({
29
- height: "auto"
33
+ height: "auto",
34
+ overflow: "hidden"
30
35
  }, styles$1.scopeTheme(theme).getComponentOverride("Table"))
31
36
  });
32
37
 
@@ -5,6 +5,8 @@ Object.defineProperty(exports, '__esModule', { value: true });
5
5
  var jsxRuntime = require('@emotion/react/jsx-runtime');
6
6
  var reactI18next = require('react-i18next');
7
7
  var giger = require('@shipengine/giger');
8
+ var gridFooter_styles = require('./grid-footer.styles.cjs');
9
+ var loader = require('../loader/loader.cjs');
8
10
 
9
11
  /**
10
12
  * @internal
@@ -21,30 +23,43 @@ const GridFooter = ({
21
23
  pageSize,
22
24
  total,
23
25
  showPagination,
24
- onPageChange
26
+ onPageChange,
27
+ isLoadingMore,
28
+ hasMoreUnfetchedResults
25
29
  }) => {
26
30
  const firstElementInPage = (page - 1) * pageSize + 1;
27
31
  const lastElementInPage = Math.min(page * pageSize, total);
28
- return jsxRuntime.jsxs(jsxRuntime.Fragment, {
29
- children: [jsxRuntime.jsx(giger.Typography, Object.assign({
30
- component: "span",
31
- variant: "body2"
32
+ return jsxRuntime.jsxs("div", Object.assign({
33
+ css: gridFooter_styles.styles.wrapper
34
+ }, {
35
+ children: [jsxRuntime.jsxs("div", Object.assign({
36
+ css: gridFooter_styles.styles.countWrapper
32
37
  }, {
33
- children: jsxRuntime.jsx(reactI18next.Trans, {
34
- components: [jsxRuntime.jsx("b", {})],
35
- count: total,
36
- i18nKey: "common:grid.row-count",
37
- values: {
38
- firstIndex: firstElementInPage,
39
- lastIndex: lastElementInPage
40
- }
41
- })
38
+ children: [firstElementInPage > 0 && jsxRuntime.jsx(giger.Typography, Object.assign({
39
+ component: "span",
40
+ variant: "body2"
41
+ }, {
42
+ children: jsxRuntime.jsx(reactI18next.Trans, {
43
+ components: [jsxRuntime.jsx("b", {})],
44
+ count: total,
45
+ i18nKey: hasMoreUnfetchedResults && total > 1 ? "common:grid.row-count-plus_other" : "common:grid.row-count",
46
+ values: {
47
+ firstIndex: firstElementInPage,
48
+ lastIndex: lastElementInPage
49
+ }
50
+ })
51
+ })), isLoadingMore && jsxRuntime.jsx("div", {
52
+ children: jsxRuntime.jsx(loader.Loader, {
53
+ css: gridFooter_styles.styles.loader,
54
+ size: giger.SpinnerSize.SIZE_SMALL
55
+ })
56
+ })]
42
57
  })), showPagination && jsxRuntime.jsx(giger.Pagination, {
43
58
  currentPage: page,
44
59
  onPageChange: onPageChange,
45
60
  totalPages: pages
46
61
  })]
47
- });
62
+ }));
48
63
  };
49
64
 
50
65
  exports.GridFooter = GridFooter;
@@ -0,0 +1,24 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var styles$1 = require('../../utilities/styles.cjs');
6
+
7
+ const styles = styles$1.createStyles({
8
+ countWrapper: theme => ({
9
+ alignItems: "center",
10
+ display: "flex",
11
+ gap: styles$1.scopeTheme(theme).spacing(1)
12
+ }),
13
+ loader: theme => ({
14
+ color: styles$1.scopeTheme(theme).palette.gray.main
15
+ }),
16
+ wrapper: {
17
+ alignItems: "center",
18
+ display: "flex",
19
+ justifyContent: "space-between",
20
+ width: "100%"
21
+ }
22
+ });
23
+
24
+ exports.styles = styles;
@@ -5,7 +5,7 @@ Object.defineProperty(exports, '__esModule', { value: true });
5
5
  var gridController = require('./grid-controller.cjs');
6
6
  var cellFormattedDate = require('./cell-formatted-date.cjs');
7
7
  var gridFooter = require('./grid-footer.cjs');
8
- var sortableHeader = require('./sortable-header.cjs');
8
+ var sortableHeader = require('./sortable-header/sortable-header.cjs');
9
9
 
10
10
 
11
11
 
@@ -0,0 +1,9 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var sortableHeader = require('./sortable-header.cjs');
6
+
7
+
8
+
9
+ exports.SortableHeader = sortableHeader.SortableHeader;
@@ -5,6 +5,7 @@ Object.defineProperty(exports, '__esModule', { value: true });
5
5
  var jsxRuntime = require('@emotion/react/jsx-runtime');
6
6
  var giger = require('@shipengine/giger');
7
7
  var gigerTheme = require('@shipengine/giger-theme');
8
+ var sortableHeader_styles = require('./sortable-header.styles.cjs');
8
9
 
9
10
  /**
10
11
  * A reusable component for creating sortable table headers
@@ -23,17 +24,14 @@ const SortableHeader = ({
23
24
  };
24
25
  return jsxRuntime.jsxs("span", Object.assign({
25
26
  "aria-label": headerText,
26
- css: {
27
- alignItems: "center",
28
- cursor: "pointer",
29
- display: "flex"
30
- },
27
+ css: sortableHeader_styles.styles.span,
31
28
  onClick: onToggleSort,
32
29
  onKeyDown: handleKeyDown,
33
30
  role: "button",
34
31
  tabIndex: 0
35
32
  }, {
36
33
  children: [headerText, jsxRuntime.jsx(giger.Icon, {
34
+ css: sortableHeader_styles.styles.icon,
37
35
  name: sortDirection === "desc" ? gigerTheme.IconNames.SORT_BOTTOM : gigerTheme.IconNames.SORT_TOP,
38
36
  size: giger.IconSize.SIZE_SMALL
39
37
  })]
@@ -0,0 +1,18 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var styles$1 = require('../../../utilities/styles.cjs');
6
+
7
+ const styles = styles$1.createStyles({
8
+ icon: theme => ({
9
+ paddingLeft: styles$1.scopeTheme(theme).spacing()
10
+ }),
11
+ span: () => ({
12
+ alignItems: "center",
13
+ cursor: "pointer",
14
+ display: "flex"
15
+ })
16
+ });
17
+
18
+ exports.styles = styles;
@@ -24,6 +24,7 @@ var elementsContextProvider = require('../../../../elements-provider/elements-co
24
24
  * @see {@link CreatedDateFilterProps | The props for the `<CreatedDateFilter />` component}
25
25
  */
26
26
  const CreatedDateFilter = ({
27
+ disabled: _disabled = false,
27
28
  filters,
28
29
  onFiltersUpdated
29
30
  }) => {
@@ -105,6 +106,7 @@ const CreatedDateFilter = ({
105
106
  }, [filters.createdDate]);
106
107
  return ((_a = filters.createdDate) === null || _a === void 0 ? void 0 : _a.value) ? jsxRuntime.jsxs(giger.Button, Object.assign({
107
108
  css: createdDateFilter_styles.styles.mainButton,
109
+ disabled: _disabled,
108
110
  onClick: onFilterClear,
109
111
  variant: giger.ButtonVariant.TEXT
110
112
  }, {
@@ -123,6 +125,7 @@ const CreatedDateFilter = ({
123
125
  })) : jsxRuntime.jsxs(jsxRuntime.Fragment, {
124
126
  children: [jsxRuntime.jsxs(giger.Button, Object.assign({
125
127
  css: createdDateFilter_styles.styles.mainButton,
128
+ disabled: _disabled,
126
129
  onClick: onToggleCreatedDateFilter,
127
130
  ref: buttonRef,
128
131
  variant: giger.ButtonVariant.TEXT
@@ -5,6 +5,7 @@ Object.defineProperty(exports, '__esModule', { value: true });
5
5
  var shipmentIdFilter = require('./shipment-id-filter/shipment-id-filter.cjs');
6
6
  var createdDateFilter = require('./created-date-filter/created-date-filter.cjs');
7
7
  var labelIdFilter = require('./label-id-filter/label-id-filter.cjs');
8
+ var labelStatusFilter = require('./label-status-filter/label-status-filter.cjs');
8
9
  var trackingStatusFilter = require('./tracking-status-filter/tracking-status-filter.cjs');
9
10
 
10
11
 
@@ -12,4 +13,5 @@ var trackingStatusFilter = require('./tracking-status-filter/tracking-status-fil
12
13
  exports.ShipmentIdFilter = shipmentIdFilter.ShipmentIdFilter;
13
14
  exports.CreatedDateFilter = createdDateFilter.CreatedDateFilter;
14
15
  exports.LabelIdFilter = labelIdFilter.LabelIdFilter;
16
+ exports.LabelStatusFilter = labelStatusFilter.LabelStatusFilter;
15
17
  exports.TrackingStatusFilter = trackingStatusFilter.TrackingStatusFilter;
@@ -27,6 +27,7 @@ var submitButton = require('../../../field/submit-button/submit-button.cjs');
27
27
  * @see {@link LabelIdFilterProps | The props for the `<LabelIdFilter />` component}
28
28
  */
29
29
  const LabelIdFilter = ({
30
+ disabled: _disabled = false,
30
31
  filters,
31
32
  onFiltersUpdated
32
33
  }) => {
@@ -62,6 +63,7 @@ const LabelIdFilter = ({
62
63
  jsxRuntime.jsx(jsxRuntime.Fragment, {
63
64
  children: jsxRuntime.jsxs(jsxRuntime.Fragment, {
64
65
  children: [jsxRuntime.jsx(giger.Button, Object.assign({
66
+ disabled: _disabled,
65
67
  onClick: toggleLabelIdFilter,
66
68
  ref: buttonRef,
67
69
  variant: giger.ButtonVariant.TEXT
@@ -0,0 +1,9 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var labelStatusFilter = require('./label-status-filter.cjs');
6
+
7
+
8
+
9
+ exports.LabelStatusFilter = labelStatusFilter.LabelStatusFilter;
@@ -0,0 +1,12 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var zod = require('zod');
6
+
7
+ const labelStatusFormSchema = zod.z.object({
8
+ labelStatus: zod.z.union([zod.z.literal("completed"), zod.z.literal("error"), zod.z.literal("processing"), zod.z.literal("voided"), zod.z.literal("") // Empty string for no selection
9
+ ])
10
+ });
11
+
12
+ exports.labelStatusFormSchema = labelStatusFormSchema;
@@ -0,0 +1,174 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var jsxRuntime = require('@emotion/react/jsx-runtime');
6
+ var validation = require('../../../../utilities/validation.cjs');
7
+ var React = require('react');
8
+ var reactHookForm = require('react-hook-form');
9
+ var reactI18next = require('react-i18next');
10
+ var reactUse = require('react-use');
11
+ var giger = require('@shipengine/giger');
12
+ var gigerTheme = require('@shipengine/giger-theme');
13
+ var labelStatusFilterSchema = require('./label-status-filter-schema.cjs');
14
+ var labelStatusFilter_styles = require('./label-status-filter.styles.cjs');
15
+
16
+ /**
17
+ * @internal
18
+ *
19
+ * # StatusFilter
20
+ *
21
+ * - The `<StatusFilter />` component handles the label status filter used in Labels Grid.
22
+ *
23
+ * @see {@link StatusFilterProps | The props for the `<StatusFilter />` component}
24
+ */
25
+ const LabelStatusFilter = ({
26
+ disabled: _disabled = false,
27
+ filters,
28
+ onFiltersUpdated
29
+ }) => {
30
+ var _a, _b, _c, _d, _e;
31
+ const {
32
+ t
33
+ } = reactI18next.useTranslation();
34
+ const [showLabelStatusFilter, toggleLabelStatusFilter] = reactUse.useToggle(false);
35
+ const [buttonText, setButtonText] = React.useState(((_a = filters === null || filters === void 0 ? void 0 : filters.status) === null || _a === void 0 ? void 0 : _a.nickname) || t("list-labels:headers.status"));
36
+ const buttonRef = React.useRef(null);
37
+ const form = reactHookForm.useForm({
38
+ defaultValues: {
39
+ labelStatus: ""
40
+ },
41
+ resolver: validation.validationResolver(labelStatusFilterSchema.labelStatusFormSchema)
42
+ });
43
+ const determineButtonText = React.useCallback(status => {
44
+ var _a, _b;
45
+ if (!status) {
46
+ return ((_a = filters === null || filters === void 0 ? void 0 : filters.status) === null || _a === void 0 ? void 0 : _a.nickname) || t("list-labels:headers.status");
47
+ }
48
+ return t("common:grid.filteredStatus", {
49
+ filter: t(`list-labels:status.${status}`),
50
+ name: ((_b = filters === null || filters === void 0 ? void 0 : filters.status) === null || _b === void 0 ? void 0 : _b.nickname) || t("list-labels:headers.status")
51
+ });
52
+ }, [t, (_b = filters === null || filters === void 0 ? void 0 : filters.status) === null || _b === void 0 ? void 0 : _b.nickname]);
53
+ React.useEffect(() => {
54
+ var _a;
55
+ // keep form in sync with filters
56
+ if ((_a = filters.status) === null || _a === void 0 ? void 0 : _a.value) {
57
+ form.reset({
58
+ labelStatus: filters.status.value
59
+ });
60
+ setButtonText(determineButtonText(filters.status.value));
61
+ } else {
62
+ // Reset to default when filter value is empty
63
+ form.reset({
64
+ labelStatus: ""
65
+ });
66
+ }
67
+ }, [determineButtonText, (_c = filters.status) === null || _c === void 0 ? void 0 : _c.value, form]);
68
+ const onClearFilters = React.useCallback(() => {
69
+ onFiltersUpdated(Object.assign(Object.assign({}, filters), {
70
+ status: Object.assign(Object.assign({}, filters.status), {
71
+ enabled: true,
72
+ value: ""
73
+ })
74
+ }));
75
+ // Reset the form
76
+ form.reset({
77
+ labelStatus: ""
78
+ });
79
+ showLabelStatusFilter && toggleLabelStatusFilter();
80
+ }, [filters, onFiltersUpdated, showLabelStatusFilter, toggleLabelStatusFilter, form]);
81
+ const handleRadioChange = e => {
82
+ const value = e.target.value;
83
+ form.setValue("labelStatus", value);
84
+ onFiltersUpdated(Object.assign(Object.assign({}, filters), {
85
+ status: Object.assign(Object.assign({}, filters.status), {
86
+ enabled: true,
87
+ value
88
+ })
89
+ }));
90
+ };
91
+ const watchedValue = form.watch("labelStatus");
92
+ const isRadioSelected = watchedValue !== undefined && watchedValue !== "";
93
+ return jsxRuntime.jsxs(jsxRuntime.Fragment, {
94
+ children: [jsxRuntime.jsxs(giger.Button, Object.assign({
95
+ disabled: _disabled,
96
+ onClick: toggleLabelStatusFilter,
97
+ ref: buttonRef,
98
+ variant: giger.ButtonVariant.TEXT
99
+ }, {
100
+ children: [isRadioSelected ? jsxRuntime.jsx("span", {
101
+ children: buttonText
102
+ }) : jsxRuntime.jsx("span", {
103
+ children: (_e = (_d = filters === null || filters === void 0 ? void 0 : filters.status) === null || _d === void 0 ? void 0 : _d.nickname) !== null && _e !== void 0 ? _e : t("list-labels:headers.status")
104
+ }), isRadioSelected ?
105
+ // Show Close Icon
106
+ jsxRuntime.jsx(giger.Icon, {
107
+ "aria-label": t("common:grid.clear"),
108
+ name: gigerTheme.IconNames.CLOSE,
109
+ onClick: e => {
110
+ e.stopPropagation();
111
+ onClearFilters();
112
+ },
113
+ onKeyDown: e => {
114
+ if (e.key === "Enter" || e.key === " ") {
115
+ e.stopPropagation();
116
+ onClearFilters();
117
+ }
118
+ },
119
+ role: "button",
120
+ size: giger.IconSize.SIZE_SMALL,
121
+ tabIndex: 0
122
+ }) : showLabelStatusFilter ? jsxRuntime.jsx(giger.Icon, {
123
+ name: gigerTheme.IconNames.CARET_TOP,
124
+ size: giger.IconSize.SIZE_SMALL
125
+ }) : jsxRuntime.jsx(giger.Icon, {
126
+ name: gigerTheme.IconNames.CARET_BOTTOM,
127
+ size: giger.IconSize.SIZE_SMALL
128
+ })]
129
+ })), jsxRuntime.jsx(giger.Popover, Object.assign({
130
+ isOpen: showLabelStatusFilter,
131
+ onClickAway: toggleLabelStatusFilter,
132
+ reference: buttonRef.current
133
+ }, {
134
+ children: jsxRuntime.jsxs("form", {
135
+ children: [jsxRuntime.jsxs(giger.RadioGroup, Object.assign({
136
+ css: labelStatusFilter_styles.styles.radioGroup,
137
+ name: "status",
138
+ onChange: handleRadioChange,
139
+ value: watchedValue
140
+ }, {
141
+ children: [jsxRuntime.jsx(giger.Radio, Object.assign({
142
+ value: "completed"
143
+ }, {
144
+ children: t("list-labels:status.completed")
145
+ })), jsxRuntime.jsx(giger.Radio, Object.assign({
146
+ value: "error"
147
+ }, {
148
+ children: t("list-labels:status.error")
149
+ })), jsxRuntime.jsx(giger.Radio, Object.assign({
150
+ value: "processing"
151
+ }, {
152
+ children: t("list-labels:status.processing")
153
+ })), jsxRuntime.jsx(giger.Radio, Object.assign({
154
+ value: "voided"
155
+ }, {
156
+ children: t("list-labels:status.voided")
157
+ }))]
158
+ })), isRadioSelected && jsxRuntime.jsx("div", Object.assign({
159
+ css: labelStatusFilter_styles.styles.buttons
160
+ }, {
161
+ children: jsxRuntime.jsx(giger.Button, Object.assign({
162
+ disabled: !isRadioSelected,
163
+ onClick: onClearFilters,
164
+ variant: giger.ButtonVariant.OUTLINED
165
+ }, {
166
+ children: t("common:grid.clear")
167
+ }))
168
+ }))]
169
+ })
170
+ }))]
171
+ });
172
+ };
173
+
174
+ exports.LabelStatusFilter = LabelStatusFilter;
@@ -0,0 +1,21 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var styles$1 = require('../../../../utilities/styles.cjs');
6
+
7
+ const styles = styles$1.createStyles({
8
+ buttons: theme => ({
9
+ display: "flex",
10
+ gap: styles$1.scopeTheme(theme).spacing(),
11
+ justifyContent: "end",
12
+ paddingTop: styles$1.scopeTheme(theme).spacing(2)
13
+ }),
14
+ radioGroup: theme => ({
15
+ display: "flex",
16
+ flexDirection: "column",
17
+ gap: styles$1.scopeTheme(theme).spacing(0.5)
18
+ })
19
+ });
20
+
21
+ exports.styles = styles;
@@ -27,6 +27,7 @@ var submitButton = require('../../../field/submit-button/submit-button.cjs');
27
27
  * @see {@link ShipmentIdFilterProps | The props for the `<ShipmentIdFilter />` component}
28
28
  */
29
29
  const ShipmentIdFilter = ({
30
+ disabled: _disabled = false,
30
31
  filters,
31
32
  onFiltersUpdated
32
33
  }) => {
@@ -61,6 +62,7 @@ const ShipmentIdFilter = ({
61
62
  children: jsxRuntime.jsxs(jsxRuntime.Fragment, {
62
63
  children: [jsxRuntime.jsx(giger.Button, Object.assign({
63
64
  css: shipmentIdFilter_styles.styles.mainButton,
65
+ disabled: _disabled,
64
66
  onClick: toggleShipmentIdFilter,
65
67
  ref: buttonRef,
66
68
  variant: giger.ButtonVariant.TEXT
@@ -25,10 +25,11 @@ var spacer = require('../../../spacer/spacer.cjs');
25
25
  * @see {@link TrackingStatusFilterProps | The props for the `<TrackingStatusFilter />` component}
26
26
  */
27
27
  const TrackingStatusFilter = ({
28
+ disabled: _disabled = false,
28
29
  filters,
29
30
  onFiltersUpdated
30
31
  }) => {
31
- var _a;
32
+ var _a, _b, _c, _d;
32
33
  const {
33
34
  t
34
35
  } = reactI18next.useTranslation();
@@ -45,21 +46,24 @@ const TrackingStatusFilter = ({
45
46
  },
46
47
  resolver: validation.validationResolver(trackingStatusFilterSchema.trackingStatusFormSchema)
47
48
  });
48
- const determineButtonText = React.useCallback(filters => {
49
- if (filters.length === 0) {
50
- return t("list-labels:headers.trackingStatus");
51
- } else if (filters.length === 1) {
49
+ const determineButtonText = React.useCallback(statuses => {
50
+ var _a, _b, _c;
51
+ if (statuses.length === 0) {
52
+ return ((_a = filters === null || filters === void 0 ? void 0 : filters.trackingStatus) === null || _a === void 0 ? void 0 : _a.nickname) || t("list-labels:headers.trackingStatus");
53
+ } else if (statuses.length === 1) {
52
54
  return t("common:grid.filteredTrackingStatus", {
53
- filter: t(`list-labels:trackingStatus.${filters[0]}`)
55
+ filter: t(`list-labels:trackingStatus.${statuses[0]}`),
56
+ name: ((_b = filters === null || filters === void 0 ? void 0 : filters.trackingStatus) === null || _b === void 0 ? void 0 : _b.nickname) || t("list-labels:headers.trackingStatus")
54
57
  });
55
58
  } else {
56
59
  return t("common:grid.filteredTrackingStatus", {
57
- filter: t(`list-labels:trackingStatus.${filters[0]}`)
60
+ filter: t(`list-labels:trackingStatus.${statuses[0]}`),
61
+ name: ((_c = filters === null || filters === void 0 ? void 0 : filters.trackingStatus) === null || _c === void 0 ? void 0 : _c.nickname) || t("list-labels:headers.trackingStatus")
58
62
  }) + t("common:grid.more", {
59
- count: filters.length - 1
63
+ count: statuses.length - 1
60
64
  });
61
65
  }
62
- }, [t]);
66
+ }, [t, (_a = filters === null || filters === void 0 ? void 0 : filters.trackingStatus) === null || _a === void 0 ? void 0 : _a.nickname]);
63
67
  const getUpdatedKeys = React.useCallback(updatedFields => {
64
68
  return Object.keys(updatedFields).filter(key => updatedFields[key]);
65
69
  }, []);
@@ -79,9 +83,13 @@ const TrackingStatusFilter = ({
79
83
  unknown: filters.trackingStatus.value.includes("unknown")
80
84
  };
81
85
  form.reset(updatedFields);
82
- setButtonText(determineButtonText(getUpdatedKeys(updatedFields)));
86
+ // Only set buttonText when filters are applied
87
+ const updatedKeys = getUpdatedKeys(updatedFields);
88
+ if (updatedKeys.length > 0) {
89
+ setButtonText(determineButtonText(updatedKeys));
90
+ }
83
91
  }
84
- }, [determineButtonText, (_a = filters.trackingStatus) === null || _a === void 0 ? void 0 : _a.value, form, getUpdatedKeys, t]);
92
+ }, [determineButtonText, (_b = filters.trackingStatus) === null || _b === void 0 ? void 0 : _b.value, form, getUpdatedKeys]);
85
93
  const onClearFilters = React.useCallback(() => {
86
94
  onFiltersUpdated(Object.assign(Object.assign({}, filters), {
87
95
  trackingStatus: Object.assign(Object.assign({}, filters.trackingStatus), {
@@ -109,12 +117,15 @@ const TrackingStatusFilter = ({
109
117
  }, [watchedValues]);
110
118
  return jsxRuntime.jsxs(jsxRuntime.Fragment, {
111
119
  children: [jsxRuntime.jsxs(giger.Button, Object.assign({
120
+ disabled: _disabled,
112
121
  onClick: toggleTrackingStatusFilter,
113
122
  ref: buttonRef,
114
123
  variant: giger.ButtonVariant.TEXT
115
124
  }, {
116
- children: [jsxRuntime.jsx("span", {
125
+ children: [isAnyCheckboxChecked ? jsxRuntime.jsx("span", {
117
126
  children: buttonText
127
+ }) : jsxRuntime.jsx("span", {
128
+ children: (_d = (_c = filters === null || filters === void 0 ? void 0 : filters.trackingStatus) === null || _c === void 0 ? void 0 : _c.nickname) !== null && _d !== void 0 ? _d : t("list-labels:headers.trackingStatus")
118
129
  }), isAnyCheckboxChecked ?
119
130
  // Show Close Icon
120
131
  jsxRuntime.jsx(giger.Icon, {