feat: Add readable name for permissions

This commit is contained in:
Ferks-FK 2023-09-15 13:57:00 -04:00
parent f9a102509b
commit 8fdac0ee46
9 changed files with 281 additions and 222 deletions

View file

@ -38,7 +38,7 @@ class UserController extends Controller
const CHANGE_USERNAME_PERMISSION = "admin.users.write.username";
const CHANGE_PASSWORD_PERMISSION = "admin.users.write.password";
const CHANGE_ROLE_PERMISSION ="admin.users.write.role";
const CHANGE_REFERAL_PERMISSION ="admin.users.write.referal";
const CHANGE_REFERAL_PERMISSION ="admin.users.write.referral";
const CHANGE_PTERO_PERMISSION = "admin.users.write.pterodactyl";
const DELETE_PERMISSION = "admin.users.delete";
const NOTIFY_PERMISSION = "admin.users.notify";
@ -361,10 +361,10 @@ class UserController extends Controller
return datatables($query)
->addColumn('avatar', function (User $user) {
return '<img width="28px" height="28px" class="rounded-circle ml-1" src="' . $user->getAvatar() . '">';
return '<img width="28px" height="28px" class="ml-1 rounded-circle" src="' . $user->getAvatar() . '">';
})
->addColumn('credits', function (User $user) {
return '<i class="fas fa-coins mr-2"></i> ' . $user->credits();
return '<i class="mr-2 fas fa-coins"></i> ' . $user->credits();
})
->addColumn('verified', function (User $user) {
return $user->getVerifiedStatus();
@ -378,10 +378,10 @@ class UserController extends Controller
$suspendText = $user->isSuspended() ? __('Unsuspend') : __('Suspend');
return '
<a data-content="' . __('Login as User') . '" data-toggle="popover" data-trigger="hover" data-placement="top" href="' . route('admin.users.loginas', $user->id) . '" class="btn btn-sm btn-primary mr-1"><i class="fas fa-sign-in-alt"></i></a>
<a data-content="' . __('Verify') . '" data-toggle="popover" data-trigger="hover" data-placement="top" href="' . route('admin.users.verifyEmail', $user->id) . '" class="btn btn-sm btn-secondary mr-1"><i class="fas fa-envelope"></i></a>
<a data-content="' . __('Show') . '" data-toggle="popover" data-trigger="hover" data-placement="top" href="' . route('admin.users.show', $user->id) . '" class="btn btn-sm text-white btn-warning mr-1"><i class="fas fa-eye"></i></a>
<a data-content="' . __('Edit') . '" data-toggle="popover" data-trigger="hover" data-placement="top" href="' . route('admin.users.edit', $user->id) . '" class="btn btn-sm btn-info mr-1"><i class="fas fa-pen"></i></a>
<a data-content="' . __('Login as User') . '" data-toggle="popover" data-trigger="hover" data-placement="top" href="' . route('admin.users.loginas', $user->id) . '" class="mr-1 btn btn-sm btn-primary"><i class="fas fa-sign-in-alt"></i></a>
<a data-content="' . __('Verify') . '" data-toggle="popover" data-trigger="hover" data-placement="top" href="' . route('admin.users.verifyEmail', $user->id) . '" class="mr-1 btn btn-sm btn-secondary"><i class="fas fa-envelope"></i></a>
<a data-content="' . __('Show') . '" data-toggle="popover" data-trigger="hover" data-placement="top" href="' . route('admin.users.show', $user->id) . '" class="mr-1 text-white btn btn-sm btn-warning"><i class="fas fa-eye"></i></a>
<a data-content="' . __('Edit') . '" data-toggle="popover" data-trigger="hover" data-placement="top" href="' . route('admin.users.edit', $user->id) . '" class="mr-1 btn btn-sm btn-info"><i class="fas fa-pen"></i></a>
<form class="d-inline" method="post" action="' . route('admin.users.togglesuspend', $user->id) . '">
' . csrf_field() . '
<button data-content="' . $suspendText . '" data-toggle="popover" data-trigger="hover" data-placement="top" class="btn btn-sm ' . $suspendColor . ' text-white mr-1"><i class="far ' . $suspendIcon . '"></i></button>
@ -389,7 +389,7 @@ class UserController extends Controller
<form class="d-inline" onsubmit="return submitResult();" method="post" action="' . route('admin.users.destroy', $user->id) . '">
' . csrf_field() . '
' . method_field('DELETE') . '
<button data-content="' . __('Delete') . '" data-toggle="popover" data-trigger="hover" data-placement="top" class="btn btn-sm btn-danger mr-1"><i class="fas fa-trash"></i></button>
<button data-content="' . __('Delete') . '" data-toggle="popover" data-trigger="hover" data-placement="top" class="mr-1 btn btn-sm btn-danger"><i class="fas fa-trash"></i></button>
</form>
';
})

View file

@ -1,137 +1,138 @@
<?php
return [
'*',
/*
* Permissions for admin
*/
* Permissions for admin
*/
'admin.roles.read',
'admin.roles.create',
'admin.roles.edit',
'admin.roles.delete',
'All Permissions' => '*',
'View Roles' => 'admin.roles.read',
'Create Role' => 'admin.roles.create',
'Edit Role' => 'admin.roles.edit',
'Delete Role' => 'admin.roles.delete',
'admin.ticket.read',
'admin.tickets.write',
'admin.tickets.get_notification',
'View Tickets' => 'admin.ticket.read',
'Manage Ticket' => 'admin.tickets.write',
'Receive Ticket Notifications' => 'admin.tickets.get_notification',
'admin.tickets.category.read',
'admin.tickets.category.write',
'Create Ticket Category' => 'admin.tickets.category.read',
'Manage Ticket Category' => 'admin.tickets.category.write',
'admin.ticket_blacklist.read',
'admin.ticket_blacklist.write',
'View Blacklist Tickets' => 'admin.ticket_blacklist.read',
'Manage Blacklist Tickets' => 'admin.ticket_blacklist.write',
'admin.overview.read',
'admin.overview.sync',
'View Overview' => 'admin.overview.read',
'Overview Sync' => 'admin.overview.sync',
'admin.api.read',
'admin.api.write',
'View Api Keys' => 'admin.api.read',
'Manage Api Keys' => 'admin.api.write',
'admin.users.read',
'admin.users.write',
'admin.users.suspend',
'admin.users.write.credits',
'admin.users.write.username',
'admin.users.write.password',
'admin.users.write.role',
'admin.users.write.referal',
'admin.users.write.pterodactyl',
'admin.users.write.email',
'admin.users.notify',
'admin.users.login_as',
'admin.users.delete',
'View Users' => 'admin.users.read',
'Manage Users' => 'admin.users.write',
'Suspend Users' => 'admin.users.suspend',
'Manage User Credits' => 'admin.users.write.credits',
'Manage User Name' => 'admin.users.write.username',
'Manage User Email' => 'admin.users.write.email',
'Manage User Password' => 'admin.users.write.password',
'Manage User Role' => 'admin.users.write.role',
'Manage User Referral' => 'admin.users.write.referral',
'Manage User Pterodactyl' => 'admin.users.write.pterodactyl',
'admin.servers.read',
'admin.servers.write',
'admin.servers.suspend',
'admin.servers.write.owner',
'admin.servers.write.identifier',
'admin.servers.delete',
'admin.servers.bypass_creation_enabled',
'Notify Users' => 'admin.users.notify',
'Login As User' => 'admin.users.login_as',
'Delete User' => 'admin.users.delete',
'admin.products.read',
'admin.products.create',
'admin.products.edit',
'admin.products.delete',
'View Servers' => 'admin.servers.read',
'Manage Servers' => 'admin.servers.write',
'Suspend Server' => 'admin.servers.suspend',
'Change Server Owner' => 'admin.servers.write.owner',
'Manage Server Identifier' => 'admin.servers.write.identifier',
'Create Server' => 'admin.servers.bypass_creation_enabled',
'Delete Server' => 'admin.servers.delete',
'admin.store.read',
'admin.store.write',
'admin.store.disable',
'View Products' => 'admin.products.read',
'Create Product' => 'admin.products.create',
'Edit Product' => 'admin.products.edit',
'Delete Product' => 'admin.products.delete',
'admin.voucher.read',
'admin.voucher.write',
'View Store' => 'admin.store.read',
'Manage Store' => 'admin.store.write',
'Disable Store' => 'admin.store.disable',
'admin.useful_links.read',
'admin.useful_links.write',
'View Vouchers' => 'admin.voucher.read',
'Manage Voucher' => 'admin.voucher.write',
'admin.legal.read',
'admin.legal.write',
'View Useful Links' => 'admin.useful_links.read',
'Manage Useful Links' => 'admin.useful_links.write',
'admin.payments.read',
'View Legal' => 'admin.legal.read',
'Manage Legal' => 'admin.legal.write',
'admin.partners.read',
'admin.partners.write',
'View Payments' => 'admin.payments.read',
'admin.coupons.read',
'admin.coupons.write',
'View Partners' => 'admin.partners.read',
'Manage Partners' => 'admin.partners.write',
'admin.logs.read',
'View Coupons' => 'admin.coupons.read',
'Manage Coupons' => 'admin.coupons.write',
'View Logs' => 'admin.logs.read',
/*
* Settings Permissions
*/
'settings.discord.read',
'settings.discord.write',
*/
'View Discord Settings' => 'settings.discord.read',
'Manage Discord Settings' => 'settings.discord.write',
'settings.general.read',
'settings.general.write',
'View General Settings' => 'settings.general.read',
'Manage General Settings' => 'settings.general.write',
'settings.invoice.read',
'settings.invoice.write',
'View Invoice Settings' => 'settings.invoice.read',
'Manage Invoice Settings' => 'settings.invoice.write',
'settings.locale.read',
'settings.locale.write',
'View Locale Settings' => 'settings.locale.read',
'Manage Locale Settings' => 'settings.locale.write',
'settings.mail.read',
'settings.mail.write',
'View Mail Settings' => 'settings.mail.read',
'Manage Mail Settings' => 'settings.mail.write',
'settings.pterodactyl.read',
'settings.pterodactyl.write',
'View Pterodactyl Settings' => 'settings.pterodactyl.read',
'Manage Pterodactyl Settings' => 'settings.pterodactyl.write',
'settings.referral.read',
'settings.referral.write',
'View Referral Settings' => 'settings.referral.read',
'Manage Referral Settings' => 'settings.referral.write',
'settings.server.read',
'settings.server.write',
'View Server Settings' => 'settings.server.read',
'Manage Server Settings' => 'settings.server.write',
'settings.ticket.read',
'settings.ticket.write',
'View Ticket Settings' => 'settings.ticket.read',
'Manage Ticket Settings' => 'settings.ticket.write',
'settings.user.read',
'settings.user.write',
'View User Settings' => 'settings.user.read',
'Manage User Settings' => 'settings.user.write',
'settings.website.read',
'settings.website.write',
'View Website Settings' => 'settings.website.read',
'Manage Website Settings' => 'settings.website.write',
'settings.paypal.read',
'settings.paypal.write',
'View Paypal Settings' => 'settings.paypal.read',
'Manage Paypal Settings' => 'settings.paypal.write',
'settings.stripe.read',
'settings.stripe.write',
'View Stripe Settings' => 'settings.stripe.read',
'Manage Stripe Settings' => 'settings.stripe.write',
'settings.mollie.read',
'settings.mollie.write',
'View Mollie Settings' => 'settings.mollie.read',
'Manage Mollie Settings' => 'settings.mollie.write',
/*
* Permissions for users
* Permissions for users
*/
'user.server.create',
'user.server.upgrade',
'user.shop.buy',
'user.ticket.read',
'user.ticket.write',
'user.referral',
'User Create Server' => 'user.server.create',
'User Upgrade Server' => 'user.server.upgrade',
'User Shop Buy' => 'user.shop.buy',
'User View Tickets' => 'user.ticket.read',
'User Manage Ticket' => 'user.ticket.write',
'User View Referral' => 'user.referral',
];

View file

@ -0,0 +1,32 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('permissions', function (Blueprint $table) {
$table->string('readable_name')->after('name');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('permissions', function (Blueprint $table) {
$table->removeColumn('readable_name');
});
}
};

View file

@ -3,7 +3,6 @@
namespace Database\Seeders;
use App\Models\User;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
use Spatie\Permission\Models\Permission;
use Spatie\Permission\Models\Role;
@ -24,33 +23,29 @@ class PermissionsSeeder extends Seeder
$users = User::all();
foreach($users as $user){
$user->assignRole(4);
$user->assignRole(Role::findByName('user'));
}
$admins = User::where("role","admin")->get();
foreach($admins as $admin) {
$admin->syncRoles(1);
$admin->syncRoles(Role::findByName('Admin'));
}
$mods = User::where("role","moderator")->get();
foreach($mods as $mod) {
$mod->syncRoles(2);
$mod->syncRoles(Role::findByName('Support-Team'));
}
$clients = User::where("role","client")->get();
foreach($clients as $client) {
$client->syncRoles(3);
$client->syncRoles(Role::findByName('Client'));
}
}
public function createPermissions()
{
foreach (config('permissions_web') as $name) {
Permission::findOrCreate($name);
foreach(config('permissions_web') as $permission_name => $permission_value) {
Permission::create(['name' => $permission_value, 'readable_name' => $permission_name]);
}
}

View file

@ -56,12 +56,12 @@
</li>
<li class="nav-item d-none d-sm-inline-block">
<a href="{{ route('home') }}" class="nav-link"><i
class="fas fa-home mr-2"></i>{{ __('Home') }}</a>
class="mr-2 fas fa-home"></i>{{ __('Home') }}</a>
</li>
@if (!empty($discord_settings->invite_url))
<li class="nav-item d-none d-sm-inline-block">
<a href="{{ $discord_settings->invite_url }}" class="nav-link" target="__blank"><i
class="fab fa-discord mr-2"></i>{{ __('Discord') }}</a>
class="mr-2 fab fa-discord"></i>{{ __('Discord') }}</a>
</li>
@endif
@ -71,13 +71,13 @@
<li class="nav-item dropdown">
<a class="nav-link" href="#" id="languageDropdown" role="button" data-toggle="dropdown"
aria-haspopup="true" aria-expanded="false">
<span class="mr-1 d-lg-inline text-gray-600">
<small><i class="fa fa-language mr-2"></i></small>{{ __('Language') }}
<span class="mr-1 text-gray-600 d-lg-inline">
<small><i class="mr-2 fa fa-language"></i></small>{{ __('Language') }}
</span>
</a>
<div class="dropdown-menu dropdown-menu-right shadow animated--grow-in"
<div class="shadow dropdown-menu dropdown-menu-right animated--grow-in"
aria-labelledby="changeLocale">
<form method="post" action="{{ route('changeLocale') }}" class="nav-item text-center">
<form method="post" action="{{ route('changeLocale') }}" class="text-center nav-item">
@csrf
@foreach (explode(',', $locale_settings->available) as $key)
<button class="dropdown-item" name="inputLocale" value="{{ $key }}">
@ -99,7 +99,7 @@
</ul>
<!-- Right navbar links -->
<ul class="navbar-nav ml-auto">
<ul class="ml-auto navbar-nav">
<!-- Notifications Dropdown Menu -->
<li class="nav-item dropdown">
<a class="nav-link" data-toggle="dropdown" href="#">
@ -117,9 +117,9 @@
@foreach (Auth::user()->unreadNotifications->sortBy('created_at')->take(5) as $notification)
<a href="{{ route('notifications.show', $notification->id) }}" class="dropdown-item">
<span class="d-inline-block text-truncate" style="max-width: 150px;"><i
class="fas fa-envelope mr-2"></i>{{ $notification->data['title'] }}</span>
class="mr-2 fas fa-envelope"></i>{{ $notification->data['title'] }}</span>
<span
class="float-right text-muted text-sm">{{ $notification->created_at->longAbsoluteDiffForHumans() }}
class="float-right text-sm text-muted">{{ $notification->created_at->longAbsoluteDiffForHumans() }}
ago</span>
</a>
@endforeach
@ -136,20 +136,20 @@
<li class="nav-item dropdown">
<a class="nav-link" href="#" id="userDropdown" role="button" data-toggle="dropdown"
aria-haspopup="true" aria-expanded="false">
<span class="mr-1 d-lg-inline text-gray-600">
<small><i class="fas fa-coins mr-2"></i></small>{{ Auth::user()->credits() }}
<span class="mr-1 text-gray-600 d-lg-inline">
<small><i class="mr-2 fas fa-coins"></i></small>{{ Auth::user()->credits() }}
</span>
</a>
<div class="dropdown-menu dropdown-menu-right shadow animated--grow-in"
<div class="shadow dropdown-menu dropdown-menu-right animated--grow-in"
aria-labelledby="userDropdown">
<a class="dropdown-item" href="{{ route('store.index') }}">
<i class="fas fa-coins fa-sm fa-fw mr-2 text-gray-400"></i>
<i class="mr-2 text-gray-400 fas fa-coins fa-sm fa-fw"></i>
{{ __('Store') }}
</a>
<div class="dropdown-divider"></div>
<a class="dropdown-item" data-toggle="modal" data-target="#redeemVoucherModal"
href="javascript:void(0)">
<i class="fas fa-money-check-alt fa-sm fa-fw mr-2 text-gray-400"></i>
<i class="mr-2 text-gray-400 fas fa-money-check-alt fa-sm fa-fw"></i>
{{ __('Redeem code') }}
</a>
</div>
@ -158,27 +158,27 @@
<li class="nav-item dropdown no-arrow">
<a class="nav-link dropdown-toggle" href="#" id="userDropdown" role="button"
data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<span class="mr-1 d-lg-inline text-gray-600 small">
<span class="mr-1 text-gray-600 d-lg-inline small">
{{ Auth::user()->name }}
<img width="28px" height="28px" class="rounded-circle ml-1"
<img width="28px" height="28px" class="ml-1 rounded-circle"
src="{{ Auth::user()->getAvatar() }}">
</span>
</a>
<!-- Dropdown - User Information -->
<div class="dropdown-menu dropdown-menu-right shadow animated--grow-in"
<div class="shadow dropdown-menu dropdown-menu-right animated--grow-in"
aria-labelledby="userDropdown">
<a class="dropdown-item" href="{{ route('profile.index') }}">
<i class="fas fa-user fa-sm fa-fw mr-2 text-gray-400"></i>
<i class="mr-2 text-gray-400 fas fa-user fa-sm fa-fw"></i>
{{ __('Profile') }}
</a>
{{-- <a class="dropdown-item" href="#"> --}}
{{-- <i class="fas fa-list fa-sm fa-fw mr-2 text-gray-400"></i> --}}
{{-- <i class="mr-2 text-gray-400 fas fa-list fa-sm fa-fw"></i> --}}
{{-- Activity Log --}}
{{-- </a> --}}
@if (session()->get('previousUser'))
<div class="dropdown-divider"></div>
<a class="dropdown-item" href="{{ route('users.logbackin') }}">
<i class="fas fa-sign-in-alt fa-sm fa-fw mr-2 text-gray-400"></i>
<i class="mr-2 text-gray-400 fas fa-sign-in-alt fa-sm fa-fw"></i>
{{ __('Log back in') }}
</a>
@endif
@ -187,7 +187,7 @@
@csrf
<button class="dropdown-item" href="#" data-toggle="modal"
data-target="#logoutModal">
<i class="fas fa-sign-out-alt fa-sm fa-fw mr-2 text-gray-400"></i>
<i class="mr-2 text-gray-400 fas fa-sign-out-alt fa-sm fa-fw"></i>
{{ __('Logout') }}
</button>
</form>
@ -250,7 +250,7 @@
<li class="nav-item">
<a href="{{ route('ticket.index') }}"
class="nav-link @if (Request::routeIs('ticket.*')) active @endif">
<i class="nav-icon fas fas fa-ticket-alt"></i>
<i class="nav-icon fas fa-ticket-alt"></i>
<p>{{ __('Support Ticket') }}</p>
</a>
</li>
@ -357,7 +357,7 @@
'admin.users.write.username',
'admin.users.write.password',
'admin.users.write.role',
'admin.users.write.referal',
'admin.users.write.referral',
'admin.users.write.pterodactyl','admin.servers.read',
'admin.servers.write',
'admin.servers.suspend',
@ -379,7 +379,7 @@
'admin.users.write.username',
'admin.users.write.password',
'admin.users.write.role',
'admin.users.write.referal',
'admin.users.write.referral',
'admin.users.write.pterodactyl'])
<li class="nav-item">
<a href="{{ route('admin.users.index') }}"
@ -510,7 +510,7 @@
<!--
@if (!Auth::user()->hasVerifiedEmail())
@if (Auth::user()->created_at->diffInHours(now(), false) > 1)
<div class="alert alert-warning p-2 m-2">
<div class="p-2 m-2 alert alert-warning">
<h5><i class="icon fas fa-exclamation-circle"></i> {{ __('Warning!') }}</h5>
{{ __('You have not yet verified your email address') }} <a class="text-primary"
href="{{ route('verification.send') }}">{{ __('Click here to resend verification email') }}</a>

View file

@ -1,9 +1,9 @@
@extends('layouts.main')
@section('content')
<div class="main py-4">
<div class="py-4 main">
<div class="card card-body border-0 shadow table-wrapper table-responsive">
<div class="border-0 shadow card card-body table-wrapper table-responsive">
<h2 class="mb-4 h5">{{ isset($role) ? __('Edit role') : __('Create role') }}</h2>
<form method="post"
@ -43,14 +43,14 @@
multiple>
@foreach($permissions as $permission)
<option @if(isset($role) && $role->permissions->contains($permission)) selected
@endif value="{{$permission->id}}">{{$permission->name}}</option>
@endif value="{{$permission->id}}">{{$permission->readable_name}}</option>
@endforeach
</x-input.select>
</div>
</div>
<div class="form-group d-flex justify-content-end mt-3">
<div class="mt-3 form-group d-flex justify-content-end">
<button name="submit" type="submit" class="btn btn-primary">{{__('Submit')}}</button>
</div>
</form>
@ -61,7 +61,9 @@
<script>
document.addEventListener('DOMContentLoaded', (event) => {
$('#permissions').select2();
$('#permissions').select2({
closeOnSelect: false
});
})
</script>
@endsection

View file

@ -1,62 +1,91 @@
@extends('layouts.main')
@section('content')
<div class="main py-4">
@can('admin.roles.write')
<div class="d-flex justify-content-end my-3">
<a href="{{route('admin.roles.create')}}" class="btn btn-primary"><i
class="fa fas fa-shield-alt pe-2"></i>{{__('Create role')}}</a>
<section class="content-header">
<div class="container-fluid">
<div class="mb-2 row">
<div class="col-sm-6">
<h1>{{__('Create role')}}</h1>
</div>
@endcan
<div class="card card-body border-0 shadow table-wrapper table-responsive">
<h2 class="mb-4 h5">{{ __('Roles') }}</h2>
<div class="card-body table-responsive">
<table id="datatable" class="table table-striped">
<thead>
<tr>
<th>{{__("ID")}}</th>
<th>{{__("Name")}}</th>
<th>{{__("User count")}}</th>
<th>{{__("Permissions count")}}</th>
<th>{{__("Power")}}</th>
<th>{{__("Actions")}}</th>
</tr>
</thead>
<tbody>
</tbody>
</table>
<div class="col-sm-6">
<ol class="breadcrumb float-sm-right">
<li class="breadcrumb-item"><a href="{{route('home')}}">{{__('Dashboard')}}</a></li>
<li class="breadcrumb-item"><a class="text-muted" href="{{route('admin.roles.index')}}">{{__('Roles List')}}</a></li>
</ol>
</div>
</div>
</div>
@endsection
<script>
</section>
document.addEventListener("DOMContentLoaded", function () {
$('#datatable').DataTable({
language: {
url: '//cdn.datatables.net/plug-ins/1.11.3/i18n/{{config("SETTINGS::LOCALE:DATATABLES")}}.json'
},
processing: true,
serverSide: true, //increases loading times too much? change back to "true" if it does
stateSave: true,
ajax: "{{route('admin.roles.datatable')}}",
columns: [
{data: 'id'},
{data: 'name'},
{data: 'usercount'},
{data: 'permissionscount'},
{data: 'power'},
{data: 'actions' , sortable : false},
],
fnDrawCallback: function( oSettings ) {
$('[data-toggle="popover"]').popover();
}
<section class="content">
<div class="container-fluid">
<div class="card">
<div class="card-header">
<div class="d-flex justify-content-between">
<h5 class="card-title"><i class="mr-2 fas fa-user-check"></i>{{__('Roles List')}}</h5>
</div>
@can('admin.roles.write')
<a href="{{route('admin.roles.create')}}" class="float-right btn btn-primary"><i class="fa fas fa-shield-alt pe-2"></i>{{__('Create role')}}</a>
@endcan
</div>
<div class="card-body table-responsive">
<div class="card-body table-responsive">
<table id="datatable" class="table table-striped">
<thead>
<tr>
<th>{{__("ID")}}</th>
<th>{{__("Name")}}</th>
<th>{{__("User count")}}</th>
<th>{{__("Permissions count")}}</th>
<th>{{__("Power")}}</th>
<th>{{__("Actions")}}</th>
</tr>
</thead>
<tbody>
</tbody>
</table>
</div>
</div>
</div>
</div>
@endsection
<script>
document.addEventListener("DOMContentLoaded", function() {
$('#datatable').DataTable({
language: {
url: '//cdn.datatables.net/plug-ins/1.11.3/i18n/{{config("SETTINGS::LOCALE:DATATABLES")}}.json'
},
processing: true,
serverSide: true, //increases loading times too much? change back to "true" if it does
stateSave: true,
ajax: "{{route('admin.roles.datatable')}}",
columns: [{
data: 'id'
},
{
data: 'name'
},
{
data: 'usercount'
},
{
data: 'permissionscount'
},
{
data: 'power'
},
{
data: 'actions',
sortable: false
}
],
fnDrawCallback: function(oSettings) {
$('[data-toggle="popover"]').popover();
}
});
});
});
</script>
</script>

View file

@ -4,7 +4,7 @@
<!-- CONTENT HEADER -->
<section class="content-header">
<div class="container-fluid">
<div class="row mb-2">
<div class="mb-2 row">
<div class="col-sm-6">
<h1>{{__('Ticket')}}</h1>
</div>
@ -28,9 +28,9 @@
<div class="card-header">
<div class="d-flex justify-content-between">
<h5 class="card-title"><i class="fas fa-ticket-alt mr-2"></i>{{__('Ticket List')}}</h5>
<h5 class="card-title"><i class="mr-2 fas fa-ticket-alt"></i>{{__('Ticket List')}}</h5>
</div>
<a href="{{route("admin.ticket.category.index")}}"><button class="btn btn-primary float-right">+ {{__("Add Category")}}</button></a>
<a href="{{route("admin.ticket.category.index")}}"><button class="float-right btn btn-primary">+ {{__("Add Category")}}</button></a>
</div>

View file

@ -56,12 +56,12 @@
</li>
<li class="nav-item d-none d-sm-inline-block">
<a href="{{ route('home') }}" class="nav-link"><i
class="fas fa-home mr-2"></i>{{ __('Home') }}</a>
class="mr-2 fas fa-home"></i>{{ __('Home') }}</a>
</li>
@if (!empty($discord_settings->invite_url))
<li class="nav-item d-none d-sm-inline-block">
<a href="{{ $discord_settings->invite_url }}" class="nav-link" target="__blank"><i
class="fab fa-discord mr-2"></i>{{ __('Discord') }}</a>
class="mr-2 fab fa-discord"></i>{{ __('Discord') }}</a>
</li>
@endif
@ -71,13 +71,13 @@
<li class="nav-item dropdown">
<a class="nav-link" href="#" id="languageDropdown" role="button" data-toggle="dropdown"
aria-haspopup="true" aria-expanded="false">
<span class="mr-1 d-lg-inline text-gray-600">
<small><i class="fa fa-language mr-2"></i></small>{{ __('Language') }}
<span class="mr-1 text-gray-600 d-lg-inline">
<small><i class="mr-2 fa fa-language"></i></small>{{ __('Language') }}
</span>
</a>
<div class="dropdown-menu dropdown-menu-right shadow animated--grow-in"
<div class="shadow dropdown-menu dropdown-menu-right animated--grow-in"
aria-labelledby="changeLocale">
<form method="post" action="{{ route('changeLocale') }}" class="nav-item text-center">
<form method="post" action="{{ route('changeLocale') }}" class="text-center nav-item">
@csrf
@foreach (explode(',', $locale_settings->available) as $key)
<button class="dropdown-item" name="inputLocale" value="{{ $key }}">
@ -99,7 +99,7 @@
</ul>
<!-- Right navbar links -->
<ul class="navbar-nav ml-auto">
<ul class="ml-auto navbar-nav">
<!-- Notifications Dropdown Menu -->
<li class="nav-item dropdown">
<a class="nav-link" data-toggle="dropdown" href="#">
@ -117,9 +117,9 @@
@foreach (Auth::user()->unreadNotifications->sortBy('created_at')->take(5) as $notification)
<a href="{{ route('notifications.show', $notification->id) }}" class="dropdown-item">
<span class="d-inline-block text-truncate" style="max-width: 150px;"><i
class="fas fa-envelope mr-2"></i>{{ $notification->data['title'] }}</span>
class="mr-2 fas fa-envelope"></i>{{ $notification->data['title'] }}</span>
<span
class="float-right text-muted text-sm">{{ $notification->created_at->longAbsoluteDiffForHumans() }}
class="float-right text-sm text-muted">{{ $notification->created_at->longAbsoluteDiffForHumans() }}
ago</span>
</a>
@endforeach
@ -136,20 +136,20 @@
<li class="nav-item dropdown">
<a class="nav-link" href="#" id="userDropdown" role="button" data-toggle="dropdown"
aria-haspopup="true" aria-expanded="false">
<span class="mr-1 d-lg-inline text-gray-600">
<small><i class="fas fa-coins mr-2"></i></small>{{ Auth::user()->credits() }}
<span class="mr-1 text-gray-600 d-lg-inline">
<small><i class="mr-2 fas fa-coins"></i></small>{{ Auth::user()->credits() }}
</span>
</a>
<div class="dropdown-menu dropdown-menu-right shadow animated--grow-in"
<div class="shadow dropdown-menu dropdown-menu-right animated--grow-in"
aria-labelledby="userDropdown">
<a class="dropdown-item" href="{{ route('store.index') }}">
<i class="fas fa-coins fa-sm fa-fw mr-2 text-gray-400"></i>
<i class="mr-2 text-gray-400 fas fa-coins fa-sm fa-fw"></i>
{{ __('Store') }}
</a>
<div class="dropdown-divider"></div>
<a class="dropdown-item" data-toggle="modal" data-target="#redeemVoucherModal"
href="javascript:void(0)">
<i class="fas fa-money-check-alt fa-sm fa-fw mr-2 text-gray-400"></i>
<i class="mr-2 text-gray-400 fas fa-money-check-alt fa-sm fa-fw"></i>
{{ __('Redeem code') }}
</a>
</div>
@ -158,27 +158,27 @@
<li class="nav-item dropdown no-arrow">
<a class="nav-link dropdown-toggle" href="#" id="userDropdown" role="button"
data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<span class="mr-1 d-lg-inline text-gray-600 small">
<span class="mr-1 text-gray-600 d-lg-inline small">
{{ Auth::user()->name }}
<img width="28px" height="28px" class="rounded-circle ml-1"
<img width="28px" height="28px" class="ml-1 rounded-circle"
src="{{ Auth::user()->getAvatar() }}">
</span>
</a>
<!-- Dropdown - User Information -->
<div class="dropdown-menu dropdown-menu-right shadow animated--grow-in"
<div class="shadow dropdown-menu dropdown-menu-right animated--grow-in"
aria-labelledby="userDropdown">
<a class="dropdown-item" href="{{ route('profile.index') }}">
<i class="fas fa-user fa-sm fa-fw mr-2 text-gray-400"></i>
<i class="mr-2 text-gray-400 fas fa-user fa-sm fa-fw"></i>
{{ __('Profile') }}
</a>
{{-- <a class="dropdown-item" href="#"> --}}
{{-- <i class="fas fa-list fa-sm fa-fw mr-2 text-gray-400"></i> --}}
{{-- <i class="mr-2 text-gray-400 fas fa-list fa-sm fa-fw"></i> --}}
{{-- Activity Log --}}
{{-- </a> --}}
@if (session()->get('previousUser'))
<div class="dropdown-divider"></div>
<a class="dropdown-item" href="{{ route('users.logbackin') }}">
<i class="fas fa-sign-in-alt fa-sm fa-fw mr-2 text-gray-400"></i>
<i class="mr-2 text-gray-400 fas fa-sign-in-alt fa-sm fa-fw"></i>
{{ __('Log back in') }}
</a>
@endif
@ -187,7 +187,7 @@
@csrf
<button class="dropdown-item" href="#" data-toggle="modal"
data-target="#logoutModal">
<i class="fas fa-sign-out-alt fa-sm fa-fw mr-2 text-gray-400"></i>
<i class="mr-2 text-gray-400 fas fa-sign-out-alt fa-sm fa-fw"></i>
{{ __('Logout') }}
</button>
</form>
@ -250,7 +250,7 @@
<li class="nav-item">
<a href="{{ route('ticket.index') }}"
class="nav-link @if (Request::routeIs('ticket.*')) active @endif">
<i class="nav-icon fas fas fa-ticket-alt"></i>
<i class="nav-icon fas fa-ticket-alt"></i>
<p>{{ __('Support Ticket') }}</p>
</a>
</li>
@ -357,7 +357,7 @@
'admin.users.write.username',
'admin.users.write.password',
'admin.users.write.role',
'admin.users.write.referal',
'admin.users.write.referral',
'admin.users.write.pterodactyl','admin.servers.read',
'admin.servers.write',
'admin.servers.suspend',
@ -379,7 +379,7 @@
'admin.users.write.username',
'admin.users.write.password',
'admin.users.write.role',
'admin.users.write.referal',
'admin.users.write.referral',
'admin.users.write.pterodactyl'])
<li class="nav-item">
<a href="{{ route('admin.users.index') }}"
@ -520,7 +520,7 @@
<!--
@if (!Auth::user()->hasVerifiedEmail())
@if (Auth::user()->created_at->diffInHours(now(), false) > 1)
<div class="alert alert-warning p-2 m-2">
<div class="p-2 m-2 alert alert-warning">
<h5><i class="icon fas fa-exclamation-circle"></i> {{ __('Warning!') }}</h5>
{{ __('You have not yet verified your email address') }} <a class="text-primary"
href="{{ route('verification.send') }}">{{ __('Click here to resend verification email') }}</a>