Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions src/components/EventEditor.vue
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ b-modal(v-if="event && event.id", :id="'edit-modal-' + event.id", ref="eventEdit
b-checkbox(v-if="typeof event.data[k] === typeof true", v-model="editedEvent.data[k]", style="margin: 0.25em")
b-input(v-if="typeof event.data[k] === typeof 'string'", v-model="editedEvent.data[k]", size="sm")
b-input(v-if="typeof event.data[k] === 'number'", v-model.number="editedEvent.data[k]", size="sm", type="number")
b-input(v-if="Array.isArray(event.data[k])", :value="event.data[k].join(', ')", size="sm", disabled)
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Inconsistent prop binding for array field value

The new array input binds :value to event.data[k].join(', ') — the original component prop — while every other field type in this table uses editedEvent.data[k] (the locally fetched/edited copy). Although this has no visible effect while the field is disabled, it's inconsistent and would silently show stale data if the field ever becomes editable, or if event and editedEvent ever diverge.

Suggested change
b-input(v-if="Array.isArray(event.data[k])", :value="event.data[k].join(', ')", size="sm", disabled)
b-input(v-if="Array.isArray(event.data[k])", :value="editedEvent.data[k].join(', ')", size="sm", disabled)


hr

Expand Down
19 changes: 19 additions & 0 deletions src/util/tooltip.js
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,25 @@ export function buildTooltip(bucket, e) {
<tr><th>Title</th><td>${sanitize(e.data.title)}</td></tr>
<tr><th>URL</th><td><a href=${sanitize(e.data.url)}>${sanitize(e.data.url)}</a></td></tr>
`;
if (e.data.gmail_activity) {
inner += `<tr><th>Gmail Activity</th><td>${sanitize(e.data.gmail_activity)}</td></tr>`;
if (e.data.from)
inner += `<tr><th>From</th><td>${sanitize(e.data.from)}</td></tr>`;
Comment on lines +36 to +37
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Missing Array.isArray guard on from field

The to, cc, and bcc fields all defensively handle both array and string via Array.isArray(), but from is always treated as a plain string. Some email APIs do represent multiple senders as an array — if e.data.from ever arrives as an array, it would render as [object Array] in the tooltip rather than a readable email address.

For consistency with the other address fields:

Suggested change
if (e.data.from)
inner += `<tr><th>From</th><td>${sanitize(e.data.from)}</td></tr>`;
if (e.data.from)
inner += `<tr><th>From</th><td>${sanitize(
Array.isArray(e.data.from) ? e.data.from.join(', ') : e.data.from
)}</td></tr>`;

if (e.data.subject)
inner += `<tr><th>Subject</th><td>${sanitize(e.data.subject)}</td></tr>`;
if (e.data.to && e.data.to.length > 0)
inner += `<tr><th>To</th><td>${sanitize(
Array.isArray(e.data.to) ? e.data.to.join(', ') : e.data.to
)}</td></tr>`;
if (e.data.cc && e.data.cc.length > 0)
inner += `<tr><th>CC</th><td>${sanitize(
Array.isArray(e.data.cc) ? e.data.cc.join(', ') : e.data.cc
)}</td></tr>`;
if (e.data.bcc && e.data.bcc.length > 0)
inner += `<tr><th>BCC</th><td>${sanitize(
Array.isArray(e.data.bcc) ? e.data.bcc.join(', ') : e.data.bcc
)}</td></tr>`;
}
} else if (bucket.type.startsWith('app.editor')) {
inner = `
<tr><th>Filename</th><td>${sanitize(_.last(e.data.file.split('/')))}</td></tr>
Expand Down
2 changes: 1 addition & 1 deletion src/visualizations/EventList.vue
Original file line number Diff line number Diff line change
Expand Up @@ -144,7 +144,7 @@ export default {
},
computed: {
displayed_events: function () {
return this.events.slice(0, this.limit);
return (this.events || []).slice(0, this.limit);
},
},
methods: {
Expand Down