@shipengine/elements 2.27.0 → 2.28.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 (116) hide show
  1. package/dist/cjs/components/field/rate-select/rate-card/rate-card.cjs +1 -0
  2. package/dist/cjs/components/forms/warehouse-form/warehouse-form.cjs +10 -1
  3. package/dist/cjs/components/service-card/service-card.cjs +3 -2
  4. package/dist/cjs/components/service-card/service-card.styles.cjs +4 -2
  5. package/dist/cjs/elements/labels-grid/hooks/use-labels-grid.cjs +2 -2
  6. package/dist/cjs/elements/labels-grid/labels-grid.cjs +29 -9
  7. package/dist/cjs/elements/labels-grid/labels-grid.styles.cjs +5 -0
  8. package/dist/cjs/elements/purchase-label/components/rate-form/rate-view.cjs +3 -5
  9. package/dist/cjs/elements/purchase-label/components/shipment-form/shipment-form.cjs +3 -1
  10. package/dist/cjs/elements/purchase-label/hooks/use-filter-visible-rate-options/use-filter-visible-rate-options.cjs +5 -5
  11. package/dist/cjs/elements/shipments-grid/hooks/use-shipments-grid.cjs +2 -2
  12. package/dist/cjs/elements/shipments-grid/shipments-grid.cjs +20 -6
  13. package/dist/cjs/elements/shipments-grid/shipments-grid.styles.cjs +5 -0
  14. package/dist/cjs/features/manage-warehouses/manage-warehouses.cjs +9 -5
  15. package/dist/cjs/hooks/use-configure-shipment.cjs +8 -0
  16. package/dist/cjs/hooks/use-get-service-data.cjs +60 -0
  17. package/dist/cjs/locales/en/list-labels.json.cjs +2 -1
  18. package/dist/cjs/locales/en/list-shipments.json.cjs +1 -1
  19. package/dist/cjs/locales/en/manage-warehouses.json.cjs +2 -0
  20. package/dist/cjs/package.json.cjs +1 -1
  21. package/dist/cjs/utilities/feature-flags/feature-flags.cjs +2 -1
  22. package/dist/cjs/workflows/onboarding/components/ship-from-address-step/ship-from-address-step.cjs +1 -1
  23. package/dist/esm/components/field/rate-select/rate-card/rate-card.js +1 -0
  24. package/dist/esm/components/forms/warehouse-form/warehouse-form.js +10 -1
  25. package/dist/esm/components/service-card/service-card.js +3 -2
  26. package/dist/esm/components/service-card/service-card.styles.js +4 -2
  27. package/dist/esm/elements/labels-grid/hooks/use-labels-grid.js +2 -2
  28. package/dist/esm/elements/labels-grid/labels-grid.js +30 -10
  29. package/dist/esm/elements/labels-grid/labels-grid.styles.js +5 -0
  30. package/dist/esm/elements/purchase-label/components/rate-form/rate-view.js +3 -5
  31. package/dist/esm/elements/purchase-label/components/shipment-form/shipment-form.js +3 -1
  32. package/dist/esm/elements/purchase-label/hooks/use-filter-visible-rate-options/use-filter-visible-rate-options.js +5 -5
  33. package/dist/esm/elements/shipments-grid/hooks/use-shipments-grid.js +2 -2
  34. package/dist/esm/elements/shipments-grid/shipments-grid.js +21 -7
  35. package/dist/esm/elements/shipments-grid/shipments-grid.styles.js +5 -0
  36. package/dist/esm/features/manage-warehouses/manage-warehouses.js +9 -5
  37. package/dist/esm/hooks/use-configure-shipment.js +8 -0
  38. package/dist/esm/hooks/use-get-service-data.js +58 -0
  39. package/dist/esm/locales/en/list-labels.json.js +2 -1
  40. package/dist/esm/locales/en/list-shipments.json.js +1 -1
  41. package/dist/esm/locales/en/manage-warehouses.json.js +2 -0
  42. package/dist/esm/package.json.js +1 -1
  43. package/dist/esm/utilities/feature-flags/feature-flags.js +2 -1
  44. package/dist/esm/workflows/onboarding/components/ship-from-address-step/ship-from-address-step.js +1 -1
  45. package/dist/types/components/field/rate-select/rate-card/rate-card.d.ts.map +1 -1
  46. package/dist/types/components/forms/warehouse-form/warehouse-form.d.ts.map +1 -1
  47. package/dist/types/components/service-card/service-card.d.ts +2 -1
  48. package/dist/types/components/service-card/service-card.d.ts.map +1 -1
  49. package/dist/types/components/service-card/service-card.styles.d.ts +2 -1
  50. package/dist/types/components/service-card/service-card.styles.d.ts.map +1 -1
  51. package/dist/types/elements/customs-form/customs-form-element.d.ts +5 -2
  52. package/dist/types/elements/customs-form/customs-form-element.d.ts.map +1 -1
  53. package/dist/types/elements/labels-grid/labels-grid.d.ts +5 -2
  54. package/dist/types/elements/labels-grid/labels-grid.d.ts.map +1 -1
  55. package/dist/types/elements/labels-grid/labels-grid.styles.d.ts +5 -0
  56. package/dist/types/elements/labels-grid/labels-grid.styles.d.ts.map +1 -1
  57. package/dist/types/elements/manage-carriers/manage-carriers.d.ts +5 -2
  58. package/dist/types/elements/manage-carriers/manage-carriers.d.ts.map +1 -1
  59. package/dist/types/elements/manage-external-carriers/manage-external-carriers.d.ts +5 -2
  60. package/dist/types/elements/manage-external-carriers/manage-external-carriers.d.ts.map +1 -1
  61. package/dist/types/elements/manage-funding/manage-funding-element.d.ts +5 -2
  62. package/dist/types/elements/manage-funding/manage-funding-element.d.ts.map +1 -1
  63. package/dist/types/elements/manage-warehouses/manage-warehouses.d.ts +5 -2
  64. package/dist/types/elements/manage-warehouses/manage-warehouses.d.ts.map +1 -1
  65. package/dist/types/elements/payment-method-settings/payment-method-settings-element.d.ts +5 -2
  66. package/dist/types/elements/payment-method-settings/payment-method-settings-element.d.ts.map +1 -1
  67. package/dist/types/elements/purchase-label/components/rate-form/rate-view.d.ts +1 -1
  68. package/dist/types/elements/purchase-label/components/rate-form/rate-view.d.ts.map +1 -1
  69. package/dist/types/elements/purchase-label/components/shipment-form/shipment-form.d.ts.map +1 -1
  70. package/dist/types/elements/purchase-label/hooks/use-filter-visible-rate-options/use-filter-visible-rate-options.d.ts +2 -1
  71. package/dist/types/elements/purchase-label/hooks/use-filter-visible-rate-options/use-filter-visible-rate-options.d.ts.map +1 -1
  72. package/dist/types/elements/purchase-label/purchase-label.d.ts +5 -2
  73. package/dist/types/elements/purchase-label/purchase-label.d.ts.map +1 -1
  74. package/dist/types/elements/select-label-layout/select-label-layout-element.d.ts +5 -2
  75. package/dist/types/elements/select-label-layout/select-label-layout-element.d.ts.map +1 -1
  76. package/dist/types/elements/shipment-summary/shipment-summary.d.ts +5 -2
  77. package/dist/types/elements/shipment-summary/shipment-summary.d.ts.map +1 -1
  78. package/dist/types/elements/shipments-grid/shipments-grid.d.ts +5 -2
  79. package/dist/types/elements/shipments-grid/shipments-grid.d.ts.map +1 -1
  80. package/dist/types/elements/shipments-grid/shipments-grid.styles.d.ts +5 -0
  81. package/dist/types/elements/shipments-grid/shipments-grid.styles.d.ts.map +1 -1
  82. package/dist/types/elements/theme-creator/theme-creator.d.ts +5 -2
  83. package/dist/types/elements/theme-creator/theme-creator.d.ts.map +1 -1
  84. package/dist/types/elements/transaction-history/transaction-history-element.d.ts +5 -2
  85. package/dist/types/elements/transaction-history/transaction-history-element.d.ts.map +1 -1
  86. package/dist/types/elements/unit-settings/unit-settings-element.d.ts +5 -2
  87. package/dist/types/elements/unit-settings/unit-settings-element.d.ts.map +1 -1
  88. package/dist/types/elements/vat-settings/vat-settings-element.d.ts +5 -2
  89. package/dist/types/elements/vat-settings/vat-settings-element.d.ts.map +1 -1
  90. package/dist/types/elements/void-label/void-label.d.ts +5 -2
  91. package/dist/types/elements/void-label/void-label.d.ts.map +1 -1
  92. package/dist/types/features/manage-warehouses/manage-warehouses.d.ts.map +1 -1
  93. package/dist/types/hooks/use-configure-shipment.d.ts.map +1 -1
  94. package/dist/types/hooks/use-get-service-data.d.ts +14 -0
  95. package/dist/types/hooks/use-get-service-data.d.ts.map +1 -0
  96. package/dist/types/locales/en/index.d.ts +5 -2
  97. package/dist/types/locales/en/index.d.ts.map +1 -1
  98. package/dist/types/utilities/feature-flags/feature-flags.d.ts.map +1 -1
  99. package/dist/types/utilities/feature-flags/types.d.ts +4 -0
  100. package/dist/types/utilities/feature-flags/types.d.ts.map +1 -1
  101. package/dist/types/workflows/account-settings/account-settings.d.ts +5 -2
  102. package/dist/types/workflows/account-settings/account-settings.d.ts.map +1 -1
  103. package/dist/types/workflows/carrier-services/carrier-services.d.ts +5 -2
  104. package/dist/types/workflows/carrier-services/carrier-services.d.ts.map +1 -1
  105. package/dist/types/workflows/connect-external-carrier/connect-external-carrier.d.ts +5 -2
  106. package/dist/types/workflows/connect-external-carrier/connect-external-carrier.d.ts.map +1 -1
  107. package/dist/types/workflows/label-workflow/label-workflow.d.ts +5 -2
  108. package/dist/types/workflows/label-workflow/label-workflow.d.ts.map +1 -1
  109. package/dist/types/workflows/onboarding/components/ship-from-address-step/ship-from-address-step.d.ts.map +1 -1
  110. package/dist/types/workflows/onboarding/onboarding.d.ts +5 -2
  111. package/dist/types/workflows/onboarding/onboarding.d.ts.map +1 -1
  112. package/package.json +1 -1
  113. package/dist/cjs/hooks/use-get-service-name.cjs +0 -22
  114. package/dist/esm/hooks/use-get-service-name.js +0 -20
  115. package/dist/types/hooks/use-get-service-name.d.ts +0 -5
  116. package/dist/types/hooks/use-get-service-name.d.ts.map +0 -1
@@ -190,6 +190,7 @@ const RateCard = ({
190
190
  carrierCode: carrierCode,
191
191
  carrierFriendlyName: carrierFriendlyName,
192
192
  costBreakdownProps: costBreakdownCommonProps,
193
+ hasRateAttributes: !!(rateAttributes === null || rateAttributes === void 0 ? void 0 : rateAttributes.length),
193
194
  rateDetailsProps: showRateDetails ? {
194
195
  rateDetails
195
196
  } : undefined,
@@ -99,13 +99,22 @@ const WarehouseForm = ({
99
99
  form: form,
100
100
  formatFieldName: fieldName => `originAddress.${fieldName}`,
101
101
  optionalFields: ["addressLine2", ...(requireEmail ? [] : ["email"])]
102
- }), !shouldForceDefault && jsxRuntime.jsx(checkboxInput.CheckboxInput, {
102
+ }), !shouldForceDefault ? jsxRuntime.jsx(checkboxInput.CheckboxInput, {
103
103
  ariaLabel: "Is Default Warehouse",
104
104
  checkboxLabel: t("manage-warehouses:isDefault"),
105
105
  control: form.control,
106
106
  form: formId,
107
107
  label: "isDefault",
108
108
  name: "isDefault"
109
+ }) : jsxRuntime.jsx(checkboxInput.CheckboxInput, {
110
+ ariaLabel: "Is Default Warehouse",
111
+ checkboxLabel: warehouse ? t("manage-warehouses:forcedDefault") : t("manage-warehouses:forcedDefaultNew"),
112
+ control: form.control,
113
+ defaultValue: true,
114
+ disabled: true,
115
+ form: formId,
116
+ label: "isDefault",
117
+ name: "isDefault"
109
118
  }), jsxRuntime.jsx(checkboxInput.CheckboxInput, {
110
119
  ariaLabel: "Return To Address Is Different",
111
120
  checkboxLabel: t("manage-warehouses:returnToAddressIsDifferent"),
@@ -37,7 +37,8 @@ const ServiceCardHeader = ({
37
37
  rateDetailsProps,
38
38
  costBreakdownProps,
39
39
  rightContentCss,
40
- voided
40
+ voided,
41
+ hasRateAttributes
41
42
  }) => {
42
43
  const {
43
44
  type,
@@ -48,7 +49,7 @@ const ServiceCardHeader = ({
48
49
  return jsxRuntime.jsxs("div", {
49
50
  "data-testid": "service-card-header",
50
51
  children: [jsxRuntime.jsxs("section", {
51
- css: serviceCard_styles.styles.section,
52
+ css: serviceCard_styles.styles.getSectionStyles(hasRateAttributes),
52
53
  children: [carrierCode && jsxRuntime.jsx("div", {
53
54
  css: serviceCard_styles.styles.carrierImage,
54
55
  children: jsxRuntime.jsx(carrierIcon.CarrierIcon, {
@@ -47,12 +47,14 @@ const styles = styles$1.createStyles({
47
47
  headerChildren: theme => ({
48
48
  padding: `${styles$1.scopeTheme(theme).spacing(0)}px ${styles$1.scopeTheme(theme).spacing(2)}px ${styles$1.scopeTheme(theme).spacing(2)}px ${styles$1.scopeTheme(theme).spacing(2)}px`
49
49
  }),
50
- section: theme => ({
50
+ getSectionStyles: hasRateAttributes => theme => Object.assign({
51
51
  alignItems: "flex-start",
52
52
  display: "flex",
53
53
  flexDirection: "row",
54
54
  flexWrap: "nowrap",
55
- padding: styles$1.scopeTheme(theme).spacing(2)
55
+ padding: styles$1.scopeTheme(theme).spacing(1.5)
56
+ }, hasRateAttributes && {
57
+ paddingTop: styles$1.scopeTheme(theme).spacing(0.75)
56
58
  }),
57
59
  serviceInfo: theme => ({
58
60
  display: "flex",
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
3
  var react = require('@emotion/react');
4
- var useGetServiceName = require('../../../hooks/use-get-service-name.cjs');
4
+ var useGetServiceData = require('../../../hooks/use-get-service-data.cjs');
5
5
  var reactApi = require('@shipengine/react-api');
6
6
  var files = require('../../../utilities/files.cjs');
7
7
  var styles = require('../../../utilities/styles.cjs');
@@ -42,7 +42,7 @@ const useLabelsGrid = ({
42
42
  const theme = react.useTheme();
43
43
  const {
44
44
  getServiceName
45
- } = useGetServiceName.useGetServiceName();
45
+ } = useGetServiceData.useGetServiceData();
46
46
  const {
47
47
  page,
48
48
  pageSize,
@@ -1,6 +1,7 @@
1
1
  'use strict';
2
2
 
3
3
  var jsxRuntime = require('@emotion/react/jsx-runtime');
4
+ var useGetServiceData = require('../../hooks/use-get-service-data.cjs');
4
5
  var useSortableQuery = require('../../hooks/use-sortable-query.cjs');
5
6
  var giger = require('@shipengine/giger');
6
7
  var formatString = require('../../utilities/formatString.cjs');
@@ -21,6 +22,7 @@ var elementsContextProvider = require('../../elements-provider/elements-context-
21
22
  var spacer = require('../../components/spacer/spacer.cjs');
22
23
  var poweredByShipengine = require('../../components/powered-by-shipengine/powered-by-shipengine.cjs');
23
24
  var errorFallback = require('../../components/error-fallback/error-fallback.cjs');
25
+ var carrierIcon = require('../../components/carrier-icon/carrier-icon.cjs');
24
26
 
25
27
  const Component = ({
26
28
  labelStatus,
@@ -106,6 +108,10 @@ const Component = ({
106
108
  sortDir: sortState.dir,
107
109
  columns: columnsArray
108
110
  });
111
+ const {
112
+ getServiceInfo,
113
+ isLoadingCarriers
114
+ } = useGetServiceData.useGetServiceData();
109
115
  React.useEffect(() => {
110
116
  if (prevStatus.current !== labelStatus) {
111
117
  pageConfig.pagerProps.resetCurrentPage();
@@ -292,14 +298,22 @@ const Component = ({
292
298
  }
293
299
  },
294
300
  shippingService: {
295
- headerContent: t("list-labels:headers.shipping"),
301
+ headerContent: t("list-labels:headers.service"),
296
302
  renderCellContent: label => {
303
+ const serviceInfo = getServiceInfo(label);
297
304
  return jsxRuntime.jsxs(jsxRuntime.Fragment, {
298
- children: [jsxRuntime.jsx(giger.Typography, {
299
- component: "p",
300
- css: labelsGrid_styles.styles.tableParagraph,
301
- variant: "body2",
302
- children: label.serviceName || label.serviceCode
305
+ children: [isLoadingCarriers ? jsxRuntime.jsx(giger.Skeleton, {}) : jsxRuntime.jsxs("div", {
306
+ css: labelsGrid_styles.styles.serviceCell,
307
+ children: [serviceInfo.hasCarrierIcon && serviceInfo.carrierCode && jsxRuntime.jsx(carrierIcon.CarrierIcon, {
308
+ carrierCode: serviceInfo.carrierCode,
309
+ carrierName: serviceInfo.serviceName || serviceInfo.carrierCode,
310
+ size: giger.IconSize.SIZE_SMALL
311
+ }), jsxRuntime.jsx(giger.Typography, {
312
+ component: "p",
313
+ css: labelsGrid_styles.styles.tableParagraph,
314
+ variant: "body2",
315
+ children: serviceInfo.serviceName || t("list-labels:none")
316
+ })]
303
317
  }), label.trackable && jsxRuntime.jsx(giger.Next.Link, {
304
318
  bold: false,
305
319
  href: label.trackingUrl,
@@ -352,17 +366,23 @@ const Component = ({
352
366
  }
353
367
  }
354
368
  });
369
+ const labelExpired = label => {
370
+ const ninetyDaysAgo = new Date();
371
+ ninetyDaysAgo.setDate(ninetyDaysAgo.getDate() - 90);
372
+ return new Date(label.createdAt) < ninetyDaysAgo;
373
+ };
355
374
  // Actual actions are only allowed for completed labels
356
375
  if ((features === null || features === void 0 ? void 0 : features.showActions) && labels.some(label => label.status === "completed")) {
357
376
  cols.push({
358
377
  headerContent: "",
359
378
  renderCellContent: label => {
360
379
  var _a, _b;
380
+ const isLabelExpired = labelExpired(label);
361
381
  const isLabelDelivered = label.trackingStatus === "delivered";
362
- const isReprintAllowed = !!((_a = label.labelDownload) === null || _a === void 0 ? void 0 : _a.href) && label.status === "completed";
363
382
  const isVoidAllowed = !!onClickVoidLabel && label.status === "completed";
364
- const isPrintFormsAllowed = !!((_b = label.formDownload) === null || _b === void 0 ? void 0 : _b.href) && label.status === "completed";
365
383
  const isViewDetailsAllowed = !!onClickViewDetails;
384
+ const isReprintAllowed = !!((_a = label.labelDownload) === null || _a === void 0 ? void 0 : _a.href) && label.status === "completed" && !isLabelExpired;
385
+ const isPrintFormsAllowed = !!((_b = label.formDownload) === null || _b === void 0 ? void 0 : _b.href) && label.status === "completed" && !isLabelExpired;
366
386
  const allowActionsMenu = isReprintAllowed || isVoidAllowed || isPrintFormsAllowed || isViewDetailsAllowed;
367
387
  if (isLabelDelivered || !allowActionsMenu) {
368
388
  return null;
@@ -391,7 +411,7 @@ const Component = ({
391
411
  });
392
412
  }
393
413
  return cols;
394
- }, [t, toggleCreatedDateSort, sortState.createdAtDir, features === null || features === void 0 ? void 0 : features.columns, features === null || features === void 0 ? void 0 : features.showActions, labels, onClickExternalOrderId, onClickExternalShipmentId, onClickShipmentNumber, onClickTrackingNumber, onClickVoidLabel, onClickViewDetails, onClickPrintLabel, onClickPrintForms]);
414
+ }, [t, toggleCreatedDateSort, sortState.createdAtDir, features === null || features === void 0 ? void 0 : features.columns, features === null || features === void 0 ? void 0 : features.showActions, labels, onClickExternalOrderId, onClickExternalShipmentId, onClickShipmentNumber, getServiceInfo, isLoadingCarriers, onClickTrackingNumber, onClickVoidLabel, onClickViewDetails, onClickPrintLabel, onClickPrintForms]);
395
415
  const emptyContentComponent = React.useMemo(() => {
396
416
  if (isLoading) {
397
417
  return undefined;
@@ -8,6 +8,11 @@ const styles = styles$1.createStyles({
8
8
  }, styles$1.scopeTheme(theme).getComponentOverride("Table")),
9
9
  tableParagraph: {
10
10
  margin: 0
11
+ },
12
+ serviceCell: {
13
+ display: "flex",
14
+ alignItems: "center",
15
+ gap: "8px"
11
16
  }
12
17
  });
13
18
 
@@ -34,7 +34,6 @@ const RateView = ({
34
34
  rateOptions,
35
35
  rates,
36
36
  salesOrder: salesOrder$1,
37
- selectedRate,
38
37
  shipment,
39
38
  showVatFeatures
40
39
  }) => {
@@ -78,9 +77,8 @@ const RateView = ({
78
77
  }, [features === null || features === void 0 ? void 0 : features.enablePudoUI, pudoRateOptions, rateOptions]);
79
78
  const {
80
79
  collapsedRateOptionList,
81
- COLLAPSED_RATE_VIEW_LIMIT,
82
80
  filterVisibleRateOptions
83
- } = useFilterVisibleRateOptions.useFilterVisibleRateOptions(expandedRateOptionList);
81
+ } = useFilterVisibleRateOptions.useFilterVisibleRateOptions(expandedRateOptionList, features);
84
82
  const handleShowMoreRates = React.useCallback(() => {
85
83
  var _a;
86
84
  setShowHiddenRates === null || setShowHiddenRates === void 0 ? void 0 : setShowHiddenRates(!showHiddenRates);
@@ -199,8 +197,8 @@ const RateView = ({
199
197
  onClick: onSelectRate,
200
198
  onPaperlessAcknowledgementChange: onPaperlessAcknowledgementChange,
201
199
  onSelectServicePoint: onSelectServicePoint,
202
- options: showHiddenRates ? expandedRateOptionList : collapsedRateOptionList
203
- }, rateSelectCommonProps)), expandedRateOptionList.length > COLLAPSED_RATE_VIEW_LIMIT && jsxRuntime.jsx(linkAction.LinkAction, {
200
+ options: showHiddenRates || !collapsedRateOptionList.length ? expandedRateOptionList : collapsedRateOptionList
201
+ }, rateSelectCommonProps)), expandedRateOptionList.length > collapsedRateOptionList.length && !!collapsedRateOptionList.length && jsxRuntime.jsx(linkAction.LinkAction, {
204
202
  css: rateForm_styles.styles.showMoreOrLessRatesButton,
205
203
  icon: showHiddenRates ? "chevronTop" : "chevronBottom",
206
204
  iconPlacement: "right",
@@ -517,13 +517,15 @@ const ShipmentForm = ({
517
517
  React.useEffect(() => {
518
518
  hasShipFromAddressErrors && toggleIsEditShipFromAddressFormOpen();
519
519
  }, [hasShipFromAddressErrors, toggleIsEditShipFromAddressFormOpen]);
520
+ const warehouseToEdit = React.useMemo(() => warehouses$1 === null || warehouses$1 === void 0 ? void 0 : warehouses$1.find(w => w.warehouseId === editShipFromAddressId), [editShipFromAddressId, warehouses$1]);
520
521
  const [editWarehouseForm, isEditWarehouseFormOpen, toggleIsEditWarehouseFormOpen] = useNestedForm.useNestedForm(warehouseForm.WarehouseForm, {
521
522
  formId: "edit-warehouse-form",
522
523
  onSubmit: payload => _tslib.__awaiter(void 0, void 0, void 0, function* () {
523
524
  editShipFromAddressId && (yield handleSubmitEditWarehouse(payload, editShipFromAddressId));
524
525
  }),
525
526
  submitButtonTitle: t("actions.save"),
526
- warehouse: warehouses$1 === null || warehouses$1 === void 0 ? void 0 : warehouses$1.find(w => w.warehouseId === editShipFromAddressId)
527
+ warehouse: warehouseToEdit,
528
+ shouldForceDefault: warehouseToEdit === null || warehouseToEdit === void 0 ? void 0 : warehouseToEdit.isDefault
527
529
  });
528
530
  const getFundingSourceInsuranceProviderKey = React.useCallback(provider => {
529
531
  if (provider === "parcelguard") {
@@ -3,7 +3,7 @@
3
3
  var React = require('react');
4
4
 
5
5
  const COLLAPSED_RATE_VIEW_LIMIT = 4;
6
- const filterRateOptions = rateOptions => {
6
+ const filterRateOptions = (rateOptions, showMediaMail) => {
7
7
  const hasRateAttributes = option => {
8
8
  var _a;
9
9
  return !!((_a = option.rateAttributes) === null || _a === void 0 ? void 0 : _a.length);
@@ -14,7 +14,7 @@ const filterRateOptions = rateOptions => {
14
14
  const ratesWithoutAttributes = [];
15
15
  // Classify rates (excluding Media Mail from both categories)
16
16
  for (const option of rateOptions) {
17
- if (isMediaMail(option)) {
17
+ if (!showMediaMail && isMediaMail(option)) {
18
18
  continue; // Skip Media Mail entirely - it will only show in "Show more"
19
19
  }
20
20
  if (hasRateAttributes(option)) {
@@ -42,9 +42,9 @@ const filterRateOptions = rateOptions => {
42
42
  * - Fill remaining slots with regular rates
43
43
  * - Media Mail is always excluded from the collapsed view
44
44
  */
45
- const useFilterVisibleRateOptions = rateOptions => {
46
- const collapsedRateOptionList = React.useMemo(() => filterRateOptions(rateOptions), [rateOptions]);
47
- const filterVisibleRateOptions = React.useCallback(options => filterRateOptions(options), []);
45
+ const useFilterVisibleRateOptions = (rateOptions, features) => {
46
+ const collapsedRateOptionList = React.useMemo(() => filterRateOptions(rateOptions, features === null || features === void 0 ? void 0 : features.showMediaMail), [rateOptions, features]);
47
+ const filterVisibleRateOptions = React.useCallback(options => filterRateOptions(options, features === null || features === void 0 ? void 0 : features.showMediaMail), [features]);
48
48
  return {
49
49
  COLLAPSED_RATE_VIEW_LIMIT,
50
50
  collapsedRateOptionList,
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var useGetServiceName = require('../../../hooks/use-get-service-name.cjs');
3
+ var useGetServiceData = require('../../../hooks/use-get-service-data.cjs');
4
4
  var reactApi = require('@shipengine/react-api');
5
5
  var files = require('../../../utilities/files.cjs');
6
6
  var React = require('react');
@@ -30,7 +30,7 @@ const useShipmentsGrid = ({
30
30
  const initialFilters = getInitialFilters(showShipmentIdFilter, showCreatedDateFilter);
31
31
  const {
32
32
  getServiceName
33
- } = useGetServiceName.useGetServiceName();
33
+ } = useGetServiceData.useGetServiceData();
34
34
  const {
35
35
  page,
36
36
  pageSize,
@@ -2,6 +2,7 @@
2
2
 
3
3
  var _tslib = require('../../_virtual/_tslib.cjs');
4
4
  var jsxRuntime = require('@emotion/react/jsx-runtime');
5
+ var useGetServiceData = require('../../hooks/use-get-service-data.cjs');
5
6
  var useSortableQuery = require('../../hooks/use-sortable-query.cjs');
6
7
  var giger = require('@shipengine/giger');
7
8
  var React = require('react');
@@ -14,6 +15,7 @@ var index = require('../../locales/en/index.cjs');
14
15
  var createElement = require('../../create-element/create-element.cjs');
15
16
  var elementsContextProvider = require('../../elements-provider/elements-context-provider.cjs');
16
17
  var errorState = require('../../components/error-state/error-state.cjs');
18
+ var carrierIcon = require('../../components/carrier-icon/carrier-icon.cjs');
17
19
  var cellFormattedDate = require('../../components/grid-controller/cell-formatted-date.cjs');
18
20
  var sortableHeader = require('../../components/grid-controller/sortable-header/sortable-header.cjs');
19
21
  var gridController = require('../../components/grid-controller/grid-controller.cjs');
@@ -87,6 +89,10 @@ const Component = ({
87
89
  sortBy: sortState.by,
88
90
  sortDir: sortState.dir
89
91
  });
92
+ const {
93
+ getServiceInfo,
94
+ isLoadingCarriers
95
+ } = useGetServiceData.useGetServiceData();
90
96
  const onRowClick = shipment => _tslib.__awaiter(void 0, void 0, void 0, function* () {
91
97
  setActiveShipmentId(shipment.shipmentId);
92
98
  yield onRowClickProp === null || onRowClickProp === void 0 ? void 0 : onRowClickProp(shipment);
@@ -190,13 +196,21 @@ const Component = ({
190
196
  }) : "--";
191
197
  }
192
198
  }, {
193
- headerContent: t("list-shipments:headers.shipping"),
199
+ headerContent: t("list-shipments:headers.service"),
194
200
  renderCellContent: shipment => {
195
- return jsxRuntime.jsx(giger.Typography, {
196
- component: "p",
197
- css: shipmentsGrid_styles.styles.tableParagraph,
198
- variant: "body2",
199
- children: shipment.serviceName || t("list-shipments:none")
201
+ const serviceInfo = getServiceInfo(shipment);
202
+ return isLoadingCarriers ? jsxRuntime.jsx(giger.Skeleton, {}) : jsxRuntime.jsxs("div", {
203
+ css: shipmentsGrid_styles.styles.serviceCell,
204
+ children: [serviceInfo.hasCarrierIcon && serviceInfo.carrierCode && jsxRuntime.jsx(carrierIcon.CarrierIcon, {
205
+ carrierCode: serviceInfo.carrierCode,
206
+ carrierName: serviceInfo.serviceName || serviceInfo.carrierCode,
207
+ size: giger.IconSize.SIZE_SMALL
208
+ }), jsxRuntime.jsx(giger.Typography, {
209
+ component: "p",
210
+ css: shipmentsGrid_styles.styles.tableParagraph,
211
+ variant: "body2",
212
+ children: serviceInfo.serviceName || t("list-shipments:none")
213
+ })]
200
214
  });
201
215
  }
202
216
  }, {
@@ -8,6 +8,11 @@ const styles = styles$1.createStyles({
8
8
  }, styles$1.scopeTheme(theme).getComponentOverride("Table")),
9
9
  tableParagraph: {
10
10
  margin: 0
11
+ },
12
+ serviceCell: {
13
+ display: "flex",
14
+ alignItems: "center",
15
+ gap: "8px"
11
16
  }
12
17
  });
13
18
 
@@ -107,6 +107,7 @@ const ManageWarehouses = ({
107
107
  yield handleSubmitAddNewWarehouse(payload);
108
108
  toggleShowAddNewWarehouseForm(false);
109
109
  }),
110
+ shouldForceDefault: !(warehouses === null || warehouses === void 0 ? void 0 : warehouses.length),
110
111
  submitButtonTitle: t("actions.save")
111
112
  })
112
113
  }) : jsxRuntime.jsx(buttonGroup.ButtonGroup, {
@@ -141,17 +142,20 @@ const ManageWarehouses = ({
141
142
  yield handleSubmitEditWarehouse(Object.assign(Object.assign({}, rest), warehouseData), warehouse.warehouseId);
142
143
  setEditWarehouseId(undefined);
143
144
  }),
144
- children: jsxRuntime.jsx(warehouseForm.WarehouseForm, {
145
- onCancel: () => setEditWarehouseId(undefined),
146
- // eslint-disable-next-line @typescript-eslint/no-misused-promises
147
- onDelete: warehouse.isDefault ? undefined : () => handleDeleteWarehouse(warehouse.warehouseId),
145
+ children: jsxRuntime.jsx(warehouseForm.WarehouseForm
146
+ // eslint-disable-next-line @typescript-eslint/no-misused-promises
147
+ , {
148
148
  // eslint-disable-next-line @typescript-eslint/no-misused-promises
149
149
  onSubmit: payload => _tslib.__awaiter(void 0, void 0, void 0, function* () {
150
150
  yield handleSubmitEditWarehouse(payload, warehouse.warehouseId);
151
151
  setEditWarehouseId(undefined);
152
152
  }),
153
+ shouldForceDefault: warehouse.isDefault,
153
154
  submitButtonTitle: t("actions.save"),
154
- warehouse: warehouse
155
+ warehouse: warehouse,
156
+ onCancel: () => setEditWarehouseId(undefined),
157
+ // eslint-disable-next-line @typescript-eslint/no-misused-promises
158
+ onDelete: warehouse.isDefault ? undefined : () => handleDeleteWarehouse(warehouse.warehouseId)
155
159
  })
156
160
  }, warehouse.warehouseId);
157
161
  } else {
@@ -114,6 +114,14 @@ const useConfigureShipment = ({
114
114
  isSuccess: salesOrderShipmentCreated
115
115
  } = reactApi.useCreateSalesOrderShipment();
116
116
  const pendingSalesOrderShipment = shipment.getShipmentByStatus("pending", salesOrderShipments);
117
+ if (pendingSalesOrderShipment) {
118
+ // ensure state code is uppercase for form hydration. SE API may return mixed case state codes.
119
+ pendingSalesOrderShipment.shipFrom.stateProvince = pendingSalesOrderShipment.shipFrom.stateProvince.toUpperCase();
120
+ pendingSalesOrderShipment.shipTo.stateProvince = pendingSalesOrderShipment.shipTo.stateProvince.toUpperCase();
121
+ if (pendingSalesOrderShipment.returnTo) {
122
+ pendingSalesOrderShipment.returnTo.stateProvince = pendingSalesOrderShipment.returnTo.stateProvince.toUpperCase();
123
+ }
124
+ }
117
125
  const labelPurchasedSalesOrderShipment = shipment.getShipmentByStatus("label_purchased", salesOrderShipments);
118
126
  const cancelledShipment = shipment.getShipmentByStatus("cancelled", salesOrderShipments);
119
127
  const defaultWarehouse = warehouses.getDefaultWarehouse(warehouses$1);
@@ -0,0 +1,60 @@
1
+ 'use strict';
2
+
3
+ var reactApi = require('@shipengine/react-api');
4
+ var React = require('react');
5
+
6
+ const formatServiceCode = serviceCode => {
7
+ return serviceCode.split("_").map((word, index) => {
8
+ if (index === 0) return word.toUpperCase();
9
+ return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();
10
+ }).join(" ");
11
+ };
12
+ const useGetServiceData = () => {
13
+ const {
14
+ data: carrierList,
15
+ isLoading,
16
+ isError
17
+ } = reactApi.useListCarriers();
18
+ const getServiceInfo = React.useCallback(item => {
19
+ const {
20
+ serviceCode,
21
+ carrierId
22
+ } = item;
23
+ const labelCarrierCode = item.carrierCode;
24
+ // Error fetching carriers
25
+ if (isError) {
26
+ return {
27
+ serviceName: serviceCode !== null && serviceCode !== void 0 ? serviceCode : undefined,
28
+ carrierCode: undefined,
29
+ hasCarrierIcon: false
30
+ };
31
+ }
32
+ const carrier = carrierList === null || carrierList === void 0 ? void 0 : carrierList.find(c => c.carrierId === carrierId || c.carrierCode === labelCarrierCode);
33
+ // No carrier found for the given carrierId or carrierCode
34
+ if (!carrier) {
35
+ const serviceName = serviceCode ? formatServiceCode(serviceCode) : undefined;
36
+ const carrierCode = labelCarrierCode || undefined;
37
+ return {
38
+ serviceName,
39
+ carrierCode,
40
+ hasCarrierIcon: !!carrierCode
41
+ };
42
+ }
43
+ const service = carrier.services.find(s => s.serviceCode === serviceCode);
44
+ const carrierCode = labelCarrierCode || carrier.carrierCode;
45
+ const serviceName = (service === null || service === void 0 ? void 0 : service.name) || serviceCode || undefined;
46
+ return {
47
+ serviceName,
48
+ carrierCode,
49
+ hasCarrierIcon: !!service && !!carrierCode
50
+ };
51
+ }, [carrierList, isError]);
52
+ const getServiceName = React.useCallback(item => getServiceInfo(item).serviceName, [getServiceInfo]);
53
+ return {
54
+ getServiceInfo,
55
+ getServiceName,
56
+ isLoadingCarriers: isLoading
57
+ };
58
+ };
59
+
60
+ exports.useGetServiceData = useGetServiceData;
@@ -3,12 +3,13 @@
3
3
  var listLabels = {
4
4
  "list-labels": {
5
5
  title: "List Labels",
6
+ none: "None",
6
7
  headers: {
7
8
  created: "Created Date",
8
9
  shipmentId: "Shipment ID",
9
10
  parcels: "Parcels",
10
11
  recipient: "Recipient",
11
- shipping: "Shipping",
12
+ service: "Service",
12
13
  shipDate: "Ship Date",
13
14
  status: "Label Status",
14
15
  trackingStatus: "Delivery Status",
@@ -7,7 +7,7 @@ var listShipments = {
7
7
  headers: {
8
8
  created: "Created Date",
9
9
  modified: "Modified Date",
10
- shipping: "Shipping",
10
+ service: "Service",
11
11
  shipmentId: "Shipment ID",
12
12
  parcels: "Parcels",
13
13
  recipient: "Recipient",
@@ -7,6 +7,8 @@ var manageWarehouses = {
7
7
  editWarehouse: "Edit Address",
8
8
  contactName: "Contact Name",
9
9
  "default": "Default",
10
+ forcedDefault: "This is your default Ship From Address",
11
+ forcedDefaultNew: "This will be your default Ship From Address",
10
12
  isDefault: "Set as default Ship From address",
11
13
  locationName: "Location Name",
12
14
  residentialAddress: "Residential Address",
@@ -1,5 +1,5 @@
1
1
  'use strict';
2
2
 
3
- var version = "2.27.0";
3
+ var version = "2.28.0";
4
4
 
5
5
  exports.version = version;
@@ -51,7 +51,8 @@ const defaultFeatureFlags = {
51
51
  labelLayout: false,
52
52
  nicknameRate: true,
53
53
  requireDhlTermsAcknowledgement: false,
54
- saveRate: true
54
+ saveRate: true,
55
+ showMediaMail: false
55
56
  },
56
57
  shipmentForm: {
57
58
  addOns: true,
@@ -45,7 +45,7 @@ const ShipFromAddressStep = ({
45
45
  }), jsxRuntime.jsx(warehouseForm.WarehouseForm, {
46
46
  onSubmit: onSubmit,
47
47
  requireEmail: true,
48
- shouldForceDefault: (pendingWarehouse === null || pendingWarehouse === void 0 ? void 0 : pendingWarehouse.isDefault) || (pendingShipFrom === null || pendingShipFrom === void 0 ? void 0 : pendingShipFrom.isDefault),
48
+ shouldForceDefault: true,
49
49
  submitButtonTitle: t("actions.continue"),
50
50
  useStrictSchema: true,
51
51
  warehouse: pendingWarehouse !== null && pendingWarehouse !== void 0 ? pendingWarehouse : pendingShipFrom
@@ -188,6 +188,7 @@ const RateCard = ({
188
188
  carrierCode: carrierCode,
189
189
  carrierFriendlyName: carrierFriendlyName,
190
190
  costBreakdownProps: costBreakdownCommonProps,
191
+ hasRateAttributes: !!(rateAttributes === null || rateAttributes === void 0 ? void 0 : rateAttributes.length),
191
192
  rateDetailsProps: showRateDetails ? {
192
193
  rateDetails
193
194
  } : undefined,
@@ -97,13 +97,22 @@ const WarehouseForm = ({
97
97
  form: form,
98
98
  formatFieldName: fieldName => `originAddress.${fieldName}`,
99
99
  optionalFields: ["addressLine2", ...(requireEmail ? [] : ["email"])]
100
- }), !shouldForceDefault && jsx(CheckboxInput, {
100
+ }), !shouldForceDefault ? jsx(CheckboxInput, {
101
101
  ariaLabel: "Is Default Warehouse",
102
102
  checkboxLabel: t("manage-warehouses:isDefault"),
103
103
  control: form.control,
104
104
  form: formId,
105
105
  label: "isDefault",
106
106
  name: "isDefault"
107
+ }) : jsx(CheckboxInput, {
108
+ ariaLabel: "Is Default Warehouse",
109
+ checkboxLabel: warehouse ? t("manage-warehouses:forcedDefault") : t("manage-warehouses:forcedDefaultNew"),
110
+ control: form.control,
111
+ defaultValue: true,
112
+ disabled: true,
113
+ form: formId,
114
+ label: "isDefault",
115
+ name: "isDefault"
107
116
  }), jsx(CheckboxInput, {
108
117
  ariaLabel: "Return To Address Is Different",
109
118
  checkboxLabel: t("manage-warehouses:returnToAddressIsDifferent"),
@@ -35,7 +35,8 @@ const ServiceCardHeader = ({
35
35
  rateDetailsProps,
36
36
  costBreakdownProps,
37
37
  rightContentCss,
38
- voided
38
+ voided,
39
+ hasRateAttributes
39
40
  }) => {
40
41
  const {
41
42
  type,
@@ -46,7 +47,7 @@ const ServiceCardHeader = ({
46
47
  return jsxs("div", {
47
48
  "data-testid": "service-card-header",
48
49
  children: [jsxs("section", {
49
- css: styles.section,
50
+ css: styles.getSectionStyles(hasRateAttributes),
50
51
  children: [carrierCode && jsx("div", {
51
52
  css: styles.carrierImage,
52
53
  children: jsx(CarrierIcon, {
@@ -45,12 +45,14 @@ const styles = createStyles({
45
45
  headerChildren: theme => ({
46
46
  padding: `${scopeTheme(theme).spacing(0)}px ${scopeTheme(theme).spacing(2)}px ${scopeTheme(theme).spacing(2)}px ${scopeTheme(theme).spacing(2)}px`
47
47
  }),
48
- section: theme => ({
48
+ getSectionStyles: hasRateAttributes => theme => Object.assign({
49
49
  alignItems: "flex-start",
50
50
  display: "flex",
51
51
  flexDirection: "row",
52
52
  flexWrap: "nowrap",
53
- padding: scopeTheme(theme).spacing(2)
53
+ padding: scopeTheme(theme).spacing(1.5)
54
+ }, hasRateAttributes && {
55
+ paddingTop: scopeTheme(theme).spacing(0.75)
54
56
  }),
55
57
  serviceInfo: theme => ({
56
58
  display: "flex",
@@ -1,5 +1,5 @@
1
1
  import { useTheme } from '@emotion/react';
2
- import { useGetServiceName } from '../../../hooks/use-get-service-name.js';
2
+ import { useGetServiceData } from '../../../hooks/use-get-service-data.js';
3
3
  import { useListLabels, useExportLabels, useListSalesOrderShipments, useGetLabel } from '@shipengine/react-api';
4
4
  import { createLocalFileFromBlobResponse } from '../../../utilities/files.js';
5
5
  import { scopeTheme } from '../../../utilities/styles.js';
@@ -40,7 +40,7 @@ const useLabelsGrid = ({
40
40
  const theme = useTheme();
41
41
  const {
42
42
  getServiceName
43
- } = useGetServiceName();
43
+ } = useGetServiceData();
44
44
  const {
45
45
  page,
46
46
  pageSize,