@bigbinary/neeto-email-pipeline-frontend 1.0.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.
Files changed (49) hide show
  1. package/README.md +109 -0
  2. package/app/javascript/src/translations/ar.json +5 -0
  3. package/app/javascript/src/translations/bg.json +5 -0
  4. package/app/javascript/src/translations/ca.json +5 -0
  5. package/app/javascript/src/translations/cs.json +5 -0
  6. package/app/javascript/src/translations/da.json +5 -0
  7. package/app/javascript/src/translations/de.json +5 -0
  8. package/app/javascript/src/translations/en.json +50 -0
  9. package/app/javascript/src/translations/es-MX.json +5 -0
  10. package/app/javascript/src/translations/es.json +5 -0
  11. package/app/javascript/src/translations/et.json +5 -0
  12. package/app/javascript/src/translations/fi.json +5 -0
  13. package/app/javascript/src/translations/fil.json +5 -0
  14. package/app/javascript/src/translations/fr.json +5 -0
  15. package/app/javascript/src/translations/he.json +5 -0
  16. package/app/javascript/src/translations/hi.json +5 -0
  17. package/app/javascript/src/translations/hr.json +5 -0
  18. package/app/javascript/src/translations/hu.json +5 -0
  19. package/app/javascript/src/translations/id.json +5 -0
  20. package/app/javascript/src/translations/index.js +3 -0
  21. package/app/javascript/src/translations/it.json +5 -0
  22. package/app/javascript/src/translations/ja.json +5 -0
  23. package/app/javascript/src/translations/ko.json +5 -0
  24. package/app/javascript/src/translations/nl.json +5 -0
  25. package/app/javascript/src/translations/pl.json +5 -0
  26. package/app/javascript/src/translations/pt-BR.json +5 -0
  27. package/app/javascript/src/translations/pt.json +5 -0
  28. package/app/javascript/src/translations/ro.json +5 -0
  29. package/app/javascript/src/translations/ru.json +5 -0
  30. package/app/javascript/src/translations/sk.json +5 -0
  31. package/app/javascript/src/translations/sl.json +5 -0
  32. package/app/javascript/src/translations/sv.json +5 -0
  33. package/app/javascript/src/translations/th.json +5 -0
  34. package/app/javascript/src/translations/tr.json +5 -0
  35. package/app/javascript/src/translations/uk.json +5 -0
  36. package/app/javascript/src/translations/vi.json +5 -0
  37. package/app/javascript/src/translations/zh-CN.json +5 -0
  38. package/app/javascript/src/translations/zh-TW.json +5 -0
  39. package/dist/.ready +1 -0
  40. package/dist/EmailLogs.js +557 -0
  41. package/dist/EmailLogs.js.map +1 -0
  42. package/dist/cjs/EmailLogs.js +559 -0
  43. package/dist/cjs/EmailLogs.js.map +1 -0
  44. package/dist/cjs/index.js +33 -0
  45. package/dist/cjs/index.js.map +1 -0
  46. package/dist/index.js +27 -0
  47. package/dist/index.js.map +1 -0
  48. package/package.json +234 -0
  49. package/types.d.ts +3 -0
@@ -0,0 +1,557 @@
1
+ import _defineProperty from '@babel/runtime/helpers/defineProperty';
2
+ import _slicedToArray from '@babel/runtime/helpers/slicedToArray';
3
+ import { useMemo, useState } from 'react';
4
+ import { isPresent } from '@bigbinary/neeto-cist';
5
+ import { DEFAULT_PAGE_SIZE } from '@bigbinary/neeto-commons-frontend/constants';
6
+ import Container from '@bigbinary/neeto-molecules/Container';
7
+ import Header from '@bigbinary/neeto-molecules/Header';
8
+ import Tooltip from '@bigbinary/neetoui/Tooltip';
9
+ import Typography from '@bigbinary/neetoui/Typography';
10
+ import { useTranslation } from 'react-i18next';
11
+ import { useQuery } from '@tanstack/react-query';
12
+ import axios from 'axios';
13
+ import { t } from 'i18next';
14
+ import Callout from '@bigbinary/neetoui/Callout';
15
+ import NeetoUIPane from '@bigbinary/neetoui/Pane';
16
+ import Tag from '@bigbinary/neetoui/Tag';
17
+ import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
18
+ import Spinner from '@bigbinary/neetoui/Spinner';
19
+ import { dateFormat } from '@bigbinary/neeto-commons-frontend/utils';
20
+ import { prop, isEmpty } from 'ramda';
21
+ import { withT } from '@bigbinary/neeto-commons-frontend/react-utils';
22
+ import FiltersBar from '@bigbinary/neeto-filters-frontend/Bar';
23
+ import SubHeader from '@bigbinary/neeto-molecules/SubHeader';
24
+ import NeetoUITable from '@bigbinary/neetoui/Table';
25
+ import Button from '@bigbinary/neetoui/Button';
26
+
27
+ var BASE_URL = "/neeto_email_pipeline/email_logs";
28
+ var QUERY_KEYS = {
29
+ EMAIL_LOGS: "emailLogs",
30
+ EMAIL_LOG: "emailLog"
31
+ };
32
+ var STATUS_STYLES = {
33
+ delivered: {
34
+ label: t("neetoEmailPipeline.emailLogs.statuses.delivered"),
35
+ style: "success"
36
+ },
37
+ bounced: {
38
+ label: t("neetoEmailPipeline.emailLogs.statuses.bounced"),
39
+ style: "danger"
40
+ },
41
+ dropped: {
42
+ label: t("neetoEmailPipeline.emailLogs.statuses.dropped"),
43
+ style: "warning"
44
+ },
45
+ handed_over: {
46
+ label: t("neetoEmailPipeline.emailLogs.statuses.handedOver"),
47
+ style: "info"
48
+ },
49
+ queued: {
50
+ label: t("neetoEmailPipeline.emailLogs.statuses.queued"),
51
+ style: "primary"
52
+ },
53
+ failed: {
54
+ label: t("neetoEmailPipeline.emailLogs.statuses.failed"),
55
+ style: "danger"
56
+ },
57
+ spam_complaint: {
58
+ label: t("neetoEmailPipeline.emailLogs.statuses.spamComplaint"),
59
+ style: "danger"
60
+ }
61
+ };
62
+ var FILTER_COLUMNS = [{
63
+ node: "email",
64
+ key: "email",
65
+ label: t("neetoEmailPipeline.emailLogs.filters.recipient"),
66
+ type: "text"
67
+ }, {
68
+ node: "status",
69
+ key: "status",
70
+ label: t("neetoEmailPipeline.emailLogs.filters.status"),
71
+ type: "multi_option",
72
+ values: Object.entries(STATUS_STYLES).map(function (_ref) {
73
+ var _ref2 = _slicedToArray(_ref, 2),
74
+ value = _ref2[0],
75
+ label = _ref2[1].label;
76
+ return {
77
+ label: label,
78
+ value: value
79
+ };
80
+ })
81
+ }, {
82
+ node: "created_at",
83
+ key: "created_at",
84
+ label: t("neetoEmailPipeline.emailLogs.filters.date"),
85
+ type: "single_date"
86
+ }];
87
+
88
+ var emailLogsApi = {
89
+ fetch: function fetch(params) {
90
+ return axios.get(BASE_URL, {
91
+ params: params
92
+ });
93
+ },
94
+ show: function show(id) {
95
+ return axios.get("".concat(BASE_URL, "/").concat(id));
96
+ }
97
+ };
98
+
99
+ function ownKeys$1(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
100
+ function _objectSpread$1(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$1(Object(t), true).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$1(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
101
+ var useFetchEmailLogs = function useFetchEmailLogs(params) {
102
+ var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
103
+ return useQuery(_objectSpread$1({
104
+ queryKey: [QUERY_KEYS.EMAIL_LOGS, params],
105
+ queryFn: function queryFn() {
106
+ return emailLogsApi.fetch(params);
107
+ }
108
+ }, options));
109
+ };
110
+ var useFetchEmailLog = function useFetchEmailLog(id) {
111
+ var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
112
+ return useQuery(_objectSpread$1({
113
+ queryKey: [QUERY_KEYS.EMAIL_LOG, id],
114
+ queryFn: function queryFn() {
115
+ return emailLogsApi.show(id);
116
+ },
117
+ enabled: !!id
118
+ }, options));
119
+ };
120
+
121
+ var DetailField = function DetailField(_ref) {
122
+ var label = _ref.label,
123
+ value = _ref.value;
124
+ if (!value) return null;
125
+ return /*#__PURE__*/jsxs("div", {
126
+ className: "mb-3",
127
+ children: [/*#__PURE__*/jsx(Typography, {
128
+ className: "neeto-ui-text-gray-500 mb-0.5",
129
+ component: "p",
130
+ style: "body3",
131
+ children: label
132
+ }), /*#__PURE__*/jsx(Typography, {
133
+ component: "p",
134
+ style: "body2",
135
+ children: value
136
+ })]
137
+ });
138
+ };
139
+
140
+ var EmailBody = function EmailBody(_ref) {
141
+ var body = _ref.body,
142
+ isLoading = _ref.isLoading;
143
+ var _useTranslation = useTranslation(),
144
+ t = _useTranslation.t;
145
+ if (isLoading) {
146
+ return /*#__PURE__*/jsxs("div", {
147
+ className: "flex h-full items-center justify-center",
148
+ children: [/*#__PURE__*/jsx(Spinner, {}), /*#__PURE__*/jsx(Typography, {
149
+ className: "neeto-ui-text-gray-500 ml-2",
150
+ style: "body3",
151
+ children: t("neetoEmailPipeline.emailLogs.pane.loadingBody")
152
+ })]
153
+ });
154
+ }
155
+ if (!body) {
156
+ return /*#__PURE__*/jsx("div", {
157
+ className: "flex h-full items-center justify-center",
158
+ children: /*#__PURE__*/jsx(Typography, {
159
+ className: "neeto-ui-text-gray-500",
160
+ style: "body2",
161
+ children: t("neetoEmailPipeline.emailLogs.pane.noBody")
162
+ })
163
+ });
164
+ }
165
+ return /*#__PURE__*/jsx("iframe", {
166
+ sandbox: "",
167
+ srcDoc: body,
168
+ style: {
169
+ width: "100%",
170
+ height: "100%",
171
+ border: "none"
172
+ },
173
+ title: t("neetoEmailPipeline.emailLogs.pane.emailBody")
174
+ });
175
+ };
176
+
177
+ var TimelineEntry = function TimelineEntry(_ref) {
178
+ var label = _ref.label,
179
+ timestamp = _ref.timestamp,
180
+ isLast = _ref.isLast;
181
+ return /*#__PURE__*/jsxs("div", {
182
+ className: "flex gap-3",
183
+ children: [/*#__PURE__*/jsxs("div", {
184
+ className: "flex flex-col items-center",
185
+ children: [/*#__PURE__*/jsx("div", {
186
+ className: "neeto-ui-bg-primary-500 mt-1.5 h-2 w-2 flex-shrink-0 neeto-ui-rounded-full"
187
+ }), !isLast && /*#__PURE__*/jsx("div", {
188
+ className: "neeto-ui-bg-gray-300 w-px flex-1"
189
+ })]
190
+ }), /*#__PURE__*/jsxs("div", {
191
+ className: "pb-4",
192
+ children: [/*#__PURE__*/jsx(Typography, {
193
+ component: "p",
194
+ style: "body2",
195
+ children: label
196
+ }), /*#__PURE__*/jsx(Typography, {
197
+ className: "neeto-ui-text-gray-500",
198
+ component: "p",
199
+ style: "body3",
200
+ children: dateFormat.dateTime(timestamp)
201
+ })]
202
+ })]
203
+ });
204
+ };
205
+ var Timeline = function Timeline(_ref2) {
206
+ var entries = _ref2.entries;
207
+ var visibleEntries = entries.filter(prop("timestamp"));
208
+ if (isEmpty(visibleEntries)) return null;
209
+ return visibleEntries.map(function (entry, index) {
210
+ return /*#__PURE__*/jsx(TimelineEntry, {
211
+ isLast: index === visibleEntries.length - 1,
212
+ label: entry.label,
213
+ timestamp: entry.timestamp
214
+ }, entry.label);
215
+ });
216
+ };
217
+
218
+ var Pane = function Pane(_ref) {
219
+ var _showResponse$emailLo;
220
+ var isOpen = _ref.isOpen,
221
+ onClose = _ref.onClose,
222
+ record = _ref.record;
223
+ var _useTranslation = useTranslation(),
224
+ t = _useTranslation.t;
225
+ var _useFetchEmailLog = useFetchEmailLog(record === null || record === void 0 ? void 0 : record.id),
226
+ showResponse = _useFetchEmailLog.data,
227
+ isBodyLoading = _useFetchEmailLog.isLoading;
228
+ if (!record) return null;
229
+ var body = showResponse === null || showResponse === void 0 || (_showResponse$emailLo = showResponse.emailLog) === null || _showResponse$emailLo === void 0 ? void 0 : _showResponse$emailLo.body;
230
+ var statusConfig = STATUS_STYLES[record.status] || {
231
+ label: record.status,
232
+ style: "primary"
233
+ };
234
+ var showDeliveryMethod = record.deliveryMethod && record.deliveryMethod !== "sparkpost";
235
+ return /*#__PURE__*/jsxs(NeetoUIPane, {
236
+ isOpen: isOpen,
237
+ onClose: onClose,
238
+ size: "extraLarge",
239
+ children: [/*#__PURE__*/jsx(NeetoUIPane.Header, {
240
+ children: /*#__PURE__*/jsx(Typography, {
241
+ style: "h2",
242
+ children: t("neetoEmailPipeline.emailLogs.pane.title")
243
+ })
244
+ }), /*#__PURE__*/jsx(NeetoUIPane.Body, {
245
+ hasFooter: false,
246
+ children: /*#__PURE__*/jsxs("div", {
247
+ className: "flex h-full gap-6 pb-8",
248
+ children: [/*#__PURE__*/jsxs("div", {
249
+ className: "w-1/3 overflow-y-auto",
250
+ children: [/*#__PURE__*/jsx("div", {
251
+ className: "mb-4",
252
+ children: /*#__PURE__*/jsx(Tag, {
253
+ label: statusConfig.label,
254
+ style: statusConfig.style
255
+ })
256
+ }), /*#__PURE__*/jsx(DetailField, {
257
+ label: t("neetoEmailPipeline.emailLogs.pane.recipient"),
258
+ value: record.email
259
+ }), /*#__PURE__*/jsx(DetailField, {
260
+ label: t("neetoEmailPipeline.emailLogs.pane.from"),
261
+ value: record.fromEmail
262
+ }), /*#__PURE__*/jsx(DetailField, {
263
+ label: t("neetoEmailPipeline.emailLogs.pane.subject"),
264
+ value: record.subject
265
+ }), showDeliveryMethod && /*#__PURE__*/jsx(DetailField, {
266
+ label: t("neetoEmailPipeline.emailLogs.pane.deliveryMethod"),
267
+ value: record.deliveryMethod
268
+ }), /*#__PURE__*/jsxs("div", {
269
+ className: "neeto-ui-border-gray-200 mt-5 border-t pt-4",
270
+ children: [/*#__PURE__*/jsx(Typography, {
271
+ className: "neeto-ui-text-gray-500 mb-3",
272
+ component: "p",
273
+ style: "body3",
274
+ children: t("neetoEmailPipeline.emailLogs.pane.timeline")
275
+ }), /*#__PURE__*/jsx(Timeline, {
276
+ entries: [{
277
+ label: t("neetoEmailPipeline.emailLogs.pane.queued"),
278
+ timestamp: record.createdAt
279
+ }, {
280
+ label: t("neetoEmailPipeline.emailLogs.pane.handedOver"),
281
+ timestamp: record.sentAt
282
+ }, {
283
+ label: t("neetoEmailPipeline.emailLogs.pane.delivered"),
284
+ timestamp: record.deliveredAt
285
+ }, {
286
+ label: t("neetoEmailPipeline.emailLogs.pane.failed"),
287
+ timestamp: record.failedAt
288
+ }]
289
+ })]
290
+ }), record.statusDetail && /*#__PURE__*/jsx("div", {
291
+ className: "mt-4",
292
+ children: /*#__PURE__*/jsx(Callout, {
293
+ style: "danger",
294
+ children: record.statusDetail
295
+ })
296
+ })]
297
+ }), /*#__PURE__*/jsx("div", {
298
+ className: "neeto-ui-border-gray-200 w-2/3 border-l pl-6",
299
+ children: /*#__PURE__*/jsx(EmailBody, {
300
+ body: body,
301
+ isLoading: isBodyLoading
302
+ })
303
+ })]
304
+ })
305
+ })]
306
+ });
307
+ };
308
+
309
+ var EmailLogsSubHeader = withT(function (_ref) {
310
+ var t = _ref.t,
311
+ totalCount = _ref.totalCount,
312
+ filters = _ref.filters,
313
+ genericSearchProps = _ref.genericSearchProps,
314
+ isFilterPaneOpen = _ref.isFilterPaneOpen,
315
+ setIsFilterPaneOpen = _ref.setIsFilterPaneOpen,
316
+ handleFiltersChange = _ref.handleFiltersChange,
317
+ searchTerm = _ref.searchTerm;
318
+ return /*#__PURE__*/jsxs(Fragment, {
319
+ children: [/*#__PURE__*/jsx(SubHeader, {
320
+ className: "mb-4",
321
+ leftActionBlock: totalCount > 0 && /*#__PURE__*/jsx(Typography, {
322
+ weight: "semibold",
323
+ children: t("neetoEmailPipeline.emailLogs.emailWithCount", {
324
+ count: totalCount
325
+ })
326
+ }),
327
+ rightActionBlock: /*#__PURE__*/jsx(SubHeader.RightBlock, {
328
+ filterProps: {
329
+ columns: FILTER_COLUMNS,
330
+ isOpen: isFilterPaneOpen,
331
+ keyword: genericSearchProps,
332
+ setIsOpen: setIsFilterPaneOpen,
333
+ onChange: handleFiltersChange
334
+ }
335
+ })
336
+ }), (isPresent(filters) || isPresent(searchTerm)) && /*#__PURE__*/jsx(FiltersBar, {
337
+ className: "mb-4",
338
+ columns: FILTER_COLUMNS,
339
+ keyword: genericSearchProps,
340
+ setIsPaneOpen: setIsFilterPaneOpen,
341
+ onChange: handleFiltersChange
342
+ })]
343
+ });
344
+ });
345
+
346
+ var buildColumnData = function buildColumnData(_ref) {
347
+ var onRowClick = _ref.onRowClick;
348
+ return [{
349
+ dataIndex: "email",
350
+ key: "email",
351
+ title: t("neetoEmailPipeline.emailLogs.columns.recipient"),
352
+ width: "25%",
353
+ ellipsis: true,
354
+ isHidable: false,
355
+ render: function render(email, record) {
356
+ return /*#__PURE__*/jsxs("div", {
357
+ className: "flex items-center gap-x-1 overflow-hidden",
358
+ children: [/*#__PURE__*/jsx(Button, {
359
+ className: "truncate",
360
+ label: email,
361
+ style: "link",
362
+ onClick: function onClick() {
363
+ return onRowClick(record);
364
+ }
365
+ }), record.recipientType && record.recipientType !== "to" && /*#__PURE__*/jsxs("span", {
366
+ className: "neeto-ui-text-gray-500 flex-shrink-0 text-xs",
367
+ children: ["(", record.recipientType, ")"]
368
+ })]
369
+ });
370
+ }
371
+ }, {
372
+ dataIndex: "subject",
373
+ key: "subject",
374
+ title: t("neetoEmailPipeline.emailLogs.columns.subject"),
375
+ width: "45%",
376
+ ellipsis: true
377
+ }, {
378
+ dataIndex: "status",
379
+ key: "status",
380
+ title: t("neetoEmailPipeline.emailLogs.columns.status"),
381
+ width: "10%",
382
+ render: function render(status) {
383
+ var config = STATUS_STYLES[status] || {
384
+ label: status,
385
+ style: "primary"
386
+ };
387
+ return /*#__PURE__*/jsx(Tag, {
388
+ label: config.label,
389
+ style: config.style
390
+ });
391
+ }
392
+ }, {
393
+ dataIndex: "createdAt",
394
+ key: "createdAt",
395
+ title: t("neetoEmailPipeline.emailLogs.columns.sentAt"),
396
+ width: "25%",
397
+ render: dateFormat.dateTime
398
+ }];
399
+ };
400
+
401
+ var Table = function Table(_ref) {
402
+ var data = _ref.data,
403
+ loading = _ref.loading,
404
+ totalCount = _ref.totalCount,
405
+ currentPage = _ref.currentPage,
406
+ _ref$pageSize = _ref.pageSize,
407
+ pageSize = _ref$pageSize === void 0 ? DEFAULT_PAGE_SIZE : _ref$pageSize,
408
+ onPageChange = _ref.onPageChange,
409
+ onRowClick = _ref.onRowClick;
410
+ var columns = useMemo(function () {
411
+ return buildColumnData({
412
+ onRowClick: onRowClick
413
+ });
414
+ }, [onRowClick]);
415
+ return /*#__PURE__*/jsx(NeetoUITable, {
416
+ loading: loading,
417
+ totalCount: totalCount,
418
+ fixedHeight: true,
419
+ columnData: columns,
420
+ currentPageNumber: currentPage,
421
+ defaultPageSize: pageSize,
422
+ handlePageChange: onPageChange,
423
+ rowData: data,
424
+ scroll: {
425
+ x: "100%"
426
+ }
427
+ });
428
+ };
429
+
430
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
431
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), true).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
432
+ var EmailLogs = function EmailLogs(_ref) {
433
+ var canViewEmailLogs = _ref.canViewEmailLogs,
434
+ breadcrumbs = _ref.breadcrumbs;
435
+ var _useTranslation = useTranslation(),
436
+ t = _useTranslation.t;
437
+ var _useState = useState(1),
438
+ _useState2 = _slicedToArray(_useState, 2),
439
+ page = _useState2[0],
440
+ setPage = _useState2[1];
441
+ var _useState3 = useState(""),
442
+ _useState4 = _slicedToArray(_useState3, 2),
443
+ searchTerm = _useState4[0],
444
+ setSearchTerm = _useState4[1];
445
+ var _useState5 = useState([]),
446
+ _useState6 = _slicedToArray(_useState5, 2),
447
+ filters = _useState6[0],
448
+ setFilters = _useState6[1];
449
+ var _useState7 = useState(false),
450
+ _useState8 = _slicedToArray(_useState7, 2),
451
+ isFilterPaneOpen = _useState8[0],
452
+ setIsFilterPaneOpen = _useState8[1];
453
+ var _useState9 = useState(null),
454
+ _useState10 = _slicedToArray(_useState9, 2),
455
+ selectedRecord = _useState10[0],
456
+ setSelectedRecord = _useState10[1];
457
+ var resetPage = function resetPage() {
458
+ return setPage(1);
459
+ };
460
+ var handleFiltersChange = function handleFiltersChange(newFilters) {
461
+ setFilters(newFilters);
462
+ resetPage();
463
+ };
464
+ var genericSearchProps = {
465
+ key: "search_term",
466
+ node: "email",
467
+ value: searchTerm,
468
+ model: ""
469
+ };
470
+ var queryParams = _objectSpread(_objectSpread({
471
+ page: page,
472
+ pageSize: DEFAULT_PAGE_SIZE
473
+ }, isPresent(searchTerm) && {
474
+ searchTerm: searchTerm
475
+ }), isPresent(filters) && {
476
+ neetoFilters: filters
477
+ });
478
+ var _useFetchEmailLogs = useFetchEmailLogs(queryParams, {
479
+ enabled: canViewEmailLogs
480
+ }),
481
+ response = _useFetchEmailLogs.data,
482
+ isLoading = _useFetchEmailLogs.isLoading;
483
+ var emailLogs = (response === null || response === void 0 ? void 0 : response.emailLogs) || [];
484
+ var stats = (response === null || response === void 0 ? void 0 : response.stats) || {};
485
+ var totalCount = (response === null || response === void 0 ? void 0 : response.totalCount) || 0;
486
+ var retentionDays = (response === null || response === void 0 ? void 0 : response.retentionDays) || 30;
487
+ if (!canViewEmailLogs) return null;
488
+ var buildSubtitle = function buildSubtitle() {
489
+ var total = stats.total || 0;
490
+ if (total === 0) return null;
491
+ var deliveredPct = (stats.delivered / total * 100).toFixed(1);
492
+ var bouncedPct = (stats.bounced / total * 100).toFixed(1);
493
+ var droppedPct = (stats.dropped / total * 100).toFixed(1);
494
+ return t("neetoEmailPipeline.emailLogs.subtitle", {
495
+ retentionDays: retentionDays,
496
+ total: total.toLocaleString(),
497
+ deliveredPct: deliveredPct,
498
+ bouncedPct: bouncedPct,
499
+ droppedPct: droppedPct
500
+ });
501
+ };
502
+ var subtitle = buildSubtitle();
503
+ var rateLimited = stats.rateLimited || 0;
504
+ return /*#__PURE__*/jsxs(Container, {
505
+ children: [/*#__PURE__*/jsx(Header, {
506
+ breadcrumbs: breadcrumbs,
507
+ title: t("neetoEmailPipeline.emailLogs.title"),
508
+ searchProps: {
509
+ enableUrlSync: false,
510
+ placeholder: t("neetoEmailPipeline.emailLogs.searchPlaceholder"),
511
+ onSearch: function onSearch(value) {
512
+ setSearchTerm(value);
513
+ resetPage();
514
+ }
515
+ }
516
+ }), (subtitle || rateLimited > 0) && /*#__PURE__*/jsxs(Typography, {
517
+ className: "neeto-ui-text-gray-500 -mt-3 mb-2 text-sm",
518
+ component: "p",
519
+ children: [subtitle, subtitle && rateLimited > 0 && " · ", rateLimited > 0 && /*#__PURE__*/jsx(Tooltip, {
520
+ position: "bottom",
521
+ content: t("neetoEmailPipeline.emailLogs.rateLimitedTooltip", {
522
+ count: rateLimited
523
+ }),
524
+ children: /*#__PURE__*/jsx("span", {
525
+ className: "neeto-ui-text-warning-500 cursor-default",
526
+ children: t("neetoEmailPipeline.emailLogs.rateLimitedStat", {
527
+ count: rateLimited
528
+ })
529
+ })
530
+ })]
531
+ }), /*#__PURE__*/jsx(EmailLogsSubHeader, {
532
+ filters: filters,
533
+ genericSearchProps: genericSearchProps,
534
+ handleFiltersChange: handleFiltersChange,
535
+ isFilterPaneOpen: isFilterPaneOpen,
536
+ searchTerm: searchTerm,
537
+ setIsFilterPaneOpen: setIsFilterPaneOpen,
538
+ totalCount: totalCount
539
+ }), /*#__PURE__*/jsx(Table, {
540
+ totalCount: totalCount,
541
+ currentPage: page,
542
+ data: emailLogs,
543
+ loading: isLoading,
544
+ onPageChange: setPage,
545
+ onRowClick: setSelectedRecord
546
+ }), /*#__PURE__*/jsx(Pane, {
547
+ isOpen: !!selectedRecord,
548
+ record: selectedRecord,
549
+ onClose: function onClose() {
550
+ return setSelectedRecord(null);
551
+ }
552
+ })]
553
+ });
554
+ };
555
+
556
+ export { EmailLogs as default };
557
+ //# sourceMappingURL=EmailLogs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EmailLogs.js","sources":["../app/javascript/src/constants.js","../app/javascript/src/apis/email_logs.js","../app/javascript/src/hooks/useEmailLogsApi.js","../app/javascript/src/components/EmailLogs/Pane/DetailField.jsx","../app/javascript/src/components/EmailLogs/Pane/EmailBody.jsx","../app/javascript/src/components/EmailLogs/Pane/Timeline.jsx","../app/javascript/src/components/EmailLogs/Pane/index.jsx","../app/javascript/src/components/EmailLogs/SubHeader/index.jsx","../app/javascript/src/components/EmailLogs/Table/utils.jsx","../app/javascript/src/components/EmailLogs/Table/index.jsx","../app/javascript/src/components/EmailLogs/index.jsx"],"sourcesContent":["import { t } from \"i18next\";\n\nexport const BASE_URL = \"/neeto_email_pipeline/email_logs\";\n\nexport const QUERY_KEYS = { EMAIL_LOGS: \"emailLogs\", EMAIL_LOG: \"emailLog\" };\n\nexport const STATUS_STYLES = {\n delivered: {\n label: t(\"neetoEmailPipeline.emailLogs.statuses.delivered\"),\n style: \"success\",\n },\n bounced: {\n label: t(\"neetoEmailPipeline.emailLogs.statuses.bounced\"),\n style: \"danger\",\n },\n dropped: {\n label: t(\"neetoEmailPipeline.emailLogs.statuses.dropped\"),\n style: \"warning\",\n },\n handed_over: {\n label: t(\"neetoEmailPipeline.emailLogs.statuses.handedOver\"),\n style: \"info\",\n },\n queued: {\n label: t(\"neetoEmailPipeline.emailLogs.statuses.queued\"),\n style: \"primary\",\n },\n failed: {\n label: t(\"neetoEmailPipeline.emailLogs.statuses.failed\"),\n style: \"danger\",\n },\n spam_complaint: {\n label: t(\"neetoEmailPipeline.emailLogs.statuses.spamComplaint\"),\n style: \"danger\",\n },\n};\n\nexport const FILTER_COLUMNS = [\n {\n node: \"email\",\n key: \"email\",\n label: t(\"neetoEmailPipeline.emailLogs.filters.recipient\"),\n type: \"text\",\n },\n {\n node: \"status\",\n key: \"status\",\n label: t(\"neetoEmailPipeline.emailLogs.filters.status\"),\n type: \"multi_option\",\n values: Object.entries(STATUS_STYLES).map(([value, { label }]) => ({\n label,\n value,\n })),\n },\n {\n node: \"created_at\",\n key: \"created_at\",\n label: t(\"neetoEmailPipeline.emailLogs.filters.date\"),\n type: \"single_date\",\n },\n];\n","import axios from \"axios\";\n\nimport { BASE_URL } from \"src/constants\";\n\nconst emailLogsApi = {\n fetch: params => axios.get(BASE_URL, { params }),\n show: id => axios.get(`${BASE_URL}/${id}`),\n};\n\nexport default emailLogsApi;\n","import { useQuery } from \"@tanstack/react-query\";\n\nimport emailLogsApi from \"apis/email_logs\";\nimport { QUERY_KEYS } from \"src/constants\";\n\nexport const useFetchEmailLogs = (params, options = {}) =>\n useQuery({\n queryKey: [QUERY_KEYS.EMAIL_LOGS, params],\n queryFn: () => emailLogsApi.fetch(params),\n ...options,\n });\n\nexport const useFetchEmailLog = (id, options = {}) =>\n useQuery({\n queryKey: [QUERY_KEYS.EMAIL_LOG, id],\n queryFn: () => emailLogsApi.show(id),\n enabled: !!id,\n ...options,\n });\n","import { Typography } from \"neetoui\";\n\nconst DetailField = ({ label, value }) => {\n if (!value) return null;\n\n return (\n <div className=\"mb-3\">\n <Typography\n className=\"neeto-ui-text-gray-500 mb-0.5\"\n component=\"p\"\n style=\"body3\"\n >\n {label}\n </Typography>\n <Typography component=\"p\" style=\"body2\">\n {value}\n </Typography>\n </div>\n );\n};\n\nexport default DetailField;\n","import { Spinner, Typography } from \"neetoui\";\nimport { useTranslation } from \"react-i18next\";\n\nconst EmailBody = ({ body, isLoading }) => {\n const { t } = useTranslation();\n\n if (isLoading) {\n return (\n <div className=\"flex h-full items-center justify-center\">\n <Spinner />\n <Typography className=\"neeto-ui-text-gray-500 ml-2\" style=\"body3\">\n {t(\"neetoEmailPipeline.emailLogs.pane.loadingBody\")}\n </Typography>\n </div>\n );\n }\n\n if (!body) {\n return (\n <div className=\"flex h-full items-center justify-center\">\n <Typography className=\"neeto-ui-text-gray-500\" style=\"body2\">\n {t(\"neetoEmailPipeline.emailLogs.pane.noBody\")}\n </Typography>\n </div>\n );\n }\n\n return (\n <iframe\n sandbox=\"\"\n srcDoc={body}\n style={{ width: \"100%\", height: \"100%\", border: \"none\" }}\n title={t(\"neetoEmailPipeline.emailLogs.pane.emailBody\")}\n />\n );\n};\n\nexport default EmailBody;\n","import { dateFormat } from \"neetocommons/utils\";\nimport { Typography } from \"neetoui\";\nimport { isEmpty, prop } from \"ramda\";\n\nconst TimelineEntry = ({ label, timestamp, isLast }) => (\n <div className=\"flex gap-3\">\n <div className=\"flex flex-col items-center\">\n <div className=\"neeto-ui-bg-primary-500 mt-1.5 h-2 w-2 flex-shrink-0 neeto-ui-rounded-full\" />\n {!isLast && <div className=\"neeto-ui-bg-gray-300 w-px flex-1\" />}\n </div>\n <div className=\"pb-4\">\n <Typography component=\"p\" style=\"body2\">\n {label}\n </Typography>\n <Typography\n className=\"neeto-ui-text-gray-500\"\n component=\"p\"\n style=\"body3\"\n >\n {dateFormat.dateTime(timestamp)}\n </Typography>\n </div>\n </div>\n);\n\nconst Timeline = ({ entries }) => {\n const visibleEntries = entries.filter(prop(\"timestamp\"));\n\n if (isEmpty(visibleEntries)) return null;\n\n return visibleEntries.map((entry, index) => (\n <TimelineEntry\n isLast={index === visibleEntries.length - 1}\n key={entry.label}\n label={entry.label}\n timestamp={entry.timestamp}\n />\n ));\n};\n\nexport default Timeline;\n","import { Callout, Pane as NeetoUIPane, Tag, Typography } from \"neetoui\";\nimport { useTranslation } from \"react-i18next\";\n\nimport { useFetchEmailLog } from \"hooks/useEmailLogsApi\";\nimport { STATUS_STYLES } from \"src/constants\";\n\nimport DetailField from \"./DetailField\";\nimport EmailBody from \"./EmailBody\";\nimport Timeline from \"./Timeline\";\n\nconst Pane = ({ isOpen, onClose, record }) => {\n const { t } = useTranslation();\n\n const { data: showResponse, isLoading: isBodyLoading } = useFetchEmailLog(\n record?.id\n );\n\n if (!record) return null;\n\n const body = showResponse?.emailLog?.body;\n\n const statusConfig = STATUS_STYLES[record.status] || {\n label: record.status,\n style: \"primary\",\n };\n\n const showDeliveryMethod =\n record.deliveryMethod && record.deliveryMethod !== \"sparkpost\";\n\n return (\n <NeetoUIPane {...{ isOpen, onClose }} size=\"extraLarge\">\n <NeetoUIPane.Header>\n <Typography style=\"h2\">\n {t(\"neetoEmailPipeline.emailLogs.pane.title\")}\n </Typography>\n </NeetoUIPane.Header>\n <NeetoUIPane.Body hasFooter={false}>\n <div className=\"flex h-full gap-6 pb-8\">\n <div className=\"w-1/3 overflow-y-auto\">\n <div className=\"mb-4\">\n <Tag label={statusConfig.label} style={statusConfig.style} />\n </div>\n <DetailField\n label={t(\"neetoEmailPipeline.emailLogs.pane.recipient\")}\n value={record.email}\n />\n <DetailField\n label={t(\"neetoEmailPipeline.emailLogs.pane.from\")}\n value={record.fromEmail}\n />\n <DetailField\n label={t(\"neetoEmailPipeline.emailLogs.pane.subject\")}\n value={record.subject}\n />\n {showDeliveryMethod && (\n <DetailField\n label={t(\"neetoEmailPipeline.emailLogs.pane.deliveryMethod\")}\n value={record.deliveryMethod}\n />\n )}\n <div className=\"neeto-ui-border-gray-200 mt-5 border-t pt-4\">\n <Typography\n className=\"neeto-ui-text-gray-500 mb-3\"\n component=\"p\"\n style=\"body3\"\n >\n {t(\"neetoEmailPipeline.emailLogs.pane.timeline\")}\n </Typography>\n <Timeline\n entries={[\n {\n label: t(\"neetoEmailPipeline.emailLogs.pane.queued\"),\n timestamp: record.createdAt,\n },\n {\n label: t(\"neetoEmailPipeline.emailLogs.pane.handedOver\"),\n timestamp: record.sentAt,\n },\n {\n label: t(\"neetoEmailPipeline.emailLogs.pane.delivered\"),\n timestamp: record.deliveredAt,\n },\n {\n label: t(\"neetoEmailPipeline.emailLogs.pane.failed\"),\n timestamp: record.failedAt,\n },\n ]}\n />\n </div>\n {record.statusDetail && (\n <div className=\"mt-4\">\n <Callout style=\"danger\">{record.statusDetail}</Callout>\n </div>\n )}\n </div>\n <div className=\"neeto-ui-border-gray-200 w-2/3 border-l pl-6\">\n <EmailBody {...{ body }} isLoading={isBodyLoading} />\n </div>\n </div>\n </NeetoUIPane.Body>\n </NeetoUIPane>\n );\n};\n\nexport default Pane;\n","import { isPresent } from \"neetocist\";\nimport { withT } from \"neetocommons/react-utils\";\nimport { Bar as FiltersBar } from \"neetofilters\";\nimport SubHeader from \"neetomolecules/SubHeader\";\nimport { Typography } from \"neetoui\";\n\nimport { FILTER_COLUMNS } from \"src/constants\";\n\nconst EmailLogsSubHeader = withT(\n ({\n t,\n totalCount,\n filters,\n genericSearchProps,\n isFilterPaneOpen,\n setIsFilterPaneOpen,\n handleFiltersChange,\n searchTerm,\n }) => (\n <>\n <SubHeader\n className=\"mb-4\"\n leftActionBlock={\n totalCount > 0 && (\n <Typography weight=\"semibold\">\n {t(\"neetoEmailPipeline.emailLogs.emailWithCount\", {\n count: totalCount,\n })}\n </Typography>\n )\n }\n rightActionBlock={\n <SubHeader.RightBlock\n filterProps={{\n columns: FILTER_COLUMNS,\n isOpen: isFilterPaneOpen,\n keyword: genericSearchProps,\n setIsOpen: setIsFilterPaneOpen,\n onChange: handleFiltersChange,\n }}\n />\n }\n />\n {(isPresent(filters) || isPresent(searchTerm)) && (\n <FiltersBar\n className=\"mb-4\"\n columns={FILTER_COLUMNS}\n keyword={genericSearchProps}\n setIsPaneOpen={setIsFilterPaneOpen}\n onChange={handleFiltersChange}\n />\n )}\n </>\n )\n);\n\nexport default EmailLogsSubHeader;\n","import { t } from \"i18next\";\nimport { dateFormat } from \"neetocommons/utils\";\nimport { Button, Tag } from \"neetoui\";\n\nimport { STATUS_STYLES } from \"src/constants\";\n\nexport const buildColumnData = ({ onRowClick }) => [\n {\n dataIndex: \"email\",\n key: \"email\",\n title: t(\"neetoEmailPipeline.emailLogs.columns.recipient\"),\n width: \"25%\",\n ellipsis: true,\n isHidable: false,\n render: (email, record) => (\n <div className=\"flex items-center gap-x-1 overflow-hidden\">\n <Button\n className=\"truncate\"\n label={email}\n style=\"link\"\n onClick={() => onRowClick(record)}\n />\n {record.recipientType && record.recipientType !== \"to\" && (\n <span className=\"neeto-ui-text-gray-500 flex-shrink-0 text-xs\">\n ({record.recipientType})\n </span>\n )}\n </div>\n ),\n },\n {\n dataIndex: \"subject\",\n key: \"subject\",\n title: t(\"neetoEmailPipeline.emailLogs.columns.subject\"),\n width: \"45%\",\n ellipsis: true,\n },\n {\n dataIndex: \"status\",\n key: \"status\",\n title: t(\"neetoEmailPipeline.emailLogs.columns.status\"),\n width: \"10%\",\n render: status => {\n const config = STATUS_STYLES[status] || {\n label: status,\n style: \"primary\",\n };\n\n return <Tag label={config.label} style={config.style} />;\n },\n },\n {\n dataIndex: \"createdAt\",\n key: \"createdAt\",\n title: t(\"neetoEmailPipeline.emailLogs.columns.sentAt\"),\n width: \"25%\",\n render: dateFormat.dateTime,\n },\n];\n","import { useMemo } from \"react\";\n\nimport { DEFAULT_PAGE_SIZE } from \"neetocommons/constants\";\nimport { Table as NeetoUITable } from \"neetoui\";\n\nimport { buildColumnData } from \"./utils\";\n\nconst Table = ({\n data,\n loading,\n totalCount,\n currentPage,\n pageSize = DEFAULT_PAGE_SIZE,\n onPageChange,\n onRowClick,\n}) => {\n const columns = useMemo(() => buildColumnData({ onRowClick }), [onRowClick]);\n\n return (\n <NeetoUITable\n {...{ loading, totalCount }}\n fixedHeight\n columnData={columns}\n currentPageNumber={currentPage}\n defaultPageSize={pageSize}\n handlePageChange={onPageChange}\n rowData={data}\n scroll={{ x: \"100%\" }}\n />\n );\n};\n\nexport default Table;\n","import { useState } from \"react\";\n\nimport { isPresent } from \"neetocist\";\nimport { DEFAULT_PAGE_SIZE } from \"neetocommons/constants\";\nimport Container from \"neetomolecules/Container\";\nimport Header from \"neetomolecules/Header\";\nimport { Tooltip, Typography } from \"neetoui\";\nimport { useTranslation } from \"react-i18next\";\n\nimport { useFetchEmailLogs } from \"hooks/useEmailLogsApi\";\n\nimport Pane from \"./Pane\";\nimport SubHeader from \"./SubHeader\";\nimport Table from \"./Table\";\n\nconst EmailLogs = ({ canViewEmailLogs, breadcrumbs }) => {\n const { t } = useTranslation();\n const [page, setPage] = useState(1);\n const [searchTerm, setSearchTerm] = useState(\"\");\n const [filters, setFilters] = useState([]);\n const [isFilterPaneOpen, setIsFilterPaneOpen] = useState(false);\n const [selectedRecord, setSelectedRecord] = useState(null);\n\n const resetPage = () => setPage(1);\n\n const handleFiltersChange = newFilters => {\n setFilters(newFilters);\n resetPage();\n };\n\n const genericSearchProps = {\n key: \"search_term\",\n node: \"email\",\n value: searchTerm,\n model: \"\",\n };\n\n const queryParams = {\n page,\n pageSize: DEFAULT_PAGE_SIZE,\n ...(isPresent(searchTerm) && { searchTerm }),\n ...(isPresent(filters) && { neetoFilters: filters }),\n };\n\n const { data: response, isLoading } = useFetchEmailLogs(queryParams, {\n enabled: canViewEmailLogs,\n });\n\n const emailLogs = response?.emailLogs || [];\n const stats = response?.stats || {};\n const totalCount = response?.totalCount || 0;\n const retentionDays = response?.retentionDays || 30;\n\n if (!canViewEmailLogs) return null;\n\n const buildSubtitle = () => {\n const total = stats.total || 0;\n if (total === 0) return null;\n\n const deliveredPct = ((stats.delivered / total) * 100).toFixed(1);\n const bouncedPct = ((stats.bounced / total) * 100).toFixed(1);\n const droppedPct = ((stats.dropped / total) * 100).toFixed(1);\n\n return t(\"neetoEmailPipeline.emailLogs.subtitle\", {\n retentionDays,\n total: total.toLocaleString(),\n deliveredPct,\n bouncedPct,\n droppedPct,\n });\n };\n\n const subtitle = buildSubtitle();\n const rateLimited = stats.rateLimited || 0;\n\n return (\n <Container>\n <Header\n {...{ breadcrumbs }}\n title={t(\"neetoEmailPipeline.emailLogs.title\")}\n searchProps={{\n enableUrlSync: false,\n placeholder: t(\"neetoEmailPipeline.emailLogs.searchPlaceholder\"),\n onSearch: value => {\n setSearchTerm(value);\n resetPage();\n },\n }}\n />\n {(subtitle || rateLimited > 0) && (\n <Typography\n className=\"neeto-ui-text-gray-500 -mt-3 mb-2 text-sm\"\n component=\"p\"\n >\n {subtitle}\n {subtitle && rateLimited > 0 && \" · \"}\n {rateLimited > 0 && (\n <Tooltip\n position=\"bottom\"\n content={t(\"neetoEmailPipeline.emailLogs.rateLimitedTooltip\", {\n count: rateLimited,\n })}\n >\n <span className=\"neeto-ui-text-warning-500 cursor-default\">\n {t(\"neetoEmailPipeline.emailLogs.rateLimitedStat\", {\n count: rateLimited,\n })}\n </span>\n </Tooltip>\n )}\n </Typography>\n )}\n <SubHeader\n {...{\n filters,\n genericSearchProps,\n handleFiltersChange,\n isFilterPaneOpen,\n searchTerm,\n setIsFilterPaneOpen,\n totalCount,\n }}\n />\n <Table\n {...{ totalCount }}\n currentPage={page}\n data={emailLogs}\n loading={isLoading}\n onPageChange={setPage}\n onRowClick={setSelectedRecord}\n />\n <Pane\n isOpen={!!selectedRecord}\n record={selectedRecord}\n onClose={() => setSelectedRecord(null)}\n />\n </Container>\n );\n};\n\nexport default EmailLogs;\n"],"names":["BASE_URL","QUERY_KEYS","EMAIL_LOGS","EMAIL_LOG","STATUS_STYLES","delivered","label","t","style","bounced","dropped","handed_over","queued","failed","spam_complaint","FILTER_COLUMNS","node","key","type","values","Object","entries","map","_ref","_ref2","_slicedToArray","value","emailLogsApi","fetch","params","axios","get","show","id","concat","useFetchEmailLogs","options","arguments","length","undefined","useQuery","_objectSpread","queryKey","queryFn","useFetchEmailLog","enabled","DetailField","_jsxs","className","children","_jsx","Typography","component","EmailBody","body","isLoading","_useTranslation","useTranslation","Spinner","sandbox","srcDoc","width","height","border","title","TimelineEntry","timestamp","isLast","dateFormat","dateTime","Timeline","visibleEntries","filter","prop","isEmpty","entry","index","Pane","_showResponse$emailLo","isOpen","onClose","record","_useFetchEmailLog","showResponse","data","isBodyLoading","emailLog","statusConfig","status","showDeliveryMethod","deliveryMethod","NeetoUIPane","size","Header","Body","hasFooter","Tag","email","fromEmail","subject","createdAt","sentAt","deliveredAt","failedAt","statusDetail","Callout","EmailLogsSubHeader","withT","totalCount","filters","genericSearchProps","isFilterPaneOpen","setIsFilterPaneOpen","handleFiltersChange","searchTerm","_Fragment","SubHeader","leftActionBlock","weight","count","rightActionBlock","RightBlock","filterProps","columns","keyword","setIsOpen","onChange","isPresent","FiltersBar","setIsPaneOpen","buildColumnData","onRowClick","dataIndex","ellipsis","isHidable","render","Button","onClick","recipientType","config","Table","loading","currentPage","_ref$pageSize","pageSize","DEFAULT_PAGE_SIZE","onPageChange","useMemo","NeetoUITable","fixedHeight","columnData","currentPageNumber","defaultPageSize","handlePageChange","rowData","scroll","x","EmailLogs","canViewEmailLogs","breadcrumbs","_useState","useState","_useState2","page","setPage","_useState3","_useState4","setSearchTerm","_useState5","_useState6","setFilters","_useState7","_useState8","_useState9","_useState10","selectedRecord","setSelectedRecord","resetPage","newFilters","model","queryParams","neetoFilters","_useFetchEmailLogs","response","emailLogs","stats","retentionDays","buildSubtitle","total","deliveredPct","toFixed","bouncedPct","droppedPct","toLocaleString","subtitle","rateLimited","Container","searchProps","enableUrlSync","placeholder","onSearch","Tooltip","position","content"],"mappings":"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"}