@mercurjs/dashboard-shared 2.3.6-canary.6 → 2.3.6-canary.7

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 (3) hide show
  1. package/dist/index.d.ts +153 -7
  2. package/dist/index.js +459 -297
  3. package/package.json +5 -5
package/dist/index.js CHANGED
@@ -13313,6 +13313,8 @@ var TransferOwnershipSchema = z.object({
13313
13313
  // src/components/common/action-menu/action-menu.tsx
13314
13314
  import { DropdownMenu, IconButton, clx } from "@medusajs/ui";
13315
13315
  import { EllipsisHorizontal } from "@medusajs/icons";
13316
+ import { useContext as useContext2, useMemo as useMemo2 } from "react";
13317
+ import { useTranslation } from "react-i18next";
13316
13318
  import { Link } from "react-router-dom";
13317
13319
 
13318
13320
  // src/components/common/conditional-tooltip/conditional-tooltip.tsx
@@ -13361,14 +13363,100 @@ var useDocumentDirection = () => {
13361
13363
  return direction;
13362
13364
  };
13363
13365
 
13366
+ // src/permissions/action-permissions.ts
13367
+ import { useContext, useMemo } from "react";
13368
+
13369
+ // ../dashboard-sdk/dist/index.js
13370
+ var PERMISSION_RIGHT_RANK = {
13371
+ view: 1,
13372
+ edit: 2,
13373
+ manage: 3
13374
+ };
13375
+ function parsePermission(permission) {
13376
+ const index = permission.lastIndexOf(":");
13377
+ if (index <= 0) {
13378
+ return null;
13379
+ }
13380
+ const right = permission.slice(index + 1);
13381
+ if (!(right in PERMISSION_RIGHT_RANK)) {
13382
+ return null;
13383
+ }
13384
+ return {
13385
+ key: permission.slice(0, index),
13386
+ right
13387
+ };
13388
+ }
13389
+ function satisfiesPermission(permissions, key, right) {
13390
+ const granted = permissions[key];
13391
+ return !!granted && PERMISSION_RIGHT_RANK[granted] >= PERMISSION_RIGHT_RANK[right];
13392
+ }
13393
+
13394
+ // src/permissions/permission-check.ts
13395
+ var toPermissionList = (permission) => !permission ? [] : Array.isArray(permission) ? permission : [permission];
13396
+ var isPermitted = (checks, permission, requireAll = false) => {
13397
+ const list = toPermissionList(permission);
13398
+ if (!checks || !list.length) {
13399
+ return true;
13400
+ }
13401
+ return requireAll ? checks.hasAllPermissions(list) : checks.hasAnyPermission(list);
13402
+ };
13403
+ var permissionMapAllows = (map, permission, requireAll = true) => {
13404
+ const list = toPermissionList(permission);
13405
+ if (!map || !list.length) {
13406
+ return true;
13407
+ }
13408
+ const allows = (entry) => {
13409
+ const parsed = parsePermission(entry);
13410
+ return !!parsed && satisfiesPermission(map, parsed.key, parsed.right);
13411
+ };
13412
+ return requireAll ? list.every(allows) : list.some(allows);
13413
+ };
13414
+ var isForbidden = (error) => !!error && typeof error === "object" && error.status === 403;
13415
+
13416
+ // src/permissions/permissions-context.tsx
13417
+ import { createContext } from "react";
13418
+ var PermissionsContext = createContext(
13419
+ null
13420
+ );
13421
+
13422
+ // src/permissions/action-permissions.ts
13423
+ var applyActionPermissions = (groups, checks, deniedTooltip) => groups.map((group) => ({
13424
+ ...group,
13425
+ actions: group.actions.map(
13426
+ (action) => isPermitted(checks, action.permission, action.requireAll) ? action : { ...action, disabled: true, disabledTooltip: deniedTooltip }
13427
+ )
13428
+ }));
13429
+ var filterCommandsByPermission = (commands, checks) => commands.filter(
13430
+ (command) => isPermitted(checks, command.permission, command.requireAll)
13431
+ ).map(
13432
+ ({ permission: _permission, requireAll: _requireAll, ...command }) => command
13433
+ );
13434
+ var usePermittedCommands = (commands) => {
13435
+ const context = useContext(PermissionsContext);
13436
+ return useMemo(
13437
+ () => filterCommandsByPermission(commands, context),
13438
+ [commands, context]
13439
+ );
13440
+ };
13441
+
13364
13442
  // src/components/common/action-menu/action-menu.tsx
13365
13443
  import { jsx as jsx2, jsxs } from "react/jsx-runtime";
13366
13444
  var ActionMenu = ({
13367
- groups,
13445
+ groups: declaredGroups,
13368
13446
  variant = "transparent",
13369
13447
  children
13370
13448
  }) => {
13371
13449
  const direction = useDocumentDirection();
13450
+ const { t: t2 } = useTranslation();
13451
+ const permissions = useContext2(PermissionsContext);
13452
+ const groups = useMemo2(
13453
+ () => applyActionPermissions(
13454
+ declaredGroups,
13455
+ permissions,
13456
+ t2("permissions.accessDenied.action")
13457
+ ),
13458
+ [declaredGroups, permissions, t2]
13459
+ );
13372
13460
  const inner = children ?? /* @__PURE__ */ jsx2(IconButton, { size: "small", variant, children: /* @__PURE__ */ jsx2(EllipsisHorizontal, {}) });
13373
13461
  return /* @__PURE__ */ jsxs(DropdownMenu, { dir: direction, children: [
13374
13462
  /* @__PURE__ */ jsx2(DropdownMenu.Trigger, { asChild: true, children: inner }),
@@ -13436,7 +13524,7 @@ var ActionMenu = ({
13436
13524
 
13437
13525
  // src/components/common/badge-list-summary/badge-list-summary.tsx
13438
13526
  import { Badge, Tooltip as Tooltip2, clx as clx2 } from "@medusajs/ui";
13439
- import { useTranslation } from "react-i18next";
13527
+ import { useTranslation as useTranslation2 } from "react-i18next";
13440
13528
  import { jsx as jsx3, jsxs as jsxs2 } from "react/jsx-runtime";
13441
13529
  var BadgeListSummary = ({
13442
13530
  list,
@@ -13445,7 +13533,7 @@ var BadgeListSummary = ({
13445
13533
  rounded = false,
13446
13534
  n = 2
13447
13535
  }) => {
13448
- const { t: t2 } = useTranslation();
13536
+ const { t: t2 } = useTranslation2();
13449
13537
  const title = t2("general.plusCount", {
13450
13538
  count: list.length - n
13451
13539
  });
@@ -13487,12 +13575,12 @@ var BadgeListSummary = ({
13487
13575
  // src/components/common/chip-group/chip-group.tsx
13488
13576
  import { XMarkMini } from "@medusajs/icons";
13489
13577
  import { Button, clx as clx3 } from "@medusajs/ui";
13490
- import { Children, createContext, useContext } from "react";
13491
- import { useTranslation as useTranslation2 } from "react-i18next";
13578
+ import { Children, createContext as createContext2, useContext as useContext3 } from "react";
13579
+ import { useTranslation as useTranslation3 } from "react-i18next";
13492
13580
  import { jsx as jsx4, jsxs as jsxs3 } from "react/jsx-runtime";
13493
- var GroupContext = createContext(null);
13581
+ var GroupContext = createContext2(null);
13494
13582
  var useGroupContext = () => {
13495
- const context = useContext(GroupContext);
13583
+ const context = useContext3(GroupContext);
13496
13584
  if (!context) {
13497
13585
  throw new Error("useGroupContext must be used within a ChipGroup component");
13498
13586
  }
@@ -13505,7 +13593,7 @@ var Group = ({
13505
13593
  className,
13506
13594
  children
13507
13595
  }) => {
13508
- const { t: t2 } = useTranslation2();
13596
+ const { t: t2 } = useTranslation3();
13509
13597
  const showClearAll = !!onClearAll && Children.count(children) > 0;
13510
13598
  return /* @__PURE__ */ jsx4(GroupContext.Provider, { value: { onRemove, variant }, children: /* @__PURE__ */ jsxs3(
13511
13599
  "ul",
@@ -13568,7 +13656,7 @@ var ChipGroup = Object.assign(Group, { Chip });
13568
13656
  // src/components/common/confirm-prompt/confirm-prompt.tsx
13569
13657
  import { Label, Prompt, Textarea } from "@medusajs/ui";
13570
13658
  import { useEffect as useEffect2, useState as useState2 } from "react";
13571
- import { useTranslation as useTranslation3 } from "react-i18next";
13659
+ import { useTranslation as useTranslation4 } from "react-i18next";
13572
13660
  import { jsx as jsx5, jsxs as jsxs4 } from "react/jsx-runtime";
13573
13661
  var ConfirmPrompt = ({
13574
13662
  open,
@@ -13585,7 +13673,7 @@ var ConfirmPrompt = ({
13585
13673
  isLoading = false,
13586
13674
  onConfirm
13587
13675
  }) => {
13588
- const { t: t2 } = useTranslation3();
13676
+ const { t: t2 } = useTranslation4();
13589
13677
  const [note, setNote] = useState2(defaultNote);
13590
13678
  useEffect2(() => {
13591
13679
  if (open) {
@@ -13646,11 +13734,11 @@ var ConfirmPrompt = ({
13646
13734
 
13647
13735
  // src/components/common/customer-info/customer-info.tsx
13648
13736
  import { Avatar, Copy, Text } from "@medusajs/ui";
13649
- import { useTranslation as useTranslation4 } from "react-i18next";
13737
+ import { useTranslation as useTranslation5 } from "react-i18next";
13650
13738
  import { Link as Link2 } from "react-router-dom";
13651
13739
  import { jsx as jsx6, jsxs as jsxs5 } from "react/jsx-runtime";
13652
13740
  var ID = ({ data }) => {
13653
- const { t: t2 } = useTranslation4();
13741
+ const { t: t2 } = useTranslation5();
13654
13742
  const id = data.customer_id;
13655
13743
  const name = getOrderCustomer(data);
13656
13744
  const email = data.email;
@@ -13679,7 +13767,7 @@ var ID = ({ data }) => {
13679
13767
  ] });
13680
13768
  };
13681
13769
  var Company = ({ data }) => {
13682
- const { t: t2 } = useTranslation4();
13770
+ const { t: t2 } = useTranslation5();
13683
13771
  const company = data.shipping_address?.company || data.billing_address?.company;
13684
13772
  if (!company) {
13685
13773
  return null;
@@ -13690,7 +13778,7 @@ var Company = ({ data }) => {
13690
13778
  ] });
13691
13779
  };
13692
13780
  var Contact = ({ data }) => {
13693
- const { t: t2 } = useTranslation4();
13781
+ const { t: t2 } = useTranslation5();
13694
13782
  const phone = data.shipping_address?.phone || data.billing_address?.phone;
13695
13783
  const email = data.email || "";
13696
13784
  return /* @__PURE__ */ jsxs5("div", { className: "text-ui-fg-subtle grid grid-cols-2 items-start px-6 py-4", children: [
@@ -13727,7 +13815,7 @@ var AddressPrint = ({
13727
13815
  address,
13728
13816
  type
13729
13817
  }) => {
13730
- const { t: t2 } = useTranslation4();
13818
+ const { t: t2 } = useTranslation5();
13731
13819
  return /* @__PURE__ */ jsxs5("div", { className: "text-ui-fg-subtle grid grid-cols-2 items-start px-6 py-4", children: [
13732
13820
  /* @__PURE__ */ jsx6(Text, { size: "small", leading: "compact", weight: "plus", children: type === "shipping" ? t2("addresses.shippingAddress.label") : t2("addresses.billingAddress.label") }),
13733
13821
  address ? /* @__PURE__ */ jsxs5("div", { className: "grid grid-cols-[1fr_20px] items-start gap-x-2", children: [
@@ -13748,7 +13836,7 @@ var AddressPrint = ({
13748
13836
  ] });
13749
13837
  };
13750
13838
  var Addresses = ({ data }) => {
13751
- const { t: t2 } = useTranslation4();
13839
+ const { t: t2 } = useTranslation5();
13752
13840
  return /* @__PURE__ */ jsxs5("div", { className: "divide-y", children: [
13753
13841
  /* @__PURE__ */ jsx6(AddressPrint, { address: data.shipping_address, type: "shipping" }),
13754
13842
  !isSameAddress(data.shipping_address, data.billing_address) ? /* @__PURE__ */ jsx6(AddressPrint, { address: data.billing_address, type: "billing" }) : /* @__PURE__ */ jsxs5("div", { className: "grid grid-cols-2 items-center px-6 py-4", children: [
@@ -13788,7 +13876,7 @@ var getOrderCustomer = (obj) => {
13788
13876
 
13789
13877
  // src/components/common/date-range-display/date-range-display.tsx
13790
13878
  import { Text as Text2, clx as clx4 } from "@medusajs/ui";
13791
- import { useTranslation as useTranslation5 } from "react-i18next";
13879
+ import { useTranslation as useTranslation6 } from "react-i18next";
13792
13880
 
13793
13881
  // src/hooks/use-date.tsx
13794
13882
  import { format, formatDistance, sub } from "date-fns";
@@ -13825,7 +13913,7 @@ var DateRangeDisplay = ({
13825
13913
  }) => {
13826
13914
  const startDate = startsAt ? new Date(startsAt) : null;
13827
13915
  const endDate = endsAt ? new Date(endsAt) : null;
13828
- const { t: t2 } = useTranslation5();
13916
+ const { t: t2 } = useTranslation6();
13829
13917
  const { getFullDate } = useDate();
13830
13918
  return /* @__PURE__ */ jsxs6("div", { className: "grid gap-3 md:grid-cols-2", children: [
13831
13919
  /* @__PURE__ */ jsxs6("div", { className: "shadow-elevation-card-rest bg-ui-bg-component text-ui-fg-subtle flex items-center gap-x-3 rounded-md px-3 py-1.5", children: [
@@ -13864,16 +13952,31 @@ var Bar = ({ date }) => {
13864
13952
  };
13865
13953
 
13866
13954
  // src/components/common/display-id/display-id.tsx
13867
- import { useTranslation as useTranslation6 } from "react-i18next";
13955
+ import { useTranslation as useTranslation7 } from "react-i18next";
13868
13956
  import { useState as useState3 } from "react";
13869
13957
  import copy from "copy-to-clipboard";
13870
13958
  import { clx as clx5, toast, Tooltip as Tooltip3 } from "@medusajs/ui";
13871
13959
  import { jsx as jsx8, jsxs as jsxs7 } from "react/jsx-runtime";
13872
13960
 
13961
+ // src/permissions/use-permission-gate.tsx
13962
+ import { useContext as useContext4 } from "react";
13963
+ import { useTranslation as useTranslation8 } from "react-i18next";
13964
+ var usePermissionGate = (permission, requireAll = false) => {
13965
+ const { t: t2 } = useTranslation8();
13966
+ const context = useContext4(PermissionsContext);
13967
+ const allowed = isPermitted(context, permission, requireAll);
13968
+ return {
13969
+ allowed,
13970
+ denied: !allowed,
13971
+ tooltip: allowed ? void 0 : t2("permissions.accessDenied.action")
13972
+ };
13973
+ };
13974
+
13873
13975
  // src/components/common/empty-table-content/empty-table-content.tsx
13976
+ import { cloneElement } from "react";
13874
13977
  import { ExclamationCircle, MagnifyingGlass, PlusMini } from "@medusajs/icons";
13875
- import { Button as Button2, Text as Text3, clx as clx6 } from "@medusajs/ui";
13876
- import { useTranslation as useTranslation7 } from "react-i18next";
13978
+ import { Button as Button2, Text as Text3, clx as clx6, Tooltip as Tooltip4 } from "@medusajs/ui";
13979
+ import { useTranslation as useTranslation9 } from "react-i18next";
13877
13980
  import { Link as Link3 } from "react-router-dom";
13878
13981
  import { jsx as jsx9, jsxs as jsxs8 } from "react/jsx-runtime";
13879
13982
  var NoResults = ({
@@ -13882,7 +13985,7 @@ var NoResults = ({
13882
13985
  className,
13883
13986
  icon = /* @__PURE__ */ jsx9(MagnifyingGlass, {})
13884
13987
  }) => {
13885
- const { t: t2 } = useTranslation7();
13988
+ const { t: t2 } = useTranslation9();
13886
13989
  return /* @__PURE__ */ jsx9(
13887
13990
  "div",
13888
13991
  {
@@ -13898,8 +14001,18 @@ var NoResults = ({
13898
14001
  }
13899
14002
  );
13900
14003
  };
13901
- var DefaultButton = ({ action }) => action && /* @__PURE__ */ jsx9(Link3, { to: action.to, children: /* @__PURE__ */ jsx9(Button2, { variant: "secondary", size: "small", children: action.label }) });
13902
- var TransparentIconLeftButton = ({ action }) => action && /* @__PURE__ */ jsx9(Link3, { to: action.to, children: /* @__PURE__ */ jsxs8(Button2, { variant: "transparent", className: "text-ui-fg-interactive", children: [
14004
+ var ActionLink = ({
14005
+ action,
14006
+ children
14007
+ }) => {
14008
+ const gate = usePermissionGate(action.permission);
14009
+ if (gate.denied) {
14010
+ return /* @__PURE__ */ jsx9(Tooltip4, { content: gate.tooltip, children: /* @__PURE__ */ jsx9("span", { className: "inline-flex", children: cloneElement(children, { disabled: true }) }) });
14011
+ }
14012
+ return /* @__PURE__ */ jsx9(Link3, { to: action.to, children });
14013
+ };
14014
+ var DefaultButton = ({ action }) => action && /* @__PURE__ */ jsx9(ActionLink, { action, children: /* @__PURE__ */ jsx9(Button2, { variant: "secondary", size: "small", children: action.label }) });
14015
+ var TransparentIconLeftButton = ({ action }) => action && /* @__PURE__ */ jsx9(ActionLink, { action, children: /* @__PURE__ */ jsxs8(Button2, { variant: "transparent", className: "text-ui-fg-interactive", children: [
13903
14016
  /* @__PURE__ */ jsx9(PlusMini, {}),
13904
14017
  " ",
13905
14018
  action.label
@@ -13912,7 +14025,7 @@ var NoRecords = ({
13912
14025
  buttonVariant = "default",
13913
14026
  icon = /* @__PURE__ */ jsx9(ExclamationCircle, { className: "text-ui-fg-subtle" })
13914
14027
  }) => {
13915
- const { t: t2 } = useTranslation7();
14028
+ const { t: t2 } = useTranslation9();
13916
14029
  return /* @__PURE__ */ jsxs8(
13917
14030
  "div",
13918
14031
  {
@@ -14192,14 +14305,14 @@ import {
14192
14305
  Hint as HintComponent,
14193
14306
  Label as LabelComponent,
14194
14307
  Text as Text6,
14195
- Tooltip as Tooltip4,
14308
+ Tooltip as Tooltip5,
14196
14309
  clx as clx8
14197
14310
  } from "@medusajs/ui";
14198
14311
  import { Slot } from "radix-ui";
14199
14312
  import {
14200
- createContext as createContext2,
14313
+ createContext as createContext3,
14201
14314
  forwardRef,
14202
- useContext as useContext2,
14315
+ useContext as useContext5,
14203
14316
  useId
14204
14317
  } from "react";
14205
14318
  import {
@@ -14208,10 +14321,10 @@ import {
14208
14321
  useFormContext,
14209
14322
  useFormState
14210
14323
  } from "react-hook-form";
14211
- import { useTranslation as useTranslation8 } from "react-i18next";
14324
+ import { useTranslation as useTranslation10 } from "react-i18next";
14212
14325
  import { jsx as jsx12, jsxs as jsxs11 } from "react/jsx-runtime";
14213
14326
  var Provider = FormProvider;
14214
- var FormFieldContext = createContext2(
14327
+ var FormFieldContext = createContext3(
14215
14328
  {}
14216
14329
  );
14217
14330
  var Field = ({
@@ -14219,12 +14332,12 @@ var Field = ({
14219
14332
  }) => {
14220
14333
  return /* @__PURE__ */ jsx12(FormFieldContext.Provider, { value: { name: props.name }, children: /* @__PURE__ */ jsx12(Controller, { ...props }) });
14221
14334
  };
14222
- var FormItemContext = createContext2(
14335
+ var FormItemContext = createContext3(
14223
14336
  {}
14224
14337
  );
14225
14338
  var useFormField = () => {
14226
- const fieldContext = useContext2(FormFieldContext);
14227
- const itemContext = useContext2(FormItemContext);
14339
+ const fieldContext = useContext5(FormFieldContext);
14340
+ const itemContext = useContext5(FormItemContext);
14228
14341
  const { getFieldState } = useFormContext();
14229
14342
  const formState = useFormState({ name: fieldContext.name });
14230
14343
  const fieldState = getFieldState(fieldContext.name, formState);
@@ -14258,7 +14371,7 @@ var Item = forwardRef(
14258
14371
  Item.displayName = "Form.Item";
14259
14372
  var Label2 = forwardRef(({ className, optional = false, tooltip, icon, ...props }, ref) => {
14260
14373
  const { formLabelId, formItemId } = useFormField();
14261
- const { t: t2 } = useTranslation8();
14374
+ const { t: t2 } = useTranslation10();
14262
14375
  return /* @__PURE__ */ jsxs11("div", { className: "flex items-center gap-x-1", children: [
14263
14376
  /* @__PURE__ */ jsx12(
14264
14377
  LabelComponent,
@@ -14272,7 +14385,7 @@ var Label2 = forwardRef(({ className, optional = false, tooltip, icon, ...props
14272
14385
  ...props
14273
14386
  }
14274
14387
  ),
14275
- tooltip && /* @__PURE__ */ jsx12(Tooltip4, { content: tooltip, children: /* @__PURE__ */ jsx12(InformationCircleSolid, { className: "text-ui-fg-muted" }) }),
14388
+ tooltip && /* @__PURE__ */ jsx12(Tooltip5, { content: tooltip, children: /* @__PURE__ */ jsx12(InformationCircleSolid, { className: "text-ui-fg-muted" }) }),
14276
14389
  icon,
14277
14390
  optional && /* @__PURE__ */ jsxs11(Text6, { size: "small", leading: "compact", className: "text-ui-fg-muted", children: [
14278
14391
  "(",
@@ -14409,7 +14522,7 @@ function ImageAvatar({
14409
14522
 
14410
14523
  // src/components/common/infinite-list/infinite-list.tsx
14411
14524
  import { useInfiniteQuery } from "@tanstack/react-query";
14412
- import { useEffect as useEffect3, useMemo, useRef as useRef2 } from "react";
14525
+ import { useEffect as useEffect3, useMemo as useMemo3, useRef as useRef2 } from "react";
14413
14526
  import { toast as toast2 } from "@medusajs/ui";
14414
14527
  import { Spinner as Spinner2 } from "@medusajs/icons";
14415
14528
  import { jsx as jsx15, jsxs as jsxs12 } from "react/jsx-runtime";
@@ -14451,7 +14564,7 @@ var InfiniteList = ({
14451
14564
  },
14452
14565
  ...queryOptions
14453
14566
  });
14454
- const items = useMemo(() => {
14567
+ const items = useMemo3(() => {
14455
14568
  return data?.pages.flatMap((p) => p[responseKey]) ?? [];
14456
14569
  }, [data, responseKey]);
14457
14570
  const parentRef = useRef2(null);
@@ -14539,10 +14652,10 @@ import {
14539
14652
  } from "@medusajs/ui";
14540
14653
  import Primitive from "@uiw/react-json-view";
14541
14654
  import { Suspense, useState as useState5 } from "react";
14542
- import { Trans, useTranslation as useTranslation9 } from "react-i18next";
14655
+ import { Trans, useTranslation as useTranslation11 } from "react-i18next";
14543
14656
  import { jsx as jsx16, jsxs as jsxs13 } from "react/jsx-runtime";
14544
14657
  var JsonViewSection = ({ data }) => {
14545
- const { t: t2 } = useTranslation9();
14658
+ const { t: t2 } = useTranslation11();
14546
14659
  const numberOfKeys = Object.keys(data).length;
14547
14660
  return /* @__PURE__ */ jsxs13(Container, { className: "flex items-center justify-between px-6 py-4", children: [
14548
14661
  /* @__PURE__ */ jsxs13("div", { className: "flex items-center gap-x-4", children: [
@@ -14721,8 +14834,8 @@ var LinkButton = ({
14721
14834
  };
14722
14835
 
14723
14836
  // src/components/common/list-summary/list-summary.tsx
14724
- import { Tooltip as Tooltip5, clx as clx12 } from "@medusajs/ui";
14725
- import { useTranslation as useTranslation10 } from "react-i18next";
14837
+ import { Tooltip as Tooltip6, clx as clx12 } from "@medusajs/ui";
14838
+ import { useTranslation as useTranslation12 } from "react-i18next";
14726
14839
  import { jsx as jsx18, jsxs as jsxs14 } from "react/jsx-runtime";
14727
14840
  var ListSummary = ({
14728
14841
  list,
@@ -14731,7 +14844,7 @@ var ListSummary = ({
14731
14844
  inline,
14732
14845
  n = 2
14733
14846
  }) => {
14734
- const { t: t2 } = useTranslation10();
14847
+ const { t: t2 } = useTranslation12();
14735
14848
  const title = t2("general.plusCountMore", {
14736
14849
  count: list.length - n
14737
14850
  });
@@ -14751,7 +14864,7 @@ var ListSummary = ({
14751
14864
  children: [
14752
14865
  /* @__PURE__ */ jsx18("div", { className: "flex-1 truncate", children: /* @__PURE__ */ jsx18("span", { className: "truncate", children: list.slice(0, n).join(", ") }) }),
14753
14866
  list.length > n && /* @__PURE__ */ jsx18("div", { className: "whitespace-nowrap", children: /* @__PURE__ */ jsx18(
14754
- Tooltip5,
14867
+ Tooltip6,
14755
14868
  {
14756
14869
  content: /* @__PURE__ */ jsx18("ul", { children: list.slice(n).map((c) => /* @__PURE__ */ jsx18("li", { children: c }, c)) }),
14757
14870
  children: /* @__PURE__ */ jsx18("span", { className: "cursor-default whitespace-nowrap", children: title })
@@ -14787,14 +14900,14 @@ import { jsx as jsx20, jsxs as jsxs16 } from "react/jsx-runtime";
14787
14900
  // src/components/common/metadata-section/metadata-section.tsx
14788
14901
  import { ArrowUpRightOnBox as ArrowUpRightOnBox2 } from "@medusajs/icons";
14789
14902
  import { Badge as Badge3, Container as Container2, Heading as Heading2, IconButton as IconButton4 } from "@medusajs/ui";
14790
- import { useTranslation as useTranslation11 } from "react-i18next";
14903
+ import { useTranslation as useTranslation13 } from "react-i18next";
14791
14904
  import { Link as Link5 } from "react-router-dom";
14792
14905
  import { jsx as jsx21, jsxs as jsxs17 } from "react/jsx-runtime";
14793
14906
  var MetadataSection = ({
14794
14907
  data,
14795
14908
  href = "metadata/edit"
14796
14909
  }) => {
14797
- const { t: t2 } = useTranslation11();
14910
+ const { t: t2 } = useTranslation13();
14798
14911
  if (!data) {
14799
14912
  return null;
14800
14913
  }
@@ -14826,14 +14939,14 @@ var MetadataSection = ({
14826
14939
  import { ExclamationCircleSolid } from "@medusajs/icons";
14827
14940
  import { Container as Container3, Heading as Heading3, Text as Text9, clx as clx15 } from "@medusajs/ui";
14828
14941
  import { useQueries } from "@tanstack/react-query";
14829
- import { Fragment as Fragment3, useMemo as useMemo3 } from "react";
14830
- import { useTranslation as useTranslation13 } from "react-i18next";
14942
+ import { Fragment as Fragment3, useMemo as useMemo5 } from "react";
14943
+ import { useTranslation as useTranslation15 } from "react-i18next";
14831
14944
 
14832
14945
  // src/components/common/rich-text/rich-text.tsx
14833
14946
  import { Button as Button3, Text as Text8, clx as clx13 } from "@medusajs/ui";
14834
14947
  import DOMPurify from "dompurify";
14835
- import { useEffect as useEffect4, useMemo as useMemo2, useRef as useRef3, useState as useState6 } from "react";
14836
- import { useTranslation as useTranslation12 } from "react-i18next";
14948
+ import { useEffect as useEffect4, useMemo as useMemo4, useRef as useRef3, useState as useState6 } from "react";
14949
+ import { useTranslation as useTranslation14 } from "react-i18next";
14837
14950
 
14838
14951
  // src/lib/rich-text.ts
14839
14952
  var RICH_TEXT_ALLOWED_TAGS = [
@@ -14891,7 +15004,7 @@ var Collapsible = ({
14891
15004
  dataTestId,
14892
15005
  children
14893
15006
  }) => {
14894
- const { t: t2 } = useTranslation12();
15007
+ const { t: t2 } = useTranslation14();
14895
15008
  const contentRef = useRef3(null);
14896
15009
  const [isOverflowing, setIsOverflowing] = useState6(false);
14897
15010
  const [isExpanded, setIsExpanded] = useState6(false);
@@ -14946,7 +15059,7 @@ var RichText = ({
14946
15059
  collapsedHeight,
14947
15060
  "data-testid": dataTestId
14948
15061
  }) => {
14949
- const sanitized = useMemo2(
15062
+ const sanitized = useMemo4(
14950
15063
  () => html && isHtml(html) ? sanitizeRichText(html) : null,
14951
15064
  [html]
14952
15065
  );
@@ -15080,7 +15193,7 @@ var FieldDiffValue = ({
15080
15193
  diff,
15081
15194
  lookups
15082
15195
  }) => {
15083
- const { t: t2 } = useTranslation13();
15196
+ const { t: t2 } = useTranslation15();
15084
15197
  const booleanLabels = {
15085
15198
  true: t2("general.yes"),
15086
15199
  false: t2("general.no")
@@ -15179,7 +15292,7 @@ var AttributeValue = ({
15179
15292
  change,
15180
15293
  lookup
15181
15294
  }) => {
15182
- const { t: t2 } = useTranslation13();
15295
+ const { t: t2 } = useTranslation15();
15183
15296
  const { name, previous, next } = attributeDisplay(change, lookup, {
15184
15297
  true: t2("general.yes"),
15185
15298
  false: t2("general.no")
@@ -15225,23 +15338,23 @@ var ProductChangePanel = ({
15225
15338
  headerDescription,
15226
15339
  footer
15227
15340
  }) => {
15228
- const { t: t2 } = useTranslation13();
15229
- const view = useMemo3(() => buildProductChangeView(actions), [actions]);
15230
- const variantsById = useMemo3(() => {
15341
+ const { t: t2 } = useTranslation15();
15342
+ const view = useMemo5(() => buildProductChangeView(actions), [actions]);
15343
+ const variantsById = useMemo5(() => {
15231
15344
  const map = /* @__PURE__ */ new Map();
15232
15345
  for (const variant of product.variants ?? []) {
15233
15346
  if (variant?.id) map.set(variant.id, variant);
15234
15347
  }
15235
15348
  return map;
15236
15349
  }, [product.variants]);
15237
- const productAttributesById = useMemo3(() => {
15350
+ const productAttributesById = useMemo5(() => {
15238
15351
  const map = /* @__PURE__ */ new Map();
15239
15352
  for (const attr of product.attributes ?? []) {
15240
15353
  if (attr?.id) map.set(attr.id, attr);
15241
15354
  }
15242
15355
  return map;
15243
15356
  }, [product.attributes]);
15244
- const referenceIds = useMemo3(() => {
15357
+ const referenceIds = useMemo5(() => {
15245
15358
  const types = /* @__PURE__ */ new Set();
15246
15359
  const collections = /* @__PURE__ */ new Set();
15247
15360
  const categories = /* @__PURE__ */ new Set();
@@ -15267,7 +15380,7 @@ var ProductChangePanel = ({
15267
15380
  tags: Array.from(tags)
15268
15381
  };
15269
15382
  }, [view.productUpdated]);
15270
- const attributeIdsToFetch = useMemo3(() => {
15383
+ const attributeIdsToFetch = useMemo5(() => {
15271
15384
  const ids = /* @__PURE__ */ new Set();
15272
15385
  for (const change of view.attributes) {
15273
15386
  if (change.attributeId && !productAttributesById.has(change.attributeId)) {
@@ -15276,7 +15389,7 @@ var ProductChangePanel = ({
15276
15389
  }
15277
15390
  return Array.from(ids);
15278
15391
  }, [view.attributes, productAttributesById]);
15279
- const variantIdsToFetch = useMemo3(() => {
15392
+ const variantIdsToFetch = useMemo5(() => {
15280
15393
  const ids = /* @__PURE__ */ new Set();
15281
15394
  for (const action of view.variantsRemoved) {
15282
15395
  const id = action.details?.variant_id;
@@ -15324,7 +15437,7 @@ var ProductChangePanel = ({
15324
15437
  }))
15325
15438
  });
15326
15439
  const isResolving = typeQueries.some((q) => q.isPending) || collectionQueries.some((q) => q.isPending) || categoryQueries.some((q) => q.isPending) || tagQueries.some((q) => q.isPending) || attributeQueries.some((q) => q.isPending) || variantQueries.some((q) => q.isPending);
15327
- const lookups = useMemo3(() => {
15440
+ const lookups = useMemo5(() => {
15328
15441
  const toMap = (ids, queries) => {
15329
15442
  const map = /* @__PURE__ */ new Map();
15330
15443
  ids.forEach((id, idx) => {
@@ -15346,7 +15459,7 @@ var ProductChangePanel = ({
15346
15459
  categoryQueries,
15347
15460
  tagQueries
15348
15461
  ]);
15349
- const attributeLookup = useMemo3(() => {
15462
+ const attributeLookup = useMemo5(() => {
15350
15463
  const map = /* @__PURE__ */ new Map();
15351
15464
  const addEntry = (id, name, allValues, selected) => {
15352
15465
  const valueNameById = /* @__PURE__ */ new Map();
@@ -15972,9 +16085,9 @@ import { DotsSix } from "@medusajs/icons";
15972
16085
  import { IconButton as IconButton5, clx as clx19 } from "@medusajs/ui";
15973
16086
  import {
15974
16087
  Fragment as Fragment5,
15975
- createContext as createContext3,
15976
- useContext as useContext3,
15977
- useMemo as useMemo4,
16088
+ createContext as createContext4,
16089
+ useContext as useContext6,
16090
+ useMemo as useMemo6,
15978
16091
  useState as useState7
15979
16092
  } from "react";
15980
16093
  import { jsx as jsx30, jsxs as jsxs23 } from "react/jsx-runtime";
@@ -15984,7 +16097,7 @@ var List = ({
15984
16097
  renderItem
15985
16098
  }) => {
15986
16099
  const [active, setActive] = useState7(null);
15987
- const [activeItem, activeIndex] = useMemo4(() => {
16100
+ const [activeItem, activeIndex] = useMemo6(() => {
15988
16101
  if (active === null) {
15989
16102
  return [null, null];
15990
16103
  }
@@ -16051,9 +16164,9 @@ var Overlay = ({ children }) => {
16051
16164
  }
16052
16165
  );
16053
16166
  };
16054
- var SortableItemContext = createContext3(null);
16167
+ var SortableItemContext = createContext4(null);
16055
16168
  var useSortableItemContext = () => {
16056
- const context = useContext3(SortableItemContext);
16169
+ const context = useContext6(SortableItemContext);
16057
16170
  if (!context) {
16058
16171
  throw new Error(
16059
16172
  "useSortableItemContext must be used within a SortableItemContext"
@@ -16075,7 +16188,7 @@ var Item2 = ({
16075
16188
  transform,
16076
16189
  transition
16077
16190
  } = useSortable({ id });
16078
- const context = useMemo4(
16191
+ const context = useMemo6(
16079
16192
  () => ({
16080
16193
  attributes,
16081
16194
  listeners,
@@ -16137,7 +16250,7 @@ import {
16137
16250
  verticalListSortingStrategy
16138
16251
  } from "@dnd-kit/sortable";
16139
16252
  import { CSS as CSS3 } from "@dnd-kit/utilities";
16140
- import { useEffect as useEffect5, useMemo as useMemo5, useRef as useRef4, useState as useState8 } from "react";
16253
+ import { useEffect as useEffect5, useMemo as useMemo7, useRef as useRef4, useState as useState8 } from "react";
16141
16254
  import { createPortal } from "react-dom";
16142
16255
 
16143
16256
  // src/components/common/sortable-tree/keyboard-coordinates.ts
@@ -16667,7 +16780,7 @@ function SortableTree({
16667
16780
  const [overId, setOverId] = useState8(null);
16668
16781
  const [offsetLeft, setOffsetLeft] = useState8(0);
16669
16782
  const [currentPosition, setCurrentPosition] = useState8(null);
16670
- const flattenedItems = useMemo5(() => {
16783
+ const flattenedItems = useMemo7(() => {
16671
16784
  const flattenedTree = flattenTree(items, childrenProp);
16672
16785
  const collapsedItems = flattenedTree.reduce(
16673
16786
  (acc, item) => {
@@ -16704,7 +16817,7 @@ function SortableTree({
16704
16817
  coordinateGetter
16705
16818
  })
16706
16819
  );
16707
- const sortedIds = useMemo5(
16820
+ const sortedIds = useMemo7(
16708
16821
  () => flattenedItems.map(({ id }) => id),
16709
16822
  [flattenedItems]
16710
16823
  );
@@ -16925,15 +17038,15 @@ var SwitchBox = ({
16925
17038
 
16926
17039
  // src/components/common/tax-badge/tax-badge.tsx
16927
17040
  import { TaxExclusive, TaxInclusive } from "@medusajs/icons";
16928
- import { Tooltip as Tooltip6 } from "@medusajs/ui";
16929
- import { useTranslation as useTranslation14 } from "react-i18next";
17041
+ import { Tooltip as Tooltip7 } from "@medusajs/ui";
17042
+ import { useTranslation as useTranslation16 } from "react-i18next";
16930
17043
  import { jsx as jsx35 } from "react/jsx-runtime";
16931
17044
  var IncludesTaxTooltip = ({
16932
17045
  includesTax
16933
17046
  }) => {
16934
- const { t: t2 } = useTranslation14();
17047
+ const { t: t2 } = useTranslation16();
16935
17048
  return /* @__PURE__ */ jsx35(
16936
- Tooltip6,
17049
+ Tooltip7,
16937
17050
  {
16938
17051
  maxWidth: 999,
16939
17052
  content: includesTax ? t2("general.includesTaxTooltip") : t2("general.excludesTaxTooltip"),
@@ -16962,18 +17075,18 @@ var useCombinedRefs = (...refs) => {
16962
17075
  };
16963
17076
 
16964
17077
  // src/components/data-grid/hooks/use-data-grid-cell.tsx
16965
- import { useCallback, useEffect as useEffect6, useMemo as useMemo6, useRef as useRef5, useState as useState9 } from "react";
17078
+ import { useCallback, useEffect as useEffect6, useMemo as useMemo8, useRef as useRef5, useState as useState9 } from "react";
16966
17079
 
16967
17080
  // src/components/data-grid/context/data-grid-context.tsx
16968
- import { createContext as createContext4 } from "react";
16969
- var DataGridContext = createContext4(
17081
+ import { createContext as createContext5 } from "react";
17082
+ var DataGridContext = createContext5(
16970
17083
  null
16971
17084
  );
16972
17085
 
16973
17086
  // src/components/data-grid/context/use-data-grid-context.tsx
16974
- import { useContext as useContext4 } from "react";
17087
+ import { useContext as useContext7 } from "react";
16975
17088
  var useDataGridContext = () => {
16976
- const context = useContext4(DataGridContext);
17089
+ const context = useContext7(DataGridContext);
16977
17090
  if (!context) {
16978
17091
  throw new Error(
16979
17092
  "useDataGridContext must be used within a DataGridContextProvider"
@@ -17019,11 +17132,11 @@ var useDataGridCell = ({
17019
17132
  getCellMetadata
17020
17133
  } = useDataGridContext();
17021
17134
  const { rowIndex, columnIndex } = context;
17022
- const coords = useMemo6(
17135
+ const coords = useMemo8(
17023
17136
  () => ({ row: rowIndex, col: columnIndex }),
17024
17137
  [rowIndex, columnIndex]
17025
17138
  );
17026
- const { id, field, type, innerAttributes, inputAttributes } = useMemo6(() => {
17139
+ const { id, field, type, innerAttributes, inputAttributes } = useMemo8(() => {
17027
17140
  return getCellMetadata(coords);
17028
17141
  }, [coords, getCellMetadata]);
17029
17142
  const [showOverlay, setShowOverlay] = useState9(true);
@@ -17143,10 +17256,10 @@ var useDataGridCell = ({
17143
17256
  },
17144
17257
  [showOverlay, validateKeyStroke]
17145
17258
  );
17146
- const isAnchor = useMemo6(() => {
17259
+ const isAnchor = useMemo8(() => {
17147
17260
  return anchor ? isCellMatch(coords, anchor) : false;
17148
17261
  }, [anchor, coords]);
17149
- const fieldWithoutOverlay = useMemo6(() => {
17262
+ const fieldWithoutOverlay = useMemo8(() => {
17150
17263
  return type === "boolean";
17151
17264
  }, [type]);
17152
17265
  useEffect6(() => {
@@ -17191,14 +17304,14 @@ var useDataGridCell = ({
17191
17304
  };
17192
17305
 
17193
17306
  // src/components/data-grid/hooks/use-data-grid-cell-error.tsx
17194
- import { useMemo as useMemo7 } from "react";
17307
+ import { useMemo as useMemo9 } from "react";
17195
17308
  import { get } from "react-hook-form";
17196
17309
  var useDataGridCellError = ({
17197
17310
  context
17198
17311
  }) => {
17199
17312
  const { errors, getCellErrorMetadata, navigateToField } = useDataGridContext();
17200
17313
  const { rowIndex, columnIndex } = context;
17201
- const { accessor, field } = useMemo7(() => {
17314
+ const { accessor, field } = useMemo9(() => {
17202
17315
  return getCellErrorMetadata({ row: rowIndex, col: columnIndex });
17203
17316
  }, [rowIndex, columnIndex, getCellErrorMetadata]);
17204
17317
  const rowErrorsObject = accessor && columnIndex === 0 ? get(errors, accessor) : void 0;
@@ -17957,7 +18070,7 @@ function getColumnName(column) {
17957
18070
  import { useWatch } from "react-hook-form";
17958
18071
 
17959
18072
  // src/components/data-grid/hooks/use-data-grid-error-highlighting.tsx
17960
- import { useCallback as useCallback7, useMemo as useMemo8, useState as useState11 } from "react";
18073
+ import { useCallback as useCallback7, useMemo as useMemo10, useState as useState11 } from "react";
17961
18074
  var useDataGridErrorHighlighting = (matrix, grid, errors) => {
17962
18075
  const [isHighlighted, setIsHighlighted] = useState11(false);
17963
18076
  const [visibilitySnapshot, setVisibilitySnapshot] = useState11(null);
@@ -17965,7 +18078,7 @@ var useDataGridErrorHighlighting = (matrix, grid, errors) => {
17965
18078
  const flatColumns = grid.getAllFlatColumns();
17966
18079
  const errorPaths = findErrorPaths(errors);
17967
18080
  const errorCount = errorPaths.length;
17968
- const { rowsWithErrors, columnsWithErrors } = useMemo8(() => {
18081
+ const { rowsWithErrors, columnsWithErrors } = useMemo10(() => {
17969
18082
  const rowsWithErrors2 = /* @__PURE__ */ new Set();
17970
18083
  const columnsWithErrors2 = /* @__PURE__ */ new Set();
17971
18084
  errorPaths.forEach((errorPath) => {
@@ -18882,12 +18995,12 @@ var useDataGridQueryTool = (containerRef) => {
18882
18995
  // src/components/data-grid/components/data-grid-cell-container.tsx
18883
18996
  import { ErrorMessage as ErrorMessage2 } from "@hookform/error-message";
18884
18997
  import { ExclamationCircle as ExclamationCircle2 } from "@medusajs/icons";
18885
- import { Tooltip as Tooltip8, clx as clx21 } from "@medusajs/ui";
18998
+ import { Tooltip as Tooltip9, clx as clx21 } from "@medusajs/ui";
18886
18999
  import { get as get2 } from "react-hook-form";
18887
19000
 
18888
19001
  // src/components/data-grid/components/data-grid-row-error-indicator.tsx
18889
- import { Badge as Badge5, Tooltip as Tooltip7 } from "@medusajs/ui";
18890
- import { useTranslation as useTranslation15 } from "react-i18next";
19002
+ import { Badge as Badge5, Tooltip as Tooltip8 } from "@medusajs/ui";
19003
+ import { useTranslation as useTranslation17 } from "react-i18next";
18891
19004
  import { jsx as jsx36, jsxs as jsxs27 } from "react/jsx-runtime";
18892
19005
  var DataGridRowErrorIndicator = ({
18893
19006
  rowErrors
@@ -18897,7 +19010,7 @@ var DataGridRowErrorIndicator = ({
18897
19010
  return null;
18898
19011
  }
18899
19012
  return /* @__PURE__ */ jsx36(
18900
- Tooltip7,
19013
+ Tooltip8,
18901
19014
  {
18902
19015
  content: /* @__PURE__ */ jsx36("ul", { className: "flex flex-col gap-y-3", children: rowErrors.map((error, index) => /* @__PURE__ */ jsx36(DataGridRowErrorLine, { error }, index)) }),
18903
19016
  delayDuration: 0,
@@ -18908,7 +19021,7 @@ var DataGridRowErrorIndicator = ({
18908
19021
  var DataGridRowErrorLine = ({
18909
19022
  error
18910
19023
  }) => {
18911
- const { t: t2 } = useTranslation15();
19024
+ const { t: t2 } = useTranslation17();
18912
19025
  return /* @__PURE__ */ jsxs27("li", { className: "txt-compact-small flex flex-col items-start", children: [
18913
19026
  error.message,
18914
19027
  /* @__PURE__ */ jsx36(
@@ -18966,7 +19079,7 @@ var DataGridCellContainer = ({
18966
19079
  name: field,
18967
19080
  errors,
18968
19081
  render: ({ message }) => {
18969
- return /* @__PURE__ */ jsx37("div", { className: "flex items-center justify-center", children: /* @__PURE__ */ jsx37(Tooltip8, { content: message, delayDuration: 0, children: /* @__PURE__ */ jsx37(ExclamationCircle2, { className: "text-ui-tag-red-icon z-[3]" }) }) });
19082
+ return /* @__PURE__ */ jsx37("div", { className: "flex items-center justify-center", children: /* @__PURE__ */ jsx37(Tooltip9, { content: message, delayDuration: 0, children: /* @__PURE__ */ jsx37(ExclamationCircle2, { className: "text-ui-tag-red-icon z-[3]" }) }) });
18970
19083
  }
18971
19084
  }
18972
19085
  ),
@@ -19366,11 +19479,11 @@ import {
19366
19479
  import {
19367
19480
  useCallback as useCallback15,
19368
19481
  useEffect as useEffect11,
19369
- useMemo as useMemo10,
19482
+ useMemo as useMemo12,
19370
19483
  useRef as useRef8,
19371
19484
  useState as useState17
19372
19485
  } from "react";
19373
- import { useTranslation as useTranslation17 } from "react-i18next";
19486
+ import { useTranslation as useTranslation19 } from "react-i18next";
19374
19487
 
19375
19488
  // src/hooks/use-command-history.tsx
19376
19489
  import { useCallback as useCallback14, useState as useState15 } from "react";
@@ -19428,12 +19541,12 @@ import {
19428
19541
  Text as Text13
19429
19542
  } from "@medusajs/ui";
19430
19543
  import { Dialog as RadixDialog } from "radix-ui";
19431
- import { useMemo as useMemo9, useState as useState16 } from "react";
19432
- import { useTranslation as useTranslation16 } from "react-i18next";
19544
+ import { useMemo as useMemo11, useState as useState16 } from "react";
19545
+ import { useTranslation as useTranslation18 } from "react-i18next";
19433
19546
  import { jsx as jsx43, jsxs as jsxs31 } from "react/jsx-runtime";
19434
19547
  var useDataGridShortcuts = () => {
19435
- const { t: t2 } = useTranslation16();
19436
- const shortcuts = useMemo9(
19548
+ const { t: t2 } = useTranslation18();
19549
+ const shortcuts = useMemo11(
19437
19550
  () => [
19438
19551
  {
19439
19552
  label: t2("dataGrid.shortcuts.commands.undo"),
@@ -19577,10 +19690,10 @@ var DataGridKeyboardShortcutModal = ({
19577
19690
  open,
19578
19691
  onOpenChange
19579
19692
  }) => {
19580
- const { t: t2 } = useTranslation16();
19693
+ const { t: t2 } = useTranslation18();
19581
19694
  const [searchValue, onSearchValueChange] = useState16("");
19582
19695
  const shortcuts = useDataGridShortcuts();
19583
- const searchResults = useMemo9(() => {
19696
+ const searchResults = useMemo11(() => {
19584
19697
  return shortcuts.filter(
19585
19698
  (shortcut) => shortcut.label.toLowerCase().includes(searchValue.toLowerCase())
19586
19699
  );
@@ -19712,7 +19825,7 @@ var DataGridRoot = ({
19712
19825
  });
19713
19826
  const { flatRows } = grid.getRowModel();
19714
19827
  const flatColumns = grid.getAllFlatColumns();
19715
- const visibleRows = useMemo10(
19828
+ const visibleRows = useMemo12(
19716
19829
  () => flatRows.filter((_, index) => rowVisibility?.[index] !== false),
19717
19830
  [flatRows, rowVisibility]
19718
19831
  );
@@ -19831,7 +19944,7 @@ var DataGridRoot = ({
19831
19944
  virtualPaddingLeft = virtualColumns[0]?.start ?? 0;
19832
19945
  virtualPaddingRight = columnVirtualizer.getTotalSize() - (virtualColumns[virtualColumns.length - 1]?.end ?? 0);
19833
19946
  }
19834
- const matrix = useMemo10(
19947
+ const matrix = useMemo12(
19835
19948
  () => new DataGridMatrix(
19836
19949
  flatRows,
19837
19950
  columns,
@@ -20027,7 +20140,7 @@ var DataGridRoot = ({
20027
20140
  }
20028
20141
  }
20029
20142
  }, [anchor, matrix, setSingleRange]);
20030
- const values = useMemo10(
20143
+ const values = useMemo12(
20031
20144
  () => ({
20032
20145
  anchor,
20033
20146
  control,
@@ -20259,7 +20372,7 @@ var DataGridHeader = ({
20259
20372
  }) => {
20260
20373
  const [shortcutsOpen, setShortcutsOpen] = useState17(false);
20261
20374
  const [columnsOpen, setColumnsOpen] = useState17(false);
20262
- const { t: t2 } = useTranslation17();
20375
+ const { t: t2 } = useTranslation19();
20263
20376
  const direction = useDocumentDirection();
20264
20377
  const hasChanged = columnOptions.some((column) => !column.checked);
20265
20378
  const handleShortcutsOpenChange = (value) => {
@@ -21027,10 +21140,11 @@ import {
21027
21140
  useDataTable,
21028
21141
  Heading as Heading6,
21029
21142
  Text as Text14,
21030
- Button as Button7
21143
+ Button as Button7,
21144
+ Tooltip as Tooltip10
21031
21145
  } from "@medusajs/ui";
21032
- import React6, { useCallback as useCallback17, useMemo as useMemo11 } from "react";
21033
- import { useTranslation as useTranslation18 } from "react-i18next";
21146
+ import React6, { useCallback as useCallback17, useMemo as useMemo13 } from "react";
21147
+ import { useTranslation as useTranslation20 } from "react-i18next";
21034
21148
  import { Link as Link7, useNavigate, useSearchParams as useSearchParams2 } from "react-router-dom";
21035
21149
 
21036
21150
  // src/hooks/use-query-params.tsx
@@ -21048,11 +21162,12 @@ function useQueryParams(keys, prefix) {
21048
21162
 
21049
21163
  // src/components/data-table/data-table.tsx
21050
21164
  import { jsx as jsx50, jsxs as jsxs36 } from "react/jsx-runtime";
21165
+ var EMPTY_COMMANDS = [];
21051
21166
  var DataTable = ({
21052
21167
  data = [],
21053
21168
  columns,
21054
21169
  filters,
21055
- commands,
21170
+ commands: declaredCommands,
21056
21171
  action,
21057
21172
  actions,
21058
21173
  actionMenu,
@@ -21079,9 +21194,11 @@ var DataTable = ({
21079
21194
  onColumnOrderChange,
21080
21195
  filterBarContent
21081
21196
  }) => {
21082
- const { t: t2 } = useTranslation18();
21197
+ const { t: t2 } = useTranslation20();
21083
21198
  const enableFiltering = filters && filters.length > 0;
21084
21199
  const showFilterMenu = enableFilterMenu !== void 0 ? enableFilterMenu : enableFiltering;
21200
+ const permittedCommands = usePermittedCommands(declaredCommands ?? EMPTY_COMMANDS);
21201
+ const commands = declaredCommands ? permittedCommands : void 0;
21085
21202
  const enableCommands = commands && commands.length > 0;
21086
21203
  const enableSorting = columns.some((column) => column.enableSorting);
21087
21204
  const [columnVisibility, setColumnVisibility] = React6.useState(initialColumnVisibility);
@@ -21102,7 +21219,7 @@ var DataTable = ({
21102
21219
  },
21103
21220
  [onColumnVisibilityChange]
21104
21221
  );
21105
- const filterIds = useMemo11(() => filters?.map((f) => f.id) ?? [], [filters]);
21222
+ const filterIds = useMemo13(() => filters?.map((f) => f.id) ?? [], [filters]);
21106
21223
  const prefixedFilterIds = filterIds.map((id) => getQueryParamKey(id, prefix));
21107
21224
  const { offset, order, q, ...filterParams } = useQueryParams(
21108
21225
  [
@@ -21114,7 +21231,7 @@ var DataTable = ({
21114
21231
  prefix
21115
21232
  );
21116
21233
  const [_, setSearchParams] = useSearchParams2();
21117
- const search = useMemo11(() => {
21234
+ const search = useMemo13(() => {
21118
21235
  return q ?? "";
21119
21236
  }, [q]);
21120
21237
  const handleSearchChange = (value) => {
@@ -21127,7 +21244,7 @@ var DataTable = ({
21127
21244
  return prev;
21128
21245
  });
21129
21246
  };
21130
- const pagination = useMemo11(() => {
21247
+ const pagination = useMemo13(() => {
21131
21248
  return offset ? parsePaginationState(offset, pageSize) : { pageIndex: 0, pageSize };
21132
21249
  }, [offset, pageSize]);
21133
21250
  const handlePaginationChange = (value) => {
@@ -21143,7 +21260,7 @@ var DataTable = ({
21143
21260
  return prev;
21144
21261
  });
21145
21262
  };
21146
- const filtering = useMemo11(
21263
+ const filtering = useMemo13(
21147
21264
  () => parseFilterState(filterIds, filterParams),
21148
21265
  [filterIds, filterParams]
21149
21266
  );
@@ -21168,7 +21285,7 @@ var DataTable = ({
21168
21285
  return prev;
21169
21286
  });
21170
21287
  };
21171
- const sorting = useMemo11(() => {
21288
+ const sorting = useMemo13(() => {
21172
21289
  return order ? parseSortingState(order) : null;
21173
21290
  }, [order]);
21174
21291
  const handleSortingChange = (value) => {
@@ -21318,7 +21435,7 @@ function getQueryParamKey(key, prefix) {
21318
21435
  return prefix ? `${prefix}_${key}` : key;
21319
21436
  }
21320
21437
  var useDataTableTranslations = () => {
21321
- const { t: t2 } = useTranslation18();
21438
+ const { t: t2 } = useTranslation20();
21322
21439
  const paginationTranslations = {
21323
21440
  of: t2("general.of"),
21324
21441
  results: t2("general.results"),
@@ -21339,14 +21456,19 @@ var useDataTableTranslations = () => {
21339
21456
  var DataTableAction = ({
21340
21457
  label,
21341
21458
  disabled,
21459
+ permission,
21342
21460
  ...props
21343
21461
  }) => {
21462
+ const gate = usePermissionGate(permission);
21344
21463
  const buttonProps = {
21345
21464
  size: "small",
21346
21465
  disabled: disabled ?? false,
21347
21466
  type: "button",
21348
21467
  variant: "secondary"
21349
21468
  };
21469
+ if (gate.denied) {
21470
+ return /* @__PURE__ */ jsx50(Tooltip10, { content: gate.tooltip, children: /* @__PURE__ */ jsx50("span", { className: "inline-flex", children: /* @__PURE__ */ jsx50(Button7, { ...buttonProps, disabled: true, children: label }) }) });
21471
+ }
21350
21472
  if ("to" in props) {
21351
21473
  return /* @__PURE__ */ jsx50(Button7, { ...buttonProps, asChild: true, children: /* @__PURE__ */ jsx50(Link7, { to: props.to, children: label }) });
21352
21474
  }
@@ -21392,7 +21514,7 @@ var AddFilterMenu = ({ availableKeys }) => {
21392
21514
  import { ArrowUpDown } from "@medusajs/icons";
21393
21515
  import { DropdownMenu as DropdownMenu4, IconButton as IconButton8 } from "@medusajs/ui";
21394
21516
  import { useState as useState20 } from "react";
21395
- import { useTranslation as useTranslation19 } from "react-i18next";
21517
+ import { useTranslation as useTranslation21 } from "react-i18next";
21396
21518
  import { useSearchParams as useSearchParams4 } from "react-router-dom";
21397
21519
  import { jsx as jsx52, jsxs as jsxs38 } from "react/jsx-runtime";
21398
21520
  var initState = (params) => {
@@ -21423,7 +21545,7 @@ var formatKey = (key) => {
21423
21545
  var OrderBy = ({ keys }) => {
21424
21546
  const [searchParams, setSearchParams] = useSearchParams4();
21425
21547
  const [state, setState] = useState20(initState(searchParams));
21426
- const { t: t2 } = useTranslation19();
21548
+ const { t: t2 } = useTranslation21();
21427
21549
  const direction = useDocumentDirection();
21428
21550
  const handleDirChange = (dir) => {
21429
21551
  setState((prev) => ({
@@ -21520,11 +21642,11 @@ var OrderBy = ({ keys }) => {
21520
21642
  import { Input as Input2 } from "@medusajs/ui";
21521
21643
  import debounce from "lodash.debounce";
21522
21644
  import { useCallback as useCallback18, useEffect as useEffect14, useState as useState21 } from "react";
21523
- import { useTranslation as useTranslation20 } from "react-i18next";
21645
+ import { useTranslation as useTranslation22 } from "react-i18next";
21524
21646
  import { useSearchParams as useSearchParams5 } from "react-router-dom";
21525
21647
  import { jsx as jsx53 } from "react/jsx-runtime";
21526
21648
  var Query = ({ placeholder }) => {
21527
- const { t: t2 } = useTranslation20();
21649
+ const { t: t2 } = useTranslation22();
21528
21650
  const placeholderText = placeholder || t2("general.search");
21529
21651
  const [searchParams, setSearchParams] = useSearchParams5();
21530
21652
  const [inputValue, setInputValue] = useState21(searchParams.get("q") || "");
@@ -21565,7 +21687,7 @@ var Query = ({ placeholder }) => {
21565
21687
 
21566
21688
  // src/components/forms/address-form/address-form.tsx
21567
21689
  import { Heading as Heading7, Input as Input3, Select as Select2, clx as clx29 } from "@medusajs/ui";
21568
- import { useTranslation as useTranslation22 } from "react-i18next";
21690
+ import { useTranslation as useTranslation24 } from "react-i18next";
21569
21691
 
21570
21692
  // src/components/inputs/country-select/country-select.tsx
21571
21693
  import {
@@ -21573,11 +21695,11 @@ import {
21573
21695
  useImperativeHandle,
21574
21696
  useRef as useRef11
21575
21697
  } from "react";
21576
- import { useTranslation as useTranslation21 } from "react-i18next";
21698
+ import { useTranslation as useTranslation23 } from "react-i18next";
21577
21699
  import { Select } from "@medusajs/ui";
21578
21700
  import { jsx as jsx54, jsxs as jsxs39 } from "react/jsx-runtime";
21579
21701
  var CountrySelect = forwardRef3(({ disabled, placeholder, defaultValue, onChange, ...field }, ref) => {
21580
- const { t: t2 } = useTranslation21();
21702
+ const { t: t2 } = useTranslation23();
21581
21703
  const innerRef = useRef11(null);
21582
21704
  useImperativeHandle(ref, () => innerRef.current);
21583
21705
  return /* @__PURE__ */ jsx54("div", { className: "relative", children: /* @__PURE__ */ jsxs39(
@@ -21616,7 +21738,7 @@ var AddressForm = ({
21616
21738
  countries: countries2,
21617
21739
  layout
21618
21740
  }) => {
21619
- const { t: t2 } = useTranslation22();
21741
+ const { t: t2 } = useTranslation24();
21620
21742
  const direction = useDocumentDirection();
21621
21743
  const style = clx29("gap-4", {
21622
21744
  "flex flex-col": layout === "stack",
@@ -21807,13 +21929,13 @@ var import_types3 = __toESM(require_dist2(), 1);
21807
21929
  import { zodResolver } from "@hookform/resolvers/zod";
21808
21930
  import { Button as Button9, InlineTip, Input as Input5, Label as Label3 } from "@medusajs/ui";
21809
21931
  import { useForm } from "react-hook-form";
21810
- import { useTranslation as useTranslation26 } from "react-i18next";
21932
+ import { useTranslation as useTranslation28 } from "react-i18next";
21811
21933
  import * as zod from "zod";
21812
21934
 
21813
21935
  // src/components/inputs/attribute-value-input/attribute-value-input.tsx
21814
21936
  var import_types2 = __toESM(require_dist2(), 1);
21815
21937
  import { Input as Input4, Select as Select3, Textarea as Textarea3 } from "@medusajs/ui";
21816
- import { useTranslation as useTranslation24 } from "react-i18next";
21938
+ import { useTranslation as useTranslation26 } from "react-i18next";
21817
21939
 
21818
21940
  // src/components/inputs/combobox/combobox.tsx
21819
21941
  import {
@@ -21840,12 +21962,12 @@ import {
21840
21962
  useCallback as useCallback19,
21841
21963
  useDeferredValue,
21842
21964
  useImperativeHandle as useImperativeHandle2,
21843
- useMemo as useMemo12,
21965
+ useMemo as useMemo14,
21844
21966
  useRef as useRef12,
21845
21967
  useState as useState22,
21846
21968
  useTransition
21847
21969
  } from "react";
21848
- import { useTranslation as useTranslation23 } from "react-i18next";
21970
+ import { useTranslation as useTranslation25 } from "react-i18next";
21849
21971
 
21850
21972
  // src/components/utilities/generic-forward-ref/generic-forward-ref.tsx
21851
21973
  import {
@@ -21879,7 +22001,7 @@ var ComboboxImpl = ({
21879
22001
  }, ref) => {
21880
22002
  const [open, setOpen] = useState22(false);
21881
22003
  const [isPending, startTransition] = useTransition();
21882
- const { t: t2 } = useTranslation23();
22004
+ const { t: t2 } = useTranslation25();
21883
22005
  const comboboxRef = useRef12(null);
21884
22006
  const listboxRef = useRef12(null);
21885
22007
  useImperativeHandle2(ref, () => comboboxRef.current);
@@ -21918,7 +22040,7 @@ var ComboboxImpl = ({
21918
22040
  onSearchValueChange(query);
21919
22041
  }
21920
22042
  };
21921
- const matches = useMemo12(() => {
22043
+ const matches = useMemo14(() => {
21922
22044
  if (isSearchControlled) {
21923
22045
  return [];
21924
22046
  }
@@ -21966,7 +22088,7 @@ var ComboboxImpl = ({
21966
22088
  const hideInput = forceHideInput || !isArrayValue && hasValue && !open;
21967
22089
  const selectedLabel = options.find((o) => o.value === selectedValues)?.label;
21968
22090
  const hidePlaceholder = showSelected || open;
21969
- const tagWidth = useMemo12(() => {
22091
+ const tagWidth = useMemo14(() => {
21970
22092
  if (!Array.isArray(selectedValues)) {
21971
22093
  return TAG_BASE_WIDTH + TABLUAR_NUM_WIDTH;
21972
22094
  }
@@ -21974,7 +22096,7 @@ var ComboboxImpl = ({
21974
22096
  const digits = count.toString().length;
21975
22097
  return TAG_BASE_WIDTH + digits * TABLUAR_NUM_WIDTH;
21976
22098
  }, [selectedValues]);
21977
- const results = useMemo12(() => {
22099
+ const results = useMemo14(() => {
21978
22100
  return isSearchControlled ? options : matches;
21979
22101
  }, [matches, options, isSearchControlled]);
21980
22102
  return /* @__PURE__ */ jsxs41(
@@ -22188,7 +22310,7 @@ var AttributeValueInput = ({
22188
22310
  availableValues = [],
22189
22311
  placeholder
22190
22312
  }) => {
22191
- const { t: t2 } = useTranslation24();
22313
+ const { t: t2 } = useTranslation26();
22192
22314
  const ph = placeholder ?? t2("products.create.attributes.valuePlaceholder");
22193
22315
  switch (type) {
22194
22316
  case import_types2.AttributeType.MULTI_SELECT:
@@ -22431,11 +22553,11 @@ import { useEffect as useEffect15, useState as useState26 } from "react";
22431
22553
  import { useNavigate as useNavigate3 } from "react-router-dom";
22432
22554
 
22433
22555
  // src/components/modals/hooks/use-state-aware-to.tsx
22434
- import { useMemo as useMemo13 } from "react";
22556
+ import { useMemo as useMemo15 } from "react";
22435
22557
  import { useLocation } from "react-router-dom";
22436
22558
  var useStateAwareTo = (prev) => {
22437
22559
  const location = useLocation();
22438
- const to = useMemo13(() => {
22560
+ const to = useMemo15(() => {
22439
22561
  const params = location.state?.restore_params;
22440
22562
  if (params) {
22441
22563
  return `${prev}?${params.toString()}`;
@@ -22450,7 +22572,7 @@ var useStateAwareTo = (prev) => {
22450
22572
 
22451
22573
  // src/components/modals/route-modal-form/route-modal-form.tsx
22452
22574
  import { Prompt as Prompt2 } from "@medusajs/ui";
22453
- import { useTranslation as useTranslation25 } from "react-i18next";
22575
+ import { useTranslation as useTranslation27 } from "react-i18next";
22454
22576
  import { useBlocker } from "react-router-dom";
22455
22577
  import { jsx as jsx59, jsxs as jsxs44 } from "react/jsx-runtime";
22456
22578
  var RouteModalForm = ({
@@ -22459,7 +22581,7 @@ var RouteModalForm = ({
22459
22581
  children,
22460
22582
  onClose
22461
22583
  }) => {
22462
- const { t: t2 } = useTranslation25();
22584
+ const { t: t2 } = useTranslation27();
22463
22585
  const {
22464
22586
  formState: { isDirty }
22465
22587
  } = form;
@@ -22509,12 +22631,12 @@ var RouteModalForm = ({
22509
22631
  };
22510
22632
 
22511
22633
  // src/components/modals/route-modal-provider/route-provider.tsx
22512
- import { useCallback as useCallback20, useMemo as useMemo14, useState as useState24 } from "react";
22634
+ import { useCallback as useCallback20, useMemo as useMemo16, useState as useState24 } from "react";
22513
22635
  import { useLocation as useLocation2, useNavigate as useNavigate2 } from "react-router-dom";
22514
22636
 
22515
22637
  // src/components/modals/route-modal-provider/route-modal-context.tsx
22516
- import { createContext as createContext5 } from "react";
22517
- var RouteModalProviderContext = createContext5(null);
22638
+ import { createContext as createContext6 } from "react";
22639
+ var RouteModalProviderContext = createContext6(null);
22518
22640
 
22519
22641
  // src/components/modals/route-modal-provider/route-provider.tsx
22520
22642
  import { jsx as jsx60 } from "react/jsx-runtime";
@@ -22542,7 +22664,7 @@ var RouteModalProvider = ({
22542
22664
  },
22543
22665
  [navigate, prev, location]
22544
22666
  );
22545
- const value = useMemo14(
22667
+ const value = useMemo16(
22546
22668
  () => ({
22547
22669
  handleSuccess,
22548
22670
  setCloseOnEscape,
@@ -22557,8 +22679,8 @@ var RouteModalProvider = ({
22557
22679
  import { useState as useState25 } from "react";
22558
22680
 
22559
22681
  // src/components/modals/stacked-modal-provider/stacked-modal-context.tsx
22560
- import { createContext as createContext6 } from "react";
22561
- var StackedModalContext = createContext6(null);
22682
+ import { createContext as createContext7 } from "react";
22683
+ var StackedModalContext = createContext7(null);
22562
22684
 
22563
22685
  // src/components/modals/stacked-modal-provider/stacked-modal-provider.tsx
22564
22686
  import { jsx as jsx61 } from "react/jsx-runtime";
@@ -22605,9 +22727,9 @@ var StackedModalProvider = ({
22605
22727
  };
22606
22728
 
22607
22729
  // src/components/modals/stacked-modal-provider/use-stacked-modal.ts
22608
- import { useContext as useContext5 } from "react";
22730
+ import { useContext as useContext8 } from "react";
22609
22731
  var useStackedModal = () => {
22610
- const context = useContext5(StackedModalContext);
22732
+ const context = useContext8(StackedModalContext);
22611
22733
  if (!context) {
22612
22734
  throw new Error(
22613
22735
  "useStackedModal must be used within a StackedModalProvider"
@@ -22672,9 +22794,9 @@ import { useEffect as useEffect16, useState as useState27 } from "react";
22672
22794
  import { useNavigate as useNavigate4 } from "react-router-dom";
22673
22795
 
22674
22796
  // src/components/modals/route-modal-provider/use-route-modal.tsx
22675
- import { useContext as useContext6 } from "react";
22797
+ import { useContext as useContext9 } from "react";
22676
22798
  var useRouteModal = () => {
22677
- const context = useContext6(RouteModalProviderContext);
22799
+ const context = useContext9(RouteModalProviderContext);
22678
22800
  if (!context) {
22679
22801
  throw new Error("useRouteModal must be used within a RouteModalProvider");
22680
22802
  }
@@ -22905,7 +23027,7 @@ var EditAttributeForm = (props) => {
22905
23027
  return /* @__PURE__ */ jsx67(EditCatalogAttributeForm, { ...props });
22906
23028
  };
22907
23029
  var AttributeWarning = () => {
22908
- const { t: t2 } = useTranslation26();
23030
+ const { t: t2 } = useTranslation28();
22909
23031
  return /* @__PURE__ */ jsx67(
22910
23032
  InlineTip,
22911
23033
  {
@@ -22916,7 +23038,7 @@ var AttributeWarning = () => {
22916
23038
  );
22917
23039
  };
22918
23040
  var VariantAxisTip = () => {
22919
- const { t: t2 } = useTranslation26();
23041
+ const { t: t2 } = useTranslation28();
22920
23042
  return /* @__PURE__ */ jsx67(InlineTip, { label: t2("products.create.attributes.tip"), children: t2("products.create.attributes.editVariantAxisTip") });
22921
23043
  };
22922
23044
  var EditScopedAttributeForm = ({
@@ -22924,7 +23046,7 @@ var EditScopedAttributeForm = ({
22924
23046
  isPending,
22925
23047
  onSubmit
22926
23048
  }) => {
22927
- const { t: t2 } = useTranslation26();
23049
+ const { t: t2 } = useTranslation28();
22928
23050
  const { handleSuccess } = useRouteModal();
22929
23051
  const isAxis = isVariantAxis(attribute);
22930
23052
  const currentValues = attribute.values ?? attribute.all_values ?? [];
@@ -23063,7 +23185,7 @@ var EditCatalogAttributeForm = ({
23063
23185
  isPending,
23064
23186
  onSubmit
23065
23187
  }) => {
23066
- const { t: t2 } = useTranslation26();
23188
+ const { t: t2 } = useTranslation28();
23067
23189
  const { handleSuccess } = useRouteModal();
23068
23190
  const isAxis = isVariantAxis(attribute);
23069
23191
  const hasPresetValues = attribute.type === import_types3.AttributeType.SINGLE_SELECT || attribute.type === import_types3.AttributeType.MULTI_SELECT;
@@ -23148,10 +23270,10 @@ var EditCatalogAttributeForm = ({
23148
23270
 
23149
23271
  // src/components/forms/email-form/email-form.tsx
23150
23272
  import { Input as Input6, clx as clx36 } from "@medusajs/ui";
23151
- import { useTranslation as useTranslation27 } from "react-i18next";
23273
+ import { useTranslation as useTranslation29 } from "react-i18next";
23152
23274
  import { jsx as jsx68, jsxs as jsxs46 } from "react/jsx-runtime";
23153
23275
  var EmailForm = ({ control, layout = "stack" }) => {
23154
- const { t: t2 } = useTranslation27();
23276
+ const { t: t2 } = useTranslation29();
23155
23277
  return /* @__PURE__ */ jsx68(
23156
23278
  "div",
23157
23279
  {
@@ -23189,7 +23311,7 @@ import {
23189
23311
  toast as toast3
23190
23312
  } from "@medusajs/ui";
23191
23313
  import { useFieldArray, useForm as useForm2 } from "react-hook-form";
23192
- import { useTranslation as useTranslation28 } from "react-i18next";
23314
+ import { useTranslation as useTranslation30 } from "react-i18next";
23193
23315
  import { z as z2 } from "zod";
23194
23316
  import {
23195
23317
  ArrowDownMini,
@@ -23208,7 +23330,7 @@ var MetadataSchema = z2.object({
23208
23330
  metadata: z2.array(MetadataFieldSchema)
23209
23331
  });
23210
23332
  var MetadataForm = (props) => {
23211
- const { t: t2 } = useTranslation28();
23333
+ const { t: t2 } = useTranslation30();
23212
23334
  const { isPending, ...innerProps } = props;
23213
23335
  return /* @__PURE__ */ jsxs47(RouteDrawer, { children: [
23214
23336
  /* @__PURE__ */ jsxs47(RouteDrawer.Header, { children: [
@@ -23225,7 +23347,7 @@ var InnerForm = ({
23225
23347
  hook,
23226
23348
  isMutating
23227
23349
  }) => {
23228
- const { t: t2 } = useTranslation28();
23350
+ const { t: t2 } = useTranslation30();
23229
23351
  const { handleSuccess } = useRouteModal();
23230
23352
  const direction = useDocumentDirection();
23231
23353
  const hasUneditableRows = getHasUneditableRows(metadata);
@@ -23767,7 +23889,7 @@ import {
23767
23889
  useRef as useRef15
23768
23890
  } from "react";
23769
23891
  import { Select as Select4 } from "@medusajs/ui";
23770
- import { useTranslation as useTranslation29 } from "react-i18next";
23892
+ import { useTranslation as useTranslation31 } from "react-i18next";
23771
23893
 
23772
23894
  // src/lib/data/country-states.ts
23773
23895
  function getCountryProvinceObjectByIso2(iso2) {
@@ -25036,7 +25158,7 @@ var ProvinceSelect = forwardRef12(
25036
25158
  onChange,
25037
25159
  ...field
25038
25160
  }, ref) => {
25039
- const { t: t2 } = useTranslation29();
25161
+ const { t: t2 } = useTranslation31();
25040
25162
  const innerRef = useRef15(null);
25041
25163
  useImperativeHandle4(ref, () => innerRef.current);
25042
25164
  const provinceObject = getCountryProvinceObjectByIso2(country_code);
@@ -25087,7 +25209,7 @@ import {
25087
25209
  useRef as useRef17,
25088
25210
  useState as useState30
25089
25211
  } from "react";
25090
- import { useTranslation as useTranslation31 } from "react-i18next";
25212
+ import { useTranslation as useTranslation33 } from "react-i18next";
25091
25213
 
25092
25214
  // src/components/inputs/rich-text-editor/rich-text-toolbar.tsx
25093
25215
  import {
@@ -25102,7 +25224,7 @@ import {
25102
25224
  DropdownMenu as DropdownMenu6,
25103
25225
  IconButton as IconButton10,
25104
25226
  Input as Input9,
25105
- Tooltip as Tooltip9,
25227
+ Tooltip as Tooltip11,
25106
25228
  clx as clx39
25107
25229
  } from "@medusajs/ui";
25108
25230
  import { Popover as RadixPopover2 } from "radix-ui";
@@ -25110,7 +25232,7 @@ import {
25110
25232
  useRef as useRef16,
25111
25233
  useState as useState29
25112
25234
  } from "react";
25113
- import { useTranslation as useTranslation30 } from "react-i18next";
25235
+ import { useTranslation as useTranslation32 } from "react-i18next";
25114
25236
  import { Fragment as Fragment7, jsx as jsx74, jsxs as jsxs52 } from "react/jsx-runtime";
25115
25237
  var ToolbarButton = ({
25116
25238
  label,
@@ -25119,7 +25241,7 @@ var ToolbarButton = ({
25119
25241
  onClick,
25120
25242
  children,
25121
25243
  "data-testid": dataTestId
25122
- }) => /* @__PURE__ */ jsx74(Tooltip9, { content: label, children: /* @__PURE__ */ jsx74(
25244
+ }) => /* @__PURE__ */ jsx74(Tooltip11, { content: label, children: /* @__PURE__ */ jsx74(
25123
25245
  IconButton10,
25124
25246
  {
25125
25247
  type: "button",
@@ -25152,7 +25274,7 @@ var HeadingMenu = ({
25152
25274
  editor,
25153
25275
  disabled
25154
25276
  }) => {
25155
- const { t: t2 } = useTranslation30();
25277
+ const { t: t2 } = useTranslation32();
25156
25278
  const active = editor.isActive("heading", { level: 2 }) ? 2 : editor.isActive("heading", { level: 3 }) ? 3 : null;
25157
25279
  const label = active ? t2(`richTextEditor.heading${active}`) : t2("richTextEditor.paragraph");
25158
25280
  const setHeading = (level) => {
@@ -25199,7 +25321,7 @@ var LinkPopover = ({
25199
25321
  editor,
25200
25322
  disabled
25201
25323
  }) => {
25202
- const { t: t2 } = useTranslation30();
25324
+ const { t: t2 } = useTranslation32();
25203
25325
  const [open, setOpen] = useState29(false);
25204
25326
  const [url, setUrl] = useState29("");
25205
25327
  const isActive = editor.isActive("link");
@@ -25299,7 +25421,7 @@ var ImageButton = ({
25299
25421
  disabled,
25300
25422
  isUploading
25301
25423
  }) => {
25302
- const { t: t2 } = useTranslation30();
25424
+ const { t: t2 } = useTranslation32();
25303
25425
  const inputRef = useRef16(null);
25304
25426
  const handleChange = (e) => {
25305
25427
  const files = Array.from(e.target.files ?? []);
@@ -25341,7 +25463,7 @@ var RichTextToolbar = ({
25341
25463
  isUploading,
25342
25464
  onPickImages
25343
25465
  }) => {
25344
- const { t: t2 } = useTranslation30();
25466
+ const { t: t2 } = useTranslation32();
25345
25467
  const chain = () => editor.chain().focus();
25346
25468
  return /* @__PURE__ */ jsxs52(
25347
25469
  "div",
@@ -25483,7 +25605,7 @@ var RichTextEditor = forwardRef13(
25483
25605
  contentClassName,
25484
25606
  ...props
25485
25607
  }, ref) => {
25486
- const { t: t2 } = useTranslation31();
25608
+ const { t: t2 } = useTranslation33();
25487
25609
  const [isUploading, setIsUploading] = useState30(false);
25488
25610
  const lastEmitted = useRef17(value ?? "");
25489
25611
  const onChangeRef = useRef17(onChange);
@@ -25765,10 +25887,10 @@ var TwoColumnPage = Object.assign(Root5, { Main, Sidebar });
25765
25887
  // src/components/localization/localized-table-pagination/localized-table-pagination.tsx
25766
25888
  import { Table } from "@medusajs/ui";
25767
25889
  import { forwardRef as forwardRef14 } from "react";
25768
- import { useTranslation as useTranslation32 } from "react-i18next";
25890
+ import { useTranslation as useTranslation34 } from "react-i18next";
25769
25891
  import { jsx as jsx78 } from "react/jsx-runtime";
25770
25892
  var LocalizedTablePagination = forwardRef14((props, ref) => {
25771
- const { t: t2 } = useTranslation32();
25893
+ const { t: t2 } = useTranslation34();
25772
25894
  const translations = {
25773
25895
  of: t2("general.of"),
25774
25896
  results: t2("general.results"),
@@ -25794,10 +25916,10 @@ import {
25794
25916
  Container as Container5,
25795
25917
  Heading as Heading9,
25796
25918
  Text as Text18,
25797
- Tooltip as Tooltip10,
25919
+ Tooltip as Tooltip12,
25798
25920
  usePrompt
25799
25921
  } from "@medusajs/ui";
25800
- import { useTranslation as useTranslation33 } from "react-i18next";
25922
+ import { useTranslation as useTranslation35 } from "react-i18next";
25801
25923
 
25802
25924
  // src/extensions/registry.ts
25803
25925
  var PLACEMENTS = ["before", "after"];
@@ -25837,7 +25959,8 @@ var ExtensionRegistry = class {
25837
25959
  const entry = this.ensureSlot(slot);
25838
25960
  const resolved = {
25839
25961
  Component: widget.Component,
25840
- widgetId: widget.widgetId
25962
+ widgetId: widget.widgetId,
25963
+ permission: widget.permission
25841
25964
  };
25842
25965
  entry[placement].push(resolved);
25843
25966
  }
@@ -25948,9 +26071,9 @@ var ExtensionRegistry = class {
25948
26071
  };
25949
26072
 
25950
26073
  // src/extensions/context.tsx
25951
- import { createContext as createContext7, useContext as useContext7, useMemo as useMemo15 } from "react";
26074
+ import { createContext as createContext8, useContext as useContext10, useMemo as useMemo17 } from "react";
25952
26075
  import { jsx as jsx79 } from "react/jsx-runtime";
25953
- var ExtensionContext = createContext7(null);
26076
+ var ExtensionContext = createContext8(null);
25954
26077
  var activeRegistry = null;
25955
26078
  var getExtensionRegistry = () => activeRegistry;
25956
26079
  var ExtensionProvider = ({
@@ -25959,7 +26082,7 @@ var ExtensionProvider = ({
25959
26082
  customFields,
25960
26083
  children
25961
26084
  }) => {
25962
- const registry = useMemo15(() => {
26085
+ const registry = useMemo17(() => {
25963
26086
  const next = new ExtensionRegistry({ widgets, navigation, customFields });
25964
26087
  activeRegistry = next;
25965
26088
  return next;
@@ -25968,14 +26091,21 @@ var ExtensionProvider = ({
25968
26091
  };
25969
26092
  var EMPTY_REGISTRY = new ExtensionRegistry();
25970
26093
  var useExtension = () => {
25971
- return useContext7(ExtensionContext) ?? EMPTY_REGISTRY;
26094
+ return useContext10(ExtensionContext) ?? EMPTY_REGISTRY;
25972
26095
  };
25973
26096
 
25974
26097
  // src/extensions/widget-zone.tsx
25975
- import { Fragment as Fragment8 } from "react";
26098
+ import { Fragment as Fragment8, useContext as useContext11 } from "react";
25976
26099
  import { jsx as jsx80, jsxs as jsxs56 } from "react/jsx-runtime";
25977
26100
  var WidgetZone = ({ id, data, children }) => {
25978
- const { before, after } = useExtension().getWidgets(id);
26101
+ const widgets = useExtension().getWidgets(id);
26102
+ const permissions = useContext11(PermissionsContext);
26103
+ const before = widgets.before.filter(
26104
+ (widget) => isPermitted(permissions, widget.permission)
26105
+ );
26106
+ const after = widgets.after.filter(
26107
+ (widget) => isPermitted(permissions, widget.permission)
26108
+ );
25979
26109
  return /* @__PURE__ */ jsxs56(Fragment8, { children: [
25980
26110
  before.map(({ Component, widgetId }) => /* @__PURE__ */ jsx80(Component, { data }, `before-${widgetId}`)),
25981
26111
  children,
@@ -26179,7 +26309,7 @@ function useDisplayFieldOverride(model, zone, id) {
26179
26309
  }
26180
26310
 
26181
26311
  // src/extensions/use-extendable-table.tsx
26182
- import { useMemo as useMemo16 } from "react";
26312
+ import { useMemo as useMemo18 } from "react";
26183
26313
  import { createColumnHelper as createColumnHelper2 } from "@tanstack/react-table";
26184
26314
  import { jsx as jsx83 } from "react/jsx-runtime";
26185
26315
  function columnId(col) {
@@ -26190,7 +26320,7 @@ function useExtendableTable({
26190
26320
  columns: baseColumns
26191
26321
  }) {
26192
26322
  const ext = useExtension().getListExtension(model);
26193
- return useMemo16(() => {
26323
+ return useMemo18(() => {
26194
26324
  const helper = createColumnHelper2();
26195
26325
  const build = (c) => helper.display({
26196
26326
  id: c.id,
@@ -26288,7 +26418,7 @@ function buildAdditionalDataDefaults(registry, model, data, zone, tab) {
26288
26418
 
26289
26419
  // src/extensions/use-extendable-form.ts
26290
26420
  import { zodResolver as zodResolver3 } from "@hookform/resolvers/zod";
26291
- import { useMemo as useMemo17 } from "react";
26421
+ import { useMemo as useMemo19 } from "react";
26292
26422
  import { useForm as useForm3 } from "react-hook-form";
26293
26423
  import { z as z4 } from "zod";
26294
26424
  var useExtendableForm = ({
@@ -26301,11 +26431,11 @@ var useExtendableForm = ({
26301
26431
  ...props
26302
26432
  }) => {
26303
26433
  const extension = useExtension();
26304
- const schema = useMemo17(() => {
26434
+ const schema = useMemo19(() => {
26305
26435
  const additionalData = buildAdditionalDataSchema(extension, model, zone, tab).partial().optional();
26306
26436
  return typeof baseSchema.extend === "function" ? baseSchema.extend({ additional_data: additionalData }) : baseSchema.and(z4.object({ additional_data: additionalData }));
26307
26437
  }, [baseSchema, extension, model, zone, tab]);
26308
- const defaultValues = useMemo17(
26438
+ const defaultValues = useMemo19(
26309
26439
  () => ({
26310
26440
  ...baseDefaultValues,
26311
26441
  additional_data: buildAdditionalDataDefaults(
@@ -26326,7 +26456,7 @@ var useExtendableForm = ({
26326
26456
  };
26327
26457
 
26328
26458
  // src/extensions/action-locks.ts
26329
- import { useCallback as useCallback22, useMemo as useMemo18 } from "react";
26459
+ import { useCallback as useCallback22, useMemo as useMemo20 } from "react";
26330
26460
  var useActionLocks = (model, entity) => {
26331
26461
  const registry = useExtension();
26332
26462
  return useCallback22(
@@ -26336,7 +26466,7 @@ var useActionLocks = (model, entity) => {
26336
26466
  };
26337
26467
  var useExtensionActivity = (model, entity) => {
26338
26468
  const registry = useExtension();
26339
- return useMemo18(
26469
+ return useMemo20(
26340
26470
  () => registry.getActivity(model, entity),
26341
26471
  [registry, model, entity]
26342
26472
  );
@@ -26349,7 +26479,7 @@ var AttributeActions = ({
26349
26479
  editHref,
26350
26480
  onDelete
26351
26481
  }) => {
26352
- const { t: t2 } = useTranslation33();
26482
+ const { t: t2 } = useTranslation35();
26353
26483
  const prompt = usePrompt();
26354
26484
  const handleDelete = async () => {
26355
26485
  const res = await prompt({
@@ -26374,6 +26504,7 @@ var AttributeActions = ({
26374
26504
  {
26375
26505
  label: t2("actions.edit"),
26376
26506
  to: editHref,
26507
+ permission: "products:edit",
26377
26508
  icon: /* @__PURE__ */ jsx84(PencilSquare, {})
26378
26509
  }
26379
26510
  ]
@@ -26384,6 +26515,7 @@ var AttributeActions = ({
26384
26515
  {
26385
26516
  label: t2("actions.delete"),
26386
26517
  onClick: handleDelete,
26518
+ permission: "products:edit",
26387
26519
  icon: /* @__PURE__ */ jsx84(Trash2, {})
26388
26520
  }
26389
26521
  ]
@@ -26394,7 +26526,7 @@ var AttributeActions = ({
26394
26526
  );
26395
26527
  };
26396
26528
  var AttributeValue2 = ({ attribute }) => {
26397
- const { t: t2 } = useTranslation33();
26529
+ const { t: t2 } = useTranslation35();
26398
26530
  const values = attribute.values?.map((v) => v.name) ?? [];
26399
26531
  if (attribute.is_required && !values.length) {
26400
26532
  return /* @__PURE__ */ jsx84(
@@ -26420,7 +26552,7 @@ var AttributeValue2 = ({ attribute }) => {
26420
26552
  )) });
26421
26553
  }
26422
26554
  const textValue = attribute.type === "toggle" ? values.map((val) => val === "true" ? t2("general.yes") : t2("general.no")).join(", ") || "-" : values.join(", ") || "-";
26423
- return /* @__PURE__ */ jsx84(Tooltip10, { content: /* @__PURE__ */ jsx84("span", { className: "break-all", children: textValue }), children: /* @__PURE__ */ jsx84(
26555
+ return /* @__PURE__ */ jsx84(Tooltip12, { content: /* @__PURE__ */ jsx84("span", { className: "break-all", children: textValue }), children: /* @__PURE__ */ jsx84(
26424
26556
  Text18,
26425
26557
  {
26426
26558
  size: "small",
@@ -26438,7 +26570,7 @@ var AttributeGroup = ({
26438
26570
  getEditHref,
26439
26571
  onDelete
26440
26572
  }) => {
26441
- const { t: t2 } = useTranslation33();
26573
+ const { t: t2 } = useTranslation35();
26442
26574
  if (!attributes.length) {
26443
26575
  return null;
26444
26576
  }
@@ -26458,9 +26590,9 @@ var AttributeGroup = ({
26458
26590
  children: /* @__PURE__ */ jsxs59("div", { className: "grid grid-cols-[minmax(0,1fr)_minmax(0,1fr)_28px] items-center gap-4 px-3 py-2 bg-ui-bg-component", children: [
26459
26591
  /* @__PURE__ */ jsxs59("div", { className: "flex items-center gap-x-2 text-ui-fg-subtle", children: [
26460
26592
  /* @__PURE__ */ jsx84(Text18, { size: "small", weight: "plus", leading: "compact", children: attr.name }),
26461
- attr.description && /* @__PURE__ */ jsx84(Tooltip10, { content: attr.description, children: /* @__PURE__ */ jsx84("span", { className: "text-ui-fg-muted flex items-center", children: /* @__PURE__ */ jsx84(InformationCircleSolid2, {}) }) }),
26593
+ attr.description && /* @__PURE__ */ jsx84(Tooltip12, { content: attr.description, children: /* @__PURE__ */ jsx84("span", { className: "text-ui-fg-muted flex items-center", children: /* @__PURE__ */ jsx84(InformationCircleSolid2, {}) }) }),
26462
26594
  attr.is_required && /* @__PURE__ */ jsx84(
26463
- Tooltip10,
26595
+ Tooltip12,
26464
26596
  {
26465
26597
  content: t2("products.attributeRequiredByMarketplace"),
26466
26598
  children: /* @__PURE__ */ jsx84("span", { className: "text-ui-fg-muted flex items-center", children: /* @__PURE__ */ jsx84(InformationCircleSolid2, {}) })
@@ -26492,7 +26624,7 @@ var ProductAttributeSection = ({
26492
26624
  addExistingHref = "attributes/add",
26493
26625
  createNewHref = "attributes/create"
26494
26626
  }) => {
26495
- const { t: t2 } = useTranslation33();
26627
+ const { t: t2 } = useTranslation35();
26496
26628
  const attributes = product.attributes ?? [];
26497
26629
  const attachedIds = new Set(attributes.map((a) => a.id));
26498
26630
  const missing = (requiredAttributes ?? []).filter((required) => !attachedIds.has(required.id)).map(
@@ -26522,11 +26654,13 @@ var ProductAttributeSection = ({
26522
26654
  {
26523
26655
  label: t2("products.create.attributes.addExisting"),
26524
26656
  to: addExistingHref,
26657
+ permission: "products:edit",
26525
26658
  icon: /* @__PURE__ */ jsx84(Plus, {})
26526
26659
  },
26527
26660
  {
26528
26661
  label: t2("products.create.attributes.createNew"),
26529
26662
  to: createNewHref,
26663
+ permission: "products:edit",
26530
26664
  icon: /* @__PURE__ */ jsx84(PencilSquare, {})
26531
26665
  }
26532
26666
  ]
@@ -26568,19 +26702,19 @@ var ProductAttributeSection = ({
26568
26702
  import { Button as Button12, ProgressTabs } from "@medusajs/ui";
26569
26703
  import {
26570
26704
  Children as Children3,
26571
- createContext as createContext8,
26572
- useContext as useContext8,
26573
- useMemo as useMemo20
26705
+ createContext as createContext9,
26706
+ useContext as useContext12,
26707
+ useMemo as useMemo22
26574
26708
  } from "react";
26575
- import { useTranslation as useTranslation34 } from "react-i18next";
26709
+ import { useTranslation as useTranslation36 } from "react-i18next";
26576
26710
 
26577
26711
  // src/components/tabbed-form/use-tab-management.ts
26578
- import { useCallback as useCallback23, useEffect as useEffect20, useMemo as useMemo19, useState as useState31 } from "react";
26712
+ import { useCallback as useCallback23, useEffect as useEffect20, useMemo as useMemo21, useState as useState31 } from "react";
26579
26713
  var useTabManagement = ({
26580
26714
  tabs,
26581
26715
  form
26582
26716
  }) => {
26583
- const visibleTabs = useMemo19(
26717
+ const visibleTabs = useMemo21(
26584
26718
  () => tabs.filter((t2) => !t2.isVisible || t2.isVisible(form)),
26585
26719
  [tabs, form]
26586
26720
  );
@@ -26642,9 +26776,9 @@ var useTabManagement = ({
26642
26776
 
26643
26777
  // src/components/tabbed-form/tabbed-form.tsx
26644
26778
  import { jsx as jsx85, jsxs as jsxs60 } from "react/jsx-runtime";
26645
- var TabbedFormContext = createContext8(null);
26779
+ var TabbedFormContext = createContext9(null);
26646
26780
  var useTabbedForm = () => {
26647
- const form = useContext8(TabbedFormContext);
26781
+ const form = useContext12(TabbedFormContext);
26648
26782
  if (!form) {
26649
26783
  throw new Error("useTabbedForm must be used within a TabbedForm");
26650
26784
  }
@@ -26688,12 +26822,12 @@ function Root6({
26688
26822
  footer,
26689
26823
  transformTabs
26690
26824
  }) {
26691
- const { t: t2 } = useTranslation34();
26692
- const { tabs: rawTabs, elements } = useMemo20(
26825
+ const { t: t2 } = useTranslation36();
26826
+ const { tabs: rawTabs, elements } = useMemo22(
26693
26827
  () => collectTabs(children),
26694
26828
  [children]
26695
26829
  );
26696
- const tabs = useMemo20(
26830
+ const tabs = useMemo22(
26697
26831
  () => transformTabs ? transformTabs(rawTabs) : rawTabs,
26698
26832
  [transformTabs, rawTabs]
26699
26833
  );
@@ -26784,7 +26918,7 @@ var DefaultFooter = ({
26784
26918
  onNext,
26785
26919
  isLoading
26786
26920
  }) => {
26787
- const { t: t2 } = useTranslation34();
26921
+ const { t: t2 } = useTranslation36();
26788
26922
  return /* @__PURE__ */ jsxs60("div", { className: "flex items-center justify-end gap-x-2", children: [
26789
26923
  /* @__PURE__ */ jsx85(RouteFocusModal.Close, { asChild: true, children: /* @__PURE__ */ jsx85(Button12, { variant: "secondary", size: "small", children: t2("actions.cancel") }) }),
26790
26924
  isLastTab ? /* @__PURE__ */ jsx85(
@@ -26824,15 +26958,15 @@ import { memo } from "react";
26824
26958
  // src/components/table/data-table/data-table-filter/data-table-filter.tsx
26825
26959
  import { Button as Button13, clx as clx47 } from "@medusajs/ui";
26826
26960
  import { Popover as RadixPopover8 } from "radix-ui";
26827
- import { useCallback as useCallback26, useEffect as useEffect23, useMemo as useMemo22, useRef as useRef18, useState as useState36 } from "react";
26961
+ import { useCallback as useCallback26, useEffect as useEffect23, useMemo as useMemo24, useRef as useRef18, useState as useState36 } from "react";
26828
26962
  import { useSearchParams as useSearchParams7 } from "react-router-dom";
26829
- import { useTranslation as useTranslation39 } from "react-i18next";
26963
+ import { useTranslation as useTranslation41 } from "react-i18next";
26830
26964
 
26831
26965
  // src/components/table/data-table/data-table-filter/context.tsx
26832
- import { createContext as createContext9, useContext as useContext9 } from "react";
26833
- var DataTableFilterContext = createContext9(null);
26966
+ import { createContext as createContext10, useContext as useContext13 } from "react";
26967
+ var DataTableFilterContext = createContext10(null);
26834
26968
  var useDataTableFilterContext = () => {
26835
- const ctx = useContext9(DataTableFilterContext);
26969
+ const ctx = useContext13(DataTableFilterContext);
26836
26970
  if (!ctx) {
26837
26971
  throw new Error(
26838
26972
  "useDataTableFacetedFilterContext must be used within a DataTableFacetedFilter"
@@ -26846,9 +26980,9 @@ import { EllipseMiniSolid as EllipseMiniSolid2 } from "@medusajs/icons";
26846
26980
  import { DatePicker, Text as Text20, clx as clx43 } from "@medusajs/ui";
26847
26981
  import isEqual from "lodash.isequal";
26848
26982
  import { Popover as RadixPopover4 } from "radix-ui";
26849
- import { useMemo as useMemo21, useState as useState32 } from "react";
26983
+ import { useMemo as useMemo23, useState as useState32 } from "react";
26850
26984
  import { t } from "i18next";
26851
- import { useTranslation as useTranslation36 } from "react-i18next";
26985
+ import { useTranslation as useTranslation38 } from "react-i18next";
26852
26986
 
26853
26987
  // src/components/table/data-table/hooks.tsx
26854
26988
  import { useSearchParams as useSearchParams6 } from "react-router-dom";
@@ -26921,7 +27055,7 @@ var useSelectedParams = ({
26921
27055
  import { XMarkMini as XMarkMini5 } from "@medusajs/icons";
26922
27056
  import { Text as Text19, clx as clx42 } from "@medusajs/ui";
26923
27057
  import { Popover as RadixPopover3 } from "radix-ui";
26924
- import { useTranslation as useTranslation35 } from "react-i18next";
27058
+ import { useTranslation as useTranslation37 } from "react-i18next";
26925
27059
  import { jsx as jsx86, jsxs as jsxs61 } from "react/jsx-runtime";
26926
27060
  var FilterChip = ({
26927
27061
  hadPreviousValue,
@@ -26931,7 +27065,7 @@ var FilterChip = ({
26931
27065
  hasOperator,
26932
27066
  onRemove
26933
27067
  }) => {
26934
- const { t: t2 } = useTranslation35();
27068
+ const { t: t2 } = useTranslation37();
26935
27069
  const handleRemove = (e) => {
26936
27070
  e.stopPropagation();
26937
27071
  onRemove();
@@ -27194,8 +27328,8 @@ var DateFilter = ({
27194
27328
  var today = /* @__PURE__ */ new Date();
27195
27329
  today.setHours(0, 0, 0, 0);
27196
27330
  var usePresets = () => {
27197
- const { t: t2 } = useTranslation36();
27198
- return useMemo21(
27331
+ const { t: t2 } = useTranslation38();
27332
+ return useMemo23(
27199
27333
  () => [
27200
27334
  {
27201
27335
  label: t2("filters.date.today"),
@@ -27266,7 +27400,7 @@ import {
27266
27400
  RadioGroup as RadixRadioGroup
27267
27401
  } from "radix-ui";
27268
27402
  import { useCallback as useCallback24, useEffect as useEffect21, useState as useState33 } from "react";
27269
- import { useTranslation as useTranslation37 } from "react-i18next";
27403
+ import { useTranslation as useTranslation39 } from "react-i18next";
27270
27404
  import { jsx as jsx88, jsxs as jsxs63 } from "react/jsx-runtime";
27271
27405
  var NumberFilter = ({
27272
27406
  filter,
@@ -27274,7 +27408,7 @@ var NumberFilter = ({
27274
27408
  readonly,
27275
27409
  openOnMount
27276
27410
  }) => {
27277
- const { t: t2 } = useTranslation37();
27411
+ const { t: t2 } = useTranslation39();
27278
27412
  const [open, setOpen] = useState33(openOnMount);
27279
27413
  const { key, label } = filter;
27280
27414
  const { removeFilter } = useDataTableFilterContext();
@@ -27509,7 +27643,7 @@ import { clx as clx45 } from "@medusajs/ui";
27509
27643
  import { Command } from "cmdk";
27510
27644
  import { Popover as RadixPopover6 } from "radix-ui";
27511
27645
  import { useState as useState34 } from "react";
27512
- import { useTranslation as useTranslation38 } from "react-i18next";
27646
+ import { useTranslation as useTranslation40 } from "react-i18next";
27513
27647
  import { jsx as jsx89, jsxs as jsxs64 } from "react/jsx-runtime";
27514
27648
  var SelectFilter = ({
27515
27649
  filter,
@@ -27523,7 +27657,7 @@ var SelectFilter = ({
27523
27657
  const [open, setOpen] = useState34(openOnMount);
27524
27658
  const [search, setSearch] = useState34("");
27525
27659
  const [searchRef, setSearchRef] = useState34(null);
27526
- const { t: t2 } = useTranslation38();
27660
+ const { t: t2 } = useTranslation40();
27527
27661
  const { removeFilter } = useDataTableFilterContext();
27528
27662
  const { key, label } = filter;
27529
27663
  const selectedParams = useSelectedParams({ param: key, prefix, multiple });
@@ -27763,7 +27897,7 @@ var DataTableFilter2 = ({
27763
27897
  readonly,
27764
27898
  prefix
27765
27899
  }) => {
27766
- const { t: t2 } = useTranslation39();
27900
+ const { t: t2 } = useTranslation41();
27767
27901
  const [searchParams] = useSearchParams7();
27768
27902
  const [open, setOpen] = useState36(false);
27769
27903
  const [activeFilters, setActiveFilters] = useState36(
@@ -27814,7 +27948,7 @@ var DataTableFilter2 = ({
27814
27948
  return /* @__PURE__ */ jsx91(
27815
27949
  DataTableFilterContext.Provider,
27816
27950
  {
27817
- value: useMemo22(
27951
+ value: useMemo24(
27818
27952
  () => ({
27819
27953
  removeFilter,
27820
27954
  removeAllFilters
@@ -27978,7 +28112,7 @@ var getInitialFilters = ({
27978
28112
  import { DescendingSorting } from "@medusajs/icons";
27979
28113
  import { DropdownMenu as DropdownMenu7, IconButton as IconButton11 } from "@medusajs/ui";
27980
28114
  import { useState as useState37 } from "react";
27981
- import { useTranslation as useTranslation40 } from "react-i18next";
28115
+ import { useTranslation as useTranslation42 } from "react-i18next";
27982
28116
  import { useSearchParams as useSearchParams8 } from "react-router-dom";
27983
28117
  import { jsx as jsx92, jsxs as jsxs67 } from "react/jsx-runtime";
27984
28118
  var initState2 = (params, prefix) => {
@@ -28003,7 +28137,7 @@ var DataTableOrderBy = ({
28003
28137
  const [searchParams, setSearchParams] = useSearchParams8();
28004
28138
  const [state, setState] = useState37(initState2(searchParams, prefix));
28005
28139
  const param = prefix ? `${prefix}_order` : "order";
28006
- const { t: t2 } = useTranslation40();
28140
+ const { t: t2 } = useTranslation42();
28007
28141
  const direction = useDocumentDirection();
28008
28142
  const handleDirChange = (dir) => {
28009
28143
  setState((prev) => ({
@@ -28102,7 +28236,7 @@ var DataTableOrderBy = ({
28102
28236
  // src/components/table/data-table/data-table-search/data-table-search.tsx
28103
28237
  import { Input as Input13 } from "@medusajs/ui";
28104
28238
  import { useCallback as useCallback27, useEffect as useEffect24 } from "react";
28105
- import { useTranslation as useTranslation41 } from "react-i18next";
28239
+ import { useTranslation as useTranslation43 } from "react-i18next";
28106
28240
  import debounce4 from "lodash.debounce";
28107
28241
  import { jsx as jsx93 } from "react/jsx-runtime";
28108
28242
  var DataTableSearch = ({
@@ -28110,7 +28244,7 @@ var DataTableSearch = ({
28110
28244
  prefix,
28111
28245
  autofocus: _autofocus
28112
28246
  }) => {
28113
- const { t: t2 } = useTranslation41();
28247
+ const { t: t2 } = useTranslation43();
28114
28248
  const placeholderText = placeholder || t2("general.search");
28115
28249
  const selectedParams = useSelectedParams({
28116
28250
  param: "q",
@@ -28180,9 +28314,10 @@ import {
28180
28314
  Fragment as Fragment11,
28181
28315
  useEffect as useEffect25,
28182
28316
  useRef as useRef19,
28183
- useState as useState38
28317
+ useState as useState38,
28318
+ useContext as useContext14
28184
28319
  } from "react";
28185
- import { useTranslation as useTranslation42 } from "react-i18next";
28320
+ import { useTranslation as useTranslation44 } from "react-i18next";
28186
28321
  import { Link as Link8 } from "react-router-dom";
28187
28322
  import { jsx as jsx95, jsxs as jsxs69 } from "react/jsx-runtime";
28188
28323
  var DataTableRoot = ({
@@ -28197,11 +28332,12 @@ var DataTableRoot = ({
28197
28332
  noHeader = false,
28198
28333
  layout = "fit"
28199
28334
  }) => {
28200
- const { t: t2 } = useTranslation42();
28335
+ const { t: t2 } = useTranslation44();
28201
28336
  const [showStickyBorder, setShowStickyBorder] = useState38(false);
28202
28337
  const scrollableRef = useRef19(null);
28203
28338
  const hasSelect = columns.find((c) => c.id === "select");
28204
28339
  const hasActions = columns.find((c) => c.id === "actions");
28340
+ const permissions = useContext14(PermissionsContext);
28205
28341
  const hasCommandBar = commands && commands.length > 0;
28206
28342
  const rowSelection = table.getState().rowSelection;
28207
28343
  const { pageIndex, pageSize } = table.getState().pagination;
@@ -28387,7 +28523,12 @@ var DataTableRoot = ({
28387
28523
  {
28388
28524
  label: command.label,
28389
28525
  shortcut: command.shortcut,
28390
- action: () => handleAction(command.action)
28526
+ action: () => handleAction(command.action),
28527
+ disabled: !isPermitted(
28528
+ permissions,
28529
+ command.permission,
28530
+ command.requireAll
28531
+ )
28391
28532
  }
28392
28533
  ),
28393
28534
  index < commands.length - 1 && /* @__PURE__ */ jsx95(CommandBar.Seperator, {})
@@ -28399,7 +28540,7 @@ var DataTableRoot = ({
28399
28540
  );
28400
28541
  };
28401
28542
  var Pagination = (props) => {
28402
- const { t: t2 } = useTranslation42();
28543
+ const { t: t2 } = useTranslation44();
28403
28544
  const translations = {
28404
28545
  of: t2("general.of"),
28405
28546
  results: t2("general.results"),
@@ -28513,8 +28654,8 @@ var CodeHeader = ({ text }) => {
28513
28654
  };
28514
28655
 
28515
28656
  // src/components/table/table-cells/common/created-at-cell/created-at-cell.tsx
28516
- import { Tooltip as Tooltip11 } from "@medusajs/ui";
28517
- import { useTranslation as useTranslation43 } from "react-i18next";
28657
+ import { Tooltip as Tooltip13 } from "@medusajs/ui";
28658
+ import { useTranslation as useTranslation45 } from "react-i18next";
28518
28659
 
28519
28660
  // src/components/table/table-cells/common/placeholder-cell/placeholder-cell.tsx
28520
28661
  import { jsx as jsx98 } from "react/jsx-runtime";
@@ -28530,7 +28671,7 @@ var CreatedAtCell = ({ date }) => {
28530
28671
  return /* @__PURE__ */ jsx99(PlaceholderCell, {});
28531
28672
  }
28532
28673
  return /* @__PURE__ */ jsx99("div", { className: "flex h-full w-full items-center overflow-hidden", children: /* @__PURE__ */ jsx99(
28533
- Tooltip11,
28674
+ Tooltip13,
28534
28675
  {
28535
28676
  className: "z-10",
28536
28677
  content: /* @__PURE__ */ jsx99("span", { className: "text-pretty", children: `${getFullDate({
@@ -28542,13 +28683,13 @@ var CreatedAtCell = ({ date }) => {
28542
28683
  ) });
28543
28684
  };
28544
28685
  var CreatedAtHeader = () => {
28545
- const { t: t2 } = useTranslation43();
28686
+ const { t: t2 } = useTranslation45();
28546
28687
  return /* @__PURE__ */ jsx99("div", { className: "flex h-full w-full items-center", children: /* @__PURE__ */ jsx99("span", { className: "truncate", children: t2("fields.createdAt") }) });
28547
28688
  };
28548
28689
 
28549
28690
  // src/components/table/table-cells/common/date-cell/date-cell.tsx
28550
- import { Tooltip as Tooltip12 } from "@medusajs/ui";
28551
- import { useTranslation as useTranslation44 } from "react-i18next";
28691
+ import { Tooltip as Tooltip14 } from "@medusajs/ui";
28692
+ import { useTranslation as useTranslation46 } from "react-i18next";
28552
28693
  import { jsx as jsx100 } from "react/jsx-runtime";
28553
28694
  var DateCell = ({ date }) => {
28554
28695
  const { getFullDate } = useDate();
@@ -28556,7 +28697,7 @@ var DateCell = ({ date }) => {
28556
28697
  return /* @__PURE__ */ jsx100(PlaceholderCell, {});
28557
28698
  }
28558
28699
  return /* @__PURE__ */ jsx100("div", { className: "flex h-full w-full items-center overflow-hidden", children: /* @__PURE__ */ jsx100(
28559
- Tooltip12,
28700
+ Tooltip14,
28560
28701
  {
28561
28702
  className: "z-10",
28562
28703
  content: /* @__PURE__ */ jsx100("span", { className: "text-pretty", children: `${getFullDate({
@@ -28568,12 +28709,12 @@ var DateCell = ({ date }) => {
28568
28709
  ) });
28569
28710
  };
28570
28711
  var DateHeader = () => {
28571
- const { t: t2 } = useTranslation44();
28712
+ const { t: t2 } = useTranslation46();
28572
28713
  return /* @__PURE__ */ jsx100("div", { className: "flex h-full w-full items-center", children: /* @__PURE__ */ jsx100("span", { className: "truncate", children: t2("fields.date") }) });
28573
28714
  };
28574
28715
 
28575
28716
  // src/components/table/table-cells/common/email-cell/email-cell.tsx
28576
- import { useTranslation as useTranslation45 } from "react-i18next";
28717
+ import { useTranslation as useTranslation47 } from "react-i18next";
28577
28718
  import { jsx as jsx101 } from "react/jsx-runtime";
28578
28719
  var EmailCell = ({ email }) => {
28579
28720
  if (!email) {
@@ -28582,7 +28723,7 @@ var EmailCell = ({ email }) => {
28582
28723
  return /* @__PURE__ */ jsx101("div", { className: "flex h-full w-full items-center overflow-hidden", children: /* @__PURE__ */ jsx101("span", { className: "truncate", children: email }) });
28583
28724
  };
28584
28725
  var EmailHeader = () => {
28585
- const { t: t2 } = useTranslation45();
28726
+ const { t: t2 } = useTranslation47();
28586
28727
  return /* @__PURE__ */ jsx101("div", { className: "flex h-full w-full items-center", children: /* @__PURE__ */ jsx101("span", { className: "truncate", children: t2("fields.email") }) });
28587
28728
  };
28588
28729
 
@@ -28616,7 +28757,7 @@ var MoneyAmountCell = ({
28616
28757
  };
28617
28758
 
28618
28759
  // src/components/table/table-cells/common/name-cell/name-cell.tsx
28619
- import { useTranslation as useTranslation46 } from "react-i18next";
28760
+ import { useTranslation as useTranslation48 } from "react-i18next";
28620
28761
  import { jsx as jsx103 } from "react/jsx-runtime";
28621
28762
  var NameCell = ({ firstName, lastName }) => {
28622
28763
  if (!firstName && !lastName) {
@@ -28626,7 +28767,7 @@ var NameCell = ({ firstName, lastName }) => {
28626
28767
  return /* @__PURE__ */ jsx103("div", { className: "flex h-full w-full items-center overflow-hidden", children: /* @__PURE__ */ jsx103("span", { className: "truncate", children: name }) });
28627
28768
  };
28628
28769
  var NameHeader = () => {
28629
- const { t: t2 } = useTranslation46();
28770
+ const { t: t2 } = useTranslation48();
28630
28771
  return /* @__PURE__ */ jsx103("div", { className: "flex h-full w-full items-center", children: /* @__PURE__ */ jsx103("span", { className: "truncate", children: t2("fields.name") }) });
28631
28772
  };
28632
28773
 
@@ -28696,7 +28837,7 @@ var TextHeader = ({ text, align = "left" }) => {
28696
28837
  // src/components/utilities/error-boundary/error-boundary.tsx
28697
28838
  import { ExclamationCircle as ExclamationCircle4 } from "@medusajs/icons";
28698
28839
  import { Text as Text21 } from "@medusajs/ui";
28699
- import { useTranslation as useTranslation47 } from "react-i18next";
28840
+ import { useTranslation as useTranslation49 } from "react-i18next";
28700
28841
  import { Navigate, useLocation as useLocation3, useRouteError } from "react-router-dom";
28701
28842
 
28702
28843
  // src/lib/is-fetch-error.ts
@@ -28710,7 +28851,7 @@ import { jsx as jsx106, jsxs as jsxs72 } from "react/jsx-runtime";
28710
28851
  var ErrorBoundary = () => {
28711
28852
  const error = useRouteError();
28712
28853
  const location = useLocation3();
28713
- const { t: t2 } = useTranslation47();
28854
+ const { t: t2 } = useTranslation49();
28714
28855
  let code = null;
28715
28856
  if (isClientError(error)) {
28716
28857
  if (error.status === 401) {
@@ -28770,7 +28911,7 @@ import {
28770
28911
  getPaginationRowModel,
28771
28912
  useReactTable as useReactTable2
28772
28913
  } from "@tanstack/react-table";
28773
- import { useEffect as useEffect26, useMemo as useMemo23, useState as useState39 } from "react";
28914
+ import { useEffect as useEffect26, useMemo as useMemo25, useState as useState39 } from "react";
28774
28915
  import { useSearchParams as useSearchParams9 } from "react-router-dom";
28775
28916
  var useDataTable2 = ({
28776
28917
  data = [],
@@ -28793,7 +28934,7 @@ var useDataTable2 = ({
28793
28934
  pageIndex: offset ? Math.ceil(Number(offset) / _pageSize) : 0,
28794
28935
  pageSize: _pageSize
28795
28936
  });
28796
- const pagination = useMemo23(
28937
+ const pagination = useMemo25(
28797
28938
  () => ({
28798
28939
  pageIndex,
28799
28940
  pageSize
@@ -28854,41 +28995,8 @@ var useDataTable2 = ({
28854
28995
  return { table };
28855
28996
  };
28856
28997
 
28857
- // src/permissions/permissions-context.tsx
28858
- import { createContext as createContext10 } from "react";
28859
- var PermissionsContext = createContext10(
28860
- null
28861
- );
28862
-
28863
- // src/permissions/permissions-provider.tsx
28864
- import { useCallback as useCallback28, useMemo as useMemo24 } from "react";
28865
-
28866
- // ../dashboard-sdk/dist/index.js
28867
- var PERMISSION_RIGHT_RANK = {
28868
- view: 1,
28869
- edit: 2,
28870
- manage: 3
28871
- };
28872
- function parsePermission(permission) {
28873
- const index = permission.lastIndexOf(":");
28874
- if (index <= 0) {
28875
- return null;
28876
- }
28877
- const right = permission.slice(index + 1);
28878
- if (!(right in PERMISSION_RIGHT_RANK)) {
28879
- return null;
28880
- }
28881
- return {
28882
- key: permission.slice(0, index),
28883
- right
28884
- };
28885
- }
28886
- function satisfiesPermission(permissions, key, right) {
28887
- const granted = permissions[key];
28888
- return !!granted && PERMISSION_RIGHT_RANK[granted] >= PERMISSION_RIGHT_RANK[right];
28889
- }
28890
-
28891
28998
  // src/permissions/permissions-provider.tsx
28999
+ import { useCallback as useCallback28, useMemo as useMemo26 } from "react";
28892
29000
  import { jsx as jsx108 } from "react/jsx-runtime";
28893
29001
  var PermissionsProvider = ({
28894
29002
  permissions = null,
@@ -28918,7 +29026,7 @@ var PermissionsProvider = ({
28918
29026
  (list) => !permissions || list.every(hasPermission),
28919
29027
  [permissions, hasPermission]
28920
29028
  );
28921
- const value = useMemo24(
29029
+ const value = useMemo26(
28922
29030
  () => ({
28923
29031
  permissions,
28924
29032
  isLoading,
@@ -28934,9 +29042,9 @@ var PermissionsProvider = ({
28934
29042
  };
28935
29043
 
28936
29044
  // src/permissions/use-permissions.tsx
28937
- import { useContext as useContext10 } from "react";
29045
+ import { useContext as useContext15 } from "react";
28938
29046
  var usePermissions = () => {
28939
- const context = useContext10(PermissionsContext);
29047
+ const context = useContext15(PermissionsContext);
28940
29048
  if (!context) {
28941
29049
  throw new Error("usePermissions must be used within a PermissionsProvider");
28942
29050
  }
@@ -28960,8 +29068,8 @@ var PermissionGuard = ({
28960
29068
  // src/permissions/route-permission-guard.tsx
28961
29069
  import { ExclamationCircle as ExclamationCircle5 } from "@medusajs/icons";
28962
29070
  import { Container as Container6, Heading as Heading10, Text as Text22 } from "@medusajs/ui";
28963
- import { useMemo as useMemo25 } from "react";
28964
- import { useTranslation as useTranslation48 } from "react-i18next";
29071
+ import { useMemo as useMemo27 } from "react";
29072
+ import { useTranslation as useTranslation50 } from "react-i18next";
28965
29073
  import { Navigate as Navigate2, Outlet as Outlet3, useMatches } from "react-router-dom";
28966
29074
  import { jsx as jsx110, jsxs as jsxs73 } from "react/jsx-runtime";
28967
29075
  var readRequirementFromHandle = (handle) => {
@@ -28993,7 +29101,7 @@ var readRequirementFromHandle = (handle) => {
28993
29101
  var RoutePermissionGuard = () => {
28994
29102
  const matches = useMatches();
28995
29103
  const { hasAnyPermission, hasAllPermissions, isLoading } = usePermissions();
28996
- const requirement = useMemo25(() => {
29104
+ const requirement = useMemo27(() => {
28997
29105
  for (let i = matches.length - 1; i >= 0; i--) {
28998
29106
  const found = readRequirementFromHandle(matches[i].handle);
28999
29107
  if (found) {
@@ -29017,7 +29125,7 @@ var RoutePermissionGuard = () => {
29017
29125
  var AccessDenied = ({
29018
29126
  requirement
29019
29127
  }) => {
29020
- const { t: t2 } = useTranslation48();
29128
+ const { t: t2 } = useTranslation50();
29021
29129
  return /* @__PURE__ */ jsx110("div", { className: "bg-ui-bg-subtle absolute bottom-0 left-0 right-0 top-0 flex min-h-screen items-center justify-center p-4", children: /* @__PURE__ */ jsx110(Container6, { className: "max-w-md", children: /* @__PURE__ */ jsxs73("div", { className: "flex flex-col items-center gap-y-4 py-8 text-center", children: [
29022
29130
  /* @__PURE__ */ jsx110("div", { className: "bg-ui-bg-subtle flex h-12 w-12 items-center justify-center rounded-full", children: /* @__PURE__ */ jsx110(ExclamationCircle5, { className: "text-ui-fg-muted" }) }),
29023
29131
  /* @__PURE__ */ jsxs73("div", { className: "flex flex-col gap-y-1", children: [
@@ -29031,10 +29139,10 @@ var AccessDenied = ({
29031
29139
  };
29032
29140
 
29033
29141
  // src/permissions/use-resource-permissions.tsx
29034
- import { useMemo as useMemo26 } from "react";
29142
+ import { useMemo as useMemo28 } from "react";
29035
29143
  var useResourcePermissions = (key) => {
29036
29144
  const { can, isLoading } = usePermissions();
29037
- return useMemo26(
29145
+ return useMemo28(
29038
29146
  () => ({
29039
29147
  canView: can(key, "view"),
29040
29148
  canEdit: can(key, "edit"),
@@ -29046,6 +29154,48 @@ var useResourcePermissions = (key) => {
29046
29154
  );
29047
29155
  };
29048
29156
 
29157
+ // src/permissions/use-can.tsx
29158
+ var useCan = (key, right = "view") => usePermissions().can(key, right);
29159
+
29160
+ // src/permissions/permission-action.tsx
29161
+ import { Tooltip as Tooltip15 } from "@medusajs/ui";
29162
+ import {
29163
+ cloneElement as cloneElement2,
29164
+ isValidElement
29165
+ } from "react";
29166
+ import { jsx as jsx111 } from "react/jsx-runtime";
29167
+ var PermissionAction = ({
29168
+ permission,
29169
+ requireAll = false,
29170
+ children
29171
+ }) => {
29172
+ const gate = usePermissionGate(permission, requireAll);
29173
+ if (gate.allowed) {
29174
+ return children;
29175
+ }
29176
+ const inner = children.props.children;
29177
+ const label = children.props.asChild && isValidElement(inner) ? inner.props.children : inner;
29178
+ return /* @__PURE__ */ jsx111(Tooltip15, { content: gate.tooltip, children: /* @__PURE__ */ jsx111("span", { className: "inline-flex", children: cloneElement2(children, { disabled: true, asChild: false }, label) }) });
29179
+ };
29180
+
29181
+ // src/permissions/section-no-access.tsx
29182
+ import { Text as Text23 } from "@medusajs/ui";
29183
+ import { useTranslation as useTranslation51 } from "react-i18next";
29184
+ import { jsx as jsx112 } from "react/jsx-runtime";
29185
+ var SectionNoAccess = ({ className }) => {
29186
+ const { t: t2 } = useTranslation51();
29187
+ return /* @__PURE__ */ jsx112("div", { className: className ?? "px-6 py-4", "data-testid": "section-no-access", children: /* @__PURE__ */ jsx112(Text23, { size: "small", leading: "compact", className: "text-ui-fg-subtle", children: t2("permissions.noAccess") }) });
29188
+ };
29189
+
29190
+ // src/permissions/with-permission.ts
29191
+ var createWithPermission = (getPermissions) => (loader, permission, options = {}) => async (args) => {
29192
+ const permissions = await getPermissions().catch(() => null);
29193
+ if (!permissionMapAllows(permissions, permission, options.requireAll ?? true)) {
29194
+ return null;
29195
+ }
29196
+ return loader(args);
29197
+ };
29198
+
29049
29199
  // src/providers/sidebar-provider/classes.ts
29050
29200
  var SIDEBAR_RAIL_FADE = [
29051
29201
  "transition-opacity duration-150 delay-100 ease-out motion-reduce:transition-none",
@@ -29059,9 +29209,9 @@ import { createContext as createContext11 } from "react";
29059
29209
  var SidebarContext = createContext11(null);
29060
29210
 
29061
29211
  // src/providers/sidebar-provider/sidebar-provider.tsx
29062
- import { useCallback as useCallback29, useEffect as useEffect27, useMemo as useMemo27, useState as useState40 } from "react";
29212
+ import { useCallback as useCallback29, useEffect as useEffect27, useMemo as useMemo29, useState as useState40 } from "react";
29063
29213
  import { useLocation as useLocation4 } from "react-router-dom";
29064
- import { jsx as jsx111 } from "react/jsx-runtime";
29214
+ import { jsx as jsx113 } from "react/jsx-runtime";
29065
29215
  var SidebarProvider = ({ children }) => {
29066
29216
  const [desktop, setDesktop] = useState40(true);
29067
29217
  const [mobile, setMobile] = useState40(false);
@@ -29076,7 +29226,7 @@ var SidebarProvider = ({ children }) => {
29076
29226
  setMobile((open) => !open);
29077
29227
  }
29078
29228
  }, []);
29079
- const value = useMemo27(
29229
+ const value = useMemo29(
29080
29230
  () => ({
29081
29231
  state: desktop ? "expanded" : "collapsed",
29082
29232
  desktop,
@@ -29087,16 +29237,16 @@ var SidebarProvider = ({ children }) => {
29087
29237
  }),
29088
29238
  [desktop, mobile, toggle]
29089
29239
  );
29090
- return /* @__PURE__ */ jsx111(SidebarContext.Provider, { value, children });
29240
+ return /* @__PURE__ */ jsx113(SidebarContext.Provider, { value, children });
29091
29241
  };
29092
29242
 
29093
29243
  // src/providers/sidebar-provider/use-collapsed-sidebar.tsx
29094
29244
  import { useEffect as useEffect28, useRef as useRef20 } from "react";
29095
29245
 
29096
29246
  // src/providers/sidebar-provider/use-sidebar.tsx
29097
- import { useContext as useContext11 } from "react";
29247
+ import { useContext as useContext16 } from "react";
29098
29248
  var useSidebar = () => {
29099
- const context = useContext11(SidebarContext);
29249
+ const context = useContext16(SidebarContext);
29100
29250
  if (!context) {
29101
29251
  throw new Error("useSidebar must be used within a SidebarProvider");
29102
29252
  }
@@ -29350,6 +29500,7 @@ export {
29350
29500
  NoResults,
29351
29501
  OrderBy,
29352
29502
  PercentageInput,
29503
+ PermissionAction,
29353
29504
  PermissionGuard,
29354
29505
  PermissionsContext,
29355
29506
  PermissionsProvider,
@@ -29372,6 +29523,7 @@ export {
29372
29523
  RoutePermissionGuard,
29373
29524
  SIDEBAR_MENU_CONTENT,
29374
29525
  SIDEBAR_RAIL_FADE,
29526
+ SectionNoAccess,
29375
29527
  SectionRow,
29376
29528
  SegmentedControl,
29377
29529
  SidebarContext,
@@ -29400,6 +29552,7 @@ export {
29400
29552
  VisuallyHidden,
29401
29553
  WidgetZone,
29402
29554
  _DataTable,
29555
+ applyActionPermissions,
29403
29556
  applyNavOverrides,
29404
29557
  buildAdditionalDataDefaults,
29405
29558
  buildAdditionalDataSchema,
@@ -29409,9 +29562,11 @@ export {
29409
29562
  createDataGridHelper,
29410
29563
  createDataGridPriceColumns,
29411
29564
  createFormHelper,
29565
+ createWithPermission,
29412
29566
  currencies,
29413
29567
  extractPricesFromOffers,
29414
29568
  extractReferenceIds,
29569
+ filterCommandsByPermission,
29415
29570
  formatFieldValue,
29416
29571
  genericForwardRef,
29417
29572
  getCountryByIso2,
@@ -29427,22 +29582,27 @@ export {
29427
29582
  getStylizedAmount,
29428
29583
  humanizeFieldName,
29429
29584
  isAmountLessThenRoundingError,
29585
+ isForbidden,
29430
29586
  isHtml,
29431
29587
  isImageList,
29432
29588
  isOrderActionable,
29433
29589
  isOrderAwaitingAction,
29590
+ isPermitted,
29434
29591
  isPriceListGroupRow,
29435
29592
  isProductRow,
29436
29593
  isReferenceField,
29437
29594
  isSameAddress,
29438
29595
  linkFields,
29596
+ permissionMapAllows,
29439
29597
  plainTextToHtml,
29440
29598
  productChangeViewHasContent,
29441
29599
  queryClient,
29442
29600
  queryKeysFactory,
29443
29601
  richTextContentClasses,
29444
29602
  sanitizeRichText,
29603
+ toPermissionList,
29445
29604
  useActionLocks,
29605
+ useCan,
29446
29606
  useCollapsedSidebar,
29447
29607
  useCombinedRefs,
29448
29608
  useCommandHistory,
@@ -29456,7 +29616,9 @@ export {
29456
29616
  useExtension,
29457
29617
  useExtensionActivity,
29458
29618
  useLinkQuery,
29619
+ usePermissionGate,
29459
29620
  usePermissions,
29621
+ usePermittedCommands,
29460
29622
  useQueryParams,
29461
29623
  useResourcePermissions,
29462
29624
  useRouteModal,