@voyantjs/bookings-ui 0.82.0 → 0.83.0

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.
@@ -32,12 +32,19 @@ export interface BookingPaymentsSummaryProps {
32
32
  * renders as plain text.
33
33
  */
34
34
  onInvoiceOpen?: (invoiceId: string, row: BookingPaymentsSummaryRow) => void;
35
+ /**
36
+ * Optional invoice href for hosts that navigate with route links
37
+ * instead of an in-place invoice panel.
38
+ */
39
+ getInvoiceHref?: (row: BookingPaymentsSummaryRow) => string;
35
40
  /**
36
41
  * Optional handler for the "View" action in the row menu. Consumers
37
42
  * typically call their router's navigate(). Middle-click isn't useful
38
43
  * on menu items, so this is a click handler rather than an href.
39
44
  */
40
45
  onViewPayment?: (row: BookingPaymentsSummaryRow) => void;
46
+ /** Convert a proforma invoice attached to the payment into a final invoice. */
47
+ onConvertProforma?: (row: BookingPaymentsSummaryRow) => Promise<unknown> | unknown;
41
48
  /** Edit handler — typically opens a dialog pre-filled with the row. */
42
49
  onEditPayment?: (row: BookingPaymentsSummaryRow) => void;
43
50
  /**
@@ -72,5 +79,5 @@ export interface BookingPaymentsSummaryProps {
72
79
  * first as the primary identifier — that's the difference between
73
80
  * "list of payments" and "list of invoice line-items".
74
81
  */
75
- export declare function BookingPaymentsSummary({ bookingId, variant, onInvoiceOpen, onViewPayment, onEditPayment, onDeletePayment, headerAction, }: BookingPaymentsSummaryProps): import("react/jsx-runtime").JSX.Element;
82
+ export declare function BookingPaymentsSummary({ bookingId, variant, onInvoiceOpen, getInvoiceHref, onViewPayment, onConvertProforma, onEditPayment, onDeletePayment, headerAction, }: BookingPaymentsSummaryProps): import("react/jsx-runtime").JSX.Element;
76
83
  //# sourceMappingURL=booking-payments-summary.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"booking-payments-summary.d.ts","sourceRoot":"","sources":["../../src/components/booking-payments-summary.tsx"],"names":[],"mappings":"AAGA,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,aAAa,EAGnB,MAAM,yBAAyB,CAAA;AAahC,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAK9B,MAAM,WAAW,yBAAyB;IACxC,EAAE,EAAE,MAAM,CAAA;IACV,SAAS,EAAE,MAAM,CAAA;IACjB,aAAa,EAAE,MAAM,CAAA;IACrB,WAAW,CAAC,EAAE,SAAS,GAAG,UAAU,GAAG,aAAa,CAAA;IACpD,WAAW,EAAE,MAAM,CAAA;IACnB,QAAQ,EAAE,MAAM,CAAA;IAChB,uEAAuE;IACvE,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC/B,MAAM,EAAE,aAAa,CAAA;IACrB,aAAa,EAAE,aAAa,CAAA;IAC5B,WAAW,EAAE,MAAM,CAAA;IACnB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAA;IAC9B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;CACrB;AAED,MAAM,WAAW,2BAA2B;IAC1C,SAAS,EAAE,MAAM,CAAA;IACjB;;;;;;OAMG;IACH,OAAO,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAA;IAC5B;;;;OAIG;IACH,aAAa,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,yBAAyB,KAAK,IAAI,CAAA;IAC3E;;;;OAIG;IACH,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE,yBAAyB,KAAK,IAAI,CAAA;IACxD,uEAAuE;IACvE,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE,yBAAyB,KAAK,IAAI,CAAA;IACxD;;;;OAIG;IACH,eAAe,CAAC,EAAE,CAAC,GAAG,EAAE,yBAAyB,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;IAC1E;;;;OAIG;IACH,YAAY,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;CAC/B;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,sBAAsB,CAAC,EACrC,SAAS,EACT,OAAkB,EAClB,aAAa,EACb,aAAa,EACb,aAAa,EACb,eAAe,EACf,YAAY,GACb,EAAE,2BAA2B,2CA4O7B"}
1
+ {"version":3,"file":"booking-payments-summary.d.ts","sourceRoot":"","sources":["../../src/components/booking-payments-summary.tsx"],"names":[],"mappings":"AAGA,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,aAAa,EAGnB,MAAM,yBAAyB,CAAA;AAahC,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAK9B,MAAM,WAAW,yBAAyB;IACxC,EAAE,EAAE,MAAM,CAAA;IACV,SAAS,EAAE,MAAM,CAAA;IACjB,aAAa,EAAE,MAAM,CAAA;IACrB,WAAW,CAAC,EAAE,SAAS,GAAG,UAAU,GAAG,aAAa,CAAA;IACpD,WAAW,EAAE,MAAM,CAAA;IACnB,QAAQ,EAAE,MAAM,CAAA;IAChB,uEAAuE;IACvE,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC/B,MAAM,EAAE,aAAa,CAAA;IACrB,aAAa,EAAE,aAAa,CAAA;IAC5B,WAAW,EAAE,MAAM,CAAA;IACnB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAA;IAC9B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;CACrB;AAED,MAAM,WAAW,2BAA2B;IAC1C,SAAS,EAAE,MAAM,CAAA;IACjB;;;;;;OAMG;IACH,OAAO,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAA;IAC5B;;;;OAIG;IACH,aAAa,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,yBAAyB,KAAK,IAAI,CAAA;IAC3E;;;OAGG;IACH,cAAc,CAAC,EAAE,CAAC,GAAG,EAAE,yBAAyB,KAAK,MAAM,CAAA;IAC3D;;;;OAIG;IACH,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE,yBAAyB,KAAK,IAAI,CAAA;IACxD,+EAA+E;IAC/E,iBAAiB,CAAC,EAAE,CAAC,GAAG,EAAE,yBAAyB,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAA;IAClF,uEAAuE;IACvE,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE,yBAAyB,KAAK,IAAI,CAAA;IACxD;;;;OAIG;IACH,eAAe,CAAC,EAAE,CAAC,GAAG,EAAE,yBAAyB,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;IAC1E;;;;OAIG;IACH,YAAY,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;CAC/B;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,sBAAsB,CAAC,EACrC,SAAS,EACT,OAAkB,EAClB,aAAa,EACb,cAAc,EACd,aAAa,EACb,iBAAiB,EACjB,aAAa,EACb,eAAe,EACf,YAAY,GACb,EAAE,2BAA2B,2CAwQ7B"}
@@ -27,7 +27,7 @@ import { StatusBadge } from "./status-badge.js";
27
27
  * first as the primary identifier — that's the difference between
28
28
  * "list of payments" and "list of invoice line-items".
29
29
  */
30
- export function BookingPaymentsSummary({ bookingId, variant = "public", onInvoiceOpen, onViewPayment, onEditPayment, onDeletePayment, headerAction, }) {
30
+ export function BookingPaymentsSummary({ bookingId, variant = "public", onInvoiceOpen, getInvoiceHref, onViewPayment, onConvertProforma, onEditPayment, onDeletePayment, headerAction, }) {
31
31
  const publicQuery = usePublicBookingPayments(bookingId, { enabled: variant === "public" });
32
32
  const adminQuery = useAdminBookingPayments(bookingId, { enabled: variant === "admin" });
33
33
  const data = variant === "admin" ? adminQuery.data : publicQuery.data;
@@ -35,7 +35,7 @@ export function BookingPaymentsSummary({ bookingId, variant = "public", onInvoic
35
35
  const messages = useBookingsUiMessagesOrDefault();
36
36
  const card = messages.bookingPaymentsSummary;
37
37
  const payments = data?.data?.payments ?? [];
38
- const showActionsColumn = Boolean(onViewPayment || onEditPayment || onDeletePayment);
38
+ const showActionsColumn = Boolean(onViewPayment || onConvertProforma || onEditPayment || onDeletePayment);
39
39
  const [deleteTarget, setDeleteTarget] = React.useState(null);
40
40
  const [deletePending, setDeletePending] = React.useState(false);
41
41
  const handleDeleteConfirm = async () => {
@@ -108,10 +108,18 @@ export function BookingPaymentsSummary({ bookingId, variant = "public", onInvoic
108
108
  {
109
109
  accessorKey: "invoiceNumber",
110
110
  header: card.columns.invoice,
111
- cell: ({ row }) => onInvoiceOpen ? (_jsxs("button", { type: "button", onClick: (e) => {
112
- e.stopPropagation();
113
- onInvoiceOpen(row.original.invoiceId, row.original);
114
- }, className: "inline-flex items-center gap-1 font-mono text-xs text-primary hover:underline", children: [row.original.invoiceNumber, _jsx(ArrowUpRight, { className: "h-3 w-3" })] })) : (_jsx("span", { className: "font-mono text-xs", children: row.original.invoiceNumber })),
111
+ cell: ({ row }) => {
112
+ if (onInvoiceOpen) {
113
+ return (_jsxs("button", { type: "button", onClick: (e) => {
114
+ e.stopPropagation();
115
+ onInvoiceOpen(row.original.invoiceId, row.original);
116
+ }, className: "inline-flex items-center gap-1 font-mono text-primary text-xs hover:underline", children: [row.original.invoiceNumber, _jsx(ArrowUpRight, { className: "h-3 w-3" })] }));
117
+ }
118
+ if (getInvoiceHref) {
119
+ return (_jsxs("a", { href: getInvoiceHref(row.original), onClick: (e) => e.stopPropagation(), className: "inline-flex items-center gap-1 font-mono text-primary text-xs hover:underline", children: [row.original.invoiceNumber, _jsx(ArrowUpRight, { className: "h-3 w-3" })] }));
120
+ }
121
+ return _jsx("span", { className: "font-mono text-xs", children: row.original.invoiceNumber });
122
+ },
115
123
  },
116
124
  ];
117
125
  if (showActionsColumn) {
@@ -121,6 +129,9 @@ export function BookingPaymentsSummary({ bookingId, variant = "public", onInvoic
121
129
  cell: ({ row }) => (_jsxs("div", { className: "flex items-center justify-end gap-1", children: [onViewPayment ? (_jsx(IconActionButton, { label: card.actions.view, icon: _jsx(Eye, { className: "h-3.5 w-3.5" }), onClick: (e) => {
122
130
  e.stopPropagation();
123
131
  onViewPayment(row.original);
132
+ } })) : null, onConvertProforma && row.original.invoiceType === "proforma" ? (_jsx(IconActionButton, { label: card.actions.convertToInvoice, icon: _jsx(ArrowUpRight, { className: "h-3.5 w-3.5" }), onClick: (e) => {
133
+ e.stopPropagation();
134
+ void onConvertProforma(row.original);
124
135
  } })) : null, onEditPayment ? (_jsx(IconActionButton, { label: card.actions.edit, icon: _jsx(Pencil, { className: "h-3.5 w-3.5" }), onClick: (e) => {
125
136
  e.stopPropagation();
126
137
  onEditPayment(row.original);
@@ -134,7 +145,9 @@ export function BookingPaymentsSummary({ bookingId, variant = "public", onInvoic
134
145
  }, [
135
146
  card,
136
147
  formatDateTime,
148
+ getInvoiceHref,
137
149
  onInvoiceOpen,
150
+ onConvertProforma,
138
151
  onDeletePayment,
139
152
  onEditPayment,
140
153
  onViewPayment,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@voyantjs/bookings-ui",
3
- "version": "0.82.0",
3
+ "version": "0.83.0",
4
4
  "license": "Apache-2.0",
5
5
  "repository": {
6
6
  "type": "git",
@@ -52,25 +52,25 @@
52
52
  "react-dom": "^19.0.0",
53
53
  "react-hook-form": "^7.60.0",
54
54
  "zod": "^4.3.6",
55
- "@voyantjs/availability-react": "0.82.0",
56
- "@voyantjs/bookings": "0.82.0",
57
- "@voyantjs/bookings-react": "0.82.0",
58
- "@voyantjs/catalog": "0.82.0",
59
- "@voyantjs/catalog-react": "0.82.0",
60
- "@voyantjs/crm-react": "0.82.0",
61
- "@voyantjs/crm-ui": "0.82.0",
62
- "@voyantjs/extras-react": "0.82.0",
63
- "@voyantjs/finance-react": "0.82.0",
64
- "@voyantjs/identity-react": "0.82.0",
65
- "@voyantjs/legal-react": "0.82.0",
66
- "@voyantjs/pricing-react": "0.82.0",
67
- "@voyantjs/products-react": "0.82.0",
68
- "@voyantjs/suppliers-react": "0.82.0",
69
- "@voyantjs/ui": "0.82.0"
55
+ "@voyantjs/availability-react": "0.83.0",
56
+ "@voyantjs/bookings": "0.83.0",
57
+ "@voyantjs/bookings-react": "0.83.0",
58
+ "@voyantjs/catalog": "0.83.0",
59
+ "@voyantjs/catalog-react": "0.83.0",
60
+ "@voyantjs/crm-react": "0.83.0",
61
+ "@voyantjs/crm-ui": "0.83.0",
62
+ "@voyantjs/extras-react": "0.83.0",
63
+ "@voyantjs/finance-react": "0.83.0",
64
+ "@voyantjs/identity-react": "0.83.0",
65
+ "@voyantjs/legal-react": "0.83.0",
66
+ "@voyantjs/pricing-react": "0.83.0",
67
+ "@voyantjs/products-react": "0.83.0",
68
+ "@voyantjs/suppliers-react": "0.83.0",
69
+ "@voyantjs/ui": "0.83.0"
70
70
  },
71
71
  "dependencies": {
72
72
  "sonner": "^2.0.7",
73
- "@voyantjs/i18n": "0.82.0"
73
+ "@voyantjs/i18n": "0.83.0"
74
74
  },
75
75
  "devDependencies": {
76
76
  "@tanstack/react-query": "^5.100.11",
@@ -85,21 +85,21 @@
85
85
  "typescript": "^6.0.2",
86
86
  "vitest": "^4.1.2",
87
87
  "zod": "^4.3.6",
88
- "@voyantjs/availability-react": "0.82.0",
89
- "@voyantjs/bookings": "0.82.0",
90
- "@voyantjs/bookings-react": "0.82.0",
91
- "@voyantjs/catalog": "0.82.0",
92
- "@voyantjs/catalog-react": "0.82.0",
93
- "@voyantjs/crm-react": "0.82.0",
94
- "@voyantjs/crm-ui": "0.82.0",
95
- "@voyantjs/extras-react": "0.82.0",
96
- "@voyantjs/finance-react": "0.82.0",
97
- "@voyantjs/identity-react": "0.82.0",
98
- "@voyantjs/legal-react": "0.82.0",
99
- "@voyantjs/pricing-react": "0.82.0",
100
- "@voyantjs/products-react": "0.82.0",
101
- "@voyantjs/suppliers-react": "0.82.0",
102
- "@voyantjs/ui": "0.82.0",
88
+ "@voyantjs/availability-react": "0.83.0",
89
+ "@voyantjs/bookings": "0.83.0",
90
+ "@voyantjs/bookings-react": "0.83.0",
91
+ "@voyantjs/catalog": "0.83.0",
92
+ "@voyantjs/catalog-react": "0.83.0",
93
+ "@voyantjs/crm-react": "0.83.0",
94
+ "@voyantjs/crm-ui": "0.83.0",
95
+ "@voyantjs/extras-react": "0.83.0",
96
+ "@voyantjs/finance-react": "0.83.0",
97
+ "@voyantjs/identity-react": "0.83.0",
98
+ "@voyantjs/legal-react": "0.83.0",
99
+ "@voyantjs/pricing-react": "0.83.0",
100
+ "@voyantjs/products-react": "0.83.0",
101
+ "@voyantjs/suppliers-react": "0.83.0",
102
+ "@voyantjs/ui": "0.83.0",
103
103
  "@voyantjs/voyant-typescript-config": "0.1.0"
104
104
  },
105
105
  "files": [