@burdenoff/microfe-export 2026.510.111
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/README.md +243 -0
- package/dist/dev/main.d.ts +2 -0
- package/dist/dev/main.d.ts.map +1 -0
- package/dist/export/ExportRoot.d.ts +31 -0
- package/dist/export/ExportRoot.d.ts.map +1 -0
- package/dist/export/ExportRoot.js +70 -0
- package/dist/export/ExportRoot.js.map +1 -0
- package/dist/export/ExportRoutes.d.ts +14 -0
- package/dist/export/ExportRoutes.d.ts.map +1 -0
- package/dist/export/ExportRoutes.js +104 -0
- package/dist/export/ExportRoutes.js.map +1 -0
- package/dist/export/components/ExportProgressBar.d.ts +12 -0
- package/dist/export/components/ExportProgressBar.d.ts.map +1 -0
- package/dist/export/components/ExportProgressBar.js +34 -0
- package/dist/export/components/ExportProgressBar.js.map +1 -0
- package/dist/export/components/ExportStatusBadge.d.ts +12 -0
- package/dist/export/components/ExportStatusBadge.d.ts.map +1 -0
- package/dist/export/components/ExportStatusBadge.js +39 -0
- package/dist/export/components/ExportStatusBadge.js.map +1 -0
- package/dist/export/components/PageLayout.d.ts +55 -0
- package/dist/export/components/PageLayout.d.ts.map +1 -0
- package/dist/export/components/PageLayout.js +93 -0
- package/dist/export/components/PageLayout.js.map +1 -0
- package/dist/export/components/ui.d.ts +6 -0
- package/dist/export/components/ui.d.ts.map +1 -0
- package/dist/export/constants/enums.d.ts +79 -0
- package/dist/export/constants/enums.d.ts.map +1 -0
- package/dist/export/constants/enums.js +27 -0
- package/dist/export/constants/enums.js.map +1 -0
- package/dist/export/constants/index.d.ts +7 -0
- package/dist/export/constants/index.d.ts.map +1 -0
- package/dist/export/hooks/useExportQueries.d.ts +224 -0
- package/dist/export/hooks/useExportQueries.d.ts.map +1 -0
- package/dist/export/hooks/useExportQueries.js +401 -0
- package/dist/export/hooks/useExportQueries.js.map +1 -0
- package/dist/export/index.d.ts +29 -0
- package/dist/export/index.d.ts.map +1 -0
- package/dist/export/index.js +3 -0
- package/dist/export/pages/CreateExportPage.d.ts +2 -0
- package/dist/export/pages/CreateExportPage.d.ts.map +1 -0
- package/dist/export/pages/CreateExportPage.js +495 -0
- package/dist/export/pages/CreateExportPage.js.map +1 -0
- package/dist/export/pages/ExportDashboardPage.d.ts +6 -0
- package/dist/export/pages/ExportDashboardPage.d.ts.map +1 -0
- package/dist/export/pages/ExportDashboardPage.js +166 -0
- package/dist/export/pages/ExportDashboardPage.js.map +1 -0
- package/dist/export/pages/ExportDetailPage.d.ts +7 -0
- package/dist/export/pages/ExportDetailPage.d.ts.map +1 -0
- package/dist/export/pages/ExportDetailPage.js +327 -0
- package/dist/export/pages/ExportDetailPage.js.map +1 -0
- package/dist/export/pages/ExportHistoryPage.d.ts +6 -0
- package/dist/export/pages/ExportHistoryPage.d.ts.map +1 -0
- package/dist/export/pages/ExportHistoryPage.js +261 -0
- package/dist/export/pages/ExportHistoryPage.js.map +1 -0
- package/dist/export/pages/ExportLandingPage.d.ts +9 -0
- package/dist/export/pages/ExportLandingPage.d.ts.map +1 -0
- package/dist/export/pages/ExportLandingPage.js +56 -0
- package/dist/export/pages/ExportLandingPage.js.map +1 -0
- package/dist/export/pages/ExportTemplatesPage.d.ts +6 -0
- package/dist/export/pages/ExportTemplatesPage.d.ts.map +1 -0
- package/dist/export/pages/ExportTemplatesPage.js +343 -0
- package/dist/export/pages/ExportTemplatesPage.js.map +1 -0
- package/dist/export/pages/TemplateDetailPage.d.ts +7 -0
- package/dist/export/pages/TemplateDetailPage.d.ts.map +1 -0
- package/dist/export/pages/TemplateDetailPage.js +215 -0
- package/dist/export/pages/TemplateDetailPage.js.map +1 -0
- package/dist/export/providers/ExportProvider.d.ts +13 -0
- package/dist/export/providers/ExportProvider.d.ts.map +1 -0
- package/dist/export/providers/ExportProvider.js +103 -0
- package/dist/export/providers/ExportProvider.js.map +1 -0
- package/dist/export/store/exportStore.d.ts +17 -0
- package/dist/export/store/exportStore.d.ts.map +1 -0
- package/dist/export/store/exportStore.js +43 -0
- package/dist/export/store/exportStore.js.map +1 -0
- package/dist/export/types/index.d.ts +230 -0
- package/dist/export/types/index.d.ts.map +1 -0
- package/dist/export/utils/cn.d.ts +8 -0
- package/dist/export/utils/cn.d.ts.map +1 -0
- package/dist/export/utils/cn.js +10 -0
- package/dist/export/utils/cn.js.map +1 -0
- package/dist/export/utils/events.d.ts +7 -0
- package/dist/export/utils/events.d.ts.map +1 -0
- package/dist/export/utils/events.js +16 -0
- package/dist/export/utils/events.js.map +1 -0
- package/dist/export/utils/i18n.d.ts +6 -0
- package/dist/export/utils/i18n.d.ts.map +1 -0
- package/dist/export/utils/i18n.js +15 -0
- package/dist/export/utils/i18n.js.map +1 -0
- package/dist/generated/global-operations.d.ts +2 -0
- package/dist/generated/global-operations.d.ts.map +1 -0
- package/dist/generated/global-types.d.ts +21253 -0
- package/dist/generated/global-types.d.ts.map +1 -0
- package/dist/generated/wspace-operations.d.ts +773 -0
- package/dist/generated/wspace-operations.d.ts.map +1 -0
- package/dist/generated/wspace-operations.js +319 -0
- package/dist/generated/wspace-operations.js.map +1 -0
- package/dist/generated/wspace-types.d.ts +55214 -0
- package/dist/generated/wspace-types.d.ts.map +1 -0
- package/dist/generated/wspace-types.js +12 -0
- package/dist/generated/wspace-types.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/node_modules/@apollo/client/errors/CombinedGraphQLErrors.js +24 -0
- package/dist/node_modules/@apollo/client/errors/CombinedGraphQLErrors.js.map +1 -0
- package/dist/node_modules/@apollo/client/errors/utils.js +16 -0
- package/dist/node_modules/@apollo/client/errors/utils.js.map +1 -0
- package/dist/node_modules/@apollo/client/link/core/ApolloLink.js +52 -0
- package/dist/node_modules/@apollo/client/link/core/ApolloLink.js.map +1 -0
- package/dist/node_modules/@apollo/client/link/subscriptions/index.js +41 -0
- package/dist/node_modules/@apollo/client/link/subscriptions/index.js.map +1 -0
- package/dist/node_modules/@apollo/client/link/utils/createOperation.js +34 -0
- package/dist/node_modules/@apollo/client/link/utils/createOperation.js.map +1 -0
- package/dist/node_modules/@apollo/client/utilities/caching/sizes.js +6 -0
- package/dist/node_modules/@apollo/client/utilities/caching/sizes.js.map +1 -0
- package/dist/node_modules/@apollo/client/utilities/graphql/print.js +16 -0
- package/dist/node_modules/@apollo/client/utilities/graphql/print.js.map +1 -0
- package/dist/node_modules/@apollo/client/utilities/internal/caches.js +19 -0
- package/dist/node_modules/@apollo/client/utilities/internal/caches.js.map +1 -0
- package/dist/node_modules/@apollo/client/utilities/internal/checkDocument.js +21 -0
- package/dist/node_modules/@apollo/client/utilities/internal/checkDocument.js.map +1 -0
- package/dist/node_modules/@apollo/client/utilities/internal/getMainDefinition.js +17 -0
- package/dist/node_modules/@apollo/client/utilities/internal/getMainDefinition.js.map +1 -0
- package/dist/node_modules/@apollo/client/utilities/internal/getMemoryInternals.js +9 -0
- package/dist/node_modules/@apollo/client/utilities/internal/getMemoryInternals.js.map +1 -0
- package/dist/node_modules/@apollo/client/utilities/internal/getOperationDefinition.js +9 -0
- package/dist/node_modules/@apollo/client/utilities/internal/getOperationDefinition.js.map +1 -0
- package/dist/node_modules/@apollo/client/utilities/internal/getOperationName.js +8 -0
- package/dist/node_modules/@apollo/client/utilities/internal/getOperationName.js.map +1 -0
- package/dist/node_modules/@apollo/client/utilities/internal/globals/global.js +9 -0
- package/dist/node_modules/@apollo/client/utilities/internal/globals/global.js.map +1 -0
- package/dist/node_modules/@apollo/client/utilities/internal/globals/maybe.js +10 -0
- package/dist/node_modules/@apollo/client/utilities/internal/globals/maybe.js.map +1 -0
- package/dist/node_modules/@apollo/client/utilities/internal/isNonNullObject.js +8 -0
- package/dist/node_modules/@apollo/client/utilities/internal/isNonNullObject.js.map +1 -0
- package/dist/node_modules/@apollo/client/utilities/internal/makeUniqueId.js +10 -0
- package/dist/node_modules/@apollo/client/utilities/internal/makeUniqueId.js.map +1 -0
- package/dist/node_modules/@apollo/client/utilities/internal/memoize.js +23 -0
- package/dist/node_modules/@apollo/client/utilities/internal/memoize.js.map +1 -0
- package/dist/node_modules/@apollo/client/utilities/internal/stringifyForDisplay.js +10 -0
- package/dist/node_modules/@apollo/client/utilities/internal/stringifyForDisplay.js.map +1 -0
- package/dist/node_modules/@apollo/client/utilities/invariant/index.js +57 -0
- package/dist/node_modules/@apollo/client/utilities/invariant/index.js.map +1 -0
- package/dist/node_modules/@apollo/client/version.js +6 -0
- package/dist/node_modules/@apollo/client/version.js.map +1 -0
- package/dist/node_modules/@wry/caches/lib/weak.js +67 -0
- package/dist/node_modules/@wry/caches/lib/weak.js.map +1 -0
- package/dist/node_modules/@wry/trie/lib/index.js +53 -0
- package/dist/node_modules/@wry/trie/lib/index.js.map +1 -0
- package/dist/node_modules/clsx/dist/clsx.js +18 -0
- package/dist/node_modules/clsx/dist/clsx.js.map +1 -0
- package/dist/node_modules/graphql-ws/dist/client.js +272 -0
- package/dist/node_modules/graphql-ws/dist/client.js.map +1 -0
- package/dist/node_modules/graphql-ws/dist/common-CGW11Fyb.js +62 -0
- package/dist/node_modules/graphql-ws/dist/common-CGW11Fyb.js.map +1 -0
- package/dist/node_modules/rxjs/dist/esm5/internal/NotificationFactories.js +21 -0
- package/dist/node_modules/rxjs/dist/esm5/internal/NotificationFactories.js.map +1 -0
- package/dist/node_modules/rxjs/dist/esm5/internal/Observable.js +78 -0
- package/dist/node_modules/rxjs/dist/esm5/internal/Observable.js.map +1 -0
- package/dist/node_modules/rxjs/dist/esm5/internal/Subscriber.js +117 -0
- package/dist/node_modules/rxjs/dist/esm5/internal/Subscriber.js.map +1 -0
- package/dist/node_modules/rxjs/dist/esm5/internal/Subscription.js +93 -0
- package/dist/node_modules/rxjs/dist/esm5/internal/Subscription.js.map +1 -0
- package/dist/node_modules/rxjs/dist/esm5/internal/config.js +12 -0
- package/dist/node_modules/rxjs/dist/esm5/internal/config.js.map +1 -0
- package/dist/node_modules/rxjs/dist/esm5/internal/observable/empty.js +9 -0
- package/dist/node_modules/rxjs/dist/esm5/internal/observable/empty.js.map +1 -0
- package/dist/node_modules/rxjs/dist/esm5/internal/scheduler/timeoutProvider.js +16 -0
- package/dist/node_modules/rxjs/dist/esm5/internal/scheduler/timeoutProvider.js.map +1 -0
- package/dist/node_modules/rxjs/dist/esm5/internal/symbol/observable.js +8 -0
- package/dist/node_modules/rxjs/dist/esm5/internal/symbol/observable.js.map +1 -0
- package/dist/node_modules/rxjs/dist/esm5/internal/util/UnsubscriptionError.js +13 -0
- package/dist/node_modules/rxjs/dist/esm5/internal/util/UnsubscriptionError.js.map +1 -0
- package/dist/node_modules/rxjs/dist/esm5/internal/util/arrRemove.js +11 -0
- package/dist/node_modules/rxjs/dist/esm5/internal/util/arrRemove.js.map +1 -0
- package/dist/node_modules/rxjs/dist/esm5/internal/util/createErrorClass.js +11 -0
- package/dist/node_modules/rxjs/dist/esm5/internal/util/createErrorClass.js.map +1 -0
- package/dist/node_modules/rxjs/dist/esm5/internal/util/errorContext.js +22 -0
- package/dist/node_modules/rxjs/dist/esm5/internal/util/errorContext.js.map +1 -0
- package/dist/node_modules/rxjs/dist/esm5/internal/util/identity.js +8 -0
- package/dist/node_modules/rxjs/dist/esm5/internal/util/identity.js.map +1 -0
- package/dist/node_modules/rxjs/dist/esm5/internal/util/isFunction.js +8 -0
- package/dist/node_modules/rxjs/dist/esm5/internal/util/isFunction.js.map +1 -0
- package/dist/node_modules/rxjs/dist/esm5/internal/util/noop.js +6 -0
- package/dist/node_modules/rxjs/dist/esm5/internal/util/noop.js.map +1 -0
- package/dist/node_modules/rxjs/dist/esm5/internal/util/pipe.js +13 -0
- package/dist/node_modules/rxjs/dist/esm5/internal/util/pipe.js.map +1 -0
- package/dist/node_modules/rxjs/dist/esm5/internal/util/reportUnhandledError.js +14 -0
- package/dist/node_modules/rxjs/dist/esm5/internal/util/reportUnhandledError.js.map +1 -0
- package/dist/node_modules/rxjs/node_modules/tslib/tslib.es6.js +52 -0
- package/dist/node_modules/rxjs/node_modules/tslib/tslib.es6.js.map +1 -0
- package/dist/node_modules/tailwind-merge/dist/bundle-mjs.js +1674 -0
- package/dist/node_modules/tailwind-merge/dist/bundle-mjs.js.map +1 -0
- package/dist/utils/nativeBridge.d.ts +3 -0
- package/dist/utils/nativeBridge.d.ts.map +1 -0
- package/dist/utils/nativeBridge.js +2 -0
- package/package.json +107 -0
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
import { useExport as e } from "../providers/ExportProvider.js";
|
|
2
|
+
import { useExportJobs as t } from "../hooks/useExportQueries.js";
|
|
3
|
+
import { cn as n } from "../utils/cn.js";
|
|
4
|
+
import { getAllStatuses as r, getFormatDisplayName as i, getStatusDisplayName as a } from "../constants/enums.js";
|
|
5
|
+
import { tWithFallback as o } from "../utils/i18n.js";
|
|
6
|
+
import { ExportStatusBadge as s } from "../components/ExportStatusBadge.js";
|
|
7
|
+
import { EmptyState as ee, PageLayout as c } from "../components/PageLayout.js";
|
|
8
|
+
import { useExportStore as l } from "../store/exportStore.js";
|
|
9
|
+
import { useEffect as u, useMemo as d, useState as f } from "react";
|
|
10
|
+
import { AlertCircle as p, ChevronLeft as m, ChevronRight as h, Clock as g, Download as _, Filter as v, RefreshCw as y, Search as b, X as x } from "lucide-react";
|
|
11
|
+
import { useSearchParams as S } from "react-router-dom";
|
|
12
|
+
import { Fragment as C, jsx as w, jsxs as T } from "react/jsx-runtime";
|
|
13
|
+
import { useI18n as E } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
|
|
14
|
+
//#region src/export/pages/ExportHistoryPage.tsx
|
|
15
|
+
var D = (e, t) => (e.endsWith("/") ? e.slice(0, -1) : e) + (t.startsWith("/") ? t : `/${t}`);
|
|
16
|
+
function O() {
|
|
17
|
+
let { basePath: O = "/", navigate: k } = e(), { t: A } = E(), j = (e, t, n) => o(A, e, t, n), { jobFilter: M, updateFilter: N, resetFilter: P, pagination: F, setPagination: I } = l(), [L] = S();
|
|
18
|
+
u(() => {
|
|
19
|
+
let e = L.get("status");
|
|
20
|
+
e && N({ status: e });
|
|
21
|
+
}, []);
|
|
22
|
+
let [R, z] = f(!1), [B, V] = f([null]), [H, U] = f(0), W = B[H] ?? null, { data: G, totalCount: K, pageInfo: q, isLoading: J, error: Y, refetch: X } = t(M, {
|
|
23
|
+
first: F.pageSize,
|
|
24
|
+
after: W ?? void 0
|
|
25
|
+
}), Z = d(() => {
|
|
26
|
+
if (!M.search) return G;
|
|
27
|
+
let e = M.search.toLowerCase();
|
|
28
|
+
return G.filter((t) => t.name.toLowerCase().includes(e) || t.entityTypes.some((t) => t.toLowerCase().includes(e)));
|
|
29
|
+
}, [G, M.search]), Q = M.search || M.status !== "all" || M.format !== "all", te = (e) => {
|
|
30
|
+
k?.(D(O, e));
|
|
31
|
+
}, ne = () => {
|
|
32
|
+
!q?.hasNextPage || !q.endCursor || (V([...B.slice(0, H + 1), q.endCursor]), U(H + 1), I({
|
|
33
|
+
page: F.page + 1,
|
|
34
|
+
cursor: q.endCursor
|
|
35
|
+
}));
|
|
36
|
+
}, re = () => {
|
|
37
|
+
if (H === 0) return;
|
|
38
|
+
let e = H - 1;
|
|
39
|
+
U(e), I({
|
|
40
|
+
page: F.page - 1,
|
|
41
|
+
cursor: B[e] ?? null
|
|
42
|
+
});
|
|
43
|
+
}, $ = () => {
|
|
44
|
+
P(), V([null]), U(0);
|
|
45
|
+
}, ie = H > 0, ae = q?.hasNextPage ?? !1, oe = H * F.pageSize + 1, se = Math.min((H + 1) * F.pageSize, K), ce = (e) => j(`export.shared.status.${e.toLowerCase()}`, a(e));
|
|
46
|
+
return /* @__PURE__ */ T(c, {
|
|
47
|
+
title: j("export.history.title", "Export History"),
|
|
48
|
+
subtitle: j("export.history.subtitle", "View and manage all your past export jobs"),
|
|
49
|
+
icon: /* @__PURE__ */ w(g, { size: 24 }),
|
|
50
|
+
headerActions: /* @__PURE__ */ T("button", {
|
|
51
|
+
onClick: () => k?.(D(O, "new")),
|
|
52
|
+
className: "inline-flex items-center gap-2 px-4 py-2 bg-primary text-primary-foreground rounded-lg hover:bg-primary/90 transition-colors font-medium",
|
|
53
|
+
children: [/* @__PURE__ */ w(_, { size: 16 }), j("export.history.actions.newExport", "New Export")]
|
|
54
|
+
}),
|
|
55
|
+
children: [
|
|
56
|
+
/* @__PURE__ */ T("div", {
|
|
57
|
+
className: "space-y-4",
|
|
58
|
+
children: [/* @__PURE__ */ T("div", {
|
|
59
|
+
className: "flex flex-col sm:flex-row gap-3",
|
|
60
|
+
children: [/* @__PURE__ */ T("div", {
|
|
61
|
+
className: "flex-1 relative group",
|
|
62
|
+
children: [/* @__PURE__ */ w(b, {
|
|
63
|
+
size: 18,
|
|
64
|
+
className: "absolute left-3 top-1/2 -translate-y-1/2 text-muted-foreground group-focus-within:text-primary transition-colors"
|
|
65
|
+
}), /* @__PURE__ */ w("input", {
|
|
66
|
+
type: "text",
|
|
67
|
+
placeholder: j("export.history.search.placeholder", "Search exports by name or entity type..."),
|
|
68
|
+
value: M.search,
|
|
69
|
+
onChange: (e) => N({ search: e.target.value }),
|
|
70
|
+
className: "w-full pl-[3.25rem] pr-4 py-2.5 border-2 border-border rounded-lg bg-background focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary transition-all duration-200"
|
|
71
|
+
})]
|
|
72
|
+
}), /* @__PURE__ */ T("button", {
|
|
73
|
+
onClick: () => z(!R),
|
|
74
|
+
className: n("inline-flex items-center gap-2 px-4 py-2.5 border-2 rounded-lg transition-all duration-200 font-medium", R || Q ? "bg-primary text-primary-foreground border-primary" : "border-border/50 hover:border-primary/30"),
|
|
75
|
+
children: [/* @__PURE__ */ w(v, { size: 16 }), R ? j("export.history.filters.hide", "Hide") : j("export.history.filters.show", "Filter")]
|
|
76
|
+
})]
|
|
77
|
+
}), R && /* @__PURE__ */ T("div", {
|
|
78
|
+
className: "border-2 border-border/50 rounded-xl p-4 animate-in slide-in-from-top-2 duration-200",
|
|
79
|
+
children: [/* @__PURE__ */ T("div", {
|
|
80
|
+
className: "flex items-center justify-between mb-4",
|
|
81
|
+
children: [/* @__PURE__ */ T("h3", {
|
|
82
|
+
className: "font-semibold flex items-center gap-2",
|
|
83
|
+
children: [/* @__PURE__ */ w(v, {
|
|
84
|
+
size: 16,
|
|
85
|
+
className: "text-primary"
|
|
86
|
+
}), j("export.history.filters.title", "Filters")]
|
|
87
|
+
}), Q && /* @__PURE__ */ T("button", {
|
|
88
|
+
onClick: $,
|
|
89
|
+
className: "text-sm text-muted-foreground hover:text-destructive flex items-center gap-1",
|
|
90
|
+
children: [/* @__PURE__ */ w(x, { size: 14 }), j("export.history.filters.clearAll", "Clear All")]
|
|
91
|
+
})]
|
|
92
|
+
}), /* @__PURE__ */ T("div", {
|
|
93
|
+
className: "grid grid-cols-1 sm:grid-cols-2 gap-4",
|
|
94
|
+
children: [/* @__PURE__ */ T("div", {
|
|
95
|
+
className: "space-y-2",
|
|
96
|
+
children: [/* @__PURE__ */ w("label", {
|
|
97
|
+
className: "block text-sm font-medium",
|
|
98
|
+
children: j("export.history.filters.status.label", "Status")
|
|
99
|
+
}), /* @__PURE__ */ T("select", {
|
|
100
|
+
value: M.status,
|
|
101
|
+
onChange: (e) => N({ status: e.target.value }),
|
|
102
|
+
className: "w-full px-3 py-2 border-2 border-border rounded-lg bg-background focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary",
|
|
103
|
+
children: [/* @__PURE__ */ w("option", {
|
|
104
|
+
value: "all",
|
|
105
|
+
children: j("export.history.filters.status.all", "All Statuses")
|
|
106
|
+
}), r().map((e) => /* @__PURE__ */ w("option", {
|
|
107
|
+
value: e,
|
|
108
|
+
children: ce(e)
|
|
109
|
+
}, e))]
|
|
110
|
+
})]
|
|
111
|
+
}), /* @__PURE__ */ T("div", {
|
|
112
|
+
className: "space-y-2",
|
|
113
|
+
children: [/* @__PURE__ */ w("label", {
|
|
114
|
+
className: "block text-sm font-medium",
|
|
115
|
+
children: j("export.history.filters.format.label", "Format")
|
|
116
|
+
}), /* @__PURE__ */ T("select", {
|
|
117
|
+
value: M.format,
|
|
118
|
+
onChange: (e) => N({ format: e.target.value }),
|
|
119
|
+
className: "w-full px-3 py-2 border-2 border-border rounded-lg bg-background focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary",
|
|
120
|
+
children: [
|
|
121
|
+
/* @__PURE__ */ w("option", {
|
|
122
|
+
value: "all",
|
|
123
|
+
children: j("export.history.filters.format.all", "All Formats")
|
|
124
|
+
}),
|
|
125
|
+
/* @__PURE__ */ w("option", {
|
|
126
|
+
value: "CSV",
|
|
127
|
+
children: "CSV"
|
|
128
|
+
}),
|
|
129
|
+
/* @__PURE__ */ w("option", {
|
|
130
|
+
value: "JSON",
|
|
131
|
+
children: "JSON"
|
|
132
|
+
})
|
|
133
|
+
]
|
|
134
|
+
})]
|
|
135
|
+
})]
|
|
136
|
+
})]
|
|
137
|
+
})]
|
|
138
|
+
}),
|
|
139
|
+
Y && /* @__PURE__ */ T("div", {
|
|
140
|
+
className: "border-2 border-border-default rounded-xl bg-status-error-bg-subtle p-6 flex items-start gap-4",
|
|
141
|
+
children: [/* @__PURE__ */ w(p, {
|
|
142
|
+
size: 24,
|
|
143
|
+
className: "text-status-error-text flex-shrink-0"
|
|
144
|
+
}), /* @__PURE__ */ T("div", { children: [
|
|
145
|
+
/* @__PURE__ */ w("h3", {
|
|
146
|
+
className: "font-semibold text-status-error-text mb-1",
|
|
147
|
+
children: j("export.history.error.title", "Error loading exports")
|
|
148
|
+
}),
|
|
149
|
+
/* @__PURE__ */ w("p", {
|
|
150
|
+
className: "text-sm text-status-error-text mb-3",
|
|
151
|
+
children: Y.message
|
|
152
|
+
}),
|
|
153
|
+
/* @__PURE__ */ T("button", {
|
|
154
|
+
onClick: () => X(),
|
|
155
|
+
className: "inline-flex items-center gap-2 px-3 py-1.5 text-sm bg-destructive text-destructive-foreground rounded-lg hover:bg-destructive/90 transition-colors",
|
|
156
|
+
children: [/* @__PURE__ */ w(y, { size: 14 }), j("export.history.error.retry", "Try Again")]
|
|
157
|
+
})
|
|
158
|
+
] })]
|
|
159
|
+
}),
|
|
160
|
+
J && /* @__PURE__ */ w("div", {
|
|
161
|
+
className: "space-y-3",
|
|
162
|
+
children: [...[
|
|
163
|
+
,
|
|
164
|
+
,
|
|
165
|
+
,
|
|
166
|
+
,
|
|
167
|
+
,
|
|
168
|
+
]].map((e, t) => /* @__PURE__ */ w("div", {
|
|
169
|
+
className: "border-2 border-border/50 rounded-xl p-4 animate-pulse",
|
|
170
|
+
children: /* @__PURE__ */ T("div", {
|
|
171
|
+
className: "flex items-center justify-between",
|
|
172
|
+
children: [/* @__PURE__ */ T("div", {
|
|
173
|
+
className: "space-y-2",
|
|
174
|
+
children: [/* @__PURE__ */ w("div", { className: "h-4 w-48 bg-muted rounded" }), /* @__PURE__ */ w("div", { className: "h-3 w-32 bg-muted rounded" })]
|
|
175
|
+
}), /* @__PURE__ */ w("div", { className: "h-5 w-20 bg-muted rounded-full" })]
|
|
176
|
+
})
|
|
177
|
+
}, t))
|
|
178
|
+
}),
|
|
179
|
+
!J && !Y && (Z.length > 0 ? /* @__PURE__ */ T(C, { children: [/* @__PURE__ */ w("div", {
|
|
180
|
+
className: "space-y-2",
|
|
181
|
+
children: Z.map((e, t) => /* @__PURE__ */ w("button", {
|
|
182
|
+
onClick: () => te(e.id),
|
|
183
|
+
className: n("w-full text-left border-2 border-border/50 rounded-xl p-4", "hover:shadow-md hover:border-primary/30 transition-all duration-200", "group animate-in fade-in-0 slide-in-from-bottom-2"),
|
|
184
|
+
style: { animationDelay: `${t * 30}ms` },
|
|
185
|
+
children: /* @__PURE__ */ T("div", {
|
|
186
|
+
className: "flex items-start sm:items-center justify-between gap-3",
|
|
187
|
+
children: [/* @__PURE__ */ T("div", {
|
|
188
|
+
className: "flex-1 min-w-0",
|
|
189
|
+
children: [/* @__PURE__ */ w("h4", {
|
|
190
|
+
className: "font-semibold text-foreground truncate",
|
|
191
|
+
children: e.name
|
|
192
|
+
}), /* @__PURE__ */ T("p", {
|
|
193
|
+
className: "text-sm text-muted-foreground mt-1 line-clamp-2",
|
|
194
|
+
children: [
|
|
195
|
+
e.entityTypes.join(", "),
|
|
196
|
+
" ·",
|
|
197
|
+
" ",
|
|
198
|
+
i(e.format),
|
|
199
|
+
e.createdAt && ` · ${new Date(e.createdAt).toLocaleDateString()}`
|
|
200
|
+
]
|
|
201
|
+
})]
|
|
202
|
+
}), /* @__PURE__ */ T("div", {
|
|
203
|
+
className: "flex items-center gap-2 flex-shrink-0",
|
|
204
|
+
children: [/* @__PURE__ */ w(s, { status: e.status }), /* @__PURE__ */ w(h, {
|
|
205
|
+
size: 18,
|
|
206
|
+
className: "text-muted-foreground group-hover:text-primary transition-colors hidden sm:block"
|
|
207
|
+
})]
|
|
208
|
+
})]
|
|
209
|
+
})
|
|
210
|
+
}, e.id))
|
|
211
|
+
}), K > F.pageSize && /* @__PURE__ */ T("div", {
|
|
212
|
+
className: "flex flex-col sm:flex-row items-center justify-between gap-3 pt-2",
|
|
213
|
+
children: [/* @__PURE__ */ w("p", {
|
|
214
|
+
className: "text-sm text-muted-foreground",
|
|
215
|
+
children: j("export.history.pagination.showing", "Showing {start}-{end} of {total}", {
|
|
216
|
+
start: oe,
|
|
217
|
+
end: se,
|
|
218
|
+
total: K
|
|
219
|
+
})
|
|
220
|
+
}), /* @__PURE__ */ T("div", {
|
|
221
|
+
className: "flex items-center gap-2",
|
|
222
|
+
children: [
|
|
223
|
+
/* @__PURE__ */ T("button", {
|
|
224
|
+
onClick: re,
|
|
225
|
+
disabled: !ie,
|
|
226
|
+
className: "inline-flex items-center gap-1.5 px-3 py-1.5 text-sm border-2 border-border/50 rounded-lg hover:border-primary/30 disabled:opacity-40 disabled:cursor-not-allowed transition-colors font-medium",
|
|
227
|
+
children: [/* @__PURE__ */ w(m, { size: 16 }), j("export.history.pagination.prev", "Prev")]
|
|
228
|
+
}),
|
|
229
|
+
/* @__PURE__ */ w("span", {
|
|
230
|
+
className: "text-sm text-muted-foreground px-2",
|
|
231
|
+
children: j("export.history.pagination.page", "Page {page}", { page: F.page })
|
|
232
|
+
}),
|
|
233
|
+
/* @__PURE__ */ T("button", {
|
|
234
|
+
onClick: ne,
|
|
235
|
+
disabled: !ae,
|
|
236
|
+
className: "inline-flex items-center gap-1.5 px-3 py-1.5 text-sm border-2 border-border/50 rounded-lg hover:border-primary/30 disabled:opacity-40 disabled:cursor-not-allowed transition-colors font-medium",
|
|
237
|
+
children: [j("export.history.pagination.next", "Next"), /* @__PURE__ */ w(h, { size: 16 })]
|
|
238
|
+
})
|
|
239
|
+
]
|
|
240
|
+
})]
|
|
241
|
+
})] }) : /* @__PURE__ */ w(ee, {
|
|
242
|
+
icon: w(Q ? b : g, { size: 48 }),
|
|
243
|
+
title: Q ? j("export.history.empty.filtered.title", "No matching exports") : j("export.history.empty.title", "No exports yet"),
|
|
244
|
+
description: Q ? j("export.history.empty.filtered.description", "Try adjusting your search or filters.") : j("export.history.empty.description", "Create your first export to see it here."),
|
|
245
|
+
action: Q ? /* @__PURE__ */ T("button", {
|
|
246
|
+
onClick: $,
|
|
247
|
+
className: "inline-flex items-center gap-2 px-4 py-2 border-2 border-border rounded-lg hover:bg-accent transition-colors font-medium",
|
|
248
|
+
children: [/* @__PURE__ */ w(x, { size: 16 }), j("export.history.empty.filtered.actions.clear", "Clear Filters")]
|
|
249
|
+
}) : /* @__PURE__ */ T("button", {
|
|
250
|
+
onClick: () => k?.(D(O, "new")),
|
|
251
|
+
className: "inline-flex items-center gap-2 px-4 py-2 bg-primary text-primary-foreground rounded-lg hover:bg-primary/90 transition-colors font-medium",
|
|
252
|
+
children: [/* @__PURE__ */ w(_, { size: 16 }), j("export.history.empty.actions.createFirst", "Create First Export")]
|
|
253
|
+
})
|
|
254
|
+
}))
|
|
255
|
+
]
|
|
256
|
+
});
|
|
257
|
+
}
|
|
258
|
+
//#endregion
|
|
259
|
+
export { O as ExportHistoryPage };
|
|
260
|
+
|
|
261
|
+
//# sourceMappingURL=ExportHistoryPage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ExportHistoryPage.js","names":[],"sources":["../../../src/export/pages/ExportHistoryPage.tsx"],"sourcesContent":["import { useState, useMemo, useEffect } from \"react\";\nimport { useSearchParams } from \"react-router-dom\";\nimport {\n Search,\n X,\n Clock,\n Download,\n ChevronRight,\n ChevronLeft,\n RefreshCw,\n AlertCircle,\n Filter,\n} from \"lucide-react\";\nimport { useI18n } from \"@burdenoff/fe-libs/shared/providers/shell/I18nProvider\";\nimport { useExport } from \"../providers/ExportProvider\";\nimport { useExportJobs } from \"../hooks/useExportQueries\";\nimport { useExportStore } from \"../store/exportStore\";\nimport { ExportStatusBadge } from \"../components/ExportStatusBadge\";\nimport { PageLayout, EmptyState } from \"../components/PageLayout\";\nimport { cn } from \"../utils/cn\";\nimport {\n getFormatDisplayName,\n getAllStatuses,\n getStatusDisplayName,\n} from \"../constants/enums\";\nimport type { ExportJobStatus, ExportFormat } from \"../types\";\nimport { tWithFallback } from \"../utils/i18n\";\n\n/**\n * Helper to join paths correctly\n */\nconst joinPath = (base: string, path: string): string => {\n const cleanBase = base.endsWith(\"/\") ? base.slice(0, -1) : base;\n const cleanPath = path.startsWith(\"/\") ? path : `/${path}`;\n return cleanBase + cleanPath;\n};\n\n/**\n * Export History Page\n * Table/list of all past exports with filters and cursor-based pagination\n */\nexport function ExportHistoryPage() {\n const { basePath = \"/\", navigate } = useExport();\n const { t } = useI18n();\n const tr = (\n key: string,\n fallback: string,\n params?: Record<string, string | number>,\n ) => tWithFallback(t, key, fallback, params);\n const { jobFilter, updateFilter, resetFilter, pagination, setPagination } =\n useExportStore();\n const [searchParams] = useSearchParams();\n\n // Initialize status filter from URL search params (e.g. ?status=RUNNING)\n useEffect(() => {\n const statusParam = searchParams.get(\"status\");\n if (statusParam) {\n updateFilter({\n status: statusParam as ExportJobStatus,\n });\n }\n // Only run on mount\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const [showFilters, setShowFilters] = useState(false);\n // Cursor stack: index 0 = first page (no cursor), subsequent entries are \"after\" cursors\n const [cursorStack, setCursorStack] = useState<(string | null)[]>([null]);\n const [currentPageIndex, setCurrentPageIndex] = useState(0);\n\n const currentCursor = cursorStack[currentPageIndex] ?? null;\n\n const {\n data: jobs,\n totalCount,\n pageInfo,\n isLoading,\n error,\n refetch,\n } = useExportJobs(jobFilter, {\n first: pagination.pageSize,\n after: currentCursor ?? undefined,\n });\n\n // Client-side search filter (server-side filtering handles status/format)\n const filteredJobs = useMemo(() => {\n if (!jobFilter.search) return jobs;\n const q = jobFilter.search.toLowerCase();\n return jobs.filter(\n (job) =>\n job.name.toLowerCase().includes(q) ||\n job.entityTypes.some((e) => e.toLowerCase().includes(q)),\n );\n }, [jobs, jobFilter.search]);\n\n const hasActiveFilters =\n jobFilter.search ||\n jobFilter.status !== \"all\" ||\n jobFilter.format !== \"all\";\n\n const handleJobClick = (jobId: string) => {\n navigate?.(joinPath(basePath, jobId));\n };\n\n const handleNextPage = () => {\n if (!pageInfo?.hasNextPage || !pageInfo.endCursor) return;\n const newStack = [\n ...cursorStack.slice(0, currentPageIndex + 1),\n pageInfo.endCursor,\n ];\n setCursorStack(newStack);\n setCurrentPageIndex(currentPageIndex + 1);\n setPagination({ page: pagination.page + 1, cursor: pageInfo.endCursor });\n };\n\n const handlePrevPage = () => {\n if (currentPageIndex === 0) return;\n const prevIndex = currentPageIndex - 1;\n setCurrentPageIndex(prevIndex);\n setPagination({\n page: pagination.page - 1,\n cursor: cursorStack[prevIndex] ?? null,\n });\n };\n\n const handleResetFilters = () => {\n resetFilter();\n setCursorStack([null]);\n setCurrentPageIndex(0);\n };\n\n const hasPrevPage = currentPageIndex > 0;\n const hasNextPage = pageInfo?.hasNextPage ?? false;\n const pageStart = currentPageIndex * pagination.pageSize + 1;\n const pageEnd = Math.min(\n (currentPageIndex + 1) * pagination.pageSize,\n totalCount,\n );\n const getStatusLabel = (status: ExportJobStatus) =>\n tr(\n `export.shared.status.${status.toLowerCase()}`,\n getStatusDisplayName(status),\n );\n\n return (\n <PageLayout\n title={tr(\"export.history.title\", \"Export History\")}\n subtitle={tr(\n \"export.history.subtitle\",\n \"View and manage all your past export jobs\",\n )}\n icon={<Clock size={24} />}\n headerActions={\n <button\n onClick={() => navigate?.(joinPath(basePath, \"new\"))}\n className=\"inline-flex items-center gap-2 px-4 py-2 bg-primary text-primary-foreground rounded-lg hover:bg-primary/90 transition-colors font-medium\"\n >\n <Download size={16} />\n {tr(\"export.history.actions.newExport\", \"New Export\")}\n </button>\n }\n >\n {/* Search & Filters */}\n <div className=\"space-y-4\">\n <div className=\"flex flex-col sm:flex-row gap-3\">\n {/* Search */}\n <div className=\"flex-1 relative group\">\n <Search\n size={18}\n className=\"absolute left-3 top-1/2 -translate-y-1/2 text-muted-foreground group-focus-within:text-primary transition-colors\"\n />\n <input\n type=\"text\"\n placeholder={tr(\n \"export.history.search.placeholder\",\n \"Search exports by name or entity type...\",\n )}\n value={jobFilter.search}\n onChange={(e) => updateFilter({ search: e.target.value })}\n className=\"w-full pl-[3.25rem] pr-4 py-2.5 border-2 border-border rounded-lg bg-background focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary transition-all duration-200\"\n />\n </div>\n\n {/* Filter Toggle */}\n <button\n onClick={() => setShowFilters(!showFilters)}\n className={cn(\n \"inline-flex items-center gap-2 px-4 py-2.5 border-2 rounded-lg transition-all duration-200 font-medium\",\n showFilters || hasActiveFilters\n ? \"bg-primary text-primary-foreground border-primary\"\n : \"border-border/50 hover:border-primary/30\",\n )}\n >\n <Filter size={16} />\n {showFilters\n ? tr(\"export.history.filters.hide\", \"Hide\")\n : tr(\"export.history.filters.show\", \"Filter\")}\n </button>\n </div>\n\n {/* Filter Panel */}\n {showFilters && (\n <div className=\"border-2 border-border/50 rounded-xl p-4 animate-in slide-in-from-top-2 duration-200\">\n <div className=\"flex items-center justify-between mb-4\">\n <h3 className=\"font-semibold flex items-center gap-2\">\n <Filter size={16} className=\"text-primary\" />\n {tr(\"export.history.filters.title\", \"Filters\")}\n </h3>\n {hasActiveFilters && (\n <button\n onClick={handleResetFilters}\n className=\"text-sm text-muted-foreground hover:text-destructive flex items-center gap-1\"\n >\n <X size={14} />\n {tr(\"export.history.filters.clearAll\", \"Clear All\")}\n </button>\n )}\n </div>\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-4\">\n {/* Status Filter */}\n <div className=\"space-y-2\">\n <label className=\"block text-sm font-medium\">\n {tr(\"export.history.filters.status.label\", \"Status\")}\n </label>\n <select\n value={jobFilter.status}\n onChange={(e) =>\n updateFilter({\n status: e.target.value as ExportJobStatus | \"all\",\n })\n }\n className=\"w-full px-3 py-2 border-2 border-border rounded-lg bg-background focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary\"\n >\n <option value=\"all\">\n {tr(\"export.history.filters.status.all\", \"All Statuses\")}\n </option>\n {getAllStatuses().map((status) => (\n <option key={status} value={status}>\n {getStatusLabel(status)}\n </option>\n ))}\n </select>\n </div>\n\n {/* Format Filter — only CSV and JSON are supported */}\n <div className=\"space-y-2\">\n <label className=\"block text-sm font-medium\">\n {tr(\"export.history.filters.format.label\", \"Format\")}\n </label>\n <select\n value={jobFilter.format}\n onChange={(e) =>\n updateFilter({\n format: e.target.value as ExportFormat | \"all\",\n })\n }\n className=\"w-full px-3 py-2 border-2 border-border rounded-lg bg-background focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary\"\n >\n <option value=\"all\">\n {tr(\"export.history.filters.format.all\", \"All Formats\")}\n </option>\n <option value=\"CSV\">CSV</option>\n <option value=\"JSON\">JSON</option>\n </select>\n </div>\n </div>\n </div>\n )}\n </div>\n\n {/* Error State */}\n {error && (\n <div className=\"border-2 border-border-default rounded-xl bg-status-error-bg-subtle p-6 flex items-start gap-4\">\n <AlertCircle\n size={24}\n className=\"text-status-error-text flex-shrink-0\"\n />\n <div>\n <h3 className=\"font-semibold text-status-error-text mb-1\">\n {tr(\"export.history.error.title\", \"Error loading exports\")}\n </h3>\n <p className=\"text-sm text-status-error-text mb-3\">\n {error.message}\n </p>\n <button\n onClick={() => refetch()}\n className=\"inline-flex items-center gap-2 px-3 py-1.5 text-sm bg-destructive text-destructive-foreground rounded-lg hover:bg-destructive/90 transition-colors\"\n >\n <RefreshCw size={14} />\n {tr(\"export.history.error.retry\", \"Try Again\")}\n </button>\n </div>\n </div>\n )}\n\n {/* Loading */}\n {isLoading && (\n <div className=\"space-y-3\">\n {[...Array(5)].map((_, i) => (\n <div\n key={i}\n className=\"border-2 border-border/50 rounded-xl p-4 animate-pulse\"\n >\n <div className=\"flex items-center justify-between\">\n <div className=\"space-y-2\">\n <div className=\"h-4 w-48 bg-muted rounded\" />\n <div className=\"h-3 w-32 bg-muted rounded\" />\n </div>\n <div className=\"h-5 w-20 bg-muted rounded-full\" />\n </div>\n </div>\n ))}\n </div>\n )}\n\n {/* Jobs List */}\n {!isLoading &&\n !error &&\n (filteredJobs.length > 0 ? (\n <>\n <div className=\"space-y-2\">\n {filteredJobs.map((job, index) => (\n <button\n key={job.id}\n onClick={() => handleJobClick(job.id)}\n className={cn(\n \"w-full text-left border-2 border-border/50 rounded-xl p-4\",\n \"hover:shadow-md hover:border-primary/30 transition-all duration-200\",\n \"group animate-in fade-in-0 slide-in-from-bottom-2\",\n )}\n style={{ animationDelay: `${index * 30}ms` }}\n >\n <div className=\"flex items-start sm:items-center justify-between gap-3\">\n <div className=\"flex-1 min-w-0\">\n <h4 className=\"font-semibold text-foreground truncate\">\n {job.name}\n </h4>\n <p className=\"text-sm text-muted-foreground mt-1 line-clamp-2\">\n {job.entityTypes.join(\", \")} ·{\" \"}\n {getFormatDisplayName(job.format)}\n {job.createdAt &&\n ` · ${new Date(job.createdAt).toLocaleDateString()}`}\n </p>\n </div>\n <div className=\"flex items-center gap-2 flex-shrink-0\">\n <ExportStatusBadge status={job.status} />\n <ChevronRight\n size={18}\n className=\"text-muted-foreground group-hover:text-primary transition-colors hidden sm:block\"\n />\n </div>\n </div>\n </button>\n ))}\n </div>\n\n {/* Pagination */}\n {totalCount > pagination.pageSize && (\n <div className=\"flex flex-col sm:flex-row items-center justify-between gap-3 pt-2\">\n <p className=\"text-sm text-muted-foreground\">\n {tr(\n \"export.history.pagination.showing\",\n \"Showing {start}-{end} of {total}\",\n {\n start: pageStart,\n end: pageEnd,\n total: totalCount,\n },\n )}\n </p>\n <div className=\"flex items-center gap-2\">\n <button\n onClick={handlePrevPage}\n disabled={!hasPrevPage}\n className=\"inline-flex items-center gap-1.5 px-3 py-1.5 text-sm border-2 border-border/50 rounded-lg hover:border-primary/30 disabled:opacity-40 disabled:cursor-not-allowed transition-colors font-medium\"\n >\n <ChevronLeft size={16} />\n {tr(\"export.history.pagination.prev\", \"Prev\")}\n </button>\n <span className=\"text-sm text-muted-foreground px-2\">\n {tr(\"export.history.pagination.page\", \"Page {page}\", {\n page: pagination.page,\n })}\n </span>\n <button\n onClick={handleNextPage}\n disabled={!hasNextPage}\n className=\"inline-flex items-center gap-1.5 px-3 py-1.5 text-sm border-2 border-border/50 rounded-lg hover:border-primary/30 disabled:opacity-40 disabled:cursor-not-allowed transition-colors font-medium\"\n >\n {tr(\"export.history.pagination.next\", \"Next\")}\n <ChevronRight size={16} />\n </button>\n </div>\n </div>\n )}\n </>\n ) : (\n <EmptyState\n icon={hasActiveFilters ? <Search size={48} /> : <Clock size={48} />}\n title={\n hasActiveFilters\n ? tr(\n \"export.history.empty.filtered.title\",\n \"No matching exports\",\n )\n : tr(\"export.history.empty.title\", \"No exports yet\")\n }\n description={\n hasActiveFilters\n ? tr(\n \"export.history.empty.filtered.description\",\n \"Try adjusting your search or filters.\",\n )\n : tr(\n \"export.history.empty.description\",\n \"Create your first export to see it here.\",\n )\n }\n action={\n hasActiveFilters ? (\n <button\n onClick={handleResetFilters}\n className=\"inline-flex items-center gap-2 px-4 py-2 border-2 border-border rounded-lg hover:bg-accent transition-colors font-medium\"\n >\n <X size={16} />\n {tr(\n \"export.history.empty.filtered.actions.clear\",\n \"Clear Filters\",\n )}\n </button>\n ) : (\n <button\n onClick={() => navigate?.(joinPath(basePath, \"new\"))}\n className=\"inline-flex items-center gap-2 px-4 py-2 bg-primary text-primary-foreground rounded-lg hover:bg-primary/90 transition-colors font-medium\"\n >\n <Download size={16} />\n {tr(\n \"export.history.empty.actions.createFirst\",\n \"Create First Export\",\n )}\n </button>\n )\n }\n />\n ))}\n </PageLayout>\n );\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ExportLandingPage
|
|
3
|
+
*
|
|
4
|
+
* Tabbed landing page for the Export microfrontend. Renders the existing
|
|
5
|
+
* sub-pages (dashboard, new, history, templates) inside a Tabs container.
|
|
6
|
+
* The active tab is reflected in the `?tab=` URL search param.
|
|
7
|
+
*/
|
|
8
|
+
export declare function ExportLandingPage(): import("react/jsx-runtime").JSX.Element;
|
|
9
|
+
//# sourceMappingURL=ExportLandingPage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ExportLandingPage.d.ts","sourceRoot":"","sources":["../../../src/export/pages/ExportLandingPage.tsx"],"names":[],"mappings":"AASA;;;;;;GAMG;AACH,wBAAgB,iBAAiB,4CA2ChC"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { ExportDashboardPage as e } from "./ExportDashboardPage.js";
|
|
2
|
+
import { CreateExportPage as t } from "./CreateExportPage.js";
|
|
3
|
+
import { ExportHistoryPage as n } from "./ExportHistoryPage.js";
|
|
4
|
+
import { ExportTemplatesPage as r } from "./ExportTemplatesPage.js";
|
|
5
|
+
import { useMemo as i } from "react";
|
|
6
|
+
import { useSearchParams as a } from "react-router-dom";
|
|
7
|
+
import { jsx as o, jsxs as s } from "react/jsx-runtime";
|
|
8
|
+
import { Tabs as c } from "@burdenoff/fe-libs/chrome";
|
|
9
|
+
//#region src/export/pages/ExportLandingPage.tsx
|
|
10
|
+
function l() {
|
|
11
|
+
let [l, u] = a(), d = i(() => [
|
|
12
|
+
{
|
|
13
|
+
id: "dashboard",
|
|
14
|
+
label: "Dashboard"
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
id: "new",
|
|
18
|
+
label: "New Export"
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
id: "history",
|
|
22
|
+
label: "History"
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
id: "templates",
|
|
26
|
+
label: "Templates"
|
|
27
|
+
}
|
|
28
|
+
], []), f = l.get("tab") ?? d[0].id;
|
|
29
|
+
return /* @__PURE__ */ s("div", {
|
|
30
|
+
className: "flex flex-col h-full",
|
|
31
|
+
children: [/* @__PURE__ */ o("div", {
|
|
32
|
+
className: "border-b border-border-subtle px-4 pt-3",
|
|
33
|
+
children: /* @__PURE__ */ o(c, {
|
|
34
|
+
items: d,
|
|
35
|
+
activeTabId: f,
|
|
36
|
+
onTabChange: (e) => {
|
|
37
|
+
let t = new URLSearchParams(l);
|
|
38
|
+
e === d[0].id ? t.delete("tab") : t.set("tab", e), u(t, { replace: !0 });
|
|
39
|
+
},
|
|
40
|
+
variant: "underline"
|
|
41
|
+
})
|
|
42
|
+
}), /* @__PURE__ */ s("div", {
|
|
43
|
+
className: "flex-1 min-h-0 overflow-auto",
|
|
44
|
+
children: [
|
|
45
|
+
f === "dashboard" && /* @__PURE__ */ o(e, {}),
|
|
46
|
+
f === "new" && /* @__PURE__ */ o(t, {}),
|
|
47
|
+
f === "history" && /* @__PURE__ */ o(n, {}),
|
|
48
|
+
f === "templates" && /* @__PURE__ */ o(r, {})
|
|
49
|
+
]
|
|
50
|
+
})]
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
//#endregion
|
|
54
|
+
export { l as ExportLandingPage };
|
|
55
|
+
|
|
56
|
+
//# sourceMappingURL=ExportLandingPage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ExportLandingPage.js","names":[],"sources":["../../../src/export/pages/ExportLandingPage.tsx"],"sourcesContent":["import { useMemo } from \"react\";\nimport { useSearchParams } from \"react-router-dom\";\nimport { Tabs, type TabItem } from \"@burdenoff/fe-libs/chrome\";\n\nimport { ExportDashboardPage } from \"./ExportDashboardPage\";\nimport { CreateExportPage } from \"./CreateExportPage\";\nimport { ExportHistoryPage } from \"./ExportHistoryPage\";\nimport { ExportTemplatesPage } from \"./ExportTemplatesPage\";\n\n/**\n * ExportLandingPage\n *\n * Tabbed landing page for the Export microfrontend. Renders the existing\n * sub-pages (dashboard, new, history, templates) inside a Tabs container.\n * The active tab is reflected in the `?tab=` URL search param.\n */\nexport function ExportLandingPage() {\n const [params, setParams] = useSearchParams();\n\n const tabs: TabItem[] = useMemo(\n () => [\n { id: \"dashboard\", label: \"Dashboard\" },\n { id: \"new\", label: \"New Export\" },\n { id: \"history\", label: \"History\" },\n { id: \"templates\", label: \"Templates\" },\n ],\n [],\n );\n\n const activeId = params.get(\"tab\") ?? tabs[0].id;\n\n const handleTabChange = (id: string) => {\n const next = new URLSearchParams(params);\n if (id === tabs[0].id) {\n next.delete(\"tab\");\n } else {\n next.set(\"tab\", id);\n }\n setParams(next, { replace: true });\n };\n\n return (\n <div className=\"flex flex-col h-full\">\n <div className=\"border-b border-border-subtle px-4 pt-3\">\n <Tabs\n items={tabs}\n activeTabId={activeId}\n onTabChange={handleTabChange}\n variant=\"underline\"\n />\n </div>\n <div className=\"flex-1 min-h-0 overflow-auto\">\n {activeId === \"dashboard\" && <ExportDashboardPage />}\n {activeId === \"new\" && <CreateExportPage />}\n {activeId === \"history\" && <ExportHistoryPage />}\n {activeId === \"templates\" && <ExportTemplatesPage />}\n </div>\n </div>\n );\n}\n"],"mappings":";;;;;;;;;AAgBA,SAAgB,IAAoB;CAClC,IAAM,CAAC,GAAQ,KAAa,GAAiB,EAEvC,IAAkB,QAChB;EACJ;GAAE,IAAI;GAAa,OAAO;GAAa;EACvC;GAAE,IAAI;GAAO,OAAO;GAAc;EAClC;GAAE,IAAI;GAAW,OAAO;GAAW;EACnC;GAAE,IAAI;GAAa,OAAO;GAAa;EACxC,EACD,EAAE,CACH,EAEK,IAAW,EAAO,IAAI,MAAM,IAAI,EAAK,GAAG;AAY9C,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf,CACE,kBAAC,OAAD;GAAK,WAAU;aACb,kBAAC,GAAD;IACE,OAAO;IACP,aAAa;IACb,cAhBiB,MAAe;KACtC,IAAM,IAAO,IAAI,gBAAgB,EAAO;AAMxC,KALI,MAAO,EAAK,GAAG,KACjB,EAAK,OAAO,MAAM,GAElB,EAAK,IAAI,OAAO,EAAG,EAErB,EAAU,GAAM,EAAE,SAAS,IAAM,CAAC;;IAU5B,SAAQ;IACR,CAAA;GACE,CAAA,EACN,kBAAC,OAAD;GAAK,WAAU;aAAf;IACG,MAAa,eAAe,kBAAC,GAAD,EAAuB,CAAA;IACnD,MAAa,SAAS,kBAAC,GAAD,EAAoB,CAAA;IAC1C,MAAa,aAAa,kBAAC,GAAD,EAAqB,CAAA;IAC/C,MAAa,eAAe,kBAAC,GAAD,EAAuB,CAAA;IAChD;KACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ExportTemplatesPage.d.ts","sourceRoot":"","sources":["../../../src/export/pages/ExportTemplatesPage.tsx"],"names":[],"mappings":"AAkCA;;;GAGG;AACH,wBAAgB,mBAAmB,4CAsflC"}
|