Browse Source

Significant changes

Added several components and features too long to list here
l10n_master
Miguel N. 1 year ago
parent
commit
cc8c293cc6
  1. 6
      .idea/hrm-mcserver.iml
  2. 6
      .idea/php.xml
  3. 19
      app/Application.php
  4. 20
      app/Appointment.php
  5. 9
      app/Form.php
  6. 107
      app/Http/Controllers/ApplicationController.php
  7. 80
      app/Http/Controllers/AppointmentController.php
  8. 2
      app/Http/Controllers/Auth/RegisterController.php
  9. 15
      app/Response.php
  10. 35
      app/View/Components/Alert.php
  11. 40
      app/View/Components/Card.php
  12. 45
      app/View/Components/Modal.php
  13. 2
      composer.json
  14. 816
      composer.lock
  15. 27
      config/adminlte.php
  16. 32
      database/migrations/2020_05_14_004542_change_form_structure_length.php
  17. 209
      package-lock.json
  18. 1
      package.json
  19. 1921
      public/css/mixed.css
  20. 6
      public/css/viewapplication.css
  21. 2631
      public/js/app.js
  22. 0
      public/js/datepick.js
  23. 2
      public/mix-manifest.json
  24. 10
      resources/js/app.js
  25. 4
      resources/views/auth/register.blade.php
  26. 8
      resources/views/breadcrumbs/header.blade.php
  27. 4
      resources/views/components/alert.blade.php
  28. 27
      resources/views/components/card.blade.php
  29. 25
      resources/views/components/modal.blade.php
  30. 107
      resources/views/dashboard/appmanagement/interview.blade.php
  31. 80
      resources/views/dashboard/appmanagement/outstandingapps.blade.php
  32. 38
      resources/views/dashboard/appmanagement/peerreview.blade.php
  33. 298
      resources/views/dashboard/user/viewapp.blade.php
  34. 17
      routes/web.php
  35. 2
      storage/debugbar/.gitignore
  36. 5
      webpack.mix.js

6
.idea/hrm-mcserver.iml

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

6
.idea/php.xml

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

19
app/Application.php

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

20
app/Appointment.php

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

9
app/Form.php

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

107
app/Http/Controllers/ApplicationController.php

@ -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 showPeerReview()
public function showPendingInterview()
{
return view('dashboard.appmanagement.peerreview');
$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 showPendingInterview()
public function showPeerReview()
{
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();
}
}

80
app/Http/Controllers/AppointmentController.php

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

2
app/Http/Controllers/Auth/RegisterController.php

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

15
app/Response.php

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

35
app/View/Components/Alert.php

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

40
app/View/Components/Card.php

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

45
app/View/Components/Modal.php

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

2
composer.json

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

816
composer.lock
File diff suppressed because it is too large
View File

27
config/adminlte.php

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

32
database/migrations/2020_05_14_004542_change_form_structure_length.php

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

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

1
package.json

@ -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
File diff suppressed because it is too large
View File

6
public/css/viewapplication.css

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

2631
public/js/app.js
File diff suppressed because it is too large
View File

0
public/js/datepick.js

2
public/mix-manifest.json

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

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

4
resources/views/auth/register.blade.php

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

8
resources/views/breadcrumbs/header.blade.php

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

4
resources/views/components/alert.blade.php

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

27
resources/views/components/card.blade.php

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

25
resources/views/components/modal.blade.php

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

107
resources/views/dashboard/appmanagement/interview.blade.php

@ -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>
</table>
@else
</tbody>
<div class="alert alert-danger">
</table>
<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)
<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>
@endforeach
</tbody>
</tbody>
</table>
</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

80
resources/views/dashboard/appmanagement/outstandingapps.blade.php

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