forked from miguel456/rbrecruiter
Significant changes
Added several components and features too long to list here
This commit is contained in:
parent
2ff0da3e4f
commit
cc8c293cc6
|
@ -7,9 +7,13 @@
|
|||
<sourceFolder url="file://$MODULE_DIR$/app" isTestSource="false" packagePrefix="App\" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/almasaeed2010/adminlte" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/asm89/stack-cors" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/barryvdh/laravel-debugbar" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/brick/math" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/composer" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/dnoegel/php-xdg-base-dir" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/doctrine/cache" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/doctrine/dbal" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/doctrine/event-manager" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/doctrine/inflector" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/doctrine/instantiator" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/doctrine/lexer" />
|
||||
|
@ -32,6 +36,7 @@
|
|||
<excludeFolder url="file://$MODULE_DIR$/vendor/laravel/ui" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/league/commonmark" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/league/flysystem" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/maximebf/debugbar" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/mockery/mockery" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/monolog/monolog" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/myclabs/deep-copy" />
|
||||
|
@ -77,6 +82,7 @@
|
|||
<excludeFolder url="file://$MODULE_DIR$/vendor/swiftmailer/swiftmailer" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/console" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/css-selector" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/debug" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/error-handler" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/event-dispatcher" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/event-dispatcher-contracts" />
|
||||
|
|
|
@ -98,6 +98,12 @@
|
|||
<path value="$PROJECT_DIR$/vendor/laravel/ui" />
|
||||
<path value="$PROJECT_DIR$/vendor/almasaeed2010/adminlte" />
|
||||
<path value="$PROJECT_DIR$/vendor/jeroennoten/laravel-adminlte" />
|
||||
<path value="$PROJECT_DIR$/vendor/doctrine/dbal" />
|
||||
<path value="$PROJECT_DIR$/vendor/doctrine/cache" />
|
||||
<path value="$PROJECT_DIR$/vendor/doctrine/event-manager" />
|
||||
<path value="$PROJECT_DIR$/vendor/barryvdh/laravel-debugbar" />
|
||||
<path value="$PROJECT_DIR$/vendor/maximebf/debugbar" />
|
||||
<path value="$PROJECT_DIR$/vendor/symfony/debug" />
|
||||
</include_path>
|
||||
</component>
|
||||
<component name="PhpProjectSharedConfiguration" php_language_level="7.2" />
|
||||
|
|
|
@ -10,7 +10,7 @@ class Application extends Model
|
|||
|
||||
'applicantUserID',
|
||||
'applicantFormResponseID',
|
||||
'applicantStatus'
|
||||
'applicationStatus'
|
||||
|
||||
];
|
||||
|
||||
|
@ -18,4 +18,21 @@ class Application extends Model
|
|||
{
|
||||
return $this->belongsTo('App\User', 'applicantUserID', 'id');
|
||||
}
|
||||
|
||||
public function response()
|
||||
{
|
||||
return $this->hasOne('App\Response', 'id', 'applicantFormResponseID');
|
||||
}
|
||||
|
||||
public function appointment() // 1 - 1
|
||||
{
|
||||
return $this->hasOne('App\Appointment', 'applicationID', 'id');
|
||||
}
|
||||
|
||||
public function setStatus($status)
|
||||
{
|
||||
return $this->update([
|
||||
'applicationStatus' => $status
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -6,5 +6,23 @@ use Illuminate\Database\Eloquent\Model;
|
|||
|
||||
class Appointment extends Model
|
||||
{
|
||||
//
|
||||
public $fillable = [
|
||||
'appointmentDescription',
|
||||
'appointmentDate',
|
||||
'applicationID',
|
||||
'appointmentStatus',
|
||||
'appointmentLocation'
|
||||
];
|
||||
|
||||
public function application()
|
||||
{
|
||||
return $this->belongsTo('App\Application', 'id', 'applicationID');
|
||||
}
|
||||
|
||||
public function setStatus($status)
|
||||
{
|
||||
$this->update([
|
||||
'appointmentStatus' => $status
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -14,8 +14,13 @@ class Form extends Model
|
|||
|
||||
];
|
||||
|
||||
public function vacancy()
|
||||
public function vacancies()
|
||||
{
|
||||
return $this->hasMany('App\Vacancy');
|
||||
return $this->hasMany('vacancies', 'vacancyFormID', 'id');
|
||||
}
|
||||
|
||||
public function responses()
|
||||
{
|
||||
return $this->belongsTo('App\Response', 'id', 'id');
|
||||
}
|
||||
}
|
||||
|
|
|
@ -3,6 +3,7 @@
|
|||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Application;
|
||||
use Illuminate\Support\Facades\App;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
use App\Response;
|
||||
use App\Vacancy;
|
||||
|
@ -20,20 +21,81 @@ class ApplicationController extends Controller
|
|||
->with('applications', Auth::user()->applications);
|
||||
}
|
||||
|
||||
public function showUserApp(Request $request, $applicationID)
|
||||
{
|
||||
$application = Application::find($applicationID);
|
||||
|
||||
if (!is_null($application))
|
||||
{
|
||||
return view('dashboard.user.viewapp')
|
||||
->with(
|
||||
[
|
||||
'application' => $application,
|
||||
'structuredResponses' => json_decode($application->response->responseData, true),
|
||||
'formStructure' => $application->response->form,
|
||||
'vacancy' => $application->response->vacancy
|
||||
]
|
||||
);
|
||||
}
|
||||
else
|
||||
{
|
||||
$request->session()->flash('error', 'The application you requested could not be found.');
|
||||
}
|
||||
|
||||
return redirect()->back();
|
||||
}
|
||||
|
||||
|
||||
public function showAllPendingApps()
|
||||
{
|
||||
return view('dashboard.appmanagement.outstandingapps');
|
||||
return view('dashboard.appmanagement.outstandingapps')
|
||||
->with('applications', Application::where('applicationStatus', 'STAGE_SUBMITTED')->get());
|
||||
}
|
||||
|
||||
|
||||
public function showPendingInterview()
|
||||
{
|
||||
$applications = Application::with('appointment', 'user')->get();
|
||||
$count = 0;
|
||||
|
||||
$pendingInterviews = collect([]);
|
||||
$upcomingInterviews = collect([]);
|
||||
|
||||
|
||||
foreach ($applications as $application)
|
||||
{
|
||||
if (!is_null($application->appointment) && $application->appointment->appointmentStatus == 'CONCLUDED')
|
||||
{
|
||||
$count =+ 1;
|
||||
}
|
||||
|
||||
switch ($application->applicationStatus)
|
||||
{
|
||||
case 'STAGE_INTERVIEW':
|
||||
$upcomingInterviews->push($application);
|
||||
|
||||
break;
|
||||
|
||||
case 'STAGE_INTERVIEW_SCHEDULED':
|
||||
$pendingInterviews->push($application);
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return view('dashboard.appmanagement.interview')
|
||||
->with([
|
||||
'finishedCount' => $count,
|
||||
'applications' => $pendingInterviews,
|
||||
'upcomingApplications' => $upcomingInterviews
|
||||
]);
|
||||
}
|
||||
|
||||
public function showPeerReview()
|
||||
{
|
||||
return view('dashboard.appmanagement.peerreview');
|
||||
}
|
||||
|
||||
public function showPendingInterview()
|
||||
{
|
||||
return view('dashboard.appmanagement.interview');
|
||||
return view('dashboard.appmanagement.peerreview')
|
||||
->with('applications', Application::where('applicationStatus', 'STAGE_PEERAPPROVAL')->get());
|
||||
}
|
||||
|
||||
public function renderApplicationForm(Request $request, $vacancySlug)
|
||||
|
@ -108,7 +170,7 @@ class ApplicationController extends Controller
|
|||
Log::info('Submitted application for user ' . Auth::user()->name . ' with response ID' . $response->id);
|
||||
|
||||
$request->session()->flash('success', 'Thank you for your application! It will be reviewed as soon as possible.');
|
||||
return redirect()->to(route('userPendingApps'));
|
||||
return redirect()->to(route('showUserApps'));
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -119,4 +181,37 @@ class ApplicationController extends Controller
|
|||
|
||||
return redirect()->back();
|
||||
}
|
||||
|
||||
public function updateApplicationStatus(Request $request, $applicationID, $newStatus)
|
||||
{
|
||||
$application = Application::find($applicationID);
|
||||
|
||||
if (!is_null($application))
|
||||
{
|
||||
switch ($newStatus)
|
||||
{
|
||||
case 'deny':
|
||||
|
||||
Log::info('User ' . Auth::user()->name . ' has denied application ID ' . $application->id);
|
||||
$request->session()->flash('success', 'Application denied.');
|
||||
$application->setStatus('DENIED');
|
||||
break;
|
||||
|
||||
case 'interview':
|
||||
Log::info('User ' . Auth::user()->name . ' has moved application ID ' . $application->id . 'to interview stage');
|
||||
$request->session()->flash('success', 'Application moved to interview stage! (:');
|
||||
$application->setStatus('STAGE_INTERVIEW');
|
||||
break;
|
||||
|
||||
default:
|
||||
$request->session()->flash('error', 'There are no suitable statuses to update to. Do not mess with the URL.');
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$request->session()->flash('The application you\'re trying to update does not exist.');
|
||||
}
|
||||
|
||||
return redirect()->back();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2,9 +2,87 @@
|
|||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Application;
|
||||
use Carbon\Carbon;
|
||||
use Illuminate\Http\Request;
|
||||
use App\Appointment;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
|
||||
class AppointmentController extends Controller
|
||||
{
|
||||
//
|
||||
private $allowedPlatforms = [
|
||||
|
||||
'ZOOM',
|
||||
'DISCORD',
|
||||
'SKYPE',
|
||||
'MEET',
|
||||
'TEAMSPEAK'
|
||||
|
||||
];
|
||||
|
||||
public function saveAppointment(Request $request, $applicationID)
|
||||
{
|
||||
// Unrelated TODO: change if's in application page to a switch statement, & have the row encompass it
|
||||
|
||||
$app = Application::find($applicationID);
|
||||
|
||||
if (!is_null($app))
|
||||
{
|
||||
// make sure this is a valid date by parsing it first
|
||||
$appointmentDate = Carbon::parse($request->appointmentDateTime);
|
||||
|
||||
|
||||
$appointment = Appointment::create([
|
||||
'appointmentDescription' => $request->appointmentDescription,
|
||||
'appointmentDate' => $appointmentDate->toDateTimeString(),
|
||||
'applicationID' => $applicationID,
|
||||
'appointmentLocation' => (in_array($request->appointmentLocation, $this->allowedPlatforms)) ? $request->appointmentLocation : 'DISCORD',
|
||||
]);
|
||||
$app->setStatus('STAGE_INTERVIEW_SCHEDULED');
|
||||
|
||||
|
||||
Log::info('User ' . Auth::user()->name . ' has scheduled an appointment with ' . $app->user->name . ' for application ID' . $app->id, [
|
||||
'datetime' => $appointmentDate->toDateTimeString(),
|
||||
'scheduled' => now()
|
||||
]);
|
||||
|
||||
$request->session()->flash('success', 'Appointment successfully scheduled @ ' . $appointmentDate->toDateTimeString());
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
$request->session()->flash('error', 'Cant\'t schedule an appointment for an application that doesn\'t exist.');
|
||||
}
|
||||
|
||||
return redirect()->back();
|
||||
}
|
||||
|
||||
public function updateAppointment(Request $request, $applicationID, $status)
|
||||
{
|
||||
$application = Application::find($applicationID);
|
||||
$validStatuses = [
|
||||
'SCHEDULED',
|
||||
'CONCLUDED'
|
||||
];
|
||||
|
||||
|
||||
if (!is_null($application))
|
||||
{
|
||||
$application->appointment->appointmentStatus = (in_array($status, $validStatuses)) ? strtoupper($status) : 'SCHEDULED';
|
||||
$application->appointment->save();
|
||||
|
||||
$application->setStatus('STAGE_PEERAPPROVAL');
|
||||
|
||||
$request->session()->flash('success', 'Interview finished! Staff members can now vote on it.');
|
||||
}
|
||||
else
|
||||
{
|
||||
$request->session()->flash('error', 'The application you\'re trying to update doesn\'t exist or have an appointment.');
|
||||
}
|
||||
|
||||
return redirect()->back();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
|
@ -56,6 +56,8 @@ class RegisterController extends Controller
|
|||
'name' => ['required', 'string', 'max:255'],
|
||||
'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
|
||||
'password' => ['required', 'string', 'min:8', 'confirmed'],
|
||||
], [
|
||||
'uuid.required' => 'Please enter a valid (and Premium) Minecraft username! We do not support cracked users.'
|
||||
]);
|
||||
}
|
||||
|
||||
|
|
|
@ -11,4 +11,19 @@ class Response extends Model
|
|||
'associatedVacancyID',
|
||||
'responseData'
|
||||
];
|
||||
|
||||
public function form()
|
||||
{
|
||||
return $this->hasOne('App\Form', 'id', 'responseFormID');
|
||||
}
|
||||
|
||||
public function application()
|
||||
{
|
||||
return $this->belongsTo('App\Application', 'applicantFormResponseID', 'id');
|
||||
}
|
||||
|
||||
public function vacancy()
|
||||
{
|
||||
return $this->hasOne('App\Vacancy', 'id', 'associatedVacancyID');
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,35 @@
|
|||
<?php
|
||||
|
||||
namespace App\View\Components;
|
||||
|
||||
use Illuminate\View\Component;
|
||||
|
||||
class Alert extends Component
|
||||
{
|
||||
|
||||
public $alertType;
|
||||
|
||||
public $extraStyling;
|
||||
|
||||
/**
|
||||
* Create a new component instance.
|
||||
*
|
||||
* @param $alertType
|
||||
* @param string $extraStyling
|
||||
*/
|
||||
public function __construct($alertType, $extraStyling = '')
|
||||
{
|
||||
$this->alertType = $alertType;
|
||||
$this->extraStyling = $extraStyling;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the view / contents that represent the component.
|
||||
*
|
||||
* @return \Illuminate\View\View|string
|
||||
*/
|
||||
public function render()
|
||||
{
|
||||
return view('components.alert');
|
||||
}
|
||||
}
|
|
@ -0,0 +1,40 @@
|
|||
<?php
|
||||
|
||||
namespace App\View\Components;
|
||||
|
||||
use Illuminate\View\Component;
|
||||
|
||||
class Card extends Component
|
||||
{
|
||||
public $id;
|
||||
|
||||
|
||||
public $cardTitle;
|
||||
|
||||
|
||||
|
||||
public $footerStyle;
|
||||
|
||||
|
||||
/**
|
||||
* Create a new component instance.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function __construct($id, $cardTitle, $footerStyle)
|
||||
{
|
||||
$this->cardTitle = $cardTitle;
|
||||
$this->id = $id;
|
||||
$this->footerStyle = $footerStyle;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the view / contents that represent the component.
|
||||
*
|
||||
* @return \Illuminate\View\View|string
|
||||
*/
|
||||
public function render()
|
||||
{
|
||||
return view('components.card');
|
||||
}
|
||||
}
|
|
@ -0,0 +1,45 @@
|
|||
<?php
|
||||
|
||||
namespace App\View\Components;
|
||||
|
||||
use Illuminate\View\Component;
|
||||
|
||||
class Modal extends Component
|
||||
{
|
||||
public $id;
|
||||
|
||||
|
||||
public $modalLabel;
|
||||
|
||||
|
||||
public $modalTitle;
|
||||
|
||||
|
||||
public $includeCloseButton;
|
||||
|
||||
/**
|
||||
* Create a new component instance.
|
||||
*
|
||||
* @param $id
|
||||
* @param $modalLabel
|
||||
* @param $modalTitle
|
||||
* @param $includeCloseButton
|
||||
*/
|
||||
public function __construct($id, $modalLabel, $modalTitle, $includeCloseButton)
|
||||
{
|
||||
$this->id = $id;
|
||||
$this->modalLabel = $modalLabel;
|
||||
$this->modalTitle = $modalTitle;
|
||||
$this->includeCloseButton = $includeCloseButton;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the view / contents that represent the component.
|
||||
*
|
||||
* @return \Illuminate\View\View|string
|
||||
*/
|
||||
public function render()
|
||||
{
|
||||
return view('components.modal');
|
||||
}
|
||||
}
|
|
@ -10,6 +10,7 @@
|
|||
"require": {
|
||||
"php": "^7.2.5",
|
||||
"ext-json": "*",
|
||||
"doctrine/dbal": "^2.10",
|
||||
"fideloper/proxy": "^4.2",
|
||||
"fruitcake/laravel-cors": "^1.0",
|
||||
"guzzlehttp/guzzle": "^6.5",
|
||||
|
@ -19,6 +20,7 @@
|
|||
"laravel/ui": "^2.0"
|
||||
},
|
||||
"require-dev": {
|
||||
"barryvdh/laravel-debugbar": "^3.3",
|
||||
"facade/ignition": "^2.0",
|
||||
"fzaninotto/faker": "^1.9.1",
|
||||
"mockery/mockery": "^1.3.1",
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -167,17 +167,17 @@ return [
|
|||
|
||||
'use_route_url' => false,
|
||||
|
||||
'dashboard_url' => 'home',
|
||||
'dashboard_url' => '/dashboard',
|
||||
|
||||
'logout_url' => 'logout',
|
||||
'logout_url' => '/auth/logout',
|
||||
|
||||
'login_url' => 'login',
|
||||
'login_url' => '/auth/login',
|
||||
|
||||
'register_url' => 'register',
|
||||
'register_url' => '/auth/register',
|
||||
|
||||
'password_reset_url' => 'password/reset',
|
||||
'password_reset_url' => '/auth/password/reset',
|
||||
|
||||
'password_email_url' => 'password/email',
|
||||
'password_email_url' => '/auth/password/email',
|
||||
|
||||
'profile_url' => false,
|
||||
|
||||
|
@ -216,7 +216,7 @@ return [
|
|||
[
|
||||
'text' => 'Current Applications',
|
||||
'icon' => 'fas fa-fw fa-check-double',
|
||||
'url' => '/applications/current'
|
||||
'url' => '/applications/my-applications'
|
||||
]
|
||||
],
|
||||
|
||||
|
@ -444,7 +444,7 @@ return [
|
|||
],
|
||||
[
|
||||
'name' => 'GlobalTooltip',
|
||||
'active' => 'true',
|
||||
'active' => true,
|
||||
'files' => [
|
||||
[
|
||||
'type' => 'js',
|
||||
|
@ -452,6 +452,17 @@ return [
|
|||
'location' => '/js/globaltooltip.js'
|
||||
]
|
||||
]
|
||||
],
|
||||
[
|
||||
'name' => 'DatePickApp',
|
||||
'active' => true,
|
||||
'files' => [
|
||||
[
|
||||
'type' => 'js',
|
||||
'asset' => false,
|
||||
'location' => '/js/datepick.js'
|
||||
]
|
||||
]
|
||||
]
|
||||
],
|
||||
];
|
||||
|
|
|
@ -0,0 +1,32 @@
|
|||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
class ChangeFormStructureLength extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function up()
|
||||
{
|
||||
Schema::table('forms', function (Blueprint $schema){
|
||||
$schema->longText('formStructure')->change();
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function down()
|
||||
{
|
||||
Schema::table('forms', function (Blueprint $schema){
|
||||
$schema->string('formStructure')->change();
|
||||
});
|
||||
}
|
||||
}
|
|
@ -3885,6 +3885,11 @@
|
|||
"resolve-dir": "1.0.1"
|
||||
}
|
||||
},
|
||||
"flatpickr": {
|
||||
"version": "4.6.3",
|
||||
"resolved": "https://registry.npmjs.org/flatpickr/-/flatpickr-4.6.3.tgz",
|
||||
"integrity": "sha512-007VucCkqNOMMb9ggRLNuJowwaJcyOh4sKAFcdGfahfGc7JQbf94zSzjdBq/wVyHWUEs5o3+idhFZ0wbZMRmVQ=="
|
||||
},
|
||||
"flush-write-stream": {
|
||||
"version": "1.1.1",
|
||||
"resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz",
|
||||
|
@ -4038,8 +4043,7 @@
|
|||
"ansi-regex": {
|
||||
"version": "2.1.1",
|
||||
"bundled": true,
|
||||
"dev": true,
|
||||
"optional": true
|
||||
"dev": true
|
||||
},
|
||||
"aproba": {
|
||||
"version": "1.2.0",
|
||||
|
@ -4053,23 +4057,21 @@
|
|||
"dev": true,
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"delegates": "^1.0.0",
|
||||
"readable-stream": "^2.0.6"
|
||||
"delegates": "1.0.0",
|
||||
"readable-stream": "2.3.7"
|
||||
}
|
||||
},
|
||||
"balanced-match": {
|
||||
"version": "1.0.0",
|
||||
"bundled": true,
|
||||
"dev": true,
|
||||
"optional": true
|
||||
"dev": true
|
||||
},
|
||||
"brace-expansion": {
|
||||
"version": "1.1.11",
|
||||
"bundled": true,
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"balanced-match": "^1.0.0",
|
||||
"balanced-match": "1.0.0",
|
||||
"concat-map": "0.0.1"
|
||||
}
|
||||
},
|
||||
|
@ -4082,20 +4084,17 @@
|
|||
"code-point-at": {
|
||||
"version": "1.1.0",
|
||||
"bundled": true,
|
||||
"dev": true,
|
||||
"optional": true
|
||||
"dev": true
|
||||
},
|
||||
"concat-map": {
|
||||
"version": "0.0.1",
|
||||
"bundled": true,
|
||||
"dev": true,
|
||||
"optional": true
|
||||
"dev": true
|
||||
},
|
||||
"console-control-strings": {
|
||||
"version": "1.1.0",
|
||||
"bundled": true,
|
||||
"dev": true,
|
||||
"optional": true
|
||||
"dev": true
|
||||
},
|
||||
"core-util-is": {
|
||||
"version": "1.0.2",
|
||||
|
@ -4109,7 +4108,7 @@
|
|||
"dev": true,
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"ms": "^2.1.1"
|
||||
"ms": "2.1.2"
|
||||
}
|
||||
},
|
||||
"deep-extend": {
|
||||
|
@ -4136,7 +4135,7 @@
|
|||
"dev": true,
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"minipass": "^2.6.0"
|
||||
"minipass": "2.9.0"
|
||||
}
|
||||
},
|
||||
"fs.realpath": {
|
||||
|
@ -4151,14 +4150,14 @@
|
|||
"dev": true,
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"aproba": "^1.0.3",
|
||||
"console-control-strings": "^1.0.0",
|
||||
"has-unicode": "^2.0.0",
|
||||
"object-assign": "^4.1.0",
|
||||
"signal-exit": "^3.0.0",
|
||||
"string-width": "^1.0.1",
|
||||
"strip-ansi": "^3.0.1",
|
||||
"wide-align": "^1.1.0"
|
||||
"aproba": "1.2.0",
|
||||
"console-control-strings": "1.1.0",
|
||||
"has-unicode": "2.0.1",
|
||||
"object-assign": "4.1.1",
|
||||
"signal-exit": "3.0.2",
|
||||
"string-width": "1.0.2",
|
||||
"strip-ansi": "3.0.1",
|
||||
"wide-align": "1.1.3"
|
||||
}
|
||||
},
|
||||
"glob": {
|
||||
|
@ -4167,12 +4166,12 @@
|
|||
"dev": true,
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"fs.realpath": "^1.0.0",
|
||||
"inflight": "^1.0.4",
|
||||
"inherits": "2",
|
||||
"minimatch": "^3.0.4",
|
||||
"once": "^1.3.0",
|
||||
"path-is-absolute": "^1.0.0"
|
||||
"fs.realpath": "1.0.0",
|
||||
"inflight": "1.0.6",
|
||||
"inherits": "2.0.4",
|
||||
"minimatch": "3.0.4",
|
||||
"once": "1.4.0",
|
||||
"path-is-absolute": "1.0.1"
|
||||
}
|
||||
},
|
||||
"has-unicode": {
|
||||
|
@ -4187,7 +4186,7 @@
|
|||
"dev": true,
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"safer-buffer": ">= 2.1.2 < 3"
|
||||
"safer-buffer": "2.1.2"
|
||||
}
|
||||
},
|
||||
"ignore-walk": {
|
||||
|
@ -4196,7 +4195,7 @@
|
|||
"dev": true,
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"minimatch": "^3.0.4"
|
||||
"minimatch": "3.0.4"
|
||||
}
|
||||
},
|
||||
"inflight": {
|
||||
|
@ -4205,15 +4204,14 @@
|
|||
"dev": true,
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"once": "^1.3.0",
|
||||
"wrappy": "1"
|
||||
"once": "1.4.0",
|
||||
"wrappy": "1.0.2"
|
||||
}
|
||||
},
|
||||
"inherits": {
|
||||
"version": "2.0.4",
|
||||
"bundled": true,
|
||||
"dev": true,
|
||||
"optional": true
|
||||
"dev": true
|
||||
},
|
||||
"ini": {
|
||||
"version": "1.3.5",
|
||||
|
@ -4225,9 +4223,8 @@
|
|||
"version": "1.0.0",
|
||||
"bundled": true,
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"number-is-nan": "^1.0.0"
|
||||
"number-is-nan": "1.0.1"
|
||||
}
|
||||
},
|
||||
"isarray": {
|
||||
|
@ -4240,25 +4237,22 @@
|
|||
"version": "3.0.4",
|
||||
"bundled": true,
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"brace-expansion": "^1.1.7"
|
||||
"brace-expansion": "1.1.11"
|
||||
}
|
||||
},
|
||||
"minimist": {
|
||||
"version": "1.2.5",
|
||||
"bundled": true,
|
||||
"dev": true,
|
||||
"optional": true
|
||||
"dev": true
|
||||
},
|
||||
"minipass": {
|
||||
"version": "2.9.0",
|
||||
"bundled": true,
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"safe-buffer": "^5.1.2",
|
||||
"yallist": "^3.0.0"
|
||||
"safe-buffer": "5.1.2",
|
||||
"yallist": "3.1.1"
|
||||
}
|
||||
},
|
||||
"minizlib": {
|
||||
|
@ -4267,16 +4261,15 @@
|
|||
"dev": true,
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"minipass": "^2.9.0"
|
||||
"minipass": "2.9.0"
|
||||
}
|
||||
},
|
||||
"mkdirp": {
|
||||
"version": "0.5.3",
|
||||
"bundled": true,
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"minimist": "^1.2.5"
|
||||
"minimist": "1.2.5"
|
||||
}
|
||||
},
|
||||
"ms": {
|
||||
|
@ -4291,9 +4284,9 @@
|
|||
"dev": true,
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"debug": "^3.2.6",
|
||||
"iconv-lite": "^0.4.4",
|
||||
"sax": "^1.2.4"
|
||||
"debug": "3.2.6",
|
||||
"iconv-lite": "0.4.24",
|
||||
"sax": "1.2.4"
|
||||
}
|
||||
},
|
||||
"node-pre-gyp": {
|
||||
|
@ -4302,16 +4295,16 @@
|
|||
"dev": true,
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"detect-libc": "^1.0.2",
|
||||
"mkdirp": "^0.5.1",
|
||||
"needle": "^2.2.1",
|
||||
"nopt": "^4.0.1",
|
||||
"npm-packlist": "^1.1.6",
|
||||
"npmlog": "^4.0.2",
|
||||
"rc": "^1.2.7",
|
||||
"rimraf": "^2.6.1",
|
||||
"semver": "^5.3.0",
|
||||
"tar": "^4.4.2"
|
||||
"detect-libc": "1.0.3",
|
||||
"mkdirp": "0.5.3",
|
||||
"needle": "2.3.3",
|
||||
"nopt": "4.0.3",
|
||||
"npm-packlist": "1.4.8",
|
||||
"npmlog": "4.1.2",
|
||||
"rc": "1.2.8",
|
||||
"rimraf": "2.7.1",
|
||||
"semver": "5.7.1",
|
||||
"tar": "4.4.13"
|
||||
}
|
||||
},
|
||||
"nopt": {
|
||||
|
@ -4320,8 +4313,8 @@
|
|||
"dev": true,
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"abbrev": "1",
|
||||
"osenv": "^0.1.4"
|
||||
"abbrev": "1.1.1",
|
||||
"osenv": "0.1.5"
|
||||
}
|
||||
},
|
||||
"npm-bundled": {
|
||||
|
@ -4330,14 +4323,13 @@
|
|||
"dev": true,
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"npm-normalize-package-bin": "^1.0.1"
|
||||
"npm-normalize-package-bin": "1.0.1"
|
||||
}
|
||||
},
|
||||
"npm-normalize-package-bin": {
|
||||
"version": "1.0.1",
|
||||
"bundled": true,
|
||||
"dev": true,
|
||||
"optional": true
|
||||
"dev": true
|
||||
},
|
||||
"npm-packlist": {
|
||||
"version": "1.4.8",
|
||||
|
@ -4345,9 +4337,9 @@
|
|||
"dev": true,
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"ignore-walk": "^3.0.1",
|
||||
"npm-bundled": "^1.0.1",
|
||||
"npm-normalize-package-bin": "^1.0.1"
|
||||
"ignore-walk": "3.0.3",
|
||||
"npm-bundled": "1.1.1",
|
||||
"npm-normalize-package-bin": "1.0.1"
|
||||
}
|
||||
},
|
||||
"npmlog": {
|
||||
|
@ -4356,17 +4348,16 @@
|
|||
"dev": true,
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"are-we-there-yet": "~1.1.2",
|
||||
"console-control-strings": "~1.1.0",
|
||||
"gauge": "~2.7.3",
|
||||
"set-blocking": "~2.0.0"
|
||||
"are-we-there-yet": "1.1.5",
|
||||
"console-control-strings": "1.1.0",
|
||||
"gauge": "2.7.4",
|
||||
"set-blocking": "2.0.0"
|
||||
}
|
||||
},
|
||||
"number-is-nan": {
|
||||
"version": "1.0.1",
|
||||
"bundled": true,
|
||||
"dev": true,
|
||||
"optional": true
|
||||
"dev": true
|
||||
},
|
||||
"object-assign": {
|
||||
"version": "4.1.1",
|
||||
|
@ -4378,9 +4369,8 @@
|
|||
"version": "1.4.0",
|
||||
"bundled": true,
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"wrappy": "1"
|
||||
"wrappy": "1.0.2"
|
||||
}
|
||||
},
|
||||
"os-homedir": {
|
||||
|
@ -4401,8 +4391,8 @@
|
|||
"dev": true,
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"os-homedir": "^1.0.0",
|
||||
"os-tmpdir": "^1.0.0"
|
||||
"os-homedir": "1.0.2",
|
||||
"os-tmpdir": "1.0.2"
|
||||
}
|
||||
},
|
||||
"path-is-absolute": {
|
||||
|
@ -4423,10 +4413,10 @@
|
|||
"dev": true,
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"deep-extend": "^0.6.0",
|
||||
"ini": "~1.3.0",
|
||||
"minimist": "^1.2.0",
|
||||
"strip-json-comments": "~2.0.1"
|
||||
"deep-extend": "0.6.0",
|
||||
"ini": "1.3.5",
|
||||
"minimist": "1.2.5",
|
||||
"strip-json-comments": "2.0.1"
|
||||
}
|
||||
},
|
||||
"readable-stream": {
|
||||
|
@ -4435,13 +4425,13 @@
|
|||
"dev": true,
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"core-util-is": "~1.0.0",
|
||||
"inherits": "~2.0.3",
|
||||
"isarray": "~1.0.0",
|
||||
"process-nextick-args": "~2.0.0",
|
||||
"safe-buffer": "~5.1.1",
|
||||
"string_decoder": "~1.1.1",
|
||||
"util-deprecate": "~1.0.1"
|
||||
"core-util-is": "1.0.2",
|
||||
"inherits": "2.0.4",
|
||||
"isarray": "1.0.0",
|
||||
"process-nextick-args": "2.0.1",
|
||||
"safe-buffer": "5.1.2",
|
||||
"string_decoder": "1.1.1",
|
||||
"util-deprecate": "1.0.2"
|
||||
}
|
||||
},
|
||||
"rimraf": {
|
||||
|
@ -4450,14 +4440,13 @@
|
|||
"dev": true,
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"glob": "^7.1.3"
|
||||
"glob": "7.1.6"
|
||||
}
|
||||
},
|
||||
"safe-buffer": {
|
||||
"version": "5.1.2",
|
||||
"bundled": true,
|
||||
"dev": true,
|
||||
"optional": true
|
||||
"dev": true
|
||||
},
|
||||
"safer-buffer": {
|
||||
"version": "2.1.2",
|
||||
|
@ -4493,11 +4482,10 @@
|
|||
"version": "1.0.2",
|
||||
"bundled": true,
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"code-point-at": "^1.0.0",
|
||||
"is-fullwidth-code-point": "^1.0.0",
|
||||
"strip-ansi": "^3.0.0"
|
||||
"code-point-at": "1.1.0",
|
||||
"is-fullwidth-code-point": "1.0.0",
|
||||
"strip-ansi": "3.0.1"
|
||||
}
|
||||
},
|
||||
"string_decoder": {
|
||||
|
@ -4506,16 +4494,15 @@
|
|||
"dev": true,
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"safe-buffer": "~5.1.0"
|
||||
"safe-buffer": "5.1.2"
|
||||
}
|
||||
},
|
||||
"strip-ansi": {
|
||||
"version": "3.0.1",
|
||||
"bundled": true,
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"ansi-regex": "^2.0.0"
|
||||
"ansi-regex": "2.1.1"
|
||||
}
|
||||
},
|
||||
"strip-json-comments": {
|
||||
|
@ -4530,13 +4517,13 @@
|
|||
"dev": true,
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"chownr": "^1.1.1",
|
||||
"fs-minipass": "^1.2.5",
|
||||
"minipass": "^2.8.6",
|
||||
"minizlib": "^1.2.1",
|
||||
"mkdirp": "^0.5.0",
|
||||
"safe-buffer": "^5.1.2",
|
||||
"yallist": "^3.0.3"
|
||||
"chownr": "1.1.4",
|
||||
"fs-minipass": "1.2.7",
|
||||
"minipass": "2.9.0",
|
||||
"minizlib": "1.3.3",
|
||||
"mkdirp": "0.5.3",
|
||||
"safe-buffer": "5.1.2",
|
||||
"yallist": "3.1.1"
|
||||
}
|
||||
},
|
||||
"util-deprecate": {
|
||||
|
@ -4551,20 +4538,18 @@
|
|||
"dev": true,
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"string-width": "^1.0.2 || 2"
|
||||
"string-width": "1.0.2"
|
||||
}
|
||||
},
|
||||
"wrappy": {
|
||||
"version": "1.0.2",
|
||||
"bundled": true,
|
||||
"dev": true,
|
||||
"optional": true
|
||||
"dev": true
|
||||
},
|
||||
"yallist": {
|
||||
"version": "3.1.1",
|
||||
"bundled": true,
|
||||
"dev": true,
|
||||
"optional": true
|
||||
"dev": true
|
||||
}
|
||||
}
|
||||
},
|
||||
|
|
|
@ -31,6 +31,7 @@
|
|||
"@fullcalendar/timegrid": "^4.4.0",
|
||||
"@fullcalendar/timeline": "^4.4.0",
|
||||
"chart.js": "^2.9.3",
|
||||
"flatpickr": "^4.6.3",
|
||||
"locale-js": "^1.1.1",
|
||||
"moment": "^2.25.0"
|
||||
}
|
||||
|
|
File diff suppressed because one or more lines are too long
|
@ -0,0 +1,6 @@
|
|||
|
||||
.footer-button {
|
||||
display: inline-block;
|
||||
white-space: nowrap;
|
||||
margin-right: 10px;
|
||||
}
|
File diff suppressed because it is too large
Load Diff
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"/js/app.js": "/js/app.js",
|
||||
"/css/app.css": "/css/app.css",
|
||||
"/css/fullcalendar.css": "/css/fullcalendar.css"
|
||||
"/css/mixed.css": "/css/mixed.css"
|
||||
}
|
||||
|
|
|
@ -11,6 +11,16 @@ import { Calendar } from '@fullcalendar/core';
|
|||
import dayGridPlugin from '@fullcalendar/daygrid';
|
||||
import timeGridPlugin from '@fullcalendar/timegrid';
|
||||
import listPlugin from '@fullcalendar/list';
|
||||
import flatpickr from "flatpickr";
|
||||
|
||||
|
||||
|
||||
flatpickr("#appointmentDateTime", {
|
||||
enableTime: true,
|
||||
dateFormat: "Y-m-d H:i",
|
||||
static: false
|
||||
});
|
||||
|
||||
|
||||
window.Vue = require('vue');
|
||||
|
||||
|
|
|
@ -65,7 +65,7 @@
|
|||
<label for="minecraftUsername" class="col-md-4 col-form-label text-md-right">Minecraft Username</label>
|
||||
|
||||
<div class="col-md-6">
|
||||
<input type="text" id="minecraftUsername" name="uuid" class="form-control" required>
|
||||
<input type="text" id="minecraftUsername" name="uuid" class="form-control @error('uuid') is-invalid @enderror" required>
|
||||
|
||||
@error('uuid')
|
||||
<span class="invalid-feedback" role="alert">
|
||||
|
|
|
@ -62,21 +62,21 @@
|
|||
<ul class="navbar-nav ml-auto float-right">
|
||||
@guest
|
||||
<li class="nav-item">
|
||||
<button class="btn btn-info" type="button" onclick="window.location.href='login'"><i class="fas fa-sign-in-alt"></i> Sign-in</button>
|
||||
<button class="btn btn-info" type="button" onclick="window.location.href='{{route('login')}}'"><i class="fas fa-sign-in-alt"></i> Sign-in</button>
|
||||
</li>
|
||||
|
||||
<li class="nav-item">
|
||||
<button class="btn btn-info" type="button" onclick="window.location.href='register'"><i class="fas fa-plus"></i> Sign-up</button>
|
||||
<button class="btn btn-info" type="button" onclick="window.location.href='{{route('register')}}'"><i class="fas fa-plus"></i> Sign-up</button>
|
||||
</li>
|
||||
@endguest
|
||||
|
||||
@auth
|
||||
<li class="nav-item">
|
||||
<button type="button" class="btn btn-info" onclick="window.location.href='dashboard'">Dashboard</button>
|
||||
<button type="button" class="btn btn-info" onclick="window.location.href='{{route('dashboard')}}'">Dashboard</button>
|
||||
</li>
|
||||
|
||||
<li class="nav-item">
|
||||
<form method="POST" action="logout">
|
||||
<form method="POST" action="{{route('logout')}}">
|
||||
@csrf
|
||||
<button type="submit" class="btn btn-danger"><i class="fa fa-power-off"></i> Sign-out</button>
|
||||
</form>
|
||||
|
|
|
@ -0,0 +1,4 @@
|
|||
<div class="alert alert-{{$alertType}} {{$extraStyling ?? ''}}">
|
||||
<!-- Simplicity is the essence of happiness. - Cedric Bledsoe -->
|
||||
{{$slot}}
|
||||
</div>
|
|
@ -0,0 +1,27 @@
|
|||
<div class="card" id="{{$id}}">
|
||||
<!-- Let all your things have their places; let each part of your business have its time. - Benjamin Franklin -->
|
||||
|
||||
<div class="card-header">
|
||||
|
||||
<div class="card-title">
|
||||
<h3>{{$cardTitle}}</h3>
|
||||
</div>
|
||||
|
||||
{{$cardHeader}}
|
||||
|
||||
</div>
|
||||
|
||||
<div class="card-body">
|
||||
|
||||
{{$slot}}
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
<div class="card-footer {{$footerStyle}}">
|
||||
|
||||
{{$cardFooter}}
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
|
@ -0,0 +1,25 @@
|
|||
<!-- Smile, breathe, and go slowly. - Thich Nhat Hanh -->
|
||||
|
||||
<div class="modal fade" id="{{$id}}" role="dialog" aria-labelledby="{{$modalLabel}}" aria-hidden="true">
|
||||
<div class="modal-dialog" role="document">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<h5 class="modal-title" id="{{$modalLabel}}">{{$modalTitle}}</h5>
|
||||
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
|
||||
<span aria-hidden="true">×</span>
|
||||
</button>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
{{ $slot }}
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
|
||||
{{ $modalFooter }}
|
||||
|
||||
@if ($includeCloseButton == true)
|
||||
<button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
|
||||
@endif
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
|
@ -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,6 +53,8 @@
|
|||
|
||||
<div class="card-body">
|
||||
|
||||
@if (!$applications->isEmpty())
|
||||
|
||||
<table class="table" style="white-space: nowrap">
|
||||
|
||||
<thead>
|
||||
|
@ -68,22 +70,34 @@
|
|||
|
||||
<tbody>
|
||||
|
||||
<tr>
|
||||
@foreach($applications as $application)
|
||||
|
||||
<td>1</td>
|
||||
<td>Jonathan Smith</td>
|
||||
<td><span class="badge badge-warning">Awaiting Interview</span></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"><i class="fa fa-eye"></i> View</button>
|
||||
<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>
|
||||
|
||||
@endforeach
|
||||
|
||||
</tbody>
|
||||
|
||||
</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>
|
||||
|
||||
</div>
|
||||
|
@ -102,6 +116,7 @@
|
|||
|
||||
<div class="card-body">
|
||||
|
||||
@if (!$upcomingApplications->isEmpty())
|
||||
<table class="table" style="white-space: nowrap">
|
||||
|
||||
<thead>
|
||||
|
@ -121,22 +136,35 @@
|
|||
|
||||
<tbody>
|
||||
|
||||
@foreach($upcomingApplications as $upcomingApp)
|
||||
|
||||
<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>{{$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"><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>
|
||||
<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>
|
||||
|
||||
@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>
|
||||
|
||||
</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
|
||||
|
|
|
@ -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,6 +42,7 @@
|
|||
|
||||
<div class="card-body">
|
||||
|
||||
@if (!$applications->isEmpty())
|
||||
<table class="table" style="white-space: nowrap">
|
||||
|
||||
<thead>
|
||||
|
@ -39,7 +51,8 @@
|
|||
<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>
|
||||
|
||||
|
@ -47,28 +60,40 @@
|
|||
|
||||
<tbody>
|
||||
|
||||
@foreach($applications as $application)
|
||||
|
||||
<tr>
|
||||
|
||||
<td>1</td>
|
||||
<td>Jonathan Smith</td>
|
||||
<td><span class="badge badge-info">Under Review</span></td>
|
||||
<td>2020-04-20</td>
|
||||
<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-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>
|
||||
<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>
|
||||
|
||||
</tr>
|
||||
|
||||
@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
|
||||
|
|
|
@ -36,11 +36,12 @@
|
|||
<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">
|
||||
|
||||
@if(!$applications->isEmpty())
|
||||
<table class="table" style="white-space: nowrap">
|
||||
|
||||
<thead>
|
||||
|
@ -57,23 +58,32 @@
|
|||
|
||||
<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>
|
||||
|
||||
</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>
|
||||
|
||||
|
|
|
@ -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
|
|
@ -34,10 +34,15 @@ Route::group(['middleware' => 'auth'], function(){
|
|||
|
||||
Route::group(['prefix' => '/applications'], function (){
|
||||
|
||||
Route::get('/current', 'ApplicationController@showUserApps')
|
||||
Route::get('/my-applications', 'ApplicationController@showUserApps')
|
||||
->name('showUserApps')
|
||||
->middleware('eligibility');
|
||||
|
||||
Route::get('/view/{id}', 'ApplicationController@showUserApp')
|
||||
->name('showUserApp');
|
||||
|
||||
Route::patch('/update/{id}/{newStatus}', 'ApplicationController@updateApplicationStatus')
|
||||
->name('updateApplicationStatus');
|
||||
|
||||
Route::get('/staff/outstanding', 'ApplicationController@showAllPendingApps')
|
||||
->name('staffPendingApps');
|
||||
|
@ -51,6 +56,16 @@ Route::group(['middleware' => 'auth'], function(){
|
|||
|
||||
});
|
||||
|
||||
Route::group(['prefix' => 'appointments'], function (){
|
||||
|
||||
Route::post('schedule/appointments/{applicationID}', 'AppointmentController@saveAppointment')
|
||||
->name('scheduleAppointment');
|
||||
|
||||
Route::patch('update/appointments/{applicationID}/{status}', 'AppointmentController@updateAppointment')
|
||||
->name('updateAppointment');
|
||||
|
||||
});
|
||||
|
||||
Route::group(['prefix' => 'apply', 'middleware' => ['eligibility']], function (){
|
||||
|
||||
Route::get('positions/{vacancySlug}', 'ApplicationController@renderApplicationForm')
|
||||
|
|
|
@ -0,0 +1,2 @@
|
|||
*
|
||||
!.gitignore
|
|
@ -19,8 +19,9 @@ mix.styles([
|
|||
'node_modules/@fullcalendar/daygrid/main.css',
|
||||
'node_modules/@fullcalendar/timeline/main.css',
|
||||
'node_modules/@fullcalendar/timegrid/main.css',
|
||||
'node_modules/@fullcalendar/list/main.css'
|
||||
], 'public/css/fullcalendar.css');
|
||||
'node_modules/@fullcalendar/list/main.css',
|
||||
'node_modules/flatpickr/dist/flatpickr.min.css'
|
||||
], 'public/css/mixed.css');
|
||||
|
||||
mix.webpackConfig({
|
||||
stats: {
|
||||
|
|
Loading…
Reference in New Issue