mirror of
				https://github.com/NodeBB/NodeBB.git
				synced 2025-10-30 18:46:01 +01:00 
			
		
		
		
	feat: #7032
This commit is contained in:
		| @@ -23,6 +23,7 @@ | |||||||
| @import "./extend/rewards"; | @import "./extend/rewards"; | ||||||
| @import "./extend/widgets"; | @import "./extend/widgets"; | ||||||
| @import "./advanced/database"; | @import "./advanced/database"; | ||||||
|  | @import "./advanced/events"; | ||||||
| @import "./advanced/logs"; | @import "./advanced/logs"; | ||||||
| @import "./advanced/errors"; | @import "./advanced/errors"; | ||||||
| @import "./advanced/hooks"; | @import "./advanced/hooks"; | ||||||
|   | |||||||
							
								
								
									
										6
									
								
								public/less/admin/advanced/events.less
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								public/less/admin/advanced/events.less
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,6 @@ | |||||||
|  | .delete-event { | ||||||
|  | 	i { | ||||||
|  | 		cursor: pointer; | ||||||
|  | 		margin-left: 10px; | ||||||
|  | 	} | ||||||
|  | } | ||||||
| @@ -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 () { | 		$('#filter').on('change', function () { | ||||||
| 			var filter = $(this).val(); | 			var filter = $(this).val(); | ||||||
| 			ajaxify.go('admin/advanced/events' + (filter ? '?filter=' + filter : '')); | 			ajaxify.go('admin/advanced/events' + (filter ? '?filter=' + filter : '')); | ||||||
|   | |||||||
| @@ -158,9 +158,7 @@ events.deleteEvents = function (eids, callback) { | |||||||
| 	var keys; | 	var keys; | ||||||
| 	async.waterfall([ | 	async.waterfall([ | ||||||
| 		function (next) { | 		function (next) { | ||||||
| 			keys = eids.map(function (eid) { | 			keys = eids.map(eid => 'event:' + eid); | ||||||
| 				return 'event:' + eid; |  | ||||||
| 			}); |  | ||||||
| 			db.getObjectsFields(keys, ['type'], next); | 			db.getObjectsFields(keys, ['type'], next); | ||||||
| 		}, | 		}, | ||||||
| 		function (eventData, next) { | 		function (eventData, next) { | ||||||
|   | |||||||
| @@ -333,6 +333,10 @@ SocketAdmin.errors.clear = function (socket, data, callback) { | |||||||
| 	meta.errors.clear(callback); | 	meta.errors.clear(callback); | ||||||
| }; | }; | ||||||
|  |  | ||||||
|  | SocketAdmin.deleteEvents = function (socket, eids, callback) { | ||||||
|  | 	events.deleteEvents(eids, callback); | ||||||
|  | }; | ||||||
|  |  | ||||||
| SocketAdmin.deleteAllEvents = function (socket, data, callback) { | SocketAdmin.deleteAllEvents = function (socket, data, callback) { | ||||||
| 	events.deleteAll(callback); | 	events.deleteAll(callback); | ||||||
| }; | }; | ||||||
|   | |||||||
| @@ -13,7 +13,7 @@ | |||||||
| 				<!-- ENDIF !events.length --> | 				<!-- ENDIF !events.length --> | ||||||
| 				<div class="events-list"> | 				<div class="events-list"> | ||||||
| 				<!-- BEGIN events --> | 				<!-- BEGIN events --> | ||||||
| 				<div> | 				<div data-eid="{events.eid}"> | ||||||
| 					<span>#{events.eid} </span><span class="label label-info">{events.type}</span> | 					<span>#{events.eid} </span><span class="label label-info">{events.type}</span> | ||||||
| 					<a href="{config.relative_path}/user/{events.user.userslug}" target="_blank"> | 					<a href="{config.relative_path}/user/{events.user.userslug}" target="_blank"> | ||||||
| 						<!-- IF events.user.picture --> | 						<!-- IF events.user.picture --> | ||||||
| @@ -23,6 +23,7 @@ | |||||||
| 						<!-- ENDIF events.user.picture --> | 						<!-- ENDIF events.user.picture --> | ||||||
| 					</a> | 					</a> | ||||||
| 					<a href="{config.relative_path}/user/{events.user.userslug}" target="_blank">{events.user.username}</a> (uid {events.uid}) (IP {events.ip}) | 					<a href="{config.relative_path}/user/{events.user.userslug}" target="_blank">{events.user.username}</a> (uid {events.uid}) (IP {events.ip}) | ||||||
|  | 					<span class="pull-right delete-event"><i class="fa fa-trash-o"></i></span> | ||||||
| 					<span class="pull-right">{events.timestampISO}</span> | 					<span class="pull-right">{events.timestampISO}</span> | ||||||
| 					<br /><br /> | 					<br /><br /> | ||||||
| 					<pre>{events.jsonString}</pre> | 					<pre>{events.jsonString}</pre> | ||||||
|   | |||||||
| @@ -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) { | 	it('should delete all events', function (done) { | ||||||
| 		socketAdmin.deleteAllEvents({ uid: adminUid }, {}, function (err) { | 		socketAdmin.deleteAllEvents({ uid: adminUid }, {}, function (err) { | ||||||
| 			assert.ifError(err); | 			assert.ifError(err); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user