@burdenoff/microfe-ecoimpacthub 2026.819.1 → 2026.819.3

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.
@@ -1 +1 @@
1
- {"version":3,"file":"EcoImpactHubAdminRoot.d.ts","sourceRoot":"","sources":["../../src/ecoimpacthub/EcoImpactHubAdminRoot.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAEH,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AA2BhC,OAAO,KAAK,EACV,qBAAqB,EAStB,MAAM,SAAS,CAAC;AAEjB,MAAM,WAAW,0BAA2B,SAAQ,qBAAqB;IACvE,0EAA0E;IAC1E,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAyiBD,eAAO,MAAM,qBAAqB,EAAE,EAAE,CAAC,0BAA0B,CAmBhE,CAAC;AAEF,OAAO,EAAE,qBAAqB,IAAI,SAAS,EAAE,CAAC"}
1
+ {"version":3,"file":"EcoImpactHubAdminRoot.d.ts","sourceRoot":"","sources":["../../src/ecoimpacthub/EcoImpactHubAdminRoot.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AA8BhC,OAAO,KAAK,EACV,qBAAqB,EAStB,MAAM,SAAS,CAAC;AAEjB,MAAM,WAAW,0BAA2B,SAAQ,qBAAqB;IACvE,0EAA0E;IAC1E,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAwkBD,eAAO,MAAM,qBAAqB,EAAE,EAAE,CAAC,0BAA0B,CAmBhE,CAAC;AAEF,OAAO,EAAE,qBAAqB,IAAI,SAAS,EAAE,CAAC"}
@@ -4,24 +4,24 @@ import { formatCo2e as n, formatDate as r, formatEnumLabel as i } from "./utils/
4
4
  import { StatusBadge as a } from "./components/StatusBadge.js";
5
5
  import { ErrorView as o, LoadingView as s, Section as c } from "./components/StateViews.js";
6
6
  import { EmptyState as l } from "./components/EmptyState.js";
7
- import { useEcoArchiveSite as u, useEcoCarbonEntries as d, useEcoPublishReport as f, useEcoReports as p, useEcoSensors as m, useEcoSetSensorStatus as h, useEcoSites as g, useEcoVerifyCarbonEntry as _ } from "./hooks/useEcoImpactHubApi.js";
8
- import { Tabs as v } from "./components/Tabs.js";
9
- import { DataTable as y } from "./components/DataTable.js";
10
- import { Pagination as b } from "./components/Pagination.js";
11
- import { FilterTabs as x } from "./components/FilterTabs.js";
12
- import { useMemo as S, useState as C } from "react";
13
- import { QueryClient as w, QueryClientProvider as T } from "@tanstack/react-query";
14
- import { FeatureFlagProvider as E } from "@burdenoff/fe-libs/shared/feature-flags";
15
- import { Factory as D, FileText as O, MapPin as k, Radio as A, ShieldCheck as j } from "lucide-react";
16
- import { Fragment as M, jsx as N, jsxs as P } from "react/jsx-runtime";
17
- import { Button as F } from "@burdenoff/fe-libs/ui";
18
- import { PermissionProvider as I } from "@burdenoff/fe-libs/shared/providers/shell";
7
+ import { useEcoApproveReport as u, useEcoArchiveSite as d, useEcoCarbonEntries as f, useEcoPublishReport as p, useEcoRejectReport as m, useEcoReports as h, useEcoSensors as g, useEcoSetSensorStatus as _, useEcoSites as v, useEcoSubmitReportForApproval as y, useEcoVerifyCarbonEntry as b } from "./hooks/useEcoImpactHubApi.js";
8
+ import { Tabs as x } from "./components/Tabs.js";
9
+ import { DataTable as S } from "./components/DataTable.js";
10
+ import { Pagination as C } from "./components/Pagination.js";
11
+ import { FilterTabs as w } from "./components/FilterTabs.js";
12
+ import { useMemo as T, useState as E } from "react";
13
+ import { QueryClient as D, QueryClientProvider as O } from "@tanstack/react-query";
14
+ import { FeatureFlagProvider as k } from "@burdenoff/fe-libs/shared/feature-flags";
15
+ import { Factory as A, FileText as j, MapPin as M, Radio as N, ShieldCheck as P } from "lucide-react";
16
+ import { Fragment as F, jsx as I, jsxs as L } from "react/jsx-runtime";
17
+ import { Button as R } from "@burdenoff/fe-libs/ui";
18
+ import { PermissionProvider as z } from "@burdenoff/fe-libs/shared/providers/shell";
19
19
  //#region src/ecoimpacthub/EcoImpactHubAdminRoot.tsx
20
- var L = new w({ defaultOptions: { queries: {
20
+ var B = new D({ defaultOptions: { queries: {
21
21
  staleTime: 30 * 1e3,
22
22
  retry: 1,
23
23
  refetchOnWindowFocus: !1
24
- } } }), R = 12, z = [
24
+ } } }), V = 12, H = [
25
25
  {
26
26
  value: "ALL",
27
27
  label: "All"
@@ -38,7 +38,7 @@ var L = new w({ defaultOptions: { queries: {
38
38
  value: "ARCHIVED",
39
39
  label: "Archived"
40
40
  }
41
- ], B = [
41
+ ], U = [
42
42
  {
43
43
  value: "ALL",
44
44
  label: "All"
@@ -63,7 +63,7 @@ var L = new w({ defaultOptions: { queries: {
63
63
  value: "RETIRED",
64
64
  label: "Retired"
65
65
  }
66
- ], V = [
66
+ ], W = [
67
67
  {
68
68
  value: "ALL",
69
69
  label: "All"
@@ -84,7 +84,7 @@ var L = new w({ defaultOptions: { queries: {
84
84
  value: "ADJUSTED",
85
85
  label: "Adjusted"
86
86
  }
87
- ], H = [
87
+ ], G = [
88
88
  {
89
89
  value: "ALL",
90
90
  label: "All"
@@ -106,12 +106,12 @@ var L = new w({ defaultOptions: { queries: {
106
106
  label: "Archived"
107
107
  }
108
108
  ];
109
- function U({ site: e }) {
110
- let t = u();
111
- return e.status === "ARCHIVED" ? /* @__PURE__ */ N("span", {
109
+ function K({ site: e }) {
110
+ let t = d();
111
+ return e.status === "ARCHIVED" ? /* @__PURE__ */ I("span", {
112
112
  className: "text-xs text-text-secondary",
113
113
  children: "Archived"
114
- }) : /* @__PURE__ */ N(F, {
114
+ }) : /* @__PURE__ */ I(R, {
115
115
  variant: "outline",
116
116
  size: "sm",
117
117
  onClick: () => t.mutate(e.id),
@@ -119,20 +119,20 @@ function U({ site: e }) {
119
119
  children: "Archive"
120
120
  });
121
121
  }
122
- function W() {
123
- let [e, t] = C("ALL"), { data: n, isLoading: u, error: d, refetch: f } = g({
122
+ function q() {
123
+ let [e, t] = E("ALL"), { data: n, isLoading: u, error: d, refetch: f } = v({
124
124
  status: e === "ALL" ? void 0 : e,
125
125
  pagination: { limit: 100 }
126
- }), p = S(() => [
126
+ }), p = T(() => [
127
127
  {
128
128
  key: "name",
129
129
  header: "Site",
130
- render: (e) => /* @__PURE__ */ P("div", {
130
+ render: (e) => /* @__PURE__ */ L("div", {
131
131
  className: "min-w-0",
132
- children: [/* @__PURE__ */ N("p", {
132
+ children: [/* @__PURE__ */ I("p", {
133
133
  className: "font-medium text-text-primary truncate",
134
134
  children: e.name
135
- }), e.code && /* @__PURE__ */ N("p", {
135
+ }), e.code && /* @__PURE__ */ I("p", {
136
136
  className: "text-xs text-text-secondary",
137
137
  children: e.code
138
138
  })]
@@ -153,7 +153,7 @@ function W() {
153
153
  {
154
154
  key: "status",
155
155
  header: "Status",
156
- render: (e) => /* @__PURE__ */ N(a, { status: e.status })
156
+ render: (e) => /* @__PURE__ */ I(a, { status: e.status })
157
157
  },
158
158
  {
159
159
  key: "created",
@@ -166,31 +166,31 @@ function W() {
166
166
  key: "actions",
167
167
  header: "Actions",
168
168
  align: "right",
169
- render: (e) => /* @__PURE__ */ N(U, { site: e })
169
+ render: (e) => /* @__PURE__ */ I(K, { site: e })
170
170
  }
171
171
  ], []);
172
- if (u) return /* @__PURE__ */ N(s, { label: "Loading sites…" });
173
- if (d) return /* @__PURE__ */ N(o, {
172
+ if (u) return /* @__PURE__ */ I(s, { label: "Loading sites…" });
173
+ if (d) return /* @__PURE__ */ I(o, {
174
174
  title: "Could not load sites",
175
175
  message: d.message,
176
176
  onRetry: f
177
177
  });
178
178
  let m = n?.items ?? [];
179
- return /* @__PURE__ */ P(c, {
179
+ return /* @__PURE__ */ L(c, {
180
180
  title: "Site registry",
181
181
  description: "Pause monitoring or archive decommissioned sites.",
182
- children: [/* @__PURE__ */ N("div", {
182
+ children: [/* @__PURE__ */ I("div", {
183
183
  className: "mb-4",
184
- children: /* @__PURE__ */ N(x, {
185
- options: z,
184
+ children: /* @__PURE__ */ I(w, {
185
+ options: H,
186
186
  value: e,
187
187
  onChange: t
188
188
  })
189
- }), m.length === 0 ? /* @__PURE__ */ N(l, {
190
- icon: /* @__PURE__ */ N(k, { size: 40 }),
189
+ }), m.length === 0 ? /* @__PURE__ */ I(l, {
190
+ icon: /* @__PURE__ */ I(M, { size: 40 }),
191
191
  title: "No sites found",
192
192
  description: `There are no ${e === "ALL" ? "" : e.toLowerCase()} sites in this workspace.`
193
- }) : /* @__PURE__ */ N(y, {
193
+ }) : /* @__PURE__ */ I(S, {
194
194
  columns: p,
195
195
  rows: m,
196
196
  rowKey: (e) => e.id,
@@ -201,18 +201,18 @@ function W() {
201
201
  })]
202
202
  });
203
203
  }
204
- var G = {
204
+ var J = {
205
205
  ONLINE: "MAINTENANCE",
206
206
  OFFLINE: "MAINTENANCE",
207
207
  DEGRADED: "MAINTENANCE",
208
208
  MAINTENANCE: "ONLINE",
209
209
  RETIRED: null
210
210
  };
211
- function K({ sensor: e }) {
212
- let t = h(), n = G[e.status];
213
- return /* @__PURE__ */ P("div", {
211
+ function Y({ sensor: e }) {
212
+ let t = _(), n = J[e.status];
213
+ return /* @__PURE__ */ L("div", {
214
214
  className: "flex flex-wrap items-center justify-end gap-2",
215
- children: [n && /* @__PURE__ */ N(F, {
215
+ children: [n && /* @__PURE__ */ I(R, {
216
216
  variant: "outline",
217
217
  size: "sm",
218
218
  onClick: () => t.mutate({
@@ -221,7 +221,7 @@ function K({ sensor: e }) {
221
221
  }),
222
222
  disabled: t.isPending,
223
223
  children: n === "MAINTENANCE" ? "Send to maintenance" : "Bring online"
224
- }), e.status !== "RETIRED" && /* @__PURE__ */ N(F, {
224
+ }), e.status !== "RETIRED" && /* @__PURE__ */ I(R, {
225
225
  variant: "outline",
226
226
  size: "sm",
227
227
  onClick: () => t.mutate({
@@ -233,17 +233,17 @@ function K({ sensor: e }) {
233
233
  })]
234
234
  });
235
235
  }
236
- function q() {
237
- let [e, t] = C("ALL"), { data: n, isLoading: u, error: d, refetch: f } = m({ status: e === "ALL" ? void 0 : e }), p = S(() => [
236
+ function X() {
237
+ let [e, t] = E("ALL"), { data: n, isLoading: u, error: d, refetch: f } = g({ status: e === "ALL" ? void 0 : e }), p = T(() => [
238
238
  {
239
239
  key: "name",
240
240
  header: "Sensor",
241
- render: (e) => /* @__PURE__ */ P("div", {
241
+ render: (e) => /* @__PURE__ */ L("div", {
242
242
  className: "min-w-0",
243
- children: [/* @__PURE__ */ N("p", {
243
+ children: [/* @__PURE__ */ I("p", {
244
244
  className: "font-medium text-text-primary truncate",
245
245
  children: e.name
246
- }), e.hardwareId && /* @__PURE__ */ N("p", {
246
+ }), e.hardwareId && /* @__PURE__ */ I("p", {
247
247
  className: "font-mono text-xs text-text-secondary",
248
248
  children: e.hardwareId
249
249
  })]
@@ -258,7 +258,7 @@ function q() {
258
258
  {
259
259
  key: "site",
260
260
  header: "Site ID",
261
- render: (e) => /* @__PURE__ */ N("span", {
261
+ render: (e) => /* @__PURE__ */ I("span", {
262
262
  className: "font-mono text-xs text-text-secondary",
263
263
  children: e.siteId
264
264
  }),
@@ -267,7 +267,7 @@ function q() {
267
267
  {
268
268
  key: "status",
269
269
  header: "Status",
270
- render: (e) => /* @__PURE__ */ N(a, { status: e.status })
270
+ render: (e) => /* @__PURE__ */ I(a, { status: e.status })
271
271
  },
272
272
  {
273
273
  key: "lastReading",
@@ -280,33 +280,33 @@ function q() {
280
280
  key: "actions",
281
281
  header: "Actions",
282
282
  align: "right",
283
- render: (e) => /* @__PURE__ */ N(K, { sensor: e })
283
+ render: (e) => /* @__PURE__ */ I(Y, { sensor: e })
284
284
  }
285
285
  ], []);
286
- if (u) return /* @__PURE__ */ N(s, { label: "Loading sensors…" });
287
- if (d) return /* @__PURE__ */ N(o, {
286
+ if (u) return /* @__PURE__ */ I(s, { label: "Loading sensors…" });
287
+ if (d) return /* @__PURE__ */ I(o, {
288
288
  title: "Could not load sensors",
289
289
  message: d.message,
290
290
  onRetry: f
291
291
  });
292
- let h = n?.items ?? [];
293
- return /* @__PURE__ */ P(c, {
292
+ let m = n?.items ?? [];
293
+ return /* @__PURE__ */ L(c, {
294
294
  title: "Sensor fleet",
295
295
  description: "Retire hardware or move sensors into maintenance.",
296
- children: [/* @__PURE__ */ N("div", {
296
+ children: [/* @__PURE__ */ I("div", {
297
297
  className: "mb-4",
298
- children: /* @__PURE__ */ N(x, {
299
- options: B,
298
+ children: /* @__PURE__ */ I(w, {
299
+ options: U,
300
300
  value: e,
301
301
  onChange: t
302
302
  })
303
- }), h.length === 0 ? /* @__PURE__ */ N(l, {
304
- icon: /* @__PURE__ */ N(A, { size: 40 }),
303
+ }), m.length === 0 ? /* @__PURE__ */ I(l, {
304
+ icon: /* @__PURE__ */ I(N, { size: 40 }),
305
305
  title: "No sensors found",
306
306
  description: `There are no ${e === "ALL" ? "" : e.toLowerCase()} sensors in this workspace.`
307
- }) : /* @__PURE__ */ N(y, {
307
+ }) : /* @__PURE__ */ I(S, {
308
308
  columns: p,
309
- rows: h,
309
+ rows: m,
310
310
  rowKey: (e) => e.id,
311
311
  defaultSort: {
312
312
  key: "lastReading",
@@ -315,12 +315,12 @@ function q() {
315
315
  })]
316
316
  });
317
317
  }
318
- function J({ entry: e }) {
319
- let t = _();
320
- return e.status === "VERIFIED" ? /* @__PURE__ */ N("span", {
318
+ function Z({ entry: e }) {
319
+ let t = b();
320
+ return e.status === "VERIFIED" ? /* @__PURE__ */ I("span", {
321
321
  className: "text-xs text-text-secondary",
322
322
  children: "Verified"
323
- }) : /* @__PURE__ */ N(F, {
323
+ }) : /* @__PURE__ */ I(R, {
324
324
  variant: "outline",
325
325
  size: "sm",
326
326
  onClick: () => t.mutate(e.id),
@@ -328,23 +328,23 @@ function J({ entry: e }) {
328
328
  children: "Verify"
329
329
  });
330
330
  }
331
- function Y() {
332
- let [e, t] = C("ALL"), [u, f] = C(0), [p, m] = C([]), h = u > 0 ? p[u - 1] : void 0, { data: g, isLoading: _, error: v, refetch: w } = d({
331
+ function Q() {
332
+ let [e, t] = E("ALL"), [u, d] = E(0), [p, m] = E([]), h = u > 0 ? p[u - 1] : void 0, { data: g, isLoading: _, error: v, refetch: y } = f({
333
333
  status: e === "ALL" ? void 0 : e,
334
334
  pagination: {
335
- limit: R,
335
+ limit: V,
336
336
  cursor: h
337
337
  }
338
- }), T = S(() => [
338
+ }), b = T(() => [
339
339
  {
340
340
  key: "category",
341
341
  header: "Category",
342
- render: (e) => /* @__PURE__ */ P("div", {
342
+ render: (e) => /* @__PURE__ */ L("div", {
343
343
  className: "min-w-0",
344
- children: [/* @__PURE__ */ N("p", {
344
+ children: [/* @__PURE__ */ I("p", {
345
345
  className: "font-medium text-text-primary truncate",
346
346
  children: e.category
347
- }), e.factor && /* @__PURE__ */ N("p", {
347
+ }), e.factor && /* @__PURE__ */ I("p", {
348
348
  className: "text-xs text-text-secondary",
349
349
  children: e.factor.name
350
350
  })]
@@ -372,79 +372,94 @@ function Y() {
372
372
  {
373
373
  key: "status",
374
374
  header: "Status",
375
- render: (e) => /* @__PURE__ */ N(a, { status: e.status })
375
+ render: (e) => /* @__PURE__ */ I(a, { status: e.status })
376
376
  },
377
377
  {
378
378
  key: "actions",
379
379
  header: "Actions",
380
380
  align: "right",
381
- render: (e) => /* @__PURE__ */ N(J, { entry: e })
381
+ render: (e) => /* @__PURE__ */ I(Z, { entry: e })
382
382
  }
383
- ], []), E = (e) => {
384
- e > u && g?.pageInfo.cursor ? m((e) => [...e, g.pageInfo.cursor]) : e < u && m((e) => e.slice(0, -1)), f(e);
383
+ ], []), x = (e) => {
384
+ e > u && g?.pageInfo.cursor ? m((e) => [...e, g.pageInfo.cursor]) : e < u && m((e) => e.slice(0, -1)), d(e);
385
385
  };
386
- if (_) return /* @__PURE__ */ N(s, { label: "Loading carbon entries…" });
387
- if (v) return /* @__PURE__ */ N(o, {
386
+ if (_) return /* @__PURE__ */ I(s, { label: "Loading carbon entries…" });
387
+ if (v) return /* @__PURE__ */ I(o, {
388
388
  title: "Could not load carbon entries",
389
389
  message: v.message,
390
- onRetry: w
390
+ onRetry: y
391
391
  });
392
- let O = g?.items ?? [];
393
- return /* @__PURE__ */ P(c, {
392
+ let D = g?.items ?? [];
393
+ return /* @__PURE__ */ L(c, {
394
394
  title: "Carbon ledger",
395
395
  description: "Verify DRAFT/RECORDED entries across all sites and scopes.",
396
- children: [/* @__PURE__ */ N("div", {
396
+ children: [/* @__PURE__ */ I("div", {
397
397
  className: "mb-4",
398
- children: /* @__PURE__ */ N(x, {
399
- options: V,
398
+ children: /* @__PURE__ */ I(w, {
399
+ options: W,
400
400
  value: e,
401
401
  onChange: (e) => {
402
- t(e), f(0), m([]);
402
+ t(e), d(0), m([]);
403
403
  }
404
404
  })
405
- }), O.length === 0 ? /* @__PURE__ */ N(l, {
406
- icon: /* @__PURE__ */ N(D, { size: 40 }),
405
+ }), D.length === 0 ? /* @__PURE__ */ I(l, {
406
+ icon: /* @__PURE__ */ I(A, { size: 40 }),
407
407
  title: "No carbon entries found",
408
408
  description: `There are no ${e === "ALL" ? "" : e.toLowerCase()} entries in this workspace.`
409
- }) : /* @__PURE__ */ P(M, { children: [/* @__PURE__ */ N(y, {
410
- columns: T,
411
- rows: O,
409
+ }) : /* @__PURE__ */ L(F, { children: [/* @__PURE__ */ I(S, {
410
+ columns: b,
411
+ rows: D,
412
412
  rowKey: (e) => e.id,
413
413
  defaultSort: {
414
414
  key: "period",
415
415
  dir: "desc"
416
416
  }
417
- }), /* @__PURE__ */ N(b, {
417
+ }), /* @__PURE__ */ I(C, {
418
418
  page: u,
419
- pageSize: R,
420
- itemCount: O.length,
419
+ pageSize: V,
420
+ itemCount: D.length,
421
421
  hasMore: g?.pageInfo.hasMore ?? !1,
422
- onPageChange: E
422
+ onPageChange: x
423
423
  })] })]
424
424
  });
425
425
  }
426
- function X({ report: e }) {
427
- let t = f();
428
- return e.status === "PUBLISHED" || e.status === "ARCHIVED" ? /* @__PURE__ */ N("span", {
426
+ function $({ report: e }) {
427
+ let t = y(), n = u(), r = m(), a = p(), o = t.isPending || n.isPending || r.isPending || a.isPending;
428
+ return e.status === "PUBLISHED" || e.status === "ARCHIVED" ? /* @__PURE__ */ I("span", {
429
429
  className: "text-xs text-text-secondary",
430
430
  children: i(e.status)
431
- }) : /* @__PURE__ */ N(F, {
431
+ }) : e.status === "DRAFT" ? /* @__PURE__ */ I(R, {
432
432
  variant: "outline",
433
433
  size: "sm",
434
- onClick: () => t.mutate({
435
- id: e.id,
436
- fileId: e.file?.id ?? null
437
- }),
438
- disabled: t.isPending,
439
- children: "Publish"
434
+ onClick: () => t.mutate(e.id),
435
+ disabled: o,
436
+ children: "Submit for approval"
437
+ }) : /* @__PURE__ */ L("div", {
438
+ className: "flex flex-wrap items-center justify-end gap-2",
439
+ children: [/* @__PURE__ */ I(R, {
440
+ variant: "default",
441
+ size: "sm",
442
+ onClick: () => n.mutate(e.id),
443
+ disabled: o,
444
+ children: "Approve"
445
+ }), /* @__PURE__ */ I(R, {
446
+ variant: "outline",
447
+ size: "sm",
448
+ onClick: () => r.mutate({
449
+ reportId: e.id,
450
+ reason: "Rejected from admin panel"
451
+ }),
452
+ disabled: o,
453
+ children: "Reject"
454
+ })]
440
455
  });
441
456
  }
442
- function Z() {
443
- let [e, t] = C("ALL"), { data: n, isLoading: u, error: d, refetch: f } = p(e === "ALL" ? void 0 : e, { limit: 100 }), m = S(() => [
457
+ function ee() {
458
+ let [e, t] = E("ALL"), { data: n, isLoading: u, error: d, refetch: f } = h(e === "ALL" ? void 0 : e, { limit: 100 }), p = T(() => [
444
459
  {
445
460
  key: "title",
446
461
  header: "Report",
447
- render: (e) => /* @__PURE__ */ N("p", {
462
+ render: (e) => /* @__PURE__ */ I("p", {
448
463
  className: "font-medium text-text-primary truncate",
449
464
  children: e.title
450
465
  }),
@@ -464,7 +479,7 @@ function Z() {
464
479
  {
465
480
  key: "status",
466
481
  header: "Status",
467
- render: (e) => /* @__PURE__ */ N(a, { status: e.status })
482
+ render: (e) => /* @__PURE__ */ I(a, { status: e.status })
468
483
  },
469
484
  {
470
485
  key: "published",
@@ -477,33 +492,33 @@ function Z() {
477
492
  key: "actions",
478
493
  header: "Actions",
479
494
  align: "right",
480
- render: (e) => /* @__PURE__ */ N(X, { report: e })
495
+ render: (e) => /* @__PURE__ */ I($, { report: e })
481
496
  }
482
497
  ], []);
483
- if (u) return /* @__PURE__ */ N(s, { label: "Loading reports…" });
484
- if (d) return /* @__PURE__ */ N(o, {
498
+ if (u) return /* @__PURE__ */ I(s, { label: "Loading reports…" });
499
+ if (d) return /* @__PURE__ */ I(o, {
485
500
  title: "Could not load reports",
486
501
  message: d.message,
487
502
  onRetry: f
488
503
  });
489
- let h = n?.items ?? [];
490
- return /* @__PURE__ */ P(c, {
504
+ let m = n?.items ?? [];
505
+ return /* @__PURE__ */ L(c, {
491
506
  title: "Sustainability reports",
492
- description: "Publish reports once their line items are complete.",
493
- children: [/* @__PURE__ */ N("div", {
507
+ description: "Submit draft reports for approval, then approve, reject, or publish them.",
508
+ children: [/* @__PURE__ */ I("div", {
494
509
  className: "mb-4",
495
- children: /* @__PURE__ */ N(x, {
496
- options: H,
510
+ children: /* @__PURE__ */ I(w, {
511
+ options: G,
497
512
  value: e,
498
513
  onChange: t
499
514
  })
500
- }), h.length === 0 ? /* @__PURE__ */ N(l, {
501
- icon: /* @__PURE__ */ N(O, { size: 40 }),
515
+ }), m.length === 0 ? /* @__PURE__ */ I(l, {
516
+ icon: /* @__PURE__ */ I(j, { size: 40 }),
502
517
  title: "No reports found",
503
518
  description: `There are no ${e === "ALL" ? "" : e.toLowerCase()} reports in this workspace.`
504
- }) : /* @__PURE__ */ N(y, {
505
- columns: m,
506
- rows: h,
519
+ }) : /* @__PURE__ */ I(S, {
520
+ columns: p,
521
+ rows: m,
507
522
  rowKey: (e) => e.id,
508
523
  defaultSort: {
509
524
  key: "period",
@@ -512,68 +527,68 @@ function Z() {
512
527
  })]
513
528
  });
514
529
  }
515
- function Q() {
516
- let [e, n] = C("sites"), r = S(() => [
530
+ function te() {
531
+ let [e, n] = E("sites"), r = T(() => [
517
532
  {
518
533
  value: "sites",
519
534
  label: "Sites",
520
- icon: /* @__PURE__ */ N(k, { size: 18 })
535
+ icon: /* @__PURE__ */ I(M, { size: 18 })
521
536
  },
522
537
  {
523
538
  value: "sensors",
524
539
  label: "Sensors",
525
- icon: /* @__PURE__ */ N(A, { size: 18 })
540
+ icon: /* @__PURE__ */ I(N, { size: 18 })
526
541
  },
527
542
  {
528
543
  value: "carbon",
529
544
  label: "Carbon Ledger",
530
- icon: /* @__PURE__ */ N(D, { size: 18 })
545
+ icon: /* @__PURE__ */ I(A, { size: 18 })
531
546
  },
532
547
  {
533
548
  value: "reports",
534
549
  label: "Reports",
535
- icon: /* @__PURE__ */ N(O, { size: 18 })
550
+ icon: /* @__PURE__ */ I(j, { size: 18 })
536
551
  }
537
552
  ], []);
538
- return /* @__PURE__ */ P(t, {
553
+ return /* @__PURE__ */ L(t, {
539
554
  title: "EcoImpactHub Admin",
540
555
  description: "Site, sensor, carbon-ledger and report governance.",
541
- actions: /* @__PURE__ */ P("span", {
556
+ actions: /* @__PURE__ */ L("span", {
542
557
  className: "inline-flex items-center gap-2 text-sm text-text-secondary",
543
- children: [/* @__PURE__ */ N(j, { size: 18 }), "Workspace-scoped"]
558
+ children: [/* @__PURE__ */ I(P, { size: 18 }), "Workspace-scoped"]
544
559
  }),
545
- children: [/* @__PURE__ */ N(v, {
560
+ children: [/* @__PURE__ */ I(x, {
546
561
  items: r,
547
562
  value: e,
548
563
  onChange: n
549
- }), /* @__PURE__ */ P("div", {
564
+ }), /* @__PURE__ */ L("div", {
550
565
  className: "mt-6",
551
566
  children: [
552
- e === "sites" && /* @__PURE__ */ N(W, {}),
553
- e === "sensors" && /* @__PURE__ */ N(q, {}),
554
- e === "carbon" && /* @__PURE__ */ N(Y, {}),
555
- e === "reports" && /* @__PURE__ */ N(Z, {})
567
+ e === "sites" && /* @__PURE__ */ I(q, {}),
568
+ e === "sensors" && /* @__PURE__ */ I(X, {}),
569
+ e === "carbon" && /* @__PURE__ */ I(Q, {}),
570
+ e === "reports" && /* @__PURE__ */ I(ee, {})
556
571
  ]
557
572
  })]
558
573
  });
559
574
  }
560
- var $ = (t) => /* @__PURE__ */ N(T, {
561
- client: L,
562
- children: /* @__PURE__ */ N(E, {
575
+ var ne = (t) => /* @__PURE__ */ I(O, {
576
+ client: B,
577
+ children: /* @__PURE__ */ I(k, {
563
578
  workspaceId: t.workspaceId ?? null,
564
579
  gateway: "global",
565
580
  defaultEnabled: !0,
566
- children: /* @__PURE__ */ N(I, {
581
+ children: /* @__PURE__ */ I(z, {
567
582
  scopeId: t.workspaceId ?? null,
568
583
  gateway: "workspace",
569
- children: /* @__PURE__ */ N(e, {
584
+ children: /* @__PURE__ */ I(e, {
570
585
  ...t,
571
- children: /* @__PURE__ */ N(Q, {})
586
+ children: /* @__PURE__ */ I(te, {})
572
587
  })
573
588
  })
574
589
  })
575
590
  });
576
591
  //#endregion
577
- export { $ as EcoImpactHubAdminRoot };
592
+ export { ne as EcoImpactHubAdminRoot };
578
593
 
579
594
  //# sourceMappingURL=EcoImpactHubAdminRoot.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"EcoImpactHubAdminRoot.js","names":[],"sources":["../../src/ecoimpacthub/EcoImpactHubAdminRoot.tsx"],"sourcesContent":["/**\n * EcoImpactHub Admin Root\n * @module ecoimpacthub\n *\n * Product-specific admin surface mounted inside `admin-app` under\n * `/admin/ecoimpacthub` (BOFF-3118). Per fleet-wide policy the ONLY valid\n * admin surface is the shared `admin.burdenoff.com` app — this is a\n * microfrontend mounted there, not a new subdomain. It covers three\n * governance operations product owners need outside the day-to-day\n * monitoring UI:\n *\n * 1. Site / sensor governance — pause monitoring, retire hardware, archive\n * decommissioned sites.\n * 2. Carbon-ledger oversight — inspect recorded carbon entries across all\n * sites/scopes and verify DRAFT/RECORDED entries.\n * 3. Report sign-off — publish sustainability reports once their line items\n * are complete.\n *\n * Reuses the real `wspace-ecoimpacthub-svc` GraphQL operations already\n * consumed by the workspace-facing pages (`ecoListSites`, `ecoArchiveSite`,\n * `ecoListSensors`, `ecoSetSensorStatus`, `ecoListCarbonEntries`,\n * `ecoVerifyCarbonEntry`, `ecoListReports`, `ecoPublishReport`) — no new\n * backend surface. Every mutation still carries its own `@rbac` directive at\n * the gateway; this panel does not re-implement authorization, it is a\n * governance-focused view over the same RBAC-enforced API.\n *\n * Remaining gap (documented, not built here): report-approval workflow\n * routing through wspace-workflow-svc (depends on the C2 event/workflow\n * wiring landing first) — today \"publish\" is a direct status transition,\n * not a multi-step approval chain.\n */\n\nimport type { FC } from 'react';\nimport { useMemo, useState } from 'react';\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query';\nimport { FeatureFlagProvider } from '@burdenoff/fe-libs/shared/feature-flags';\nimport { PermissionProvider } from '@burdenoff/fe-libs/shared/providers/shell';\nimport { Button } from '@burdenoff/fe-libs/ui';\nimport { MapPin, Radio, Factory, FileText, ShieldCheck } from 'lucide-react';\nimport { EcoImpactHubProvider } from './context/EcoImpactHubContext';\nimport { PageLayout } from './components/PageLayout';\nimport { Tabs, type TabItem } from './components/Tabs';\nimport { DataTable, type Column } from './components/DataTable';\nimport { StatusBadge } from './components/StatusBadge';\nimport { LoadingView, ErrorView, Section } from './components/StateViews';\nimport { EmptyState } from './components/EmptyState';\nimport { Pagination } from './components/Pagination';\nimport { FilterTabs, type FilterOption } from './components/FilterTabs';\nimport {\n useEcoSites,\n useEcoArchiveSite,\n useEcoSensors,\n useEcoSetSensorStatus,\n useEcoCarbonEntries,\n useEcoVerifyCarbonEntry,\n useEcoReports,\n useEcoPublishReport,\n} from './hooks/useEcoImpactHubApi';\nimport { formatDate, formatCo2e, formatEnumLabel } from './utils';\nimport type {\n EcoImpactHubRootProps,\n EcoSite,\n EcoSiteStatus,\n EcoSensor,\n EcoSensorStatus,\n EcoCarbonEntry,\n EcoCarbonEntryStatus,\n EcoReport,\n EcoReportStatus,\n} from './types';\n\nexport interface EcoImpactHubAdminRootProps extends EcoImpactHubRootProps {\n /** Workspace token is supplied by admin-app for workspace-scoped MFEs. */\n workspaceToken?: string;\n}\n\ntype AdminTab = 'sites' | 'sensors' | 'carbon' | 'reports';\n\nconst queryClient = new QueryClient({\n defaultOptions: {\n queries: {\n staleTime: 30 * 1000,\n retry: 1,\n refetchOnWindowFocus: false,\n },\n },\n});\n\nconst PAGE_SIZE = 12;\n\nconst SITE_STATUS_OPTIONS: FilterOption<'ALL' | EcoSiteStatus>[] = [\n { value: 'ALL', label: 'All' },\n { value: 'ACTIVE', label: 'Active' },\n { value: 'MONITORING_PAUSED', label: 'Paused' },\n { value: 'ARCHIVED', label: 'Archived' },\n];\n\nconst SENSOR_STATUS_OPTIONS: FilterOption<'ALL' | EcoSensorStatus>[] = [\n { value: 'ALL', label: 'All' },\n { value: 'ONLINE', label: 'Online' },\n { value: 'OFFLINE', label: 'Offline' },\n { value: 'DEGRADED', label: 'Degraded' },\n { value: 'MAINTENANCE', label: 'Maintenance' },\n { value: 'RETIRED', label: 'Retired' },\n];\n\nconst CARBON_STATUS_OPTIONS: FilterOption<'ALL' | EcoCarbonEntryStatus>[] = [\n { value: 'ALL', label: 'All' },\n { value: 'DRAFT', label: 'Draft' },\n { value: 'RECORDED', label: 'Recorded' },\n { value: 'VERIFIED', label: 'Verified' },\n { value: 'ADJUSTED', label: 'Adjusted' },\n];\n\nconst REPORT_STATUS_OPTIONS: FilterOption<'ALL' | EcoReportStatus>[] = [\n { value: 'ALL', label: 'All' },\n { value: 'DRAFT', label: 'Draft' },\n { value: 'IN_REVIEW', label: 'In Review' },\n { value: 'PUBLISHED', label: 'Published' },\n { value: 'ARCHIVED', label: 'Archived' },\n];\n\n// ============================================================================\n// Sites governance\n// ============================================================================\n\nfunction SiteActions({ site }: { site: EcoSite }) {\n const archive = useEcoArchiveSite();\n if (site.status === 'ARCHIVED') {\n return <span className=\"text-xs text-text-secondary\">Archived</span>;\n }\n return (\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => archive.mutate(site.id)}\n disabled={archive.isPending}\n >\n Archive\n </Button>\n );\n}\n\nfunction SitesPanel() {\n const [status, setStatus] = useState<'ALL' | EcoSiteStatus>('ALL');\n const { data, isLoading, error, refetch } = useEcoSites({\n status: status === 'ALL' ? undefined : status,\n pagination: { limit: 100 },\n });\n\n const columns = useMemo<Column<EcoSite>[]>(\n () => [\n {\n key: 'name',\n header: 'Site',\n render: (s) => (\n <div className=\"min-w-0\">\n <p className=\"font-medium text-text-primary truncate\">{s.name}</p>\n {s.code && <p className=\"text-xs text-text-secondary\">{s.code}</p>}\n </div>\n ),\n sortValue: (s) => s.name.toLowerCase(),\n },\n {\n key: 'type',\n header: 'Type',\n render: (s) => formatEnumLabel(s.type),\n },\n {\n key: 'region',\n header: 'Region',\n render: (s) => s.region ?? '—',\n hideOnMobile: true,\n },\n {\n key: 'status',\n header: 'Status',\n render: (s) => <StatusBadge status={s.status} />,\n },\n {\n key: 'created',\n header: 'Created',\n render: (s) => formatDate(s.createdAt),\n sortValue: (s) => new Date(s.createdAt).getTime(),\n hideOnMobile: true,\n },\n {\n key: 'actions',\n header: 'Actions',\n align: 'right',\n render: (s) => <SiteActions site={s} />,\n },\n ],\n []\n );\n\n if (isLoading) return <LoadingView label=\"Loading sites…\" />;\n if (error)\n return <ErrorView title=\"Could not load sites\" message={error.message} onRetry={refetch} />;\n\n const rows = data?.items ?? [];\n\n return (\n <Section title=\"Site registry\" description=\"Pause monitoring or archive decommissioned sites.\">\n <div className=\"mb-4\">\n <FilterTabs options={SITE_STATUS_OPTIONS} value={status} onChange={setStatus} />\n </div>\n {rows.length === 0 ? (\n <EmptyState\n icon={<MapPin size={40} />}\n title=\"No sites found\"\n description={`There are no ${status === 'ALL' ? '' : status.toLowerCase()} sites in this workspace.`}\n />\n ) : (\n <DataTable\n columns={columns}\n rows={rows}\n rowKey={(s) => s.id}\n defaultSort={{ key: 'created', dir: 'desc' }}\n />\n )}\n </Section>\n );\n}\n\n// ============================================================================\n// Sensor governance\n// ============================================================================\n\nconst SENSOR_STATUS_TRANSITIONS: Record<EcoSensorStatus, EcoSensorStatus | null> = {\n ONLINE: 'MAINTENANCE',\n OFFLINE: 'MAINTENANCE',\n DEGRADED: 'MAINTENANCE',\n MAINTENANCE: 'ONLINE',\n RETIRED: null,\n};\n\nfunction SensorActions({ sensor }: { sensor: EcoSensor }) {\n const setStatus = useEcoSetSensorStatus();\n const nextStatus = SENSOR_STATUS_TRANSITIONS[sensor.status];\n\n return (\n <div className=\"flex flex-wrap items-center justify-end gap-2\">\n {nextStatus && (\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setStatus.mutate({ id: sensor.id, status: nextStatus })}\n disabled={setStatus.isPending}\n >\n {nextStatus === 'MAINTENANCE' ? 'Send to maintenance' : 'Bring online'}\n </Button>\n )}\n {sensor.status !== 'RETIRED' && (\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setStatus.mutate({ id: sensor.id, status: 'RETIRED' })}\n disabled={setStatus.isPending}\n >\n Retire\n </Button>\n )}\n </div>\n );\n}\n\nfunction SensorsPanel() {\n const [status, setStatus] = useState<'ALL' | EcoSensorStatus>('ALL');\n const { data, isLoading, error, refetch } = useEcoSensors({\n status: status === 'ALL' ? undefined : status,\n });\n\n const columns = useMemo<Column<EcoSensor>[]>(\n () => [\n {\n key: 'name',\n header: 'Sensor',\n render: (s) => (\n <div className=\"min-w-0\">\n <p className=\"font-medium text-text-primary truncate\">{s.name}</p>\n {s.hardwareId && (\n <p className=\"font-mono text-xs text-text-secondary\">{s.hardwareId}</p>\n )}\n </div>\n ),\n sortValue: (s) => s.name.toLowerCase(),\n },\n {\n key: 'kind',\n header: 'Kind',\n render: (s) => formatEnumLabel(s.kind),\n },\n {\n key: 'site',\n header: 'Site ID',\n render: (s) => <span className=\"font-mono text-xs text-text-secondary\">{s.siteId}</span>,\n hideOnMobile: true,\n },\n {\n key: 'status',\n header: 'Status',\n render: (s) => <StatusBadge status={s.status} />,\n },\n {\n key: 'lastReading',\n header: 'Last Reading',\n render: (s) => (s.lastReadingAt ? formatDate(s.lastReadingAt) : '—'),\n sortValue: (s) => (s.lastReadingAt ? new Date(s.lastReadingAt).getTime() : 0),\n hideOnMobile: true,\n },\n {\n key: 'actions',\n header: 'Actions',\n align: 'right',\n render: (s) => <SensorActions sensor={s} />,\n },\n ],\n []\n );\n\n if (isLoading) return <LoadingView label=\"Loading sensors…\" />;\n if (error)\n return <ErrorView title=\"Could not load sensors\" message={error.message} onRetry={refetch} />;\n\n const rows = data?.items ?? [];\n\n return (\n <Section title=\"Sensor fleet\" description=\"Retire hardware or move sensors into maintenance.\">\n <div className=\"mb-4\">\n <FilterTabs options={SENSOR_STATUS_OPTIONS} value={status} onChange={setStatus} />\n </div>\n {rows.length === 0 ? (\n <EmptyState\n icon={<Radio size={40} />}\n title=\"No sensors found\"\n description={`There are no ${status === 'ALL' ? '' : status.toLowerCase()} sensors in this workspace.`}\n />\n ) : (\n <DataTable\n columns={columns}\n rows={rows}\n rowKey={(s) => s.id}\n defaultSort={{ key: 'lastReading', dir: 'desc' }}\n />\n )}\n </Section>\n );\n}\n\n// ============================================================================\n// Carbon-ledger oversight\n// ============================================================================\n\nfunction CarbonEntryActions({ entry }: { entry: EcoCarbonEntry }) {\n const verify = useEcoVerifyCarbonEntry();\n if (entry.status === 'VERIFIED') {\n return <span className=\"text-xs text-text-secondary\">Verified</span>;\n }\n return (\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => verify.mutate(entry.id)}\n disabled={verify.isPending}\n >\n Verify\n </Button>\n );\n}\n\nfunction CarbonLedgerPanel() {\n const [status, setStatus] = useState<'ALL' | EcoCarbonEntryStatus>('ALL');\n const [page, setPage] = useState(0);\n const [cursors, setCursors] = useState<string[]>([]);\n\n const cursor = page > 0 ? cursors[page - 1] : undefined;\n const { data, isLoading, error, refetch } = useEcoCarbonEntries({\n status: status === 'ALL' ? undefined : status,\n pagination: { limit: PAGE_SIZE, cursor },\n });\n\n const columns = useMemo<Column<EcoCarbonEntry>[]>(\n () => [\n {\n key: 'category',\n header: 'Category',\n render: (c) => (\n <div className=\"min-w-0\">\n <p className=\"font-medium text-text-primary truncate\">{c.category}</p>\n {c.factor && <p className=\"text-xs text-text-secondary\">{c.factor.name}</p>}\n </div>\n ),\n },\n {\n key: 'scope',\n header: 'Scope',\n render: (c) => formatEnumLabel(c.scope),\n },\n {\n key: 'co2e',\n header: 'CO₂e',\n align: 'right',\n render: (c) => formatCo2e(c.co2eKg),\n sortValue: (c) => c.co2eKg,\n },\n {\n key: 'period',\n header: 'Period',\n render: (c) => formatDate(c.periodStart),\n sortValue: (c) => new Date(c.periodStart).getTime(),\n hideOnMobile: true,\n },\n {\n key: 'status',\n header: 'Status',\n render: (c) => <StatusBadge status={c.status} />,\n },\n {\n key: 'actions',\n header: 'Actions',\n align: 'right',\n render: (c) => <CarbonEntryActions entry={c} />,\n },\n ],\n []\n );\n\n const handlePageChange = (nextPage: number) => {\n if (nextPage > page && data?.pageInfo.cursor) {\n setCursors((prev) => [...prev, data.pageInfo.cursor as string]);\n } else if (nextPage < page) {\n setCursors((prev) => prev.slice(0, -1));\n }\n setPage(nextPage);\n };\n\n if (isLoading) return <LoadingView label=\"Loading carbon entries…\" />;\n if (error)\n return (\n <ErrorView title=\"Could not load carbon entries\" message={error.message} onRetry={refetch} />\n );\n\n const rows = data?.items ?? [];\n\n return (\n <Section\n title=\"Carbon ledger\"\n description=\"Verify DRAFT/RECORDED entries across all sites and scopes.\"\n >\n <div className=\"mb-4\">\n <FilterTabs\n options={CARBON_STATUS_OPTIONS}\n value={status}\n onChange={(v) => {\n setStatus(v);\n setPage(0);\n setCursors([]);\n }}\n />\n </div>\n {rows.length === 0 ? (\n <EmptyState\n icon={<Factory size={40} />}\n title=\"No carbon entries found\"\n description={`There are no ${status === 'ALL' ? '' : status.toLowerCase()} entries in this workspace.`}\n />\n ) : (\n <>\n <DataTable\n columns={columns}\n rows={rows}\n rowKey={(c) => c.id}\n defaultSort={{ key: 'period', dir: 'desc' }}\n />\n <Pagination\n page={page}\n pageSize={PAGE_SIZE}\n itemCount={rows.length}\n hasMore={data?.pageInfo.hasMore ?? false}\n onPageChange={handlePageChange}\n />\n </>\n )}\n </Section>\n );\n}\n\n// ============================================================================\n// Report sign-off\n// ============================================================================\n\nfunction ReportActions({ report }: { report: EcoReport }) {\n const publish = useEcoPublishReport();\n if (report.status === 'PUBLISHED' || report.status === 'ARCHIVED') {\n return <span className=\"text-xs text-text-secondary\">{formatEnumLabel(report.status)}</span>;\n }\n return (\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => publish.mutate({ id: report.id, fileId: report.file?.id ?? null })}\n disabled={publish.isPending}\n >\n Publish\n </Button>\n );\n}\n\nfunction ReportsPanel() {\n const [status, setStatus] = useState<'ALL' | EcoReportStatus>('ALL');\n const { data, isLoading, error, refetch } = useEcoReports(status === 'ALL' ? undefined : status, {\n limit: 100,\n });\n\n const columns = useMemo<Column<EcoReport>[]>(\n () => [\n {\n key: 'title',\n header: 'Report',\n render: (r) => <p className=\"font-medium text-text-primary truncate\">{r.title}</p>,\n sortValue: (r) => r.title.toLowerCase(),\n },\n {\n key: 'framework',\n header: 'Framework',\n render: (r) => formatEnumLabel(r.framework),\n },\n {\n key: 'period',\n header: 'Period',\n render: (r) => `${formatDate(r.periodStart)} – ${formatDate(r.periodEnd)}`,\n hideOnMobile: true,\n },\n {\n key: 'status',\n header: 'Status',\n render: (r) => <StatusBadge status={r.status} />,\n },\n {\n key: 'published',\n header: 'Published',\n render: (r) => (r.publishedAt ? formatDate(r.publishedAt) : '—'),\n sortValue: (r) => (r.publishedAt ? new Date(r.publishedAt).getTime() : 0),\n hideOnMobile: true,\n },\n {\n key: 'actions',\n header: 'Actions',\n align: 'right',\n render: (r) => <ReportActions report={r} />,\n },\n ],\n []\n );\n\n if (isLoading) return <LoadingView label=\"Loading reports…\" />;\n if (error)\n return <ErrorView title=\"Could not load reports\" message={error.message} onRetry={refetch} />;\n\n const rows = data?.items ?? [];\n\n return (\n <Section\n title=\"Sustainability reports\"\n description=\"Publish reports once their line items are complete.\"\n >\n <div className=\"mb-4\">\n <FilterTabs options={REPORT_STATUS_OPTIONS} value={status} onChange={setStatus} />\n </div>\n {rows.length === 0 ? (\n <EmptyState\n icon={<FileText size={40} />}\n title=\"No reports found\"\n description={`There are no ${status === 'ALL' ? '' : status.toLowerCase()} reports in this workspace.`}\n />\n ) : (\n <DataTable\n columns={columns}\n rows={rows}\n rowKey={(r) => r.id}\n defaultSort={{ key: 'period', dir: 'desc' }}\n />\n )}\n </Section>\n );\n}\n\n// ============================================================================\n// Root\n// ============================================================================\n\nfunction EcoImpactHubAdminDashboard() {\n const [activeTab, setActiveTab] = useState<AdminTab>('sites');\n\n const tabs = useMemo<TabItem<AdminTab>[]>(\n () => [\n { value: 'sites', label: 'Sites', icon: <MapPin size={18} /> },\n { value: 'sensors', label: 'Sensors', icon: <Radio size={18} /> },\n { value: 'carbon', label: 'Carbon Ledger', icon: <Factory size={18} /> },\n { value: 'reports', label: 'Reports', icon: <FileText size={18} /> },\n ],\n []\n );\n\n return (\n <PageLayout\n title=\"EcoImpactHub Admin\"\n description=\"Site, sensor, carbon-ledger and report governance.\"\n actions={\n <span className=\"inline-flex items-center gap-2 text-sm text-text-secondary\">\n <ShieldCheck size={18} />\n Workspace-scoped\n </span>\n }\n >\n <Tabs items={tabs} value={activeTab} onChange={setActiveTab} />\n <div className=\"mt-6\">\n {activeTab === 'sites' && <SitesPanel />}\n {activeTab === 'sensors' && <SensorsPanel />}\n {activeTab === 'carbon' && <CarbonLedgerPanel />}\n {activeTab === 'reports' && <ReportsPanel />}\n </div>\n </PageLayout>\n );\n}\n\nexport const EcoImpactHubAdminRoot: FC<EcoImpactHubAdminRootProps> = (props) => {\n return (\n <QueryClientProvider client={queryClient}>\n <FeatureFlagProvider\n workspaceId={props.workspaceId ?? null}\n gateway=\"global\"\n defaultEnabled={true}\n >\n {/* Workspace-scoped RBAC so the admin panel's archive/verify/publish\n controls are gated client-side too. Gateway @rbac remains\n authoritative — this is a UX nicety, not a security control. */}\n <PermissionProvider scopeId={props.workspaceId ?? null} gateway=\"workspace\">\n <EcoImpactHubProvider {...props}>\n <EcoImpactHubAdminDashboard />\n </EcoImpactHubProvider>\n </PermissionProvider>\n </FeatureFlagProvider>\n </QueryClientProvider>\n );\n};\n\nexport { EcoImpactHubAdminRoot as AdminRoot };\n"],"mappings":"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"}
1
+ {"version":3,"file":"EcoImpactHubAdminRoot.js","names":[],"sources":["../../src/ecoimpacthub/EcoImpactHubAdminRoot.tsx"],"sourcesContent":["/**\n * EcoImpactHub Admin Root\n * @module ecoimpacthub\n *\n * Product-specific admin surface mounted inside `admin-app` under\n * `/admin/ecoimpacthub` (BOFF-3118). Per fleet-wide policy the ONLY valid\n * admin surface is the shared `admin.burdenoff.com` app — this is a\n * microfrontend mounted there, not a new subdomain. It covers three\n * governance operations product owners need outside the day-to-day\n * monitoring UI:\n *\n * 1. Site / sensor governance — pause monitoring, retire hardware, archive\n * decommissioned sites.\n * 2. Carbon-ledger oversight — inspect recorded carbon entries across all\n * sites/scopes and verify DRAFT/RECORDED entries.\n * 3. Report sign-off — submit draft reports for approval, approve or reject\n * reports in review, and publish approved reports. The approval lifecycle\n * is gated by a wspace-workflow-svc sign-off workflow (BOFF-3118).\n *\n * Reuses the real `wspace-ecoimpacthub-svc` GraphQL operations already\n * consumed by the workspace-facing pages (`ecoListSites`, `ecoArchiveSite`,\n * `ecoListSensors`, `ecoSetSensorStatus`, `ecoListCarbonEntries`,\n * `ecoVerifyCarbonEntry`, `ecoListReports`, `ecoPublishReport`,\n * `ecoSubmitReportForApproval`, `ecoApproveReport`, `ecoRejectReport`) —\n * the new sign-off mutations are a backend addition consumed here. Every\n * mutation still carries its own `@rbac` directive at the gateway; this panel\n * does not re-implement authorization, it is a governance-focused view over\n * the same RBAC-enforced API.\n */\n\nimport type { FC } from 'react';\nimport { useMemo, useState } from 'react';\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query';\nimport { FeatureFlagProvider } from '@burdenoff/fe-libs/shared/feature-flags';\nimport { PermissionProvider } from '@burdenoff/fe-libs/shared/providers/shell';\nimport { Button } from '@burdenoff/fe-libs/ui';\nimport { MapPin, Radio, Factory, FileText, ShieldCheck } from 'lucide-react';\nimport { EcoImpactHubProvider } from './context/EcoImpactHubContext';\nimport { PageLayout } from './components/PageLayout';\nimport { Tabs, type TabItem } from './components/Tabs';\nimport { DataTable, type Column } from './components/DataTable';\nimport { StatusBadge } from './components/StatusBadge';\nimport { LoadingView, ErrorView, Section } from './components/StateViews';\nimport { EmptyState } from './components/EmptyState';\nimport { Pagination } from './components/Pagination';\nimport { FilterTabs, type FilterOption } from './components/FilterTabs';\nimport {\n useEcoSites,\n useEcoArchiveSite,\n useEcoSensors,\n useEcoSetSensorStatus,\n useEcoCarbonEntries,\n useEcoVerifyCarbonEntry,\n useEcoReports,\n useEcoPublishReport,\n useEcoSubmitReportForApproval,\n useEcoApproveReport,\n useEcoRejectReport,\n} from './hooks/useEcoImpactHubApi';\nimport { formatDate, formatCo2e, formatEnumLabel } from './utils';\nimport type {\n EcoImpactHubRootProps,\n EcoSite,\n EcoSiteStatus,\n EcoSensor,\n EcoSensorStatus,\n EcoCarbonEntry,\n EcoCarbonEntryStatus,\n EcoReport,\n EcoReportStatus,\n} from './types';\n\nexport interface EcoImpactHubAdminRootProps extends EcoImpactHubRootProps {\n /** Workspace token is supplied by admin-app for workspace-scoped MFEs. */\n workspaceToken?: string;\n}\n\ntype AdminTab = 'sites' | 'sensors' | 'carbon' | 'reports';\n\nconst queryClient = new QueryClient({\n defaultOptions: {\n queries: {\n staleTime: 30 * 1000,\n retry: 1,\n refetchOnWindowFocus: false,\n },\n },\n});\n\nconst PAGE_SIZE = 12;\n\nconst SITE_STATUS_OPTIONS: FilterOption<'ALL' | EcoSiteStatus>[] = [\n { value: 'ALL', label: 'All' },\n { value: 'ACTIVE', label: 'Active' },\n { value: 'MONITORING_PAUSED', label: 'Paused' },\n { value: 'ARCHIVED', label: 'Archived' },\n];\n\nconst SENSOR_STATUS_OPTIONS: FilterOption<'ALL' | EcoSensorStatus>[] = [\n { value: 'ALL', label: 'All' },\n { value: 'ONLINE', label: 'Online' },\n { value: 'OFFLINE', label: 'Offline' },\n { value: 'DEGRADED', label: 'Degraded' },\n { value: 'MAINTENANCE', label: 'Maintenance' },\n { value: 'RETIRED', label: 'Retired' },\n];\n\nconst CARBON_STATUS_OPTIONS: FilterOption<'ALL' | EcoCarbonEntryStatus>[] = [\n { value: 'ALL', label: 'All' },\n { value: 'DRAFT', label: 'Draft' },\n { value: 'RECORDED', label: 'Recorded' },\n { value: 'VERIFIED', label: 'Verified' },\n { value: 'ADJUSTED', label: 'Adjusted' },\n];\n\nconst REPORT_STATUS_OPTIONS: FilterOption<'ALL' | EcoReportStatus>[] = [\n { value: 'ALL', label: 'All' },\n { value: 'DRAFT', label: 'Draft' },\n { value: 'IN_REVIEW', label: 'In Review' },\n { value: 'PUBLISHED', label: 'Published' },\n { value: 'ARCHIVED', label: 'Archived' },\n];\n\n// ============================================================================\n// Sites governance\n// ============================================================================\n\nfunction SiteActions({ site }: { site: EcoSite }) {\n const archive = useEcoArchiveSite();\n if (site.status === 'ARCHIVED') {\n return <span className=\"text-xs text-text-secondary\">Archived</span>;\n }\n return (\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => archive.mutate(site.id)}\n disabled={archive.isPending}\n >\n Archive\n </Button>\n );\n}\n\nfunction SitesPanel() {\n const [status, setStatus] = useState<'ALL' | EcoSiteStatus>('ALL');\n const { data, isLoading, error, refetch } = useEcoSites({\n status: status === 'ALL' ? undefined : status,\n pagination: { limit: 100 },\n });\n\n const columns = useMemo<Column<EcoSite>[]>(\n () => [\n {\n key: 'name',\n header: 'Site',\n render: (s) => (\n <div className=\"min-w-0\">\n <p className=\"font-medium text-text-primary truncate\">{s.name}</p>\n {s.code && <p className=\"text-xs text-text-secondary\">{s.code}</p>}\n </div>\n ),\n sortValue: (s) => s.name.toLowerCase(),\n },\n {\n key: 'type',\n header: 'Type',\n render: (s) => formatEnumLabel(s.type),\n },\n {\n key: 'region',\n header: 'Region',\n render: (s) => s.region ?? '—',\n hideOnMobile: true,\n },\n {\n key: 'status',\n header: 'Status',\n render: (s) => <StatusBadge status={s.status} />,\n },\n {\n key: 'created',\n header: 'Created',\n render: (s) => formatDate(s.createdAt),\n sortValue: (s) => new Date(s.createdAt).getTime(),\n hideOnMobile: true,\n },\n {\n key: 'actions',\n header: 'Actions',\n align: 'right',\n render: (s) => <SiteActions site={s} />,\n },\n ],\n []\n );\n\n if (isLoading) return <LoadingView label=\"Loading sites…\" />;\n if (error)\n return <ErrorView title=\"Could not load sites\" message={error.message} onRetry={refetch} />;\n\n const rows = data?.items ?? [];\n\n return (\n <Section title=\"Site registry\" description=\"Pause monitoring or archive decommissioned sites.\">\n <div className=\"mb-4\">\n <FilterTabs options={SITE_STATUS_OPTIONS} value={status} onChange={setStatus} />\n </div>\n {rows.length === 0 ? (\n <EmptyState\n icon={<MapPin size={40} />}\n title=\"No sites found\"\n description={`There are no ${status === 'ALL' ? '' : status.toLowerCase()} sites in this workspace.`}\n />\n ) : (\n <DataTable\n columns={columns}\n rows={rows}\n rowKey={(s) => s.id}\n defaultSort={{ key: 'created', dir: 'desc' }}\n />\n )}\n </Section>\n );\n}\n\n// ============================================================================\n// Sensor governance\n// ============================================================================\n\nconst SENSOR_STATUS_TRANSITIONS: Record<EcoSensorStatus, EcoSensorStatus | null> = {\n ONLINE: 'MAINTENANCE',\n OFFLINE: 'MAINTENANCE',\n DEGRADED: 'MAINTENANCE',\n MAINTENANCE: 'ONLINE',\n RETIRED: null,\n};\n\nfunction SensorActions({ sensor }: { sensor: EcoSensor }) {\n const setStatus = useEcoSetSensorStatus();\n const nextStatus = SENSOR_STATUS_TRANSITIONS[sensor.status];\n\n return (\n <div className=\"flex flex-wrap items-center justify-end gap-2\">\n {nextStatus && (\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setStatus.mutate({ id: sensor.id, status: nextStatus })}\n disabled={setStatus.isPending}\n >\n {nextStatus === 'MAINTENANCE' ? 'Send to maintenance' : 'Bring online'}\n </Button>\n )}\n {sensor.status !== 'RETIRED' && (\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setStatus.mutate({ id: sensor.id, status: 'RETIRED' })}\n disabled={setStatus.isPending}\n >\n Retire\n </Button>\n )}\n </div>\n );\n}\n\nfunction SensorsPanel() {\n const [status, setStatus] = useState<'ALL' | EcoSensorStatus>('ALL');\n const { data, isLoading, error, refetch } = useEcoSensors({\n status: status === 'ALL' ? undefined : status,\n });\n\n const columns = useMemo<Column<EcoSensor>[]>(\n () => [\n {\n key: 'name',\n header: 'Sensor',\n render: (s) => (\n <div className=\"min-w-0\">\n <p className=\"font-medium text-text-primary truncate\">{s.name}</p>\n {s.hardwareId && (\n <p className=\"font-mono text-xs text-text-secondary\">{s.hardwareId}</p>\n )}\n </div>\n ),\n sortValue: (s) => s.name.toLowerCase(),\n },\n {\n key: 'kind',\n header: 'Kind',\n render: (s) => formatEnumLabel(s.kind),\n },\n {\n key: 'site',\n header: 'Site ID',\n render: (s) => <span className=\"font-mono text-xs text-text-secondary\">{s.siteId}</span>,\n hideOnMobile: true,\n },\n {\n key: 'status',\n header: 'Status',\n render: (s) => <StatusBadge status={s.status} />,\n },\n {\n key: 'lastReading',\n header: 'Last Reading',\n render: (s) => (s.lastReadingAt ? formatDate(s.lastReadingAt) : '—'),\n sortValue: (s) => (s.lastReadingAt ? new Date(s.lastReadingAt).getTime() : 0),\n hideOnMobile: true,\n },\n {\n key: 'actions',\n header: 'Actions',\n align: 'right',\n render: (s) => <SensorActions sensor={s} />,\n },\n ],\n []\n );\n\n if (isLoading) return <LoadingView label=\"Loading sensors…\" />;\n if (error)\n return <ErrorView title=\"Could not load sensors\" message={error.message} onRetry={refetch} />;\n\n const rows = data?.items ?? [];\n\n return (\n <Section title=\"Sensor fleet\" description=\"Retire hardware or move sensors into maintenance.\">\n <div className=\"mb-4\">\n <FilterTabs options={SENSOR_STATUS_OPTIONS} value={status} onChange={setStatus} />\n </div>\n {rows.length === 0 ? (\n <EmptyState\n icon={<Radio size={40} />}\n title=\"No sensors found\"\n description={`There are no ${status === 'ALL' ? '' : status.toLowerCase()} sensors in this workspace.`}\n />\n ) : (\n <DataTable\n columns={columns}\n rows={rows}\n rowKey={(s) => s.id}\n defaultSort={{ key: 'lastReading', dir: 'desc' }}\n />\n )}\n </Section>\n );\n}\n\n// ============================================================================\n// Carbon-ledger oversight\n// ============================================================================\n\nfunction CarbonEntryActions({ entry }: { entry: EcoCarbonEntry }) {\n const verify = useEcoVerifyCarbonEntry();\n if (entry.status === 'VERIFIED') {\n return <span className=\"text-xs text-text-secondary\">Verified</span>;\n }\n return (\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => verify.mutate(entry.id)}\n disabled={verify.isPending}\n >\n Verify\n </Button>\n );\n}\n\nfunction CarbonLedgerPanel() {\n const [status, setStatus] = useState<'ALL' | EcoCarbonEntryStatus>('ALL');\n const [page, setPage] = useState(0);\n const [cursors, setCursors] = useState<string[]>([]);\n\n const cursor = page > 0 ? cursors[page - 1] : undefined;\n const { data, isLoading, error, refetch } = useEcoCarbonEntries({\n status: status === 'ALL' ? undefined : status,\n pagination: { limit: PAGE_SIZE, cursor },\n });\n\n const columns = useMemo<Column<EcoCarbonEntry>[]>(\n () => [\n {\n key: 'category',\n header: 'Category',\n render: (c) => (\n <div className=\"min-w-0\">\n <p className=\"font-medium text-text-primary truncate\">{c.category}</p>\n {c.factor && <p className=\"text-xs text-text-secondary\">{c.factor.name}</p>}\n </div>\n ),\n },\n {\n key: 'scope',\n header: 'Scope',\n render: (c) => formatEnumLabel(c.scope),\n },\n {\n key: 'co2e',\n header: 'CO₂e',\n align: 'right',\n render: (c) => formatCo2e(c.co2eKg),\n sortValue: (c) => c.co2eKg,\n },\n {\n key: 'period',\n header: 'Period',\n render: (c) => formatDate(c.periodStart),\n sortValue: (c) => new Date(c.periodStart).getTime(),\n hideOnMobile: true,\n },\n {\n key: 'status',\n header: 'Status',\n render: (c) => <StatusBadge status={c.status} />,\n },\n {\n key: 'actions',\n header: 'Actions',\n align: 'right',\n render: (c) => <CarbonEntryActions entry={c} />,\n },\n ],\n []\n );\n\n const handlePageChange = (nextPage: number) => {\n if (nextPage > page && data?.pageInfo.cursor) {\n setCursors((prev) => [...prev, data.pageInfo.cursor as string]);\n } else if (nextPage < page) {\n setCursors((prev) => prev.slice(0, -1));\n }\n setPage(nextPage);\n };\n\n if (isLoading) return <LoadingView label=\"Loading carbon entries…\" />;\n if (error)\n return (\n <ErrorView title=\"Could not load carbon entries\" message={error.message} onRetry={refetch} />\n );\n\n const rows = data?.items ?? [];\n\n return (\n <Section\n title=\"Carbon ledger\"\n description=\"Verify DRAFT/RECORDED entries across all sites and scopes.\"\n >\n <div className=\"mb-4\">\n <FilterTabs\n options={CARBON_STATUS_OPTIONS}\n value={status}\n onChange={(v) => {\n setStatus(v);\n setPage(0);\n setCursors([]);\n }}\n />\n </div>\n {rows.length === 0 ? (\n <EmptyState\n icon={<Factory size={40} />}\n title=\"No carbon entries found\"\n description={`There are no ${status === 'ALL' ? '' : status.toLowerCase()} entries in this workspace.`}\n />\n ) : (\n <>\n <DataTable\n columns={columns}\n rows={rows}\n rowKey={(c) => c.id}\n defaultSort={{ key: 'period', dir: 'desc' }}\n />\n <Pagination\n page={page}\n pageSize={PAGE_SIZE}\n itemCount={rows.length}\n hasMore={data?.pageInfo.hasMore ?? false}\n onPageChange={handlePageChange}\n />\n </>\n )}\n </Section>\n );\n}\n\n// ============================================================================\n// Report sign-off\n// ============================================================================\n\nfunction ReportActions({ report }: { report: EcoReport }) {\n const submit = useEcoSubmitReportForApproval();\n const approve = useEcoApproveReport();\n const reject = useEcoRejectReport();\n const publish = useEcoPublishReport();\n\n const anyPending = submit.isPending || approve.isPending || reject.isPending || publish.isPending;\n\n if (report.status === 'PUBLISHED' || report.status === 'ARCHIVED') {\n return <span className=\"text-xs text-text-secondary\">{formatEnumLabel(report.status)}</span>;\n }\n\n if (report.status === 'DRAFT') {\n return (\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => submit.mutate(report.id)}\n disabled={anyPending}\n >\n Submit for approval\n </Button>\n );\n }\n\n // IN_REVIEW\n return (\n <div className=\"flex flex-wrap items-center justify-end gap-2\">\n <Button\n variant=\"default\"\n size=\"sm\"\n onClick={() => approve.mutate(report.id)}\n disabled={anyPending}\n >\n Approve\n </Button>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => reject.mutate({ reportId: report.id, reason: 'Rejected from admin panel' })}\n disabled={anyPending}\n >\n Reject\n </Button>\n </div>\n );\n}\n\nfunction ReportsPanel() {\n const [status, setStatus] = useState<'ALL' | EcoReportStatus>('ALL');\n const { data, isLoading, error, refetch } = useEcoReports(status === 'ALL' ? undefined : status, {\n limit: 100,\n });\n\n const columns = useMemo<Column<EcoReport>[]>(\n () => [\n {\n key: 'title',\n header: 'Report',\n render: (r) => <p className=\"font-medium text-text-primary truncate\">{r.title}</p>,\n sortValue: (r) => r.title.toLowerCase(),\n },\n {\n key: 'framework',\n header: 'Framework',\n render: (r) => formatEnumLabel(r.framework),\n },\n {\n key: 'period',\n header: 'Period',\n render: (r) => `${formatDate(r.periodStart)} – ${formatDate(r.periodEnd)}`,\n hideOnMobile: true,\n },\n {\n key: 'status',\n header: 'Status',\n render: (r) => <StatusBadge status={r.status} />,\n },\n {\n key: 'published',\n header: 'Published',\n render: (r) => (r.publishedAt ? formatDate(r.publishedAt) : '—'),\n sortValue: (r) => (r.publishedAt ? new Date(r.publishedAt).getTime() : 0),\n hideOnMobile: true,\n },\n {\n key: 'actions',\n header: 'Actions',\n align: 'right',\n render: (r) => <ReportActions report={r} />,\n },\n ],\n []\n );\n\n if (isLoading) return <LoadingView label=\"Loading reports…\" />;\n if (error)\n return <ErrorView title=\"Could not load reports\" message={error.message} onRetry={refetch} />;\n\n const rows = data?.items ?? [];\n\n return (\n <Section\n title=\"Sustainability reports\"\n description=\"Submit draft reports for approval, then approve, reject, or publish them.\"\n >\n <div className=\"mb-4\">\n <FilterTabs options={REPORT_STATUS_OPTIONS} value={status} onChange={setStatus} />\n </div>\n {rows.length === 0 ? (\n <EmptyState\n icon={<FileText size={40} />}\n title=\"No reports found\"\n description={`There are no ${status === 'ALL' ? '' : status.toLowerCase()} reports in this workspace.`}\n />\n ) : (\n <DataTable\n columns={columns}\n rows={rows}\n rowKey={(r) => r.id}\n defaultSort={{ key: 'period', dir: 'desc' }}\n />\n )}\n </Section>\n );\n}\n\n// ============================================================================\n// Root\n// ============================================================================\n\nfunction EcoImpactHubAdminDashboard() {\n const [activeTab, setActiveTab] = useState<AdminTab>('sites');\n\n const tabs = useMemo<TabItem<AdminTab>[]>(\n () => [\n { value: 'sites', label: 'Sites', icon: <MapPin size={18} /> },\n { value: 'sensors', label: 'Sensors', icon: <Radio size={18} /> },\n { value: 'carbon', label: 'Carbon Ledger', icon: <Factory size={18} /> },\n { value: 'reports', label: 'Reports', icon: <FileText size={18} /> },\n ],\n []\n );\n\n return (\n <PageLayout\n title=\"EcoImpactHub Admin\"\n description=\"Site, sensor, carbon-ledger and report governance.\"\n actions={\n <span className=\"inline-flex items-center gap-2 text-sm text-text-secondary\">\n <ShieldCheck size={18} />\n Workspace-scoped\n </span>\n }\n >\n <Tabs items={tabs} value={activeTab} onChange={setActiveTab} />\n <div className=\"mt-6\">\n {activeTab === 'sites' && <SitesPanel />}\n {activeTab === 'sensors' && <SensorsPanel />}\n {activeTab === 'carbon' && <CarbonLedgerPanel />}\n {activeTab === 'reports' && <ReportsPanel />}\n </div>\n </PageLayout>\n );\n}\n\nexport const EcoImpactHubAdminRoot: FC<EcoImpactHubAdminRootProps> = (props) => {\n return (\n <QueryClientProvider client={queryClient}>\n <FeatureFlagProvider\n workspaceId={props.workspaceId ?? null}\n gateway=\"global\"\n defaultEnabled={true}\n >\n {/* Workspace-scoped RBAC so the admin panel's archive/verify/publish\n controls are gated client-side too. Gateway @rbac remains\n authoritative — this is a UX nicety, not a security control. */}\n <PermissionProvider scopeId={props.workspaceId ?? null} gateway=\"workspace\">\n <EcoImpactHubProvider {...props}>\n <EcoImpactHubAdminDashboard />\n </EcoImpactHubProvider>\n </PermissionProvider>\n </FeatureFlagProvider>\n </QueryClientProvider>\n );\n};\n\nexport { EcoImpactHubAdminRoot as AdminRoot };\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { EcoConnection, EcoSite, EcoSiteStatus, EcoSiteType, EcoSensor, EcoSensorKind, EcoSensorStatus, EcoMeasurement, EcoAlertThreshold, EcoSpecies, EcoTaxonGroup, EcoConservationStatus, EcoObservation, EcoHabitatProject, EcoHabitatProjectStatus, EcoRestorationActivity, EcoEmissionFactor, EcoEmissionScope, EcoCarbonEntry, EcoCarbonEntryStatus, EcoReductionTarget, EcoReductionTargetStatus, EcoReport, EcoReportStatus, EcoReportLineItem, EcoCreateSiteInput, EcoUpdateSiteInput, EcoCreateSensorInput, EcoRecordMeasurementInput, EcoCreateThresholdInput, EcoCreateSpeciesInput, EcoUpdateSpeciesInput, EcoRecordObservationInput, EcoCreateHabitatProjectInput, EcoLogRestorationActivityInput, EcoCreateEmissionFactorInput, EcoRecordCarbonEntryInput, EcoCreateReductionTargetInput, EcoCreateReportInput, EcoAddReportLineItemInput, PaginationInput } from '../types';
1
+ import { EcoConnection, EcoSite, EcoSiteStatus, EcoSiteType, EcoSensor, EcoSensorKind, EcoSensorStatus, EcoMeasurement, EcoAlertThreshold, EcoSpecies, EcoTaxonGroup, EcoConservationStatus, EcoObservation, EcoHabitatProject, EcoHabitatProjectStatus, EcoRestorationActivity, EcoEmissionFactor, EcoEmissionScope, EcoCarbonEntry, EcoCarbonEntryStatus, EcoReductionTarget, EcoReductionTargetStatus, EcoReport, EcoReportStatus, EcoReportLineItem, EcoCreateSiteInput, EcoUpdateSiteInput, EcoCreateSensorInput, EcoRecordMeasurementInput, EcoCreateThresholdInput, EcoCreateSpeciesInput, EcoUpdateSpeciesInput, EcoRecordObservationInput, EcoCreateHabitatProjectInput, EcoLogRestorationActivityInput, EcoCreateEmissionFactorInput, EcoRecordCarbonEntryInput, EcoCreateReductionTargetInput, EcoCreateReportInput, EcoAddReportLineItemInput, EcoRejectReportInput, PaginationInput } from '../types';
2
2
 
3
3
  export interface SiteFilters {
4
4
  status?: EcoSiteStatus;
@@ -101,4 +101,7 @@ export declare const useEcoPublishReport: () => import('@tanstack/react-query').
101
101
  id: string;
102
102
  fileId?: string | null;
103
103
  }, unknown>;
104
+ export declare const useEcoSubmitReportForApproval: () => import('@tanstack/react-query').UseMutationResult<EcoReport, Error, string, unknown>;
105
+ export declare const useEcoApproveReport: () => import('@tanstack/react-query').UseMutationResult<EcoReport, Error, string, unknown>;
106
+ export declare const useEcoRejectReport: () => import('@tanstack/react-query').UseMutationResult<EcoReport, Error, EcoRejectReportInput, unknown>;
104
107
  //# sourceMappingURL=useEcoImpactHubApi.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useEcoImpactHubApi.d.ts","sourceRoot":"","sources":["../../../src/ecoimpacthub/hooks/useEcoImpactHubApi.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useEcoImpactHubApi.d.ts","sourceRoot":"","sources":["../../../src/ecoimpacthub/hooks/useEcoImpactHubApi.ts"],"names":[],"mappings":"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"}
@@ -53,7 +53,7 @@ var a = () => {
53
53
  }, c = {
54
54
  limit: 50,
55
55
  offset: 0
56
- }, l = "\n id workspaceId name code type status description latitude longitude\n areaHectares country region createdAt updatedAt\n", u = "\n id workspaceId siteId name kind status hardwareId unit lastReadingAt installedAt\n createdAt updatedAt\n", d = "\n id workspaceId siteId sensorId parameter value unit source recordedAt isBreach notes\n createdAt updatedAt\n", f = "\n id workspaceId siteId parameter direction severity limitValue minValue maxValue unit\n isActive createdAt updatedAt\n", p = "\n id workspaceId commonName scientificName taxonGroup conservationStatus isPriority\n description createdAt updatedAt\n", m = "\n id workspaceId speciesId siteId method count observedAt latitude longitude observerId\n notes evidence { id } createdAt updatedAt\n", h = "\n id workspaceId name status description siteId targetHectares budgetAmount currency\n managerId startDate endDate completedAt createdAt updatedAt\n", g = "\n id workspaceId projectId type summary details quantity unit performedAt createdAt updatedAt\n", _ = "\n id workspaceId name scope activityUnit factorKgco2e source validYear isActive\n createdAt updatedAt\n", v = "\n id workspaceId siteId factorId scope status category activityValue activityUnit co2eKg\n periodStart notes createdAt updatedAt\n", y = "\n id workspaceId name status metric baselineYear baselineValue targetYear targetValue unit\n description createdAt updatedAt\n", b = "\n id workspaceId title framework status periodStart periodEnd summary publishedAt\n file { id } createdAt updatedAt\n", x = "\n id workspaceId reportId carbonEntryId label value unit category createdAt updatedAt\n", S = (t = {}) => {
56
+ }, l = "\n id workspaceId name code type status description latitude longitude\n areaHectares country region createdAt updatedAt\n", u = "\n id workspaceId siteId name kind status hardwareId unit lastReadingAt installedAt\n createdAt updatedAt\n", d = "\n id workspaceId siteId sensorId parameter value unit source recordedAt isBreach notes\n createdAt updatedAt\n", f = "\n id workspaceId siteId parameter direction severity limitValue minValue maxValue unit\n isActive createdAt updatedAt\n", p = "\n id workspaceId commonName scientificName taxonGroup conservationStatus isPriority\n description createdAt updatedAt\n", m = "\n id workspaceId speciesId siteId method count observedAt latitude longitude observerId\n notes evidence { id } createdAt updatedAt\n", h = "\n id workspaceId name status description siteId targetHectares budgetAmount currency\n managerId startDate endDate completedAt createdAt updatedAt\n", g = "\n id workspaceId projectId type summary details quantity unit performedAt createdAt updatedAt\n", _ = "\n id workspaceId name scope activityUnit factorKgco2e source validYear isActive\n createdAt updatedAt\n", v = "\n id workspaceId siteId factorId scope status category activityValue activityUnit co2eKg\n periodStart notes createdAt updatedAt\n", y = "\n id workspaceId name status metric baselineYear baselineValue targetYear targetValue unit\n description createdAt updatedAt\n", b = "\n id workspaceId title framework status periodStart periodEnd summary publishedAt\n workflowRunId approvedBy approvedAt rejectedAt rejectionReason\n file { id } createdAt updatedAt\n", x = "\n id workspaceId reportId carbonEntryId label value unit category createdAt updatedAt\n", S = (t = {}) => {
57
57
  let { apiGatewayUrl: r } = e();
58
58
  return n({
59
59
  queryKey: [...s.sites, t],
@@ -230,13 +230,13 @@ var a = () => {
230
230
  i.invalidateQueries({ queryKey: s.species }), i.invalidateQueries({ queryKey: s.speciesOne(e.id) });
231
231
  }
232
232
  });
233
- }, ee = () => {
233
+ }, R = () => {
234
234
  let { apiGatewayUrl: n } = e(), i = r();
235
235
  return t({
236
236
  mutationFn: async (e) => (await o("mutation EcoArchiveSpecies($id: ID!) { ecoArchiveSpecies(id: $id) }", { id: e }, n)).ecoArchiveSpecies,
237
237
  onSuccess: () => i.invalidateQueries({ queryKey: s.species })
238
238
  });
239
- }, R = (t = {}) => {
239
+ }, z = (t = {}) => {
240
240
  let { apiGatewayUrl: r } = e();
241
241
  return n({
242
242
  queryKey: [...s.observations, t],
@@ -251,7 +251,7 @@ var a = () => {
251
251
  pagination: t.pagination ?? c
252
252
  }, r)).ecoListObservations
253
253
  });
254
- }, z = () => {
254
+ }, B = () => {
255
255
  let { apiGatewayUrl: n } = e(), i = r();
256
256
  return t({
257
257
  mutationFn: async (e) => (await o(`mutation EcoRecordObservation($input: EcoRecordObservationInput!) {
@@ -261,7 +261,7 @@ var a = () => {
261
261
  i.invalidateQueries({ queryKey: s.observations }), i.invalidateQueries({ queryKey: s.speciesOne(e.speciesId) });
262
262
  }
263
263
  });
264
- }, B = (t) => {
264
+ }, V = (t) => {
265
265
  let { apiGatewayUrl: r } = e();
266
266
  return n({
267
267
  queryKey: [...s.habitatProjects, t ?? "all"],
@@ -272,7 +272,7 @@ var a = () => {
272
272
  }
273
273
  }`, { status: t }, r)).ecoListHabitatProjects
274
274
  });
275
- }, V = (t) => {
275
+ }, ee = (t) => {
276
276
  let { apiGatewayUrl: r } = e();
277
277
  return n({
278
278
  queryKey: s.habitatProject(t ?? ""),
@@ -461,8 +461,38 @@ var a = () => {
461
461
  i.invalidateQueries({ queryKey: s.reports }), i.invalidateQueries({ queryKey: s.report(e.id) });
462
462
  }
463
463
  });
464
+ }, oe = () => {
465
+ let { apiGatewayUrl: n } = e(), i = r();
466
+ return t({
467
+ mutationFn: async (e) => (await o(`mutation EcoSubmitReportForApproval($id: ID!) {
468
+ ecoSubmitReportForApproval(id: $id) { ${b} }
469
+ }`, { id: e }, n)).ecoSubmitReportForApproval,
470
+ onSuccess: (e) => {
471
+ i.invalidateQueries({ queryKey: s.reports }), i.invalidateQueries({ queryKey: s.report(e.id) });
472
+ }
473
+ });
474
+ }, se = () => {
475
+ let { apiGatewayUrl: n } = e(), i = r();
476
+ return t({
477
+ mutationFn: async (e) => (await o(`mutation EcoApproveReport($id: ID!) {
478
+ ecoApproveReport(id: $id) { ${b} }
479
+ }`, { id: e }, n)).ecoApproveReport,
480
+ onSuccess: (e) => {
481
+ i.invalidateQueries({ queryKey: s.reports }), i.invalidateQueries({ queryKey: s.report(e.id) });
482
+ }
483
+ });
484
+ }, ce = () => {
485
+ let { apiGatewayUrl: n } = e(), i = r();
486
+ return t({
487
+ mutationFn: async (e) => (await o(`mutation EcoRejectReport($input: EcoRejectReportInput!) {
488
+ ecoRejectReport(input: $input) { ${b} }
489
+ }`, { input: e }, n)).ecoRejectReport,
490
+ onSuccess: (e) => {
491
+ i.invalidateQueries({ queryKey: s.reports }), i.invalidateQueries({ queryKey: s.report(e.id) });
492
+ }
493
+ });
464
494
  };
465
495
  //#endregion
466
- export { ie as useEcoAddReportLineItem, T as useEcoArchiveSite, ee as useEcoArchiveSpecies, q as useEcoCarbonEntries, J as useEcoCarbonTotals, K as useEcoCreateEmissionFactor, H as useEcoCreateHabitatProject, Q as useEcoCreateReductionTarget, re as useEcoCreateReport, D as useEcoCreateSensor, w as useEcoCreateSite, I as useEcoCreateSpecies, M as useEcoCreateThreshold, G as useEcoEmissionFactors, V as useEcoHabitatProject, B as useEcoHabitatProjects, W as useEcoLogRestorationActivity, k as useEcoMeasurements, R as useEcoObservations, ae as useEcoPublishReport, Y as useEcoRecordCarbonEntry, A as useEcoRecordMeasurement, z as useEcoRecordObservation, Z as useEcoReductionTargets, ne as useEcoReport, te as useEcoReports, E as useEcoSensors, $ as useEcoSetReductionTargetStatus, O as useEcoSetSensorStatus, N as useEcoSetThresholdActive, C as useEcoSite, S as useEcoSites, P as useEcoSpecies, F as useEcoSpeciesDetail, j as useEcoThresholds, U as useEcoTransitionHabitatProject, L as useEcoUpdateSpecies, X as useEcoVerifyCarbonEntry };
496
+ export { ie as useEcoAddReportLineItem, se as useEcoApproveReport, T as useEcoArchiveSite, R as useEcoArchiveSpecies, q as useEcoCarbonEntries, J as useEcoCarbonTotals, K as useEcoCreateEmissionFactor, H as useEcoCreateHabitatProject, Q as useEcoCreateReductionTarget, re as useEcoCreateReport, D as useEcoCreateSensor, w as useEcoCreateSite, I as useEcoCreateSpecies, M as useEcoCreateThreshold, G as useEcoEmissionFactors, ee as useEcoHabitatProject, V as useEcoHabitatProjects, W as useEcoLogRestorationActivity, k as useEcoMeasurements, z as useEcoObservations, ae as useEcoPublishReport, Y as useEcoRecordCarbonEntry, A as useEcoRecordMeasurement, B as useEcoRecordObservation, Z as useEcoReductionTargets, ce as useEcoRejectReport, ne as useEcoReport, te as useEcoReports, E as useEcoSensors, $ as useEcoSetReductionTargetStatus, O as useEcoSetSensorStatus, N as useEcoSetThresholdActive, C as useEcoSite, S as useEcoSites, P as useEcoSpecies, F as useEcoSpeciesDetail, oe as useEcoSubmitReportForApproval, j as useEcoThresholds, U as useEcoTransitionHabitatProject, L as useEcoUpdateSpecies, X as useEcoVerifyCarbonEntry };
467
497
 
468
498
  //# sourceMappingURL=useEcoImpactHubApi.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useEcoImpactHubApi.js","names":[],"sources":["../../../src/ecoimpacthub/hooks/useEcoImpactHubApi.ts"],"sourcesContent":["/**\n * EcoImpactHub API hooks\n * @module ecoimpacthub/hooks\n *\n * React-Query hooks wired DIRECTLY to the real `wspace-ecoimpacthub-svc`\n * federated GraphQL contract (the `eco*` operations). Every query/mutation\n * below uses an inline gql string whose fields match the svc\n * `.hive-schema.graphql` exactly. No mock data.\n *\n * Transport: `graphqlFetch({ gateway: 'workspace', workspaceToken: true })` —\n * the host shell supplies the gateway base URL + a workspace-scoped token.\n */\n\nimport { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';\nimport { graphqlFetch } from '@burdenoff/fe-libs/shared/graphql';\n\nimport { useEcoImpactHub } from '../context';\nimport type {\n EcoConnection,\n EcoSite,\n EcoSiteStatus,\n EcoSiteType,\n EcoSensor,\n EcoSensorKind,\n EcoSensorStatus,\n EcoMeasurement,\n EcoAlertThreshold,\n EcoSpecies,\n EcoTaxonGroup,\n EcoConservationStatus,\n EcoObservation,\n EcoHabitatProject,\n EcoHabitatProjectStatus,\n EcoRestorationActivity,\n EcoEmissionFactor,\n EcoEmissionScope,\n EcoCarbonEntry,\n EcoCarbonEntryStatus,\n EcoReductionTarget,\n EcoReductionTargetStatus,\n EcoReport,\n EcoReportStatus,\n EcoReportLineItem,\n EcoCreateSiteInput,\n EcoUpdateSiteInput,\n EcoCreateSensorInput,\n EcoRecordMeasurementInput,\n EcoCreateThresholdInput,\n EcoCreateSpeciesInput,\n EcoUpdateSpeciesInput,\n EcoRecordObservationInput,\n EcoCreateHabitatProjectInput,\n EcoLogRestorationActivityInput,\n EcoCreateEmissionFactorInput,\n EcoRecordCarbonEntryInput,\n EcoCreateReductionTargetInput,\n EcoCreateReportInput,\n EcoAddReportLineItemInput,\n PaginationInput,\n} from '../types';\n\n// ============================================================================\n// Transport\n// ============================================================================\n\n/**\n * fe-libs `graphqlFetch` coalesces `query` responses in an in-memory cache keyed\n * by operationName+variables for ~15s (mutations are never cached). A read\n * issued right after a write (e.g. React-Query refetch triggered by our\n * `invalidateQueries`) would otherwise return the PRE-mutation response until the\n * TTL expires — making just-created/updated rows invisible until a full reload.\n * fe-libs' documented remedy is that write-performing callers clear those caches;\n * we do exactly that (the same maps `clearGraphqlFetchResponseCache` clears)\n * after every eco mutation so every follow-up read is fresh.\n */\ntype GraphqlReadCacheGlobals = {\n __graphqlFetchResponseCache?: { clear: () => void };\n __graphqlFetchPendingResponses?: { clear: () => void };\n __boffGraphQLResponseCache?: { clear: () => void };\n};\n\nconst clearGraphqlReadCaches = (): void => {\n const g = globalThis as GraphqlReadCacheGlobals;\n g.__graphqlFetchResponseCache?.clear();\n g.__graphqlFetchPendingResponses?.clear();\n g.__boffGraphQLResponseCache?.clear();\n};\n\nconst ecoQuery = async <TData>(\n query: string,\n variables: Record<string, unknown>,\n baseUrl?: string\n): Promise<TData> => {\n const response = await graphqlFetch<TData>({\n gateway: 'workspace',\n baseUrl,\n query,\n variables,\n workspaceToken: true,\n });\n\n if (response.errors?.length) {\n throw new Error(response.errors[0]?.message ?? 'GraphQL request failed');\n }\n if (!response.data) {\n throw new Error('GraphQL response did not include data');\n }\n // After a write, drop fe-libs' short-lived read caches so the invalidation\n // refetch that follows reads fresh data instead of the pre-mutation snapshot.\n if (/^\\s*mutation\\b/.test(query)) {\n clearGraphqlReadCaches();\n }\n return response.data;\n};\n\n// React-Query key roots (one namespace per domain entity).\nconst KEY = {\n sites: ['ecoimpacthub', 'sites'] as const,\n site: (id: string) => ['ecoimpacthub', 'site', id] as const,\n sensors: ['ecoimpacthub', 'sensors'] as const,\n measurements: ['ecoimpacthub', 'measurements'] as const,\n thresholds: ['ecoimpacthub', 'thresholds'] as const,\n species: ['ecoimpacthub', 'species'] as const,\n speciesOne: (id: string) => ['ecoimpacthub', 'species', id] as const,\n observations: ['ecoimpacthub', 'observations'] as const,\n habitatProjects: ['ecoimpacthub', 'habitat-projects'] as const,\n habitatProject: (id: string) => ['ecoimpacthub', 'habitat-project', id] as const,\n emissionFactors: ['ecoimpacthub', 'emission-factors'] as const,\n carbonEntries: ['ecoimpacthub', 'carbon-entries'] as const,\n carbonTotals: ['ecoimpacthub', 'carbon-totals'] as const,\n reductionTargets: ['ecoimpacthub', 'reduction-targets'] as const,\n reports: ['ecoimpacthub', 'reports'] as const,\n report: (id: string) => ['ecoimpacthub', 'report', id] as const,\n};\n\nconst DEFAULT_PAGE: PaginationInput = { limit: 50, offset: 0 };\n\n// ============================================================================\n// Reusable gql field selections (codegen-free strictness)\n// ============================================================================\n\nconst SITE_FIELDS = `\n id workspaceId name code type status description latitude longitude\n areaHectares country region createdAt updatedAt\n`;\n\nconst SENSOR_FIELDS = `\n id workspaceId siteId name kind status hardwareId unit lastReadingAt installedAt\n createdAt updatedAt\n`;\n\nconst MEASUREMENT_FIELDS = `\n id workspaceId siteId sensorId parameter value unit source recordedAt isBreach notes\n createdAt updatedAt\n`;\n\nconst THRESHOLD_FIELDS = `\n id workspaceId siteId parameter direction severity limitValue minValue maxValue unit\n isActive createdAt updatedAt\n`;\n\nconst SPECIES_FIELDS = `\n id workspaceId commonName scientificName taxonGroup conservationStatus isPriority\n description createdAt updatedAt\n`;\n\nconst OBSERVATION_FIELDS = `\n id workspaceId speciesId siteId method count observedAt latitude longitude observerId\n notes evidence { id } createdAt updatedAt\n`;\n\nconst HABITAT_FIELDS = `\n id workspaceId name status description siteId targetHectares budgetAmount currency\n managerId startDate endDate completedAt createdAt updatedAt\n`;\n\nconst ACTIVITY_FIELDS = `\n id workspaceId projectId type summary details quantity unit performedAt createdAt updatedAt\n`;\n\nconst FACTOR_FIELDS = `\n id workspaceId name scope activityUnit factorKgco2e source validYear isActive\n createdAt updatedAt\n`;\n\nconst CARBON_FIELDS = `\n id workspaceId siteId factorId scope status category activityValue activityUnit co2eKg\n periodStart notes createdAt updatedAt\n`;\n\nconst TARGET_FIELDS = `\n id workspaceId name status metric baselineYear baselineValue targetYear targetValue unit\n description createdAt updatedAt\n`;\n\nconst REPORT_FIELDS = `\n id workspaceId title framework status periodStart periodEnd summary publishedAt\n file { id } createdAt updatedAt\n`;\n\nconst LINE_ITEM_FIELDS = `\n id workspaceId reportId carbonEntryId label value unit category createdAt updatedAt\n`;\n\n// ============================================================================\n// Sites (Environmental Monitoring)\n// ============================================================================\n\nexport interface SiteFilters {\n status?: EcoSiteStatus;\n type?: EcoSiteType;\n pagination?: PaginationInput;\n}\n\nexport const useEcoSites = (filters: SiteFilters = {}) => {\n const { apiGatewayUrl } = useEcoImpactHub();\n return useQuery({\n queryKey: [...KEY.sites, filters],\n queryFn: async () => {\n const result = await ecoQuery<{ ecoListSites: EcoConnection<EcoSite> }>(\n `query EcoListSites($status: EcoSiteStatus, $type: EcoSiteType, $pagination: PaginationInput) {\n ecoListSites(status: $status, type: $type, pagination: $pagination) {\n items { ${SITE_FIELDS} }\n pageInfo { cursor hasMore }\n }\n }`,\n {\n status: filters.status,\n type: filters.type,\n pagination: filters.pagination ?? DEFAULT_PAGE,\n },\n apiGatewayUrl\n );\n return result.ecoListSites;\n },\n });\n};\n\nexport const useEcoSite = (id: string | undefined) => {\n const { apiGatewayUrl } = useEcoImpactHub();\n return useQuery({\n queryKey: KEY.site(id ?? ''),\n enabled: Boolean(id),\n queryFn: async () => {\n const result = await ecoQuery<{ ecoSite: EcoSite | null }>(\n `query EcoSite($id: ID!) {\n ecoSite(id: $id) {\n ${SITE_FIELDS}\n sensors { ${SENSOR_FIELDS} }\n thresholds { ${THRESHOLD_FIELDS} }\n }\n }`,\n { id },\n apiGatewayUrl\n );\n return result.ecoSite;\n },\n });\n};\n\nexport const useEcoCreateSite = () => {\n const { apiGatewayUrl } = useEcoImpactHub();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (input: EcoCreateSiteInput) => {\n const result = await ecoQuery<{ ecoCreateSite: EcoSite }>(\n `mutation EcoCreateSite($input: EcoCreateSiteInput!) {\n ecoCreateSite(input: $input) { ${SITE_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return result.ecoCreateSite;\n },\n onSuccess: () => qc.invalidateQueries({ queryKey: KEY.sites }),\n });\n};\n\nexport const useEcoUpdateSite = () => {\n const { apiGatewayUrl } = useEcoImpactHub();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (vars: { id: string; input: EcoUpdateSiteInput }) => {\n const result = await ecoQuery<{ ecoUpdateSite: EcoSite }>(\n `mutation EcoUpdateSite($id: ID!, $input: EcoUpdateSiteInput!) {\n ecoUpdateSite(id: $id, input: $input) { ${SITE_FIELDS} }\n }`,\n vars,\n apiGatewayUrl\n );\n return result.ecoUpdateSite;\n },\n onSuccess: (data) => {\n qc.invalidateQueries({ queryKey: KEY.sites });\n qc.invalidateQueries({ queryKey: KEY.site(data.id) });\n },\n });\n};\n\nexport const useEcoArchiveSite = () => {\n const { apiGatewayUrl } = useEcoImpactHub();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (id: string) => {\n const result = await ecoQuery<{ ecoArchiveSite: boolean }>(\n `mutation EcoArchiveSite($id: ID!) { ecoArchiveSite(id: $id) }`,\n { id },\n apiGatewayUrl\n );\n return result.ecoArchiveSite;\n },\n onSuccess: () => qc.invalidateQueries({ queryKey: KEY.sites }),\n });\n};\n\n// ============================================================================\n// Sensors / Measurements / Thresholds (Environmental Monitoring)\n// ============================================================================\n\nexport interface SensorFilters {\n siteId?: string;\n kind?: EcoSensorKind;\n status?: EcoSensorStatus;\n}\n\nexport const useEcoSensors = (filters: SensorFilters = {}) => {\n const { apiGatewayUrl } = useEcoImpactHub();\n return useQuery({\n queryKey: [...KEY.sensors, filters],\n queryFn: async () => {\n const result = await ecoQuery<{ ecoListSensors: EcoConnection<EcoSensor> }>(\n `query EcoListSensors($siteId: ID, $kind: EcoSensorKind, $status: EcoSensorStatus) {\n ecoListSensors(siteId: $siteId, kind: $kind, status: $status) {\n items { ${SENSOR_FIELDS} }\n pageInfo { cursor hasMore }\n }\n }`,\n { siteId: filters.siteId, kind: filters.kind, status: filters.status },\n apiGatewayUrl\n );\n return result.ecoListSensors;\n },\n });\n};\n\nexport const useEcoCreateSensor = () => {\n const { apiGatewayUrl } = useEcoImpactHub();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (input: EcoCreateSensorInput) => {\n const result = await ecoQuery<{ ecoCreateSensor: EcoSensor }>(\n `mutation EcoCreateSensor($input: EcoCreateSensorInput!) {\n ecoCreateSensor(input: $input) { ${SENSOR_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return result.ecoCreateSensor;\n },\n onSuccess: (data) => {\n qc.invalidateQueries({ queryKey: KEY.sensors });\n qc.invalidateQueries({ queryKey: KEY.site(data.siteId) });\n },\n });\n};\n\nexport const useEcoSetSensorStatus = () => {\n const { apiGatewayUrl } = useEcoImpactHub();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (vars: { id: string; status: EcoSensorStatus }) => {\n const result = await ecoQuery<{ ecoSetSensorStatus: EcoSensor }>(\n `mutation EcoSetSensorStatus($id: ID!, $status: EcoSensorStatus!) {\n ecoSetSensorStatus(id: $id, status: $status) { ${SENSOR_FIELDS} }\n }`,\n vars,\n apiGatewayUrl\n );\n return result.ecoSetSensorStatus;\n },\n onSuccess: (data) => {\n qc.invalidateQueries({ queryKey: KEY.sensors });\n qc.invalidateQueries({ queryKey: KEY.site(data.siteId) });\n },\n });\n};\n\nexport interface MeasurementFilters {\n siteId?: string;\n sensorId?: string;\n parameter?: string;\n breachesOnly?: boolean;\n pagination?: PaginationInput;\n}\n\nexport const useEcoMeasurements = (filters: MeasurementFilters = {}) => {\n const { apiGatewayUrl } = useEcoImpactHub();\n return useQuery({\n queryKey: [...KEY.measurements, filters],\n queryFn: async () => {\n const result = await ecoQuery<{ ecoListMeasurements: EcoConnection<EcoMeasurement> }>(\n `query EcoListMeasurements($siteId: ID, $sensorId: ID, $parameter: String, $breachesOnly: Boolean, $pagination: PaginationInput) {\n ecoListMeasurements(siteId: $siteId, sensorId: $sensorId, parameter: $parameter, breachesOnly: $breachesOnly, pagination: $pagination) {\n items { ${MEASUREMENT_FIELDS} }\n pageInfo { cursor hasMore }\n }\n }`,\n {\n siteId: filters.siteId,\n sensorId: filters.sensorId,\n parameter: filters.parameter,\n breachesOnly: filters.breachesOnly,\n pagination: filters.pagination ?? DEFAULT_PAGE,\n },\n apiGatewayUrl\n );\n return result.ecoListMeasurements;\n },\n });\n};\n\nexport const useEcoRecordMeasurement = () => {\n const { apiGatewayUrl } = useEcoImpactHub();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (input: EcoRecordMeasurementInput) => {\n const result = await ecoQuery<{ ecoRecordMeasurement: EcoMeasurement }>(\n `mutation EcoRecordMeasurement($input: EcoRecordMeasurementInput!) {\n ecoRecordMeasurement(input: $input) { ${MEASUREMENT_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return result.ecoRecordMeasurement;\n },\n onSuccess: () => qc.invalidateQueries({ queryKey: KEY.measurements }),\n });\n};\n\nexport const useEcoThresholds = (siteId?: string) => {\n const { apiGatewayUrl } = useEcoImpactHub();\n return useQuery({\n queryKey: [...KEY.thresholds, siteId ?? 'all'],\n queryFn: async () => {\n const result = await ecoQuery<{ ecoListThresholds: EcoConnection<EcoAlertThreshold> }>(\n `query EcoListThresholds($siteId: ID) {\n ecoListThresholds(siteId: $siteId) {\n items { ${THRESHOLD_FIELDS} }\n pageInfo { cursor hasMore }\n }\n }`,\n { siteId },\n apiGatewayUrl\n );\n return result.ecoListThresholds;\n },\n });\n};\n\nexport const useEcoCreateThreshold = () => {\n const { apiGatewayUrl } = useEcoImpactHub();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (input: EcoCreateThresholdInput) => {\n const result = await ecoQuery<{ ecoCreateThreshold: EcoAlertThreshold }>(\n `mutation EcoCreateThreshold($input: EcoCreateThresholdInput!) {\n ecoCreateThreshold(input: $input) { ${THRESHOLD_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return result.ecoCreateThreshold;\n },\n onSuccess: (data) => {\n qc.invalidateQueries({ queryKey: KEY.thresholds });\n qc.invalidateQueries({ queryKey: KEY.site(data.siteId) });\n },\n });\n};\n\nexport const useEcoSetThresholdActive = () => {\n const { apiGatewayUrl } = useEcoImpactHub();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (vars: { id: string; isActive: boolean }) => {\n const result = await ecoQuery<{ ecoSetThresholdActive: EcoAlertThreshold }>(\n `mutation EcoSetThresholdActive($id: ID!, $isActive: Boolean!) {\n ecoSetThresholdActive(id: $id, isActive: $isActive) { ${THRESHOLD_FIELDS} }\n }`,\n vars,\n apiGatewayUrl\n );\n return result.ecoSetThresholdActive;\n },\n onSuccess: () => qc.invalidateQueries({ queryKey: KEY.thresholds }),\n });\n};\n\n// ============================================================================\n// Species / Observations / Habitat (Conservation)\n// ============================================================================\n\nexport interface SpeciesFilters {\n taxonGroup?: EcoTaxonGroup;\n conservationStatus?: EcoConservationStatus;\n priorityOnly?: boolean;\n pagination?: PaginationInput;\n}\n\nexport const useEcoSpecies = (filters: SpeciesFilters = {}) => {\n const { apiGatewayUrl } = useEcoImpactHub();\n return useQuery({\n queryKey: [...KEY.species, filters],\n queryFn: async () => {\n const result = await ecoQuery<{ ecoListSpecies: EcoConnection<EcoSpecies> }>(\n `query EcoListSpecies($taxonGroup: EcoTaxonGroup, $conservationStatus: EcoConservationStatus, $priorityOnly: Boolean, $pagination: PaginationInput) {\n ecoListSpecies(taxonGroup: $taxonGroup, conservationStatus: $conservationStatus, priorityOnly: $priorityOnly, pagination: $pagination) {\n items { ${SPECIES_FIELDS} }\n pageInfo { cursor hasMore }\n }\n }`,\n {\n taxonGroup: filters.taxonGroup,\n conservationStatus: filters.conservationStatus,\n priorityOnly: filters.priorityOnly,\n pagination: filters.pagination ?? DEFAULT_PAGE,\n },\n apiGatewayUrl\n );\n return result.ecoListSpecies;\n },\n });\n};\n\nexport const useEcoSpeciesDetail = (id: string | undefined) => {\n const { apiGatewayUrl } = useEcoImpactHub();\n return useQuery({\n queryKey: KEY.speciesOne(id ?? ''),\n enabled: Boolean(id),\n queryFn: async () => {\n const result = await ecoQuery<{ ecoSpecies: EcoSpecies | null }>(\n `query EcoSpeciesDetail($id: ID!) {\n ecoSpecies(id: $id) {\n ${SPECIES_FIELDS}\n observations { ${OBSERVATION_FIELDS} }\n }\n }`,\n { id },\n apiGatewayUrl\n );\n return result.ecoSpecies;\n },\n });\n};\n\nexport const useEcoCreateSpecies = () => {\n const { apiGatewayUrl } = useEcoImpactHub();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (input: EcoCreateSpeciesInput) => {\n const result = await ecoQuery<{ ecoCreateSpecies: EcoSpecies }>(\n `mutation EcoCreateSpecies($input: EcoCreateSpeciesInput!) {\n ecoCreateSpecies(input: $input) { ${SPECIES_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return result.ecoCreateSpecies;\n },\n onSuccess: () => qc.invalidateQueries({ queryKey: KEY.species }),\n });\n};\n\nexport const useEcoUpdateSpecies = () => {\n const { apiGatewayUrl } = useEcoImpactHub();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (vars: { id: string; input: EcoUpdateSpeciesInput }) => {\n const result = await ecoQuery<{ ecoUpdateSpecies: EcoSpecies }>(\n `mutation EcoUpdateSpecies($id: ID!, $input: EcoUpdateSpeciesInput!) {\n ecoUpdateSpecies(id: $id, input: $input) { ${SPECIES_FIELDS} }\n }`,\n vars,\n apiGatewayUrl\n );\n return result.ecoUpdateSpecies;\n },\n onSuccess: (data) => {\n qc.invalidateQueries({ queryKey: KEY.species });\n qc.invalidateQueries({ queryKey: KEY.speciesOne(data.id) });\n },\n });\n};\n\nexport const useEcoArchiveSpecies = () => {\n const { apiGatewayUrl } = useEcoImpactHub();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (id: string) => {\n const result = await ecoQuery<{ ecoArchiveSpecies: boolean }>(\n `mutation EcoArchiveSpecies($id: ID!) { ecoArchiveSpecies(id: $id) }`,\n { id },\n apiGatewayUrl\n );\n return result.ecoArchiveSpecies;\n },\n onSuccess: () => qc.invalidateQueries({ queryKey: KEY.species }),\n });\n};\n\nexport interface ObservationFilters {\n speciesId?: string;\n siteId?: string;\n pagination?: PaginationInput;\n}\n\nexport const useEcoObservations = (filters: ObservationFilters = {}) => {\n const { apiGatewayUrl } = useEcoImpactHub();\n return useQuery({\n queryKey: [...KEY.observations, filters],\n queryFn: async () => {\n const result = await ecoQuery<{ ecoListObservations: EcoConnection<EcoObservation> }>(\n `query EcoListObservations($speciesId: ID, $siteId: ID, $pagination: PaginationInput) {\n ecoListObservations(speciesId: $speciesId, siteId: $siteId, pagination: $pagination) {\n items { ${OBSERVATION_FIELDS} species { id commonName scientificName taxonGroup } }\n pageInfo { cursor hasMore }\n }\n }`,\n {\n speciesId: filters.speciesId,\n siteId: filters.siteId,\n pagination: filters.pagination ?? DEFAULT_PAGE,\n },\n apiGatewayUrl\n );\n return result.ecoListObservations;\n },\n });\n};\n\nexport const useEcoRecordObservation = () => {\n const { apiGatewayUrl } = useEcoImpactHub();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (input: EcoRecordObservationInput) => {\n const result = await ecoQuery<{ ecoRecordObservation: EcoObservation }>(\n `mutation EcoRecordObservation($input: EcoRecordObservationInput!) {\n ecoRecordObservation(input: $input) { ${OBSERVATION_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return result.ecoRecordObservation;\n },\n onSuccess: (data) => {\n qc.invalidateQueries({ queryKey: KEY.observations });\n qc.invalidateQueries({ queryKey: KEY.speciesOne(data.speciesId) });\n },\n });\n};\n\nexport const useEcoHabitatProjects = (status?: EcoHabitatProjectStatus) => {\n const { apiGatewayUrl } = useEcoImpactHub();\n return useQuery({\n queryKey: [...KEY.habitatProjects, status ?? 'all'],\n queryFn: async () => {\n const result = await ecoQuery<{ ecoListHabitatProjects: EcoConnection<EcoHabitatProject> }>(\n `query EcoListHabitatProjects($status: EcoHabitatProjectStatus) {\n ecoListHabitatProjects(status: $status) {\n items { ${HABITAT_FIELDS} }\n pageInfo { cursor hasMore }\n }\n }`,\n { status },\n apiGatewayUrl\n );\n return result.ecoListHabitatProjects;\n },\n });\n};\n\nexport const useEcoHabitatProject = (id: string | undefined) => {\n const { apiGatewayUrl } = useEcoImpactHub();\n return useQuery({\n queryKey: KEY.habitatProject(id ?? ''),\n enabled: Boolean(id),\n queryFn: async () => {\n const result = await ecoQuery<{ ecoHabitatProject: EcoHabitatProject | null }>(\n `query EcoHabitatProject($id: ID!) {\n ecoHabitatProject(id: $id) {\n ${HABITAT_FIELDS}\n activities { ${ACTIVITY_FIELDS} }\n }\n }`,\n { id },\n apiGatewayUrl\n );\n return result.ecoHabitatProject;\n },\n });\n};\n\nexport const useEcoCreateHabitatProject = () => {\n const { apiGatewayUrl } = useEcoImpactHub();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (input: EcoCreateHabitatProjectInput) => {\n const result = await ecoQuery<{ ecoCreateHabitatProject: EcoHabitatProject }>(\n `mutation EcoCreateHabitatProject($input: EcoCreateHabitatProjectInput!) {\n ecoCreateHabitatProject(input: $input) { ${HABITAT_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return result.ecoCreateHabitatProject;\n },\n onSuccess: () => qc.invalidateQueries({ queryKey: KEY.habitatProjects }),\n });\n};\n\nexport const useEcoTransitionHabitatProject = () => {\n const { apiGatewayUrl } = useEcoImpactHub();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (vars: { id: string; status: EcoHabitatProjectStatus }) => {\n const result = await ecoQuery<{ ecoTransitionHabitatProject: EcoHabitatProject }>(\n `mutation EcoTransitionHabitatProject($id: ID!, $status: EcoHabitatProjectStatus!) {\n ecoTransitionHabitatProject(id: $id, status: $status) { ${HABITAT_FIELDS} }\n }`,\n vars,\n apiGatewayUrl\n );\n return result.ecoTransitionHabitatProject;\n },\n onSuccess: (data) => {\n qc.invalidateQueries({ queryKey: KEY.habitatProjects });\n qc.invalidateQueries({ queryKey: KEY.habitatProject(data.id) });\n },\n });\n};\n\nexport const useEcoLogRestorationActivity = () => {\n const { apiGatewayUrl } = useEcoImpactHub();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (input: EcoLogRestorationActivityInput) => {\n const result = await ecoQuery<{ ecoLogRestorationActivity: EcoRestorationActivity }>(\n `mutation EcoLogRestorationActivity($input: EcoLogRestorationActivityInput!) {\n ecoLogRestorationActivity(input: $input) { ${ACTIVITY_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return result.ecoLogRestorationActivity;\n },\n onSuccess: (data) => qc.invalidateQueries({ queryKey: KEY.habitatProject(data.projectId) }),\n });\n};\n\n// ============================================================================\n// Carbon ledger / Emission factors / Reduction targets (Sustainability)\n// ============================================================================\n\nexport const useEcoEmissionFactors = (scope?: EcoEmissionScope, activeOnly?: boolean) => {\n const { apiGatewayUrl } = useEcoImpactHub();\n return useQuery({\n queryKey: [...KEY.emissionFactors, scope ?? 'all', activeOnly ?? false],\n queryFn: async () => {\n const result = await ecoQuery<{ ecoListEmissionFactors: EcoConnection<EcoEmissionFactor> }>(\n `query EcoListEmissionFactors($scope: EcoEmissionScope, $activeOnly: Boolean) {\n ecoListEmissionFactors(scope: $scope, activeOnly: $activeOnly) {\n items { ${FACTOR_FIELDS} }\n pageInfo { cursor hasMore }\n }\n }`,\n { scope, activeOnly },\n apiGatewayUrl\n );\n return result.ecoListEmissionFactors;\n },\n });\n};\n\nexport const useEcoCreateEmissionFactor = () => {\n const { apiGatewayUrl } = useEcoImpactHub();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (input: EcoCreateEmissionFactorInput) => {\n const result = await ecoQuery<{ ecoCreateEmissionFactor: EcoEmissionFactor }>(\n `mutation EcoCreateEmissionFactor($input: EcoCreateEmissionFactorInput!) {\n ecoCreateEmissionFactor(input: $input) { ${FACTOR_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return result.ecoCreateEmissionFactor;\n },\n onSuccess: () => qc.invalidateQueries({ queryKey: KEY.emissionFactors }),\n });\n};\n\nexport interface CarbonEntryFilters {\n scope?: EcoEmissionScope;\n siteId?: string;\n status?: EcoCarbonEntryStatus;\n pagination?: PaginationInput;\n}\n\nexport const useEcoCarbonEntries = (filters: CarbonEntryFilters = {}) => {\n const { apiGatewayUrl } = useEcoImpactHub();\n return useQuery({\n queryKey: [...KEY.carbonEntries, filters],\n queryFn: async () => {\n const result = await ecoQuery<{ ecoListCarbonEntries: EcoConnection<EcoCarbonEntry> }>(\n `query EcoListCarbonEntries($scope: EcoEmissionScope, $siteId: ID, $status: EcoCarbonEntryStatus, $pagination: PaginationInput) {\n ecoListCarbonEntries(scope: $scope, siteId: $siteId, status: $status, pagination: $pagination) {\n items { ${CARBON_FIELDS} factor { id name factorKgco2e activityUnit } }\n pageInfo { cursor hasMore }\n }\n }`,\n {\n scope: filters.scope,\n siteId: filters.siteId,\n status: filters.status,\n pagination: filters.pagination ?? DEFAULT_PAGE,\n },\n apiGatewayUrl\n );\n return result.ecoListCarbonEntries;\n },\n });\n};\n\n/** Total CO2e by scope + grand total, in one aliased query. */\nexport interface EcoCarbonTotals {\n total: number;\n scope1: number;\n scope2: number;\n scope3: number;\n}\n\nexport const useEcoCarbonTotals = (siteId?: string) => {\n const { apiGatewayUrl } = useEcoImpactHub();\n return useQuery({\n queryKey: [...KEY.carbonTotals, siteId ?? 'all'],\n queryFn: async (): Promise<EcoCarbonTotals> => {\n const result = await ecoQuery<{\n total: number;\n scope1: number;\n scope2: number;\n scope3: number;\n }>(\n `query EcoCarbonTotals($siteId: ID) {\n total: ecoCarbonTotalKg(siteId: $siteId)\n scope1: ecoCarbonTotalKg(scope: SCOPE_1, siteId: $siteId)\n scope2: ecoCarbonTotalKg(scope: SCOPE_2, siteId: $siteId)\n scope3: ecoCarbonTotalKg(scope: SCOPE_3, siteId: $siteId)\n }`,\n { siteId },\n apiGatewayUrl\n );\n return result;\n },\n });\n};\n\nexport const useEcoRecordCarbonEntry = () => {\n const { apiGatewayUrl } = useEcoImpactHub();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (input: EcoRecordCarbonEntryInput) => {\n const result = await ecoQuery<{ ecoRecordCarbonEntry: EcoCarbonEntry }>(\n `mutation EcoRecordCarbonEntry($input: EcoRecordCarbonEntryInput!) {\n ecoRecordCarbonEntry(input: $input) { ${CARBON_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return result.ecoRecordCarbonEntry;\n },\n onSuccess: () => {\n qc.invalidateQueries({ queryKey: KEY.carbonEntries });\n qc.invalidateQueries({ queryKey: KEY.carbonTotals });\n },\n });\n};\n\nexport const useEcoVerifyCarbonEntry = () => {\n const { apiGatewayUrl } = useEcoImpactHub();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (id: string) => {\n const result = await ecoQuery<{ ecoVerifyCarbonEntry: EcoCarbonEntry }>(\n `mutation EcoVerifyCarbonEntry($id: ID!) {\n ecoVerifyCarbonEntry(id: $id) { ${CARBON_FIELDS} }\n }`,\n { id },\n apiGatewayUrl\n );\n return result.ecoVerifyCarbonEntry;\n },\n onSuccess: () => qc.invalidateQueries({ queryKey: KEY.carbonEntries }),\n });\n};\n\nexport const useEcoReductionTargets = (status?: EcoReductionTargetStatus) => {\n const { apiGatewayUrl } = useEcoImpactHub();\n return useQuery({\n queryKey: [...KEY.reductionTargets, status ?? 'all'],\n queryFn: async () => {\n const result = await ecoQuery<{ ecoListReductionTargets: EcoConnection<EcoReductionTarget> }>(\n `query EcoListReductionTargets($status: EcoReductionTargetStatus) {\n ecoListReductionTargets(status: $status) {\n items { ${TARGET_FIELDS} }\n pageInfo { cursor hasMore }\n }\n }`,\n { status },\n apiGatewayUrl\n );\n return result.ecoListReductionTargets;\n },\n });\n};\n\nexport const useEcoCreateReductionTarget = () => {\n const { apiGatewayUrl } = useEcoImpactHub();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (input: EcoCreateReductionTargetInput) => {\n const result = await ecoQuery<{ ecoCreateReductionTarget: EcoReductionTarget }>(\n `mutation EcoCreateReductionTarget($input: EcoCreateReductionTargetInput!) {\n ecoCreateReductionTarget(input: $input) { ${TARGET_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return result.ecoCreateReductionTarget;\n },\n onSuccess: () => qc.invalidateQueries({ queryKey: KEY.reductionTargets }),\n });\n};\n\nexport const useEcoSetReductionTargetStatus = () => {\n const { apiGatewayUrl } = useEcoImpactHub();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (vars: { id: string; status: EcoReductionTargetStatus }) => {\n const result = await ecoQuery<{ ecoSetReductionTargetStatus: EcoReductionTarget }>(\n `mutation EcoSetReductionTargetStatus($id: ID!, $status: EcoReductionTargetStatus!) {\n ecoSetReductionTargetStatus(id: $id, status: $status) { ${TARGET_FIELDS} }\n }`,\n vars,\n apiGatewayUrl\n );\n return result.ecoSetReductionTargetStatus;\n },\n onSuccess: () => qc.invalidateQueries({ queryKey: KEY.reductionTargets }),\n });\n};\n\n// ============================================================================\n// Reports (Sustainability & Reporting)\n// ============================================================================\n\nexport const useEcoReports = (status?: EcoReportStatus, pagination?: PaginationInput) => {\n const { apiGatewayUrl } = useEcoImpactHub();\n return useQuery({\n queryKey: [...KEY.reports, status ?? 'all', pagination ?? DEFAULT_PAGE],\n queryFn: async () => {\n const result = await ecoQuery<{ ecoListReports: EcoConnection<EcoReport> }>(\n `query EcoListReports($status: EcoReportStatus, $pagination: PaginationInput) {\n ecoListReports(status: $status, pagination: $pagination) {\n items { ${REPORT_FIELDS} }\n pageInfo { cursor hasMore }\n }\n }`,\n { status, pagination: pagination ?? DEFAULT_PAGE },\n apiGatewayUrl\n );\n return result.ecoListReports;\n },\n });\n};\n\nexport const useEcoReport = (id: string | undefined) => {\n const { apiGatewayUrl } = useEcoImpactHub();\n return useQuery({\n queryKey: KEY.report(id ?? ''),\n enabled: Boolean(id),\n queryFn: async () => {\n const result = await ecoQuery<{ ecoReport: EcoReport | null }>(\n `query EcoReport($id: ID!) {\n ecoReport(id: $id) {\n ${REPORT_FIELDS}\n lineItems { ${LINE_ITEM_FIELDS} }\n }\n }`,\n { id },\n apiGatewayUrl\n );\n return result.ecoReport;\n },\n });\n};\n\nexport const useEcoCreateReport = () => {\n const { apiGatewayUrl } = useEcoImpactHub();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (input: EcoCreateReportInput) => {\n const result = await ecoQuery<{ ecoCreateReport: EcoReport }>(\n `mutation EcoCreateReport($input: EcoCreateReportInput!) {\n ecoCreateReport(input: $input) { ${REPORT_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return result.ecoCreateReport;\n },\n onSuccess: () => qc.invalidateQueries({ queryKey: KEY.reports }),\n });\n};\n\nexport const useEcoAddReportLineItem = () => {\n const { apiGatewayUrl } = useEcoImpactHub();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (input: EcoAddReportLineItemInput) => {\n const result = await ecoQuery<{ ecoAddReportLineItem: EcoReportLineItem }>(\n `mutation EcoAddReportLineItem($input: EcoAddReportLineItemInput!) {\n ecoAddReportLineItem(input: $input) { ${LINE_ITEM_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return result.ecoAddReportLineItem;\n },\n onSuccess: (data) => {\n qc.invalidateQueries({ queryKey: KEY.reports });\n qc.invalidateQueries({ queryKey: KEY.report(data.reportId) });\n },\n });\n};\n\nexport const useEcoPublishReport = () => {\n const { apiGatewayUrl } = useEcoImpactHub();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (vars: { id: string; fileId?: string | null }) => {\n const result = await ecoQuery<{ ecoPublishReport: EcoReport }>(\n `mutation EcoPublishReport($id: ID!, $fileId: ID) {\n ecoPublishReport(id: $id, fileId: $fileId) { ${REPORT_FIELDS} }\n }`,\n vars,\n apiGatewayUrl\n );\n return result.ecoPublishReport;\n },\n onSuccess: (data) => {\n qc.invalidateQueries({ queryKey: KEY.reports });\n qc.invalidateQueries({ queryKey: KEY.report(data.id) });\n },\n });\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"useEcoImpactHubApi.js","names":[],"sources":["../../../src/ecoimpacthub/hooks/useEcoImpactHubApi.ts"],"sourcesContent":["/**\n * EcoImpactHub API hooks\n * @module ecoimpacthub/hooks\n *\n * React-Query hooks wired DIRECTLY to the real `wspace-ecoimpacthub-svc`\n * federated GraphQL contract (the `eco*` operations). Every query/mutation\n * below uses an inline gql string whose fields match the svc\n * `.hive-schema.graphql` exactly. No mock data.\n *\n * Transport: `graphqlFetch({ gateway: 'workspace', workspaceToken: true })` —\n * the host shell supplies the gateway base URL + a workspace-scoped token.\n */\n\nimport { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';\nimport { graphqlFetch } from '@burdenoff/fe-libs/shared/graphql';\n\nimport { useEcoImpactHub } from '../context';\nimport type {\n EcoConnection,\n EcoSite,\n EcoSiteStatus,\n EcoSiteType,\n EcoSensor,\n EcoSensorKind,\n EcoSensorStatus,\n EcoMeasurement,\n EcoAlertThreshold,\n EcoSpecies,\n EcoTaxonGroup,\n EcoConservationStatus,\n EcoObservation,\n EcoHabitatProject,\n EcoHabitatProjectStatus,\n EcoRestorationActivity,\n EcoEmissionFactor,\n EcoEmissionScope,\n EcoCarbonEntry,\n EcoCarbonEntryStatus,\n EcoReductionTarget,\n EcoReductionTargetStatus,\n EcoReport,\n EcoReportStatus,\n EcoReportLineItem,\n EcoCreateSiteInput,\n EcoUpdateSiteInput,\n EcoCreateSensorInput,\n EcoRecordMeasurementInput,\n EcoCreateThresholdInput,\n EcoCreateSpeciesInput,\n EcoUpdateSpeciesInput,\n EcoRecordObservationInput,\n EcoCreateHabitatProjectInput,\n EcoLogRestorationActivityInput,\n EcoCreateEmissionFactorInput,\n EcoRecordCarbonEntryInput,\n EcoCreateReductionTargetInput,\n EcoCreateReportInput,\n EcoAddReportLineItemInput,\n EcoRejectReportInput,\n PaginationInput,\n} from '../types';\n\n// ============================================================================\n// Transport\n// ============================================================================\n\n/**\n * fe-libs `graphqlFetch` coalesces `query` responses in an in-memory cache keyed\n * by operationName+variables for ~15s (mutations are never cached). A read\n * issued right after a write (e.g. React-Query refetch triggered by our\n * `invalidateQueries`) would otherwise return the PRE-mutation response until the\n * TTL expires — making just-created/updated rows invisible until a full reload.\n * fe-libs' documented remedy is that write-performing callers clear those caches;\n * we do exactly that (the same maps `clearGraphqlFetchResponseCache` clears)\n * after every eco mutation so every follow-up read is fresh.\n */\ntype GraphqlReadCacheGlobals = {\n __graphqlFetchResponseCache?: { clear: () => void };\n __graphqlFetchPendingResponses?: { clear: () => void };\n __boffGraphQLResponseCache?: { clear: () => void };\n};\n\nconst clearGraphqlReadCaches = (): void => {\n const g = globalThis as GraphqlReadCacheGlobals;\n g.__graphqlFetchResponseCache?.clear();\n g.__graphqlFetchPendingResponses?.clear();\n g.__boffGraphQLResponseCache?.clear();\n};\n\nconst ecoQuery = async <TData>(\n query: string,\n variables: Record<string, unknown>,\n baseUrl?: string\n): Promise<TData> => {\n const response = await graphqlFetch<TData>({\n gateway: 'workspace',\n baseUrl,\n query,\n variables,\n workspaceToken: true,\n });\n\n if (response.errors?.length) {\n throw new Error(response.errors[0]?.message ?? 'GraphQL request failed');\n }\n if (!response.data) {\n throw new Error('GraphQL response did not include data');\n }\n // After a write, drop fe-libs' short-lived read caches so the invalidation\n // refetch that follows reads fresh data instead of the pre-mutation snapshot.\n if (/^\\s*mutation\\b/.test(query)) {\n clearGraphqlReadCaches();\n }\n return response.data;\n};\n\n// React-Query key roots (one namespace per domain entity).\nconst KEY = {\n sites: ['ecoimpacthub', 'sites'] as const,\n site: (id: string) => ['ecoimpacthub', 'site', id] as const,\n sensors: ['ecoimpacthub', 'sensors'] as const,\n measurements: ['ecoimpacthub', 'measurements'] as const,\n thresholds: ['ecoimpacthub', 'thresholds'] as const,\n species: ['ecoimpacthub', 'species'] as const,\n speciesOne: (id: string) => ['ecoimpacthub', 'species', id] as const,\n observations: ['ecoimpacthub', 'observations'] as const,\n habitatProjects: ['ecoimpacthub', 'habitat-projects'] as const,\n habitatProject: (id: string) => ['ecoimpacthub', 'habitat-project', id] as const,\n emissionFactors: ['ecoimpacthub', 'emission-factors'] as const,\n carbonEntries: ['ecoimpacthub', 'carbon-entries'] as const,\n carbonTotals: ['ecoimpacthub', 'carbon-totals'] as const,\n reductionTargets: ['ecoimpacthub', 'reduction-targets'] as const,\n reports: ['ecoimpacthub', 'reports'] as const,\n report: (id: string) => ['ecoimpacthub', 'report', id] as const,\n};\n\nconst DEFAULT_PAGE: PaginationInput = { limit: 50, offset: 0 };\n\n// ============================================================================\n// Reusable gql field selections (codegen-free strictness)\n// ============================================================================\n\nconst SITE_FIELDS = `\n id workspaceId name code type status description latitude longitude\n areaHectares country region createdAt updatedAt\n`;\n\nconst SENSOR_FIELDS = `\n id workspaceId siteId name kind status hardwareId unit lastReadingAt installedAt\n createdAt updatedAt\n`;\n\nconst MEASUREMENT_FIELDS = `\n id workspaceId siteId sensorId parameter value unit source recordedAt isBreach notes\n createdAt updatedAt\n`;\n\nconst THRESHOLD_FIELDS = `\n id workspaceId siteId parameter direction severity limitValue minValue maxValue unit\n isActive createdAt updatedAt\n`;\n\nconst SPECIES_FIELDS = `\n id workspaceId commonName scientificName taxonGroup conservationStatus isPriority\n description createdAt updatedAt\n`;\n\nconst OBSERVATION_FIELDS = `\n id workspaceId speciesId siteId method count observedAt latitude longitude observerId\n notes evidence { id } createdAt updatedAt\n`;\n\nconst HABITAT_FIELDS = `\n id workspaceId name status description siteId targetHectares budgetAmount currency\n managerId startDate endDate completedAt createdAt updatedAt\n`;\n\nconst ACTIVITY_FIELDS = `\n id workspaceId projectId type summary details quantity unit performedAt createdAt updatedAt\n`;\n\nconst FACTOR_FIELDS = `\n id workspaceId name scope activityUnit factorKgco2e source validYear isActive\n createdAt updatedAt\n`;\n\nconst CARBON_FIELDS = `\n id workspaceId siteId factorId scope status category activityValue activityUnit co2eKg\n periodStart notes createdAt updatedAt\n`;\n\nconst TARGET_FIELDS = `\n id workspaceId name status metric baselineYear baselineValue targetYear targetValue unit\n description createdAt updatedAt\n`;\n\nconst REPORT_FIELDS = `\n id workspaceId title framework status periodStart periodEnd summary publishedAt\n workflowRunId approvedBy approvedAt rejectedAt rejectionReason\n file { id } createdAt updatedAt\n`;\n\nconst LINE_ITEM_FIELDS = `\n id workspaceId reportId carbonEntryId label value unit category createdAt updatedAt\n`;\n\n// ============================================================================\n// Sites (Environmental Monitoring)\n// ============================================================================\n\nexport interface SiteFilters {\n status?: EcoSiteStatus;\n type?: EcoSiteType;\n pagination?: PaginationInput;\n}\n\nexport const useEcoSites = (filters: SiteFilters = {}) => {\n const { apiGatewayUrl } = useEcoImpactHub();\n return useQuery({\n queryKey: [...KEY.sites, filters],\n queryFn: async () => {\n const result = await ecoQuery<{ ecoListSites: EcoConnection<EcoSite> }>(\n `query EcoListSites($status: EcoSiteStatus, $type: EcoSiteType, $pagination: PaginationInput) {\n ecoListSites(status: $status, type: $type, pagination: $pagination) {\n items { ${SITE_FIELDS} }\n pageInfo { cursor hasMore }\n }\n }`,\n {\n status: filters.status,\n type: filters.type,\n pagination: filters.pagination ?? DEFAULT_PAGE,\n },\n apiGatewayUrl\n );\n return result.ecoListSites;\n },\n });\n};\n\nexport const useEcoSite = (id: string | undefined) => {\n const { apiGatewayUrl } = useEcoImpactHub();\n return useQuery({\n queryKey: KEY.site(id ?? ''),\n enabled: Boolean(id),\n queryFn: async () => {\n const result = await ecoQuery<{ ecoSite: EcoSite | null }>(\n `query EcoSite($id: ID!) {\n ecoSite(id: $id) {\n ${SITE_FIELDS}\n sensors { ${SENSOR_FIELDS} }\n thresholds { ${THRESHOLD_FIELDS} }\n }\n }`,\n { id },\n apiGatewayUrl\n );\n return result.ecoSite;\n },\n });\n};\n\nexport const useEcoCreateSite = () => {\n const { apiGatewayUrl } = useEcoImpactHub();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (input: EcoCreateSiteInput) => {\n const result = await ecoQuery<{ ecoCreateSite: EcoSite }>(\n `mutation EcoCreateSite($input: EcoCreateSiteInput!) {\n ecoCreateSite(input: $input) { ${SITE_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return result.ecoCreateSite;\n },\n onSuccess: () => qc.invalidateQueries({ queryKey: KEY.sites }),\n });\n};\n\nexport const useEcoUpdateSite = () => {\n const { apiGatewayUrl } = useEcoImpactHub();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (vars: { id: string; input: EcoUpdateSiteInput }) => {\n const result = await ecoQuery<{ ecoUpdateSite: EcoSite }>(\n `mutation EcoUpdateSite($id: ID!, $input: EcoUpdateSiteInput!) {\n ecoUpdateSite(id: $id, input: $input) { ${SITE_FIELDS} }\n }`,\n vars,\n apiGatewayUrl\n );\n return result.ecoUpdateSite;\n },\n onSuccess: (data) => {\n qc.invalidateQueries({ queryKey: KEY.sites });\n qc.invalidateQueries({ queryKey: KEY.site(data.id) });\n },\n });\n};\n\nexport const useEcoArchiveSite = () => {\n const { apiGatewayUrl } = useEcoImpactHub();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (id: string) => {\n const result = await ecoQuery<{ ecoArchiveSite: boolean }>(\n `mutation EcoArchiveSite($id: ID!) { ecoArchiveSite(id: $id) }`,\n { id },\n apiGatewayUrl\n );\n return result.ecoArchiveSite;\n },\n onSuccess: () => qc.invalidateQueries({ queryKey: KEY.sites }),\n });\n};\n\n// ============================================================================\n// Sensors / Measurements / Thresholds (Environmental Monitoring)\n// ============================================================================\n\nexport interface SensorFilters {\n siteId?: string;\n kind?: EcoSensorKind;\n status?: EcoSensorStatus;\n}\n\nexport const useEcoSensors = (filters: SensorFilters = {}) => {\n const { apiGatewayUrl } = useEcoImpactHub();\n return useQuery({\n queryKey: [...KEY.sensors, filters],\n queryFn: async () => {\n const result = await ecoQuery<{ ecoListSensors: EcoConnection<EcoSensor> }>(\n `query EcoListSensors($siteId: ID, $kind: EcoSensorKind, $status: EcoSensorStatus) {\n ecoListSensors(siteId: $siteId, kind: $kind, status: $status) {\n items { ${SENSOR_FIELDS} }\n pageInfo { cursor hasMore }\n }\n }`,\n { siteId: filters.siteId, kind: filters.kind, status: filters.status },\n apiGatewayUrl\n );\n return result.ecoListSensors;\n },\n });\n};\n\nexport const useEcoCreateSensor = () => {\n const { apiGatewayUrl } = useEcoImpactHub();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (input: EcoCreateSensorInput) => {\n const result = await ecoQuery<{ ecoCreateSensor: EcoSensor }>(\n `mutation EcoCreateSensor($input: EcoCreateSensorInput!) {\n ecoCreateSensor(input: $input) { ${SENSOR_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return result.ecoCreateSensor;\n },\n onSuccess: (data) => {\n qc.invalidateQueries({ queryKey: KEY.sensors });\n qc.invalidateQueries({ queryKey: KEY.site(data.siteId) });\n },\n });\n};\n\nexport const useEcoSetSensorStatus = () => {\n const { apiGatewayUrl } = useEcoImpactHub();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (vars: { id: string; status: EcoSensorStatus }) => {\n const result = await ecoQuery<{ ecoSetSensorStatus: EcoSensor }>(\n `mutation EcoSetSensorStatus($id: ID!, $status: EcoSensorStatus!) {\n ecoSetSensorStatus(id: $id, status: $status) { ${SENSOR_FIELDS} }\n }`,\n vars,\n apiGatewayUrl\n );\n return result.ecoSetSensorStatus;\n },\n onSuccess: (data) => {\n qc.invalidateQueries({ queryKey: KEY.sensors });\n qc.invalidateQueries({ queryKey: KEY.site(data.siteId) });\n },\n });\n};\n\nexport interface MeasurementFilters {\n siteId?: string;\n sensorId?: string;\n parameter?: string;\n breachesOnly?: boolean;\n pagination?: PaginationInput;\n}\n\nexport const useEcoMeasurements = (filters: MeasurementFilters = {}) => {\n const { apiGatewayUrl } = useEcoImpactHub();\n return useQuery({\n queryKey: [...KEY.measurements, filters],\n queryFn: async () => {\n const result = await ecoQuery<{ ecoListMeasurements: EcoConnection<EcoMeasurement> }>(\n `query EcoListMeasurements($siteId: ID, $sensorId: ID, $parameter: String, $breachesOnly: Boolean, $pagination: PaginationInput) {\n ecoListMeasurements(siteId: $siteId, sensorId: $sensorId, parameter: $parameter, breachesOnly: $breachesOnly, pagination: $pagination) {\n items { ${MEASUREMENT_FIELDS} }\n pageInfo { cursor hasMore }\n }\n }`,\n {\n siteId: filters.siteId,\n sensorId: filters.sensorId,\n parameter: filters.parameter,\n breachesOnly: filters.breachesOnly,\n pagination: filters.pagination ?? DEFAULT_PAGE,\n },\n apiGatewayUrl\n );\n return result.ecoListMeasurements;\n },\n });\n};\n\nexport const useEcoRecordMeasurement = () => {\n const { apiGatewayUrl } = useEcoImpactHub();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (input: EcoRecordMeasurementInput) => {\n const result = await ecoQuery<{ ecoRecordMeasurement: EcoMeasurement }>(\n `mutation EcoRecordMeasurement($input: EcoRecordMeasurementInput!) {\n ecoRecordMeasurement(input: $input) { ${MEASUREMENT_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return result.ecoRecordMeasurement;\n },\n onSuccess: () => qc.invalidateQueries({ queryKey: KEY.measurements }),\n });\n};\n\nexport const useEcoThresholds = (siteId?: string) => {\n const { apiGatewayUrl } = useEcoImpactHub();\n return useQuery({\n queryKey: [...KEY.thresholds, siteId ?? 'all'],\n queryFn: async () => {\n const result = await ecoQuery<{ ecoListThresholds: EcoConnection<EcoAlertThreshold> }>(\n `query EcoListThresholds($siteId: ID) {\n ecoListThresholds(siteId: $siteId) {\n items { ${THRESHOLD_FIELDS} }\n pageInfo { cursor hasMore }\n }\n }`,\n { siteId },\n apiGatewayUrl\n );\n return result.ecoListThresholds;\n },\n });\n};\n\nexport const useEcoCreateThreshold = () => {\n const { apiGatewayUrl } = useEcoImpactHub();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (input: EcoCreateThresholdInput) => {\n const result = await ecoQuery<{ ecoCreateThreshold: EcoAlertThreshold }>(\n `mutation EcoCreateThreshold($input: EcoCreateThresholdInput!) {\n ecoCreateThreshold(input: $input) { ${THRESHOLD_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return result.ecoCreateThreshold;\n },\n onSuccess: (data) => {\n qc.invalidateQueries({ queryKey: KEY.thresholds });\n qc.invalidateQueries({ queryKey: KEY.site(data.siteId) });\n },\n });\n};\n\nexport const useEcoSetThresholdActive = () => {\n const { apiGatewayUrl } = useEcoImpactHub();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (vars: { id: string; isActive: boolean }) => {\n const result = await ecoQuery<{ ecoSetThresholdActive: EcoAlertThreshold }>(\n `mutation EcoSetThresholdActive($id: ID!, $isActive: Boolean!) {\n ecoSetThresholdActive(id: $id, isActive: $isActive) { ${THRESHOLD_FIELDS} }\n }`,\n vars,\n apiGatewayUrl\n );\n return result.ecoSetThresholdActive;\n },\n onSuccess: () => qc.invalidateQueries({ queryKey: KEY.thresholds }),\n });\n};\n\n// ============================================================================\n// Species / Observations / Habitat (Conservation)\n// ============================================================================\n\nexport interface SpeciesFilters {\n taxonGroup?: EcoTaxonGroup;\n conservationStatus?: EcoConservationStatus;\n priorityOnly?: boolean;\n pagination?: PaginationInput;\n}\n\nexport const useEcoSpecies = (filters: SpeciesFilters = {}) => {\n const { apiGatewayUrl } = useEcoImpactHub();\n return useQuery({\n queryKey: [...KEY.species, filters],\n queryFn: async () => {\n const result = await ecoQuery<{ ecoListSpecies: EcoConnection<EcoSpecies> }>(\n `query EcoListSpecies($taxonGroup: EcoTaxonGroup, $conservationStatus: EcoConservationStatus, $priorityOnly: Boolean, $pagination: PaginationInput) {\n ecoListSpecies(taxonGroup: $taxonGroup, conservationStatus: $conservationStatus, priorityOnly: $priorityOnly, pagination: $pagination) {\n items { ${SPECIES_FIELDS} }\n pageInfo { cursor hasMore }\n }\n }`,\n {\n taxonGroup: filters.taxonGroup,\n conservationStatus: filters.conservationStatus,\n priorityOnly: filters.priorityOnly,\n pagination: filters.pagination ?? DEFAULT_PAGE,\n },\n apiGatewayUrl\n );\n return result.ecoListSpecies;\n },\n });\n};\n\nexport const useEcoSpeciesDetail = (id: string | undefined) => {\n const { apiGatewayUrl } = useEcoImpactHub();\n return useQuery({\n queryKey: KEY.speciesOne(id ?? ''),\n enabled: Boolean(id),\n queryFn: async () => {\n const result = await ecoQuery<{ ecoSpecies: EcoSpecies | null }>(\n `query EcoSpeciesDetail($id: ID!) {\n ecoSpecies(id: $id) {\n ${SPECIES_FIELDS}\n observations { ${OBSERVATION_FIELDS} }\n }\n }`,\n { id },\n apiGatewayUrl\n );\n return result.ecoSpecies;\n },\n });\n};\n\nexport const useEcoCreateSpecies = () => {\n const { apiGatewayUrl } = useEcoImpactHub();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (input: EcoCreateSpeciesInput) => {\n const result = await ecoQuery<{ ecoCreateSpecies: EcoSpecies }>(\n `mutation EcoCreateSpecies($input: EcoCreateSpeciesInput!) {\n ecoCreateSpecies(input: $input) { ${SPECIES_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return result.ecoCreateSpecies;\n },\n onSuccess: () => qc.invalidateQueries({ queryKey: KEY.species }),\n });\n};\n\nexport const useEcoUpdateSpecies = () => {\n const { apiGatewayUrl } = useEcoImpactHub();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (vars: { id: string; input: EcoUpdateSpeciesInput }) => {\n const result = await ecoQuery<{ ecoUpdateSpecies: EcoSpecies }>(\n `mutation EcoUpdateSpecies($id: ID!, $input: EcoUpdateSpeciesInput!) {\n ecoUpdateSpecies(id: $id, input: $input) { ${SPECIES_FIELDS} }\n }`,\n vars,\n apiGatewayUrl\n );\n return result.ecoUpdateSpecies;\n },\n onSuccess: (data) => {\n qc.invalidateQueries({ queryKey: KEY.species });\n qc.invalidateQueries({ queryKey: KEY.speciesOne(data.id) });\n },\n });\n};\n\nexport const useEcoArchiveSpecies = () => {\n const { apiGatewayUrl } = useEcoImpactHub();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (id: string) => {\n const result = await ecoQuery<{ ecoArchiveSpecies: boolean }>(\n `mutation EcoArchiveSpecies($id: ID!) { ecoArchiveSpecies(id: $id) }`,\n { id },\n apiGatewayUrl\n );\n return result.ecoArchiveSpecies;\n },\n onSuccess: () => qc.invalidateQueries({ queryKey: KEY.species }),\n });\n};\n\nexport interface ObservationFilters {\n speciesId?: string;\n siteId?: string;\n pagination?: PaginationInput;\n}\n\nexport const useEcoObservations = (filters: ObservationFilters = {}) => {\n const { apiGatewayUrl } = useEcoImpactHub();\n return useQuery({\n queryKey: [...KEY.observations, filters],\n queryFn: async () => {\n const result = await ecoQuery<{ ecoListObservations: EcoConnection<EcoObservation> }>(\n `query EcoListObservations($speciesId: ID, $siteId: ID, $pagination: PaginationInput) {\n ecoListObservations(speciesId: $speciesId, siteId: $siteId, pagination: $pagination) {\n items { ${OBSERVATION_FIELDS} species { id commonName scientificName taxonGroup } }\n pageInfo { cursor hasMore }\n }\n }`,\n {\n speciesId: filters.speciesId,\n siteId: filters.siteId,\n pagination: filters.pagination ?? DEFAULT_PAGE,\n },\n apiGatewayUrl\n );\n return result.ecoListObservations;\n },\n });\n};\n\nexport const useEcoRecordObservation = () => {\n const { apiGatewayUrl } = useEcoImpactHub();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (input: EcoRecordObservationInput) => {\n const result = await ecoQuery<{ ecoRecordObservation: EcoObservation }>(\n `mutation EcoRecordObservation($input: EcoRecordObservationInput!) {\n ecoRecordObservation(input: $input) { ${OBSERVATION_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return result.ecoRecordObservation;\n },\n onSuccess: (data) => {\n qc.invalidateQueries({ queryKey: KEY.observations });\n qc.invalidateQueries({ queryKey: KEY.speciesOne(data.speciesId) });\n },\n });\n};\n\nexport const useEcoHabitatProjects = (status?: EcoHabitatProjectStatus) => {\n const { apiGatewayUrl } = useEcoImpactHub();\n return useQuery({\n queryKey: [...KEY.habitatProjects, status ?? 'all'],\n queryFn: async () => {\n const result = await ecoQuery<{ ecoListHabitatProjects: EcoConnection<EcoHabitatProject> }>(\n `query EcoListHabitatProjects($status: EcoHabitatProjectStatus) {\n ecoListHabitatProjects(status: $status) {\n items { ${HABITAT_FIELDS} }\n pageInfo { cursor hasMore }\n }\n }`,\n { status },\n apiGatewayUrl\n );\n return result.ecoListHabitatProjects;\n },\n });\n};\n\nexport const useEcoHabitatProject = (id: string | undefined) => {\n const { apiGatewayUrl } = useEcoImpactHub();\n return useQuery({\n queryKey: KEY.habitatProject(id ?? ''),\n enabled: Boolean(id),\n queryFn: async () => {\n const result = await ecoQuery<{ ecoHabitatProject: EcoHabitatProject | null }>(\n `query EcoHabitatProject($id: ID!) {\n ecoHabitatProject(id: $id) {\n ${HABITAT_FIELDS}\n activities { ${ACTIVITY_FIELDS} }\n }\n }`,\n { id },\n apiGatewayUrl\n );\n return result.ecoHabitatProject;\n },\n });\n};\n\nexport const useEcoCreateHabitatProject = () => {\n const { apiGatewayUrl } = useEcoImpactHub();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (input: EcoCreateHabitatProjectInput) => {\n const result = await ecoQuery<{ ecoCreateHabitatProject: EcoHabitatProject }>(\n `mutation EcoCreateHabitatProject($input: EcoCreateHabitatProjectInput!) {\n ecoCreateHabitatProject(input: $input) { ${HABITAT_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return result.ecoCreateHabitatProject;\n },\n onSuccess: () => qc.invalidateQueries({ queryKey: KEY.habitatProjects }),\n });\n};\n\nexport const useEcoTransitionHabitatProject = () => {\n const { apiGatewayUrl } = useEcoImpactHub();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (vars: { id: string; status: EcoHabitatProjectStatus }) => {\n const result = await ecoQuery<{ ecoTransitionHabitatProject: EcoHabitatProject }>(\n `mutation EcoTransitionHabitatProject($id: ID!, $status: EcoHabitatProjectStatus!) {\n ecoTransitionHabitatProject(id: $id, status: $status) { ${HABITAT_FIELDS} }\n }`,\n vars,\n apiGatewayUrl\n );\n return result.ecoTransitionHabitatProject;\n },\n onSuccess: (data) => {\n qc.invalidateQueries({ queryKey: KEY.habitatProjects });\n qc.invalidateQueries({ queryKey: KEY.habitatProject(data.id) });\n },\n });\n};\n\nexport const useEcoLogRestorationActivity = () => {\n const { apiGatewayUrl } = useEcoImpactHub();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (input: EcoLogRestorationActivityInput) => {\n const result = await ecoQuery<{ ecoLogRestorationActivity: EcoRestorationActivity }>(\n `mutation EcoLogRestorationActivity($input: EcoLogRestorationActivityInput!) {\n ecoLogRestorationActivity(input: $input) { ${ACTIVITY_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return result.ecoLogRestorationActivity;\n },\n onSuccess: (data) => qc.invalidateQueries({ queryKey: KEY.habitatProject(data.projectId) }),\n });\n};\n\n// ============================================================================\n// Carbon ledger / Emission factors / Reduction targets (Sustainability)\n// ============================================================================\n\nexport const useEcoEmissionFactors = (scope?: EcoEmissionScope, activeOnly?: boolean) => {\n const { apiGatewayUrl } = useEcoImpactHub();\n return useQuery({\n queryKey: [...KEY.emissionFactors, scope ?? 'all', activeOnly ?? false],\n queryFn: async () => {\n const result = await ecoQuery<{ ecoListEmissionFactors: EcoConnection<EcoEmissionFactor> }>(\n `query EcoListEmissionFactors($scope: EcoEmissionScope, $activeOnly: Boolean) {\n ecoListEmissionFactors(scope: $scope, activeOnly: $activeOnly) {\n items { ${FACTOR_FIELDS} }\n pageInfo { cursor hasMore }\n }\n }`,\n { scope, activeOnly },\n apiGatewayUrl\n );\n return result.ecoListEmissionFactors;\n },\n });\n};\n\nexport const useEcoCreateEmissionFactor = () => {\n const { apiGatewayUrl } = useEcoImpactHub();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (input: EcoCreateEmissionFactorInput) => {\n const result = await ecoQuery<{ ecoCreateEmissionFactor: EcoEmissionFactor }>(\n `mutation EcoCreateEmissionFactor($input: EcoCreateEmissionFactorInput!) {\n ecoCreateEmissionFactor(input: $input) { ${FACTOR_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return result.ecoCreateEmissionFactor;\n },\n onSuccess: () => qc.invalidateQueries({ queryKey: KEY.emissionFactors }),\n });\n};\n\nexport interface CarbonEntryFilters {\n scope?: EcoEmissionScope;\n siteId?: string;\n status?: EcoCarbonEntryStatus;\n pagination?: PaginationInput;\n}\n\nexport const useEcoCarbonEntries = (filters: CarbonEntryFilters = {}) => {\n const { apiGatewayUrl } = useEcoImpactHub();\n return useQuery({\n queryKey: [...KEY.carbonEntries, filters],\n queryFn: async () => {\n const result = await ecoQuery<{ ecoListCarbonEntries: EcoConnection<EcoCarbonEntry> }>(\n `query EcoListCarbonEntries($scope: EcoEmissionScope, $siteId: ID, $status: EcoCarbonEntryStatus, $pagination: PaginationInput) {\n ecoListCarbonEntries(scope: $scope, siteId: $siteId, status: $status, pagination: $pagination) {\n items { ${CARBON_FIELDS} factor { id name factorKgco2e activityUnit } }\n pageInfo { cursor hasMore }\n }\n }`,\n {\n scope: filters.scope,\n siteId: filters.siteId,\n status: filters.status,\n pagination: filters.pagination ?? DEFAULT_PAGE,\n },\n apiGatewayUrl\n );\n return result.ecoListCarbonEntries;\n },\n });\n};\n\n/** Total CO2e by scope + grand total, in one aliased query. */\nexport interface EcoCarbonTotals {\n total: number;\n scope1: number;\n scope2: number;\n scope3: number;\n}\n\nexport const useEcoCarbonTotals = (siteId?: string) => {\n const { apiGatewayUrl } = useEcoImpactHub();\n return useQuery({\n queryKey: [...KEY.carbonTotals, siteId ?? 'all'],\n queryFn: async (): Promise<EcoCarbonTotals> => {\n const result = await ecoQuery<{\n total: number;\n scope1: number;\n scope2: number;\n scope3: number;\n }>(\n `query EcoCarbonTotals($siteId: ID) {\n total: ecoCarbonTotalKg(siteId: $siteId)\n scope1: ecoCarbonTotalKg(scope: SCOPE_1, siteId: $siteId)\n scope2: ecoCarbonTotalKg(scope: SCOPE_2, siteId: $siteId)\n scope3: ecoCarbonTotalKg(scope: SCOPE_3, siteId: $siteId)\n }`,\n { siteId },\n apiGatewayUrl\n );\n return result;\n },\n });\n};\n\nexport const useEcoRecordCarbonEntry = () => {\n const { apiGatewayUrl } = useEcoImpactHub();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (input: EcoRecordCarbonEntryInput) => {\n const result = await ecoQuery<{ ecoRecordCarbonEntry: EcoCarbonEntry }>(\n `mutation EcoRecordCarbonEntry($input: EcoRecordCarbonEntryInput!) {\n ecoRecordCarbonEntry(input: $input) { ${CARBON_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return result.ecoRecordCarbonEntry;\n },\n onSuccess: () => {\n qc.invalidateQueries({ queryKey: KEY.carbonEntries });\n qc.invalidateQueries({ queryKey: KEY.carbonTotals });\n },\n });\n};\n\nexport const useEcoVerifyCarbonEntry = () => {\n const { apiGatewayUrl } = useEcoImpactHub();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (id: string) => {\n const result = await ecoQuery<{ ecoVerifyCarbonEntry: EcoCarbonEntry }>(\n `mutation EcoVerifyCarbonEntry($id: ID!) {\n ecoVerifyCarbonEntry(id: $id) { ${CARBON_FIELDS} }\n }`,\n { id },\n apiGatewayUrl\n );\n return result.ecoVerifyCarbonEntry;\n },\n onSuccess: () => qc.invalidateQueries({ queryKey: KEY.carbonEntries }),\n });\n};\n\nexport const useEcoReductionTargets = (status?: EcoReductionTargetStatus) => {\n const { apiGatewayUrl } = useEcoImpactHub();\n return useQuery({\n queryKey: [...KEY.reductionTargets, status ?? 'all'],\n queryFn: async () => {\n const result = await ecoQuery<{ ecoListReductionTargets: EcoConnection<EcoReductionTarget> }>(\n `query EcoListReductionTargets($status: EcoReductionTargetStatus) {\n ecoListReductionTargets(status: $status) {\n items { ${TARGET_FIELDS} }\n pageInfo { cursor hasMore }\n }\n }`,\n { status },\n apiGatewayUrl\n );\n return result.ecoListReductionTargets;\n },\n });\n};\n\nexport const useEcoCreateReductionTarget = () => {\n const { apiGatewayUrl } = useEcoImpactHub();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (input: EcoCreateReductionTargetInput) => {\n const result = await ecoQuery<{ ecoCreateReductionTarget: EcoReductionTarget }>(\n `mutation EcoCreateReductionTarget($input: EcoCreateReductionTargetInput!) {\n ecoCreateReductionTarget(input: $input) { ${TARGET_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return result.ecoCreateReductionTarget;\n },\n onSuccess: () => qc.invalidateQueries({ queryKey: KEY.reductionTargets }),\n });\n};\n\nexport const useEcoSetReductionTargetStatus = () => {\n const { apiGatewayUrl } = useEcoImpactHub();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (vars: { id: string; status: EcoReductionTargetStatus }) => {\n const result = await ecoQuery<{ ecoSetReductionTargetStatus: EcoReductionTarget }>(\n `mutation EcoSetReductionTargetStatus($id: ID!, $status: EcoReductionTargetStatus!) {\n ecoSetReductionTargetStatus(id: $id, status: $status) { ${TARGET_FIELDS} }\n }`,\n vars,\n apiGatewayUrl\n );\n return result.ecoSetReductionTargetStatus;\n },\n onSuccess: () => qc.invalidateQueries({ queryKey: KEY.reductionTargets }),\n });\n};\n\n// ============================================================================\n// Reports (Sustainability & Reporting)\n// ============================================================================\n\nexport const useEcoReports = (status?: EcoReportStatus, pagination?: PaginationInput) => {\n const { apiGatewayUrl } = useEcoImpactHub();\n return useQuery({\n queryKey: [...KEY.reports, status ?? 'all', pagination ?? DEFAULT_PAGE],\n queryFn: async () => {\n const result = await ecoQuery<{ ecoListReports: EcoConnection<EcoReport> }>(\n `query EcoListReports($status: EcoReportStatus, $pagination: PaginationInput) {\n ecoListReports(status: $status, pagination: $pagination) {\n items { ${REPORT_FIELDS} }\n pageInfo { cursor hasMore }\n }\n }`,\n { status, pagination: pagination ?? DEFAULT_PAGE },\n apiGatewayUrl\n );\n return result.ecoListReports;\n },\n });\n};\n\nexport const useEcoReport = (id: string | undefined) => {\n const { apiGatewayUrl } = useEcoImpactHub();\n return useQuery({\n queryKey: KEY.report(id ?? ''),\n enabled: Boolean(id),\n queryFn: async () => {\n const result = await ecoQuery<{ ecoReport: EcoReport | null }>(\n `query EcoReport($id: ID!) {\n ecoReport(id: $id) {\n ${REPORT_FIELDS}\n lineItems { ${LINE_ITEM_FIELDS} }\n }\n }`,\n { id },\n apiGatewayUrl\n );\n return result.ecoReport;\n },\n });\n};\n\nexport const useEcoCreateReport = () => {\n const { apiGatewayUrl } = useEcoImpactHub();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (input: EcoCreateReportInput) => {\n const result = await ecoQuery<{ ecoCreateReport: EcoReport }>(\n `mutation EcoCreateReport($input: EcoCreateReportInput!) {\n ecoCreateReport(input: $input) { ${REPORT_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return result.ecoCreateReport;\n },\n onSuccess: () => qc.invalidateQueries({ queryKey: KEY.reports }),\n });\n};\n\nexport const useEcoAddReportLineItem = () => {\n const { apiGatewayUrl } = useEcoImpactHub();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (input: EcoAddReportLineItemInput) => {\n const result = await ecoQuery<{ ecoAddReportLineItem: EcoReportLineItem }>(\n `mutation EcoAddReportLineItem($input: EcoAddReportLineItemInput!) {\n ecoAddReportLineItem(input: $input) { ${LINE_ITEM_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return result.ecoAddReportLineItem;\n },\n onSuccess: (data) => {\n qc.invalidateQueries({ queryKey: KEY.reports });\n qc.invalidateQueries({ queryKey: KEY.report(data.reportId) });\n },\n });\n};\n\nexport const useEcoPublishReport = () => {\n const { apiGatewayUrl } = useEcoImpactHub();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (vars: { id: string; fileId?: string | null }) => {\n const result = await ecoQuery<{ ecoPublishReport: EcoReport }>(\n `mutation EcoPublishReport($id: ID!, $fileId: ID) {\n ecoPublishReport(id: $id, fileId: $fileId) { ${REPORT_FIELDS} }\n }`,\n vars,\n apiGatewayUrl\n );\n return result.ecoPublishReport;\n },\n onSuccess: (data) => {\n qc.invalidateQueries({ queryKey: KEY.reports });\n qc.invalidateQueries({ queryKey: KEY.report(data.id) });\n },\n });\n};\n\nexport const useEcoSubmitReportForApproval = () => {\n const { apiGatewayUrl } = useEcoImpactHub();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (id: string) => {\n const result = await ecoQuery<{ ecoSubmitReportForApproval: EcoReport }>(\n `mutation EcoSubmitReportForApproval($id: ID!) {\n ecoSubmitReportForApproval(id: $id) { ${REPORT_FIELDS} }\n }`,\n { id },\n apiGatewayUrl\n );\n return result.ecoSubmitReportForApproval;\n },\n onSuccess: (data) => {\n qc.invalidateQueries({ queryKey: KEY.reports });\n qc.invalidateQueries({ queryKey: KEY.report(data.id) });\n },\n });\n};\n\nexport const useEcoApproveReport = () => {\n const { apiGatewayUrl } = useEcoImpactHub();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (id: string) => {\n const result = await ecoQuery<{ ecoApproveReport: EcoReport }>(\n `mutation EcoApproveReport($id: ID!) {\n ecoApproveReport(id: $id) { ${REPORT_FIELDS} }\n }`,\n { id },\n apiGatewayUrl\n );\n return result.ecoApproveReport;\n },\n onSuccess: (data) => {\n qc.invalidateQueries({ queryKey: KEY.reports });\n qc.invalidateQueries({ queryKey: KEY.report(data.id) });\n },\n });\n};\n\nexport const useEcoRejectReport = () => {\n const { apiGatewayUrl } = useEcoImpactHub();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (input: EcoRejectReportInput) => {\n const result = await ecoQuery<{ ecoRejectReport: EcoReport }>(\n `mutation EcoRejectReport($input: EcoRejectReportInput!) {\n ecoRejectReport(input: $input) { ${REPORT_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return result.ecoRejectReport;\n },\n onSuccess: (data) => {\n qc.invalidateQueries({ queryKey: KEY.reports });\n qc.invalidateQueries({ queryKey: KEY.report(data.id) });\n },\n });\n};\n"],"mappings":"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"}
@@ -273,6 +273,11 @@ export interface EcoReport {
273
273
  summary?: string | null;
274
274
  file?: EcoFileRef | null;
275
275
  publishedAt?: string | null;
276
+ workflowRunId?: string | null;
277
+ approvedBy?: string | null;
278
+ approvedAt?: string | null;
279
+ rejectedAt?: string | null;
280
+ rejectionReason?: string | null;
276
281
  lineItems?: EcoReportLineItem[];
277
282
  createdAt: string;
278
283
  updatedAt: string;
@@ -414,4 +419,8 @@ export interface EcoAddReportLineItemInput {
414
419
  category?: string | null;
415
420
  carbonEntryId?: string | null;
416
421
  }
422
+ export interface EcoRejectReportInput {
423
+ reportId: string;
424
+ reason: string;
425
+ }
417
426
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/ecoimpacthub/types/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/ecoimpacthub/types/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@burdenoff/microfe-ecoimpacthub",
3
- "version": "2026.819.1",
3
+ "version": "2026.819.3",
4
4
  "description": "Burdenoff EcoImpactHub Microfrontend",
5
5
  "type": "module",
6
6
  "files": [