@voyant-travel/operations-react 0.19.1 → 0.19.2

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 (66) hide show
  1. package/dist/availability/components/availability-rule-detail-page.d.ts +5 -5
  2. package/dist/availability/components/availability-slot-detail-page.d.ts +5 -5
  3. package/dist/availability/components/availability-start-time-detail-page.d.ts +5 -5
  4. package/dist/availability/hooks/use-availability-batch-mutations.d.ts +2 -2
  5. package/dist/availability/hooks/use-availability-overview.d.ts +1 -1
  6. package/dist/availability/hooks/use-availability-slot-mutation.d.ts +3 -3
  7. package/dist/availability/hooks/use-slots.d.ts +1 -1
  8. package/dist/availability/query-options.d.ts +12 -12
  9. package/dist/availability/schemas.d.ts +6 -6
  10. package/dist/places/hooks/use-facilities.d.ts +1 -1
  11. package/dist/places/hooks/use-facility-feature-mutation.d.ts +2 -2
  12. package/dist/places/hooks/use-facility-features.d.ts +1 -1
  13. package/dist/places/hooks/use-facility-mutation.d.ts +4 -4
  14. package/dist/places/hooks/use-facility.d.ts +1 -1
  15. package/dist/places/hooks/use-property-group-mutation.d.ts +6 -6
  16. package/dist/places/hooks/use-property-group.d.ts +2 -2
  17. package/dist/places/hooks/use-property-groups.d.ts +2 -2
  18. package/dist/places/query-options.d.ts +32 -32
  19. package/dist/resources/admin/detail-hosts.d.ts.map +1 -1
  20. package/dist/resources/admin/detail-hosts.js +97 -22
  21. package/dist/resources/admin/resources-dialogs-ops.d.ts +3 -2
  22. package/dist/resources/admin/resources-dialogs-ops.d.ts.map +1 -1
  23. package/dist/resources/admin/resources-dialogs-ops.js +10 -2
  24. package/dist/resources/admin/resources-dialogs.d.ts.map +1 -1
  25. package/dist/resources/admin/resources-dialogs.js +1 -1
  26. package/dist/resources/components/resource-allocation-detail-page.d.ts +2 -1
  27. package/dist/resources/components/resource-allocation-detail-page.d.ts.map +1 -1
  28. package/dist/resources/components/resource-allocation-detail-page.js +2 -2
  29. package/dist/resources/components/resource-assignment-detail-page.d.ts +2 -1
  30. package/dist/resources/components/resource-assignment-detail-page.d.ts.map +1 -1
  31. package/dist/resources/components/resource-assignment-detail-page.js +3 -2
  32. package/dist/resources/components/resource-detail-page.d.ts +2 -1
  33. package/dist/resources/components/resource-detail-page.d.ts.map +1 -1
  34. package/dist/resources/components/resource-detail-page.js +6 -3
  35. package/dist/resources/components/resource-detail-shared.d.ts +2 -1
  36. package/dist/resources/components/resource-detail-shared.d.ts.map +1 -1
  37. package/dist/resources/components/resource-detail-shared.js +3 -3
  38. package/dist/resources/components/resource-pool-detail-page.d.ts +5 -1
  39. package/dist/resources/components/resource-pool-detail-page.d.ts.map +1 -1
  40. package/dist/resources/components/resource-pool-detail-page.js +38 -8
  41. package/dist/resources/components/resources-overview.d.ts +3 -2
  42. package/dist/resources/components/resources-overview.d.ts.map +1 -1
  43. package/dist/resources/components/resources-overview.js +2 -1
  44. package/dist/resources/components/resources-page.d.ts.map +1 -1
  45. package/dist/resources/components/resources-page.js +45 -9
  46. package/dist/resources/components/resources-tabs-primary.d.ts.map +1 -1
  47. package/dist/resources/components/resources-tabs-primary.js +28 -19
  48. package/dist/resources/components/resources-tabs-secondary.d.ts +2 -1
  49. package/dist/resources/components/resources-tabs-secondary.d.ts.map +1 -1
  50. package/dist/resources/components/resources-tabs-secondary.js +22 -9
  51. package/dist/resources/hooks/use-pool.d.ts +1 -1
  52. package/dist/resources/hooks/use-pools.d.ts +1 -1
  53. package/dist/resources/hooks/use-resource.d.ts +1 -1
  54. package/dist/resources/hooks/use-resources.d.ts +1 -1
  55. package/dist/resources/i18n/en.d.ts.map +1 -1
  56. package/dist/resources/i18n/en.js +7 -0
  57. package/dist/resources/i18n/messages.d.ts +7 -0
  58. package/dist/resources/i18n/messages.d.ts.map +1 -1
  59. package/dist/resources/i18n/ro.d.ts.map +1 -1
  60. package/dist/resources/i18n/ro.js +7 -0
  61. package/dist/resources/i18n/utils.d.ts +2 -1
  62. package/dist/resources/i18n/utils.d.ts.map +1 -1
  63. package/dist/resources/i18n/utils.js +3 -1
  64. package/dist/resources/query-options.d.ts +16 -16
  65. package/dist/resources/schemas.d.ts +9 -9
  66. package/package.json +7 -7
@@ -4,7 +4,7 @@ import { Badge, Button, Card, CardContent, CardHeader, CardTitle, cn, } from "@v
4
4
  import { Package, Users, Wrench } from "lucide-react";
5
5
  import { useResourcesUiI18nOrDefault } from "../i18n/index.js";
6
6
  import { formatDateTimeOrFallback, formatResourceSlotLabel } from "../i18n/utils.js";
7
- import { labelById, useAssignments, useBookings, useCloseouts, usePools, useResource, useSlots, useSuppliers, } from "../index.js";
7
+ import { labelById, useAssignments, useBookings, useCloseouts, usePools, useProducts, useResource, useSlots, useSuppliers, } from "../index.js";
8
8
  import { useResourcePoolMembers } from "./resource-detail-data.js";
9
9
  import { ResourceDetailCard, ResourceDetailField, ResourceDetailHeader, ResourceDetailState, } from "./resource-detail-shared.js";
10
10
  import { ResourceDetailSkeleton } from "./resource-detail-skeletons.js";
@@ -13,7 +13,7 @@ import { ResourceDetailSkeleton } from "./resource-detail-skeletons.js";
13
13
  // `pendingComponent` without pinning this page module into the workspace
14
14
  // chrome chunk. Re-exported here for backwards compatibility.
15
15
  export { ResourceDetailSkeleton };
16
- export function ResourceDetailPage({ className, confirmAction, deleting, id, onBack, onDelete, onOpenAssignment, onOpenSupplier, }) {
16
+ export function ResourceDetailPage({ className, confirmAction, deleting, id, onBack, onDelete, onEdit, onOpenAssignment, onOpenSupplier, }) {
17
17
  const i18n = useResourcesUiI18nOrDefault();
18
18
  const m = i18n.messages;
19
19
  const page = m.detailPages;
@@ -24,6 +24,7 @@ export function ResourceDetailPage({ className, confirmAction, deleting, id, onB
24
24
  const assignmentsQuery = useAssignmentsByResource(id);
25
25
  const slotsQuery = useSlots({ limit: 25 });
26
26
  const bookingsQuery = useBookings({ limit: 25 });
27
+ const productsQuery = useProducts({ limit: 25 });
27
28
  const closeoutsQuery = useCloseouts({ resourceId: id, limit: 25 });
28
29
  if (resourceQuery.isPending) {
29
30
  return _jsx(ResourceDetailSkeleton, {});
@@ -38,19 +39,21 @@ export function ResourceDetailPage({ className, confirmAction, deleting, id, onB
38
39
  const pools = poolsQuery.data?.data ?? [];
39
40
  const slots = slotsQuery.data?.data ?? [];
40
41
  const bookings = bookingsQuery.data?.data ?? [];
42
+ const products = productsQuery.data?.data ?? [];
41
43
  const poolsById = new Map(pools.map((pool) => [pool.id, pool]));
42
44
  const slotsById = new Map(slots.map((slot) => [slot.id, slot]));
43
45
  const bookingsById = new Map(bookings.map((booking) => [booking.id, booking]));
44
46
  const supplierLabel = resource.supplierId
45
47
  ? labelById(suppliersQuery.data?.data ?? [], resource.supplierId)
46
48
  : page.resource.noSupplierAssigned;
47
- return (_jsxs("div", { "data-slot": "resource-detail-page", className: cn("flex flex-col gap-6 p-6", className), children: [_jsx(ResourceDetailHeader, { title: resource.name, deleteConfirmName: resource.name, deleteConfirmTemplate: page.resource.deleteConfirm, deleteErrorMessage: page.resource.deleteFailed, deleting: deleting, confirmAction: confirmAction, onBack: onBack, onDelete: onDelete ? () => onDelete(resource) : undefined, badges: _jsxs(_Fragment, { children: [_jsx(Badge, { variant: "outline", children: m.common.resourceKindLabels[resource.kind] }), _jsx(Badge, { variant: resource.active ? "default" : "secondary", children: resource.active ? m.common.active : m.common.inactive })] }), actions: resource.supplierId && onOpenSupplier ? (_jsxs(Button, { type: "button", variant: "outline", onClick: () => onOpenSupplier(resource.supplierId), children: [_jsx(Users, { "data-icon": "inline-start", "aria-hidden": "true" }), page.common.openSupplier] })) : null }), _jsxs("div", { className: "grid gap-6 md:grid-cols-2", children: [_jsxs(ResourceDetailCard, { title: page.resource.detailsTitle, children: [_jsx(ResourceDetailField, { label: page.common.supplier, children: supplierLabel }), _jsx(ResourceDetailField, { label: page.common.code, children: resource.code ?? page.common.noValue }), _jsx(ResourceDetailField, { label: page.common.capacity, children: resource.capacity ?? page.common.noValue }), _jsx(ResourceDetailField, { label: page.common.created, children: i18n.formatDateTime(resource.createdAt) }), _jsx(ResourceDetailField, { label: page.common.updated, children: i18n.formatDateTime(resource.updatedAt) })] }), resource.notes ? (_jsx(ResourceDetailCard, { title: page.common.notes, children: _jsx("p", { className: "whitespace-pre-wrap", children: resource.notes }) })) : null] }), _jsxs(Card, { children: [_jsxs(CardHeader, { className: "flex flex-row items-center gap-2", children: [_jsx(Package, { className: "size-4", "aria-hidden": "true" }), _jsx(CardTitle, { children: page.resource.poolMembershipsTitle })] }), _jsx(CardContent, { className: "flex flex-col gap-3 text-sm", children: (poolMembersQuery.data?.data.length ?? 0) === 0 ? (_jsx("p", { className: "text-muted-foreground", children: page.resource.poolMembershipsEmpty })) : (poolMembersQuery.data?.data.map((member) => {
49
+ return (_jsxs("div", { "data-slot": "resource-detail-page", className: cn("flex flex-col gap-6 p-6", className), children: [_jsx(ResourceDetailHeader, { title: resource.name, deleteConfirmName: resource.name, deleteConfirmTemplate: page.resource.deleteConfirm, deleteErrorMessage: page.resource.deleteFailed, deleting: deleting, confirmAction: confirmAction, onBack: onBack, onDelete: onDelete ? () => onDelete(resource) : undefined, onEdit: onEdit ? () => onEdit(resource) : undefined, badges: _jsxs(_Fragment, { children: [_jsx(Badge, { variant: "outline", children: m.common.resourceKindLabels[resource.kind] }), _jsx(Badge, { variant: resource.active ? "default" : "secondary", children: resource.active ? m.common.active : m.common.inactive })] }), actions: resource.supplierId && onOpenSupplier ? (_jsxs(Button, { type: "button", variant: "outline", onClick: () => onOpenSupplier(resource.supplierId), children: [_jsx(Users, { "data-icon": "inline-start", "aria-hidden": "true" }), page.common.openSupplier] })) : null }), _jsxs("div", { className: "grid gap-6 md:grid-cols-2", children: [_jsxs(ResourceDetailCard, { title: page.resource.detailsTitle, children: [_jsx(ResourceDetailField, { label: page.common.supplier, children: supplierLabel }), _jsx(ResourceDetailField, { label: page.common.code, children: resource.code ?? page.common.noValue }), _jsx(ResourceDetailField, { label: page.common.capacity, children: resource.capacity ?? page.common.noValue }), _jsx(ResourceDetailField, { label: page.common.created, children: i18n.formatDateTime(resource.createdAt) }), _jsx(ResourceDetailField, { label: page.common.updated, children: i18n.formatDateTime(resource.updatedAt) })] }), resource.notes ? (_jsx(ResourceDetailCard, { title: page.common.notes, children: _jsx("p", { className: "whitespace-pre-wrap", children: resource.notes }) })) : null] }), _jsxs(Card, { children: [_jsxs(CardHeader, { className: "flex flex-row items-center gap-2", children: [_jsx(Package, { className: "size-4", "aria-hidden": "true" }), _jsx(CardTitle, { children: page.resource.poolMembershipsTitle })] }), _jsx(CardContent, { className: "flex flex-col gap-3 text-sm", children: (poolMembersQuery.data?.data.length ?? 0) === 0 ? (_jsx("p", { className: "text-muted-foreground", children: page.resource.poolMembershipsEmpty })) : (poolMembersQuery.data?.data.map((member) => {
48
50
  const pool = poolsById.get(member.poolId);
49
51
  return (_jsxs("div", { className: "rounded-md border p-3", children: [_jsx("div", { className: "font-medium", children: pool?.name ?? member.poolId }), _jsxs("div", { className: "text-muted-foreground", children: [page.common.product, ": ", pool?.productId ?? page.common.noValue] })] }, member.id));
50
52
  })) })] }), _jsxs(Card, { children: [_jsxs(CardHeader, { className: "flex flex-row items-center gap-2", children: [_jsx(Wrench, { className: "size-4", "aria-hidden": "true" }), _jsx(CardTitle, { children: page.resource.assignmentsTitle })] }), _jsx(CardContent, { className: "flex flex-col gap-3 text-sm", children: (assignmentsQuery.data?.data.length ?? 0) === 0 ? (_jsx("p", { className: "text-muted-foreground", children: page.resource.assignmentsEmpty })) : (assignmentsQuery.data?.data.map((assignment) => (_jsx(ResourceAssignmentSummary, { assignment: assignment, pool: undefined, slotLabel: slotsById.get(assignment.slotId)
51
53
  ? formatResourceSlotLabel(slotsById.get(assignment.slotId), {
52
54
  template: m.common.slotLabel,
53
55
  formatDate: i18n.formatDate,
56
+ products,
54
57
  })
55
58
  : assignment.slotId, bookingLabel: bookingsById.get(assignment.bookingId ?? "")?.bookingNumber ??
56
59
  assignment.bookingId ??
@@ -15,7 +15,7 @@ export declare function ResourceDetailCard({ children, className, title, }: {
15
15
  className?: string;
16
16
  title: string;
17
17
  }): import("react").JSX.Element;
18
- export declare function ResourceDetailHeader({ actions, badges, className, confirmAction, deleteConfirmName, deleteConfirmTemplate, deleteErrorMessage, deleting: deletingProp, onBack, onDelete, title, }: {
18
+ export declare function ResourceDetailHeader({ actions, badges, className, confirmAction, deleteConfirmName, deleteConfirmTemplate, deleteErrorMessage, deleting: deletingProp, onBack, onDelete, onEdit, title, }: {
19
19
  actions?: ReactNode;
20
20
  badges?: ReactNode;
21
21
  className?: string;
@@ -26,6 +26,7 @@ export declare function ResourceDetailHeader({ actions, badges, className, confi
26
26
  deleting?: boolean;
27
27
  onBack?: () => void;
28
28
  onDelete?: () => Promise<void> | void;
29
+ onEdit?: () => void;
29
30
  title: string;
30
31
  }): import("react").JSX.Element;
31
32
  export declare function ResourceDetailSkeleton({ actionCount, detailRows, showNotes, stackedCards, }: {
@@ -1 +1 @@
1
- {"version":3,"file":"resource-detail-shared.d.ts","sourceRoot":"","sources":["../../../src/resources/components/resource-detail-shared.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAKtC,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAA;AAExD,eAAO,MAAM,oBAAoB,EAAE,aACI,CAAA;AAEvC,wBAAgB,mBAAmB,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,SAAS,CAAA;CAAE,+BAO9F;AAED,wBAAgB,mBAAmB,CAAC,EAClC,SAAS,EACT,OAAO,EACP,MAAM,GACP,EAAE;IACD,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE,MAAM,IAAI,CAAA;CACpB,+BAaA;AAED,wBAAgB,kBAAkB,CAAC,EACjC,QAAQ,EACR,SAAS,EACT,KAAK,GACN,EAAE;IACD,QAAQ,EAAE,SAAS,CAAA;IACnB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,KAAK,EAAE,MAAM,CAAA;CACd,+BASA;AAED,wBAAgB,oBAAoB,CAAC,EACnC,OAAO,EACP,MAAM,EACN,SAAS,EACT,aAAoC,EACpC,iBAAiB,EACjB,qBAAqB,EACrB,kBAAkB,EAClB,QAAQ,EAAE,YAAY,EACtB,MAAM,EACN,QAAQ,EACR,KAAK,GACN,EAAE;IACD,OAAO,CAAC,EAAE,SAAS,CAAA;IACnB,MAAM,CAAC,EAAE,SAAS,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,aAAa,CAAC,EAAE,aAAa,CAAA;IAC7B,iBAAiB,EAAE,MAAM,CAAA;IACzB,qBAAqB,EAAE,MAAM,CAAA;IAC7B,kBAAkB,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,MAAM,CAAC,EAAE,MAAM,IAAI,CAAA;IACnB,QAAQ,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;IACrC,KAAK,EAAE,MAAM,CAAA;CACd,+BA6DA;AAED,wBAAgB,sBAAsB,CAAC,EACrC,WAAW,EACX,UAAU,EACV,SAAgB,EAChB,YAAgB,GACjB,EAAE;IACD,WAAW,EAAE,MAAM,CAAA;IACnB,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB,+BA8EA"}
1
+ {"version":3,"file":"resource-detail-shared.d.ts","sourceRoot":"","sources":["../../../src/resources/components/resource-detail-shared.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAKtC,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAA;AAExD,eAAO,MAAM,oBAAoB,EAAE,aACI,CAAA;AAEvC,wBAAgB,mBAAmB,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,SAAS,CAAA;CAAE,+BAO9F;AAED,wBAAgB,mBAAmB,CAAC,EAClC,SAAS,EACT,OAAO,EACP,MAAM,GACP,EAAE;IACD,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE,MAAM,IAAI,CAAA;CACpB,+BAaA;AAED,wBAAgB,kBAAkB,CAAC,EACjC,QAAQ,EACR,SAAS,EACT,KAAK,GACN,EAAE;IACD,QAAQ,EAAE,SAAS,CAAA;IACnB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,KAAK,EAAE,MAAM,CAAA;CACd,+BASA;AAED,wBAAgB,oBAAoB,CAAC,EACnC,OAAO,EACP,MAAM,EACN,SAAS,EACT,aAAoC,EACpC,iBAAiB,EACjB,qBAAqB,EACrB,kBAAkB,EAClB,QAAQ,EAAE,YAAY,EACtB,MAAM,EACN,QAAQ,EACR,MAAM,EACN,KAAK,GACN,EAAE;IACD,OAAO,CAAC,EAAE,SAAS,CAAA;IACnB,MAAM,CAAC,EAAE,SAAS,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,aAAa,CAAC,EAAE,aAAa,CAAA;IAC7B,iBAAiB,EAAE,MAAM,CAAA;IACzB,qBAAqB,EAAE,MAAM,CAAA;IAC7B,kBAAkB,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,MAAM,CAAC,EAAE,MAAM,IAAI,CAAA;IACnB,QAAQ,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;IACrC,MAAM,CAAC,EAAE,MAAM,IAAI,CAAA;IACnB,KAAK,EAAE,MAAM,CAAA;CACd,+BAmEA;AAED,wBAAgB,sBAAsB,CAAC,EACrC,WAAW,EACX,UAAU,EACV,SAAgB,EAChB,YAAgB,GACjB,EAAE;IACD,WAAW,EAAE,MAAM,CAAA;IACnB,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB,+BA8EA"}
@@ -3,7 +3,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import { formatMessage } from "@voyant-travel/i18n";
4
4
  import { Button, Card, CardContent, CardHeader, CardTitle, cn } from "@voyant-travel/ui/components";
5
5
  import { Skeleton } from "@voyant-travel/ui/components/skeleton";
6
- import { ArrowLeft, Loader2, Trash2 } from "lucide-react";
6
+ import { ArrowLeft, Loader2, Pencil, Trash2 } from "lucide-react";
7
7
  import { useState } from "react";
8
8
  import { useResourcesUiMessagesOrDefault } from "../i18n/index.js";
9
9
  export const defaultConfirmAction = (message) => globalThis.confirm?.(message) ?? true;
@@ -17,7 +17,7 @@ export function ResourceDetailState({ className, message, onBack, }) {
17
17
  export function ResourceDetailCard({ children, className, title, }) {
18
18
  return (_jsxs(Card, { className: className, children: [_jsx(CardHeader, { children: _jsx(CardTitle, { children: title }) }), _jsx(CardContent, { className: "flex flex-col gap-3 text-sm", children: children })] }));
19
19
  }
20
- export function ResourceDetailHeader({ actions, badges, className, confirmAction = defaultConfirmAction, deleteConfirmName, deleteConfirmTemplate, deleteErrorMessage, deleting: deletingProp, onBack, onDelete, title, }) {
20
+ export function ResourceDetailHeader({ actions, badges, className, confirmAction = defaultConfirmAction, deleteConfirmName, deleteConfirmTemplate, deleteErrorMessage, deleting: deletingProp, onBack, onDelete, onEdit, title, }) {
21
21
  const messages = useResourcesUiMessagesOrDefault();
22
22
  const [deletingState, setDeletingState] = useState(false);
23
23
  const [deleteError, setDeleteError] = useState(null);
@@ -40,7 +40,7 @@ export function ResourceDetailHeader({ actions, badges, className, confirmAction
40
40
  setDeletingState(false);
41
41
  }
42
42
  }
43
- return (_jsxs("div", { className: cn("flex flex-col gap-3", className), children: [_jsxs("div", { className: "flex flex-col gap-4 md:flex-row md:items-start md:justify-between", children: [_jsxs("div", { className: "flex min-w-0 items-start gap-3", children: [onBack ? (_jsxs(Button, { type: "button", variant: "ghost", size: "icon", onClick: onBack, children: [_jsx(ArrowLeft, { "aria-hidden": "true" }), _jsx("span", { className: "sr-only", children: messages.detailPages.common.backToResources })] })) : null, _jsxs("div", { className: "min-w-0 flex-1", children: [_jsx("h1", { className: "truncate text-2xl font-bold tracking-tight", children: title }), badges ? _jsx("div", { className: "mt-1 flex flex-wrap items-center gap-2", children: badges }) : null] })] }), _jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [actions, onDelete ? (_jsxs(Button, { type: "button", variant: "destructive", onClick: () => void handleDelete(), disabled: deleting, children: [deleting ? (_jsx(Loader2, { "data-icon": "inline-start", className: "animate-spin", "aria-hidden": "true" })) : (_jsx(Trash2, { "data-icon": "inline-start", "aria-hidden": "true" })), messages.detailPages.common.delete] })) : null] })] }), deleteError ? _jsx("p", { className: "text-sm text-destructive", children: deleteError }) : null] }));
43
+ return (_jsxs("div", { className: cn("flex flex-col gap-3", className), children: [_jsxs("div", { className: "flex flex-col gap-4 md:flex-row md:items-start md:justify-between", children: [_jsxs("div", { className: "flex min-w-0 items-start gap-3", children: [onBack ? (_jsxs(Button, { type: "button", variant: "ghost", size: "icon", onClick: onBack, children: [_jsx(ArrowLeft, { "aria-hidden": "true" }), _jsx("span", { className: "sr-only", children: messages.detailPages.common.backToResources })] })) : null, _jsxs("div", { className: "min-w-0 flex-1", children: [_jsx("h1", { className: "truncate text-2xl font-bold tracking-tight", children: title }), badges ? _jsx("div", { className: "mt-1 flex flex-wrap items-center gap-2", children: badges }) : null] })] }), _jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [actions, onEdit ? (_jsxs(Button, { type: "button", variant: "outline", onClick: onEdit, children: [_jsx(Pencil, { "data-icon": "inline-start", "aria-hidden": "true" }), messages.detailPages.common.edit] })) : null, onDelete ? (_jsxs(Button, { type: "button", variant: "destructive", onClick: () => void handleDelete(), disabled: deleting, children: [deleting ? (_jsx(Loader2, { "data-icon": "inline-start", className: "animate-spin", "aria-hidden": "true" })) : (_jsx(Trash2, { "data-icon": "inline-start", "aria-hidden": "true" })), messages.detailPages.common.delete] })) : null] })] }), deleteError ? _jsx("p", { className: "text-sm text-destructive", children: deleteError }) : null] }));
44
44
  }
45
45
  export function ResourceDetailSkeleton({ actionCount, detailRows, showNotes = true, stackedCards = 2, }) {
46
46
  return (_jsxs("div", { className: "flex flex-col gap-6 p-6", children: [_jsxs("div", { className: "flex items-center gap-4", children: [_jsx(Skeleton, { className: "size-9 rounded-md" }), _jsxs("div", { className: "flex flex-1 flex-col gap-2", children: [_jsx(Skeleton, { className: "h-7 w-56" }), _jsxs("div", { className: "flex gap-2", children: [_jsx(Skeleton, { className: "h-5 w-16 rounded-full" }), _jsx(Skeleton, { className: "h-5 w-20 rounded-full" })] })] }), Array.from({ length: actionCount }).map((_, index) => (_jsx(Skeleton
@@ -1,4 +1,5 @@
1
1
  import { type ResourceAllocationRow, type ResourcePoolDetail } from "../index.js";
2
+ import type { ResourcePoolMemberRow } from "./resource-detail-data.js";
2
3
  import { type ConfirmAction } from "./resource-detail-shared.js";
3
4
  import { ResourcePoolDetailSkeleton } from "./resource-detail-skeletons.js";
4
5
  export { ResourcePoolDetailSkeleton };
@@ -8,13 +9,16 @@ export interface ResourcePoolDetailPageProps {
8
9
  deleting?: boolean;
9
10
  onBack?: () => void;
10
11
  onDelete?: (pool: ResourcePoolDetail) => Promise<void> | void;
12
+ onEdit?: (pool: ResourcePoolDetail) => void;
13
+ onAddMember?: (pool: ResourcePoolDetail, resourceId: string) => Promise<void> | void;
14
+ onRemoveMember?: (member: ResourcePoolMemberRow) => Promise<void> | void;
11
15
  onOpenAllocation?: (allocationId: string) => void;
12
16
  onOpenProduct?: (productId: string) => void;
13
17
  onOpenResource?: (resourceId: string) => void;
14
18
  onOpenAssignment?: (assignmentId: string) => void;
15
19
  confirmAction?: ConfirmAction;
16
20
  }
17
- export declare function ResourcePoolDetailPage({ className, confirmAction, deleting, id, onBack, onDelete, onOpenAllocation, onOpenAssignment, onOpenProduct, onOpenResource, }: ResourcePoolDetailPageProps): import("react").JSX.Element;
21
+ export declare function ResourcePoolDetailPage({ className, confirmAction, deleting, id, onBack, onDelete, onEdit, onAddMember, onOpenAllocation, onOpenAssignment, onOpenProduct, onOpenResource, onRemoveMember, }: ResourcePoolDetailPageProps): import("react").JSX.Element;
18
22
  export declare function PoolAllocationSummary({ allocation, onOpenAllocation, }: {
19
23
  allocation: ResourceAllocationRow;
20
24
  onOpenAllocation?: (allocationId: string) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"resource-pool-detail-page.d.ts","sourceRoot":"","sources":["../../../src/resources/components/resource-pool-detail-page.tsx"],"names":[],"mappings":"AAcA,OAAO,EAEL,KAAK,qBAAqB,EAC1B,KAAK,kBAAkB,EAQxB,MAAM,aAAa,CAAA;AAGpB,OAAO,EACL,KAAK,aAAa,EAKnB,MAAM,6BAA6B,CAAA;AACpC,OAAO,EAAE,0BAA0B,EAAE,MAAM,gCAAgC,CAAA;AAM3E,OAAO,EAAE,0BAA0B,EAAE,CAAA;AAErC,MAAM,WAAW,2BAA2B;IAC1C,EAAE,EAAE,MAAM,CAAA;IACV,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,MAAM,CAAC,EAAE,MAAM,IAAI,CAAA;IACnB,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,kBAAkB,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;IAC7D,gBAAgB,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,IAAI,CAAA;IACjD,aAAa,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAA;IAC3C,cAAc,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAA;IAC7C,gBAAgB,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,IAAI,CAAA;IACjD,aAAa,CAAC,EAAE,aAAa,CAAA;CAC9B;AAED,wBAAgB,sBAAsB,CAAC,EACrC,SAAS,EACT,aAAa,EACb,QAAQ,EACR,EAAE,EACF,MAAM,EACN,QAAQ,EACR,gBAAgB,EAChB,gBAAgB,EAChB,aAAa,EACb,cAAc,GACf,EAAE,2BAA2B,+BA0L7B;AAED,wBAAgB,qBAAqB,CAAC,EACpC,UAAU,EACV,gBAAgB,GACjB,EAAE;IACD,UAAU,EAAE,qBAAqB,CAAA;IACjC,gBAAgB,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,IAAI,CAAA;CAClD,+BAsCA"}
1
+ {"version":3,"file":"resource-pool-detail-page.d.ts","sourceRoot":"","sources":["../../../src/resources/components/resource-pool-detail-page.tsx"],"names":[],"mappings":"AAoBA,OAAO,EAEL,KAAK,qBAAqB,EAC1B,KAAK,kBAAkB,EAQxB,MAAM,aAAa,CAAA;AACpB,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAA;AAGtE,OAAO,EACL,KAAK,aAAa,EAKnB,MAAM,6BAA6B,CAAA;AACpC,OAAO,EAAE,0BAA0B,EAAE,MAAM,gCAAgC,CAAA;AAM3E,OAAO,EAAE,0BAA0B,EAAE,CAAA;AAErC,MAAM,WAAW,2BAA2B;IAC1C,EAAE,EAAE,MAAM,CAAA;IACV,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,MAAM,CAAC,EAAE,MAAM,IAAI,CAAA;IACnB,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,kBAAkB,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;IAC7D,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,kBAAkB,KAAK,IAAI,CAAA;IAC3C,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;IACpF,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,qBAAqB,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;IACxE,gBAAgB,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,IAAI,CAAA;IACjD,aAAa,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAA;IAC3C,cAAc,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAA;IAC7C,gBAAgB,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,IAAI,CAAA;IACjD,aAAa,CAAC,EAAE,aAAa,CAAA;CAC9B;AAED,wBAAgB,sBAAsB,CAAC,EACrC,SAAS,EACT,aAAa,EACb,QAAQ,EACR,EAAE,EACF,MAAM,EACN,QAAQ,EACR,MAAM,EACN,WAAW,EACX,gBAAgB,EAChB,gBAAgB,EAChB,aAAa,EACb,cAAc,EACd,cAAc,GACf,EAAE,2BAA2B,+BAgR7B;AAED,wBAAgB,qBAAqB,CAAC,EACpC,UAAU,EACV,gBAAgB,GACjB,EAAE;IACD,UAAU,EAAE,qBAAqB,CAAA;IACjC,gBAAgB,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,IAAI,CAAA;CAClD,+BAsCA"}
@@ -1,7 +1,8 @@
1
1
  "use client";
2
2
  import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
3
- import { Badge, Button, Card, CardContent, CardHeader, CardTitle, cn, } from "@voyant-travel/ui/components";
4
- import { Package, Users, Wrench } from "lucide-react";
3
+ import { Badge, Button, Card, CardContent, CardHeader, CardTitle, cn, Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@voyant-travel/ui/components";
4
+ import { Loader2, Package, Plus, Trash2, Users, Wrench } from "lucide-react";
5
+ import { useState } from "react";
5
6
  import { useResourcesUiI18nOrDefault } from "../i18n/index.js";
6
7
  import { formatResourceSlotLabel } from "../i18n/utils.js";
7
8
  import { labelById, useAllocations, useAssignments, useBookings, usePool, useProducts, useResources, useSlots, } from "../index.js";
@@ -14,7 +15,7 @@ import { ResourcePoolDetailSkeleton } from "./resource-detail-skeletons.js";
14
15
  // `pendingComponent` without pinning this page module into the workspace
15
16
  // chrome chunk. Re-exported here for backwards compatibility.
16
17
  export { ResourcePoolDetailSkeleton };
17
- export function ResourcePoolDetailPage({ className, confirmAction, deleting, id, onBack, onDelete, onOpenAllocation, onOpenAssignment, onOpenProduct, onOpenResource, }) {
18
+ export function ResourcePoolDetailPage({ className, confirmAction, deleting, id, onBack, onDelete, onEdit, onAddMember, onOpenAllocation, onOpenAssignment, onOpenProduct, onOpenResource, onRemoveMember, }) {
18
19
  const i18n = useResourcesUiI18nOrDefault();
19
20
  const m = i18n.messages;
20
21
  const page = m.detailPages;
@@ -26,6 +27,8 @@ export function ResourcePoolDetailPage({ className, confirmAction, deleting, id,
26
27
  const assignmentsQuery = useAssignments({ poolId: id, limit: 25 });
27
28
  const slotsQuery = useSlots({ limit: 25 });
28
29
  const bookingsQuery = useBookings({ limit: 25 });
30
+ const [selectedResourceId, setSelectedResourceId] = useState("");
31
+ const [memberMutationId, setMemberMutationId] = useState(null);
29
32
  if (poolQuery.isPending) {
30
33
  return _jsx(ResourcePoolDetailSkeleton, {});
31
34
  }
@@ -43,16 +46,43 @@ export function ResourcePoolDetailPage({ className, confirmAction, deleting, id,
43
46
  const resourcesById = new Map(resources.map((resource) => [resource.id, resource]));
44
47
  const slotsById = new Map(slots.map((slot) => [slot.id, slot]));
45
48
  const bookingsById = new Map(bookings.map((booking) => [booking.id, booking]));
46
- return (_jsxs("div", { "data-slot": "resource-pool-detail-page", className: cn("flex flex-col gap-6 p-6", className), children: [_jsx(ResourceDetailHeader, { title: pool.name, deleteConfirmName: pool.name, deleteConfirmTemplate: page.pool.deleteConfirm, deleteErrorMessage: page.pool.deleteFailed, deleting: deleting, confirmAction: confirmAction, onBack: onBack, onDelete: onDelete ? () => onDelete(pool) : undefined, badges: _jsxs(_Fragment, { children: [_jsx(Badge, { variant: "outline", children: m.common.resourceKindLabels[pool.kind] }), _jsx(Badge, { variant: pool.active ? "default" : "secondary", children: pool.active ? m.common.active : m.common.inactive })] }), actions: pool.productId && onOpenProduct ? (_jsxs(Button, { type: "button", variant: "outline", onClick: () => onOpenProduct(pool.productId), children: [_jsx(Package, { "data-icon": "inline-start", "aria-hidden": "true" }), page.common.openProduct] })) : null }), _jsxs("div", { className: "grid gap-6 md:grid-cols-2", children: [_jsxs(ResourceDetailCard, { title: page.pool.detailsTitle, children: [_jsx(ResourceDetailField, { label: page.common.product, children: pool.productId ? labelById(products, pool.productId) : page.common.noValue }), _jsx(ResourceDetailField, { label: page.pool.sharedCapacity, children: pool.sharedCapacity ?? page.common.noValue }), _jsx(ResourceDetailField, { label: page.common.created, children: i18n.formatDateTime(pool.createdAt) }), _jsx(ResourceDetailField, { label: page.common.updated, children: i18n.formatDateTime(pool.updatedAt) })] }), pool.notes ? (_jsx(ResourceDetailCard, { title: page.common.notes, children: _jsx("p", { className: "whitespace-pre-wrap", children: pool.notes }) })) : null] }), _jsxs(Card, { children: [_jsxs(CardHeader, { className: "flex flex-row items-center gap-2", children: [_jsx(Users, { className: "size-4", "aria-hidden": "true" }), _jsx(CardTitle, { children: page.pool.membersTitle })] }), _jsx(CardContent, { className: "flex flex-col gap-3 text-sm", children: (membersQuery.data?.data.length ?? 0) === 0 ? (_jsx("p", { className: "text-muted-foreground", children: page.pool.membersEmpty })) : (membersQuery.data?.data.map((member) => {
47
- const resource = resourcesById.get(member.resourceId);
48
- const body = (_jsxs(_Fragment, { children: [_jsx("div", { className: "font-medium", children: resource?.name ?? member.resourceId }), _jsxs("div", { className: "text-muted-foreground", children: [resource ? m.common.resourceKindLabels[resource.kind] : page.pool.noResource, " · ", resource?.active ? m.common.active : m.common.inactive] })] }));
49
- return onOpenResource && resource ? (_jsx("button", { type: "button", className: "block w-full rounded-md border p-3 text-left hover:bg-muted/40", onClick: () => onOpenResource(resource.id), children: body }, member.id)) : (_jsx("div", { className: "rounded-md border p-3", children: body }, member.id));
50
- })) })] }), _jsxs(Card, { children: [_jsxs(CardHeader, { className: "flex flex-row items-center gap-2", children: [_jsx(Package, { className: "size-4", "aria-hidden": "true" }), _jsx(CardTitle, { children: page.pool.allocationsTitle })] }), _jsx(CardContent, { className: "flex flex-col gap-3 text-sm", children: (allocationsQuery.data?.data.length ?? 0) === 0 ? (_jsx("p", { className: "text-muted-foreground", children: page.pool.allocationsEmpty })) : (allocationsQuery.data?.data.map((allocation) => (_jsx(PoolAllocationSummary, { allocation: allocation, onOpenAllocation: onOpenAllocation }, allocation.id)))) })] }), _jsxs(Card, { children: [_jsxs(CardHeader, { className: "flex flex-row items-center gap-2", children: [_jsx(Wrench, { className: "size-4", "aria-hidden": "true" }), _jsx(CardTitle, { children: page.pool.liveAssignmentsTitle })] }), _jsx(CardContent, { className: "flex flex-col gap-3 text-sm", children: (assignmentsQuery.data?.data.length ?? 0) === 0 ? (_jsx("p", { className: "text-muted-foreground", children: page.pool.liveAssignmentsEmpty })) : (assignmentsQuery.data?.data.map((assignment) => (_jsx(ResourceAssignmentSummary, { assignment: assignment, bookingLabel: bookingsById.get(assignment.bookingId ?? "")?.bookingNumber ??
49
+ const members = membersQuery.data?.data ?? [];
50
+ const memberResourceIds = new Set(members.map((member) => member.resourceId));
51
+ const addableResources = resources.filter((resource) => !memberResourceIds.has(resource.id));
52
+ async function handleAddMember() {
53
+ if (!onAddMember || !selectedResourceId)
54
+ return;
55
+ setMemberMutationId("add");
56
+ try {
57
+ await onAddMember(pool, selectedResourceId);
58
+ setSelectedResourceId("");
59
+ }
60
+ finally {
61
+ setMemberMutationId(null);
62
+ }
63
+ }
64
+ async function handleRemoveMember(member) {
65
+ if (!onRemoveMember)
66
+ return;
67
+ setMemberMutationId(member.id);
68
+ try {
69
+ await onRemoveMember(member);
70
+ }
71
+ finally {
72
+ setMemberMutationId(null);
73
+ }
74
+ }
75
+ return (_jsxs("div", { "data-slot": "resource-pool-detail-page", className: cn("flex flex-col gap-6 p-6", className), children: [_jsx(ResourceDetailHeader, { title: pool.name, deleteConfirmName: pool.name, deleteConfirmTemplate: page.pool.deleteConfirm, deleteErrorMessage: page.pool.deleteFailed, deleting: deleting, confirmAction: confirmAction, onBack: onBack, onDelete: onDelete ? () => onDelete(pool) : undefined, onEdit: onEdit ? () => onEdit(pool) : undefined, badges: _jsxs(_Fragment, { children: [_jsx(Badge, { variant: "outline", children: m.common.resourceKindLabels[pool.kind] }), _jsx(Badge, { variant: pool.active ? "default" : "secondary", children: pool.active ? m.common.active : m.common.inactive })] }), actions: pool.productId && onOpenProduct ? (_jsxs(Button, { type: "button", variant: "outline", onClick: () => onOpenProduct(pool.productId), children: [_jsx(Package, { "data-icon": "inline-start", "aria-hidden": "true" }), page.common.openProduct] })) : null }), _jsxs("div", { className: "grid gap-6 md:grid-cols-2", children: [_jsxs(ResourceDetailCard, { title: page.pool.detailsTitle, children: [_jsx(ResourceDetailField, { label: page.common.product, children: pool.productId ? labelById(products, pool.productId) : page.common.noValue }), _jsx(ResourceDetailField, { label: page.pool.sharedCapacity, children: pool.sharedCapacity ?? page.common.noValue }), _jsx(ResourceDetailField, { label: page.common.created, children: i18n.formatDateTime(pool.createdAt) }), _jsx(ResourceDetailField, { label: page.common.updated, children: i18n.formatDateTime(pool.updatedAt) })] }), pool.notes ? (_jsx(ResourceDetailCard, { title: page.common.notes, children: _jsx("p", { className: "whitespace-pre-wrap", children: pool.notes }) })) : null] }), _jsxs(Card, { children: [_jsxs(CardHeader, { className: "flex flex-row items-center gap-2", children: [_jsx(Users, { className: "size-4", "aria-hidden": "true" }), _jsx(CardTitle, { children: page.pool.membersTitle })] }), _jsxs(CardContent, { className: "flex flex-col gap-3 text-sm", children: [onAddMember ? (_jsxs("div", { className: "flex flex-col gap-2 rounded-md border p-3 sm:flex-row sm:items-center", children: [_jsxs(Select, { value: selectedResourceId, onValueChange: (value) => setSelectedResourceId(value ?? ""), children: [_jsx(SelectTrigger, { className: "min-w-0 flex-1", children: _jsx(SelectValue, { placeholder: page.pool.addMemberPlaceholder }) }), _jsx(SelectContent, { children: addableResources.length === 0 ? (_jsx(SelectItem, { value: "__none", disabled: true, children: page.pool.memberAlreadyAssigned })) : (addableResources.map((resource) => (_jsx(SelectItem, { value: resource.id, children: resource.name }, resource.id)))) })] }), _jsxs(Button, { type: "button", onClick: () => void handleAddMember(), disabled: !selectedResourceId || memberMutationId === "add", children: [memberMutationId === "add" ? (_jsx(Loader2, { "data-icon": "inline-start", className: "animate-spin", "aria-hidden": "true" })) : (_jsx(Plus, { "data-icon": "inline-start", "aria-hidden": "true" })), page.pool.addMember] })] })) : null, members.length === 0 ? (_jsx("p", { className: "text-muted-foreground", children: page.pool.membersEmpty })) : (members.map((member) => {
76
+ const resource = resourcesById.get(member.resourceId);
77
+ const body = (_jsxs(_Fragment, { children: [_jsx("div", { className: "font-medium", children: resource?.name ?? member.resourceId }), _jsxs("div", { className: "text-muted-foreground", children: [resource ? m.common.resourceKindLabels[resource.kind] : page.pool.noResource, " · ", resource?.active ? m.common.active : m.common.inactive] })] }));
78
+ return (_jsxs("div", { className: "flex items-start gap-2 rounded-md border p-3", children: [onOpenResource && resource ? (_jsx("button", { type: "button", className: "min-w-0 flex-1 text-left hover:text-primary", onClick: () => onOpenResource(resource.id), children: body })) : (_jsx("div", { className: "min-w-0 flex-1", children: body })), onRemoveMember ? (_jsxs(Button, { type: "button", variant: "ghost", size: "sm", onClick: () => void handleRemoveMember(member), disabled: memberMutationId === member.id, children: [memberMutationId === member.id ? (_jsx(Loader2, { "data-icon": "inline-start", className: "animate-spin", "aria-hidden": "true" })) : (_jsx(Trash2, { "data-icon": "inline-start", "aria-hidden": "true" })), page.pool.removeMember] })) : null] }, member.id));
79
+ }))] })] }), _jsxs(Card, { children: [_jsxs(CardHeader, { className: "flex flex-row items-center gap-2", children: [_jsx(Package, { className: "size-4", "aria-hidden": "true" }), _jsx(CardTitle, { children: page.pool.allocationsTitle })] }), _jsx(CardContent, { className: "flex flex-col gap-3 text-sm", children: (allocationsQuery.data?.data.length ?? 0) === 0 ? (_jsx("p", { className: "text-muted-foreground", children: page.pool.allocationsEmpty })) : (allocationsQuery.data?.data.map((allocation) => (_jsx(PoolAllocationSummary, { allocation: allocation, onOpenAllocation: onOpenAllocation }, allocation.id)))) })] }), _jsxs(Card, { children: [_jsxs(CardHeader, { className: "flex flex-row items-center gap-2", children: [_jsx(Wrench, { className: "size-4", "aria-hidden": "true" }), _jsx(CardTitle, { children: page.pool.liveAssignmentsTitle })] }), _jsx(CardContent, { className: "flex flex-col gap-3 text-sm", children: (assignmentsQuery.data?.data.length ?? 0) === 0 ? (_jsx("p", { className: "text-muted-foreground", children: page.pool.liveAssignmentsEmpty })) : (assignmentsQuery.data?.data.map((assignment) => (_jsx(ResourceAssignmentSummary, { assignment: assignment, bookingLabel: bookingsById.get(assignment.bookingId ?? "")?.bookingNumber ??
51
80
  assignment.bookingId ??
52
81
  page.common.noBooking, noValue: page.common.noValue, slotLabel: slotsById.get(assignment.slotId)
53
82
  ? formatResourceSlotLabel(slotsById.get(assignment.slotId), {
54
83
  template: m.common.slotLabel,
55
84
  formatDate: i18n.formatDate,
85
+ products,
56
86
  })
57
87
  : assignment.slotId, onOpenAssignment: onOpenAssignment }, assignment.id)))) })] })] }));
58
88
  }
@@ -1,6 +1,7 @@
1
- import type { BookingOption, ResourceCloseoutRow, ResourceRow, ResourceSlotAssignmentRow, SlotOption } from "../index.js";
2
- export declare function ResourcesOverview({ bookings, slots, closeouts, filteredResources, filteredPools, liveAssignments, resourcesWithoutSupplier, unassignedReservations, search, setSearch, kindFilter, setKindFilter, hasFilters, onClearFilters, onOpenAssignment, onOpenResource, showFilters, }: {
1
+ import type { BookingOption, ProductOption, ResourceCloseoutRow, ResourceRow, ResourceSlotAssignmentRow, SlotOption } from "../index.js";
2
+ export declare function ResourcesOverview({ bookings, products, slots, closeouts, filteredResources, filteredPools, liveAssignments, resourcesWithoutSupplier, unassignedReservations, search, setSearch, kindFilter, setKindFilter, hasFilters, onClearFilters, onOpenAssignment, onOpenResource, showFilters, }: {
3
3
  bookings: BookingOption[];
4
+ products?: ProductOption[];
4
5
  slots: SlotOption[];
5
6
  closeouts: ResourceCloseoutRow[];
6
7
  filteredResources: ResourceRow[];
@@ -1 +1 @@
1
- {"version":3,"file":"resources-overview.d.ts","sourceRoot":"","sources":["../../../src/resources/components/resources-overview.tsx"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EACV,aAAa,EACb,mBAAmB,EACnB,WAAW,EACX,yBAAyB,EACzB,UAAU,EACX,MAAM,aAAa,CAAA;AAGpB,wBAAgB,iBAAiB,CAAC,EAChC,QAAQ,EACR,KAAK,EACL,SAAS,EACT,iBAAiB,EACjB,aAAa,EACb,eAAe,EACf,wBAAwB,EACxB,sBAAsB,EACtB,MAAM,EACN,SAAS,EACT,UAAU,EACV,aAAa,EACb,UAAU,EACV,cAAc,EACd,gBAAgB,EAChB,cAAc,EACd,WAAkB,GACnB,EAAE;IACD,QAAQ,EAAE,aAAa,EAAE,CAAA;IACzB,KAAK,EAAE,UAAU,EAAE,CAAA;IACnB,SAAS,EAAE,mBAAmB,EAAE,CAAA;IAChC,iBAAiB,EAAE,WAAW,EAAE,CAAA;IAChC,aAAa,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,OAAO,CAAA;KAAE,CAAC,CAAA;IACzC,eAAe,EAAE,yBAAyB,EAAE,CAAA;IAC5C,wBAAwB,EAAE,WAAW,EAAE,CAAA;IACvC,sBAAsB,EAAE,yBAAyB,EAAE,CAAA;IACnD,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IAClC,UAAU,EAAE,MAAM,CAAA;IAClB,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IACtC,UAAU,EAAE,OAAO,CAAA;IACnB,cAAc,EAAE,MAAM,IAAI,CAAA;IAC1B,gBAAgB,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,IAAI,CAAA;IAChD,cAAc,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAA;IAC5C;;;;OAIG;IACH,WAAW,CAAC,EAAE,OAAO,CAAA;CACtB,+BAkJA"}
1
+ {"version":3,"file":"resources-overview.d.ts","sourceRoot":"","sources":["../../../src/resources/components/resources-overview.tsx"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EACV,aAAa,EACb,aAAa,EACb,mBAAmB,EACnB,WAAW,EACX,yBAAyB,EACzB,UAAU,EACX,MAAM,aAAa,CAAA;AAGpB,wBAAgB,iBAAiB,CAAC,EAChC,QAAQ,EACR,QAAa,EACb,KAAK,EACL,SAAS,EACT,iBAAiB,EACjB,aAAa,EACb,eAAe,EACf,wBAAwB,EACxB,sBAAsB,EACtB,MAAM,EACN,SAAS,EACT,UAAU,EACV,aAAa,EACb,UAAU,EACV,cAAc,EACd,gBAAgB,EAChB,cAAc,EACd,WAAkB,GACnB,EAAE;IACD,QAAQ,EAAE,aAAa,EAAE,CAAA;IACzB,QAAQ,CAAC,EAAE,aAAa,EAAE,CAAA;IAC1B,KAAK,EAAE,UAAU,EAAE,CAAA;IACnB,SAAS,EAAE,mBAAmB,EAAE,CAAA;IAChC,iBAAiB,EAAE,WAAW,EAAE,CAAA;IAChC,aAAa,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,OAAO,CAAA;KAAE,CAAC,CAAA;IACzC,eAAe,EAAE,yBAAyB,EAAE,CAAA;IAC5C,wBAAwB,EAAE,WAAW,EAAE,CAAA;IACvC,sBAAsB,EAAE,yBAAyB,EAAE,CAAA;IACnD,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IAClC,UAAU,EAAE,MAAM,CAAA;IAClB,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IACtC,UAAU,EAAE,OAAO,CAAA;IACnB,cAAc,EAAE,MAAM,IAAI,CAAA;IAC1B,gBAAgB,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,IAAI,CAAA;IAChD,cAAc,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAA;IAC5C;;;;OAIG;IACH,WAAW,CAAC,EAAE,OAAO,CAAA;CACtB,+BAmJA"}
@@ -5,7 +5,7 @@ import { CalendarDays, ExternalLink, Search, Users, Wrench } from "lucide-react"
5
5
  import { useResourcesUiI18nOrDefault } from "../i18n/index.js";
6
6
  import { formatResourceSlotLabel, RESOURCE_KIND_VALUES } from "../i18n/utils.js";
7
7
  import { labelById } from "../index.js";
8
- export function ResourcesOverview({ bookings, slots, closeouts, filteredResources, filteredPools, liveAssignments, resourcesWithoutSupplier, unassignedReservations, search, setSearch, kindFilter, setKindFilter, hasFilters, onClearFilters, onOpenAssignment, onOpenResource, showFilters = true, }) {
8
+ export function ResourcesOverview({ bookings, products = [], slots, closeouts, filteredResources, filteredPools, liveAssignments, resourcesWithoutSupplier, unassignedReservations, search, setSearch, kindFilter, setKindFilter, hasFilters, onClearFilters, onOpenAssignment, onOpenResource, showFilters = true, }) {
9
9
  const i18n = useResourcesUiI18nOrDefault();
10
10
  const m = i18n.messages;
11
11
  const activeResourcesCount = filteredResources.filter((resource) => resource.active).length;
@@ -22,6 +22,7 @@ export function ResourcesOverview({ bookings, slots, closeouts, filteredResource
22
22
  }, {
23
23
  template: m.common.slotLabel,
24
24
  formatDate: i18n.formatDate,
25
+ products,
25
26
  }) }), _jsx("div", { className: "text-muted-foreground", children: formatMessage(m.overview.assignmentGaps.statusBooking, {
26
27
  status: m.common.assignmentStatusLabels[assignment.status],
27
28
  booking: labelById(bookings, assignment.bookingId),
@@ -1 +1 @@
1
- {"version":3,"file":"resources-page.d.ts","sourceRoot":"","sources":["../../../src/resources/components/resources-page.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"resources-page.d.ts","sourceRoot":"","sources":["../../../src/resources/components/resources-page.tsx"],"names":[],"mappings":"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"}
@@ -5,7 +5,7 @@ import { Popover, PopoverContent, PopoverTrigger } from "@voyant-travel/ui/compo
5
5
  import { Select, SelectContent, SelectGroup, SelectItem, SelectTrigger, SelectValue, } from "@voyant-travel/ui/components/select";
6
6
  import { Tabs, TabsList, TabsTrigger } from "@voyant-travel/ui/components/tabs";
7
7
  import { ListFilter, Search, X } from "lucide-react";
8
- import { useMemo, useState } from "react";
8
+ import { useEffect, useMemo, useState } from "react";
9
9
  import { useResourcesUiI18nOrDefault } from "../i18n/index.js";
10
10
  import { formatResourceSlotLabel, RESOURCE_KIND_VALUES } from "../i18n/utils.js";
11
11
  import { labelById, useAllocations, useAssignments, useBookings, useCloseouts, usePools, useProducts, useResources, useRules, useSlots, useStartTimes, useSuppliers, } from "../index.js";
@@ -16,20 +16,33 @@ import { AssignmentsTab, CloseoutsTab } from "./resources-tabs-secondary.js";
16
16
  const noop = () => undefined;
17
17
  const noopId = (_id) => undefined;
18
18
  const noopRow = (_row) => undefined;
19
+ const RESOURCE_PAGE_STATE_KEY = "voyant.resources.pageState";
20
+ function loadPersistedPageState() {
21
+ if (typeof window === "undefined")
22
+ return {};
23
+ try {
24
+ const raw = window.sessionStorage.getItem(RESOURCE_PAGE_STATE_KEY);
25
+ return raw ? JSON.parse(raw) : {};
26
+ }
27
+ catch {
28
+ return {};
29
+ }
30
+ }
19
31
  export function ResourcesPage({ className, defaultTab = "resources", bulkActionTarget = null, onBulkUpdate, onBulkDelete, onResourceCreate = noop, onResourceOpen = noopId, onResourceEdit = noopRow, onPoolCreate = noop, onPoolOpen = noopId, onPoolEdit = noopRow, onAllocationCreate = noop, onAllocationOpen = noopId, onAllocationEdit = noopRow, onAssignmentCreate = noop, onAssignmentOpen = noopId, onAssignmentEdit = noopRow, onCloseoutCreate = noop, onCloseoutEdit = noopRow, slots, queryFilters, loadingFallback, }) {
20
32
  const i18n = useResourcesUiI18nOrDefault();
21
33
  const m = i18n.messages;
22
34
  const page = m.resourcesPage;
23
- const [search, setSearch] = useState("");
24
- const [kindFilter, setKindFilter] = useState("all");
25
- const [activeTab, setActiveTab] = useState(defaultTab);
35
+ const [persistedPageState] = useState(loadPersistedPageState);
36
+ const [search, setSearch] = useState(persistedPageState.search ?? "");
37
+ const [kindFilter, setKindFilter] = useState(persistedPageState.kindFilter ?? "all");
38
+ const [activeTab, setActiveTab] = useState(persistedPageState.activeTab ?? defaultTab);
26
39
  const [filterPopoverOpen, setFilterPopoverOpen] = useState(false);
27
- const [supplierFilter, setSupplierFilter] = useState(null);
40
+ const [supplierFilter, setSupplierFilter] = useState(persistedPageState.supplierFilter ?? null);
28
41
  const [selectedSupplierOption, setSelectedSupplierOption] = useState(null);
29
- const [productFilter, setProductFilter] = useState(null);
42
+ const [productFilter, setProductFilter] = useState(persistedPageState.productFilter ?? null);
30
43
  const [selectedProductOption, setSelectedProductOption] = useState(null);
31
- const [activeFilter, setActiveFilter] = useState("all");
32
- const [assignmentStatusFilter, setAssignmentStatusFilter] = useState("all");
44
+ const [activeFilter, setActiveFilter] = useState(persistedPageState.activeFilter ?? "all");
45
+ const [assignmentStatusFilter, setAssignmentStatusFilter] = useState(persistedPageState.assignmentStatusFilter ?? "all");
33
46
  const [resourceSelection, setResourceSelectionState] = useState({});
34
47
  const [poolSelection, setPoolSelectionState] = useState({});
35
48
  const [allocationSelection, setAllocationSelectionState] = useState({});
@@ -57,6 +70,28 @@ export function ResourcesPage({ className, defaultTab = "resources", bulkActionT
57
70
  const allocations = allocationsQuery.data?.data ?? [];
58
71
  const assignments = assignmentsQuery.data?.data ?? [];
59
72
  const closeouts = closeoutsQuery.data?.data ?? [];
73
+ useEffect(() => {
74
+ if (typeof window === "undefined")
75
+ return;
76
+ const nextState = {
77
+ activeTab,
78
+ search,
79
+ kindFilter,
80
+ activeFilter,
81
+ supplierFilter,
82
+ productFilter,
83
+ assignmentStatusFilter,
84
+ };
85
+ window.sessionStorage.setItem(RESOURCE_PAGE_STATE_KEY, JSON.stringify(nextState));
86
+ }, [
87
+ activeFilter,
88
+ activeTab,
89
+ assignmentStatusFilter,
90
+ kindFilter,
91
+ productFilter,
92
+ search,
93
+ supplierFilter,
94
+ ]);
60
95
  const kindOptions = useMemo(() => RESOURCE_KIND_VALUES.map((value) => ({
61
96
  value,
62
97
  label: m.common.resourceKindLabels[value],
@@ -95,6 +130,7 @@ export function ResourcesPage({ className, defaultTab = "resources", bulkActionT
95
130
  }, {
96
131
  template: m.common.slotLabel,
97
132
  formatDate: i18n.formatDate,
133
+ products,
98
134
  })));
99
135
  });
100
136
  const filteredCloseouts = closeouts.filter((closeout) => {
@@ -136,5 +172,5 @@ export function ResourcesPage({ className, defaultTab = "resources", bulkActionT
136
172
  ];
137
173
  const isLoading = queries.some((query) => query.isPending);
138
174
  const isError = queries.some((query) => query.isError);
139
- return (_jsxs("div", { className: cn("flex flex-col gap-6 p-6", className), children: [_jsxs("div", { className: "flex flex-col gap-3 md:flex-row md:items-start md:justify-between", children: [_jsxs("div", { children: [_jsx("h1", { className: "text-2xl font-bold tracking-tight", children: page.title }), _jsx("p", { className: "text-sm text-muted-foreground", children: page.description })] }), slots?.headerEnd] }), _jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [_jsxs("div", { className: "relative min-w-[14rem] flex-1", children: [_jsx(Label, { htmlFor: "resources-search", className: "sr-only", children: page.filters.searchPlaceholder }), _jsx(Search, { className: "pointer-events-none absolute left-3 top-1/2 size-4 -translate-y-1/2 text-muted-foreground", "aria-hidden": "true" }), _jsx(Input, { id: "resources-search", placeholder: page.filters.searchPlaceholder, value: search, onChange: (event) => setSearch(event.target.value), className: "pl-9" })] }), _jsxs(Select, { value: kindFilter, onValueChange: (value) => setKindFilter(value ?? "all"), children: [_jsx(SelectTrigger, { className: "w-44", children: _jsx(SelectValue, {}) }), _jsx(SelectContent, { children: _jsxs(SelectGroup, { children: [_jsx(SelectItem, { value: "all", children: m.common.allKinds }), kindOptions.map((option) => (_jsx(SelectItem, { value: option.value, children: option.label }, option.value)))] }) })] }), _jsxs(Popover, { open: filterPopoverOpen, onOpenChange: setFilterPopoverOpen, children: [_jsx(PopoverTrigger, { render: _jsxs(Button, { variant: "outline", children: [_jsx(ListFilter, { "data-icon": "inline-start", "aria-hidden": "true" }), page.filters.button, activeFilterCount > 0 ? (_jsx(Badge, { variant: "secondary", className: "ml-1 px-1.5", children: activeFilterCount })) : null] }) }), _jsx(PopoverContent, { align: "end", className: "w-[22rem] p-4", children: _jsx(ResourcesFilterPopover, { activeTab: activeTab, suppliers: suppliers, products: products, supplierFilter: supplierFilter, setSupplierFilter: setSupplierFilter, selectedSupplierOption: selectedSupplierOption, setSelectedSupplierOption: setSelectedSupplierOption, productFilter: productFilter, setProductFilter: setProductFilter, selectedProductOption: selectedProductOption, setSelectedProductOption: setSelectedProductOption, activeFilter: activeFilter, setActiveFilter: setActiveFilter, assignmentStatusFilter: assignmentStatusFilter, setAssignmentStatusFilter: setAssignmentStatusFilter }) })] }), hasFilters ? (_jsxs(Button, { variant: "ghost", size: "sm", onClick: clearAllFilters, children: [_jsx(X, { "data-icon": "inline-start", "aria-hidden": "true" }), page.filters.clear] })) : null] }), isLoading ? ((loadingFallback ?? (_jsx("div", { className: "rounded-md border p-6 text-sm text-muted-foreground", children: page.loading })))) : isError ? (_jsx("div", { className: "rounded-md border p-6 text-sm text-muted-foreground", children: page.loadFailed })) : (_jsxs(_Fragment, { children: [_jsx(ResourcesOverview, { bookings: bookings, slots: slotsData, closeouts: closeouts, filteredResources: filteredResources, filteredPools: filteredPools, liveAssignments: liveAssignments, resourcesWithoutSupplier: resourcesWithoutSupplier, unassignedReservations: unassignedReservations, search: search, setSearch: setSearch, kindFilter: kindFilter, setKindFilter: setKindFilter, hasFilters: hasFilters, onClearFilters: clearAllFilters, onOpenAssignment: onAssignmentOpen, onOpenResource: onResourceOpen, showFilters: false }), slots?.afterOverview, slots?.beforeTabs, _jsxs(Tabs, { value: activeTab, onValueChange: (value) => setActiveTab((value ?? "resources")), children: [_jsxs(TabsList, { className: "flex w-full justify-start overflow-x-auto overflow-y-hidden", children: [_jsx(TabsTrigger, { value: "resources", children: page.tabs.resources }), _jsx(TabsTrigger, { value: "pools", children: page.tabs.pools }), _jsx(TabsTrigger, { value: "allocations", children: page.tabs.allocations }), _jsx(TabsTrigger, { value: "assignments", children: page.tabs.assignments }), _jsx(TabsTrigger, { value: "closeouts", children: page.tabs.closeouts })] }), _jsx(ResourcesTab, { suppliers: suppliers, filteredResources: filteredResources, resourceSelection: resourceSelection, setResourceSelection: setResourceSelectionState, bulkActionTarget: bulkActionTarget, handleBulkUpdate: onBulkUpdate, handleBulkDelete: onBulkDelete, onCreate: onResourceCreate, onOpenRoute: onResourceOpen, onEdit: (row) => onResourceEdit(row) }), _jsx(PoolsTab, { products: products, filteredPools: filteredPools, poolSelection: poolSelection, setPoolSelection: setPoolSelectionState, bulkActionTarget: bulkActionTarget, handleBulkUpdate: onBulkUpdate, handleBulkDelete: onBulkDelete, onCreate: onPoolCreate, onOpenRoute: onPoolOpen, onEdit: (row) => onPoolEdit(row) }), _jsx(AllocationsTab, { pools: pools, products: products, filteredAllocations: filteredAllocations, allocationSelection: allocationSelection, setAllocationSelection: setAllocationSelectionState, bulkActionTarget: bulkActionTarget, handleBulkDelete: onBulkDelete, onCreate: onAllocationCreate, onOpenRoute: onAllocationOpen, onEdit: (row) => onAllocationEdit(row) }), _jsx(AssignmentsTab, { slots: slotsData, resources: resources, bookings: bookings, filteredAssignments: filteredAssignments, assignmentSelection: assignmentSelection, setAssignmentSelection: setAssignmentSelectionState, bulkActionTarget: bulkActionTarget, handleBulkUpdate: onBulkUpdate, handleBulkDelete: onBulkDelete, onCreate: onAssignmentCreate, onOpenRoute: onAssignmentOpen, onEdit: (row) => onAssignmentEdit(row) }), _jsx(CloseoutsTab, { resources: resources, filteredCloseouts: filteredCloseouts, closeoutSelection: closeoutSelection, setCloseoutSelection: setCloseoutSelectionState, bulkActionTarget: bulkActionTarget, handleBulkDelete: onBulkDelete, onCreate: onCloseoutCreate, onEdit: (row) => onCloseoutEdit(row) })] }), slots?.afterTabs] })), slots?.dialogs] }));
175
+ return (_jsxs("div", { className: cn("flex flex-col gap-6 p-6", className), children: [_jsxs("div", { className: "flex flex-col gap-3 md:flex-row md:items-start md:justify-between", children: [_jsxs("div", { children: [_jsx("h1", { className: "text-2xl font-bold tracking-tight", children: page.title }), _jsx("p", { className: "text-sm text-muted-foreground", children: page.description })] }), slots?.headerEnd] }), _jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [_jsxs("div", { className: "relative min-w-[14rem] flex-1", children: [_jsx(Label, { htmlFor: "resources-search", className: "sr-only", children: page.filters.searchPlaceholder }), _jsx(Search, { className: "pointer-events-none absolute left-3 top-1/2 size-4 -translate-y-1/2 text-muted-foreground", "aria-hidden": "true" }), _jsx(Input, { id: "resources-search", placeholder: page.filters.searchPlaceholder, value: search, onChange: (event) => setSearch(event.target.value), className: "pl-9" })] }), _jsxs(Select, { value: kindFilter, onValueChange: (value) => setKindFilter(value ?? "all"), children: [_jsx(SelectTrigger, { className: "w-44", children: _jsx(SelectValue, {}) }), _jsx(SelectContent, { children: _jsxs(SelectGroup, { children: [_jsx(SelectItem, { value: "all", children: m.common.allKinds }), kindOptions.map((option) => (_jsx(SelectItem, { value: option.value, children: option.label }, option.value)))] }) })] }), _jsxs(Popover, { open: filterPopoverOpen, onOpenChange: setFilterPopoverOpen, children: [_jsx(PopoverTrigger, { render: _jsxs(Button, { variant: "outline", children: [_jsx(ListFilter, { "data-icon": "inline-start", "aria-hidden": "true" }), page.filters.button, activeFilterCount > 0 ? (_jsx(Badge, { variant: "secondary", className: "ml-1 px-1.5", children: activeFilterCount })) : null] }) }), _jsx(PopoverContent, { align: "end", className: "w-[22rem] p-4", children: _jsx(ResourcesFilterPopover, { activeTab: activeTab, suppliers: suppliers, products: products, supplierFilter: supplierFilter, setSupplierFilter: setSupplierFilter, selectedSupplierOption: selectedSupplierOption, setSelectedSupplierOption: setSelectedSupplierOption, productFilter: productFilter, setProductFilter: setProductFilter, selectedProductOption: selectedProductOption, setSelectedProductOption: setSelectedProductOption, activeFilter: activeFilter, setActiveFilter: setActiveFilter, assignmentStatusFilter: assignmentStatusFilter, setAssignmentStatusFilter: setAssignmentStatusFilter }) })] }), hasFilters ? (_jsxs(Button, { variant: "ghost", size: "sm", onClick: clearAllFilters, children: [_jsx(X, { "data-icon": "inline-start", "aria-hidden": "true" }), page.filters.clear] })) : null] }), isLoading ? ((loadingFallback ?? (_jsx("div", { className: "rounded-md border p-6 text-sm text-muted-foreground", children: page.loading })))) : isError ? (_jsx("div", { className: "rounded-md border p-6 text-sm text-muted-foreground", children: page.loadFailed })) : (_jsxs(_Fragment, { children: [_jsx(ResourcesOverview, { bookings: bookings, products: products, slots: slotsData, closeouts: closeouts, filteredResources: filteredResources, filteredPools: filteredPools, liveAssignments: liveAssignments, resourcesWithoutSupplier: resourcesWithoutSupplier, unassignedReservations: unassignedReservations, search: search, setSearch: setSearch, kindFilter: kindFilter, setKindFilter: setKindFilter, hasFilters: hasFilters, onClearFilters: clearAllFilters, onOpenAssignment: onAssignmentOpen, onOpenResource: onResourceOpen, showFilters: false }), slots?.afterOverview, slots?.beforeTabs, _jsxs(Tabs, { value: activeTab, onValueChange: (value) => setActiveTab((value ?? "resources")), children: [_jsxs(TabsList, { className: "flex w-full justify-start overflow-x-auto overflow-y-hidden", children: [_jsx(TabsTrigger, { value: "resources", children: page.tabs.resources }), _jsx(TabsTrigger, { value: "pools", children: page.tabs.pools }), _jsx(TabsTrigger, { value: "allocations", children: page.tabs.allocations }), _jsx(TabsTrigger, { value: "assignments", children: page.tabs.assignments }), _jsx(TabsTrigger, { value: "closeouts", children: page.tabs.closeouts })] }), _jsx(ResourcesTab, { suppliers: suppliers, filteredResources: filteredResources, resourceSelection: resourceSelection, setResourceSelection: setResourceSelectionState, bulkActionTarget: bulkActionTarget, handleBulkUpdate: onBulkUpdate, handleBulkDelete: onBulkDelete, onCreate: onResourceCreate, onOpenRoute: onResourceOpen, onEdit: (row) => onResourceEdit(row) }), _jsx(PoolsTab, { products: products, filteredPools: filteredPools, poolSelection: poolSelection, setPoolSelection: setPoolSelectionState, bulkActionTarget: bulkActionTarget, handleBulkUpdate: onBulkUpdate, handleBulkDelete: onBulkDelete, onCreate: onPoolCreate, onOpenRoute: onPoolOpen, onEdit: (row) => onPoolEdit(row) }), _jsx(AllocationsTab, { pools: pools, products: products, filteredAllocations: filteredAllocations, allocationSelection: allocationSelection, setAllocationSelection: setAllocationSelectionState, bulkActionTarget: bulkActionTarget, handleBulkDelete: onBulkDelete, onCreate: onAllocationCreate, onOpenRoute: onAllocationOpen, onEdit: (row) => onAllocationEdit(row) }), _jsx(AssignmentsTab, { slots: slotsData, products: products, resources: resources, bookings: bookings, filteredAssignments: filteredAssignments, assignmentSelection: assignmentSelection, setAssignmentSelection: setAssignmentSelectionState, bulkActionTarget: bulkActionTarget, handleBulkUpdate: onBulkUpdate, handleBulkDelete: onBulkDelete, onCreate: onAssignmentCreate, onOpenRoute: onAssignmentOpen, onEdit: (row) => onAssignmentEdit(row) }), _jsx(CloseoutsTab, { resources: resources, filteredCloseouts: filteredCloseouts, closeoutSelection: closeoutSelection, setCloseoutSelection: setCloseoutSelectionState, bulkActionTarget: bulkActionTarget, handleBulkDelete: onBulkDelete, onCreate: onCloseoutCreate, onEdit: (row) => onCloseoutEdit(row) })] }), slots?.afterTabs] })), slots?.dialogs] }));
140
176
  }
@@ -1 +1 @@
1
- {"version":3,"file":"resources-tabs-primary.d.ts","sourceRoot":"","sources":["../../../src/resources/components/resources-tabs-primary.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAa,UAAU,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAA;AAcrF,OAAO,EAEL,KAAK,aAAa,EAClB,KAAK,qBAAqB,EAC1B,KAAK,eAAe,EACpB,KAAK,WAAW,EAChB,KAAK,cAAc,EACpB,MAAM,aAAa,CAAA;AAGpB,KAAK,MAAM,GAAG,CAAC,IAAI,EAAE;IACnB,GAAG,EAAE,MAAM,EAAE,CAAA;IACb,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,YAAY,EAAE,MAAM,CAAA;IACpB,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAChC,WAAW,EAAE,MAAM,CAAA;IACnB,cAAc,EAAE,MAAM,IAAI,CAAA;CAC3B,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;AAEnB,KAAK,QAAQ,GAAG,CAAC,IAAI,EAAE;IACrB,GAAG,EAAE,MAAM,EAAE,CAAA;IACb,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,YAAY,EAAE,MAAM,CAAA;IACpB,UAAU,EAAE,MAAM,CAAA;IAClB,cAAc,EAAE,MAAM,IAAI,CAAA;CAC3B,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;AA6NnB,wBAAgB,YAAY,CAAC,KAAK,EAAE;IAClC,SAAS,EAAE,cAAc,EAAE,CAAA;IAC3B,iBAAiB,EAAE,WAAW,EAAE,CAAA;IAChC,iBAAiB,EAAE,iBAAiB,CAAA;IACpC,oBAAoB,EAAE,UAAU,CAAC,iBAAiB,CAAC,CAAA;IACnD,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAA;IAC/B,gBAAgB,EAAE,MAAM,CAAA;IACxB,gBAAgB,EAAE,QAAQ,CAAA;IAC1B,QAAQ,EAAE,MAAM,IAAI,CAAA;IACpB,WAAW,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAA;IACzC,MAAM,EAAE,CAAC,GAAG,EAAE,WAAW,KAAK,IAAI,CAAA;CACnC,+BAoHA;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE;IAC9B,QAAQ,EAAE,aAAa,EAAE,CAAA;IACzB,aAAa,EAAE,eAAe,EAAE,CAAA;IAChC,aAAa,EAAE,iBAAiB,CAAA;IAChC,gBAAgB,EAAE,UAAU,CAAC,iBAAiB,CAAC,CAAA;IAC/C,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAA;IAC/B,gBAAgB,EAAE,MAAM,CAAA;IACxB,gBAAgB,EAAE,QAAQ,CAAA;IAC1B,QAAQ,EAAE,MAAM,IAAI,CAAA;IACpB,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;IACrC,MAAM,EAAE,CAAC,GAAG,EAAE,eAAe,KAAK,IAAI,CAAA;CACvC,+BAoHA;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE;IACpC,KAAK,EAAE,eAAe,EAAE,CAAA;IACxB,QAAQ,EAAE,aAAa,EAAE,CAAA;IACzB,mBAAmB,EAAE,qBAAqB,EAAE,CAAA;IAC5C,mBAAmB,EAAE,iBAAiB,CAAA;IACtC,sBAAsB,EAAE,UAAU,CAAC,iBAAiB,CAAC,CAAA;IACrD,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAA;IAC/B,gBAAgB,EAAE,QAAQ,CAAA;IAC1B,QAAQ,EAAE,MAAM,IAAI,CAAA;IACpB,WAAW,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,IAAI,CAAA;IAC3C,MAAM,EAAE,CAAC,GAAG,EAAE,qBAAqB,KAAK,IAAI,CAAA;CAC7C,+BAgEA"}
1
+ {"version":3,"file":"resources-tabs-primary.d.ts","sourceRoot":"","sources":["../../../src/resources/components/resources-tabs-primary.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAa,UAAU,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAA;AAcrF,OAAO,EAEL,KAAK,aAAa,EAClB,KAAK,qBAAqB,EAC1B,KAAK,eAAe,EACpB,KAAK,WAAW,EAChB,KAAK,cAAc,EACpB,MAAM,aAAa,CAAA;AAGpB,KAAK,MAAM,GAAG,CAAC,IAAI,EAAE;IACnB,GAAG,EAAE,MAAM,EAAE,CAAA;IACb,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,YAAY,EAAE,MAAM,CAAA;IACpB,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAChC,WAAW,EAAE,MAAM,CAAA;IACnB,cAAc,EAAE,MAAM,IAAI,CAAA;CAC3B,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;AAEnB,KAAK,QAAQ,GAAG,CAAC,IAAI,EAAE;IACrB,GAAG,EAAE,MAAM,EAAE,CAAA;IACb,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,YAAY,EAAE,MAAM,CAAA;IACpB,UAAU,EAAE,MAAM,CAAA;IAClB,cAAc,EAAE,MAAM,IAAI,CAAA;CAC3B,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;AAuQnB,wBAAgB,YAAY,CAAC,KAAK,EAAE;IAClC,SAAS,EAAE,cAAc,EAAE,CAAA;IAC3B,iBAAiB,EAAE,WAAW,EAAE,CAAA;IAChC,iBAAiB,EAAE,iBAAiB,CAAA;IACpC,oBAAoB,EAAE,UAAU,CAAC,iBAAiB,CAAC,CAAA;IACnD,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAA;IAC/B,gBAAgB,EAAE,MAAM,CAAA;IACxB,gBAAgB,EAAE,QAAQ,CAAA;IAC1B,QAAQ,EAAE,MAAM,IAAI,CAAA;IACpB,WAAW,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAA;IACzC,MAAM,EAAE,CAAC,GAAG,EAAE,WAAW,KAAK,IAAI,CAAA;CACnC,+BAoHA;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE;IAC9B,QAAQ,EAAE,aAAa,EAAE,CAAA;IACzB,aAAa,EAAE,eAAe,EAAE,CAAA;IAChC,aAAa,EAAE,iBAAiB,CAAA;IAChC,gBAAgB,EAAE,UAAU,CAAC,iBAAiB,CAAC,CAAA;IAC/C,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAA;IAC/B,gBAAgB,EAAE,MAAM,CAAA;IACxB,gBAAgB,EAAE,QAAQ,CAAA;IAC1B,QAAQ,EAAE,MAAM,IAAI,CAAA;IACpB,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;IACrC,MAAM,EAAE,CAAC,GAAG,EAAE,eAAe,KAAK,IAAI,CAAA;CACvC,+BAoHA;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE;IACpC,KAAK,EAAE,eAAe,EAAE,CAAA;IACxB,QAAQ,EAAE,aAAa,EAAE,CAAA;IACzB,mBAAmB,EAAE,qBAAqB,EAAE,CAAA;IAC5C,mBAAmB,EAAE,iBAAiB,CAAA;IACtC,sBAAsB,EAAE,UAAU,CAAC,iBAAiB,CAAC,CAAA;IACrD,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAA;IAC/B,gBAAgB,EAAE,QAAQ,CAAA;IAC1B,QAAQ,EAAE,MAAM,IAAI,CAAA;IACpB,WAAW,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,IAAI,CAAA;IAC3C,MAAM,EAAE,CAAC,GAAG,EAAE,qBAAqB,KAAK,IAAI,CAAA;CAC7C,+BAsEA"}
@@ -4,12 +4,12 @@ import { Badge, Button, ConfirmActionButton, SelectionActionBar, } from "@voyant
4
4
  import { DataTable } from "@voyant-travel/ui/components/data-table";
5
5
  import { DataTableColumnHeader } from "@voyant-travel/ui/components/data-table-column-header";
6
6
  import { TabsContent } from "@voyant-travel/ui/components/tabs";
7
- import { ExternalLink } from "lucide-react";
7
+ import { ExternalLink, Pencil } from "lucide-react";
8
8
  import { useResourcesUiI18nOrDefault } from "../i18n/index.js";
9
9
  import { formatSelectionLabel, formatSelectionSummary } from "../i18n/utils.js";
10
10
  import { labelById, } from "../index.js";
11
11
  import { ResourcesSectionHeader } from "./resources-section-header.js";
12
- const resourceColumns = (i18n, suppliers, onView) => [
12
+ const resourceColumns = (i18n, suppliers, onView, onEdit) => [
13
13
  {
14
14
  accessorKey: "name",
15
15
  header: ({ column }) => (_jsx(DataTableColumnHeader, { column: column, title: i18n.messages.tabsPrimary.columns.resources.name })),
@@ -37,13 +37,16 @@ const resourceColumns = (i18n, suppliers, onView) => [
37
37
  {
38
38
  id: "view",
39
39
  header: i18n.messages.tabsPrimary.columns.resources.view,
40
- cell: ({ row }) => (_jsxs(Button, { variant: "ghost", size: "sm", onClick: (event) => {
41
- event.stopPropagation();
42
- onView(row.original.id);
43
- }, children: [_jsx(ExternalLink, { className: "mr-2 h-4 w-4" }), i18n.messages.common.open] })),
40
+ cell: ({ row }) => (_jsxs("div", { className: "flex flex-wrap items-center gap-1", children: [_jsxs(Button, { variant: "ghost", size: "sm", onClick: (event) => {
41
+ event.stopPropagation();
42
+ onView(row.original.id);
43
+ }, children: [_jsx(ExternalLink, { className: "mr-2 h-4 w-4" }), i18n.messages.common.open] }), _jsxs(Button, { variant: "ghost", size: "sm", onClick: (event) => {
44
+ event.stopPropagation();
45
+ onEdit(row.original);
46
+ }, children: [_jsx(Pencil, { className: "mr-2 h-4 w-4" }), i18n.messages.common.edit] })] })),
44
47
  },
45
48
  ];
46
- const poolColumns = (i18n, products, onView) => [
49
+ const poolColumns = (i18n, products, onView, onEdit) => [
47
50
  {
48
51
  accessorKey: "name",
49
52
  header: ({ column }) => (_jsx(DataTableColumnHeader, { column: column, title: i18n.messages.tabsPrimary.columns.pools.name })),
@@ -66,13 +69,16 @@ const poolColumns = (i18n, products, onView) => [
66
69
  {
67
70
  id: "view",
68
71
  header: i18n.messages.tabsPrimary.columns.pools.view,
69
- cell: ({ row }) => (_jsxs(Button, { variant: "ghost", size: "sm", onClick: (event) => {
70
- event.stopPropagation();
71
- onView(row.original.id);
72
- }, children: [_jsx(ExternalLink, { className: "mr-2 h-4 w-4" }), i18n.messages.common.open] })),
72
+ cell: ({ row }) => (_jsxs("div", { className: "flex flex-wrap items-center gap-1", children: [_jsxs(Button, { variant: "ghost", size: "sm", onClick: (event) => {
73
+ event.stopPropagation();
74
+ onView(row.original.id);
75
+ }, children: [_jsx(ExternalLink, { className: "mr-2 h-4 w-4" }), i18n.messages.common.open] }), _jsxs(Button, { variant: "ghost", size: "sm", onClick: (event) => {
76
+ event.stopPropagation();
77
+ onEdit(row.original);
78
+ }, children: [_jsx(Pencil, { className: "mr-2 h-4 w-4" }), i18n.messages.common.edit] })] })),
73
79
  },
74
80
  ];
75
- const allocationColumns = (i18n, pools, products, onView) => [
81
+ const allocationColumns = (i18n, pools, products, onView, onEdit) => [
76
82
  {
77
83
  accessorKey: "poolId",
78
84
  header: ({ column }) => (_jsx(DataTableColumnHeader, { column: column, title: i18n.messages.tabsPrimary.columns.allocations.pool })),
@@ -101,10 +107,13 @@ const allocationColumns = (i18n, pools, products, onView) => [
101
107
  {
102
108
  id: "view",
103
109
  header: i18n.messages.tabsPrimary.columns.allocations.view,
104
- cell: ({ row }) => (_jsxs(Button, { variant: "ghost", size: "sm", onClick: (event) => {
105
- event.stopPropagation();
106
- onView(row.original.id);
107
- }, children: [_jsx(ExternalLink, { className: "mr-2 h-4 w-4" }), i18n.messages.common.open] })),
110
+ cell: ({ row }) => (_jsxs("div", { className: "flex flex-wrap items-center gap-1", children: [_jsxs(Button, { variant: "ghost", size: "sm", onClick: (event) => {
111
+ event.stopPropagation();
112
+ onView(row.original.id);
113
+ }, children: [_jsx(ExternalLink, { className: "mr-2 h-4 w-4" }), i18n.messages.common.open] }), _jsxs(Button, { variant: "ghost", size: "sm", onClick: (event) => {
114
+ event.stopPropagation();
115
+ onEdit(row.original);
116
+ }, children: [_jsx(Pencil, { className: "mr-2 h-4 w-4" }), i18n.messages.common.edit] })] })),
108
117
  },
109
118
  ];
110
119
  export function ResourcesTab(props) {
@@ -112,7 +121,7 @@ export function ResourcesTab(props) {
112
121
  const m = i18n.messages;
113
122
  const section = m.tabsPrimary.sections.resources;
114
123
  const selection = m.common.selectionNouns.resource;
115
- return (_jsxs(TabsContent, { value: "resources", className: "space-y-4", children: [_jsx(ResourcesSectionHeader, { title: section.title, description: section.description, actionLabel: section.actionLabel, onAction: props.onCreate }), _jsx(DataTable, { columns: resourceColumns(i18n, props.suppliers, props.onOpenRoute), data: props.filteredResources, emptyMessage: section.emptyMessage, enableRowSelection: true, getRowId: (row) => row.id, rowSelection: props.resourceSelection, onRowSelectionChange: props.setResourceSelection, renderSelectionActions: ({ selectedRows, clearSelection }) => (_jsxs(SelectionActionBar, { selectedCount: selectedRows.length, onClear: clearSelection, clearLabel: m.common.clearSelection, selectionSummary: formatSelectionSummary(selectedRows.length, m.common.selectionSummary), children: [_jsx(ConfirmActionButton, { buttonLabel: section.actions.activate.buttonLabel, confirmLabel: section.actions.activate.confirmLabel, cancelLabel: m.common.cancel, title: formatMessage(section.actions.activate.title, {
124
+ return (_jsxs(TabsContent, { value: "resources", className: "space-y-4", children: [_jsx(ResourcesSectionHeader, { title: section.title, description: section.description, actionLabel: section.actionLabel, onAction: props.onCreate }), _jsx(DataTable, { columns: resourceColumns(i18n, props.suppliers, props.onOpenRoute, props.onEdit), data: props.filteredResources, emptyMessage: section.emptyMessage, enableRowSelection: true, getRowId: (row) => row.id, rowSelection: props.resourceSelection, onRowSelectionChange: props.setResourceSelection, renderSelectionActions: ({ selectedRows, clearSelection }) => (_jsxs(SelectionActionBar, { selectedCount: selectedRows.length, onClear: clearSelection, clearLabel: m.common.clearSelection, selectionSummary: formatSelectionSummary(selectedRows.length, m.common.selectionSummary), children: [_jsx(ConfirmActionButton, { buttonLabel: section.actions.activate.buttonLabel, confirmLabel: section.actions.activate.confirmLabel, cancelLabel: m.common.cancel, title: formatMessage(section.actions.activate.title, {
116
125
  selection: formatSelectionLabel(selectedRows.length, selection, m.common.selectionLabel),
117
126
  }), description: section.actions.activate.description, disabled: props.bulkActionTarget === "resources-activate", onConfirm: () => props.handleBulkUpdate({
118
127
  ids: selectedRows.map((row) => row.original.id),
@@ -150,7 +159,7 @@ export function PoolsTab(props) {
150
159
  const m = i18n.messages;
151
160
  const section = m.tabsPrimary.sections.pools;
152
161
  const selection = m.common.selectionNouns.pool;
153
- return (_jsxs(TabsContent, { value: "pools", className: "space-y-4", children: [_jsx(ResourcesSectionHeader, { title: section.title, description: section.description, actionLabel: section.actionLabel, onAction: props.onCreate }), _jsx(DataTable, { columns: poolColumns(i18n, props.products, props.onOpenRoute), data: props.filteredPools, emptyMessage: section.emptyMessage, enableRowSelection: true, getRowId: (row) => row.id, rowSelection: props.poolSelection, onRowSelectionChange: props.setPoolSelection, renderSelectionActions: ({ selectedRows, clearSelection }) => (_jsxs(SelectionActionBar, { selectedCount: selectedRows.length, onClear: clearSelection, clearLabel: m.common.clearSelection, selectionSummary: formatSelectionSummary(selectedRows.length, m.common.selectionSummary), children: [_jsx(ConfirmActionButton, { buttonLabel: section.actions.activate.buttonLabel, confirmLabel: section.actions.activate.confirmLabel, cancelLabel: m.common.cancel, title: formatMessage(section.actions.activate.title, {
162
+ return (_jsxs(TabsContent, { value: "pools", className: "space-y-4", children: [_jsx(ResourcesSectionHeader, { title: section.title, description: section.description, actionLabel: section.actionLabel, onAction: props.onCreate }), _jsx(DataTable, { columns: poolColumns(i18n, props.products, props.onOpenRoute, props.onEdit), data: props.filteredPools, emptyMessage: section.emptyMessage, enableRowSelection: true, getRowId: (row) => row.id, rowSelection: props.poolSelection, onRowSelectionChange: props.setPoolSelection, renderSelectionActions: ({ selectedRows, clearSelection }) => (_jsxs(SelectionActionBar, { selectedCount: selectedRows.length, onClear: clearSelection, clearLabel: m.common.clearSelection, selectionSummary: formatSelectionSummary(selectedRows.length, m.common.selectionSummary), children: [_jsx(ConfirmActionButton, { buttonLabel: section.actions.activate.buttonLabel, confirmLabel: section.actions.activate.confirmLabel, cancelLabel: m.common.cancel, title: formatMessage(section.actions.activate.title, {
154
163
  selection: formatSelectionLabel(selectedRows.length, selection, m.common.selectionLabel),
155
164
  }), description: section.actions.activate.description, disabled: props.bulkActionTarget === "pools-activate", onConfirm: () => props.handleBulkUpdate({
156
165
  ids: selectedRows.map((row) => row.original.id),
@@ -188,7 +197,7 @@ export function AllocationsTab(props) {
188
197
  const m = i18n.messages;
189
198
  const section = m.tabsPrimary.sections.allocations;
190
199
  const selection = m.common.selectionNouns.allocation;
191
- return (_jsxs(TabsContent, { value: "allocations", className: "space-y-4", children: [_jsx(ResourcesSectionHeader, { title: section.title, description: section.description, actionLabel: section.actionLabel, onAction: props.onCreate }), _jsx(DataTable, { columns: allocationColumns(i18n, props.pools, props.products, props.onOpenRoute), data: props.filteredAllocations, emptyMessage: section.emptyMessage, enableRowSelection: true, getRowId: (row) => row.id, rowSelection: props.allocationSelection, onRowSelectionChange: props.setAllocationSelection, renderSelectionActions: ({ selectedRows, clearSelection }) => (_jsx(SelectionActionBar, { selectedCount: selectedRows.length, onClear: clearSelection, clearLabel: m.common.clearSelection, selectionSummary: formatSelectionSummary(selectedRows.length, m.common.selectionSummary), children: _jsx(ConfirmActionButton, { buttonLabel: section.actions.delete.buttonLabel, confirmLabel: section.actions.delete.confirmLabel, cancelLabel: m.common.cancel, title: formatMessage(section.actions.delete.title, {
200
+ return (_jsxs(TabsContent, { value: "allocations", className: "space-y-4", children: [_jsx(ResourcesSectionHeader, { title: section.title, description: section.description, actionLabel: section.actionLabel, onAction: props.onCreate }), _jsx(DataTable, { columns: allocationColumns(i18n, props.pools, props.products, props.onOpenRoute, props.onEdit), data: props.filteredAllocations, emptyMessage: section.emptyMessage, enableRowSelection: true, getRowId: (row) => row.id, rowSelection: props.allocationSelection, onRowSelectionChange: props.setAllocationSelection, renderSelectionActions: ({ selectedRows, clearSelection }) => (_jsx(SelectionActionBar, { selectedCount: selectedRows.length, onClear: clearSelection, clearLabel: m.common.clearSelection, selectionSummary: formatSelectionSummary(selectedRows.length, m.common.selectionSummary), children: _jsx(ConfirmActionButton, { buttonLabel: section.actions.delete.buttonLabel, confirmLabel: section.actions.delete.confirmLabel, cancelLabel: m.common.cancel, title: formatMessage(section.actions.delete.title, {
192
201
  selection: formatSelectionLabel(selectedRows.length, selection, m.common.selectionLabel),
193
202
  }), description: section.actions.delete.description, disabled: props.bulkActionTarget === "allocations-delete", variant: "destructive", confirmVariant: "destructive", onConfirm: () => props.handleBulkDelete({
194
203
  ids: selectedRows.map((row) => row.original.id),
@@ -1,5 +1,5 @@
1
1
  import type { OnChangeFn, RowSelectionState } from "@tanstack/react-table";
2
- import { type BookingOption, type ResourceCloseoutRow, type ResourceRow, type ResourceSlotAssignmentRow, type SlotOption } from "../index.js";
2
+ import { type BookingOption, type ProductOption, type ResourceCloseoutRow, type ResourceRow, type ResourceSlotAssignmentRow, type SlotOption } from "../index.js";
3
3
  type BulkFn = (args: {
4
4
  ids: string[];
5
5
  endpoint: string;
@@ -20,6 +20,7 @@ type DeleteFn = (args: {
20
20
  }) => Promise<void>;
21
21
  export declare function AssignmentsTab(props: {
22
22
  slots: SlotOption[];
23
+ products?: ProductOption[];
23
24
  resources: ResourceRow[];
24
25
  bookings: BookingOption[];
25
26
  filteredAssignments: ResourceSlotAssignmentRow[];
@@ -1 +1 @@
1
- {"version":3,"file":"resources-tabs-secondary.d.ts","sourceRoot":"","sources":["../../../src/resources/components/resources-tabs-secondary.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAa,UAAU,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAA;AAmBrF,OAAO,EACL,KAAK,aAAa,EAElB,KAAK,mBAAmB,EACxB,KAAK,WAAW,EAChB,KAAK,yBAAyB,EAC9B,KAAK,UAAU,EAChB,MAAM,aAAa,CAAA;AAGpB,KAAK,MAAM,GAAG,CAAC,IAAI,EAAE;IACnB,GAAG,EAAE,MAAM,EAAE,CAAA;IACb,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,YAAY,EAAE,MAAM,CAAA;IACpB,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAChC,WAAW,EAAE,MAAM,CAAA;IACnB,cAAc,EAAE,MAAM,IAAI,CAAA;CAC3B,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;AAEnB,KAAK,QAAQ,GAAG,CAAC,IAAI,EAAE;IACrB,GAAG,EAAE,MAAM,EAAE,CAAA;IACb,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,YAAY,EAAE,MAAM,CAAA;IACpB,UAAU,EAAE,MAAM,CAAA;IAClB,cAAc,EAAE,MAAM,IAAI,CAAA;CAC3B,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;AAiKnB,wBAAgB,cAAc,CAAC,KAAK,EAAE;IACpC,KAAK,EAAE,UAAU,EAAE,CAAA;IACnB,SAAS,EAAE,WAAW,EAAE,CAAA;IACxB,QAAQ,EAAE,aAAa,EAAE,CAAA;IACzB,mBAAmB,EAAE,yBAAyB,EAAE,CAAA;IAChD,mBAAmB,EAAE,iBAAiB,CAAA;IACtC,sBAAsB,EAAE,UAAU,CAAC,iBAAiB,CAAC,CAAA;IACrD,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAA;IAC/B,gBAAgB,EAAE,MAAM,CAAA;IACxB,gBAAgB,EAAE,QAAQ,CAAA;IAC1B,QAAQ,EAAE,MAAM,IAAI,CAAA;IACpB,WAAW,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,IAAI,CAAA;IAC3C,MAAM,EAAE,CAAC,GAAG,EAAE,yBAAyB,KAAK,IAAI,CAAA;CACjD,+BA0HA;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE;IAClC,SAAS,EAAE,WAAW,EAAE,CAAA;IACxB,iBAAiB,EAAE,mBAAmB,EAAE,CAAA;IACxC,iBAAiB,EAAE,iBAAiB,CAAA;IACpC,oBAAoB,EAAE,UAAU,CAAC,iBAAiB,CAAC,CAAA;IACnD,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAA;IAC/B,gBAAgB,EAAE,QAAQ,CAAA;IAC1B,QAAQ,EAAE,MAAM,IAAI,CAAA;IACpB,MAAM,EAAE,CAAC,GAAG,EAAE,mBAAmB,KAAK,IAAI,CAAA;CAC3C,+BAgEA"}
1
+ {"version":3,"file":"resources-tabs-secondary.d.ts","sourceRoot":"","sources":["../../../src/resources/components/resources-tabs-secondary.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAa,UAAU,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAA;AAmBrF,OAAO,EACL,KAAK,aAAa,EAElB,KAAK,aAAa,EAClB,KAAK,mBAAmB,EACxB,KAAK,WAAW,EAChB,KAAK,yBAAyB,EAC9B,KAAK,UAAU,EAChB,MAAM,aAAa,CAAA;AAGpB,KAAK,MAAM,GAAG,CAAC,IAAI,EAAE;IACnB,GAAG,EAAE,MAAM,EAAE,CAAA;IACb,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,YAAY,EAAE,MAAM,CAAA;IACpB,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAChC,WAAW,EAAE,MAAM,CAAA;IACnB,cAAc,EAAE,MAAM,IAAI,CAAA;CAC3B,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;AAEnB,KAAK,QAAQ,GAAG,CAAC,IAAI,EAAE;IACrB,GAAG,EAAE,MAAM,EAAE,CAAA;IACb,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,YAAY,EAAE,MAAM,CAAA;IACpB,UAAU,EAAE,MAAM,CAAA;IAClB,cAAc,EAAE,MAAM,IAAI,CAAA;CAC3B,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;AAmMnB,wBAAgB,cAAc,CAAC,KAAK,EAAE;IACpC,KAAK,EAAE,UAAU,EAAE,CAAA;IACnB,QAAQ,CAAC,EAAE,aAAa,EAAE,CAAA;IAC1B,SAAS,EAAE,WAAW,EAAE,CAAA;IACxB,QAAQ,EAAE,aAAa,EAAE,CAAA;IACzB,mBAAmB,EAAE,yBAAyB,EAAE,CAAA;IAChD,mBAAmB,EAAE,iBAAiB,CAAA;IACtC,sBAAsB,EAAE,UAAU,CAAC,iBAAiB,CAAC,CAAA;IACrD,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAA;IAC/B,gBAAgB,EAAE,MAAM,CAAA;IACxB,gBAAgB,EAAE,QAAQ,CAAA;IAC1B,QAAQ,EAAE,MAAM,IAAI,CAAA;IACpB,WAAW,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,IAAI,CAAA;IAC3C,MAAM,EAAE,CAAC,GAAG,EAAE,yBAAyB,KAAK,IAAI,CAAA;CACjD,+BA6HA;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE;IAClC,SAAS,EAAE,WAAW,EAAE,CAAA;IACxB,iBAAiB,EAAE,mBAAmB,EAAE,CAAA;IACxC,iBAAiB,EAAE,iBAAiB,CAAA;IACpC,oBAAoB,EAAE,UAAU,CAAC,iBAAiB,CAAC,CAAA;IACnD,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAA;IAC/B,gBAAgB,EAAE,QAAQ,CAAA;IAC1B,QAAQ,EAAE,MAAM,IAAI,CAAA;IACpB,MAAM,EAAE,CAAC,GAAG,EAAE,mBAAmB,KAAK,IAAI,CAAA;CAC3C,+BAgEA"}