@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.
- package/README.md +109 -0
- package/app/javascript/src/translations/ar.json +5 -0
- package/app/javascript/src/translations/bg.json +5 -0
- package/app/javascript/src/translations/ca.json +5 -0
- package/app/javascript/src/translations/cs.json +5 -0
- package/app/javascript/src/translations/da.json +5 -0
- package/app/javascript/src/translations/de.json +5 -0
- package/app/javascript/src/translations/en.json +50 -0
- package/app/javascript/src/translations/es-MX.json +5 -0
- package/app/javascript/src/translations/es.json +5 -0
- package/app/javascript/src/translations/et.json +5 -0
- package/app/javascript/src/translations/fi.json +5 -0
- package/app/javascript/src/translations/fil.json +5 -0
- package/app/javascript/src/translations/fr.json +5 -0
- package/app/javascript/src/translations/he.json +5 -0
- package/app/javascript/src/translations/hi.json +5 -0
- package/app/javascript/src/translations/hr.json +5 -0
- package/app/javascript/src/translations/hu.json +5 -0
- package/app/javascript/src/translations/id.json +5 -0
- package/app/javascript/src/translations/index.js +3 -0
- package/app/javascript/src/translations/it.json +5 -0
- package/app/javascript/src/translations/ja.json +5 -0
- package/app/javascript/src/translations/ko.json +5 -0
- package/app/javascript/src/translations/nl.json +5 -0
- package/app/javascript/src/translations/pl.json +5 -0
- package/app/javascript/src/translations/pt-BR.json +5 -0
- package/app/javascript/src/translations/pt.json +5 -0
- package/app/javascript/src/translations/ro.json +5 -0
- package/app/javascript/src/translations/ru.json +5 -0
- package/app/javascript/src/translations/sk.json +5 -0
- package/app/javascript/src/translations/sl.json +5 -0
- package/app/javascript/src/translations/sv.json +5 -0
- package/app/javascript/src/translations/th.json +5 -0
- package/app/javascript/src/translations/tr.json +5 -0
- package/app/javascript/src/translations/uk.json +5 -0
- package/app/javascript/src/translations/vi.json +5 -0
- package/app/javascript/src/translations/zh-CN.json +5 -0
- package/app/javascript/src/translations/zh-TW.json +5 -0
- package/dist/.ready +1 -0
- package/dist/EmailLogs.js +557 -0
- package/dist/EmailLogs.js.map +1 -0
- package/dist/cjs/EmailLogs.js +559 -0
- package/dist/cjs/EmailLogs.js.map +1 -0
- package/dist/cjs/index.js +33 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/index.js +27 -0
- package/dist/index.js.map +1 -0
- package/package.json +234 -0
- 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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"}
|