Significant changes

Added several components and features too long to list here
This commit is contained in:
2020-05-22 03:49:16 +01:00
parent 2ff0da3e4f
commit cc8c293cc6
36 changed files with 6051 additions and 613 deletions

View File

@@ -16,7 +16,7 @@
<div class="small-box bg-warning">
<div class="inner">
<h3>3</h3>
<h3>{{$applications->count()}}</h3>
<p>Pending Interviews</p>
</div>
<div class="icon">
@@ -30,7 +30,7 @@
<div class="small-box bg-success">
<div class="inner">
<h3>4</h3>
<h3>{{$finishedCount}}</h3>
<p>Finished Interviews</p>
</div>
<div class="icon">
@@ -53,9 +53,11 @@
<div class="card-body">
<table class="table" style="white-space: nowrap">
@if (!$applications->isEmpty())
<thead>
<table class="table" style="white-space: nowrap">
<thead>
<tr>
<th>#</th>
@@ -64,25 +66,37 @@
<th>Actions</th>
</tr>
</thead>
</thead>
<tbody>
<tbody>
<tr>
@foreach($applications as $application)
<td>1</td>
<td>Jonathan Smith</td>
<td><span class="badge badge-warning">Awaiting Interview</span></td>
<td>
<button type="button" class="btn btn-sm btn-success"><i class="fa fa-eye"></i> View</button>
<button type="button" class="btn btn-sm btn-warning"><i class="fa fa-clock"></i> Schedule</button>
</td>
<tr>
<td>{{$application->id}}</td>
<td>{{$application->user->name}}</td>
<td><span class="badge-warning badge">{{($application->applicationStatus == 'STAGE_INTERVIEW') ? 'Pending Interview' : 'Unknown Status'}}</span></td>
<td>
<button type="button" class="btn btn-sm btn-success" onclick="window.location.href='{{route('showUserApp', ['id' => $application->id])}}'"><i class="fa fa-eye"></i> View</button>
<button type="button" class="btn btn-sm btn-warning"><i class="fa fa-clock"></i> Schedule</button>
</td>
</tr>
</tr>
@endforeach
</tbody>
</tbody>
</table>
</table>
@else
<div class="alert alert-danger">
<b><i class="fa fa-exclamation-triangle"></i> No Applications Pending Interview</b>
<p>There are no applications that have been moved up to the Interview stage. Please check the outstanding queue.</p>
</div>
@endif
</div>
@@ -102,9 +116,10 @@
<div class="card-body">
<table class="table" style="white-space: nowrap">
@if (!$upcomingApplications->isEmpty())
<table class="table" style="white-space: nowrap">
<thead>
<thead>
<tr>
@@ -117,25 +132,38 @@
</tr>
</thead>
</thead>
<tbody>
<tbody>
<tr>
<td>1</td>
<td>April Smith</td>
<td><span class="badge badge-success"><i class="fa fa-check"></i> Scheduled</span></td>
<td>2020-05-04 12:20</td>
<td>Discord</td>
<td>
<button type="button" class="btn btn-sm btn-success"><i class="fa fa-eye"></i> View Details</button>
<button type="button" class="btn btn-sm btn-danger"><i class="fas fa-ban"></i> Cancel Interview</button>
</td>
</tr>
@foreach($upcomingApplications as $upcomingApp)
</tbody>
<tr>
<td>{{$upcomingApp->id}}</td>
<td>{{$upcomingApp->user->name}}</td>
<td><span class="badge badge-success"><i class="fa fa-check"></i> {{ucfirst(strtolower($upcomingApp->appointment->appointmentStatus))}}</span></td>
<td>{{$upcomingApp->appointment->appointmentDate}}</td>
<td><span class="badge badge-success"><i class="fa fa-check"></i> {{ucfirst(strtolower($upcomingApp->appointment->appointmentLocation))}}</span></td>
<td>
<button type="button" class="btn btn-sm btn-success" onclick="window.location.href='{{route('showUserApp', ['id' => $upcomingApp->id])}}'"><i class="fa fa-eye"></i> View Details</button>
</td>
</tr>
</table>
@endforeach
</tbody>
</table>
@else
<x-alert alert-type="danger">
<p><i class="fa fa-exclamation-triangle"></i><b>There are no upcoming interviews</b></p>
Please check other queues down in the application process. Applicants here may have already been interviewed.
</x-alert>
@endif
</div>
@@ -145,4 +173,15 @@
</div>
<div class="row mr-5">
<div class="col text-center">
<button type="button" class="btn btn-success mr-3" onclick="window.location.href='{{route('staffPendingApps')}}'">View Outstanding Queue</button>
<button type="button" class="btn btn-success mr-3" onclick="window.location.href='{{route('peerReview')}}'">View Approval Queue</button>
</div>
</div>
@stop

View File

@@ -17,6 +17,17 @@
@section('content')
<div class="row">
<div class="col">
<div class="callout callout-info">
<p>Seeing no applications? Check with an Administrator to make sure that there are available open positions.</p>
<p>Advertising on relevant forums made for this purpose is also a good idea.</p>
</div>
</div>
</div>
<div class="row">
<div class="col">
@@ -31,44 +42,58 @@
<div class="card-body">
<table class="table" style="white-space: nowrap">
@if (!$applications->isEmpty())
<table class="table" style="white-space: nowrap">
<thead>
<thead>
<tr>
<th>#</th>
<th>Applicant Name</th>
<th>Status</th>
<th>Applied On</th>
<th>Application Date</th>
<th>Last Updated</th>
<th>Actions</th>
</tr>
</thead>
</thead>
<tbody>
<tbody>
<tr>
@foreach($applications as $application)
<td>1</td>
<td>Jonathan Smith</td>
<td><span class="badge badge-info">Under Review</span></td>
<td>2020-04-20</td>
<td>
<button type="button" class="btn btn-warning btn-sm"><i class="fas fa-clipboard-check"></i> Review</button>
<button type="button" class="btn btn-warning btn-sm"><i class="fas fa-dumpster-fire"></i> Spam</button>
</td>
<tr>
</tr>
<td>{{$application->id}}</td>
<td>{{$application->user->name}}</td>
<td><span class="badge badge-warning">{{($application->applicationStatus == 'STAGE_SUBMITTED') ? 'Outstanding' : 'Unknown Status'}}</span></td>
<td>{{$application->created_at}}</td>
<td>{{$application->updated_at}}</td>
<td>
<button type="button" class="btn btn-sm btn-warning" onclick="window.location.href='{{route('showUserApp', ['id' => $application->id])}}'"><i class="fas fa-clipboard-check"></i> Review</button>
</td>
</tbody>
</tr>
</table>
@endforeach
</tbody>
</table>
@else
<div class="alert alert-warning">
<i class="fas fa-exclamation-triangle"></i><b> There are no pending applications</b>
<p>It seems like no one new has applied yet. Checkout the interview and approval queues for applications that might have moved up the ladder by now.</p>
</div>
@endif
</div>
<div class="card-footer text-center">
<button type="button" class="btn btn-success" onclick="window.location.href='{{route('peerReview')}}'">View Approval Queue</button>
<button type="button" class="btn btn-success" onclick="window.location.href='{{route('pendingInterview')}}'">View Interview Queue</button>
</div>
@@ -76,27 +101,6 @@
</div>
<div class="col">
<div class="card card-info">
<div class="card-header">
<h3 class="card-title">Applications at a Glance</h3>
<div class="card-tools">
<button type="button" class="btn btn-tool" data-card-widget="collapse"><i class="fas fa-minus"></i>
</button>
</div>
</div>
<div class="card-body" style="display: block;">
<div class="chart"><div class="chartjs-size-monitor"><div class="chartjs-size-monitor-expand"><div class=""></div></div><div class="chartjs-size-monitor-shrink"><div class=""></div></div></div>
<canvas id="appOverviewChart" style="min-height: 250px; height: 250px; max-height: 250px; max-width: 100%; display: block; width: 456px;" width="456" height="250" class="chartjs-render-monitor"></canvas>
</div>
</div>
<!-- /.card-body -->
</div>
</div>
</div>
@stop

View File

@@ -36,14 +36,15 @@
<div class="card">
<div class="card-header">
<div class="card-title"><h3>Review Queue</h3></div>
<div class="card-title"><h3>Vote Backlog</h3></div>
</div>
<div class="card-body">
<table class="table" style="white-space: nowrap">
@if(!$applications->isEmpty())
<table class="table" style="white-space: nowrap">
<thead>
<thead>
<tr>
<th>#</th>
@@ -53,27 +54,36 @@
<th>Actions</th>
</tr>
</thead>
</thead>
<tbody>
<tbody>
<tr>
<td>1</td>
<td>Jonathan Doe</td>
<td>2020-04-01</td>
<td><span class="badge badge-warning">Under Review</span></td>
@foreach($applications as $application)
<td>{{$application->id}}</td>
<td>{{$application->user->name}}</td>
<td>{{$application->created_at}}</td>
<td><span class="badge badge-warning">{{($application->applicationStatus == 'STAGE_PEERAPPROVAL') ? 'Peer Review' : 'Unknown'}}</span></td>
<td>
<button type="button" class="btn btn-info btn-sm"><i class="far fa-clipboard"></i> Review</button>
<button type="button" class="btn btn-info btn-sm" onclick="window.location.href='{{route('showUserApp', ['id' => $application->id])}}'"><i class="far fa-clipboard"></i> Review</button>
<button type="button" class="btn btn-success btn-sm"><i class="fas fa-user-check"></i> Vote: Approve</button>
<button type="button" class="btn btn-danger btn-sm"><i class="fas fa-user-times"></i> Vote: Deny</button>
</td>
</tr>
@endforeach
</tbody>
</tbody>
</table>
</table>
@else
<x-alert alert-type="warning">
<p class="text-bold"><i class="fa fa-exclamation-triangle"></i> There are no applications pending review</p>
Check the other queues for any applications! Applications will be shown here as soon as their interview is completed.
You'll be able to view meeting notes and vote based on your observations.
</x-alert>
@endif
</div>

View File

@@ -0,0 +1,298 @@
@extends('adminlte::page')
@section('title', 'Raspberry Network | Profile')
@section('content_header')
<h4>Application Management / Viewing {{$application->user->name}}'s Application</h4>
@stop
@section('css')
<link rel="stylesheet" href="/css/mixed.css">
<link rel="stylesheet" href="/css/viewapplication.css">
<!-- TODO: Move to Mix + Webpack -->
@stop
@section('js')
<script type="text/javascript" src="/js/app.js"></script>
<x-global-errors></x-global-errors>
@stop
@section('content')
<x-modal id="denyApplication" modal-label="denyApplicationLabel" modal-title="Please confirm" include-close-button="true">
<p>Are you sure you want to deny this application? Please keep in mind that this user will only be allowed to apply 30 days after their first application.</p>
<p class="text-muted">This action cannot be undone.</p>
<x-slot name="modalFooter">
<form id="updateApplication" action="{{route('updateApplicationStatus', ['id' => $application->id, 'newStatus' => 'deny'])}}" method="POST">
@csrf
@method('PATCH')
<button type="submit" class="btn btn-danger">Confirm: Deny Applicant</button>
</form>
<button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
</x-slot>
</x-modal>
<div class="row">
<div class="col">
<div class="card">
<div class="card-header">
<div class="card-title">{{$formStructure->formName}}</div>
</div>
<div class="card-body">
@foreach($structuredResponses['responses'] as $content)
<div class="mt-4 mb-3">
<h5>{{$content['title']}}</h5>
<p>{{$content['response']}}</p>
</div>
@endforeach
</div>
</div>
</div>
<div class="col">
<div class="row">
<div class="col">
<div class="card bg-gray">
<div class="card-header bg-gradient-gray">
<div class="card-title">Contextual Information</div>
</div>
<div class="card-body">
<p><b>Applicant Name: </b> <span class="badge badge-primary">{{$application->user->name}}</span></p>
<p><b>Applicant IP Address:</b> <span class="badge badge-primary">{{$application->user->originalIP}}</span></p>
<p><b>Applied On:</b> <span class="badge badge-primary">{{$application->created_at}}</span></p>
<p><b>Last acted on:</b><span class="badge badge-primary">{{$application->updated_at}}</span></p>
<p><b>Applying for:</b> <span class="badge badge-primary">{{$vacancy->vacancyName}}</span></p>
<p class="mt-2"><b>Current Status:</b>
@switch($application->applicationStatus)
@case('STAGE_SUBMITTED')
<span class="badge badge-warning">Outstanding</span>
@break
@case('STAGE_PEERAPPROVAL')
<span class="badge badge-primary">Pending Peer Approval</span>
@break
@case('STAGE_INTERVIEW')
<span class="badge badge-primary">Pending Interview</span>
@break
@case('STAGE_INTERVIEW_SCHEDULED')
<span class="badge badge-primary"><i class="fas fa-clock"></i> Interview Scheduled</span>
@break
@case('APPROVED')
<span class="badge badge-success"><i class="fa fa-check-double"></i> Approved</span>
@break
@case('DENIED')
<span class="badge badge-danger"><i class="fa fa-ban"></i> Denied</span>
@break
@endswitch
</p>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col">
@if ($application->applicationStatus == 'STAGE_SUBMITTED')
<div class="card bg-gray">
<div class="card-header bg-gradient-gray">
<div class="card-title">Decision & Moderation Tools</div>
</div>
<div class="card-body text-center" style="white-space: nowrap">
<div class="row">
<div class="col mr-5">
<button type="button" class="btn btn-danger" onclick="$('#denyApplication').modal('show')" {{($application->applicationStatus == 'DENIED') ? 'disabled' : ''}}><i class="fas fa-arrow-left"></i> Deny Applicant</button>
</div>
<div class="col">
<form method="POST" action="{{route('updateApplicationStatus', ['id' => $application->id, 'newStatus' => 'interview'])}}">
@csrf
@method('PATCH')
<button type="submit" class="btn btn-success" {{($application->applicationStatus == 'DENIED') ? 'disabled' : ''}}><i class="fas fa-arrow-right" ></i> Move to next stage</button>
</form>
</div>
</div>
</div>
</div>
@endif
</div>
</div>
@if ($application->applicationStatus == 'STAGE_INTERVIEW')
<div class="row">
<div class="col">
<x-card id="appointmentCard" card-title="Schedule An Interview" footer-style="text-center">
<x-slot name="cardHeader">
</x-slot>
<form id="scheduleAppointment" action="{{route('scheduleAppointment', ['applicationID' => $application->id])}}" method="POST">
@csrf
<label for="appointmentDescription">Appointment Description</label>
<input type="text" class="form-control" name="appointmentDescription">
<label for="appointmentDateTime">Interview date & time</label>
<input type="text" class="form-control" name="appointmentDateTime" id="appointmentDateTime">
<p class="text-muted text-sm">Click to choose a date</p>
<label for="appointmentLocation">Appointment Location</label>
<select class="custom-select" id="appointmentLocation" name="appointmentLocation">
<option value="nil" disabled>Select your preferred platform</option>
<option value="ZOOM">Zoom</option>
<option value="DISCORD">Discord</option>
<option value="SKYPE">Skype</option>
<option value="MEET">Google Meet</option>
<option value="TEAMSPEAK">Teamspeak</option>
</select>
<p class="text-muted text-sm">Embedded in-house video conferencing coming soon, powered by Jitsi Meet</p>
</form>
<x-slot name="cardFooter">
<button type="button" class="btn btn-warning text-center" onclick="document.getElementById('scheduleAppointment').submit()"><i class="fas fa-clock"></i> Schedule</button>
</x-slot>
</x-card>
</div>
</div>
@endif
@if ($application->applicationStatus == 'STAGE_INTERVIEW_SCHEDULED')
<div class="row">
<div class="col">
<x-card id="scheduleInfo" card-title="Appointment Information" footer-style="text-center">
<x-slot name="cardHeader"></x-slot>
<p class="text-muted">{{$application->appointment->appointmentDescription}}</p>
<p><b>Interview scheduled for:</b> <span class="badge badge-primary">{{$application->appointment->appointmentDate}}</span></p>
<p><b>Status: </b> <span class="badge badge-primary">{{Str::ucfirst(Str::lower($application->appointment->appointmentStatus))}}</span></p>
<p><b>Platform:</b> <span class="badge badge-primary">{{Str::ucfirst(Str::lower($application->appointment->appointmentLocation))}}</span></p>
<x-slot name="cardFooter">
<form class="footer-button" action="{{route('updateAppointment', ['applicationID' => $application->id, 'status' => 'concluded'])}}" method="POST">
@csrf
@method('PATCH')
<button type="submit" class="btn btn-success">Finish Meeting</button>
</form>
<button class="btn btn-warning mr-3">View Meeting Notes</button>
<button class="btn btn-danger mr-3">Cancel Interview</button>
</x-slot>
</x-card>
</div>
</div>
@endif
@if ($application->applicationStatus = 'STAGE_PEERAPPROVAL')
<x-card id="peerApproval" card-title="Vote on this Application" footer-style="text-center">
<x-slot name="cardHeader"></x-slot>
<p class="text-muted">If you weren't present during this meeting, you can view the shared meeting notepad to help you make a decision.</p>
<p class="text-muted">You may vote on as many applications as needed; However, you can only vote once per application.</p>
<p class="text-muted">Votes carry no weight based on rank. This system has been designed with fairness and ease of use in mind.</p>
<x-slot name="cardFooter">
<button type="button" class="btn btn-sm btn-warning">Vote: Approve Applicant</button>
<button type="button" class="btn btn-sm btn-warning">Vote: Deny Applicant</button>
<button type="button" class="btn btn-sm btn-warning ml-5">Meeting Notes</button>
</x-slot>
</x-card>
@endif
<div class="row">
<div class="col text-center">
<button type="button" class="btn btn-primary" onclick="window.location.href='{{route('staffPendingApps')}}'">View more Applications</button>
</div>
</div>
</div>
</div>
@endsection