Significant changes

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

View File

@ -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" />

View File

@ -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" />

View File

@ -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
]);
}
}

View File

@ -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
]);
}
}

View File

@ -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');
}
}

View File

@ -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();
}
}

View File

@ -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();
}
}

View File

@ -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.'
]);
}

View File

@ -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');
}
}

View File

@ -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');
}
}

View File

@ -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');
}
}

View File

@ -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');
}
}

View File

@ -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",

818
composer.lock generated

File diff suppressed because it is too large Load Diff

View File

@ -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'
]
]
]
],
];

View File

@ -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();
});
}
}

209
package-lock.json generated
View File

@ -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
}
}
},

View File

@ -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"
}

1921
public/css/mixed.css vendored Normal file

File diff suppressed because one or more lines are too long

6
public/css/viewapplication.css vendored Normal file
View File

@ -0,0 +1,6 @@
.footer-button {
display: inline-block;
white-space: nowrap;
margin-right: 10px;
}

2631
public/js/app.js vendored

File diff suppressed because it is too large Load Diff

0
public/js/datepick.js vendored Normal file
View File

View File

@ -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"
}

10
resources/js/app.js vendored
View File

@ -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');

View File

@ -65,12 +65,12 @@
<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">
<strong>{{ $message }}</strong>
</span>
</span>
@enderror
</div>
</div>

View File

@ -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>

View File

@ -0,0 +1,4 @@
<div class="alert alert-{{$alertType}} {{$extraStyling ?? ''}}">
<!-- Simplicity is the essence of happiness. - Cedric Bledsoe -->
{{$slot}}
</div>

View File

@ -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>

View File

@ -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">&times;</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>

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

View File

@ -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')

2
storage/debugbar/.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
*
!.gitignore

5
webpack.mix.js vendored
View File

@ -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: {