@carlonicora/nextjs-jsonapi 6.19.0 → 6.20.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{BlockNoteEditor-5HSL74IX.mjs → BlockNoteEditor-S7EVHYWT.mjs} +5 -5
- package/dist/{BlockNoteEditor-6RZXGMSD.js → BlockNoteEditor-V76V5XFY.js} +20 -20
- package/dist/{BlockNoteEditor-6RZXGMSD.js.map → BlockNoteEditor-V76V5XFY.js.map} +1 -1
- package/dist/{BlockNoteViewer-X4UEVI2A.mjs → BlockNoteViewer-G3L46SGQ.mjs} +3 -3
- package/dist/{BlockNoteViewer-XYKFY77F.js → BlockNoteViewer-ZFJ3DZXN.js} +4 -4
- package/dist/{BlockNoteViewer-XYKFY77F.js.map → BlockNoteViewer-ZFJ3DZXN.js.map} +1 -1
- package/dist/{analytics.modules-Bsacu6ik.d.ts → analytics.modules-C4OT7fVa.d.ts} +1 -0
- package/dist/{analytics.modules-txdCLNG-.d.mts → analytics.modules-DEnXnRGt.d.mts} +1 -0
- package/dist/billing/index.js +492 -492
- package/dist/billing/index.mjs +4 -4
- package/dist/{chunk-I5BQLY7V.js → chunk-2CR7HWVS.js} +9 -9
- package/dist/{chunk-I5BQLY7V.js.map → chunk-2CR7HWVS.js.map} +1 -1
- package/dist/{chunk-B4ZH2FOC.js → chunk-2CXF5XBU.js} +906 -906
- package/dist/{chunk-B4ZH2FOC.js.map → chunk-2CXF5XBU.js.map} +1 -1
- package/dist/{chunk-KMPBSOFB.mjs → chunk-4GB35M62.mjs} +50 -2
- package/dist/chunk-4GB35M62.mjs.map +1 -0
- package/dist/{chunk-OO2DBP6L.js → chunk-CMNJENSJ.js} +942 -894
- package/dist/chunk-CMNJENSJ.js.map +1 -0
- package/dist/{chunk-OKBJEIOP.mjs → chunk-JSHLBRFV.mjs} +35 -6
- package/dist/chunk-JSHLBRFV.mjs.map +1 -0
- package/dist/{chunk-TY5YWBLL.mjs → chunk-QSNZ6HPY.mjs} +3 -3
- package/dist/{chunk-HEDHJAKT.mjs → chunk-QWQZUFFA.mjs} +6 -6
- package/dist/{chunk-DFA566KY.js → chunk-SFDOUTEV.js} +4 -4
- package/dist/{chunk-DFA566KY.js.map → chunk-SFDOUTEV.js.map} +1 -1
- package/dist/{chunk-YVKWACDP.mjs → chunk-WU3UXTDS.mjs} +2 -2
- package/dist/{chunk-YVKWACDP.mjs.map → chunk-WU3UXTDS.mjs.map} +1 -1
- package/dist/{chunk-A7Y5YW7Q.js → chunk-YWLSIIE6.js} +47 -18
- package/dist/chunk-YWLSIIE6.js.map +1 -0
- package/dist/client/index.js +5 -5
- package/dist/client/index.mjs +4 -4
- package/dist/components/index.js +5 -5
- package/dist/components/index.mjs +4 -4
- package/dist/contexts/index.js +5 -5
- package/dist/contexts/index.mjs +4 -4
- package/dist/core/index.d.mts +2 -1
- package/dist/core/index.d.ts +2 -1
- package/dist/core/index.js +3 -3
- package/dist/core/index.mjs +2 -2
- package/dist/email-automations/index.js +118 -118
- package/dist/email-automations/index.mjs +4 -4
- package/dist/features/analytics/index.d.mts +60 -3
- package/dist/features/analytics/index.d.ts +60 -3
- package/dist/features/analytics/index.js +320 -128
- package/dist/features/analytics/index.js.map +1 -1
- package/dist/features/analytics/index.mjs +314 -122
- package/dist/features/analytics/index.mjs.map +1 -1
- package/dist/features/analytics/server.js +5 -5
- package/dist/features/analytics/server.mjs +3 -3
- package/dist/features/blog/index.js +151 -151
- package/dist/features/blog/index.mjs +4 -4
- package/dist/features/blog/server.js +17 -17
- package/dist/features/blog/server.mjs +2 -2
- package/dist/features/help/index.js +38 -38
- package/dist/features/help/index.mjs +4 -4
- package/dist/features/tokenusage/index.js +127 -127
- package/dist/features/tokenusage/index.mjs +4 -4
- package/dist/index.d.mts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +4 -4
- package/dist/index.mjs +3 -3
- package/dist/offline/index.d.mts +7 -3
- package/dist/offline/index.d.ts +7 -3
- package/dist/offline/index.js +77 -32
- package/dist/offline/index.js.map +1 -1
- package/dist/offline/index.mjs +65 -20
- package/dist/offline/index.mjs.map +1 -1
- package/dist/server/index.d.mts +4 -3
- package/dist/server/index.d.ts +4 -3
- package/dist/server/index.js +4 -4
- package/dist/server/index.mjs +3 -3
- package/messages/en.json +8 -0
- package/messages/it.json +8 -0
- package/package.json +1 -1
- package/pwa/sw.js +17 -1
- package/src/core/factories/RehydrationFactory.ts +47 -5
- package/src/core/factories/__tests__/RehydrationFactory.spec.ts +78 -0
- package/src/core/registry/ModuleRegistry.ts +1 -0
- package/src/features/analytics/analytics.modules.ts +6 -0
- package/src/features/analytics/components/AnalyticsAdminContainer.tsx +20 -0
- package/src/features/analytics/components/AnalyticsDailyUniquesChart.tsx +224 -0
- package/src/features/analytics/components/__tests__/AnalyticsDailyUniquesChart.spec.tsx +88 -0
- package/src/features/analytics/components/__tests__/AnalyticsPageContainers.spec.tsx +22 -0
- package/src/features/analytics/contexts/AnalyticsAdminContext.tsx +15 -2
- package/src/features/analytics/contexts/__tests__/AnalyticsAdminContext.spec.tsx +38 -0
- package/src/features/analytics/data/AnalyticsAdminService.ts +20 -0
- package/src/features/analytics/data/__tests__/AnalyticsAdminService.spec.ts +15 -0
- package/src/features/analytics/data/__tests__/models.spec.ts +29 -0
- package/src/features/analytics/data/analytics-daily-unique-timeline.interface.ts +11 -0
- package/src/features/analytics/data/analytics-daily-unique-timeline.ts +53 -0
- package/src/features/analytics/data/analytics.types.ts +10 -0
- package/src/features/analytics/data/index.ts +2 -0
- package/src/features/analytics/i18n-keys.ts +8 -0
- package/src/features/analytics/index.ts +1 -0
- package/src/offline/server/build-offline-manifest.ts +4 -3
- package/src/offline/sync/__tests__/sync-root.spec.ts +88 -8
- package/src/offline/sync/sync-root.ts +79 -23
- package/src/pwa/__tests__/sw.spec.ts +33 -3
- package/dist/chunk-A7Y5YW7Q.js.map +0 -1
- package/dist/chunk-KMPBSOFB.mjs.map +0 -1
- package/dist/chunk-OKBJEIOP.mjs.map +0 -1
- package/dist/chunk-OO2DBP6L.js.map +0 -1
- /package/dist/{BlockNoteEditor-5HSL74IX.mjs.map → BlockNoteEditor-S7EVHYWT.mjs.map} +0 -0
- /package/dist/{BlockNoteViewer-X4UEVI2A.mjs.map → BlockNoteViewer-G3L46SGQ.mjs.map} +0 -0
- /package/dist/{chunk-TY5YWBLL.mjs.map → chunk-QSNZ6HPY.mjs.map} +0 -0
- /package/dist/{chunk-HEDHJAKT.mjs.map → chunk-QWQZUFFA.mjs.map} +0 -0
|
@@ -31,9 +31,9 @@
|
|
|
31
31
|
|
|
32
32
|
|
|
33
33
|
|
|
34
|
-
var
|
|
34
|
+
var _chunk2CXF5XBUjs = require('../../chunk-2CXF5XBU.js');
|
|
35
35
|
require('../../chunk-3EPNHTMH.js');
|
|
36
|
-
require('../../chunk-
|
|
36
|
+
require('../../chunk-2CR7HWVS.js');
|
|
37
37
|
require('../../chunk-G4JR3SFV.js');
|
|
38
38
|
|
|
39
39
|
|
|
@@ -45,12 +45,14 @@ require('../../chunk-G4JR3SFV.js');
|
|
|
45
45
|
|
|
46
46
|
|
|
47
47
|
|
|
48
|
-
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
var _chunkCMNJENSJjs = require('../../chunk-CMNJENSJ.js');
|
|
49
51
|
require('../../chunk-DGN3PR2F.js');
|
|
50
52
|
|
|
51
53
|
|
|
52
54
|
|
|
53
|
-
var
|
|
55
|
+
var _chunkYWLSIIE6js = require('../../chunk-YWLSIIE6.js');
|
|
54
56
|
require('../../chunk-KV4N7DEG.js');
|
|
55
57
|
require('../../chunk-WCEYT3GG.js');
|
|
56
58
|
require('../../chunk-WUNSG3IN.js');
|
|
@@ -66,7 +68,7 @@ var _react = require('react');
|
|
|
66
68
|
var _uuid = require('uuid');
|
|
67
69
|
|
|
68
70
|
// src/features/analytics/data/AnalyticsService.ts
|
|
69
|
-
var AnalyticsService = class extends
|
|
71
|
+
var AnalyticsService = class extends _chunkCMNJENSJjs.AbstractService {
|
|
70
72
|
static {
|
|
71
73
|
_chunk7QVYU63Ejs.__name.call(void 0, this, "AnalyticsService");
|
|
72
74
|
}
|
|
@@ -78,9 +80,9 @@ var AnalyticsService = class extends _chunkOO2DBP6Ljs.AbstractService {
|
|
|
78
80
|
static async track(input) {
|
|
79
81
|
try {
|
|
80
82
|
await this.callApi({
|
|
81
|
-
type:
|
|
83
|
+
type: _chunkYWLSIIE6js.Modules.AnalyticsEvent,
|
|
82
84
|
method: "POST" /* POST */,
|
|
83
|
-
endpoint: new (0,
|
|
85
|
+
endpoint: new (0, _chunkYWLSIIE6js.EndpointCreator)({ endpoint: _chunkYWLSIIE6js.Modules.AnalyticsEvent }).generate(),
|
|
84
86
|
input,
|
|
85
87
|
suppressGlobalError: true
|
|
86
88
|
});
|
|
@@ -229,7 +231,7 @@ function AnalyticsAdminFilterBar({ section, granularity, onChange }) {
|
|
|
229
231
|
};
|
|
230
232
|
return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex flex-wrap items-center gap-2", children: [
|
|
231
233
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "max-md:w-full max-md:[&_#date]:w-full", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
232
|
-
|
|
234
|
+
_chunk2CXF5XBUjs.DateRangeSelector,
|
|
233
235
|
{
|
|
234
236
|
onDateChange: (range) => {
|
|
235
237
|
if (!_optionalChain([range, 'optionalAccess', _ => _.from]) || !_optionalChain([range, 'optionalAccess', _2 => _2.to])) return;
|
|
@@ -273,13 +275,13 @@ function Segmented({
|
|
|
273
275
|
children: options.map((option) => {
|
|
274
276
|
const selected = option.value === value;
|
|
275
277
|
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
276
|
-
|
|
278
|
+
_chunk2CXF5XBUjs.Button,
|
|
277
279
|
{
|
|
278
280
|
type: "button",
|
|
279
281
|
size: "sm",
|
|
280
282
|
variant: selected ? "default" : "ghost",
|
|
281
283
|
"aria-pressed": selected,
|
|
282
|
-
className:
|
|
284
|
+
className: _chunkCMNJENSJjs.cn.call(void 0, !selected && "text-muted-foreground"),
|
|
283
285
|
onClick: () => onSelect(option.value),
|
|
284
286
|
children: option.label
|
|
285
287
|
},
|
|
@@ -299,45 +301,59 @@ function withFilters(endpoint, filters) {
|
|
|
299
301
|
return endpoint;
|
|
300
302
|
}
|
|
301
303
|
_chunk7QVYU63Ejs.__name.call(void 0, withFilters, "withFilters");
|
|
302
|
-
var AnalyticsAdminService = class extends
|
|
304
|
+
var AnalyticsAdminService = class extends _chunkCMNJENSJjs.AbstractService {
|
|
303
305
|
static {
|
|
304
306
|
_chunk7QVYU63Ejs.__name.call(void 0, this, "AnalyticsAdminService");
|
|
305
307
|
}
|
|
306
308
|
/** Headline tiles: one row per window (current, previous). */
|
|
307
309
|
static async getSummary(filters) {
|
|
308
|
-
const endpoint = withFilters(new (0,
|
|
310
|
+
const endpoint = withFilters(new (0, _chunkYWLSIIE6js.EndpointCreator)({ endpoint: _chunkYWLSIIE6js.Modules.AnalyticsSummary }), filters);
|
|
309
311
|
return this.callApi({
|
|
310
|
-
type:
|
|
312
|
+
type: _chunkYWLSIIE6js.Modules.AnalyticsSummary,
|
|
311
313
|
method: "GET" /* GET */,
|
|
312
314
|
endpoint: endpoint.generate()
|
|
313
315
|
});
|
|
314
316
|
}
|
|
315
317
|
static async getTimeline(params) {
|
|
316
|
-
const endpoint = withFilters(new (0,
|
|
318
|
+
const endpoint = withFilters(new (0, _chunkYWLSIIE6js.EndpointCreator)({ endpoint: _chunkYWLSIIE6js.Modules.AnalyticsTimeline }), params);
|
|
317
319
|
endpoint.addAdditionalParam("granularity", params.granularity);
|
|
318
320
|
return this.callApi({
|
|
319
|
-
type:
|
|
321
|
+
type: _chunkYWLSIIE6js.Modules.AnalyticsTimeline,
|
|
322
|
+
method: "GET" /* GET */,
|
|
323
|
+
endpoint: endpoint.generate()
|
|
324
|
+
});
|
|
325
|
+
}
|
|
326
|
+
/**
|
|
327
|
+
* One row per calendar day from fromDate to toDate (YYYY-MM-DD, local dates).
|
|
328
|
+
* Always daily and never filtered by section, so it skips withFilters.
|
|
329
|
+
*/
|
|
330
|
+
static async getDailyUniques(params) {
|
|
331
|
+
const endpoint = new (0, _chunkYWLSIIE6js.EndpointCreator)({ endpoint: _chunkYWLSIIE6js.Modules.AnalyticsDailyUniqueTimeline });
|
|
332
|
+
endpoint.addAdditionalParam("fromDate", params.fromDate);
|
|
333
|
+
endpoint.addAdditionalParam("toDate", params.toDate);
|
|
334
|
+
return this.callApi({
|
|
335
|
+
type: _chunkYWLSIIE6js.Modules.AnalyticsDailyUniqueTimeline,
|
|
320
336
|
method: "GET" /* GET */,
|
|
321
337
|
endpoint: endpoint.generate()
|
|
322
338
|
});
|
|
323
339
|
}
|
|
324
340
|
static async getBreakdown(params) {
|
|
325
|
-
const endpoint = withFilters(new (0,
|
|
341
|
+
const endpoint = withFilters(new (0, _chunkYWLSIIE6js.EndpointCreator)({ endpoint: _chunkYWLSIIE6js.Modules.AnalyticsBreakdown }), params);
|
|
326
342
|
endpoint.addAdditionalParam("dimension", params.dimension);
|
|
327
343
|
if (params.limit !== void 0) endpoint.addAdditionalParam("limit", String(params.limit));
|
|
328
344
|
return this.callApi({
|
|
329
|
-
type:
|
|
345
|
+
type: _chunkYWLSIIE6js.Modules.AnalyticsBreakdown,
|
|
330
346
|
method: "GET" /* GET */,
|
|
331
347
|
endpoint: endpoint.generate()
|
|
332
348
|
});
|
|
333
349
|
}
|
|
334
350
|
/** Newest sessions first, cursor-paginated through `next`. */
|
|
335
351
|
static async getSessions(params) {
|
|
336
|
-
const endpoint = withFilters(new (0,
|
|
352
|
+
const endpoint = withFilters(new (0, _chunkYWLSIIE6js.EndpointCreator)({ endpoint: _chunkYWLSIIE6js.Modules.AnalyticsSession }), params);
|
|
337
353
|
if (params.visitorId) endpoint.addAdditionalParam("visitorId", params.visitorId);
|
|
338
354
|
if (params.userId) endpoint.addAdditionalParam("userId", params.userId);
|
|
339
355
|
return this.callApi({
|
|
340
|
-
type:
|
|
356
|
+
type: _chunkYWLSIIE6js.Modules.AnalyticsSession,
|
|
341
357
|
method: "GET" /* GET */,
|
|
342
358
|
endpoint: endpoint.generate(),
|
|
343
359
|
next: params.next
|
|
@@ -345,20 +361,20 @@ var AnalyticsAdminService = class extends _chunkOO2DBP6Ljs.AbstractService {
|
|
|
345
361
|
}
|
|
346
362
|
static async getSession(params) {
|
|
347
363
|
return this.callApi({
|
|
348
|
-
type:
|
|
364
|
+
type: _chunkYWLSIIE6js.Modules.AnalyticsSession,
|
|
349
365
|
method: "GET" /* GET */,
|
|
350
|
-
endpoint: new (0,
|
|
366
|
+
endpoint: new (0, _chunkYWLSIIE6js.EndpointCreator)({ endpoint: _chunkYWLSIIE6js.Modules.AnalyticsSession, id: params.id }).generate()
|
|
351
367
|
});
|
|
352
368
|
}
|
|
353
369
|
/** The journey: every page view of one session, oldest first. */
|
|
354
370
|
static async getSessionPageViews(params) {
|
|
355
371
|
return this.callApi({
|
|
356
|
-
type:
|
|
372
|
+
type: _chunkYWLSIIE6js.Modules.AnalyticsPageView,
|
|
357
373
|
method: "GET" /* GET */,
|
|
358
|
-
endpoint: new (0,
|
|
359
|
-
endpoint:
|
|
374
|
+
endpoint: new (0, _chunkYWLSIIE6js.EndpointCreator)({
|
|
375
|
+
endpoint: _chunkYWLSIIE6js.Modules.AnalyticsSession,
|
|
360
376
|
id: params.sessionId,
|
|
361
|
-
childEndpoint:
|
|
377
|
+
childEndpoint: _chunkYWLSIIE6js.Modules.AnalyticsPageView
|
|
362
378
|
}).generate()
|
|
363
379
|
});
|
|
364
380
|
}
|
|
@@ -404,6 +420,7 @@ var AnalyticsAdminProvider = /* @__PURE__ */ _chunk7QVYU63Ejs.__name.call(void 0
|
|
|
404
420
|
const [timeline, setTimeline] = _react.useState.call(void 0, []);
|
|
405
421
|
const [breakdowns, setBreakdowns] = _react.useState.call(void 0, EMPTY_BREAKDOWNS);
|
|
406
422
|
const [sessions, setSessions] = _react.useState.call(void 0, []);
|
|
423
|
+
const [dailyUniques, setDailyUniques] = _react.useState.call(void 0, []);
|
|
407
424
|
const [sessionsNextPage, setSessionsNextPage] = _react.useState.call(void 0, void 0);
|
|
408
425
|
const [isLoading, setIsLoading] = _react.useState.call(void 0, true);
|
|
409
426
|
const [error, setError] = _react.useState.call(void 0, null);
|
|
@@ -422,8 +439,14 @@ var AnalyticsAdminProvider = /* @__PURE__ */ _chunk7QVYU63Ejs.__name.call(void 0
|
|
|
422
439
|
(dimension) => AnalyticsAdminService.getBreakdown({ ...base, dimension, limit: BREAKDOWN_LIMIT })
|
|
423
440
|
)
|
|
424
441
|
),
|
|
425
|
-
AnalyticsAdminService.getSessions({ ...base, next: sessionsNext })
|
|
426
|
-
|
|
442
|
+
AnalyticsAdminService.getSessions({ ...base, next: sessionsNext }),
|
|
443
|
+
// The local calendar days the admin picked: the picker emits local-midnight
|
|
444
|
+
// instants, so slicing the UTC instant would shift the range a day east of UTC.
|
|
445
|
+
AnalyticsAdminService.getDailyUniques({
|
|
446
|
+
fromDate: _chunkCMNJENSJjs.formatLocalDate.call(void 0, new Date(from)),
|
|
447
|
+
toDate: _chunkCMNJENSJjs.formatLocalDate.call(void 0, new Date(to))
|
|
448
|
+
})
|
|
449
|
+
]).then(([nextSummary, nextTimeline, nextBreakdowns, nextSessions, nextDailyUniques]) => {
|
|
427
450
|
if (cancelled) return;
|
|
428
451
|
setSummary(_nullishCoalesce(nextSummary, () => ( [])));
|
|
429
452
|
setTimeline(_nullishCoalesce(nextTimeline, () => ( [])));
|
|
@@ -434,6 +457,7 @@ var AnalyticsAdminProvider = /* @__PURE__ */ _chunk7QVYU63Ejs.__name.call(void 0
|
|
|
434
457
|
);
|
|
435
458
|
setSessions(_nullishCoalesce(nextSessions, () => ( [])));
|
|
436
459
|
setSessionsNextPage(sessionsNext.next);
|
|
460
|
+
setDailyUniques(_nullishCoalesce(nextDailyUniques, () => ( [])));
|
|
437
461
|
}).catch((err) => {
|
|
438
462
|
if (cancelled) return;
|
|
439
463
|
console.error("Failed to load analytics:", err);
|
|
@@ -454,7 +478,7 @@ var AnalyticsAdminProvider = /* @__PURE__ */ _chunk7QVYU63Ejs.__name.call(void 0
|
|
|
454
478
|
const sessionsNext = {};
|
|
455
479
|
try {
|
|
456
480
|
const nextSessions = await AnalyticsAdminService.next({
|
|
457
|
-
type:
|
|
481
|
+
type: _chunkYWLSIIE6js.Modules.AnalyticsSession,
|
|
458
482
|
endpoint: sessionsNextPage,
|
|
459
483
|
next: sessionsNext
|
|
460
484
|
});
|
|
@@ -487,6 +511,7 @@ var AnalyticsAdminProvider = /* @__PURE__ */ _chunk7QVYU63Ejs.__name.call(void 0
|
|
|
487
511
|
timeline,
|
|
488
512
|
breakdowns,
|
|
489
513
|
sessions,
|
|
514
|
+
dailyUniques,
|
|
490
515
|
filters,
|
|
491
516
|
setFilters,
|
|
492
517
|
loadMoreSessions,
|
|
@@ -500,6 +525,7 @@ var AnalyticsAdminProvider = /* @__PURE__ */ _chunk7QVYU63Ejs.__name.call(void 0
|
|
|
500
525
|
timeline,
|
|
501
526
|
breakdowns,
|
|
502
527
|
sessions,
|
|
528
|
+
dailyUniques,
|
|
503
529
|
filters,
|
|
504
530
|
setFilters,
|
|
505
531
|
loadMoreSessions,
|
|
@@ -509,7 +535,7 @@ var AnalyticsAdminProvider = /* @__PURE__ */ _chunk7QVYU63Ejs.__name.call(void 0
|
|
|
509
535
|
error
|
|
510
536
|
]
|
|
511
537
|
);
|
|
512
|
-
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
538
|
+
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk2CXF5XBUjs.SharedProvider, { value: { breadcrumbs: breadcrumb(), title: title() }, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, AnalyticsAdminContext.Provider, { value: contextValue, children }) });
|
|
513
539
|
}, "AnalyticsAdminProvider");
|
|
514
540
|
var useAnalyticsAdmin = /* @__PURE__ */ _chunk7QVYU63Ejs.__name.call(void 0, () => {
|
|
515
541
|
const ctx = _react.useContext.call(void 0, AnalyticsAdminContext);
|
|
@@ -529,7 +555,7 @@ var _lucidereact = require('lucide-react');
|
|
|
529
555
|
var ZERO = { visitors: 0, sessions: 0, pageViews: 0, pagesPerSession: 0, consentShare: 0 };
|
|
530
556
|
function AnalyticsAdminTiles({ summary }) {
|
|
531
557
|
const t = _nextintl.useTranslations.call(void 0, );
|
|
532
|
-
const { decimal } =
|
|
558
|
+
const { decimal } = _chunk2CXF5XBUjs.useUsageFormatters.call(void 0, );
|
|
533
559
|
const rowFor = /* @__PURE__ */ _chunk7QVYU63Ejs.__name.call(void 0, (window2) => _nullishCoalesce(summary.find((r) => r.section === "total" && r.window === window2), () => ( ZERO)), "rowFor");
|
|
534
560
|
const current = rowFor("current");
|
|
535
561
|
const previous = rowFor("previous");
|
|
@@ -542,7 +568,7 @@ function AnalyticsAdminTiles({ summary }) {
|
|
|
542
568
|
testId: "analytics-tile-visitors",
|
|
543
569
|
label: t("analytics.admin.tiles.visitors"),
|
|
544
570
|
value: decimal(current.visitors, 0),
|
|
545
|
-
delta:
|
|
571
|
+
delta: _chunk2CXF5XBUjs.percentageDelta.call(void 0, current.visitors, previous.visitors),
|
|
546
572
|
previousLabel,
|
|
547
573
|
decimal
|
|
548
574
|
}
|
|
@@ -553,7 +579,7 @@ function AnalyticsAdminTiles({ summary }) {
|
|
|
553
579
|
testId: "analytics-tile-sessions",
|
|
554
580
|
label: t("analytics.admin.tiles.sessions"),
|
|
555
581
|
value: decimal(current.sessions, 0),
|
|
556
|
-
delta:
|
|
582
|
+
delta: _chunk2CXF5XBUjs.percentageDelta.call(void 0, current.sessions, previous.sessions),
|
|
557
583
|
previousLabel,
|
|
558
584
|
decimal
|
|
559
585
|
}
|
|
@@ -564,7 +590,7 @@ function AnalyticsAdminTiles({ summary }) {
|
|
|
564
590
|
testId: "analytics-tile-page-views",
|
|
565
591
|
label: t("analytics.admin.tiles.page_views"),
|
|
566
592
|
value: decimal(current.pageViews, 0),
|
|
567
|
-
delta:
|
|
593
|
+
delta: _chunk2CXF5XBUjs.percentageDelta.call(void 0, current.pageViews, previous.pageViews),
|
|
568
594
|
previousLabel,
|
|
569
595
|
decimal
|
|
570
596
|
}
|
|
@@ -577,7 +603,7 @@ function AnalyticsAdminTiles({ summary }) {
|
|
|
577
603
|
testId: "analytics-tile-pages-per-session",
|
|
578
604
|
label: t("analytics.admin.tiles.pages_per_session"),
|
|
579
605
|
value: decimal(current.pagesPerSession, 1),
|
|
580
|
-
delta:
|
|
606
|
+
delta: _chunk2CXF5XBUjs.percentageDelta.call(void 0, current.pagesPerSession, previous.pagesPerSession),
|
|
581
607
|
decimal
|
|
582
608
|
}
|
|
583
609
|
),
|
|
@@ -602,8 +628,8 @@ function LeadTile({
|
|
|
602
628
|
previousLabel,
|
|
603
629
|
decimal
|
|
604
630
|
}) {
|
|
605
|
-
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
606
|
-
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
631
|
+
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk2CXF5XBUjs.Card, { "data-testid": testId, children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunk2CXF5XBUjs.CardContent, { className: "grid gap-1", children: [
|
|
632
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk2CXF5XBUjs.MicroLabel, { children: label }),
|
|
607
633
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "text-primary text-xl font-semibold tabular-nums", children: value }),
|
|
608
634
|
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "span", { className: "flex items-center gap-1", children: [
|
|
609
635
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, Delta, { testId: `${testId}-delta`, delta, decimal }),
|
|
@@ -619,8 +645,8 @@ function SupportingTile({
|
|
|
619
645
|
delta,
|
|
620
646
|
decimal
|
|
621
647
|
}) {
|
|
622
|
-
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
623
|
-
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
648
|
+
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk2CXF5XBUjs.Card, { "data-testid": testId, size: "sm", children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunk2CXF5XBUjs.CardContent, { className: "grid gap-1", children: [
|
|
649
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk2CXF5XBUjs.MicroLabel, { children: label }),
|
|
624
650
|
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "span", { className: "flex items-center gap-2", children: [
|
|
625
651
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "text-sm font-medium tabular-nums", children: value }),
|
|
626
652
|
delta !== void 0 && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, Delta, { testId: `${testId}-delta`, delta, decimal })
|
|
@@ -643,7 +669,7 @@ function Delta({
|
|
|
643
669
|
"span",
|
|
644
670
|
{
|
|
645
671
|
"data-testid": testId,
|
|
646
|
-
className:
|
|
672
|
+
className: _chunkCMNJENSJjs.cn.call(void 0,
|
|
647
673
|
"inline-flex items-center gap-0.5 text-xs tabular-nums",
|
|
648
674
|
increased ? "text-success" : "text-destructive"
|
|
649
675
|
),
|
|
@@ -671,15 +697,15 @@ function AnalyticsBreakdownTable({ breakdowns }) {
|
|
|
671
697
|
route: t("analytics.admin.dimensions.route"),
|
|
672
698
|
landing: t("analytics.admin.dimensions.landing")
|
|
673
699
|
};
|
|
674
|
-
return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
|
|
675
|
-
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
676
|
-
ANALYTICS_DIMENSIONS.map((dimension) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
700
|
+
return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunk2CXF5XBUjs.Tabs, { defaultValue: ANALYTICS_DIMENSIONS[0], children: [
|
|
701
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk2CXF5XBUjs.TabsList, { className: "max-md:w-full max-md:justify-start max-md:overflow-x-auto", children: ANALYTICS_DIMENSIONS.map((dimension) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk2CXF5XBUjs.TabsTrigger, { value: dimension, children: labels[dimension] }, dimension)) }),
|
|
702
|
+
ANALYTICS_DIMENSIONS.map((dimension) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk2CXF5XBUjs.TabsContent, { value: dimension, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, BreakdownRows, { rows: _nullishCoalesce(breakdowns[dimension], () => ( [])) }) }, dimension))
|
|
677
703
|
] });
|
|
678
704
|
}
|
|
679
705
|
_chunk7QVYU63Ejs.__name.call(void 0, AnalyticsBreakdownTable, "AnalyticsBreakdownTable");
|
|
680
706
|
function BreakdownRows({ rows }) {
|
|
681
707
|
const t = _nextintl.useTranslations.call(void 0, );
|
|
682
|
-
const { decimal } =
|
|
708
|
+
const { decimal } = _chunk2CXF5XBUjs.useUsageFormatters.call(void 0, );
|
|
683
709
|
const sortedRows = _react.useMemo.call(void 0, () => [...rows].sort((a, b) => b.visitors - a.visitors), [rows]);
|
|
684
710
|
if (sortedRows.length === 0) {
|
|
685
711
|
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "p", { className: "text-muted-foreground text-sm", children: t("analytics.admin.no_data") });
|
|
@@ -688,24 +714,172 @@ function BreakdownRows({ rows }) {
|
|
|
688
714
|
// The package's <Table> wraps itself in an `overflow-x-clip` container, which
|
|
689
715
|
// would swallow the overflow before this scroller ever saw it — hence the
|
|
690
716
|
// child override. Wide tables must scroll, never widen the page.
|
|
691
|
-
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "overflow-x-auto [&_[data-slot=table-container]]:overflow-x-visible", children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
|
|
692
|
-
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
693
|
-
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
694
|
-
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
695
|
-
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
696
|
-
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
717
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "overflow-x-auto [&_[data-slot=table-container]]:overflow-x-visible", children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunk2CXF5XBUjs.Table, { children: [
|
|
718
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk2CXF5XBUjs.TableHeader, { children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunk2CXF5XBUjs.TableRow, { children: [
|
|
719
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk2CXF5XBUjs.TableHead, { className: "text-xs font-medium", children: t("analytics.admin.columns.key") }),
|
|
720
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk2CXF5XBUjs.TableHead, { className: "text-end text-xs font-medium", children: t("analytics.admin.columns.visitors") }),
|
|
721
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk2CXF5XBUjs.TableHead, { className: "text-end text-xs font-medium", children: t("analytics.admin.columns.sessions") }),
|
|
722
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk2CXF5XBUjs.TableHead, { className: "text-end text-xs font-medium", children: t("analytics.admin.columns.page_views") })
|
|
697
723
|
] }) }),
|
|
698
|
-
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
699
|
-
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
700
|
-
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
701
|
-
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
702
|
-
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
724
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk2CXF5XBUjs.TableBody, { children: sortedRows.map((row) => /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunk2CXF5XBUjs.TableRow, { "data-testid": `analytics-breakdown-row-${row.id}`, children: [
|
|
725
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk2CXF5XBUjs.TableCell, { className: "text-xs", children: row.key === OTHER_KEY ? t("analytics.admin.other") : row.key }),
|
|
726
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk2CXF5XBUjs.TableCell, { className: "text-end text-xs tabular-nums", children: decimal(row.visitors, 0) }),
|
|
727
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk2CXF5XBUjs.TableCell, { className: "text-end text-xs tabular-nums", children: decimal(row.sessions, 0) }),
|
|
728
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk2CXF5XBUjs.TableCell, { className: "text-end text-xs tabular-nums", children: decimal(row.pageViews, 0) })
|
|
703
729
|
] }, row.id)) })
|
|
704
730
|
] }) })
|
|
705
731
|
);
|
|
706
732
|
}
|
|
707
733
|
_chunk7QVYU63Ejs.__name.call(void 0, BreakdownRows, "BreakdownRows");
|
|
708
734
|
|
|
735
|
+
// src/features/analytics/components/AnalyticsDailyUniquesChart.tsx
|
|
736
|
+
|
|
737
|
+
var _nextthemes = require('next-themes');
|
|
738
|
+
|
|
739
|
+
var _recharts = require('recharts');
|
|
740
|
+
|
|
741
|
+
var METRIC_SLOT = { visitors: 0, users: 2 };
|
|
742
|
+
var DOT_RADIUS = 4;
|
|
743
|
+
var bucketKey = /* @__PURE__ */ _chunk7QVYU63Ejs.__name.call(void 0, (date) => {
|
|
744
|
+
const y = date.getUTCFullYear();
|
|
745
|
+
const m = `${date.getUTCMonth() + 1}`.padStart(2, "0");
|
|
746
|
+
const d = `${date.getUTCDate()}`.padStart(2, "0");
|
|
747
|
+
return `${y}-${m}-${d}`;
|
|
748
|
+
}, "bucketKey");
|
|
749
|
+
function buildDailyUniquesSeries(rows, metric, todayKey) {
|
|
750
|
+
const entries = rows.map((row) => {
|
|
751
|
+
const day = bucketKey(row.day);
|
|
752
|
+
const value = _nullishCoalesce(row[metric], () => ( null));
|
|
753
|
+
return { day, value, line: value, todayLine: null, isToday: day === todayKey };
|
|
754
|
+
});
|
|
755
|
+
const last = entries.length - 1;
|
|
756
|
+
if (last >= 1 && entries[last].isToday && entries[last].value !== null && entries[last - 1].value !== null) {
|
|
757
|
+
entries[last - 1].todayLine = entries[last - 1].value;
|
|
758
|
+
entries[last].todayLine = entries[last].value;
|
|
759
|
+
entries[last].line = null;
|
|
760
|
+
}
|
|
761
|
+
return entries;
|
|
762
|
+
}
|
|
763
|
+
_chunk7QVYU63Ejs.__name.call(void 0, buildDailyUniquesSeries, "buildDailyUniquesSeries");
|
|
764
|
+
function AnalyticsDailyUniquesChart({ rows, metric, className }) {
|
|
765
|
+
const t = _nextintl.useTranslations.call(void 0, );
|
|
766
|
+
const { compact, bucketDate, decimal } = _chunk2CXF5XBUjs.useUsageFormatters.call(void 0, );
|
|
767
|
+
const { resolvedTheme } = _nextthemes.useTheme.call(void 0, );
|
|
768
|
+
const mode = resolvedTheme === "dark" ? "dark" : "light";
|
|
769
|
+
const color = _chunk2CXF5XBUjs.seriesColor.call(void 0, METRIC_SLOT[metric], mode);
|
|
770
|
+
const chartData = _react.useMemo.call(void 0, () => buildDailyUniquesSeries(rows, metric, bucketKey(/* @__PURE__ */ new Date())), [rows, metric]);
|
|
771
|
+
const points = _react.useMemo.call(void 0, () => chartData.map(({ day, value }) => ({ day, value })), [chartData]);
|
|
772
|
+
const seriesLabel = t(`analytics.admin.daily_uniques.${metric}`);
|
|
773
|
+
const chartConfig = _react.useMemo.call(void 0, () => ({ line: { label: seriesLabel, color } }), [seriesLabel, color]);
|
|
774
|
+
if (chartData.length === 0) {
|
|
775
|
+
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "p", { className: className ? `text-muted-foreground text-xs ${className}` : "text-muted-foreground text-xs", children: t("analytics.admin.no_data") });
|
|
776
|
+
}
|
|
777
|
+
const renderDot = /* @__PURE__ */ _chunk7QVYU63Ejs.__name.call(void 0, ({ cx, cy, index, payload }) => {
|
|
778
|
+
if (cx == null || cy == null || _optionalChain([payload, 'optionalAccess', _3 => _3.value]) == null) return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "g", {}, `dot-${index}`);
|
|
779
|
+
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
780
|
+
"circle",
|
|
781
|
+
{
|
|
782
|
+
cx,
|
|
783
|
+
cy,
|
|
784
|
+
r: DOT_RADIUS,
|
|
785
|
+
fill: payload.isToday ? "var(--card)" : color,
|
|
786
|
+
stroke: payload.isToday ? color : "var(--card)",
|
|
787
|
+
strokeWidth: 2
|
|
788
|
+
},
|
|
789
|
+
`dot-${index}`
|
|
790
|
+
);
|
|
791
|
+
}, "renderDot");
|
|
792
|
+
const renderTodayDot = /* @__PURE__ */ _chunk7QVYU63Ejs.__name.call(void 0, (props) => _optionalChain([props, 'access', _4 => _4.payload, 'optionalAccess', _5 => _5.isToday]) ? renderDot(props) : /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "g", {}, `today-dot-${props.index}`), "renderTodayDot");
|
|
793
|
+
return (
|
|
794
|
+
// The chart is a coordinate system, not prose: it stays an LTR island.
|
|
795
|
+
// rtl-ok: deliberate LTR island (chart)
|
|
796
|
+
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className, dir: "ltr", children: [
|
|
797
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "sr-only", "data-testid": `analytics-daily-${metric}-data`, children: JSON.stringify(points) }),
|
|
798
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk2CXF5XBUjs.ChartContainer, { config: chartConfig, className: "aspect-auto h-72 w-full", children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _recharts.LineChart, { accessibilityLayer: true, data: chartData, margin: { top: 8, right: 16, bottom: 0, left: 0 }, children: [
|
|
799
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _recharts.CartesianGrid, { vertical: false }),
|
|
800
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
801
|
+
_recharts.XAxis,
|
|
802
|
+
{
|
|
803
|
+
dataKey: "day",
|
|
804
|
+
tickLine: false,
|
|
805
|
+
axisLine: false,
|
|
806
|
+
tickMargin: 8,
|
|
807
|
+
minTickGap: 16,
|
|
808
|
+
tickFormatter: (value) => bucketDate(value, "day")
|
|
809
|
+
}
|
|
810
|
+
),
|
|
811
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
812
|
+
_recharts.YAxis,
|
|
813
|
+
{
|
|
814
|
+
domain: [0, "auto"],
|
|
815
|
+
allowDecimals: false,
|
|
816
|
+
tickLine: false,
|
|
817
|
+
axisLine: false,
|
|
818
|
+
tickMargin: 8,
|
|
819
|
+
width: 48,
|
|
820
|
+
tickFormatter: (value) => compact(value)
|
|
821
|
+
}
|
|
822
|
+
),
|
|
823
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
824
|
+
_chunk2CXF5XBUjs.ChartTooltip,
|
|
825
|
+
{
|
|
826
|
+
filterNull: false,
|
|
827
|
+
content: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
828
|
+
_chunk2CXF5XBUjs.ChartTooltipContent,
|
|
829
|
+
{
|
|
830
|
+
labelFormatter: (value, payload) => {
|
|
831
|
+
const entry = _optionalChain([payload, 'optionalAccess', _6 => _6[0], 'optionalAccess', _7 => _7.payload]);
|
|
832
|
+
return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment, { children: [
|
|
833
|
+
bucketDate(String(value), "day"),
|
|
834
|
+
_optionalChain([entry, 'optionalAccess', _8 => _8.isToday]) && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "text-muted-foreground text-xs", children: t("analytics.admin.daily_uniques.today") })
|
|
835
|
+
] });
|
|
836
|
+
},
|
|
837
|
+
formatter: (_value, _name, item) => {
|
|
838
|
+
const entry = item.payload;
|
|
839
|
+
return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex flex-1 justify-between gap-4 leading-none", children: [
|
|
840
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "text-muted-foreground", children: seriesLabel }),
|
|
841
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "text-xs tabular-nums text-end", children: entry.value === null ? t("analytics.admin.daily_uniques.no_data") : decimal(entry.value, 0) })
|
|
842
|
+
] });
|
|
843
|
+
}
|
|
844
|
+
}
|
|
845
|
+
)
|
|
846
|
+
}
|
|
847
|
+
),
|
|
848
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
849
|
+
_recharts.Line,
|
|
850
|
+
{
|
|
851
|
+
dataKey: "line",
|
|
852
|
+
type: "linear",
|
|
853
|
+
stroke: color,
|
|
854
|
+
strokeWidth: 2,
|
|
855
|
+
connectNulls: false,
|
|
856
|
+
dot: renderDot,
|
|
857
|
+
activeDot: { r: DOT_RADIUS, strokeWidth: 2, stroke: "var(--card)" },
|
|
858
|
+
isAnimationActive: false
|
|
859
|
+
}
|
|
860
|
+
),
|
|
861
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
862
|
+
_recharts.Line,
|
|
863
|
+
{
|
|
864
|
+
dataKey: "todayLine",
|
|
865
|
+
type: "linear",
|
|
866
|
+
stroke: color,
|
|
867
|
+
strokeWidth: 2,
|
|
868
|
+
strokeDasharray: "2 5",
|
|
869
|
+
connectNulls: false,
|
|
870
|
+
dot: renderTodayDot,
|
|
871
|
+
activeDot: false,
|
|
872
|
+
tooltipType: "none",
|
|
873
|
+
legendType: "none",
|
|
874
|
+
isAnimationActive: false
|
|
875
|
+
}
|
|
876
|
+
)
|
|
877
|
+
] }) })
|
|
878
|
+
] })
|
|
879
|
+
);
|
|
880
|
+
}
|
|
881
|
+
_chunk7QVYU63Ejs.__name.call(void 0, AnalyticsDailyUniquesChart, "AnalyticsDailyUniquesChart");
|
|
882
|
+
|
|
709
883
|
// src/features/analytics/components/AnalyticsSessionsTable.tsx
|
|
710
884
|
|
|
711
885
|
|
|
@@ -714,60 +888,60 @@ var VISITOR_SUFFIX_LENGTH = 6;
|
|
|
714
888
|
function AnalyticsSessionsTable({ rows, sessionPageUrl, onLoadMore, hasMore }) {
|
|
715
889
|
const t = _nextintl.useTranslations.call(void 0, );
|
|
716
890
|
const locale = _nextintl.useLocale.call(void 0, );
|
|
717
|
-
const generateUrl =
|
|
718
|
-
const { decimal } =
|
|
891
|
+
const generateUrl = _chunk2CXF5XBUjs.usePageUrlGenerator.call(void 0, );
|
|
892
|
+
const { decimal } = _chunk2CXF5XBUjs.useUsageFormatters.call(void 0, );
|
|
719
893
|
const dateTime = _react.useMemo.call(void 0, () => new Intl.DateTimeFormat(locale, { dateStyle: "short", timeStyle: "short" }), [locale]);
|
|
720
894
|
if (rows.length === 0) {
|
|
721
895
|
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "p", { className: "text-muted-foreground text-sm", children: t("analytics.admin.no_data") });
|
|
722
896
|
}
|
|
723
897
|
return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex flex-col gap-3", children: [
|
|
724
|
-
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "overflow-x-auto [&_[data-slot=table-container]]:overflow-x-visible", children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
|
|
725
|
-
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
726
|
-
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
727
|
-
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
728
|
-
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
729
|
-
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
730
|
-
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
731
|
-
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
898
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "overflow-x-auto [&_[data-slot=table-container]]:overflow-x-visible", children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunk2CXF5XBUjs.Table, { children: [
|
|
899
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk2CXF5XBUjs.TableHeader, { children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunk2CXF5XBUjs.TableRow, { children: [
|
|
900
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk2CXF5XBUjs.TableHead, { className: "text-xs font-medium", children: t("analytics.admin.columns.started") }),
|
|
901
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk2CXF5XBUjs.TableHead, { className: "text-xs font-medium", children: t("analytics.admin.columns.visitor") }),
|
|
902
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk2CXF5XBUjs.TableHead, { className: "text-xs font-medium", children: t("analytics.admin.columns.source") }),
|
|
903
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk2CXF5XBUjs.TableHead, { className: "text-xs font-medium", children: t("analytics.admin.columns.landing") }),
|
|
904
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk2CXF5XBUjs.TableHead, { className: "text-end text-xs font-medium", children: t("analytics.admin.columns.pages") }),
|
|
905
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk2CXF5XBUjs.TableHead, { className: "text-xs font-medium", children: t("analytics.admin.columns.device") })
|
|
732
906
|
] }) }),
|
|
733
|
-
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
907
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk2CXF5XBUjs.TableBody, { children: rows.map((row) => {
|
|
734
908
|
const source = [_nullishCoalesce(row.utmSource, () => ( row.referrerHost)), row.utmMedium].filter(Boolean).join(" / ");
|
|
735
|
-
return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
|
|
736
|
-
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
737
|
-
|
|
909
|
+
return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunk2CXF5XBUjs.TableRow, { "data-testid": `analytics-session-row-${row.id}`, children: [
|
|
910
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk2CXF5XBUjs.TableCell, { className: "text-xs tabular-nums", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
911
|
+
_chunk2CXF5XBUjs.Link,
|
|
738
912
|
{
|
|
739
913
|
href: generateUrl({ page: sessionPageUrl, id: row.id }),
|
|
740
914
|
"data-testid": `analytics-session-link-${row.id}`,
|
|
741
915
|
children: dateTime.format(row.startedAt)
|
|
742
916
|
}
|
|
743
917
|
) }),
|
|
744
|
-
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
918
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk2CXF5XBUjs.TableCell, { className: "text-xs", children: row.user ? /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "span", { className: "flex flex-col", children: [
|
|
745
919
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { children: row.user.name }),
|
|
746
920
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "text-muted-foreground text-xs", children: row.user.email })
|
|
747
921
|
] }) : /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "span", { className: "flex items-center gap-2", children: [
|
|
748
|
-
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
922
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk2CXF5XBUjs.Badge, { variant: "softGray", children: t("analytics.admin.anonymous") }),
|
|
749
923
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "text-muted-foreground text-xs tabular-nums", children: row.visitorId.slice(-VISITOR_SUFFIX_LENGTH) })
|
|
750
924
|
] }) }),
|
|
751
|
-
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
752
|
-
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
753
|
-
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
754
|
-
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
925
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk2CXF5XBUjs.TableCell, { className: "text-xs", children: source }),
|
|
926
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk2CXF5XBUjs.TableCell, { className: "text-xs", children: row.landingRoute }),
|
|
927
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk2CXF5XBUjs.TableCell, { className: "text-end text-xs tabular-nums", children: decimal(row.pageViews, 0) }),
|
|
928
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk2CXF5XBUjs.TableCell, { className: "text-muted-foreground text-xs", children: row.deviceType })
|
|
755
929
|
] }, row.id);
|
|
756
930
|
}) })
|
|
757
931
|
] }) }),
|
|
758
|
-
hasMore && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "flex justify-center", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
932
|
+
hasMore && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "flex justify-center", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk2CXF5XBUjs.Button, { type: "button", variant: "outline", size: "sm", onClick: onLoadMore, children: t("analytics.admin.load_more") }) })
|
|
759
933
|
] });
|
|
760
934
|
}
|
|
761
935
|
_chunk7QVYU63Ejs.__name.call(void 0, AnalyticsSessionsTable, "AnalyticsSessionsTable");
|
|
762
936
|
|
|
763
937
|
// src/features/analytics/components/AnalyticsTimelineChart.tsx
|
|
764
938
|
|
|
765
|
-
var _nextthemes = require('next-themes');
|
|
766
939
|
|
|
767
|
-
|
|
940
|
+
|
|
941
|
+
|
|
768
942
|
|
|
769
943
|
var SERIES = ["visitors", "pageViews"];
|
|
770
|
-
var
|
|
944
|
+
var bucketKey2 = /* @__PURE__ */ _chunk7QVYU63Ejs.__name.call(void 0, (date) => {
|
|
771
945
|
const y = date.getUTCFullYear();
|
|
772
946
|
const m = `${date.getUTCMonth() + 1}`.padStart(2, "0");
|
|
773
947
|
const d = `${date.getUTCDate()}`.padStart(2, "0");
|
|
@@ -787,13 +961,13 @@ var inferGranularity = /* @__PURE__ */ _chunk7QVYU63Ejs.__name.call(void 0, (buc
|
|
|
787
961
|
}, "inferGranularity");
|
|
788
962
|
function AnalyticsTimelineChart({ rows, className }) {
|
|
789
963
|
const t = _nextintl.useTranslations.call(void 0, );
|
|
790
|
-
const { compact, bucketDate, decimal } =
|
|
964
|
+
const { compact, bucketDate, decimal } = _chunk2CXF5XBUjs.useUsageFormatters.call(void 0, );
|
|
791
965
|
const { resolvedTheme } = _nextthemes.useTheme.call(void 0, );
|
|
792
966
|
const mode = resolvedTheme === "dark" ? "dark" : "light";
|
|
793
967
|
const chartData = _react.useMemo.call(void 0, () => {
|
|
794
968
|
const byBucket = /* @__PURE__ */ new Map();
|
|
795
969
|
for (const row of rows) {
|
|
796
|
-
const key =
|
|
970
|
+
const key = bucketKey2(row.bucket);
|
|
797
971
|
let entry = byBucket.get(key);
|
|
798
972
|
if (!entry) {
|
|
799
973
|
entry = { bucket: key, visitors: 0, pageViews: 0 };
|
|
@@ -822,7 +996,7 @@ function AnalyticsTimelineChart({ rows, className }) {
|
|
|
822
996
|
// rtl-ok: deliberate LTR island (chart)
|
|
823
997
|
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className, dir: "ltr", children: [
|
|
824
998
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "sr-only", "data-testid": "analytics-timeline-data", children: JSON.stringify(chartData) }),
|
|
825
|
-
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
999
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk2CXF5XBUjs.ChartContainer, { config: chartConfig, className: "aspect-auto h-72 w-full", children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _recharts.BarChart, { accessibilityLayer: true, data: chartData, margin: { top: 8, right: 8, bottom: 0, left: 0 }, children: [
|
|
826
1000
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _recharts.CartesianGrid, { vertical: false }),
|
|
827
1001
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
828
1002
|
_recharts.XAxis,
|
|
@@ -846,10 +1020,10 @@ function AnalyticsTimelineChart({ rows, className }) {
|
|
|
846
1020
|
}
|
|
847
1021
|
),
|
|
848
1022
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
849
|
-
|
|
1023
|
+
_chunk2CXF5XBUjs.ChartTooltip,
|
|
850
1024
|
{
|
|
851
1025
|
content: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
852
|
-
|
|
1026
|
+
_chunk2CXF5XBUjs.ChartTooltipContent,
|
|
853
1027
|
{
|
|
854
1028
|
labelFormatter: (value) => bucketDate(String(value), granularity),
|
|
855
1029
|
valueFormatter: (value) => decimal(Number(value), 0)
|
|
@@ -857,13 +1031,13 @@ function AnalyticsTimelineChart({ rows, className }) {
|
|
|
857
1031
|
)
|
|
858
1032
|
}
|
|
859
1033
|
),
|
|
860
|
-
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
1034
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk2CXF5XBUjs.ChartLegend, { content: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk2CXF5XBUjs.ChartLegendContent, {}) }),
|
|
861
1035
|
SERIES.map((series, index) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
862
1036
|
_recharts.Bar,
|
|
863
1037
|
{
|
|
864
1038
|
dataKey: series,
|
|
865
1039
|
maxBarSize: 28,
|
|
866
|
-
fill:
|
|
1040
|
+
fill: _chunk2CXF5XBUjs.seriesColor.call(void 0, index, mode),
|
|
867
1041
|
stroke: "var(--background)",
|
|
868
1042
|
strokeWidth: 2,
|
|
869
1043
|
radius: [4, 4, 0, 0]
|
|
@@ -885,6 +1059,7 @@ function AnalyticsAdminContainer() {
|
|
|
885
1059
|
timeline,
|
|
886
1060
|
breakdowns,
|
|
887
1061
|
sessions,
|
|
1062
|
+
dailyUniques,
|
|
888
1063
|
loadMoreSessions,
|
|
889
1064
|
hasMoreSessions,
|
|
890
1065
|
sessionPageUrl,
|
|
@@ -892,25 +1067,33 @@ function AnalyticsAdminContainer() {
|
|
|
892
1067
|
error
|
|
893
1068
|
} = useAnalyticsAdmin();
|
|
894
1069
|
if (error) {
|
|
895
|
-
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
1070
|
+
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk2CXF5XBUjs.RoundPageContainer, { module: _chunkYWLSIIE6js.Modules.AnalyticsSummary, fullWidth: true, forceHeader: true, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "p-4", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk2CXF5XBUjs.Card, { children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk2CXF5XBUjs.CardContent, { children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "p", { className: "text-destructive text-xs/relaxed", children: error }) }) }) }) });
|
|
896
1071
|
}
|
|
897
|
-
if (isLoading) return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
898
|
-
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
1072
|
+
if (isLoading) return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk2CXF5XBUjs.RoundPageContainer, { module: _chunkYWLSIIE6js.Modules.AnalyticsSummary, fullWidth: true, forceHeader: true });
|
|
1073
|
+
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk2CXF5XBUjs.RoundPageContainer, { module: _chunkYWLSIIE6js.Modules.AnalyticsSummary, fullWidth: true, forceHeader: true, children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex w-full flex-col gap-4 p-4", children: [
|
|
899
1074
|
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex flex-col gap-2", children: [
|
|
900
1075
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, AnalyticsAdminTiles, { summary }),
|
|
901
1076
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "p", { className: "text-muted-foreground text-xs", children: t("analytics.admin.tiles.summarised_note") })
|
|
902
1077
|
] }),
|
|
903
|
-
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
|
|
904
|
-
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
905
|
-
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
1078
|
+
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunk2CXF5XBUjs.Card, { children: [
|
|
1079
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk2CXF5XBUjs.CardHeader, { children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk2CXF5XBUjs.CardTitle, { children: t("analytics.admin.panels.over_time") }) }),
|
|
1080
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk2CXF5XBUjs.CardContent, { children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, AnalyticsTimelineChart, { rows: timeline }) })
|
|
1081
|
+
] }),
|
|
1082
|
+
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunk2CXF5XBUjs.Card, { "data-testid": "analytics-daily-visitors-card", children: [
|
|
1083
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk2CXF5XBUjs.CardHeader, { children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk2CXF5XBUjs.CardTitle, { children: t("analytics.admin.panels.daily_visitors") }) }),
|
|
1084
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk2CXF5XBUjs.CardContent, { children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, AnalyticsDailyUniquesChart, { rows: dailyUniques, metric: "visitors" }) })
|
|
1085
|
+
] }),
|
|
1086
|
+
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunk2CXF5XBUjs.Card, { "data-testid": "analytics-daily-users-card", children: [
|
|
1087
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk2CXF5XBUjs.CardHeader, { children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk2CXF5XBUjs.CardTitle, { children: t("analytics.admin.panels.daily_users") }) }),
|
|
1088
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk2CXF5XBUjs.CardContent, { children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, AnalyticsDailyUniquesChart, { rows: dailyUniques, metric: "users" }) })
|
|
906
1089
|
] }),
|
|
907
|
-
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
|
|
908
|
-
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
909
|
-
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
1090
|
+
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunk2CXF5XBUjs.Card, { children: [
|
|
1091
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk2CXF5XBUjs.CardHeader, { children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk2CXF5XBUjs.CardTitle, { children: t("analytics.admin.panels.breakdown") }) }),
|
|
1092
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk2CXF5XBUjs.CardContent, { children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, AnalyticsBreakdownTable, { breakdowns }) })
|
|
910
1093
|
] }),
|
|
911
|
-
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
|
|
912
|
-
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
913
|
-
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
1094
|
+
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunk2CXF5XBUjs.Card, { children: [
|
|
1095
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk2CXF5XBUjs.CardHeader, { children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk2CXF5XBUjs.CardTitle, { children: t("analytics.admin.panels.sessions") }) }),
|
|
1096
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk2CXF5XBUjs.CardContent, { children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
914
1097
|
AnalyticsSessionsTable,
|
|
915
1098
|
{
|
|
916
1099
|
rows: sessions,
|
|
@@ -933,7 +1116,7 @@ var OTHER_SESSIONS_WINDOW_DAYS = 395;
|
|
|
933
1116
|
function AnalyticsJourneyContainer({ sessionId, pageUrl = ANALYTICS_ADMIN_PAGE_URL }) {
|
|
934
1117
|
const t = _nextintl.useTranslations.call(void 0, );
|
|
935
1118
|
const locale = _nextintl.useLocale.call(void 0, );
|
|
936
|
-
const generateUrl =
|
|
1119
|
+
const generateUrl = _chunk2CXF5XBUjs.usePageUrlGenerator.call(void 0, );
|
|
937
1120
|
const [session, setSession] = _react.useState.call(void 0, void 0);
|
|
938
1121
|
const [pageViews, setPageViews] = _react.useState.call(void 0, []);
|
|
939
1122
|
const [otherSessions, setOtherSessions] = _react.useState.call(void 0, []);
|
|
@@ -989,26 +1172,26 @@ function AnalyticsJourneyContainer({ sessionId, pageUrl = ANALYTICS_ADMIN_PAGE_U
|
|
|
989
1172
|
const title = { type: t("analytics.admin.panels.journey") };
|
|
990
1173
|
const renderBody = /* @__PURE__ */ _chunk7QVYU63Ejs.__name.call(void 0, () => {
|
|
991
1174
|
if (error) {
|
|
992
|
-
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
1175
|
+
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk2CXF5XBUjs.RoundPageContainer, { module: _chunkYWLSIIE6js.Modules.AnalyticsSession, fullWidth: true, forceHeader: true, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "p-4", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk2CXF5XBUjs.Card, { children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk2CXF5XBUjs.CardContent, { children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "p", { className: "text-destructive text-xs/relaxed", children: error }) }) }) }) });
|
|
993
1176
|
}
|
|
994
|
-
if (isLoading || !session) return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
1177
|
+
if (isLoading || !session) return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk2CXF5XBUjs.RoundPageContainer, { module: _chunkYWLSIIE6js.Modules.AnalyticsSession, fullWidth: true, forceHeader: true });
|
|
995
1178
|
const source = [_nullishCoalesce(session.utmSource, () => ( session.referrerHost)), session.utmMedium, session.utmCampaign].filter(Boolean).join(" / ");
|
|
996
|
-
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
997
|
-
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
1179
|
+
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk2CXF5XBUjs.RoundPageContainer, { module: _chunkYWLSIIE6js.Modules.AnalyticsSession, fullWidth: true, forceHeader: true, children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex w-full flex-col gap-4 p-4", children: [
|
|
1180
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk2CXF5XBUjs.Card, { "data-testid": "analytics-journey-attribution", children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunk2CXF5XBUjs.CardContent, { className: "flex flex-col gap-3", children: [
|
|
998
1181
|
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex flex-wrap items-center gap-2", children: [
|
|
999
1182
|
session.user ? /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "span", { className: "flex flex-col", children: [
|
|
1000
1183
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "text-sm", children: session.user.name }),
|
|
1001
1184
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "text-muted-foreground text-xs", children: session.user.email })
|
|
1002
|
-
] }) : /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
1003
|
-
session.consented ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
1185
|
+
] }) : /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk2CXF5XBUjs.Badge, { variant: "softGray", children: t("analytics.admin.anonymous") }),
|
|
1186
|
+
session.consented ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk2CXF5XBUjs.Badge, { variant: "softGreen", children: t("analytics.admin.consented") }) : /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk2CXF5XBUjs.Badge, { variant: "softGray", children: t("analytics.admin.not_consented") })
|
|
1004
1187
|
] }),
|
|
1005
1188
|
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "grid gap-3 sm:grid-cols-3", children: [
|
|
1006
|
-
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
1007
|
-
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
1008
|
-
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
1009
|
-
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
1189
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk2CXF5XBUjs.DetailField, { label: t("analytics.admin.columns.started"), value: dateTime.format(session.startedAt) }),
|
|
1190
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk2CXF5XBUjs.DetailField, { label: t("analytics.admin.columns.source"), value: source }),
|
|
1191
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk2CXF5XBUjs.DetailField, { label: t("analytics.admin.columns.landing"), value: session.landingRoute }),
|
|
1192
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk2CXF5XBUjs.DetailField, { label: t("analytics.admin.columns.device"), value: session.deviceType }),
|
|
1010
1193
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
1011
|
-
|
|
1194
|
+
_chunk2CXF5XBUjs.DetailField,
|
|
1012
1195
|
{
|
|
1013
1196
|
label: t("analytics.admin.columns.visitor"),
|
|
1014
1197
|
value: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "tabular-nums", children: session.visitorId })
|
|
@@ -1016,31 +1199,31 @@ function AnalyticsJourneyContainer({ sessionId, pageUrl = ANALYTICS_ADMIN_PAGE_U
|
|
|
1016
1199
|
)
|
|
1017
1200
|
] })
|
|
1018
1201
|
] }) }),
|
|
1019
|
-
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
|
|
1020
|
-
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
1021
|
-
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
1202
|
+
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunk2CXF5XBUjs.Card, { children: [
|
|
1203
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk2CXF5XBUjs.CardHeader, { children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk2CXF5XBUjs.CardTitle, { children: t("analytics.admin.columns.pages") }) }),
|
|
1204
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk2CXF5XBUjs.CardContent, { children: pageViews.length === 0 ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "p", { className: "text-muted-foreground text-sm", children: t("analytics.admin.no_data") }) : (
|
|
1022
1205
|
// The package's <Table> wraps itself in an `overflow-x-clip`
|
|
1023
1206
|
// container — hence the child override, so wide rows scroll.
|
|
1024
|
-
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "overflow-x-auto [&_[data-slot=table-container]]:overflow-x-visible", children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
|
|
1025
|
-
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
1026
|
-
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
1027
|
-
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
1028
|
-
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
1207
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "overflow-x-auto [&_[data-slot=table-container]]:overflow-x-visible", children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunk2CXF5XBUjs.Table, { children: [
|
|
1208
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk2CXF5XBUjs.TableHeader, { children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunk2CXF5XBUjs.TableRow, { children: [
|
|
1209
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk2CXF5XBUjs.TableHead, { className: "text-xs font-medium", children: t("analytics.admin.columns.time") }),
|
|
1210
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk2CXF5XBUjs.TableHead, { className: "text-end text-xs font-medium", children: t("analytics.admin.columns.gap") }),
|
|
1211
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk2CXF5XBUjs.TableHead, { className: "text-xs font-medium", children: t("analytics.admin.columns.path") })
|
|
1029
1212
|
] }) }),
|
|
1030
|
-
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
1213
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk2CXF5XBUjs.TableBody, { children: pageViews.map((pageView, index) => {
|
|
1031
1214
|
const previous = index > 0 ? pageViews[index - 1] : void 0;
|
|
1032
|
-
return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
|
|
1033
|
-
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
1034
|
-
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
1035
|
-
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
1215
|
+
return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunk2CXF5XBUjs.TableRow, { "data-testid": `analytics-pageview-row-${pageView.id}`, children: [
|
|
1216
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk2CXF5XBUjs.TableCell, { className: "text-xs tabular-nums", children: dateTime.format(pageView.createdAt) }),
|
|
1217
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk2CXF5XBUjs.TableCell, { className: "text-end text-xs tabular-nums", children: previous ? formatGap(pageView.createdAt.getTime() - previous.createdAt.getTime()) : "\u2014" }),
|
|
1218
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk2CXF5XBUjs.TableCell, { className: "text-xs", children: pageView.path })
|
|
1036
1219
|
] }, pageView.id);
|
|
1037
1220
|
}) })
|
|
1038
1221
|
] }) })
|
|
1039
1222
|
) })
|
|
1040
1223
|
] }),
|
|
1041
|
-
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
|
|
1042
|
-
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
1043
|
-
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
1224
|
+
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunk2CXF5XBUjs.Card, { children: [
|
|
1225
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk2CXF5XBUjs.CardHeader, { children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk2CXF5XBUjs.CardTitle, { children: t("analytics.admin.panels.other_sessions") }) }),
|
|
1226
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk2CXF5XBUjs.CardContent, { children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
1044
1227
|
AnalyticsSessionsTable,
|
|
1045
1228
|
{
|
|
1046
1229
|
rows: otherSessions,
|
|
@@ -1052,7 +1235,7 @@ function AnalyticsJourneyContainer({ sessionId, pageUrl = ANALYTICS_ADMIN_PAGE_U
|
|
|
1052
1235
|
] })
|
|
1053
1236
|
] }) });
|
|
1054
1237
|
}, "renderBody");
|
|
1055
|
-
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
1238
|
+
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk2CXF5XBUjs.SharedProvider, { value: { breadcrumbs: breadcrumb, title }, children: renderBody() });
|
|
1056
1239
|
}
|
|
1057
1240
|
_chunk7QVYU63Ejs.__name.call(void 0, AnalyticsJourneyContainer, "AnalyticsJourneyContainer");
|
|
1058
1241
|
function unit(locale, name, value) {
|
|
@@ -1102,6 +1285,8 @@ var ANALYTICS_ADMIN_I18N_KEYS = [
|
|
|
1102
1285
|
"analytics.admin.panels.sessions",
|
|
1103
1286
|
"analytics.admin.panels.journey",
|
|
1104
1287
|
"analytics.admin.panels.other_sessions",
|
|
1288
|
+
"analytics.admin.panels.daily_visitors",
|
|
1289
|
+
"analytics.admin.panels.daily_users",
|
|
1105
1290
|
// Breakdown tabs
|
|
1106
1291
|
"analytics.admin.dimensions.source",
|
|
1107
1292
|
"analytics.admin.dimensions.medium",
|
|
@@ -1132,7 +1317,12 @@ var ANALYTICS_ADMIN_I18N_KEYS = [
|
|
|
1132
1317
|
"analytics.admin.other",
|
|
1133
1318
|
// Timeline chart series
|
|
1134
1319
|
"analytics.admin.series.visitors",
|
|
1135
|
-
"analytics.admin.series.page_views"
|
|
1320
|
+
"analytics.admin.series.page_views",
|
|
1321
|
+
// Daily uniques charts
|
|
1322
|
+
"analytics.admin.daily_uniques.visitors",
|
|
1323
|
+
"analytics.admin.daily_uniques.users",
|
|
1324
|
+
"analytics.admin.daily_uniques.today",
|
|
1325
|
+
"analytics.admin.daily_uniques.no_data"
|
|
1136
1326
|
];
|
|
1137
1327
|
|
|
1138
1328
|
|
|
@@ -1160,5 +1350,7 @@ var ANALYTICS_ADMIN_I18N_KEYS = [
|
|
|
1160
1350
|
|
|
1161
1351
|
|
|
1162
1352
|
|
|
1163
|
-
|
|
1353
|
+
|
|
1354
|
+
|
|
1355
|
+
exports.ANALYTICS_ADMIN_I18N_KEYS = ANALYTICS_ADMIN_I18N_KEYS; exports.ANALYTICS_DIMENSIONS = ANALYTICS_DIMENSIONS; exports.ANALYTICS_GRANULARITIES = ANALYTICS_GRANULARITIES; exports.ANALYTICS_SECTIONS = ANALYTICS_SECTIONS; exports.AnalyticsAdminContainer = AnalyticsAdminContainer; exports.AnalyticsAdminFilterBar = AnalyticsAdminFilterBar; exports.AnalyticsAdminPageContainer = AnalyticsAdminPageContainer; exports.AnalyticsAdminProvider = AnalyticsAdminProvider; exports.AnalyticsAdminService = AnalyticsAdminService; exports.AnalyticsAdminTiles = AnalyticsAdminTiles; exports.AnalyticsBreakdown = _chunkCMNJENSJjs.AnalyticsBreakdown; exports.AnalyticsBreakdownTable = AnalyticsBreakdownTable; exports.AnalyticsDailyUniqueTimeline = _chunkCMNJENSJjs.AnalyticsDailyUniqueTimeline; exports.AnalyticsDailyUniquesChart = AnalyticsDailyUniquesChart; exports.AnalyticsEvent = _chunkCMNJENSJjs.AnalyticsEvent; exports.AnalyticsJourneyContainer = AnalyticsJourneyContainer; exports.AnalyticsJourneyPageContainer = AnalyticsJourneyPageContainer; exports.AnalyticsPageView = _chunkCMNJENSJjs.AnalyticsPageView; exports.AnalyticsService = AnalyticsService; exports.AnalyticsSession = _chunkCMNJENSJjs.AnalyticsSession; exports.AnalyticsSessionsTable = AnalyticsSessionsTable; exports.AnalyticsSummary = _chunkCMNJENSJjs.AnalyticsSummary; exports.AnalyticsTimeline = _chunkCMNJENSJjs.AnalyticsTimeline; exports.AnalyticsTimelineChart = AnalyticsTimelineChart; exports.AnalyticsTracker = AnalyticsTracker; exports.analyticsModules = _chunkCMNJENSJjs.analyticsModules; exports.useAnalyticsAdmin = useAnalyticsAdmin;
|
|
1164
1356
|
//# sourceMappingURL=index.js.map
|