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