@burdenoff/microfe-subscriberbot 2026.827.1 → 2026.829.1
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.
- package/dist/subscriberbot/admin/AdminDashboardPage.d.ts.map +1 -1
- package/dist/subscriberbot/admin/AdminDashboardPage.js +80 -83
- package/dist/subscriberbot/admin/AdminDashboardPage.js.map +1 -1
- package/dist/subscriberbot/hooks/index.d.ts +1 -0
- package/dist/subscriberbot/hooks/index.d.ts.map +1 -1
- package/dist/subscriberbot/hooks/index.js +1 -0
- package/dist/subscriberbot/hooks/useTr.d.ts +17 -0
- package/dist/subscriberbot/hooks/useTr.d.ts.map +1 -0
- package/dist/subscriberbot/hooks/useTr.js +14 -0
- package/dist/subscriberbot/hooks/useTr.js.map +1 -0
- package/dist/subscriberbot/pages/AssetVaultPage.d.ts.map +1 -1
- package/dist/subscriberbot/pages/AssetVaultPage.js +111 -109
- package/dist/subscriberbot/pages/AssetVaultPage.js.map +1 -1
- package/dist/subscriberbot/pages/DashboardPage.d.ts.map +1 -1
- package/dist/subscriberbot/pages/DashboardPage.js +113 -105
- package/dist/subscriberbot/pages/DashboardPage.js.map +1 -1
- package/dist/subscriberbot/pages/InboxPage.d.ts.map +1 -1
- package/dist/subscriberbot/pages/InboxPage.js +404 -369
- package/dist/subscriberbot/pages/InboxPage.js.map +1 -1
- package/dist/subscriberbot/pages/InsightsPage.d.ts.map +1 -1
- package/dist/subscriberbot/pages/InsightsPage.js +94 -93
- package/dist/subscriberbot/pages/InsightsPage.js.map +1 -1
- package/dist/subscriberbot/pages/InvoicesPage.d.ts.map +1 -1
- package/dist/subscriberbot/pages/InvoicesPage.js +360 -366
- package/dist/subscriberbot/pages/InvoicesPage.js.map +1 -1
- package/dist/subscriberbot/pages/WorkflowsPage.d.ts.map +1 -1
- package/dist/subscriberbot/pages/WorkflowsPage.js +209 -193
- package/dist/subscriberbot/pages/WorkflowsPage.js.map +1 -1
- package/dist/subscriberbot/pages/agents/AgentDetailPage.d.ts.map +1 -1
- package/dist/subscriberbot/pages/agents/AgentDetailPage.js +268 -236
- package/dist/subscriberbot/pages/agents/AgentDetailPage.js.map +1 -1
- package/dist/subscriberbot/pages/agents/AgentNewPage.d.ts.map +1 -1
- package/dist/subscriberbot/pages/agents/AgentNewPage.js +96 -76
- package/dist/subscriberbot/pages/agents/AgentNewPage.js.map +1 -1
- package/dist/subscriberbot/pages/agents/AgentsListPage.d.ts.map +1 -1
- package/dist/subscriberbot/pages/agents/AgentsListPage.js +145 -161
- package/dist/subscriberbot/pages/agents/AgentsListPage.js.map +1 -1
- package/dist/subscriberbot/pages/providers/ProviderDetailPage.d.ts.map +1 -1
- package/dist/subscriberbot/pages/providers/ProviderDetailPage.js +514 -441
- package/dist/subscriberbot/pages/providers/ProviderDetailPage.js.map +1 -1
- package/dist/subscriberbot/pages/providers/ProviderNewPage.d.ts.map +1 -1
- package/dist/subscriberbot/pages/providers/ProviderNewPage.js +167 -129
- package/dist/subscriberbot/pages/providers/ProviderNewPage.js.map +1 -1
- package/dist/subscriberbot/pages/providers/ProvidersListPage.d.ts.map +1 -1
- package/dist/subscriberbot/pages/providers/ProvidersListPage.js +171 -218
- package/dist/subscriberbot/pages/providers/ProvidersListPage.js.map +1 -1
- package/dist/subscriberbot/pages/relationships/RelationshipDetailPage.d.ts.map +1 -1
- package/dist/subscriberbot/pages/relationships/RelationshipDetailPage.js +340 -279
- package/dist/subscriberbot/pages/relationships/RelationshipDetailPage.js.map +1 -1
- package/dist/subscriberbot/pages/relationships/RelationshipNewPage.d.ts.map +1 -1
- package/dist/subscriberbot/pages/relationships/RelationshipNewPage.js +185 -166
- package/dist/subscriberbot/pages/relationships/RelationshipNewPage.js.map +1 -1
- package/dist/subscriberbot/pages/relationships/RelationshipsListPage.d.ts.map +1 -1
- package/dist/subscriberbot/pages/relationships/RelationshipsListPage.js +153 -182
- package/dist/subscriberbot/pages/relationships/RelationshipsListPage.js.map +1 -1
- package/package.json +1 -1
|
@@ -8,10 +8,11 @@ import { ErrorView as l, LoadingView as u, Section as d } from "../../components
|
|
|
8
8
|
import { Gauge as f, MiniProgress as p, Timeline as m } from "../../components/viz.js";
|
|
9
9
|
import "../../components/index.js";
|
|
10
10
|
import { useCancelRelationship as h, useCreateAsset as g, useCreateEntitlement as _, useFileDownloadUrl as v, usePlans as y, useProviders as b, useRelationship as x, useTransitionRelationship as S, useUpdateRelationship as C, useUploadFile as w } from "../../hooks/useSubscriberBotApi.js";
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
11
|
+
import { useTr as T } from "../../hooks/useTr.js";
|
|
12
|
+
import { useState as E } from "react";
|
|
13
|
+
import { Activity as D, ArrowLeft as O, Ban as k, CalendarClock as A, CreditCard as j, Download as M, Paperclip as N, Pause as P, Pencil as F, Play as I, Plus as L, ShieldCheck as R, Tag as ee, Wallet as te } from "lucide-react";
|
|
13
14
|
import { useParams as ne } from "react-router";
|
|
14
|
-
import { Fragment as
|
|
15
|
+
import { Fragment as re, jsx as z, jsxs as B } from "react/jsx-runtime";
|
|
15
16
|
import { GlassCard as V } from "@burdenoff/fe-libs/ui";
|
|
16
17
|
//#region src/subscriberbot/pages/relationships/RelationshipDetailPage.tsx
|
|
17
18
|
var H = "w-full rounded-lg border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]", U = "mb-1 block text-xs font-medium text-text-secondary", W = [
|
|
@@ -39,21 +40,33 @@ var H = "w-full rounded-lg border border-border-subtle bg-bg-surface px-3 py-2 t
|
|
|
39
40
|
"CERTIFICATE",
|
|
40
41
|
"WARRANTY",
|
|
41
42
|
"DOMAIN"
|
|
42
|
-
], q =
|
|
43
|
+
], q = {
|
|
44
|
+
SUBSCRIPTION: "relationships.kinds.subscription",
|
|
45
|
+
MEMBERSHIP: "relationships.kinds.membership",
|
|
46
|
+
LICENSE: "relationships.kinds.license",
|
|
47
|
+
CONTRACT: "relationships.kinds.contract",
|
|
48
|
+
NEWSLETTER: "relationships.kinds.newsletter",
|
|
49
|
+
RECURRING_PAYMENT: "relationships.kinds.recurringPayment",
|
|
50
|
+
ENROLLMENT: "relationships.kinds.enrollment",
|
|
51
|
+
TRIAL: "relationships.kinds.trial"
|
|
52
|
+
}, ie = [
|
|
43
53
|
{
|
|
44
54
|
status: "ACTIVE",
|
|
45
|
-
|
|
46
|
-
|
|
55
|
+
labelKey: "relationships.detail.actions.activate",
|
|
56
|
+
defaultLabel: "Activate",
|
|
57
|
+
icon: I
|
|
47
58
|
},
|
|
48
59
|
{
|
|
49
60
|
status: "PAUSED",
|
|
50
|
-
|
|
51
|
-
|
|
61
|
+
labelKey: "relationships.detail.actions.pause",
|
|
62
|
+
defaultLabel: "Pause",
|
|
63
|
+
icon: P
|
|
52
64
|
},
|
|
53
65
|
{
|
|
54
66
|
status: "EXPIRED",
|
|
55
|
-
|
|
56
|
-
|
|
67
|
+
labelKey: "relationships.detail.actions.markExpired",
|
|
68
|
+
defaultLabel: "Mark expired",
|
|
69
|
+
icon: k
|
|
57
70
|
}
|
|
58
71
|
];
|
|
59
72
|
function J({ label: e, value: t }) {
|
|
@@ -68,7 +81,7 @@ function J({ label: e, value: t }) {
|
|
|
68
81
|
})]
|
|
69
82
|
});
|
|
70
83
|
}
|
|
71
|
-
function
|
|
84
|
+
function ae(e) {
|
|
72
85
|
return e == null ? "accent" : e >= 66 ? "positive" : e >= 33 ? "warning" : "negative";
|
|
73
86
|
}
|
|
74
87
|
function Y(e) {
|
|
@@ -76,62 +89,66 @@ function Y(e) {
|
|
|
76
89
|
let t = new Date(e);
|
|
77
90
|
return Number.isNaN(t.getTime()) ? "" : t.toISOString().slice(0, 10);
|
|
78
91
|
}
|
|
79
|
-
function
|
|
80
|
-
let n =
|
|
92
|
+
function oe({ relationship: e, onClose: t }) {
|
|
93
|
+
let n = T(), r = C(), i = b({ pagination: {
|
|
81
94
|
limit: 100,
|
|
82
95
|
offset: 0
|
|
83
|
-
} }), [
|
|
84
|
-
let t =
|
|
96
|
+
} }), [a, o] = E(e.label), [s, l] = E(e.providerId ?? ""), [u, d] = E(e.planId ?? ""), [f, p] = E(String(e.amount ?? "")), [m, h] = E(e.currency), [g, _] = E(e.interval), [v, x] = E(Y(e.renewsAt)), [S, w] = E(e.autoRenew), [D, O] = E(e.healthScore == null ? "" : String(e.healthScore)), [k, A] = E(e.notes ?? ""), [j, M] = E(null), N = y(s || void 0), P = (() => {
|
|
97
|
+
let t = i.data?.items ?? [];
|
|
85
98
|
return e.provider && !t.some((t) => t.id === e.provider?.id) ? [e.provider, ...t] : t;
|
|
86
|
-
})(),
|
|
99
|
+
})(), F = N.data ?? [];
|
|
87
100
|
return /* @__PURE__ */ z(c, {
|
|
88
|
-
title: "Edit relationship",
|
|
101
|
+
title: n("relationships.detail.editModal.title", "Edit relationship"),
|
|
89
102
|
onClose: t,
|
|
90
103
|
maxWidthClassName: "max-w-2xl",
|
|
91
104
|
children: /* @__PURE__ */ B("form", {
|
|
92
|
-
onSubmit: (
|
|
93
|
-
if (
|
|
94
|
-
|
|
105
|
+
onSubmit: (i) => {
|
|
106
|
+
if (i.preventDefault(), M(null), !a.trim()) {
|
|
107
|
+
M(n("relationships.detail.editModal.labelRequired", "A label is required."));
|
|
95
108
|
return;
|
|
96
109
|
}
|
|
97
|
-
let
|
|
98
|
-
label:
|
|
99
|
-
interval:
|
|
100
|
-
autoRenew:
|
|
101
|
-
currency:
|
|
102
|
-
notes:
|
|
103
|
-
...
|
|
104
|
-
...
|
|
105
|
-
...
|
|
106
|
-
...
|
|
107
|
-
...
|
|
110
|
+
let o = {
|
|
111
|
+
label: a.trim(),
|
|
112
|
+
interval: g,
|
|
113
|
+
autoRenew: S,
|
|
114
|
+
currency: m.trim() || "USD",
|
|
115
|
+
notes: k.trim(),
|
|
116
|
+
...s ? { providerId: s } : {},
|
|
117
|
+
...u ? { planId: u } : {},
|
|
118
|
+
...f.trim() ? { amount: Number(f) } : {},
|
|
119
|
+
...D.trim() ? { healthScore: Number(D) } : {},
|
|
120
|
+
...v ? { renewsAt: new Date(v).toISOString() } : {}
|
|
108
121
|
};
|
|
109
|
-
|
|
122
|
+
r.mutate({
|
|
110
123
|
id: e.id,
|
|
111
|
-
input:
|
|
124
|
+
input: o
|
|
112
125
|
}, {
|
|
113
126
|
onSuccess: () => t(),
|
|
114
|
-
onError: (e) =>
|
|
127
|
+
onError: (e) => M(e instanceof Error ? e.message : n("relationships.detail.editModal.error", "Could not update relationship."))
|
|
115
128
|
});
|
|
116
129
|
},
|
|
117
130
|
className: "space-y-4",
|
|
118
131
|
children: [
|
|
119
|
-
|
|
132
|
+
j && /* @__PURE__ */ z("div", {
|
|
120
133
|
className: "rounded-lg border border-status-error-text/30 bg-status-error-bg-subtle px-4 py-2 text-sm text-status-error-text",
|
|
121
|
-
children:
|
|
134
|
+
children: j
|
|
122
135
|
}),
|
|
123
136
|
/* @__PURE__ */ B("div", { children: [/* @__PURE__ */ B("label", {
|
|
124
137
|
htmlFor: "edit-label",
|
|
125
138
|
className: U,
|
|
126
|
-
children: [
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
139
|
+
children: [
|
|
140
|
+
n("relationships.detail.editModal.labelLabel", "Label"),
|
|
141
|
+
" ",
|
|
142
|
+
/* @__PURE__ */ z("span", {
|
|
143
|
+
className: "text-status-error-text",
|
|
144
|
+
children: "*"
|
|
145
|
+
})
|
|
146
|
+
]
|
|
130
147
|
}), /* @__PURE__ */ z("input", {
|
|
131
148
|
id: "edit-label",
|
|
132
149
|
type: "text",
|
|
133
|
-
value:
|
|
134
|
-
onChange: (e) =>
|
|
150
|
+
value: a,
|
|
151
|
+
onChange: (e) => o(e.target.value),
|
|
135
152
|
className: H,
|
|
136
153
|
required: !0
|
|
137
154
|
})] }),
|
|
@@ -140,35 +157,35 @@ function ie({ relationship: e, onClose: t }) {
|
|
|
140
157
|
children: [/* @__PURE__ */ B("div", { children: [/* @__PURE__ */ z("label", {
|
|
141
158
|
htmlFor: "edit-provider",
|
|
142
159
|
className: U,
|
|
143
|
-
children: "Provider"
|
|
160
|
+
children: n("relationships.detail.editModal.providerLabel", "Provider")
|
|
144
161
|
}), /* @__PURE__ */ B("select", {
|
|
145
162
|
id: "edit-provider",
|
|
146
|
-
value:
|
|
163
|
+
value: s,
|
|
147
164
|
onChange: (e) => {
|
|
148
|
-
|
|
165
|
+
l(e.target.value), d("");
|
|
149
166
|
},
|
|
150
167
|
className: H,
|
|
151
168
|
children: [/* @__PURE__ */ z("option", {
|
|
152
169
|
value: "",
|
|
153
|
-
children: "— None —"
|
|
154
|
-
}),
|
|
170
|
+
children: n("relationships.detail.editModal.providerNone", "— None —")
|
|
171
|
+
}), P.map((e) => /* @__PURE__ */ z("option", {
|
|
155
172
|
value: e.id,
|
|
156
173
|
children: e.name
|
|
157
174
|
}, e.id))]
|
|
158
175
|
})] }), /* @__PURE__ */ B("div", { children: [/* @__PURE__ */ z("label", {
|
|
159
176
|
htmlFor: "edit-plan",
|
|
160
177
|
className: U,
|
|
161
|
-
children: "Plan"
|
|
178
|
+
children: n("relationships.detail.editModal.planLabel", "Plan")
|
|
162
179
|
}), /* @__PURE__ */ B("select", {
|
|
163
180
|
id: "edit-plan",
|
|
164
|
-
value:
|
|
165
|
-
onChange: (e) =>
|
|
181
|
+
value: u,
|
|
182
|
+
onChange: (e) => d(e.target.value),
|
|
166
183
|
className: H,
|
|
167
|
-
disabled: !
|
|
184
|
+
disabled: !s || F.length === 0,
|
|
168
185
|
children: [/* @__PURE__ */ z("option", {
|
|
169
186
|
value: "",
|
|
170
|
-
children: "— None —"
|
|
171
|
-
}),
|
|
187
|
+
children: n("relationships.detail.editModal.planNone", "— None —")
|
|
188
|
+
}), F.map((e) => /* @__PURE__ */ z("option", {
|
|
172
189
|
value: e.id,
|
|
173
190
|
children: e.name
|
|
174
191
|
}, e.id))]
|
|
@@ -180,36 +197,36 @@ function ie({ relationship: e, onClose: t }) {
|
|
|
180
197
|
/* @__PURE__ */ B("div", { children: [/* @__PURE__ */ z("label", {
|
|
181
198
|
htmlFor: "edit-amount",
|
|
182
199
|
className: U,
|
|
183
|
-
children: "Amount"
|
|
200
|
+
children: n("relationships.detail.editModal.amountLabel", "Amount")
|
|
184
201
|
}), /* @__PURE__ */ z("input", {
|
|
185
202
|
id: "edit-amount",
|
|
186
203
|
type: "number",
|
|
187
204
|
min: "0",
|
|
188
205
|
step: "0.01",
|
|
189
|
-
value:
|
|
190
|
-
onChange: (e) =>
|
|
206
|
+
value: f,
|
|
207
|
+
onChange: (e) => p(e.target.value),
|
|
191
208
|
className: H
|
|
192
209
|
})] }),
|
|
193
210
|
/* @__PURE__ */ B("div", { children: [/* @__PURE__ */ z("label", {
|
|
194
211
|
htmlFor: "edit-currency",
|
|
195
212
|
className: U,
|
|
196
|
-
children: "Currency"
|
|
213
|
+
children: n("relationships.detail.editModal.currencyLabel", "Currency")
|
|
197
214
|
}), /* @__PURE__ */ z("input", {
|
|
198
215
|
id: "edit-currency",
|
|
199
216
|
type: "text",
|
|
200
|
-
value:
|
|
201
|
-
onChange: (e) =>
|
|
217
|
+
value: m,
|
|
218
|
+
onChange: (e) => h(e.target.value.toUpperCase()),
|
|
202
219
|
maxLength: 3,
|
|
203
220
|
className: H
|
|
204
221
|
})] }),
|
|
205
222
|
/* @__PURE__ */ B("div", { children: [/* @__PURE__ */ z("label", {
|
|
206
223
|
htmlFor: "edit-interval",
|
|
207
224
|
className: U,
|
|
208
|
-
children: "Billing interval"
|
|
225
|
+
children: n("relationships.detail.editModal.intervalLabel", "Billing interval")
|
|
209
226
|
}), /* @__PURE__ */ z("select", {
|
|
210
227
|
id: "edit-interval",
|
|
211
|
-
value:
|
|
212
|
-
onChange: (e) =>
|
|
228
|
+
value: g,
|
|
229
|
+
onChange: (e) => _(e.target.value),
|
|
213
230
|
className: H,
|
|
214
231
|
children: W.map((e) => /* @__PURE__ */ z("option", {
|
|
215
232
|
value: e,
|
|
@@ -224,25 +241,25 @@ function ie({ relationship: e, onClose: t }) {
|
|
|
224
241
|
/* @__PURE__ */ B("div", { children: [/* @__PURE__ */ z("label", {
|
|
225
242
|
htmlFor: "edit-renews",
|
|
226
243
|
className: U,
|
|
227
|
-
children: "Renews on"
|
|
244
|
+
children: n("relationships.detail.editModal.renewsOnLabel", "Renews on")
|
|
228
245
|
}), /* @__PURE__ */ z("input", {
|
|
229
246
|
id: "edit-renews",
|
|
230
247
|
type: "date",
|
|
231
|
-
value:
|
|
232
|
-
onChange: (e) =>
|
|
248
|
+
value: v,
|
|
249
|
+
onChange: (e) => x(e.target.value),
|
|
233
250
|
className: H
|
|
234
251
|
})] }),
|
|
235
252
|
/* @__PURE__ */ B("div", { children: [/* @__PURE__ */ z("label", {
|
|
236
253
|
htmlFor: "edit-health",
|
|
237
254
|
className: U,
|
|
238
|
-
children: "Health score (0–100)"
|
|
255
|
+
children: n("relationships.detail.editModal.healthScoreLabel", "Health score (0–100)")
|
|
239
256
|
}), /* @__PURE__ */ z("input", {
|
|
240
257
|
id: "edit-health",
|
|
241
258
|
type: "number",
|
|
242
259
|
min: "0",
|
|
243
260
|
max: "100",
|
|
244
|
-
value:
|
|
245
|
-
onChange: (e) =>
|
|
261
|
+
value: D,
|
|
262
|
+
onChange: (e) => O(e.target.value),
|
|
246
263
|
className: H
|
|
247
264
|
})] }),
|
|
248
265
|
/* @__PURE__ */ z("div", {
|
|
@@ -251,10 +268,10 @@ function ie({ relationship: e, onClose: t }) {
|
|
|
251
268
|
className: "flex items-center gap-2 text-sm text-text-primary",
|
|
252
269
|
children: [/* @__PURE__ */ z("input", {
|
|
253
270
|
type: "checkbox",
|
|
254
|
-
checked:
|
|
255
|
-
onChange: (e) =>
|
|
271
|
+
checked: S,
|
|
272
|
+
onChange: (e) => w(e.target.checked),
|
|
256
273
|
className: "size-4 rounded border-border-subtle"
|
|
257
|
-
}), "Auto-renews"]
|
|
274
|
+
}), n("relationships.detail.editModal.autoRenews", "Auto-renews")]
|
|
258
275
|
})
|
|
259
276
|
})
|
|
260
277
|
]
|
|
@@ -262,11 +279,11 @@ function ie({ relationship: e, onClose: t }) {
|
|
|
262
279
|
/* @__PURE__ */ B("div", { children: [/* @__PURE__ */ z("label", {
|
|
263
280
|
htmlFor: "edit-notes",
|
|
264
281
|
className: U,
|
|
265
|
-
children: "Notes"
|
|
282
|
+
children: n("relationships.detail.editModal.notesLabel", "Notes")
|
|
266
283
|
}), /* @__PURE__ */ z("textarea", {
|
|
267
284
|
id: "edit-notes",
|
|
268
|
-
value:
|
|
269
|
-
onChange: (e) =>
|
|
285
|
+
value: k,
|
|
286
|
+
onChange: (e) => A(e.target.value),
|
|
270
287
|
rows: 3,
|
|
271
288
|
className: H
|
|
272
289
|
})] }),
|
|
@@ -276,60 +293,64 @@ function ie({ relationship: e, onClose: t }) {
|
|
|
276
293
|
type: "button",
|
|
277
294
|
onClick: t,
|
|
278
295
|
className: "rounded-lg border border-border-subtle px-4 py-2 text-sm font-medium text-text-primary hover:bg-bg-sunken",
|
|
279
|
-
children: "Cancel"
|
|
296
|
+
children: n("relationships.detail.editModal.cancel", "Cancel")
|
|
280
297
|
}), /* @__PURE__ */ z("button", {
|
|
281
298
|
type: "submit",
|
|
282
|
-
disabled:
|
|
299
|
+
disabled: r.isPending,
|
|
283
300
|
className: "rounded-lg bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text hover:opacity-90 disabled:opacity-50",
|
|
284
|
-
children:
|
|
301
|
+
children: r.isPending ? n("relationships.detail.editModal.saving", "Saving…") : n("relationships.detail.editModal.submit", "Save changes")
|
|
285
302
|
})]
|
|
286
303
|
})
|
|
287
304
|
]
|
|
288
305
|
})
|
|
289
306
|
});
|
|
290
307
|
}
|
|
291
|
-
function
|
|
292
|
-
let n = _(), [
|
|
308
|
+
function se({ relationshipId: e, onClose: t }) {
|
|
309
|
+
let n = T(), r = _(), [i, a] = E(""), [o, s] = E("FEATURE_ACCESS"), [l, u] = E(""), [d, f] = E(""), [p, m] = E(""), [h, g] = E(null);
|
|
293
310
|
return /* @__PURE__ */ z(c, {
|
|
294
|
-
title: "Add entitlement",
|
|
311
|
+
title: n("relationships.detail.addEntitlementModal.title", "Add entitlement"),
|
|
295
312
|
onClose: t,
|
|
296
313
|
children: /* @__PURE__ */ B("form", {
|
|
297
|
-
onSubmit: (
|
|
298
|
-
if (
|
|
299
|
-
|
|
314
|
+
onSubmit: (a) => {
|
|
315
|
+
if (a.preventDefault(), g(null), !i.trim()) {
|
|
316
|
+
g(n("relationships.detail.addEntitlementModal.nameRequired", "An entitlement name is required."));
|
|
300
317
|
return;
|
|
301
318
|
}
|
|
302
|
-
|
|
319
|
+
r.mutate({
|
|
303
320
|
relationshipId: e,
|
|
304
|
-
name:
|
|
305
|
-
type:
|
|
306
|
-
...
|
|
307
|
-
...
|
|
308
|
-
...
|
|
321
|
+
name: i.trim(),
|
|
322
|
+
type: o,
|
|
323
|
+
...l.trim() ? { quota: Number(l) } : {},
|
|
324
|
+
...d.trim() ? { unit: d.trim() } : {},
|
|
325
|
+
...p.trim() ? { description: p.trim() } : {}
|
|
309
326
|
}, {
|
|
310
327
|
onSuccess: () => t(),
|
|
311
|
-
onError: (e) =>
|
|
328
|
+
onError: (e) => g(e instanceof Error ? e.message : n("relationships.detail.addEntitlementModal.error", "Could not add entitlement."))
|
|
312
329
|
});
|
|
313
330
|
},
|
|
314
331
|
className: "space-y-4",
|
|
315
332
|
children: [
|
|
316
|
-
|
|
333
|
+
h && /* @__PURE__ */ z("div", {
|
|
317
334
|
className: "rounded-lg border border-status-error-text/30 bg-status-error-bg-subtle px-4 py-2 text-sm text-status-error-text",
|
|
318
|
-
children:
|
|
335
|
+
children: h
|
|
319
336
|
}),
|
|
320
337
|
/* @__PURE__ */ B("div", { children: [/* @__PURE__ */ B("label", {
|
|
321
338
|
htmlFor: "ent-name",
|
|
322
339
|
className: U,
|
|
323
|
-
children: [
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
340
|
+
children: [
|
|
341
|
+
n("relationships.detail.addEntitlementModal.nameLabel", "Name"),
|
|
342
|
+
" ",
|
|
343
|
+
/* @__PURE__ */ z("span", {
|
|
344
|
+
className: "text-status-error-text",
|
|
345
|
+
children: "*"
|
|
346
|
+
})
|
|
347
|
+
]
|
|
327
348
|
}), /* @__PURE__ */ z("input", {
|
|
328
349
|
id: "ent-name",
|
|
329
350
|
type: "text",
|
|
330
|
-
value:
|
|
331
|
-
onChange: (e) =>
|
|
332
|
-
placeholder: "e.g. Seats, API calls, Priority support",
|
|
351
|
+
value: i,
|
|
352
|
+
onChange: (e) => a(e.target.value),
|
|
353
|
+
placeholder: n("relationships.detail.addEntitlementModal.namePlaceholder", "e.g. Seats, API calls, Priority support"),
|
|
333
354
|
className: H,
|
|
334
355
|
required: !0
|
|
335
356
|
})] }),
|
|
@@ -339,11 +360,11 @@ function ae({ relationshipId: e, onClose: t }) {
|
|
|
339
360
|
/* @__PURE__ */ B("div", { children: [/* @__PURE__ */ z("label", {
|
|
340
361
|
htmlFor: "ent-type",
|
|
341
362
|
className: U,
|
|
342
|
-
children: "Type"
|
|
363
|
+
children: n("relationships.detail.addEntitlementModal.typeLabel", "Type")
|
|
343
364
|
}), /* @__PURE__ */ z("select", {
|
|
344
365
|
id: "ent-type",
|
|
345
|
-
value:
|
|
346
|
-
onChange: (e) =>
|
|
366
|
+
value: o,
|
|
367
|
+
onChange: (e) => s(e.target.value),
|
|
347
368
|
className: H,
|
|
348
369
|
children: G.map((e) => /* @__PURE__ */ z("option", {
|
|
349
370
|
value: e,
|
|
@@ -353,26 +374,26 @@ function ae({ relationshipId: e, onClose: t }) {
|
|
|
353
374
|
/* @__PURE__ */ B("div", { children: [/* @__PURE__ */ z("label", {
|
|
354
375
|
htmlFor: "ent-quota",
|
|
355
376
|
className: U,
|
|
356
|
-
children: "Quota"
|
|
377
|
+
children: n("relationships.detail.addEntitlementModal.quotaLabel", "Quota")
|
|
357
378
|
}), /* @__PURE__ */ z("input", {
|
|
358
379
|
id: "ent-quota",
|
|
359
380
|
type: "number",
|
|
360
381
|
min: "0",
|
|
361
|
-
value:
|
|
362
|
-
onChange: (e) =>
|
|
363
|
-
placeholder: "e.g. 5",
|
|
382
|
+
value: l,
|
|
383
|
+
onChange: (e) => u(e.target.value),
|
|
384
|
+
placeholder: n("relationships.detail.addEntitlementModal.quotaPlaceholder", "e.g. 5"),
|
|
364
385
|
className: H
|
|
365
386
|
})] }),
|
|
366
387
|
/* @__PURE__ */ B("div", { children: [/* @__PURE__ */ z("label", {
|
|
367
388
|
htmlFor: "ent-unit",
|
|
368
389
|
className: U,
|
|
369
|
-
children: "Unit"
|
|
390
|
+
children: n("relationships.detail.addEntitlementModal.unitLabel", "Unit")
|
|
370
391
|
}), /* @__PURE__ */ z("input", {
|
|
371
392
|
id: "ent-unit",
|
|
372
393
|
type: "text",
|
|
373
|
-
value:
|
|
374
|
-
onChange: (e) =>
|
|
375
|
-
placeholder: "e.g. seats, GB",
|
|
394
|
+
value: d,
|
|
395
|
+
onChange: (e) => f(e.target.value),
|
|
396
|
+
placeholder: n("relationships.detail.addEntitlementModal.unitPlaceholder", "e.g. seats, GB"),
|
|
376
397
|
className: H
|
|
377
398
|
})] })
|
|
378
399
|
]
|
|
@@ -380,11 +401,11 @@ function ae({ relationshipId: e, onClose: t }) {
|
|
|
380
401
|
/* @__PURE__ */ B("div", { children: [/* @__PURE__ */ z("label", {
|
|
381
402
|
htmlFor: "ent-desc",
|
|
382
403
|
className: U,
|
|
383
|
-
children: "Description"
|
|
404
|
+
children: n("relationships.detail.addEntitlementModal.descriptionLabel", "Description")
|
|
384
405
|
}), /* @__PURE__ */ z("textarea", {
|
|
385
406
|
id: "ent-desc",
|
|
386
|
-
value:
|
|
387
|
-
onChange: (e) =>
|
|
407
|
+
value: p,
|
|
408
|
+
onChange: (e) => m(e.target.value),
|
|
388
409
|
rows: 2,
|
|
389
410
|
className: H
|
|
390
411
|
})] }),
|
|
@@ -394,69 +415,73 @@ function ae({ relationshipId: e, onClose: t }) {
|
|
|
394
415
|
type: "button",
|
|
395
416
|
onClick: t,
|
|
396
417
|
className: "rounded-lg border border-border-subtle px-4 py-2 text-sm font-medium text-text-primary hover:bg-bg-sunken",
|
|
397
|
-
children: "Cancel"
|
|
418
|
+
children: n("relationships.detail.addEntitlementModal.cancel", "Cancel")
|
|
398
419
|
}), /* @__PURE__ */ z("button", {
|
|
399
420
|
type: "submit",
|
|
400
|
-
disabled:
|
|
421
|
+
disabled: r.isPending,
|
|
401
422
|
className: "rounded-lg bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text hover:opacity-90 disabled:opacity-50",
|
|
402
|
-
children:
|
|
423
|
+
children: r.isPending ? n("relationships.detail.addEntitlementModal.adding", "Adding…") : n("relationships.detail.addEntitlementModal.submit", "Add entitlement")
|
|
403
424
|
})]
|
|
404
425
|
})
|
|
405
426
|
]
|
|
406
427
|
})
|
|
407
428
|
});
|
|
408
429
|
}
|
|
409
|
-
function
|
|
410
|
-
let n = g(), { uploadFile:
|
|
430
|
+
function ce({ relationshipId: e, onClose: t }) {
|
|
431
|
+
let n = T(), r = g(), { uploadFile: i, progress: a, isUploading: o } = w(), [s, l] = E(""), [u, d] = E("RECEIPT"), [f, p] = E(null), [m, h] = E(""), [_, v] = E(null), y = o || r.isPending;
|
|
411
432
|
return /* @__PURE__ */ z(c, {
|
|
412
|
-
title: "Attach asset",
|
|
433
|
+
title: n("relationships.detail.attachAssetModal.title", "Attach asset"),
|
|
413
434
|
onClose: t,
|
|
414
435
|
children: /* @__PURE__ */ B("form", {
|
|
415
|
-
onSubmit: async (
|
|
416
|
-
if (
|
|
417
|
-
|
|
436
|
+
onSubmit: async (a) => {
|
|
437
|
+
if (a.preventDefault(), v(null), !f) {
|
|
438
|
+
v(n("relationships.detail.attachAssetModal.chooseFile", "Choose a file to attach."));
|
|
418
439
|
return;
|
|
419
440
|
}
|
|
420
441
|
try {
|
|
421
|
-
let { fileId:
|
|
422
|
-
await
|
|
442
|
+
let { fileId: n, fileName: a } = await i(f);
|
|
443
|
+
await r.mutateAsync({
|
|
423
444
|
relationshipId: e,
|
|
424
|
-
name:
|
|
425
|
-
type:
|
|
426
|
-
fileId:
|
|
427
|
-
...
|
|
445
|
+
name: s.trim() || a,
|
|
446
|
+
type: u,
|
|
447
|
+
fileId: n,
|
|
448
|
+
...m ? { expiresAt: new Date(m).toISOString() } : {}
|
|
428
449
|
}), t();
|
|
429
450
|
} catch (e) {
|
|
430
|
-
|
|
451
|
+
v(e instanceof Error ? e.message : n("relationships.detail.attachAssetModal.error", "Could not attach the asset."));
|
|
431
452
|
}
|
|
432
453
|
},
|
|
433
454
|
className: "space-y-4",
|
|
434
455
|
children: [
|
|
435
|
-
|
|
456
|
+
_ && /* @__PURE__ */ z("div", {
|
|
436
457
|
className: "rounded-lg border border-status-error-text/30 bg-status-error-bg-subtle px-4 py-2 text-sm text-status-error-text",
|
|
437
|
-
children:
|
|
458
|
+
children: _
|
|
438
459
|
}),
|
|
439
460
|
/* @__PURE__ */ B("div", { children: [
|
|
440
461
|
/* @__PURE__ */ B("label", {
|
|
441
462
|
htmlFor: "asset-file",
|
|
442
463
|
className: U,
|
|
443
|
-
children: [
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
464
|
+
children: [
|
|
465
|
+
n("relationships.detail.attachAssetModal.fileLabel", "File"),
|
|
466
|
+
" ",
|
|
467
|
+
/* @__PURE__ */ z("span", {
|
|
468
|
+
className: "text-status-error-text",
|
|
469
|
+
children: "*"
|
|
470
|
+
})
|
|
471
|
+
]
|
|
447
472
|
}),
|
|
448
473
|
/* @__PURE__ */ z("input", {
|
|
449
474
|
id: "asset-file",
|
|
450
475
|
type: "file",
|
|
451
476
|
onChange: (e) => {
|
|
452
477
|
let t = e.target.files?.[0] ?? null;
|
|
453
|
-
|
|
478
|
+
p(t), t && !s.trim() && l(t.name);
|
|
454
479
|
},
|
|
455
480
|
className: "w-full text-sm text-text-secondary file:mr-3 file:rounded-lg file:border file:border-border-subtle file:bg-bg-surface file:px-3 file:py-1.5 file:text-sm file:font-medium file:text-text-primary hover:file:bg-bg-sunken"
|
|
456
481
|
}),
|
|
457
482
|
/* @__PURE__ */ z("p", {
|
|
458
483
|
className: "mt-1 text-xs text-text-secondary",
|
|
459
|
-
children: "Stored securely in files — only a reference is kept here."
|
|
484
|
+
children: n("relationships.detail.attachAssetModal.fileHint", "Stored securely in files — only a reference is kept here.")
|
|
460
485
|
})
|
|
461
486
|
] }),
|
|
462
487
|
/* @__PURE__ */ B("div", {
|
|
@@ -464,22 +489,22 @@ function oe({ relationshipId: e, onClose: t }) {
|
|
|
464
489
|
children: [/* @__PURE__ */ B("div", { children: [/* @__PURE__ */ z("label", {
|
|
465
490
|
htmlFor: "asset-name",
|
|
466
491
|
className: U,
|
|
467
|
-
children: "Name"
|
|
492
|
+
children: n("relationships.detail.attachAssetModal.nameLabel", "Name")
|
|
468
493
|
}), /* @__PURE__ */ z("input", {
|
|
469
494
|
id: "asset-name",
|
|
470
495
|
type: "text",
|
|
471
|
-
value:
|
|
472
|
-
onChange: (e) =>
|
|
473
|
-
placeholder: "Defaults to the file name",
|
|
496
|
+
value: s,
|
|
497
|
+
onChange: (e) => l(e.target.value),
|
|
498
|
+
placeholder: n("relationships.detail.attachAssetModal.namePlaceholder", "Defaults to the file name"),
|
|
474
499
|
className: H
|
|
475
500
|
})] }), /* @__PURE__ */ B("div", { children: [/* @__PURE__ */ z("label", {
|
|
476
501
|
htmlFor: "asset-type",
|
|
477
502
|
className: U,
|
|
478
|
-
children: "Type"
|
|
503
|
+
children: n("relationships.detail.attachAssetModal.typeLabel", "Type")
|
|
479
504
|
}), /* @__PURE__ */ z("select", {
|
|
480
505
|
id: "asset-type",
|
|
481
|
-
value:
|
|
482
|
-
onChange: (e) =>
|
|
506
|
+
value: u,
|
|
507
|
+
onChange: (e) => d(e.target.value),
|
|
483
508
|
className: H,
|
|
484
509
|
children: K.map((e) => /* @__PURE__ */ z("option", {
|
|
485
510
|
value: e,
|
|
@@ -490,21 +515,17 @@ function oe({ relationshipId: e, onClose: t }) {
|
|
|
490
515
|
/* @__PURE__ */ B("div", { children: [/* @__PURE__ */ z("label", {
|
|
491
516
|
htmlFor: "asset-expires",
|
|
492
517
|
className: U,
|
|
493
|
-
children: "Expires on"
|
|
518
|
+
children: n("relationships.detail.attachAssetModal.expiresOnLabel", "Expires on")
|
|
494
519
|
}), /* @__PURE__ */ z("input", {
|
|
495
520
|
id: "asset-expires",
|
|
496
521
|
type: "date",
|
|
497
|
-
value:
|
|
498
|
-
onChange: (e) =>
|
|
522
|
+
value: m,
|
|
523
|
+
onChange: (e) => h(e.target.value),
|
|
499
524
|
className: H
|
|
500
525
|
})] }),
|
|
501
|
-
|
|
526
|
+
o && /* @__PURE__ */ z("p", {
|
|
502
527
|
className: "text-xs text-text-secondary",
|
|
503
|
-
children:
|
|
504
|
-
"Uploading… ",
|
|
505
|
-
i,
|
|
506
|
-
"%"
|
|
507
|
-
]
|
|
528
|
+
children: n("relationships.detail.attachAssetModal.uploading", "Uploading… {{progress}}%", { progress: a })
|
|
508
529
|
}),
|
|
509
530
|
/* @__PURE__ */ B("div", {
|
|
510
531
|
className: "flex justify-end gap-3",
|
|
@@ -512,25 +533,25 @@ function oe({ relationshipId: e, onClose: t }) {
|
|
|
512
533
|
type: "button",
|
|
513
534
|
onClick: t,
|
|
514
535
|
className: "rounded-lg border border-border-subtle px-4 py-2 text-sm font-medium text-text-primary hover:bg-bg-sunken",
|
|
515
|
-
children: "Cancel"
|
|
536
|
+
children: n("relationships.detail.attachAssetModal.cancel", "Cancel")
|
|
516
537
|
}), /* @__PURE__ */ z("button", {
|
|
517
538
|
type: "submit",
|
|
518
|
-
disabled:
|
|
539
|
+
disabled: y,
|
|
519
540
|
className: "rounded-lg bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text hover:opacity-90 disabled:opacity-50",
|
|
520
|
-
children:
|
|
541
|
+
children: y ? n("relationships.detail.attachAssetModal.attaching", "Attaching…") : n("relationships.detail.attachAssetModal.submit", "Attach asset")
|
|
521
542
|
})]
|
|
522
543
|
})
|
|
523
544
|
]
|
|
524
545
|
})
|
|
525
546
|
});
|
|
526
547
|
}
|
|
527
|
-
function
|
|
528
|
-
let t = v(), [
|
|
548
|
+
function le({ asset: e }) {
|
|
549
|
+
let t = T(), n = v(), [a, o] = E(!1);
|
|
529
550
|
return /* @__PURE__ */ B("div", {
|
|
530
551
|
className: "flex items-center justify-between gap-3 p-3",
|
|
531
552
|
children: [/* @__PURE__ */ B("div", {
|
|
532
553
|
className: "flex min-w-0 items-center gap-2",
|
|
533
|
-
children: [/* @__PURE__ */ z(
|
|
554
|
+
children: [/* @__PURE__ */ z(N, { className: "h-4 w-4 shrink-0 text-text-secondary" }), /* @__PURE__ */ B("div", {
|
|
534
555
|
className: "min-w-0",
|
|
535
556
|
children: [/* @__PURE__ */ z("p", {
|
|
536
557
|
className: "truncate text-sm font-medium text-text-primary",
|
|
@@ -542,97 +563,105 @@ function se({ asset: e }) {
|
|
|
542
563
|
})]
|
|
543
564
|
}), /* @__PURE__ */ B("div", {
|
|
544
565
|
className: "flex shrink-0 items-center gap-3",
|
|
545
|
-
children: [e.expiresAt && /* @__PURE__ */
|
|
566
|
+
children: [e.expiresAt && /* @__PURE__ */ z("span", {
|
|
546
567
|
className: "text-xs text-text-secondary",
|
|
547
|
-
children:
|
|
568
|
+
children: t("relationships.detail.assetRow.expires", "Expires {{date}}", { date: r(e.expiresAt) })
|
|
548
569
|
}), e.file?.id && /* @__PURE__ */ B("button", {
|
|
549
570
|
type: "button",
|
|
550
571
|
onClick: async () => {
|
|
551
572
|
if (e.file?.id) {
|
|
552
|
-
|
|
573
|
+
o(!0);
|
|
553
574
|
try {
|
|
554
|
-
let
|
|
555
|
-
window.open(
|
|
575
|
+
let t = await n(e.file.id);
|
|
576
|
+
window.open(t, "_blank", "noopener,noreferrer");
|
|
556
577
|
} catch {} finally {
|
|
557
|
-
|
|
578
|
+
o(!1);
|
|
558
579
|
}
|
|
559
580
|
}
|
|
560
581
|
},
|
|
561
|
-
disabled:
|
|
582
|
+
disabled: a,
|
|
562
583
|
className: "inline-flex items-center gap-1 rounded-lg border border-border-subtle px-2.5 py-1 text-xs font-medium text-text-primary hover:bg-bg-sunken disabled:opacity-50",
|
|
563
584
|
children: [
|
|
564
|
-
/* @__PURE__ */ z(
|
|
585
|
+
/* @__PURE__ */ z(M, { className: "h-3.5 w-3.5" }),
|
|
565
586
|
" ",
|
|
566
|
-
|
|
587
|
+
a ? t("relationships.detail.assetRow.opening", "Opening…") : t("relationships.detail.assetRow.download", "Download")
|
|
567
588
|
]
|
|
568
589
|
})]
|
|
569
590
|
})]
|
|
570
591
|
});
|
|
571
592
|
}
|
|
572
593
|
function X() {
|
|
573
|
-
let { id:
|
|
574
|
-
if (v) return /* @__PURE__ */ z(t, {
|
|
575
|
-
title: "Relationship",
|
|
576
|
-
children: /* @__PURE__ */ z(u, { label: "Loading relationship…" })
|
|
577
|
-
});
|
|
594
|
+
let c = T(), { id: g } = ne(), { navigateTo: _ } = e(), { data: v, isLoading: y, isError: b, refetch: C } = x(g), w = S(), M = h(), [N, P] = E(null), [I, H] = E(!1), [U, W] = E(!1), [G, K] = E(!1);
|
|
578
595
|
if (y) return /* @__PURE__ */ z(t, {
|
|
579
|
-
title: "Relationship",
|
|
596
|
+
title: c("relationships.title", "Relationship"),
|
|
597
|
+
children: /* @__PURE__ */ z(u, { label: c("relationships.detail.loading", "Loading relationship…") })
|
|
598
|
+
});
|
|
599
|
+
if (b) return /* @__PURE__ */ z(t, {
|
|
600
|
+
title: c("relationships.title", "Relationship"),
|
|
580
601
|
children: /* @__PURE__ */ z(l, {
|
|
581
|
-
message: "Could not load this relationship.",
|
|
582
|
-
onRetry: () => void
|
|
602
|
+
message: c("relationships.detail.error", "Could not load this relationship."),
|
|
603
|
+
onRetry: () => void C()
|
|
583
604
|
})
|
|
584
605
|
});
|
|
585
|
-
if (!
|
|
586
|
-
title: "Relationship",
|
|
606
|
+
if (!v) return /* @__PURE__ */ z(t, {
|
|
607
|
+
title: c("relationships.title", "Relationship"),
|
|
587
608
|
children: /* @__PURE__ */ z(s, {
|
|
588
609
|
illustration: "empty-data",
|
|
589
|
-
title: "Relationship not found",
|
|
590
|
-
description: "It may have been removed, or you may not have access to it.",
|
|
610
|
+
title: c("relationships.detail.notFoundTitle", "Relationship not found"),
|
|
611
|
+
description: c("relationships.detail.notFoundDescription", "It may have been removed, or you may not have access to it."),
|
|
591
612
|
action: /* @__PURE__ */ z("button", {
|
|
592
613
|
type: "button",
|
|
593
|
-
onClick: () =>
|
|
614
|
+
onClick: () => _("/relationships"),
|
|
594
615
|
className: "rounded-lg bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text hover:opacity-90",
|
|
595
|
-
children: "Back to relationships"
|
|
616
|
+
children: c("relationships.detail.backToRelationships", "Back to relationships")
|
|
596
617
|
})
|
|
597
618
|
})
|
|
598
619
|
});
|
|
599
|
-
let
|
|
600
|
-
|
|
601
|
-
id:
|
|
620
|
+
let Y = v, X = w.isPending || M.isPending, ue = (e) => {
|
|
621
|
+
P(null), w.mutate({
|
|
622
|
+
id: Y.id,
|
|
602
623
|
status: e
|
|
603
|
-
}, { onError: (e) =>
|
|
604
|
-
},
|
|
605
|
-
|
|
606
|
-
}, Z = [...
|
|
624
|
+
}, { onError: (e) => P(e instanceof Error ? e.message : c("relationships.detail.transitionError", "Transition failed")) });
|
|
625
|
+
}, de = () => {
|
|
626
|
+
P(null), M.mutate(Y.id, { onError: (e) => P(e instanceof Error ? e.message : c("relationships.detail.cancelError", "Cancel failed")) });
|
|
627
|
+
}, Z = [...Y.renewalEvents ?? []].sort((e, t) => new Date(e.occursAt).getTime() - new Date(t.occursAt).getTime()).map((e) => {
|
|
607
628
|
let t = new Date(e.occursAt).getTime(), a = !Number.isNaN(t) && t > Date.now();
|
|
608
629
|
return {
|
|
609
630
|
title: i(e.eventType),
|
|
610
631
|
sub: `${r(e.occursAt)}${e.detail ? ` · ${e.detail}` : ""}`,
|
|
611
|
-
meta: e.amount == null ? void 0 : n(e.amount, e.currency ??
|
|
632
|
+
meta: e.amount == null ? void 0 : n(e.amount, e.currency ?? Y.currency),
|
|
612
633
|
tone: a ? "warning" : "muted"
|
|
613
634
|
};
|
|
614
|
-
}), Q =
|
|
635
|
+
}), Q = Y.autoRenew ? /* @__PURE__ */ z("span", {
|
|
615
636
|
className: "inline-flex items-center rounded-full bg-status-success-bg-subtle px-2 py-0.5 text-xs font-medium text-status-success-text",
|
|
616
|
-
children: "On"
|
|
637
|
+
children: c("relationships.detail.autoRenewOn", "On")
|
|
617
638
|
}) : /* @__PURE__ */ z("span", {
|
|
618
639
|
className: "inline-flex items-center rounded-full bg-bg-sunken px-2 py-0.5 text-xs font-medium text-text-secondary",
|
|
619
|
-
children: "Off"
|
|
620
|
-
}),
|
|
640
|
+
children: c("relationships.detail.autoRenewOff", "Off")
|
|
641
|
+
}), fe = ie.filter((e) => e.status !== Y.status), $ = Y.plan?.features ?? [];
|
|
621
642
|
return /* @__PURE__ */ B(t, {
|
|
622
|
-
title:
|
|
623
|
-
description:
|
|
643
|
+
title: Y.label,
|
|
644
|
+
description: Y.provider?.name ?? c(q[Y.kind], i(Y.kind)),
|
|
624
645
|
actions: /* @__PURE__ */ B("div", {
|
|
625
646
|
className: "flex items-center gap-2",
|
|
626
647
|
children: [/* @__PURE__ */ B("button", {
|
|
627
648
|
type: "button",
|
|
628
|
-
onClick: () =>
|
|
649
|
+
onClick: () => H(!0),
|
|
629
650
|
className: "inline-flex items-center gap-2 rounded-lg border border-border-subtle px-3 py-2 text-sm font-medium text-text-primary hover:bg-bg-sunken",
|
|
630
|
-
children: [
|
|
651
|
+
children: [
|
|
652
|
+
/* @__PURE__ */ z(F, { className: "h-4 w-4" }),
|
|
653
|
+
" ",
|
|
654
|
+
c("relationships.detail.edit", "Edit")
|
|
655
|
+
]
|
|
631
656
|
}), /* @__PURE__ */ B("button", {
|
|
632
657
|
type: "button",
|
|
633
|
-
onClick: () =>
|
|
658
|
+
onClick: () => _("/relationships"),
|
|
634
659
|
className: "inline-flex items-center gap-2 rounded-lg border border-border-subtle px-3 py-2 text-sm font-medium text-text-primary hover:bg-bg-sunken",
|
|
635
|
-
children: [
|
|
660
|
+
children: [
|
|
661
|
+
/* @__PURE__ */ z(O, { className: "h-4 w-4" }),
|
|
662
|
+
" ",
|
|
663
|
+
c("relationships.detail.back", "Back")
|
|
664
|
+
]
|
|
636
665
|
})]
|
|
637
666
|
}),
|
|
638
667
|
children: [
|
|
@@ -647,38 +676,42 @@ function X() {
|
|
|
647
676
|
children: [
|
|
648
677
|
/* @__PURE__ */ z("p", {
|
|
649
678
|
className: "text-xs font-medium uppercase tracking-wide text-text-secondary",
|
|
650
|
-
children: i(
|
|
679
|
+
children: c(q[Y.kind], i(Y.kind))
|
|
651
680
|
}),
|
|
652
681
|
/* @__PURE__ */ B("div", {
|
|
653
682
|
className: "mt-2 flex flex-wrap items-center gap-3",
|
|
654
683
|
children: [/* @__PURE__ */ B("span", {
|
|
655
684
|
className: "text-3xl font-bold tabular-nums text-text-primary",
|
|
656
|
-
children: [n(
|
|
685
|
+
children: [n(Y.amount, Y.currency), /* @__PURE__ */ z("span", {
|
|
657
686
|
className: "text-base font-normal text-text-secondary",
|
|
658
|
-
children: a(
|
|
687
|
+
children: a(Y.interval)
|
|
659
688
|
})]
|
|
660
|
-
}), /* @__PURE__ */ z(o, { status:
|
|
689
|
+
}), /* @__PURE__ */ z(o, { status: Y.status })]
|
|
661
690
|
}),
|
|
662
691
|
/* @__PURE__ */ B("div", {
|
|
663
692
|
className: "mt-2 flex flex-wrap items-center gap-x-4 gap-y-1 text-sm text-text-secondary",
|
|
664
693
|
children: [
|
|
665
694
|
/* @__PURE__ */ B("span", {
|
|
666
695
|
className: "inline-flex items-center gap-1.5",
|
|
667
|
-
children: [/* @__PURE__ */ z(
|
|
696
|
+
children: [/* @__PURE__ */ z(A, { className: "h-3.5 w-3.5" }), Y.renewsAt ? c("relationships.detail.renews", "Renews {{date}}", { date: r(Y.renewsAt) }) : c("relationships.detail.noRenewalScheduled", "No renewal scheduled")]
|
|
668
697
|
}),
|
|
669
698
|
/* @__PURE__ */ B("span", {
|
|
670
699
|
className: "inline-flex items-center gap-1.5",
|
|
671
|
-
children: [/* @__PURE__ */ z(
|
|
700
|
+
children: [/* @__PURE__ */ z(R, { className: "h-3.5 w-3.5" }), i(Y.discoverySource)]
|
|
672
701
|
}),
|
|
673
702
|
/* @__PURE__ */ B("span", {
|
|
674
703
|
className: "inline-flex items-center gap-1.5",
|
|
675
|
-
children: [
|
|
704
|
+
children: [
|
|
705
|
+
c("relationships.detail.autoRenew", "Auto-renew"),
|
|
706
|
+
" ",
|
|
707
|
+
Q
|
|
708
|
+
]
|
|
676
709
|
})
|
|
677
710
|
]
|
|
678
711
|
}),
|
|
679
|
-
|
|
712
|
+
Y.tags.length > 0 && /* @__PURE__ */ B("div", {
|
|
680
713
|
className: "mt-3 flex flex-wrap items-center gap-2",
|
|
681
|
-
children: [/* @__PURE__ */ z(ee, { className: "h-3.5 w-3.5 text-text-secondary" }),
|
|
714
|
+
children: [/* @__PURE__ */ z(ee, { className: "h-3.5 w-3.5 text-text-secondary" }), Y.tags.map((e) => /* @__PURE__ */ z("span", {
|
|
682
715
|
className: "rounded-full bg-bg-sunken px-2.5 py-0.5 text-xs text-text-secondary",
|
|
683
716
|
children: e
|
|
684
717
|
}, e))]
|
|
@@ -686,32 +719,36 @@ function X() {
|
|
|
686
719
|
]
|
|
687
720
|
}), /* @__PURE__ */ B("div", {
|
|
688
721
|
className: "flex shrink-0 flex-wrap gap-2 lg:flex-col lg:items-stretch",
|
|
689
|
-
children: [
|
|
722
|
+
children: [fe.map((e) => {
|
|
690
723
|
let t = e.icon;
|
|
691
724
|
return /* @__PURE__ */ B("button", {
|
|
692
725
|
type: "button",
|
|
693
|
-
disabled:
|
|
694
|
-
onClick: () =>
|
|
726
|
+
disabled: X,
|
|
727
|
+
onClick: () => ue(e.status),
|
|
695
728
|
className: "inline-flex items-center justify-center gap-1.5 rounded-lg border border-border-subtle bg-bg-surface px-3 py-1.5 text-xs font-medium text-text-primary hover:bg-bg-sunken disabled:opacity-50",
|
|
696
729
|
children: [
|
|
697
730
|
/* @__PURE__ */ z(t, { className: "h-3.5 w-3.5" }),
|
|
698
731
|
" ",
|
|
699
|
-
e.
|
|
732
|
+
c(e.labelKey, e.defaultLabel)
|
|
700
733
|
]
|
|
701
734
|
}, e.status);
|
|
702
|
-
}),
|
|
735
|
+
}), Y.status !== "CANCELLED" && /* @__PURE__ */ B("button", {
|
|
703
736
|
type: "button",
|
|
704
|
-
disabled:
|
|
705
|
-
onClick:
|
|
737
|
+
disabled: X,
|
|
738
|
+
onClick: de,
|
|
706
739
|
className: "inline-flex items-center justify-center gap-1.5 rounded-lg border border-status-error-text/30 bg-status-error-bg-subtle px-3 py-1.5 text-xs font-medium text-status-error-text hover:opacity-90 disabled:opacity-50",
|
|
707
|
-
children: [
|
|
740
|
+
children: [
|
|
741
|
+
/* @__PURE__ */ z(k, { className: "h-3.5 w-3.5" }),
|
|
742
|
+
" ",
|
|
743
|
+
c("relationships.detail.actions.cancel", "Cancel")
|
|
744
|
+
]
|
|
708
745
|
})]
|
|
709
746
|
})]
|
|
710
747
|
})
|
|
711
748
|
}),
|
|
712
|
-
|
|
749
|
+
N && /* @__PURE__ */ z("div", {
|
|
713
750
|
className: "mt-4 rounded-lg border border-status-error-text/30 bg-status-error-bg-subtle px-4 py-2 text-sm text-status-error-text",
|
|
714
|
-
children:
|
|
751
|
+
children: N
|
|
715
752
|
}),
|
|
716
753
|
/* @__PURE__ */ B("div", {
|
|
717
754
|
className: "mt-6 grid grid-cols-1 gap-4 lg:grid-cols-3",
|
|
@@ -726,29 +763,33 @@ function X() {
|
|
|
726
763
|
children: [
|
|
727
764
|
/* @__PURE__ */ B("div", {
|
|
728
765
|
className: "flex items-center gap-2 text-sm font-semibold text-text-primary",
|
|
729
|
-
children: [
|
|
766
|
+
children: [
|
|
767
|
+
/* @__PURE__ */ z(j, { className: "h-4 w-4 text-text-secondary" }),
|
|
768
|
+
" ",
|
|
769
|
+
c("relationships.detail.sections.planPricing", "Plan & pricing")
|
|
770
|
+
]
|
|
730
771
|
}),
|
|
731
772
|
/* @__PURE__ */ B("div", {
|
|
732
773
|
className: "mt-3",
|
|
733
774
|
children: [
|
|
734
775
|
/* @__PURE__ */ z(J, {
|
|
735
|
-
label: "Plan",
|
|
736
|
-
value:
|
|
776
|
+
label: c("relationships.detail.info.plan", "Plan"),
|
|
777
|
+
value: Y.plan?.name ?? "—"
|
|
737
778
|
}),
|
|
738
779
|
/* @__PURE__ */ z(J, {
|
|
739
|
-
label: "Price",
|
|
740
|
-
value: /* @__PURE__ */ B(
|
|
780
|
+
label: c("relationships.detail.info.price", "Price"),
|
|
781
|
+
value: /* @__PURE__ */ B(re, { children: [n(Y.amount, Y.currency), /* @__PURE__ */ z("span", {
|
|
741
782
|
className: "font-normal text-text-secondary",
|
|
742
|
-
children: a(
|
|
783
|
+
children: a(Y.interval)
|
|
743
784
|
})] })
|
|
744
785
|
}),
|
|
745
786
|
/* @__PURE__ */ z(J, {
|
|
746
|
-
label: "Billing interval",
|
|
747
|
-
value: i(
|
|
787
|
+
label: c("relationships.detail.info.billingInterval", "Billing interval"),
|
|
788
|
+
value: i(Y.interval)
|
|
748
789
|
}),
|
|
749
790
|
/* @__PURE__ */ z(J, {
|
|
750
|
-
label: "Provider",
|
|
751
|
-
value:
|
|
791
|
+
label: c("relationships.detail.info.provider", "Provider"),
|
|
792
|
+
value: Y.provider?.name ?? "—"
|
|
752
793
|
})
|
|
753
794
|
]
|
|
754
795
|
}),
|
|
@@ -765,29 +806,33 @@ function X() {
|
|
|
765
806
|
className: "p-5",
|
|
766
807
|
children: [/* @__PURE__ */ B("div", {
|
|
767
808
|
className: "flex items-center gap-2 text-sm font-semibold text-text-primary",
|
|
768
|
-
children: [
|
|
809
|
+
children: [
|
|
810
|
+
/* @__PURE__ */ z(te, { className: "h-4 w-4 text-text-secondary" }),
|
|
811
|
+
" ",
|
|
812
|
+
c("relationships.detail.sections.paymentBilling", "Payment & billing")
|
|
813
|
+
]
|
|
769
814
|
}), /* @__PURE__ */ B("div", {
|
|
770
815
|
className: "mt-3",
|
|
771
816
|
children: [
|
|
772
817
|
/* @__PURE__ */ z(J, {
|
|
773
|
-
label: "Currency",
|
|
774
|
-
value:
|
|
818
|
+
label: c("relationships.detail.info.currency", "Currency"),
|
|
819
|
+
value: Y.currency
|
|
775
820
|
}),
|
|
776
821
|
/* @__PURE__ */ z(J, {
|
|
777
|
-
label: "Auto-renew",
|
|
822
|
+
label: c("relationships.detail.info.autoRenew", "Auto-renew"),
|
|
778
823
|
value: Q
|
|
779
824
|
}),
|
|
780
825
|
/* @__PURE__ */ z(J, {
|
|
781
|
-
label: "Next renewal",
|
|
782
|
-
value:
|
|
826
|
+
label: c("relationships.detail.info.nextRenewal", "Next renewal"),
|
|
827
|
+
value: Y.renewsAt ? r(Y.renewsAt) : "—"
|
|
783
828
|
}),
|
|
784
829
|
/* @__PURE__ */ z(J, {
|
|
785
|
-
label: "Started",
|
|
786
|
-
value:
|
|
830
|
+
label: c("relationships.detail.info.started", "Started"),
|
|
831
|
+
value: Y.startedAt ? r(Y.startedAt) : "—"
|
|
787
832
|
}),
|
|
788
|
-
|
|
789
|
-
label: "Trial ends",
|
|
790
|
-
value: r(
|
|
833
|
+
Y.trialEndsAt && /* @__PURE__ */ z(J, {
|
|
834
|
+
label: c("relationships.detail.info.trialEnds", "Trial ends"),
|
|
835
|
+
value: r(Y.trialEndsAt)
|
|
791
836
|
})
|
|
792
837
|
]
|
|
793
838
|
})]
|
|
@@ -795,21 +840,25 @@ function X() {
|
|
|
795
840
|
}),
|
|
796
841
|
/* @__PURE__ */ z(d, {
|
|
797
842
|
className: "mt-0",
|
|
798
|
-
title: "Entitlements",
|
|
799
|
-
description: "What this relationship grants you",
|
|
843
|
+
title: c("relationships.detail.sections.entitlements", "Entitlements"),
|
|
844
|
+
description: c("relationships.detail.sections.entitlementsDescription", "What this relationship grants you"),
|
|
800
845
|
action: /* @__PURE__ */ B("button", {
|
|
801
846
|
type: "button",
|
|
802
|
-
onClick: () =>
|
|
847
|
+
onClick: () => W(!0),
|
|
803
848
|
className: "inline-flex items-center gap-1.5 rounded-lg border border-border-subtle px-3 py-1.5 text-xs font-medium text-text-primary hover:bg-bg-sunken",
|
|
804
|
-
children: [
|
|
849
|
+
children: [
|
|
850
|
+
/* @__PURE__ */ z(L, { className: "h-3.5 w-3.5" }),
|
|
851
|
+
" ",
|
|
852
|
+
c("relationships.detail.sections.addEntitlement", "Add entitlement")
|
|
853
|
+
]
|
|
805
854
|
}),
|
|
806
|
-
children: !
|
|
855
|
+
children: !Y.entitlements || Y.entitlements.length === 0 ? /* @__PURE__ */ z(s, {
|
|
807
856
|
illustration: "empty-data",
|
|
808
|
-
title: "No entitlements",
|
|
809
|
-
description: "Entitlements (seats, quotas, feature access) will appear here."
|
|
857
|
+
title: c("relationships.detail.empty.noEntitlementsTitle", "No entitlements"),
|
|
858
|
+
description: c("relationships.detail.empty.noEntitlementsDescription", "Entitlements (seats, quotas, feature access) will appear here.")
|
|
810
859
|
}) : /* @__PURE__ */ z("div", {
|
|
811
860
|
className: "grid grid-cols-1 gap-3 sm:grid-cols-2",
|
|
812
|
-
children:
|
|
861
|
+
children: Y.entitlements.map((e) => {
|
|
813
862
|
let t = e.quota != null && e.quota > 0;
|
|
814
863
|
return /* @__PURE__ */ B(V, {
|
|
815
864
|
treatment: "plain",
|
|
@@ -853,33 +902,37 @@ function X() {
|
|
|
853
902
|
}),
|
|
854
903
|
/* @__PURE__ */ z(d, {
|
|
855
904
|
className: "mt-0",
|
|
856
|
-
title: "Assets",
|
|
857
|
-
description: "Invoices, contracts, licenses and credentials",
|
|
905
|
+
title: c("relationships.detail.sections.assets", "Assets"),
|
|
906
|
+
description: c("relationships.detail.sections.assetsDescription", "Invoices, contracts, licenses and credentials"),
|
|
858
907
|
action: /* @__PURE__ */ B("button", {
|
|
859
908
|
type: "button",
|
|
860
|
-
onClick: () =>
|
|
909
|
+
onClick: () => K(!0),
|
|
861
910
|
className: "inline-flex items-center gap-1.5 rounded-lg border border-border-subtle px-3 py-1.5 text-xs font-medium text-text-primary hover:bg-bg-sunken",
|
|
862
|
-
children: [
|
|
911
|
+
children: [
|
|
912
|
+
/* @__PURE__ */ z(L, { className: "h-3.5 w-3.5" }),
|
|
913
|
+
" ",
|
|
914
|
+
c("relationships.detail.sections.attachAsset", "Attach asset")
|
|
915
|
+
]
|
|
863
916
|
}),
|
|
864
|
-
children: !
|
|
917
|
+
children: !Y.assets || Y.assets.length === 0 ? /* @__PURE__ */ z(s, {
|
|
865
918
|
illustration: "empty-data",
|
|
866
|
-
title: "No assets attached",
|
|
867
|
-
description: "Attach invoices, contracts, licenses or receipts to this relationship."
|
|
919
|
+
title: c("relationships.detail.empty.noAssetsTitle", "No assets attached"),
|
|
920
|
+
description: c("relationships.detail.empty.noAssetsDescription", "Attach invoices, contracts, licenses or receipts to this relationship.")
|
|
868
921
|
}) : /* @__PURE__ */ z(V, {
|
|
869
922
|
treatment: "plain",
|
|
870
923
|
className: "divide-y divide-border-subtle p-0",
|
|
871
|
-
children:
|
|
924
|
+
children: Y.assets.map((e) => /* @__PURE__ */ z(le, { asset: e }, e.id))
|
|
872
925
|
})
|
|
873
926
|
}),
|
|
874
|
-
|
|
927
|
+
Y.notes && /* @__PURE__ */ B(V, {
|
|
875
928
|
treatment: "plain",
|
|
876
929
|
className: "p-4",
|
|
877
930
|
children: [/* @__PURE__ */ z("p", {
|
|
878
931
|
className: "text-xs font-medium text-text-secondary",
|
|
879
|
-
children: "Notes"
|
|
932
|
+
children: c("relationships.detail.sections.notes", "Notes")
|
|
880
933
|
}), /* @__PURE__ */ z("p", {
|
|
881
934
|
className: "mt-1 whitespace-pre-wrap text-sm text-text-primary",
|
|
882
|
-
children:
|
|
935
|
+
children: Y.notes
|
|
883
936
|
})]
|
|
884
937
|
})
|
|
885
938
|
]
|
|
@@ -890,23 +943,27 @@ function X() {
|
|
|
890
943
|
className: "p-5",
|
|
891
944
|
children: [/* @__PURE__ */ B("div", {
|
|
892
945
|
className: "flex items-center gap-2 text-sm font-semibold text-text-primary",
|
|
893
|
-
children: [
|
|
894
|
-
|
|
946
|
+
children: [
|
|
947
|
+
/* @__PURE__ */ z(D, { className: "h-4 w-4 text-text-secondary" }),
|
|
948
|
+
" ",
|
|
949
|
+
c("relationships.detail.sections.healthScore", "Health score")
|
|
950
|
+
]
|
|
951
|
+
}), Y.healthScore == null ? /* @__PURE__ */ z("p", {
|
|
895
952
|
className: "mt-4 text-sm text-text-secondary",
|
|
896
|
-
children: "Not scored yet. A health score appears once Subscriber Bot has enough signal."
|
|
953
|
+
children: c("relationships.detail.empty.noHealthScore", "Not scored yet. A health score appears once Subscriber Bot has enough signal.")
|
|
897
954
|
}) : /* @__PURE__ */ B("div", {
|
|
898
955
|
className: "mt-4 flex flex-col items-center",
|
|
899
956
|
children: [/* @__PURE__ */ z(f, {
|
|
900
|
-
value:
|
|
957
|
+
value: Y.healthScore,
|
|
901
958
|
max: 100,
|
|
902
959
|
size: 160,
|
|
903
|
-
label: "of 100"
|
|
960
|
+
label: c("relationships.detail.outOf100", "of 100")
|
|
904
961
|
}), /* @__PURE__ */ z("div", {
|
|
905
962
|
className: "mt-2 w-full",
|
|
906
963
|
children: /* @__PURE__ */ z(p, {
|
|
907
|
-
value:
|
|
964
|
+
value: Y.healthScore,
|
|
908
965
|
max: 100,
|
|
909
|
-
tone:
|
|
966
|
+
tone: ae(Y.healthScore)
|
|
910
967
|
})
|
|
911
968
|
})]
|
|
912
969
|
})]
|
|
@@ -916,18 +973,22 @@ function X() {
|
|
|
916
973
|
children: [
|
|
917
974
|
/* @__PURE__ */ B("div", {
|
|
918
975
|
className: "flex items-center gap-2 text-sm font-semibold text-text-primary",
|
|
919
|
-
children: [
|
|
976
|
+
children: [
|
|
977
|
+
/* @__PURE__ */ z(A, { className: "h-4 w-4 text-text-secondary" }),
|
|
978
|
+
" ",
|
|
979
|
+
c("relationships.detail.sections.renewalTimeline", "Renewal timeline")
|
|
980
|
+
]
|
|
920
981
|
}),
|
|
921
982
|
/* @__PURE__ */ z("p", {
|
|
922
983
|
className: "mt-0.5 text-xs text-text-secondary",
|
|
923
|
-
children: "Detected renewals and price changes"
|
|
984
|
+
children: c("relationships.detail.sections.renewalTimelineDescription", "Detected renewals and price changes")
|
|
924
985
|
}),
|
|
925
986
|
Z.length === 0 ? /* @__PURE__ */ z("div", {
|
|
926
987
|
className: "mt-4",
|
|
927
988
|
children: /* @__PURE__ */ z(s, {
|
|
928
989
|
illustration: "empty-calendar",
|
|
929
|
-
title: "No renewal events",
|
|
930
|
-
description: "Renewals and price changes will appear here as they're detected."
|
|
990
|
+
title: c("relationships.detail.empty.noRenewalEventsTitle", "No renewal events"),
|
|
991
|
+
description: c("relationships.detail.empty.noRenewalEventsDescription", "Renewals and price changes will appear here as they're detected.")
|
|
931
992
|
})
|
|
932
993
|
}) : /* @__PURE__ */ z(m, {
|
|
933
994
|
items: Z,
|
|
@@ -937,17 +998,17 @@ function X() {
|
|
|
937
998
|
})]
|
|
938
999
|
})]
|
|
939
1000
|
}),
|
|
940
|
-
|
|
941
|
-
relationship:
|
|
942
|
-
onClose: () =>
|
|
1001
|
+
I && /* @__PURE__ */ z(oe, {
|
|
1002
|
+
relationship: Y,
|
|
1003
|
+
onClose: () => H(!1)
|
|
943
1004
|
}),
|
|
944
|
-
|
|
945
|
-
relationshipId:
|
|
946
|
-
onClose: () =>
|
|
1005
|
+
U && /* @__PURE__ */ z(se, {
|
|
1006
|
+
relationshipId: Y.id,
|
|
1007
|
+
onClose: () => W(!1)
|
|
947
1008
|
}),
|
|
948
|
-
|
|
949
|
-
relationshipId:
|
|
950
|
-
onClose: () =>
|
|
1009
|
+
G && /* @__PURE__ */ z(ce, {
|
|
1010
|
+
relationshipId: Y.id,
|
|
1011
|
+
onClose: () => K(!1)
|
|
951
1012
|
})
|
|
952
1013
|
]
|
|
953
1014
|
});
|