123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114 |
- <template>
- <div class='container'>
- <table class='table is-striped'>
- <thead>
- <tr>
- <td>Type</td>
- <td>Value</td>
- <td>Reason</td>
- <td>Status</td>
- <td>Options</td>
- </tr>
- </thead>
- <tbody>
- <tr v-for='(index, punishment) in punishments | orderBy "expiresAt" -1' track-by='$index'>
- <td v-if='punishment.type === "banUserId"'>User ID</td>
- <td v-else>IP Address</td>
- <td>{{ punishment.value }}</td>
- <td>{{ punishment.reason }}</td>
- <td>{{ (punishment.active && new Date(punishment.expiresAt).getTime() > Date.now()) ? 'Active' : 'Inactive' }}</td>
- <td>
- <button class='button is-primary' @click='view(punishment)'>View</button>
- </td>
- </tr>
- </tbody>
- </table>
- <div class='card is-fullwidth'>
- <header class='card-header'>
- <p class='card-header-title'>Ban an IP</p>
- </header>
- <div class='card-content'>
- <div class='content'>
- <label class='label'>Expires In</label>
- <select v-model='ipBan.expiresAt'>
- <option value='1h'>1 Hour</option>
- <option value='12h'>12 Hours</option>
- <option value='1d'>1 Day</option>
- <option value='1w'>1 Week</option>
- <option value='1m'>1 Month</option>
- <option value='3m'>3 Months</option>
- <option value='6m'>6 Months</option>
- <option value='1y'>1 Year</option>
- </select>
- <label class='label'>IP</label>
- <p class='control is-expanded'>
- <input class='input' type='text' placeholder='IP address (xxx.xxx.xxx.xxx)' v-model='ipBan.ip'>
- </p>
- <label class='label'>Reason</label>
- <p class='control is-expanded'>
- <input class='input' type='text' placeholder='Reason' v-model='ipBan.reason'>
- </p>
- </div>
- </div>
- <footer class='card-footer'>
- <a class='card-footer-item' @click='banIP()' href='#'>Ban IP</a>
- </footer>
- </div>
- </div>
- <view-punishment v-show='modals.viewPunishment'></view-punishment>
- </template>
- <script>
- import ViewPunishment from '../Modals/ViewPunishment.vue';
- import { Toast } from 'vue-roaster';
- import io from '../../io';
- export default {
- components: { ViewPunishment },
- data() {
- return {
- punishments: [],
- modals: { viewPunishment: false },
- ipBan: {
- expiresAt: '1h'
- }
- }
- },
- methods: {
- toggleModal: function () {
- this.modals.viewPunishment = !this.modals.viewPunishment;
- },
- view: function (punishment) {
- this.$broadcast('viewPunishment', punishment);
- },
- banIP: function() {
- let _this = this;
- _this.socket.emit('punishments.banIP', _this.ipBan.ip, _this.ipBan.reason, _this.ipBan.expiresAt, res => {
- Toast.methods.addToast(res.message, 6000);
- });
- },
- init: function () {
- let _this = this;
- _this.socket.emit('punishments.index', result => {
- if (result.status === 'success') _this.punishments = result.data;
- });
- //_this.socket.emit('apis.joinAdminRoom', 'punishments', () => {});
- }
- },
- ready: function () {
- let _this = this;
- io.getSocket(socket => {
- _this.socket = socket;
- if (_this.socket.connected) _this.init();
- io.onConnect(() => _this.init());
- });
- }
- }
- </script>
- <style lang='scss' scoped>
- body { font-family: 'Roboto', sans-serif; }
- td { vertical-align: middle; }
- select { margin-bottom: 10px; }
- </style>
|