diff --git a/public/less/admin/admin.less b/public/less/admin/admin.less index 16dff9d563..9a772ae08e 100644 --- a/public/less/admin/admin.less +++ b/public/less/admin/admin.less @@ -23,6 +23,7 @@ @import "./extend/rewards"; @import "./extend/widgets"; @import "./advanced/database"; +@import "./advanced/events"; @import "./advanced/logs"; @import "./advanced/errors"; @import "./advanced/hooks"; diff --git a/public/less/admin/advanced/events.less b/public/less/admin/advanced/events.less new file mode 100644 index 0000000000..1ab80d047c --- /dev/null +++ b/public/less/admin/advanced/events.less @@ -0,0 +1,6 @@ +.delete-event { + i { + cursor: pointer; + margin-left: 10px; + } +} \ No newline at end of file diff --git a/public/src/admin/advanced/events.js b/public/src/admin/advanced/events.js index 0645f8e799..fc8592fc6d 100644 --- a/public/src/admin/advanced/events.js +++ b/public/src/admin/advanced/events.js @@ -14,6 +14,17 @@ define('admin/advanced/events', function () { }); }); + $('.delete-event').on('click', function () { + var parentEl = $(this).parents('[data-eid]'); + var eid = parentEl.attr('data-eid'); + socket.emit('admin.deleteEvents', [eid], function (err) { + if (err) { + return app.alertError(err.message); + } + parentEl.remove(); + }); + }) + $('#filter').on('change', function () { var filter = $(this).val(); ajaxify.go('admin/advanced/events' + (filter ? '?filter=' + filter : '')); diff --git a/src/events.js b/src/events.js index 9d727e8451..f6fe006d02 100644 --- a/src/events.js +++ b/src/events.js @@ -158,9 +158,7 @@ events.deleteEvents = function (eids, callback) { var keys; async.waterfall([ function (next) { - keys = eids.map(function (eid) { - return 'event:' + eid; - }); + keys = eids.map(eid => 'event:' + eid); db.getObjectsFields(keys, ['type'], next); }, function (eventData, next) { diff --git a/src/socket.io/admin.js b/src/socket.io/admin.js index a2afd326d2..6e0d38db17 100644 --- a/src/socket.io/admin.js +++ b/src/socket.io/admin.js @@ -333,6 +333,10 @@ SocketAdmin.errors.clear = function (socket, data, callback) { meta.errors.clear(callback); }; +SocketAdmin.deleteEvents = function (socket, eids, callback) { + events.deleteEvents(eids, callback); +}; + SocketAdmin.deleteAllEvents = function (socket, data, callback) { events.deleteAll(callback); }; diff --git a/src/views/admin/advanced/events.tpl b/src/views/admin/advanced/events.tpl index 4372d12b93..55ad612a56 100644 --- a/src/views/admin/advanced/events.tpl +++ b/src/views/admin/advanced/events.tpl @@ -13,7 +13,7 @@
-
+
#{events.eid} {events.type} @@ -23,6 +23,7 @@ {events.user.username} (uid {events.uid}) (IP {events.ip}) + {events.timestampISO}

{events.jsonString}
diff --git a/test/socket.io.js b/test/socket.io.js index 736f2a6378..72b883e841 100644 --- a/test/socket.io.js +++ b/test/socket.io.js @@ -580,6 +580,20 @@ describe('socket.io', function () { }); }); + it('should delete a single event', function (done) { + db.getSortedSetRevRange('events:time', 0, 0, function (err, eids) { + assert.ifError(err); + socketAdmin.deleteEvents({ uid: adminUid }, eids, function (err) { + assert.ifError(err); + db.isSortedSetMembers('events:time', eids, function (err, isMembers) { + assert.ifError(err); + assert(!isMembers.includes(true)); + done(); + }); + }); + }); + }); + it('should delete all events', function (done) { socketAdmin.deleteAllEvents({ uid: adminUid }, {}, function (err) { assert.ifError(err);