@vendure/dashboard 3.2.2 → 3.2.4

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 (92) hide show
  1. package/dist/plugin/utils/ast-utils.d.ts +10 -0
  2. package/dist/plugin/utils/ast-utils.js +96 -0
  3. package/dist/plugin/utils/ast-utils.spec.d.ts +1 -0
  4. package/dist/plugin/utils/ast-utils.spec.js +120 -0
  5. package/dist/plugin/{config-loader.d.ts → utils/config-loader.d.ts} +22 -8
  6. package/dist/plugin/utils/config-loader.js +325 -0
  7. package/dist/plugin/{schema-generator.d.ts → utils/schema-generator.d.ts} +5 -0
  8. package/dist/plugin/{schema-generator.js → utils/schema-generator.js} +6 -0
  9. package/dist/plugin/{ui-config.js → utils/ui-config.js} +2 -2
  10. package/dist/plugin/vite-plugin-admin-api-schema.js +2 -2
  11. package/dist/plugin/vite-plugin-config-loader.d.ts +2 -3
  12. package/dist/plugin/vite-plugin-config-loader.js +18 -9
  13. package/dist/plugin/vite-plugin-dashboard-metadata.js +12 -14
  14. package/dist/plugin/vite-plugin-gql-tada.js +2 -2
  15. package/dist/plugin/vite-plugin-ui-config.js +3 -2
  16. package/package.json +8 -6
  17. package/src/app/app-providers.tsx +8 -8
  18. package/src/app/main.tsx +1 -1
  19. package/src/app/routes/_authenticated/_assets/assets.graphql.ts +26 -0
  20. package/src/app/routes/_authenticated/_assets/assets.tsx +2 -2
  21. package/src/app/routes/_authenticated/_assets/assets_.$id.tsx +156 -0
  22. package/src/app/routes/_authenticated/_orders/components/customer-address-selector.tsx +104 -0
  23. package/src/app/routes/_authenticated/_orders/components/edit-order-table.tsx +228 -0
  24. package/src/app/routes/_authenticated/_orders/components/money-gross-net.tsx +18 -0
  25. package/src/app/routes/_authenticated/_orders/components/order-address.tsx +2 -1
  26. package/src/app/routes/_authenticated/_orders/components/order-line-custom-fields-form.tsx +38 -0
  27. package/src/app/routes/_authenticated/_orders/components/order-table-totals.tsx +53 -0
  28. package/src/app/routes/_authenticated/_orders/components/order-table.tsx +8 -49
  29. package/src/app/routes/_authenticated/_orders/components/shipping-method-selector.tsx +65 -0
  30. package/src/app/routes/_authenticated/_orders/orders.graphql.ts +187 -1
  31. package/src/app/routes/_authenticated/_orders/orders.tsx +39 -18
  32. package/src/app/routes/_authenticated/_orders/orders_.$id.tsx +31 -9
  33. package/src/app/routes/_authenticated/_orders/orders_.draft.$id.tsx +418 -0
  34. package/src/app/routes/_authenticated/_products/products.tsx +1 -1
  35. package/src/app/routes/_authenticated.tsx +12 -1
  36. package/src/lib/components/data-table/add-filter-menu.tsx +61 -0
  37. package/src/lib/components/data-table/data-table-column-header.tsx +0 -13
  38. package/src/lib/components/data-table/data-table-filter-badge.tsx +75 -0
  39. package/src/lib/components/data-table/data-table-filter-dialog.tsx +27 -28
  40. package/src/lib/components/data-table/data-table-types.ts +1 -0
  41. package/src/lib/components/data-table/data-table-view-options.tsx +72 -23
  42. package/src/lib/components/data-table/data-table.tsx +23 -24
  43. package/src/lib/components/data-table/filters/data-table-boolean-filter.tsx +57 -0
  44. package/src/lib/components/data-table/filters/data-table-datetime-filter.tsx +93 -0
  45. package/src/lib/components/data-table/filters/data-table-id-filter.tsx +58 -0
  46. package/src/lib/components/data-table/filters/data-table-number-filter.tsx +119 -0
  47. package/src/lib/components/data-table/filters/data-table-string-filter.tsx +62 -0
  48. package/src/lib/components/data-table/human-readable-operator.tsx +65 -0
  49. package/src/lib/components/layout/nav-user.tsx +4 -4
  50. package/src/lib/components/shared/asset/asset-focal-point-editor.tsx +93 -0
  51. package/src/lib/components/shared/{asset-gallery.tsx → asset/asset-gallery.tsx} +51 -20
  52. package/src/lib/components/shared/{asset-picker-dialog.tsx → asset/asset-picker-dialog.tsx} +1 -1
  53. package/src/lib/components/shared/{asset-preview-dialog.tsx → asset/asset-preview-dialog.tsx} +1 -7
  54. package/src/lib/components/shared/asset/asset-preview-selector.tsx +34 -0
  55. package/src/lib/components/shared/asset/asset-preview.tsx +128 -0
  56. package/src/lib/components/shared/asset/asset-properties.tsx +46 -0
  57. package/src/lib/components/shared/{focal-point-control.tsx → asset/focal-point-control.tsx} +1 -1
  58. package/src/lib/components/shared/custom-fields-form.tsx +4 -3
  59. package/src/lib/components/shared/customer-selector.tsx +13 -14
  60. package/src/lib/components/shared/detail-page-button.tsx +2 -2
  61. package/src/lib/components/shared/entity-assets.tsx +3 -3
  62. package/src/lib/components/shared/navigation-confirmation.tsx +39 -0
  63. package/src/lib/components/shared/paginated-list-data-table.tsx +9 -1
  64. package/src/lib/components/shared/product-variant-selector.tsx +111 -0
  65. package/src/lib/components/shared/vendure-image.tsx +1 -1
  66. package/src/lib/components/ui/calendar.tsx +508 -63
  67. package/src/lib/framework/document-introspection/get-document-structure.spec.ts +113 -3
  68. package/src/lib/framework/document-introspection/get-document-structure.ts +70 -11
  69. package/src/lib/framework/form-engine/use-generated-form.tsx +8 -7
  70. package/src/lib/framework/layout-engine/page-layout.tsx +4 -0
  71. package/src/lib/framework/page/list-page.tsx +23 -4
  72. package/src/lib/framework/page/use-detail-page.ts +1 -0
  73. package/src/lib/graphql/fragments.tsx +8 -0
  74. package/src/lib/index.ts +5 -5
  75. package/src/lib/providers/auth.tsx +12 -9
  76. package/src/lib/providers/channel-provider.tsx +1 -0
  77. package/src/lib/providers/server-config.tsx +7 -1
  78. package/src/lib/providers/user-settings.tsx +24 -0
  79. package/vite/utils/ast-utils.spec.ts +128 -0
  80. package/vite/utils/ast-utils.ts +119 -0
  81. package/vite/utils/config-loader.ts +410 -0
  82. package/vite/{schema-generator.ts → utils/schema-generator.ts} +7 -1
  83. package/vite/{ui-config.ts → utils/ui-config.ts} +2 -2
  84. package/vite/vite-plugin-admin-api-schema.ts +2 -2
  85. package/vite/vite-plugin-config-loader.ts +25 -13
  86. package/vite/vite-plugin-dashboard-metadata.ts +19 -15
  87. package/vite/vite-plugin-gql-tada.ts +2 -2
  88. package/vite/vite-plugin-ui-config.ts +3 -2
  89. package/dist/plugin/config-loader.js +0 -141
  90. package/src/lib/components/shared/asset-preview.tsx +0 -345
  91. package/vite/config-loader.ts +0 -181
  92. /package/dist/plugin/{ui-config.d.ts → utils/ui-config.d.ts} +0 -0
@@ -1,4 +1,4 @@
1
- import { assetFragment } from '@/graphql/fragments.js';
1
+ import { assetFragment, errorResultFragment } from '@/graphql/fragments.js';
2
2
  import { graphql } from '@/graphql/graphql.js';
3
3
  import { gql } from 'awesome-graphql-client';
4
4
 
@@ -163,6 +163,7 @@ export const orderLineFragment = graphql(
163
163
  linePriceWithTax
164
164
  discountedLinePrice
165
165
  discountedLinePriceWithTax
166
+ customFields
166
167
  }
167
168
  `,
168
169
  [assetFragment],
@@ -214,6 +215,7 @@ export const orderDetailFragment = graphql(
214
215
  promotions {
215
216
  id
216
217
  couponCode
218
+ name
217
219
  }
218
220
  subTotal
219
221
  subTotalWithTax
@@ -323,3 +325,187 @@ export const orderHistoryDocument = graphql(`
323
325
  }
324
326
  }
325
327
  `);
328
+
329
+ export const createDraftOrderDocument = graphql(`
330
+ mutation CreateDraftOrder {
331
+ createDraftOrder {
332
+ id
333
+ }
334
+ }
335
+ `);
336
+
337
+ export const deleteDraftOrderDocument = graphql(`
338
+ mutation DeleteDraftOrder($orderId: ID!) {
339
+ deleteDraftOrder(orderId: $orderId) {
340
+ result
341
+ message
342
+ }
343
+ }
344
+ `);
345
+
346
+ export const addItemToDraftOrderDocument = graphql(
347
+ `
348
+ mutation AddItemToDraftOrder($orderId: ID!, $input: AddItemToDraftOrderInput!) {
349
+ addItemToDraftOrder(orderId: $orderId, input: $input) {
350
+ __typename
351
+ ... on Order {
352
+ id
353
+ }
354
+ ...ErrorResult
355
+ }
356
+ }
357
+ `,
358
+ [errorResultFragment],
359
+ );
360
+
361
+ export const adjustDraftOrderLineDocument = graphql(
362
+ `
363
+ mutation AdjustDraftOrderLine($orderId: ID!, $input: AdjustDraftOrderLineInput!) {
364
+ adjustDraftOrderLine(orderId: $orderId, input: $input) {
365
+ __typename
366
+ ... on Order {
367
+ id
368
+ }
369
+ ...ErrorResult
370
+ }
371
+ }
372
+ `,
373
+ [errorResultFragment],
374
+ );
375
+
376
+ export const removeDraftOrderLineDocument = graphql(
377
+ `
378
+ mutation RemoveDraftOrderLine($orderId: ID!, $orderLineId: ID!) {
379
+ removeDraftOrderLine(orderId: $orderId, orderLineId: $orderLineId) {
380
+ __typename
381
+ ... on Order {
382
+ id
383
+ }
384
+ ...ErrorResult
385
+ }
386
+ }
387
+ `,
388
+ [errorResultFragment],
389
+ );
390
+
391
+ export const setCustomerForDraftOrderDocument = graphql(
392
+ `
393
+ mutation SetCustomerForDraftOrder($orderId: ID!, $customerId: ID, $input: CreateCustomerInput) {
394
+ setCustomerForDraftOrder(orderId: $orderId, customerId: $customerId, input: $input) {
395
+ __typename
396
+ ... on Order {
397
+ id
398
+ }
399
+ ...ErrorResult
400
+ }
401
+ }
402
+ `,
403
+ [errorResultFragment],
404
+ );
405
+
406
+ export const setShippingAddressForDraftOrderDocument = graphql(`
407
+ mutation SetDraftOrderShippingAddress($orderId: ID!, $input: CreateAddressInput!) {
408
+ setDraftOrderShippingAddress(orderId: $orderId, input: $input) {
409
+ id
410
+ }
411
+ }
412
+ `);
413
+
414
+ export const setBillingAddressForDraftOrderDocument = graphql(`
415
+ mutation SetDraftOrderBillingAddress($orderId: ID!, $input: CreateAddressInput!) {
416
+ setDraftOrderBillingAddress(orderId: $orderId, input: $input) {
417
+ id
418
+ }
419
+ }
420
+ `);
421
+
422
+ export const unsetShippingAddressForDraftOrderDocument = graphql(`
423
+ mutation UnsetDraftOrderShippingAddress($orderId: ID!) {
424
+ unsetDraftOrderShippingAddress(orderId: $orderId) {
425
+ id
426
+ }
427
+ }
428
+ `);
429
+
430
+ export const unsetBillingAddressForDraftOrderDocument = graphql(`
431
+ mutation UnsetDraftOrderBillingAddress($orderId: ID!) {
432
+ unsetDraftOrderBillingAddress(orderId: $orderId) {
433
+ id
434
+ }
435
+ }
436
+ `);
437
+
438
+ export const applyCouponCodeToDraftOrderDocument = graphql(
439
+ `
440
+ mutation ApplyCouponCodeToDraftOrder($orderId: ID!, $couponCode: String!) {
441
+ applyCouponCodeToDraftOrder(orderId: $orderId, couponCode: $couponCode) {
442
+ __typename
443
+ ... on Order {
444
+ id
445
+ }
446
+ ...ErrorResult
447
+ }
448
+ }
449
+ `,
450
+ [errorResultFragment],
451
+ );
452
+
453
+ export const removeCouponCodeFromDraftOrderDocument = graphql(`
454
+ mutation RemoveCouponCodeFromDraftOrder($orderId: ID!, $couponCode: String!) {
455
+ removeCouponCodeFromDraftOrder(orderId: $orderId, couponCode: $couponCode) {
456
+ id
457
+ }
458
+ }
459
+ `);
460
+
461
+ export const draftOrderEligibleShippingMethodsDocument = graphql(`
462
+ query DraftOrderEligibleShippingMethods($orderId: ID!) {
463
+ eligibleShippingMethodsForDraftOrder(orderId: $orderId) {
464
+ id
465
+ name
466
+ code
467
+ description
468
+ price
469
+ priceWithTax
470
+ metadata
471
+ }
472
+ }
473
+ `);
474
+
475
+ export const setDraftOrderShippingMethodDocument = graphql(
476
+ `
477
+ mutation SetDraftOrderShippingMethod($orderId: ID!, $shippingMethodId: ID!) {
478
+ setDraftOrderShippingMethod(orderId: $orderId, shippingMethodId: $shippingMethodId) {
479
+ __typename
480
+ ... on Order {
481
+ id
482
+ }
483
+ ...ErrorResult
484
+ }
485
+ }
486
+ `,
487
+ [errorResultFragment],
488
+ );
489
+
490
+ export const setDraftOrderCustomFieldsDocument = graphql(`
491
+ mutation SetDraftOrderCustomFields($orderId: ID!, $input: UpdateOrderInput!) {
492
+ setDraftOrderCustomFields(orderId: $orderId, input: $input) {
493
+ id
494
+ }
495
+ }
496
+ `);
497
+
498
+ export const transitionOrderToStateDocument = graphql(
499
+ `
500
+ mutation TransitionOrderToState($id: ID!, $state: String!) {
501
+ transitionOrderToState(id: $id, state: $state) {
502
+ __typename
503
+ ... on Order {
504
+ id
505
+ }
506
+ ...ErrorResult
507
+ }
508
+ }
509
+ `,
510
+ [errorResultFragment],
511
+ );
@@ -4,9 +4,14 @@ import { Badge } from '@/components/ui/badge.js';
4
4
  import { Button } from '@/components/ui/button.js';
5
5
  import { ListPage } from '@/framework/page/list-page.js';
6
6
  import { Trans } from '@/lib/trans.js';
7
- import { createFileRoute, Link } from '@tanstack/react-router';
8
- import { orderListDocument } from './orders.graphql.js';
7
+ import { createFileRoute, Link, useNavigate } from '@tanstack/react-router';
8
+ import { createDraftOrderDocument, orderListDocument } from './orders.graphql.js';
9
9
  import { useServerConfig } from '@/hooks/use-server-config.js';
10
+ import { PageActionBarRight } from '@/framework/layout-engine/page-layout.js';
11
+ import { PlusIcon } from 'lucide-react';
12
+ import { useMutation } from '@tanstack/react-query';
13
+ import { api } from '@/graphql/api.js';
14
+ import { ResultOf } from '@/graphql/graphql.js';
10
15
 
11
16
  export const Route = createFileRoute('/_authenticated/_orders/orders')({
12
17
  component: OrderListPage,
@@ -15,30 +20,39 @@ export const Route = createFileRoute('/_authenticated/_orders/orders')({
15
20
 
16
21
  function OrderListPage() {
17
22
  const serverConfig = useServerConfig();
23
+ const navigate = useNavigate();
24
+ const { mutate: createDraftOrder } = useMutation({
25
+ mutationFn: api.mutate(createDraftOrderDocument),
26
+ onSuccess: (result: ResultOf<typeof createDraftOrderDocument>) => {
27
+ navigate({ to: '/orders/draft/$id', params: { id: result.createDraftOrder.id } });
28
+ }
29
+ })
18
30
  return (
19
31
  <ListPage
20
32
  pageId="order-list"
21
33
  title="Orders"
22
34
  onSearchTermChange={searchTerm => {
23
35
  return {
24
- code: {
25
- contains: searchTerm,
26
- },
27
- customerLastName: {
28
- contains: searchTerm,
29
- },
30
- transactionId: {
31
- contains: searchTerm,
32
- },
36
+ _or: [
37
+ {
38
+ code: {
39
+ contains: searchTerm,
40
+ },
41
+ },
42
+ {
43
+ customerLastName: {
44
+ contains: searchTerm,
45
+ },
46
+ },
47
+ {
48
+ transactionId: {
49
+ contains: searchTerm,
50
+ },
51
+ },
52
+ ],
33
53
  };
34
54
  }}
35
55
  defaultSort={[{ id: 'orderPlacedAt', desc: true }]}
36
- transformVariables={variables => {
37
- return {
38
- ...variables,
39
- filterOperator: 'OR',
40
- };
41
- }}
42
56
  listQuery={orderListDocument}
43
57
  route={Route}
44
58
  customizeColumns={{
@@ -115,6 +129,13 @@ function OrderListPage() {
115
129
  }) ?? [],
116
130
  },
117
131
  }}
118
- />
132
+ >
133
+ <PageActionBarRight>
134
+ <Button onClick={() => createDraftOrder({})}>
135
+ <PlusIcon className="mr-2 h-4 w-4" />
136
+ <Trans>Draft order</Trans>
137
+ </Button>
138
+ </PageActionBarRight>
139
+ </ListPage>
119
140
  );
120
141
  }
@@ -2,6 +2,7 @@ import { ErrorPage } from '@/components/shared/error-page.js';
2
2
  import { PermissionGuard } from '@/components/shared/permission-guard.js';
3
3
  import { Badge } from '@/components/ui/badge.js';
4
4
  import { Button } from '@/components/ui/button.js';
5
+ import { addCustomFields } from '@/framework/document-introspection/add-custom-fields.js';
5
6
  import {
6
7
  CustomFieldsPageBlock,
7
8
  Page,
@@ -11,10 +12,10 @@ import {
11
12
  PageLayout,
12
13
  PageTitle,
13
14
  } from '@/framework/layout-engine/page-layout.js';
14
- import { detailPageRouteLoader } from '@/framework/page/detail-page-route-loader.js';
15
- import { useDetailPage } from '@/framework/page/use-detail-page.js';
15
+ import { getDetailQueryOptions, useDetailPage } from '@/framework/page/use-detail-page.js';
16
+ import { ResultOf } from '@/graphql/graphql.js';
16
17
  import { Trans, useLingui } from '@/lib/trans.js';
17
- import { Link, createFileRoute } from '@tanstack/react-router';
18
+ import { Link, createFileRoute, redirect } from '@tanstack/react-router';
18
19
  import { User } from 'lucide-react';
19
20
  import { toast } from 'sonner';
20
21
  import { OrderAddress } from './components/order-address.js';
@@ -26,12 +27,33 @@ import { orderDetailDocument } from './orders.graphql.js';
26
27
 
27
28
  export const Route = createFileRoute('/_authenticated/_orders/orders_/$id')({
28
29
  component: OrderDetailPage,
29
- loader: detailPageRouteLoader({
30
- queryDocument: orderDetailDocument,
31
- breadcrumb(_isNew, entity) {
32
- return [{ path: '/orders', label: 'Orders' }, entity?.code];
33
- },
34
- }),
30
+ loader: async ({
31
+ context,
32
+ params,
33
+ }) => {
34
+ if (!params.id) {
35
+ throw new Error('ID param is required');
36
+ }
37
+
38
+ const result: ResultOf<typeof orderDetailDocument> = await context.queryClient.ensureQueryData(
39
+ getDetailQueryOptions(addCustomFields(orderDetailDocument), { id: params.id }),
40
+ { id: params.id },
41
+ );
42
+
43
+ if (!result.order) {
44
+ throw new Error(`Order with the ID ${params.id} was not found`);
45
+ }
46
+
47
+ if (result.order.state === 'Draft') {
48
+ throw redirect({
49
+ to: `/orders/draft/${params.id}`,
50
+ });
51
+ }
52
+
53
+ return {
54
+ breadcrumb: [{ path: '/orders', label: 'Orders' }, result.order.code],
55
+ };
56
+ },
35
57
  errorComponent: ({ error }) => <ErrorPage message={error.message} />,
36
58
  });
37
59