Compare commits
66 Commits
l10n_maste
...
feature/RS
| Author | SHA1 | Date | |
|---|---|---|---|
| 82123b1c26 | |||
| 2a43e213f9 | |||
| b2adcee51e | |||
| 077ead9612 | |||
| 6cc99d2ebe | |||
| 0930c29b9a | |||
| 596a469e15 | |||
| 75f4404259 | |||
| 7c0c244e21 | |||
| 982854d5c6 | |||
| 551741c687 | |||
| dbeddd6fdb | |||
| b68449d3bf | |||
| 67d1df7571 | |||
| d4f1b433dc | |||
| f1db159eee | |||
| 0d14a65ee5 | |||
| 2942157603 | |||
| 11f3fb90d0 | |||
| 937a0206a5 | |||
| 3598a32ecf | |||
| ac8b303e2c | |||
| e93abd2ab7 | |||
| 20ab381076 | |||
| e566e40404 | |||
| b0a935b8b3 | |||
| 0dfb68dba2 | |||
| 24303052ad | |||
| 178bc31a6e | |||
| 98e557a840 | |||
| 95bf7c239e | |||
| 4d2595dd39 | |||
| 4e81a41210 | |||
| 1319ce6b86 | |||
| bea83b650c | |||
| 675cc3c329 | |||
| e8119b763c | |||
| 04838048ce | |||
| 87f8e63b24 | |||
| 7292aab4b7 | |||
| 9f3780d844 | |||
| e37b38f2d9 | |||
| c83e720a6d | |||
| 9241a83844 | |||
| c6685331a8 | |||
| 9da9b8e6fc | |||
| bb019f71e2 | |||
| 0cde3444ce | |||
| b61fb5642e | |||
| f7614916bf | |||
| 2ad1548cd6 | |||
| 43579c8fc9 | |||
| 0c9cea5c05 | |||
| 4371dd971c | |||
| c57ace1ad9 | |||
| c35b37d9b3 | |||
| f25c9f7bc7 | |||
| 25cebeefab | |||
| 8b47dbe2e0 | |||
| 290dbe99b6 | |||
| d7b506ec52 | |||
| d41d94b934 | |||
| b571d72eaf | |||
| 0c1f6f75eb | |||
| 5ea9e11a62 | |||
| fbd1e83306 |
@@ -21,9 +21,6 @@ RECAPTCHA_PRIVATE_KEY=
|
||||
RECAPTCHA_VERIFY_URL="https://www.google.com/recaptcha/api/siteverify"
|
||||
# WARNING: Your contact form will be useless if you change this value. Only change this URL if Google updates it.
|
||||
|
||||
IPGEO_API_KEY=""
|
||||
IPGEO_API_URL=""
|
||||
|
||||
MOJANG_STATUS_URL="https://status.mojang.com/check"
|
||||
MOJANG_API_URL="https://api.mojang.com"
|
||||
|
||||
@@ -32,7 +29,7 @@ IPGEO_API_URL="https://api.ipgeolocation.io/ipgeo"
|
||||
|
||||
ARCANEDEV_LOGVIEWER_MIDDLEWARE=web,auth,can:admin.maintenance.logs.view
|
||||
|
||||
RELEASE=staffmanagement@0.2.0
|
||||
RELEASE=staffmanagement@0.6.1
|
||||
|
||||
SLACK_INTEGRATION_WEBHOOK=
|
||||
|
||||
@@ -68,4 +65,8 @@ PUSHER_APP_CLUSTER=mt1
|
||||
MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
|
||||
MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"
|
||||
|
||||
# Mostly for developers, but with Papertrail, you can easily see what the app's users are doing without relying on
|
||||
# the internal log viewer.
|
||||
SENTRY_LARAVEL_DSN=
|
||||
PAPERTRAIL_URL=
|
||||
PAPERTRAIL_PORT
|
||||
|
||||
12
.idea/hrm-mcserver.iml
generated
12
.idea/hrm-mcserver.iml
generated
@@ -2,11 +2,14 @@
|
||||
<module type="WEB_MODULE" version="4">
|
||||
<component name="NewModuleRootManager">
|
||||
<content url="file://$MODULE_DIR$">
|
||||
<sourceFolder url="file://$MODULE_DIR$/database/factories" isTestSource="false" packagePrefix="Database\Factories\" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/tests" isTestSource="true" packagePrefix="Tests\" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/database/seeders" isTestSource="false" packagePrefix="Database\Seeders\" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/spec" isTestSource="true" />
|
||||
<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/awssat/discord-notification-channel" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/barryvdh/laravel-debugbar" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/brick/math" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/clue/stream-filter" />
|
||||
@@ -27,6 +30,7 @@
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/filp/whoops" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/fruitcake/laravel-cors" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/fzaninotto/faker" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/graham-campbell/result-type" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/guzzlehttp/guzzle" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/guzzlehttp/promises" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/guzzlehttp/psr7" />
|
||||
@@ -44,6 +48,7 @@
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/mcamara/laravel-localization" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/mockery/mockery" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/monolog/monolog" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/mpociot/teamwork" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/myclabs/deep-copy" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/nesbot/carbon" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/nikic/php-parser" />
|
||||
@@ -66,6 +71,7 @@
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/phpspec/prophecy" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/phpunit/php-code-coverage" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/phpunit/php-file-iterator" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/phpunit/php-invoker" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/phpunit/php-text-template" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/phpunit/php-timer" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/phpunit/php-token-stream" />
|
||||
@@ -82,12 +88,16 @@
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/ramsey/collection" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/ramsey/uuid" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/scrivo/highlight.php" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/sebastian/cli-parser" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/sebastian/code-unit" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/sebastian/code-unit-reverse-lookup" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/sebastian/comparator" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/sebastian/complexity" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/sebastian/diff" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/sebastian/environment" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/sebastian/exporter" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/sebastian/global-state" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/sebastian/lines-of-code" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/sebastian/object-enumerator" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/sebastian/object-reflector" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/sebastian/recursion-context" />
|
||||
@@ -106,6 +116,8 @@
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/event-dispatcher" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/event-dispatcher-contracts" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/finder" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/http-client" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/http-client-contracts" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/http-foundation" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/http-kernel" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/mime" />
|
||||
|
||||
12
.idea/php.xml
generated
12
.idea/php.xml
generated
@@ -141,9 +141,19 @@
|
||||
<path value="$PROJECT_DIR$/vendor/graham-campbell/markdown" />
|
||||
<path value="$PROJECT_DIR$/vendor/league/mime-type-detection" />
|
||||
<path value="$PROJECT_DIR$/vendor/mcamara/laravel-localization" />
|
||||
<path value="$PROJECT_DIR$/vendor/mpociot/teamwork" />
|
||||
<path value="$PROJECT_DIR$/vendor/sebastian/code-unit" />
|
||||
<path value="$PROJECT_DIR$/vendor/sebastian/cli-parser" />
|
||||
<path value="$PROJECT_DIR$/vendor/sebastian/complexity" />
|
||||
<path value="$PROJECT_DIR$/vendor/sebastian/lines-of-code" />
|
||||
<path value="$PROJECT_DIR$/vendor/graham-campbell/result-type" />
|
||||
<path value="$PROJECT_DIR$/vendor/symfony/http-client" />
|
||||
<path value="$PROJECT_DIR$/vendor/symfony/http-client-contracts" />
|
||||
<path value="$PROJECT_DIR$/vendor/phpunit/php-invoker" />
|
||||
<path value="$PROJECT_DIR$/vendor/awssat/discord-notification-channel" />
|
||||
</include_path>
|
||||
</component>
|
||||
<component name="PhpProjectSharedConfiguration" php_language_level="7.2" />
|
||||
<component name="PhpProjectSharedConfiguration" php_language_level="7.3" />
|
||||
<component name="PhpUnit">
|
||||
<phpunit_settings>
|
||||
<PhpUnitSettings configuration_file_path="$PROJECT_DIR$/phpunit.xml" custom_loader_path="$PROJECT_DIR$/vendor/autoload.php" use_configuration_file="true" />
|
||||
|
||||
6
.vscode/launch.json
vendored
6
.vscode/launch.json
vendored
@@ -4,11 +4,15 @@
|
||||
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
|
||||
"version": "0.2.0",
|
||||
"configurations": [
|
||||
|
||||
{
|
||||
"name": "Listen for XDebug",
|
||||
"type": "php",
|
||||
"request": "launch",
|
||||
"port": 9000
|
||||
"port": 9000,
|
||||
"ignore": [
|
||||
"**/vendor/**/*.php"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Launch currently open script",
|
||||
|
||||
76
CODE_OF_CONDUCT.md
Normal file
76
CODE_OF_CONDUCT.md
Normal file
@@ -0,0 +1,76 @@
|
||||
# Contributor Covenant Code of Conduct
|
||||
|
||||
## Our Pledge
|
||||
|
||||
In the interest of fostering an open and welcoming environment, we as
|
||||
contributors and maintainers pledge to making participation in our project and
|
||||
our community a harassment-free experience for everyone, regardless of age, body
|
||||
size, disability, ethnicity, sex characteristics, gender identity and expression,
|
||||
level of experience, education, socio-economic status, nationality, personal
|
||||
appearance, race, religion, or sexual identity and orientation.
|
||||
|
||||
## Our Standards
|
||||
|
||||
Examples of behavior that contributes to creating a positive environment
|
||||
include:
|
||||
|
||||
* Using welcoming and inclusive language
|
||||
* Being respectful of differing viewpoints and experiences
|
||||
* Gracefully accepting constructive criticism
|
||||
* Focusing on what is best for the community
|
||||
* Showing empathy towards other community members
|
||||
|
||||
Examples of unacceptable behavior by participants include:
|
||||
|
||||
* The use of sexualized language or imagery and unwelcome sexual attention or
|
||||
advances
|
||||
* Trolling, insulting/derogatory comments, and personal or political attacks
|
||||
* Public or private harassment
|
||||
* Publishing others' private information, such as a physical or electronic
|
||||
address, without explicit permission
|
||||
* Other conduct which could reasonably be considered inappropriate in a
|
||||
professional setting
|
||||
|
||||
## Our Responsibilities
|
||||
|
||||
Project maintainers are responsible for clarifying the standards of acceptable
|
||||
behavior and are expected to take appropriate and fair corrective action in
|
||||
response to any instances of unacceptable behavior.
|
||||
|
||||
Project maintainers have the right and responsibility to remove, edit, or
|
||||
reject comments, commits, code, wiki edits, issues, and other contributions
|
||||
that are not aligned to this Code of Conduct, or to ban temporarily or
|
||||
permanently any contributor for other behaviors that they deem inappropriate,
|
||||
threatening, offensive, or harmful.
|
||||
|
||||
## Scope
|
||||
|
||||
This Code of Conduct applies both within project spaces and in public spaces
|
||||
when an individual is representing the project or its community. Examples of
|
||||
representing a project or community include using an official project e-mail
|
||||
address, posting via an official social media account, or acting as an appointed
|
||||
representative at an online or offline event. Representation of a project may be
|
||||
further defined and clarified by project maintainers.
|
||||
|
||||
## Enforcement
|
||||
|
||||
Instances of abusive, harassing, or otherwise unacceptable behavior may be
|
||||
reported by contacting the project team at support@spacejewel-hosting.com. All
|
||||
complaints will be reviewed and investigated and will result in a response that
|
||||
is deemed necessary and appropriate to the circumstances. The project team is
|
||||
obligated to maintain confidentiality with regard to the reporter of an incident.
|
||||
Further details of specific enforcement policies may be posted separately.
|
||||
|
||||
Project maintainers who do not follow or enforce the Code of Conduct in good
|
||||
faith may face temporary or permanent repercussions as determined by other
|
||||
members of the project's leadership.
|
||||
|
||||
## Attribution
|
||||
|
||||
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
|
||||
available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html
|
||||
|
||||
[homepage]: https://www.contributor-covenant.org
|
||||
|
||||
For answers to common questions about this code of conduct, see
|
||||
https://www.contributor-covenant.org/faq
|
||||
29
CONTRIBUTING.md
Normal file
29
CONTRIBUTING.md
Normal file
@@ -0,0 +1,29 @@
|
||||
# Thank you for contributing!
|
||||
|
||||
Read this file carefully before contributing to the project. It's important that everyone follows these rules to ensure smooth contribution.
|
||||
|
||||
## General workflow
|
||||
|
||||
Since the project is under version 1.0.0, the master branch can be quite unstable, and even unusable. For this reason, I recommend you stick to the published
|
||||
releases, unless you intend on helping out with the project.
|
||||
|
||||
New features are commited directly to the ``master`` branch, while translations are commited to a special service branch, merged onto ``translate``, tested, and
|
||||
merged back to master. Above version 1.0.0, new features should follow the same procedure as translations.
|
||||
|
||||
## Before commiting
|
||||
|
||||
Before commiting, make sure your code adheres to the Laravel coding guidelines, as well as PSR-4. I'll personally review and merge each PR.
|
||||
Thank you for your interest!
|
||||
|
||||
|
||||
# Bug reports
|
||||
|
||||
As always, bug reports should stick to the bug report template. GitHub makes this easy for you by letting you choose which issue template you'd like to use
|
||||
before reporting an isuse. This helps everyone stay in the same page.
|
||||
|
||||
Issues published without a template might take longer to be resolved, or may be ignored and marked ``wontfix``.
|
||||
|
||||
|
||||
# Licensing
|
||||
|
||||
Any contributions you make will be under the GNU GPL v3 license, which is the license that covers this project.
|
||||
10
README.md
10
README.md
@@ -1,5 +1,5 @@
|
||||
|
||||
# Raspberry Teams - The Simple Staff Application Manager v 0.1.0 [](https://crowdin.com/project/raspberry-staff-manager)
|
||||
# Raspberry Teams - The Simple Staff Application Manager v 0.6.2 [](https://crowdin.com/project/raspberry-staff-manager)
|
||||
## The quick and pain-free staff application manager
|
||||
|
||||
Have you ever gotten tired of managing your Minecraft server/network's applications through Discord (or anything else) and having to scroll through hundreds of new messages just to find that one applicant's username?
|
||||
@@ -47,6 +47,14 @@ Tech stack:
|
||||
- AdminLTE / Bootstrap 4
|
||||
- jQuery / Plain Javascript
|
||||
- vueJS (in the future)
|
||||
|
||||
# Stability
|
||||
|
||||
Currently, the ``master`` branch is highly unstable, since it's under active development. Expect it to break with each commit. Even though I make an effort to make sure each commit is good to go before pushing, things might still break unexpectedly, and you may find a lot of bugs (which you should report).
|
||||
|
||||
Every released version is currently pre-release. If you really want to run this before version ``1.0.0`` comes out, always stay on the latest version, as those will always be tested before release, ensuring less chaos.
|
||||
|
||||
*Note: This application is NOT production ready! It won't be until the first stable release comes out, which might take a bit longer.
|
||||
|
||||
# Operating System Requirements
|
||||
|
||||
|
||||
19
SECURITY.md
Normal file
19
SECURITY.md
Normal file
@@ -0,0 +1,19 @@
|
||||
# Security Policy
|
||||
|
||||
## Supported Versions
|
||||
|
||||
The following versions are currently supported:
|
||||
|
||||
| Version | Supported |
|
||||
| ------- | ------------------ |
|
||||
| 0.1.x | :x: |
|
||||
| 0.5.x | :x: |
|
||||
| 0.6.x | :white_check_mark: |
|
||||
|
||||
## Reporting a Vulnerability
|
||||
|
||||
To securely report a vulnerability, you may send me an email directly containing the details of said vulnerability: ``me@nogueira.codes``.
|
||||
|
||||
You may optionally encrypt your message with my [public PGP key](http://pool.sks-keyservers.net/pks/lookup?op=get&search=0x48DF709E7405702B).
|
||||
|
||||
Use this free [online encryption tool](https://www.igolder.com/pgp/encryption/) if you don't know how to use PGP on your desktop.
|
||||
@@ -8,7 +8,7 @@ class Ban extends Model
|
||||
{
|
||||
|
||||
public $fillable = [
|
||||
|
||||
|
||||
'userID',
|
||||
'reason',
|
||||
'bannedUntil',
|
||||
@@ -16,7 +16,11 @@ class Ban extends Model
|
||||
'authorUserID'
|
||||
|
||||
];
|
||||
|
||||
|
||||
public $dates = [
|
||||
'bannedUntil'
|
||||
];
|
||||
|
||||
public function user()
|
||||
{
|
||||
return $this->belongsTo('App\User', 'userID', 'id');
|
||||
|
||||
@@ -99,12 +99,16 @@ class Install extends Command
|
||||
$settings['MAIL_PASSWORD'] = $this->secret('SMTP Password (Input won\'t be seen)');
|
||||
$settings['MAIL_PORT'] = $this->ask('SMTP Server Port');
|
||||
$settings['MAIL_HOST'] = $this->ask('SMTP Server Hostname');
|
||||
$settings['MAIL_FROM'] = $this->ask('E-mail address to send from: ');
|
||||
|
||||
$this->info('== Notification Settings (5/6) (Slack) ==');
|
||||
$settings['SLACK_INTEGRATION_WEBHOOK'] = $this->ask('Integration webhook URL');
|
||||
|
||||
$this->info('== Web Settings (6/6) ==');
|
||||
$settings['APP_URL'] = $this->ask('Application\'s URL');
|
||||
$settings['APP_URL'] = $this->ask('Application\'s URL (ex. https://where.you.installed.theapp.com): ');
|
||||
$settings['APP_LOGO'] = $this->ask('App logo (Link to an image): ');
|
||||
$settings['APP_SITEHOMEPAGE'] = $this->ask('Site homepage (appears in the main header): ');
|
||||
|
||||
|
||||
} while(!$this->confirm('Are you sure you want to save these settings? You can always go back and try again.'));
|
||||
|
||||
|
||||
@@ -3,7 +3,17 @@
|
||||
|
||||
namespace App\Facades;
|
||||
use \Illuminate\Support\Facades\Facade;
|
||||
use phpDocumentor\Reflection\Types\Boolean;
|
||||
|
||||
/**
|
||||
* Class Options
|
||||
* @package App\Facades
|
||||
*
|
||||
* @method static void setOption(string $option, string $value, string $description)
|
||||
* @method static string getOption(string $option)
|
||||
* @method static void changeOption(string $option, string $newValue)
|
||||
* @method static Boolean optionExists(string $option)
|
||||
*/
|
||||
class Options extends Facade
|
||||
{
|
||||
public static function getFacadeAccessor()
|
||||
|
||||
@@ -13,9 +13,12 @@ class Options
|
||||
public function getOption(string $option): string
|
||||
{
|
||||
$value = Cache::get($option);
|
||||
$fromCache = true;
|
||||
|
||||
if (is_null($value))
|
||||
{
|
||||
$fromCache = false;
|
||||
|
||||
Log::debug('Option ' . $option . 'not found in cache, refreshing from database');
|
||||
$value = Option::where('option_name', $option)->first();
|
||||
if (is_null($value))
|
||||
@@ -25,7 +28,9 @@ class Options
|
||||
Cache::put($option . '_desc', 'Undefined description');
|
||||
}
|
||||
|
||||
return $value->option_value;
|
||||
return (!$fromCache)
|
||||
? $value->option_value
|
||||
: $value;
|
||||
}
|
||||
|
||||
public function setOption(string $option, string $value, string $description)
|
||||
|
||||
@@ -15,7 +15,7 @@ class BanController extends Controller
|
||||
public function insert(BanUserRequest $request, User $user)
|
||||
{
|
||||
|
||||
$this->authorize('create', Ban::class);
|
||||
$this->authorize('create', [Ban::class, $user]);
|
||||
|
||||
if (is_null($user->bans))
|
||||
{
|
||||
@@ -50,13 +50,13 @@ class BanController extends Controller
|
||||
else
|
||||
{
|
||||
// Essentially permanent
|
||||
$expiryDate->addYears(100);
|
||||
$expiryDate->addYears(5);
|
||||
}
|
||||
|
||||
$ban = Ban::create([
|
||||
'userID' => $user->id,
|
||||
'reason' => $reason,
|
||||
'bannedUntil' => $expiryDate->toDateTimeString() ?? null,
|
||||
'bannedUntil' => $expiryDate->format('Y-m-d H:i:s'),
|
||||
'userAgent' => "Unknown",
|
||||
'authorUserID' => Auth::user()->id
|
||||
]);
|
||||
|
||||
@@ -33,6 +33,14 @@ class FormController extends Controller
|
||||
$this->authorize('create', Form::class);
|
||||
$fields = $request->all();
|
||||
|
||||
if (count($fields) == 2)
|
||||
{
|
||||
// form is probably empty, since forms with fields will alawys have more than 2 items
|
||||
|
||||
$request->session()->flash('error', 'Sorry, but you may not create empty forms.');
|
||||
return redirect()->to(route('showForms'));
|
||||
}
|
||||
|
||||
$contextValidation = ContextAwareValidator::getValidator($fields, true, true);
|
||||
|
||||
if (!$contextValidation->get('validator')->fails())
|
||||
|
||||
@@ -7,6 +7,7 @@ use App\Options as Option;
|
||||
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
|
||||
class OptionsController extends Controller
|
||||
{
|
||||
@@ -29,17 +30,33 @@ class OptionsController extends Controller
|
||||
{
|
||||
if (Auth::user()->can('admin.settings.edit'))
|
||||
{
|
||||
Log::debug('Updating application options', [
|
||||
'ip' => $request->ip(),
|
||||
'ua' => $request->userAgent(),
|
||||
'username' => Auth::user()->username
|
||||
]);
|
||||
foreach($request->all() as $optionName => $option)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (Options::optionExists($option))
|
||||
Log::debug('Going through option ' . $optionName);
|
||||
if (Options::optionExists($optionName))
|
||||
{
|
||||
Log::debug('Option exists, updating to new values', [
|
||||
'opt' => $optionName,
|
||||
'new_value' => $option
|
||||
]);
|
||||
Options::changeOption($optionName, $option);
|
||||
}
|
||||
}
|
||||
catch(\Exception $ex)
|
||||
{
|
||||
Log::error('Unable to update options!', [
|
||||
'msg' => $ex->getMessage(),
|
||||
'trace' => $ex->getTraceAsString()
|
||||
]);
|
||||
report($ex);
|
||||
|
||||
$errorCond = true;
|
||||
$request->session()->flash('error', 'An error occurred while trying to save settings: ' . $ex->getMessage());
|
||||
}
|
||||
|
||||
262
app/Http/Controllers/TeamController.php
Normal file
262
app/Http/Controllers/TeamController.php
Normal file
@@ -0,0 +1,262 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Http\Requests\EditTeamRequest;
|
||||
use App\Http\Requests\NewTeamRequest;
|
||||
use App\Http\Requests\SendInviteRequest;
|
||||
use App\Mail\InviteToTeam;
|
||||
use App\Team;
|
||||
use App\User;
|
||||
use App\Vacancy;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
use Illuminate\Support\Facades\Mail;
|
||||
use Mpociot\Teamwork\Exceptions\UserNotInTeamException;
|
||||
use Mpociot\Teamwork\Facades\Teamwork;
|
||||
use Mpociot\Teamwork\TeamInvite;
|
||||
|
||||
|
||||
class TeamController extends Controller
|
||||
{
|
||||
/**
|
||||
* Display a listing of the resource.
|
||||
*
|
||||
* @return \Illuminate\Http\Response
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
$teams = Team::with('users.roles')->get();
|
||||
|
||||
return view('dashboard.teams.teams')
|
||||
->with('teams', $teams);
|
||||
}
|
||||
|
||||
/**
|
||||
* Show the form for creating a new resource.
|
||||
*
|
||||
* @return \Illuminate\Http\Response
|
||||
*/
|
||||
public function create()
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Store a newly created resource in storage.
|
||||
*
|
||||
* @param \Illuminate\Http\Request $request
|
||||
* @return \Illuminate\Http\Response
|
||||
*/
|
||||
public function store(NewTeamRequest $request)
|
||||
{
|
||||
$team = Team::create([
|
||||
'name' => $request->teamName,
|
||||
'owner_id' => Auth::user()->id
|
||||
]);
|
||||
|
||||
Auth::user()->teams()->attach($team->id);
|
||||
|
||||
$request->session()->flash('success', 'Team successfully created.');
|
||||
return redirect()->back();
|
||||
}
|
||||
|
||||
/**
|
||||
* Display the specified resource.
|
||||
*
|
||||
* @param int $id
|
||||
* @return \Illuminate\Http\Response
|
||||
*/
|
||||
public function show($id)
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Show the form for editing the specified resource.
|
||||
*
|
||||
* @param int $id
|
||||
* @return \Illuminate\Http\Response
|
||||
*/
|
||||
public function edit(Team $team)
|
||||
{
|
||||
return view('dashboard.teams.edit-team')
|
||||
->with('team', $team)
|
||||
->with('users', User::all())
|
||||
->with('vacancies', Vacancy::with('teams')->get()->all());
|
||||
}
|
||||
|
||||
/**
|
||||
* Update the specified resource in storage.
|
||||
*
|
||||
* @param \Illuminate\Http\Request $request
|
||||
* @param int $id
|
||||
* @return \Illuminate\Http\Response
|
||||
*/
|
||||
public function update(EditTeamRequest $request, Team $team)
|
||||
{
|
||||
$team->description = $request->teamDescription;
|
||||
$team->openJoin = $request->joinType;
|
||||
|
||||
$team->save();
|
||||
|
||||
$request->session()->flash('success', 'Team edited successfully.');
|
||||
return redirect()->to(route('teams.index'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove the specified resource from storage.
|
||||
*
|
||||
* @param int $id
|
||||
* @return \Illuminate\Http\Response
|
||||
*/
|
||||
public function destroy($id)
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
public function invite(SendInviteRequest $request, Team $team)
|
||||
{
|
||||
$user = User::findOrFail($request->user);
|
||||
|
||||
if (!$team->openJoin)
|
||||
{
|
||||
|
||||
if (!Teamwork::hasPendingInvite($user->email, $team))
|
||||
{
|
||||
Teamwork::inviteToTeam($user, $team, function(TeamInvite $invite) use ($user) {
|
||||
Mail::to($user)->send(new InviteToTeam($invite));
|
||||
});
|
||||
|
||||
$request->session()->flash('success', 'Invite sent! They can now accept or deny it.');
|
||||
}
|
||||
else
|
||||
{
|
||||
$request->session()->flash('error', 'This user has already been invited.');
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
$request->session()->flash('error', 'You can\'t invite users to public teams.');
|
||||
}
|
||||
|
||||
return redirect()->back();
|
||||
}
|
||||
|
||||
|
||||
|
||||
public function processInviteAction(Request $request, $action, $token)
|
||||
{
|
||||
|
||||
switch($action)
|
||||
{
|
||||
case 'accept':
|
||||
|
||||
$invite = Teamwork::getInviteFromAcceptToken($token);
|
||||
|
||||
if ($invite && $invite->user->is(Auth::user()))
|
||||
{
|
||||
Teamwork::acceptInvite($invite);
|
||||
$request->session()->flash('success', 'Invite accepted! You have now joined ' . $invite->team->name . '.');
|
||||
}
|
||||
else
|
||||
{
|
||||
$request->session()->flash('error', 'Invalid or expired invite URL.');
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case 'deny':
|
||||
|
||||
$invite = Teamwork::getInviteFromDenyToken($token);
|
||||
|
||||
if ($invite && $invite->user->is(Auth::user()))
|
||||
{
|
||||
Teamwork::denyInvite($invite);
|
||||
$request->session()->flash('success', 'Invite denied! Ask for another invite if this isn\'t what you meant.');
|
||||
}
|
||||
else
|
||||
{
|
||||
$request->session()->flash('error', 'Invalid or expired invite URL.');
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
default:
|
||||
$request->session()->flash('error', 'Sorry, but the invite URL you followed was malformed. Try asking for another invite, or submit a bug report.');
|
||||
|
||||
|
||||
}
|
||||
|
||||
// This page will show the user's current teams
|
||||
return redirect()->to(route('teams.index'));
|
||||
|
||||
}
|
||||
|
||||
public function switchTeam(Request $request, Team $team)
|
||||
{
|
||||
try
|
||||
{
|
||||
Auth::user()->switchTeam($team);
|
||||
|
||||
$request->session()->flash('success', 'Switched teams! Your team dashboard will now use this context.');
|
||||
}
|
||||
catch(UserNotInTeamException $ex)
|
||||
{
|
||||
$request->session()->flash('error', 'You can\'t switch to a team you don\'t belong to.');
|
||||
}
|
||||
|
||||
return redirect()->back();
|
||||
}
|
||||
|
||||
|
||||
// Since it's a separate form, we shouldn't use the same update method
|
||||
public function assignVacancies(Request $request, Team $team)
|
||||
{
|
||||
// P.S. To future developers
|
||||
// This method gave me a lot of trouble lol. It's hard to write code when you're half asleep.
|
||||
// There may be an n+1 query in the view and I don't think there's a way to avoid that without writing a lot of extra code.
|
||||
|
||||
$requestVacancies = $request->assocVacancies;
|
||||
$currentVacancies = $team->vacancies->pluck('id')->all();
|
||||
|
||||
if (is_null($requestVacancies))
|
||||
{
|
||||
|
||||
foreach ($team->vacancies as $vacancy)
|
||||
{
|
||||
$team->vacancies()->detach($vacancy->id);
|
||||
}
|
||||
|
||||
$request->session()->flash('success', 'Removed all vacancy associations.');
|
||||
return redirect()->back();
|
||||
}
|
||||
|
||||
$vacancyDiff = array_diff($requestVacancies, $currentVacancies);
|
||||
$deselectedDiff = array_diff($currentVacancies, $requestVacancies);
|
||||
|
||||
|
||||
if (!empty($vacancyDiff) || !empty($deselectedDiff))
|
||||
{
|
||||
foreach ($vacancyDiff as $selectedVacancy)
|
||||
{
|
||||
$team->vacancies()->attach($selectedVacancy);
|
||||
}
|
||||
|
||||
foreach ($deselectedDiff as $deselectedVacancy)
|
||||
{
|
||||
$team->vacancies()->detach($deselectedVacancy);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$team->vacancies()->attach($requestVacancies);
|
||||
}
|
||||
|
||||
$request->session()->flash('success', 'Assignments changed successfully.');
|
||||
return redirect()->back();
|
||||
|
||||
}
|
||||
}
|
||||
@@ -23,11 +23,13 @@ use App\Notifications\EmailChanged;
|
||||
use App\Notifications\ChangedPassword;
|
||||
use Spatie\Permission\Models\Role;
|
||||
|
||||
use App\Traits\ReceivesAccountTokens;
|
||||
use Google2FA;
|
||||
|
||||
class UserController extends Controller
|
||||
{
|
||||
|
||||
use ReceivesAccountTokens;
|
||||
|
||||
public function showStaffMembers()
|
||||
{
|
||||
@@ -220,7 +222,7 @@ class UserController extends Controller
|
||||
|
||||
if ($request->confirmPrompt == 'DELETE ACCOUNT')
|
||||
{
|
||||
$user->delete();
|
||||
$user->forceDelete();
|
||||
$request->session()->flash('success','User deleted successfully. PII has been erased.');
|
||||
}
|
||||
else
|
||||
@@ -232,6 +234,7 @@ class UserController extends Controller
|
||||
return redirect()->route('registeredPlayerList');
|
||||
}
|
||||
|
||||
|
||||
public function update(UpdateUserRequest $request, User $user)
|
||||
{
|
||||
|
||||
@@ -356,4 +359,6 @@ class UserController extends Controller
|
||||
//TODO: Dispatch event
|
||||
return redirect()->back();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -27,7 +27,7 @@ class BanUserRequest extends FormRequest
|
||||
{
|
||||
return [
|
||||
'reason' => 'required|string',
|
||||
'durationOperand' => 'nullable|integer',
|
||||
'durationOperand' => 'nullable|string',
|
||||
'durationOperator' => 'nullable|string'
|
||||
];
|
||||
}
|
||||
|
||||
31
app/Http/Requests/EditTeamRequest.php
Normal file
31
app/Http/Requests/EditTeamRequest.php
Normal file
@@ -0,0 +1,31 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Requests;
|
||||
|
||||
use Illuminate\Foundation\Http\FormRequest;
|
||||
|
||||
class EditTeamRequest extends FormRequest
|
||||
{
|
||||
/**
|
||||
* Determine if the user is authorized to make this request.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function authorize()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the validation rules that apply to the request.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function rules()
|
||||
{
|
||||
return [
|
||||
'teamDescription' => 'required|string|max:200',
|
||||
'joinType' => 'required|boolean'
|
||||
];
|
||||
}
|
||||
}
|
||||
30
app/Http/Requests/NewTeamRequest.php
Normal file
30
app/Http/Requests/NewTeamRequest.php
Normal file
@@ -0,0 +1,30 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Requests;
|
||||
|
||||
use Illuminate\Foundation\Http\FormRequest;
|
||||
|
||||
class NewTeamRequest extends FormRequest
|
||||
{
|
||||
/**
|
||||
* Determine if the user is authorized to make this request.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function authorize()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the validation rules that apply to the request.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function rules()
|
||||
{
|
||||
return [
|
||||
'teamName' => 'required|max:200|string'
|
||||
];
|
||||
}
|
||||
}
|
||||
30
app/Http/Requests/SendInviteRequest.php
Normal file
30
app/Http/Requests/SendInviteRequest.php
Normal file
@@ -0,0 +1,30 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Requests;
|
||||
|
||||
use Illuminate\Foundation\Http\FormRequest;
|
||||
|
||||
class SendInviteRequest extends FormRequest
|
||||
{
|
||||
/**
|
||||
* Determine if the user is authorized to make this request.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function authorize()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the validation rules that apply to the request.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function rules()
|
||||
{
|
||||
return [
|
||||
'user' => 'required|integer'
|
||||
];
|
||||
}
|
||||
}
|
||||
39
app/Http/Requests/UserDeleteRequest.php
Normal file
39
app/Http/Requests/UserDeleteRequest.php
Normal file
@@ -0,0 +1,39 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Requests;
|
||||
|
||||
use Illuminate\Foundation\Http\FormRequest;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
|
||||
class UserDeleteRequest extends FormRequest
|
||||
{
|
||||
/**
|
||||
* Determine if the user is authorized to make this request.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function authorize()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the validation rules that apply to the request.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function rules()
|
||||
{
|
||||
if (Auth::user()->has2FA())
|
||||
{
|
||||
return [
|
||||
'currentPassword' => 'required|password:web',
|
||||
'otp' => 'required|integer|max:6'
|
||||
];
|
||||
}
|
||||
|
||||
return [
|
||||
'currentPassword' => 'required|password:web'
|
||||
];
|
||||
}
|
||||
}
|
||||
45
app/Listeners/LogAuthenticationFailure.php
Normal file
45
app/Listeners/LogAuthenticationFailure.php
Normal file
@@ -0,0 +1,45 @@
|
||||
<?php
|
||||
|
||||
namespace App\Listeners;
|
||||
|
||||
use Illuminate\Contracts\Queue\ShouldQueue;
|
||||
use Illuminate\Queue\InteractsWithQueue;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
|
||||
class LogAuthenticationFailure
|
||||
{
|
||||
/**
|
||||
* Create the event listener.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle the event.
|
||||
*
|
||||
* @param object $event
|
||||
* @return void
|
||||
*/
|
||||
public function handle($event)
|
||||
{
|
||||
$targetAccountID = 0;
|
||||
$originalIP = "0.0.0.0";
|
||||
|
||||
if (isset($event->user->id))
|
||||
{
|
||||
$targetAccountID = $event->user->id;
|
||||
}
|
||||
|
||||
Log::alert('SECURITY (login): Detected failed authentication attempt!', [
|
||||
'targetAccountID' => $targetAccountID,
|
||||
'existingAccount' => ($targetAccountID == 0) ? false : true,
|
||||
'sourceIP' => request()->ip(),
|
||||
'matchesAccountLastIP' => request()->ip() == $originalIP,
|
||||
'sourceUserAgent' => request()->userAgent(),
|
||||
]);
|
||||
}
|
||||
}
|
||||
36
app/Listeners/LogAuthenticationSuccess.php
Normal file
36
app/Listeners/LogAuthenticationSuccess.php
Normal file
@@ -0,0 +1,36 @@
|
||||
<?php
|
||||
|
||||
namespace App\Listeners;
|
||||
|
||||
use Illuminate\Contracts\Queue\ShouldQueue;
|
||||
use Illuminate\Queue\InteractsWithQueue;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
|
||||
class LogAuthenticationSuccess
|
||||
{
|
||||
/**
|
||||
* Create the event listener.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle the event.
|
||||
*
|
||||
* @param object $event
|
||||
* @return void
|
||||
*/
|
||||
public function handle($event)
|
||||
{
|
||||
Log::info('SECURITY (postauth-pre2fa): Detected successful login attempt', [
|
||||
'accountID' => $event->user->id,
|
||||
'sourceIP' => request()->ip(),
|
||||
'matchesAccountLastIP' => request()->ip() == $event->user->originalIP,
|
||||
'sourceUserAgent' => request()->userAgent(),
|
||||
]);
|
||||
}
|
||||
}
|
||||
55
app/Mail/InviteToTeam.php
Normal file
55
app/Mail/InviteToTeam.php
Normal file
@@ -0,0 +1,55 @@
|
||||
<?php
|
||||
|
||||
namespace App\Mail;
|
||||
|
||||
use Illuminate\Bus\Queueable;
|
||||
use Illuminate\Contracts\Queue\ShouldQueue;
|
||||
use Illuminate\Mail\Mailable;
|
||||
use Illuminate\Queue\SerializesModels;
|
||||
use Mpociot\Teamwork\TeamInvite;
|
||||
|
||||
class InviteToTeam extends Mailable
|
||||
{
|
||||
use Queueable, SerializesModels;
|
||||
|
||||
|
||||
public $teamName;
|
||||
|
||||
|
||||
public $name;
|
||||
|
||||
|
||||
public $inviterName;
|
||||
|
||||
|
||||
public $denyToken;
|
||||
|
||||
|
||||
public $acceptToken;
|
||||
|
||||
/**
|
||||
* Create a new message instance.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function __construct(TeamInvite $invite)
|
||||
{
|
||||
$this->teamName = $invite->team->name;
|
||||
$this->name = $invite->user->name;
|
||||
$this->inviterName = $invite->inviter->name;
|
||||
$this->acceptToken = $invite->accept_token;
|
||||
$this->denyToken = $invite->deny_token;
|
||||
}
|
||||
|
||||
/**
|
||||
* Build the message.
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function build()
|
||||
{
|
||||
return $this
|
||||
->subject('You have just been invited to ' . $this->teamName)
|
||||
->view('mail.invited-to-team');
|
||||
}
|
||||
}
|
||||
56
app/Mail/UserAccountDeleteConfirmation.php
Normal file
56
app/Mail/UserAccountDeleteConfirmation.php
Normal file
@@ -0,0 +1,56 @@
|
||||
<?php
|
||||
|
||||
namespace App\Mail;
|
||||
|
||||
use Illuminate\Bus\Queueable;
|
||||
use Illuminate\Contracts\Queue\ShouldQueue;
|
||||
use Illuminate\Mail\Mailable;
|
||||
use Illuminate\Queue\SerializesModels;
|
||||
|
||||
use App\User;
|
||||
|
||||
class UserAccountDeleteConfirmation extends Mailable
|
||||
{
|
||||
use Queueable, SerializesModels;
|
||||
|
||||
|
||||
|
||||
public $deleteToken;
|
||||
|
||||
|
||||
public $cancelToken;
|
||||
|
||||
|
||||
public $originalIP;
|
||||
|
||||
|
||||
public $name;
|
||||
|
||||
|
||||
public $userID;
|
||||
|
||||
/**
|
||||
* Create a new message instance.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function __construct(User $user, array $tokens, string $originalIP)
|
||||
{
|
||||
$this->deleteToken = $tokens['delete'];
|
||||
$this->cancelToken = $tokens['cancel'];
|
||||
|
||||
$this->originalIP = $originalIP;
|
||||
$this->name = $user->name;
|
||||
$this->userID = $user->id;
|
||||
}
|
||||
|
||||
/**
|
||||
* Build the message.
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function build()
|
||||
{
|
||||
return $this->view('mail.deleted-account');
|
||||
}
|
||||
}
|
||||
@@ -4,6 +4,7 @@ namespace App\Notifications;
|
||||
|
||||
use App\Facades\Options;
|
||||
use App\Traits\Cancellable;
|
||||
use App\Traits\DiscordRoutable;
|
||||
use Illuminate\Bus\Queueable;
|
||||
use Illuminate\Contracts\Queue\ShouldQueue;
|
||||
use Illuminate\Notifications\Messages\MailMessage;
|
||||
@@ -13,7 +14,7 @@ use App\Application;
|
||||
|
||||
class ApplicationApproved extends Notification implements ShouldQueue
|
||||
{
|
||||
use Queueable, Cancellable;
|
||||
use Queueable, Cancellable, DiscordRoutable;
|
||||
|
||||
public $application;
|
||||
|
||||
@@ -80,6 +81,11 @@ class ApplicationApproved extends Notification implements ShouldQueue
|
||||
});
|
||||
}
|
||||
|
||||
public function toDiscord($notifiable)
|
||||
{
|
||||
return $this->toSlack($notifiable);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the array representation of the notification.
|
||||
*
|
||||
|
||||
@@ -2,6 +2,9 @@
|
||||
|
||||
namespace App\Notifications;
|
||||
|
||||
use App\Facades\Options;
|
||||
use App\Traits\DiscordRoutable;
|
||||
use Awssat\Notifications\Messages\DiscordMessage;
|
||||
use Illuminate\Bus\Queueable;
|
||||
use Illuminate\Contracts\Queue\ShouldQueue;
|
||||
use Illuminate\Notifications\Messages\MailMessage;
|
||||
@@ -11,7 +14,7 @@ use App\Application;
|
||||
|
||||
class ApplicationDenied extends Notification implements ShouldQueue
|
||||
{
|
||||
use Queueable;
|
||||
use Queueable, DiscordRoutable;
|
||||
|
||||
|
||||
public $application;
|
||||
@@ -34,14 +37,22 @@ class ApplicationDenied extends Notification implements ShouldQueue
|
||||
*/
|
||||
public function via($notifiable)
|
||||
{
|
||||
return ['mail', 'slack'];
|
||||
$options = ['mail'];
|
||||
|
||||
if (Options::getOption('enable_discord_notifications'))
|
||||
array_push($options, 'discord');
|
||||
|
||||
if (Options::getOption('enable_slack_notifications'))
|
||||
array_push($options, 'slack');
|
||||
|
||||
return $options;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the mail representation of the notification.
|
||||
*
|
||||
* @param mixed $notifiable
|
||||
* @return \Illuminate\Notifications\Messages\MailMessage
|
||||
* @return MailMessage
|
||||
*/
|
||||
public function toMail($notifiable)
|
||||
{
|
||||
@@ -70,6 +81,13 @@ class ApplicationDenied extends Notification implements ShouldQueue
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
public function toDiscord($notifiable)
|
||||
{
|
||||
// SlackMessage is similar to DiscordMessage, so they're compatible
|
||||
return $this->toSlack($notifiable);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the array representation of the notification.
|
||||
*
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
namespace App\Notifications;
|
||||
|
||||
use App\Traits\DiscordRoutable;
|
||||
use Illuminate\Bus\Queueable;
|
||||
use Illuminate\Contracts\Queue\ShouldQueue;
|
||||
use Illuminate\Notifications\Messages\MailMessage;
|
||||
@@ -15,7 +16,7 @@ use App\Facades\Options;
|
||||
|
||||
class NewApplicant extends Notification implements ShouldQueue
|
||||
{
|
||||
use Queueable, Cancellable;
|
||||
use Queueable, Cancellable, DiscordRoutable;
|
||||
|
||||
|
||||
protected $application;
|
||||
@@ -26,7 +27,8 @@ class NewApplicant extends Notification implements ShouldQueue
|
||||
/**
|
||||
* Create a new notification instance.
|
||||
*
|
||||
* @return void
|
||||
* @param Application $application
|
||||
* @param Vacancy $vacancy
|
||||
*/
|
||||
public function __construct(Application $application, Vacancy $vacancy)
|
||||
{
|
||||
@@ -36,12 +38,7 @@ class NewApplicant extends Notification implements ShouldQueue
|
||||
|
||||
public function channels()
|
||||
{
|
||||
if (Options::getOption('enable_slack_notifications') == 1)
|
||||
{
|
||||
return ['slack'];
|
||||
}
|
||||
|
||||
return [];
|
||||
$this->chooseChannelsViaOptions();
|
||||
}
|
||||
|
||||
public function optOut($notifiable)
|
||||
@@ -90,6 +87,12 @@ class NewApplicant extends Notification implements ShouldQueue
|
||||
->action('Review application', $url);
|
||||
});
|
||||
}
|
||||
|
||||
public function toDiscord($notifiable)
|
||||
{
|
||||
return $this->toSlack($notifiable);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the array representation of the notification.
|
||||
*
|
||||
|
||||
@@ -21,7 +21,8 @@ class NewComment extends Notification implements ShouldQueue
|
||||
/**
|
||||
* Create a new notification instance.
|
||||
*
|
||||
* @return void
|
||||
* @param Comment $comment
|
||||
* @param Application $application
|
||||
*/
|
||||
public function __construct(Comment $comment, Application $application)
|
||||
{
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
namespace App\Notifications;
|
||||
|
||||
use App\Traits\DiscordRoutable;
|
||||
use Illuminate\Bus\Queueable;
|
||||
use Illuminate\Contracts\Queue\ShouldQueue;
|
||||
use Illuminate\Notifications\Messages\MailMessage;
|
||||
@@ -15,7 +16,7 @@ use App\Facades\Options;
|
||||
|
||||
class NewUser extends Notification implements ShouldQueue
|
||||
{
|
||||
use Queueable, Cancellable;
|
||||
use Queueable, Cancellable, DiscordRoutable;
|
||||
|
||||
public $user;
|
||||
|
||||
@@ -83,6 +84,11 @@ class NewUser extends Notification implements ShouldQueue
|
||||
});
|
||||
}
|
||||
|
||||
public function toDiscord($notifiable)
|
||||
{
|
||||
return $this->toSlack($notifiable);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the array representation of the notification.
|
||||
*
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
namespace App\Observers;
|
||||
|
||||
use App\Application;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
|
||||
class ApplicationObserver
|
||||
{
|
||||
@@ -55,7 +56,7 @@ class ApplicationObserver
|
||||
}
|
||||
}
|
||||
|
||||
// application can now be deleted
|
||||
// application can now be deleted
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -8,6 +8,12 @@ use Illuminate\Support\Facades\Log;
|
||||
|
||||
class UserObserver
|
||||
{
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
Log::debug('User observer has been initialised and ready for use!');
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle the user "created" event.
|
||||
*
|
||||
@@ -39,20 +45,28 @@ class UserObserver
|
||||
|
||||
public function deleting(User $user)
|
||||
{
|
||||
$user->profile()->delete();
|
||||
Log::debug('Referential integrity cleanup: Deleted profile!');
|
||||
$applications = $user->applications;
|
||||
|
||||
if (!$applications->isEmpty())
|
||||
if ($user->isForceDeleting())
|
||||
{
|
||||
Log::debug('RIC: Now trying to delete applications and responses...');
|
||||
foreach($applications as $application)
|
||||
$user->profile->delete();
|
||||
Log::debug('Referential integrity cleanup: Deleted profile!');
|
||||
$applications = $user->applications;
|
||||
|
||||
if (!$applications->isEmpty())
|
||||
{
|
||||
// code moved to Application observer, where it gets rid of attached elements individually
|
||||
Log::debug('RIC: Deleting application ' . $application->id);
|
||||
$application->delete();
|
||||
|
||||
Log::debug('RIC: Now trying to delete applications and responses...');
|
||||
foreach($applications as $application)
|
||||
{
|
||||
// code moved to Application observer, where it gets rid of attached elements individually
|
||||
Log::debug('RIC: Deleting application ' . $application->id);
|
||||
$application->delete();
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
Log::debug('RIC: Not cleaning up soft deleted models!');
|
||||
}
|
||||
|
||||
Log::debug('RIC: Cleanup done!');
|
||||
@@ -66,7 +80,6 @@ class UserObserver
|
||||
*/
|
||||
public function deleted(User $user)
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -88,6 +101,8 @@ class UserObserver
|
||||
*/
|
||||
public function forceDeleted(User $user)
|
||||
{
|
||||
//
|
||||
Log::info('Model has been force deleted', [
|
||||
'modelID' => $user->id
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,6 +8,7 @@ class Options extends Model
|
||||
{
|
||||
public $fillable = [
|
||||
'option_name',
|
||||
'option_value'
|
||||
'option_value',
|
||||
'friendly_name'
|
||||
];
|
||||
}
|
||||
|
||||
@@ -38,18 +38,19 @@ class BanPolicy
|
||||
/**
|
||||
* Determine whether the user can create models.
|
||||
*
|
||||
* @param \App\User $user
|
||||
* @param \App\User $user
|
||||
* @param User $targetUser
|
||||
* @return mixed
|
||||
*/
|
||||
public function create(User $user)
|
||||
public function create(User $user, User $targetUser)
|
||||
{
|
||||
Log::debug("Authorization check started", [
|
||||
'requiredRoles' => 'admin',
|
||||
'currentRoles' => $user->roles(),
|
||||
'hasRequiredRole' => $user->hasRole('admin'),
|
||||
'targetUser' => $targetUser->username,
|
||||
'isCurrentUser' => Auth::user()->is($user)
|
||||
]);
|
||||
return $user->hasRole('admin') && Auth::user()->isNot($user);
|
||||
return $user->hasRole('admin') && $user->isNot($targetUser);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -2,10 +2,15 @@
|
||||
|
||||
namespace App\Providers;
|
||||
|
||||
use App\Application;
|
||||
use App\Observers\ApplicationObserver;
|
||||
use App\Observers\UserObserver;
|
||||
use App\User;
|
||||
|
||||
use Illuminate\Pagination\Paginator;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
use Illuminate\Support\ServiceProvider;
|
||||
|
||||
use Sentry;
|
||||
|
||||
class AppServiceProvider extends ServiceProvider
|
||||
@@ -32,7 +37,12 @@ class AppServiceProvider extends ServiceProvider
|
||||
]);
|
||||
|
||||
Schema::defaultStringLength(191);
|
||||
|
||||
// Keep using Bootstrap; Laravel 8 has the paginator use Tailwind. Quite opinionated tbh
|
||||
Paginator::useBootstrap();
|
||||
|
||||
User::observe(UserObserver::class);
|
||||
Application::observe(ApplicationObserver::class);
|
||||
|
||||
$this->app['request']->server->set('HTTPS', $this->app->environment() != 'local');
|
||||
}
|
||||
|
||||
@@ -2,7 +2,11 @@
|
||||
|
||||
namespace App\Providers;
|
||||
|
||||
use App\Listeners\LogAuthenticationFailure;
|
||||
use App\Listeners\LogAuthenticationSuccess;
|
||||
use App\Listeners\OnUserRegistration;
|
||||
use Illuminate\Auth\Events\Failed;
|
||||
use Illuminate\Auth\Events\Login;
|
||||
use Illuminate\Auth\Events\Registered;
|
||||
use Illuminate\Auth\Listeners\SendEmailVerificationNotification;
|
||||
use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider;
|
||||
@@ -20,6 +24,12 @@ class EventServiceProvider extends ServiceProvider
|
||||
SendEmailVerificationNotification::class,
|
||||
OnUserRegistration::class
|
||||
],
|
||||
Failed::class => [
|
||||
LogAuthenticationFailure::class
|
||||
],
|
||||
Login::class => [
|
||||
LogAuthenticationSuccess::class
|
||||
],
|
||||
'App\Events\ApplicationApprovedEvent' => [
|
||||
'App\Listeners\PromoteUser'
|
||||
],
|
||||
|
||||
@@ -7,14 +7,6 @@ use Illuminate\Support\Facades\Route;
|
||||
|
||||
class RouteServiceProvider extends ServiceProvider
|
||||
{
|
||||
/**
|
||||
* This namespace is applied to your controller routes.
|
||||
*
|
||||
* In addition, it is set as the URL generator's root namespace.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $namespace = 'App\Http\Controllers';
|
||||
|
||||
/**
|
||||
* The path to the "home" route for your application.
|
||||
@@ -59,7 +51,6 @@ class RouteServiceProvider extends ServiceProvider
|
||||
protected function mapWebRoutes()
|
||||
{
|
||||
Route::middleware('web')
|
||||
->namespace($this->namespace)
|
||||
->group(base_path('routes/web.php'));
|
||||
}
|
||||
|
||||
|
||||
35
app/Services/VacancyApplicationService.php
Normal file
35
app/Services/VacancyApplicationService.php
Normal file
@@ -0,0 +1,35 @@
|
||||
<?php
|
||||
|
||||
namespace App\Services;
|
||||
|
||||
use App\Vacancy;
|
||||
use App\Application;
|
||||
|
||||
class VacancyApplicationService
|
||||
{
|
||||
|
||||
/**
|
||||
* Finds all applications associated with $model.
|
||||
*
|
||||
* @param Vacancy $model The model you want to search through.
|
||||
* @return Illuminate\Support\Collection A collection of applications
|
||||
*/
|
||||
public function findApplications(Vacancy $model)
|
||||
{
|
||||
|
||||
$applications = collect([]);
|
||||
|
||||
foreach(Application::all() as $application)
|
||||
{
|
||||
if ($application->response->vacancy->id == $model->id)
|
||||
{
|
||||
$applications->push($application);
|
||||
}
|
||||
}
|
||||
|
||||
return $applications;
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
22
app/Team.php
Normal file
22
app/Team.php
Normal file
@@ -0,0 +1,22 @@
|
||||
<?php
|
||||
|
||||
namespace App;
|
||||
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Mpociot\Teamwork\TeamworkTeam;
|
||||
|
||||
class Team extends TeamworkTeam
|
||||
{
|
||||
public $fillable = [
|
||||
'owner_id',
|
||||
'name',
|
||||
'description',
|
||||
'openJoin'
|
||||
];
|
||||
|
||||
|
||||
public function vacancies()
|
||||
{
|
||||
return $this->belongsToMany('App\Vacancy', 'team_has_vacancy');
|
||||
}
|
||||
}
|
||||
@@ -9,6 +9,8 @@ use App\Facades\Options;
|
||||
trait Cancellable
|
||||
{
|
||||
|
||||
// This method is only used if you want this default set of channels;
|
||||
// Other channels can always be configured by overloading the channels method here.
|
||||
public function chooseChannelsViaOptions()
|
||||
{
|
||||
$channels = [];
|
||||
@@ -17,11 +19,17 @@ trait Cancellable
|
||||
{
|
||||
array_push($channels, 'slack');
|
||||
}
|
||||
elseif(Options::getOption('enable_email_notifications') == 1)
|
||||
|
||||
if (Options::getOption('enable_email_notifications') == 1)
|
||||
{
|
||||
array_push($channels, 'email');
|
||||
}
|
||||
|
||||
if (Options::getOption('enable_discord_notifications'))
|
||||
{
|
||||
array_push($channels, 'discord');
|
||||
}
|
||||
|
||||
return $channels;
|
||||
}
|
||||
|
||||
|
||||
15
app/Traits/DiscordRoutable.php
Normal file
15
app/Traits/DiscordRoutable.php
Normal file
@@ -0,0 +1,15 @@
|
||||
<?php
|
||||
|
||||
|
||||
namespace App\Traits;
|
||||
|
||||
|
||||
trait DiscordRoutable
|
||||
{
|
||||
|
||||
public function routeNotificationForDiscord()
|
||||
{
|
||||
return config('channels.notifications.discord.webhook_url');
|
||||
}
|
||||
|
||||
}
|
||||
51
app/Traits/HandlesAccountTokens.php
Normal file
51
app/Traits/HandlesAccountTokens.php
Normal file
@@ -0,0 +1,51 @@
|
||||
<?php
|
||||
|
||||
namespace App\Traits;
|
||||
|
||||
use Illuminate\Support\Facades\Hash;
|
||||
|
||||
trait HandlesAccountTokens
|
||||
{
|
||||
|
||||
|
||||
public function generateAccountTokens()
|
||||
{
|
||||
$deleteToken = bin2hex(openssl_random_pseudo_bytes(32));
|
||||
$cancelToken = bin2hex(openssl_random_pseudo_bytes(32));
|
||||
|
||||
$tokens = [
|
||||
|
||||
'delete' => Hash::make($deleteToken),
|
||||
'cancel' => Hash::make($cancelToken)
|
||||
|
||||
];
|
||||
|
||||
$this->account_tokens = json_encode($tokens);
|
||||
$this->save();
|
||||
|
||||
return [
|
||||
|
||||
'delete' => $deleteToken,
|
||||
'cancel' => $cancelToken
|
||||
];
|
||||
|
||||
}
|
||||
|
||||
public function verifyAccountToken(string $token, string $type): bool
|
||||
{
|
||||
$tokens = json_decode($this->account_tokens);
|
||||
|
||||
if ($type == 'deleteToken')
|
||||
{
|
||||
return Hash::check($token, $tokens->delete);
|
||||
}
|
||||
elseif ($type == 'cancelToken')
|
||||
{
|
||||
return Hash::check($token, $tokens->cancel);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
84
app/Traits/ReceivesAccountTokens.php
Normal file
84
app/Traits/ReceivesAccountTokens.php
Normal file
@@ -0,0 +1,84 @@
|
||||
<?php
|
||||
|
||||
namespace App\Traits;
|
||||
|
||||
use Illuminate\Support\Facades\Log;
|
||||
use Illuminate\Support\Facades\Mail;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
|
||||
use App\Http\Requests\UserDeleteRequest;
|
||||
use App\Mail\UserAccountDeleteConfirmation;
|
||||
use App\User;
|
||||
|
||||
|
||||
trait ReceivesAccountTokens
|
||||
{
|
||||
public function userDelete(UserDeleteRequest $request)
|
||||
{
|
||||
// a little verbose
|
||||
$user = User::find(Auth::user()->id);
|
||||
$tokens = $user->generateAccountTokens();
|
||||
|
||||
Mail::to($user)->send(new UserAccountDeleteConfirmation($user, $tokens, $request->ip()));
|
||||
|
||||
$user->delete();
|
||||
Auth::logout();
|
||||
|
||||
$request->session()->flash('success', 'Please check your email to finish deleting your account.');
|
||||
return redirect()->to('/');
|
||||
}
|
||||
|
||||
|
||||
public function processDeleteConfirmation(Request $request, $ID, $action, $token)
|
||||
{
|
||||
// We can't rely on Laravel's route model injection, because it'll ignore soft-deleted models,
|
||||
// so we have to use a special scope to find them ourselves.
|
||||
$user = User::withTrashed()->findOrFail($ID);
|
||||
$email = $user->email;
|
||||
|
||||
switch($action)
|
||||
{
|
||||
case 'confirm':
|
||||
|
||||
if ($user->verifyAccountToken($token, 'deleteToken'))
|
||||
{
|
||||
Log::info('SECURITY: User deleted account!', [
|
||||
|
||||
'confirmDeleteToken' => $token,
|
||||
'ipAddress' => $request->ip(),
|
||||
'email' => $user->email
|
||||
|
||||
]);
|
||||
|
||||
|
||||
|
||||
$user->forceDelete();
|
||||
|
||||
$request->session()->flash('success', 'Account permanently deleted. Thank you for using our service.');
|
||||
return redirect()->to('/');
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case 'cancel':
|
||||
|
||||
if ($user->verifyAccountToken($token, 'cancelToken'))
|
||||
{
|
||||
$user->restore();
|
||||
$request->session()->flash('success', 'Account deletion cancelled! You may now login.');
|
||||
|
||||
return redirect()->to(route('login'));
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
abort(404, 'The page you were trying to access may not exist or may be expired.');
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
14
app/User.php
14
app/User.php
@@ -2,16 +2,18 @@
|
||||
|
||||
namespace App;
|
||||
|
||||
use App\Traits\HandlesAccountTokens;
|
||||
use Illuminate\Contracts\Auth\MustVerifyEmail;
|
||||
use Illuminate\Database\Eloquent\SoftDeletes;
|
||||
use Illuminate\Foundation\Auth\User as Authenticatable;
|
||||
use Illuminate\Notifications\Notifiable;
|
||||
use Illuminate\Support\Facades\Hash;
|
||||
use Mpociot\Teamwork\Traits\UserHasTeams;
|
||||
use Spatie\Permission\Traits\HasRoles;
|
||||
|
||||
class User extends Authenticatable
|
||||
class User extends Authenticatable implements MustVerifyEmail
|
||||
{
|
||||
use Notifiable;
|
||||
use HasRoles;
|
||||
//use MustVerifyEmail;
|
||||
use UserHasTeams, Notifiable, HasRoles, SoftDeletes, HandlesAccountTokens;
|
||||
|
||||
/**
|
||||
* The attributes that are mass assignable.
|
||||
@@ -75,7 +77,6 @@ class User extends Authenticatable
|
||||
|
||||
|
||||
|
||||
|
||||
public function isStaffMember()
|
||||
{
|
||||
return $this->hasAnyRole('reviewer', 'admin', 'hiringManager');
|
||||
@@ -86,8 +87,7 @@ class User extends Authenticatable
|
||||
return !is_null($this->twofa_secret);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
public function routeNotificationForSlack($notification)
|
||||
{
|
||||
return config('slack.webhook.integrationURL');
|
||||
|
||||
@@ -5,12 +5,16 @@ namespace App;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
use Mpociot\Teamwork\Traits\UsedByTeams;
|
||||
|
||||
|
||||
use GrahamCampbell\Markdown\Facades\Markdown;
|
||||
|
||||
|
||||
class Vacancy extends Model
|
||||
{
|
||||
//use UsedByTeams;
|
||||
|
||||
public $fillable = [
|
||||
|
||||
'permissionGroupName',
|
||||
@@ -21,7 +25,8 @@ class Vacancy extends Model
|
||||
'vacancyFormID',
|
||||
'vacancyCount',
|
||||
'vacancyStatus',
|
||||
'vacancySlug'
|
||||
'vacancySlug',
|
||||
'team_id'
|
||||
|
||||
];
|
||||
|
||||
@@ -45,6 +50,12 @@ class Vacancy extends Model
|
||||
}
|
||||
|
||||
|
||||
public function teams()
|
||||
{
|
||||
return $this->belongsToMany('App\Team', 'team_has_vacancy');
|
||||
}
|
||||
|
||||
|
||||
public function forms()
|
||||
{
|
||||
return $this->belongsTo('App\Form', 'vacancyFormID', 'id');
|
||||
@@ -69,4 +80,32 @@ class Vacancy extends Model
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Check if the Modal is attached to the $checkingTeam Model
|
||||
*
|
||||
* @param Team $checkingTeam The mdoel you want to check against
|
||||
* @return boolean Whether the models are attached
|
||||
*/
|
||||
public function hasTeam(Team $checkingTeam): bool
|
||||
{
|
||||
$myTeams = $this->teams;
|
||||
|
||||
if (empty($myTeams))
|
||||
{
|
||||
// no associated teams
|
||||
return false;
|
||||
}
|
||||
|
||||
foreach($myTeams as $team)
|
||||
{
|
||||
if ($team->id === $checkingTeam->id)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -8,33 +8,35 @@
|
||||
],
|
||||
"license": "MIT",
|
||||
"require": {
|
||||
"php": "^7.2.5",
|
||||
"php": "^7.3.4",
|
||||
"ext-imagick": "*",
|
||||
"ext-json": "*",
|
||||
"arcanedev/log-viewer": "^7.0",
|
||||
"arcanedev/log-viewer": "^8.0",
|
||||
"awssat/discord-notification-channel": "^1.4",
|
||||
"doctrine/dbal": "^2.10",
|
||||
"fideloper/proxy": "^4.2",
|
||||
"fruitcake/laravel-cors": "^1.0",
|
||||
"geo-sot/laravel-env-editor": "^0.9.9",
|
||||
"graham-campbell/markdown": "^12.0",
|
||||
"guzzlehttp/guzzle": "^6.5",
|
||||
"graham-campbell/markdown": "^13.1",
|
||||
"guzzlehttp/guzzle": "^7.0.1",
|
||||
"jeroennoten/laravel-adminlte": "^3.2",
|
||||
"laravel/framework": "^7.0",
|
||||
"laravel/framework": "^8.0",
|
||||
"laravel/slack-notification-channel": "^2.0",
|
||||
"laravel/tinker": "^2.0",
|
||||
"laravel/ui": "^2.0",
|
||||
"laravel/ui": "^3.0",
|
||||
"mcamara/laravel-localization": "^1.5",
|
||||
"mpociot/teamwork": "^6.0",
|
||||
"pragmarx/google2fa-laravel": "^1.3",
|
||||
"sentry/sentry-laravel": "1.7.1",
|
||||
"sentry/sentry-laravel": "2.1.1",
|
||||
"spatie/laravel-permission": "^3.13"
|
||||
},
|
||||
"require-dev": {
|
||||
"barryvdh/laravel-debugbar": "^3.3",
|
||||
"facade/ignition": "^2.0",
|
||||
"facade/ignition": "^2.3.6",
|
||||
"fzaninotto/faker": "^1.9.1",
|
||||
"mockery/mockery": "^1.3.1",
|
||||
"nunomaduro/collision": "^4.1",
|
||||
"phpunit/phpunit": "^8.5"
|
||||
"nunomaduro/collision": "^5.0",
|
||||
"phpunit/phpunit": "^9.0"
|
||||
},
|
||||
"config": {
|
||||
"optimize-autoloader": true,
|
||||
@@ -48,12 +50,10 @@
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"App\\": "app/"
|
||||
},
|
||||
"classmap": [
|
||||
"database/seeds",
|
||||
"database/factories"
|
||||
]
|
||||
"App\\": "app/",
|
||||
"Database\\Factories\\": "database/factories/",
|
||||
"Database\\Seeders\\": "database/seeders/"
|
||||
}
|
||||
},
|
||||
"autoload-dev": {
|
||||
"psr-4": {
|
||||
|
||||
2424
composer.lock
generated
2424
composer.lock
generated
File diff suppressed because it is too large
Load Diff
@@ -209,74 +209,76 @@ return [
|
||||
|
||||
'menu' => [
|
||||
[
|
||||
'text' => 'Home',
|
||||
'text' => 'm_home',
|
||||
'icon' => 'fas fa-home',
|
||||
'url' => 'dashboard'
|
||||
],
|
||||
[
|
||||
'text' => 'Directory',
|
||||
'text' => 'm_directory',
|
||||
'icon' => 'fas fa-users',
|
||||
'url' => 'users/directory',
|
||||
'can' => 'profiles.view.others'
|
||||
],
|
||||
[
|
||||
'header' => 'Applications',
|
||||
'header' => 'h_applications',
|
||||
'can' => 'applications.view.own'
|
||||
],
|
||||
[
|
||||
'text' => 'My Applications',
|
||||
'text' => 'm_my_applications',
|
||||
'icon' => 'fas fa-fw fa-list-ul',
|
||||
'can' => 'applications.view.own',
|
||||
'submenu' => [
|
||||
[
|
||||
'text' => 'Current Applications',
|
||||
'text' => 'm_curr_applications',
|
||||
'icon' => 'fas fa-fw fa-check-double',
|
||||
'url' => '/applications/my-applications'
|
||||
]
|
||||
],
|
||||
|
||||
],
|
||||
'My Profile',
|
||||
[
|
||||
'text' => 'Profile Settings',
|
||||
'header' => 'h_my_profile',
|
||||
],
|
||||
[
|
||||
'text' => 'm_profile_settings',
|
||||
'url' => '/profile/settings',
|
||||
'icon' => 'fas fa-fw fa-cog'
|
||||
],
|
||||
[
|
||||
'text' => 'My Account Settings',
|
||||
'text' => 'm_account_settings',
|
||||
'icon' => 'fas fa-user-circle',
|
||||
'url' => '/profile/settings/account'
|
||||
],
|
||||
[
|
||||
'header' => 'Application Management',
|
||||
'header' => 'h_app_management',
|
||||
'can' => ['applications.view.all', 'applications.vote']
|
||||
],
|
||||
[
|
||||
'text' => 'All applications',
|
||||
'text' => 'm_all_apps',
|
||||
'url' => 'applications/staff/all',
|
||||
'icon' => 'fas fa-list-ol',
|
||||
'can' => 'applications.view.all'
|
||||
],
|
||||
[
|
||||
'text' => 'Outstanding Applications',
|
||||
'text' => 'm_outstanding_apps',
|
||||
'url' => '/applications/staff/outstanding',
|
||||
'icon' => 'far fa-folder-open',
|
||||
'can' => 'applications.view.all'
|
||||
],
|
||||
[
|
||||
'text' => 'Interview Queue',
|
||||
'text' => 'm_interview_queue',
|
||||
'url' => '/applications/staff/pending-interview',
|
||||
'icon' => 'fas fa-fw fa-microphone-alt',
|
||||
'can' => 'applications.view.all'
|
||||
],
|
||||
[
|
||||
'text' => 'Peer Approval Queue',
|
||||
'text' => 'm_peer_approval',
|
||||
'url' => '/applications/staff/peer-review',
|
||||
'icon' => 'fas fa-fw fa-search',
|
||||
'can' => 'applications.view.all'
|
||||
],
|
||||
[
|
||||
'header' => 'Administration',
|
||||
'header' => 'h_admin',
|
||||
'can' => [ // may need to be modified
|
||||
'admin.hiring.*',
|
||||
'admin.userlist',
|
||||
@@ -286,38 +288,44 @@ return [
|
||||
]
|
||||
],
|
||||
[
|
||||
'text' => 'Staff Members',
|
||||
'text' => 'm_staff_m',
|
||||
'icon' => 'fas fa-fw fa-users',
|
||||
'url' => '/hr/staff-members',
|
||||
'can' => 'admin.stafflist'
|
||||
],
|
||||
[ // players who haven't been promoted yet
|
||||
'text' => 'Registered Players',
|
||||
'text' => 'm_reg_players',
|
||||
'icon' => 'fas fa-fw fa-user-friends',
|
||||
'url' => '/hr/players',
|
||||
'can' => 'admin.userlist'
|
||||
],
|
||||
[
|
||||
'text' => 'Hiring Management',
|
||||
'text' => 'm_teams',
|
||||
'icon' => 'fas fa-user-friends',
|
||||
'url' => 'teams',
|
||||
'can' => 'teams.view'
|
||||
],
|
||||
[
|
||||
'text' => 'sm_hiring_man',
|
||||
'icon' => 'far fa-calendar-plus',
|
||||
'can' => 'admin.hiring.*',
|
||||
'submenu' => [
|
||||
[
|
||||
'text' => 'Open Positions',
|
||||
'text' => 'm_open_pos',
|
||||
'icon' => 'fas fa-box-open',
|
||||
'url' => '/admin/positions'
|
||||
],
|
||||
[
|
||||
'text' => 'Forms',
|
||||
'text' => 'sm_forms',
|
||||
'icon' => 'fab fa-wpforms',
|
||||
'submenu' => [
|
||||
[
|
||||
'text' => 'All forms',
|
||||
'text' => 'sm_all_forms',
|
||||
'icon' => 'far fa-list-alt',
|
||||
'url' => '/admin/forms'
|
||||
],
|
||||
[
|
||||
'text' => 'Form Builder',
|
||||
'text' => 'm_form_builder',
|
||||
'icon' => 'fas fa-fw fa-hammer',
|
||||
'url' => '/admin/forms/builder'
|
||||
]
|
||||
@@ -326,18 +334,18 @@ return [
|
||||
]
|
||||
],
|
||||
[
|
||||
'text' => 'App Settings',
|
||||
'text' => 'sm_app_settings',
|
||||
'icon' => 'fas fa-fw fa-cog',
|
||||
'can' => 'admin.notificationsettings',
|
||||
'submenu' => [
|
||||
[
|
||||
'text' => 'Global Application Settings',
|
||||
'text' => 'm_global_app_s',
|
||||
'icon' => 'fas fa-cogs',
|
||||
'url' => '/admin/settings',
|
||||
'can' => 'admin.settings.view'
|
||||
],
|
||||
[
|
||||
'text' => 'Developer Tools',
|
||||
'text' => 'm_devtools',
|
||||
'icon' => 'fas fa-code',
|
||||
'url' => '/admin/devtools',
|
||||
'can' => 'admin.developertools.use'
|
||||
@@ -345,7 +353,7 @@ return [
|
||||
]
|
||||
],
|
||||
[
|
||||
'text' => 'System Logs',
|
||||
'text' => 'm_s_logs',
|
||||
'url' => '/admin/maintenance/system-logs',
|
||||
'icon' => 'fas fa-clipboard-list',
|
||||
'can' => 'admin.maintenance.logs.view'
|
||||
@@ -527,6 +535,17 @@ return [
|
||||
]
|
||||
]
|
||||
],
|
||||
[
|
||||
'name' => 'CheckboxValues',
|
||||
'active' => true,
|
||||
'files' => [
|
||||
[
|
||||
'type' => 'js',
|
||||
'asset' => false,
|
||||
'location' => '/js/switches.js'
|
||||
]
|
||||
]
|
||||
],
|
||||
[
|
||||
'name' => 'AuthCustomisations',
|
||||
'active' => true,
|
||||
@@ -537,6 +556,38 @@ return [
|
||||
'location' => '/css/authpages.css'
|
||||
]
|
||||
]
|
||||
]
|
||||
],
|
||||
[
|
||||
'name' => 'BootstrapToggleButton',
|
||||
'active' => true,
|
||||
'files' => [
|
||||
[
|
||||
'type' => 'css',
|
||||
'asset' => false,
|
||||
'location' => 'https://gitcdn.github.io/bootstrap-toggle/2.2.2/css/bootstrap-toggle.min.css'
|
||||
],
|
||||
[
|
||||
'type' => 'js',
|
||||
'asset' => false,
|
||||
'location' => 'https://gitcdn.github.io/bootstrap-toggle/2.2.2/js/bootstrap-toggle.min.js'
|
||||
]
|
||||
]
|
||||
],
|
||||
[
|
||||
'name' => 'BootstrapMultiselectDropdown',
|
||||
'active' => true,
|
||||
'files' => [
|
||||
[
|
||||
'type' => 'js',
|
||||
'asset' => 'false',
|
||||
'location' => 'https://cdnjs.cloudflare.com/ajax/libs/bootstrap-multiselect/0.9.15/js/bootstrap-multiselect.min.js'
|
||||
],
|
||||
[
|
||||
'type' => 'css',
|
||||
'asset' => false,
|
||||
'location' => 'https://cdnjs.cloudflare.com/ajax/libs/bootstrap-multiselect/0.9.15/css/bootstrap-multiselect.css'
|
||||
]
|
||||
]
|
||||
]
|
||||
],
|
||||
];
|
||||
|
||||
17
config/channels.php
Normal file
17
config/channels.php
Normal file
@@ -0,0 +1,17 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
|
||||
'notifications' => [
|
||||
|
||||
'discord' => [
|
||||
'webhook_url' => env('DISCORD_INTEGRATION_WEBHOOK')
|
||||
],
|
||||
|
||||
'slack' => [
|
||||
'webhook_url' => env('SLACK_INTEGRATION_WEBHOOK')
|
||||
]
|
||||
|
||||
]
|
||||
|
||||
];
|
||||
@@ -81,7 +81,7 @@ return [
|
||||
*/
|
||||
|
||||
'failed' => [
|
||||
'driver' => env('QUEUE_FAILED_DRIVER', 'database'),
|
||||
'driver' => env('QUEUE_FAILED_DRIVER', 'database-uuids'),
|
||||
'database' => env('DB_CONNECTION', 'mysql'),
|
||||
'table' => 'failed_jobs',
|
||||
],
|
||||
|
||||
84
config/teamwork.php
Normal file
84
config/teamwork.php
Normal file
@@ -0,0 +1,84 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Auth Model
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| This is the Auth model used by Teamwork.
|
||||
|
|
||||
*/
|
||||
'user_model' => config('auth.providers.users.model', App\User::class),
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Teamwork users Table
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| This is the users table name used by Teamwork.
|
||||
|
|
||||
*/
|
||||
'users_table' => 'users',
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Teamwork Team Model
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| This is the Team model used by Teamwork to create correct relations. Update
|
||||
| the team if it is in a different namespace.
|
||||
|
|
||||
*/
|
||||
'team_model' => Mpociot\Teamwork\TeamworkTeam::class,
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Teamwork teams Table
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| This is the teams table name used by Teamwork to save teams to the database.
|
||||
|
|
||||
*/
|
||||
'teams_table' => 'teams',
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Teamwork team_user Table
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| This is the team_user table used by Teamwork to save assigned teams to the
|
||||
| database.
|
||||
|
|
||||
*/
|
||||
'team_user_table' => 'team_user',
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| User Foreign key on Teamwork's team_user Table (Pivot)
|
||||
|--------------------------------------------------------------------------
|
||||
*/
|
||||
'user_foreign_key' => 'id',
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Teamwork Team Invite Model
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| This is the Team Invite model used by Teamwork to create correct relations.
|
||||
| Update the team if it is in a different namespace.
|
||||
|
|
||||
*/
|
||||
'invite_model' => Mpociot\Teamwork\TeamInvite::class,
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Teamwork team invites Table
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| This is the team invites table name used by Teamwork to save sent/pending
|
||||
| invitation into teams to the database.
|
||||
|
|
||||
*/
|
||||
'team_invites_table' => 'team_invites',
|
||||
];
|
||||
@@ -1,5 +1,5 @@
|
||||
files:
|
||||
- source: /**/lang/en/*.php
|
||||
- source: /**/lang/**/en/*.php
|
||||
ignore:
|
||||
- /**/lang/en/*2.php
|
||||
translation: /**/lang/%two_letters_code%/%original_file_name%
|
||||
translation: /**/lang/**/%two_letters_code%/%original_file_name%
|
||||
|
||||
@@ -0,0 +1,83 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
|
||||
class TeamworkSetupTables extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function up()
|
||||
{
|
||||
Schema::table(\Config::get('teamwork.users_table'), function (Blueprint $table) {
|
||||
$table->integer('current_team_id')->unsigned()->nullable();
|
||||
});
|
||||
|
||||
Schema::create(\Config::get('teamwork.teams_table'), function (Blueprint $table) {
|
||||
$table->increments('id')->unsigned();
|
||||
$table->integer('owner_id')->unsigned()->nullable();
|
||||
$table->string('name');
|
||||
$table->timestamps();
|
||||
});
|
||||
|
||||
Schema::create(\Config::get('teamwork.team_user_table'), function (Blueprint $table) {
|
||||
$table->bigInteger('user_id')->unsigned();
|
||||
$table->integer('team_id')->unsigned();
|
||||
$table->timestamps();
|
||||
|
||||
$table->foreign('user_id')
|
||||
->references(\Config::get('teamwork.user_foreign_key'))
|
||||
->on(\Config::get('teamwork.users_table'))
|
||||
->onUpdate('cascade')
|
||||
->onDelete('cascade');
|
||||
|
||||
$table->foreign('team_id')
|
||||
->references('id')
|
||||
->on(\Config::get('teamwork.teams_table'))
|
||||
->onDelete('cascade');
|
||||
});
|
||||
|
||||
Schema::create(\Config::get('teamwork.team_invites_table'), function (Blueprint $table) {
|
||||
$table->increments('id');
|
||||
$table->bigInteger('user_id')->unsigned();
|
||||
$table->integer('team_id')->unsigned();
|
||||
$table->enum('type', ['invite', 'request']);
|
||||
$table->string('email');
|
||||
$table->string('accept_token');
|
||||
$table->string('deny_token');
|
||||
$table->timestamps();
|
||||
$table->foreign('team_id')
|
||||
->references('id')
|
||||
->on(\Config::get('teamwork.teams_table'))
|
||||
->onDelete('cascade');
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function down()
|
||||
{
|
||||
Schema::table(\Config::get('teamwork.users_table'), function (Blueprint $table) {
|
||||
$table->dropColumn('current_team_id');
|
||||
});
|
||||
|
||||
Schema::table(\Config::get('teamwork.team_user_table'), function (Blueprint $table) {
|
||||
if (DB::getDriverName() !== 'sqlite') {
|
||||
$table->dropForeign(\Config::get('teamwork.team_user_table').'_user_id_foreign');
|
||||
}
|
||||
if (DB::getDriverName() !== 'sqlite') {
|
||||
$table->dropForeign(\Config::get('teamwork.team_user_table').'_team_id_foreign');
|
||||
}
|
||||
});
|
||||
|
||||
Schema::drop(\Config::get('teamwork.team_user_table'));
|
||||
Schema::drop(\Config::get('teamwork.team_invites_table'));
|
||||
Schema::drop(\Config::get('teamwork.teams_table'));
|
||||
}
|
||||
}
|
||||
40
database/migrations/2020_10_02_112730_add_team_details.php
Normal file
40
database/migrations/2020_10_02_112730_add_team_details.php
Normal file
@@ -0,0 +1,40 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
class AddTeamDetails extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function up()
|
||||
{
|
||||
Schema::table(config('teamwork.teams_table'), function(Blueprint $table){
|
||||
|
||||
$table->text('description')->after('name')->nullable();
|
||||
$table->enum('status', ['ACTIVE','SUSPENDED'])->after('description');
|
||||
$table->boolean('openJoin')->default(false)->after('status');
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function down()
|
||||
{
|
||||
Schema::table(config('teamwork.teams_table'), function(Blueprint $table){
|
||||
|
||||
$table->dropColumn('description');
|
||||
$table->dropColumn('status');
|
||||
$table->dropColumn('openJoin');
|
||||
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
class VacancyNullableTeamId extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function up()
|
||||
{
|
||||
Schema::table('vacancies', function(Blueprint $table){
|
||||
|
||||
$table->dropForeign('vacancies_ownerteamid_foreign');
|
||||
$table->dropColumn('ownerTeamID');
|
||||
$table->bigInteger('team_id')->nullable()->unsigned();
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function down()
|
||||
{
|
||||
Schema::table('vacancies', function(Blueprint $table){
|
||||
|
||||
$table->dropColumn('team_id');
|
||||
|
||||
});
|
||||
}
|
||||
}
|
||||
43
database/migrations/2020_10_04_163715_team_has_vacancy.php
Normal file
43
database/migrations/2020_10_04_163715_team_has_vacancy.php
Normal file
@@ -0,0 +1,43 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
class TeamHasVacancy extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function up()
|
||||
{
|
||||
Schema::create('team_has_vacancy', function(Blueprint $table){
|
||||
|
||||
$table->id();
|
||||
$table->integer('team_id')->unsigned();
|
||||
$table->bigInteger('vacancy_id')->unsigned();
|
||||
$table->timestamps();
|
||||
|
||||
$table->foreign('team_id')
|
||||
->references('id')
|
||||
->on(config('teamwork.teams_table'));
|
||||
|
||||
$table->foreign('vacancy_id')
|
||||
->references('id')
|
||||
->on('vacancies');
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function down()
|
||||
{
|
||||
//
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
class AddAccountTokensToUser extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function up()
|
||||
{
|
||||
Schema::table('users', function (Blueprint $table) {
|
||||
$table->string('account_tokens')->after('password')->nullable();
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function down()
|
||||
{
|
||||
Schema::table('users', function (Blueprint $table) {
|
||||
$table->dropColumn('account_tokens');
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
class AddSoftDeletesToUsers extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function up()
|
||||
{
|
||||
Schema::table('users', function (Blueprint $table) {
|
||||
$table->softDeletes()->after('account_tokens');
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function down()
|
||||
{
|
||||
Schema::table('users', function (Blueprint $table) {
|
||||
$table->dropSoftDeletes();
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
class AddUuidToFailedJobs extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function up()
|
||||
{
|
||||
Schema::table('failed_jobs', function (Blueprint $table) {
|
||||
$table->string('uuid')->after('id')->nullable()->unique();
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function down()
|
||||
{
|
||||
Schema::table('failed_jobs', function (Blueprint $table) {
|
||||
$table->dropColumn('uuid');
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,5 @@
|
||||
<?php
|
||||
namespace Database\Seeders;
|
||||
|
||||
use Illuminate\Database\Seeder;
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
<?php
|
||||
namespace Database\Seeders;
|
||||
|
||||
use App\Facades\Options;
|
||||
use Illuminate\Database\Seeder;
|
||||
@@ -22,6 +23,7 @@ class DefaultOptionsSeeder extends Seeder
|
||||
|
||||
Options::setOption('enable_slack_notifications', true, 'Enable slack notifications');
|
||||
Options::setOption('enable_email_notifications', true, 'Enable e-mail notifications');
|
||||
Options::setOption('enable_discord_notifications', true, 'Enable discord notifications');
|
||||
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,5 @@
|
||||
<?php
|
||||
namespace Database\Seeders;
|
||||
|
||||
use Illuminate\Database\Seeder;
|
||||
use Spatie\Permission\Models\Permission;
|
||||
@@ -1,5 +1,7 @@
|
||||
<?php
|
||||
|
||||
namespace Database\Seeders;
|
||||
|
||||
use Illuminate\Database\Seeder;
|
||||
use Spatie\Permission\Models\Permission;
|
||||
use Spatie\Permission\Models\Role;
|
||||
65
database/seeders/TeamSeeder.php
Normal file
65
database/seeders/TeamSeeder.php
Normal file
@@ -0,0 +1,65 @@
|
||||
<?php
|
||||
namespace Database\Seeders;
|
||||
|
||||
use Illuminate\Database\Seeder;
|
||||
use Spatie\Permission\Models\Permission;
|
||||
|
||||
class TeamSeeder extends Seeder
|
||||
{
|
||||
/**
|
||||
* Run the database seeds.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function run()
|
||||
{
|
||||
|
||||
Permission::create([
|
||||
'name' => 'teams.user.view.own'
|
||||
]);
|
||||
|
||||
Permission::create([
|
||||
'name' => 'teams.admin.view.all'
|
||||
]);
|
||||
|
||||
// Has access to the teams feature
|
||||
Permission::create([
|
||||
'name' => 'teams.view'
|
||||
]);
|
||||
|
||||
Permission::create([
|
||||
'name' => 'teams.admin.create',
|
||||
]);
|
||||
Permission::create([
|
||||
'name' => 'teams.admin.delete',
|
||||
]);
|
||||
Permission::create([
|
||||
'name' => 'teams.user.join',
|
||||
]);
|
||||
Permission::create([
|
||||
'name' => 'teams.user.leave',
|
||||
]);
|
||||
Permission::create([
|
||||
'name' => 'teams.admin.vacancies.assign',
|
||||
]);
|
||||
Permission::create([
|
||||
'name' => 'teams.admin.vacancies.unassign',
|
||||
]);
|
||||
Permission::create([
|
||||
'name' => 'teams.admin.applications.changeteam',
|
||||
]);
|
||||
Permission::create([
|
||||
'name' => 'teams.members.appointment.schedule',
|
||||
]);
|
||||
Permission::create([
|
||||
'name' => 'teams.members.appointment.deleteappointment',
|
||||
]);
|
||||
Permission::create([
|
||||
'name' => 'teams.members.groupchat',
|
||||
]);
|
||||
|
||||
Permission::create([
|
||||
'name' => 'chat.use',
|
||||
]);
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,5 @@
|
||||
<?php
|
||||
namespace Database\Seeders;
|
||||
|
||||
use App\Profile;
|
||||
use App\User;
|
||||
3503
package-lock.json
generated
3503
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"postinstall": "npm run prod",
|
||||
"postinstall": "npm run prod",
|
||||
"dev": "npm run development",
|
||||
"development": "cross-env NODE_ENV=development node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js",
|
||||
"watch": "npm run development -- --watch",
|
||||
|
||||
202
public/css/app.css
vendored
202
public/css/app.css
vendored
@@ -1,9 +1,9 @@
|
||||
@import url(https://fonts.googleapis.com/css?family=Nunito);@charset "UTF-8";
|
||||
|
||||
/*!
|
||||
* Bootstrap v4.4.1 (https://getbootstrap.com/)
|
||||
* Copyright 2011-2019 The Bootstrap Authors
|
||||
* Copyright 2011-2019 Twitter, Inc.
|
||||
* Bootstrap v4.5.0 (https://getbootstrap.com/)
|
||||
* Copyright 2011-2020 The Bootstrap Authors
|
||||
* Copyright 2011-2020 Twitter, Inc.
|
||||
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
||||
*/
|
||||
|
||||
@@ -202,6 +202,7 @@ pre {
|
||||
margin-top: 0;
|
||||
margin-bottom: 1rem;
|
||||
overflow: auto;
|
||||
-ms-overflow-style: scrollbar;
|
||||
}
|
||||
|
||||
figure {
|
||||
@@ -269,6 +270,10 @@ select {
|
||||
text-transform: none;
|
||||
}
|
||||
|
||||
[role=button] {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
select {
|
||||
word-wrap: normal;
|
||||
}
|
||||
@@ -301,13 +306,6 @@ input[type=checkbox] {
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
input[type=date],
|
||||
input[type=time],
|
||||
input[type=datetime-local],
|
||||
input[type=month] {
|
||||
-webkit-appearance: listbox;
|
||||
}
|
||||
|
||||
textarea {
|
||||
overflow: auto;
|
||||
resize: vertical;
|
||||
@@ -749,6 +747,7 @@ pre code {
|
||||
.col {
|
||||
flex-basis: 0;
|
||||
flex-grow: 1;
|
||||
min-width: 0;
|
||||
max-width: 100%;
|
||||
}
|
||||
|
||||
@@ -956,6 +955,7 @@ pre code {
|
||||
.col-sm {
|
||||
flex-basis: 0;
|
||||
flex-grow: 1;
|
||||
min-width: 0;
|
||||
max-width: 100%;
|
||||
}
|
||||
|
||||
@@ -1168,6 +1168,7 @@ pre code {
|
||||
.col-md {
|
||||
flex-basis: 0;
|
||||
flex-grow: 1;
|
||||
min-width: 0;
|
||||
max-width: 100%;
|
||||
}
|
||||
|
||||
@@ -1380,6 +1381,7 @@ pre code {
|
||||
.col-lg {
|
||||
flex-basis: 0;
|
||||
flex-grow: 1;
|
||||
min-width: 0;
|
||||
max-width: 100%;
|
||||
}
|
||||
|
||||
@@ -1592,6 +1594,7 @@ pre code {
|
||||
.col-xl {
|
||||
flex-basis: 0;
|
||||
flex-grow: 1;
|
||||
min-width: 0;
|
||||
max-width: 100%;
|
||||
}
|
||||
|
||||
@@ -2187,11 +2190,6 @@ pre code {
|
||||
box-shadow: 0 0 0 0.2rem rgba(52, 144, 220, 0.25);
|
||||
}
|
||||
|
||||
.form-control::-webkit-input-placeholder {
|
||||
color: #6c757d;
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
.form-control::-moz-placeholder {
|
||||
color: #6c757d;
|
||||
opacity: 1;
|
||||
@@ -2218,6 +2216,15 @@ pre code {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
input[type=date].form-control,
|
||||
input[type=time].form-control,
|
||||
input[type=datetime-local].form-control,
|
||||
input[type=month].form-control {
|
||||
-webkit-appearance: none;
|
||||
-moz-appearance: none;
|
||||
appearance: none;
|
||||
}
|
||||
|
||||
select.form-control:focus::-ms-value {
|
||||
color: #495057;
|
||||
background-color: #fff;
|
||||
@@ -2653,7 +2660,6 @@ textarea.form-control.is-invalid {
|
||||
color: #212529;
|
||||
text-align: center;
|
||||
vertical-align: middle;
|
||||
cursor: pointer;
|
||||
-webkit-user-select: none;
|
||||
-moz-user-select: none;
|
||||
-ms-user-select: none;
|
||||
@@ -2689,6 +2695,10 @@ textarea.form-control.is-invalid {
|
||||
opacity: 0.65;
|
||||
}
|
||||
|
||||
.btn:not(:disabled):not(.disabled) {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
a.btn.disabled,
|
||||
fieldset:disabled a.btn {
|
||||
pointer-events: none;
|
||||
@@ -3324,7 +3334,6 @@ fieldset:disabled a.btn {
|
||||
.btn-link:focus,
|
||||
.btn-link.focus {
|
||||
text-decoration: underline;
|
||||
box-shadow: none;
|
||||
}
|
||||
|
||||
.btn-link:disabled,
|
||||
@@ -3789,7 +3798,8 @@ input[type=button].btn-block {
|
||||
.input-group > .custom-select,
|
||||
.input-group > .custom-file {
|
||||
position: relative;
|
||||
flex: 1 1 0%;
|
||||
flex: 1 1 auto;
|
||||
width: 1%;
|
||||
min-width: 0;
|
||||
margin-bottom: 0;
|
||||
}
|
||||
@@ -4889,7 +4899,7 @@ input[type=button].btn-block {
|
||||
}
|
||||
|
||||
.navbar-light .navbar-toggler-icon {
|
||||
background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3e%3cpath stroke='rgba(0, 0, 0, 0.5)' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");
|
||||
background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%280, 0, 0, 0.5%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");
|
||||
}
|
||||
|
||||
.navbar-light .navbar-text {
|
||||
@@ -4940,7 +4950,7 @@ input[type=button].btn-block {
|
||||
}
|
||||
|
||||
.navbar-dark .navbar-toggler-icon {
|
||||
background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3e%3cpath stroke='rgba(255, 255, 255, 0.5)' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");
|
||||
background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.5%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");
|
||||
}
|
||||
|
||||
.navbar-dark .navbar-text {
|
||||
@@ -4973,14 +4983,21 @@ input[type=button].btn-block {
|
||||
margin-left: 0;
|
||||
}
|
||||
|
||||
.card > .list-group:first-child .list-group-item:first-child {
|
||||
border-top-left-radius: 0.25rem;
|
||||
border-top-right-radius: 0.25rem;
|
||||
.card > .list-group {
|
||||
border-top: inherit;
|
||||
border-bottom: inherit;
|
||||
}
|
||||
|
||||
.card > .list-group:last-child .list-group-item:last-child {
|
||||
border-bottom-right-radius: 0.25rem;
|
||||
border-bottom-left-radius: 0.25rem;
|
||||
.card > .list-group:first-child {
|
||||
border-top-width: 0;
|
||||
border-top-left-radius: calc(0.25rem - 1px);
|
||||
border-top-right-radius: calc(0.25rem - 1px);
|
||||
}
|
||||
|
||||
.card > .list-group:last-child {
|
||||
border-bottom-width: 0;
|
||||
border-bottom-right-radius: calc(0.25rem - 1px);
|
||||
border-bottom-left-radius: calc(0.25rem - 1px);
|
||||
}
|
||||
|
||||
.card-body {
|
||||
@@ -5196,6 +5213,10 @@ input[type=button].btn-block {
|
||||
border-radius: 0.25rem;
|
||||
}
|
||||
|
||||
.breadcrumb-item {
|
||||
display: flex;
|
||||
}
|
||||
|
||||
.breadcrumb-item + .breadcrumb-item {
|
||||
padding-left: 0.5rem;
|
||||
}
|
||||
@@ -5667,6 +5688,7 @@ a.badge-dark.focus {
|
||||
display: flex;
|
||||
height: 1rem;
|
||||
overflow: hidden;
|
||||
line-height: 0;
|
||||
font-size: 0.675rem;
|
||||
background-color: #e9ecef;
|
||||
border-radius: 0.25rem;
|
||||
@@ -5721,6 +5743,7 @@ a.badge-dark.focus {
|
||||
flex-direction: column;
|
||||
padding-left: 0;
|
||||
margin-bottom: 0;
|
||||
border-radius: 0.25rem;
|
||||
}
|
||||
|
||||
.list-group-item-action {
|
||||
@@ -5751,13 +5774,13 @@ a.badge-dark.focus {
|
||||
}
|
||||
|
||||
.list-group-item:first-child {
|
||||
border-top-left-radius: 0.25rem;
|
||||
border-top-right-radius: 0.25rem;
|
||||
border-top-left-radius: inherit;
|
||||
border-top-right-radius: inherit;
|
||||
}
|
||||
|
||||
.list-group-item:last-child {
|
||||
border-bottom-right-radius: 0.25rem;
|
||||
border-bottom-left-radius: 0.25rem;
|
||||
border-bottom-right-radius: inherit;
|
||||
border-bottom-left-radius: inherit;
|
||||
}
|
||||
|
||||
.list-group-item.disabled,
|
||||
@@ -5787,26 +5810,26 @@ a.badge-dark.focus {
|
||||
flex-direction: row;
|
||||
}
|
||||
|
||||
.list-group-horizontal .list-group-item:first-child {
|
||||
.list-group-horizontal > .list-group-item:first-child {
|
||||
border-bottom-left-radius: 0.25rem;
|
||||
border-top-right-radius: 0;
|
||||
}
|
||||
|
||||
.list-group-horizontal .list-group-item:last-child {
|
||||
.list-group-horizontal > .list-group-item:last-child {
|
||||
border-top-right-radius: 0.25rem;
|
||||
border-bottom-left-radius: 0;
|
||||
}
|
||||
|
||||
.list-group-horizontal .list-group-item.active {
|
||||
.list-group-horizontal > .list-group-item.active {
|
||||
margin-top: 0;
|
||||
}
|
||||
|
||||
.list-group-horizontal .list-group-item + .list-group-item {
|
||||
.list-group-horizontal > .list-group-item + .list-group-item {
|
||||
border-top-width: 1px;
|
||||
border-left-width: 0;
|
||||
}
|
||||
|
||||
.list-group-horizontal .list-group-item + .list-group-item.active {
|
||||
.list-group-horizontal > .list-group-item + .list-group-item.active {
|
||||
margin-left: -1px;
|
||||
border-left-width: 1px;
|
||||
}
|
||||
@@ -5816,26 +5839,26 @@ a.badge-dark.focus {
|
||||
flex-direction: row;
|
||||
}
|
||||
|
||||
.list-group-horizontal-sm .list-group-item:first-child {
|
||||
.list-group-horizontal-sm > .list-group-item:first-child {
|
||||
border-bottom-left-radius: 0.25rem;
|
||||
border-top-right-radius: 0;
|
||||
}
|
||||
|
||||
.list-group-horizontal-sm .list-group-item:last-child {
|
||||
.list-group-horizontal-sm > .list-group-item:last-child {
|
||||
border-top-right-radius: 0.25rem;
|
||||
border-bottom-left-radius: 0;
|
||||
}
|
||||
|
||||
.list-group-horizontal-sm .list-group-item.active {
|
||||
.list-group-horizontal-sm > .list-group-item.active {
|
||||
margin-top: 0;
|
||||
}
|
||||
|
||||
.list-group-horizontal-sm .list-group-item + .list-group-item {
|
||||
.list-group-horizontal-sm > .list-group-item + .list-group-item {
|
||||
border-top-width: 1px;
|
||||
border-left-width: 0;
|
||||
}
|
||||
|
||||
.list-group-horizontal-sm .list-group-item + .list-group-item.active {
|
||||
.list-group-horizontal-sm > .list-group-item + .list-group-item.active {
|
||||
margin-left: -1px;
|
||||
border-left-width: 1px;
|
||||
}
|
||||
@@ -5846,26 +5869,26 @@ a.badge-dark.focus {
|
||||
flex-direction: row;
|
||||
}
|
||||
|
||||
.list-group-horizontal-md .list-group-item:first-child {
|
||||
.list-group-horizontal-md > .list-group-item:first-child {
|
||||
border-bottom-left-radius: 0.25rem;
|
||||
border-top-right-radius: 0;
|
||||
}
|
||||
|
||||
.list-group-horizontal-md .list-group-item:last-child {
|
||||
.list-group-horizontal-md > .list-group-item:last-child {
|
||||
border-top-right-radius: 0.25rem;
|
||||
border-bottom-left-radius: 0;
|
||||
}
|
||||
|
||||
.list-group-horizontal-md .list-group-item.active {
|
||||
.list-group-horizontal-md > .list-group-item.active {
|
||||
margin-top: 0;
|
||||
}
|
||||
|
||||
.list-group-horizontal-md .list-group-item + .list-group-item {
|
||||
.list-group-horizontal-md > .list-group-item + .list-group-item {
|
||||
border-top-width: 1px;
|
||||
border-left-width: 0;
|
||||
}
|
||||
|
||||
.list-group-horizontal-md .list-group-item + .list-group-item.active {
|
||||
.list-group-horizontal-md > .list-group-item + .list-group-item.active {
|
||||
margin-left: -1px;
|
||||
border-left-width: 1px;
|
||||
}
|
||||
@@ -5876,26 +5899,26 @@ a.badge-dark.focus {
|
||||
flex-direction: row;
|
||||
}
|
||||
|
||||
.list-group-horizontal-lg .list-group-item:first-child {
|
||||
.list-group-horizontal-lg > .list-group-item:first-child {
|
||||
border-bottom-left-radius: 0.25rem;
|
||||
border-top-right-radius: 0;
|
||||
}
|
||||
|
||||
.list-group-horizontal-lg .list-group-item:last-child {
|
||||
.list-group-horizontal-lg > .list-group-item:last-child {
|
||||
border-top-right-radius: 0.25rem;
|
||||
border-bottom-left-radius: 0;
|
||||
}
|
||||
|
||||
.list-group-horizontal-lg .list-group-item.active {
|
||||
.list-group-horizontal-lg > .list-group-item.active {
|
||||
margin-top: 0;
|
||||
}
|
||||
|
||||
.list-group-horizontal-lg .list-group-item + .list-group-item {
|
||||
.list-group-horizontal-lg > .list-group-item + .list-group-item {
|
||||
border-top-width: 1px;
|
||||
border-left-width: 0;
|
||||
}
|
||||
|
||||
.list-group-horizontal-lg .list-group-item + .list-group-item.active {
|
||||
.list-group-horizontal-lg > .list-group-item + .list-group-item.active {
|
||||
margin-left: -1px;
|
||||
border-left-width: 1px;
|
||||
}
|
||||
@@ -5906,42 +5929,40 @@ a.badge-dark.focus {
|
||||
flex-direction: row;
|
||||
}
|
||||
|
||||
.list-group-horizontal-xl .list-group-item:first-child {
|
||||
.list-group-horizontal-xl > .list-group-item:first-child {
|
||||
border-bottom-left-radius: 0.25rem;
|
||||
border-top-right-radius: 0;
|
||||
}
|
||||
|
||||
.list-group-horizontal-xl .list-group-item:last-child {
|
||||
.list-group-horizontal-xl > .list-group-item:last-child {
|
||||
border-top-right-radius: 0.25rem;
|
||||
border-bottom-left-radius: 0;
|
||||
}
|
||||
|
||||
.list-group-horizontal-xl .list-group-item.active {
|
||||
.list-group-horizontal-xl > .list-group-item.active {
|
||||
margin-top: 0;
|
||||
}
|
||||
|
||||
.list-group-horizontal-xl .list-group-item + .list-group-item {
|
||||
.list-group-horizontal-xl > .list-group-item + .list-group-item {
|
||||
border-top-width: 1px;
|
||||
border-left-width: 0;
|
||||
}
|
||||
|
||||
.list-group-horizontal-xl .list-group-item + .list-group-item.active {
|
||||
.list-group-horizontal-xl > .list-group-item + .list-group-item.active {
|
||||
margin-left: -1px;
|
||||
border-left-width: 1px;
|
||||
}
|
||||
}
|
||||
|
||||
.list-group-flush .list-group-item {
|
||||
border-right-width: 0;
|
||||
border-left-width: 0;
|
||||
.list-group-flush {
|
||||
border-radius: 0;
|
||||
}
|
||||
|
||||
.list-group-flush .list-group-item:first-child {
|
||||
border-top-width: 0;
|
||||
.list-group-flush > .list-group-item {
|
||||
border-width: 0 0 1px;
|
||||
}
|
||||
|
||||
.list-group-flush:last-child .list-group-item:last-child {
|
||||
.list-group-flush > .list-group-item:last-child {
|
||||
border-bottom-width: 0;
|
||||
}
|
||||
|
||||
@@ -6105,9 +6126,6 @@ button.close {
|
||||
padding: 0;
|
||||
background-color: transparent;
|
||||
border: 0;
|
||||
-webkit-appearance: none;
|
||||
-moz-appearance: none;
|
||||
appearance: none;
|
||||
}
|
||||
|
||||
a.close.disabled {
|
||||
@@ -6234,6 +6252,9 @@ a.close.disabled {
|
||||
.modal-dialog-centered::before {
|
||||
display: block;
|
||||
height: calc(100vh - 1rem);
|
||||
height: -webkit-min-content;
|
||||
height: -moz-min-content;
|
||||
height: min-content;
|
||||
content: "";
|
||||
}
|
||||
|
||||
@@ -6351,6 +6372,9 @@ a.close.disabled {
|
||||
|
||||
.modal-dialog-centered::before {
|
||||
height: calc(100vh - 3.5rem);
|
||||
height: -webkit-min-content;
|
||||
height: -moz-min-content;
|
||||
height: min-content;
|
||||
}
|
||||
|
||||
.modal-sm {
|
||||
@@ -6900,6 +6924,7 @@ a.close.disabled {
|
||||
|
||||
50% {
|
||||
opacity: 1;
|
||||
transform: none;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6910,6 +6935,7 @@ a.close.disabled {
|
||||
|
||||
50% {
|
||||
opacity: 1;
|
||||
transform: none;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8201,6 +8227,27 @@ button.bg-dark:focus {
|
||||
}
|
||||
}
|
||||
|
||||
.user-select-all {
|
||||
-webkit-user-select: all !important;
|
||||
-moz-user-select: all !important;
|
||||
-ms-user-select: all !important;
|
||||
user-select: all !important;
|
||||
}
|
||||
|
||||
.user-select-auto {
|
||||
-webkit-user-select: auto !important;
|
||||
-moz-user-select: auto !important;
|
||||
-ms-user-select: auto !important;
|
||||
user-select: auto !important;
|
||||
}
|
||||
|
||||
.user-select-none {
|
||||
-webkit-user-select: none !important;
|
||||
-moz-user-select: none !important;
|
||||
-ms-user-select: none !important;
|
||||
user-select: none !important;
|
||||
}
|
||||
|
||||
.overflow-auto {
|
||||
overflow: auto !important;
|
||||
}
|
||||
@@ -8357,18 +8404,6 @@ button.bg-dark:focus {
|
||||
height: 100vh !important;
|
||||
}
|
||||
|
||||
.stretched-link::after {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
z-index: 1;
|
||||
pointer-events: auto;
|
||||
content: "";
|
||||
background-color: rgba(0, 0, 0, 0);
|
||||
}
|
||||
|
||||
.m-0 {
|
||||
margin: 0 !important;
|
||||
}
|
||||
@@ -10537,6 +10572,18 @@ button.bg-dark:focus {
|
||||
}
|
||||
}
|
||||
|
||||
.stretched-link::after {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
z-index: 1;
|
||||
pointer-events: auto;
|
||||
content: "";
|
||||
background-color: rgba(0, 0, 0, 0);
|
||||
}
|
||||
|
||||
.text-monospace {
|
||||
font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace !important;
|
||||
}
|
||||
@@ -10768,8 +10815,7 @@ a.text-dark:focus {
|
||||
}
|
||||
|
||||
.text-break {
|
||||
word-break: break-word !important;
|
||||
overflow-wrap: break-word !important;
|
||||
word-wrap: break-word !important;
|
||||
}
|
||||
|
||||
.text-reset {
|
||||
|
||||
5
public/css/mixed.css
vendored
5
public/css/mixed.css
vendored
@@ -1050,6 +1050,7 @@ Lots taken from Flatly (MIT): https://bootswatch.com/4/flatly/bootstrap.css
|
||||
/* don't display any button-related controls */
|
||||
}
|
||||
}
|
||||
|
||||
/* DayGridView
|
||||
--------------------------------------------------------------------------------------------------*/
|
||||
/* day row structure */
|
||||
@@ -1128,6 +1129,7 @@ Lots taken from Flatly (MIT): https://bootswatch.com/4/flatly/bootstrap.css
|
||||
display: inline-block;
|
||||
min-width: 1.25em;
|
||||
}
|
||||
|
||||
/* Scroller
|
||||
--------------------------------------------------------------------------------------------------*/
|
||||
.fc-scroller-clip {
|
||||
@@ -1479,6 +1481,7 @@ TODO: figure out better styling
|
||||
.fc-rtl .fc-timeline-event.fc-not-start:before {
|
||||
border-right: 0;
|
||||
}
|
||||
|
||||
@charset "UTF-8";
|
||||
/* TimeGridView all-day area
|
||||
--------------------------------------------------------------------------------------------------*/
|
||||
@@ -1788,6 +1791,7 @@ be a descendant of the grid when it is being dragged.
|
||||
border-top-color: transparent;
|
||||
border-bottom-color: transparent;
|
||||
}
|
||||
|
||||
/* List View
|
||||
--------------------------------------------------------------------------------------------------*/
|
||||
/* possibly reusable */
|
||||
@@ -1906,6 +1910,7 @@ be a descendant of the grid when it is being dragged.
|
||||
/* theme will provide own background */
|
||||
background-color: #eee;
|
||||
}
|
||||
|
||||
.flatpickr-calendar{background:transparent;opacity:0;display:none;text-align:center;visibility:hidden;padding:0;-webkit-animation:none;animation:none;direction:ltr;border:0;font-size:14px;line-height:24px;border-radius:5px;position:absolute;width:307.875px;-webkit-box-sizing:border-box;box-sizing:border-box;-ms-touch-action:manipulation;touch-action:manipulation;background:#fff;-webkit-box-shadow:1px 0 0 #e6e6e6,-1px 0 0 #e6e6e6,0 1px 0 #e6e6e6,0 -1px 0 #e6e6e6,0 3px 13px rgba(0,0,0,0.08);box-shadow:1px 0 0 #e6e6e6,-1px 0 0 #e6e6e6,0 1px 0 #e6e6e6,0 -1px 0 #e6e6e6,0 3px 13px rgba(0,0,0,0.08);}.flatpickr-calendar.open,.flatpickr-calendar.inline{opacity:1;max-height:640px;visibility:visible}.flatpickr-calendar.open{display:inline-block;z-index:99999}.flatpickr-calendar.animate.open{-webkit-animation:fpFadeInDown 300ms cubic-bezier(.23,1,.32,1);animation:fpFadeInDown 300ms cubic-bezier(.23,1,.32,1)}.flatpickr-calendar.inline{display:block;position:relative;top:2px}.flatpickr-calendar.static{position:absolute;top:calc(100% + 2px);}.flatpickr-calendar.static.open{z-index:999;display:block}.flatpickr-calendar.multiMonth .flatpickr-days .dayContainer:nth-child(n+1) .flatpickr-day.inRange:nth-child(7n+7){-webkit-box-shadow:none !important;box-shadow:none !important}.flatpickr-calendar.multiMonth .flatpickr-days .dayContainer:nth-child(n+2) .flatpickr-day.inRange:nth-child(7n+1){-webkit-box-shadow:-2px 0 0 #e6e6e6,5px 0 0 #e6e6e6;box-shadow:-2px 0 0 #e6e6e6,5px 0 0 #e6e6e6}.flatpickr-calendar .hasWeeks .dayContainer,.flatpickr-calendar .hasTime .dayContainer{border-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.flatpickr-calendar .hasWeeks .dayContainer{border-left:0}.flatpickr-calendar.showTimeInput.hasTime .flatpickr-time{height:40px;border-top:1px solid #e6e6e6}.flatpickr-calendar.noCalendar.hasTime .flatpickr-time{height:auto}.flatpickr-calendar:before,.flatpickr-calendar:after{position:absolute;display:block;pointer-events:none;border:solid transparent;content:'';height:0;width:0;left:22px}.flatpickr-calendar.rightMost:before,.flatpickr-calendar.rightMost:after{left:auto;right:22px}.flatpickr-calendar:before{border-width:5px;margin:0 -5px}.flatpickr-calendar:after{border-width:4px;margin:0 -4px}.flatpickr-calendar.arrowTop:before,.flatpickr-calendar.arrowTop:after{bottom:100%}.flatpickr-calendar.arrowTop:before{border-bottom-color:#e6e6e6}.flatpickr-calendar.arrowTop:after{border-bottom-color:#fff}.flatpickr-calendar.arrowBottom:before,.flatpickr-calendar.arrowBottom:after{top:100%}.flatpickr-calendar.arrowBottom:before{border-top-color:#e6e6e6}.flatpickr-calendar.arrowBottom:after{border-top-color:#fff}.flatpickr-calendar:focus{outline:0}.flatpickr-wrapper{position:relative;display:inline-block}.flatpickr-months{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}.flatpickr-months .flatpickr-month{background:transparent;color:rgba(0,0,0,0.9);fill:rgba(0,0,0,0.9);height:34px;line-height:1;text-align:center;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;overflow:hidden;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.flatpickr-months .flatpickr-prev-month,.flatpickr-months .flatpickr-next-month{text-decoration:none;cursor:pointer;position:absolute;top:0;height:34px;padding:10px;z-index:3;color:rgba(0,0,0,0.9);fill:rgba(0,0,0,0.9);}.flatpickr-months .flatpickr-prev-month.flatpickr-disabled,.flatpickr-months .flatpickr-next-month.flatpickr-disabled{display:none}.flatpickr-months .flatpickr-prev-month i,.flatpickr-months .flatpickr-next-month i{position:relative}.flatpickr-months .flatpickr-prev-month.flatpickr-prev-month,.flatpickr-months .flatpickr-next-month.flatpickr-prev-month{/*
|
||||
/*rtl:begin:ignore*/left:0;/*
|
||||
/*rtl:end:ignore*/}/*
|
||||
|
||||
1
public/img/editable.svg
Normal file
1
public/img/editable.svg
Normal file
File diff suppressed because one or more lines are too long
|
After Width: | Height: | Size: 9.4 KiB |
41
public/img/new_team.svg
Normal file
41
public/img/new_team.svg
Normal file
File diff suppressed because one or more lines are too long
|
After Width: | Height: | Size: 11 KiB |
1
public/img/team.svg
Normal file
1
public/img/team.svg
Normal file
File diff suppressed because one or more lines are too long
|
After Width: | Height: | Size: 11 KiB |
@@ -1,14 +1,23 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Laravel - A PHP Framework For Web Artisans
|
||||
*
|
||||
* @package Laravel
|
||||
* @author Taylor Otwell <taylor@laravel.com>
|
||||
*/
|
||||
|
||||
define('LARAVEL_START', microtime(true));
|
||||
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Check If Application Is Under Maintenance
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| If the application is maintenance / demo mode via the "down" command we
|
||||
| will require this file so that any prerendered template can be shown
|
||||
| instead of starting the framework, which could cause an exception.
|
||||
|
|
||||
*/
|
||||
|
||||
if (file_exists(__DIR__.'/../storage/framework/maintenance.php')) {
|
||||
require __DIR__.'/../storage/framework/maintenance.php';
|
||||
}
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Register The Auto Loader
|
||||
|
||||
42872
public/js/app.js
vendored
42872
public/js/app.js
vendored
File diff suppressed because it is too large
Load Diff
94
public/js/app.js.LICENSE.txt
Normal file
94
public/js/app.js.LICENSE.txt
Normal file
@@ -0,0 +1,94 @@
|
||||
/* flatpickr v4.6.3, @license MIT */
|
||||
|
||||
/*!
|
||||
* Bootstrap v4.5.0 (https://getbootstrap.com/)
|
||||
* Copyright 2011-2020 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
|
||||
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
||||
*/
|
||||
|
||||
/*!
|
||||
* Chart.js v2.9.3
|
||||
* https://www.chartjs.org
|
||||
* (c) 2019 Chart.js Contributors
|
||||
* Released under the MIT License
|
||||
*/
|
||||
|
||||
/*!
|
||||
* Sizzle CSS Selector Engine v2.3.5
|
||||
* https://sizzlejs.com/
|
||||
*
|
||||
* Copyright JS Foundation and other contributors
|
||||
* Released under the MIT license
|
||||
* https://js.foundation/
|
||||
*
|
||||
* Date: 2020-03-14
|
||||
*/
|
||||
|
||||
/*!
|
||||
* jQuery JavaScript Library v3.5.1
|
||||
* https://jquery.com/
|
||||
*
|
||||
* Includes Sizzle.js
|
||||
* https://sizzlejs.com/
|
||||
*
|
||||
* Copyright JS Foundation and other contributors
|
||||
* Released under the MIT license
|
||||
* https://jquery.org/license
|
||||
*
|
||||
* Date: 2020-05-04T22:49Z
|
||||
*/
|
||||
|
||||
/*! *****************************************************************************
|
||||
Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
Licensed under the Apache License, Version 2.0 (the "License"); you may not use
|
||||
this file except in compliance with the License. You may obtain a copy of the
|
||||
License at http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
|
||||
WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
|
||||
MERCHANTABLITY OR NON-INFRINGEMENT.
|
||||
|
||||
See the Apache Version 2.0 License for specific language governing permissions
|
||||
and limitations under the License.
|
||||
***************************************************************************** */
|
||||
|
||||
/**
|
||||
* @license
|
||||
* Lodash <https://lodash.com/>
|
||||
* Copyright OpenJS Foundation and other contributors <https://openjsf.org/>
|
||||
* Released under MIT license <https://lodash.com/license>
|
||||
* Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
|
||||
* Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
|
||||
*/
|
||||
|
||||
/**!
|
||||
* @fileOverview Kickass library to create and place poppers near their reference elements.
|
||||
* @version 1.16.1
|
||||
* @license
|
||||
* Copyright (c) 2016 Federico Zivolo and contributors
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
//! moment.js
|
||||
|
||||
//! moment.js language configuration
|
||||
|
||||
//! moment.js locale configuration
|
||||
2
public/js/globaltooltip.js
vendored
2
public/js/globaltooltip.js
vendored
@@ -1,3 +1,5 @@
|
||||
$(document).ready(function() {
|
||||
$('input[rel="txtTooltip"]').tooltip();
|
||||
$('span[rel="spanTxtTooltip"]').tooltip(); // Also allow span tooltips
|
||||
$('button[rel="buttonTxtTooltip"]').tooltip(); // button tooltip
|
||||
});
|
||||
|
||||
7
public/js/switches.js
vendored
Normal file
7
public/js/switches.js
vendored
Normal file
@@ -0,0 +1,7 @@
|
||||
$("#jointype").on('change', function() {
|
||||
if ($(this).is(':checked')) {
|
||||
$(this).attr('value', '1');
|
||||
} else {
|
||||
$(this).attr('value', '0');
|
||||
}
|
||||
});
|
||||
6
public/js/team-editor.js
vendored
Normal file
6
public/js/team-editor.js
vendored
Normal file
@@ -0,0 +1,6 @@
|
||||
$(function() {
|
||||
$('#assocVacancies').multiselect({
|
||||
disableIfEmpty: true,
|
||||
nonSelectedText: 'Choose vacancies...'
|
||||
});
|
||||
});
|
||||
3
resources/js/app.js
vendored
3
resources/js/app.js
vendored
@@ -43,3 +43,6 @@ $("#comment").keyup(function(){
|
||||
$("#submitComment").on('click', function(){
|
||||
$("#newComment").submit();
|
||||
});
|
||||
|
||||
$("#jointype").bootstrapToggle();
|
||||
|
||||
|
||||
@@ -475,6 +475,8 @@ return [
|
||||
'2fa_disable_consent' => '"I understand the possible consequences of disabling two factor authentication"',
|
||||
'2fa_remove' => 'Remove 2FA',
|
||||
'2fa_remove_extended' => 'Remove Two-Factor Authentication',
|
||||
'2fa_send_code' => 'Send 2FA Code',
|
||||
'2fa_send_code_s' => '2FA Code (ex. 41351)',
|
||||
|
||||
'security_lgotherdev' => 'For your security, you\'ll need to re-enter your password before logging out other devices. If you believe your account has been compromised, please change your password instead, as that will automatically log out anyone else who might using your account, and prevent them from signing back in.',
|
||||
'password_reenter' => 'Re-enter your password',
|
||||
@@ -603,6 +605,13 @@ return [
|
||||
'max_chars' => 'max characters', // Context: A number is added before max characters
|
||||
'post' => 'Post', // Context: Post as in post comment
|
||||
|
||||
],
|
||||
|
||||
|
||||
'teams' => [
|
||||
|
||||
'm_teams_page' => 'Teams'
|
||||
|
||||
]
|
||||
|
||||
// ==================== END OF MAIN I18N FILE ======================
|
||||
|
||||
@@ -475,6 +475,8 @@ return [
|
||||
'2fa_disable_consent' => '"I understand the possible consequences of disabling two factor authentication"',
|
||||
'2fa_remove' => 'Remove 2FA',
|
||||
'2fa_remove_extended' => 'Remove Two-Factor Authentication',
|
||||
'2fa_send_code' => 'Send 2FA Code',
|
||||
'2fa_send_code_s' => '2FA Code (ex. 41351)',
|
||||
|
||||
'security_lgotherdev' => 'For your security, you\'ll need to re-enter your password before logging out other devices. If you believe your account has been compromised, please change your password instead, as that will automatically log out anyone else who might using your account, and prevent them from signing back in.',
|
||||
'password_reenter' => 'Re-enter your password',
|
||||
|
||||
@@ -475,6 +475,8 @@ return [
|
||||
'2fa_disable_consent' => '"I understand the possible consequences of disabling two factor authentication"',
|
||||
'2fa_remove' => 'Remove 2FA',
|
||||
'2fa_remove_extended' => 'Remove Two-Factor Authentication',
|
||||
'2fa_send_code' => 'Send 2FA Code',
|
||||
'2fa_send_code_s' => '2FA Code (ex. 41351)',
|
||||
|
||||
'security_lgotherdev' => 'For your security, you\'ll need to re-enter your password before logging out other devices. If you believe your account has been compromised, please change your password instead, as that will automatically log out anyone else who might using your account, and prevent them from signing back in.',
|
||||
'password_reenter' => 'Re-enter your password',
|
||||
|
||||
@@ -121,7 +121,7 @@ return [
|
||||
'contact_cta' => 'Alguma pergunta? Deixe uma mensagem!',
|
||||
'contact_disclaimer' => '*Este não é um formulário de candidatura. Qualquer candidatura enviada aqui será ignorada.',
|
||||
'contactlabel_name' => 'Nome',
|
||||
'contactlabel_email' => 'E-mail',
|
||||
'contactlabel_email' => 'Endereço E-mail',
|
||||
'contactlabel_subject' => 'Assunto (ex. sugestão do site)',
|
||||
'contactlabel_send' => 'Enviar',
|
||||
|
||||
@@ -475,6 +475,8 @@ return [
|
||||
'2fa_disable_consent' => '"Eu compreendo as possíveis consequências de desativar a autenticação de dois fatores"',
|
||||
'2fa_remove' => 'Remover 2FA',
|
||||
'2fa_remove_extended' => 'Desativar autenticação em dois passos',
|
||||
'2fa_send_code' => 'Enviar código 2FA',
|
||||
'2fa_send_code_s' => 'Código de autenticação (ex. 41351)',
|
||||
|
||||
'security_lgotherdev' => 'Para sua segurança, você precisará re-introduzir a sua senha antes de desconectar outros dispositivos. Se você acredita que sua conta foi comprometida, altere sua senha em vez disso, já que isso desconectará automaticamente qualquer pessoa que poderá estar usando sua conta e impedir que faça login novamente.',
|
||||
'password_reenter' => 'Repita a sua palavra-passe',
|
||||
|
||||
21
resources/lang/vendor/adminlte/ar/adminlte.php
vendored
21
resources/lang/vendor/adminlte/ar/adminlte.php
vendored
@@ -1,21 +0,0 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'full_name' => 'الاسم الثلاثي',
|
||||
'email' => 'البريد الإلكتروني',
|
||||
'password' => 'كلمة السر',
|
||||
'retype_password' => 'أعد إدخال كلمة السر',
|
||||
'remember_me' => 'ذكرني',
|
||||
'register' => 'تسجيل جديد',
|
||||
'register_a_new_membership' => 'تسجيل عضوية جديدة',
|
||||
'i_forgot_my_password' => 'نسيت كلمة السر؟',
|
||||
'i_already_have_a_membership' => 'هذا الحساب لديه عضوية سابقة',
|
||||
'sign_in' => 'تسجيل الدخول',
|
||||
'log_out' => 'تسجيل خروج',
|
||||
'toggle_navigation' => 'القائمة الجانبية',
|
||||
'login_message' => 'يجب تسجيل الدخول',
|
||||
'register_message' => 'تم تسجيل العضوية الجديدة ',
|
||||
'password_reset_message' => 'تم إعادة تعيين كلمة المرور',
|
||||
'reset_password' => 'إعادة تعيين كلمة السر',
|
||||
'send_password_reset_link' => 'إرسال رابط إعادة تعيين كلمة السر',
|
||||
];
|
||||
21
resources/lang/vendor/adminlte/ca/adminlte.php
vendored
21
resources/lang/vendor/adminlte/ca/adminlte.php
vendored
@@ -1,21 +0,0 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'full_name' => 'Nom complet',
|
||||
'email' => 'Email',
|
||||
'password' => 'Contrasenya',
|
||||
'retype_password' => 'Confirmar la contrasenya',
|
||||
'remember_me' => 'Recordar-me',
|
||||
'register' => 'Registrar-se',
|
||||
'register_a_new_membership' => 'Crear un nou compte',
|
||||
'i_forgot_my_password' => 'He oblidat la meva contrasenya',
|
||||
'i_already_have_a_membership' => 'Ja tinc un compte',
|
||||
'sign_in' => 'Accedir',
|
||||
'log_out' => 'Sortir',
|
||||
'toggle_navigation' => 'Commutar la navegació',
|
||||
'login_message' => 'Autenticar-se per a iniciar sessió',
|
||||
'register_message' => 'Crear un nou compte',
|
||||
'password_reset_message' => 'Restablir la contrasenya',
|
||||
'reset_password' => 'Restablir la contrasenya',
|
||||
'send_password_reset_link' => 'Enviar enllaç de restabliment de contrasenya',
|
||||
];
|
||||
27
resources/lang/vendor/adminlte/de/adminlte.php
vendored
27
resources/lang/vendor/adminlte/de/adminlte.php
vendored
@@ -1,27 +0,0 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
|
||||
'full_name' => 'Vollständiger Name',
|
||||
'email' => 'E-Mail',
|
||||
'password' => 'Passwort',
|
||||
'retype_password' => 'Passwort bestätigen',
|
||||
'remember_me' => 'Angemeldet bleiben',
|
||||
'register' => 'Registrieren',
|
||||
'register_a_new_membership' => 'Ein neues Konto registrieren',
|
||||
'i_forgot_my_password' => 'Ich habe mein Passwort vergessen',
|
||||
'i_already_have_a_membership' => 'Ich bin bereits registriert',
|
||||
'sign_in' => 'Anmelden',
|
||||
'log_out' => 'Abmelden',
|
||||
'toggle_navigation' => 'Navigation umschalten',
|
||||
'login_message' => 'Bitte melden Sie sich an, um auf den geschützten Bereich zuzugreifen',
|
||||
'register_message' => 'Bitte füllen Sie das Formular aus, um ein neues Konto zu registrieren',
|
||||
'password_reset_message' => 'Bitte geben Sie Ihre E-Mail Adresse ein, um Ihr Passwort zurückzusetzen',
|
||||
'reset_password' => 'Passwort zurücksetzen',
|
||||
'send_password_reset_link' => 'Link zur Passwortwiederherstellung senden',
|
||||
'verify_message' => 'Ihr Account muss noch bestätigt werden',
|
||||
'verify_email_sent' => 'Es wurde ein neuer Bestätigungslink an Ihre E-Mail Adresse gesendet.',
|
||||
'verify_check_your_email' => 'Bevor Sie fortfahren, überprüfen Sie bitte Ihre E-Mail auf einen Bestätigungslink.',
|
||||
'verify_if_not_recieved' => 'Wenn Sie die E-Mail nicht empfangen haben',
|
||||
'verify_request_another' => 'klicken Sie hier, um eine neue E-Mail anzufordern',
|
||||
];
|
||||
19
resources/lang/vendor/adminlte/de/menu.php
vendored
19
resources/lang/vendor/adminlte/de/menu.php
vendored
@@ -1,19 +0,0 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
|
||||
'main_navigation' => 'HAUPTMENÜ',
|
||||
'blog' => 'Blog',
|
||||
'pages' => 'Seiten',
|
||||
'account_settings' => 'KONTOEINSTELLUNGEN',
|
||||
'profile' => 'Profil',
|
||||
'change_password' => 'Passwort ändern',
|
||||
'multilevel' => 'Multi Level',
|
||||
'level_one' => 'Level 1',
|
||||
'level_two' => 'Level 2',
|
||||
'level_three' => 'Level 3',
|
||||
'labels' => 'Beschriftungen',
|
||||
'important' => 'Wichtig',
|
||||
'warning' => 'Warnung',
|
||||
'information' => 'Information',
|
||||
];
|
||||
@@ -19,9 +19,10 @@ return [
|
||||
'password_reset_message' => 'Reset Password',
|
||||
'reset_password' => 'Reset Password',
|
||||
'send_password_reset_link' => 'Send Password Reset Link',
|
||||
'verify_message' => 'Your account needs a verification',
|
||||
'verify_email_sent' => 'A fresh verification link has been sent to your email address.',
|
||||
'verify_message' => 'Your account needs verification',
|
||||
'verify_email_sent' => 'A fresh verification link has been sent to your email address.',
|
||||
'verify_check_your_email' => 'Before proceeding, please check your email for a verification link.',
|
||||
'verify_if_not_recieved' => 'If you did not receive the email',
|
||||
'verify_request_another' => 'click here to request another',
|
||||
'confirm_password_message' => 'Please, confirm your password to continue.',
|
||||
];
|
||||
|
||||
41
resources/lang/vendor/adminlte/en/menu.php
vendored
41
resources/lang/vendor/adminlte/en/menu.php
vendored
@@ -2,18 +2,31 @@
|
||||
|
||||
return [
|
||||
|
||||
'main_navigation' => 'MAIN NAVIGATION',
|
||||
'blog' => 'Blog',
|
||||
'pages' => 'Pages',
|
||||
'account_settings' => 'ACCOUNT SETTINGS',
|
||||
'profile' => 'Profile',
|
||||
'change_password' => 'Change Password',
|
||||
'multilevel' => 'Multi Level',
|
||||
'level_one' => 'Level 1',
|
||||
'level_two' => 'Level 2',
|
||||
'level_three' => 'Level 3',
|
||||
'labels' => 'LABELS',
|
||||
'important' => 'Important',
|
||||
'warning' => 'Warning',
|
||||
'information' => 'Information',
|
||||
'm_home' => 'Home',
|
||||
'm_directory' => 'Directory',
|
||||
'h_applications' => 'Applications',
|
||||
'm_my_applications' => 'My Applications',
|
||||
'm_curr_applications' => 'Current Applications',
|
||||
'h_my_profile' => 'My Profile',
|
||||
'm_profile_settings' => 'Profile Settings',
|
||||
'm_account_settings' => 'My Account Settings',
|
||||
'h_app_management' => 'Application Management',
|
||||
'm_all_apps' => 'All Applications',
|
||||
'm_outstanding_apps' => 'Outstanding Applications',
|
||||
'm_interview_queue' => 'Interview Queue',
|
||||
'm_peer_approval' => 'Peer Approval Queue',
|
||||
'h_admin' => 'Administration',
|
||||
'm_staff_m' => 'Staff Members',
|
||||
'm_reg_players' => 'Registered Players',
|
||||
'sm_hiring_man' => 'Hiring Management',
|
||||
'm_open_pos' => 'Open Positions',
|
||||
'sm_forms' => 'Forms',
|
||||
'sm_all_forms' => 'All Forms',
|
||||
'm_form_builder' => 'Form Builder',
|
||||
'sm_app_settings' => 'App Settings',
|
||||
'm_global_app_s' => 'Global App Settings',
|
||||
'm_devtools' => 'Developer Tools',
|
||||
'm_s_logs' => 'System Logs'
|
||||
|
||||
|
||||
];
|
||||
|
||||
43
resources/lang/vendor/adminlte/es/adminlte.php
vendored
43
resources/lang/vendor/adminlte/es/adminlte.php
vendored
@@ -2,26 +2,27 @@
|
||||
|
||||
return [
|
||||
|
||||
'full_name' => 'Nombre completo',
|
||||
'full_name' => 'Full name',
|
||||
'email' => 'Email',
|
||||
'password' => 'Contraseña',
|
||||
'retype_password' => 'Confirmar la contraseña',
|
||||
'remember_me' => 'Recordarme',
|
||||
'register' => 'Registrarse',
|
||||
'register_a_new_membership' => 'Crear una nueva cuenta',
|
||||
'i_forgot_my_password' => 'Olvidé mi contraseña',
|
||||
'i_already_have_a_membership' => 'Ya tengo una cuenta',
|
||||
'sign_in' => 'Acceder',
|
||||
'log_out' => 'Salir',
|
||||
'toggle_navigation' => 'Alternar barra de navegación',
|
||||
'login_message' => 'Autenticarse para iniciar sesión',
|
||||
'register_message' => 'Crear una nueva cuenta',
|
||||
'password_reset_message' => 'Restablecer la contraseña',
|
||||
'reset_password' => 'Restablecer la contraseña',
|
||||
'send_password_reset_link' => 'Enviar enlace para restablecer la contraseña',
|
||||
'verify_message' => 'Tu cuenta necesita una verificación',
|
||||
'verify_email_sent' => 'Se ha enviado un nuevo enlace de verificación a su correo electrónico.',
|
||||
'verify_check_your_email' => 'Antes de continuar, busque en su correo electrónico un enlace de verificación.',
|
||||
'verify_if_not_recieved' => 'Si no has recibido el correo electrónico',
|
||||
'verify_request_another' => 'haga clic aquí para solicitar otro',
|
||||
'password' => 'Password',
|
||||
'retype_password' => 'Retype password',
|
||||
'remember_me' => 'Remember Me',
|
||||
'register' => 'Register',
|
||||
'register_a_new_membership' => 'Register a new membership',
|
||||
'i_forgot_my_password' => 'I forgot my password',
|
||||
'i_already_have_a_membership' => 'I already have a membership',
|
||||
'sign_in' => 'Sign In',
|
||||
'log_out' => 'Log Out',
|
||||
'toggle_navigation' => 'Toggle navigation',
|
||||
'login_message' => 'Sign in to start your session',
|
||||
'register_message' => 'Register a new membership',
|
||||
'password_reset_message' => 'Reset Password',
|
||||
'reset_password' => 'Reset Password',
|
||||
'send_password_reset_link' => 'Send Password Reset Link',
|
||||
'verify_message' => 'Your account needs verification',
|
||||
'verify_email_sent' => 'A fresh verification link has been sent to your email address.',
|
||||
'verify_check_your_email' => 'Before proceeding, please check your email for a verification link.',
|
||||
'verify_if_not_recieved' => 'If you did not receive the email',
|
||||
'verify_request_another' => 'click here to request another',
|
||||
'confirm_password_message' => 'Please, confirm your password to continue.',
|
||||
];
|
||||
|
||||
41
resources/lang/vendor/adminlte/es/menu.php
vendored
41
resources/lang/vendor/adminlte/es/menu.php
vendored
@@ -2,18 +2,31 @@
|
||||
|
||||
return [
|
||||
|
||||
'main_navigation' => 'MENU PRINCIPAL',
|
||||
'blog' => 'Blog',
|
||||
'pages' => 'Páginas',
|
||||
'account_settings' => 'AJUSTES DE LA CUENTA',
|
||||
'profile' => 'Perfil',
|
||||
'change_password' => 'Cambiar Contraseña',
|
||||
'multilevel' => 'Multi Nivel',
|
||||
'level_one' => 'Nivel 1',
|
||||
'level_two' => 'Nivel 2',
|
||||
'level_three' => 'Nivel 3',
|
||||
'labels' => 'ETIQUETAS',
|
||||
'important' => 'Importante',
|
||||
'warning' => 'Advertencia',
|
||||
'information' => 'Información',
|
||||
'm_home' => 'Home',
|
||||
'm_directory' => 'Directory',
|
||||
'h_applications' => 'Applications',
|
||||
'm_my_applications' => 'My Applications',
|
||||
'm_curr_applications' => 'Current Applications',
|
||||
'h_my_profile' => 'My Profile',
|
||||
'm_profile_settings' => 'Profile Settings',
|
||||
'm_account_settings' => 'My Account Settings',
|
||||
'h_app_management' => 'Application Management',
|
||||
'm_all_apps' => 'All Applications',
|
||||
'm_outstanding_apps' => 'Outstanding Applications',
|
||||
'm_interview_queue' => 'Interview Queue',
|
||||
'm_peer_approval' => 'Peer Approval Queue',
|
||||
'h_admin' => 'Administration',
|
||||
'm_staff_m' => 'Staff Members',
|
||||
'm_reg_players' => 'Registered Players',
|
||||
'sm_hiring_man' => 'Hiring Management',
|
||||
'm_open_pos' => 'Open Positions',
|
||||
'sm_forms' => 'Forms',
|
||||
'sm_all_forms' => 'All Forms',
|
||||
'm_form_builder' => 'Form Builder',
|
||||
'sm_app_settings' => 'App Settings',
|
||||
'm_global_app_s' => 'Global App Settings',
|
||||
'm_devtools' => 'Developer Tools',
|
||||
'm_s_logs' => 'System Logs'
|
||||
|
||||
|
||||
];
|
||||
|
||||
22
resources/lang/vendor/adminlte/fa/adminlte.php
vendored
22
resources/lang/vendor/adminlte/fa/adminlte.php
vendored
@@ -1,22 +0,0 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
|
||||
'full_name' => 'نام',
|
||||
'email' => 'ایمیل',
|
||||
'password' => 'رمز عبور',
|
||||
'retype_password' => 'تکرار رمز عبور',
|
||||
'remember_me' => 'مرا به یاد داشته باش',
|
||||
'register' => 'ثبت نام',
|
||||
'register_a_new_membership' => 'ایجاد یک عضویت جدید',
|
||||
'i_forgot_my_password' => 'رمز عبور را فراموش کرده ام',
|
||||
'i_already_have_a_membership' => 'قبلا ثبت نام کرده ام',
|
||||
'sign_in' => 'ورود',
|
||||
'log_out' => 'خروج',
|
||||
'toggle_navigation' => 'نمایش/مخفی کردن منو',
|
||||
'login_message' => 'وارد شوید',
|
||||
'register_message' => 'ثبت نام',
|
||||
'password_reset_message' => 'بازنشانی رمز عبور',
|
||||
'reset_password' => 'بازنشانی رمز عبور',
|
||||
'send_password_reset_link' => 'ارسال لینک بازنشانی رمز عبور',
|
||||
];
|
||||
38
resources/lang/vendor/adminlte/fr/adminlte.php
vendored
38
resources/lang/vendor/adminlte/fr/adminlte.php
vendored
@@ -2,21 +2,27 @@
|
||||
|
||||
return [
|
||||
|
||||
'full_name' => 'Nom',
|
||||
'full_name' => 'Full name',
|
||||
'email' => 'Email',
|
||||
'password' => 'Mot de passe',
|
||||
'retype_password' => 'Entrez à nouveau le mot de passe',
|
||||
'remember_me' => 'Se souvenir de moi',
|
||||
'register' => 'Enregistrement',
|
||||
'register_a_new_membership' => 'Enregistrer un nouveau membre',
|
||||
'i_forgot_my_password' => 'J\'ai oublié mon mot de passe',
|
||||
'i_already_have_a_membership' => 'J\'ai déjà un compte',
|
||||
'sign_in' => 'Connexion',
|
||||
'log_out' => 'Déconnexion',
|
||||
'toggle_navigation' => 'Basculer la navigation',
|
||||
'login_message' => 'Connectez-vous pour commencer une session',
|
||||
'register_message' => 'Enregistrement d\'un nouveau membre',
|
||||
'password_reset_message' => 'Réinitialisation du mot de passe',
|
||||
'reset_password' => 'Réinitialisation du mot de passe',
|
||||
'send_password_reset_link' => 'Envoi de la réinitialisation du mot de passe',
|
||||
'password' => 'Password',
|
||||
'retype_password' => 'Retype password',
|
||||
'remember_me' => 'Remember Me',
|
||||
'register' => 'Register',
|
||||
'register_a_new_membership' => 'Register a new membership',
|
||||
'i_forgot_my_password' => 'I forgot my password',
|
||||
'i_already_have_a_membership' => 'I already have a membership',
|
||||
'sign_in' => 'Sign In',
|
||||
'log_out' => 'Log Out',
|
||||
'toggle_navigation' => 'Toggle navigation',
|
||||
'login_message' => 'Sign in to start your session',
|
||||
'register_message' => 'Register a new membership',
|
||||
'password_reset_message' => 'Reset Password',
|
||||
'reset_password' => 'Reset Password',
|
||||
'send_password_reset_link' => 'Send Password Reset Link',
|
||||
'verify_message' => 'Your account needs verification',
|
||||
'verify_email_sent' => 'A fresh verification link has been sent to your email address.',
|
||||
'verify_check_your_email' => 'Before proceeding, please check your email for a verification link.',
|
||||
'verify_if_not_recieved' => 'If you did not receive the email',
|
||||
'verify_request_another' => 'click here to request another',
|
||||
'confirm_password_message' => 'Please, confirm your password to continue.',
|
||||
];
|
||||
|
||||
32
resources/lang/vendor/adminlte/fr/menu.php
vendored
Normal file
32
resources/lang/vendor/adminlte/fr/menu.php
vendored
Normal file
@@ -0,0 +1,32 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
|
||||
'm_home' => 'Home',
|
||||
'm_directory' => 'Directory',
|
||||
'h_applications' => 'Applications',
|
||||
'm_my_applications' => 'My Applications',
|
||||
'm_curr_applications' => 'Current Applications',
|
||||
'h_my_profile' => 'My Profile',
|
||||
'm_profile_settings' => 'Profile Settings',
|
||||
'm_account_settings' => 'My Account Settings',
|
||||
'h_app_management' => 'Application Management',
|
||||
'm_all_apps' => 'All Applications',
|
||||
'm_outstanding_apps' => 'Outstanding Applications',
|
||||
'm_interview_queue' => 'Interview Queue',
|
||||
'm_peer_approval' => 'Peer Approval Queue',
|
||||
'h_admin' => 'Administration',
|
||||
'm_staff_m' => 'Staff Members',
|
||||
'm_reg_players' => 'Registered Players',
|
||||
'sm_hiring_man' => 'Hiring Management',
|
||||
'm_open_pos' => 'Open Positions',
|
||||
'sm_forms' => 'Forms',
|
||||
'sm_all_forms' => 'All Forms',
|
||||
'm_form_builder' => 'Form Builder',
|
||||
'sm_app_settings' => 'App Settings',
|
||||
'm_global_app_s' => 'Global App Settings',
|
||||
'm_devtools' => 'Developer Tools',
|
||||
'm_s_logs' => 'System Logs'
|
||||
|
||||
|
||||
];
|
||||
22
resources/lang/vendor/adminlte/hr/adminlte.php
vendored
22
resources/lang/vendor/adminlte/hr/adminlte.php
vendored
@@ -1,22 +0,0 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
|
||||
'full_name' => 'Ime',
|
||||
'email' => 'Email',
|
||||
'password' => 'Lozinka',
|
||||
'retype_password' => 'Ponovljena lozinka',
|
||||
'remember_me' => 'Zapamti me',
|
||||
'register' => 'Novi korisnik',
|
||||
'register_a_new_membership' => 'Registracija',
|
||||
'i_forgot_my_password' => 'Zaboravljena zaporka',
|
||||
'i_already_have_a_membership' => 'Već imam korisnički račun',
|
||||
'sign_in' => 'Prijava',
|
||||
'log_out' => 'Odjava',
|
||||
'toggle_navigation' => 'Pregled navigacije',
|
||||
'login_message' => 'Prijava',
|
||||
'register_message' => 'Registracija',
|
||||
'password_reset_message' => 'Nova lozinka',
|
||||
'reset_password' => 'Nova lozinka',
|
||||
'send_password_reset_link' => 'Pošalji novi zahtjev lozinke',
|
||||
];
|
||||
21
resources/lang/vendor/adminlte/hu/adminlte.php
vendored
21
resources/lang/vendor/adminlte/hu/adminlte.php
vendored
@@ -1,21 +0,0 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'full_name' => 'Teljes név',
|
||||
'email' => 'Email',
|
||||
'password' => 'Jelszó',
|
||||
'retype_password' => 'Jelszó újra',
|
||||
'remember_me' => 'Emlékezz rám',
|
||||
'register' => 'Regisztráció',
|
||||
'register_a_new_membership' => 'Regisztrálás új tagként',
|
||||
'i_forgot_my_password' => 'Elfelejtetem a jelszavam',
|
||||
'i_already_have_a_membership' => 'Már tag vagyok',
|
||||
'sign_in' => 'Belépés',
|
||||
'log_out' => 'Kilépés',
|
||||
'toggle_navigation' => 'Lenyíló navigáció',
|
||||
'login_message' => 'Belépés a munkamenet elkezdéséhez',
|
||||
'register_message' => 'Regisztrálás új tagként',
|
||||
'password_reset_message' => 'Jelszó visszaállítása',
|
||||
'reset_password' => 'Jelszó visszaállítása',
|
||||
'send_password_reset_link' => 'Jelszó visszaállítás link küldése',
|
||||
];
|
||||
22
resources/lang/vendor/adminlte/it/adminlte.php
vendored
22
resources/lang/vendor/adminlte/it/adminlte.php
vendored
@@ -1,22 +0,0 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
|
||||
'full_name' => 'Nome completo',
|
||||
'email' => 'Email',
|
||||
'password' => 'Password',
|
||||
'retype_password' => 'Ripeti password',
|
||||
'remember_me' => 'Ricordami',
|
||||
'register' => 'Registrazione',
|
||||
'register_a_new_membership' => 'Registra un nuovo abbonamento',
|
||||
'i_forgot_my_password' => 'Ho dimenticato la password',
|
||||
'i_already_have_a_membership' => 'Ho già un abbonamento',
|
||||
'sign_in' => 'Accedi',
|
||||
'log_out' => 'Logout',
|
||||
'toggle_navigation' => 'Attiva la navigazione',
|
||||
'login_message' => 'Accedi per iniziare la tua sessione',
|
||||
'register_message' => 'Registra un nuovo abbonamento',
|
||||
'password_reset_message' => 'Resetta la password',
|
||||
'reset_password' => 'Resetta la password',
|
||||
'send_password_reset_link' => 'Invia link di reset della password',
|
||||
];
|
||||
27
resources/lang/vendor/adminlte/ja/adminlte.php
vendored
27
resources/lang/vendor/adminlte/ja/adminlte.php
vendored
@@ -1,27 +0,0 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
|
||||
'full_name' => '氏名',
|
||||
'email' => 'メールアドレス',
|
||||
'password' => 'パスワード',
|
||||
'retype_password' => 'もう一度入力',
|
||||
'remember_me' => 'パスワードを記憶する',
|
||||
'register' => '登録する',
|
||||
'register_a_new_membership' => 'アカウントを登録する',
|
||||
'i_forgot_my_password' => 'パスワードを忘れた',
|
||||
'i_already_have_a_membership' => 'すでにアカウントを持っている',
|
||||
'sign_in' => 'ログイン',
|
||||
'log_out' => 'ログアウト',
|
||||
'toggle_navigation' => 'ナビゲーションを開閉',
|
||||
'login_message' => 'ログインしてセッションを開始する',
|
||||
'register_message' => 'アカウントを登録する',
|
||||
'password_reset_message' => 'パスワードをリセットする',
|
||||
'reset_password' => 'パスワードをリセットする',
|
||||
'send_password_reset_link' => 'パスワードリセットリンクを送信する。',
|
||||
'verify_message' => 'あなたのアカウントは認証が必要です。',
|
||||
'verify_email_sent' => 'あなたのメールアドレスに認証用のリンクを送信しました。',
|
||||
'verify_check_your_email' => '続行する前に、認証用リンクについてメールを確認してください。',
|
||||
'verify_if_not_recieved' => 'メールが届かない場合',
|
||||
'verify_request_another' => 'ここをクリックしてもう一度送信する',
|
||||
];
|
||||
19
resources/lang/vendor/adminlte/ja/menu.php
vendored
19
resources/lang/vendor/adminlte/ja/menu.php
vendored
@@ -1,19 +0,0 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
|
||||
'main_navigation' => 'メインメニュー',
|
||||
'blog' => 'ブログ',
|
||||
'pages' => 'ページ',
|
||||
'account_settings' => 'アカウント設定',
|
||||
'profile' => 'プロフィール',
|
||||
'change_password' => 'パスワード変更',
|
||||
'multilevel' => 'マルチ階層',
|
||||
'level_one' => '階層 1',
|
||||
'level_two' => '階層 2',
|
||||
'level_three' => '階層 3',
|
||||
'labels' => 'ラベル',
|
||||
'important' => '重要',
|
||||
'warning' => '警告',
|
||||
'information' => 'インフォメーション',
|
||||
];
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user