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_USERNAME_PERMISSION = "admin.users.write.username";
const CHANGE_PASSWORD_PERMISSION = "admin.users.write.password"; const CHANGE_PASSWORD_PERMISSION = "admin.users.write.password";
const CHANGE_ROLE_PERMISSION ="admin.users.write.role"; 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 CHANGE_PTERO_PERMISSION = "admin.users.write.pterodactyl";
const DELETE_PERMISSION = "admin.users.delete"; const DELETE_PERMISSION = "admin.users.delete";
const NOTIFY_PERMISSION = "admin.users.notify"; const NOTIFY_PERMISSION = "admin.users.notify";
@ -361,10 +361,10 @@ class UserController extends Controller
return datatables($query) return datatables($query)
->addColumn('avatar', function (User $user) { ->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) { ->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) { ->addColumn('verified', function (User $user) {
return $user->getVerifiedStatus(); return $user->getVerifiedStatus();
@ -378,10 +378,10 @@ class UserController extends Controller
$suspendText = $user->isSuspended() ? __('Unsuspend') : __('Suspend'); $suspendText = $user->isSuspended() ? __('Unsuspend') : __('Suspend');
return ' 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="' . __('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="btn btn-sm btn-secondary mr-1"><i class="fas fa-envelope"></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="btn btn-sm text-white btn-warning mr-1"><i class="fas fa-eye"></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="btn btn-sm btn-info mr-1"><i class="fas fa-pen"></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) . '"> <form class="d-inline" method="post" action="' . route('admin.users.togglesuspend', $user->id) . '">
' . csrf_field() . ' ' . 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> <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) . '"> <form class="d-inline" onsubmit="return submitResult();" method="post" action="' . route('admin.users.destroy', $user->id) . '">
' . csrf_field() . ' ' . csrf_field() . '
' . method_field('DELETE') . ' ' . 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> </form>
'; ';
}) })

View file

@ -1,137 +1,138 @@
<?php <?php
return [ return [
'*',
/* /*
* Permissions for admin * Permissions for admin
*/ */
'admin.roles.read', 'All Permissions' => '*',
'admin.roles.create',
'admin.roles.edit', 'View Roles' => 'admin.roles.read',
'admin.roles.delete', 'Create Role' => 'admin.roles.create',
'Edit Role' => 'admin.roles.edit',
'Delete Role' => 'admin.roles.delete',
'admin.ticket.read', 'View Tickets' => 'admin.ticket.read',
'admin.tickets.write', 'Manage Ticket' => 'admin.tickets.write',
'admin.tickets.get_notification', 'Receive Ticket Notifications' => 'admin.tickets.get_notification',
'admin.tickets.category.read', 'Create Ticket Category' => 'admin.tickets.category.read',
'admin.tickets.category.write', 'Manage Ticket Category' => 'admin.tickets.category.write',
'admin.ticket_blacklist.read', 'View Blacklist Tickets' => 'admin.ticket_blacklist.read',
'admin.ticket_blacklist.write', 'Manage Blacklist Tickets' => 'admin.ticket_blacklist.write',
'admin.overview.read', 'View Overview' => 'admin.overview.read',
'admin.overview.sync', 'Overview Sync' => 'admin.overview.sync',
'admin.api.read', 'View Api Keys' => 'admin.api.read',
'admin.api.write', 'Manage Api Keys' => 'admin.api.write',
'admin.users.read', 'View Users' => 'admin.users.read',
'admin.users.write', 'Manage Users' => 'admin.users.write',
'admin.users.suspend', 'Suspend Users' => 'admin.users.suspend',
'admin.users.write.credits', 'Manage User Credits' => 'admin.users.write.credits',
'admin.users.write.username', 'Manage User Name' => 'admin.users.write.username',
'admin.users.write.password', 'Manage User Email' => 'admin.users.write.email',
'admin.users.write.role', 'Manage User Password' => 'admin.users.write.password',
'admin.users.write.referal', 'Manage User Role' => 'admin.users.write.role',
'admin.users.write.pterodactyl', 'Manage User Referral' => 'admin.users.write.referral',
'admin.users.write.email', 'Manage User Pterodactyl' => 'admin.users.write.pterodactyl',
'admin.users.notify',
'admin.users.login_as',
'admin.users.delete',
'admin.servers.read', 'Notify Users' => 'admin.users.notify',
'admin.servers.write', 'Login As User' => 'admin.users.login_as',
'admin.servers.suspend', 'Delete User' => 'admin.users.delete',
'admin.servers.write.owner',
'admin.servers.write.identifier',
'admin.servers.delete',
'admin.servers.bypass_creation_enabled',
'admin.products.read', 'View Servers' => 'admin.servers.read',
'admin.products.create', 'Manage Servers' => 'admin.servers.write',
'admin.products.edit', 'Suspend Server' => 'admin.servers.suspend',
'admin.products.delete', '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', 'View Products' => 'admin.products.read',
'admin.store.write', 'Create Product' => 'admin.products.create',
'admin.store.disable', 'Edit Product' => 'admin.products.edit',
'Delete Product' => 'admin.products.delete',
'admin.voucher.read', 'View Store' => 'admin.store.read',
'admin.voucher.write', 'Manage Store' => 'admin.store.write',
'Disable Store' => 'admin.store.disable',
'admin.useful_links.read', 'View Vouchers' => 'admin.voucher.read',
'admin.useful_links.write', 'Manage Voucher' => 'admin.voucher.write',
'admin.legal.read', 'View Useful Links' => 'admin.useful_links.read',
'admin.legal.write', 'Manage Useful Links' => 'admin.useful_links.write',
'admin.payments.read', 'View Legal' => 'admin.legal.read',
'Manage Legal' => 'admin.legal.write',
'admin.partners.read', 'View Payments' => 'admin.payments.read',
'admin.partners.write',
'admin.coupons.read', 'View Partners' => 'admin.partners.read',
'admin.coupons.write', '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 Permissions
*/ */
'settings.discord.read', 'View Discord Settings' => 'settings.discord.read',
'settings.discord.write', 'Manage Discord Settings' => 'settings.discord.write',
'settings.general.read', 'View General Settings' => 'settings.general.read',
'settings.general.write', 'Manage General Settings' => 'settings.general.write',
'settings.invoice.read', 'View Invoice Settings' => 'settings.invoice.read',
'settings.invoice.write', 'Manage Invoice Settings' => 'settings.invoice.write',
'settings.locale.read', 'View Locale Settings' => 'settings.locale.read',
'settings.locale.write', 'Manage Locale Settings' => 'settings.locale.write',
'settings.mail.read', 'View Mail Settings' => 'settings.mail.read',
'settings.mail.write', 'Manage Mail Settings' => 'settings.mail.write',
'settings.pterodactyl.read', 'View Pterodactyl Settings' => 'settings.pterodactyl.read',
'settings.pterodactyl.write', 'Manage Pterodactyl Settings' => 'settings.pterodactyl.write',
'settings.referral.read', 'View Referral Settings' => 'settings.referral.read',
'settings.referral.write', 'Manage Referral Settings' => 'settings.referral.write',
'settings.server.read', 'View Server Settings' => 'settings.server.read',
'settings.server.write', 'Manage Server Settings' => 'settings.server.write',
'settings.ticket.read', 'View Ticket Settings' => 'settings.ticket.read',
'settings.ticket.write', 'Manage Ticket Settings' => 'settings.ticket.write',
'settings.user.read', 'View User Settings' => 'settings.user.read',
'settings.user.write', 'Manage User Settings' => 'settings.user.write',
'settings.website.read', 'View Website Settings' => 'settings.website.read',
'settings.website.write', 'Manage Website Settings' => 'settings.website.write',
'settings.paypal.read', 'View Paypal Settings' => 'settings.paypal.read',
'settings.paypal.write', 'Manage Paypal Settings' => 'settings.paypal.write',
'settings.stripe.read', 'View Stripe Settings' => 'settings.stripe.read',
'settings.stripe.write', 'Manage Stripe Settings' => 'settings.stripe.write',
'settings.mollie.read', 'View Mollie Settings' => 'settings.mollie.read',
'settings.mollie.write', 'Manage Mollie Settings' => 'settings.mollie.write',
/* /*
* Permissions for users * Permissions for users
*/ */
'user.server.create', 'User Create Server' => 'user.server.create',
'user.server.upgrade', 'User Upgrade Server' => 'user.server.upgrade',
'user.shop.buy', 'User Shop Buy' => 'user.shop.buy',
'user.ticket.read', 'User View Tickets' => 'user.ticket.read',
'user.ticket.write', 'User Manage Ticket' => 'user.ticket.write',
'user.referral', '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; namespace Database\Seeders;
use App\Models\User; use App\Models\User;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder; use Illuminate\Database\Seeder;
use Spatie\Permission\Models\Permission; use Spatie\Permission\Models\Permission;
use Spatie\Permission\Models\Role; use Spatie\Permission\Models\Role;
@ -24,33 +23,29 @@ class PermissionsSeeder extends Seeder
$users = User::all(); $users = User::all();
foreach($users as $user){ foreach($users as $user){
$user->assignRole(4); $user->assignRole(Role::findByName('user'));
} }
$admins = User::where("role","admin")->get(); $admins = User::where("role","admin")->get();
foreach($admins as $admin) { foreach($admins as $admin) {
$admin->syncRoles(1); $admin->syncRoles(Role::findByName('Admin'));
} }
$mods = User::where("role","moderator")->get(); $mods = User::where("role","moderator")->get();
foreach($mods as $mod) { foreach($mods as $mod) {
$mod->syncRoles(2); $mod->syncRoles(Role::findByName('Support-Team'));
} }
$clients = User::where("role","client")->get(); $clients = User::where("role","client")->get();
foreach($clients as $client) { foreach($clients as $client) {
$client->syncRoles(3); $client->syncRoles(Role::findByName('Client'));
} }
} }
public function createPermissions() public function createPermissions()
{ {
foreach (config('permissions_web') as $name) { foreach(config('permissions_web') as $permission_name => $permission_value) {
Permission::findOrCreate($name); Permission::create(['name' => $permission_value, 'readable_name' => $permission_name]);
} }
} }

View file

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

View file

@ -1,9 +1,9 @@
@extends('layouts.main') @extends('layouts.main')
@section('content') @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> <h2 class="mb-4 h5">{{ isset($role) ? __('Edit role') : __('Create role') }}</h2>
<form method="post" <form method="post"
@ -43,14 +43,14 @@
multiple> multiple>
@foreach($permissions as $permission) @foreach($permissions as $permission)
<option @if(isset($role) && $role->permissions->contains($permission)) selected <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 @endforeach
</x-input.select> </x-input.select>
</div> </div>
</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> <button name="submit" type="submit" class="btn btn-primary">{{__('Submit')}}</button>
</div> </div>
</form> </form>
@ -61,7 +61,9 @@
<script> <script>
document.addEventListener('DOMContentLoaded', (event) => { document.addEventListener('DOMContentLoaded', (event) => {
$('#permissions').select2(); $('#permissions').select2({
closeOnSelect: false
});
}) })
</script> </script>
@endsection @endsection

View file

@ -1,20 +1,36 @@
@extends('layouts.main') @extends('layouts.main')
@section('content') @section('content')
<div class="main py-4">
@can('admin.roles.write') <section class="content-header">
<div class="d-flex justify-content-end my-3"> <div class="container-fluid">
<a href="{{route('admin.roles.create')}}" class="btn btn-primary"><i <div class="mb-2 row">
class="fa fas fa-shield-alt pe-2"></i>{{__('Create role')}}</a> <div class="col-sm-6">
<h1>{{__('Create role')}}</h1>
</div> </div>
<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>
</section>
<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 @endcan
</div>
<div class="card card-body border-0 shadow table-wrapper table-responsive"> <div class="card-body table-responsive">
<h2 class="mb-4 h5">{{ __('Roles') }}</h2>
<div class="card-body table-responsive"> <div class="card-body table-responsive">
<table id="datatable" class="table table-striped"> <table id="datatable" class="table table-striped">
<thead> <thead>
<tr> <tr>
@ -32,11 +48,12 @@
</div> </div>
</div> </div>
</div>
@endsection
<script>
document.addEventListener("DOMContentLoaded", function () { </div>
</div>
@endsection
<script>
document.addEventListener("DOMContentLoaded", function() {
$('#datatable').DataTable({ $('#datatable').DataTable({
language: { language: {
url: '//cdn.datatables.net/plug-ins/1.11.3/i18n/{{config("SETTINGS::LOCALE:DATATABLES")}}.json' url: '//cdn.datatables.net/plug-ins/1.11.3/i18n/{{config("SETTINGS::LOCALE:DATATABLES")}}.json'
@ -45,18 +62,30 @@
serverSide: true, //increases loading times too much? change back to "true" if it does serverSide: true, //increases loading times too much? change back to "true" if it does
stateSave: true, stateSave: true,
ajax: "{{route('admin.roles.datatable')}}", ajax: "{{route('admin.roles.datatable')}}",
columns: [ columns: [{
{data: 'id'}, data: 'id'
{data: 'name'}, },
{data: 'usercount'}, {
{data: 'permissionscount'}, data: 'name'
{data: 'power'}, },
{data: 'actions' , sortable : false}, {
data: 'usercount'
},
{
data: 'permissionscount'
},
{
data: 'power'
},
{
data: 'actions',
sortable: false
}
], ],
fnDrawCallback: function( oSettings ) { fnDrawCallback: function(oSettings) {
$('[data-toggle="popover"]').popover(); $('[data-toggle="popover"]').popover();
} }
}); });
}); });
</script>
</script>

View file

@ -4,7 +4,7 @@
<!-- CONTENT HEADER --> <!-- CONTENT HEADER -->
<section class="content-header"> <section class="content-header">
<div class="container-fluid"> <div class="container-fluid">
<div class="row mb-2"> <div class="mb-2 row">
<div class="col-sm-6"> <div class="col-sm-6">
<h1>{{__('Ticket')}}</h1> <h1>{{__('Ticket')}}</h1>
</div> </div>
@ -28,9 +28,9 @@
<div class="card-header"> <div class="card-header">
<div class="d-flex justify-content-between"> <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> </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> </div>

View file

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