@plumile/backoffice-react 0.1.156 → 0.1.158
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/lib/esm/auth/authRefreshNotice.css.js +1 -0
- package/lib/esm/auth/login/loginPage.css.js +0 -1
- package/lib/esm/auth/login/synchronizeAuthStatusQuery.js.map +1 -1
- package/lib/esm/components/backoffice/actions/BackofficeEntityActionFormDialog.js.map +1 -1
- package/lib/esm/components/backoffice/detail/BackofficeDetailRelationListBlock.js +1 -1
- package/lib/esm/components/backoffice/detail/BackofficeDetailRelationListBlock.js.map +1 -1
- package/lib/esm/components/backoffice/detail/BackofficeRelationsSummaryGrid.js.map +1 -1
- package/lib/esm/components/backoffice/filters/backofficeFilterAction.css.js +1 -0
- package/lib/esm/components/backoffice/refs/BackofficeLazyEntityCount.js +31 -0
- package/lib/esm/components/backoffice/refs/BackofficeLazyEntityCount.js.map +1 -0
- package/lib/esm/components/backoffice/refs/BackofficeRelatedCountLink.js +36 -32
- package/lib/esm/components/backoffice/refs/BackofficeRelatedCountLink.js.map +1 -1
- package/lib/esm/components/backoffice/refs/backofficeEntityIdRef.css.js +0 -1
- package/lib/esm/hooks/useBackofficeAuth.js.map +1 -1
- package/lib/esm/i18n/locales/en/backofficeReact.js +0 -1
- package/lib/esm/i18n/locales/en/backofficeReact.js.map +1 -1
- package/lib/esm/i18n/locales/fr/backofficeReact.js +0 -1
- package/lib/esm/i18n/locales/fr/backofficeReact.js.map +1 -1
- package/lib/esm/index.js +33 -32
- package/lib/esm/node_modules/relay-test-utils/index.js.map +1 -1
- package/lib/esm/pages/BackofficeEntityDetailPage.js +200 -214
- package/lib/esm/pages/BackofficeEntityDetailPage.js.map +1 -1
- package/lib/esm/pages/BackofficeEntityDetailPage.view-helpers.js +0 -1
- package/lib/esm/pages/BackofficeEntityDetailPage.view-helpers.js.map +1 -1
- package/lib/esm/pages/BackofficeEntityListPage.helpers.js +2 -2
- package/lib/esm/pages/BackofficeEntityListPage.helpers.js.map +1 -1
- package/lib/esm/pages/BackofficeEntityListPage.js +76 -269
- package/lib/esm/pages/BackofficeEntityListPage.js.map +1 -1
- package/lib/esm/relay/connectionUtils.js +1 -1
- package/lib/esm/relay/connectionUtils.js.map +1 -1
- package/lib/esm/subscriptions/useCursorResumableSubscription.js +18 -4
- package/lib/esm/subscriptions/useCursorResumableSubscription.js.map +1 -1
- package/lib/types/components/backoffice/detail/BackofficeDetailRelationListBlock.d.ts.map +1 -1
- package/lib/types/components/backoffice/detail/BackofficeRelationsSummaryGrid.d.ts +1 -1
- package/lib/types/components/backoffice/detail/BackofficeRelationsSummaryGrid.d.ts.map +1 -1
- package/lib/types/components/backoffice/refs/BackofficeLazyEntityCount.d.ts +8 -0
- package/lib/types/components/backoffice/refs/BackofficeLazyEntityCount.d.ts.map +1 -0
- package/lib/types/components/backoffice/refs/BackofficeRelatedCountLink.d.ts +1 -1
- package/lib/types/components/backoffice/refs/BackofficeRelatedCountLink.d.ts.map +1 -1
- package/lib/types/i18n/resources.d.ts +0 -2
- package/lib/types/i18n/resources.d.ts.map +1 -1
- package/lib/types/index.d.ts +1 -0
- package/lib/types/index.d.ts.map +1 -1
- package/lib/types/pages/BackofficeEntityDetailPage.d.ts.map +1 -1
- package/lib/types/pages/BackofficeEntityDetailPage.view-helpers.d.ts +2 -3
- package/lib/types/pages/BackofficeEntityDetailPage.view-helpers.d.ts.map +1 -1
- package/lib/types/pages/BackofficeEntityListPage.d.ts.map +1 -1
- package/lib/types/pages/BackofficeEntityListPage.helpers.d.ts +1 -6
- package/lib/types/pages/BackofficeEntityListPage.helpers.d.ts.map +1 -1
- package/lib/types/subscriptions/useCursorResumableSubscription.d.ts.map +1 -1
- package/package.json +16 -16
|
@@ -9,23 +9,20 @@ import { buildEntityListBreadcrumb as s } from "../components/backoffice/layout/
|
|
|
9
9
|
import { rowFlagsColumnCell as c } from "../components/backoffice/list/RowFlagsCell.css.js";
|
|
10
10
|
import { RowFlagsCell as l } from "../components/backoffice/list/RowFlagsCell.js";
|
|
11
11
|
import { useBackofficeListUrlState as u } from "../hooks/useBackofficeListUrlState.js";
|
|
12
|
-
import { buildActionsColumn as d, computeActionsColumnWidthPx as f, computeRowFlagsColumnWidthPx as p,
|
|
13
|
-
import { actionTrigger as
|
|
14
|
-
import { useCallback as
|
|
15
|
-
import {
|
|
16
|
-
import {
|
|
17
|
-
import {
|
|
18
|
-
import {
|
|
19
|
-
import {
|
|
20
|
-
import
|
|
21
|
-
import {
|
|
22
|
-
import
|
|
23
|
-
import {
|
|
24
|
-
import { LinkButton as de } from "@plumile/ui/atomic/atoms/button/LinkButton.js";
|
|
25
|
-
import { TableCell as fe } from "@plumile/ui/components/data-table/TableCell.js";
|
|
26
|
-
import { EyeSvg as pe } from "@plumile/ui/icons/EyeSvg.js";
|
|
12
|
+
import { buildActionsColumn as d, computeActionsColumnWidthPx as f, computeRowFlagsColumnWidthPx as p, isFormMutationAction as m, isRouteAction as h, resolveActionVariant as g, resolveLabel as _, resolveTrackBySize as v } from "./BackofficeEntityListPage.helpers.js";
|
|
13
|
+
import { actionTrigger as y, actionsColumnCell as b, headerActions as x } from "./backofficeEntityListPage.css.js";
|
|
14
|
+
import { useCallback as S, useMemo as C, useState as w } from "react";
|
|
15
|
+
import { jsx as T, jsxs as E } from "react/jsx-runtime";
|
|
16
|
+
import { useTranslation as D } from "react-i18next";
|
|
17
|
+
import { Button as O } from "@plumile/ui/atomic/atoms/button/Button.js";
|
|
18
|
+
import { usePaginationFragment as k, usePreloadedQuery as ee } from "react-relay";
|
|
19
|
+
import { BACKOFFICE_LIST_DEFAULTS as te, BACKOFFICE_LIST_REFETCH_POLICY as ne } from "@plumile/backoffice-core/constants.js";
|
|
20
|
+
import re from "@plumile/router/routing/Link.js";
|
|
21
|
+
import { LinkButton as ie } from "@plumile/ui/atomic/atoms/button/LinkButton.js";
|
|
22
|
+
import { TableCell as ae } from "@plumile/ui/components/data-table/TableCell.js";
|
|
23
|
+
import { EyeSvg as A } from "@plumile/ui/icons/EyeSvg.js";
|
|
27
24
|
//#region src/pages/BackofficeEntityListPage.tsx
|
|
28
|
-
var
|
|
25
|
+
var j = (e, t, n, r) => {
|
|
29
26
|
let i = t != null && t.length > 0, a = e;
|
|
30
27
|
if (i) {
|
|
31
28
|
let n = [{
|
|
@@ -53,254 +50,71 @@ var me = "store-or-network", he = (e, t, n, r) => {
|
|
|
53
50
|
columns: a,
|
|
54
51
|
gridTemplateColumns: g
|
|
55
52
|
};
|
|
56
|
-
},
|
|
57
|
-
let { t:
|
|
58
|
-
where: null,
|
|
59
|
-
sort: null
|
|
60
|
-
}, v = ce(m.query, o.query), k = se(m.fragment, v), j = x(() => m.getRows(k).map((e) => m.toRow(e)), [k, m]), N = x(() => m.getNextCursor?.(v) ?? null, [m, v]), [P, F] = C(j), [I, L] = C(N), [R, z] = C(!1), [B, V] = C(!1), [ge, H] = C(!1);
|
|
61
|
-
b(() => {
|
|
62
|
-
F(j), L(N);
|
|
63
|
-
}, [N, j]);
|
|
64
|
-
let { columns: U, gridTemplateColumns: _e } = x(() => {
|
|
65
|
-
let e = n(m.columns, {
|
|
66
|
-
tApp: s,
|
|
67
|
-
t: c
|
|
68
|
-
}), t = d({
|
|
69
|
-
ariaLabel: c("actions.view"),
|
|
70
|
-
fallback: c("common.notAvailable"),
|
|
71
|
-
className: re,
|
|
72
|
-
resolveDetailHref: (e) => i.routes.detail(e),
|
|
73
|
-
renderAction: ({ href: e, ariaLabel: t }) => /* @__PURE__ */ T(fe.Actions, { children: /* @__PURE__ */ T(ue, {
|
|
74
|
-
to: e,
|
|
75
|
-
className: ne,
|
|
76
|
-
"aria-label": t,
|
|
77
|
-
title: t,
|
|
78
|
-
preloadOnMouseEnter: !0,
|
|
79
|
-
children: /* @__PURE__ */ T(pe, {
|
|
80
|
-
width: 16,
|
|
81
|
-
height: 16
|
|
82
|
-
})
|
|
83
|
-
}) })
|
|
84
|
-
});
|
|
85
|
-
return he([...e, t], m.rowFlags, 1, s);
|
|
86
|
-
}, [
|
|
87
|
-
i.routes,
|
|
88
|
-
m.columns,
|
|
89
|
-
m.rowFlags,
|
|
90
|
-
c,
|
|
91
|
-
s
|
|
92
|
-
]), W = y((e) => m.getRowId(e), [m]), { state: G, pushState: ve } = u(i), K = G.sort ?? g.sort, { pageSize: q } = le, ye = y((e) => m.buildQueryVariables(e), [m]), J = S(0), be = S(M({
|
|
93
|
-
where: g.where,
|
|
94
|
-
sort: g.sort,
|
|
95
|
-
count: q
|
|
96
|
-
})), Y = y(async (e) => {
|
|
97
|
-
let t = J.current + 1;
|
|
98
|
-
J.current = t, e.mode === "append" ? z(!0) : V(!0), H(!1);
|
|
99
|
-
try {
|
|
100
|
-
let n = ye({
|
|
101
|
-
where: e.where,
|
|
102
|
-
sort: e.sort,
|
|
103
|
-
count: e.count,
|
|
104
|
-
cursor: e.cursor
|
|
105
|
-
}), r = await O(p, m.query, n, { fetchPolicy: me }).toPromise();
|
|
106
|
-
if (r == null || J.current !== t) return;
|
|
107
|
-
let i = m.getRows(r).map((e) => m.toRow(e));
|
|
108
|
-
F((t) => e.mode === "append" ? [...t, ...i] : i), L(m.getNextCursor?.(r) ?? null);
|
|
109
|
-
} catch {
|
|
110
|
-
J.current === t && H(!0);
|
|
111
|
-
} finally {
|
|
112
|
-
e.mode === "append" ? z(!1) : V(!1);
|
|
113
|
-
}
|
|
114
|
-
}, [
|
|
115
|
-
ye,
|
|
116
|
-
p,
|
|
117
|
-
m
|
|
118
|
-
]);
|
|
119
|
-
b(() => {
|
|
120
|
-
let e = M({
|
|
121
|
-
where: G.where,
|
|
122
|
-
sort: K,
|
|
123
|
-
count: q
|
|
124
|
-
});
|
|
125
|
-
be.current !== e && (be.current = e, Y({
|
|
126
|
-
where: G.where,
|
|
127
|
-
sort: K,
|
|
128
|
-
count: q,
|
|
129
|
-
cursor: null,
|
|
130
|
-
mode: "reset"
|
|
131
|
-
}).catch(() => {
|
|
132
|
-
H(!0);
|
|
133
|
-
}));
|
|
134
|
-
}, [
|
|
135
|
-
q,
|
|
136
|
-
K,
|
|
137
|
-
Y,
|
|
138
|
-
G.where
|
|
139
|
-
]);
|
|
140
|
-
let X = y(() => {
|
|
141
|
-
B || Y({
|
|
142
|
-
where: G.where,
|
|
143
|
-
sort: K,
|
|
144
|
-
count: q,
|
|
145
|
-
cursor: null,
|
|
146
|
-
mode: "reset"
|
|
147
|
-
}).catch(() => {
|
|
148
|
-
H(!0);
|
|
149
|
-
});
|
|
150
|
-
}, [
|
|
151
|
-
B,
|
|
152
|
-
q,
|
|
153
|
-
K,
|
|
154
|
-
Y,
|
|
155
|
-
G.where
|
|
156
|
-
]), xe = r({
|
|
157
|
-
hasNext: I != null,
|
|
158
|
-
isLoadingNext: R,
|
|
159
|
-
loadNext: (e) => {
|
|
160
|
-
I != null && Y({
|
|
161
|
-
where: G.where,
|
|
162
|
-
sort: K,
|
|
163
|
-
count: e,
|
|
164
|
-
cursor: I,
|
|
165
|
-
mode: "append"
|
|
166
|
-
}).catch(() => {
|
|
167
|
-
H(!0);
|
|
168
|
-
});
|
|
169
|
-
},
|
|
170
|
-
count: q
|
|
171
|
-
}), Z = x(() => i.listActions ?? [], [i.listActions]), Q = x(() => Z.filter((e) => e.isVisible == null ? !0 : e.isVisible(null)), [Z]), Se = x(() => {
|
|
172
|
-
if (Q.length !== 0) return /* @__PURE__ */ T("div", {
|
|
173
|
-
className: ie,
|
|
174
|
-
children: Q.map((e, t) => {
|
|
175
|
-
let { variant: n } = e, r = _(e.label, s), i = r;
|
|
176
|
-
e.ariaLabel != null && (i = _(e.ariaLabel, s));
|
|
177
|
-
let a = te(n, t), o = e.size ?? "small", c = e.isDisabled?.(null) === !0;
|
|
178
|
-
return ee(e) ? /* @__PURE__ */ T(de, {
|
|
179
|
-
to: e.to(null),
|
|
180
|
-
variant: a,
|
|
181
|
-
size: o,
|
|
182
|
-
isDisabled: c,
|
|
183
|
-
"aria-label": i,
|
|
184
|
-
preloadOnMouseEnter: !0,
|
|
185
|
-
children: r
|
|
186
|
-
}, e.id) : h(e) ? /* @__PURE__ */ T(D, {
|
|
187
|
-
type: "button",
|
|
188
|
-
variant: a,
|
|
189
|
-
size: o,
|
|
190
|
-
disabled: c,
|
|
191
|
-
onClick: () => {
|
|
192
|
-
f(e.id);
|
|
193
|
-
},
|
|
194
|
-
"aria-label": i,
|
|
195
|
-
children: r
|
|
196
|
-
}, e.id) : null;
|
|
197
|
-
})
|
|
198
|
-
});
|
|
199
|
-
}, [s, Q]), $ = Z.find((e) => e.id === l), Ce = null;
|
|
200
|
-
return ge && (Ce = /* @__PURE__ */ T(ae, {
|
|
201
|
-
tone: "danger",
|
|
202
|
-
title: c("list.errors.title"),
|
|
203
|
-
actions: /* @__PURE__ */ T(D, {
|
|
204
|
-
type: "button",
|
|
205
|
-
variant: "secondary",
|
|
206
|
-
size: "small",
|
|
207
|
-
onClick: X,
|
|
208
|
-
children: c("list.actions.retry")
|
|
209
|
-
}),
|
|
210
|
-
onDismiss: () => {
|
|
211
|
-
H(!1);
|
|
212
|
-
},
|
|
213
|
-
children: c("list.errors.fetchFailed")
|
|
214
|
-
})), /* @__PURE__ */ oe(w, { children: [/* @__PURE__ */ T(a, {
|
|
215
|
-
config: i,
|
|
216
|
-
state: G,
|
|
217
|
-
pushState: ve,
|
|
218
|
-
headerActions: Se,
|
|
219
|
-
rows: P,
|
|
220
|
-
columns: U,
|
|
221
|
-
gridTemplateColumns: _e,
|
|
222
|
-
getRowId: W,
|
|
223
|
-
hasNextPage: I != null,
|
|
224
|
-
isLoadingMore: R,
|
|
225
|
-
isRefreshing: B,
|
|
226
|
-
onLoadMore: xe,
|
|
227
|
-
onRefresh: X,
|
|
228
|
-
totalCount: null,
|
|
229
|
-
statusBanner: Ce
|
|
230
|
-
}), $ != null && h($) && /* @__PURE__ */ T(t, {
|
|
231
|
-
isOpen: !0,
|
|
232
|
-
action: $,
|
|
233
|
-
node: null,
|
|
234
|
-
onClose: () => {
|
|
235
|
-
f(null);
|
|
236
|
-
},
|
|
237
|
-
onSuccess: X
|
|
238
|
-
})] });
|
|
239
|
-
}, P = ({ config: s, prepared: c, breadcrumb: l }) => {
|
|
240
|
-
let f = s.list, { t: p } = E(), { t: m } = e(), [g, v] = C(null), b = ce(f.query, c.query), { data: S, loadNext: ae, hasNext: w, isLoadingNext: O, refetch: se } = k(f.fragment, b), A = f.getConnection(S), M = x(() => A.edges.map((e) => f.toRow(e.node)), [A.edges, f]), { columns: me, gridTemplateColumns: N } = x(() => {
|
|
53
|
+
}, M = ({ config: s, prepared: c, breadcrumb: l }) => {
|
|
54
|
+
let f = s.list, { t: p } = D(), { t: v } = e(), [M, N] = w(null), P = ee(f.query, c.query), { data: F, loadNext: I, hasNext: L, isLoadingNext: R, refetch: z } = k(f.fragment, P), B = f.getConnection(F), V = C(() => B.edges.map((e) => f.toRow(e.node)), [B.edges, f]), { columns: H, gridTemplateColumns: U } = C(() => {
|
|
241
55
|
let e = n(f.columns, {
|
|
242
56
|
tApp: p,
|
|
243
|
-
t:
|
|
57
|
+
t: v
|
|
244
58
|
}), t = d({
|
|
245
|
-
ariaLabel:
|
|
246
|
-
fallback:
|
|
247
|
-
className:
|
|
59
|
+
ariaLabel: v("actions.view"),
|
|
60
|
+
fallback: v("common.notAvailable"),
|
|
61
|
+
className: b,
|
|
248
62
|
resolveDetailHref: (e) => s.routes.detail(e),
|
|
249
|
-
renderAction: ({ href: e, ariaLabel: t }) => /* @__PURE__ */ T(
|
|
63
|
+
renderAction: ({ href: e, ariaLabel: t }) => /* @__PURE__ */ T(ae.Actions, { children: /* @__PURE__ */ T(re, {
|
|
250
64
|
to: e,
|
|
251
|
-
className:
|
|
65
|
+
className: y,
|
|
252
66
|
"aria-label": t,
|
|
253
67
|
title: t,
|
|
254
68
|
preloadOnMouseEnter: !0,
|
|
255
|
-
children: /* @__PURE__ */ T(
|
|
69
|
+
children: /* @__PURE__ */ T(A, {
|
|
256
70
|
width: 16,
|
|
257
71
|
height: 16
|
|
258
72
|
})
|
|
259
73
|
}) })
|
|
260
74
|
});
|
|
261
|
-
return
|
|
75
|
+
return j([...e, t], f.rowFlags, 1, p);
|
|
262
76
|
}, [
|
|
263
77
|
s.routes,
|
|
264
78
|
f.columns,
|
|
265
79
|
f.rowFlags,
|
|
266
|
-
|
|
80
|
+
v,
|
|
267
81
|
p
|
|
268
|
-
]),
|
|
82
|
+
]), W = S((e) => f.getRowId(e), [f]), { state: G, pushState: K } = u(s), q = s.listDefaults ?? f.defaultState ?? {
|
|
269
83
|
where: null,
|
|
270
84
|
sort: null
|
|
271
|
-
},
|
|
272
|
-
refetch:
|
|
273
|
-
variables:
|
|
274
|
-
where:
|
|
275
|
-
sort:
|
|
276
|
-
count:
|
|
85
|
+
}, J = G.sort ?? q.sort, { pageSize: Y } = te, { isRefreshing: oe, onRefresh: X } = i({
|
|
86
|
+
refetch: z,
|
|
87
|
+
variables: C(() => ({
|
|
88
|
+
where: G.where,
|
|
89
|
+
sort: J,
|
|
90
|
+
count: Y,
|
|
277
91
|
cursor: null
|
|
278
92
|
}), [
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
93
|
+
Y,
|
|
94
|
+
J,
|
|
95
|
+
G.where
|
|
282
96
|
]),
|
|
283
97
|
defaults: {
|
|
284
|
-
where:
|
|
285
|
-
sort:
|
|
286
|
-
count:
|
|
98
|
+
where: q.where,
|
|
99
|
+
sort: q.sort,
|
|
100
|
+
count: Y,
|
|
287
101
|
cursor: null
|
|
288
102
|
},
|
|
289
|
-
fetchPolicy:
|
|
103
|
+
fetchPolicy: ne,
|
|
290
104
|
buildQueryVariables: f.buildQueryVariables
|
|
291
|
-
}),
|
|
292
|
-
hasNext:
|
|
293
|
-
isLoadingNext:
|
|
294
|
-
loadNext:
|
|
295
|
-
count:
|
|
296
|
-
}),
|
|
297
|
-
if (
|
|
298
|
-
className:
|
|
299
|
-
children:
|
|
105
|
+
}), se = r({
|
|
106
|
+
hasNext: L,
|
|
107
|
+
isLoadingNext: R,
|
|
108
|
+
loadNext: I,
|
|
109
|
+
count: Y
|
|
110
|
+
}), Z = C(() => s.listActions ?? [], [s.listActions]), Q = C(() => Z.filter((e) => e.isVisible == null ? !0 : e.isVisible(null)), [Z]), ce = C(() => {
|
|
111
|
+
if (Q.length !== 0) return /* @__PURE__ */ T("div", {
|
|
112
|
+
className: x,
|
|
113
|
+
children: Q.map((e, t) => {
|
|
300
114
|
let { variant: n } = e, r = _(e.label, p), i = r;
|
|
301
115
|
e.ariaLabel != null && (i = _(e.ariaLabel, p));
|
|
302
|
-
let a =
|
|
303
|
-
return
|
|
116
|
+
let a = g(n, t), o = e.size ?? "small", s = e.isDisabled?.(null) === !0;
|
|
117
|
+
return h(e) ? /* @__PURE__ */ T(ie, {
|
|
304
118
|
to: e.to(null),
|
|
305
119
|
variant: a,
|
|
306
120
|
size: o,
|
|
@@ -308,64 +122,57 @@ var me = "store-or-network", he = (e, t, n, r) => {
|
|
|
308
122
|
"aria-label": i,
|
|
309
123
|
preloadOnMouseEnter: !0,
|
|
310
124
|
children: r
|
|
311
|
-
}, e.id) :
|
|
125
|
+
}, e.id) : m(e) ? /* @__PURE__ */ T(O, {
|
|
312
126
|
type: "button",
|
|
313
127
|
variant: a,
|
|
314
128
|
size: o,
|
|
315
129
|
disabled: s,
|
|
316
130
|
onClick: () => {
|
|
317
|
-
|
|
131
|
+
N(e.id);
|
|
318
132
|
},
|
|
319
133
|
"aria-label": i,
|
|
320
134
|
children: r
|
|
321
135
|
}, e.id) : null;
|
|
322
136
|
})
|
|
323
137
|
});
|
|
324
|
-
}, [p,
|
|
325
|
-
return /* @__PURE__ */
|
|
138
|
+
}, [p, Q]), $ = Z.find((e) => e.id === M);
|
|
139
|
+
return /* @__PURE__ */ E(o, {
|
|
326
140
|
breadcrumb: l,
|
|
327
141
|
children: [/* @__PURE__ */ T(a, {
|
|
328
142
|
config: s,
|
|
329
|
-
state:
|
|
330
|
-
pushState:
|
|
331
|
-
headerActions:
|
|
332
|
-
rows:
|
|
333
|
-
columns:
|
|
334
|
-
gridTemplateColumns:
|
|
335
|
-
getRowId:
|
|
336
|
-
hasNextPage:
|
|
337
|
-
isLoadingMore:
|
|
338
|
-
isRefreshing:
|
|
339
|
-
onLoadMore:
|
|
340
|
-
onRefresh:
|
|
341
|
-
totalCount:
|
|
342
|
-
}),
|
|
143
|
+
state: G,
|
|
144
|
+
pushState: K,
|
|
145
|
+
headerActions: ce,
|
|
146
|
+
rows: V,
|
|
147
|
+
columns: H,
|
|
148
|
+
gridTemplateColumns: U,
|
|
149
|
+
getRowId: W,
|
|
150
|
+
hasNextPage: L,
|
|
151
|
+
isLoadingMore: R,
|
|
152
|
+
isRefreshing: oe,
|
|
153
|
+
onLoadMore: se,
|
|
154
|
+
onRefresh: X,
|
|
155
|
+
totalCount: B.totalCount ?? null
|
|
156
|
+
}), $ != null && m($) && /* @__PURE__ */ T(t, {
|
|
343
157
|
isOpen: !0,
|
|
344
|
-
action:
|
|
158
|
+
action: $,
|
|
345
159
|
node: null,
|
|
346
160
|
onClose: () => {
|
|
347
|
-
|
|
161
|
+
N(null);
|
|
348
162
|
},
|
|
349
|
-
onSuccess:
|
|
163
|
+
onSuccess: X
|
|
350
164
|
})]
|
|
351
165
|
});
|
|
352
|
-
},
|
|
353
|
-
let { t: r } =
|
|
354
|
-
return
|
|
355
|
-
breadcrumb: i,
|
|
356
|
-
children: /* @__PURE__ */ T(N, {
|
|
357
|
-
entityManifest: e,
|
|
358
|
-
config: t,
|
|
359
|
-
prepared: n
|
|
360
|
-
})
|
|
361
|
-
}) : m(t) ? /* @__PURE__ */ T(P, {
|
|
166
|
+
}, N = ({ entityManifest: e, config: t, prepared: n }) => {
|
|
167
|
+
let { t: r } = D();
|
|
168
|
+
return /* @__PURE__ */ T(M, {
|
|
362
169
|
entityManifest: e,
|
|
363
170
|
config: t,
|
|
364
171
|
prepared: n,
|
|
365
|
-
breadcrumb:
|
|
366
|
-
})
|
|
172
|
+
breadcrumb: s(t, r)
|
|
173
|
+
});
|
|
367
174
|
};
|
|
368
175
|
//#endregion
|
|
369
|
-
export {
|
|
176
|
+
export { N as BackofficeEntityListPage, N as default };
|
|
370
177
|
|
|
371
178
|
//# sourceMappingURL=BackofficeEntityListPage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BackofficeEntityListPage.js","names":[],"sources":["../../../src/pages/BackofficeEntityListPage.tsx"],"sourcesContent":["import {\n type JSX,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport type { TFunction } from 'i18next';\nimport { useTranslation } from 'react-i18next';\nimport Link from '@plumile/router/routing/Link.js';\nimport {\n useFragment,\n usePaginationFragment,\n usePreloadedQuery,\n useRelayEnvironment,\n} from 'react-relay';\nimport { fetchQuery } from 'relay-runtime';\nimport {\n BACKOFFICE_LIST_DEFAULTS,\n BACKOFFICE_LIST_REFETCH_POLICY,\n} from '@plumile/backoffice-core/constants.js';\nimport { stableListVariablesKey } from '@plumile/backoffice-core/state/stableKey.js';\nimport type {\n BackofficeEntityManifestItem,\n BackofficePreparedListRoute,\n BackofficeRuntimeResolvedListFacetConfig,\n BackofficeRowFlagSpec,\n} from '@plumile/backoffice-core/types.js';\nimport { Button } from '@plumile/ui/atomic/atoms/button/Button.js';\nimport { LinkButton } from '@plumile/ui/atomic/atoms/button/LinkButton.js';\nimport { InlineBanner } from '@plumile/ui/components/feedback/InlineBanner.js';\nimport {\n type DataTableColumn,\n type GetRowId,\n} from '@plumile/ui/components/data-table/DataTable.js';\nimport { TableCell } from '@plumile/ui/components/data-table/TableCell.js';\nimport { EyeSvg } from '@plumile/ui/icons/EyeSvg.js';\nimport { BackofficeEntityListScaffold } from '../components/backoffice/scaffolds/BackofficeEntityListScaffold.js';\nimport { LazyBackofficeEntityActionFormDialog } from '../components/backoffice/actions/LazyBackofficeEntityActionFormDialog.js';\nimport { buildDataTableColumns } from '../components/backoffice/columns/buildDataTableColumns.js';\nimport { RowFlagsCell } from '../components/backoffice/list/RowFlagsCell.js';\nimport { useBackofficeListUrlState } from '../hooks/useBackofficeListUrlState.js';\nimport { useBackofficeLoadMore } from '../hooks/useBackofficeLoadMore.js';\nimport { useBackofficeListRefetch } from '../hooks/useBackofficeListRefetch.js';\nimport { useBackofficeReactTranslation } from '../i18n/useBackofficeReactTranslation.js';\nimport * as pageStyles from './backofficeEntityListPage.css.js';\nimport { rowFlagsColumnCell } from '../components/backoffice/list/RowFlagsCell.css.js';\nimport { BackofficeRightPageLayout } from '../components/backoffice/layout/breadcrumb/BackofficeRightPageLayout.js';\nimport { buildEntityListBreadcrumb } from '../components/backoffice/layout/breadcrumb/buildBreadcrumbs.js';\nimport {\n buildActionsColumn,\n computeActionsColumnWidthPx,\n computeRowFlagsColumnWidthPx,\n isFormMutationAction,\n isConnectionListConfig,\n isRecordListConfig,\n isRouteAction,\n resolveLabel,\n resolveActionVariant,\n resolveTrackBySize,\n type ConnectionListConfig,\n type RecordListConfig,\n} from './BackofficeEntityListPage.helpers.js';\n\nexport type BackofficeEntityListPageProps = {\n entityManifest: BackofficeEntityManifestItem;\n config: BackofficeRuntimeResolvedListFacetConfig;\n prepared: BackofficePreparedListRoute;\n};\n\ntype RecordFetchMode = 'append' | 'reset';\ntype RecordFetchInput = {\n where: Record<string, unknown> | null;\n sort: string | null;\n count: number;\n cursor: string | null;\n mode: RecordFetchMode;\n};\n\nconst RECORD_FETCH_POLICY = 'store-or-network' as const;\n\nconst applyListEdgeColumns = <Row,>(\n inputColumns: readonly DataTableColumn<Row>[],\n rowFlags: readonly BackofficeRowFlagSpec<Row>[] | undefined,\n actionCount: number,\n tApp: TFunction,\n): {\n columns: readonly DataTableColumn<Row>[];\n gridTemplateColumns?: string;\n} => {\n const hasFlags = rowFlags != null && rowFlags.length > 0;\n\n let columns = inputColumns;\n if (hasFlags) {\n const flagsColumn: DataTableColumn<Row> = {\n id: '__rowFlags',\n header: '',\n className: rowFlagsColumnCell,\n mobileRole: 'badge',\n cell: (row) => {\n return <RowFlagsCell row={row} flags={rowFlags} tApp={tApp} />;\n },\n };\n\n // Ensure we never pick the flags column as \"primary\".\n const withFlags = [flagsColumn, ...inputColumns];\n const hasPrimary = withFlags.some((col) => {\n return col.isPrimary === true;\n });\n\n columns = withFlags;\n if (!hasPrimary) {\n columns = withFlags.map((col, index) => {\n if (index === 1) {\n return { ...col, isPrimary: true };\n }\n return col;\n });\n }\n }\n\n let flagCount = 0;\n if (hasFlags) {\n flagCount = rowFlags.length;\n }\n const flagsWidthPx = computeRowFlagsColumnWidthPx(flagCount);\n const actionsWidthPx = computeActionsColumnWidthPx(actionCount);\n\n // We always include the right-side \"actions\" column in list pages.\n let leftColumnCount = 0;\n if (hasFlags) {\n leftColumnCount = 1;\n }\n const middleCount = columns.length - leftColumnCount - 1;\n\n const middleTracks = columns\n .slice(leftColumnCount, leftColumnCount + Math.max(0, middleCount))\n .map((column) => {\n return resolveTrackBySize(column as DataTableColumn<unknown>, '1fr');\n })\n .join(' ');\n\n let gridTemplateColumns = '';\n if (hasFlags) {\n gridTemplateColumns = `${flagsWidthPx}px ${middleTracks} ${actionsWidthPx}px`;\n } else {\n gridTemplateColumns = `${middleTracks} ${actionsWidthPx}px`;\n }\n\n return { columns, gridTemplateColumns };\n};\n\nconst BackofficeEntityRecordListPage = ({\n config,\n prepared,\n}: Omit<BackofficeEntityListPageProps, 'config'> & {\n config: RecordListConfig;\n}): JSX.Element | null => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const [activeFormActionId, setActiveFormActionId] = useState<string | null>(\n null,\n );\n const environment = useRelayEnvironment();\n\n const listConfig = config.list;\n const listDefaults = config.listDefaults ??\n listConfig.defaultState ?? { where: null, sort: null };\n const queryData = usePreloadedQuery(listConfig.query, prepared.query);\n const fragmentData = useFragment(listConfig.fragment, queryData as never);\n\n const initialRows = useMemo(() => {\n return listConfig.getRows(fragmentData).map((row) => {\n return listConfig.toRow(row);\n });\n }, [fragmentData, listConfig]);\n\n const initialCursor = useMemo(() => {\n return listConfig.getNextCursor?.(queryData) ?? null;\n }, [listConfig, queryData]);\n\n const [rows, setRows] = useState(initialRows);\n const [nextCursor, setNextCursor] = useState(initialCursor);\n const [isLoadingMore, setIsLoadingMore] = useState(false);\n const [isRefreshing, setIsRefreshing] = useState(false);\n const [fetchError, setFetchError] = useState(false);\n\n useEffect(() => {\n setRows(initialRows);\n setNextCursor(initialCursor);\n }, [initialCursor, initialRows]);\n\n const { columns, gridTemplateColumns } = useMemo((): {\n columns: readonly DataTableColumn<unknown>[];\n gridTemplateColumns?: string;\n } => {\n const baseColumns = buildDataTableColumns(listConfig.columns, {\n tApp,\n t,\n });\n const actionsColumn = buildActionsColumn({\n ariaLabel: t('actions.view'),\n fallback: t('common.notAvailable'),\n className: pageStyles.actionsColumnCell,\n resolveDetailHref: (id) => {\n return config.routes.detail(id);\n },\n renderAction: ({ href, ariaLabel }) => {\n return (\n <TableCell.Actions>\n <Link\n to={href}\n className={pageStyles.actionTrigger}\n aria-label={ariaLabel}\n title={ariaLabel}\n preloadOnMouseEnter\n >\n <EyeSvg width={16} height={16} />\n </Link>\n </TableCell.Actions>\n );\n },\n });\n const allColumns = [...baseColumns, actionsColumn];\n return applyListEdgeColumns(allColumns, listConfig.rowFlags, 1, tApp);\n }, [config.routes, listConfig.columns, listConfig.rowFlags, t, tApp]);\n\n const getRowId = useCallback<GetRowId<unknown>>(\n (row) => {\n return listConfig.getRowId(row);\n },\n [listConfig],\n );\n\n const { state, pushState } = useBackofficeListUrlState(config);\n const resolvedSort = state.sort ?? listDefaults.sort;\n const { pageSize } = BACKOFFICE_LIST_DEFAULTS;\n\n const buildVariables = useCallback(\n (input: {\n where: Record<string, unknown> | null;\n sort: string | null;\n count: number;\n cursor: string | null;\n }) => {\n return listConfig.buildQueryVariables(input);\n },\n [listConfig],\n );\n\n const requestIdRef = useRef(0);\n const lastRefetchKeyRef = useRef(\n stableListVariablesKey({\n where: listDefaults.where,\n sort: listDefaults.sort,\n count: pageSize,\n }),\n );\n\n const runFetch = useCallback(\n async (input: RecordFetchInput) => {\n const requestId = requestIdRef.current + 1;\n requestIdRef.current = requestId;\n\n if (input.mode === 'append') {\n setIsLoadingMore(true);\n } else {\n setIsRefreshing(true);\n }\n setFetchError(false);\n\n try {\n const variables = buildVariables({\n where: input.where,\n sort: input.sort,\n count: input.count,\n cursor: input.cursor,\n });\n\n const response = await fetchQuery(\n environment,\n listConfig.query,\n variables as never,\n { fetchPolicy: RECORD_FETCH_POLICY },\n ).toPromise();\n\n if (response == null || requestIdRef.current !== requestId) {\n return;\n }\n\n const nextRows = listConfig.getRows(response as never).map((row) => {\n return listConfig.toRow(row);\n });\n setRows((prev) => {\n if (input.mode === 'append') {\n return [...prev, ...nextRows];\n }\n return nextRows;\n });\n const cursor = listConfig.getNextCursor?.(response) ?? null;\n setNextCursor(cursor);\n } catch {\n if (requestIdRef.current === requestId) {\n setFetchError(true);\n }\n } finally {\n if (input.mode === 'append') {\n setIsLoadingMore(false);\n } else {\n setIsRefreshing(false);\n }\n }\n },\n [buildVariables, environment, listConfig],\n );\n\n useEffect(() => {\n const key = stableListVariablesKey({\n where: state.where,\n sort: resolvedSort,\n count: pageSize,\n });\n if (lastRefetchKeyRef.current === key) {\n return;\n }\n lastRefetchKeyRef.current = key;\n runFetch({\n where: state.where,\n sort: resolvedSort,\n count: pageSize,\n cursor: null,\n mode: 'reset',\n }).catch(() => {\n setFetchError(true);\n });\n }, [pageSize, resolvedSort, runFetch, state.where]);\n\n const handleRefresh = useCallback(() => {\n if (isRefreshing) {\n return;\n }\n runFetch({\n where: state.where,\n sort: resolvedSort,\n count: pageSize,\n cursor: null,\n mode: 'reset',\n }).catch(() => {\n setFetchError(true);\n });\n }, [isRefreshing, pageSize, resolvedSort, runFetch, state.where]);\n\n const handleLoadMore = useBackofficeLoadMore({\n hasNext: nextCursor != null,\n isLoadingNext: isLoadingMore,\n loadNext: (count) => {\n if (nextCursor == null) {\n return;\n }\n runFetch({\n where: state.where,\n sort: resolvedSort,\n count,\n cursor: nextCursor,\n mode: 'append',\n }).catch(() => {\n setFetchError(true);\n });\n },\n count: pageSize,\n });\n\n const listActions = useMemo(() => {\n return config.listActions ?? [];\n }, [config.listActions]);\n const visibleActions = useMemo(() => {\n return listActions.filter((action) => {\n if (action.isVisible == null) {\n return true;\n }\n return action.isVisible(null);\n });\n }, [listActions]);\n\n const headerActions = useMemo(() => {\n if (visibleActions.length === 0) {\n return undefined;\n }\n return (\n <div className={pageStyles.headerActions}>\n {visibleActions.map((action, index) => {\n const { variant: actionVariant } = action;\n const label = resolveLabel(action.label, tApp);\n let ariaLabel = label;\n if (action.ariaLabel != null) {\n ariaLabel = resolveLabel(action.ariaLabel, tApp);\n }\n const variant = resolveActionVariant(actionVariant, index);\n const size = action.size ?? 'small';\n const isDisabled = action.isDisabled?.(null) === true;\n\n if (isRouteAction(action)) {\n const href = action.to(null);\n return (\n <LinkButton\n key={action.id}\n to={href}\n variant={variant}\n size={size}\n isDisabled={isDisabled}\n aria-label={ariaLabel}\n preloadOnMouseEnter\n >\n {label}\n </LinkButton>\n );\n }\n\n if (isFormMutationAction(action)) {\n return (\n <Button\n key={action.id}\n type=\"button\"\n variant={variant}\n size={size}\n disabled={isDisabled}\n onClick={() => {\n setActiveFormActionId(action.id);\n }}\n aria-label={ariaLabel}\n >\n {label}\n </Button>\n );\n }\n\n return null;\n })}\n </div>\n );\n }, [tApp, visibleActions]);\n\n const activeFormAction = listActions.find((action) => {\n return action.id === activeFormActionId;\n });\n\n let statusBanner: JSX.Element | null = null;\n if (fetchError) {\n statusBanner = (\n <InlineBanner\n tone=\"danger\"\n title={t('list.errors.title')}\n actions={\n <Button\n type=\"button\"\n variant=\"secondary\"\n size=\"small\"\n onClick={handleRefresh}\n >\n {t('list.actions.retry')}\n </Button>\n }\n onDismiss={() => {\n setFetchError(false);\n }}\n >\n {t('list.errors.fetchFailed')}\n </InlineBanner>\n );\n }\n\n return (\n <>\n <BackofficeEntityListScaffold\n config={config}\n state={state}\n pushState={pushState}\n headerActions={headerActions}\n rows={rows}\n columns={columns}\n gridTemplateColumns={gridTemplateColumns}\n getRowId={getRowId}\n hasNextPage={nextCursor != null}\n isLoadingMore={isLoadingMore}\n isRefreshing={isRefreshing}\n onLoadMore={handleLoadMore}\n onRefresh={handleRefresh}\n totalCount={null}\n statusBanner={statusBanner}\n />\n {activeFormAction != null && isFormMutationAction(activeFormAction) && (\n <LazyBackofficeEntityActionFormDialog\n isOpen\n action={activeFormAction}\n node={null}\n onClose={() => {\n setActiveFormActionId(null);\n }}\n onSuccess={handleRefresh}\n />\n )}\n </>\n );\n};\n\nconst BackofficeEntityConnectionListPage = ({\n config,\n prepared,\n breadcrumb,\n}: Omit<BackofficeEntityListPageProps, 'config'> & {\n config: ConnectionListConfig;\n breadcrumb: ReturnType<typeof buildEntityListBreadcrumb>;\n}): JSX.Element | null => {\n const listConfig = config.list;\n\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const [activeFormActionId, setActiveFormActionId] = useState<string | null>(\n null,\n );\n\n const queryData = usePreloadedQuery(listConfig.query, prepared.query);\n const {\n data: fragmentData,\n loadNext,\n hasNext,\n isLoadingNext,\n refetch,\n } = usePaginationFragment(listConfig.fragment, queryData as never);\n\n const connection = listConfig.getConnection(fragmentData);\n\n const rows = useMemo(() => {\n return connection.edges.map((edge) => {\n return listConfig.toRow(edge.node);\n });\n }, [connection.edges, listConfig]);\n\n const { columns, gridTemplateColumns } = useMemo((): {\n columns: readonly DataTableColumn<unknown>[];\n gridTemplateColumns?: string;\n } => {\n const baseColumns = buildDataTableColumns(listConfig.columns, {\n tApp,\n t,\n });\n const actionsColumn = buildActionsColumn({\n ariaLabel: t('actions.view'),\n fallback: t('common.notAvailable'),\n className: pageStyles.actionsColumnCell,\n resolveDetailHref: (id) => {\n return config.routes.detail(id);\n },\n renderAction: ({ href, ariaLabel }) => {\n return (\n <TableCell.Actions>\n <Link\n to={href}\n className={pageStyles.actionTrigger}\n aria-label={ariaLabel}\n title={ariaLabel}\n preloadOnMouseEnter\n >\n <EyeSvg width={16} height={16} />\n </Link>\n </TableCell.Actions>\n );\n },\n });\n const allColumns = [...baseColumns, actionsColumn];\n return applyListEdgeColumns(allColumns, listConfig.rowFlags, 1, tApp);\n }, [config.routes, listConfig.columns, listConfig.rowFlags, t, tApp]);\n\n const getRowId = useCallback<GetRowId<unknown>>(\n (row) => {\n return listConfig.getRowId(row);\n },\n [listConfig],\n );\n\n const { state, pushState } = useBackofficeListUrlState(config);\n const listDefaults = config.listDefaults ??\n listConfig.defaultState ?? { where: null, sort: null };\n const resolvedSort = state.sort ?? listDefaults.sort;\n const { pageSize } = BACKOFFICE_LIST_DEFAULTS;\n\n const baseVariables = useMemo(() => {\n return {\n where: state.where,\n sort: resolvedSort,\n count: pageSize,\n cursor: null,\n };\n }, [pageSize, resolvedSort, state.where]);\n\n const { isRefreshing, onRefresh } = useBackofficeListRefetch({\n refetch,\n variables: baseVariables,\n defaults: {\n where: listDefaults.where,\n sort: listDefaults.sort,\n count: pageSize,\n cursor: null,\n },\n fetchPolicy: BACKOFFICE_LIST_REFETCH_POLICY,\n buildQueryVariables: listConfig.buildQueryVariables,\n });\n\n const handleLoadMore = useBackofficeLoadMore({\n hasNext,\n isLoadingNext,\n loadNext,\n count: pageSize,\n });\n\n const listActions = useMemo(() => {\n return config.listActions ?? [];\n }, [config.listActions]);\n const visibleActions = useMemo(() => {\n return listActions.filter((action) => {\n if (action.isVisible == null) {\n return true;\n }\n return action.isVisible(null);\n });\n }, [listActions]);\n\n const headerActions = useMemo(() => {\n if (visibleActions.length === 0) {\n return undefined;\n }\n return (\n <div className={pageStyles.headerActions}>\n {visibleActions.map((action, index) => {\n const { variant: actionVariant } = action;\n const label = resolveLabel(action.label, tApp);\n let ariaLabel = label;\n if (action.ariaLabel != null) {\n ariaLabel = resolveLabel(action.ariaLabel, tApp);\n }\n const variant = resolveActionVariant(actionVariant, index);\n const size = action.size ?? 'small';\n const isDisabled = action.isDisabled?.(null) === true;\n\n if (isRouteAction(action)) {\n const href = action.to(null);\n return (\n <LinkButton\n key={action.id}\n to={href}\n variant={variant}\n size={size}\n isDisabled={isDisabled}\n aria-label={ariaLabel}\n preloadOnMouseEnter\n >\n {label}\n </LinkButton>\n );\n }\n\n if (isFormMutationAction(action)) {\n return (\n <Button\n key={action.id}\n type=\"button\"\n variant={variant}\n size={size}\n disabled={isDisabled}\n onClick={() => {\n setActiveFormActionId(action.id);\n }}\n aria-label={ariaLabel}\n >\n {label}\n </Button>\n );\n }\n\n return null;\n })}\n </div>\n );\n }, [tApp, visibleActions]);\n\n const activeFormAction = listActions.find((action) => {\n return action.id === activeFormActionId;\n });\n\n return (\n <BackofficeRightPageLayout breadcrumb={breadcrumb}>\n <BackofficeEntityListScaffold\n config={config}\n state={state}\n pushState={pushState}\n headerActions={headerActions}\n rows={rows}\n columns={columns}\n gridTemplateColumns={gridTemplateColumns}\n getRowId={getRowId}\n hasNextPage={hasNext}\n isLoadingMore={isLoadingNext}\n isRefreshing={isRefreshing}\n onLoadMore={handleLoadMore}\n onRefresh={onRefresh}\n totalCount={connection.totalCount ?? null}\n />\n {activeFormAction != null && isFormMutationAction(activeFormAction) && (\n <LazyBackofficeEntityActionFormDialog\n isOpen\n action={activeFormAction}\n node={null}\n onClose={() => {\n setActiveFormActionId(null);\n }}\n onSuccess={onRefresh}\n />\n )}\n </BackofficeRightPageLayout>\n );\n};\n\nexport const BackofficeEntityListPage = ({\n entityManifest,\n config,\n prepared,\n}: BackofficeEntityListPageProps): JSX.Element | null => {\n const { t: tApp } = useTranslation();\n const breadcrumb = buildEntityListBreadcrumb(config, tApp);\n\n if (isRecordListConfig(config)) {\n return (\n <BackofficeRightPageLayout breadcrumb={breadcrumb}>\n <BackofficeEntityRecordListPage\n entityManifest={entityManifest}\n config={config}\n prepared={prepared}\n />\n </BackofficeRightPageLayout>\n );\n }\n if (!isConnectionListConfig(config)) {\n return null;\n }\n return (\n <BackofficeEntityConnectionListPage\n entityManifest={entityManifest}\n config={config}\n prepared={prepared}\n breadcrumb={breadcrumb}\n />\n );\n};\n\nexport default BackofficeEntityListPage;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"BackofficeEntityListPage.js","names":[],"sources":["../../../src/pages/BackofficeEntityListPage.tsx"],"sourcesContent":["import { type JSX, useCallback, useMemo, useState } from 'react';\nimport type { TFunction } from 'i18next';\nimport { useTranslation } from 'react-i18next';\nimport Link from '@plumile/router/routing/Link.js';\nimport { usePaginationFragment, usePreloadedQuery } from 'react-relay';\nimport {\n BACKOFFICE_LIST_DEFAULTS,\n BACKOFFICE_LIST_REFETCH_POLICY,\n} from '@plumile/backoffice-core/constants.js';\nimport type {\n BackofficeEntityManifestItem,\n BackofficePreparedListRoute,\n BackofficeRuntimeResolvedListFacetConfig,\n BackofficeRowFlagSpec,\n} from '@plumile/backoffice-core/types.js';\nimport { Button } from '@plumile/ui/atomic/atoms/button/Button.js';\nimport { LinkButton } from '@plumile/ui/atomic/atoms/button/LinkButton.js';\nimport {\n type DataTableColumn,\n type GetRowId,\n} from '@plumile/ui/components/data-table/DataTable.js';\nimport { TableCell } from '@plumile/ui/components/data-table/TableCell.js';\nimport { EyeSvg } from '@plumile/ui/icons/EyeSvg.js';\nimport { BackofficeEntityListScaffold } from '../components/backoffice/scaffolds/BackofficeEntityListScaffold.js';\nimport { LazyBackofficeEntityActionFormDialog } from '../components/backoffice/actions/LazyBackofficeEntityActionFormDialog.js';\nimport { buildDataTableColumns } from '../components/backoffice/columns/buildDataTableColumns.js';\nimport { RowFlagsCell } from '../components/backoffice/list/RowFlagsCell.js';\nimport { useBackofficeListUrlState } from '../hooks/useBackofficeListUrlState.js';\nimport { useBackofficeLoadMore } from '../hooks/useBackofficeLoadMore.js';\nimport { useBackofficeListRefetch } from '../hooks/useBackofficeListRefetch.js';\nimport { useBackofficeReactTranslation } from '../i18n/useBackofficeReactTranslation.js';\nimport * as pageStyles from './backofficeEntityListPage.css.js';\nimport { rowFlagsColumnCell } from '../components/backoffice/list/RowFlagsCell.css.js';\nimport { BackofficeRightPageLayout } from '../components/backoffice/layout/breadcrumb/BackofficeRightPageLayout.js';\nimport { buildEntityListBreadcrumb } from '../components/backoffice/layout/breadcrumb/buildBreadcrumbs.js';\nimport {\n buildActionsColumn,\n computeActionsColumnWidthPx,\n computeRowFlagsColumnWidthPx,\n isFormMutationAction,\n isRouteAction,\n resolveLabel,\n resolveActionVariant,\n resolveTrackBySize,\n type ConnectionListConfig,\n} from './BackofficeEntityListPage.helpers.js';\n\nexport type BackofficeEntityListPageProps = {\n entityManifest: BackofficeEntityManifestItem;\n config: BackofficeRuntimeResolvedListFacetConfig;\n prepared: BackofficePreparedListRoute;\n};\n\nconst applyListEdgeColumns = <Row,>(\n inputColumns: readonly DataTableColumn<Row>[],\n rowFlags: readonly BackofficeRowFlagSpec<Row>[] | undefined,\n actionCount: number,\n tApp: TFunction,\n): {\n columns: readonly DataTableColumn<Row>[];\n gridTemplateColumns?: string;\n} => {\n const hasFlags = rowFlags != null && rowFlags.length > 0;\n\n let columns = inputColumns;\n if (hasFlags) {\n const flagsColumn: DataTableColumn<Row> = {\n id: '__rowFlags',\n header: '',\n className: rowFlagsColumnCell,\n mobileRole: 'badge',\n cell: (row) => {\n return <RowFlagsCell row={row} flags={rowFlags} tApp={tApp} />;\n },\n };\n\n // Ensure we never pick the flags column as \"primary\".\n const withFlags = [flagsColumn, ...inputColumns];\n const hasPrimary = withFlags.some((col) => {\n return col.isPrimary === true;\n });\n\n columns = withFlags;\n if (!hasPrimary) {\n columns = withFlags.map((col, index) => {\n if (index === 1) {\n return { ...col, isPrimary: true };\n }\n return col;\n });\n }\n }\n\n let flagCount = 0;\n if (hasFlags) {\n flagCount = rowFlags.length;\n }\n const flagsWidthPx = computeRowFlagsColumnWidthPx(flagCount);\n const actionsWidthPx = computeActionsColumnWidthPx(actionCount);\n\n // We always include the right-side \"actions\" column in list pages.\n let leftColumnCount = 0;\n if (hasFlags) {\n leftColumnCount = 1;\n }\n const middleCount = columns.length - leftColumnCount - 1;\n\n const middleTracks = columns\n .slice(leftColumnCount, leftColumnCount + Math.max(0, middleCount))\n .map((column) => {\n return resolveTrackBySize(column as DataTableColumn<unknown>, '1fr');\n })\n .join(' ');\n\n let gridTemplateColumns = '';\n if (hasFlags) {\n gridTemplateColumns = `${flagsWidthPx}px ${middleTracks} ${actionsWidthPx}px`;\n } else {\n gridTemplateColumns = `${middleTracks} ${actionsWidthPx}px`;\n }\n\n return { columns, gridTemplateColumns };\n};\n\nconst BackofficeEntityConnectionListPage = ({\n config,\n prepared,\n breadcrumb,\n}: Omit<BackofficeEntityListPageProps, 'config'> & {\n config: ConnectionListConfig;\n breadcrumb: ReturnType<typeof buildEntityListBreadcrumb>;\n}): JSX.Element | null => {\n const listConfig = config.list;\n\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const [activeFormActionId, setActiveFormActionId] = useState<string | null>(\n null,\n );\n\n const queryData = usePreloadedQuery(listConfig.query, prepared.query);\n const {\n data: fragmentData,\n loadNext,\n hasNext,\n isLoadingNext,\n refetch,\n } = usePaginationFragment(listConfig.fragment, queryData as never);\n\n const connection = listConfig.getConnection(fragmentData);\n\n const rows = useMemo(() => {\n return connection.edges.map((edge) => {\n return listConfig.toRow(edge.node);\n });\n }, [connection.edges, listConfig]);\n\n const { columns, gridTemplateColumns } = useMemo((): {\n columns: readonly DataTableColumn<unknown>[];\n gridTemplateColumns?: string;\n } => {\n const baseColumns = buildDataTableColumns(listConfig.columns, {\n tApp,\n t,\n });\n const actionsColumn = buildActionsColumn({\n ariaLabel: t('actions.view'),\n fallback: t('common.notAvailable'),\n className: pageStyles.actionsColumnCell,\n resolveDetailHref: (id) => {\n return config.routes.detail(id);\n },\n renderAction: ({ href, ariaLabel }) => {\n return (\n <TableCell.Actions>\n <Link\n to={href}\n className={pageStyles.actionTrigger}\n aria-label={ariaLabel}\n title={ariaLabel}\n preloadOnMouseEnter\n >\n <EyeSvg width={16} height={16} />\n </Link>\n </TableCell.Actions>\n );\n },\n });\n const allColumns = [...baseColumns, actionsColumn];\n return applyListEdgeColumns(allColumns, listConfig.rowFlags, 1, tApp);\n }, [config.routes, listConfig.columns, listConfig.rowFlags, t, tApp]);\n\n const getRowId = useCallback<GetRowId<unknown>>(\n (row) => {\n return listConfig.getRowId(row);\n },\n [listConfig],\n );\n\n const { state, pushState } = useBackofficeListUrlState(config);\n const listDefaults = config.listDefaults ??\n listConfig.defaultState ?? { where: null, sort: null };\n const resolvedSort = state.sort ?? listDefaults.sort;\n const { pageSize } = BACKOFFICE_LIST_DEFAULTS;\n\n const baseVariables = useMemo(() => {\n return {\n where: state.where,\n sort: resolvedSort,\n count: pageSize,\n cursor: null,\n };\n }, [pageSize, resolvedSort, state.where]);\n\n const { isRefreshing, onRefresh } = useBackofficeListRefetch({\n refetch,\n variables: baseVariables,\n defaults: {\n where: listDefaults.where,\n sort: listDefaults.sort,\n count: pageSize,\n cursor: null,\n },\n fetchPolicy: BACKOFFICE_LIST_REFETCH_POLICY,\n buildQueryVariables: listConfig.buildQueryVariables,\n });\n\n const handleLoadMore = useBackofficeLoadMore({\n hasNext,\n isLoadingNext,\n loadNext,\n count: pageSize,\n });\n\n const listActions = useMemo(() => {\n return config.listActions ?? [];\n }, [config.listActions]);\n const visibleActions = useMemo(() => {\n return listActions.filter((action) => {\n if (action.isVisible == null) {\n return true;\n }\n return action.isVisible(null);\n });\n }, [listActions]);\n\n const headerActions = useMemo(() => {\n if (visibleActions.length === 0) {\n return undefined;\n }\n return (\n <div className={pageStyles.headerActions}>\n {visibleActions.map((action, index) => {\n const { variant: actionVariant } = action;\n const label = resolveLabel(action.label, tApp);\n let ariaLabel = label;\n if (action.ariaLabel != null) {\n ariaLabel = resolveLabel(action.ariaLabel, tApp);\n }\n const variant = resolveActionVariant(actionVariant, index);\n const size = action.size ?? 'small';\n const isDisabled = action.isDisabled?.(null) === true;\n\n if (isRouteAction(action)) {\n const href = action.to(null);\n return (\n <LinkButton\n key={action.id}\n to={href}\n variant={variant}\n size={size}\n isDisabled={isDisabled}\n aria-label={ariaLabel}\n preloadOnMouseEnter\n >\n {label}\n </LinkButton>\n );\n }\n\n if (isFormMutationAction(action)) {\n return (\n <Button\n key={action.id}\n type=\"button\"\n variant={variant}\n size={size}\n disabled={isDisabled}\n onClick={() => {\n setActiveFormActionId(action.id);\n }}\n aria-label={ariaLabel}\n >\n {label}\n </Button>\n );\n }\n\n return null;\n })}\n </div>\n );\n }, [tApp, visibleActions]);\n\n const activeFormAction = listActions.find((action) => {\n return action.id === activeFormActionId;\n });\n\n return (\n <BackofficeRightPageLayout breadcrumb={breadcrumb}>\n <BackofficeEntityListScaffold\n config={config}\n state={state}\n pushState={pushState}\n headerActions={headerActions}\n rows={rows}\n columns={columns}\n gridTemplateColumns={gridTemplateColumns}\n getRowId={getRowId}\n hasNextPage={hasNext}\n isLoadingMore={isLoadingNext}\n isRefreshing={isRefreshing}\n onLoadMore={handleLoadMore}\n onRefresh={onRefresh}\n totalCount={connection.totalCount ?? null}\n />\n {activeFormAction != null && isFormMutationAction(activeFormAction) && (\n <LazyBackofficeEntityActionFormDialog\n isOpen\n action={activeFormAction}\n node={null}\n onClose={() => {\n setActiveFormActionId(null);\n }}\n onSuccess={onRefresh}\n />\n )}\n </BackofficeRightPageLayout>\n );\n};\n\nexport const BackofficeEntityListPage = ({\n entityManifest,\n config,\n prepared,\n}: BackofficeEntityListPageProps): JSX.Element | null => {\n const { t: tApp } = useTranslation();\n const breadcrumb = buildEntityListBreadcrumb(config, tApp);\n\n return (\n <BackofficeEntityConnectionListPage\n entityManifest={entityManifest}\n config={config}\n prepared={prepared}\n breadcrumb={breadcrumb}\n />\n );\n};\n\nexport default BackofficeEntityListPage;\n"],"mappings":"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"}
|
|
@@ -7,7 +7,7 @@ function n(e) {
|
|
|
7
7
|
let c = a.getDataID(), l = Array.from(new Set(i)).filter((e) => e.trim() !== "");
|
|
8
8
|
for (let e of l) {
|
|
9
9
|
let r = t.getConnection(s, e);
|
|
10
|
-
if (r != null && !
|
|
10
|
+
if (r != null && !r.getLinkedRecords("edges").some((e) => e.getLinkedRecord("node").getDataID() === c)) {
|
|
11
11
|
let e = t.createEdge(n, r, a, o);
|
|
12
12
|
t.insertEdgeAfter(r, e);
|
|
13
13
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connectionUtils.js","names":[],"sources":["../../../src/relay/connectionUtils.ts"],"sourcesContent":["import RelayRuntime, {\n type RecordProxy,\n type RecordSourceSelectorProxy,\n} from 'relay-runtime';\n\nconst { ConnectionHandler } = RelayRuntime;\n\nexport type AppendNodeToConnectionsOptions = {\n store: RecordSourceSelectorProxy;\n parentId: string;\n connectionKeys: readonly string[];\n node: RecordProxy;\n edgeTypeName: string;\n};\n\n/** Appends a node to existing Relay connections on the parent record. */\nexport function appendNodeToConnections(\n options: AppendNodeToConnectionsOptions,\n): void {\n const { store, parentId, connectionKeys, node, edgeTypeName } = options;\n const parentRecord = store.get(parentId);\n if (parentRecord == null) {\n return;\n }\n\n const nodeId = node.getDataID();\n const uniqueKeys = Array.from(new Set(connectionKeys)).filter((key) => {\n return key.trim() !== '';\n });\n\n for (const connectionKey of uniqueKeys) {\n const connection = ConnectionHandler.getConnection(\n parentRecord,\n connectionKey,\n );\n if (connection != null) {\n const edges = connection.getLinkedRecords('edges')
|
|
1
|
+
{"version":3,"file":"connectionUtils.js","names":[],"sources":["../../../src/relay/connectionUtils.ts"],"sourcesContent":["import RelayRuntime, {\n type RecordProxy,\n type RecordSourceSelectorProxy,\n} from 'relay-runtime';\n\nconst { ConnectionHandler } = RelayRuntime;\n\nexport type AppendNodeToConnectionsOptions = {\n store: RecordSourceSelectorProxy;\n parentId: string;\n connectionKeys: readonly string[];\n node: RecordProxy;\n edgeTypeName: string;\n};\n\n/** Appends a node to existing Relay connections on the parent record. */\nexport function appendNodeToConnections(\n options: AppendNodeToConnectionsOptions,\n): void {\n const { store, parentId, connectionKeys, node, edgeTypeName } = options;\n const parentRecord = store.get(parentId);\n if (parentRecord == null) {\n return;\n }\n\n const nodeId = node.getDataID();\n const uniqueKeys = Array.from(new Set(connectionKeys)).filter((key) => {\n return key.trim() !== '';\n });\n\n for (const connectionKey of uniqueKeys) {\n const connection = ConnectionHandler.getConnection(\n parentRecord,\n connectionKey,\n );\n if (connection != null) {\n const edges = connection.getLinkedRecords('edges');\n const alreadyPresent = edges.some((edge) => {\n const edgeNode = edge.getLinkedRecord('node');\n return edgeNode.getDataID() === nodeId;\n });\n\n if (!alreadyPresent) {\n const newEdge = ConnectionHandler.createEdge(\n store,\n connection,\n node,\n edgeTypeName,\n );\n ConnectionHandler.insertEdgeAfter(connection, newEdge);\n }\n }\n }\n}\n"],"mappings":";;AAKA,IAAM,EAAE,yBAAsB;AAW9B,SAAgB,EACd,GACM;CACN,IAAM,EAAE,UAAO,aAAU,mBAAgB,SAAM,oBAAiB,GAC1D,IAAe,EAAM,IAAI,CAAQ;CACvC,IAAI,KAAgB,MAClB;CAGF,IAAM,IAAS,EAAK,UAAU,GACxB,IAAa,MAAM,KAAK,IAAI,IAAI,CAAc,CAAC,EAAE,QAAQ,MACtD,EAAI,KAAK,MAAM,EACvB;CAED,KAAK,IAAM,KAAiB,GAAY;EACtC,IAAM,IAAa,EAAkB,cACnC,GACA,CACF;EACA,IAAI,KAAc,QAOZ,CANU,EAAW,iBAAiB,OACnB,EAAM,MAAM,MAChB,EAAK,gBAAgB,MAC/B,EAAS,UAAU,MAAM,CAG7B,GAAgB;GACnB,IAAM,IAAU,EAAkB,WAChC,GACA,GACA,GACA,CACF;GACA,EAAkB,gBAAgB,GAAY,CAAO;EACvD;CAEJ;AACF"}
|
|
@@ -2,22 +2,36 @@ import { useConditionalSubscription as e } from "../hooks/useConditionalSubscrip
|
|
|
2
2
|
import { useCallback as t, useEffect as n, useMemo as r, useRef as i } from "react";
|
|
3
3
|
//#region src/subscriptions/useCursorResumableSubscription.ts
|
|
4
4
|
var a = ({ enabled: a, identityKey: o, deps: s, makeConfig: c, makeVariables: l, onRefetchNeeded: u }) => {
|
|
5
|
-
let d = i(null);
|
|
5
|
+
let d = i(null), f = i(null);
|
|
6
6
|
n(() => {
|
|
7
7
|
d.current = null;
|
|
8
8
|
}, [o]);
|
|
9
|
-
let
|
|
9
|
+
let p = r(() => ({
|
|
10
10
|
markApplied: (e) => {
|
|
11
11
|
typeof e == "string" && (d.current = e);
|
|
12
12
|
},
|
|
13
13
|
markNotApplied: (e) => {
|
|
14
|
-
|
|
14
|
+
f.current = e;
|
|
15
15
|
},
|
|
16
16
|
handleRefetchNeeded: (e) => {
|
|
17
17
|
u?.(e ?? null);
|
|
18
18
|
}
|
|
19
19
|
}), [u]);
|
|
20
|
-
e(r(() =>
|
|
20
|
+
e(r(() => {
|
|
21
|
+
let e = c(p);
|
|
22
|
+
return {
|
|
23
|
+
...e,
|
|
24
|
+
onNext: (t) => {
|
|
25
|
+
e.onNext?.(t);
|
|
26
|
+
let n = f.current;
|
|
27
|
+
n != null && (f.current = null, u?.(n));
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
}, [
|
|
31
|
+
p,
|
|
32
|
+
c,
|
|
33
|
+
u
|
|
34
|
+
]), {
|
|
21
35
|
enabled: a,
|
|
22
36
|
deps: s,
|
|
23
37
|
getVariables: t(() => l(d.current), [l])
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useCursorResumableSubscription.js","names":[],"sources":["../../../src/subscriptions/useCursorResumableSubscription.ts"],"sourcesContent":["import { useCallback, useEffect, useMemo, useRef } from 'react';\nimport type { GraphQLSubscriptionConfig, OperationType } from 'relay-runtime';\n\nimport { useConditionalSubscription } from '../hooks/useConditionalSubscription.js';\n\nexport type CursorSubscriptionControls = {\n markApplied: (cursor: unknown) => void;\n markNotApplied: (reason: string) => void;\n handleRefetchNeeded: (reason: string | null | undefined) => void;\n};\n\nexport type UseCursorResumableSubscriptionArgs<\n TSubscription extends OperationType,\n> = {\n enabled: boolean;\n identityKey: string | null | undefined;\n deps?: readonly unknown[];\n makeConfig: (\n controls: CursorSubscriptionControls,\n ) => GraphQLSubscriptionConfig<TSubscription>;\n makeVariables: (cursor: string | null) => TSubscription['variables'];\n onRefetchNeeded?: (reason: string | null) => void;\n};\n\nexport const useCursorResumableSubscription = <\n TSubscription extends OperationType,\n>({\n enabled,\n identityKey,\n deps,\n makeConfig,\n makeVariables,\n onRefetchNeeded,\n}: UseCursorResumableSubscriptionArgs<TSubscription>): void => {\n const lastCursorRef = useRef<string | null>(null);\n\n useEffect(() => {\n lastCursorRef.current = null;\n }, [identityKey]);\n\n const controls = useMemo<CursorSubscriptionControls>(() => {\n return {\n markApplied: (cursor: unknown) => {\n if (typeof cursor === 'string') {\n lastCursorRef.current = cursor;\n }\n },\n markNotApplied: (reason: string) => {\n
|
|
1
|
+
{"version":3,"file":"useCursorResumableSubscription.js","names":[],"sources":["../../../src/subscriptions/useCursorResumableSubscription.ts"],"sourcesContent":["import { useCallback, useEffect, useMemo, useRef } from 'react';\nimport type { GraphQLSubscriptionConfig, OperationType } from 'relay-runtime';\n\nimport { useConditionalSubscription } from '../hooks/useConditionalSubscription.js';\n\nexport type CursorSubscriptionControls = {\n markApplied: (cursor: unknown) => void;\n markNotApplied: (reason: string) => void;\n handleRefetchNeeded: (reason: string | null | undefined) => void;\n};\n\nexport type UseCursorResumableSubscriptionArgs<\n TSubscription extends OperationType,\n> = {\n enabled: boolean;\n identityKey: string | null | undefined;\n deps?: readonly unknown[];\n makeConfig: (\n controls: CursorSubscriptionControls,\n ) => GraphQLSubscriptionConfig<TSubscription>;\n makeVariables: (cursor: string | null) => TSubscription['variables'];\n onRefetchNeeded?: (reason: string | null) => void;\n};\n\nexport const useCursorResumableSubscription = <\n TSubscription extends OperationType,\n>({\n enabled,\n identityKey,\n deps,\n makeConfig,\n makeVariables,\n onRefetchNeeded,\n}: UseCursorResumableSubscriptionArgs<TSubscription>): void => {\n const lastCursorRef = useRef<string | null>(null);\n const pendingRefetchReasonRef = useRef<string | null>(null);\n\n useEffect(() => {\n lastCursorRef.current = null;\n }, [identityKey]);\n\n const controls = useMemo<CursorSubscriptionControls>(() => {\n return {\n markApplied: (cursor: unknown) => {\n if (typeof cursor === 'string') {\n lastCursorRef.current = cursor;\n }\n },\n markNotApplied: (reason: string) => {\n pendingRefetchReasonRef.current = reason;\n },\n handleRefetchNeeded: (reason: string | null | undefined) => {\n onRefetchNeeded?.(reason ?? null);\n },\n };\n }, [onRefetchNeeded]);\n\n const config = useMemo(() => {\n const nextConfig = makeConfig(controls);\n return {\n ...nextConfig,\n onNext: (response: TSubscription['response']) => {\n nextConfig.onNext?.(response);\n const pendingReason = pendingRefetchReasonRef.current;\n if (pendingReason != null) {\n pendingRefetchReasonRef.current = null;\n onRefetchNeeded?.(pendingReason);\n }\n },\n };\n }, [controls, makeConfig, onRefetchNeeded]);\n\n const getVariables = useCallback(() => {\n return makeVariables(lastCursorRef.current);\n }, [makeVariables]);\n\n useConditionalSubscription(config, {\n enabled,\n deps,\n getVariables,\n });\n};\n"],"mappings":";;;AAwBA,IAAa,KAEX,EACA,YACA,gBACA,SACA,eACA,kBACA,yBAC6D;CAC7D,IAAM,IAAgB,EAAsB,IAAI,GAC1C,IAA0B,EAAsB,IAAI;CAE1D,QAAgB;EACd,EAAc,UAAU;CAC1B,GAAG,CAAC,CAAW,CAAC;CAEhB,IAAM,IAAW,SACR;EACL,cAAc,MAAoB;GAChC,AAAI,OAAO,KAAW,aACpB,EAAc,UAAU;EAE5B;EACA,iBAAiB,MAAmB;GAClC,EAAwB,UAAU;EACpC;EACA,sBAAsB,MAAsC;GAC1D,IAAkB,KAAU,IAAI;EAClC;CACF,IACC,CAAC,CAAe,CAAC;CAqBpB,EAnBe,QAAc;EAC3B,IAAM,IAAa,EAAW,CAAQ;EACtC,OAAO;GACL,GAAG;GACH,SAAS,MAAwC;IAC/C,EAAW,SAAS,CAAQ;IAC5B,IAAM,IAAgB,EAAwB;IAC9C,AAAI,KAAiB,SACnB,EAAwB,UAAU,MAClC,IAAkB,CAAa;GAEnC;EACF;CACF,GAAG;EAAC;EAAU;EAAY;CAAe,CAMd,GAAQ;EACjC;EACA;EACA,cAPmB,QACZ,EAAc,EAAc,OAAO,GACzC,CAAC,CAAa,CAKf;CACF,CAAC;AACH"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BackofficeDetailRelationListBlock.d.ts","sourceRoot":"","sources":["../../../../../src/components/backoffice/detail/BackofficeDetailRelationListBlock.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA4C,KAAK,GAAG,EAAE,MAAM,OAAO,CAAC;AAU3E,OAAO,KAAK,EAEV,mCAAmC,EAEpC,MAAM,mCAAmC,CAAC;AAc3C,MAAM,MAAM,sCAAsC,GAAG;IACnD,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,mCAAmC,CAAC;IAC9C,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB,CAAC;
|
|
1
|
+
{"version":3,"file":"BackofficeDetailRelationListBlock.d.ts","sourceRoot":"","sources":["../../../../../src/components/backoffice/detail/BackofficeDetailRelationListBlock.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA4C,KAAK,GAAG,EAAE,MAAM,OAAO,CAAC;AAU3E,OAAO,KAAK,EAEV,mCAAmC,EAEpC,MAAM,mCAAmC,CAAC;AAc3C,MAAM,MAAM,sCAAsC,GAAG;IACnD,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,mCAAmC,CAAC;IAC9C,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB,CAAC;AAyLF,eAAO,MAAM,iCAAiC,GAAI,6BAI/C,sCAAsC,KAAG,GAAG,CAAC,OAgB/C,CAAC;AAEF,eAAe,iCAAiC,CAAC"}
|
|
@@ -3,7 +3,7 @@ import type { MetricTone } from '@plumile/ui/components/dashboard/metric_card/Me
|
|
|
3
3
|
export type BackofficeRelationSummaryItem = {
|
|
4
4
|
readonly id: string;
|
|
5
5
|
readonly label: string;
|
|
6
|
-
readonly count?:
|
|
6
|
+
readonly count?: ReactNode;
|
|
7
7
|
readonly href?: string;
|
|
8
8
|
readonly description?: ReactNode;
|
|
9
9
|
readonly tone?: MetricTone;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BackofficeRelationsSummaryGrid.d.ts","sourceRoot":"","sources":["../../../../../src/components/backoffice/detail/BackofficeRelationsSummaryGrid.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,GAAG,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAGjD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4DAA4D,CAAC;AAK7F,MAAM,MAAM,6BAA6B,GAAG;IAC1C,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,CAAC,EAAE,
|
|
1
|
+
{"version":3,"file":"BackofficeRelationsSummaryGrid.d.ts","sourceRoot":"","sources":["../../../../../src/components/backoffice/detail/BackofficeRelationsSummaryGrid.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,GAAG,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAGjD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4DAA4D,CAAC;AAK7F,MAAM,MAAM,6BAA6B,GAAG;IAC1C,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,CAAC;IAC3B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,CAAC;IACjC,QAAQ,CAAC,IAAI,CAAC,EAAE,UAAU,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,mCAAmC,GAAG;IAChD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,SAAS,6BAA6B,EAAE,CAAC;CAC1D,CAAC;AAEF,eAAO,MAAM,8BAA8B,GAAI,mBAG5C,mCAAmC,KAAG,GAAG,CAAC,OAAO,GAAG,IA4CtD,CAAC;AAEF,eAAe,8BAA8B,CAAC"}
|