@vtex/faststore-plugin-buyer-portal 2.0.13 → 2.0.14

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 (219) hide show
  1. package/CHANGELOG.md +18 -1
  2. package/cms/b2b/components/.gitkeep +0 -0
  3. package/cms/b2b/pages/cms_content_type__i18n.jsonc +36 -0
  4. package/cypress/integration/localization.test.ts +482 -0
  5. package/cypress/support/commands.ts +8 -0
  6. package/docs/i18n/i18n-messages-format.md +391 -0
  7. package/docs/i18n/locales.json +701 -0
  8. package/docs/i18n/migration-inventory.md +959 -0
  9. package/package.json +3 -3
  10. package/specs/custom-localization-system.md +711 -0
  11. package/specs/multi-locale-e2e-validation.md +277 -0
  12. package/src/__mocks__/discovery.config.ts +12 -0
  13. package/src/features/accounting-fields/components/AccountingConfirmDelete/AccountingConfirmDelete.tsx +14 -4
  14. package/src/features/accounting-fields/components/AccountingFieldConfirmEdit/AccountingFieldConfirmEdit.tsx +11 -6
  15. package/src/features/accounting-fields/components/AccountingFieldDropdown/AccountingFieldDropdown.tsx +5 -3
  16. package/src/features/accounting-fields/components/AccountingFieldForm/AccountingFieldForm.tsx +33 -23
  17. package/src/features/accounting-fields/components/AccountingValueConfirmEdit/AccountingValueConfirmEdit.tsx +10 -6
  18. package/src/features/accounting-fields/components/AccountingValueDropdown/AccountingValueDropdown.tsx +19 -9
  19. package/src/features/accounting-fields/components/AccountingValueForm/AccountingValueForm.tsx +21 -10
  20. package/src/features/accounting-fields/components/CreateAccountingFieldDrawer/CreateAccountingFieldDrawer.tsx +11 -8
  21. package/src/features/accounting-fields/components/CreateAccountingValueDrawer/CreateAccountingValueDrawer.tsx +18 -7
  22. package/src/features/accounting-fields/components/DeleteAccountingFieldDrawer/DeleteAccountingFieldDrawer.tsx +14 -12
  23. package/src/features/accounting-fields/components/DeleteAccountingValueDrawer/DeleteAccountingValueDrawer.tsx +20 -10
  24. package/src/features/accounting-fields/components/EditAccountingFieldDrawer/EditAccountingFieldDrawer.tsx +5 -3
  25. package/src/features/accounting-fields/components/EditAccountingValueDrawer/EditAccountingValueDrawer.tsx +13 -6
  26. package/src/features/accounting-fields/components/RemoveValueFromUnitDrawer/RemoveValueFromUnitDrawer.tsx +19 -8
  27. package/src/features/accounting-fields/layouts/AccountingFieldLayout/AccountingFieldLayout.tsx +11 -9
  28. package/src/features/addresses/components/AddRecipientsDrawer/AddRecipientsDrawer.tsx +13 -7
  29. package/src/features/addresses/components/AddressDropdownMenu/AddressDropdownMenu.tsx +22 -20
  30. package/src/features/addresses/components/AddressForm/AddressForm.tsx +33 -22
  31. package/src/features/addresses/components/AddressLine/AddressLine.tsx +29 -25
  32. package/src/features/addresses/components/AddressLocationsList/AddressLocationsList.tsx +15 -6
  33. package/src/features/addresses/components/AddressRecipientsList/AddressRecipientsList.tsx +9 -4
  34. package/src/features/addresses/components/AddressesCard/AddressesCard.tsx +8 -5
  35. package/src/features/addresses/components/CreateAddressDrawer/CreateAddressDrawer.tsx +27 -14
  36. package/src/features/addresses/components/CreateAddressSettingsDrawer/CreateAddressSettingsDrawer.tsx +26 -21
  37. package/src/features/addresses/components/DeleteAddressDrawer/DeleteAddressDrawer.tsx +20 -16
  38. package/src/features/addresses/components/DeleteAddressLocationDrawer/DeleteAddressLocationDrawer.tsx +26 -14
  39. package/src/features/addresses/components/DeleteRecipientAddressDrawer/DeleteRecipientAddressDrawer.tsx +20 -17
  40. package/src/features/addresses/components/EditAddressDrawer/EditAddressDrawer.tsx +12 -6
  41. package/src/features/addresses/components/EditAddressLocationDrawer/EditAddressLocationDrawer.tsx +24 -17
  42. package/src/features/addresses/components/EditRecipientAddressDrawer/EditRecipientAddressDrawer.tsx +17 -15
  43. package/src/features/addresses/components/LocationForm/LocationField/LocationField.tsx +8 -5
  44. package/src/features/addresses/components/LocationForm/LocationForm.tsx +9 -3
  45. package/src/features/addresses/components/LocationsDrawer/LocationsDrawer.tsx +15 -9
  46. package/src/features/addresses/components/RecipientsForm/RecipientItem/RecipientItem.tsx +55 -46
  47. package/src/features/addresses/components/RecipientsForm/RecipientsForm.tsx +4 -1
  48. package/src/features/addresses/components/RemoveAddressDrawer/RemoveAddressDrawer.tsx +21 -14
  49. package/src/features/addresses/layouts/AddressDetailsLayout/AddressDetailsLayout.tsx +16 -9
  50. package/src/features/addresses/layouts/AddressesLayout/AddressesLayout.tsx +11 -8
  51. package/src/features/b2b-agent/layouts/B2BAgentLayout/B2BAgentLayout.tsx +3 -1
  52. package/src/features/budgets/components/BudgetAddForm/BudgetAddForm.tsx +14 -12
  53. package/src/features/budgets/components/BudgetAddSuccess/BudgetAddSuccess.tsx +16 -14
  54. package/src/features/budgets/components/BudgetAllocationsSelection/BudgetAllocationsSelection.tsx +8 -5
  55. package/src/features/budgets/components/BudgetAllocationsTable/BudgetAllocationsTable.tsx +9 -6
  56. package/src/features/budgets/components/BudgetDeleteDrawer/BudgetDeleteDrawer.tsx +23 -17
  57. package/src/features/budgets/components/BudgetEditNotificationDrawer/BudgetEditNotificationDrawer.tsx +13 -6
  58. package/src/features/budgets/components/BudgetNotificationForm/BudgetNotificationForm.tsx +31 -24
  59. package/src/features/budgets/components/BudgetNotificationsInfo/BudgetNotificationsInfo.tsx +15 -9
  60. package/src/features/budgets/components/BudgetRemainingBalance/BudgetRemainingBalance.tsx +6 -2
  61. package/src/features/budgets/components/BudgetSettingsInfo/BudgetSettingsInfo.tsx +27 -10
  62. package/src/features/budgets/components/BudgetUsersTable/BudgetUsersTable.tsx +14 -7
  63. package/src/features/budgets/components/BudgetsTable/BudgetsTable.tsx +11 -8
  64. package/src/features/budgets/components/CreateBudgetAllocationDrawer/CreateBudgetAllocationDrawer.tsx +8 -5
  65. package/src/features/budgets/components/CreateBudgetDrawer/CreateBudgetDrawer.tsx +31 -18
  66. package/src/features/budgets/components/DeleteBudgetAllocationDrawer/DeleteBudgetAllocationDrawer.tsx +17 -12
  67. package/src/features/budgets/components/EditBudgetDrawer/EditBudgetDrawer.tsx +14 -8
  68. package/src/features/budgets/components/EmptyState.tsx/EmptyState.tsx +4 -1
  69. package/src/features/budgets/layouts/BudgetsDetailsLayout/BudgetsDetailsLayout.tsx +7 -5
  70. package/src/features/budgets/layouts/BudgetsLayout/BudgetsLayout.tsx +5 -3
  71. package/src/features/budgets/messages/budgetNotifications.ts +5 -5
  72. package/src/features/budgets/utils/handleBudgetError.tsx +5 -8
  73. package/src/features/budgets/utils/handleBudgetError.types.ts +3 -0
  74. package/src/features/buying-policies/components/AccountingFieldCriteriaSelector/AccountingFieldCriteriaSelector.tsx +5 -3
  75. package/src/features/buying-policies/components/AccountingFieldCriteriaSelector/AccountingValueCriteriaSelector.tsx +20 -9
  76. package/src/features/buying-policies/components/AddBuyingPolicyDrawer/AddBuyingPolicyDrawer.tsx +8 -5
  77. package/src/features/buying-policies/components/BasicBuyingPolicyDrawer/BasicBuyingPolicyDrawer.tsx +49 -33
  78. package/src/features/buying-policies/components/BudgetCriteriaSelector/BudgetCriteriaSelector.tsx +8 -2
  79. package/src/features/buying-policies/components/BuyingPolicyDropdownMenu/BuyingPolicyDropdownMenu.tsx +5 -3
  80. package/src/features/buying-policies/components/DeleteBuyingPolicyDrawer/DeleteBuyingPolicyDrawer.tsx +28 -24
  81. package/src/features/buying-policies/components/UpdateBuyingPolicyDrawer/UpdateBuyingPolicyDrawer.tsx +10 -7
  82. package/src/features/buying-policies/layouts/BuyingPoliciesLayout/BuyingPoliciesLayout.tsx +11 -4
  83. package/src/features/buying-policies/layouts/BuyingPolicyDetailsLayout/BuyingPolicyDetailsLayout.tsx +26 -9
  84. package/src/features/buying-policies/utils/accountingFieldCriteriaHelpers.ts +2 -2
  85. package/src/features/buying-policies/utils/buyingPoliciesWorkflowTypes.ts +3 -3
  86. package/src/features/buying-policies/utils/orderFieldsCriteriaOptions.ts +8 -8
  87. package/src/features/buying-policies/utils/spendingLimitsCriteriaOptions.ts +6 -6
  88. package/src/features/contracts/components/ContractsCard/ContractsCard.tsx +7 -5
  89. package/src/features/contracts/layouts/ContractsLayout/ContractsLayout.tsx +9 -4
  90. package/src/features/credit-cards/components/CreateCreditCardDrawer/CreateCreditCardDrawer.tsx +17 -11
  91. package/src/features/credit-cards/components/CreditCardDropdownMenu/CreditCardDropdownMenu.tsx +17 -11
  92. package/src/features/credit-cards/components/CreditCardForm/CreditCardForm.tsx +8 -5
  93. package/src/features/credit-cards/components/CreditCardSettingsDrawer/CreditCardSettingsDrawer.tsx +10 -8
  94. package/src/features/credit-cards/components/DeleteCreditCardDrawer/DeleteCreditCardDrawer.tsx +19 -14
  95. package/src/features/credit-cards/components/EditCreditCardDrawer/EditCreditCardDrawer.tsx +14 -13
  96. package/src/features/credit-cards/components/RemoveCreditCardDrawer/RemoveCreditCardDrawer.tsx +18 -15
  97. package/src/features/credit-cards/layouts/CreditCardsLayout/CreditCardLayout.tsx +10 -4
  98. package/src/features/order-entry/layouts/OrderEntryLayout.tsx +3 -1
  99. package/src/features/org-units/components/AddAllToOrgUnitDropdown/AddAllToOrgUnitDropdown.tsx +11 -9
  100. package/src/features/org-units/components/AuthSetupDrawer/AuthSetupDrawer.tsx +28 -16
  101. package/src/features/org-units/components/CreateOrgUnitDrawer/CreateOrgUnitDrawer.tsx +18 -12
  102. package/src/features/org-units/components/DeleteOrgUnitDrawer/DeleteOrgUnitDrawer.tsx +28 -29
  103. package/src/features/org-units/components/OrgUnitBreadcrumb/OrgUnitBreadcrumbLink.tsx +4 -4
  104. package/src/features/org-units/components/OrgUnitDetailsDropdownMenu/OrgUnitDetailsDropdownMenu.tsx +4 -2
  105. package/src/features/org-units/components/OrgUnitDetailsNavbar/OrgUnitDetailsNavbar.tsx +23 -5
  106. package/src/features/org-units/components/OrgUnitDetailsNavbar/org-unit-details-navbar.scss +18 -2
  107. package/src/features/org-units/components/OrgUnitsDropdownMenu/OrgUnitsDropdownMenu.tsx +6 -4
  108. package/src/features/org-units/components/OrgUnitsHierarchyTree/OrgUnitsHierarchyTree.tsx +9 -6
  109. package/src/features/org-units/components/OrganizationalUnitsCard/OrganizationalUnitsCard.tsx +15 -7
  110. package/src/features/org-units/components/UpdateOrgUnitDrawer/UpdateOrgUnitDrawer.tsx +15 -9
  111. package/src/features/org-units/layouts/OrgUnitDetailsLayout/OrgUnitDetailsLayout.tsx +27 -26
  112. package/src/features/org-units/layouts/OrgUnitsLayout/OrgUnitsLayout.tsx +8 -3
  113. package/src/features/payment-methods/components/AddPaymentMethodsDrawer/AddPaymentMethodsDrawer.tsx +29 -18
  114. package/src/features/payment-methods/components/PaymentMethodSettingsDrawer/PaymentMethodSettingsDrawer.tsx +13 -9
  115. package/src/features/payment-methods/components/RemoveMethodButton/RemoveMethodButton.tsx +5 -2
  116. package/src/features/payment-methods/components/RemovePaymentMethodsDrawer/RemovePaymentMethodsDrawer.tsx +10 -7
  117. package/src/features/payment-methods/hooks/useRemovePaymentMethodSubmit.ts +6 -4
  118. package/src/features/payment-methods/layouts/PaymentMethodsLayout/PaymentMethodsLayout.tsx +21 -15
  119. package/src/features/product-assortment/components/ProductAssortmentTable/ProductAssortmentTable.tsx +11 -7
  120. package/src/features/product-assortment/layouts/ProductAssortmentLayout/ProductAssortmentLayout.tsx +9 -6
  121. package/src/features/profile/components/ProfileCard/ProfileCard.tsx +8 -5
  122. package/src/features/profile/components/ProfileSummary/ProfileSummary.tsx +13 -6
  123. package/src/features/profile/layouts/ProfileLayout/ProfileLayout.tsx +16 -6
  124. package/src/features/roles/layout/RoleDetailsLayout/RoleDetailsLayout.tsx +4 -2
  125. package/src/features/roles/layout/RolesLayout/RolesLayout.tsx +5 -3
  126. package/src/features/shared/components/BasicCard/BasicCard.tsx +6 -4
  127. package/src/features/shared/components/BasicCard/BasicCardLine.tsx +5 -4
  128. package/src/features/shared/components/CustomerSwitch/CustomerSwitchDrawer.tsx +10 -2
  129. package/src/features/shared/components/CustomerSwitch/CustomerSwitchSearch.tsx +4 -1
  130. package/src/features/shared/components/DropdownFilter/DropdownFilter.tsx +11 -7
  131. package/src/features/shared/components/Error/Error.tsx +13 -6
  132. package/src/features/shared/components/HeaderInside/HeaderInside.tsx +5 -2
  133. package/src/features/shared/components/InternalSearch/InternalSearch.tsx +4 -1
  134. package/src/features/shared/components/InternalTopbar/InternalTopbar.tsx +7 -5
  135. package/src/features/shared/components/MainLinksDropdownMenu/MainLinksDropdownMenu.tsx +23 -8
  136. package/src/features/shared/components/OrgUnitInputSearch/OrgUnitInputSearch.tsx +7 -2
  137. package/src/features/shared/components/Pagination/Pagination.tsx +6 -2
  138. package/src/features/shared/components/Paginator/Counter.tsx +11 -5
  139. package/src/features/shared/components/Paginator/Interval.tsx +4 -3
  140. package/src/features/shared/components/Paginator/NextPageButton.tsx +6 -2
  141. package/src/features/shared/components/SettingsDrawer/SettingsDrawer.tsx +6 -4
  142. package/src/features/shared/components/SettingsDrawer/SettingsDrawerListType.tsx +11 -10
  143. package/src/features/shared/components/SettingsDrawer/listTypeOptions.ts +10 -7
  144. package/src/features/shared/components/SortFilter/SortFilter.tsx +15 -8
  145. package/src/features/shared/components/Table/TableRow/TableRow.tsx +5 -1
  146. package/src/features/shared/components/VerticalNav/VerticalNavLink.tsx +7 -3
  147. package/src/features/shared/layouts/BaseTabsLayout/Navbar.tsx +28 -4
  148. package/src/features/shared/layouts/BaseTabsLayout/about-drawer/AboutDrawer.tsx +15 -5
  149. package/src/features/shared/layouts/BaseTabsLayout/base-tabs-layout.scss +24 -9
  150. package/src/features/shared/layouts/BaseTabsLayout/sidebar-drawer/SidebarDrawer.tsx +5 -2
  151. package/src/features/shared/layouts/ContractTabsLayout/ContractTabsLayout.tsx +10 -5
  152. package/src/features/shared/layouts/ErrorTabsLayout/ErrorTabsLayout.tsx +7 -4
  153. package/src/features/shared/layouts/FinanceTabsLayout/FinanceTabsLayout.tsx +9 -4
  154. package/src/features/shared/layouts/LoadingTabsLayout/LoadingTabsLayout.tsx +7 -4
  155. package/src/features/shared/layouts/OrgUnitTabsLayout/OrgUnitTabLayout.tsx +3 -0
  156. package/src/features/shared/layouts/SumaPageLayout/FullSidebarNav.tsx +13 -7
  157. package/src/features/shared/layouts/SumaPageLayout/SumaSidebar.tsx +9 -5
  158. package/src/features/shared/localization/LocalizationContext.tsx +35 -0
  159. package/src/features/shared/localization/__tests__/createLocalize.test.ts +166 -0
  160. package/src/features/shared/localization/__tests__/get-localization-labels.service.test.ts +202 -0
  161. package/src/features/shared/localization/clients/LocalizationClient.ts +19 -0
  162. package/src/features/shared/localization/constants.ts +31 -0
  163. package/src/features/shared/localization/createLocalize.ts +78 -0
  164. package/src/features/shared/localization/services/get-localization-labels.service.ts +76 -0
  165. package/src/features/shared/localization/types.ts +66 -0
  166. package/src/features/shared/localization/withLocalization.tsx +22 -0
  167. package/src/features/shared/types/AuthRouteProps.ts +5 -0
  168. package/src/features/shared/types/LoaderData.ts +1 -0
  169. package/src/features/shared/utils/addresLabelToPropMapping.ts +10 -10
  170. package/src/features/shared/utils/constants.ts +1 -4
  171. package/src/features/shared/utils/getContractSettingsLinks.ts +17 -12
  172. package/src/features/shared/utils/getFinanceSettingsLinks.ts +14 -9
  173. package/src/features/shared/utils/getKeyByValue.ts +2 -2
  174. package/src/features/shared/utils/getOrganizationSettingsLinks.ts +13 -3
  175. package/src/features/shared/utils/getSumaListingSidebarLinks.ts +15 -10
  176. package/src/features/shared/utils/index.ts +2 -0
  177. package/src/features/shared/utils/routeLayoutMapping.ts +30 -30
  178. package/src/features/shared/utils/search.tsx +10 -0
  179. package/src/features/shared/utils/withAuth.tsx +6 -0
  180. package/src/features/shared/utils/withAuthLoader.ts +11 -0
  181. package/src/features/shared/utils/withLoaderErrorBoundary.ts +9 -0
  182. package/src/features/shared/utils/withProviders.tsx +13 -2
  183. package/src/features/users/components/CreateUserDrawer/CreateUserDrawer.tsx +39 -27
  184. package/src/features/users/components/CreateUserDrawerWithUsername/CreateUserDrawerWithUsername.tsx +41 -39
  185. package/src/features/users/components/DeleteUserDrawer/DeleteUserDrawer.tsx +27 -23
  186. package/src/features/users/components/EmailTransactionalSection/EmailTransactionalSection.tsx +6 -8
  187. package/src/features/users/components/LoginField/LoginField.tsx +4 -4
  188. package/src/features/users/components/ReassignOrgUnitDrawer/ReassignOrgUnitDrawer.tsx +22 -19
  189. package/src/features/users/components/ResetPasswordDrawer/ResetPasswordDrawer.tsx +16 -21
  190. package/src/features/users/components/UpdateUserDrawer/UpdateUserDrawer.tsx +26 -15
  191. package/src/features/users/components/UpdateUserDrawerWithUsername/UpdateUserDrawerWithUsername.tsx +22 -8
  192. package/src/features/users/components/UserDropdownMenu/UserDropdownMenu.tsx +7 -5
  193. package/src/features/users/components/UserFormFields/UserFormFields.tsx +9 -8
  194. package/src/features/users/components/UsersCard/UsersCard.tsx +4 -2
  195. package/src/features/users/layouts/UserDetailsLayout/UserDetailsLayout.tsx +26 -10
  196. package/src/features/users/layouts/UsersLayout/UsersLayout.tsx +12 -8
  197. package/src/pages/accounting-field.tsx +28 -15
  198. package/src/pages/address-details.tsx +37 -26
  199. package/src/pages/addresses.tsx +27 -12
  200. package/src/pages/budgets-details.tsx +25 -15
  201. package/src/pages/budgets.tsx +31 -17
  202. package/src/pages/buyer-organization-manager.tsx +23 -12
  203. package/src/pages/buying-policies.tsx +38 -20
  204. package/src/pages/buying-policy-details.tsx +20 -19
  205. package/src/pages/contracts.tsx +15 -1
  206. package/src/pages/credit-cards.tsx +30 -17
  207. package/src/pages/order-entry.tsx +26 -15
  208. package/src/pages/org-unit-details.tsx +20 -6
  209. package/src/pages/org-units.tsx +20 -6
  210. package/src/pages/payment-groups.tsx +15 -12
  211. package/src/pages/productAssortment.tsx +10 -1
  212. package/src/pages/profile.tsx +14 -1
  213. package/src/pages/role-details.tsx +19 -6
  214. package/src/pages/roles.tsx +27 -14
  215. package/src/pages/user-details.tsx +29 -17
  216. package/src/pages/users.tsx +11 -0
  217. package/vitest.config.ts +13 -0
  218. package/src/features/addresses/constants/messages.ts +0 -8
  219. package/src/features/credit-cards/constants/messages.ts +0 -6
@@ -2,6 +2,7 @@ import { useState, type ComponentProps } from "react";
2
2
 
3
3
  import { AutocompleteDropdown } from "..";
4
4
  import { useDebouncedSearchOrgUnit } from "../../../users/hooks";
5
+ import { useLocalization } from "../../localization/LocalizationContext";
5
6
  import { OptionSelected } from "../OptionSelected/OptionSelected";
6
7
 
7
8
  type Option = {
@@ -28,12 +29,16 @@ export const OrgUnitInputSearch = ({
28
29
  orgUnit,
29
30
  ...otherProps
30
31
  }: OrgUnitInputSearchProps) => {
32
+ const { t } = useLocalization();
31
33
  const [autocompleteInputValue, setAutocompleteInputValue] = useState("");
32
34
 
33
35
  const { searchedOrgUnits, isSearchedOrgUnitsLoading } =
34
36
  useDebouncedSearchOrgUnit(autocompleteInputValue);
35
37
 
36
- const loadingObject: Option = { id: "loading", name: "loading..." };
38
+ const loadingObject: Option = {
39
+ id: "loading",
40
+ name: t("shared.labels.loading"),
41
+ };
37
42
 
38
43
  const handleSelect = (option: Option) => {
39
44
  if (option.id === loadingObject.id) return;
@@ -56,7 +61,7 @@ export const OrgUnitInputSearch = ({
56
61
  ) : (
57
62
  <AutocompleteDropdown
58
63
  {...otherProps}
59
- label="Search organizational units"
64
+ label={t("shared.labels.searchOrganizationalUnits")}
60
65
  value={autocompleteInputValue}
61
66
  options={isSearchedOrgUnitsLoading ? [loadingObject] : searchedOrgUnits}
62
67
  onConfirmKeyPress={handleSelect}
@@ -1,5 +1,7 @@
1
1
  import { Button, Skeleton } from "@faststore/ui";
2
2
 
3
+ import { useLocalization } from "../../localization/LocalizationContext";
4
+
3
5
  interface PaginationProps {
4
6
  currentCount: number;
5
7
  variant?: "default" | "onlyText" | "counter";
@@ -15,11 +17,13 @@ export const Pagination = ({
15
17
  variant = "default",
16
18
  showMore,
17
19
  }: PaginationProps) => {
20
+ const { t } = useLocalization();
21
+
18
22
  return (
19
23
  <div data-fs-bp-pagination>
20
24
  {variant === "default" && (
21
25
  <Button variant="tertiary" onClick={showMore} loading={loading}>
22
- Load more
26
+ {t("shared.buttons.loadMore")}
23
27
  </Button>
24
28
  )}
25
29
 
@@ -27,7 +31,7 @@ export const Pagination = ({
27
31
  {loading ? (
28
32
  <Skeleton size={{ width: "3.75rem", height: "1.25rem" }} />
29
33
  ) : (
30
- `${currentCount} of ${total}`
34
+ t("shared.pagination.counter", [currentCount, total])
31
35
  )}
32
36
  </span>
33
37
  </div>
@@ -1,10 +1,16 @@
1
+ import { useLocalization } from "../../localization/LocalizationContext";
2
+
1
3
  export type CounterProps = {
2
4
  total: number;
3
5
  itemsLength: number;
4
6
  };
5
7
 
6
- export const Counter = ({ total, itemsLength }: CounterProps) => (
7
- <span data-fs-bp-paginator-counter>
8
- {itemsLength} of {total}
9
- </span>
10
- );
8
+ export const Counter = ({ total, itemsLength }: CounterProps) => {
9
+ const { t } = useLocalization();
10
+
11
+ return (
12
+ <span data-fs-bp-paginator-counter>
13
+ {t("shared.pagination.counter", [itemsLength, total])}
14
+ </span>
15
+ );
16
+ };
@@ -1,5 +1,7 @@
1
1
  import { Skeleton } from "@faststore/ui";
2
2
 
3
+ import { useLocalization } from "../../localization/LocalizationContext";
4
+
3
5
  const DEFAULT_PAGE_SIZE = 25;
4
6
 
5
7
  export type IntervalProps = {
@@ -17,6 +19,7 @@ export const Interval = ({
17
19
  pageSize = DEFAULT_PAGE_SIZE,
18
20
  isLoading = false,
19
21
  }: IntervalProps) => {
22
+ const { t } = useLocalization();
20
23
  const fromIndex = page - 1;
21
24
  const from = itemsLength > 0 ? Math.min(total, fromIndex * pageSize + 1) : 0;
22
25
  const to =
@@ -27,9 +30,7 @@ export const Interval = ({
27
30
  {isLoading ? (
28
31
  <Skeleton size={{ height: ".75rem", width: "5.5rem" }} />
29
32
  ) : (
30
- <>
31
- {from} to {to} of {total}
32
- </>
33
+ t("shared.pagination.interval", [from, to, total])
33
34
  )}
34
35
  </span>
35
36
  );
@@ -1,16 +1,20 @@
1
1
  import type { ComponentProps } from "react";
2
2
 
3
+ import { useLocalization } from "../../localization/LocalizationContext";
4
+
3
5
  export type NextPageButtonProps = ComponentProps<"button">;
4
6
 
5
7
  export const NextPageButton = ({
6
8
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
7
9
  type = "button",
8
- children = "Next Page",
10
+ children,
9
11
  ...otherProps
10
12
  }: NextPageButtonProps) => {
13
+ const { t } = useLocalization();
14
+
11
15
  return (
12
16
  <button data-fs-paginator-next-page-button type="button" {...otherProps}>
13
- {children}
17
+ {children ?? t("shared.pagination.nextPage")}
14
18
  </button>
15
19
  );
16
20
  };
@@ -1,6 +1,7 @@
1
1
  import React from "react";
2
2
 
3
3
  import { useBuyerPortal } from "../../hooks";
4
+ import { useLocalization } from "../../localization/LocalizationContext";
4
5
  import { BasicDrawer, type BasicDrawerProps } from "../BasicDrawer/BasicDrawer";
5
6
 
6
7
  import {
@@ -38,8 +39,8 @@ export const SettingsDrawer = ({
38
39
  title,
39
40
  subtitle,
40
41
  children,
41
- primaryButtonLabel = "Save",
42
- secondaryButtonLabel = "Cancel",
42
+ primaryButtonLabel,
43
+ secondaryButtonLabel,
43
44
  onPrimaryAction,
44
45
  onSecondaryAction,
45
46
  isPrimaryButtonLoading = false,
@@ -52,6 +53,7 @@ export const SettingsDrawer = ({
52
53
  onDismiss,
53
54
  ...otherProps
54
55
  }: SettingsDrawerProps) => {
56
+ const { t } = useLocalization();
55
57
  const { clientContext, currentOrgUnit, currentContract } = useBuyerPortal();
56
58
 
57
59
  const resolvedCustomerId =
@@ -87,7 +89,7 @@ export const SettingsDrawer = ({
87
89
  onClick={onSecondaryAction || handleClose}
88
90
  disabled={isSecondaryButtonDisabled}
89
91
  >
90
- {secondaryButtonLabel}
92
+ {secondaryButtonLabel ?? t("shared.buttons.cancel")}
91
93
  </BasicDrawer.Button>
92
94
  <BasicDrawer.Button
93
95
  variant="confirm"
@@ -95,7 +97,7 @@ export const SettingsDrawer = ({
95
97
  isLoading={isPrimaryButtonLoading}
96
98
  disabled={isPrimaryButtonDisabled}
97
99
  >
98
- {primaryButtonLabel}
100
+ {primaryButtonLabel ?? t("shared.buttons.save")}
99
101
  </BasicDrawer.Button>
100
102
  </BasicDrawer.Footer>
101
103
  </BasicDrawer>
@@ -3,26 +3,26 @@ import React, { useState } from "react";
3
3
  import { RadioGroup, RadioOption, Skeleton } from "@faststore/ui";
4
4
 
5
5
  import { useGetScopeConfig } from "../../hooks";
6
+ import { useLocalization } from "../../localization/LocalizationContext";
6
7
 
7
8
  import { useSettingsDrawerContext } from "./SettingsDrawerContext";
8
9
 
9
10
  export type ListTypeOption = {
10
11
  value: string;
11
- label: string;
12
- description: string;
12
+ labelKey: string;
13
+ descriptionKey: string;
13
14
  };
14
15
 
15
16
  export const DEFAULT_LIST_TYPE_OPTIONS: ListTypeOption[] = [
16
17
  {
17
18
  value: "custom",
18
- label: "Custom list",
19
- description: "Manage a unique for this organization.",
19
+ labelKey: "shared.labels.customList",
20
+ descriptionKey: "shared.messages.customListDescription",
20
21
  },
21
22
  {
22
23
  value: "sync",
23
- label: "Shared list",
24
- description:
25
- "Use the shared list defined by the contract. Updates are automatic.",
24
+ labelKey: "shared.labels.sharedList",
25
+ descriptionKey: "shared.messages.sharedListDescription",
26
26
  },
27
27
  ];
28
28
 
@@ -43,6 +43,7 @@ export const SettingsDrawerListType = ({
43
43
  onChange: controlledOnChange,
44
44
  disabled = false,
45
45
  }: SettingsDrawerListTypeProps) => {
46
+ const { t } = useLocalization();
46
47
  const { scopeName, customerId, unitId } = useSettingsDrawerContext();
47
48
  const [internalValue, setInternalValue] = useState<"sync" | "custom">(
48
49
  "custom"
@@ -94,14 +95,14 @@ export const SettingsDrawerListType = ({
94
95
  <div key={option.value} data-fs-bp-settings-drawer-list-type-option>
95
96
  <RadioOption
96
97
  value={option.value}
97
- label={option.label}
98
+ label={t(option.labelKey)}
98
99
  name={name}
99
100
  disabled={disabled || isLoading}
100
101
  >
101
- {option.label}
102
+ {t(option.labelKey)}
102
103
  </RadioOption>
103
104
  <p data-fs-bp-settings-drawer-list-type-description>
104
- {option.description}
105
+ {t(option.descriptionKey)}
105
106
  </p>
106
107
  </div>
107
108
  ))}
@@ -3,21 +3,24 @@ import {
3
3
  type ListTypeOption,
4
4
  } from "./SettingsDrawerListType";
5
5
 
6
- export const getCustomListDescription = (entityPlural: string) =>
7
- `Manage a unique list of ${entityPlural} for this organization.`;
6
+ import type { LocalizeFn } from "../../localization/types";
8
7
 
9
- export const getSharedListDescription = (entityPlural: string) =>
10
- `Use the shared list of ${entityPlural} defined by the contract. Updates are automatic.`;
8
+ export const getCustomListDescription = (entityPlural: string, t: LocalizeFn) =>
9
+ t("shared.messages.customListDescription", [entityPlural]);
10
+
11
+ export const getSharedListDescription = (entityPlural: string, t: LocalizeFn) =>
12
+ t("shared.messages.sharedListDescription", [entityPlural]);
11
13
 
12
14
  export const createListTypeOptions = (
13
- entityPlural: string
15
+ entityPlural: string,
16
+ t: LocalizeFn
14
17
  ): ListTypeOption[] => [
15
18
  {
16
19
  ...DEFAULT_LIST_TYPE_OPTIONS[0],
17
- description: getCustomListDescription(entityPlural),
20
+ descriptionKey: getCustomListDescription(entityPlural, t),
18
21
  },
19
22
  {
20
23
  ...DEFAULT_LIST_TYPE_OPTIONS[1],
21
- description: getSharedListDescription(entityPlural),
24
+ descriptionKey: getSharedListDescription(entityPlural, t),
22
25
  },
23
26
  ];
@@ -7,7 +7,8 @@ import {
7
7
  DropdownItem,
8
8
  } from "@faststore/ui";
9
9
 
10
- import { sortingOptions } from "../../utils";
10
+ import { useLocalization } from "../../localization/LocalizationContext";
11
+ import { sortingOptions, sortingOptionI18nKeys } from "../../utils";
11
12
  import { Icon } from "../Icon";
12
13
 
13
14
  type SortFilterProps = {
@@ -19,20 +20,26 @@ const SortFilter = ({
19
20
  updateSort,
20
21
  options = Object.keys(sortingOptions),
21
22
  }: SortFilterProps) => {
22
- const [currentSort, setCurrentSort] = useState(options[0]);
23
+ const { t } = useLocalization();
24
+
25
+ const getLabel = (option: string) =>
26
+ sortingOptionI18nKeys[option] ? t(sortingOptionI18nKeys[option]) : option;
23
27
 
24
- const updateCurrentSort = (newSort: string) => {
25
- setCurrentSort(newSort);
28
+ const [currentSort, setCurrentSort] = useState(options[0]);
26
29
 
27
- updateSort(newSort);
30
+ const updateCurrentSort = (option: string) => {
31
+ setCurrentSort(option);
32
+ updateSort(option);
28
33
  };
29
34
 
30
35
  return (
31
36
  <div data-fs-buyer-portal-sort-filter>
32
- <span data-fs-buyer-portal-sort-filter-label>Sort by:</span>
37
+ <span data-fs-buyer-portal-sort-filter-label>
38
+ {t("shared.labels.sortBy")}
39
+ </span>
33
40
  <Dropdown>
34
41
  <DropdownButton data-fs-buyer-portal-sort-filter-current>
35
- {currentSort}{" "}
42
+ {getLabel(currentSort)}{" "}
36
43
  <Icon
37
44
  name="Down"
38
45
  width={12}
@@ -48,7 +55,7 @@ const SortFilter = ({
48
55
  key={option}
49
56
  onClick={() => updateCurrentSort(option)}
50
57
  >
51
- {option}
58
+ {getLabel(option)}
52
59
  </DropdownItem>
53
60
  ))}
54
61
  </DropdownMenu>
@@ -1,6 +1,8 @@
1
1
  import type { ReactNode } from "react";
2
2
 
3
3
  import { Dropdown } from "@faststore/components";
4
+ import { useLink_unstable as useLink } from "@faststore/core/experimental";
5
+ import { Link } from "@faststore/ui";
4
6
 
5
7
  import { BasicDropdownMenu } from "../../BasicDropdownMenu/BasicDropdownMenu";
6
8
  import { Icon } from "../../Icon";
@@ -37,6 +39,8 @@ export const TableRow = ({
37
39
  prependColumns,
38
40
  ...otherProps
39
41
  }: TableRowProps) => {
42
+ const { resolveLink } = useLink();
43
+
40
44
  const classNames = () => {
41
45
  const classes: string[] = [];
42
46
 
@@ -100,7 +104,7 @@ export const TableRow = ({
100
104
  </Table.Cell>
101
105
  {href && (
102
106
  <Table.Cell data-fs-bp-table-row-link>
103
- <a href={href} onClick={onClick} />
107
+ <Link href={resolveLink(href)} onClick={onClick} />
104
108
  </Table.Cell>
105
109
  )}
106
110
  </tr>
@@ -1,8 +1,10 @@
1
1
  import React, { type ReactNode } from "react";
2
2
 
3
- import Link from "next/link";
4
3
  import { useRouter } from "next/router";
5
4
 
5
+ import { useLink_unstable as useLink } from "@faststore/core/experimental";
6
+ import { Link } from "@faststore/ui";
7
+
6
8
  export type VerticalNavLinkProps = {
7
9
  children: ReactNode;
8
10
  link: string;
@@ -24,13 +26,15 @@ export const VerticalNavLink = ({
24
26
  depth = 0,
25
27
  }: VerticalNavLinkProps) => {
26
28
  const { asPath } = useRouter();
29
+ const { resolveLink } = useLink();
30
+ const resolvedLink = resolveLink(link);
27
31
 
28
32
  const isActive = isActiveLink(asPath, link);
29
33
 
30
34
  return (
31
- <li key={link} data-fs-vertical-nav-menu-item>
35
+ <li key={resolvedLink} data-fs-vertical-nav-menu-item>
32
36
  <Link
33
- href={link}
37
+ href={resolvedLink}
34
38
  data-fs-vertical-nav-menu-link
35
39
  data-fs-vertical-nav-menu-link-is-active={isActive}
36
40
  style={
@@ -1,14 +1,30 @@
1
1
  import type { ReactNode } from "react";
2
2
 
3
- import Link from "next/link";
3
+ import dynamic from "next/dynamic";
4
4
 
5
- import { Dropdown, DropdownMenu, IconButton, Skeleton } from "@faststore/ui";
5
+ import { useLink_unstable as useLink } from "@faststore/core/experimental";
6
+ import {
7
+ Dropdown,
8
+ DropdownMenu,
9
+ IconButton,
10
+ Link,
11
+ Skeleton,
12
+ } from "@faststore/ui";
13
+
14
+ const LocalizationButton = dynamic(
15
+ () =>
16
+ import("@faststore/core/experimental").then(
17
+ (m) => m.LocalizationButton_unstable
18
+ ),
19
+ { ssr: false }
20
+ );
6
21
 
7
22
  import { OrgUnitBreadcrumb } from "../../../org-units/components";
8
23
  import { ProfileSummary } from "../../../profile/components";
9
24
  import { BasicDropdownMenu } from "../../components";
10
25
  import { Icon } from "../../components/Icon";
11
26
  import { useDrawerProps } from "../../hooks";
27
+ import { useLocalization } from "../../localization/LocalizationContext";
12
28
  import { doLogout } from "../../utils";
13
29
 
14
30
  import { AboutDrawer } from "./about-drawer/AboutDrawer";
@@ -38,6 +54,8 @@ export const Navbar = ({
38
54
  contractId = "",
39
55
  ...otherProps
40
56
  }: NavbarProps) => {
57
+ const { t } = useLocalization();
58
+ const { resolveLink } = useLink();
41
59
  const {
42
60
  open: openSidebarMenu,
43
61
  isOpen: isOpenSidebarMenuDrawerOpen,
@@ -76,12 +94,18 @@ export const Navbar = ({
76
94
  />
77
95
  )}
78
96
  <div data-fs-bp-nav-menu-actions>
97
+ <LocalizationButton
98
+ saveLabel={t("shared.buttons.save")}
99
+ currencyLabel={t("layouts.labels.currency")}
100
+ languageLabel={t("layouts.labels.language")}
101
+ icon="Globe"
102
+ />
79
103
  <Link
80
- href="/"
104
+ href={resolveLink("/")}
81
105
  target="_blank"
82
106
  data-fs-bp-nav-menu-start-shopping-link
83
107
  >
84
- Start shopping
108
+ {t("layouts.navigation.startShopping")}
85
109
  </Link>
86
110
 
87
111
  <IconButton
@@ -2,6 +2,7 @@ import { Skeleton } from "@faststore/ui";
2
2
 
3
3
  import { BasicDrawer, type BasicDrawerProps } from "../../../components";
4
4
  import { useGetDependenciesVersion } from "../../../hooks";
5
+ import { useLocalization } from "../../../localization/LocalizationContext";
5
6
  import { CURRENT_VERSION } from "../../../utils/constants";
6
7
 
7
8
  export type AboutDrawerProps = Omit<BasicDrawerProps, "children"> & {
@@ -16,6 +17,7 @@ export const AboutDrawer = ({
16
17
  contractId = "",
17
18
  ...props
18
19
  }: AboutDrawerProps) => {
20
+ const { t } = useLocalization();
19
21
  const { dependenciesVersion, isDependenciesVersionLoading } =
20
22
  useGetDependenciesVersion(unitId);
21
23
 
@@ -26,16 +28,20 @@ export const AboutDrawer = ({
26
28
  {...props}
27
29
  data-fs-slide-over-direction="rightSide"
28
30
  >
29
- <BasicDrawer.Heading title="About" onClose={close} />
31
+ <BasicDrawer.Heading title={t("layouts.drawers.about")} onClose={close} />
30
32
  <BasicDrawer.Body data-bp-about-menu-drawer-body>
31
33
  <div data-fs-bp-about-information>
32
- <p data-fs-bp-about-information-title>Version details</p>
34
+ <p data-fs-bp-about-information-title>
35
+ {t("layouts.titles.versionDetails")}
36
+ </p>
33
37
  {isDependenciesVersionLoading ? (
34
38
  <Skeleton size={{ width: "100%", height: "3.5rem" }} />
35
39
  ) : (
36
40
  <>
37
41
  <div data-fs-bp-about-row>
38
- <span data-fs-bp-about-row-label>Organization Account</span>
42
+ <span data-fs-bp-about-row-label>
43
+ {t("layouts.labels.organizationAccount")}
44
+ </span>
39
45
  <span data-fs-bp-about-row-value>{CURRENT_VERSION}</span>
40
46
  </div>
41
47
  {dependenciesVersion &&
@@ -55,11 +61,15 @@ export const AboutDrawer = ({
55
61
  )}
56
62
  </div>
57
63
  <div data-fs-bp-about-information>
58
- <p data-fs-bp-about-information-title>Navigation Details</p>
64
+ <p data-fs-bp-about-information-title>
65
+ {t("layouts.titles.navigationDetails")}
66
+ </p>
59
67
  {!!contractId && (
60
68
  <>
61
69
  <div data-fs-bp-about-row data-fs-bp-about-row-contract-id>
62
- <span data-fs-bp-about-row-label>Contract ID</span>
70
+ <span data-fs-bp-about-row-label>
71
+ {t("layouts.labels.contractId")}
72
+ </span>
63
73
  <span data-fs-bp-about-row-value>{contractId}</span>
64
74
  </div>
65
75
  </>
@@ -2,13 +2,13 @@
2
2
  @import "./sidebar-drawer/sidebar-drawer.scss";
3
3
 
4
4
  [data-fs-bp-base-tabs-layout] {
5
-
5
+
6
6
  display: grid;
7
7
  grid-template-rows: auto 1fr;
8
8
  height: 100vh;
9
9
  overflow: hidden;
10
10
 
11
- [data-fs-bp-nav] {
11
+ [data-fs-bp-nav] {
12
12
  display: flex;
13
13
  justify-content: space-between;
14
14
  align-items: center;
@@ -22,11 +22,21 @@
22
22
  padding-right: var(--fs-bp-padding-10);
23
23
  }
24
24
 
25
+ [data-fs-localization-button] {
26
+ [data-fs-button-wrapper] {
27
+ span {
28
+ display: inline-flex;
29
+ align-items: center;
30
+ gap: var(--fs-bp-gap-3);
31
+ }
32
+ }
33
+ }
34
+
25
35
  [data-fs-bp-breadcrumb-nav] {
26
36
  [data-fs-bp-breadcrumb-current],
27
37
  [data-fs-bp-breadcrumb-dropdown-trigger] {
28
38
  font-size: var(--fs-bp-text-body);
29
-
39
+
30
40
  @include u.media(">=phonemid") {
31
41
  font-size: var(--fs-bp-text-body-big);
32
42
  }
@@ -79,25 +89,25 @@
79
89
 
80
90
  [data-fs-bp-nav-menu-start-shopping-link] {
81
91
  display: none;
82
-
92
+
83
93
  padding: var(--fs-bp-padding-0) var(--fs-bp-padding-5);
84
94
  @include text-style('action');
85
95
  color: var(--fs-bp-color-neutral-8);
86
96
  border-radius: var(--fs-bp-border-radius-full);
87
-
97
+
88
98
  height: var(--fs-bp-spacing-9);
89
99
  justify-content: center;
90
100
  align-items: center;
91
101
  text-decoration: none;
92
-
102
+
93
103
  &:hover {
94
104
  background-color: var(--fs-bp-color-transparent-0);
95
105
  }
96
-
106
+
97
107
  &:active {
98
108
  background-color: var(--fs-bp-color-transparent-1);
99
109
  }
100
-
110
+
101
111
  @include u.media(">=tablet") {
102
112
  display: inline-flex;
103
113
  }
@@ -135,7 +145,7 @@
135
145
 
136
146
  [data-fs-vertical-nav-menu] {
137
147
  margin-bottom: var(--fs-bp-padding-5);
138
-
148
+
139
149
  [data-fs-vertical-nav-menu-org-wrapper] {
140
150
  [data-fs-vertical-nav-menu-org-name] {
141
151
  @include text-style('emphasis');
@@ -165,3 +175,8 @@
165
175
  }
166
176
  }
167
177
  }
178
+
179
+ // !important para vencer a especificidade do CSS module do selector (portal).
180
+ [data-fs-localization-selector] {
181
+ --fs-localization-selector-max-width: 20rem !important;
182
+ }
@@ -1,6 +1,7 @@
1
1
  import storeConfig from "discovery.config";
2
2
 
3
- import Link from "next/link";
3
+ import { useLink_unstable as useLink } from "@faststore/core/experimental";
4
+ import { Link } from "@faststore/ui";
4
5
 
5
6
  import { BasicDrawer, type BasicDrawerProps } from "../../../components";
6
7
  import { SidebarMenu } from "../SidebarMenu";
@@ -17,6 +18,8 @@ export const SidebarDrawer = ({
17
18
  close,
18
19
  ...props
19
20
  }: SidebarDrawerProps) => {
21
+ const { resolveLink } = useLink();
22
+
20
23
  return (
21
24
  <BasicDrawer
22
25
  data-bp-sidebar-menu
@@ -27,7 +30,7 @@ export const SidebarDrawer = ({
27
30
  >
28
31
  <BasicDrawer.Heading
29
32
  title={
30
- <Link href="/" data-fs-bp-org-unit-details-navbar-link>
33
+ <Link href={resolveLink("/")} data-fs-bp-org-unit-details-navbar-link>
31
34
  {storeConfig.seo.title}
32
35
  </Link>
33
36
  }
@@ -5,6 +5,7 @@ import { DropdownItem } from "@faststore/ui";
5
5
  import { OrgUnitDetailsNavbar } from "../../../org-units/components";
6
6
  import { Icon } from "../../components";
7
7
  import { useBuyerPortal, useReloadOnBfcacheRestore } from "../../hooks";
8
+ import { useLocalization } from "../../localization/LocalizationContext";
8
9
  import { getContractSettingsLinks } from "../../utils";
9
10
  import { BaseTabsLayout } from "../BaseTabsLayout/BaseTabsLayout";
10
11
  import { SumaSidebar } from "../SumaPageLayout/SumaSidebar";
@@ -28,6 +29,7 @@ export const ContractTabsLayout = ({
28
29
  }: ContractTabsLayoutProps) => {
29
30
  const { currentOrgUnit, currentUser, currentContract, featureFlags } =
30
31
  useBuyerPortal();
32
+ const { t } = useLocalization();
31
33
 
32
34
  useReloadOnBfcacheRestore();
33
35
 
@@ -67,10 +69,13 @@ export const ContractTabsLayout = ({
67
69
  );
68
70
  }
69
71
 
70
- const verticalLinks = getContractSettingsLinks({
71
- contractId: resolvedContractId,
72
- orgUnitId: resolvedOrgUnitId,
73
- });
72
+ const verticalLinks = getContractSettingsLinks(
73
+ {
74
+ contractId: resolvedContractId,
75
+ orgUnitId: resolvedOrgUnitId,
76
+ },
77
+ t
78
+ );
74
79
 
75
80
  return (
76
81
  <BaseTabsLayout data-fs-bp-contract-tabs-layout>
@@ -91,7 +96,7 @@ export const ContractTabsLayout = ({
91
96
  dropdownOptions={
92
97
  <DropdownItem>
93
98
  <Icon name="DoNotDisturbOn" width={20} height={20} />
94
- Remove from unit
99
+ {t("layouts.actions.removeFromUnit")}
95
100
  </DropdownItem>
96
101
  }
97
102
  verticalLinks={verticalLinks}