commit
c17ed5389f
69
.env.dev
69
.env.dev
|
@ -1,69 +0,0 @@
|
||||||
APP_NAME=Laravel
|
|
||||||
APP_ENV=local
|
|
||||||
APP_KEY=
|
|
||||||
APP_DEBUG=true
|
|
||||||
APP_URL=http://localhost
|
|
||||||
|
|
||||||
LOG_CHANNEL=stack
|
|
||||||
LOG_LEVEL=debug
|
|
||||||
|
|
||||||
DB_CONNECTION=mysql
|
|
||||||
DB_HOST=controlpanel_mysql
|
|
||||||
DB_PORT=3306
|
|
||||||
DB_DATABASE=controlpanel
|
|
||||||
DB_USERNAME=root
|
|
||||||
DB_PASSWORD=root
|
|
||||||
|
|
||||||
PAYPAL_SANDBOX_SECRET=
|
|
||||||
PAYPAL_SANDBOX_CLIENT_ID=
|
|
||||||
PAYPAL_SECRET=
|
|
||||||
PAYPAL_CLIENT_ID=
|
|
||||||
PAYPAL_EMAIL=
|
|
||||||
|
|
||||||
DISCORD_CLIENT_ID=
|
|
||||||
DISCORD_CLIENT_SECRET=
|
|
||||||
DISCORD_REDIRECT_URI=http://localhost:8000/auth/callback
|
|
||||||
DISCORD_INVITE_URL=https://discord.gg/vrUYdxG4wZ
|
|
||||||
|
|
||||||
PTERODACTYL_TOKEN=
|
|
||||||
PTERODACTYL_URL=https://panel.bitsec.dev
|
|
||||||
PHPMYADMIN_URL=https://mysql.bitsec.dev
|
|
||||||
|
|
||||||
|
|
||||||
RECAPTCHA_SITE_KEY=YOUR_API_SITE_KEY
|
|
||||||
RECAPTCHA_SECRET_KEY=YOUR_API_SECRET_KEY
|
|
||||||
|
|
||||||
|
|
||||||
BROADCAST_DRIVER=log
|
|
||||||
CACHE_DRIVER=file
|
|
||||||
QUEUE_CONNECTION=database
|
|
||||||
SESSION_DRIVER=file
|
|
||||||
SESSION_LIFETIME=120
|
|
||||||
|
|
||||||
MEMCACHED_HOST=127.0.0.1
|
|
||||||
|
|
||||||
REDIS_HOST=127.0.0.1
|
|
||||||
REDIS_PASSWORD=null
|
|
||||||
REDIS_PORT=6379
|
|
||||||
|
|
||||||
MAIL_MAILER=smtp
|
|
||||||
MAIL_HOST=mailhog
|
|
||||||
MAIL_PORT=1025
|
|
||||||
MAIL_USERNAME=null
|
|
||||||
MAIL_PASSWORD=null
|
|
||||||
MAIL_ENCRYPTION=null
|
|
||||||
MAIL_FROM_ADDRESS=null
|
|
||||||
MAIL_FROM_NAME="${APP_NAME}"
|
|
||||||
|
|
||||||
AWS_ACCESS_KEY_ID=
|
|
||||||
AWS_SECRET_ACCESS_KEY=
|
|
||||||
AWS_DEFAULT_REGION=us-east-1
|
|
||||||
AWS_BUCKET=
|
|
||||||
|
|
||||||
PUSHER_APP_ID=
|
|
||||||
PUSHER_APP_KEY=
|
|
||||||
PUSHER_APP_SECRET=
|
|
||||||
PUSHER_APP_CLUSTER=mt1
|
|
||||||
|
|
||||||
MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
|
|
||||||
MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"
|
|
54
.env.example
54
.env.example
|
@ -1,38 +1,57 @@
|
||||||
APP_NAME=Laravel
|
APP_NAME=Dashboard
|
||||||
APP_ENV=local
|
APP_ENV=production
|
||||||
APP_KEY=
|
APP_KEY=
|
||||||
APP_DEBUG=true
|
APP_DEBUG=false
|
||||||
APP_URL=http://localhost
|
APP_URL=http://localhost
|
||||||
|
|
||||||
LOG_CHANNEL=stack
|
|
||||||
LOG_LEVEL=debug
|
|
||||||
|
|
||||||
DB_CONNECTION=mysql
|
DB_CONNECTION=mysql
|
||||||
DB_HOST=127.0.0.1
|
DB_HOST=controlpanel_mysql
|
||||||
DB_PORT=3306
|
DB_PORT=3306
|
||||||
DB_DATABASE=laravel
|
DB_DATABASE=controlpanel
|
||||||
DB_USERNAME=root
|
DB_USERNAME=root
|
||||||
DB_PASSWORD=
|
DB_PASSWORD=root
|
||||||
|
|
||||||
|
#without a pterodactyl api token, this panel won't work!
|
||||||
|
PTERODACTYL_TOKEN=
|
||||||
|
|
||||||
|
#paypal details, you only need sandbox for testing! you can do this by setting the APP_ENV to local
|
||||||
PAYPAL_SANDBOX_SECRET=
|
PAYPAL_SANDBOX_SECRET=
|
||||||
PAYPAL_SANDBOX_CLIENT_ID=
|
PAYPAL_SANDBOX_CLIENT_ID=
|
||||||
PAYPAL_SECRET=
|
PAYPAL_SECRET=
|
||||||
PAYPAL_CLIENT_ID=
|
PAYPAL_CLIENT_ID=
|
||||||
PAYPAL_EMAIL=
|
PAYPAL_EMAIL=
|
||||||
|
|
||||||
|
#set-up for extra discord verification
|
||||||
DISCORD_CLIENT_ID=
|
DISCORD_CLIENT_ID=
|
||||||
DISCORD_CLIENT_SECRET=
|
DISCORD_CLIENT_SECRET=
|
||||||
DISCORD_REDIRECT_URI=http://localhost:8000/auth/callback
|
#set-up will join users automaticly to your discord
|
||||||
DISCORD_INVITE_URL=https://discord.gg/vrUYdxG4wZ
|
DISCORD_BOT_TOKEN=
|
||||||
|
DISCORD_GUILD_ID=
|
||||||
|
#set-up will give the verified user the given role
|
||||||
|
DISCORD_ROLE_ID=
|
||||||
|
|
||||||
PTERODACTYL_TOKEN=
|
#nesseary URL's
|
||||||
PTERODACTYL_URL=https://panel.bitsec.dev
|
PTERODACTYL_URL=https://panel.bitsec.dev
|
||||||
PHPMYADMIN_URL=https://mysql.bitsec.dev
|
PHPMYADMIN_URL=https://mysql.bitsec.dev
|
||||||
|
DISCORD_INVITE_URL=https://discord.gg/vrUYdxG4wZ
|
||||||
|
|
||||||
|
#GOOGLE RECAPTCHA
|
||||||
RECAPTCHA_SITE_KEY=YOUR_API_SITE_KEY
|
RECAPTCHA_SITE_KEY=YOUR_API_SITE_KEY
|
||||||
RECAPTCHA_SECRET_KEY=YOUR_API_SECRET_KEY
|
RECAPTCHA_SECRET_KEY=YOUR_API_SECRET_KEY
|
||||||
|
|
||||||
|
MAIL_MAILER=smtp
|
||||||
|
MAIL_HOST=mailhog
|
||||||
|
MAIL_PORT=1025
|
||||||
|
MAIL_USERNAME=null
|
||||||
|
MAIL_PASSWORD=null
|
||||||
|
MAIL_ENCRYPTION=null
|
||||||
|
MAIL_FROM_ADDRESS=null
|
||||||
|
MAIL_FROM_NAME="${APP_NAME}"
|
||||||
|
|
||||||
|
|
||||||
|
#you can leave everything below the way it is
|
||||||
|
LOG_CHANNEL=stack
|
||||||
|
LOG_LEVEL=debug
|
||||||
|
|
||||||
BROADCAST_DRIVER=log
|
BROADCAST_DRIVER=log
|
||||||
CACHE_DRIVER=file
|
CACHE_DRIVER=file
|
||||||
|
@ -46,15 +65,6 @@ REDIS_HOST=127.0.0.1
|
||||||
REDIS_PASSWORD=null
|
REDIS_PASSWORD=null
|
||||||
REDIS_PORT=6379
|
REDIS_PORT=6379
|
||||||
|
|
||||||
MAIL_MAILER=smtp
|
|
||||||
MAIL_HOST=mailhog
|
|
||||||
MAIL_PORT=1025
|
|
||||||
MAIL_USERNAME=null
|
|
||||||
MAIL_PASSWORD=null
|
|
||||||
MAIL_ENCRYPTION=null
|
|
||||||
MAIL_FROM_ADDRESS=null
|
|
||||||
MAIL_FROM_NAME="${APP_NAME}"
|
|
||||||
|
|
||||||
AWS_ACCESS_KEY_ID=
|
AWS_ACCESS_KEY_ID=
|
||||||
AWS_SECRET_ACCESS_KEY=
|
AWS_SECRET_ACCESS_KEY=
|
||||||
AWS_DEFAULT_REGION=us-east-1
|
AWS_DEFAULT_REGION=us-east-1
|
||||||
|
|
35
.github/workflows/run_tests.yml
vendored
35
.github/workflows/run_tests.yml
vendored
|
@ -1,35 +0,0 @@
|
||||||
name: Laravel
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches: [ main ]
|
|
||||||
pull_request:
|
|
||||||
branches: [ main ]
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
laravel-tests:
|
|
||||||
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- uses: shivammathur/setup-php@15c43e89cdef867065b0213be354c2841860869e
|
|
||||||
with:
|
|
||||||
php-version: '8.0'
|
|
||||||
- uses: actions/checkout@v2
|
|
||||||
- name: Copy .env
|
|
||||||
run: php -r "file_exists('.env') || copy('.env.dev', '.env');"
|
|
||||||
- name: Install Dependencies
|
|
||||||
run: composer install -q --no-ansi --no-interaction --no-scripts --no-progress --prefer-dist
|
|
||||||
- name: Generate key
|
|
||||||
run: php artisan key:generate
|
|
||||||
- name: Directory Permissions
|
|
||||||
run: chmod -R 777 storage bootstrap/cache
|
|
||||||
- name: Create Database
|
|
||||||
run: |
|
|
||||||
mkdir -p database
|
|
||||||
touch database/database.sqlite
|
|
||||||
- name: Execute tests (Unit and Feature tests) via PHPUnit
|
|
||||||
env:
|
|
||||||
DB_CONNECTION: sqlite
|
|
||||||
DB_DATABASE: database/database.sqlite
|
|
||||||
run: vendor/bin/phpunit
|
|
3
.gitignore
vendored
3
.gitignore
vendored
|
@ -13,3 +13,6 @@ Homestead.json
|
||||||
Homestead.yaml
|
Homestead.yaml
|
||||||
npm-debug.log
|
npm-debug.log
|
||||||
yarn-error.log
|
yarn-error.log
|
||||||
|
.gitignore
|
||||||
|
.env.dev
|
||||||
|
.env.testing
|
||||||
|
|
23
BUILDING.md
23
BUILDING.md
|
@ -1,6 +1,6 @@
|
||||||
# Building the development environment
|
# Building the development environment
|
||||||
|
|
||||||
cd into the project directory and run the following command: `sh bin/startdocker`
|
cd into the project directory and run the following command: `sh bin/startdocker.sh`
|
||||||
This should start building the images and start the containers.
|
This should start building the images and start the containers.
|
||||||
|
|
||||||
After that you need to go into the controlpanel_php container and run some commands:
|
After that you need to go into the controlpanel_php container and run some commands:
|
||||||
|
@ -9,8 +9,27 @@ Type `docker exec -it controlpanel_php ash` to go into the container and run the
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
composer install
|
composer install
|
||||||
cp .env.dev .env
|
cp .env.example .env
|
||||||
php artisan key:generate --force
|
php artisan key:generate --force
|
||||||
php artisan storage:link
|
php artisan storage:link
|
||||||
php artisan migrate --seed --force
|
php artisan migrate --seed --force
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Setting up testing environment
|
||||||
|
|
||||||
|
Create the .env.testing file to your needs. Then once done you need to go into your phpmyadmin to create a new database named __controlpanel_test__.
|
||||||
|
Visit http://127.0.0.1:8080/ and create your database.
|
||||||
|
|
||||||
|
Now you're ready to run the following commands which switches to the testing config, migrates the test database and seeds it.
|
||||||
|
After that you can switch back to your dev environment again. Clear the config from cache so changes will be instantly available.
|
||||||
|
|
||||||
|
```shell
|
||||||
|
php artisan key:generate --force --env=testing
|
||||||
|
php artisan migrate:fresh --seed --env=testing
|
||||||
|
```
|
||||||
|
|
||||||
|
Now when running tests with PHPUnit it will use your testing database and not your local development one.
|
||||||
|
This is configured in the __phpunit.xml__. You can run your tests by running the command like this. Just type and enter.
|
||||||
|
`php artisan test`.
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -118,6 +118,12 @@ command will setup the database tables and then add all of the Nests & Eggs that
|
||||||
php artisan migrate --seed --force
|
php artisan migrate --seed --force
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Add some example products
|
||||||
|
This step is optional, only run this once
|
||||||
|
``` bash
|
||||||
|
php artisan db:seed --class=ExampleItemsSeeder --force
|
||||||
|
```
|
||||||
|
|
||||||
### Add The First User
|
### Add The First User
|
||||||
``` bash
|
``` bash
|
||||||
php artisan make:user
|
php artisan make:user
|
||||||
|
|
|
@ -25,14 +25,17 @@ class Pterodactyl
|
||||||
])->baseUrl(env('PTERODACTYL_URL') . '/api');
|
])->baseUrl(env('PTERODACTYL_URL') . '/api');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//TODO: Extend error handling (maybe logger for more errors when debugging)
|
||||||
/**
|
/**
|
||||||
* Get user by pterodactyl id
|
* Get user by pterodactyl id
|
||||||
* @param int $pterodactylId
|
* @param int $pterodactylId
|
||||||
* @return mixed
|
* @return mixed
|
||||||
*/
|
*/
|
||||||
public static function getUser(int $pterodactylId){
|
public function getUser(int $pterodactylId){
|
||||||
$response = self::client()->get("/application/users/{$pterodactylId}");
|
$response = self::client()->get("/application/users/{$pterodactylId}");
|
||||||
if ($response->failed()) return null;
|
if ($response->failed()) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
return $response->json()['attributes'];
|
return $response->json()['attributes'];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -54,7 +54,6 @@ class ChargeCreditsCommand extends Command
|
||||||
$user = $server->user;
|
$user = $server->user;
|
||||||
$price = ($server->product->price / 30) / 24;
|
$price = ($server->product->price / 30) / 24;
|
||||||
|
|
||||||
|
|
||||||
//remove credits or suspend server
|
//remove credits or suspend server
|
||||||
if ($user->credits >= $price) {
|
if ($user->credits >= $price) {
|
||||||
$user->decrement('credits', $price);
|
$user->decrement('credits', $price);
|
||||||
|
|
|
@ -23,14 +23,17 @@ class MakeUserCommand extends Command
|
||||||
*/
|
*/
|
||||||
protected $description = 'Create an admin account with the Artisan Console';
|
protected $description = 'Create an admin account with the Artisan Console';
|
||||||
|
|
||||||
|
private Pterodactyl $pterodactyl;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a new command instance.
|
* Create a new command instance.
|
||||||
*
|
*
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function __construct()
|
public function __construct(Pterodactyl $pterodactyl)
|
||||||
{
|
{
|
||||||
parent::__construct();
|
parent::__construct();
|
||||||
|
$this->pterodactyl = $pterodactyl;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -44,17 +47,16 @@ class MakeUserCommand extends Command
|
||||||
$password = $this->option('password') ?? $this->ask('Please specify your password.');
|
$password = $this->option('password') ?? $this->ask('Please specify your password.');
|
||||||
|
|
||||||
if (strlen($password) < 8) {
|
if (strlen($password) < 8) {
|
||||||
print_r('Your password need to be at least 8 characters long');
|
$this->alert('Your password need to be at least 8 characters long');
|
||||||
|
return 0;
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
$response = Pterodactyl::getUser($ptero_id);
|
//TODO: Do something with response (check for status code and give hints based upon that)
|
||||||
|
$response = $this->pterodactyl->getUser($ptero_id);
|
||||||
|
|
||||||
if (is_null($response)) {
|
if ($response === []) {
|
||||||
print_r('It seems that your Pterodactyl ID isnt correct. Rerun the command and input an correct ID');
|
$this->alert('It seems that your Pterodactyl ID is not correct. Rerun the command and input an correct ID');
|
||||||
|
return 0;
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
$user = User::create([
|
$user = User::create([
|
||||||
|
@ -73,6 +75,6 @@ class MakeUserCommand extends Command
|
||||||
['Admin', $user->role],
|
['Admin', $user->role],
|
||||||
]);
|
]);
|
||||||
|
|
||||||
return true;
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,45 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
namespace App\Console\Commands;
|
|
||||||
|
|
||||||
use App\Models\User;
|
|
||||||
use Illuminate\Console\Command;
|
|
||||||
|
|
||||||
class sendEmailVerification extends Command
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* The name and signature of the console command.
|
|
||||||
*
|
|
||||||
* @var string
|
|
||||||
*/
|
|
||||||
protected $signature = 'email:send {user}';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The console command description.
|
|
||||||
*
|
|
||||||
* @var string
|
|
||||||
*/
|
|
||||||
protected $description = 'Command description';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create a new command instance.
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function __construct()
|
|
||||||
{
|
|
||||||
parent::__construct();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Execute the console command.
|
|
||||||
*
|
|
||||||
* @return int
|
|
||||||
*/
|
|
||||||
public function handle()
|
|
||||||
{
|
|
||||||
echo $this->argument('user');
|
|
||||||
User::find($this->argument('user'))->get()[0]->sendEmailVerificationNotification();
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
176
app/Console/Commands/update.php
Normal file
176
app/Console/Commands/update.php
Normal file
|
@ -0,0 +1,176 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Console\Commands;
|
||||||
|
|
||||||
|
use Illuminate\Console\Command;
|
||||||
|
use Closure;
|
||||||
|
use Symfony\Component\Process\Process;
|
||||||
|
use Symfony\Component\Console\Helper\ProgressBar;
|
||||||
|
|
||||||
|
class update extends Command
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* The name and signature of the console command.
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
protected $signature = 'update
|
||||||
|
{--user= : The user that PHP runs under. All files will be owned by this user.}
|
||||||
|
{--group= : The group that PHP runs under. All files will be owned by this group.}';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The console command description.
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
protected $description = 'Update your Dashboard to the latest version';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new command instance.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
parent::__construct();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Execute the console command.
|
||||||
|
*
|
||||||
|
* @return int
|
||||||
|
*/
|
||||||
|
public function handle()
|
||||||
|
{
|
||||||
|
$this->output->warning('This command does just pull the newest changes from the github repo. Verify the github repo before running this');
|
||||||
|
|
||||||
|
if (version_compare(PHP_VERSION, '8.0.0') < 0) {
|
||||||
|
$this->error('Cannot execute self-upgrade process. The minimum required PHP version required is 8.0.0, you have [' . PHP_VERSION . '].');
|
||||||
|
}
|
||||||
|
|
||||||
|
$user = 'www-data';
|
||||||
|
$group = 'www-data';
|
||||||
|
if ($this->input->isInteractive()) {
|
||||||
|
if (is_null($this->option('user'))) {
|
||||||
|
$userDetails = posix_getpwuid(fileowner('public'));
|
||||||
|
$user = $userDetails['name'] ?? 'www-data';
|
||||||
|
|
||||||
|
if (!$this->confirm("Your webserver user has been detected as [{$user}]: is this correct?", true)) {
|
||||||
|
$user = $this->anticipate(
|
||||||
|
'Please enter the name of the user running your webserver process. This varies from system to system, but is generally "www-data", "nginx", or "apache".',
|
||||||
|
[
|
||||||
|
'www-data',
|
||||||
|
'nginx',
|
||||||
|
'apache',
|
||||||
|
]
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (is_null($this->option('group'))) {
|
||||||
|
$groupDetails = posix_getgrgid(filegroup('public'));
|
||||||
|
$group = $groupDetails['name'] ?? 'www-data';
|
||||||
|
|
||||||
|
if (!$this->confirm("Your webserver group has been detected as [{$group}]: is this correct?", true)) {
|
||||||
|
$group = $this->anticipate(
|
||||||
|
'Please enter the name of the group running your webserver process. Normally this is the same as your user.',
|
||||||
|
[
|
||||||
|
'www-data',
|
||||||
|
'nginx',
|
||||||
|
'apache',
|
||||||
|
]
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ini_set('output_buffering', 0);
|
||||||
|
|
||||||
|
if (!$this->confirm('Are you sure you want to run the upgrade process for your Dashboard?')) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
$bar = $this->output->createProgressBar(9);
|
||||||
|
$bar->start();
|
||||||
|
|
||||||
|
|
||||||
|
$this->withProgress($bar, function () {
|
||||||
|
$this->line("\$upgrader> git pull");
|
||||||
|
$process = Process::fromShellCommandline("git pull");
|
||||||
|
$process->run(function ($type, $buffer) {
|
||||||
|
$this->{$type === Process::ERR ? 'error' : 'line'}($buffer);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
$this->withProgress($bar, function () {
|
||||||
|
$this->line('$upgrader> php artisan down');
|
||||||
|
$this->call('down');
|
||||||
|
});
|
||||||
|
|
||||||
|
$this->withProgress($bar, function () {
|
||||||
|
$this->line('$upgrader> chmod -R 755 storage bootstrap/cache');
|
||||||
|
$process = new Process(['chmod', '-R', '755', 'storage', 'bootstrap/cache']);
|
||||||
|
$process->run(function ($type, $buffer) {
|
||||||
|
$this->{$type === Process::ERR ? 'error' : 'line'}($buffer);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
$this->withProgress($bar, function () {
|
||||||
|
$command = ['composer', 'install', '--no-ansi'];
|
||||||
|
if (config('app.env') === 'production' && !config('app.debug')) {
|
||||||
|
$command[] = '--optimize-autoloader';
|
||||||
|
$command[] = '--no-dev';
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->line('$upgrader> ' . implode(' ', $command));
|
||||||
|
$process = new Process($command);
|
||||||
|
$process->setTimeout(10 * 60);
|
||||||
|
$process->run(function ($type, $buffer) {
|
||||||
|
$this->line($buffer);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
$this->withProgress($bar, function () {
|
||||||
|
$this->line('$upgrader> php artisan view:clear');
|
||||||
|
$this->call('view:clear');
|
||||||
|
});
|
||||||
|
|
||||||
|
$this->withProgress($bar, function () {
|
||||||
|
$this->line('$upgrader> php artisan config:clear');
|
||||||
|
$this->call('config:clear');
|
||||||
|
});
|
||||||
|
|
||||||
|
$this->withProgress($bar, function () {
|
||||||
|
$this->line('$upgrader> php artisan migrate --force');
|
||||||
|
$this->call('migrate', ['--force' => '']);
|
||||||
|
});
|
||||||
|
|
||||||
|
$this->withProgress($bar, function () use ($user, $group) {
|
||||||
|
$this->line("\$upgrader> chown -R {$user}:{$group} *");
|
||||||
|
$process = Process::fromShellCommandline("chown -R {$user}:{$group} *", $this->getLaravel()->basePath());
|
||||||
|
$process->setTimeout(10 * 60);
|
||||||
|
$process->run(function ($type, $buffer) {
|
||||||
|
$this->{$type === Process::ERR ? 'error' : 'line'}($buffer);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
$this->withProgress($bar, function () {
|
||||||
|
$this->line('$upgrader> php artisan up');
|
||||||
|
$this->call('up');
|
||||||
|
});
|
||||||
|
|
||||||
|
$this->newLine();
|
||||||
|
$this->info('Finished running upgrade.');
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
protected function withProgress(ProgressBar $bar, Closure $callback)
|
||||||
|
{
|
||||||
|
$bar->clear();
|
||||||
|
$callback();
|
||||||
|
$bar->advance();
|
||||||
|
$bar->display();
|
||||||
|
}
|
||||||
|
}
|
137
app/Http/Controllers/Admin/UsefulLinkController.php
Normal file
137
app/Http/Controllers/Admin/UsefulLinkController.php
Normal file
|
@ -0,0 +1,137 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Http\Controllers\Admin;
|
||||||
|
|
||||||
|
use App\Http\Controllers\Controller;
|
||||||
|
use App\Models\UsefulLink;
|
||||||
|
use Illuminate\Contracts\Foundation\Application;
|
||||||
|
use Illuminate\Contracts\View\Factory;
|
||||||
|
use Illuminate\Contracts\View\View;
|
||||||
|
use Illuminate\Http\RedirectResponse;
|
||||||
|
use Illuminate\Http\Request;
|
||||||
|
use Illuminate\Http\Response;
|
||||||
|
|
||||||
|
class UsefulLinkController extends Controller
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Display a listing of the resource.
|
||||||
|
*
|
||||||
|
* @return Application|Factory|View|Response
|
||||||
|
*/
|
||||||
|
public function index()
|
||||||
|
{
|
||||||
|
return view('admin.usefullinks.index');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Show the form for creating a new resource.
|
||||||
|
*
|
||||||
|
* @return Application|Factory|View|Response
|
||||||
|
*/
|
||||||
|
public function create()
|
||||||
|
{
|
||||||
|
return view('admin.usefullinks.create');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Store a newly created resource in storage.
|
||||||
|
*
|
||||||
|
* @param Request $request
|
||||||
|
* @return RedirectResponse
|
||||||
|
*/
|
||||||
|
public function store(Request $request)
|
||||||
|
{
|
||||||
|
|
||||||
|
$request->validate([
|
||||||
|
'icon' => 'required|string',
|
||||||
|
'title' => 'required|string|max:60',
|
||||||
|
'link' => 'required|url|string|max:191',
|
||||||
|
'description' => 'required|string|max:2000',
|
||||||
|
]);
|
||||||
|
|
||||||
|
UsefulLink::create($request->all());
|
||||||
|
return redirect()->route('admin.usefullinks.index')->with('success', 'link has been created!');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Display the specified resource.
|
||||||
|
*
|
||||||
|
* @param UsefulLink $usefullink
|
||||||
|
* @return Response
|
||||||
|
*/
|
||||||
|
public function show(UsefulLink $usefullink)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Show the form for editing the specified resource.
|
||||||
|
*
|
||||||
|
* @param UsefulLink $usefullink
|
||||||
|
* @return Application|Factory|View
|
||||||
|
*/
|
||||||
|
public function edit(UsefulLink $usefullink)
|
||||||
|
{
|
||||||
|
return view('admin.usefullinks.edit' , [
|
||||||
|
'link' => $usefullink
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update the specified resource in storage.
|
||||||
|
*
|
||||||
|
* @param Request $request
|
||||||
|
* @param UsefulLink $usefullink
|
||||||
|
* @return RedirectResponse
|
||||||
|
*/
|
||||||
|
public function update(Request $request, UsefulLink $usefullink)
|
||||||
|
{
|
||||||
|
$request->validate([
|
||||||
|
'icon' => 'required|string',
|
||||||
|
'title' => 'required|string|max:60',
|
||||||
|
'link' => 'required|url|string|max:191',
|
||||||
|
'description' => 'required|string|max:2000',
|
||||||
|
]);
|
||||||
|
|
||||||
|
$usefullink->update($request->all());
|
||||||
|
return redirect()->route('admin.usefullinks.index')->with('success', 'link has been updated!');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove the specified resource from storage.
|
||||||
|
*
|
||||||
|
* @param UsefulLink $usefullink
|
||||||
|
* @return Response
|
||||||
|
*/
|
||||||
|
public function destroy(UsefulLink $usefullink)
|
||||||
|
{
|
||||||
|
$usefullink->delete();
|
||||||
|
return redirect()->back()->with('success', 'product has been removed!');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function dataTable()
|
||||||
|
{
|
||||||
|
$query = UsefulLink::query();
|
||||||
|
|
||||||
|
return datatables($query)
|
||||||
|
->addColumn('actions', function (UsefulLink $link) {
|
||||||
|
return '
|
||||||
|
<a data-content="Edit" data-toggle="popover" data-trigger="hover" data-placement="top" href="' . route('admin.usefullinks.edit', $link->id) . '" class="btn btn-sm btn-info mr-1"><i class="fas fa-pen"></i></a>
|
||||||
|
|
||||||
|
<form class="d-inline" onsubmit="return submitResult();" method="post" action="' . route('admin.usefullinks.destroy', $link->id) . '">
|
||||||
|
' . csrf_field() . '
|
||||||
|
' . method_field("DELETE") . '
|
||||||
|
<button data-content="Delete" data-toggle="popover" data-trigger="hover" data-placement="top" class="btn btn-sm btn-danger mr-1"><i class="fas fa-trash"></i></button>
|
||||||
|
</form>
|
||||||
|
';
|
||||||
|
})
|
||||||
|
->editColumn('created_at', function (UsefulLink $link) {
|
||||||
|
return $link->created_at ? $link->created_at->diffForHumans() : '';
|
||||||
|
})
|
||||||
|
->editColumn('icon', function (UsefulLink $link) {
|
||||||
|
return "<i class='{$link->icon}'></i>";
|
||||||
|
})
|
||||||
|
->rawColumns(['actions' , 'icon'])
|
||||||
|
->make();
|
||||||
|
}
|
||||||
|
}
|
|
@ -13,11 +13,19 @@ use Illuminate\Http\RedirectResponse;
|
||||||
use Illuminate\Http\Request;
|
use Illuminate\Http\Request;
|
||||||
use Illuminate\Http\Response;
|
use Illuminate\Http\Response;
|
||||||
use Illuminate\Support\Facades\Auth;
|
use Illuminate\Support\Facades\Auth;
|
||||||
|
use Illuminate\Support\Facades\Hash;
|
||||||
use Illuminate\Validation\Rule;
|
use Illuminate\Validation\Rule;
|
||||||
use Illuminate\Validation\ValidationException;
|
use Illuminate\Validation\ValidationException;
|
||||||
|
|
||||||
class UserController extends Controller
|
class UserController extends Controller
|
||||||
{
|
{
|
||||||
|
private Pterodactyl $pterodactyl;
|
||||||
|
|
||||||
|
public function __construct(Pterodactyl $pterodactyl)
|
||||||
|
{
|
||||||
|
$this->pterodactyl = $pterodactyl;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Display a listing of the resource.
|
* Display a listing of the resource.
|
||||||
*
|
*
|
||||||
|
@ -29,27 +37,6 @@ class UserController extends Controller
|
||||||
return view('admin.users.index');
|
return view('admin.users.index');
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Show the form for creating a new resource.
|
|
||||||
*
|
|
||||||
* @return Response
|
|
||||||
*/
|
|
||||||
public function create()
|
|
||||||
{
|
|
||||||
//
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Store a newly created resource in storage.
|
|
||||||
*
|
|
||||||
* @param Request $request
|
|
||||||
* @return Response
|
|
||||||
*/
|
|
||||||
public function store(Request $request)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Display the specified resource.
|
* Display the specified resource.
|
||||||
*
|
*
|
||||||
|
@ -86,21 +73,34 @@ class UserController extends Controller
|
||||||
*/
|
*/
|
||||||
public function update(Request $request, User $user)
|
public function update(Request $request, User $user)
|
||||||
{
|
{
|
||||||
|
|
||||||
$request->validate([
|
$request->validate([
|
||||||
"name" => "required|string|min:4|max:30",
|
"name" => "required|string|min:4|max:30",
|
||||||
"pterodactyl_id" => "required|numeric|unique:users,pterodactyl_id,{$user->pterodactyl_id}",
|
"pterodactyl_id" => "required|numeric|unique:users,pterodactyl_id,{$user->id}",
|
||||||
"email" => "required|string|email",
|
"email" => "required|string|email",
|
||||||
"credits" => "required|numeric|min:0|max:1000000",
|
"credits" => "required|numeric|min:0|max:1000000",
|
||||||
"server_limit" => "required|numeric|min:0|max:1000000",
|
"server_limit" => "required|numeric|min:0|max:1000000",
|
||||||
"role" => Rule::in(['admin', 'mod', 'client', 'member']),
|
"role" => Rule::in(['admin', 'mod', 'client', 'member']),
|
||||||
]);
|
]);
|
||||||
|
|
||||||
if (is_null(Pterodactyl::getUser($request->input('pterodactyl_id')))) {
|
if (empty($this->pterodactyl->getUser($request->input('pterodactyl_id')))) {
|
||||||
throw ValidationException::withMessages([
|
throw ValidationException::withMessages([
|
||||||
'pterodactyl_id' => ["User does not exists on pterodactyl's panel"]
|
'pterodactyl_id' => ["User does not exists on pterodactyl's panel"]
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (!is_null($request->input('new_password'))) {
|
||||||
|
$request->validate([
|
||||||
|
'new_password' => 'required|string|min:8',
|
||||||
|
'new_password_confirmation' => 'required|same:new_password'
|
||||||
|
]);
|
||||||
|
|
||||||
|
$user->update([
|
||||||
|
'password' => Hash::make($request->input('new_password')),
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
$user->update($request->all());
|
$user->update($request->all());
|
||||||
|
|
||||||
return redirect()->route('admin.users.index')->with('success', 'User updated!');
|
return redirect()->route('admin.users.index')->with('success', 'User updated!');
|
||||||
|
@ -142,19 +142,6 @@ class UserController extends Controller
|
||||||
return redirect()->route('admin.users.index');
|
return redirect()->route('admin.users.index');
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @param User $user
|
|
||||||
* @return RedirectResponse
|
|
||||||
*/
|
|
||||||
public function reSendVerificationEmail(User $user)
|
|
||||||
{
|
|
||||||
if ($user->hasVerifiedEmail())
|
|
||||||
return redirect()->back()->with('error', 'User has already verified their email');
|
|
||||||
|
|
||||||
$user->sendEmailVerificationNotification();
|
|
||||||
return redirect()->back()->with('success', 'User has been emailed again!');
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @throws Exception
|
* @throws Exception
|
||||||
|
@ -187,7 +174,6 @@ class UserController extends Controller
|
||||||
})
|
})
|
||||||
->addColumn('actions', function (User $user) {
|
->addColumn('actions', function (User $user) {
|
||||||
return '
|
return '
|
||||||
<a data-content="Resend verification" data-toggle="popover" data-trigger="hover" data-placement="top" href="' . route('admin.users.reSendVerificationEmail', $user->id) . '" class="btn btn-sm text-white btn-light mr-1"><i class="far fa-envelope"></i></a>
|
|
||||||
<a data-content="Login as user" data-toggle="popover" data-trigger="hover" data-placement="top" href="' . route('admin.users.loginas', $user->id) . '" class="btn btn-sm btn-primary mr-1"><i class="fas fa-sign-in-alt"></i></a>
|
<a data-content="Login as user" data-toggle="popover" data-trigger="hover" data-placement="top" href="' . route('admin.users.loginas', $user->id) . '" class="btn btn-sm btn-primary mr-1"><i class="fas fa-sign-in-alt"></i></a>
|
||||||
<a data-content="Show" data-toggle="popover" data-trigger="hover" data-placement="top" href="' . route('admin.users.show', $user->id) . '" class="btn btn-sm text-white btn-warning mr-1"><i class="fas fa-eye"></i></a>
|
<a data-content="Show" data-toggle="popover" data-trigger="hover" data-placement="top" href="' . route('admin.users.show', $user->id) . '" class="btn btn-sm text-white btn-warning mr-1"><i class="fas fa-eye"></i></a>
|
||||||
<a data-content="Edit" data-toggle="popover" data-trigger="hover" data-placement="top" href="' . route('admin.users.edit', $user->id) . '" class="btn btn-sm btn-info mr-1"><i class="fas fa-pen"></i></a>
|
<a data-content="Edit" data-toggle="popover" data-trigger="hover" data-placement="top" href="' . route('admin.users.edit', $user->id) . '" class="btn btn-sm btn-info mr-1"><i class="fas fa-pen"></i></a>
|
||||||
|
@ -216,10 +202,13 @@ class UserController extends Controller
|
||||||
|
|
||||||
return '<span class="badge ' . $badgeColor . '">' . $user->role . '</span>';
|
return '<span class="badge ' . $badgeColor . '">' . $user->role . '</span>';
|
||||||
})
|
})
|
||||||
|
->editColumn('name', function (User $user) {
|
||||||
|
return '<a class="text-info" target="_blank" href="' . env('PTERODACTYL_URL', 'http://localhost') . '/admin/users/view/' . $user->pterodactyl_id . '">' . $user->name . '</a>';
|
||||||
|
})
|
||||||
->orderColumn('last_seen', function ($query, $order) {
|
->orderColumn('last_seen', function ($query, $order) {
|
||||||
$query->orderBy('last_seen', $order);
|
$query->orderBy('last_seen', $order);
|
||||||
})
|
})
|
||||||
->rawColumns(['avatar', 'credits', 'role', 'usage', 'actions', 'last_seen'])
|
->rawColumns(['avatar', 'name', 'credits', 'role', 'usage', 'actions', 'last_seen'])
|
||||||
->make(true);
|
->make(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,49 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
namespace App\Http\Controllers\Api;
|
|
||||||
|
|
||||||
use App\Http\Controllers\Controller;
|
|
||||||
use App\Models\Configuration;
|
|
||||||
use App\Models\DiscordUser;
|
|
||||||
use Illuminate\Http\JsonResponse;
|
|
||||||
use Illuminate\Http\Request;
|
|
||||||
use Illuminate\Validation\ValidationException;
|
|
||||||
|
|
||||||
class VerifyController extends Controller
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* @param Request $request
|
|
||||||
* @return JsonResponse
|
|
||||||
* @throws ValidationException
|
|
||||||
*/
|
|
||||||
public function verify(Request $request){
|
|
||||||
$request->validate([
|
|
||||||
'user_id' => 'required|exists:discord_users,id'
|
|
||||||
] , [
|
|
||||||
'exists' => "You have not linked your account to our site"
|
|
||||||
]);
|
|
||||||
|
|
||||||
$discordUser = DiscordUser::findOrFail($request->input('user_id'));
|
|
||||||
|
|
||||||
if(is_null($discordUser->user)){
|
|
||||||
throw ValidationException::withMessages([
|
|
||||||
'user_id' => ['User does not exist']
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!is_null($discordUser->user->discord_verified_at)) {
|
|
||||||
throw ValidationException::withMessages([
|
|
||||||
'user_id' => ['Already verified!']
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
|
|
||||||
$discordUser->user->update([
|
|
||||||
'discord_verified_at' => now()
|
|
||||||
]);
|
|
||||||
|
|
||||||
$discordUser->user->increment('credits' , Configuration::getValueByKey('CREDITS_REWARD_AFTER_VERIFY_DISCORD'));
|
|
||||||
$discordUser->user->increment('server_limit' , Configuration::getValueByKey('SERVER_LIMIT_REWARD_AFTER_VERIFY_DISCORD'));
|
|
||||||
|
|
||||||
return response()->json($discordUser , 200);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -3,28 +3,74 @@
|
||||||
namespace App\Http\Controllers\Auth;
|
namespace App\Http\Controllers\Auth;
|
||||||
|
|
||||||
use App\Http\Controllers\Controller;
|
use App\Http\Controllers\Controller;
|
||||||
|
use App\Models\Configuration;
|
||||||
use App\Models\DiscordUser;
|
use App\Models\DiscordUser;
|
||||||
use Illuminate\Support\Facades\Auth;
|
use Illuminate\Support\Facades\Auth;
|
||||||
|
use Illuminate\Support\Facades\Http;
|
||||||
use Laravel\Socialite\Facades\Socialite;
|
use Laravel\Socialite\Facades\Socialite;
|
||||||
|
|
||||||
class SocialiteController extends Controller
|
class SocialiteController extends Controller
|
||||||
{
|
{
|
||||||
public function redirect()
|
public function redirect()
|
||||||
{
|
{
|
||||||
return Socialite::driver('discord')->redirect();
|
$scopes = !empty(env('DISCORD_BOT_TOKEN')) && !empty(env('DISCORD_GUILD_ID')) ? ['guilds.join'] : [];
|
||||||
|
|
||||||
|
return Socialite::driver('discord')
|
||||||
|
->scopes($scopes)
|
||||||
|
->redirect();
|
||||||
}
|
}
|
||||||
|
|
||||||
public function callback()
|
public function callback()
|
||||||
{
|
{
|
||||||
if (Auth::guest()) return abort(500);
|
if (Auth::guest()) {
|
||||||
|
return abort(500);
|
||||||
|
}
|
||||||
|
|
||||||
$discord = Socialite::driver('discord')->user();
|
$discord = Socialite::driver('discord')->user();
|
||||||
$discordUser = DiscordUser::find($discord->id);
|
$discordUser = DiscordUser::find($discord->id);
|
||||||
|
|
||||||
if (is_null($discordUser)) DiscordUser::create(array_merge($discord->user, ['user_id' => Auth::user()->id]));
|
$botToken = env('DISCORD_BOT_TOKEN');
|
||||||
else $discordUser->update($discord->user);
|
$guildId = env('DISCORD_GUILD_ID');
|
||||||
|
$roleId = env('DISCORD_ROLE_ID');
|
||||||
|
|
||||||
|
//force user into discord server
|
||||||
|
//TODO Add event on failure, to notify ppl involved
|
||||||
|
if (!empty($guildId) && !empty($botToken)) {
|
||||||
|
$response = Http::withHeaders(
|
||||||
|
[
|
||||||
|
'Authorization' => 'Bot ' . $botToken,
|
||||||
|
'Content-Type' => 'application/json',
|
||||||
|
]
|
||||||
|
)->put("https://discord.com/api/guilds/{$guildId}/members/{$discord->id}",
|
||||||
|
['access_token' => $discord->token]);
|
||||||
|
|
||||||
|
//give user a role in the discord server
|
||||||
|
if (!empty($roleId)){
|
||||||
|
$response = Http::withHeaders(
|
||||||
|
[
|
||||||
|
'Authorization' => 'Bot ' . $botToken,
|
||||||
|
'Content-Type' => 'application/json',
|
||||||
|
]
|
||||||
|
)->put("https://discord.com/api/guilds/{$guildId}/members/{$discord->id}/roles/{$roleId}",
|
||||||
|
['access_token' => $discord->token]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
return redirect()->route('profile.index')->with('success', 'Discord account linked!');
|
if (is_null($discordUser)) {
|
||||||
|
//create discord user in db
|
||||||
|
DiscordUser::create(array_merge($discord->user, ['user_id' => Auth::user()->id]));
|
||||||
|
//update user
|
||||||
|
Auth::user()->increment('credits', Configuration::getValueByKey('CREDITS_REWARD_AFTER_VERIFY_DISCORD'));
|
||||||
|
Auth::user()->increment('server_limit', Configuration::getValueByKey('SERVER_LIMIT_REWARD_AFTER_VERIFY_DISCORD'));
|
||||||
|
Auth::user()->update(['discord_verified_at' => now()]);
|
||||||
|
} else {
|
||||||
|
$discordUser->update($discord->user);
|
||||||
|
}
|
||||||
|
|
||||||
|
return redirect()->route('profile.index')->with(
|
||||||
|
'success',
|
||||||
|
'Discord account linked!'
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,9 +2,11 @@
|
||||||
|
|
||||||
namespace App\Http\Controllers;
|
namespace App\Http\Controllers;
|
||||||
|
|
||||||
|
use App\Models\UsefulLink;
|
||||||
use Illuminate\Contracts\Support\Renderable;
|
use Illuminate\Contracts\Support\Renderable;
|
||||||
use Illuminate\Http\Request;
|
use Illuminate\Http\Request;
|
||||||
use Illuminate\Support\Facades\Auth;
|
use Illuminate\Support\Facades\Auth;
|
||||||
|
use Illuminate\Support\Facades\DB;
|
||||||
|
|
||||||
class HomeController extends Controller
|
class HomeController extends Controller
|
||||||
{
|
{
|
||||||
|
@ -19,14 +21,17 @@ class HomeController extends Controller
|
||||||
//set cookie as extra layer of defense against users that make multiple accounts
|
//set cookie as extra layer of defense against users that make multiple accounts
|
||||||
setcookie('4b3403665fea6' , base64_encode(1) , time() + (20 * 365 * 24 * 60 * 60));
|
setcookie('4b3403665fea6' , base64_encode(1) , time() + (20 * 365 * 24 * 60 * 60));
|
||||||
|
|
||||||
$useage = 0;
|
$usage = 0;
|
||||||
|
|
||||||
foreach (Auth::user()->Servers as $server){
|
foreach (Auth::user()->Servers as $server){
|
||||||
$useage += $server->product->price;
|
$usage += $server->product->price;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$useful_links = DB::table('useful_links')->get();
|
||||||
|
|
||||||
return view('home')->with([
|
return view('home')->with([
|
||||||
'useage' => $useage
|
'useage' => $usage,
|
||||||
|
'useful_links' => $useful_links
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,7 +24,11 @@ class ProfileController extends Controller
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Update the specified resource in storage. */
|
/** Update the specified resource in storage.
|
||||||
|
* @param Request $request
|
||||||
|
* @param int $id
|
||||||
|
* @return RedirectResponse
|
||||||
|
*/
|
||||||
public function update(Request $request, int $id)
|
public function update(Request $request, int $id)
|
||||||
{
|
{
|
||||||
//prevent other users from editing a user
|
//prevent other users from editing a user
|
||||||
|
|
|
@ -17,8 +17,11 @@ class ApiAuthToken
|
||||||
*/
|
*/
|
||||||
public function handle(Request $request, Closure $next)
|
public function handle(Request $request, Closure $next)
|
||||||
{
|
{
|
||||||
|
if (empty($request->bearerToken())) return response()->json(['message' => 'Missing Authorization header'], 403);
|
||||||
|
|
||||||
$token = ApplicationApi::find($request->bearerToken());
|
$token = ApplicationApi::find($request->bearerToken());
|
||||||
if (is_null($token)) return response()->json(['message' => 'Invalid Authorization token'], 401);
|
if (is_null($token)) return response()->json(['message' => 'Invalid Authorization token'], 401);
|
||||||
|
|
||||||
$token->updateLastUsed();
|
$token->updateLastUsed();
|
||||||
return $next($request);
|
return $next($request);
|
||||||
}
|
}
|
||||||
|
|
20
app/Models/UsefulLink.php
Normal file
20
app/Models/UsefulLink.php
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Models;
|
||||||
|
|
||||||
|
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||||
|
use Illuminate\Database\Eloquent\Model;
|
||||||
|
|
||||||
|
class UsefulLink extends Model
|
||||||
|
{
|
||||||
|
use HasFactory;
|
||||||
|
|
||||||
|
protected $table = 'useful_links';
|
||||||
|
|
||||||
|
protected $fillable = [
|
||||||
|
'icon',
|
||||||
|
'title',
|
||||||
|
'link',
|
||||||
|
'description'
|
||||||
|
];
|
||||||
|
}
|
|
@ -1,2 +1,2 @@
|
||||||
docker-compose -f docker/docker-compose.yml down
|
docker-compose -f docker/docker-compose.yml down
|
||||||
docker-compose -f docker/docker-compose.yml up -d --force-recreate
|
docker-compose -f docker/docker-compose.yml up -d --force-recreate --remove-orphans
|
||||||
|
|
1
bin/test.sh
Executable file
1
bin/test.sh
Executable file
|
@ -0,0 +1 @@
|
||||||
|
./vendor/bin/phpunit
|
|
@ -33,7 +33,7 @@ return [
|
||||||
'discord' => [
|
'discord' => [
|
||||||
'client_id' => env('DISCORD_CLIENT_ID'),
|
'client_id' => env('DISCORD_CLIENT_ID'),
|
||||||
'client_secret' => env('DISCORD_CLIENT_SECRET'),
|
'client_secret' => env('DISCORD_CLIENT_SECRET'),
|
||||||
'redirect' => env('DISCORD_REDIRECT_URI'),
|
'redirect' => env('APP_URL' , 'http://localhost') . "/auth/callback",
|
||||||
|
|
||||||
// optional
|
// optional
|
||||||
'allow_gif_avatars' => (bool)env('DISCORD_AVATAR_GIF', true),
|
'allow_gif_avatars' => (bool)env('DISCORD_AVATAR_GIF', true),
|
||||||
|
|
|
@ -22,7 +22,7 @@ class ApplicationApiFactory extends Factory
|
||||||
public function definition()
|
public function definition()
|
||||||
{
|
{
|
||||||
return [
|
return [
|
||||||
//
|
'memo' => $this->faker->word()
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
31
database/factories/UsefulLinkFactory.php
Normal file
31
database/factories/UsefulLinkFactory.php
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Database\Factories;
|
||||||
|
|
||||||
|
use App\Models\UsefulLink;
|
||||||
|
use Illuminate\Database\Eloquent\Factories\Factory;
|
||||||
|
|
||||||
|
class UsefulLinkFactory extends Factory
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* The name of the factory's corresponding model.
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
protected $model = UsefulLink::class;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Define the model's default state.
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function definition()
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'icon' => 'fas fa-user',
|
||||||
|
'title' => $this->faker->text(30),
|
||||||
|
'link' => $this->faker->url,
|
||||||
|
'description' => $this->faker->text,
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,36 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
use Illuminate\Database\Migrations\Migration;
|
||||||
|
use Illuminate\Database\Schema\Blueprint;
|
||||||
|
use Illuminate\Support\Facades\DB;
|
||||||
|
use Illuminate\Support\Facades\Schema;
|
||||||
|
|
||||||
|
class CreateUsefulLinksTable extends Migration
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Run the migrations.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function up()
|
||||||
|
{
|
||||||
|
Schema::create('useful_links', function (Blueprint $table) {
|
||||||
|
$table->id();
|
||||||
|
$table->string('icon');
|
||||||
|
$table->string('title');
|
||||||
|
$table->string('link')->nullable();
|
||||||
|
$table->text('description');
|
||||||
|
$table->timestamps();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reverse the migrations.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function down()
|
||||||
|
{
|
||||||
|
Schema::dropIfExists('useful_links');
|
||||||
|
}
|
||||||
|
}
|
21
database/seeders/ApplicationApiSeeder.php
Normal file
21
database/seeders/ApplicationApiSeeder.php
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Database\Seeders;
|
||||||
|
|
||||||
|
use App\Models\ApplicationApi;
|
||||||
|
use Illuminate\Database\Seeder;
|
||||||
|
|
||||||
|
class ApplicationApiSeeder extends Seeder
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Run the database seeds.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function run()
|
||||||
|
{
|
||||||
|
ApplicationApi::create([
|
||||||
|
'memo' => 'admin'
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
|
@ -15,53 +15,54 @@ class ConfigurationSeeder extends Seeder
|
||||||
public function run()
|
public function run()
|
||||||
{
|
{
|
||||||
//initials
|
//initials
|
||||||
Configuration::create([
|
Configuration::firstOrCreate([
|
||||||
'key' => 'INITIAL_CREDITS',
|
'key' => 'INITIAL_CREDITS',
|
||||||
|
], [
|
||||||
'value' => '250',
|
'value' => '250',
|
||||||
'type' => 'integer',
|
'type' => 'integer',
|
||||||
]);
|
]);
|
||||||
|
|
||||||
Configuration::create([
|
Configuration::firstOrCreate([
|
||||||
'key' => 'INITIAL_SERVER_LIMIT',
|
'key' => 'INITIAL_SERVER_LIMIT',
|
||||||
|
], [
|
||||||
'value' => '1',
|
'value' => '1',
|
||||||
'type' => 'integer',
|
'type' => 'integer',
|
||||||
]);
|
]);
|
||||||
|
|
||||||
//verify email event
|
//verify email event
|
||||||
Configuration::create([
|
Configuration::firstOrCreate([
|
||||||
'key' => 'CREDITS_REWARD_AFTER_VERIFY_EMAIL',
|
'key' => 'CREDITS_REWARD_AFTER_VERIFY_EMAIL',
|
||||||
|
], [
|
||||||
'value' => '250',
|
'value' => '250',
|
||||||
'type' => 'integer',
|
'type' => 'integer',
|
||||||
]);
|
]);
|
||||||
|
|
||||||
Configuration::create([
|
Configuration::firstOrCreate([
|
||||||
'key' => 'SERVER_LIMIT_REWARD_AFTER_VERIFY_EMAIL',
|
'key' => 'SERVER_LIMIT_REWARD_AFTER_VERIFY_EMAIL',
|
||||||
|
], [
|
||||||
'value' => '2',
|
'value' => '2',
|
||||||
'type' => 'integer',
|
'type' => 'integer',
|
||||||
]);
|
]);
|
||||||
|
|
||||||
//verify discord event
|
//verify discord event
|
||||||
Configuration::create([
|
Configuration::firstOrCreate([
|
||||||
'key' => 'CREDITS_REWARD_AFTER_VERIFY_DISCORD',
|
'key' => 'CREDITS_REWARD_AFTER_VERIFY_DISCORD',
|
||||||
|
] , [
|
||||||
'value' => '375',
|
'value' => '375',
|
||||||
'type' => 'integer',
|
'type' => 'integer',
|
||||||
]);
|
]);
|
||||||
|
|
||||||
Configuration::create([
|
Configuration::firstOrCreate([
|
||||||
'key' => 'SERVER_LIMIT_REWARD_AFTER_VERIFY_DISCORD',
|
'key' => 'SERVER_LIMIT_REWARD_AFTER_VERIFY_DISCORD',
|
||||||
|
], [
|
||||||
'value' => '2',
|
'value' => '2',
|
||||||
'type' => 'integer',
|
'type' => 'integer',
|
||||||
]);
|
]);
|
||||||
|
|
||||||
Configuration::create([
|
|
||||||
'key' => 'DISCORD_VERIFY_COMMAND',
|
|
||||||
'value' => '!verify',
|
|
||||||
'type' => 'string',
|
|
||||||
]);
|
|
||||||
|
|
||||||
//other
|
//other
|
||||||
Configuration::create([
|
Configuration::firstOrCreate([
|
||||||
'key' => 'MINIMUM_REQUIRED_CREDITS_TO_MAKE_SERVER',
|
'key' => 'MINIMUM_REQUIRED_CREDITS_TO_MAKE_SERVER',
|
||||||
|
], [
|
||||||
'value' => '50',
|
'value' => '50',
|
||||||
'type' => 'integer',
|
'type' => 'integer',
|
||||||
]);
|
]);
|
||||||
|
|
|
@ -15,8 +15,6 @@ class DatabaseSeeder extends Seeder
|
||||||
{
|
{
|
||||||
$this->call([
|
$this->call([
|
||||||
ConfigurationSeeder::class,
|
ConfigurationSeeder::class,
|
||||||
ProductSeeder::class,
|
|
||||||
PaypalProductSeeder::class,
|
|
||||||
]);
|
]);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
24
database/seeders/ExampleItemsSeeder.php
Normal file
24
database/seeders/ExampleItemsSeeder.php
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Database\Seeders;
|
||||||
|
|
||||||
|
use Illuminate\Database\Seeder;
|
||||||
|
|
||||||
|
class ExampleItemsSeeder extends Seeder
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Seed the application's database.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function run()
|
||||||
|
{
|
||||||
|
$this->call([
|
||||||
|
ProductSeeder::class,
|
||||||
|
PaypalProductSeeder::class,
|
||||||
|
ApplicationApiSeeder::class,
|
||||||
|
UsefulLinksSeeder::class
|
||||||
|
]);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
|
@ -16,7 +16,7 @@ class ProductSeeder extends Seeder
|
||||||
{
|
{
|
||||||
Product::create([
|
Product::create([
|
||||||
'name' => 'Starter',
|
'name' => 'Starter',
|
||||||
'description' => '64MB Ram, 1GB Disk, 1 Database, 140 credits p/m',
|
'description' => '64MB Ram, 1GB Disk, 1 Database, 140 credits monthly',
|
||||||
'price' => 140,
|
'price' => 140,
|
||||||
'memory' => 64,
|
'memory' => 64,
|
||||||
'disk' => 1000,
|
'disk' => 1000,
|
||||||
|
@ -25,7 +25,7 @@ class ProductSeeder extends Seeder
|
||||||
|
|
||||||
Product::create([
|
Product::create([
|
||||||
'name' => 'Standard',
|
'name' => 'Standard',
|
||||||
'description' => '128MB Ram, 2GB Disk, 2 Database, 210 credits p/m',
|
'description' => '128MB Ram, 2GB Disk, 2 Database, 210 credits monthly',
|
||||||
'price' => 210,
|
'price' => 210,
|
||||||
'memory' => 128,
|
'memory' => 128,
|
||||||
'disk' => 2000,
|
'disk' => 2000,
|
||||||
|
@ -34,7 +34,7 @@ class ProductSeeder extends Seeder
|
||||||
|
|
||||||
Product::create([
|
Product::create([
|
||||||
'name' => 'Advanced',
|
'name' => 'Advanced',
|
||||||
'description' => '256MB Ram, 5GB Disk, 5 Database, 280 credits p/m',
|
'description' => '256MB Ram, 5GB Disk, 5 Database, 280 credits monthly',
|
||||||
'price' => 280,
|
'price' => 280,
|
||||||
'memory' => 256,
|
'memory' => 256,
|
||||||
'disk' => 5000,
|
'disk' => 5000,
|
||||||
|
|
36
database/seeders/UsefulLinksSeeder.php
Normal file
36
database/seeders/UsefulLinksSeeder.php
Normal file
|
@ -0,0 +1,36 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Database\Seeders;
|
||||||
|
|
||||||
|
use App\Models\UsefulLink;
|
||||||
|
use Illuminate\Database\Seeder;
|
||||||
|
|
||||||
|
class UsefulLinksSeeder extends Seeder
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Run the database seeds.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function run()
|
||||||
|
{
|
||||||
|
UsefulLink::create([
|
||||||
|
'icon' => 'fas fa-egg',
|
||||||
|
'title' => 'Pterodactyl Panel',
|
||||||
|
'link' => env('PTERODACTYL_URL', 'http://localhost'),
|
||||||
|
'description' => 'Use your servers on our pterodactyl panel <small>(You can use the same login details)</small>'
|
||||||
|
]);
|
||||||
|
UsefulLink::create([
|
||||||
|
'icon' => 'fas fa-database',
|
||||||
|
'title' => 'phpMyAdmin',
|
||||||
|
'link' => env('PHPMYADMIN_URL', 'http://localhost'),
|
||||||
|
'description' => 'View your database online using phpMyAdmin'
|
||||||
|
]);
|
||||||
|
UsefulLink::create([
|
||||||
|
'icon' => 'fab fa-discord',
|
||||||
|
'title' => 'Discord',
|
||||||
|
'link' => env('DISCORD_INVITE_URL' , 'https://discord.gg/4Y6HjD2uyU'),
|
||||||
|
'description' => 'Need a helping hand? Want to chat? Got any questions? Join our discord!'
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
|
@ -12,7 +12,7 @@ services:
|
||||||
ports:
|
ports:
|
||||||
- 80:80
|
- 80:80
|
||||||
volumes:
|
volumes:
|
||||||
- ../:/var/www/html:delegated
|
- "../:/var/www/html:delegated"
|
||||||
depends_on:
|
depends_on:
|
||||||
- php
|
- php
|
||||||
- mysql
|
- mysql
|
||||||
|
@ -42,7 +42,7 @@ services:
|
||||||
dockerfile: docker/php/Dockerfile
|
dockerfile: docker/php/Dockerfile
|
||||||
container_name: controlpanel_php
|
container_name: controlpanel_php
|
||||||
volumes:
|
volumes:
|
||||||
- ../:/var/www/html:delegated
|
- "../:/var/www/html:delegated"
|
||||||
networks:
|
networks:
|
||||||
- laravel
|
- laravel
|
||||||
|
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
FROM nginx:stable-alpine
|
FROM nginx:stable-alpine
|
||||||
|
|
||||||
|
RUN addgroup -g 1000 laravel && adduser -G laravel -g laravel -s /bin/sh -D laravel
|
||||||
|
|
||||||
ADD ./docker/nginx/nginx.conf /etc/nginx/
|
ADD ./docker/nginx/nginx.conf /etc/nginx/
|
||||||
ADD ./docker/nginx/default.conf /etc/nginx/conf.d/
|
ADD ./docker/nginx/default.conf /etc/nginx/conf.d/
|
||||||
|
|
||||||
RUN mkdir -p /var/www/html
|
RUN mkdir -p /var/www/html
|
||||||
|
|
||||||
RUN addgroup -g 1000 laravel && adduser -G laravel -g laravel -s /bin/sh -D laravel
|
|
||||||
|
|
||||||
RUN chown laravel:laravel /var/www/html
|
RUN chown laravel:laravel /var/www/html
|
||||||
|
|
|
@ -6,16 +6,16 @@ RUN apk add --no-cache --repository https://alpine.global.ssl.fastly.net/alpine/
|
||||||
RUN apk add --no-cache curl-dev icu-dev libzip-dev
|
RUN apk add --no-cache curl-dev icu-dev libzip-dev
|
||||||
RUN docker-php-ext-install mysqli pdo pdo_mysql intl zip
|
RUN docker-php-ext-install mysqli pdo pdo_mysql intl zip
|
||||||
|
|
||||||
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
|
|
||||||
|
|
||||||
ADD ./docker/php/www.conf /usr/local/etc/php-fpm.d/
|
ADD ./docker/php/www.conf /usr/local/etc/php-fpm.d/
|
||||||
|
|
||||||
RUN addgroup -g 1000 laravel && adduser -G laravel -g laravel -s /bin/sh -D laravel
|
|
||||||
|
|
||||||
RUN mkdir -p /var/www/html
|
RUN mkdir -p /var/www/html
|
||||||
|
|
||||||
|
RUN addgroup -g 1000 laravel && adduser -G laravel -g laravel -s /bin/sh -D laravel
|
||||||
RUN chown laravel:laravel /var/www/html
|
RUN chown laravel:laravel /var/www/html
|
||||||
|
|
||||||
WORKDIR /var/www/html
|
WORKDIR /var/www/html
|
||||||
|
|
||||||
RUN docker-php-ext-install pdo pdo_mysql
|
USER laravel
|
||||||
|
|
||||||
|
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
|
||||||
|
|
||||||
|
|
9
klad.txt
9
klad.txt
|
@ -1,9 +0,0 @@
|
||||||
,
|
|
||||||
fnDrawCallback: function( oSettings ) {
|
|
||||||
$('[data-toggle="popover"]').popover();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
data-content="Delete" data-toggle="popover" data-trigger="hover" data-placement="top"
|
|
12
phpunit.xml
12
phpunit.xml
|
@ -5,8 +5,11 @@
|
||||||
colors="true"
|
colors="true"
|
||||||
>
|
>
|
||||||
<testsuites>
|
<testsuites>
|
||||||
<testsuite name="Tests">
|
<testsuite name="Unit">
|
||||||
<directory suffix="Test.php">tests</directory>
|
<directory suffix=".php">tests/Unit</directory>
|
||||||
|
</testsuite>
|
||||||
|
<testsuite name="Feature">
|
||||||
|
<directory suffix=".php">tests/Feature</directory>
|
||||||
</testsuite>
|
</testsuite>
|
||||||
</testsuites>
|
</testsuites>
|
||||||
<coverage processUncoveredFiles="true">
|
<coverage processUncoveredFiles="true">
|
||||||
|
@ -18,11 +21,12 @@
|
||||||
<server name="APP_ENV" value="testing"/>
|
<server name="APP_ENV" value="testing"/>
|
||||||
<server name="BCRYPT_ROUNDS" value="4"/>
|
<server name="BCRYPT_ROUNDS" value="4"/>
|
||||||
<server name="CACHE_DRIVER" value="array"/>
|
<server name="CACHE_DRIVER" value="array"/>
|
||||||
<server name="DB_CONNECTION" value="sqlite"/>
|
<server name="DB_CONNECTION" value="mysql"/>
|
||||||
<server name="DB_DATABASE" value=":memory:"/>
|
<server name="DB_DATABASE" value="controlpanel_test"/>
|
||||||
<server name="MAIL_MAILER" value="array"/>
|
<server name="MAIL_MAILER" value="array"/>
|
||||||
<server name="QUEUE_CONNECTION" value="sync"/>
|
<server name="QUEUE_CONNECTION" value="sync"/>
|
||||||
<server name="SESSION_DRIVER" value="array"/>
|
<server name="SESSION_DRIVER" value="array"/>
|
||||||
<server name="TELESCOPE_ENABLED" value="false"/>
|
<server name="TELESCOPE_ENABLED" value="false"/>
|
||||||
|
<ini name="display_errors" value="true"/>
|
||||||
</php>
|
</php>
|
||||||
</phpunit>
|
</phpunit>
|
||||||
|
|
1
public/css/app.css
vendored
1
public/css/app.css
vendored
|
@ -1,4 +1,5 @@
|
||||||
@import url(https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,400i,700&display=fallback);
|
@import url(https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,400i,700&display=fallback);
|
||||||
|
::-webkit-scrollbar{width:8px;height:8px}::-webkit-scrollbar-thumb{background:#3a4047;border-radius:9px}::-webkit-scrollbar-thumb:hover{background:#2e3339}::-webkit-scrollbar-track{background:#343a40;border-radius:10px;box-shadow:inset 7px 10px 12px #343a40}
|
||||||
/*!
|
/*!
|
||||||
* AdminLTE v3.1.0-rc
|
* AdminLTE v3.1.0-rc
|
||||||
* Author: Colorlib
|
* Author: Colorlib
|
||||||
|
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
399
public/plugins/bootstrap-colorpicker/css/bootstrap-colorpicker.css
vendored
Normal file
399
public/plugins/bootstrap-colorpicker/css/bootstrap-colorpicker.css
vendored
Normal file
|
@ -0,0 +1,399 @@
|
||||||
|
/*!
|
||||||
|
* Bootstrap Colorpicker - Bootstrap Colorpicker is a modular color picker plugin for Bootstrap 4.
|
||||||
|
* @package bootstrap-colorpicker
|
||||||
|
* @version v3.2.0
|
||||||
|
* @license MIT
|
||||||
|
* @link https://itsjavi.com/bootstrap-colorpicker/
|
||||||
|
* @link https://github.com/itsjavi/bootstrap-colorpicker.git
|
||||||
|
*/
|
||||||
|
.colorpicker {
|
||||||
|
position: relative;
|
||||||
|
display: none;
|
||||||
|
font-size: inherit;
|
||||||
|
color: inherit;
|
||||||
|
text-align: left;
|
||||||
|
list-style: none;
|
||||||
|
background-color: #ffffff;
|
||||||
|
background-clip: padding-box;
|
||||||
|
border: 1px solid rgba(0, 0, 0, 0.2);
|
||||||
|
padding: .75rem .75rem;
|
||||||
|
width: 148px;
|
||||||
|
border-radius: 4px;
|
||||||
|
-webkit-box-sizing: content-box;
|
||||||
|
box-sizing: content-box; }
|
||||||
|
|
||||||
|
.colorpicker.colorpicker-disabled,
|
||||||
|
.colorpicker.colorpicker-disabled * {
|
||||||
|
cursor: default !important; }
|
||||||
|
|
||||||
|
.colorpicker div {
|
||||||
|
position: relative; }
|
||||||
|
|
||||||
|
.colorpicker-popup {
|
||||||
|
position: absolute;
|
||||||
|
top: 100%;
|
||||||
|
left: 0;
|
||||||
|
float: left;
|
||||||
|
margin-top: 1px;
|
||||||
|
z-index: 1060; }
|
||||||
|
|
||||||
|
.colorpicker-popup.colorpicker-bs-popover-content {
|
||||||
|
position: relative;
|
||||||
|
top: auto;
|
||||||
|
left: auto;
|
||||||
|
float: none;
|
||||||
|
margin: 0;
|
||||||
|
z-index: initial;
|
||||||
|
border: none;
|
||||||
|
padding: 0.25rem 0;
|
||||||
|
border-radius: 0;
|
||||||
|
background: none;
|
||||||
|
-webkit-box-shadow: none;
|
||||||
|
box-shadow: none; }
|
||||||
|
|
||||||
|
.colorpicker:before,
|
||||||
|
.colorpicker:after {
|
||||||
|
content: "";
|
||||||
|
display: table;
|
||||||
|
clear: both;
|
||||||
|
line-height: 0; }
|
||||||
|
|
||||||
|
.colorpicker-clear {
|
||||||
|
clear: both;
|
||||||
|
display: block; }
|
||||||
|
|
||||||
|
.colorpicker:before {
|
||||||
|
content: '';
|
||||||
|
display: inline-block;
|
||||||
|
border-left: 7px solid transparent;
|
||||||
|
border-right: 7px solid transparent;
|
||||||
|
border-bottom: 7px solid #ccc;
|
||||||
|
border-bottom-color: rgba(0, 0, 0, 0.2);
|
||||||
|
position: absolute;
|
||||||
|
top: -7px;
|
||||||
|
left: auto;
|
||||||
|
right: 6px; }
|
||||||
|
|
||||||
|
.colorpicker:after {
|
||||||
|
content: '';
|
||||||
|
display: inline-block;
|
||||||
|
border-left: 6px solid transparent;
|
||||||
|
border-right: 6px solid transparent;
|
||||||
|
border-bottom: 6px solid #ffffff;
|
||||||
|
position: absolute;
|
||||||
|
top: -6px;
|
||||||
|
left: auto;
|
||||||
|
right: 7px; }
|
||||||
|
|
||||||
|
.colorpicker.colorpicker-with-alpha {
|
||||||
|
width: 170px; }
|
||||||
|
|
||||||
|
.colorpicker.colorpicker-with-alpha .colorpicker-alpha {
|
||||||
|
display: block; }
|
||||||
|
|
||||||
|
.colorpicker-saturation {
|
||||||
|
position: relative;
|
||||||
|
width: 126px;
|
||||||
|
height: 126px;
|
||||||
|
/* FF3.6+ */
|
||||||
|
/* Chrome,Safari4+ */
|
||||||
|
/* Chrome10+,Safari5.1+ */
|
||||||
|
/* Opera 11.10+ */
|
||||||
|
/* IE10+ */
|
||||||
|
background: -webkit-gradient(linear, left top, left bottom, from(transparent), to(black)), -webkit-gradient(linear, left top, right top, from(white), to(rgba(255, 255, 255, 0)));
|
||||||
|
background: linear-gradient(to bottom, transparent 0%, black 100%), linear-gradient(to right, white 0%, rgba(255, 255, 255, 0) 100%);
|
||||||
|
/* W3C */
|
||||||
|
cursor: crosshair;
|
||||||
|
float: left;
|
||||||
|
-webkit-box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.2);
|
||||||
|
box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.2);
|
||||||
|
margin-bottom: 6px; }
|
||||||
|
.colorpicker-saturation .colorpicker-guide {
|
||||||
|
display: block;
|
||||||
|
height: 6px;
|
||||||
|
width: 6px;
|
||||||
|
border-radius: 6px;
|
||||||
|
border: 1px solid #000;
|
||||||
|
-webkit-box-shadow: 0 0 0 1px rgba(255, 255, 255, 0.8);
|
||||||
|
box-shadow: 0 0 0 1px rgba(255, 255, 255, 0.8);
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
margin: -3px 0 0 -3px; }
|
||||||
|
|
||||||
|
.colorpicker-hue,
|
||||||
|
.colorpicker-alpha {
|
||||||
|
position: relative;
|
||||||
|
width: 16px;
|
||||||
|
height: 126px;
|
||||||
|
float: left;
|
||||||
|
cursor: row-resize;
|
||||||
|
margin-left: 6px;
|
||||||
|
margin-bottom: 6px; }
|
||||||
|
|
||||||
|
.colorpicker-alpha-color {
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%; }
|
||||||
|
|
||||||
|
.colorpicker-hue,
|
||||||
|
.colorpicker-alpha-color {
|
||||||
|
-webkit-box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.2);
|
||||||
|
box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.2); }
|
||||||
|
|
||||||
|
.colorpicker-hue .colorpicker-guide,
|
||||||
|
.colorpicker-alpha .colorpicker-guide {
|
||||||
|
display: block;
|
||||||
|
height: 4px;
|
||||||
|
background: rgba(255, 255, 255, 0.8);
|
||||||
|
border: 1px solid rgba(0, 0, 0, 0.4);
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
margin-left: -2px;
|
||||||
|
margin-top: -2px;
|
||||||
|
right: -2px;
|
||||||
|
z-index: 1; }
|
||||||
|
|
||||||
|
.colorpicker-hue {
|
||||||
|
/* FF3.6+ */
|
||||||
|
/* Chrome,Safari4+ */
|
||||||
|
/* Chrome10+,Safari5.1+ */
|
||||||
|
/* Opera 11.10+ */
|
||||||
|
/* IE10+ */
|
||||||
|
background: -webkit-gradient(linear, left bottom, left top, from(red), color-stop(8%, #ff8000), color-stop(17%, yellow), color-stop(25%, #80ff00), color-stop(33%, lime), color-stop(42%, #00ff80), color-stop(50%, cyan), color-stop(58%, #0080ff), color-stop(67%, blue), color-stop(75%, #8000ff), color-stop(83%, magenta), color-stop(92%, #ff0080), to(red));
|
||||||
|
background: linear-gradient(to top, red 0%, #ff8000 8%, yellow 17%, #80ff00 25%, lime 33%, #00ff80 42%, cyan 50%, #0080ff 58%, blue 67%, #8000ff 75%, magenta 83%, #ff0080 92%, red 100%);
|
||||||
|
/* W3C */ }
|
||||||
|
|
||||||
|
.colorpicker-alpha {
|
||||||
|
background: linear-gradient(45deg, rgba(0, 0, 0, 0.1) 25%, transparent 25%, transparent 75%, rgba(0, 0, 0, 0.1) 75%, rgba(0, 0, 0, 0.1) 0), linear-gradient(45deg, rgba(0, 0, 0, 0.1) 25%, transparent 25%, transparent 75%, rgba(0, 0, 0, 0.1) 75%, rgba(0, 0, 0, 0.1) 0), white;
|
||||||
|
background-size: 10px 10px;
|
||||||
|
background-position: 0 0, 5px 5px;
|
||||||
|
display: none; }
|
||||||
|
|
||||||
|
.colorpicker-bar {
|
||||||
|
min-height: 16px;
|
||||||
|
margin: 6px 0 0 0;
|
||||||
|
clear: both;
|
||||||
|
text-align: center;
|
||||||
|
font-size: 10px;
|
||||||
|
line-height: normal;
|
||||||
|
max-width: 100%;
|
||||||
|
-webkit-box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.2);
|
||||||
|
box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.2); }
|
||||||
|
.colorpicker-bar:before {
|
||||||
|
content: "";
|
||||||
|
display: table;
|
||||||
|
clear: both; }
|
||||||
|
|
||||||
|
.colorpicker-bar.colorpicker-bar-horizontal {
|
||||||
|
height: 126px;
|
||||||
|
width: 16px;
|
||||||
|
margin: 0 0 6px 0;
|
||||||
|
float: left; }
|
||||||
|
|
||||||
|
.colorpicker-input-addon {
|
||||||
|
position: relative; }
|
||||||
|
|
||||||
|
.colorpicker-input-addon i {
|
||||||
|
display: inline-block;
|
||||||
|
cursor: pointer;
|
||||||
|
vertical-align: text-top;
|
||||||
|
height: 16px;
|
||||||
|
width: 16px;
|
||||||
|
position: relative; }
|
||||||
|
|
||||||
|
.colorpicker-input-addon:before {
|
||||||
|
content: "";
|
||||||
|
position: absolute;
|
||||||
|
width: 16px;
|
||||||
|
height: 16px;
|
||||||
|
display: inline-block;
|
||||||
|
vertical-align: text-top;
|
||||||
|
background: linear-gradient(45deg, rgba(0, 0, 0, 0.1) 25%, transparent 25%, transparent 75%, rgba(0, 0, 0, 0.1) 75%, rgba(0, 0, 0, 0.1) 0), linear-gradient(45deg, rgba(0, 0, 0, 0.1) 25%, transparent 25%, transparent 75%, rgba(0, 0, 0, 0.1) 75%, rgba(0, 0, 0, 0.1) 0), white;
|
||||||
|
background-size: 10px 10px;
|
||||||
|
background-position: 0 0, 5px 5px; }
|
||||||
|
|
||||||
|
.colorpicker.colorpicker-inline {
|
||||||
|
position: relative;
|
||||||
|
display: inline-block;
|
||||||
|
float: none;
|
||||||
|
z-index: auto;
|
||||||
|
vertical-align: text-bottom; }
|
||||||
|
|
||||||
|
.colorpicker.colorpicker-horizontal {
|
||||||
|
width: 126px;
|
||||||
|
height: auto; }
|
||||||
|
|
||||||
|
.colorpicker.colorpicker-horizontal .colorpicker-bar {
|
||||||
|
width: 126px; }
|
||||||
|
|
||||||
|
.colorpicker.colorpicker-horizontal .colorpicker-saturation {
|
||||||
|
float: none;
|
||||||
|
margin-bottom: 0; }
|
||||||
|
|
||||||
|
.colorpicker.colorpicker-horizontal .colorpicker-hue,
|
||||||
|
.colorpicker.colorpicker-horizontal .colorpicker-alpha {
|
||||||
|
float: none;
|
||||||
|
width: 126px;
|
||||||
|
height: 16px;
|
||||||
|
cursor: col-resize;
|
||||||
|
margin-left: 0;
|
||||||
|
margin-top: 6px;
|
||||||
|
margin-bottom: 0; }
|
||||||
|
|
||||||
|
.colorpicker.colorpicker-horizontal .colorpicker-hue .colorpicker-guide,
|
||||||
|
.colorpicker.colorpicker-horizontal .colorpicker-alpha .colorpicker-guide {
|
||||||
|
position: absolute;
|
||||||
|
display: block;
|
||||||
|
bottom: -2px;
|
||||||
|
left: 0;
|
||||||
|
right: auto;
|
||||||
|
height: auto;
|
||||||
|
width: 4px; }
|
||||||
|
|
||||||
|
.colorpicker.colorpicker-horizontal .colorpicker-hue {
|
||||||
|
/* FF3.6+ */
|
||||||
|
/* Chrome,Safari4+ */
|
||||||
|
/* Chrome10+,Safari5.1+ */
|
||||||
|
/* Opera 11.10+ */
|
||||||
|
/* IE10+ */
|
||||||
|
background: -webkit-gradient(linear, right top, left top, from(red), color-stop(8%, #ff8000), color-stop(17%, yellow), color-stop(25%, #80ff00), color-stop(33%, lime), color-stop(42%, #00ff80), color-stop(50%, cyan), color-stop(58%, #0080ff), color-stop(67%, blue), color-stop(75%, #8000ff), color-stop(83%, magenta), color-stop(92%, #ff0080), to(red));
|
||||||
|
background: linear-gradient(to left, red 0%, #ff8000 8%, yellow 17%, #80ff00 25%, lime 33%, #00ff80 42%, cyan 50%, #0080ff 58%, blue 67%, #8000ff 75%, magenta 83%, #ff0080 92%, red 100%);
|
||||||
|
/* W3C */ }
|
||||||
|
|
||||||
|
.colorpicker.colorpicker-horizontal .colorpicker-alpha {
|
||||||
|
background: linear-gradient(45deg, rgba(0, 0, 0, 0.1) 25%, transparent 25%, transparent 75%, rgba(0, 0, 0, 0.1) 75%, rgba(0, 0, 0, 0.1) 0), linear-gradient(45deg, rgba(0, 0, 0, 0.1) 25%, transparent 25%, transparent 75%, rgba(0, 0, 0, 0.1) 75%, rgba(0, 0, 0, 0.1) 0), white;
|
||||||
|
background-size: 10px 10px;
|
||||||
|
background-position: 0 0, 5px 5px; }
|
||||||
|
|
||||||
|
.colorpicker-inline:before,
|
||||||
|
.colorpicker-no-arrow:before,
|
||||||
|
.colorpicker-popup.colorpicker-bs-popover-content:before {
|
||||||
|
content: none;
|
||||||
|
display: none; }
|
||||||
|
|
||||||
|
.colorpicker-inline:after,
|
||||||
|
.colorpicker-no-arrow:after,
|
||||||
|
.colorpicker-popup.colorpicker-bs-popover-content:after {
|
||||||
|
content: none;
|
||||||
|
display: none; }
|
||||||
|
|
||||||
|
.colorpicker-alpha,
|
||||||
|
.colorpicker-saturation,
|
||||||
|
.colorpicker-hue {
|
||||||
|
-webkit-user-select: none;
|
||||||
|
-moz-user-select: none;
|
||||||
|
-ms-user-select: none;
|
||||||
|
user-select: none; }
|
||||||
|
|
||||||
|
.colorpicker.colorpicker-visible,
|
||||||
|
.colorpicker-alpha.colorpicker-visible,
|
||||||
|
.colorpicker-saturation.colorpicker-visible,
|
||||||
|
.colorpicker-hue.colorpicker-visible,
|
||||||
|
.colorpicker-bar.colorpicker-visible {
|
||||||
|
display: block; }
|
||||||
|
|
||||||
|
.colorpicker.colorpicker-hidden,
|
||||||
|
.colorpicker-alpha.colorpicker-hidden,
|
||||||
|
.colorpicker-saturation.colorpicker-hidden,
|
||||||
|
.colorpicker-hue.colorpicker-hidden,
|
||||||
|
.colorpicker-bar.colorpicker-hidden {
|
||||||
|
display: none; }
|
||||||
|
|
||||||
|
.colorpicker-inline.colorpicker-visible {
|
||||||
|
display: inline-block; }
|
||||||
|
|
||||||
|
.colorpicker.colorpicker-disabled:after {
|
||||||
|
border: none;
|
||||||
|
content: '';
|
||||||
|
display: block;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
background: rgba(233, 236, 239, 0.33);
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
right: auto;
|
||||||
|
z-index: 2;
|
||||||
|
position: absolute; }
|
||||||
|
|
||||||
|
.colorpicker.colorpicker-disabled .colorpicker-guide {
|
||||||
|
display: none; }
|
||||||
|
|
||||||
|
/** EXTENSIONS **/
|
||||||
|
.colorpicker-preview {
|
||||||
|
background: linear-gradient(45deg, rgba(0, 0, 0, 0.1) 25%, transparent 25%, transparent 75%, rgba(0, 0, 0, 0.1) 75%, rgba(0, 0, 0, 0.1) 0), linear-gradient(45deg, rgba(0, 0, 0, 0.1) 25%, transparent 25%, transparent 75%, rgba(0, 0, 0, 0.1) 75%, rgba(0, 0, 0, 0.1) 0), white;
|
||||||
|
background-size: 10px 10px;
|
||||||
|
background-position: 0 0, 5px 5px; }
|
||||||
|
|
||||||
|
.colorpicker-preview > div {
|
||||||
|
position: absolute;
|
||||||
|
left: 0;
|
||||||
|
top: 0;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%; }
|
||||||
|
|
||||||
|
.colorpicker-bar.colorpicker-swatches {
|
||||||
|
-webkit-box-shadow: none;
|
||||||
|
box-shadow: none;
|
||||||
|
height: auto; }
|
||||||
|
|
||||||
|
.colorpicker-swatches--inner {
|
||||||
|
clear: both;
|
||||||
|
margin-top: -6px; }
|
||||||
|
|
||||||
|
.colorpicker-swatch {
|
||||||
|
position: relative;
|
||||||
|
cursor: pointer;
|
||||||
|
float: left;
|
||||||
|
height: 16px;
|
||||||
|
width: 16px;
|
||||||
|
margin-right: 6px;
|
||||||
|
margin-top: 6px;
|
||||||
|
margin-left: 0;
|
||||||
|
display: block;
|
||||||
|
-webkit-box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.2);
|
||||||
|
box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.2);
|
||||||
|
background: linear-gradient(45deg, rgba(0, 0, 0, 0.1) 25%, transparent 25%, transparent 75%, rgba(0, 0, 0, 0.1) 75%, rgba(0, 0, 0, 0.1) 0), linear-gradient(45deg, rgba(0, 0, 0, 0.1) 25%, transparent 25%, transparent 75%, rgba(0, 0, 0, 0.1) 75%, rgba(0, 0, 0, 0.1) 0), white;
|
||||||
|
background-size: 10px 10px;
|
||||||
|
background-position: 0 0, 5px 5px; }
|
||||||
|
|
||||||
|
.colorpicker-swatch--inner {
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%; }
|
||||||
|
|
||||||
|
.colorpicker-swatch:nth-of-type(7n+0) {
|
||||||
|
margin-right: 0; }
|
||||||
|
|
||||||
|
.colorpicker-with-alpha .colorpicker-swatch:nth-of-type(7n+0) {
|
||||||
|
margin-right: 6px; }
|
||||||
|
|
||||||
|
.colorpicker-with-alpha .colorpicker-swatch:nth-of-type(8n+0) {
|
||||||
|
margin-right: 0; }
|
||||||
|
|
||||||
|
.colorpicker-horizontal .colorpicker-swatch:nth-of-type(6n+0) {
|
||||||
|
margin-right: 0; }
|
||||||
|
|
||||||
|
.colorpicker-horizontal .colorpicker-swatch:nth-of-type(7n+0) {
|
||||||
|
margin-right: 6px; }
|
||||||
|
|
||||||
|
.colorpicker-horizontal .colorpicker-swatch:nth-of-type(8n+0) {
|
||||||
|
margin-right: 6px; }
|
||||||
|
|
||||||
|
.colorpicker-swatch:last-of-type:after {
|
||||||
|
content: "";
|
||||||
|
display: table;
|
||||||
|
clear: both; }
|
||||||
|
|
||||||
|
*[dir='rtl'] .colorpicker-element input,
|
||||||
|
.colorpicker-element[dir='rtl'] input,
|
||||||
|
.colorpicker-element input[dir='rtl'] {
|
||||||
|
direction: ltr;
|
||||||
|
text-align: right; }
|
||||||
|
|
||||||
|
/*# sourceMappingURL=bootstrap-colorpicker.css.map */
|
File diff suppressed because one or more lines are too long
10
public/plugins/bootstrap-colorpicker/css/bootstrap-colorpicker.min.css
vendored
Normal file
10
public/plugins/bootstrap-colorpicker/css/bootstrap-colorpicker.min.css
vendored
Normal file
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
6252
public/plugins/bootstrap-colorpicker/js/bootstrap-colorpicker.js
vendored
Normal file
6252
public/plugins/bootstrap-colorpicker/js/bootstrap-colorpicker.js
vendored
Normal file
File diff suppressed because it is too large
Load diff
File diff suppressed because one or more lines are too long
10
public/plugins/bootstrap-colorpicker/js/bootstrap-colorpicker.min.js
vendored
Normal file
10
public/plugins/bootstrap-colorpicker/js/bootstrap-colorpicker.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
2061
public/plugins/bootstrap-slider/bootstrap-slider.js
vendored
Normal file
2061
public/plugins/bootstrap-slider/bootstrap-slider.js
vendored
Normal file
File diff suppressed because it is too large
Load diff
5
public/plugins/bootstrap-slider/bootstrap-slider.min.js
vendored
Normal file
5
public/plugins/bootstrap-slider/bootstrap-slider.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
418
public/plugins/bootstrap-slider/css/bootstrap-slider.css
vendored
Normal file
418
public/plugins/bootstrap-slider/css/bootstrap-slider.css
vendored
Normal file
|
@ -0,0 +1,418 @@
|
||||||
|
/*! =======================================================
|
||||||
|
VERSION 11.0.2
|
||||||
|
========================================================= */
|
||||||
|
/*! =========================================================
|
||||||
|
* bootstrap-slider.js
|
||||||
|
*
|
||||||
|
* Maintainers:
|
||||||
|
* Kyle Kemp
|
||||||
|
* - Twitter: @seiyria
|
||||||
|
* - Github: seiyria
|
||||||
|
* Rohit Kalkur
|
||||||
|
* - Twitter: @Rovolutionary
|
||||||
|
* - Github: rovolution
|
||||||
|
*
|
||||||
|
* =========================================================
|
||||||
|
*
|
||||||
|
* bootstrap-slider is released under the MIT License
|
||||||
|
* Copyright (c) 2019 Kyle Kemp, Rohit Kalkur, 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.
|
||||||
|
*
|
||||||
|
* ========================================================= */
|
||||||
|
.slider {
|
||||||
|
display: inline-block;
|
||||||
|
vertical-align: middle;
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
|
||||||
|
.slider.slider-horizontal {
|
||||||
|
width: 210px;
|
||||||
|
height: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.slider.slider-horizontal .slider-track {
|
||||||
|
height: 10px;
|
||||||
|
width: 100%;
|
||||||
|
margin-top: -5px;
|
||||||
|
top: 50%;
|
||||||
|
left: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.slider.slider-horizontal .slider-selection, .slider.slider-horizontal .slider-track-low, .slider.slider-horizontal .slider-track-high {
|
||||||
|
height: 100%;
|
||||||
|
top: 0;
|
||||||
|
bottom: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.slider.slider-horizontal .slider-tick,
|
||||||
|
.slider.slider-horizontal .slider-handle {
|
||||||
|
margin-left: -10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.slider.slider-horizontal .slider-tick.triangle,
|
||||||
|
.slider.slider-horizontal .slider-handle.triangle {
|
||||||
|
position: relative;
|
||||||
|
top: 50%;
|
||||||
|
transform: translateY(-50%);
|
||||||
|
border-width: 0 10px 10px 10px;
|
||||||
|
width: 0;
|
||||||
|
height: 0;
|
||||||
|
border-bottom-color: #036fa5;
|
||||||
|
margin-top: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.slider.slider-horizontal .slider-tick-container {
|
||||||
|
white-space: nowrap;
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.slider.slider-horizontal .slider-tick-label-container {
|
||||||
|
white-space: nowrap;
|
||||||
|
margin-top: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.slider.slider-horizontal .slider-tick-label-container .slider-tick-label {
|
||||||
|
display: inline-block;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.slider.slider-horizontal.slider-rtl .slider-track {
|
||||||
|
left: initial;
|
||||||
|
right: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.slider.slider-horizontal.slider-rtl .slider-tick,
|
||||||
|
.slider.slider-horizontal.slider-rtl .slider-handle {
|
||||||
|
margin-left: initial;
|
||||||
|
margin-right: -10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.slider.slider-horizontal.slider-rtl .slider-tick-container {
|
||||||
|
left: initial;
|
||||||
|
right: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.slider.slider-vertical {
|
||||||
|
height: 210px;
|
||||||
|
width: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.slider.slider-vertical .slider-track {
|
||||||
|
width: 10px;
|
||||||
|
height: 100%;
|
||||||
|
left: 25%;
|
||||||
|
top: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.slider.slider-vertical .slider-selection {
|
||||||
|
width: 100%;
|
||||||
|
left: 0;
|
||||||
|
top: 0;
|
||||||
|
bottom: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.slider.slider-vertical .slider-track-low, .slider.slider-vertical .slider-track-high {
|
||||||
|
width: 100%;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.slider.slider-vertical .slider-tick,
|
||||||
|
.slider.slider-vertical .slider-handle {
|
||||||
|
margin-top: -10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.slider.slider-vertical .slider-tick.triangle,
|
||||||
|
.slider.slider-vertical .slider-handle.triangle {
|
||||||
|
border-width: 10px 0 10px 10px;
|
||||||
|
width: 1px;
|
||||||
|
height: 1px;
|
||||||
|
border-left-color: #036fa5;
|
||||||
|
margin-left: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.slider.slider-vertical .slider-tick-label-container {
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
.slider.slider-vertical .slider-tick-label-container .slider-tick-label {
|
||||||
|
padding-left: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.slider.slider-vertical.slider-rtl .slider-track {
|
||||||
|
left: initial;
|
||||||
|
right: 25%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.slider.slider-vertical.slider-rtl .slider-selection {
|
||||||
|
left: initial;
|
||||||
|
right: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.slider.slider-vertical.slider-rtl .slider-tick.triangle,
|
||||||
|
.slider.slider-vertical.slider-rtl .slider-handle.triangle {
|
||||||
|
border-width: 10px 10px 10px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.slider.slider-vertical.slider-rtl .slider-tick-label-container .slider-tick-label {
|
||||||
|
padding-left: initial;
|
||||||
|
padding-right: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.slider.slider-disabled .slider-handle {
|
||||||
|
background-color: #cfcfcf;
|
||||||
|
background-image: -moz-linear-gradient(top, #DFDFDF, #BEBEBE);
|
||||||
|
background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#DFDFDF), to(#BEBEBE));
|
||||||
|
background-image: -webkit-linear-gradient(top, #DFDFDF, #BEBEBE);
|
||||||
|
background-image: -o-linear-gradient(top, #DFDFDF, #BEBEBE);
|
||||||
|
background-image: linear-gradient(to bottom, #DFDFDF, #BEBEBE);
|
||||||
|
background-repeat: repeat-x;
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#DFDFDF', endColorstr='#BEBEBE',GradientType=0);
|
||||||
|
}
|
||||||
|
|
||||||
|
.slider.slider-disabled .slider-track {
|
||||||
|
background-color: #e7e7e7;
|
||||||
|
background-image: -moz-linear-gradient(top, #E5E5E5, #E9E9E9);
|
||||||
|
background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#E5E5E5), to(#E9E9E9));
|
||||||
|
background-image: -webkit-linear-gradient(top, #E5E5E5, #E9E9E9);
|
||||||
|
background-image: -o-linear-gradient(top, #E5E5E5, #E9E9E9);
|
||||||
|
background-image: linear-gradient(to bottom, #E5E5E5, #E9E9E9);
|
||||||
|
background-repeat: repeat-x;
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#E5E5E5', endColorstr='#E9E9E9',GradientType=0);
|
||||||
|
cursor: not-allowed;
|
||||||
|
}
|
||||||
|
|
||||||
|
.slider input {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.slider .tooltip-inner {
|
||||||
|
white-space: nowrap;
|
||||||
|
max-width: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.slider .bs-tooltip-top .tooltip-inner,
|
||||||
|
.slider .bs-tooltip-bottom .tooltip-inner {
|
||||||
|
position: relative;
|
||||||
|
left: -50%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.slider.bs-tooltip-left .tooltip-inner, .slider.bs-tooltip-right .tooltip-inner {
|
||||||
|
position: relative;
|
||||||
|
top: -100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.slider .tooltip {
|
||||||
|
pointer-events: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.slider .tooltip.bs-tooltip-top .arrow, .slider .tooltip.bs-tooltip-bottom .arrow {
|
||||||
|
left: -.4rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.slider .tooltip.bs-tooltip-top {
|
||||||
|
margin-top: -44px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.slider .tooltip.bs-tooltip-bottom {
|
||||||
|
margin-top: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.slider .tooltip.bs-tooltip-left, .slider .tooltip.bs-tooltip-right {
|
||||||
|
margin-top: -14px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.slider .tooltip.bs-tooltip-left .arrow, .slider .tooltip.bs-tooltip-right .arrow {
|
||||||
|
top: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.slider .hide {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.slider-track {
|
||||||
|
background-color: #f7f7f7;
|
||||||
|
background-image: -moz-linear-gradient(top, #F5F5F5, #F9F9F9);
|
||||||
|
background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#F5F5F5), to(#F9F9F9));
|
||||||
|
background-image: -webkit-linear-gradient(top, #F5F5F5, #F9F9F9);
|
||||||
|
background-image: -o-linear-gradient(top, #F5F5F5, #F9F9F9);
|
||||||
|
background-image: linear-gradient(to bottom, #F5F5F5, #F9F9F9);
|
||||||
|
background-repeat: repeat-x;
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#F5F5F5', endColorstr='#F9F9F9',GradientType=0);
|
||||||
|
-webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
|
||||||
|
-moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
|
||||||
|
box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
|
||||||
|
-webkit-border-radius: 4px;
|
||||||
|
-moz-border-radius: 4px;
|
||||||
|
border-radius: 4px;
|
||||||
|
position: absolute;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
.slider-selection {
|
||||||
|
background-color: #f7f7f7;
|
||||||
|
background-image: -moz-linear-gradient(top, #F9F9F9, #F5F5F5);
|
||||||
|
background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#F9F9F9), to(#F5F5F5));
|
||||||
|
background-image: -webkit-linear-gradient(top, #F9F9F9, #F5F5F5);
|
||||||
|
background-image: -o-linear-gradient(top, #F9F9F9, #F5F5F5);
|
||||||
|
background-image: linear-gradient(to bottom, #F9F9F9, #F5F5F5);
|
||||||
|
background-repeat: repeat-x;
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#F9F9F9', endColorstr='#F5F5F5',GradientType=0);
|
||||||
|
-webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
|
||||||
|
-moz-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
|
||||||
|
box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
|
||||||
|
-webkit-box-sizing: border-box;
|
||||||
|
-moz-box-sizing: border-box;
|
||||||
|
box-sizing: border-box;
|
||||||
|
-webkit-border-radius: 4px;
|
||||||
|
-moz-border-radius: 4px;
|
||||||
|
border-radius: 4px;
|
||||||
|
position: absolute;
|
||||||
|
}
|
||||||
|
|
||||||
|
.slider-selection.tick-slider-selection {
|
||||||
|
background-color: #46c1fe;
|
||||||
|
background-image: -moz-linear-gradient(top, #52c5ff, #3abcfd);
|
||||||
|
background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#52c5ff), to(#3abcfd));
|
||||||
|
background-image: -webkit-linear-gradient(top, #52c5ff, #3abcfd);
|
||||||
|
background-image: -o-linear-gradient(top, #52c5ff, #3abcfd);
|
||||||
|
background-image: linear-gradient(to bottom, #52c5ff, #3abcfd);
|
||||||
|
background-repeat: repeat-x;
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#52c5ff', endColorstr='#3abcfd',GradientType=0);
|
||||||
|
}
|
||||||
|
|
||||||
|
.slider-track-low, .slider-track-high {
|
||||||
|
-webkit-box-sizing: border-box;
|
||||||
|
-moz-box-sizing: border-box;
|
||||||
|
box-sizing: border-box;
|
||||||
|
-webkit-border-radius: 4px;
|
||||||
|
-moz-border-radius: 4px;
|
||||||
|
border-radius: 4px;
|
||||||
|
position: absolute;
|
||||||
|
background: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
.slider-handle {
|
||||||
|
background-color: #0478b2;
|
||||||
|
background-image: -moz-linear-gradient(top, #0480BE, #036fa5);
|
||||||
|
background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0480BE), to(#036fa5));
|
||||||
|
background-image: -webkit-linear-gradient(top, #0480BE, #036fa5);
|
||||||
|
background-image: -o-linear-gradient(top, #0480BE, #036fa5);
|
||||||
|
background-image: linear-gradient(to bottom, #0480BE, #036fa5);
|
||||||
|
background-repeat: repeat-x;
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#0480BE', endColorstr='#036fa5',GradientType=0);
|
||||||
|
-webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
|
||||||
|
-moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
|
||||||
|
box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
width: 20px;
|
||||||
|
height: 20px;
|
||||||
|
background-color: #0480BE;
|
||||||
|
border: 0px solid transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
.slider-handle:hover {
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
.slider-handle.round {
|
||||||
|
-webkit-border-radius: 20px;
|
||||||
|
-moz-border-radius: 20px;
|
||||||
|
border-radius: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.slider-handle.triangle {
|
||||||
|
background: transparent none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.slider-handle.custom {
|
||||||
|
background: transparent none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.slider-handle.custom::before {
|
||||||
|
line-height: 20px;
|
||||||
|
font-size: 20px;
|
||||||
|
content: '\2605';
|
||||||
|
color: #726204;
|
||||||
|
}
|
||||||
|
|
||||||
|
.slider-tick {
|
||||||
|
background-color: #f7f7f7;
|
||||||
|
background-image: -moz-linear-gradient(top, #F5F5F5, #F9F9F9);
|
||||||
|
background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#F5F5F5), to(#F9F9F9));
|
||||||
|
background-image: -webkit-linear-gradient(top, #F5F5F5, #F9F9F9);
|
||||||
|
background-image: -o-linear-gradient(top, #F5F5F5, #F9F9F9);
|
||||||
|
background-image: linear-gradient(to bottom, #F5F5F5, #F9F9F9);
|
||||||
|
background-repeat: repeat-x;
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#F5F5F5', endColorstr='#F9F9F9',GradientType=0);
|
||||||
|
-webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
|
||||||
|
-moz-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
|
||||||
|
box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
|
||||||
|
-webkit-box-sizing: border-box;
|
||||||
|
-moz-box-sizing: border-box;
|
||||||
|
box-sizing: border-box;
|
||||||
|
position: absolute;
|
||||||
|
cursor: pointer;
|
||||||
|
width: 20px;
|
||||||
|
height: 20px;
|
||||||
|
filter: none;
|
||||||
|
opacity: 0.8;
|
||||||
|
border: 0px solid transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
.slider-tick.round {
|
||||||
|
border-radius: 50%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.slider-tick.triangle {
|
||||||
|
background: transparent none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.slider-tick.custom {
|
||||||
|
background: transparent none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.slider-tick.custom::before {
|
||||||
|
line-height: 20px;
|
||||||
|
font-size: 20px;
|
||||||
|
content: '\2605';
|
||||||
|
color: #726204;
|
||||||
|
}
|
||||||
|
|
||||||
|
.slider-tick.in-selection {
|
||||||
|
background-color: #46c1fe;
|
||||||
|
background-image: -moz-linear-gradient(top, #52c5ff, #3abcfd);
|
||||||
|
background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#52c5ff), to(#3abcfd));
|
||||||
|
background-image: -webkit-linear-gradient(top, #52c5ff, #3abcfd);
|
||||||
|
background-image: -o-linear-gradient(top, #52c5ff, #3abcfd);
|
||||||
|
background-image: linear-gradient(to bottom, #52c5ff, #3abcfd);
|
||||||
|
background-repeat: repeat-x;
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#52c5ff', endColorstr='#3abcfd',GradientType=0);
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*# sourceMappingURL=bootstrap-slider.css.map */
|
43
public/plugins/bootstrap-slider/css/bootstrap-slider.min.css
vendored
Normal file
43
public/plugins/bootstrap-slider/css/bootstrap-slider.min.css
vendored
Normal file
File diff suppressed because one or more lines are too long
510
public/plugins/bootstrap-switch/css/bootstrap2/bootstrap-switch.css
vendored
Normal file
510
public/plugins/bootstrap-switch/css/bootstrap2/bootstrap-switch.css
vendored
Normal file
|
@ -0,0 +1,510 @@
|
||||||
|
/**
|
||||||
|
* bootstrap-switch - Turn checkboxes and radio buttons into toggle switches.
|
||||||
|
*
|
||||||
|
* @version v3.3.4
|
||||||
|
* @homepage https://bttstrp.github.io/bootstrap-switch
|
||||||
|
* @author Mattia Larentis <mattia@larentis.eu> (http://larentis.eu)
|
||||||
|
* @license Apache-2.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
.clearfix {
|
||||||
|
*zoom: 1;
|
||||||
|
}
|
||||||
|
.clearfix:before,
|
||||||
|
.clearfix:after {
|
||||||
|
display: table;
|
||||||
|
content: "";
|
||||||
|
line-height: 0;
|
||||||
|
}
|
||||||
|
.clearfix:after {
|
||||||
|
clear: both;
|
||||||
|
}
|
||||||
|
.hide-text {
|
||||||
|
font: 0/0 a;
|
||||||
|
color: transparent;
|
||||||
|
text-shadow: none;
|
||||||
|
background-color: transparent;
|
||||||
|
border: 0;
|
||||||
|
}
|
||||||
|
.input-block-level {
|
||||||
|
display: block;
|
||||||
|
width: 100%;
|
||||||
|
min-height: 30px;
|
||||||
|
-webkit-box-sizing: border-box;
|
||||||
|
-moz-box-sizing: border-box;
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
.bootstrap-switch {
|
||||||
|
display: inline-block;
|
||||||
|
direction: ltr;
|
||||||
|
cursor: pointer;
|
||||||
|
-webkit-border-radius: 5px;
|
||||||
|
-moz-border-radius: 5px;
|
||||||
|
border-radius: 5px;
|
||||||
|
border: 1px solid;
|
||||||
|
border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
|
||||||
|
position: relative;
|
||||||
|
text-align: left;
|
||||||
|
overflow: hidden;
|
||||||
|
line-height: 8px;
|
||||||
|
z-index: 0;
|
||||||
|
-webkit-user-select: none;
|
||||||
|
-moz-user-select: none;
|
||||||
|
-ms-user-select: none;
|
||||||
|
-o-user-select: none;
|
||||||
|
user-select: none;
|
||||||
|
vertical-align: middle;
|
||||||
|
-webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
|
||||||
|
-moz-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
|
||||||
|
-o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
|
||||||
|
transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
|
||||||
|
}
|
||||||
|
.bootstrap-switch .bootstrap-switch-container {
|
||||||
|
display: inline-block;
|
||||||
|
top: 0;
|
||||||
|
-webkit-border-radius: 4px;
|
||||||
|
-moz-border-radius: 4px;
|
||||||
|
border-radius: 4px;
|
||||||
|
-webkit-transform: translate3d(0, 0, 0);
|
||||||
|
-moz-transform: translate3d(0, 0, 0);
|
||||||
|
-o-transform: translate3d(0, 0, 0);
|
||||||
|
transform: translate3d(0, 0, 0);
|
||||||
|
}
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-on,
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-off,
|
||||||
|
.bootstrap-switch .bootstrap-switch-label {
|
||||||
|
-webkit-box-sizing: border-box;
|
||||||
|
-moz-box-sizing: border-box;
|
||||||
|
box-sizing: border-box;
|
||||||
|
cursor: pointer;
|
||||||
|
display: inline-block !important;
|
||||||
|
padding-top: 4px;
|
||||||
|
padding-bottom: 4px;
|
||||||
|
padding-left: 8px;
|
||||||
|
padding-right: 8px;
|
||||||
|
font-size: 14px;
|
||||||
|
line-height: 20px;
|
||||||
|
}
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-on,
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-off {
|
||||||
|
text-align: center;
|
||||||
|
z-index: 1;
|
||||||
|
}
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-primary,
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-primary {
|
||||||
|
color: #fff;
|
||||||
|
text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
|
||||||
|
background-color: #005fcc;
|
||||||
|
background-image: -moz-linear-gradient(top, #0044cc, #08c);
|
||||||
|
background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0044cc), to(#08c));
|
||||||
|
background-image: -webkit-linear-gradient(top, #0044cc, #08c);
|
||||||
|
background-image: -o-linear-gradient(top, #0044cc, #08c);
|
||||||
|
background-image: linear-gradient(to bottom, #0044cc, #08c);
|
||||||
|
background-repeat: repeat-x;
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0044cc', endColorstr='#ff0088cc', GradientType=0);
|
||||||
|
border-color: #08c #08c #005580;
|
||||||
|
border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
|
||||||
|
*background-color: #08c;
|
||||||
|
/* Darken IE7 buttons by default so they stand out more given they won't have borders */
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
|
||||||
|
}
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-primary:hover,
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-primary:hover,
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-primary:focus,
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-primary:focus,
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-primary:active,
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-primary:active,
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-primary.active,
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-primary.active,
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-primary.disabled,
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-primary.disabled,
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-primary[disabled],
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-primary[disabled] {
|
||||||
|
color: #fff;
|
||||||
|
background-color: #08c;
|
||||||
|
*background-color: #0077b3;
|
||||||
|
}
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-primary:active,
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-primary:active,
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-primary.active,
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-primary.active {
|
||||||
|
background-color: #006699 \9;
|
||||||
|
}
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-info,
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-info {
|
||||||
|
color: #fff;
|
||||||
|
text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
|
||||||
|
background-color: #41a7c5;
|
||||||
|
background-image: -moz-linear-gradient(top, #2f96b4, #5bc0de);
|
||||||
|
background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#2f96b4), to(#5bc0de));
|
||||||
|
background-image: -webkit-linear-gradient(top, #2f96b4, #5bc0de);
|
||||||
|
background-image: -o-linear-gradient(top, #2f96b4, #5bc0de);
|
||||||
|
background-image: linear-gradient(to bottom, #2f96b4, #5bc0de);
|
||||||
|
background-repeat: repeat-x;
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff2f96b4', endColorstr='#ff5bc0de', GradientType=0);
|
||||||
|
border-color: #5bc0de #5bc0de #28a1c5;
|
||||||
|
border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
|
||||||
|
*background-color: #5bc0de;
|
||||||
|
/* Darken IE7 buttons by default so they stand out more given they won't have borders */
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
|
||||||
|
}
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-info:hover,
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-info:hover,
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-info:focus,
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-info:focus,
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-info:active,
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-info:active,
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-info.active,
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-info.active,
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-info.disabled,
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-info.disabled,
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-info[disabled],
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-info[disabled] {
|
||||||
|
color: #fff;
|
||||||
|
background-color: #5bc0de;
|
||||||
|
*background-color: #46b8da;
|
||||||
|
}
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-info:active,
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-info:active,
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-info.active,
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-info.active {
|
||||||
|
background-color: #31b0d5 \9;
|
||||||
|
}
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-success,
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-success {
|
||||||
|
color: #fff;
|
||||||
|
text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
|
||||||
|
background-color: #58b058;
|
||||||
|
background-image: -moz-linear-gradient(top, #51a351, #62c462);
|
||||||
|
background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#51a351), to(#62c462));
|
||||||
|
background-image: -webkit-linear-gradient(top, #51a351, #62c462);
|
||||||
|
background-image: -o-linear-gradient(top, #51a351, #62c462);
|
||||||
|
background-image: linear-gradient(to bottom, #51a351, #62c462);
|
||||||
|
background-repeat: repeat-x;
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff51a351', endColorstr='#ff62c462', GradientType=0);
|
||||||
|
border-color: #62c462 #62c462 #3b9e3b;
|
||||||
|
border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
|
||||||
|
*background-color: #62c462;
|
||||||
|
/* Darken IE7 buttons by default so they stand out more given they won't have borders */
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
|
||||||
|
}
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-success:hover,
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-success:hover,
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-success:focus,
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-success:focus,
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-success:active,
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-success:active,
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-success.active,
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-success.active,
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-success.disabled,
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-success.disabled,
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-success[disabled],
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-success[disabled] {
|
||||||
|
color: #fff;
|
||||||
|
background-color: #62c462;
|
||||||
|
*background-color: #4fbd4f;
|
||||||
|
}
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-success:active,
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-success:active,
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-success.active,
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-success.active {
|
||||||
|
background-color: #42b142 \9;
|
||||||
|
}
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-warning,
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-warning {
|
||||||
|
color: #fff;
|
||||||
|
text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
|
||||||
|
background-color: #f9a123;
|
||||||
|
background-image: -moz-linear-gradient(top, #f89406, #fbb450);
|
||||||
|
background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f89406), to(#fbb450));
|
||||||
|
background-image: -webkit-linear-gradient(top, #f89406, #fbb450);
|
||||||
|
background-image: -o-linear-gradient(top, #f89406, #fbb450);
|
||||||
|
background-image: linear-gradient(to bottom, #f89406, #fbb450);
|
||||||
|
background-repeat: repeat-x;
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff89406', endColorstr='#fffbb450', GradientType=0);
|
||||||
|
border-color: #fbb450 #fbb450 #f89406;
|
||||||
|
border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
|
||||||
|
*background-color: #fbb450;
|
||||||
|
/* Darken IE7 buttons by default so they stand out more given they won't have borders */
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
|
||||||
|
}
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-warning:hover,
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-warning:hover,
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-warning:focus,
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-warning:focus,
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-warning:active,
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-warning:active,
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-warning.active,
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-warning.active,
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-warning.disabled,
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-warning.disabled,
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-warning[disabled],
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-warning[disabled] {
|
||||||
|
color: #fff;
|
||||||
|
background-color: #fbb450;
|
||||||
|
*background-color: #faa937;
|
||||||
|
}
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-warning:active,
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-warning:active,
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-warning.active,
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-warning.active {
|
||||||
|
background-color: #fa9f1e \9;
|
||||||
|
}
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-danger,
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-danger {
|
||||||
|
color: #fff;
|
||||||
|
text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
|
||||||
|
background-color: #d14641;
|
||||||
|
background-image: -moz-linear-gradient(top, #bd362f, #ee5f5b);
|
||||||
|
background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#bd362f), to(#ee5f5b));
|
||||||
|
background-image: -webkit-linear-gradient(top, #bd362f, #ee5f5b);
|
||||||
|
background-image: -o-linear-gradient(top, #bd362f, #ee5f5b);
|
||||||
|
background-image: linear-gradient(to bottom, #bd362f, #ee5f5b);
|
||||||
|
background-repeat: repeat-x;
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffbd362f', endColorstr='#ffee5f5b', GradientType=0);
|
||||||
|
border-color: #ee5f5b #ee5f5b #e51d18;
|
||||||
|
border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
|
||||||
|
*background-color: #ee5f5b;
|
||||||
|
/* Darken IE7 buttons by default so they stand out more given they won't have borders */
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
|
||||||
|
}
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-danger:hover,
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-danger:hover,
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-danger:focus,
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-danger:focus,
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-danger:active,
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-danger:active,
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-danger.active,
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-danger.active,
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-danger.disabled,
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-danger.disabled,
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-danger[disabled],
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-danger[disabled] {
|
||||||
|
color: #fff;
|
||||||
|
background-color: #ee5f5b;
|
||||||
|
*background-color: #ec4844;
|
||||||
|
}
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-danger:active,
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-danger:active,
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-danger.active,
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-danger.active {
|
||||||
|
background-color: #e9322d \9;
|
||||||
|
}
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-default,
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-default {
|
||||||
|
color: #333;
|
||||||
|
text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75);
|
||||||
|
background-color: #f0f0f0;
|
||||||
|
background-image: -moz-linear-gradient(top, #e6e6e6, #fff);
|
||||||
|
background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#e6e6e6), to(#fff));
|
||||||
|
background-image: -webkit-linear-gradient(top, #e6e6e6, #fff);
|
||||||
|
background-image: -o-linear-gradient(top, #e6e6e6, #fff);
|
||||||
|
background-image: linear-gradient(to bottom, #e6e6e6, #fff);
|
||||||
|
background-repeat: repeat-x;
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe6e6e6', endColorstr='#ffffffff', GradientType=0);
|
||||||
|
border-color: #fff #fff #d9d9d9;
|
||||||
|
border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
|
||||||
|
*background-color: #fff;
|
||||||
|
/* Darken IE7 buttons by default so they stand out more given they won't have borders */
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
|
||||||
|
}
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-default:hover,
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-default:hover,
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-default:focus,
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-default:focus,
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-default:active,
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-default:active,
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-default.active,
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-default.active,
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-default.disabled,
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-default.disabled,
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-default[disabled],
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-default[disabled] {
|
||||||
|
color: #333;
|
||||||
|
background-color: #fff;
|
||||||
|
*background-color: #f2f2f2;
|
||||||
|
}
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-default:active,
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-default:active,
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-default.active,
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-default.active {
|
||||||
|
background-color: #e6e6e6 \9;
|
||||||
|
}
|
||||||
|
.bootstrap-switch .bootstrap-switch-label {
|
||||||
|
text-align: center;
|
||||||
|
margin-top: -1px;
|
||||||
|
margin-bottom: -1px;
|
||||||
|
z-index: 100;
|
||||||
|
border-left: 1px solid #ccc;
|
||||||
|
border-right: 1px solid #ccc;
|
||||||
|
color: #333;
|
||||||
|
text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
|
||||||
|
background-color: #f5f5f5;
|
||||||
|
background-image: -moz-linear-gradient(top, #fff, #e6e6e6);
|
||||||
|
background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fff), to(#e6e6e6));
|
||||||
|
background-image: -webkit-linear-gradient(top, #fff, #e6e6e6);
|
||||||
|
background-image: -o-linear-gradient(top, #fff, #e6e6e6);
|
||||||
|
background-image: linear-gradient(to bottom, #fff, #e6e6e6);
|
||||||
|
background-repeat: repeat-x;
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0);
|
||||||
|
border-color: #e6e6e6 #e6e6e6 #bfbfbf;
|
||||||
|
border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
|
||||||
|
*background-color: #e6e6e6;
|
||||||
|
/* Darken IE7 buttons by default so they stand out more given they won't have borders */
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
|
||||||
|
}
|
||||||
|
.bootstrap-switch .bootstrap-switch-label:hover,
|
||||||
|
.bootstrap-switch .bootstrap-switch-label:focus,
|
||||||
|
.bootstrap-switch .bootstrap-switch-label:active,
|
||||||
|
.bootstrap-switch .bootstrap-switch-label.active,
|
||||||
|
.bootstrap-switch .bootstrap-switch-label.disabled,
|
||||||
|
.bootstrap-switch .bootstrap-switch-label[disabled] {
|
||||||
|
color: #333;
|
||||||
|
background-color: #e6e6e6;
|
||||||
|
*background-color: #d9d9d9;
|
||||||
|
}
|
||||||
|
.bootstrap-switch .bootstrap-switch-label:active,
|
||||||
|
.bootstrap-switch .bootstrap-switch-label.active {
|
||||||
|
background-color: #cccccc \9;
|
||||||
|
}
|
||||||
|
.bootstrap-switch span::before {
|
||||||
|
content: "\200b";
|
||||||
|
}
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-on {
|
||||||
|
-webkit-border-top-left-radius: 4px;
|
||||||
|
-moz-border-radius-topleft: 4px;
|
||||||
|
border-top-left-radius: 4px;
|
||||||
|
-webkit-border-bottom-left-radius: 4px;
|
||||||
|
-moz-border-radius-bottomleft: 4px;
|
||||||
|
border-bottom-left-radius: 4px;
|
||||||
|
}
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-off {
|
||||||
|
-webkit-border-top-right-radius: 4px;
|
||||||
|
-moz-border-radius-topright: 4px;
|
||||||
|
border-top-right-radius: 4px;
|
||||||
|
-webkit-border-bottom-right-radius: 4px;
|
||||||
|
-moz-border-radius-bottomright: 4px;
|
||||||
|
border-bottom-right-radius: 4px;
|
||||||
|
}
|
||||||
|
.bootstrap-switch input[type='radio'],
|
||||||
|
.bootstrap-switch input[type='checkbox'] {
|
||||||
|
position: absolute !important;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
opacity: 0;
|
||||||
|
filter: alpha(opacity=0);
|
||||||
|
z-index: -1;
|
||||||
|
visibility: hidden;
|
||||||
|
}
|
||||||
|
.bootstrap-switch input[type='radio'].form-control,
|
||||||
|
.bootstrap-switch input[type='checkbox'].form-control {
|
||||||
|
height: auto;
|
||||||
|
}
|
||||||
|
.bootstrap-switch.bootstrap-switch-mini {
|
||||||
|
min-width: 71px;
|
||||||
|
}
|
||||||
|
.bootstrap-switch.bootstrap-switch-mini .bootstrap-switch-handle-on,
|
||||||
|
.bootstrap-switch.bootstrap-switch-mini .bootstrap-switch-handle-off,
|
||||||
|
.bootstrap-switch.bootstrap-switch-mini .bootstrap-switch-label {
|
||||||
|
padding: 3px 6px;
|
||||||
|
font-size: 10px;
|
||||||
|
line-height: 9px;
|
||||||
|
}
|
||||||
|
.bootstrap-switch.bootstrap-switch-small {
|
||||||
|
min-width: 79px;
|
||||||
|
}
|
||||||
|
.bootstrap-switch.bootstrap-switch-small .bootstrap-switch-handle-on,
|
||||||
|
.bootstrap-switch.bootstrap-switch-small .bootstrap-switch-handle-off,
|
||||||
|
.bootstrap-switch.bootstrap-switch-small .bootstrap-switch-label {
|
||||||
|
padding: 3px 6px;
|
||||||
|
font-size: 12px;
|
||||||
|
line-height: 18px;
|
||||||
|
}
|
||||||
|
.bootstrap-switch.bootstrap-switch-large {
|
||||||
|
min-width: 120px;
|
||||||
|
}
|
||||||
|
.bootstrap-switch.bootstrap-switch-large .bootstrap-switch-handle-on,
|
||||||
|
.bootstrap-switch.bootstrap-switch-large .bootstrap-switch-handle-off,
|
||||||
|
.bootstrap-switch.bootstrap-switch-large .bootstrap-switch-label {
|
||||||
|
padding: 9px 12px;
|
||||||
|
font-size: 16px;
|
||||||
|
line-height: normal;
|
||||||
|
}
|
||||||
|
.bootstrap-switch.bootstrap-switch-disabled,
|
||||||
|
.bootstrap-switch.bootstrap-switch-readonly,
|
||||||
|
.bootstrap-switch.bootstrap-switch-indeterminate {
|
||||||
|
cursor: default !important;
|
||||||
|
}
|
||||||
|
.bootstrap-switch.bootstrap-switch-disabled .bootstrap-switch-handle-on,
|
||||||
|
.bootstrap-switch.bootstrap-switch-readonly .bootstrap-switch-handle-on,
|
||||||
|
.bootstrap-switch.bootstrap-switch-indeterminate .bootstrap-switch-handle-on,
|
||||||
|
.bootstrap-switch.bootstrap-switch-disabled .bootstrap-switch-handle-off,
|
||||||
|
.bootstrap-switch.bootstrap-switch-readonly .bootstrap-switch-handle-off,
|
||||||
|
.bootstrap-switch.bootstrap-switch-indeterminate .bootstrap-switch-handle-off,
|
||||||
|
.bootstrap-switch.bootstrap-switch-disabled .bootstrap-switch-label,
|
||||||
|
.bootstrap-switch.bootstrap-switch-readonly .bootstrap-switch-label,
|
||||||
|
.bootstrap-switch.bootstrap-switch-indeterminate .bootstrap-switch-label {
|
||||||
|
opacity: 0.5;
|
||||||
|
filter: alpha(opacity=50);
|
||||||
|
cursor: default !important;
|
||||||
|
}
|
||||||
|
.bootstrap-switch.bootstrap-switch-animate .bootstrap-switch-container {
|
||||||
|
-webkit-transition: margin-left 0.5s;
|
||||||
|
-moz-transition: margin-left 0.5s;
|
||||||
|
-o-transition: margin-left 0.5s;
|
||||||
|
transition: margin-left 0.5s;
|
||||||
|
}
|
||||||
|
.bootstrap-switch.bootstrap-switch-inverse .bootstrap-switch-handle-on {
|
||||||
|
-webkit-border-top-left-radius: 0;
|
||||||
|
-moz-border-radius-topleft: 0;
|
||||||
|
border-top-left-radius: 0;
|
||||||
|
-webkit-border-bottom-left-radius: 0;
|
||||||
|
-moz-border-radius-bottomleft: 0;
|
||||||
|
border-bottom-left-radius: 0;
|
||||||
|
-webkit-border-top-right-radius: 4px;
|
||||||
|
-moz-border-radius-topright: 4px;
|
||||||
|
border-top-right-radius: 4px;
|
||||||
|
-webkit-border-bottom-right-radius: 4px;
|
||||||
|
-moz-border-radius-bottomright: 4px;
|
||||||
|
border-bottom-right-radius: 4px;
|
||||||
|
}
|
||||||
|
.bootstrap-switch.bootstrap-switch-inverse .bootstrap-switch-handle-off {
|
||||||
|
-webkit-border-top-right-radius: 0;
|
||||||
|
-moz-border-radius-topright: 0;
|
||||||
|
border-top-right-radius: 0;
|
||||||
|
-webkit-border-bottom-right-radius: 0;
|
||||||
|
-moz-border-radius-bottomright: 0;
|
||||||
|
border-bottom-right-radius: 0;
|
||||||
|
-webkit-border-top-left-radius: 4px;
|
||||||
|
-moz-border-radius-topleft: 4px;
|
||||||
|
border-top-left-radius: 4px;
|
||||||
|
-webkit-border-bottom-left-radius: 4px;
|
||||||
|
-moz-border-radius-bottomleft: 4px;
|
||||||
|
border-bottom-left-radius: 4px;
|
||||||
|
}
|
||||||
|
.bootstrap-switch.bootstrap-switch-focused {
|
||||||
|
border-color: rgba(82, 168, 236, 0.8);
|
||||||
|
outline: 0;
|
||||||
|
outline: thin dotted \9;
|
||||||
|
-webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82, 168, 236, .6);
|
||||||
|
-moz-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82, 168, 236, .6);
|
||||||
|
box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82, 168, 236, .6);
|
||||||
|
}
|
||||||
|
.bootstrap-switch.bootstrap-switch-on .bootstrap-switch-label,
|
||||||
|
.bootstrap-switch.bootstrap-switch-inverse.bootstrap-switch-off .bootstrap-switch-label {
|
||||||
|
-webkit-border-top-right-radius: 4px;
|
||||||
|
-moz-border-radius-topright: 4px;
|
||||||
|
border-top-right-radius: 4px;
|
||||||
|
-webkit-border-bottom-right-radius: 4px;
|
||||||
|
-moz-border-radius-bottomright: 4px;
|
||||||
|
border-bottom-right-radius: 4px;
|
||||||
|
}
|
||||||
|
.bootstrap-switch.bootstrap-switch-off .bootstrap-switch-label,
|
||||||
|
.bootstrap-switch.bootstrap-switch-inverse.bootstrap-switch-on .bootstrap-switch-label {
|
||||||
|
-webkit-border-top-left-radius: 4px;
|
||||||
|
-moz-border-radius-topleft: 4px;
|
||||||
|
border-top-left-radius: 4px;
|
||||||
|
-webkit-border-bottom-left-radius: 4px;
|
||||||
|
-moz-border-radius-bottomleft: 4px;
|
||||||
|
border-bottom-left-radius: 4px;
|
||||||
|
}
|
10
public/plugins/bootstrap-switch/css/bootstrap2/bootstrap-switch.min.css
vendored
Normal file
10
public/plugins/bootstrap-switch/css/bootstrap2/bootstrap-switch.min.css
vendored
Normal file
File diff suppressed because one or more lines are too long
187
public/plugins/bootstrap-switch/css/bootstrap3/bootstrap-switch.css
vendored
Normal file
187
public/plugins/bootstrap-switch/css/bootstrap3/bootstrap-switch.css
vendored
Normal file
|
@ -0,0 +1,187 @@
|
||||||
|
/**
|
||||||
|
* bootstrap-switch - Turn checkboxes and radio buttons into toggle switches.
|
||||||
|
*
|
||||||
|
* @version v3.3.4
|
||||||
|
* @homepage https://bttstrp.github.io/bootstrap-switch
|
||||||
|
* @author Mattia Larentis <mattia@larentis.eu> (http://larentis.eu)
|
||||||
|
* @license Apache-2.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
.bootstrap-switch {
|
||||||
|
display: inline-block;
|
||||||
|
direction: ltr;
|
||||||
|
cursor: pointer;
|
||||||
|
border-radius: 4px;
|
||||||
|
border: 1px solid;
|
||||||
|
border-color: #ccc;
|
||||||
|
position: relative;
|
||||||
|
text-align: left;
|
||||||
|
overflow: hidden;
|
||||||
|
line-height: 8px;
|
||||||
|
z-index: 0;
|
||||||
|
-webkit-user-select: none;
|
||||||
|
-moz-user-select: none;
|
||||||
|
-ms-user-select: none;
|
||||||
|
user-select: none;
|
||||||
|
vertical-align: middle;
|
||||||
|
-webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
|
||||||
|
-o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
|
||||||
|
transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
|
||||||
|
}
|
||||||
|
.bootstrap-switch .bootstrap-switch-container {
|
||||||
|
display: inline-block;
|
||||||
|
top: 0;
|
||||||
|
border-radius: 4px;
|
||||||
|
-webkit-transform: translate3d(0, 0, 0);
|
||||||
|
transform: translate3d(0, 0, 0);
|
||||||
|
}
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-on,
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-off,
|
||||||
|
.bootstrap-switch .bootstrap-switch-label {
|
||||||
|
-webkit-box-sizing: border-box;
|
||||||
|
-moz-box-sizing: border-box;
|
||||||
|
box-sizing: border-box;
|
||||||
|
cursor: pointer;
|
||||||
|
display: table-cell;
|
||||||
|
vertical-align: middle;
|
||||||
|
padding: 6px 12px;
|
||||||
|
font-size: 14px;
|
||||||
|
line-height: 20px;
|
||||||
|
}
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-on,
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-off {
|
||||||
|
text-align: center;
|
||||||
|
z-index: 1;
|
||||||
|
}
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-primary,
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-primary {
|
||||||
|
color: #fff;
|
||||||
|
background: #337ab7;
|
||||||
|
}
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-info,
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-info {
|
||||||
|
color: #fff;
|
||||||
|
background: #5bc0de;
|
||||||
|
}
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-success,
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-success {
|
||||||
|
color: #fff;
|
||||||
|
background: #5cb85c;
|
||||||
|
}
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-warning,
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-warning {
|
||||||
|
background: #f0ad4e;
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-danger,
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-danger {
|
||||||
|
color: #fff;
|
||||||
|
background: #d9534f;
|
||||||
|
}
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-default,
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-default {
|
||||||
|
color: #000;
|
||||||
|
background: #eeeeee;
|
||||||
|
}
|
||||||
|
.bootstrap-switch .bootstrap-switch-label {
|
||||||
|
text-align: center;
|
||||||
|
margin-top: -1px;
|
||||||
|
margin-bottom: -1px;
|
||||||
|
z-index: 100;
|
||||||
|
color: #333;
|
||||||
|
background: #fff;
|
||||||
|
}
|
||||||
|
.bootstrap-switch span::before {
|
||||||
|
content: "\200b";
|
||||||
|
}
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-on {
|
||||||
|
border-bottom-left-radius: 3px;
|
||||||
|
border-top-left-radius: 3px;
|
||||||
|
}
|
||||||
|
.bootstrap-switch .bootstrap-switch-handle-off {
|
||||||
|
border-bottom-right-radius: 3px;
|
||||||
|
border-top-right-radius: 3px;
|
||||||
|
}
|
||||||
|
.bootstrap-switch input[type='radio'],
|
||||||
|
.bootstrap-switch input[type='checkbox'] {
|
||||||
|
position: absolute !important;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
margin: 0;
|
||||||
|
z-index: -1;
|
||||||
|
opacity: 0;
|
||||||
|
filter: alpha(opacity=0);
|
||||||
|
visibility: hidden;
|
||||||
|
}
|
||||||
|
.bootstrap-switch.bootstrap-switch-mini .bootstrap-switch-handle-on,
|
||||||
|
.bootstrap-switch.bootstrap-switch-mini .bootstrap-switch-handle-off,
|
||||||
|
.bootstrap-switch.bootstrap-switch-mini .bootstrap-switch-label {
|
||||||
|
padding: 1px 5px;
|
||||||
|
font-size: 12px;
|
||||||
|
line-height: 1.5;
|
||||||
|
}
|
||||||
|
.bootstrap-switch.bootstrap-switch-small .bootstrap-switch-handle-on,
|
||||||
|
.bootstrap-switch.bootstrap-switch-small .bootstrap-switch-handle-off,
|
||||||
|
.bootstrap-switch.bootstrap-switch-small .bootstrap-switch-label {
|
||||||
|
padding: 5px 10px;
|
||||||
|
font-size: 12px;
|
||||||
|
line-height: 1.5;
|
||||||
|
}
|
||||||
|
.bootstrap-switch.bootstrap-switch-large .bootstrap-switch-handle-on,
|
||||||
|
.bootstrap-switch.bootstrap-switch-large .bootstrap-switch-handle-off,
|
||||||
|
.bootstrap-switch.bootstrap-switch-large .bootstrap-switch-label {
|
||||||
|
padding: 6px 16px;
|
||||||
|
font-size: 18px;
|
||||||
|
line-height: 1.3333333;
|
||||||
|
}
|
||||||
|
.bootstrap-switch.bootstrap-switch-disabled,
|
||||||
|
.bootstrap-switch.bootstrap-switch-readonly,
|
||||||
|
.bootstrap-switch.bootstrap-switch-indeterminate {
|
||||||
|
cursor: default !important;
|
||||||
|
}
|
||||||
|
.bootstrap-switch.bootstrap-switch-disabled .bootstrap-switch-handle-on,
|
||||||
|
.bootstrap-switch.bootstrap-switch-readonly .bootstrap-switch-handle-on,
|
||||||
|
.bootstrap-switch.bootstrap-switch-indeterminate .bootstrap-switch-handle-on,
|
||||||
|
.bootstrap-switch.bootstrap-switch-disabled .bootstrap-switch-handle-off,
|
||||||
|
.bootstrap-switch.bootstrap-switch-readonly .bootstrap-switch-handle-off,
|
||||||
|
.bootstrap-switch.bootstrap-switch-indeterminate .bootstrap-switch-handle-off,
|
||||||
|
.bootstrap-switch.bootstrap-switch-disabled .bootstrap-switch-label,
|
||||||
|
.bootstrap-switch.bootstrap-switch-readonly .bootstrap-switch-label,
|
||||||
|
.bootstrap-switch.bootstrap-switch-indeterminate .bootstrap-switch-label {
|
||||||
|
opacity: 0.5;
|
||||||
|
filter: alpha(opacity=50);
|
||||||
|
cursor: default !important;
|
||||||
|
}
|
||||||
|
.bootstrap-switch.bootstrap-switch-animate .bootstrap-switch-container {
|
||||||
|
-webkit-transition: margin-left 0.5s;
|
||||||
|
-o-transition: margin-left 0.5s;
|
||||||
|
transition: margin-left 0.5s;
|
||||||
|
}
|
||||||
|
.bootstrap-switch.bootstrap-switch-inverse .bootstrap-switch-handle-on {
|
||||||
|
border-bottom-left-radius: 0;
|
||||||
|
border-top-left-radius: 0;
|
||||||
|
border-bottom-right-radius: 3px;
|
||||||
|
border-top-right-radius: 3px;
|
||||||
|
}
|
||||||
|
.bootstrap-switch.bootstrap-switch-inverse .bootstrap-switch-handle-off {
|
||||||
|
border-bottom-right-radius: 0;
|
||||||
|
border-top-right-radius: 0;
|
||||||
|
border-bottom-left-radius: 3px;
|
||||||
|
border-top-left-radius: 3px;
|
||||||
|
}
|
||||||
|
.bootstrap-switch.bootstrap-switch-focused {
|
||||||
|
border-color: #66afe9;
|
||||||
|
outline: 0;
|
||||||
|
-webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);
|
||||||
|
box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);
|
||||||
|
}
|
||||||
|
.bootstrap-switch.bootstrap-switch-on .bootstrap-switch-label,
|
||||||
|
.bootstrap-switch.bootstrap-switch-inverse.bootstrap-switch-off .bootstrap-switch-label {
|
||||||
|
border-bottom-right-radius: 3px;
|
||||||
|
border-top-right-radius: 3px;
|
||||||
|
}
|
||||||
|
.bootstrap-switch.bootstrap-switch-off .bootstrap-switch-label,
|
||||||
|
.bootstrap-switch.bootstrap-switch-inverse.bootstrap-switch-on .bootstrap-switch-label {
|
||||||
|
border-bottom-left-radius: 3px;
|
||||||
|
border-top-left-radius: 3px;
|
||||||
|
}
|
10
public/plugins/bootstrap-switch/css/bootstrap3/bootstrap-switch.min.css
vendored
Normal file
10
public/plugins/bootstrap-switch/css/bootstrap3/bootstrap-switch.min.css
vendored
Normal file
File diff suppressed because one or more lines are too long
784
public/plugins/bootstrap-switch/js/bootstrap-switch.js
vendored
Normal file
784
public/plugins/bootstrap-switch/js/bootstrap-switch.js
vendored
Normal file
|
@ -0,0 +1,784 @@
|
||||||
|
/**
|
||||||
|
* bootstrap-switch - Turn checkboxes and radio buttons into toggle switches.
|
||||||
|
*
|
||||||
|
* @version v3.3.4
|
||||||
|
* @homepage https://bttstrp.github.io/bootstrap-switch
|
||||||
|
* @author Mattia Larentis <mattia@larentis.eu> (http://larentis.eu)
|
||||||
|
* @license Apache-2.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
(function (global, factory) {
|
||||||
|
if (typeof define === "function" && define.amd) {
|
||||||
|
define(['jquery'], factory);
|
||||||
|
} else if (typeof exports !== "undefined") {
|
||||||
|
factory(require('jquery'));
|
||||||
|
} else {
|
||||||
|
var mod = {
|
||||||
|
exports: {}
|
||||||
|
};
|
||||||
|
factory(global.jquery);
|
||||||
|
global.bootstrapSwitch = mod.exports;
|
||||||
|
}
|
||||||
|
})(this, function (_jquery) {
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
var _jquery2 = _interopRequireDefault(_jquery);
|
||||||
|
|
||||||
|
function _interopRequireDefault(obj) {
|
||||||
|
return obj && obj.__esModule ? obj : {
|
||||||
|
default: obj
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
var _extends = Object.assign || function (target) {
|
||||||
|
for (var i = 1; i < arguments.length; i++) {
|
||||||
|
var source = arguments[i];
|
||||||
|
|
||||||
|
for (var key in source) {
|
||||||
|
if (Object.prototype.hasOwnProperty.call(source, key)) {
|
||||||
|
target[key] = source[key];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return target;
|
||||||
|
};
|
||||||
|
|
||||||
|
function _classCallCheck(instance, Constructor) {
|
||||||
|
if (!(instance instanceof Constructor)) {
|
||||||
|
throw new TypeError("Cannot call a class as a function");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var _createClass = function () {
|
||||||
|
function defineProperties(target, props) {
|
||||||
|
for (var i = 0; i < props.length; i++) {
|
||||||
|
var descriptor = props[i];
|
||||||
|
descriptor.enumerable = descriptor.enumerable || false;
|
||||||
|
descriptor.configurable = true;
|
||||||
|
if ("value" in descriptor) descriptor.writable = true;
|
||||||
|
Object.defineProperty(target, descriptor.key, descriptor);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return function (Constructor, protoProps, staticProps) {
|
||||||
|
if (protoProps) defineProperties(Constructor.prototype, protoProps);
|
||||||
|
if (staticProps) defineProperties(Constructor, staticProps);
|
||||||
|
return Constructor;
|
||||||
|
};
|
||||||
|
}();
|
||||||
|
|
||||||
|
var $ = _jquery2.default || window.jQuery || window.$;
|
||||||
|
|
||||||
|
var BootstrapSwitch = function () {
|
||||||
|
function BootstrapSwitch(element) {
|
||||||
|
var _this = this;
|
||||||
|
|
||||||
|
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
||||||
|
|
||||||
|
_classCallCheck(this, BootstrapSwitch);
|
||||||
|
|
||||||
|
this.$element = $(element);
|
||||||
|
this.options = $.extend({}, $.fn.bootstrapSwitch.defaults, this._getElementOptions(), options);
|
||||||
|
this.prevOptions = {};
|
||||||
|
this.$wrapper = $('<div>', {
|
||||||
|
class: function _class() {
|
||||||
|
var classes = [];
|
||||||
|
classes.push(_this.options.state ? 'on' : 'off');
|
||||||
|
if (_this.options.size) {
|
||||||
|
classes.push(_this.options.size);
|
||||||
|
}
|
||||||
|
if (_this.options.disabled) {
|
||||||
|
classes.push('disabled');
|
||||||
|
}
|
||||||
|
if (_this.options.readonly) {
|
||||||
|
classes.push('readonly');
|
||||||
|
}
|
||||||
|
if (_this.options.indeterminate) {
|
||||||
|
classes.push('indeterminate');
|
||||||
|
}
|
||||||
|
if (_this.options.inverse) {
|
||||||
|
classes.push('inverse');
|
||||||
|
}
|
||||||
|
if (_this.$element.attr('id')) {
|
||||||
|
classes.push('id-' + _this.$element.attr('id'));
|
||||||
|
}
|
||||||
|
return classes.map(_this._getClass.bind(_this)).concat([_this.options.baseClass], _this._getClasses(_this.options.wrapperClass)).join(' ');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
this.$container = $('<div>', { class: this._getClass('container') });
|
||||||
|
this.$on = $('<span>', {
|
||||||
|
html: this.options.onText,
|
||||||
|
class: this._getClass('handle-on') + ' ' + this._getClass(this.options.onColor)
|
||||||
|
});
|
||||||
|
this.$off = $('<span>', {
|
||||||
|
html: this.options.offText,
|
||||||
|
class: this._getClass('handle-off') + ' ' + this._getClass(this.options.offColor)
|
||||||
|
});
|
||||||
|
this.$label = $('<span>', {
|
||||||
|
html: this.options.labelText,
|
||||||
|
class: this._getClass('label')
|
||||||
|
});
|
||||||
|
|
||||||
|
this.$element.on('init.bootstrapSwitch', this.options.onInit.bind(this, element));
|
||||||
|
this.$element.on('switchChange.bootstrapSwitch', function () {
|
||||||
|
for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
|
||||||
|
args[_key] = arguments[_key];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_this.options.onSwitchChange.apply(element, args) === false) {
|
||||||
|
if (_this.$element.is(':radio')) {
|
||||||
|
$('[name="' + _this.$element.attr('name') + '"]').trigger('previousState.bootstrapSwitch', true);
|
||||||
|
} else {
|
||||||
|
_this.$element.trigger('previousState.bootstrapSwitch', true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
this.$container = this.$element.wrap(this.$container).parent();
|
||||||
|
this.$wrapper = this.$container.wrap(this.$wrapper).parent();
|
||||||
|
this.$element.before(this.options.inverse ? this.$off : this.$on).before(this.$label).before(this.options.inverse ? this.$on : this.$off);
|
||||||
|
|
||||||
|
if (this.options.indeterminate) {
|
||||||
|
this.$element.prop('indeterminate', true);
|
||||||
|
}
|
||||||
|
|
||||||
|
this._init();
|
||||||
|
this._elementHandlers();
|
||||||
|
this._handleHandlers();
|
||||||
|
this._labelHandlers();
|
||||||
|
this._formHandler();
|
||||||
|
this._externalLabelHandler();
|
||||||
|
this.$element.trigger('init.bootstrapSwitch', this.options.state);
|
||||||
|
}
|
||||||
|
|
||||||
|
_createClass(BootstrapSwitch, [{
|
||||||
|
key: 'setPrevOptions',
|
||||||
|
value: function setPrevOptions() {
|
||||||
|
this.prevOptions = _extends({}, this.options);
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: 'state',
|
||||||
|
value: function state(value, skip) {
|
||||||
|
if (typeof value === 'undefined') {
|
||||||
|
return this.options.state;
|
||||||
|
}
|
||||||
|
if (this.options.disabled || this.options.readonly || this.options.state && !this.options.radioAllOff && this.$element.is(':radio')) {
|
||||||
|
return this.$element;
|
||||||
|
}
|
||||||
|
if (this.$element.is(':radio')) {
|
||||||
|
$('[name="' + this.$element.attr('name') + '"]').trigger('setPreviousOptions.bootstrapSwitch');
|
||||||
|
} else {
|
||||||
|
this.$element.trigger('setPreviousOptions.bootstrapSwitch');
|
||||||
|
}
|
||||||
|
if (this.options.indeterminate) {
|
||||||
|
this.indeterminate(false);
|
||||||
|
}
|
||||||
|
this.$element.prop('checked', Boolean(value)).trigger('change.bootstrapSwitch', skip);
|
||||||
|
return this.$element;
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: 'toggleState',
|
||||||
|
value: function toggleState(skip) {
|
||||||
|
if (this.options.disabled || this.options.readonly) {
|
||||||
|
return this.$element;
|
||||||
|
}
|
||||||
|
if (this.options.indeterminate) {
|
||||||
|
this.indeterminate(false);
|
||||||
|
return this.state(true);
|
||||||
|
} else {
|
||||||
|
return this.$element.prop('checked', !this.options.state).trigger('change.bootstrapSwitch', skip);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: 'size',
|
||||||
|
value: function size(value) {
|
||||||
|
if (typeof value === 'undefined') {
|
||||||
|
return this.options.size;
|
||||||
|
}
|
||||||
|
if (this.options.size != null) {
|
||||||
|
this.$wrapper.removeClass(this._getClass(this.options.size));
|
||||||
|
}
|
||||||
|
if (value) {
|
||||||
|
this.$wrapper.addClass(this._getClass(value));
|
||||||
|
}
|
||||||
|
this._width();
|
||||||
|
this._containerPosition();
|
||||||
|
this.options.size = value;
|
||||||
|
return this.$element;
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: 'animate',
|
||||||
|
value: function animate(value) {
|
||||||
|
if (typeof value === 'undefined') {
|
||||||
|
return this.options.animate;
|
||||||
|
}
|
||||||
|
if (this.options.animate === Boolean(value)) {
|
||||||
|
return this.$element;
|
||||||
|
}
|
||||||
|
return this.toggleAnimate();
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: 'toggleAnimate',
|
||||||
|
value: function toggleAnimate() {
|
||||||
|
this.options.animate = !this.options.animate;
|
||||||
|
this.$wrapper.toggleClass(this._getClass('animate'));
|
||||||
|
return this.$element;
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: 'disabled',
|
||||||
|
value: function disabled(value) {
|
||||||
|
if (typeof value === 'undefined') {
|
||||||
|
return this.options.disabled;
|
||||||
|
}
|
||||||
|
if (this.options.disabled === Boolean(value)) {
|
||||||
|
return this.$element;
|
||||||
|
}
|
||||||
|
return this.toggleDisabled();
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: 'toggleDisabled',
|
||||||
|
value: function toggleDisabled() {
|
||||||
|
this.options.disabled = !this.options.disabled;
|
||||||
|
this.$element.prop('disabled', this.options.disabled);
|
||||||
|
this.$wrapper.toggleClass(this._getClass('disabled'));
|
||||||
|
return this.$element;
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: 'readonly',
|
||||||
|
value: function readonly(value) {
|
||||||
|
if (typeof value === 'undefined') {
|
||||||
|
return this.options.readonly;
|
||||||
|
}
|
||||||
|
if (this.options.readonly === Boolean(value)) {
|
||||||
|
return this.$element;
|
||||||
|
}
|
||||||
|
return this.toggleReadonly();
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: 'toggleReadonly',
|
||||||
|
value: function toggleReadonly() {
|
||||||
|
this.options.readonly = !this.options.readonly;
|
||||||
|
this.$element.prop('readonly', this.options.readonly);
|
||||||
|
this.$wrapper.toggleClass(this._getClass('readonly'));
|
||||||
|
return this.$element;
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: 'indeterminate',
|
||||||
|
value: function indeterminate(value) {
|
||||||
|
if (typeof value === 'undefined') {
|
||||||
|
return this.options.indeterminate;
|
||||||
|
}
|
||||||
|
if (this.options.indeterminate === Boolean(value)) {
|
||||||
|
return this.$element;
|
||||||
|
}
|
||||||
|
return this.toggleIndeterminate();
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: 'toggleIndeterminate',
|
||||||
|
value: function toggleIndeterminate() {
|
||||||
|
this.options.indeterminate = !this.options.indeterminate;
|
||||||
|
this.$element.prop('indeterminate', this.options.indeterminate);
|
||||||
|
this.$wrapper.toggleClass(this._getClass('indeterminate'));
|
||||||
|
this._containerPosition();
|
||||||
|
return this.$element;
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: 'inverse',
|
||||||
|
value: function inverse(value) {
|
||||||
|
if (typeof value === 'undefined') {
|
||||||
|
return this.options.inverse;
|
||||||
|
}
|
||||||
|
if (this.options.inverse === Boolean(value)) {
|
||||||
|
return this.$element;
|
||||||
|
}
|
||||||
|
return this.toggleInverse();
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: 'toggleInverse',
|
||||||
|
value: function toggleInverse() {
|
||||||
|
this.$wrapper.toggleClass(this._getClass('inverse'));
|
||||||
|
var $on = this.$on.clone(true);
|
||||||
|
var $off = this.$off.clone(true);
|
||||||
|
this.$on.replaceWith($off);
|
||||||
|
this.$off.replaceWith($on);
|
||||||
|
this.$on = $off;
|
||||||
|
this.$off = $on;
|
||||||
|
this.options.inverse = !this.options.inverse;
|
||||||
|
return this.$element;
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: 'onColor',
|
||||||
|
value: function onColor(value) {
|
||||||
|
if (typeof value === 'undefined') {
|
||||||
|
return this.options.onColor;
|
||||||
|
}
|
||||||
|
if (this.options.onColor) {
|
||||||
|
this.$on.removeClass(this._getClass(this.options.onColor));
|
||||||
|
}
|
||||||
|
this.$on.addClass(this._getClass(value));
|
||||||
|
this.options.onColor = value;
|
||||||
|
return this.$element;
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: 'offColor',
|
||||||
|
value: function offColor(value) {
|
||||||
|
if (typeof value === 'undefined') {
|
||||||
|
return this.options.offColor;
|
||||||
|
}
|
||||||
|
if (this.options.offColor) {
|
||||||
|
this.$off.removeClass(this._getClass(this.options.offColor));
|
||||||
|
}
|
||||||
|
this.$off.addClass(this._getClass(value));
|
||||||
|
this.options.offColor = value;
|
||||||
|
return this.$element;
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: 'onText',
|
||||||
|
value: function onText(value) {
|
||||||
|
if (typeof value === 'undefined') {
|
||||||
|
return this.options.onText;
|
||||||
|
}
|
||||||
|
this.$on.html(value);
|
||||||
|
this._width();
|
||||||
|
this._containerPosition();
|
||||||
|
this.options.onText = value;
|
||||||
|
return this.$element;
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: 'offText',
|
||||||
|
value: function offText(value) {
|
||||||
|
if (typeof value === 'undefined') {
|
||||||
|
return this.options.offText;
|
||||||
|
}
|
||||||
|
this.$off.html(value);
|
||||||
|
this._width();
|
||||||
|
this._containerPosition();
|
||||||
|
this.options.offText = value;
|
||||||
|
return this.$element;
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: 'labelText',
|
||||||
|
value: function labelText(value) {
|
||||||
|
if (typeof value === 'undefined') {
|
||||||
|
return this.options.labelText;
|
||||||
|
}
|
||||||
|
this.$label.html(value);
|
||||||
|
this._width();
|
||||||
|
this.options.labelText = value;
|
||||||
|
return this.$element;
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: 'handleWidth',
|
||||||
|
value: function handleWidth(value) {
|
||||||
|
if (typeof value === 'undefined') {
|
||||||
|
return this.options.handleWidth;
|
||||||
|
}
|
||||||
|
this.options.handleWidth = value;
|
||||||
|
this._width();
|
||||||
|
this._containerPosition();
|
||||||
|
return this.$element;
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: 'labelWidth',
|
||||||
|
value: function labelWidth(value) {
|
||||||
|
if (typeof value === 'undefined') {
|
||||||
|
return this.options.labelWidth;
|
||||||
|
}
|
||||||
|
this.options.labelWidth = value;
|
||||||
|
this._width();
|
||||||
|
this._containerPosition();
|
||||||
|
return this.$element;
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: 'baseClass',
|
||||||
|
value: function baseClass(value) {
|
||||||
|
return this.options.baseClass;
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: 'wrapperClass',
|
||||||
|
value: function wrapperClass(value) {
|
||||||
|
if (typeof value === 'undefined') {
|
||||||
|
return this.options.wrapperClass;
|
||||||
|
}
|
||||||
|
if (!value) {
|
||||||
|
value = $.fn.bootstrapSwitch.defaults.wrapperClass;
|
||||||
|
}
|
||||||
|
this.$wrapper.removeClass(this._getClasses(this.options.wrapperClass).join(' '));
|
||||||
|
this.$wrapper.addClass(this._getClasses(value).join(' '));
|
||||||
|
this.options.wrapperClass = value;
|
||||||
|
return this.$element;
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: 'radioAllOff',
|
||||||
|
value: function radioAllOff(value) {
|
||||||
|
if (typeof value === 'undefined') {
|
||||||
|
return this.options.radioAllOff;
|
||||||
|
}
|
||||||
|
var val = Boolean(value);
|
||||||
|
if (this.options.radioAllOff === val) {
|
||||||
|
return this.$element;
|
||||||
|
}
|
||||||
|
this.options.radioAllOff = val;
|
||||||
|
return this.$element;
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: 'onInit',
|
||||||
|
value: function onInit(value) {
|
||||||
|
if (typeof value === 'undefined') {
|
||||||
|
return this.options.onInit;
|
||||||
|
}
|
||||||
|
if (!value) {
|
||||||
|
value = $.fn.bootstrapSwitch.defaults.onInit;
|
||||||
|
}
|
||||||
|
this.options.onInit = value;
|
||||||
|
return this.$element;
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: 'onSwitchChange',
|
||||||
|
value: function onSwitchChange(value) {
|
||||||
|
if (typeof value === 'undefined') {
|
||||||
|
return this.options.onSwitchChange;
|
||||||
|
}
|
||||||
|
if (!value) {
|
||||||
|
value = $.fn.bootstrapSwitch.defaults.onSwitchChange;
|
||||||
|
}
|
||||||
|
this.options.onSwitchChange = value;
|
||||||
|
return this.$element;
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: 'destroy',
|
||||||
|
value: function destroy() {
|
||||||
|
var $form = this.$element.closest('form');
|
||||||
|
if ($form.length) {
|
||||||
|
$form.off('reset.bootstrapSwitch').removeData('bootstrap-switch');
|
||||||
|
}
|
||||||
|
this.$container.children().not(this.$element).remove();
|
||||||
|
this.$element.unwrap().unwrap().off('.bootstrapSwitch').removeData('bootstrap-switch');
|
||||||
|
return this.$element;
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: '_getElementOptions',
|
||||||
|
value: function _getElementOptions() {
|
||||||
|
return {
|
||||||
|
state: this.$element.is(':checked'),
|
||||||
|
size: this.$element.data('size'),
|
||||||
|
animate: this.$element.data('animate'),
|
||||||
|
disabled: this.$element.is(':disabled'),
|
||||||
|
readonly: this.$element.is('[readonly]'),
|
||||||
|
indeterminate: this.$element.data('indeterminate'),
|
||||||
|
inverse: this.$element.data('inverse'),
|
||||||
|
radioAllOff: this.$element.data('radio-all-off'),
|
||||||
|
onColor: this.$element.data('on-color'),
|
||||||
|
offColor: this.$element.data('off-color'),
|
||||||
|
onText: this.$element.data('on-text'),
|
||||||
|
offText: this.$element.data('off-text'),
|
||||||
|
labelText: this.$element.data('label-text'),
|
||||||
|
handleWidth: this.$element.data('handle-width'),
|
||||||
|
labelWidth: this.$element.data('label-width'),
|
||||||
|
baseClass: this.$element.data('base-class'),
|
||||||
|
wrapperClass: this.$element.data('wrapper-class')
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: '_width',
|
||||||
|
value: function _width() {
|
||||||
|
var _this2 = this;
|
||||||
|
|
||||||
|
var $handles = this.$on.add(this.$off).add(this.$label).css('width', '');
|
||||||
|
var handleWidth = this.options.handleWidth === 'auto' ? Math.round(Math.max(this.$on.width(), this.$off.width())) : this.options.handleWidth;
|
||||||
|
$handles.width(handleWidth);
|
||||||
|
this.$label.width(function (index, width) {
|
||||||
|
if (_this2.options.labelWidth !== 'auto') {
|
||||||
|
return _this2.options.labelWidth;
|
||||||
|
}
|
||||||
|
if (width < handleWidth) {
|
||||||
|
return handleWidth;
|
||||||
|
}
|
||||||
|
return width;
|
||||||
|
});
|
||||||
|
this._handleWidth = this.$on.outerWidth();
|
||||||
|
this._labelWidth = this.$label.outerWidth();
|
||||||
|
this.$container.width(this._handleWidth * 2 + this._labelWidth);
|
||||||
|
return this.$wrapper.width(this._handleWidth + this._labelWidth);
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: '_containerPosition',
|
||||||
|
value: function _containerPosition() {
|
||||||
|
var _this3 = this;
|
||||||
|
|
||||||
|
var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.options.state;
|
||||||
|
var callback = arguments[1];
|
||||||
|
|
||||||
|
this.$container.css('margin-left', function () {
|
||||||
|
var values = [0, '-' + _this3._handleWidth + 'px'];
|
||||||
|
if (_this3.options.indeterminate) {
|
||||||
|
return '-' + _this3._handleWidth / 2 + 'px';
|
||||||
|
}
|
||||||
|
if (state) {
|
||||||
|
if (_this3.options.inverse) {
|
||||||
|
return values[1];
|
||||||
|
} else {
|
||||||
|
return values[0];
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (_this3.options.inverse) {
|
||||||
|
return values[0];
|
||||||
|
} else {
|
||||||
|
return values[1];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: '_init',
|
||||||
|
value: function _init() {
|
||||||
|
var _this4 = this;
|
||||||
|
|
||||||
|
var init = function init() {
|
||||||
|
_this4.setPrevOptions();
|
||||||
|
_this4._width();
|
||||||
|
_this4._containerPosition();
|
||||||
|
setTimeout(function () {
|
||||||
|
if (_this4.options.animate) {
|
||||||
|
return _this4.$wrapper.addClass(_this4._getClass('animate'));
|
||||||
|
}
|
||||||
|
}, 50);
|
||||||
|
};
|
||||||
|
if (this.$wrapper.is(':visible')) {
|
||||||
|
init();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var initInterval = window.setInterval(function () {
|
||||||
|
if (_this4.$wrapper.is(':visible')) {
|
||||||
|
init();
|
||||||
|
return window.clearInterval(initInterval);
|
||||||
|
}
|
||||||
|
}, 50);
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: '_elementHandlers',
|
||||||
|
value: function _elementHandlers() {
|
||||||
|
var _this5 = this;
|
||||||
|
|
||||||
|
return this.$element.on({
|
||||||
|
'setPreviousOptions.bootstrapSwitch': this.setPrevOptions.bind(this),
|
||||||
|
|
||||||
|
'previousState.bootstrapSwitch': function previousStateBootstrapSwitch() {
|
||||||
|
_this5.options = _this5.prevOptions;
|
||||||
|
if (_this5.options.indeterminate) {
|
||||||
|
_this5.$wrapper.addClass(_this5._getClass('indeterminate'));
|
||||||
|
}
|
||||||
|
_this5.$element.prop('checked', _this5.options.state).trigger('change.bootstrapSwitch', true);
|
||||||
|
},
|
||||||
|
|
||||||
|
'change.bootstrapSwitch': function changeBootstrapSwitch(event, skip) {
|
||||||
|
event.preventDefault();
|
||||||
|
event.stopImmediatePropagation();
|
||||||
|
var state = _this5.$element.is(':checked');
|
||||||
|
_this5._containerPosition(state);
|
||||||
|
if (state === _this5.options.state) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
_this5.options.state = state;
|
||||||
|
_this5.$wrapper.toggleClass(_this5._getClass('off')).toggleClass(_this5._getClass('on'));
|
||||||
|
if (!skip) {
|
||||||
|
if (_this5.$element.is(':radio')) {
|
||||||
|
$('[name="' + _this5.$element.attr('name') + '"]').not(_this5.$element).prop('checked', false).trigger('change.bootstrapSwitch', true);
|
||||||
|
}
|
||||||
|
_this5.$element.trigger('switchChange.bootstrapSwitch', [state]);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
'focus.bootstrapSwitch': function focusBootstrapSwitch(event) {
|
||||||
|
event.preventDefault();
|
||||||
|
_this5.$wrapper.addClass(_this5._getClass('focused'));
|
||||||
|
},
|
||||||
|
|
||||||
|
'blur.bootstrapSwitch': function blurBootstrapSwitch(event) {
|
||||||
|
event.preventDefault();
|
||||||
|
_this5.$wrapper.removeClass(_this5._getClass('focused'));
|
||||||
|
},
|
||||||
|
|
||||||
|
'keydown.bootstrapSwitch': function keydownBootstrapSwitch(event) {
|
||||||
|
if (!event.which || _this5.options.disabled || _this5.options.readonly) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (event.which === 37 || event.which === 39) {
|
||||||
|
event.preventDefault();
|
||||||
|
event.stopImmediatePropagation();
|
||||||
|
_this5.state(event.which === 39);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: '_handleHandlers',
|
||||||
|
value: function _handleHandlers() {
|
||||||
|
var _this6 = this;
|
||||||
|
|
||||||
|
this.$on.on('click.bootstrapSwitch', function (event) {
|
||||||
|
event.preventDefault();
|
||||||
|
event.stopPropagation();
|
||||||
|
_this6.state(false);
|
||||||
|
return _this6.$element.trigger('focus.bootstrapSwitch');
|
||||||
|
});
|
||||||
|
return this.$off.on('click.bootstrapSwitch', function (event) {
|
||||||
|
event.preventDefault();
|
||||||
|
event.stopPropagation();
|
||||||
|
_this6.state(true);
|
||||||
|
return _this6.$element.trigger('focus.bootstrapSwitch');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: '_labelHandlers',
|
||||||
|
value: function _labelHandlers() {
|
||||||
|
var _this7 = this;
|
||||||
|
|
||||||
|
var handlers = {
|
||||||
|
click: function click(event) {
|
||||||
|
event.stopPropagation();
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
'mousedown.bootstrapSwitch touchstart.bootstrapSwitch': function mousedownBootstrapSwitchTouchstartBootstrapSwitch(event) {
|
||||||
|
if (_this7._dragStart || _this7.options.disabled || _this7.options.readonly) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
event.preventDefault();
|
||||||
|
event.stopPropagation();
|
||||||
|
_this7._dragStart = (event.pageX || event.originalEvent.touches[0].pageX) - parseInt(_this7.$container.css('margin-left'), 10);
|
||||||
|
if (_this7.options.animate) {
|
||||||
|
_this7.$wrapper.removeClass(_this7._getClass('animate'));
|
||||||
|
}
|
||||||
|
_this7.$element.trigger('focus.bootstrapSwitch');
|
||||||
|
},
|
||||||
|
|
||||||
|
'mousemove.bootstrapSwitch touchmove.bootstrapSwitch': function mousemoveBootstrapSwitchTouchmoveBootstrapSwitch(event) {
|
||||||
|
if (_this7._dragStart == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var difference = (event.pageX || event.originalEvent.touches[0].pageX) - _this7._dragStart;
|
||||||
|
event.preventDefault();
|
||||||
|
if (difference < -_this7._handleWidth || difference > 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
_this7._dragEnd = difference;
|
||||||
|
_this7.$container.css('margin-left', _this7._dragEnd + 'px');
|
||||||
|
},
|
||||||
|
|
||||||
|
'mouseup.bootstrapSwitch touchend.bootstrapSwitch': function mouseupBootstrapSwitchTouchendBootstrapSwitch(event) {
|
||||||
|
if (!_this7._dragStart) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
event.preventDefault();
|
||||||
|
if (_this7.options.animate) {
|
||||||
|
_this7.$wrapper.addClass(_this7._getClass('animate'));
|
||||||
|
}
|
||||||
|
if (_this7._dragEnd) {
|
||||||
|
var state = _this7._dragEnd > -(_this7._handleWidth / 2);
|
||||||
|
_this7._dragEnd = false;
|
||||||
|
_this7.state(_this7.options.inverse ? !state : state);
|
||||||
|
} else {
|
||||||
|
_this7.state(!_this7.options.state);
|
||||||
|
}
|
||||||
|
_this7._dragStart = false;
|
||||||
|
},
|
||||||
|
|
||||||
|
'mouseleave.bootstrapSwitch': function mouseleaveBootstrapSwitch() {
|
||||||
|
_this7.$label.trigger('mouseup.bootstrapSwitch');
|
||||||
|
}
|
||||||
|
};
|
||||||
|
this.$label.on(handlers);
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: '_externalLabelHandler',
|
||||||
|
value: function _externalLabelHandler() {
|
||||||
|
var _this8 = this;
|
||||||
|
|
||||||
|
var $externalLabel = this.$element.closest('label');
|
||||||
|
$externalLabel.on('click', function (event) {
|
||||||
|
event.preventDefault();
|
||||||
|
event.stopImmediatePropagation();
|
||||||
|
if (event.target === $externalLabel[0]) {
|
||||||
|
_this8.toggleState();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: '_formHandler',
|
||||||
|
value: function _formHandler() {
|
||||||
|
var $form = this.$element.closest('form');
|
||||||
|
if ($form.data('bootstrap-switch')) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
$form.on('reset.bootstrapSwitch', function () {
|
||||||
|
window.setTimeout(function () {
|
||||||
|
$form.find('input').filter(function () {
|
||||||
|
return $(this).data('bootstrap-switch');
|
||||||
|
}).each(function () {
|
||||||
|
return $(this).bootstrapSwitch('state', this.checked);
|
||||||
|
});
|
||||||
|
}, 1);
|
||||||
|
}).data('bootstrap-switch', true);
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: '_getClass',
|
||||||
|
value: function _getClass(name) {
|
||||||
|
return this.options.baseClass + '-' + name;
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: '_getClasses',
|
||||||
|
value: function _getClasses(classes) {
|
||||||
|
if (!$.isArray(classes)) {
|
||||||
|
return [this._getClass(classes)];
|
||||||
|
}
|
||||||
|
return classes.map(this._getClass.bind(this));
|
||||||
|
}
|
||||||
|
}]);
|
||||||
|
|
||||||
|
return BootstrapSwitch;
|
||||||
|
}();
|
||||||
|
|
||||||
|
$.fn.bootstrapSwitch = function (option) {
|
||||||
|
for (var _len2 = arguments.length, args = Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {
|
||||||
|
args[_key2 - 1] = arguments[_key2];
|
||||||
|
}
|
||||||
|
|
||||||
|
function reducer(ret, next) {
|
||||||
|
var $this = $(next);
|
||||||
|
var existingData = $this.data('bootstrap-switch');
|
||||||
|
var data = existingData || new BootstrapSwitch(next, option);
|
||||||
|
if (!existingData) {
|
||||||
|
$this.data('bootstrap-switch', data);
|
||||||
|
}
|
||||||
|
if (typeof option === 'string') {
|
||||||
|
return data[option].apply(data, args);
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
return Array.prototype.reduce.call(this, reducer, this);
|
||||||
|
};
|
||||||
|
$.fn.bootstrapSwitch.Constructor = BootstrapSwitch;
|
||||||
|
$.fn.bootstrapSwitch.defaults = {
|
||||||
|
state: true,
|
||||||
|
size: null,
|
||||||
|
animate: true,
|
||||||
|
disabled: false,
|
||||||
|
readonly: false,
|
||||||
|
indeterminate: false,
|
||||||
|
inverse: false,
|
||||||
|
radioAllOff: false,
|
||||||
|
onColor: 'primary',
|
||||||
|
offColor: 'default',
|
||||||
|
onText: 'ON',
|
||||||
|
offText: 'OFF',
|
||||||
|
labelText: ' ',
|
||||||
|
handleWidth: 'auto',
|
||||||
|
labelWidth: 'auto',
|
||||||
|
baseClass: 'bootstrap-switch',
|
||||||
|
wrapperClass: 'wrapper',
|
||||||
|
onInit: function onInit() {},
|
||||||
|
onSwitchChange: function onSwitchChange() {}
|
||||||
|
};
|
||||||
|
});
|
10
public/plugins/bootstrap-switch/js/bootstrap-switch.min.js
vendored
Normal file
10
public/plugins/bootstrap-switch/js/bootstrap-switch.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
7031
public/plugins/bootstrap/js/bootstrap.bundle.js
vendored
Normal file
7031
public/plugins/bootstrap/js/bootstrap.bundle.js
vendored
Normal file
File diff suppressed because it is too large
Load diff
1
public/plugins/bootstrap/js/bootstrap.bundle.js.map
Normal file
1
public/plugins/bootstrap/js/bootstrap.bundle.js.map
Normal file
File diff suppressed because one or more lines are too long
7
public/plugins/bootstrap/js/bootstrap.bundle.min.js
vendored
Normal file
7
public/plugins/bootstrap/js/bootstrap.bundle.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
public/plugins/bootstrap/js/bootstrap.bundle.min.js.map
Normal file
1
public/plugins/bootstrap/js/bootstrap.bundle.min.js.map
Normal file
File diff suppressed because one or more lines are too long
4418
public/plugins/bootstrap/js/bootstrap.js
vendored
Normal file
4418
public/plugins/bootstrap/js/bootstrap.js
vendored
Normal file
File diff suppressed because it is too large
Load diff
1
public/plugins/bootstrap/js/bootstrap.js.map
Normal file
1
public/plugins/bootstrap/js/bootstrap.js.map
Normal file
File diff suppressed because one or more lines are too long
7
public/plugins/bootstrap/js/bootstrap.min.js
vendored
Normal file
7
public/plugins/bootstrap/js/bootstrap.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
public/plugins/bootstrap/js/bootstrap.min.js.map
Normal file
1
public/plugins/bootstrap/js/bootstrap.min.js.map
Normal file
File diff suppressed because one or more lines are too long
87
public/plugins/bootstrap4-duallistbox/bootstrap-duallistbox.css
vendored
Normal file
87
public/plugins/bootstrap4-duallistbox/bootstrap-duallistbox.css
vendored
Normal file
|
@ -0,0 +1,87 @@
|
||||||
|
/*
|
||||||
|
* Bootstrap Duallistbox - v4.0.2
|
||||||
|
* A responsive dual listbox widget optimized for Twitter Bootstrap. It works on all modern browsers and on touch devices.
|
||||||
|
* http://www.virtuosoft.eu/code/bootstrap-duallistbox/
|
||||||
|
*
|
||||||
|
* Made by István Ujj-Mészáros
|
||||||
|
* Under Apache License v2.0 License
|
||||||
|
*/
|
||||||
|
.bootstrap-duallistbox-container .buttons {
|
||||||
|
width: 100%;
|
||||||
|
margin-bottom: -1px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.bootstrap-duallistbox-container label {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
.bootstrap-duallistbox-container .info {
|
||||||
|
display: inline-block;
|
||||||
|
margin-bottom: 5px;
|
||||||
|
font-size: 11px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.bootstrap-duallistbox-container .clear1,
|
||||||
|
.bootstrap-duallistbox-container .clear2 {
|
||||||
|
display: none;
|
||||||
|
font-size: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.bootstrap-duallistbox-container .box1.filtered .clear1,
|
||||||
|
.bootstrap-duallistbox-container .box2.filtered .clear2 {
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
|
||||||
|
.bootstrap-duallistbox-container .move,
|
||||||
|
.bootstrap-duallistbox-container .remove {
|
||||||
|
width: 50%;
|
||||||
|
box-sizing: content-box;
|
||||||
|
}
|
||||||
|
|
||||||
|
.bootstrap-duallistbox-container .btn-group .btn {
|
||||||
|
border-bottom-left-radius: 0;
|
||||||
|
border-bottom-right-radius: 0;
|
||||||
|
}
|
||||||
|
.bootstrap-duallistbox-container:not(.moveonselect) select {
|
||||||
|
border-top-left-radius: 0;
|
||||||
|
border-top-right-radius: 0;
|
||||||
|
}
|
||||||
|
.bootstrap-duallistbox-container .moveall,
|
||||||
|
.bootstrap-duallistbox-container .removeall {
|
||||||
|
width: 50%;
|
||||||
|
box-sizing: content-box;
|
||||||
|
}
|
||||||
|
|
||||||
|
.bootstrap-duallistbox-container.bs2compatible .btn-group > .btn + .btn {
|
||||||
|
margin-left: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.bootstrap-duallistbox-container select {
|
||||||
|
width: 100%;
|
||||||
|
height: 300px;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.bootstrap-duallistbox-container .filter {
|
||||||
|
display: inline-block;
|
||||||
|
width: 100%;
|
||||||
|
height: 31px;
|
||||||
|
margin: 0 0 5px 0;
|
||||||
|
-webkit-box-sizing: border-box;
|
||||||
|
-moz-box-sizing: border-box;
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
|
||||||
|
.bootstrap-duallistbox-container .filter.placeholder {
|
||||||
|
color: #aaa;
|
||||||
|
}
|
||||||
|
|
||||||
|
.bootstrap-duallistbox-container.moveonselect .move,
|
||||||
|
.bootstrap-duallistbox-container.moveonselect .remove {
|
||||||
|
display:none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.bootstrap-duallistbox-container.moveonselect .moveall,
|
||||||
|
.bootstrap-duallistbox-container.moveonselect .removeall {
|
||||||
|
width: 100%;
|
||||||
|
}
|
1
public/plugins/bootstrap4-duallistbox/bootstrap-duallistbox.min.css
vendored
Normal file
1
public/plugins/bootstrap4-duallistbox/bootstrap-duallistbox.min.css
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
.bootstrap-duallistbox-container .buttons{width:100%;margin-bottom:-1px}.bootstrap-duallistbox-container label{display:block}.bootstrap-duallistbox-container .info{display:inline-block;margin-bottom:5px;font-size:11px}.bootstrap-duallistbox-container .clear1,.bootstrap-duallistbox-container .clear2{display:none;font-size:10px}.bootstrap-duallistbox-container .box1.filtered .clear1,.bootstrap-duallistbox-container .box2.filtered .clear2{display:inline-block}.bootstrap-duallistbox-container .move,.bootstrap-duallistbox-container .remove{width:50%;box-sizing:content-box}.bootstrap-duallistbox-container .btn-group .btn{border-bottom-left-radius:0;border-bottom-right-radius:0}.bootstrap-duallistbox-container:not(.moveonselect) select{border-top-left-radius:0;border-top-right-radius:0}.bootstrap-duallistbox-container .moveall,.bootstrap-duallistbox-container .removeall{width:50%;box-sizing:content-box}.bootstrap-duallistbox-container.bs2compatible .btn-group>.btn+.btn{margin-left:0}.bootstrap-duallistbox-container select{width:100%;height:300px;padding:0}.bootstrap-duallistbox-container .filter{display:inline-block;width:100%;height:31px;margin:0 0 5px 0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.bootstrap-duallistbox-container .filter.placeholder{color:#aaa}.bootstrap-duallistbox-container.moveonselect .move,.bootstrap-duallistbox-container.moveonselect .remove{display:none}.bootstrap-duallistbox-container.moveonselect .moveall,.bootstrap-duallistbox-container.moveonselect .removeall{width:100%}
|
893
public/plugins/bootstrap4-duallistbox/jquery.bootstrap-duallistbox.js
vendored
Normal file
893
public/plugins/bootstrap4-duallistbox/jquery.bootstrap-duallistbox.js
vendored
Normal file
|
@ -0,0 +1,893 @@
|
||||||
|
/*
|
||||||
|
* Bootstrap Duallistbox - v4.0.2
|
||||||
|
* A responsive dual listbox widget optimized for Twitter Bootstrap. It works on all modern browsers and on touch devices.
|
||||||
|
* http://www.virtuosoft.eu/code/bootstrap-duallistbox/
|
||||||
|
*
|
||||||
|
* Made by István Ujj-Mészáros
|
||||||
|
* Under Apache License v2.0 License
|
||||||
|
*/
|
||||||
|
(function(factory) {
|
||||||
|
if (typeof define === 'function' && define.amd) {
|
||||||
|
define(['jquery'], factory);
|
||||||
|
} else if (typeof module === 'object' && module.exports) {
|
||||||
|
module.exports = function(root, jQuery) {
|
||||||
|
if (jQuery === undefined) {
|
||||||
|
if (typeof window !== 'undefined') {
|
||||||
|
jQuery = require('jquery');
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
jQuery = require('jquery')(root);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
factory(jQuery);
|
||||||
|
return jQuery;
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
factory(jQuery);
|
||||||
|
}
|
||||||
|
}(function($) {
|
||||||
|
// Create the defaults once
|
||||||
|
var pluginName = 'bootstrapDualListbox',
|
||||||
|
defaults = {
|
||||||
|
filterTextClear: 'show all',
|
||||||
|
filterPlaceHolder: 'Filter',
|
||||||
|
moveSelectedLabel: 'Move selected',
|
||||||
|
moveAllLabel: 'Move all',
|
||||||
|
removeSelectedLabel: 'Remove selected',
|
||||||
|
removeAllLabel: 'Remove all',
|
||||||
|
moveOnSelect: true, // true/false (forced true on androids, see the comment later)
|
||||||
|
moveOnDoubleClick: true, // true/false (forced false on androids, cause moveOnSelect is forced to true)
|
||||||
|
preserveSelectionOnMove: false, // 'all' / 'moved' / false
|
||||||
|
selectedListLabel: false, // 'string', false
|
||||||
|
nonSelectedListLabel: false, // 'string', false
|
||||||
|
helperSelectNamePostfix: '_helper', // 'string_of_postfix' / false
|
||||||
|
selectorMinimalHeight: 100,
|
||||||
|
showFilterInputs: true, // whether to show filter inputs
|
||||||
|
nonSelectedFilter: '', // string, filter the non selected options
|
||||||
|
selectedFilter: '', // string, filter the selected options
|
||||||
|
infoText: 'Showing all {0}', // text when all options are visible / false for no info text
|
||||||
|
infoTextFiltered: '<span class="badge badge-warning">Filtered</span> {0} from {1}', // when not all of the options are visible due to the filter
|
||||||
|
infoTextEmpty: 'Empty list', // when there are no options present in the list
|
||||||
|
filterOnValues: false, // filter by selector's values, boolean
|
||||||
|
sortByInputOrder: false,
|
||||||
|
eventMoveOverride: false, // boolean, allows user to unbind default event behaviour and run their own instead
|
||||||
|
eventMoveAllOverride: false, // boolean, allows user to unbind default event behaviour and run their own instead
|
||||||
|
eventRemoveOverride: false, // boolean, allows user to unbind default event behaviour and run their own instead
|
||||||
|
eventRemoveAllOverride: false, // boolean, allows user to unbind default event behaviour and run their own instead
|
||||||
|
btnClass: 'btn-outline-secondary', // sets the button style class for all the buttons
|
||||||
|
btnMoveText: '>', // string, sets the text for the "Move" button
|
||||||
|
btnRemoveText: '<', // string, sets the text for the "Remove" button
|
||||||
|
btnMoveAllText: '>>', // string, sets the text for the "Move All" button
|
||||||
|
btnRemoveAllText: '<<' // string, sets the text for the "Remove All" button
|
||||||
|
},
|
||||||
|
// Selections are invisible on android if the containing select is styled with CSS
|
||||||
|
// http://code.google.com/p/android/issues/detail?id=16922
|
||||||
|
isBuggyAndroid = /android/i.test(navigator.userAgent.toLowerCase());
|
||||||
|
|
||||||
|
// The actual plugin constructor
|
||||||
|
function BootstrapDualListbox(element, options) {
|
||||||
|
this.element = $(element);
|
||||||
|
// jQuery has an extend method which merges the contents of two or
|
||||||
|
// more objects, storing the result in the first object. The first object
|
||||||
|
// is generally empty as we don't want to alter the default options for
|
||||||
|
// future instances of the plugin
|
||||||
|
this.settings = $.extend({}, defaults, options);
|
||||||
|
this._defaults = defaults;
|
||||||
|
this._name = pluginName;
|
||||||
|
this.init();
|
||||||
|
}
|
||||||
|
|
||||||
|
function triggerChangeEvent(dualListbox) {
|
||||||
|
dualListbox.element.trigger('change');
|
||||||
|
}
|
||||||
|
|
||||||
|
function updateSelectionStates(dualListbox) {
|
||||||
|
dualListbox.element.find('option').each(function(index, item) {
|
||||||
|
var $item = $(item);
|
||||||
|
if (typeof($item.data('original-index')) === 'undefined') {
|
||||||
|
$item.data('original-index', dualListbox.elementCount++);
|
||||||
|
}
|
||||||
|
if (typeof($item.data('_selected')) === 'undefined') {
|
||||||
|
$item.data('_selected', false);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function changeSelectionState(dualListbox, original_index, selected) {
|
||||||
|
dualListbox.element.find('option').each(function(index, item) {
|
||||||
|
var $item = $(item);
|
||||||
|
if ($item.data('original-index') === original_index) {
|
||||||
|
$item.prop('selected', selected);
|
||||||
|
if(selected){
|
||||||
|
$item.attr('data-sortindex', dualListbox.sortIndex);
|
||||||
|
dualListbox.sortIndex++;
|
||||||
|
} else {
|
||||||
|
$item.removeAttr('data-sortindex');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function formatString(s, args) {
|
||||||
|
console.log(s, args);
|
||||||
|
return s.replace(/{(\d+)}/g, function(match, number) {
|
||||||
|
return typeof args[number] !== 'undefined' ? args[number] : match;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function refreshInfo(dualListbox) {
|
||||||
|
if (!dualListbox.settings.infoText) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var visible1 = dualListbox.elements.select1.find('option').length,
|
||||||
|
visible2 = dualListbox.elements.select2.find('option').length,
|
||||||
|
all1 = dualListbox.element.find('option').length - dualListbox.selectedElements,
|
||||||
|
all2 = dualListbox.selectedElements,
|
||||||
|
content = '';
|
||||||
|
|
||||||
|
if (all1 === 0) {
|
||||||
|
content = dualListbox.settings.infoTextEmpty;
|
||||||
|
} else if (visible1 === all1) {
|
||||||
|
content = formatString(dualListbox.settings.infoText, [visible1, all1]);
|
||||||
|
} else {
|
||||||
|
content = formatString(dualListbox.settings.infoTextFiltered, [visible1, all1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
dualListbox.elements.info1.html(content);
|
||||||
|
dualListbox.elements.box1.toggleClass('filtered', !(visible1 === all1 || all1 === 0));
|
||||||
|
|
||||||
|
if (all2 === 0) {
|
||||||
|
content = dualListbox.settings.infoTextEmpty;
|
||||||
|
} else if (visible2 === all2) {
|
||||||
|
content = formatString(dualListbox.settings.infoText, [visible2, all2]);
|
||||||
|
} else {
|
||||||
|
content = formatString(dualListbox.settings.infoTextFiltered, [visible2, all2]);
|
||||||
|
}
|
||||||
|
|
||||||
|
dualListbox.elements.info2.html(content);
|
||||||
|
dualListbox.elements.box2.toggleClass('filtered', !(visible2 === all2 || all2 === 0));
|
||||||
|
}
|
||||||
|
|
||||||
|
function refreshSelects(dualListbox) {
|
||||||
|
dualListbox.selectedElements = 0;
|
||||||
|
|
||||||
|
dualListbox.elements.select1.empty();
|
||||||
|
dualListbox.elements.select2.empty();
|
||||||
|
|
||||||
|
dualListbox.element.find('option').each(function(index, item) {
|
||||||
|
var $item = $(item);
|
||||||
|
if ($item.prop('selected')) {
|
||||||
|
dualListbox.selectedElements++;
|
||||||
|
dualListbox.elements.select2.append($item.clone(true).prop('selected', $item.data('_selected')));
|
||||||
|
} else {
|
||||||
|
dualListbox.elements.select1.append($item.clone(true).prop('selected', $item.data('_selected')));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
if (dualListbox.settings.showFilterInputs) {
|
||||||
|
filter(dualListbox, 1);
|
||||||
|
filter(dualListbox, 2);
|
||||||
|
}
|
||||||
|
refreshInfo(dualListbox);
|
||||||
|
}
|
||||||
|
|
||||||
|
function filter(dualListbox, selectIndex) {
|
||||||
|
if (!dualListbox.settings.showFilterInputs) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
saveSelections(dualListbox, selectIndex);
|
||||||
|
|
||||||
|
dualListbox.elements['select'+selectIndex].empty().scrollTop(0);
|
||||||
|
var regex,
|
||||||
|
allOptions = dualListbox.element.find('option'),
|
||||||
|
options = dualListbox.element;
|
||||||
|
|
||||||
|
if (selectIndex === 1) {
|
||||||
|
options = allOptions.not(':selected');
|
||||||
|
} else {
|
||||||
|
options = options.find('option:selected');
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
regex = new RegExp($.trim(dualListbox.elements['filterInput'+selectIndex].val()), 'gi');
|
||||||
|
}
|
||||||
|
catch(e) {
|
||||||
|
// a regex to match nothing
|
||||||
|
regex = new RegExp('/a^/', 'gi');
|
||||||
|
}
|
||||||
|
|
||||||
|
options.each(function(index, item) {
|
||||||
|
var $item = $(item),
|
||||||
|
isFiltered = true;
|
||||||
|
if (item.text.match(regex) || (dualListbox.settings.filterOnValues && $item.attr('value').match(regex) ) ) {
|
||||||
|
isFiltered = false;
|
||||||
|
dualListbox.elements['select'+selectIndex].append($item.clone(true).prop('selected', $item.data('_selected')));
|
||||||
|
}
|
||||||
|
allOptions.eq($item.data('original-index')).data('filtered'+selectIndex, isFiltered);
|
||||||
|
});
|
||||||
|
|
||||||
|
refreshInfo(dualListbox);
|
||||||
|
}
|
||||||
|
|
||||||
|
function saveSelections(dualListbox, selectIndex) {
|
||||||
|
var options = dualListbox.element.find('option');
|
||||||
|
dualListbox.elements['select'+selectIndex].find('option').each(function(index, item) {
|
||||||
|
var $item = $(item);
|
||||||
|
options.eq($item.data('original-index')).data('_selected', $item.prop('selected'));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function sortOptionsByInputOrder(select){
|
||||||
|
var selectopt = select.children('option');
|
||||||
|
|
||||||
|
selectopt.sort(function(a,b){
|
||||||
|
var an = parseInt(a.getAttribute('data-sortindex')),
|
||||||
|
bn = parseInt(b.getAttribute('data-sortindex'));
|
||||||
|
|
||||||
|
if(an > bn) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
if(an < bn) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
});
|
||||||
|
|
||||||
|
selectopt.detach().appendTo(select);
|
||||||
|
}
|
||||||
|
|
||||||
|
function sortOptions(select, dualListbox) {
|
||||||
|
select.find('option').sort(function(a, b) {
|
||||||
|
return ($(a).data('original-index') > $(b).data('original-index')) ? 1 : -1;
|
||||||
|
}).appendTo(select);
|
||||||
|
|
||||||
|
// workaround for chromium bug: https://bugs.chromium.org/p/chromium/issues/detail?id=1072475
|
||||||
|
refreshSelects(dualListbox);
|
||||||
|
}
|
||||||
|
|
||||||
|
function clearSelections(dualListbox) {
|
||||||
|
dualListbox.elements.select1.find('option').each(function() {
|
||||||
|
dualListbox.element.find('option').data('_selected', false);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function move(dualListbox) {
|
||||||
|
if (dualListbox.settings.preserveSelectionOnMove === 'all' && !dualListbox.settings.moveOnSelect) {
|
||||||
|
saveSelections(dualListbox, 1);
|
||||||
|
saveSelections(dualListbox, 2);
|
||||||
|
} else if (dualListbox.settings.preserveSelectionOnMove === 'moved' && !dualListbox.settings.moveOnSelect) {
|
||||||
|
saveSelections(dualListbox, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
dualListbox.elements.select1.find('option:selected').each(function(index, item) {
|
||||||
|
var $item = $(item);
|
||||||
|
if (!$item.data('filtered1')) {
|
||||||
|
changeSelectionState(dualListbox, $item.data('original-index'), true);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
refreshSelects(dualListbox);
|
||||||
|
triggerChangeEvent(dualListbox);
|
||||||
|
if(dualListbox.settings.sortByInputOrder){
|
||||||
|
sortOptionsByInputOrder(dualListbox.elements.select2);
|
||||||
|
} else {
|
||||||
|
sortOptions(dualListbox.elements.select2, dualListbox);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function remove(dualListbox) {
|
||||||
|
if (dualListbox.settings.preserveSelectionOnMove === 'all' && !dualListbox.settings.moveOnSelect) {
|
||||||
|
saveSelections(dualListbox, 1);
|
||||||
|
saveSelections(dualListbox, 2);
|
||||||
|
} else if (dualListbox.settings.preserveSelectionOnMove === 'moved' && !dualListbox.settings.moveOnSelect) {
|
||||||
|
saveSelections(dualListbox, 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
dualListbox.elements.select2.find('option:selected').each(function(index, item) {
|
||||||
|
var $item = $(item);
|
||||||
|
if (!$item.data('filtered2')) {
|
||||||
|
changeSelectionState(dualListbox, $item.data('original-index'), false);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
refreshSelects(dualListbox);
|
||||||
|
triggerChangeEvent(dualListbox);
|
||||||
|
sortOptions(dualListbox.elements.select1, dualListbox);
|
||||||
|
if(dualListbox.settings.sortByInputOrder){
|
||||||
|
sortOptionsByInputOrder(dualListbox.elements.select2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function moveAll(dualListbox) {
|
||||||
|
if (dualListbox.settings.preserveSelectionOnMove === 'all' && !dualListbox.settings.moveOnSelect) {
|
||||||
|
saveSelections(dualListbox, 1);
|
||||||
|
saveSelections(dualListbox, 2);
|
||||||
|
} else if (dualListbox.settings.preserveSelectionOnMove === 'moved' && !dualListbox.settings.moveOnSelect) {
|
||||||
|
saveSelections(dualListbox, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
dualListbox.element.find('option').each(function(index, item) {
|
||||||
|
var $item = $(item);
|
||||||
|
if (!$item.data('filtered1')) {
|
||||||
|
$item.prop('selected', true);
|
||||||
|
$item.attr('data-sortindex', dualListbox.sortIndex);
|
||||||
|
dualListbox.sortIndex++;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
refreshSelects(dualListbox);
|
||||||
|
triggerChangeEvent(dualListbox);
|
||||||
|
}
|
||||||
|
|
||||||
|
function removeAll(dualListbox) {
|
||||||
|
if (dualListbox.settings.preserveSelectionOnMove === 'all' && !dualListbox.settings.moveOnSelect) {
|
||||||
|
saveSelections(dualListbox, 1);
|
||||||
|
saveSelections(dualListbox, 2);
|
||||||
|
} else if (dualListbox.settings.preserveSelectionOnMove === 'moved' && !dualListbox.settings.moveOnSelect) {
|
||||||
|
saveSelections(dualListbox, 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
dualListbox.element.find('option').each(function(index, item) {
|
||||||
|
var $item = $(item);
|
||||||
|
if (!$item.data('filtered2')) {
|
||||||
|
$item.prop('selected', false);
|
||||||
|
$item.removeAttr('data-sortindex');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
refreshSelects(dualListbox);
|
||||||
|
triggerChangeEvent(dualListbox);
|
||||||
|
}
|
||||||
|
|
||||||
|
function bindEvents(dualListbox) {
|
||||||
|
dualListbox.elements.form.submit(function(e) {
|
||||||
|
if (dualListbox.elements.filterInput1.is(':focus')) {
|
||||||
|
e.preventDefault();
|
||||||
|
dualListbox.elements.filterInput1.focusout();
|
||||||
|
} else if (dualListbox.elements.filterInput2.is(':focus')) {
|
||||||
|
e.preventDefault();
|
||||||
|
dualListbox.elements.filterInput2.focusout();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
dualListbox.element.on('bootstrapDualListbox.refresh', function(e, mustClearSelections){
|
||||||
|
dualListbox.refresh(mustClearSelections);
|
||||||
|
});
|
||||||
|
|
||||||
|
dualListbox.elements.filterClear1.on('click', function() {
|
||||||
|
dualListbox.setNonSelectedFilter('', true);
|
||||||
|
});
|
||||||
|
|
||||||
|
dualListbox.elements.filterClear2.on('click', function() {
|
||||||
|
dualListbox.setSelectedFilter('', true);
|
||||||
|
});
|
||||||
|
|
||||||
|
if (dualListbox.settings.eventMoveOverride === false) {
|
||||||
|
dualListbox.elements.moveButton.on('click', function() {
|
||||||
|
move(dualListbox);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (dualListbox.settings.eventMoveAllOverride === false) {
|
||||||
|
dualListbox.elements.moveAllButton.on('click', function() {
|
||||||
|
moveAll(dualListbox);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (dualListbox.settings.eventRemoveOverride === false) {
|
||||||
|
dualListbox.elements.removeButton.on('click', function() {
|
||||||
|
remove(dualListbox);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (dualListbox.settings.eventRemoveAllOverride === false) {
|
||||||
|
dualListbox.elements.removeAllButton.on('click', function() {
|
||||||
|
removeAll(dualListbox);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
dualListbox.elements.filterInput1.on('change keyup', function() {
|
||||||
|
filter(dualListbox, 1);
|
||||||
|
});
|
||||||
|
|
||||||
|
dualListbox.elements.filterInput2.on('change keyup', function() {
|
||||||
|
filter(dualListbox, 2);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
BootstrapDualListbox.prototype = {
|
||||||
|
init: function () {
|
||||||
|
// Add the custom HTML template
|
||||||
|
this.container = $('' +
|
||||||
|
'<div class="bootstrap-duallistbox-container row">' +
|
||||||
|
' <div class="box1 col-md-6">' +
|
||||||
|
' <label></label>' +
|
||||||
|
' <span class="info-container">' +
|
||||||
|
' <span class="info"></span>' +
|
||||||
|
' <button type="button" class="btn btn-sm clear1" style="float:right!important;"></button>' +
|
||||||
|
' </span>' +
|
||||||
|
' <input class="form-control filter" type="text">' +
|
||||||
|
' <div class="btn-group buttons">' +
|
||||||
|
' <button type="button" class="btn moveall"></button>' +
|
||||||
|
' <button type="button" class="btn move"></button>' +
|
||||||
|
' </div>' +
|
||||||
|
' <select multiple="multiple"></select>' +
|
||||||
|
' </div>' +
|
||||||
|
' <div class="box2 col-md-6">' +
|
||||||
|
' <label></label>' +
|
||||||
|
' <span class="info-container">' +
|
||||||
|
' <span class="info"></span>' +
|
||||||
|
' <button type="button" class="btn btn-sm clear2" style="float:right!important;"></button>' +
|
||||||
|
' </span>' +
|
||||||
|
' <input class="form-control filter" type="text">' +
|
||||||
|
' <div class="btn-group buttons">' +
|
||||||
|
' <button type="button" class="btn remove"></button>' +
|
||||||
|
' <button type="button" class="btn removeall"></button>' +
|
||||||
|
' </div>' +
|
||||||
|
' <select multiple="multiple"></select>' +
|
||||||
|
' </div>' +
|
||||||
|
'</div>')
|
||||||
|
.insertBefore(this.element);
|
||||||
|
|
||||||
|
// Cache the inner elements
|
||||||
|
this.elements = {
|
||||||
|
originalSelect: this.element,
|
||||||
|
box1: $('.box1', this.container),
|
||||||
|
box2: $('.box2', this.container),
|
||||||
|
filterInput1: $('.box1 .filter', this.container),
|
||||||
|
filterInput2: $('.box2 .filter', this.container),
|
||||||
|
filterClear1: $('.box1 .clear1', this.container),
|
||||||
|
filterClear2: $('.box2 .clear2', this.container),
|
||||||
|
label1: $('.box1 > label', this.container),
|
||||||
|
label2: $('.box2 > label', this.container),
|
||||||
|
info1: $('.box1 .info', this.container),
|
||||||
|
info2: $('.box2 .info', this.container),
|
||||||
|
select1: $('.box1 select', this.container),
|
||||||
|
select2: $('.box2 select', this.container),
|
||||||
|
moveButton: $('.box1 .move', this.container),
|
||||||
|
removeButton: $('.box2 .remove', this.container),
|
||||||
|
moveAllButton: $('.box1 .moveall', this.container),
|
||||||
|
removeAllButton: $('.box2 .removeall', this.container),
|
||||||
|
form: $($('.box1 .filter', this.container)[0].form)
|
||||||
|
};
|
||||||
|
|
||||||
|
// Set select IDs
|
||||||
|
this.originalSelectName = this.element.attr('name') || '';
|
||||||
|
var select1Id = 'bootstrap-duallistbox-nonselected-list_' + this.originalSelectName,
|
||||||
|
select2Id = 'bootstrap-duallistbox-selected-list_' + this.originalSelectName;
|
||||||
|
this.elements.select1.attr('id', select1Id);
|
||||||
|
this.elements.select2.attr('id', select2Id);
|
||||||
|
this.elements.label1.attr('for', select1Id);
|
||||||
|
this.elements.label2.attr('for', select2Id);
|
||||||
|
|
||||||
|
// Apply all settings
|
||||||
|
this.selectedElements = 0;
|
||||||
|
this.sortIndex = 0;
|
||||||
|
this.elementCount = 0;
|
||||||
|
this.setFilterTextClear(this.settings.filterTextClear);
|
||||||
|
this.setFilterPlaceHolder(this.settings.filterPlaceHolder);
|
||||||
|
this.setMoveSelectedLabel(this.settings.moveSelectedLabel);
|
||||||
|
this.setMoveAllLabel(this.settings.moveAllLabel);
|
||||||
|
this.setRemoveSelectedLabel(this.settings.removeSelectedLabel);
|
||||||
|
this.setRemoveAllLabel(this.settings.removeAllLabel);
|
||||||
|
this.setMoveOnSelect(this.settings.moveOnSelect);
|
||||||
|
this.setMoveOnDoubleClick(this.settings.moveOnDoubleClick);
|
||||||
|
this.setPreserveSelectionOnMove(this.settings.preserveSelectionOnMove);
|
||||||
|
this.setSelectedListLabel(this.settings.selectedListLabel);
|
||||||
|
this.setNonSelectedListLabel(this.settings.nonSelectedListLabel);
|
||||||
|
this.setHelperSelectNamePostfix(this.settings.helperSelectNamePostfix);
|
||||||
|
this.setSelectOrMinimalHeight(this.settings.selectorMinimalHeight);
|
||||||
|
|
||||||
|
updateSelectionStates(this);
|
||||||
|
|
||||||
|
this.setShowFilterInputs(this.settings.showFilterInputs);
|
||||||
|
this.setNonSelectedFilter(this.settings.nonSelectedFilter);
|
||||||
|
this.setSelectedFilter(this.settings.selectedFilter);
|
||||||
|
this.setInfoText(this.settings.infoText);
|
||||||
|
this.setInfoTextFiltered(this.settings.infoTextFiltered);
|
||||||
|
this.setInfoTextEmpty(this.settings.infoTextEmpty);
|
||||||
|
this.setFilterOnValues(this.settings.filterOnValues);
|
||||||
|
this.setSortByInputOrder(this.settings.sortByInputOrder);
|
||||||
|
this.setEventMoveOverride(this.settings.eventMoveOverride);
|
||||||
|
this.setEventMoveAllOverride(this.settings.eventMoveAllOverride);
|
||||||
|
this.setEventRemoveOverride(this.settings.eventRemoveOverride);
|
||||||
|
this.setEventRemoveAllOverride(this.settings.eventRemoveAllOverride);
|
||||||
|
this.setBtnClass(this.settings.btnClass);
|
||||||
|
this.setBtnMoveText(this.settings.btnMoveText);
|
||||||
|
this.setBtnRemoveText(this.settings.btnRemoveText);
|
||||||
|
this.setBtnMoveAllText(this.settings.btnMoveAllText);
|
||||||
|
this.setBtnRemoveAllText(this.settings.btnRemoveAllText);
|
||||||
|
|
||||||
|
// Hide the original select
|
||||||
|
this.element.hide();
|
||||||
|
|
||||||
|
bindEvents(this);
|
||||||
|
refreshSelects(this);
|
||||||
|
|
||||||
|
return this.element;
|
||||||
|
},
|
||||||
|
setFilterTextClear: function(value, refresh) {
|
||||||
|
this.settings.filterTextClear = value;
|
||||||
|
this.elements.filterClear1.html(value);
|
||||||
|
this.elements.filterClear2.html(value);
|
||||||
|
if (refresh) {
|
||||||
|
refreshSelects(this);
|
||||||
|
}
|
||||||
|
return this.element;
|
||||||
|
},
|
||||||
|
setFilterPlaceHolder: function(value, refresh) {
|
||||||
|
this.settings.filterPlaceHolder = value;
|
||||||
|
this.elements.filterInput1.attr('placeholder', value);
|
||||||
|
this.elements.filterInput2.attr('placeholder', value);
|
||||||
|
if (refresh) {
|
||||||
|
refreshSelects(this);
|
||||||
|
}
|
||||||
|
return this.element;
|
||||||
|
},
|
||||||
|
setMoveSelectedLabel: function(value, refresh) {
|
||||||
|
this.settings.moveSelectedLabel = value;
|
||||||
|
this.elements.moveButton.attr('title', value);
|
||||||
|
if (refresh) {
|
||||||
|
refreshSelects(this);
|
||||||
|
}
|
||||||
|
return this.element;
|
||||||
|
},
|
||||||
|
setMoveAllLabel: function(value, refresh) {
|
||||||
|
this.settings.moveAllLabel = value;
|
||||||
|
this.elements.moveAllButton.attr('title', value);
|
||||||
|
if (refresh) {
|
||||||
|
refreshSelects(this);
|
||||||
|
}
|
||||||
|
return this.element;
|
||||||
|
},
|
||||||
|
setRemoveSelectedLabel: function(value, refresh) {
|
||||||
|
this.settings.removeSelectedLabel = value;
|
||||||
|
this.elements.removeButton.attr('title', value);
|
||||||
|
if (refresh) {
|
||||||
|
refreshSelects(this);
|
||||||
|
}
|
||||||
|
return this.element;
|
||||||
|
},
|
||||||
|
setRemoveAllLabel: function(value, refresh) {
|
||||||
|
this.settings.removeAllLabel = value;
|
||||||
|
this.elements.removeAllButton.attr('title', value);
|
||||||
|
if (refresh) {
|
||||||
|
refreshSelects(this);
|
||||||
|
}
|
||||||
|
return this.element;
|
||||||
|
},
|
||||||
|
setMoveOnSelect: function(value, refresh) {
|
||||||
|
if (isBuggyAndroid) {
|
||||||
|
value = true;
|
||||||
|
}
|
||||||
|
this.settings.moveOnSelect = value;
|
||||||
|
if (this.settings.moveOnSelect) {
|
||||||
|
this.container.addClass('moveonselect');
|
||||||
|
var self = this;
|
||||||
|
this.elements.select1.on('change', function() {
|
||||||
|
move(self);
|
||||||
|
});
|
||||||
|
this.elements.select2.on('change', function() {
|
||||||
|
remove(self);
|
||||||
|
});
|
||||||
|
this.elements.moveButton.detach();
|
||||||
|
this.elements.removeButton.detach();
|
||||||
|
} else {
|
||||||
|
this.container.removeClass('moveonselect');
|
||||||
|
this.elements.select1.off('change');
|
||||||
|
this.elements.select2.off('change');
|
||||||
|
this.elements.moveButton.insertAfter(this.elements.moveAllButton);
|
||||||
|
this.elements.removeButton.insertBefore(this.elements.removeAllButton);
|
||||||
|
}
|
||||||
|
if (refresh) {
|
||||||
|
refreshSelects(this);
|
||||||
|
}
|
||||||
|
return this.element;
|
||||||
|
},
|
||||||
|
setMoveOnDoubleClick: function(value, refresh) {
|
||||||
|
if (isBuggyAndroid) {
|
||||||
|
value = false;
|
||||||
|
}
|
||||||
|
this.settings.moveOnDoubleClick = value;
|
||||||
|
if (this.settings.moveOnDoubleClick) {
|
||||||
|
this.container.addClass('moveondoubleclick');
|
||||||
|
var self = this;
|
||||||
|
this.elements.select1.on('dblclick', function() {
|
||||||
|
move(self);
|
||||||
|
});
|
||||||
|
this.elements.select2.on('dblclick', function() {
|
||||||
|
remove(self);
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
this.container.removeClass('moveondoubleclick');
|
||||||
|
this.elements.select1.off('dblclick');
|
||||||
|
this.elements.select2.off('dblclick');
|
||||||
|
}
|
||||||
|
if (refresh) {
|
||||||
|
refreshSelects(this);
|
||||||
|
}
|
||||||
|
return this.element;
|
||||||
|
},
|
||||||
|
setPreserveSelectionOnMove: function(value, refresh) {
|
||||||
|
// We are forcing to move on select and disabling preserveSelectionOnMove on Android
|
||||||
|
if (isBuggyAndroid) {
|
||||||
|
value = false;
|
||||||
|
}
|
||||||
|
this.settings.preserveSelectionOnMove = value;
|
||||||
|
if (refresh) {
|
||||||
|
refreshSelects(this);
|
||||||
|
}
|
||||||
|
return this.element;
|
||||||
|
},
|
||||||
|
setSelectedListLabel: function(value, refresh) {
|
||||||
|
this.settings.selectedListLabel = value;
|
||||||
|
if (value) {
|
||||||
|
this.elements.label2.show().html(value);
|
||||||
|
} else {
|
||||||
|
this.elements.label2.hide().html(value);
|
||||||
|
}
|
||||||
|
if (refresh) {
|
||||||
|
refreshSelects(this);
|
||||||
|
}
|
||||||
|
return this.element;
|
||||||
|
},
|
||||||
|
setNonSelectedListLabel: function(value, refresh) {
|
||||||
|
this.settings.nonSelectedListLabel = value;
|
||||||
|
if (value) {
|
||||||
|
this.elements.label1.show().html(value);
|
||||||
|
} else {
|
||||||
|
this.elements.label1.hide().html(value);
|
||||||
|
}
|
||||||
|
if (refresh) {
|
||||||
|
refreshSelects(this);
|
||||||
|
}
|
||||||
|
return this.element;
|
||||||
|
},
|
||||||
|
setHelperSelectNamePostfix: function(value, refresh) {
|
||||||
|
this.settings.helperSelectNamePostfix = value;
|
||||||
|
if (value) {
|
||||||
|
this.elements.select1.attr('name', this.originalSelectName + value + '1');
|
||||||
|
this.elements.select2.attr('name', this.originalSelectName + value + '2');
|
||||||
|
} else {
|
||||||
|
this.elements.select1.removeAttr('name');
|
||||||
|
this.elements.select2.removeAttr('name');
|
||||||
|
}
|
||||||
|
if (refresh) {
|
||||||
|
refreshSelects(this);
|
||||||
|
}
|
||||||
|
return this.element;
|
||||||
|
},
|
||||||
|
setSelectOrMinimalHeight: function(value, refresh) {
|
||||||
|
this.settings.selectorMinimalHeight = value;
|
||||||
|
var height = this.element.height();
|
||||||
|
if (this.element.height() < value) {
|
||||||
|
height = value;
|
||||||
|
}
|
||||||
|
this.elements.select1.height(height);
|
||||||
|
this.elements.select2.height(height);
|
||||||
|
if (refresh) {
|
||||||
|
refreshSelects(this);
|
||||||
|
}
|
||||||
|
return this.element;
|
||||||
|
},
|
||||||
|
setShowFilterInputs: function(value, refresh) {
|
||||||
|
if (!value) {
|
||||||
|
this.setNonSelectedFilter('');
|
||||||
|
this.setSelectedFilter('');
|
||||||
|
refreshSelects(this);
|
||||||
|
this.elements.filterInput1.hide();
|
||||||
|
this.elements.filterInput2.hide();
|
||||||
|
} else {
|
||||||
|
this.elements.filterInput1.show();
|
||||||
|
this.elements.filterInput2.show();
|
||||||
|
}
|
||||||
|
this.settings.showFilterInputs = value;
|
||||||
|
if (refresh) {
|
||||||
|
refreshSelects(this);
|
||||||
|
}
|
||||||
|
return this.element;
|
||||||
|
},
|
||||||
|
setNonSelectedFilter: function(value, refresh) {
|
||||||
|
if (this.settings.showFilterInputs) {
|
||||||
|
this.settings.nonSelectedFilter = value;
|
||||||
|
this.elements.filterInput1.val(value);
|
||||||
|
if (refresh) {
|
||||||
|
refreshSelects(this);
|
||||||
|
}
|
||||||
|
return this.element;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
setSelectedFilter: function(value, refresh) {
|
||||||
|
if (this.settings.showFilterInputs) {
|
||||||
|
this.settings.selectedFilter = value;
|
||||||
|
this.elements.filterInput2.val(value);
|
||||||
|
if (refresh) {
|
||||||
|
refreshSelects(this);
|
||||||
|
}
|
||||||
|
return this.element;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
setInfoText: function(value, refresh) {
|
||||||
|
this.settings.infoText = value;
|
||||||
|
if (value) {
|
||||||
|
this.elements.info1.show();
|
||||||
|
this.elements.info2.show();
|
||||||
|
} else {
|
||||||
|
this.elements.info1.hide();
|
||||||
|
this.elements.info2.hide();
|
||||||
|
}
|
||||||
|
if (refresh) {
|
||||||
|
refreshSelects(this);
|
||||||
|
}
|
||||||
|
return this.element;
|
||||||
|
},
|
||||||
|
setInfoTextFiltered: function(value, refresh) {
|
||||||
|
this.settings.infoTextFiltered = value;
|
||||||
|
if (refresh) {
|
||||||
|
refreshSelects(this);
|
||||||
|
}
|
||||||
|
return this.element;
|
||||||
|
},
|
||||||
|
setInfoTextEmpty: function(value, refresh) {
|
||||||
|
this.settings.infoTextEmpty = value;
|
||||||
|
if (refresh) {
|
||||||
|
refreshSelects(this);
|
||||||
|
}
|
||||||
|
return this.element;
|
||||||
|
},
|
||||||
|
setFilterOnValues: function(value, refresh) {
|
||||||
|
this.settings.filterOnValues = value;
|
||||||
|
if (refresh) {
|
||||||
|
refreshSelects(this);
|
||||||
|
}
|
||||||
|
return this.element;
|
||||||
|
},
|
||||||
|
setSortByInputOrder: function(value, refresh){
|
||||||
|
this.settings.sortByInputOrder = value;
|
||||||
|
if (refresh) {
|
||||||
|
refreshSelects(this);
|
||||||
|
}
|
||||||
|
return this.element;
|
||||||
|
},
|
||||||
|
setEventMoveOverride: function(value, refresh) {
|
||||||
|
this.settings.eventMoveOverride = value;
|
||||||
|
if (refresh) {
|
||||||
|
refreshSelects(this);
|
||||||
|
}
|
||||||
|
return this.element;
|
||||||
|
},
|
||||||
|
setEventMoveAllOverride: function(value, refresh) {
|
||||||
|
this.settings.eventMoveAllOverride = value;
|
||||||
|
if (refresh) {
|
||||||
|
refreshSelects(this);
|
||||||
|
}
|
||||||
|
return this.element;
|
||||||
|
},
|
||||||
|
setEventRemoveOverride: function(value, refresh) {
|
||||||
|
this.settings.eventRemoveOverride = value;
|
||||||
|
if (refresh) {
|
||||||
|
refreshSelects(this);
|
||||||
|
}
|
||||||
|
return this.element;
|
||||||
|
},
|
||||||
|
setEventRemoveAllOverride: function(value, refresh) {
|
||||||
|
this.settings.eventRemoveAllOverride = value;
|
||||||
|
if (refresh) {
|
||||||
|
refreshSelects(this);
|
||||||
|
}
|
||||||
|
return this.element;
|
||||||
|
},
|
||||||
|
setBtnClass: function(value, refresh) {
|
||||||
|
this.settings.btnClass = value;
|
||||||
|
this.elements.moveButton.attr('class', 'btn move').addClass(value);
|
||||||
|
this.elements.removeButton.attr('class', 'btn remove').addClass(value);
|
||||||
|
this.elements.moveAllButton.attr('class', 'btn moveall').addClass(value);
|
||||||
|
this.elements.removeAllButton.attr('class', 'btn removeall').addClass(value);
|
||||||
|
if (refresh) {
|
||||||
|
refreshSelects(this);
|
||||||
|
}
|
||||||
|
return this.element;
|
||||||
|
},
|
||||||
|
setBtnMoveText: function(value, refresh) {
|
||||||
|
this.settings.btnMoveText = value;
|
||||||
|
this.elements.moveButton.html(value);
|
||||||
|
if (refresh) {
|
||||||
|
refreshSelects(this);
|
||||||
|
}
|
||||||
|
return this.element;
|
||||||
|
},
|
||||||
|
setBtnRemoveText: function(value, refresh) {
|
||||||
|
this.settings.btnMoveText = value;
|
||||||
|
this.elements.removeButton.html(value);
|
||||||
|
if (refresh) {
|
||||||
|
refreshSelects(this);
|
||||||
|
}
|
||||||
|
return this.element;
|
||||||
|
},
|
||||||
|
setBtnMoveAllText: function(value, refresh) {
|
||||||
|
this.settings.btnMoveText = value;
|
||||||
|
this.elements.moveAllButton.html(value);
|
||||||
|
if (refresh) {
|
||||||
|
refreshSelects(this);
|
||||||
|
}
|
||||||
|
return this.element;
|
||||||
|
},
|
||||||
|
setBtnRemoveAllText: function(value, refresh) {
|
||||||
|
this.settings.btnMoveText = value;
|
||||||
|
this.elements.removeAllButton.html(value);
|
||||||
|
if (refresh) {
|
||||||
|
refreshSelects(this);
|
||||||
|
}
|
||||||
|
return this.element;
|
||||||
|
},
|
||||||
|
getContainer: function() {
|
||||||
|
return this.container;
|
||||||
|
},
|
||||||
|
refresh: function(mustClearSelections) {
|
||||||
|
updateSelectionStates(this);
|
||||||
|
|
||||||
|
if (!mustClearSelections) {
|
||||||
|
saveSelections(this, 1);
|
||||||
|
saveSelections(this, 2);
|
||||||
|
} else {
|
||||||
|
clearSelections(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
refreshSelects(this);
|
||||||
|
},
|
||||||
|
destroy: function() {
|
||||||
|
this.container.remove();
|
||||||
|
this.element.show();
|
||||||
|
$.data(this, 'plugin_' + pluginName, null);
|
||||||
|
return this.element;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// A really lightweight plugin wrapper around the constructor,
|
||||||
|
// preventing against multiple instantiations
|
||||||
|
$.fn[ pluginName ] = function (options) {
|
||||||
|
var args = arguments;
|
||||||
|
|
||||||
|
// Is the first parameter an object (options), or was omitted, instantiate a new instance of the plugin.
|
||||||
|
if (options === undefined || typeof options === 'object') {
|
||||||
|
return this.each(function () {
|
||||||
|
// If this is not a select
|
||||||
|
if (!$(this).is('select')) {
|
||||||
|
$(this).find('select').each(function(index, item) {
|
||||||
|
// For each nested select, instantiate the Dual List Box
|
||||||
|
$(item).bootstrapDualListbox(options);
|
||||||
|
});
|
||||||
|
} else if (!$.data(this, 'plugin_' + pluginName)) {
|
||||||
|
// Only allow the plugin to be instantiated once so we check that the element has no plugin instantiation yet
|
||||||
|
|
||||||
|
// if it has no instance, create a new one, pass options to our plugin constructor,
|
||||||
|
// and store the plugin instance in the elements jQuery data object.
|
||||||
|
$.data(this, 'plugin_' + pluginName, new BootstrapDualListbox(this, options));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
// If the first parameter is a string and it doesn't start with an underscore or "contains" the `init`-function,
|
||||||
|
// treat this as a call to a public method.
|
||||||
|
} else if (typeof options === 'string' && options[0] !== '_' && options !== 'init') {
|
||||||
|
|
||||||
|
// Cache the method call to make it possible to return a value
|
||||||
|
var returns;
|
||||||
|
|
||||||
|
this.each(function () {
|
||||||
|
var instance = $.data(this, 'plugin_' + pluginName);
|
||||||
|
// Tests that there's already a plugin-instance and checks that the requested public method exists
|
||||||
|
if (instance instanceof BootstrapDualListbox && typeof instance[options] === 'function') {
|
||||||
|
// Call the method of our plugin instance, and pass it the supplied arguments.
|
||||||
|
returns = instance[options].apply(instance, Array.prototype.slice.call(args, 1));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// If the earlier cached method gives a value back return the value,
|
||||||
|
// otherwise return this to preserve chainability.
|
||||||
|
return returns !== undefined ? returns : this;
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
}));
|
10
public/plugins/bootstrap4-duallistbox/jquery.bootstrap-duallistbox.min.js
vendored
Normal file
10
public/plugins/bootstrap4-duallistbox/jquery.bootstrap-duallistbox.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
167
public/plugins/bs-custom-file-input/bs-custom-file-input.js
vendored
Normal file
167
public/plugins/bs-custom-file-input/bs-custom-file-input.js
vendored
Normal file
|
@ -0,0 +1,167 @@
|
||||||
|
/*!
|
||||||
|
* bsCustomFileInput v1.3.4 (https://github.com/Johann-S/bs-custom-file-input)
|
||||||
|
* Copyright 2018 - 2020 Johann-S <johann.servoire@gmail.com>
|
||||||
|
* Licensed under MIT (https://github.com/Johann-S/bs-custom-file-input/blob/master/LICENSE)
|
||||||
|
*/
|
||||||
|
(function (global, factory) {
|
||||||
|
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
|
||||||
|
typeof define === 'function' && define.amd ? define(factory) :
|
||||||
|
(global = global || self, global.bsCustomFileInput = factory());
|
||||||
|
}(this, (function () { 'use strict';
|
||||||
|
|
||||||
|
var Selector = {
|
||||||
|
CUSTOMFILE: '.custom-file input[type="file"]',
|
||||||
|
CUSTOMFILELABEL: '.custom-file-label',
|
||||||
|
FORM: 'form',
|
||||||
|
INPUT: 'input'
|
||||||
|
};
|
||||||
|
|
||||||
|
var textNodeType = 3;
|
||||||
|
|
||||||
|
var getDefaultText = function getDefaultText(input) {
|
||||||
|
var defaultText = '';
|
||||||
|
var label = input.parentNode.querySelector(Selector.CUSTOMFILELABEL);
|
||||||
|
|
||||||
|
if (label) {
|
||||||
|
defaultText = label.textContent;
|
||||||
|
}
|
||||||
|
|
||||||
|
return defaultText;
|
||||||
|
};
|
||||||
|
|
||||||
|
var findFirstChildNode = function findFirstChildNode(element) {
|
||||||
|
if (element.childNodes.length > 0) {
|
||||||
|
var childNodes = [].slice.call(element.childNodes);
|
||||||
|
|
||||||
|
for (var i = 0; i < childNodes.length; i++) {
|
||||||
|
var node = childNodes[i];
|
||||||
|
|
||||||
|
if (node.nodeType !== textNodeType) {
|
||||||
|
return node;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return element;
|
||||||
|
};
|
||||||
|
|
||||||
|
var restoreDefaultText = function restoreDefaultText(input) {
|
||||||
|
var defaultText = input.bsCustomFileInput.defaultText;
|
||||||
|
var label = input.parentNode.querySelector(Selector.CUSTOMFILELABEL);
|
||||||
|
|
||||||
|
if (label) {
|
||||||
|
var element = findFirstChildNode(label);
|
||||||
|
element.textContent = defaultText;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
var fileApi = !!window.File;
|
||||||
|
var FAKE_PATH = 'fakepath';
|
||||||
|
var FAKE_PATH_SEPARATOR = '\\';
|
||||||
|
|
||||||
|
var getSelectedFiles = function getSelectedFiles(input) {
|
||||||
|
if (input.hasAttribute('multiple') && fileApi) {
|
||||||
|
return [].slice.call(input.files).map(function (file) {
|
||||||
|
return file.name;
|
||||||
|
}).join(', ');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (input.value.indexOf(FAKE_PATH) !== -1) {
|
||||||
|
var splittedValue = input.value.split(FAKE_PATH_SEPARATOR);
|
||||||
|
return splittedValue[splittedValue.length - 1];
|
||||||
|
}
|
||||||
|
|
||||||
|
return input.value;
|
||||||
|
};
|
||||||
|
|
||||||
|
function handleInputChange() {
|
||||||
|
var label = this.parentNode.querySelector(Selector.CUSTOMFILELABEL);
|
||||||
|
|
||||||
|
if (label) {
|
||||||
|
var element = findFirstChildNode(label);
|
||||||
|
var inputValue = getSelectedFiles(this);
|
||||||
|
|
||||||
|
if (inputValue.length) {
|
||||||
|
element.textContent = inputValue;
|
||||||
|
} else {
|
||||||
|
restoreDefaultText(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function handleFormReset() {
|
||||||
|
var customFileList = [].slice.call(this.querySelectorAll(Selector.INPUT)).filter(function (input) {
|
||||||
|
return !!input.bsCustomFileInput;
|
||||||
|
});
|
||||||
|
|
||||||
|
for (var i = 0, len = customFileList.length; i < len; i++) {
|
||||||
|
restoreDefaultText(customFileList[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var customProperty = 'bsCustomFileInput';
|
||||||
|
var Event = {
|
||||||
|
FORMRESET: 'reset',
|
||||||
|
INPUTCHANGE: 'change'
|
||||||
|
};
|
||||||
|
var bsCustomFileInput = {
|
||||||
|
init: function init(inputSelector, formSelector) {
|
||||||
|
if (inputSelector === void 0) {
|
||||||
|
inputSelector = Selector.CUSTOMFILE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (formSelector === void 0) {
|
||||||
|
formSelector = Selector.FORM;
|
||||||
|
}
|
||||||
|
|
||||||
|
var customFileInputList = [].slice.call(document.querySelectorAll(inputSelector));
|
||||||
|
var formList = [].slice.call(document.querySelectorAll(formSelector));
|
||||||
|
|
||||||
|
for (var i = 0, len = customFileInputList.length; i < len; i++) {
|
||||||
|
var input = customFileInputList[i];
|
||||||
|
Object.defineProperty(input, customProperty, {
|
||||||
|
value: {
|
||||||
|
defaultText: getDefaultText(input)
|
||||||
|
},
|
||||||
|
writable: true
|
||||||
|
});
|
||||||
|
handleInputChange.call(input);
|
||||||
|
input.addEventListener(Event.INPUTCHANGE, handleInputChange);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (var _i = 0, _len = formList.length; _i < _len; _i++) {
|
||||||
|
formList[_i].addEventListener(Event.FORMRESET, handleFormReset);
|
||||||
|
|
||||||
|
Object.defineProperty(formList[_i], customProperty, {
|
||||||
|
value: true,
|
||||||
|
writable: true
|
||||||
|
});
|
||||||
|
}
|
||||||
|
},
|
||||||
|
destroy: function destroy() {
|
||||||
|
var formList = [].slice.call(document.querySelectorAll(Selector.FORM)).filter(function (form) {
|
||||||
|
return !!form.bsCustomFileInput;
|
||||||
|
});
|
||||||
|
var customFileInputList = [].slice.call(document.querySelectorAll(Selector.INPUT)).filter(function (input) {
|
||||||
|
return !!input.bsCustomFileInput;
|
||||||
|
});
|
||||||
|
|
||||||
|
for (var i = 0, len = customFileInputList.length; i < len; i++) {
|
||||||
|
var input = customFileInputList[i];
|
||||||
|
restoreDefaultText(input);
|
||||||
|
input[customProperty] = undefined;
|
||||||
|
input.removeEventListener(Event.INPUTCHANGE, handleInputChange);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (var _i2 = 0, _len2 = formList.length; _i2 < _len2; _i2++) {
|
||||||
|
formList[_i2].removeEventListener(Event.FORMRESET, handleFormReset);
|
||||||
|
|
||||||
|
formList[_i2][customProperty] = undefined;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
return bsCustomFileInput;
|
||||||
|
|
||||||
|
})));
|
||||||
|
//# sourceMappingURL=bs-custom-file-input.js.map
|
File diff suppressed because one or more lines are too long
7
public/plugins/bs-custom-file-input/bs-custom-file-input.min.js
vendored
Normal file
7
public/plugins/bs-custom-file-input/bs-custom-file-input.min.js
vendored
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
/*!
|
||||||
|
* bsCustomFileInput v1.3.4 (https://github.com/Johann-S/bs-custom-file-input)
|
||||||
|
* Copyright 2018 - 2020 Johann-S <johann.servoire@gmail.com>
|
||||||
|
* Licensed under MIT (https://github.com/Johann-S/bs-custom-file-input/blob/master/LICENSE)
|
||||||
|
*/
|
||||||
|
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e=e||self).bsCustomFileInput=t()}(this,function(){"use strict";var s={CUSTOMFILE:'.custom-file input[type="file"]',CUSTOMFILELABEL:".custom-file-label",FORM:"form",INPUT:"input"},l=function(e){if(0<e.childNodes.length)for(var t=[].slice.call(e.childNodes),n=0;n<t.length;n++){var l=t[n];if(3!==l.nodeType)return l}return e},u=function(e){var t=e.bsCustomFileInput.defaultText,n=e.parentNode.querySelector(s.CUSTOMFILELABEL);n&&(l(n).textContent=t)},n=!!window.File,r=function(e){if(e.hasAttribute("multiple")&&n)return[].slice.call(e.files).map(function(e){return e.name}).join(", ");if(-1===e.value.indexOf("fakepath"))return e.value;var t=e.value.split("\\");return t[t.length-1]};function d(){var e=this.parentNode.querySelector(s.CUSTOMFILELABEL);if(e){var t=l(e),n=r(this);n.length?t.textContent=n:u(this)}}function v(){for(var e=[].slice.call(this.querySelectorAll(s.INPUT)).filter(function(e){return!!e.bsCustomFileInput}),t=0,n=e.length;t<n;t++)u(e[t])}var p="bsCustomFileInput",m="reset",h="change";return{init:function(e,t){void 0===e&&(e=s.CUSTOMFILE),void 0===t&&(t=s.FORM);for(var n,l,r=[].slice.call(document.querySelectorAll(e)),i=[].slice.call(document.querySelectorAll(t)),o=0,u=r.length;o<u;o++){var c=r[o];Object.defineProperty(c,p,{value:{defaultText:(n=void 0,n="",(l=c.parentNode.querySelector(s.CUSTOMFILELABEL))&&(n=l.textContent),n)},writable:!0}),d.call(c),c.addEventListener(h,d)}for(var f=0,a=i.length;f<a;f++)i[f].addEventListener(m,v),Object.defineProperty(i[f],p,{value:!0,writable:!0})},destroy:function(){for(var e=[].slice.call(document.querySelectorAll(s.FORM)).filter(function(e){return!!e.bsCustomFileInput}),t=[].slice.call(document.querySelectorAll(s.INPUT)).filter(function(e){return!!e.bsCustomFileInput}),n=0,l=t.length;n<l;n++){var r=t[n];u(r),r[p]=void 0,r.removeEventListener(h,d)}for(var i=0,o=e.length;i<o;i++)e[i].removeEventListener(m,v),e[i][p]=void 0}}});
|
||||||
|
//# sourceMappingURL=bs-custom-file-input.min.js.map
|
File diff suppressed because one or more lines are too long
194
public/plugins/bs-stepper/css/bs-stepper.css
vendored
Normal file
194
public/plugins/bs-stepper/css/bs-stepper.css
vendored
Normal file
|
@ -0,0 +1,194 @@
|
||||||
|
/*!
|
||||||
|
* bsStepper v1.7.0 (https://github.com/Johann-S/bs-stepper)
|
||||||
|
* Copyright 2018 - 2019 Johann-S <johann.servoire@gmail.com>
|
||||||
|
* Licensed under MIT (https://github.com/Johann-S/bs-stepper/blob/master/LICENSE)
|
||||||
|
*/
|
||||||
|
|
||||||
|
.bs-stepper .step-trigger {
|
||||||
|
display: -ms-inline-flexbox;
|
||||||
|
display: inline-flex;
|
||||||
|
-ms-flex-wrap: wrap;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
-ms-flex-align: center;
|
||||||
|
align-items: center;
|
||||||
|
-ms-flex-pack: center;
|
||||||
|
justify-content: center;
|
||||||
|
padding: 20px;
|
||||||
|
font-size: 1rem;
|
||||||
|
font-weight: 700;
|
||||||
|
line-height: 1.5;
|
||||||
|
color: #6c757d;
|
||||||
|
text-align: center;
|
||||||
|
text-decoration: none;
|
||||||
|
white-space: nowrap;
|
||||||
|
vertical-align: middle;
|
||||||
|
-webkit-user-select: none;
|
||||||
|
-moz-user-select: none;
|
||||||
|
-ms-user-select: none;
|
||||||
|
user-select: none;
|
||||||
|
background-color: transparent;
|
||||||
|
border: none;
|
||||||
|
border-radius: .25rem;
|
||||||
|
transition: background-color .15s ease-out, color .15s ease-out;
|
||||||
|
}
|
||||||
|
|
||||||
|
.bs-stepper .step-trigger:not(:disabled):not(.disabled) {
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
.bs-stepper .step-trigger:disabled,
|
||||||
|
.bs-stepper .step-trigger.disabled {
|
||||||
|
pointer-events: none;
|
||||||
|
opacity: .65;
|
||||||
|
}
|
||||||
|
|
||||||
|
.bs-stepper .step-trigger:focus {
|
||||||
|
color: #007bff;
|
||||||
|
outline: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.bs-stepper .step-trigger:hover {
|
||||||
|
text-decoration: none;
|
||||||
|
background-color: rgba(0, 0, 0, .06);
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 520px) {
|
||||||
|
.bs-stepper .step-trigger {
|
||||||
|
-ms-flex-direction: column;
|
||||||
|
flex-direction: column;
|
||||||
|
padding: 10px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.bs-stepper-label {
|
||||||
|
display: inline-block;
|
||||||
|
margin: .25rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.bs-stepper-header {
|
||||||
|
display: -ms-flexbox;
|
||||||
|
display: flex;
|
||||||
|
-ms-flex-align: center;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 520px) {
|
||||||
|
.bs-stepper-header {
|
||||||
|
margin: 0 -10px;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.bs-stepper-line,
|
||||||
|
.bs-stepper .line {
|
||||||
|
-ms-flex: 1 0 32px;
|
||||||
|
flex: 1 0 32px;
|
||||||
|
min-width: 1px;
|
||||||
|
min-height: 1px;
|
||||||
|
margin: auto;
|
||||||
|
background-color: rgba(0, 0, 0, .12);
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 400px) {
|
||||||
|
.bs-stepper-line,
|
||||||
|
.bs-stepper .line {
|
||||||
|
-ms-flex-preferred-size: 20px;
|
||||||
|
flex-basis: 20px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.bs-stepper-circle {
|
||||||
|
display: -ms-inline-flexbox;
|
||||||
|
display: inline-flex;
|
||||||
|
-ms-flex-line-pack: center;
|
||||||
|
align-content: center;
|
||||||
|
-ms-flex-pack: center;
|
||||||
|
justify-content: center;
|
||||||
|
width: 2em;
|
||||||
|
height: 2em;
|
||||||
|
padding: .5em 0;
|
||||||
|
margin: .25rem;
|
||||||
|
line-height: 1em;
|
||||||
|
color: #fff;
|
||||||
|
background-color: #6c757d;
|
||||||
|
border-radius: 1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.active .bs-stepper-circle {
|
||||||
|
background-color: #007bff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.bs-stepper-content {
|
||||||
|
padding: 0 20px 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 520px) {
|
||||||
|
.bs-stepper-content {
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.bs-stepper.vertical {
|
||||||
|
display: -ms-flexbox;
|
||||||
|
display: flex;
|
||||||
|
}
|
||||||
|
|
||||||
|
.bs-stepper.vertical .bs-stepper-header {
|
||||||
|
-ms-flex-direction: column;
|
||||||
|
flex-direction: column;
|
||||||
|
-ms-flex-align: stretch;
|
||||||
|
align-items: stretch;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.bs-stepper.vertical .bs-stepper-pane,
|
||||||
|
.bs-stepper.vertical .content {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
.bs-stepper.vertical .bs-stepper-pane:not(.fade),
|
||||||
|
.bs-stepper.vertical .content:not(.fade) {
|
||||||
|
display: block;
|
||||||
|
visibility: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
.bs-stepper-pane:not(.fade),
|
||||||
|
.bs-stepper .content:not(.fade) {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.bs-stepper .content.fade,
|
||||||
|
.bs-stepper-pane.fade {
|
||||||
|
visibility: hidden;
|
||||||
|
transition-duration: .3s;
|
||||||
|
transition-property: opacity;
|
||||||
|
}
|
||||||
|
|
||||||
|
.bs-stepper-pane.fade.active,
|
||||||
|
.bs-stepper .content.fade.active {
|
||||||
|
visibility: visible;
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.bs-stepper-pane.active:not(.fade),
|
||||||
|
.bs-stepper .content.active:not(.fade) {
|
||||||
|
display: block;
|
||||||
|
visibility: visible;
|
||||||
|
}
|
||||||
|
|
||||||
|
.bs-stepper-pane.dstepper-block,
|
||||||
|
.bs-stepper .content.dstepper-block {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
.bs-stepper:not(.vertical) .bs-stepper-pane.dstepper-none,
|
||||||
|
.bs-stepper:not(.vertical) .content.dstepper-none {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.vertical .bs-stepper-pane.fade.dstepper-none,
|
||||||
|
.vertical .content.fade.dstepper-none {
|
||||||
|
visibility: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*# sourceMappingURL=bs-stepper.css.map */
|
1
public/plugins/bs-stepper/css/bs-stepper.css.map
Normal file
1
public/plugins/bs-stepper/css/bs-stepper.css.map
Normal file
File diff suppressed because one or more lines are too long
6
public/plugins/bs-stepper/css/bs-stepper.min.css
vendored
Normal file
6
public/plugins/bs-stepper/css/bs-stepper.min.css
vendored
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
/*!
|
||||||
|
* bsStepper v1.7.0 (https://github.com/Johann-S/bs-stepper)
|
||||||
|
* Copyright 2018 - 2019 Johann-S <johann.servoire@gmail.com>
|
||||||
|
* Licensed under MIT (https://github.com/Johann-S/bs-stepper/blob/master/LICENSE)
|
||||||
|
*/.bs-stepper .step-trigger{display:-ms-inline-flexbox;display:inline-flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;padding:20px;font-size:1rem;font-weight:700;line-height:1.5;color:#6c757d;text-align:center;text-decoration:none;white-space:nowrap;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:transparent;border:none;border-radius:.25rem;transition:background-color .15s ease-out,color .15s ease-out}.bs-stepper .step-trigger:not(:disabled):not(.disabled){cursor:pointer}.bs-stepper .step-trigger.disabled,.bs-stepper .step-trigger:disabled{pointer-events:none;opacity:.65}.bs-stepper .step-trigger:focus{color:#007bff;outline:0}.bs-stepper .step-trigger:hover{text-decoration:none;background-color:rgba(0,0,0,.06)}@media (max-width:520px){.bs-stepper .step-trigger{-ms-flex-direction:column;flex-direction:column;padding:10px}}.bs-stepper-label{display:inline-block;margin:.25rem}.bs-stepper-header{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}@media (max-width:520px){.bs-stepper-header{margin:0 -10px;text-align:center}}.bs-stepper .line,.bs-stepper-line{-ms-flex:1 0 32px;flex:1 0 32px;min-width:1px;min-height:1px;margin:auto;background-color:rgba(0,0,0,.12)}@media (max-width:400px){.bs-stepper .line,.bs-stepper-line{-ms-flex-preferred-size:20px;flex-basis:20px}}.bs-stepper-circle{display:-ms-inline-flexbox;display:inline-flex;-ms-flex-line-pack:center;align-content:center;-ms-flex-pack:center;justify-content:center;width:2em;height:2em;padding:.5em 0;margin:.25rem;line-height:1em;color:#fff;background-color:#6c757d;border-radius:1em}.active .bs-stepper-circle{background-color:#007bff}.bs-stepper-content{padding:0 20px 20px}@media (max-width:520px){.bs-stepper-content{padding:0}}.bs-stepper.vertical{display:-ms-flexbox;display:flex}.bs-stepper.vertical .bs-stepper-header{-ms-flex-direction:column;flex-direction:column;-ms-flex-align:stretch;align-items:stretch;margin:0}.bs-stepper.vertical .bs-stepper-pane,.bs-stepper.vertical .content{display:block}.bs-stepper.vertical .bs-stepper-pane:not(.fade),.bs-stepper.vertical .content:not(.fade){display:block;visibility:hidden}.bs-stepper .content:not(.fade),.bs-stepper-pane:not(.fade){display:none}.bs-stepper .content.fade,.bs-stepper-pane.fade{visibility:hidden;transition-duration:.3s;transition-property:opacity}.bs-stepper .content.fade.active,.bs-stepper-pane.fade.active{visibility:visible;opacity:1}.bs-stepper .content.active:not(.fade),.bs-stepper-pane.active:not(.fade){display:block;visibility:visible}.bs-stepper .content.dstepper-block,.bs-stepper-pane.dstepper-block{display:block}.bs-stepper:not(.vertical) .bs-stepper-pane.dstepper-none,.bs-stepper:not(.vertical) .content.dstepper-none{display:none}.vertical .bs-stepper-pane.fade.dstepper-none,.vertical .content.fade.dstepper-none{visibility:hidden}
|
||||||
|
/*# sourceMappingURL=bs-stepper.min.css.map */
|
1
public/plugins/bs-stepper/css/bs-stepper.min.css.map
Normal file
1
public/plugins/bs-stepper/css/bs-stepper.min.css.map
Normal file
File diff suppressed because one or more lines are too long
428
public/plugins/bs-stepper/js/bs-stepper.js
vendored
Normal file
428
public/plugins/bs-stepper/js/bs-stepper.js
vendored
Normal file
|
@ -0,0 +1,428 @@
|
||||||
|
/*!
|
||||||
|
* bsStepper v1.7.0 (https://github.com/Johann-S/bs-stepper)
|
||||||
|
* Copyright 2018 - 2019 Johann-S <johann.servoire@gmail.com>
|
||||||
|
* Licensed under MIT (https://github.com/Johann-S/bs-stepper/blob/master/LICENSE)
|
||||||
|
*/
|
||||||
|
(function (global, factory) {
|
||||||
|
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
|
||||||
|
typeof define === 'function' && define.amd ? define(factory) :
|
||||||
|
(global = global || self, global.Stepper = factory());
|
||||||
|
}(this, function () { 'use strict';
|
||||||
|
|
||||||
|
function _extends() {
|
||||||
|
_extends = Object.assign || function (target) {
|
||||||
|
for (var i = 1; i < arguments.length; i++) {
|
||||||
|
var source = arguments[i];
|
||||||
|
|
||||||
|
for (var key in source) {
|
||||||
|
if (Object.prototype.hasOwnProperty.call(source, key)) {
|
||||||
|
target[key] = source[key];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return target;
|
||||||
|
};
|
||||||
|
|
||||||
|
return _extends.apply(this, arguments);
|
||||||
|
}
|
||||||
|
|
||||||
|
var matches = window.Element.prototype.matches;
|
||||||
|
|
||||||
|
var closest = function closest(element, selector) {
|
||||||
|
return element.closest(selector);
|
||||||
|
};
|
||||||
|
|
||||||
|
var WinEvent = function WinEvent(inType, params) {
|
||||||
|
return new window.Event(inType, params);
|
||||||
|
};
|
||||||
|
|
||||||
|
var createCustomEvent = function createCustomEvent(eventName, params) {
|
||||||
|
var cEvent = new window.CustomEvent(eventName, params);
|
||||||
|
return cEvent;
|
||||||
|
};
|
||||||
|
/* istanbul ignore next */
|
||||||
|
|
||||||
|
|
||||||
|
function polyfill() {
|
||||||
|
if (!window.Element.prototype.matches) {
|
||||||
|
matches = window.Element.prototype.msMatchesSelector || window.Element.prototype.webkitMatchesSelector;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!window.Element.prototype.closest) {
|
||||||
|
closest = function closest(element, selector) {
|
||||||
|
if (!document.documentElement.contains(element)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
do {
|
||||||
|
if (matches.call(element, selector)) {
|
||||||
|
return element;
|
||||||
|
}
|
||||||
|
|
||||||
|
element = element.parentElement || element.parentNode;
|
||||||
|
} while (element !== null && element.nodeType === 1);
|
||||||
|
|
||||||
|
return null;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!window.Event || typeof window.Event !== 'function') {
|
||||||
|
WinEvent = function WinEvent(inType, params) {
|
||||||
|
params = params || {};
|
||||||
|
var e = document.createEvent('Event');
|
||||||
|
e.initEvent(inType, Boolean(params.bubbles), Boolean(params.cancelable));
|
||||||
|
return e;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
if (typeof window.CustomEvent !== 'function') {
|
||||||
|
var originPreventDefault = window.Event.prototype.preventDefault;
|
||||||
|
|
||||||
|
createCustomEvent = function createCustomEvent(eventName, params) {
|
||||||
|
var evt = document.createEvent('CustomEvent');
|
||||||
|
params = params || {
|
||||||
|
bubbles: false,
|
||||||
|
cancelable: false,
|
||||||
|
detail: null
|
||||||
|
};
|
||||||
|
evt.initCustomEvent(eventName, params.bubbles, params.cancelable, params.detail);
|
||||||
|
|
||||||
|
evt.preventDefault = function () {
|
||||||
|
if (!this.cancelable) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
originPreventDefault.call(this);
|
||||||
|
Object.defineProperty(this, 'defaultPrevented', {
|
||||||
|
get: function get() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
return evt;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
polyfill();
|
||||||
|
|
||||||
|
var MILLISECONDS_MULTIPLIER = 1000;
|
||||||
|
var ClassName = {
|
||||||
|
ACTIVE: 'active',
|
||||||
|
LINEAR: 'linear',
|
||||||
|
BLOCK: 'dstepper-block',
|
||||||
|
NONE: 'dstepper-none',
|
||||||
|
FADE: 'fade',
|
||||||
|
VERTICAL: 'vertical'
|
||||||
|
};
|
||||||
|
var transitionEndEvent = 'transitionend';
|
||||||
|
var customProperty = 'bsStepper';
|
||||||
|
|
||||||
|
var show = function show(stepperNode, indexStep, options, done) {
|
||||||
|
var stepper = stepperNode[customProperty];
|
||||||
|
|
||||||
|
if (stepper._steps[indexStep].classList.contains(ClassName.ACTIVE) || stepper._stepsContents[indexStep].classList.contains(ClassName.ACTIVE)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var showEvent = createCustomEvent('show.bs-stepper', {
|
||||||
|
cancelable: true,
|
||||||
|
detail: {
|
||||||
|
from: stepper._currentIndex,
|
||||||
|
to: indexStep,
|
||||||
|
indexStep: indexStep
|
||||||
|
}
|
||||||
|
});
|
||||||
|
stepperNode.dispatchEvent(showEvent);
|
||||||
|
|
||||||
|
var activeStep = stepper._steps.filter(function (step) {
|
||||||
|
return step.classList.contains(ClassName.ACTIVE);
|
||||||
|
});
|
||||||
|
|
||||||
|
var activeContent = stepper._stepsContents.filter(function (content) {
|
||||||
|
return content.classList.contains(ClassName.ACTIVE);
|
||||||
|
});
|
||||||
|
|
||||||
|
if (showEvent.defaultPrevented) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (activeStep.length) {
|
||||||
|
activeStep[0].classList.remove(ClassName.ACTIVE);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (activeContent.length) {
|
||||||
|
activeContent[0].classList.remove(ClassName.ACTIVE);
|
||||||
|
|
||||||
|
if (!stepperNode.classList.contains(ClassName.VERTICAL) && !stepper.options.animation) {
|
||||||
|
activeContent[0].classList.remove(ClassName.BLOCK);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
showStep(stepperNode, stepper._steps[indexStep], stepper._steps, options);
|
||||||
|
showContent(stepperNode, stepper._stepsContents[indexStep], stepper._stepsContents, activeContent, done);
|
||||||
|
};
|
||||||
|
|
||||||
|
var showStep = function showStep(stepperNode, step, stepList, options) {
|
||||||
|
stepList.forEach(function (step) {
|
||||||
|
var trigger = step.querySelector(options.selectors.trigger);
|
||||||
|
trigger.setAttribute('aria-selected', 'false'); // if stepper is in linear mode, set disabled attribute on the trigger
|
||||||
|
|
||||||
|
if (stepperNode.classList.contains(ClassName.LINEAR)) {
|
||||||
|
trigger.setAttribute('disabled', 'disabled');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
step.classList.add(ClassName.ACTIVE);
|
||||||
|
var currentTrigger = step.querySelector(options.selectors.trigger);
|
||||||
|
currentTrigger.setAttribute('aria-selected', 'true'); // if stepper is in linear mode, remove disabled attribute on current
|
||||||
|
|
||||||
|
if (stepperNode.classList.contains(ClassName.LINEAR)) {
|
||||||
|
currentTrigger.removeAttribute('disabled');
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
var showContent = function showContent(stepperNode, content, contentList, activeContent, done) {
|
||||||
|
var stepper = stepperNode[customProperty];
|
||||||
|
var toIndex = contentList.indexOf(content);
|
||||||
|
var shownEvent = createCustomEvent('shown.bs-stepper', {
|
||||||
|
cancelable: true,
|
||||||
|
detail: {
|
||||||
|
from: stepper._currentIndex,
|
||||||
|
to: toIndex,
|
||||||
|
indexStep: toIndex
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
function complete() {
|
||||||
|
content.classList.add(ClassName.BLOCK);
|
||||||
|
content.removeEventListener(transitionEndEvent, complete);
|
||||||
|
stepperNode.dispatchEvent(shownEvent);
|
||||||
|
done();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (content.classList.contains(ClassName.FADE)) {
|
||||||
|
content.classList.remove(ClassName.NONE);
|
||||||
|
var duration = getTransitionDurationFromElement(content);
|
||||||
|
content.addEventListener(transitionEndEvent, complete);
|
||||||
|
|
||||||
|
if (activeContent.length) {
|
||||||
|
activeContent[0].classList.add(ClassName.NONE);
|
||||||
|
}
|
||||||
|
|
||||||
|
content.classList.add(ClassName.ACTIVE);
|
||||||
|
emulateTransitionEnd(content, duration);
|
||||||
|
} else {
|
||||||
|
content.classList.add(ClassName.ACTIVE);
|
||||||
|
content.classList.add(ClassName.BLOCK);
|
||||||
|
stepperNode.dispatchEvent(shownEvent);
|
||||||
|
done();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
var getTransitionDurationFromElement = function getTransitionDurationFromElement(element) {
|
||||||
|
if (!element) {
|
||||||
|
return 0;
|
||||||
|
} // Get transition-duration of the element
|
||||||
|
|
||||||
|
|
||||||
|
var transitionDuration = window.getComputedStyle(element).transitionDuration;
|
||||||
|
var floatTransitionDuration = parseFloat(transitionDuration); // Return 0 if element or transition duration is not found
|
||||||
|
|
||||||
|
if (!floatTransitionDuration) {
|
||||||
|
return 0;
|
||||||
|
} // If multiple durations are defined, take the first
|
||||||
|
|
||||||
|
|
||||||
|
transitionDuration = transitionDuration.split(',')[0];
|
||||||
|
return parseFloat(transitionDuration) * MILLISECONDS_MULTIPLIER;
|
||||||
|
};
|
||||||
|
|
||||||
|
var emulateTransitionEnd = function emulateTransitionEnd(element, duration) {
|
||||||
|
var called = false;
|
||||||
|
var durationPadding = 5;
|
||||||
|
var emulatedDuration = duration + durationPadding;
|
||||||
|
|
||||||
|
function listener() {
|
||||||
|
called = true;
|
||||||
|
element.removeEventListener(transitionEndEvent, listener);
|
||||||
|
}
|
||||||
|
|
||||||
|
element.addEventListener(transitionEndEvent, listener);
|
||||||
|
window.setTimeout(function () {
|
||||||
|
if (!called) {
|
||||||
|
element.dispatchEvent(WinEvent(transitionEndEvent));
|
||||||
|
}
|
||||||
|
|
||||||
|
element.removeEventListener(transitionEndEvent, listener);
|
||||||
|
}, emulatedDuration);
|
||||||
|
};
|
||||||
|
|
||||||
|
var detectAnimation = function detectAnimation(contentList, options) {
|
||||||
|
if (options.animation) {
|
||||||
|
contentList.forEach(function (content) {
|
||||||
|
content.classList.add(ClassName.FADE);
|
||||||
|
content.classList.add(ClassName.NONE);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
var buildClickStepLinearListener = function buildClickStepLinearListener() {
|
||||||
|
return function clickStepLinearListener(event) {
|
||||||
|
event.preventDefault();
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
var buildClickStepNonLinearListener = function buildClickStepNonLinearListener(options) {
|
||||||
|
return function clickStepNonLinearListener(event) {
|
||||||
|
event.preventDefault();
|
||||||
|
var step = closest(event.target, options.selectors.steps);
|
||||||
|
var stepperNode = closest(step, options.selectors.stepper);
|
||||||
|
var stepper = stepperNode[customProperty];
|
||||||
|
|
||||||
|
var stepIndex = stepper._steps.indexOf(step);
|
||||||
|
|
||||||
|
show(stepperNode, stepIndex, options, function () {
|
||||||
|
stepper._currentIndex = stepIndex;
|
||||||
|
});
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
var DEFAULT_OPTIONS = {
|
||||||
|
linear: true,
|
||||||
|
animation: false,
|
||||||
|
selectors: {
|
||||||
|
steps: '.step',
|
||||||
|
trigger: '.step-trigger',
|
||||||
|
stepper: '.bs-stepper'
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
var Stepper =
|
||||||
|
/*#__PURE__*/
|
||||||
|
function () {
|
||||||
|
function Stepper(element, _options) {
|
||||||
|
var _this = this;
|
||||||
|
|
||||||
|
if (_options === void 0) {
|
||||||
|
_options = {};
|
||||||
|
}
|
||||||
|
|
||||||
|
this._element = element;
|
||||||
|
this._currentIndex = 0;
|
||||||
|
this._stepsContents = [];
|
||||||
|
this.options = _extends({}, DEFAULT_OPTIONS, {}, _options);
|
||||||
|
this.options.selectors = _extends({}, DEFAULT_OPTIONS.selectors, {}, this.options.selectors);
|
||||||
|
|
||||||
|
if (this.options.linear) {
|
||||||
|
this._element.classList.add(ClassName.LINEAR);
|
||||||
|
}
|
||||||
|
|
||||||
|
this._steps = [].slice.call(this._element.querySelectorAll(this.options.selectors.steps));
|
||||||
|
|
||||||
|
this._steps.filter(function (step) {
|
||||||
|
return step.hasAttribute('data-target');
|
||||||
|
}).forEach(function (step) {
|
||||||
|
_this._stepsContents.push(_this._element.querySelector(step.getAttribute('data-target')));
|
||||||
|
});
|
||||||
|
|
||||||
|
detectAnimation(this._stepsContents, this.options);
|
||||||
|
|
||||||
|
this._setLinkListeners();
|
||||||
|
|
||||||
|
Object.defineProperty(this._element, customProperty, {
|
||||||
|
value: this,
|
||||||
|
writable: true
|
||||||
|
});
|
||||||
|
|
||||||
|
if (this._steps.length) {
|
||||||
|
show(this._element, this._currentIndex, this.options, function () {});
|
||||||
|
}
|
||||||
|
} // Private
|
||||||
|
|
||||||
|
|
||||||
|
var _proto = Stepper.prototype;
|
||||||
|
|
||||||
|
_proto._setLinkListeners = function _setLinkListeners() {
|
||||||
|
var _this2 = this;
|
||||||
|
|
||||||
|
this._steps.forEach(function (step) {
|
||||||
|
var trigger = step.querySelector(_this2.options.selectors.trigger);
|
||||||
|
|
||||||
|
if (_this2.options.linear) {
|
||||||
|
_this2._clickStepLinearListener = buildClickStepLinearListener(_this2.options);
|
||||||
|
trigger.addEventListener('click', _this2._clickStepLinearListener);
|
||||||
|
} else {
|
||||||
|
_this2._clickStepNonLinearListener = buildClickStepNonLinearListener(_this2.options);
|
||||||
|
trigger.addEventListener('click', _this2._clickStepNonLinearListener);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} // Public
|
||||||
|
;
|
||||||
|
|
||||||
|
_proto.next = function next() {
|
||||||
|
var _this3 = this;
|
||||||
|
|
||||||
|
var nextStep = this._currentIndex + 1 <= this._steps.length - 1 ? this._currentIndex + 1 : this._steps.length - 1;
|
||||||
|
show(this._element, nextStep, this.options, function () {
|
||||||
|
_this3._currentIndex = nextStep;
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
_proto.previous = function previous() {
|
||||||
|
var _this4 = this;
|
||||||
|
|
||||||
|
var previousStep = this._currentIndex - 1 >= 0 ? this._currentIndex - 1 : 0;
|
||||||
|
show(this._element, previousStep, this.options, function () {
|
||||||
|
_this4._currentIndex = previousStep;
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
_proto.to = function to(stepNumber) {
|
||||||
|
var _this5 = this;
|
||||||
|
|
||||||
|
var tempIndex = stepNumber - 1;
|
||||||
|
var nextStep = tempIndex >= 0 && tempIndex < this._steps.length ? tempIndex : 0;
|
||||||
|
show(this._element, nextStep, this.options, function () {
|
||||||
|
_this5._currentIndex = nextStep;
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
_proto.reset = function reset() {
|
||||||
|
var _this6 = this;
|
||||||
|
|
||||||
|
show(this._element, 0, this.options, function () {
|
||||||
|
_this6._currentIndex = 0;
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
_proto.destroy = function destroy() {
|
||||||
|
var _this7 = this;
|
||||||
|
|
||||||
|
this._steps.forEach(function (step) {
|
||||||
|
var trigger = step.querySelector(_this7.options.selectors.trigger);
|
||||||
|
|
||||||
|
if (_this7.options.linear) {
|
||||||
|
trigger.removeEventListener('click', _this7._clickStepLinearListener);
|
||||||
|
} else {
|
||||||
|
trigger.removeEventListener('click', _this7._clickStepNonLinearListener);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
this._element[customProperty] = undefined;
|
||||||
|
this._element = undefined;
|
||||||
|
this._currentIndex = undefined;
|
||||||
|
this._steps = undefined;
|
||||||
|
this._stepsContents = undefined;
|
||||||
|
this._clickStepLinearListener = undefined;
|
||||||
|
this._clickStepNonLinearListener = undefined;
|
||||||
|
};
|
||||||
|
|
||||||
|
return Stepper;
|
||||||
|
}();
|
||||||
|
|
||||||
|
return Stepper;
|
||||||
|
|
||||||
|
}));
|
||||||
|
//# sourceMappingURL=bs-stepper.js.map
|
1
public/plugins/bs-stepper/js/bs-stepper.js.map
Normal file
1
public/plugins/bs-stepper/js/bs-stepper.js.map
Normal file
File diff suppressed because one or more lines are too long
7
public/plugins/bs-stepper/js/bs-stepper.min.js
vendored
Normal file
7
public/plugins/bs-stepper/js/bs-stepper.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
public/plugins/bs-stepper/js/bs-stepper.min.js.map
Normal file
1
public/plugins/bs-stepper/js/bs-stepper.min.js.map
Normal file
File diff suppressed because one or more lines are too long
20776
public/plugins/chart.js/Chart.bundle.js
vendored
Normal file
20776
public/plugins/chart.js/Chart.bundle.js
vendored
Normal file
File diff suppressed because it is too large
Load diff
7
public/plugins/chart.js/Chart.bundle.min.js
vendored
Normal file
7
public/plugins/chart.js/Chart.bundle.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
47
public/plugins/chart.js/Chart.css
vendored
Normal file
47
public/plugins/chart.js/Chart.css
vendored
Normal file
|
@ -0,0 +1,47 @@
|
||||||
|
/*
|
||||||
|
* DOM element rendering detection
|
||||||
|
* https://davidwalsh.name/detect-node-insertion
|
||||||
|
*/
|
||||||
|
@keyframes chartjs-render-animation {
|
||||||
|
from { opacity: 0.99; }
|
||||||
|
to { opacity: 1; }
|
||||||
|
}
|
||||||
|
|
||||||
|
.chartjs-render-monitor {
|
||||||
|
animation: chartjs-render-animation 0.001s;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* DOM element resizing detection
|
||||||
|
* https://github.com/marcj/css-element-queries
|
||||||
|
*/
|
||||||
|
.chartjs-size-monitor,
|
||||||
|
.chartjs-size-monitor-expand,
|
||||||
|
.chartjs-size-monitor-shrink {
|
||||||
|
position: absolute;
|
||||||
|
direction: ltr;
|
||||||
|
left: 0;
|
||||||
|
top: 0;
|
||||||
|
right: 0;
|
||||||
|
bottom: 0;
|
||||||
|
overflow: hidden;
|
||||||
|
pointer-events: none;
|
||||||
|
visibility: hidden;
|
||||||
|
z-index: -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.chartjs-size-monitor-expand > div {
|
||||||
|
position: absolute;
|
||||||
|
width: 1000000px;
|
||||||
|
height: 1000000px;
|
||||||
|
left: 0;
|
||||||
|
top: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.chartjs-size-monitor-shrink > div {
|
||||||
|
position: absolute;
|
||||||
|
width: 200%;
|
||||||
|
height: 200%;
|
||||||
|
left: 0;
|
||||||
|
top: 0;
|
||||||
|
}
|
16172
public/plugins/chart.js/Chart.js
vendored
Normal file
16172
public/plugins/chart.js/Chart.js
vendored
Normal file
File diff suppressed because it is too large
Load diff
1
public/plugins/chart.js/Chart.min.css
vendored
Normal file
1
public/plugins/chart.js/Chart.min.css
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
@keyframes chartjs-render-animation{from{opacity:.99}to{opacity:1}}.chartjs-render-monitor{animation:chartjs-render-animation 1ms}.chartjs-size-monitor,.chartjs-size-monitor-expand,.chartjs-size-monitor-shrink{position:absolute;direction:ltr;left:0;top:0;right:0;bottom:0;overflow:hidden;pointer-events:none;visibility:hidden;z-index:-1}.chartjs-size-monitor-expand>div{position:absolute;width:1000000px;height:1000000px;left:0;top:0}.chartjs-size-monitor-shrink>div{position:absolute;width:200%;height:200%;left:0;top:0}
|
7
public/plugins/chart.js/Chart.min.js
vendored
Normal file
7
public/plugins/chart.js/Chart.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
211
public/plugins/codemirror/addon/comment/comment.js
vendored
Normal file
211
public/plugins/codemirror/addon/comment/comment.js
vendored
Normal file
|
@ -0,0 +1,211 @@
|
||||||
|
// CodeMirror, copyright (c) by Marijn Haverbeke and others
|
||||||
|
// Distributed under an MIT license: https://codemirror.net/LICENSE
|
||||||
|
|
||||||
|
(function(mod) {
|
||||||
|
if (typeof exports == "object" && typeof module == "object") // CommonJS
|
||||||
|
mod(require("../../lib/codemirror"));
|
||||||
|
else if (typeof define == "function" && define.amd) // AMD
|
||||||
|
define(["../../lib/codemirror"], mod);
|
||||||
|
else // Plain browser env
|
||||||
|
mod(CodeMirror);
|
||||||
|
})(function(CodeMirror) {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
var noOptions = {};
|
||||||
|
var nonWS = /[^\s\u00a0]/;
|
||||||
|
var Pos = CodeMirror.Pos, cmp = CodeMirror.cmpPos;
|
||||||
|
|
||||||
|
function firstNonWS(str) {
|
||||||
|
var found = str.search(nonWS);
|
||||||
|
return found == -1 ? 0 : found;
|
||||||
|
}
|
||||||
|
|
||||||
|
CodeMirror.commands.toggleComment = function(cm) {
|
||||||
|
cm.toggleComment();
|
||||||
|
};
|
||||||
|
|
||||||
|
CodeMirror.defineExtension("toggleComment", function(options) {
|
||||||
|
if (!options) options = noOptions;
|
||||||
|
var cm = this;
|
||||||
|
var minLine = Infinity, ranges = this.listSelections(), mode = null;
|
||||||
|
for (var i = ranges.length - 1; i >= 0; i--) {
|
||||||
|
var from = ranges[i].from(), to = ranges[i].to();
|
||||||
|
if (from.line >= minLine) continue;
|
||||||
|
if (to.line >= minLine) to = Pos(minLine, 0);
|
||||||
|
minLine = from.line;
|
||||||
|
if (mode == null) {
|
||||||
|
if (cm.uncomment(from, to, options)) mode = "un";
|
||||||
|
else { cm.lineComment(from, to, options); mode = "line"; }
|
||||||
|
} else if (mode == "un") {
|
||||||
|
cm.uncomment(from, to, options);
|
||||||
|
} else {
|
||||||
|
cm.lineComment(from, to, options);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Rough heuristic to try and detect lines that are part of multi-line string
|
||||||
|
function probablyInsideString(cm, pos, line) {
|
||||||
|
return /\bstring\b/.test(cm.getTokenTypeAt(Pos(pos.line, 0))) && !/^[\'\"\`]/.test(line)
|
||||||
|
}
|
||||||
|
|
||||||
|
function getMode(cm, pos) {
|
||||||
|
var mode = cm.getMode()
|
||||||
|
return mode.useInnerComments === false || !mode.innerMode ? mode : cm.getModeAt(pos)
|
||||||
|
}
|
||||||
|
|
||||||
|
CodeMirror.defineExtension("lineComment", function(from, to, options) {
|
||||||
|
if (!options) options = noOptions;
|
||||||
|
var self = this, mode = getMode(self, from);
|
||||||
|
var firstLine = self.getLine(from.line);
|
||||||
|
if (firstLine == null || probablyInsideString(self, from, firstLine)) return;
|
||||||
|
|
||||||
|
var commentString = options.lineComment || mode.lineComment;
|
||||||
|
if (!commentString) {
|
||||||
|
if (options.blockCommentStart || mode.blockCommentStart) {
|
||||||
|
options.fullLines = true;
|
||||||
|
self.blockComment(from, to, options);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var end = Math.min(to.ch != 0 || to.line == from.line ? to.line + 1 : to.line, self.lastLine() + 1);
|
||||||
|
var pad = options.padding == null ? " " : options.padding;
|
||||||
|
var blankLines = options.commentBlankLines || from.line == to.line;
|
||||||
|
|
||||||
|
self.operation(function() {
|
||||||
|
if (options.indent) {
|
||||||
|
var baseString = null;
|
||||||
|
for (var i = from.line; i < end; ++i) {
|
||||||
|
var line = self.getLine(i);
|
||||||
|
var whitespace = line.slice(0, firstNonWS(line));
|
||||||
|
if (baseString == null || baseString.length > whitespace.length) {
|
||||||
|
baseString = whitespace;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (var i = from.line; i < end; ++i) {
|
||||||
|
var line = self.getLine(i), cut = baseString.length;
|
||||||
|
if (!blankLines && !nonWS.test(line)) continue;
|
||||||
|
if (line.slice(0, cut) != baseString) cut = firstNonWS(line);
|
||||||
|
self.replaceRange(baseString + commentString + pad, Pos(i, 0), Pos(i, cut));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for (var i = from.line; i < end; ++i) {
|
||||||
|
if (blankLines || nonWS.test(self.getLine(i)))
|
||||||
|
self.replaceRange(commentString + pad, Pos(i, 0));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
CodeMirror.defineExtension("blockComment", function(from, to, options) {
|
||||||
|
if (!options) options = noOptions;
|
||||||
|
var self = this, mode = getMode(self, from);
|
||||||
|
var startString = options.blockCommentStart || mode.blockCommentStart;
|
||||||
|
var endString = options.blockCommentEnd || mode.blockCommentEnd;
|
||||||
|
if (!startString || !endString) {
|
||||||
|
if ((options.lineComment || mode.lineComment) && options.fullLines != false)
|
||||||
|
self.lineComment(from, to, options);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (/\bcomment\b/.test(self.getTokenTypeAt(Pos(from.line, 0)))) return
|
||||||
|
|
||||||
|
var end = Math.min(to.line, self.lastLine());
|
||||||
|
if (end != from.line && to.ch == 0 && nonWS.test(self.getLine(end))) --end;
|
||||||
|
|
||||||
|
var pad = options.padding == null ? " " : options.padding;
|
||||||
|
if (from.line > end) return;
|
||||||
|
|
||||||
|
self.operation(function() {
|
||||||
|
if (options.fullLines != false) {
|
||||||
|
var lastLineHasText = nonWS.test(self.getLine(end));
|
||||||
|
self.replaceRange(pad + endString, Pos(end));
|
||||||
|
self.replaceRange(startString + pad, Pos(from.line, 0));
|
||||||
|
var lead = options.blockCommentLead || mode.blockCommentLead;
|
||||||
|
if (lead != null) for (var i = from.line + 1; i <= end; ++i)
|
||||||
|
if (i != end || lastLineHasText)
|
||||||
|
self.replaceRange(lead + pad, Pos(i, 0));
|
||||||
|
} else {
|
||||||
|
var atCursor = cmp(self.getCursor("to"), to) == 0, empty = !self.somethingSelected()
|
||||||
|
self.replaceRange(endString, to);
|
||||||
|
if (atCursor) self.setSelection(empty ? to : self.getCursor("from"), to)
|
||||||
|
self.replaceRange(startString, from);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
CodeMirror.defineExtension("uncomment", function(from, to, options) {
|
||||||
|
if (!options) options = noOptions;
|
||||||
|
var self = this, mode = getMode(self, from);
|
||||||
|
var end = Math.min(to.ch != 0 || to.line == from.line ? to.line : to.line - 1, self.lastLine()), start = Math.min(from.line, end);
|
||||||
|
|
||||||
|
// Try finding line comments
|
||||||
|
var lineString = options.lineComment || mode.lineComment, lines = [];
|
||||||
|
var pad = options.padding == null ? " " : options.padding, didSomething;
|
||||||
|
lineComment: {
|
||||||
|
if (!lineString) break lineComment;
|
||||||
|
for (var i = start; i <= end; ++i) {
|
||||||
|
var line = self.getLine(i);
|
||||||
|
var found = line.indexOf(lineString);
|
||||||
|
if (found > -1 && !/comment/.test(self.getTokenTypeAt(Pos(i, found + 1)))) found = -1;
|
||||||
|
if (found == -1 && nonWS.test(line)) break lineComment;
|
||||||
|
if (found > -1 && nonWS.test(line.slice(0, found))) break lineComment;
|
||||||
|
lines.push(line);
|
||||||
|
}
|
||||||
|
self.operation(function() {
|
||||||
|
for (var i = start; i <= end; ++i) {
|
||||||
|
var line = lines[i - start];
|
||||||
|
var pos = line.indexOf(lineString), endPos = pos + lineString.length;
|
||||||
|
if (pos < 0) continue;
|
||||||
|
if (line.slice(endPos, endPos + pad.length) == pad) endPos += pad.length;
|
||||||
|
didSomething = true;
|
||||||
|
self.replaceRange("", Pos(i, pos), Pos(i, endPos));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
if (didSomething) return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Try block comments
|
||||||
|
var startString = options.blockCommentStart || mode.blockCommentStart;
|
||||||
|
var endString = options.blockCommentEnd || mode.blockCommentEnd;
|
||||||
|
if (!startString || !endString) return false;
|
||||||
|
var lead = options.blockCommentLead || mode.blockCommentLead;
|
||||||
|
var startLine = self.getLine(start), open = startLine.indexOf(startString)
|
||||||
|
if (open == -1) return false
|
||||||
|
var endLine = end == start ? startLine : self.getLine(end)
|
||||||
|
var close = endLine.indexOf(endString, end == start ? open + startString.length : 0);
|
||||||
|
var insideStart = Pos(start, open + 1), insideEnd = Pos(end, close + 1)
|
||||||
|
if (close == -1 ||
|
||||||
|
!/comment/.test(self.getTokenTypeAt(insideStart)) ||
|
||||||
|
!/comment/.test(self.getTokenTypeAt(insideEnd)) ||
|
||||||
|
self.getRange(insideStart, insideEnd, "\n").indexOf(endString) > -1)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// Avoid killing block comments completely outside the selection.
|
||||||
|
// Positions of the last startString before the start of the selection, and the first endString after it.
|
||||||
|
var lastStart = startLine.lastIndexOf(startString, from.ch);
|
||||||
|
var firstEnd = lastStart == -1 ? -1 : startLine.slice(0, from.ch).indexOf(endString, lastStart + startString.length);
|
||||||
|
if (lastStart != -1 && firstEnd != -1 && firstEnd + endString.length != from.ch) return false;
|
||||||
|
// Positions of the first endString after the end of the selection, and the last startString before it.
|
||||||
|
firstEnd = endLine.indexOf(endString, to.ch);
|
||||||
|
var almostLastStart = endLine.slice(to.ch).lastIndexOf(startString, firstEnd - to.ch);
|
||||||
|
lastStart = (firstEnd == -1 || almostLastStart == -1) ? -1 : to.ch + almostLastStart;
|
||||||
|
if (firstEnd != -1 && lastStart != -1 && lastStart != to.ch) return false;
|
||||||
|
|
||||||
|
self.operation(function() {
|
||||||
|
self.replaceRange("", Pos(end, close - (pad && endLine.slice(close - pad.length, close) == pad ? pad.length : 0)),
|
||||||
|
Pos(end, close + endString.length));
|
||||||
|
var openEnd = open + startString.length;
|
||||||
|
if (pad && startLine.slice(openEnd, openEnd + pad.length) == pad) openEnd += pad.length;
|
||||||
|
self.replaceRange("", Pos(start, open), Pos(start, openEnd));
|
||||||
|
if (lead) for (var i = start + 1; i <= end; ++i) {
|
||||||
|
var line = self.getLine(i), found = line.indexOf(lead);
|
||||||
|
if (found == -1 || nonWS.test(line.slice(0, found))) continue;
|
||||||
|
var foundEnd = found + lead.length;
|
||||||
|
if (pad && line.slice(foundEnd, foundEnd + pad.length) == pad) foundEnd += pad.length;
|
||||||
|
self.replaceRange("", Pos(i, found), Pos(i, foundEnd));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
});
|
114
public/plugins/codemirror/addon/comment/continuecomment.js
vendored
Normal file
114
public/plugins/codemirror/addon/comment/continuecomment.js
vendored
Normal file
|
@ -0,0 +1,114 @@
|
||||||
|
// CodeMirror, copyright (c) by Marijn Haverbeke and others
|
||||||
|
// Distributed under an MIT license: https://codemirror.net/LICENSE
|
||||||
|
|
||||||
|
(function(mod) {
|
||||||
|
if (typeof exports == "object" && typeof module == "object") // CommonJS
|
||||||
|
mod(require("../../lib/codemirror"));
|
||||||
|
else if (typeof define == "function" && define.amd) // AMD
|
||||||
|
define(["../../lib/codemirror"], mod);
|
||||||
|
else // Plain browser env
|
||||||
|
mod(CodeMirror);
|
||||||
|
})(function(CodeMirror) {
|
||||||
|
var nonspace = /\S/g;
|
||||||
|
var repeat = String.prototype.repeat || function (n) { return Array(n + 1).join(this); };
|
||||||
|
function continueComment(cm) {
|
||||||
|
if (cm.getOption("disableInput")) return CodeMirror.Pass;
|
||||||
|
var ranges = cm.listSelections(), mode, inserts = [];
|
||||||
|
for (var i = 0; i < ranges.length; i++) {
|
||||||
|
var pos = ranges[i].head
|
||||||
|
if (!/\bcomment\b/.test(cm.getTokenTypeAt(pos))) return CodeMirror.Pass;
|
||||||
|
var modeHere = cm.getModeAt(pos)
|
||||||
|
if (!mode) mode = modeHere;
|
||||||
|
else if (mode != modeHere) return CodeMirror.Pass;
|
||||||
|
|
||||||
|
var insert = null, line, found;
|
||||||
|
var blockStart = mode.blockCommentStart, lineCmt = mode.lineComment;
|
||||||
|
if (blockStart && mode.blockCommentContinue) {
|
||||||
|
line = cm.getLine(pos.line);
|
||||||
|
var end = line.lastIndexOf(mode.blockCommentEnd, pos.ch - mode.blockCommentEnd.length);
|
||||||
|
// 1. if this block comment ended
|
||||||
|
// 2. if this is actually inside a line comment
|
||||||
|
if (end != -1 && end == pos.ch - mode.blockCommentEnd.length ||
|
||||||
|
lineCmt && (found = line.lastIndexOf(lineCmt, pos.ch - 1)) > -1 &&
|
||||||
|
/\bcomment\b/.test(cm.getTokenTypeAt({line: pos.line, ch: found + 1}))) {
|
||||||
|
// ...then don't continue it
|
||||||
|
} else if (pos.ch >= blockStart.length &&
|
||||||
|
(found = line.lastIndexOf(blockStart, pos.ch - blockStart.length)) > -1 &&
|
||||||
|
found > end) {
|
||||||
|
// reuse the existing leading spaces/tabs/mixed
|
||||||
|
// or build the correct indent using CM's tab/indent options
|
||||||
|
if (nonspaceAfter(0, line) >= found) {
|
||||||
|
insert = line.slice(0, found);
|
||||||
|
} else {
|
||||||
|
var tabSize = cm.options.tabSize, numTabs;
|
||||||
|
found = CodeMirror.countColumn(line, found, tabSize);
|
||||||
|
insert = !cm.options.indentWithTabs ? repeat.call(" ", found) :
|
||||||
|
repeat.call("\t", (numTabs = Math.floor(found / tabSize))) +
|
||||||
|
repeat.call(" ", found - tabSize * numTabs);
|
||||||
|
}
|
||||||
|
} else if ((found = line.indexOf(mode.blockCommentContinue)) > -1 &&
|
||||||
|
found <= pos.ch &&
|
||||||
|
found <= nonspaceAfter(0, line)) {
|
||||||
|
insert = line.slice(0, found);
|
||||||
|
}
|
||||||
|
if (insert != null) insert += mode.blockCommentContinue
|
||||||
|
}
|
||||||
|
if (insert == null && lineCmt && continueLineCommentEnabled(cm)) {
|
||||||
|
if (line == null) line = cm.getLine(pos.line);
|
||||||
|
found = line.indexOf(lineCmt);
|
||||||
|
// cursor at pos 0, line comment also at pos 0 => shift it down, don't continue
|
||||||
|
if (!pos.ch && !found) insert = "";
|
||||||
|
// continue only if the line starts with an optional space + line comment
|
||||||
|
else if (found > -1 && nonspaceAfter(0, line) >= found) {
|
||||||
|
// don't continue if there's only space(s) after cursor or the end of the line
|
||||||
|
insert = nonspaceAfter(pos.ch, line) > -1;
|
||||||
|
// but always continue if the next line starts with a line comment too
|
||||||
|
if (!insert) {
|
||||||
|
var next = cm.getLine(pos.line + 1) || '',
|
||||||
|
nextFound = next.indexOf(lineCmt);
|
||||||
|
insert = nextFound > -1 && nonspaceAfter(0, next) >= nextFound || null;
|
||||||
|
}
|
||||||
|
if (insert) {
|
||||||
|
insert = line.slice(0, found) + lineCmt +
|
||||||
|
line.slice(found + lineCmt.length).match(/^\s*/)[0];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (insert == null) return CodeMirror.Pass;
|
||||||
|
inserts[i] = "\n" + insert;
|
||||||
|
}
|
||||||
|
|
||||||
|
cm.operation(function() {
|
||||||
|
for (var i = ranges.length - 1; i >= 0; i--)
|
||||||
|
cm.replaceRange(inserts[i], ranges[i].from(), ranges[i].to(), "+insert");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function nonspaceAfter(ch, str) {
|
||||||
|
nonspace.lastIndex = ch;
|
||||||
|
var m = nonspace.exec(str);
|
||||||
|
return m ? m.index : -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
function continueLineCommentEnabled(cm) {
|
||||||
|
var opt = cm.getOption("continueComments");
|
||||||
|
if (opt && typeof opt == "object")
|
||||||
|
return opt.continueLineComment !== false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
CodeMirror.defineOption("continueComments", null, function(cm, val, prev) {
|
||||||
|
if (prev && prev != CodeMirror.Init)
|
||||||
|
cm.removeKeyMap("continueComment");
|
||||||
|
if (val) {
|
||||||
|
var key = "Enter";
|
||||||
|
if (typeof val == "string")
|
||||||
|
key = val;
|
||||||
|
else if (typeof val == "object" && val.key)
|
||||||
|
key = val.key;
|
||||||
|
var map = {name: "continueComment"};
|
||||||
|
map[key] = continueComment;
|
||||||
|
cm.addKeyMap(map);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
32
public/plugins/codemirror/addon/dialog/dialog.css
vendored
Normal file
32
public/plugins/codemirror/addon/dialog/dialog.css
vendored
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
.CodeMirror-dialog {
|
||||||
|
position: absolute;
|
||||||
|
left: 0; right: 0;
|
||||||
|
background: inherit;
|
||||||
|
z-index: 15;
|
||||||
|
padding: .1em .8em;
|
||||||
|
overflow: hidden;
|
||||||
|
color: inherit;
|
||||||
|
}
|
||||||
|
|
||||||
|
.CodeMirror-dialog-top {
|
||||||
|
border-bottom: 1px solid #eee;
|
||||||
|
top: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.CodeMirror-dialog-bottom {
|
||||||
|
border-top: 1px solid #eee;
|
||||||
|
bottom: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.CodeMirror-dialog input {
|
||||||
|
border: none;
|
||||||
|
outline: none;
|
||||||
|
background: transparent;
|
||||||
|
width: 20em;
|
||||||
|
color: inherit;
|
||||||
|
font-family: monospace;
|
||||||
|
}
|
||||||
|
|
||||||
|
.CodeMirror-dialog button {
|
||||||
|
font-size: 70%;
|
||||||
|
}
|
163
public/plugins/codemirror/addon/dialog/dialog.js
vendored
Normal file
163
public/plugins/codemirror/addon/dialog/dialog.js
vendored
Normal file
|
@ -0,0 +1,163 @@
|
||||||
|
// CodeMirror, copyright (c) by Marijn Haverbeke and others
|
||||||
|
// Distributed under an MIT license: https://codemirror.net/LICENSE
|
||||||
|
|
||||||
|
// Open simple dialogs on top of an editor. Relies on dialog.css.
|
||||||
|
|
||||||
|
(function(mod) {
|
||||||
|
if (typeof exports == "object" && typeof module == "object") // CommonJS
|
||||||
|
mod(require("../../lib/codemirror"));
|
||||||
|
else if (typeof define == "function" && define.amd) // AMD
|
||||||
|
define(["../../lib/codemirror"], mod);
|
||||||
|
else // Plain browser env
|
||||||
|
mod(CodeMirror);
|
||||||
|
})(function(CodeMirror) {
|
||||||
|
function dialogDiv(cm, template, bottom) {
|
||||||
|
var wrap = cm.getWrapperElement();
|
||||||
|
var dialog;
|
||||||
|
dialog = wrap.appendChild(document.createElement("div"));
|
||||||
|
if (bottom)
|
||||||
|
dialog.className = "CodeMirror-dialog CodeMirror-dialog-bottom";
|
||||||
|
else
|
||||||
|
dialog.className = "CodeMirror-dialog CodeMirror-dialog-top";
|
||||||
|
|
||||||
|
if (typeof template == "string") {
|
||||||
|
dialog.innerHTML = template;
|
||||||
|
} else { // Assuming it's a detached DOM element.
|
||||||
|
dialog.appendChild(template);
|
||||||
|
}
|
||||||
|
CodeMirror.addClass(wrap, 'dialog-opened');
|
||||||
|
return dialog;
|
||||||
|
}
|
||||||
|
|
||||||
|
function closeNotification(cm, newVal) {
|
||||||
|
if (cm.state.currentNotificationClose)
|
||||||
|
cm.state.currentNotificationClose();
|
||||||
|
cm.state.currentNotificationClose = newVal;
|
||||||
|
}
|
||||||
|
|
||||||
|
CodeMirror.defineExtension("openDialog", function(template, callback, options) {
|
||||||
|
if (!options) options = {};
|
||||||
|
|
||||||
|
closeNotification(this, null);
|
||||||
|
|
||||||
|
var dialog = dialogDiv(this, template, options.bottom);
|
||||||
|
var closed = false, me = this;
|
||||||
|
function close(newVal) {
|
||||||
|
if (typeof newVal == 'string') {
|
||||||
|
inp.value = newVal;
|
||||||
|
} else {
|
||||||
|
if (closed) return;
|
||||||
|
closed = true;
|
||||||
|
CodeMirror.rmClass(dialog.parentNode, 'dialog-opened');
|
||||||
|
dialog.parentNode.removeChild(dialog);
|
||||||
|
me.focus();
|
||||||
|
|
||||||
|
if (options.onClose) options.onClose(dialog);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var inp = dialog.getElementsByTagName("input")[0], button;
|
||||||
|
if (inp) {
|
||||||
|
inp.focus();
|
||||||
|
|
||||||
|
if (options.value) {
|
||||||
|
inp.value = options.value;
|
||||||
|
if (options.selectValueOnOpen !== false) {
|
||||||
|
inp.select();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (options.onInput)
|
||||||
|
CodeMirror.on(inp, "input", function(e) { options.onInput(e, inp.value, close);});
|
||||||
|
if (options.onKeyUp)
|
||||||
|
CodeMirror.on(inp, "keyup", function(e) {options.onKeyUp(e, inp.value, close);});
|
||||||
|
|
||||||
|
CodeMirror.on(inp, "keydown", function(e) {
|
||||||
|
if (options && options.onKeyDown && options.onKeyDown(e, inp.value, close)) { return; }
|
||||||
|
if (e.keyCode == 27 || (options.closeOnEnter !== false && e.keyCode == 13)) {
|
||||||
|
inp.blur();
|
||||||
|
CodeMirror.e_stop(e);
|
||||||
|
close();
|
||||||
|
}
|
||||||
|
if (e.keyCode == 13) callback(inp.value, e);
|
||||||
|
});
|
||||||
|
|
||||||
|
if (options.closeOnBlur !== false) CodeMirror.on(dialog, "focusout", function (evt) {
|
||||||
|
if (evt.relatedTarget !== null) close();
|
||||||
|
});
|
||||||
|
} else if (button = dialog.getElementsByTagName("button")[0]) {
|
||||||
|
CodeMirror.on(button, "click", function() {
|
||||||
|
close();
|
||||||
|
me.focus();
|
||||||
|
});
|
||||||
|
|
||||||
|
if (options.closeOnBlur !== false) CodeMirror.on(button, "blur", close);
|
||||||
|
|
||||||
|
button.focus();
|
||||||
|
}
|
||||||
|
return close;
|
||||||
|
});
|
||||||
|
|
||||||
|
CodeMirror.defineExtension("openConfirm", function(template, callbacks, options) {
|
||||||
|
closeNotification(this, null);
|
||||||
|
var dialog = dialogDiv(this, template, options && options.bottom);
|
||||||
|
var buttons = dialog.getElementsByTagName("button");
|
||||||
|
var closed = false, me = this, blurring = 1;
|
||||||
|
function close() {
|
||||||
|
if (closed) return;
|
||||||
|
closed = true;
|
||||||
|
CodeMirror.rmClass(dialog.parentNode, 'dialog-opened');
|
||||||
|
dialog.parentNode.removeChild(dialog);
|
||||||
|
me.focus();
|
||||||
|
}
|
||||||
|
buttons[0].focus();
|
||||||
|
for (var i = 0; i < buttons.length; ++i) {
|
||||||
|
var b = buttons[i];
|
||||||
|
(function(callback) {
|
||||||
|
CodeMirror.on(b, "click", function(e) {
|
||||||
|
CodeMirror.e_preventDefault(e);
|
||||||
|
close();
|
||||||
|
if (callback) callback(me);
|
||||||
|
});
|
||||||
|
})(callbacks[i]);
|
||||||
|
CodeMirror.on(b, "blur", function() {
|
||||||
|
--blurring;
|
||||||
|
setTimeout(function() { if (blurring <= 0) close(); }, 200);
|
||||||
|
});
|
||||||
|
CodeMirror.on(b, "focus", function() { ++blurring; });
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
/*
|
||||||
|
* openNotification
|
||||||
|
* Opens a notification, that can be closed with an optional timer
|
||||||
|
* (default 5000ms timer) and always closes on click.
|
||||||
|
*
|
||||||
|
* If a notification is opened while another is opened, it will close the
|
||||||
|
* currently opened one and open the new one immediately.
|
||||||
|
*/
|
||||||
|
CodeMirror.defineExtension("openNotification", function(template, options) {
|
||||||
|
closeNotification(this, close);
|
||||||
|
var dialog = dialogDiv(this, template, options && options.bottom);
|
||||||
|
var closed = false, doneTimer;
|
||||||
|
var duration = options && typeof options.duration !== "undefined" ? options.duration : 5000;
|
||||||
|
|
||||||
|
function close() {
|
||||||
|
if (closed) return;
|
||||||
|
closed = true;
|
||||||
|
clearTimeout(doneTimer);
|
||||||
|
CodeMirror.rmClass(dialog.parentNode, 'dialog-opened');
|
||||||
|
dialog.parentNode.removeChild(dialog);
|
||||||
|
}
|
||||||
|
|
||||||
|
CodeMirror.on(dialog, 'click', function(e) {
|
||||||
|
CodeMirror.e_preventDefault(e);
|
||||||
|
close();
|
||||||
|
});
|
||||||
|
|
||||||
|
if (duration)
|
||||||
|
doneTimer = setTimeout(close, duration);
|
||||||
|
|
||||||
|
return close;
|
||||||
|
});
|
||||||
|
});
|
47
public/plugins/codemirror/addon/display/autorefresh.js
vendored
Normal file
47
public/plugins/codemirror/addon/display/autorefresh.js
vendored
Normal file
|
@ -0,0 +1,47 @@
|
||||||
|
// CodeMirror, copyright (c) by Marijn Haverbeke and others
|
||||||
|
// Distributed under an MIT license: https://codemirror.net/LICENSE
|
||||||
|
|
||||||
|
(function(mod) {
|
||||||
|
if (typeof exports == "object" && typeof module == "object") // CommonJS
|
||||||
|
mod(require("../../lib/codemirror"))
|
||||||
|
else if (typeof define == "function" && define.amd) // AMD
|
||||||
|
define(["../../lib/codemirror"], mod)
|
||||||
|
else // Plain browser env
|
||||||
|
mod(CodeMirror)
|
||||||
|
})(function(CodeMirror) {
|
||||||
|
"use strict"
|
||||||
|
|
||||||
|
CodeMirror.defineOption("autoRefresh", false, function(cm, val) {
|
||||||
|
if (cm.state.autoRefresh) {
|
||||||
|
stopListening(cm, cm.state.autoRefresh)
|
||||||
|
cm.state.autoRefresh = null
|
||||||
|
}
|
||||||
|
if (val && cm.display.wrapper.offsetHeight == 0)
|
||||||
|
startListening(cm, cm.state.autoRefresh = {delay: val.delay || 250})
|
||||||
|
})
|
||||||
|
|
||||||
|
function startListening(cm, state) {
|
||||||
|
function check() {
|
||||||
|
if (cm.display.wrapper.offsetHeight) {
|
||||||
|
stopListening(cm, state)
|
||||||
|
if (cm.display.lastWrapHeight != cm.display.wrapper.clientHeight)
|
||||||
|
cm.refresh()
|
||||||
|
} else {
|
||||||
|
state.timeout = setTimeout(check, state.delay)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
state.timeout = setTimeout(check, state.delay)
|
||||||
|
state.hurry = function() {
|
||||||
|
clearTimeout(state.timeout)
|
||||||
|
state.timeout = setTimeout(check, 50)
|
||||||
|
}
|
||||||
|
CodeMirror.on(window, "mouseup", state.hurry)
|
||||||
|
CodeMirror.on(window, "keyup", state.hurry)
|
||||||
|
}
|
||||||
|
|
||||||
|
function stopListening(_cm, state) {
|
||||||
|
clearTimeout(state.timeout)
|
||||||
|
CodeMirror.off(window, "mouseup", state.hurry)
|
||||||
|
CodeMirror.off(window, "keyup", state.hurry)
|
||||||
|
}
|
||||||
|
});
|
6
public/plugins/codemirror/addon/display/fullscreen.css
vendored
Normal file
6
public/plugins/codemirror/addon/display/fullscreen.css
vendored
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
.CodeMirror-fullscreen {
|
||||||
|
position: fixed;
|
||||||
|
top: 0; left: 0; right: 0; bottom: 0;
|
||||||
|
height: auto;
|
||||||
|
z-index: 9;
|
||||||
|
}
|
41
public/plugins/codemirror/addon/display/fullscreen.js
vendored
Normal file
41
public/plugins/codemirror/addon/display/fullscreen.js
vendored
Normal file
|
@ -0,0 +1,41 @@
|
||||||
|
// CodeMirror, copyright (c) by Marijn Haverbeke and others
|
||||||
|
// Distributed under an MIT license: https://codemirror.net/LICENSE
|
||||||
|
|
||||||
|
(function(mod) {
|
||||||
|
if (typeof exports == "object" && typeof module == "object") // CommonJS
|
||||||
|
mod(require("../../lib/codemirror"));
|
||||||
|
else if (typeof define == "function" && define.amd) // AMD
|
||||||
|
define(["../../lib/codemirror"], mod);
|
||||||
|
else // Plain browser env
|
||||||
|
mod(CodeMirror);
|
||||||
|
})(function(CodeMirror) {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
CodeMirror.defineOption("fullScreen", false, function(cm, val, old) {
|
||||||
|
if (old == CodeMirror.Init) old = false;
|
||||||
|
if (!old == !val) return;
|
||||||
|
if (val) setFullscreen(cm);
|
||||||
|
else setNormal(cm);
|
||||||
|
});
|
||||||
|
|
||||||
|
function setFullscreen(cm) {
|
||||||
|
var wrap = cm.getWrapperElement();
|
||||||
|
cm.state.fullScreenRestore = {scrollTop: window.pageYOffset, scrollLeft: window.pageXOffset,
|
||||||
|
width: wrap.style.width, height: wrap.style.height};
|
||||||
|
wrap.style.width = "";
|
||||||
|
wrap.style.height = "auto";
|
||||||
|
wrap.className += " CodeMirror-fullscreen";
|
||||||
|
document.documentElement.style.overflow = "hidden";
|
||||||
|
cm.refresh();
|
||||||
|
}
|
||||||
|
|
||||||
|
function setNormal(cm) {
|
||||||
|
var wrap = cm.getWrapperElement();
|
||||||
|
wrap.className = wrap.className.replace(/\s*CodeMirror-fullscreen\b/, "");
|
||||||
|
document.documentElement.style.overflow = "";
|
||||||
|
var info = cm.state.fullScreenRestore;
|
||||||
|
wrap.style.width = info.width; wrap.style.height = info.height;
|
||||||
|
window.scrollTo(info.scrollLeft, info.scrollTop);
|
||||||
|
cm.refresh();
|
||||||
|
}
|
||||||
|
});
|
133
public/plugins/codemirror/addon/display/panel.js
vendored
Normal file
133
public/plugins/codemirror/addon/display/panel.js
vendored
Normal file
|
@ -0,0 +1,133 @@
|
||||||
|
// CodeMirror, copyright (c) by Marijn Haverbeke and others
|
||||||
|
// Distributed under an MIT license: https://codemirror.net/LICENSE
|
||||||
|
|
||||||
|
(function (mod) {
|
||||||
|
if (typeof exports == "object" && typeof module == "object") // CommonJS
|
||||||
|
mod(require("../../lib/codemirror"));
|
||||||
|
else if (typeof define == "function" && define.amd) // AMD
|
||||||
|
define(["../../lib/codemirror"], mod);
|
||||||
|
else // Plain browser env
|
||||||
|
mod(CodeMirror);
|
||||||
|
})(function (CodeMirror) {
|
||||||
|
CodeMirror.defineExtension("addPanel", function (node, options) {
|
||||||
|
options = options || {};
|
||||||
|
|
||||||
|
if (!this.state.panels) initPanels(this);
|
||||||
|
|
||||||
|
var info = this.state.panels;
|
||||||
|
var wrapper = info.wrapper;
|
||||||
|
var cmWrapper = this.getWrapperElement();
|
||||||
|
var replace = options.replace instanceof Panel && !options.replace.cleared;
|
||||||
|
|
||||||
|
if (options.after instanceof Panel && !options.after.cleared) {
|
||||||
|
wrapper.insertBefore(node, options.before.node.nextSibling);
|
||||||
|
} else if (options.before instanceof Panel && !options.before.cleared) {
|
||||||
|
wrapper.insertBefore(node, options.before.node);
|
||||||
|
} else if (replace) {
|
||||||
|
wrapper.insertBefore(node, options.replace.node);
|
||||||
|
options.replace.clear(true);
|
||||||
|
} else if (options.position == "bottom") {
|
||||||
|
wrapper.appendChild(node);
|
||||||
|
} else if (options.position == "before-bottom") {
|
||||||
|
wrapper.insertBefore(node, cmWrapper.nextSibling);
|
||||||
|
} else if (options.position == "after-top") {
|
||||||
|
wrapper.insertBefore(node, cmWrapper);
|
||||||
|
} else {
|
||||||
|
wrapper.insertBefore(node, wrapper.firstChild);
|
||||||
|
}
|
||||||
|
|
||||||
|
var height = (options && options.height) || node.offsetHeight;
|
||||||
|
|
||||||
|
var panel = new Panel(this, node, options, height);
|
||||||
|
info.panels.push(panel);
|
||||||
|
|
||||||
|
this.setSize();
|
||||||
|
if (options.stable && isAtTop(this, node))
|
||||||
|
this.scrollTo(null, this.getScrollInfo().top + height);
|
||||||
|
|
||||||
|
return panel;
|
||||||
|
});
|
||||||
|
|
||||||
|
function Panel(cm, node, options, height) {
|
||||||
|
this.cm = cm;
|
||||||
|
this.node = node;
|
||||||
|
this.options = options;
|
||||||
|
this.height = height;
|
||||||
|
this.cleared = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* when skipRemove is true, clear() was called from addPanel().
|
||||||
|
* Thus removePanels() should not be called (issue 5518) */
|
||||||
|
Panel.prototype.clear = function (skipRemove) {
|
||||||
|
if (this.cleared) return;
|
||||||
|
this.cleared = true;
|
||||||
|
var info = this.cm.state.panels;
|
||||||
|
info.panels.splice(info.panels.indexOf(this), 1);
|
||||||
|
this.cm.setSize();
|
||||||
|
if (this.options.stable && isAtTop(this.cm, this.node))
|
||||||
|
this.cm.scrollTo(null, this.cm.getScrollInfo().top - this.height)
|
||||||
|
info.wrapper.removeChild(this.node);
|
||||||
|
if (info.panels.length == 0 && !skipRemove) removePanels(this.cm);
|
||||||
|
};
|
||||||
|
|
||||||
|
Panel.prototype.changed = function () {
|
||||||
|
this.height = this.node.getBoundingClientRect().height;
|
||||||
|
this.cm.setSize();
|
||||||
|
};
|
||||||
|
|
||||||
|
function initPanels(cm) {
|
||||||
|
var wrap = cm.getWrapperElement()
|
||||||
|
var style = window.getComputedStyle ? window.getComputedStyle(wrap) : wrap.currentStyle;
|
||||||
|
var height = parseInt(style.height);
|
||||||
|
var info = cm.state.panels = {
|
||||||
|
setHeight: wrap.style.height,
|
||||||
|
panels: [],
|
||||||
|
wrapper: document.createElement("div")
|
||||||
|
};
|
||||||
|
var hasFocus = cm.hasFocus(), scrollPos = cm.getScrollInfo()
|
||||||
|
wrap.parentNode.insertBefore(info.wrapper, wrap);
|
||||||
|
info.wrapper.appendChild(wrap);
|
||||||
|
cm.scrollTo(scrollPos.left, scrollPos.top)
|
||||||
|
if (hasFocus) cm.focus();
|
||||||
|
|
||||||
|
cm._setSize = cm.setSize;
|
||||||
|
if (height != null) cm.setSize = function (width, newHeight) {
|
||||||
|
if (!newHeight) newHeight = info.wrapper.offsetHeight;
|
||||||
|
info.setHeight = newHeight;
|
||||||
|
if (typeof newHeight != "number") {
|
||||||
|
var px = /^(\d+\.?\d*)px$/.exec(newHeight);
|
||||||
|
if (px) {
|
||||||
|
newHeight = Number(px[1]);
|
||||||
|
} else {
|
||||||
|
info.wrapper.style.height = newHeight;
|
||||||
|
newHeight = info.wrapper.offsetHeight;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
var editorheight = newHeight - info.panels
|
||||||
|
.map(function (p) { return p.node.getBoundingClientRect().height; })
|
||||||
|
.reduce(function (a, b) { return a + b; }, 0);
|
||||||
|
cm._setSize(width, editorheight);
|
||||||
|
height = newHeight;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function removePanels(cm) {
|
||||||
|
var info = cm.state.panels;
|
||||||
|
cm.state.panels = null;
|
||||||
|
|
||||||
|
var wrap = cm.getWrapperElement()
|
||||||
|
var hasFocus = cm.hasFocus(), scrollPos = cm.getScrollInfo()
|
||||||
|
info.wrapper.parentNode.replaceChild(wrap, info.wrapper);
|
||||||
|
cm.scrollTo(scrollPos.left, scrollPos.top)
|
||||||
|
if (hasFocus) cm.focus();
|
||||||
|
wrap.style.height = info.setHeight;
|
||||||
|
cm.setSize = cm._setSize;
|
||||||
|
cm.setSize();
|
||||||
|
}
|
||||||
|
|
||||||
|
function isAtTop(cm, dom) {
|
||||||
|
for (var sibling = dom.nextSibling; sibling; sibling = sibling.nextSibling)
|
||||||
|
if (sibling == cm.getWrapperElement()) return true
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
});
|
78
public/plugins/codemirror/addon/display/placeholder.js
vendored
Normal file
78
public/plugins/codemirror/addon/display/placeholder.js
vendored
Normal file
|
@ -0,0 +1,78 @@
|
||||||
|
// CodeMirror, copyright (c) by Marijn Haverbeke and others
|
||||||
|
// Distributed under an MIT license: https://codemirror.net/LICENSE
|
||||||
|
|
||||||
|
(function(mod) {
|
||||||
|
if (typeof exports == "object" && typeof module == "object") // CommonJS
|
||||||
|
mod(require("../../lib/codemirror"));
|
||||||
|
else if (typeof define == "function" && define.amd) // AMD
|
||||||
|
define(["../../lib/codemirror"], mod);
|
||||||
|
else // Plain browser env
|
||||||
|
mod(CodeMirror);
|
||||||
|
})(function(CodeMirror) {
|
||||||
|
CodeMirror.defineOption("placeholder", "", function(cm, val, old) {
|
||||||
|
var prev = old && old != CodeMirror.Init;
|
||||||
|
if (val && !prev) {
|
||||||
|
cm.on("blur", onBlur);
|
||||||
|
cm.on("change", onChange);
|
||||||
|
cm.on("swapDoc", onChange);
|
||||||
|
CodeMirror.on(cm.getInputField(), "compositionupdate", cm.state.placeholderCompose = function() { onComposition(cm) })
|
||||||
|
onChange(cm);
|
||||||
|
} else if (!val && prev) {
|
||||||
|
cm.off("blur", onBlur);
|
||||||
|
cm.off("change", onChange);
|
||||||
|
cm.off("swapDoc", onChange);
|
||||||
|
CodeMirror.off(cm.getInputField(), "compositionupdate", cm.state.placeholderCompose)
|
||||||
|
clearPlaceholder(cm);
|
||||||
|
var wrapper = cm.getWrapperElement();
|
||||||
|
wrapper.className = wrapper.className.replace(" CodeMirror-empty", "");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (val && !cm.hasFocus()) onBlur(cm);
|
||||||
|
});
|
||||||
|
|
||||||
|
function clearPlaceholder(cm) {
|
||||||
|
if (cm.state.placeholder) {
|
||||||
|
cm.state.placeholder.parentNode.removeChild(cm.state.placeholder);
|
||||||
|
cm.state.placeholder = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function setPlaceholder(cm) {
|
||||||
|
clearPlaceholder(cm);
|
||||||
|
var elt = cm.state.placeholder = document.createElement("pre");
|
||||||
|
elt.style.cssText = "height: 0; overflow: visible";
|
||||||
|
elt.style.direction = cm.getOption("direction");
|
||||||
|
elt.className = "CodeMirror-placeholder CodeMirror-line-like";
|
||||||
|
var placeHolder = cm.getOption("placeholder")
|
||||||
|
if (typeof placeHolder == "string") placeHolder = document.createTextNode(placeHolder)
|
||||||
|
elt.appendChild(placeHolder)
|
||||||
|
cm.display.lineSpace.insertBefore(elt, cm.display.lineSpace.firstChild);
|
||||||
|
}
|
||||||
|
|
||||||
|
function onComposition(cm) {
|
||||||
|
setTimeout(function() {
|
||||||
|
var empty = false
|
||||||
|
if (cm.lineCount() == 1) {
|
||||||
|
var input = cm.getInputField()
|
||||||
|
empty = input.nodeName == "TEXTAREA" ? !cm.getLine(0).length
|
||||||
|
: !/[^\u200b]/.test(input.querySelector(".CodeMirror-line").textContent)
|
||||||
|
}
|
||||||
|
if (empty) setPlaceholder(cm)
|
||||||
|
else clearPlaceholder(cm)
|
||||||
|
}, 20)
|
||||||
|
}
|
||||||
|
|
||||||
|
function onBlur(cm) {
|
||||||
|
if (isEmpty(cm)) setPlaceholder(cm);
|
||||||
|
}
|
||||||
|
function onChange(cm) {
|
||||||
|
var wrapper = cm.getWrapperElement(), empty = isEmpty(cm);
|
||||||
|
wrapper.className = wrapper.className.replace(" CodeMirror-empty", "") + (empty ? " CodeMirror-empty" : "");
|
||||||
|
|
||||||
|
if (empty) setPlaceholder(cm);
|
||||||
|
else clearPlaceholder(cm);
|
||||||
|
}
|
||||||
|
|
||||||
|
function isEmpty(cm) {
|
||||||
|
return (cm.lineCount() === 1) && (cm.getLine(0) === "");
|
||||||
|
}
|
||||||
|
});
|
51
public/plugins/codemirror/addon/display/rulers.js
vendored
Normal file
51
public/plugins/codemirror/addon/display/rulers.js
vendored
Normal file
|
@ -0,0 +1,51 @@
|
||||||
|
// CodeMirror, copyright (c) by Marijn Haverbeke and others
|
||||||
|
// Distributed under an MIT license: https://codemirror.net/LICENSE
|
||||||
|
|
||||||
|
(function(mod) {
|
||||||
|
if (typeof exports == "object" && typeof module == "object") // CommonJS
|
||||||
|
mod(require("../../lib/codemirror"));
|
||||||
|
else if (typeof define == "function" && define.amd) // AMD
|
||||||
|
define(["../../lib/codemirror"], mod);
|
||||||
|
else // Plain browser env
|
||||||
|
mod(CodeMirror);
|
||||||
|
})(function(CodeMirror) {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
CodeMirror.defineOption("rulers", false, function(cm, val) {
|
||||||
|
if (cm.state.rulerDiv) {
|
||||||
|
cm.state.rulerDiv.parentElement.removeChild(cm.state.rulerDiv)
|
||||||
|
cm.state.rulerDiv = null
|
||||||
|
cm.off("refresh", drawRulers)
|
||||||
|
}
|
||||||
|
if (val && val.length) {
|
||||||
|
cm.state.rulerDiv = cm.display.lineSpace.parentElement.insertBefore(document.createElement("div"), cm.display.lineSpace)
|
||||||
|
cm.state.rulerDiv.className = "CodeMirror-rulers"
|
||||||
|
drawRulers(cm)
|
||||||
|
cm.on("refresh", drawRulers)
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
function drawRulers(cm) {
|
||||||
|
cm.state.rulerDiv.textContent = ""
|
||||||
|
var val = cm.getOption("rulers");
|
||||||
|
var cw = cm.defaultCharWidth();
|
||||||
|
var left = cm.charCoords(CodeMirror.Pos(cm.firstLine(), 0), "div").left;
|
||||||
|
cm.state.rulerDiv.style.minHeight = (cm.display.scroller.offsetHeight + 30) + "px";
|
||||||
|
for (var i = 0; i < val.length; i++) {
|
||||||
|
var elt = document.createElement("div");
|
||||||
|
elt.className = "CodeMirror-ruler";
|
||||||
|
var col, conf = val[i];
|
||||||
|
if (typeof conf == "number") {
|
||||||
|
col = conf;
|
||||||
|
} else {
|
||||||
|
col = conf.column;
|
||||||
|
if (conf.className) elt.className += " " + conf.className;
|
||||||
|
if (conf.color) elt.style.borderColor = conf.color;
|
||||||
|
if (conf.lineStyle) elt.style.borderLeftStyle = conf.lineStyle;
|
||||||
|
if (conf.width) elt.style.borderLeftWidth = conf.width;
|
||||||
|
}
|
||||||
|
elt.style.left = (left + col * cw) + "px";
|
||||||
|
cm.state.rulerDiv.appendChild(elt)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
201
public/plugins/codemirror/addon/edit/closebrackets.js
vendored
Normal file
201
public/plugins/codemirror/addon/edit/closebrackets.js
vendored
Normal file
|
@ -0,0 +1,201 @@
|
||||||
|
// CodeMirror, copyright (c) by Marijn Haverbeke and others
|
||||||
|
// Distributed under an MIT license: https://codemirror.net/LICENSE
|
||||||
|
|
||||||
|
(function(mod) {
|
||||||
|
if (typeof exports == "object" && typeof module == "object") // CommonJS
|
||||||
|
mod(require("../../lib/codemirror"));
|
||||||
|
else if (typeof define == "function" && define.amd) // AMD
|
||||||
|
define(["../../lib/codemirror"], mod);
|
||||||
|
else // Plain browser env
|
||||||
|
mod(CodeMirror);
|
||||||
|
})(function(CodeMirror) {
|
||||||
|
var defaults = {
|
||||||
|
pairs: "()[]{}''\"\"",
|
||||||
|
closeBefore: ")]}'\":;>",
|
||||||
|
triples: "",
|
||||||
|
explode: "[]{}"
|
||||||
|
};
|
||||||
|
|
||||||
|
var Pos = CodeMirror.Pos;
|
||||||
|
|
||||||
|
CodeMirror.defineOption("autoCloseBrackets", false, function(cm, val, old) {
|
||||||
|
if (old && old != CodeMirror.Init) {
|
||||||
|
cm.removeKeyMap(keyMap);
|
||||||
|
cm.state.closeBrackets = null;
|
||||||
|
}
|
||||||
|
if (val) {
|
||||||
|
ensureBound(getOption(val, "pairs"))
|
||||||
|
cm.state.closeBrackets = val;
|
||||||
|
cm.addKeyMap(keyMap);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
function getOption(conf, name) {
|
||||||
|
if (name == "pairs" && typeof conf == "string") return conf;
|
||||||
|
if (typeof conf == "object" && conf[name] != null) return conf[name];
|
||||||
|
return defaults[name];
|
||||||
|
}
|
||||||
|
|
||||||
|
var keyMap = {Backspace: handleBackspace, Enter: handleEnter};
|
||||||
|
function ensureBound(chars) {
|
||||||
|
for (var i = 0; i < chars.length; i++) {
|
||||||
|
var ch = chars.charAt(i), key = "'" + ch + "'"
|
||||||
|
if (!keyMap[key]) keyMap[key] = handler(ch)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ensureBound(defaults.pairs + "`")
|
||||||
|
|
||||||
|
function handler(ch) {
|
||||||
|
return function(cm) { return handleChar(cm, ch); };
|
||||||
|
}
|
||||||
|
|
||||||
|
function getConfig(cm) {
|
||||||
|
var deflt = cm.state.closeBrackets;
|
||||||
|
if (!deflt || deflt.override) return deflt;
|
||||||
|
var mode = cm.getModeAt(cm.getCursor());
|
||||||
|
return mode.closeBrackets || deflt;
|
||||||
|
}
|
||||||
|
|
||||||
|
function handleBackspace(cm) {
|
||||||
|
var conf = getConfig(cm);
|
||||||
|
if (!conf || cm.getOption("disableInput")) return CodeMirror.Pass;
|
||||||
|
|
||||||
|
var pairs = getOption(conf, "pairs");
|
||||||
|
var ranges = cm.listSelections();
|
||||||
|
for (var i = 0; i < ranges.length; i++) {
|
||||||
|
if (!ranges[i].empty()) return CodeMirror.Pass;
|
||||||
|
var around = charsAround(cm, ranges[i].head);
|
||||||
|
if (!around || pairs.indexOf(around) % 2 != 0) return CodeMirror.Pass;
|
||||||
|
}
|
||||||
|
for (var i = ranges.length - 1; i >= 0; i--) {
|
||||||
|
var cur = ranges[i].head;
|
||||||
|
cm.replaceRange("", Pos(cur.line, cur.ch - 1), Pos(cur.line, cur.ch + 1), "+delete");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function handleEnter(cm) {
|
||||||
|
var conf = getConfig(cm);
|
||||||
|
var explode = conf && getOption(conf, "explode");
|
||||||
|
if (!explode || cm.getOption("disableInput")) return CodeMirror.Pass;
|
||||||
|
|
||||||
|
var ranges = cm.listSelections();
|
||||||
|
for (var i = 0; i < ranges.length; i++) {
|
||||||
|
if (!ranges[i].empty()) return CodeMirror.Pass;
|
||||||
|
var around = charsAround(cm, ranges[i].head);
|
||||||
|
if (!around || explode.indexOf(around) % 2 != 0) return CodeMirror.Pass;
|
||||||
|
}
|
||||||
|
cm.operation(function() {
|
||||||
|
var linesep = cm.lineSeparator() || "\n";
|
||||||
|
cm.replaceSelection(linesep + linesep, null);
|
||||||
|
moveSel(cm, -1)
|
||||||
|
ranges = cm.listSelections();
|
||||||
|
for (var i = 0; i < ranges.length; i++) {
|
||||||
|
var line = ranges[i].head.line;
|
||||||
|
cm.indentLine(line, null, true);
|
||||||
|
cm.indentLine(line + 1, null, true);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function moveSel(cm, dir) {
|
||||||
|
var newRanges = [], ranges = cm.listSelections(), primary = 0
|
||||||
|
for (var i = 0; i < ranges.length; i++) {
|
||||||
|
var range = ranges[i]
|
||||||
|
if (range.head == cm.getCursor()) primary = i
|
||||||
|
var pos = range.head.ch || dir > 0 ? {line: range.head.line, ch: range.head.ch + dir} : {line: range.head.line - 1}
|
||||||
|
newRanges.push({anchor: pos, head: pos})
|
||||||
|
}
|
||||||
|
cm.setSelections(newRanges, primary)
|
||||||
|
}
|
||||||
|
|
||||||
|
function contractSelection(sel) {
|
||||||
|
var inverted = CodeMirror.cmpPos(sel.anchor, sel.head) > 0;
|
||||||
|
return {anchor: new Pos(sel.anchor.line, sel.anchor.ch + (inverted ? -1 : 1)),
|
||||||
|
head: new Pos(sel.head.line, sel.head.ch + (inverted ? 1 : -1))};
|
||||||
|
}
|
||||||
|
|
||||||
|
function handleChar(cm, ch) {
|
||||||
|
var conf = getConfig(cm);
|
||||||
|
if (!conf || cm.getOption("disableInput")) return CodeMirror.Pass;
|
||||||
|
|
||||||
|
var pairs = getOption(conf, "pairs");
|
||||||
|
var pos = pairs.indexOf(ch);
|
||||||
|
if (pos == -1) return CodeMirror.Pass;
|
||||||
|
|
||||||
|
var closeBefore = getOption(conf,"closeBefore");
|
||||||
|
|
||||||
|
var triples = getOption(conf, "triples");
|
||||||
|
|
||||||
|
var identical = pairs.charAt(pos + 1) == ch;
|
||||||
|
var ranges = cm.listSelections();
|
||||||
|
var opening = pos % 2 == 0;
|
||||||
|
|
||||||
|
var type;
|
||||||
|
for (var i = 0; i < ranges.length; i++) {
|
||||||
|
var range = ranges[i], cur = range.head, curType;
|
||||||
|
var next = cm.getRange(cur, Pos(cur.line, cur.ch + 1));
|
||||||
|
if (opening && !range.empty()) {
|
||||||
|
curType = "surround";
|
||||||
|
} else if ((identical || !opening) && next == ch) {
|
||||||
|
if (identical && stringStartsAfter(cm, cur))
|
||||||
|
curType = "both";
|
||||||
|
else if (triples.indexOf(ch) >= 0 && cm.getRange(cur, Pos(cur.line, cur.ch + 3)) == ch + ch + ch)
|
||||||
|
curType = "skipThree";
|
||||||
|
else
|
||||||
|
curType = "skip";
|
||||||
|
} else if (identical && cur.ch > 1 && triples.indexOf(ch) >= 0 &&
|
||||||
|
cm.getRange(Pos(cur.line, cur.ch - 2), cur) == ch + ch) {
|
||||||
|
if (cur.ch > 2 && /\bstring/.test(cm.getTokenTypeAt(Pos(cur.line, cur.ch - 2)))) return CodeMirror.Pass;
|
||||||
|
curType = "addFour";
|
||||||
|
} else if (identical) {
|
||||||
|
var prev = cur.ch == 0 ? " " : cm.getRange(Pos(cur.line, cur.ch - 1), cur)
|
||||||
|
if (!CodeMirror.isWordChar(next) && prev != ch && !CodeMirror.isWordChar(prev)) curType = "both";
|
||||||
|
else return CodeMirror.Pass;
|
||||||
|
} else if (opening && (next.length === 0 || /\s/.test(next) || closeBefore.indexOf(next) > -1)) {
|
||||||
|
curType = "both";
|
||||||
|
} else {
|
||||||
|
return CodeMirror.Pass;
|
||||||
|
}
|
||||||
|
if (!type) type = curType;
|
||||||
|
else if (type != curType) return CodeMirror.Pass;
|
||||||
|
}
|
||||||
|
|
||||||
|
var left = pos % 2 ? pairs.charAt(pos - 1) : ch;
|
||||||
|
var right = pos % 2 ? ch : pairs.charAt(pos + 1);
|
||||||
|
cm.operation(function() {
|
||||||
|
if (type == "skip") {
|
||||||
|
moveSel(cm, 1)
|
||||||
|
} else if (type == "skipThree") {
|
||||||
|
moveSel(cm, 3)
|
||||||
|
} else if (type == "surround") {
|
||||||
|
var sels = cm.getSelections();
|
||||||
|
for (var i = 0; i < sels.length; i++)
|
||||||
|
sels[i] = left + sels[i] + right;
|
||||||
|
cm.replaceSelections(sels, "around");
|
||||||
|
sels = cm.listSelections().slice();
|
||||||
|
for (var i = 0; i < sels.length; i++)
|
||||||
|
sels[i] = contractSelection(sels[i]);
|
||||||
|
cm.setSelections(sels);
|
||||||
|
} else if (type == "both") {
|
||||||
|
cm.replaceSelection(left + right, null);
|
||||||
|
cm.triggerElectric(left + right);
|
||||||
|
moveSel(cm, -1)
|
||||||
|
} else if (type == "addFour") {
|
||||||
|
cm.replaceSelection(left + left + left + left, "before");
|
||||||
|
moveSel(cm, 1)
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function charsAround(cm, pos) {
|
||||||
|
var str = cm.getRange(Pos(pos.line, pos.ch - 1),
|
||||||
|
Pos(pos.line, pos.ch + 1));
|
||||||
|
return str.length == 2 ? str : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
function stringStartsAfter(cm, pos) {
|
||||||
|
var token = cm.getTokenAt(Pos(pos.line, pos.ch + 1))
|
||||||
|
return /\bstring/.test(token.type) && token.start == pos.ch &&
|
||||||
|
(pos.ch == 0 || !/\bstring/.test(cm.getTokenTypeAt(pos)))
|
||||||
|
}
|
||||||
|
});
|
185
public/plugins/codemirror/addon/edit/closetag.js
vendored
Normal file
185
public/plugins/codemirror/addon/edit/closetag.js
vendored
Normal file
|
@ -0,0 +1,185 @@
|
||||||
|
// CodeMirror, copyright (c) by Marijn Haverbeke and others
|
||||||
|
// Distributed under an MIT license: https://codemirror.net/LICENSE
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tag-closer extension for CodeMirror.
|
||||||
|
*
|
||||||
|
* This extension adds an "autoCloseTags" option that can be set to
|
||||||
|
* either true to get the default behavior, or an object to further
|
||||||
|
* configure its behavior.
|
||||||
|
*
|
||||||
|
* These are supported options:
|
||||||
|
*
|
||||||
|
* `whenClosing` (default true)
|
||||||
|
* Whether to autoclose when the '/' of a closing tag is typed.
|
||||||
|
* `whenOpening` (default true)
|
||||||
|
* Whether to autoclose the tag when the final '>' of an opening
|
||||||
|
* tag is typed.
|
||||||
|
* `dontCloseTags` (default is empty tags for HTML, none for XML)
|
||||||
|
* An array of tag names that should not be autoclosed.
|
||||||
|
* `indentTags` (default is block tags for HTML, none for XML)
|
||||||
|
* An array of tag names that should, when opened, cause a
|
||||||
|
* blank line to be added inside the tag, and the blank line and
|
||||||
|
* closing line to be indented.
|
||||||
|
* `emptyTags` (default is none)
|
||||||
|
* An array of XML tag names that should be autoclosed with '/>'.
|
||||||
|
*
|
||||||
|
* See demos/closetag.html for a usage example.
|
||||||
|
*/
|
||||||
|
|
||||||
|
(function(mod) {
|
||||||
|
if (typeof exports == "object" && typeof module == "object") // CommonJS
|
||||||
|
mod(require("../../lib/codemirror"), require("../fold/xml-fold"));
|
||||||
|
else if (typeof define == "function" && define.amd) // AMD
|
||||||
|
define(["../../lib/codemirror", "../fold/xml-fold"], mod);
|
||||||
|
else // Plain browser env
|
||||||
|
mod(CodeMirror);
|
||||||
|
})(function(CodeMirror) {
|
||||||
|
CodeMirror.defineOption("autoCloseTags", false, function(cm, val, old) {
|
||||||
|
if (old != CodeMirror.Init && old)
|
||||||
|
cm.removeKeyMap("autoCloseTags");
|
||||||
|
if (!val) return;
|
||||||
|
var map = {name: "autoCloseTags"};
|
||||||
|
if (typeof val != "object" || val.whenClosing !== false)
|
||||||
|
map["'/'"] = function(cm) { return autoCloseSlash(cm); };
|
||||||
|
if (typeof val != "object" || val.whenOpening !== false)
|
||||||
|
map["'>'"] = function(cm) { return autoCloseGT(cm); };
|
||||||
|
cm.addKeyMap(map);
|
||||||
|
});
|
||||||
|
|
||||||
|
var htmlDontClose = ["area", "base", "br", "col", "command", "embed", "hr", "img", "input", "keygen", "link", "meta", "param",
|
||||||
|
"source", "track", "wbr"];
|
||||||
|
var htmlIndent = ["applet", "blockquote", "body", "button", "div", "dl", "fieldset", "form", "frameset", "h1", "h2", "h3", "h4",
|
||||||
|
"h5", "h6", "head", "html", "iframe", "layer", "legend", "object", "ol", "p", "select", "table", "ul"];
|
||||||
|
|
||||||
|
function autoCloseGT(cm) {
|
||||||
|
if (cm.getOption("disableInput")) return CodeMirror.Pass;
|
||||||
|
var ranges = cm.listSelections(), replacements = [];
|
||||||
|
var opt = cm.getOption("autoCloseTags");
|
||||||
|
for (var i = 0; i < ranges.length; i++) {
|
||||||
|
if (!ranges[i].empty()) return CodeMirror.Pass;
|
||||||
|
var pos = ranges[i].head, tok = cm.getTokenAt(pos);
|
||||||
|
var inner = CodeMirror.innerMode(cm.getMode(), tok.state), state = inner.state;
|
||||||
|
var tagInfo = inner.mode.xmlCurrentTag && inner.mode.xmlCurrentTag(state)
|
||||||
|
var tagName = tagInfo && tagInfo.name
|
||||||
|
if (!tagName) return CodeMirror.Pass
|
||||||
|
|
||||||
|
var html = inner.mode.configuration == "html";
|
||||||
|
var dontCloseTags = (typeof opt == "object" && opt.dontCloseTags) || (html && htmlDontClose);
|
||||||
|
var indentTags = (typeof opt == "object" && opt.indentTags) || (html && htmlIndent);
|
||||||
|
|
||||||
|
if (tok.end > pos.ch) tagName = tagName.slice(0, tagName.length - tok.end + pos.ch);
|
||||||
|
var lowerTagName = tagName.toLowerCase();
|
||||||
|
// Don't process the '>' at the end of an end-tag or self-closing tag
|
||||||
|
if (!tagName ||
|
||||||
|
tok.type == "string" && (tok.end != pos.ch || !/[\"\']/.test(tok.string.charAt(tok.string.length - 1)) || tok.string.length == 1) ||
|
||||||
|
tok.type == "tag" && tagInfo.close ||
|
||||||
|
tok.string.indexOf("/") == (pos.ch - tok.start - 1) || // match something like <someTagName />
|
||||||
|
dontCloseTags && indexOf(dontCloseTags, lowerTagName) > -1 ||
|
||||||
|
closingTagExists(cm, inner.mode.xmlCurrentContext && inner.mode.xmlCurrentContext(state) || [], tagName, pos, true))
|
||||||
|
return CodeMirror.Pass;
|
||||||
|
|
||||||
|
var emptyTags = typeof opt == "object" && opt.emptyTags;
|
||||||
|
if (emptyTags && indexOf(emptyTags, tagName) > -1) {
|
||||||
|
replacements[i] = { text: "/>", newPos: CodeMirror.Pos(pos.line, pos.ch + 2) };
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
var indent = indentTags && indexOf(indentTags, lowerTagName) > -1;
|
||||||
|
replacements[i] = {indent: indent,
|
||||||
|
text: ">" + (indent ? "\n\n" : "") + "</" + tagName + ">",
|
||||||
|
newPos: indent ? CodeMirror.Pos(pos.line + 1, 0) : CodeMirror.Pos(pos.line, pos.ch + 1)};
|
||||||
|
}
|
||||||
|
|
||||||
|
var dontIndentOnAutoClose = (typeof opt == "object" && opt.dontIndentOnAutoClose);
|
||||||
|
for (var i = ranges.length - 1; i >= 0; i--) {
|
||||||
|
var info = replacements[i];
|
||||||
|
cm.replaceRange(info.text, ranges[i].head, ranges[i].anchor, "+insert");
|
||||||
|
var sel = cm.listSelections().slice(0);
|
||||||
|
sel[i] = {head: info.newPos, anchor: info.newPos};
|
||||||
|
cm.setSelections(sel);
|
||||||
|
if (!dontIndentOnAutoClose && info.indent) {
|
||||||
|
cm.indentLine(info.newPos.line, null, true);
|
||||||
|
cm.indentLine(info.newPos.line + 1, null, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function autoCloseCurrent(cm, typingSlash) {
|
||||||
|
var ranges = cm.listSelections(), replacements = [];
|
||||||
|
var head = typingSlash ? "/" : "</";
|
||||||
|
var opt = cm.getOption("autoCloseTags");
|
||||||
|
var dontIndentOnAutoClose = (typeof opt == "object" && opt.dontIndentOnSlash);
|
||||||
|
for (var i = 0; i < ranges.length; i++) {
|
||||||
|
if (!ranges[i].empty()) return CodeMirror.Pass;
|
||||||
|
var pos = ranges[i].head, tok = cm.getTokenAt(pos);
|
||||||
|
var inner = CodeMirror.innerMode(cm.getMode(), tok.state), state = inner.state;
|
||||||
|
if (typingSlash && (tok.type == "string" || tok.string.charAt(0) != "<" ||
|
||||||
|
tok.start != pos.ch - 1))
|
||||||
|
return CodeMirror.Pass;
|
||||||
|
// Kludge to get around the fact that we are not in XML mode
|
||||||
|
// when completing in JS/CSS snippet in htmlmixed mode. Does not
|
||||||
|
// work for other XML embedded languages (there is no general
|
||||||
|
// way to go from a mixed mode to its current XML state).
|
||||||
|
var replacement, mixed = inner.mode.name != "xml" && cm.getMode().name == "htmlmixed"
|
||||||
|
if (mixed && inner.mode.name == "javascript") {
|
||||||
|
replacement = head + "script";
|
||||||
|
} else if (mixed && inner.mode.name == "css") {
|
||||||
|
replacement = head + "style";
|
||||||
|
} else {
|
||||||
|
var context = inner.mode.xmlCurrentContext && inner.mode.xmlCurrentContext(state)
|
||||||
|
var top = context.length ? context[context.length - 1] : ""
|
||||||
|
if (!context || (context.length && closingTagExists(cm, context, top, pos)))
|
||||||
|
return CodeMirror.Pass;
|
||||||
|
replacement = head + top
|
||||||
|
}
|
||||||
|
if (cm.getLine(pos.line).charAt(tok.end) != ">") replacement += ">";
|
||||||
|
replacements[i] = replacement;
|
||||||
|
}
|
||||||
|
cm.replaceSelections(replacements);
|
||||||
|
ranges = cm.listSelections();
|
||||||
|
if (!dontIndentOnAutoClose) {
|
||||||
|
for (var i = 0; i < ranges.length; i++)
|
||||||
|
if (i == ranges.length - 1 || ranges[i].head.line < ranges[i + 1].head.line)
|
||||||
|
cm.indentLine(ranges[i].head.line);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function autoCloseSlash(cm) {
|
||||||
|
if (cm.getOption("disableInput")) return CodeMirror.Pass;
|
||||||
|
return autoCloseCurrent(cm, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
CodeMirror.commands.closeTag = function(cm) { return autoCloseCurrent(cm); };
|
||||||
|
|
||||||
|
function indexOf(collection, elt) {
|
||||||
|
if (collection.indexOf) return collection.indexOf(elt);
|
||||||
|
for (var i = 0, e = collection.length; i < e; ++i)
|
||||||
|
if (collection[i] == elt) return i;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If xml-fold is loaded, we use its functionality to try and verify
|
||||||
|
// whether a given tag is actually unclosed.
|
||||||
|
function closingTagExists(cm, context, tagName, pos, newTag) {
|
||||||
|
if (!CodeMirror.scanForClosingTag) return false;
|
||||||
|
var end = Math.min(cm.lastLine() + 1, pos.line + 500);
|
||||||
|
var nextClose = CodeMirror.scanForClosingTag(cm, pos, null, end);
|
||||||
|
if (!nextClose || nextClose.tag != tagName) return false;
|
||||||
|
// If the immediate wrapping context contains onCx instances of
|
||||||
|
// the same tag, a closing tag only exists if there are at least
|
||||||
|
// that many closing tags of that type following.
|
||||||
|
var onCx = newTag ? 1 : 0
|
||||||
|
for (var i = context.length - 1; i >= 0; i--) {
|
||||||
|
if (context[i] == tagName) ++onCx
|
||||||
|
else break
|
||||||
|
}
|
||||||
|
pos = nextClose.to;
|
||||||
|
for (var i = 1; i < onCx; i++) {
|
||||||
|
var next = CodeMirror.scanForClosingTag(cm, pos, null, end);
|
||||||
|
if (!next || next.tag != tagName) return false;
|
||||||
|
pos = next.to;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
});
|
101
public/plugins/codemirror/addon/edit/continuelist.js
vendored
Normal file
101
public/plugins/codemirror/addon/edit/continuelist.js
vendored
Normal file
|
@ -0,0 +1,101 @@
|
||||||
|
// CodeMirror, copyright (c) by Marijn Haverbeke and others
|
||||||
|
// Distributed under an MIT license: https://codemirror.net/LICENSE
|
||||||
|
|
||||||
|
(function(mod) {
|
||||||
|
if (typeof exports == "object" && typeof module == "object") // CommonJS
|
||||||
|
mod(require("../../lib/codemirror"));
|
||||||
|
else if (typeof define == "function" && define.amd) // AMD
|
||||||
|
define(["../../lib/codemirror"], mod);
|
||||||
|
else // Plain browser env
|
||||||
|
mod(CodeMirror);
|
||||||
|
})(function(CodeMirror) {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
var listRE = /^(\s*)(>[> ]*|[*+-] \[[x ]\]\s|[*+-]\s|(\d+)([.)]))(\s*)/,
|
||||||
|
emptyListRE = /^(\s*)(>[> ]*|[*+-] \[[x ]\]|[*+-]|(\d+)[.)])(\s*)$/,
|
||||||
|
unorderedListRE = /[*+-]\s/;
|
||||||
|
|
||||||
|
CodeMirror.commands.newlineAndIndentContinueMarkdownList = function(cm) {
|
||||||
|
if (cm.getOption("disableInput")) return CodeMirror.Pass;
|
||||||
|
var ranges = cm.listSelections(), replacements = [];
|
||||||
|
for (var i = 0; i < ranges.length; i++) {
|
||||||
|
var pos = ranges[i].head;
|
||||||
|
|
||||||
|
// If we're not in Markdown mode, fall back to normal newlineAndIndent
|
||||||
|
var eolState = cm.getStateAfter(pos.line);
|
||||||
|
var inner = CodeMirror.innerMode(cm.getMode(), eolState);
|
||||||
|
if (inner.mode.name !== "markdown") {
|
||||||
|
cm.execCommand("newlineAndIndent");
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
eolState = inner.state;
|
||||||
|
}
|
||||||
|
|
||||||
|
var inList = eolState.list !== false;
|
||||||
|
var inQuote = eolState.quote !== 0;
|
||||||
|
|
||||||
|
var line = cm.getLine(pos.line), match = listRE.exec(line);
|
||||||
|
var cursorBeforeBullet = /^\s*$/.test(line.slice(0, pos.ch));
|
||||||
|
if (!ranges[i].empty() || (!inList && !inQuote) || !match || cursorBeforeBullet) {
|
||||||
|
cm.execCommand("newlineAndIndent");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (emptyListRE.test(line)) {
|
||||||
|
var endOfQuote = inQuote && />\s*$/.test(line)
|
||||||
|
var endOfList = !/>\s*$/.test(line)
|
||||||
|
if (endOfQuote || endOfList) cm.replaceRange("", {
|
||||||
|
line: pos.line, ch: 0
|
||||||
|
}, {
|
||||||
|
line: pos.line, ch: pos.ch + 1
|
||||||
|
});
|
||||||
|
replacements[i] = "\n";
|
||||||
|
} else {
|
||||||
|
var indent = match[1], after = match[5];
|
||||||
|
var numbered = !(unorderedListRE.test(match[2]) || match[2].indexOf(">") >= 0);
|
||||||
|
var bullet = numbered ? (parseInt(match[3], 10) + 1) + match[4] : match[2].replace("x", " ");
|
||||||
|
replacements[i] = "\n" + indent + bullet + after;
|
||||||
|
|
||||||
|
if (numbered) incrementRemainingMarkdownListNumbers(cm, pos);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
cm.replaceSelections(replacements);
|
||||||
|
};
|
||||||
|
|
||||||
|
// Auto-updating Markdown list numbers when a new item is added to the
|
||||||
|
// middle of a list
|
||||||
|
function incrementRemainingMarkdownListNumbers(cm, pos) {
|
||||||
|
var startLine = pos.line, lookAhead = 0, skipCount = 0;
|
||||||
|
var startItem = listRE.exec(cm.getLine(startLine)), startIndent = startItem[1];
|
||||||
|
|
||||||
|
do {
|
||||||
|
lookAhead += 1;
|
||||||
|
var nextLineNumber = startLine + lookAhead;
|
||||||
|
var nextLine = cm.getLine(nextLineNumber), nextItem = listRE.exec(nextLine);
|
||||||
|
|
||||||
|
if (nextItem) {
|
||||||
|
var nextIndent = nextItem[1];
|
||||||
|
var newNumber = (parseInt(startItem[3], 10) + lookAhead - skipCount);
|
||||||
|
var nextNumber = (parseInt(nextItem[3], 10)), itemNumber = nextNumber;
|
||||||
|
|
||||||
|
if (startIndent === nextIndent && !isNaN(nextNumber)) {
|
||||||
|
if (newNumber === nextNumber) itemNumber = nextNumber + 1;
|
||||||
|
if (newNumber > nextNumber) itemNumber = newNumber + 1;
|
||||||
|
cm.replaceRange(
|
||||||
|
nextLine.replace(listRE, nextIndent + itemNumber + nextItem[4] + nextItem[5]),
|
||||||
|
{
|
||||||
|
line: nextLineNumber, ch: 0
|
||||||
|
}, {
|
||||||
|
line: nextLineNumber, ch: nextLine.length
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
if (startIndent.length > nextIndent.length) return;
|
||||||
|
// This doesn't run if the next line immediately indents, as it is
|
||||||
|
// not clear of the users intention (new indented item or same level)
|
||||||
|
if ((startIndent.length < nextIndent.length) && (lookAhead === 1)) return;
|
||||||
|
skipCount += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} while (nextItem);
|
||||||
|
}
|
||||||
|
});
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue