@vendure/dashboard 3.3.6-master-202507021511 → 3.3.6-master-202507030234

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (116) hide show
  1. package/README.md +41 -4
  2. package/dist/plugin/vite-plugin-config.js +4 -2
  3. package/package.json +4 -4
  4. package/src/app/routes/_authenticated/_administrators/components/administrator-bulk-actions.tsx +1 -1
  5. package/src/app/routes/_authenticated/_administrators/components/role-permissions-display.tsx +1 -1
  6. package/src/app/routes/_authenticated/_channels/components/channel-bulk-actions.tsx +1 -1
  7. package/src/app/routes/_authenticated/_collections/components/collection-bulk-actions.tsx +1 -2
  8. package/src/app/routes/_authenticated/_collections/components/collection-contents-table.tsx +1 -1
  9. package/src/app/routes/_authenticated/_collections/components/collection-filters-selector.tsx +1 -1
  10. package/src/app/routes/_authenticated/_countries/components/country-bulk-actions.tsx +1 -1
  11. package/src/app/routes/_authenticated/_customer-groups/components/customer-group-bulk-actions.tsx +1 -1
  12. package/src/app/routes/_authenticated/_customers/components/customer-address-form.tsx +1 -1
  13. package/src/app/routes/_authenticated/_customers/components/customer-bulk-actions.tsx +1 -1
  14. package/src/app/routes/_authenticated/_customers/components/customer-history/customer-history-container.tsx +1 -1
  15. package/src/app/routes/_authenticated/_customers/components/customer-order-table.tsx +1 -1
  16. package/src/app/routes/_authenticated/_customers/components/customer-status-badge.tsx +1 -1
  17. package/src/app/routes/_authenticated/_facets/components/edit-facet-value.tsx +1 -1
  18. package/src/app/routes/_authenticated/_facets/components/facet-bulk-actions.tsx +1 -2
  19. package/src/app/routes/_authenticated/_facets/components/facet-values-sheet.tsx +1 -1
  20. package/src/app/routes/_authenticated/_facets/components/facet-values-table.tsx +1 -1
  21. package/src/app/routes/_authenticated/_orders/components/customer-address-selector.tsx +1 -1
  22. package/src/app/routes/_authenticated/_orders/components/money-gross-net.tsx +1 -1
  23. package/src/app/routes/_authenticated/_orders/components/order-address.tsx +1 -1
  24. package/src/app/routes/_authenticated/_orders/components/order-history/order-history-container.tsx +1 -1
  25. package/src/app/routes/_authenticated/_orders/components/order-history/order-history.tsx +6 -1
  26. package/src/app/routes/_authenticated/_orders/components/order-line-custom-fields-form.tsx +1 -1
  27. package/src/app/routes/_authenticated/_orders/components/order-table-totals.tsx +3 -3
  28. package/src/app/routes/_authenticated/_orders/components/order-table.tsx +1 -1
  29. package/src/app/routes/_authenticated/_orders/components/order-tax-summary.tsx +2 -2
  30. package/src/app/routes/_authenticated/_orders/components/payment-details.tsx +1 -1
  31. package/src/app/routes/_authenticated/_orders/components/shipping-method-selector.tsx +1 -1
  32. package/src/app/routes/_authenticated/_payment-methods/components/payment-handler-selector.tsx +1 -1
  33. package/src/app/routes/_authenticated/_payment-methods/components/payment-method-bulk-actions.tsx +1 -2
  34. package/src/app/routes/_authenticated/_product-variants/components/product-variant-bulk-actions.tsx +1 -2
  35. package/src/app/routes/_authenticated/_products/components/create-product-variants.tsx +4 -1
  36. package/src/app/routes/_authenticated/_products/components/option-value-input.tsx +5 -1
  37. package/src/app/routes/_authenticated/_products/components/product-bulk-actions.tsx +1 -2
  38. package/src/app/routes/_authenticated/_products/components/product-option-select.tsx +6 -1
  39. package/src/app/routes/_authenticated/_promotions/components/promotion-actions-selector.tsx +1 -1
  40. package/src/app/routes/_authenticated/_promotions/components/promotion-bulk-actions.tsx +1 -2
  41. package/src/app/routes/_authenticated/_promotions/components/promotion-conditions-selector.tsx +1 -1
  42. package/src/app/routes/_authenticated/_roles/components/expandable-permissions.tsx +1 -1
  43. package/src/app/routes/_authenticated/_roles/components/permissions-grid.tsx +1 -1
  44. package/src/app/routes/_authenticated/_roles/components/role-bulk-actions.tsx +1 -1
  45. package/src/app/routes/_authenticated/_sellers/components/seller-bulk-actions.tsx +1 -1
  46. package/src/app/routes/_authenticated/_shipping-methods/components/fulfillment-handler-selector.tsx +1 -1
  47. package/src/app/routes/_authenticated/_shipping-methods/components/shipping-calculator-selector.tsx +1 -1
  48. package/src/app/routes/_authenticated/_shipping-methods/components/shipping-method-bulk-actions.tsx +1 -2
  49. package/src/app/routes/_authenticated/_stock-locations/components/stock-location-bulk-actions.tsx +1 -2
  50. package/src/app/routes/_authenticated/_system/components/payload-dialog.tsx +1 -1
  51. package/src/app/routes/_authenticated/_tax-categories/components/tax-category-bulk-actions.tsx +1 -1
  52. package/src/app/routes/_authenticated/_tax-rates/components/tax-rate-bulk-actions.tsx +1 -1
  53. package/src/app/routes/_authenticated/_zones/components/zone-bulk-actions.tsx +1 -1
  54. package/src/app/routes/_authenticated/_zones/components/zone-countries-sheet.tsx +1 -1
  55. package/src/app/routes/_authenticated/_zones/components/zone-countries-table.tsx +1 -1
  56. package/src/app/routes/_authenticated/index.tsx +1 -1
  57. package/src/lib/components/data-display/boolean.tsx +1 -1
  58. package/src/lib/components/data-display/date-time.tsx +1 -1
  59. package/src/lib/components/data-display/json.tsx +1 -1
  60. package/src/lib/components/data-input/affixed-input.tsx +1 -1
  61. package/src/lib/components/data-input/richt-text-input.tsx +1 -1
  62. package/src/lib/components/data-table/add-filter-menu.tsx +1 -1
  63. package/src/lib/components/data-table/data-table-bulk-actions.tsx +1 -1
  64. package/src/lib/components/data-table/data-table-column-header.tsx +1 -1
  65. package/src/lib/components/data-table/data-table-filter-dialog.tsx +1 -1
  66. package/src/lib/components/data-table/data-table.tsx +1 -1
  67. package/src/lib/components/data-table/filters/data-table-boolean-filter.tsx +4 -1
  68. package/src/lib/components/data-table/filters/data-table-datetime-filter.tsx +4 -1
  69. package/src/lib/components/data-table/filters/data-table-id-filter.tsx +1 -1
  70. package/src/lib/components/data-table/filters/data-table-number-filter.tsx +5 -1
  71. package/src/lib/components/data-table/filters/data-table-string-filter.tsx +4 -1
  72. package/src/lib/components/data-table/refresh-button.tsx +4 -1
  73. package/src/lib/components/layout/nav-main.tsx +1 -1
  74. package/src/lib/components/shared/asset/asset-bulk-actions.tsx +1 -1
  75. package/src/lib/components/shared/asset/asset-preview-selector.tsx +1 -1
  76. package/src/lib/components/shared/asset/asset-preview.tsx +1 -1
  77. package/src/lib/components/shared/asset/asset-properties.tsx +1 -1
  78. package/src/lib/components/shared/asset/focal-point-control.tsx +1 -1
  79. package/src/lib/components/shared/channel-code-label.tsx +1 -1
  80. package/src/lib/components/shared/copyable-text.tsx +2 -3
  81. package/src/lib/components/shared/custom-fields-form.tsx +1 -1
  82. package/src/lib/components/shared/error-page.tsx +1 -1
  83. package/src/lib/components/shared/history-timeline/history-entry.tsx +7 -1
  84. package/src/lib/components/shared/history-timeline/history-note-checkbox.tsx +1 -1
  85. package/src/lib/components/shared/history-timeline/history-note-input.tsx +1 -1
  86. package/src/lib/components/shared/history-timeline/history-timeline.tsx +1 -1
  87. package/src/lib/components/shared/option-value-input.tsx +1 -1
  88. package/src/lib/components/shared/paginated-list-data-table.tsx +1 -1
  89. package/src/lib/components/shared/permission-guard.tsx +1 -1
  90. package/src/lib/components/shared/product-variant-selector.tsx +1 -1
  91. package/src/lib/components/shared/role-code-label.tsx +1 -1
  92. package/src/lib/components/shared/stock-level-label.tsx +5 -5
  93. package/src/lib/components/shared/tax-category-selector.tsx +1 -1
  94. package/src/lib/components/shared/zone-selector.tsx +1 -1
  95. package/src/lib/framework/alert/alert-extensions.tsx +2 -3
  96. package/src/lib/framework/alert/alert-item.tsx +2 -1
  97. package/src/lib/framework/dashboard-widget/base-widget.tsx +2 -10
  98. package/src/lib/framework/dashboard-widget/widget-extensions.tsx +1 -1
  99. package/src/lib/framework/data-table/data-table-extensions.ts +1 -1
  100. package/src/lib/framework/extension-api/extension-api-types.ts +0 -3
  101. package/src/lib/framework/extension-api/types/data-table.ts +25 -2
  102. package/src/lib/framework/extension-api/types/widgets.ts +7 -4
  103. package/src/lib/framework/layout-engine/location-wrapper.tsx +4 -1
  104. package/src/lib/framework/layout-engine/page-layout.tsx +16 -9
  105. package/src/lib/framework/page/list-page.tsx +2 -8
  106. package/src/lib/framework/registry/registry-types.ts +7 -7
  107. package/src/lib/graphql/graphql-env.d.ts +31 -14
  108. package/src/lib/index.ts +0 -8
  109. package/src/lib/lib/trans.tsx +3 -3
  110. package/src/lib/providers/auth.tsx +1 -1
  111. package/src/lib/providers/channel-provider.tsx +1 -1
  112. package/src/lib/providers/theme-provider.tsx +2 -3
  113. package/vite/vite-plugin-config.ts +2 -1
  114. package/src/lib/framework/alert/types.ts +0 -13
  115. package/src/lib/framework/dashboard-widget/types.ts +0 -22
  116. package/src/lib/framework/data-table/data-table-types.ts +0 -25
package/README.md CHANGED
@@ -1,13 +1,50 @@
1
1
  # Vendure Dashboard
2
2
 
3
- This is an admin dashboard for managing Vendure applications. It is designed to supersede the existing Admin UI.
4
-
5
- Current status: early work in progress
3
+ This is a React-based admin dashboard for Vendure. It is a standalone application that can be extended to suit the
4
+ needs of any Vendure project.
6
5
 
7
6
  ## Development
8
7
 
9
8
  Run `npx vite` to start Vite in dev mode.
10
9
 
10
+ ### Note on internal `@/vdb` imports
11
+
12
+ You will notice that the dashboard uses internal Vendure Dashboard imports prefixed with `@/vdb`. This is adapted from the
13
+ convention of Shadcn which uses a `@/*` path alias for internal imports.
14
+
15
+ **Why not just use relative imports?**
16
+
17
+ The problem with using relative imports is that they are handled differently by Vite when compiling the dashboard. This
18
+ manifests as things like React Context not working correctly. The underlying reason is that Vite will selectively
19
+ pre-compile source code and mixing the imports between alias and relative can result in 2 "versions" of the same code
20
+ being loaded, which causes issues with React Context and other things that rely on a single instance of a module.
21
+
22
+ For this reason, try to use the `@/vdb` alias for all internal Vendure Dashboard imports to the "src/lib" directory.
23
+
24
+ This is especially import for hooks (since many of them use React Context) and there is even a pre-commit hook
25
+ that will run [a script](./scripts/check-internal-imports.js) to ensure that you are not using relative imports for
26
+ internal Vendure Dashboard code.
27
+
28
+ **Type Safety for Consumers**
29
+
30
+ Because we ship source code in the npm package, consumers need to tell TypeScript how to resolve these internal
31
+ imports by adding the path alias to _their_ `tsconfig.json` file.
32
+
33
+ ```json
34
+ {
35
+ "compilerOptions": {
36
+ "paths": {
37
+ "@/vdb/*": [
38
+ "./node_modules/@vendure/dashboard/src/lib/*"
39
+ ]
40
+ }
41
+ }
42
+ }
43
+ ```
44
+
45
+ Note: even without that path alias, the vite compilation will still work, but TypeScript types will not resolve correctly
46
+ when developing dashboard extensions.
47
+
11
48
  ## Testing
12
49
 
13
- Run `npm run test` to run tests once, or `npx vitest` to run tests in watch mode
50
+ Run `npm run test` to run tests once, or `npx vitest` to run tests in watch mode
@@ -7,7 +7,7 @@ export function viteConfigPlugin({ packageRoot }) {
7
7
  // Only set the vite `root` to the dashboard package when running the dev server.
8
8
  // During a production build we still need to reference the dashboard source which
9
9
  // lives in `node_modules`, but we don't want the build output to be emitted in there.
10
- // Therefore we set `root` only for `serve` and, for `build`, we instead make sure that
10
+ // Therefore, we set `root` only for `serve` and, for `build`, we instead make sure that
11
11
  // an `outDir` **outside** of `node_modules` is used (defaulting to the current working
12
12
  // directory if the user did not provide one already).
13
13
  config.root = packageRoot;
@@ -26,7 +26,9 @@ export function viteConfigPlugin({ packageRoot }) {
26
26
  config.build = Object.assign(Object.assign({}, buildConfig), { outDir: normalizedOutDir });
27
27
  }
28
28
  config.resolve = {
29
- alias: Object.assign(Object.assign({}, ((_c = (_b = config.resolve) === null || _b === void 0 ? void 0 : _b.alias) !== null && _c !== void 0 ? _c : {})), { '@/vdb': path.resolve(packageRoot, './src/lib'), '@/graphql': path.resolve(packageRoot, './src/lib/graphql') }),
29
+ alias: Object.assign(Object.assign({}, ((_c = (_b = config.resolve) === null || _b === void 0 ? void 0 : _b.alias) !== null && _c !== void 0 ? _c : {})), {
30
+ // See the readme for an explanation of this alias.
31
+ '@/vdb': path.resolve(packageRoot, './src/lib'), '@/graphql': path.resolve(packageRoot, './src/lib/graphql') }),
30
32
  };
31
33
  // This is required to prevent Vite from pre-bundling the
32
34
  // dashboard source when it resides in node_modules.
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@vendure/dashboard",
3
3
  "private": false,
4
- "version": "3.3.6-master-202507021511",
4
+ "version": "3.3.6-master-202507030234",
5
5
  "type": "module",
6
6
  "repository": {
7
7
  "type": "git",
@@ -86,8 +86,8 @@
86
86
  "@types/react-dom": "^19.0.4",
87
87
  "@types/react-grid-layout": "^1.3.5",
88
88
  "@uidotdev/usehooks": "^2.4.1",
89
- "@vendure/common": "^3.3.6-master-202507021511",
90
- "@vendure/core": "^3.3.6-master-202507021511",
89
+ "@vendure/common": "^3.3.6-master-202507030234",
90
+ "@vendure/core": "^3.3.6-master-202507030234",
91
91
  "@vitejs/plugin-react": "^4.3.4",
92
92
  "awesome-graphql-client": "^2.1.0",
93
93
  "class-variance-authority": "^0.7.1",
@@ -130,5 +130,5 @@
130
130
  "lightningcss-linux-arm64-musl": "^1.29.3",
131
131
  "lightningcss-linux-x64-musl": "^1.29.1"
132
132
  },
133
- "gitHead": "330b6000902c451a4646f4f8d0ec87e9093c327c"
133
+ "gitHead": "ca527d7a89a9cff83d965e384e5f3d27c24efe82"
134
134
  }
@@ -1,4 +1,4 @@
1
- import { BulkActionComponent } from '@/vdb/framework/data-table/data-table-types.js';
1
+ import { BulkActionComponent } from '@/vdb/framework/extension-api/types/index.js';
2
2
  import { DeleteBulkAction } from '../../../../common/delete-bulk-action.js';
3
3
  import { deleteAdministratorsDocument } from '../administrators.graphql.js';
4
4
 
@@ -28,7 +28,7 @@ interface RolePermissionsDisplayProps {
28
28
  value: string[];
29
29
  }
30
30
 
31
- export function RolePermissionsDisplay({ value = [] }: RolePermissionsDisplayProps) {
31
+ export function RolePermissionsDisplay({ value = [] }: Readonly<RolePermissionsDisplayProps>) {
32
32
  const { i18n } = useLingui();
33
33
  const groupedPermissions = useGroupedPermissions();
34
34
 
@@ -1,6 +1,6 @@
1
- import { BulkActionComponent } from '@/vdb/framework/data-table/data-table-types.js';
2
1
  import { DeleteBulkAction } from '../../../../common/delete-bulk-action.js';
3
2
  import { deleteChannelsDocument } from '../channels.graphql.js';
3
+ import { BulkActionComponent } from '@/vdb/framework/extension-api/types/index.js';
4
4
 
5
5
  export const DeleteChannelsBulkAction: BulkActionComponent<any> = ({ selection, table }) => {
6
6
  return (
@@ -2,9 +2,8 @@ import { useQueryClient } from '@tanstack/react-query';
2
2
 
3
3
  import { AssignToChannelBulkAction } from '@/vdb/components/shared/assign-to-channel-bulk-action.js';
4
4
  import { RemoveFromChannelBulkAction } from '@/vdb/components/shared/remove-from-channel-bulk-action.js';
5
- import { BulkActionComponent } from '@/vdb/framework/data-table/data-table-types.js';
6
5
  import { api } from '@/vdb/graphql/api.js';
7
- import { useChannel } from '@/vdb/index.js';
6
+ import { BulkActionComponent, useChannel } from '@/vdb/index.js';
8
7
  import { DeleteBulkAction } from '../../../../common/delete-bulk-action.js';
9
8
  import { DuplicateBulkAction } from '../../../../common/duplicate-bulk-action.js';
10
9
  import {
@@ -28,7 +28,7 @@ export interface CollectionContentsTableProps {
28
28
  collectionId?: string;
29
29
  }
30
30
 
31
- export function CollectionContentsTable({ collectionId }: CollectionContentsTableProps) {
31
+ export function CollectionContentsTable({ collectionId }: Readonly<CollectionContentsTableProps>) {
32
32
  const [sorting, setSorting] = useState<SortingState>([]);
33
33
  const [page, setPage] = useState(1);
34
34
  const [pageSize, setPageSize] = useState(10);
@@ -19,7 +19,7 @@ export interface CollectionFiltersSelectorProps {
19
19
  onChange: (filters: ConfigurableOperationInputType[]) => void;
20
20
  }
21
21
 
22
- export function CollectionFiltersSelector({ value, onChange }: CollectionFiltersSelectorProps) {
22
+ export function CollectionFiltersSelector({ value, onChange }: Readonly<CollectionFiltersSelectorProps>) {
23
23
  const { data: filtersData } = useQuery(getCollectionFiltersQueryOptions);
24
24
 
25
25
  const filters = filtersData?.collectionFilters;
@@ -1,4 +1,4 @@
1
- import { BulkActionComponent } from '@/vdb/framework/data-table/data-table-types.js';
1
+ import { BulkActionComponent } from '@/vdb/framework/extension-api/types/index.js';
2
2
  import { DeleteBulkAction } from '../../../../common/delete-bulk-action.js';
3
3
  import { deleteCountriesDocument } from '../countries.graphql.js';
4
4
 
@@ -1,4 +1,4 @@
1
- import { BulkActionComponent } from '@/vdb/framework/data-table/data-table-types.js';
1
+ import { BulkActionComponent } from '@/vdb/framework/extension-api/types/index.js';
2
2
  import { DeleteBulkAction } from '../../../../common/delete-bulk-action.js';
3
3
  import { deleteCustomerGroupsDocument } from '../customer-groups.graphql.js';
4
4
 
@@ -58,7 +58,7 @@ interface CustomerAddressFormProps {
58
58
  onCancel?: () => void;
59
59
  }
60
60
 
61
- export function CustomerAddressForm({ address, onSubmit, onCancel }: CustomerAddressFormProps) {
61
+ export function CustomerAddressForm({ address, onSubmit, onCancel }: Readonly<CustomerAddressFormProps>) {
62
62
  const { i18n } = useLingui();
63
63
 
64
64
  // Fetch available countries
@@ -1,4 +1,4 @@
1
- import { BulkActionComponent } from '@/vdb/framework/data-table/data-table-types.js';
1
+ import { BulkActionComponent } from '@/vdb/framework/extension-api/types/index.js';
2
2
  import { DeleteBulkAction } from '../../../../common/delete-bulk-action.js';
3
3
  import { deleteCustomersDocument } from '../customers.graphql.js';
4
4
 
@@ -10,7 +10,7 @@ interface CustomerHistoryContainerProps {
10
10
  customerId: string;
11
11
  }
12
12
 
13
- export function CustomerHistoryContainer({ customerId }: CustomerHistoryContainerProps) {
13
+ export function CustomerHistoryContainer({ customerId }: Readonly<CustomerHistoryContainerProps>) {
14
14
  const {
15
15
  historyEntries,
16
16
  customer,
@@ -11,7 +11,7 @@ interface CustomerOrderTableProps {
11
11
  customerId: string;
12
12
  }
13
13
 
14
- export function CustomerOrderTable({ customerId }: CustomerOrderTableProps) {
14
+ export function CustomerOrderTable({ customerId }: Readonly<CustomerOrderTableProps>) {
15
15
  const [page, setPage] = useState(1);
16
16
  const [pageSize, setPageSize] = useState(10);
17
17
  const [sorting, setSorting] = useState<SortingState>([{ id: 'orderPlacedAt', desc: true }]);
@@ -8,7 +8,7 @@ export interface CustomerStatusBadgeProps {
8
8
  user?: { verified: boolean } | null;
9
9
  }
10
10
 
11
- export function CustomerStatusBadge({ user }: CustomerStatusBadgeProps) {
11
+ export function CustomerStatusBadge({ user }: Readonly<CustomerStatusBadgeProps>) {
12
12
  const status = user ? (user.verified ? 'verified' : 'registered') : 'guest';
13
13
  return (
14
14
  <Badge variant="outline">
@@ -40,7 +40,7 @@ export interface EditFacetValueProps {
40
40
  onSuccess?: () => void;
41
41
  }
42
42
 
43
- export function EditFacetValue({ facetValueId, onSuccess }: EditFacetValueProps) {
43
+ export function EditFacetValue({ facetValueId, onSuccess }: Readonly<EditFacetValueProps>) {
44
44
  const {
45
45
  settings: { contentLanguage },
46
46
  } = useUserSettings();
@@ -2,10 +2,9 @@ import { toast } from 'sonner';
2
2
 
3
3
  import { AssignToChannelBulkAction } from '@/vdb/components/shared/assign-to-channel-bulk-action.js';
4
4
  import { RemoveFromChannelBulkAction } from '@/vdb/components/shared/remove-from-channel-bulk-action.js';
5
- import { BulkActionComponent } from '@/vdb/framework/data-table/data-table-types.js';
6
5
  import { api } from '@/vdb/graphql/api.js';
7
6
  import { ResultOf } from '@/vdb/graphql/graphql.js';
8
- import { useChannel } from '@/vdb/index.js';
7
+ import { BulkActionComponent, useChannel } from '@/vdb/index.js';
9
8
  import { useLingui } from '@/vdb/lib/trans.js';
10
9
  import { DeleteBulkAction } from '../../../../common/delete-bulk-action.js';
11
10
  import { DuplicateBulkAction } from '../../../../common/duplicate-bulk-action.js';
@@ -17,7 +17,7 @@ export interface FacetValuesSheetProps {
17
17
  children?: React.ReactNode;
18
18
  }
19
19
 
20
- export function FacetValuesSheet({ facetName, facetId, children }: FacetValuesSheetProps) {
20
+ export function FacetValuesSheet({ facetName, facetId, children }: Readonly<FacetValuesSheetProps>) {
21
21
  return (
22
22
  <Sheet>
23
23
  <SheetTrigger asChild>
@@ -28,7 +28,7 @@ export interface FacetValuesTableProps {
28
28
  facetId: string;
29
29
  }
30
30
 
31
- export function FacetValuesTable({ facetId }: FacetValuesTableProps) {
31
+ export function FacetValuesTable({ facetId }: Readonly<FacetValuesTableProps>) {
32
32
  const [sorting, setSorting] = useState<SortingState>([]);
33
33
  const [page, setPage] = useState(1);
34
34
  const [pageSize, setPageSize] = useState(10);
@@ -31,7 +31,7 @@ interface CustomerAddressSelectorProps {
31
31
  onSelect: (address: ResultOf<typeof addressFragment>) => void;
32
32
  }
33
33
 
34
- export function CustomerAddressSelector({ customerId, onSelect }: CustomerAddressSelectorProps) {
34
+ export function CustomerAddressSelector({ customerId, onSelect }: Readonly<CustomerAddressSelectorProps>) {
35
35
  const { i18n } = useLingui();
36
36
  const [open, setOpen] = useState(false);
37
37
 
@@ -6,7 +6,7 @@ export interface MoneyGrossNetProps {
6
6
  currencyCode: string;
7
7
  }
8
8
 
9
- export function MoneyGrossNet({ priceWithTax, price, currencyCode }: MoneyGrossNetProps) {
9
+ export function MoneyGrossNet({ priceWithTax, price, currencyCode }: Readonly<MoneyGrossNetProps>) {
10
10
  return (
11
11
  <div className="flex flex-col gap-1">
12
12
  <div>
@@ -5,7 +5,7 @@ import { orderAddressFragment } from '../orders.graphql.js';
5
5
 
6
6
  type OrderAddress = ResultOf<typeof orderAddressFragment>;
7
7
 
8
- export function OrderAddress({ address }: { address?: OrderAddress }) {
8
+ export function OrderAddress({ address }: Readonly<{ address?: OrderAddress }>) {
9
9
  if (!address) {
10
10
  return null;
11
11
  }
@@ -10,7 +10,7 @@ interface OrderHistoryContainerProps {
10
10
  orderId: string;
11
11
  }
12
12
 
13
- export function OrderHistoryContainer({ orderId }: OrderHistoryContainerProps) {
13
+ export function OrderHistoryContainer({ orderId }: Readonly<OrderHistoryContainerProps>) {
14
14
  const {
15
15
  historyEntries,
16
16
  order,
@@ -17,7 +17,12 @@ interface OrderHistoryProps {
17
17
  onDeleteNote?: (entryId: string) => void;
18
18
  }
19
19
 
20
- export function OrderHistory({ historyEntries, onAddNote, onUpdateNote, onDeleteNote }: OrderHistoryProps) {
20
+ export function OrderHistory({
21
+ historyEntries,
22
+ onAddNote,
23
+ onUpdateNote,
24
+ onDeleteNote,
25
+ }: Readonly<OrderHistoryProps>) {
21
26
  const getTimelineIcon = (entry: OrderHistoryProps['historyEntries'][0]) => {
22
27
  switch (entry.type) {
23
28
  case 'ORDER_PAYMENT_TRANSITION':
@@ -10,7 +10,7 @@ interface OrderLineCustomFieldsFormProps {
10
10
  form: UseFormReturn<any>;
11
11
  }
12
12
 
13
- export function OrderLineCustomFieldsForm({ onUpdate, form }: OrderLineCustomFieldsFormProps) {
13
+ export function OrderLineCustomFieldsForm({ onUpdate, form }: Readonly<OrderLineCustomFieldsFormProps>) {
14
14
  const onSubmit = (values: any) => {
15
15
  onUpdate(values.input?.customFields);
16
16
  };
@@ -11,14 +11,14 @@ export interface OrderTableTotalsProps {
11
11
  columnCount: number;
12
12
  }
13
13
 
14
- export function OrderTableTotals({ order, columnCount }: OrderTableTotalsProps) {
14
+ export function OrderTableTotals({ order, columnCount }: Readonly<OrderTableTotalsProps>) {
15
15
  const currencyCode = order.currencyCode;
16
16
 
17
17
  return (
18
18
  <>
19
19
  {order.discounts?.length > 0
20
- ? order.discounts.map(discount => (
21
- <TableRow>
20
+ ? order.discounts.map((discount, index) => (
21
+ <TableRow key={`${discount.description}-${index}`}>
22
22
  <TableCell colSpan={columnCount - 1} className="h-12">
23
23
  <Trans>Discount</Trans>: {discount.description}
24
24
  </TableCell>
@@ -20,7 +20,7 @@ export interface OrderTableProps {
20
20
  order: OrderFragment;
21
21
  }
22
22
 
23
- export function OrderTable({ order }: OrderTableProps) {
23
+ export function OrderTable({ order }: Readonly<OrderTableProps>) {
24
24
  const [columnVisibility, setColumnVisibility] = useState<VisibilityState>({});
25
25
 
26
26
  const currencyCode = order.currencyCode;
@@ -1,10 +1,10 @@
1
1
  import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@/vdb/components/ui/table.js';
2
2
  import { useLocalFormat } from '@/vdb/hooks/use-local-format.js';
3
- import { Trans } from '@/vdb/lib/trans';
3
+ import { Trans } from '@/vdb/lib/trans.js';
4
4
  import { ResultOf } from 'gql.tada';
5
5
  import { orderDetailFragment } from '../orders.graphql.js';
6
6
 
7
- export function OrderTaxSummary({ order }: { order: ResultOf<typeof orderDetailFragment> }) {
7
+ export function OrderTaxSummary({ order }: Readonly<{ order: ResultOf<typeof orderDetailFragment> }>) {
8
8
  const { formatCurrency } = useLocalFormat();
9
9
  return (
10
10
  <div>
@@ -8,7 +8,7 @@ type PaymentDetailsProps = {
8
8
  currencyCode: string;
9
9
  };
10
10
 
11
- export function PaymentDetails({ payment, currencyCode }: PaymentDetailsProps) {
11
+ export function PaymentDetails({ payment, currencyCode }: Readonly<PaymentDetailsProps>) {
12
12
  const { formatCurrency, formatDate } = useLocalFormat();
13
13
  const t = (key: string) => key;
14
14
 
@@ -20,7 +20,7 @@ export function ShippingMethodSelector({
20
20
  selectedShippingMethodId,
21
21
  currencyCode,
22
22
  onSelect,
23
- }: ShippingMethodSelectorProps) {
23
+ }: Readonly<ShippingMethodSelectorProps>) {
24
24
  return (
25
25
  <div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4">
26
26
  {eligibleShippingMethods?.length ? (
@@ -33,7 +33,7 @@ interface PaymentHandlerSelectorProps {
33
33
  onChange: (value: ConfigurableOperationInputType | undefined) => void;
34
34
  }
35
35
 
36
- export function PaymentHandlerSelector({ value, onChange }: PaymentHandlerSelectorProps) {
36
+ export function PaymentHandlerSelector({ value, onChange }: Readonly<PaymentHandlerSelectorProps>) {
37
37
  const { data: handlersData } = useQuery({
38
38
  queryKey: ['paymentMethodHandlers'],
39
39
  queryFn: () => api.query(paymentHandlersDocument),
@@ -1,8 +1,7 @@
1
1
  import { AssignToChannelBulkAction } from '@/vdb/components/shared/assign-to-channel-bulk-action.js';
2
2
  import { RemoveFromChannelBulkAction } from '@/vdb/components/shared/remove-from-channel-bulk-action.js';
3
- import { BulkActionComponent } from '@/vdb/framework/data-table/data-table-types.js';
4
3
  import { api } from '@/vdb/graphql/api.js';
5
- import { useChannel } from '@/vdb/index.js';
4
+ import { BulkActionComponent, useChannel } from '@/vdb/index.js';
6
5
  import { DeleteBulkAction } from '../../../../common/delete-bulk-action.js';
7
6
 
8
7
  import {
@@ -5,9 +5,8 @@ import { DataTableBulkActionItem } from '@/vdb/components/data-table/data-table-
5
5
  import { AssignToChannelBulkAction } from '@/vdb/components/shared/assign-to-channel-bulk-action.js';
6
6
  import { usePriceFactor } from '@/vdb/components/shared/assign-to-channel-dialog.js';
7
7
  import { RemoveFromChannelBulkAction } from '@/vdb/components/shared/remove-from-channel-bulk-action.js';
8
- import { BulkActionComponent } from '@/vdb/framework/data-table/data-table-types.js';
9
8
  import { api } from '@/vdb/graphql/api.js';
10
- import { useChannel, usePaginatedList } from '@/vdb/index.js';
9
+ import { BulkActionComponent, useChannel, usePaginatedList } from '@/vdb/index.js';
11
10
  import { Trans } from '@/vdb/lib/trans.js';
12
11
  import { DeleteBulkAction } from '../../../../common/delete-bulk-action.js';
13
12
 
@@ -97,7 +97,10 @@ interface CreateProductVariantsProps {
97
97
  onChange?: ({ data }: { data: VariantConfiguration }) => void;
98
98
  }
99
99
 
100
- export function CreateProductVariants({ currencyCode = 'USD', onChange }: CreateProductVariantsProps) {
100
+ export function CreateProductVariants({
101
+ currencyCode = 'USD',
102
+ onChange,
103
+ }: Readonly<CreateProductVariantsProps>) {
101
104
  const { data: stockLocationsResult } = useQuery({
102
105
  queryKey: ['stockLocations'],
103
106
  queryFn: () => api.query(getStockLocationsDocument, { options: { take: 100 } }),
@@ -32,7 +32,11 @@ interface OptionValueInputProps {
32
32
  disabled?: boolean;
33
33
  }
34
34
 
35
- export function OptionValueInput({ groupName, groupIndex, disabled = false }: OptionValueInputProps) {
35
+ export function OptionValueInput({
36
+ groupName,
37
+ groupIndex,
38
+ disabled = false,
39
+ }: Readonly<OptionValueInputProps>) {
36
40
  const { control, watch } = useFormContext<FormValues>();
37
41
  const { fields, append, remove } = useFieldArray({
38
42
  control,
@@ -5,9 +5,8 @@ import { DataTableBulkActionItem } from '@/vdb/components/data-table/data-table-
5
5
  import { AssignToChannelBulkAction } from '@/vdb/components/shared/assign-to-channel-bulk-action.js';
6
6
  import { usePriceFactor } from '@/vdb/components/shared/assign-to-channel-dialog.js';
7
7
  import { RemoveFromChannelBulkAction } from '@/vdb/components/shared/remove-from-channel-bulk-action.js';
8
- import { BulkActionComponent } from '@/vdb/framework/data-table/data-table-types.js';
9
8
  import { api } from '@/vdb/graphql/api.js';
10
- import { useChannel, usePaginatedList } from '@/vdb/index.js';
9
+ import { BulkActionComponent, useChannel, usePaginatedList } from '@/vdb/index.js';
11
10
  import { Trans } from '@/vdb/lib/trans.js';
12
11
  import { DeleteBulkAction } from '../../../../common/delete-bulk-action.js';
13
12
  import { DuplicateBulkAction } from '../../../../common/duplicate-bulk-action.js';
@@ -33,7 +33,12 @@ interface ProductOptionSelectProps {
33
33
  onCreateOption: (name: string) => void;
34
34
  }
35
35
 
36
- export function ProductOptionSelect({ group, value, onChange, onCreateOption }: ProductOptionSelectProps) {
36
+ export function ProductOptionSelect({
37
+ group,
38
+ value,
39
+ onChange,
40
+ onCreateOption,
41
+ }: Readonly<ProductOptionSelectProps>) {
37
42
  const [open, setOpen] = useState(false);
38
43
  const [newOptionInput, setNewOptionInput] = useState('');
39
44
  const { i18n } = useLingui();
@@ -34,7 +34,7 @@ interface PromotionActionsSelectorProps {
34
34
  onChange: (value: ConfigurableOperationInputType[]) => void;
35
35
  }
36
36
 
37
- export function PromotionActionsSelector({ value, onChange }: PromotionActionsSelectorProps) {
37
+ export function PromotionActionsSelector({ value, onChange }: Readonly<PromotionActionsSelectorProps>) {
38
38
  const { data: actionsData } = useQuery({
39
39
  queryKey: ['promotionActions'],
40
40
  queryFn: () => api.query(promotionActionsDocument),
@@ -1,8 +1,7 @@
1
1
  import { AssignToChannelBulkAction } from '@/vdb/components/shared/assign-to-channel-bulk-action.js';
2
2
  import { RemoveFromChannelBulkAction } from '@/vdb/components/shared/remove-from-channel-bulk-action.js';
3
- import { BulkActionComponent } from '@/vdb/framework/data-table/data-table-types.js';
4
3
  import { api } from '@/vdb/graphql/api.js';
5
- import { useChannel } from '@/vdb/index.js';
4
+ import { BulkActionComponent, useChannel } from '@/vdb/index.js';
6
5
  import { DeleteBulkAction } from '../../../../common/delete-bulk-action.js';
7
6
  import { DuplicateBulkAction } from '../../../../common/duplicate-bulk-action.js';
8
7
 
@@ -34,7 +34,7 @@ interface PromotionConditionsSelectorProps {
34
34
  onChange: (value: ConfigurableOperationInputType[]) => void;
35
35
  }
36
36
 
37
- export function PromotionConditionsSelector({ value, onChange }: PromotionConditionsSelectorProps) {
37
+ export function PromotionConditionsSelector({ value, onChange }: Readonly<PromotionConditionsSelectorProps>) {
38
38
  const { data: conditionsData } = useQuery({
39
39
  queryKey: ['promotionConditions'],
40
40
  queryFn: () => api.query(promotionConditionsDocument),
@@ -13,7 +13,7 @@ import { ResultOf } from 'gql.tada';
13
13
  import { PlusIcon } from 'lucide-react';
14
14
  import { roleItemFragment } from '../roles.graphql.js';
15
15
 
16
- export function ExpandablePermissions({ role }: { role: ResultOf<typeof roleItemFragment> }) {
16
+ export function ExpandablePermissions({ role }: Readonly<{ role: ResultOf<typeof roleItemFragment> }>) {
17
17
  const permissionsToPreview = role.permissions.slice(0, 3);
18
18
 
19
19
  return (
@@ -18,7 +18,7 @@ interface PermissionsGridProps {
18
18
  readonly?: boolean;
19
19
  }
20
20
 
21
- export function PermissionsGrid({ value, onChange, readonly = false }: PermissionsGridProps) {
21
+ export function PermissionsGrid({ value, onChange, readonly = false }: Readonly<PermissionsGridProps>) {
22
22
  const { i18n } = useLingui();
23
23
  const groupedPermissions = useGroupedPermissions();
24
24
 
@@ -1,4 +1,4 @@
1
- import { BulkActionComponent } from '@/vdb/framework/data-table/data-table-types.js';
1
+ import { BulkActionComponent } from '@/vdb/framework/extension-api/types/index.js';
2
2
  import { DeleteBulkAction } from '../../../../common/delete-bulk-action.js';
3
3
  import { deleteRolesDocument } from '../roles.graphql.js';
4
4
 
@@ -1,4 +1,4 @@
1
- import { BulkActionComponent } from '@/vdb/framework/data-table/data-table-types.js';
1
+ import { BulkActionComponent } from '@/vdb/framework/extension-api/types/index.js';
2
2
  import { DeleteBulkAction } from '../../../../common/delete-bulk-action.js';
3
3
  import { deleteSellersDocument } from '../sellers.graphql.js';
4
4
 
@@ -20,7 +20,7 @@ interface FulfillmentHandlerSelectorProps {
20
20
  onChange: (value: string | undefined) => void;
21
21
  }
22
22
 
23
- export function FulfillmentHandlerSelector({ value, onChange }: FulfillmentHandlerSelectorProps) {
23
+ export function FulfillmentHandlerSelector({ value, onChange }: Readonly<FulfillmentHandlerSelectorProps>) {
24
24
  const { data: fulfillmentHandlersData } = useQuery({
25
25
  queryKey: ['fulfillmentHandlers'],
26
26
  queryFn: () => api.query(fulfillmentHandlersDocument),
@@ -33,7 +33,7 @@ interface ShippingCalculatorSelectorProps {
33
33
  onChange: (value: ConfigurableOperationInputType | undefined) => void;
34
34
  }
35
35
 
36
- export function ShippingCalculatorSelector({ value, onChange }: ShippingCalculatorSelectorProps) {
36
+ export function ShippingCalculatorSelector({ value, onChange }: Readonly<ShippingCalculatorSelectorProps>) {
37
37
  const { data: calculatorsData } = useQuery({
38
38
  queryKey: ['shippingCalculators'],
39
39
  queryFn: () => api.query(shippingCalculatorsDocument),
@@ -1,8 +1,7 @@
1
1
  import { AssignToChannelBulkAction } from '@/vdb/components/shared/assign-to-channel-bulk-action.js';
2
2
  import { RemoveFromChannelBulkAction } from '@/vdb/components/shared/remove-from-channel-bulk-action.js';
3
- import { BulkActionComponent } from '@/vdb/framework/data-table/data-table-types.js';
4
3
  import { api } from '@/vdb/graphql/api.js';
5
- import { useChannel } from '@/vdb/index.js';
4
+ import { BulkActionComponent, useChannel } from '@/vdb/index.js';
6
5
  import { DeleteBulkAction } from '../../../../common/delete-bulk-action.js';
7
6
 
8
7
  import {
@@ -1,8 +1,7 @@
1
1
  import { AssignToChannelBulkAction } from '@/vdb/components/shared/assign-to-channel-bulk-action.js';
2
2
  import { RemoveFromChannelBulkAction } from '@/vdb/components/shared/remove-from-channel-bulk-action.js';
3
- import { BulkActionComponent } from '@/vdb/framework/data-table/data-table-types.js';
4
3
  import { api } from '@/vdb/graphql/api.js';
5
- import { useChannel } from '@/vdb/index.js';
4
+ import { BulkActionComponent, useChannel } from '@/vdb/index.js';
6
5
  import { DeleteBulkAction } from '../../../../common/delete-bulk-action.js';
7
6
 
8
7
  import {
@@ -16,7 +16,7 @@ type PayloadDialogProps = {
16
16
  description?: string | React.ReactNode;
17
17
  };
18
18
 
19
- export function PayloadDialog({ payload, trigger, title, description }: PayloadDialogProps) {
19
+ export function PayloadDialog({ payload, trigger, title, description }: Readonly<PayloadDialogProps>) {
20
20
  return (
21
21
  <Dialog>
22
22
  <DialogTrigger asChild>{trigger}</DialogTrigger>