Added ability to delete single application
Also moved User observer code to Application observer
This commit is contained in:
parent
4dc412e53c
commit
e978a5417b
|
@ -282,4 +282,16 @@ class ApplicationController extends Controller
|
||||||
|
|
||||||
return redirect()->back();
|
return redirect()->back();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function delete(Request $request, Application $application)
|
||||||
|
{
|
||||||
|
|
||||||
|
$this->authorize('delete', $application);
|
||||||
|
$application->delete(); // observers will run, cleaning it up
|
||||||
|
|
||||||
|
$request->session()->flash('success', 'Application deleted. Comments, appointments and responses have also been deleted.');
|
||||||
|
return redirect()->back();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -114,6 +114,7 @@ class VacancyController extends Controller
|
||||||
|
|
||||||
public function edit(Request $request, Vacancy $position)
|
public function edit(Request $request, Vacancy $position)
|
||||||
{
|
{
|
||||||
|
$this->authorize('update', $vacancy);
|
||||||
return view('dashboard.administration.editposition')
|
return view('dashboard.administration.editposition')
|
||||||
->with('vacancy', $position);
|
->with('vacancy', $position);
|
||||||
}
|
}
|
||||||
|
@ -122,6 +123,7 @@ class VacancyController extends Controller
|
||||||
|
|
||||||
public function update(VacancyEditRequest $request, Vacancy $position)
|
public function update(VacancyEditRequest $request, Vacancy $position)
|
||||||
{
|
{
|
||||||
|
$this->authorize('update', $vacancy);
|
||||||
|
|
||||||
$position->vacancyFullDescription = $request->vacancyFullDescription;
|
$position->vacancyFullDescription = $request->vacancyFullDescription;
|
||||||
$position->vacancyDescription = $request->vacancyDescription;
|
$position->vacancyDescription = $request->vacancyDescription;
|
||||||
|
|
|
@ -0,0 +1,93 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Observers;
|
||||||
|
|
||||||
|
use App\Application;
|
||||||
|
|
||||||
|
class ApplicationObserver
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Handle the application "created" event.
|
||||||
|
*
|
||||||
|
* @param \App\Application $application
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function created(Application $application)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handle the application "updated" event.
|
||||||
|
*
|
||||||
|
* @param \App\Application $application
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function updated(Application $application)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
}
|
||||||
|
|
||||||
|
public function deleting(Application $application)
|
||||||
|
{
|
||||||
|
$application->response()->delete();
|
||||||
|
$votes = $application->votes;
|
||||||
|
|
||||||
|
foreach ($votes as $vote)
|
||||||
|
{
|
||||||
|
Log::debug('Referential integrity cleanup: Deleting and detaching vote ' . $vote->id);
|
||||||
|
$vote->application()->detach($application->id);
|
||||||
|
$vote->delete();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!is_null($application->appointment))
|
||||||
|
{
|
||||||
|
Log::debug('RIC: Deleting appointment!');
|
||||||
|
$application->appointment()->delete();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!$application->comments->isEmpty())
|
||||||
|
{
|
||||||
|
Log::debug('RIC: Deleting comments!');
|
||||||
|
foreach($application->comments as $comment)
|
||||||
|
{
|
||||||
|
$comment->delete();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// application can now be deleted
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handle the application "deleted" event.
|
||||||
|
*
|
||||||
|
* @param \App\Application $application
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function deleted(Application $application)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handle the application "restored" event.
|
||||||
|
*
|
||||||
|
* @param \App\Application $application
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function restored(Application $application)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handle the application "force deleted" event.
|
||||||
|
*
|
||||||
|
* @param \App\Application $application
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function forceDeleted(Application $application)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
}
|
||||||
|
}
|
|
@ -48,30 +48,7 @@ class UserObserver
|
||||||
Log::debug('RIC: Now trying to delete applications and responses...');
|
Log::debug('RIC: Now trying to delete applications and responses...');
|
||||||
foreach($applications as $application)
|
foreach($applications as $application)
|
||||||
{
|
{
|
||||||
$application->response()->delete();
|
// code moved to Application observer, where it gets rid of attached elements individually
|
||||||
$votes = $application->votes;
|
|
||||||
|
|
||||||
foreach ($votes as $vote)
|
|
||||||
{
|
|
||||||
Log::debug('RIC: Deleting and detaching vote ' . $vote->id);
|
|
||||||
$vote->application()->detach($application->id);
|
|
||||||
$vote->delete();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!is_null($application->appointment))
|
|
||||||
{
|
|
||||||
Log::debug('RIC: Deleting appointment!');
|
|
||||||
$application->appointment()->delete();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!$application->comments->isEmpty())
|
|
||||||
{
|
|
||||||
Log::debug('RIC: Deleting comments!');
|
|
||||||
foreach($application->comments as $comment)
|
|
||||||
{
|
|
||||||
$comment->delete();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Log::debug('RIC: Deleting application ' . $application->id);
|
Log::debug('RIC: Deleting application ' . $application->id);
|
||||||
$application->delete();
|
$application->delete();
|
||||||
|
|
||||||
|
|
|
@ -45,4 +45,11 @@ class ApplicationPolicy
|
||||||
{
|
{
|
||||||
return $user->hasAnyRole('admin', 'hiringManager');
|
return $user->hasAnyRole('admin', 'hiringManager');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function delete(User $user, Application $application)
|
||||||
|
{
|
||||||
|
|
||||||
|
return $user->hasRole('admin');
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,33 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\View\Components;
|
||||||
|
|
||||||
|
use Illuminate\View\Component;
|
||||||
|
|
||||||
|
class NoPermission extends Component
|
||||||
|
{
|
||||||
|
public $type;
|
||||||
|
|
||||||
|
public $inDashboard;
|
||||||
|
/**
|
||||||
|
* Create a new component instance.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function __construct($type, $inDashboard = true)
|
||||||
|
{
|
||||||
|
$this->type = $type;
|
||||||
|
|
||||||
|
$this->inDashboard = $inDashboard;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the view / contents that represent the component.
|
||||||
|
*
|
||||||
|
* @return \Illuminate\View\View|string
|
||||||
|
*/
|
||||||
|
public function render()
|
||||||
|
{
|
||||||
|
return view('components.no-permission');
|
||||||
|
}
|
||||||
|
}
|
File diff suppressed because one or more lines are too long
After Width: | Height: | Size: 17 KiB |
|
@ -0,0 +1,74 @@
|
||||||
|
@if ($inDashboard)
|
||||||
|
<div class="row mb-4">
|
||||||
|
|
||||||
|
<div class="col-6 offset-5">
|
||||||
|
|
||||||
|
|
||||||
|
<img src="/img/403.svg" width="150px" alt="Access denied" />
|
||||||
|
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<!-- People find pleasure in different ways. I find it in keeping my mind clear. - Marcus Aurelius -->
|
||||||
|
<div class="col">
|
||||||
|
|
||||||
|
<div class="alert alert-{{$type}}">
|
||||||
|
<h4><i class="fas fa-user-lock"></i> Access Denied</h2>
|
||||||
|
<p>
|
||||||
|
We're sorry, but you do not have permission to access this web page.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Please contact your administrator if you believe this was in error.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
@else
|
||||||
|
@extends('adminlte::page')
|
||||||
|
|
||||||
|
@section('title', 'Raspberry Network | Access Denied')
|
||||||
|
|
||||||
|
@section('content_header')
|
||||||
|
<h4>Access Denied - HTTP 403</h4>
|
||||||
|
@stop
|
||||||
|
|
||||||
|
@section('content')
|
||||||
|
<div class="row mb-4">
|
||||||
|
|
||||||
|
<div class="col-6 offset-5">
|
||||||
|
|
||||||
|
|
||||||
|
<img src="/img/403.svg" width="150px" alt="Access denied" />
|
||||||
|
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="col">
|
||||||
|
|
||||||
|
<div class="alert alert-{{$type}}">
|
||||||
|
<h4><i class="fas fa-user-lock"></i> Access Denied</h2>
|
||||||
|
<p class="text-muted">
|
||||||
|
@if (isset($slot))
|
||||||
|
{{ $slot }}
|
||||||
|
@endif
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
We're sorry, but you do not have permission to access this web page.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Please contact your administrator if you believe this was in error.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
@stop
|
||||||
|
@endif
|
|
@ -4,7 +4,11 @@
|
||||||
|
|
||||||
@section('content_header')
|
@section('content_header')
|
||||||
|
|
||||||
|
@if (Auth::user()->hasAnyRole('admin', 'hiringManager'))
|
||||||
<h4>Administration / Open Positions</h4>
|
<h4>Administration / Open Positions</h4>
|
||||||
|
@else
|
||||||
|
<h4>Application Access Denied</h4>
|
||||||
|
@endif
|
||||||
|
|
||||||
@stop
|
@stop
|
||||||
|
|
||||||
|
@ -33,7 +37,7 @@
|
||||||
@stop
|
@stop
|
||||||
|
|
||||||
@section('content')
|
@section('content')
|
||||||
|
@if (Auth::user()->hasAnyRole('admin', 'hiringManager'))
|
||||||
<!-- todo: switch to modal component -->
|
<!-- todo: switch to modal component -->
|
||||||
<div class="modal fade" tabindex="-1" id="newVacancyForm" role="dialog" aria-labelledby="modalFormLabel" aria-hidden="true">
|
<div class="modal fade" tabindex="-1" id="newVacancyForm" role="dialog" aria-labelledby="modalFormLabel" aria-hidden="true">
|
||||||
<div class="modal-dialog" role="document">
|
<div class="modal-dialog" role="document">
|
||||||
|
@ -157,9 +161,8 @@
|
||||||
<thead>
|
<thead>
|
||||||
|
|
||||||
<tr>
|
<tr>
|
||||||
<th>#</th>
|
<th>Name</th>
|
||||||
<th>Vacancy Name</th>
|
<th>Description</th>
|
||||||
<th>Vacancy Description</th>
|
|
||||||
<th>Discord Role ID</th>
|
<th>Discord Role ID</th>
|
||||||
<th>Perm. Group Name</th>
|
<th>Perm. Group Name</th>
|
||||||
<th>Open Slots</th>
|
<th>Open Slots</th>
|
||||||
|
@ -175,8 +178,6 @@
|
||||||
@foreach($vacancies as $vacancy)
|
@foreach($vacancies as $vacancy)
|
||||||
|
|
||||||
<tr>
|
<tr>
|
||||||
|
|
||||||
<td>{{$vacancy->id}}</td>
|
|
||||||
<td>{{$vacancy->vacancyName}}</td>
|
<td>{{$vacancy->vacancyName}}</td>
|
||||||
<td>{{substr($vacancy->vacancyDescription, 0, 20)}}...</td>
|
<td>{{substr($vacancy->vacancyDescription, 0, 20)}}...</td>
|
||||||
<td><span class="badge badge-success">{{$vacancy->discordRoleID}}</span></td>
|
<td><span class="badge badge-success">{{$vacancy->discordRoleID}}</span></td>
|
||||||
|
@ -194,7 +195,7 @@
|
||||||
|
|
||||||
@if ($vacancy->vacancyStatus == 'OPEN')
|
@if ($vacancy->vacancyStatus == 'OPEN')
|
||||||
|
|
||||||
<form action="{{route('updatePositionAvailability', ['status' => 'close', 'id' => $vacancy->id])}}" method="POST" id="closePosition">
|
<form action="{{route('updatePositionAvailability', ['status' => 'close', 'id' => $vacancy->id])}}" method="POST" id="closePosition" style="display: inline">
|
||||||
@csrf
|
@csrf
|
||||||
@method('PATCH')
|
@method('PATCH')
|
||||||
<button type="submit" class="btn btn-sm btn-danger"><i class="fa fa-ban"></i></button>
|
<button type="submit" class="btn btn-sm btn-danger"><i class="fa fa-ban"></i></button>
|
||||||
|
@ -202,7 +203,7 @@
|
||||||
|
|
||||||
@else
|
@else
|
||||||
|
|
||||||
<form action="{{route('updatePositionAvailability', ['status' => 'open', 'id' => $vacancy->id])}}" method="POST" id="openPosition">
|
<form action="{{route('updatePositionAvailability', ['status' => 'open', 'id' => $vacancy->id])}}" method="POST" id="openPosition" style="display: inline">
|
||||||
@csrf
|
@csrf
|
||||||
@method('PATCH')
|
@method('PATCH')
|
||||||
<button type="submit" class="btn btn-sm btn-success"><i class="fa fa-check"></i></button>
|
<button type="submit" class="btn btn-sm btn-success"><i class="fa fa-check"></i></button>
|
||||||
|
@ -239,5 +240,7 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
@else
|
||||||
|
<x-no-permission type="danger"></x-no-permission>
|
||||||
|
@endif
|
||||||
@stop
|
@stop
|
||||||
|
|
|
@ -11,12 +11,37 @@
|
||||||
@section('js')
|
@section('js')
|
||||||
|
|
||||||
<script type="text/javascript" src="/js/app.js"></script>
|
<script type="text/javascript" src="/js/app.js"></script>
|
||||||
|
<x-global-errors></x-global-errors>
|
||||||
|
|
||||||
@stop
|
@stop
|
||||||
|
|
||||||
@section('content')
|
@section('content')
|
||||||
|
|
||||||
|
|
||||||
|
@foreach($applications as $application)
|
||||||
|
|
||||||
|
<x-modal id="deletionConfirmationModal-{{ $application->id }}" modal-label="deletion-{{ $application->id }}" modal-title="Are you sure?" include-close-button="true">
|
||||||
|
|
||||||
|
<h4><i class="fas fa-exclamation-triangle"></i> Really delete this?</h3>
|
||||||
|
<p>
|
||||||
|
This action is <b>IRREVERSBILE.</b>
|
||||||
|
</p>
|
||||||
|
<p>Comments, appointments and any votes attached to this application WILL be deleted too. Please make sure this application really needs to be deleted.</p>
|
||||||
|
|
||||||
|
<x-slot name="modalFooter">
|
||||||
|
|
||||||
|
<form method="POST" action="{{ route('deleteApplication', ['application' => $application->id]) }}">
|
||||||
|
@csrf
|
||||||
|
@method('DELETE')
|
||||||
|
<button type="submit" class="btn btn-danger"><i class="fas fa-check-double"></i> Confirm</button>
|
||||||
|
|
||||||
|
</form>
|
||||||
|
|
||||||
|
</x-slot>
|
||||||
|
|
||||||
|
</x-modal>
|
||||||
|
|
||||||
|
@endforeach
|
||||||
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
|
|
||||||
|
@ -167,6 +192,7 @@
|
||||||
<td>{{ $application->created_at }}</td>
|
<td>{{ $application->created_at }}</td>
|
||||||
<td>
|
<td>
|
||||||
<button type="button" class="btn btn-success btn-sm" onclick="window.location.href='{{ route('showUserApp', ['id' => $application->id]) }}'"><i class="fas fa-eye"></i> View</button>
|
<button type="button" class="btn btn-success btn-sm" onclick="window.location.href='{{ route('showUserApp', ['id' => $application->id]) }}'"><i class="fas fa-eye"></i> View</button>
|
||||||
|
<button type="button" class="btn btn-danger btn-sm ml-2" onclick="$('#deletionConfirmationModal-{{ $application->id }}').modal('show')"><i class="fa fa-trash"></i> Delete</button>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
|
||||||
|
|
|
@ -57,6 +57,9 @@ Route::group(['middleware' => ['auth', 'forcelogout']], function(){
|
||||||
Route::patch('/update/{id}/{newStatus}', 'ApplicationController@updateApplicationStatus')
|
Route::patch('/update/{id}/{newStatus}', 'ApplicationController@updateApplicationStatus')
|
||||||
->name('updateApplicationStatus');
|
->name('updateApplicationStatus');
|
||||||
|
|
||||||
|
Route::delete('{application}/delete', 'ApplicationController@delete')
|
||||||
|
->name('deleteApplication');
|
||||||
|
|
||||||
|
|
||||||
Route::get('/staff/all', 'ApplicationController@showAllApps')
|
Route::get('/staff/all', 'ApplicationController@showAllApps')
|
||||||
->name('allApplications');
|
->name('allApplications');
|
||||||
|
|
Loading…
Reference in New Issue