| 
					
				 | 
			
			
				@@ -1,3 +1,174 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+<script setup lang="ts"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import { ref } from "vue"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import { useStore } from "vuex"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import Toast from "toasters"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import AdvancedTable from "@/components/AdvancedTable.vue"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+const store = useStore(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+const { socket } = store.state.websockets; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+const ipBan = ref({ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	expiresAt: "1h" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+const columnDefault = ref({ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	sortable: true, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	hidable: true, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	defaultVisibility: "shown", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	draggable: true, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	resizable: true, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	minWidth: 150, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	maxWidth: 600 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+const columns = ref([ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		name: "options", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		displayName: "Options", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		properties: ["_id"], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		sortable: false, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		hidable: false, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		resizable: false, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		minWidth: 76, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		defaultWidth: 76 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		name: "status", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		displayName: "Status", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		properties: ["status"], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		sortable: false, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		defaultWidth: 150 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		name: "type", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		displayName: "Type", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		properties: ["type"], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		sortProperty: "type" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		name: "value", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		displayName: "Value", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		properties: ["value"], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		sortProperty: "value", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		defaultWidth: 150 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		name: "reason", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		displayName: "Reason", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		properties: ["reason"], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		sortProperty: "reason" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		name: "punishedBy", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		displayName: "Punished By", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		properties: ["punishedBy"], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		sortProperty: "punishedBy", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		defaultWidth: 200, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		defaultVisibility: "hidden" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		name: "punishedAt", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		displayName: "Punished At", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		properties: ["punishedAt"], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		sortProperty: "punishedAt", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		defaultWidth: 200, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		defaultVisibility: "hidden" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		name: "expiresAt", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		displayName: "Expires At", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		properties: ["expiresAt"], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		sortProperty: "verifiedAt", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		defaultWidth: 200, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		defaultVisibility: "hidden" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+const filters = ref([ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		name: "status", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		displayName: "Status", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		property: "status", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		filterTypes: ["exact"], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		defaultFilterType: "exact", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		dropdown: [ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			["Active", "Active"], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			["Inactive", "Inactive"] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		name: "type", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		displayName: "Type", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		property: "type", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		filterTypes: ["exact"], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		defaultFilterType: "exact", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		dropdown: [ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			["banUserId", "User ID"], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			["banUserIp", "IP Address"] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		name: "value", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		displayName: "Value", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		property: "value", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		filterTypes: ["contains", "exact", "regex"], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		defaultFilterType: "contains" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		name: "reason", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		displayName: "Reason", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		property: "reason", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		filterTypes: ["contains", "exact", "regex"], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		defaultFilterType: "contains" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		name: "punishedBy", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		displayName: "Punished By", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		property: "punishedBy", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		filterTypes: ["contains", "exact", "regex"], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		defaultFilterType: "contains" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		name: "punishedAt", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		displayName: "Punished At", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		property: "punishedAt", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		filterTypes: ["datetimeBefore", "datetimeAfter"], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		defaultFilterType: "datetimeBefore" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		name: "expiresAt", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		displayName: "Expires At", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		property: "expiresAt", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		filterTypes: ["datetimeBefore", "datetimeAfter"], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		defaultFilterType: "datetimeBefore" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+const openModal = payload => 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	store.dispatch("modalVisibility/openModal", payload); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+const banIP = () => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	socket.dispatch( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		"punishments.banIP", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		ipBan.value.ip, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		ipBan.value.reason, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		ipBan.value.expiresAt, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		res => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			new Toast(res.message); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+const getDateFormatted = createdAt => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	const date = new Date(createdAt); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	const year = date.getFullYear(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	const month = `${date.getMonth() + 1}`.padStart(2, 0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	const day = `${date.getDate()}`.padStart(2, 0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	const hour = `${date.getHours()}`.padStart(2, 0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	const minute = `${date.getMinutes()}`.padStart(2, 0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	return `${year}-${month}-${day} ${hour}:${minute}`; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+</script> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 <template> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	<div class="admin-tab container"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		<page-metadata title="Admin | Users | Punishments" /> 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -122,184 +293,6 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	</div> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 </template> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-<script> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-import { mapGetters, mapActions } from "vuex"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-import Toast from "toasters"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-import AdvancedTable from "@/components/AdvancedTable.vue"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-export default { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	components: { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		AdvancedTable 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	data() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		return { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			ipBan: { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				expiresAt: "1h" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			columnDefault: { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				sortable: true, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				hidable: true, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				defaultVisibility: "shown", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				draggable: true, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				resizable: true, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				minWidth: 150, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				maxWidth: 600 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			columns: [ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					name: "options", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					displayName: "Options", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					properties: ["_id"], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					sortable: false, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					hidable: false, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					resizable: false, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					minWidth: 76, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					defaultWidth: 76 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					name: "status", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					displayName: "Status", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					properties: ["status"], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					sortable: false, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					defaultWidth: 150 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					name: "type", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					displayName: "Type", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					properties: ["type"], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					sortProperty: "type" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					name: "value", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					displayName: "Value", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					properties: ["value"], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					sortProperty: "value", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					defaultWidth: 150 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					name: "reason", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					displayName: "Reason", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					properties: ["reason"], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					sortProperty: "reason" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					name: "punishedBy", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					displayName: "Punished By", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					properties: ["punishedBy"], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					sortProperty: "punishedBy", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					defaultWidth: 200, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					defaultVisibility: "hidden" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					name: "punishedAt", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					displayName: "Punished At", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					properties: ["punishedAt"], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					sortProperty: "punishedAt", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					defaultWidth: 200, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					defaultVisibility: "hidden" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					name: "expiresAt", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					displayName: "Expires At", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					properties: ["expiresAt"], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					sortProperty: "verifiedAt", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					defaultWidth: 200, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					defaultVisibility: "hidden" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			filters: [ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					name: "status", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					displayName: "Status", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					property: "status", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					filterTypes: ["exact"], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					defaultFilterType: "exact", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					dropdown: [ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-						["Active", "Active"], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-						["Inactive", "Inactive"] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					name: "type", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					displayName: "Type", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					property: "type", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					filterTypes: ["exact"], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					defaultFilterType: "exact", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					dropdown: [ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-						["banUserId", "User ID"], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-						["banUserIp", "IP Address"] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					name: "value", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					displayName: "Value", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					property: "value", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					filterTypes: ["contains", "exact", "regex"], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					defaultFilterType: "contains" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					name: "reason", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					displayName: "Reason", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					property: "reason", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					filterTypes: ["contains", "exact", "regex"], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					defaultFilterType: "contains" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					name: "punishedBy", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					displayName: "Punished By", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					property: "punishedBy", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					filterTypes: ["contains", "exact", "regex"], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					defaultFilterType: "contains" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					name: "punishedAt", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					displayName: "Punished At", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					property: "punishedAt", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					filterTypes: ["datetimeBefore", "datetimeAfter"], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					defaultFilterType: "datetimeBefore" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					name: "expiresAt", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					displayName: "Expires At", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					property: "expiresAt", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					filterTypes: ["datetimeBefore", "datetimeAfter"], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					defaultFilterType: "datetimeBefore" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	computed: { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		...mapGetters({ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			socket: "websockets/getSocket" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	methods: { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		banIP() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			this.socket.dispatch( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				"punishments.banIP", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				this.ipBan.ip, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				this.ipBan.reason, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				this.ipBan.expiresAt, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				res => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					new Toast(res.message); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		getDateFormatted(createdAt) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			const date = new Date(createdAt); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			const year = date.getFullYear(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			const month = `${date.getMonth() + 1}`.padStart(2, 0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			const day = `${date.getDate()}`.padStart(2, 0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			const hour = `${date.getHours()}`.padStart(2, 0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			const minute = `${date.getMinutes()}`.padStart(2, 0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			return `${year}-${month}-${day} ${hour}:${minute}`; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		...mapActions("modalVisibility", ["openModal"]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-</script> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 <style lang="less" scoped> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 .card .button.is-primary { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	width: 100%; 
			 |