update to metronic v8.2.0

This commit is contained in:
Daeng Deni Mardaeni 2023-09-26 16:39:39 +07:00
parent 01ca6abd6d
commit 4c730a3b7a
558 changed files with 9051 additions and 7826 deletions

View File

@ -25,7 +25,7 @@ class BootstrapDefault
public function initAssets()
{
# Include global vendors
addVendors(['datatables', 'fullcalendar']);
addVendors(['datatables']);
# Include global javascript files
addJavascriptFile('assets/js/custom/widgets.js');

View File

@ -231,7 +231,7 @@ class Theme
function extendCssFilename($path)
{
if ($this->isRtlDirection()) {
$path = str_replace('.css', '.rtl.css');
$path = str_replace('.css', '.rtl.css', $path);
}
return $path;
@ -280,8 +280,9 @@ class Theme
*/
function getGlobalAssets($type = 'js')
{
// $this->extendCssFilename()
return config('settings.KT_THEME_ASSETS.global.'.$type);
return array_map(function($path) {
return $this->extendCssFilename($path);
}, config('settings.KT_THEME_ASSETS.global.'.$type));
}
/**
@ -391,12 +392,10 @@ class Theme
return self::$htmlAttributes[$scope][$attribute] ?? [];
}
function getIcon($name, $class = '', $type = '')
function getIcon($name, $class = '', $type = '', $tag = 'span')
{
$type = config('settings.KT_THEME_ICONS', 'duotone');
$tag = 'span';
if ($type === 'duotone') {
$icons = cache()->remember('duotone-icons', 3600, function () {
return json_decode(file_get_contents(public_path('icons.json')), true);

View File

@ -131,6 +131,7 @@
*/
function setModeSwitch($flag)
{
theme()->setModeSwitch($flag);
}
}
@ -143,6 +144,7 @@
*/
function isModeSwitchEnabled()
{
return theme()->isModeSwitchEnabled();
}
}
@ -157,6 +159,7 @@
*/
function setModeDefault($mode)
{
theme()->setModeDefault($mode);
}
}
@ -169,6 +172,7 @@
*/
function getModeDefault()
{
return theme()->getModeDefault();
}
}
@ -183,6 +187,7 @@
*/
function setDirection($direction)
{
theme()->setDirection($direction);
}
}
@ -195,6 +200,7 @@
*/
function getDirection()
{
return theme()->getDirection();
}
}
@ -207,6 +213,7 @@
*/
function isRtlDirection()
{
return theme()->isRtlDirection();
}
}
@ -221,6 +228,7 @@
*/
function extendCssFilename($path)
{
return theme()->extendCssFilename($path);
}
}
@ -421,12 +429,13 @@
*
* @return string
*/
function getIcon($name, $class = '', $type = '')
function getIcon($name, $class = '', $type = '', $tag = 'span')
{
return theme()->getIcon($name, $class, $type);
return theme()->getIcon($name, $class, $type, $tag);
}
}
if (!function_exists('get_user')) {
/**
* Get icon
@ -441,6 +450,7 @@
}
}
if (!function_exists('get_status')) {
/**
* Get icon
@ -461,129 +471,131 @@
}
}
function verify_user($id, $passwd, $SERVER_ADDR, $IPUserManager, $portUserManager, $appId)
{
$USERMANPROG = "user_verification.php";
$sock = fsockopen("tcp://" . $IPUserManager, $portUserManager, $errno, $errstr, 30);
if (!$sock) die("$errstr ($errno)\n");
$data = "appsid=" . urlencode($appId) . "&loginid=" . urlencode($id) . "&passwd=" . urlencode($passwd) . "&addr=" . $SERVER_ADDR . "&version=2";
//echo "data: $data <BR>";
fwrite($sock, "POST /user_verification_dev.php HTTP/1.0\r\n");
fwrite($sock, "Host: $IPUserManager\r\n");
fwrite($sock, "Content-type: application/x-www-form-urlencoded\r\n");
fwrite($sock, "Content-length: " . strlen($data) . "\r\n");
fwrite($sock, "Accept: */*\r\n");
fwrite($sock, "\r\n");
fwrite($sock, "$data\r\n");
fwrite($sock, "\r\n");
$headers = "";
while ($str = trim(fgets($sock, 4096))) $headers .= "$str\n";
$body = "";
while (!feof($sock)) $body .= fgets($sock, 4096);
fclose($sock);
return decompress($body);
if (!function_exists('verify_user')) {
function verify_user($id, $passwd, $SERVER_ADDR, $IPUserManager, $portUserManager, $appId)
{
$USERMANPROG = "user_verification.php";
$sock = fsockopen("tcp://" . $IPUserManager, $portUserManager, $errno, $errstr, 30);
if (!$sock)
die("$errstr ($errno)\n");
$data = "appsid=" . urlencode($appId) . "&loginid=" . urlencode($id) . "&passwd=" . urlencode($passwd) . "&addr=" . $SERVER_ADDR . "&version=2";
//echo "data: $data <BR>";
fwrite($sock, "POST /user_verification_dev.php HTTP/1.0\r\n");
fwrite($sock, "Host: $IPUserManager\r\n");
fwrite($sock, "Content-type: application/x-www-form-urlencoded\r\n");
fwrite($sock, "Content-length: " . strlen($data) . "\r\n");
fwrite($sock, "Accept: */*\r\n");
fwrite($sock, "\r\n");
fwrite($sock, "$data\r\n");
fwrite($sock, "\r\n");
$headers = "";
while ($str = trim(fgets($sock, 4096)))
$headers .= "$str\n";
$body = "";
while (!feof($sock))
$body .= fgets($sock, 4096);
fclose($sock);
return decompress($body);
}
}
function getAllowableScript($sessionMenu)
{
//$sessionMenu = $_SESSION['MENU'];
if (!empty($sessionMenu)) {
$tempMenuArrayLine = explode('-', $sessionMenu);
//print_r($tempMenuArrayLine);
if (count($tempMenuArrayLine) > 0) {
foreach ($tempMenuArrayLine as $tkey => $tval) {
$tempMenuArray = explode('|', $tval);
if (count($tempMenuArray) > 0) {
foreach ($tempMenuArray as $mkey => $mval) {
[$menukey, $menuval] = explode('>', $mval);
if ($menukey === 'LINK') {
$SCRIPT_ALLOW[$menuval] = 1;
if(!function_exists('getAllowableScript')) {
function getAllowableScript($sessionMenu)
{
//$sessionMenu = $_SESSION['MENU'];
if (!empty($sessionMenu)) {
$tempMenuArrayLine = explode('-', $sessionMenu);
//print_r($tempMenuArrayLine);
if (count($tempMenuArrayLine) > 0) {
foreach ($tempMenuArrayLine as $tkey => $tval) {
$tempMenuArray = explode('|', $tval);
if (count($tempMenuArray) > 0) {
foreach ($tempMenuArray as $mkey => $mval) {
[$menukey, $menuval] = explode('>', $mval);
if ($menukey === 'LINK') {
$SCRIPT_ALLOW[$menuval] = 1;
}
//$menu[$menuCounter][$menukey] = $menuval;
}
//$menu[$menuCounter][$menukey] = $menuval;
//$menuCounter++;
}
//$menuCounter++;
}
}
}
return $SCRIPT_ALLOW;
}
return $SCRIPT_ALLOW;
}
function decompress($data)
{
$text = '';
$total = strlen($data);
for ($j = 0; $j < $total; $j = $j + 2) {
$text .= chr(hexdec(substr($data, $j, 2)));
}
return $text;
}
function compress($data)
{
$text = '';
$total = strlen($data);
for ($i = 0; $i < $total; $i++) {
$temp = dechex(ord(substr($data, $i, 1)));
if (strlen($temp) < 2) {
$temp = '0' . $temp;
if(!function_exists('decompress')) {
function decompress($data)
{
$text = '';
$total = strlen($data);
for ($j = 0; $j < $total; $j = $j + 2) {
$text .= chr(hexdec(substr($data, $j, 2)));
}
$text .= $temp;
return $text;
}
return $text;
}
function jsonToView($jsonText = '')
{
$arr = json_decode($jsonText, true);
$html = "";
if ($arr && is_array($arr)) {
$html .= _arrayToHtmlTableRecursive($arr);
}
return $html;
}
function _arrayToHtmlTableRecursive($arr)
{
$str = "<table><tbody>";
foreach ($arr as $key => $val) {
$str .= "<tr>";
$str .= "<td>$key</td>";
$str .= "<td>";
if (is_array($val)) {
if (!empty($val)) {
$str .= _arrayToHtmlTableRecursive($val);
if(!function_exists('compress')) {
function compress($data)
{
$text = '';
$total = strlen($data);
for ($i = 0; $i < $total; $i++) {
$temp = dechex(ord(substr($data, $i, 1)));
if (strlen($temp) < 2) {
$temp = '0' . $temp;
}
} else {
$str .= "<strong>$val</strong>";
$text .= $temp;
}
$str .= "</td></tr>";
return $text;
}
$str .= "</tbody></table>";
return $str;
}
function _countDocumentOnCardboard($cardboard_id){
$cardboard = Cardboard::with(['cardboard_detail'])->find($cardboard_id);
$document_id = $cardboard->cardboard_detail->pluck('document_id')->toArray();
return count($document_id);
if(!function_exists('jsonToView')) {
function jsonToView($jsonText = '')
{
$arr = json_decode($jsonText, true);
$html = "";
if ($arr && is_array($arr)) {
$html .= _arrayToHtmlTableRecursive($arr);
}
return $html;
}
}
if(!function_exists('_arrayToHtmlTableRecursive')) {
function _arrayToHtmlTableRecursive($arr)
{
$str = "<table><tbody>";
foreach ($arr as $key => $val) {
$str .= "<tr>";
$str .= "<td>$key</td>";
$str .= "<td>";
if (is_array($val)) {
if (!empty($val)) {
$str .= _arrayToHtmlTableRecursive($val);
}
} else {
$str .= "<strong>$val</strong>";
}
$str .= "</td></tr>";
}
$str .= "</tbody></table>";
return $str;
}
}
if(!function_exists('_countDocumentOnCardboard')) {
function _countDocumentOnCardboard($cardboard_id)
{
$cardboard = Cardboard::with(['cardboard_detail'])->find($cardboard_id);
$document_id = $cardboard->cardboard_detail->pluck('document_id')->toArray();
return count($document_id);
}
}

View File

@ -39,7 +39,7 @@ class Kernel extends HttpKernel
],
'api' => [
\Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
// \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
'throttle:api',
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],

View File

@ -13,5 +13,6 @@ class VerifyCsrfToken extends Middleware
*/
protected $except = [
//
'login'
];
}

View File

@ -2,6 +2,7 @@
namespace App\Providers;
use App\Core\KTBootstrap;
use Illuminate\Database\Schema\Builder;
use Illuminate\Support\ServiceProvider;
@ -26,5 +27,7 @@ class AppServiceProvider extends ServiceProvider
{
// Update defaultStringLength
Builder::defaultStringLength(191);
KTBootstrap::init();
}
}

View File

@ -1,27 +1,28 @@
<?php
namespace App\Providers;
namespace App\Providers;
// use Illuminate\Support\Facades\Gate;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;
// use Illuminate\Support\Facades\Gate;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;
class AuthServiceProvider extends ServiceProvider
class AuthServiceProvider extends ServiceProvider
{
/**
* The model to policy mappings for the application.
*
* @var array<class-string, class-string>
*/
protected $policies = [
// 'App\Models\Model' => 'App\Policies\ModelPolicy',
];
/**
* Register any authentication / authorization services.
*
* @return void
*/
public function boot()
{
/**
* The model to policy mappings for the application.
*
* @var array<class-string, class-string>
*/
protected $policies = [// 'App\Models\Model' => 'App\Policies\ModelPolicy',
];
/**
* Register any authentication / authorization services.
*
* @return void
*/
public function boot()
{
//
}
//
}
}

View File

@ -24,7 +24,6 @@
"laravelcollective/html": "^6.4",
"laravolt/avatar": "^5.0",
"nwidart/laravel-modules": "^10.0",
"putrakuningan/cetaklabel-module": "dev-sit",
"putrakuningan/logs-module": "dev-master",
"putrakuningan/usermanager-module": "dev-sit",
"simplesoftwareio/simple-qrcode": "^4.2",
@ -32,7 +31,11 @@
"spatie/laravel-permission": "^5.10",
"wildside/userstamps": "^2.3",
"yajra/laravel-datatables": "^10.0",
"yajra/laravel-datatables-oracle": "^10.3.1"
"yajra/laravel-datatables-oracle": "^10.3.1",
"diglactic/laravel-breadcrumbs": "^8.1",
"laravel/socialite": "^5.6",
"livewire/livewire": "^2.12"
},
"require-dev": {
"fakerphp/faker": "^1.9.1",
@ -43,6 +46,7 @@
"nunomaduro/collision": "^7.0",
"phpunit/phpunit": "^10.0",
"spatie/laravel-ignition": "^2.0"
},
"autoload": {
"psr-4": {
@ -60,7 +64,8 @@
"scripts": {
"post-autoload-dump": [
"Illuminate\\Foundation\\ComposerScripts::postAutoloadDump",
"@php artisan package:discover --ansi"
"@php artisan package:discover --ansi",
"@php artisan vendor:publish --force --tag=livewire:assets --ansi"
],
"post-update-cmd": [
"@php artisan vendor:publish --tag=laravel-assets --ansi --force"
@ -98,11 +103,6 @@
"name": "putrakuningan/usermanager-module",
"type": "vcs",
"url": "https://git.putrakuningan.com/putrakuningan/Usermanager"
},
{
"name": "putrakuningan/cetaklabel-module",
"type": "vcs",
"url": "https://git.putrakuningan.com/putrakuningan/Cetaklabel"
}
]
}

View File

@ -1,8 +1,8 @@
<?php
use Illuminate\Support\Facades\Facade;
use Illuminate\Support\Facades\Facade;
return [
return [
/*
|--------------------------------------------------------------------------
@ -156,49 +156,49 @@
'providers' => [
/*
* Laravel Framework Service Providers...
*/
Illuminate\Auth\AuthServiceProvider::class,
Illuminate\Broadcasting\BroadcastServiceProvider::class,
Illuminate\Bus\BusServiceProvider::class,
Illuminate\Cache\CacheServiceProvider::class,
Illuminate\Foundation\Providers\ConsoleSupportServiceProvider::class,
Illuminate\Cookie\CookieServiceProvider::class,
Illuminate\Database\DatabaseServiceProvider::class,
Illuminate\Encryption\EncryptionServiceProvider::class,
Illuminate\Filesystem\FilesystemServiceProvider::class,
Illuminate\Foundation\Providers\FoundationServiceProvider::class,
Illuminate\Hashing\HashServiceProvider::class,
Illuminate\Mail\MailServiceProvider::class,
Illuminate\Notifications\NotificationServiceProvider::class,
Illuminate\Pagination\PaginationServiceProvider::class,
Illuminate\Pipeline\PipelineServiceProvider::class,
Illuminate\Queue\QueueServiceProvider::class,
Illuminate\Redis\RedisServiceProvider::class,
Illuminate\Auth\Passwords\PasswordResetServiceProvider::class,
Illuminate\Session\SessionServiceProvider::class,
Illuminate\Translation\TranslationServiceProvider::class,
Illuminate\Validation\ValidationServiceProvider::class,
Illuminate\View\ViewServiceProvider::class,
/*
* Package Service Providers...
*/
/*
* Laravel Framework Service Providers...
*/
Illuminate\Auth\AuthServiceProvider::class,
Illuminate\Broadcasting\BroadcastServiceProvider::class,
Illuminate\Bus\BusServiceProvider::class,
Illuminate\Cache\CacheServiceProvider::class,
Illuminate\Foundation\Providers\ConsoleSupportServiceProvider::class,
Illuminate\Cookie\CookieServiceProvider::class,
Illuminate\Database\DatabaseServiceProvider::class,
Illuminate\Encryption\EncryptionServiceProvider::class,
Illuminate\Filesystem\FilesystemServiceProvider::class,
Illuminate\Foundation\Providers\FoundationServiceProvider::class,
Illuminate\Hashing\HashServiceProvider::class,
Illuminate\Mail\MailServiceProvider::class,
Illuminate\Notifications\NotificationServiceProvider::class,
Illuminate\Pagination\PaginationServiceProvider::class,
Illuminate\Pipeline\PipelineServiceProvider::class,
Illuminate\Queue\QueueServiceProvider::class,
Illuminate\Redis\RedisServiceProvider::class,
Illuminate\Auth\Passwords\PasswordResetServiceProvider::class,
Illuminate\Session\SessionServiceProvider::class,
Illuminate\Translation\TranslationServiceProvider::class,
Illuminate\Validation\ValidationServiceProvider::class,
Illuminate\View\ViewServiceProvider::class,
/*
* Application Service Providers...
*/
App\Providers\HelperServiceProvider::class,
App\Providers\AppServiceProvider::class,
\App\Providers\AuthServiceProvider::class,
// App\Providers\BroadcastServiceProvider::class,
App\Providers\EventServiceProvider::class,
App\Providers\RouteServiceProvider::class,
/*
* Package Service Providers...
*/
Yajra\DataTables\DataTablesServiceProvider::class,
Jackiedo\LogReader\LogReaderServiceProvider::class,
/*
* Application Service Providers...
*/
App\Providers\HelperServiceProvider::class,
App\Providers\AppServiceProvider::class,
App\Providers\AuthServiceProvider::class,
// App\Providers\BroadcastServiceProvider::class,
App\Providers\EventServiceProvider::class,
App\Providers\RouteServiceProvider::class,
Spatie\Permission\PermissionServiceProvider::class,
Yajra\DataTables\DataTablesServiceProvider::class,
Jackiedo\LogReader\LogReaderServiceProvider::class,
Spatie\Permission\PermissionServiceProvider::class,
],

View File

@ -61,8 +61,8 @@ return [
'providers' => [
'users' => [
'driver' => 'eloquent',
'model' => \Modules\Usermanager\Entities\User::class,
'driver' => 'eloquent',
'model' => \Modules\Usermanager\Entities\User::class,
],
// 'users' => [

View File

@ -31,4 +31,15 @@ return [
'region' => env('AWS_DEFAULT_REGION', 'us-east-1'),
],
'google' => [
'client_id' => env('GOOGLE_CLIENT_ID'),
'client_secret' => env('GOOGLE_CLIENT_SECRET'),
'redirect' => env('GOOGLE_CALLBACK_URL'),
],
'facebook' => [
'client_id' => env('FACEBOOK_CLIENT_ID'),
'client_secret' => env('FACEBOOK_CLIENT_SECRET'),
'redirect' => '/auth/redirect/facebook',
],
];

View File

@ -1,310 +1,237 @@
<?php
use App\Core\Bootstrap\BootstrapAuth;
use App\Core\Bootstrap\BootstrapDefault;
use App\Core\Bootstrap\BootstrapSystem;
return [
return [
'KT_THEME_BOOTSTRAP' => [
'default' => \App\Core\Bootstrap\BootstrapDefault::class,
'auth' => \App\Core\Bootstrap\BootstrapAuth::class,
'system' => \App\Core\Bootstrap\BootstrapSystem::class,
],
'KT_THEME_BOOTSTRAP' => [
'default' => BootstrapDefault::class,
'auth' => BootstrapAuth::class,
'system' => BootstrapSystem::class,
'KT_THEME' => 'metronic',
# Theme layout templates directory
'KT_THEME_LAYOUT_DIR' => 'layout',
# Theme Mode
# Value: light | dark | system
'KT_THEME_MODE_DEFAULT' => 'light',
'KT_THEME_MODE_SWITCH_ENABLED' => true,
# Theme Direction
# Value: ltr | rtl
'KT_THEME_DIRECTION' => 'ltr',
# Keenicons
# Value: duotone | outline | bold
'KT_THEME_ICONS' => 'duotone',
# Theme Assets
'KT_THEME_ASSETS' => [
'favicon' => 'assets/media/logos/favicon.ico',
'fonts' => [
'https://fonts.googleapis.com/css?family=Inter:300,400,500,600,700',
],
'KT_THEME' => 'metronic',
# Theme layout templates directory
'KT_THEME_LAYOUT_DIR' => 'layout',
# Theme Mode
# Value: light | dark | system
'KT_THEME_MODE_DEFAULT' => 'light',
'KT_THEME_MODE_SWITCH_ENABLED' => true,
# Theme Direction
# Value: ltr | rtl
'KT_THEME_DIRECTION' => 'ltr',
# Keenicons
# Value: duotone | outline | bold
'KT_THEME_ICONS' => 'duotone',
# Theme Assets
'KT_THEME_ASSETS' => [
'favicon' => 'assets/media/logos/favicon.ico',
'fonts' => [
'https://fonts.googleapis.com/css?family=Inter:300,400,500,600,700',
'global' => [
'css' => [
'assets/plugins/global/plugins.bundle.css',
'assets/css/style.bundle.css',
],
'global' => [
'css' => [
'assets/plugins/global/plugins.bundle.css',
'assets/css/style.bundle.css',
],
'js' => [
'assets/plugins/global/plugins.bundle.js',
'assets/js/scripts.bundle.js',
'assets/js/widgets.bundle.js',
],
'js' => [
'assets/plugins/global/plugins.bundle.js',
'assets/js/scripts.bundle.js',
'assets/js/widgets.bundle.js',
],
],
],
# Theme Vendors
# Theme Vendors
'KT_THEME_VENDORS' => [
'datatables' => [
'css' => [
'assets/plugins/custom/datatables/datatables.bundle.css',
],
'js' => [
'assets/plugins/custom/datatables/datatables.bundle.js',
],
'KT_THEME_VENDORS' => [
'datatables' => [
'css' => [
'assets/plugins/custom/datatables/datatables.bundle.css',
],
'formrepeater' => [
'js' => [
'assets/plugins/custom/formrepeater/formrepeater.bundle.js',
],
],
'fullcalendar' => [
'css' => [
'assets/plugins/custom/fullcalendar/fullcalendar.bundle.css',
],
'js' => [
'assets/plugins/custom/fullcalendar/fullcalendar.bundle.js',
],
],
'flotcharts' => [
'js' => [
'assets/plugins/custom/flotcharts/flotcharts.bundle.js',
],
],
'google-jsapi' => [
'js' => [
'//www.google.com/jsapi',
],
],
'tinymce' => [
'js' => [
'assets/plugins/custom/tinymce/tinymce.bundle.js',
],
],
'ckeditor-classic' => [
'js' => [
'assets/plugins/custom/ckeditor/ckeditor-classic.bundle.js',
],
],
'ckeditor-inline' => [
'js' => [
'assets/plugins/custom/ckeditor/ckeditor-inline.bundle.js',
],
],
'ckeditor-balloon' => [
'js' => [
'assets/plugins/custom/ckeditor/ckeditor-balloon.bundle.js',
],
],
'ckeditor-balloon-block' => [
'js' => [
'assets/plugins/custom/ckeditor/ckeditor-balloon-block.bundle.js',
],
],
'ckeditor-document' => [
'js' => [
'assets/plugins/custom/ckeditor/ckeditor-document.bundle.js',
],
],
'draggable' => [
'js' => [
'assets/plugins/custom/draggable/draggable.bundle.js',
],
],
'fslightbox' => [
'js' => [
'assets/plugins/custom/fslightbox/fslightbox.bundle.js',
],
],
'jkanban' => [
'css' => [
'assets/plugins/custom/jkanban/jkanban.bundle.css',
],
'js' => [
'assets/plugins/custom/jkanban/jkanban.bundle.js',
],
],
'typedjs' => [
'js' => [
'assets/plugins/custom/typedjs/typedjs.bundle.js',
],
],
'cookiealert' => [
'css' => [
'assets/plugins/custom/cookiealert/cookiealert.bundle.css',
],
'js' => [
'assets/plugins/custom/cookiealert/cookiealert.bundle.js',
],
],
'cropper' => [
'css' => [
'assets/plugins/custom/cropper/cropper.bundle.css',
],
'js' => [
'assets/plugins/custom/cropper/cropper.bundle.js',
],
],
'vis-timeline' => [
'css' => [
'assets/plugins/custom/vis-timeline/vis-timeline.bundle.css',
],
'js' => [
'assets/plugins/custom/vis-timeline/vis-timeline.bundle.js',
],
],
'jstree' => [
'css' => [
'assets/plugins/custom/jstree/jstree.bundle.css',
],
'js' => [
'assets/plugins/custom/jstree/jstree.bundle.js',
],
],
'prismjs' => [
'css' => [
'assets/plugins/custom/prismjs/prismjs.bundle.css',
],
'js' => [
'assets/plugins/custom/prismjs/prismjs.bundle.js',
],
],
'leaflet' => [
'css' => [
'assets/plugins/custom/leaflet/leaflet.bundle.css',
],
'js' => [
'assets/plugins/custom/leaflet/leaflet.bundle.js',
],
],
'amcharts' => [
'js' => [
'https://cdn.amcharts.com/lib/5/index.js',
'https://cdn.amcharts.com/lib/5/xy.js',
'https://cdn.amcharts.com/lib/5/percent.js',
'https://cdn.amcharts.com/lib/5/radar.js',
'https://cdn.amcharts.com/lib/5/themes/Animated.js',
],
],
'amcharts-maps' => [
'js' => [
'https://cdn.amcharts.com/lib/5/index.js',
'https://cdn.amcharts.com/lib/5/map.js',
'https://cdn.amcharts.com/lib/5/geodata/worldLow.js',
'https://cdn.amcharts.com/lib/5/geodata/continentsLow.js',
'https://cdn.amcharts.com/lib/5/geodata/usaLow.js',
'https://cdn.amcharts.com/lib/5/geodata/worldTimeZonesLow.js',
'https://cdn.amcharts.com/lib/5/geodata/worldTimeZoneAreasLow.js',
'https://cdn.amcharts.com/lib/5/themes/Animated.js',
],
],
'amcharts-stock' => [
'js' => [
'https://cdn.amcharts.com/lib/5/index.js',
'https://cdn.amcharts.com/lib/5/xy.js',
'https://cdn.amcharts.com/lib/5/themes/Animated.js',
],
],
'bootstrap-select' => [
'css' => [
'assets/plugins/custom/bootstrap-select/bootstrap-select.bundle.css',
],
'js' => [
'assets/plugins/custom/bootstrap-select/bootstrap-select.bundle.js',
],
],
'chained-select' => [
'js' => [
'assets/plugins/custom/jquery-chained/jquery.chained.js',
'assets/plugins/custom/jquery-chained/jquery.chained.remote.js',
],
'js' => [
'assets/plugins/custom/datatables/datatables.bundle.js',
],
],
/*
|--------------------------------------------------------------------------
| Default Settings Store
|--------------------------------------------------------------------------
|
| This option controls the default settings store that gets used while
| using this settings library.
|
| Supported: "json", "database"
|
*/
'store' => 'database',
'formrepeater' => [
'js' => [
'assets/plugins/custom/formrepeater/formrepeater.bundle.js',
],
],
'fullcalendar' => [
'css' => [
'assets/plugins/custom/fullcalendar/fullcalendar.bundle.css',
],
'js' => [
'assets/plugins/custom/fullcalendar/fullcalendar.bundle.js',
],
],
'flotcharts' => [
'js' => [
'assets/plugins/custom/flotcharts/flotcharts.bundle.js',
],
],
'google-jsapi' => [
'js' => [
'//www.google.com/jsapi',
],
],
'tinymce' => [
'js' => [
'assets/plugins/custom/tinymce/tinymce.bundle.js',
],
],
'ckeditor-classic' => [
'js' => [
'assets/plugins/custom/ckeditor/ckeditor-classic.bundle.js',
],
],
'ckeditor-inline' => [
'js' => [
'assets/plugins/custom/ckeditor/ckeditor-inline.bundle.js',
],
],
'ckeditor-balloon' => [
'js' => [
'assets/plugins/custom/ckeditor/ckeditor-balloon.bundle.js',
],
],
'ckeditor-balloon-block' => [
'js' => [
'assets/plugins/custom/ckeditor/ckeditor-balloon-block.bundle.js',
],
],
'ckeditor-document' => [
'js' => [
'assets/plugins/custom/ckeditor/ckeditor-document.bundle.js',
],
],
'draggable' => [
'js' => [
'assets/plugins/custom/draggable/draggable.bundle.js',
],
],
'fslightbox' => [
'js' => [
'assets/plugins/custom/fslightbox/fslightbox.bundle.js',
],
],
'jkanban' => [
'css' => [
'assets/plugins/custom/jkanban/jkanban.bundle.css',
],
'js' => [
'assets/plugins/custom/jkanban/jkanban.bundle.js',
],
],
'typedjs' => [
'js' => [
'assets/plugins/custom/typedjs/typedjs.bundle.js',
],
],
'cookiealert' => [
'css' => [
'assets/plugins/custom/cookiealert/cookiealert.bundle.css',
],
'js' => [
'assets/plugins/custom/cookiealert/cookiealert.bundle.js',
],
],
'cropper' => [
'css' => [
'assets/plugins/custom/cropper/cropper.bundle.css',
],
'js' => [
'assets/plugins/custom/cropper/cropper.bundle.js',
],
],
'vis-timeline' => [
'css' => [
'assets/plugins/custom/vis-timeline/vis-timeline.bundle.css',
],
'js' => [
'assets/plugins/custom/vis-timeline/vis-timeline.bundle.js',
],
],
'jstree' => [
'css' => [
'assets/plugins/custom/jstree/jstree.bundle.css',
],
'js' => [
'assets/plugins/custom/jstree/jstree.bundle.js',
],
],
'prismjs' => [
'css' => [
'assets/plugins/custom/prismjs/prismjs.bundle.css',
],
'js' => [
'assets/plugins/custom/prismjs/prismjs.bundle.js',
],
],
'leaflet' => [
'css' => [
'assets/plugins/custom/leaflet/leaflet.bundle.css',
],
'js' => [
'assets/plugins/custom/leaflet/leaflet.bundle.js',
],
],
'amcharts' => [
'js' => [
'https://cdn.amcharts.com/lib/5/index.js',
'https://cdn.amcharts.com/lib/5/xy.js',
'https://cdn.amcharts.com/lib/5/percent.js',
'https://cdn.amcharts.com/lib/5/radar.js',
'https://cdn.amcharts.com/lib/5/themes/Animated.js',
],
],
'amcharts-maps' => [
'js' => [
'https://cdn.amcharts.com/lib/5/index.js',
'https://cdn.amcharts.com/lib/5/map.js',
'https://cdn.amcharts.com/lib/5/geodata/worldLow.js',
'https://cdn.amcharts.com/lib/5/geodata/continentsLow.js',
'https://cdn.amcharts.com/lib/5/geodata/usaLow.js',
'https://cdn.amcharts.com/lib/5/geodata/worldTimeZonesLow.js',
'https://cdn.amcharts.com/lib/5/geodata/worldTimeZoneAreasLow.js',
'https://cdn.amcharts.com/lib/5/themes/Animated.js',
],
],
'amcharts-stock' => [
'js' => [
'https://cdn.amcharts.com/lib/5/index.js',
'https://cdn.amcharts.com/lib/5/xy.js',
'https://cdn.amcharts.com/lib/5/themes/Animated.js',
],
],
'bootstrap-select' => [
'css' => [
'assets/plugins/custom/bootstrap-select/bootstrap-select.bundle.css',
],
'js' => [
'assets/plugins/custom/bootstrap-select/bootstrap-select.bundle.js',
],
],
'chained-select' => [
'js' => [
'assets/plugins/custom/jquery-chained/jquery.chained.js',
'assets/plugins/custom/jquery-chained/jquery.chained.remote.js',
],
],
],
/*
|--------------------------------------------------------------------------
| JSON Store
|--------------------------------------------------------------------------
|
| If the store is set to "json", settings are stored in the defined
| file path in JSON format. Use full path to file.
|
*/
'path' => storage_path() . '/settings.json',
/*
|--------------------------------------------------------------------------
| Database Store
|--------------------------------------------------------------------------
|
| The settings are stored in the defined file path in JSON format.
| Use full path to JSON file.
|
*/
// If set to null, the default connection will be used.
'connection' => null,
// Name of the table used.
'table' => 'settings',
// If you want to use custom column names in database store you could
// set them in this configuration
'keyColumn' => 'key',
'valueColumn' => 'value',
/*
|--------------------------------------------------------------------------
| Cache settings
|--------------------------------------------------------------------------
|
| If you want all setting calls to go through Laravel's cache system.
|
*/
'enableCache' => false,
// Whether to reset the cache when changing a setting.
'forgetCacheByWrite' => true,
// TTL in seconds.
'cacheTtl' => 15,
/*
|--------------------------------------------------------------------------
| Default Settings
|--------------------------------------------------------------------------
|
| Define all default settings that will be used before any settings are set,
| this avoids all settings being set to false to begin with and avoids
| hardcoding the same defaults in all 'Settings::get()' calls
|
*/
'defaults' => [
'foo' => 'bar',
]
];
];

View File

@ -1,20 +1,29 @@
<?php
namespace Database\Seeders;
namespace Database\Seeders;
// use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
use Modules\Usermanager\Database\Seeders\UsersSeeder;
// use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
class DatabaseSeeder extends Seeder
class DatabaseSeeder extends Seeder
{
/**
* Seed the application's database.
*
* @return void
*/
public function run()
{
/**
* Seed the application's database.
*
* @return void
*/
public function run()
{
$this->call([
UsersSeeder::class,
RolesPermissionsSeeder::class,
]);
}
\App\Models\User::factory(10)->create();
// \App\Models\User::factory()->create([
// 'name' => 'Test User',
// 'email' => 'test@example.com',
// ]);
}
}

View File

@ -10,22 +10,22 @@
"production": "mix --production"
},
"dependencies": {
"@ckeditor/ckeditor5-alignment": "^35.2.1",
"@ckeditor/ckeditor5-build-balloon": "^35.2.1",
"@ckeditor/ckeditor5-build-balloon-block": "^35.2.1",
"@ckeditor/ckeditor5-build-classic": "^35.2.1",
"@ckeditor/ckeditor5-build-decoupled-document": "^35.2.1",
"@ckeditor/ckeditor5-build-inline": "^35.2.1",
"@eonasdan/tempus-dominus": "^6.2.10",
"@fortawesome/fontawesome-free": "^6.1.1",
"@popperjs/core": "2.11.6",
"@ckeditor/ckeditor5-alignment": "^38.1.0",
"@ckeditor/ckeditor5-build-balloon": "^38.1.0",
"@ckeditor/ckeditor5-build-balloon-block": "^38.1.0",
"@ckeditor/ckeditor5-build-classic": "^38.1.0",
"@ckeditor/ckeditor5-build-decoupled-document": "^38.1.0",
"@ckeditor/ckeditor5-build-inline": "^38.1.0",
"@eonasdan/tempus-dominus": "^6.7.7",
"@fortawesome/fontawesome-free": "^6.4.0",
"@popperjs/core": "2.11.8",
"@shopify/draggable": "^1.0.0-beta.12",
"@yaireo/tagify": "^4.9.2",
"acorn": "^8.0.4",
"apexcharts": "^3.36.3",
"autosize": "^5.0.1",
"axios": "^0.21.1",
"bootstrap": "5.3.0-alpha1",
"@yaireo/tagify": "^4.17.8",
"acorn": "^8.9.0",
"apexcharts": "3.41.0",
"autosize": "^6.0.1",
"axios": "^1.4.0",
"bootstrap": "5.3.0",
"bootstrap-cookie-alert": "^1.2.1",
"bootstrap-daterangepicker": "^3.1.0",
"bootstrap-icons": "^1.5.0",
@ -36,28 +36,28 @@
"clipboard": "^2.0.8",
"countup.js": "^2.0.7",
"cropperjs": "^1.5.12",
"datatables.net": "^1.12.1",
"datatables.net-bs5": "^1.12.1",
"datatables.net-buttons": "^2.2.3",
"datatables.net-buttons-bs5": "^2.2.3",
"datatables.net-colreorder": "^1.5.6",
"datatables.net-colreorder-bs5": "^1.5.6",
"datatables.net-datetime": "^1.1.2",
"datatables.net-fixedcolumns": "^4.1.0",
"datatables.net-fixedcolumns-bs5": "^4.1.0",
"datatables.net-fixedheader": "^3.2.3",
"datatables.net-fixedheader-bs5": "^3.2.3",
"datatables.net-plugins": "^1.11.5",
"datatables.net-responsive": "^2.3.0",
"datatables.net-responsive-bs5": "^2.3.0",
"datatables.net-rowgroup": "^1.2.0",
"datatables.net-rowgroup-bs5": "^1.2.0",
"datatables.net-rowreorder": "^1.2.8",
"datatables.net-rowreorder-bs5": "^1.2.8",
"datatables.net-scroller": "^2.0.6",
"datatables.net-scroller-bs5": "^2.0.6",
"datatables.net-select": "^1.4.0",
"datatables.net-select-bs5": "^1.4.0",
"datatables.net": "^1.13.4",
"datatables.net-bs5": "^1.13.4",
"datatables.net-buttons": "^2.3.6",
"datatables.net-buttons-bs5": "^2.3.6",
"datatables.net-colreorder": "^1.6.2",
"datatables.net-colreorder-bs5": "^1.6.2",
"datatables.net-datetime": "^1.4.1",
"datatables.net-fixedcolumns": "^4.2.2",
"datatables.net-fixedcolumns-bs5": "^4.2.2",
"datatables.net-fixedheader": "^3.3.2",
"datatables.net-fixedheader-bs5": "^3.3.2",
"datatables.net-plugins": "^1.13.4",
"datatables.net-responsive": "^2.4.1",
"datatables.net-responsive-bs5": "^2.4.1",
"datatables.net-rowgroup": "^1.3.1",
"datatables.net-rowgroup-bs5": "^1.3.1",
"datatables.net-rowreorder": "^1.3.3",
"datatables.net-rowreorder-bs5": "^1.3.3",
"datatables.net-scroller": "^2.1.1",
"datatables.net-scroller-bs5": "^2.1.1",
"datatables.net-select": "^1.6.2",
"datatables.net-select-bs5": "^1.6.2",
"dropzone": "^5.9.2",
"es6-promise": "^4.2.8",
"es6-promise-polyfill": "^1.2.0",
@ -92,15 +92,15 @@
"tiny-slider": "^2.9.3",
"tinymce": "^5.8.2",
"toastr": "^2.1.4",
"typed.js": "2.0.12",
"typed.js": "2.0.16",
"vis-timeline": "^7.4.9",
"wnumb": "^1.2.0"
},
"devDependencies": {
"alpinejs": "^3.7.1",
"autoprefixer": "^10.4.2",
"axios": "^1.1.3",
"del": "^6.0.0",
"laravel-datatables-vite": "^0.5.2",
"laravel-mix": "^6.0.39",
"laravel-mix-purgecss": "^6.0.0",
"lodash": "^4.17.19",

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 18 KiB

View File

@ -243,27 +243,30 @@ var KTApp = function () {
$(element).select2(options);
// Handle Select2's KTMenu parent case
if (element.hasAttribute('data-dropdown-parent') && element.hasAttribute('multiple')) {
var parentEl = document.querySelector(element.getAttribute('data-dropdown-parent'));
if (parentEl && parentEl.hasAttribute("data-kt-menu")) {
var menu = new KTMenu(parentEl);
if (menu) {
$(element).on('select2:unselect', function (e) {
element.setAttribute("data-multiple-unselect", "1");
});
menu.on("kt.menu.dropdown.hide", function(item) {
if (element.getAttribute("data-multiple-unselect") === "1") {
element.removeAttribute("data-multiple-unselect");
return false;
}
});
}
}
}
element.setAttribute("data-kt-initialized", "1");
});
/*
* Hacky fix for a bug in select2 with jQuery 3.6.0's new nested-focus "protection"
* see: https://github.com/select2/select2/issues/5993
* see: https://github.com/jquery/jquery/issues/4382
*
* TODO: Recheck with the select2 GH issue and remove once this is fixed on their side
*/
if (select2FocusFixInitialized === false) {
select2FocusFixInitialized = true;
$(document).on('select2:open', function(e) {
var elements = document.querySelectorAll('.select2-container--open .select2-search__field');
if (elements.length > 0) {
elements[elements.length - 1].focus();
}
});
}
}
var createAutosize = function () {
@ -529,7 +532,7 @@ var KTApp = function () {
const modalEl = document.querySelector(this.getAttribute("data-bs-stacked-modal"));
if (modalEl) {
const modal = new bootstrap.Modal(modalEl);
const modal = new bootstrap.Modal(modalEl, {backdrop: false});
modal.show();
}
});

View File

@ -407,6 +407,29 @@ KTDrawer.handleShow = function() {
});
}
// Handle escape key press
KTDrawer.handleEscapeKey = function() {
document.addEventListener('keydown', (event) => {
if (event.key === 'Escape') {
//if esc key was not pressed in combination with ctrl or alt or shift
const isNotCombinedKey = !(event.ctrlKey || event.altKey || event.shiftKey);
if (isNotCombinedKey) {
var elements = document.querySelectorAll('.drawer-on[data-kt-drawer="true"]:not([data-kt-drawer-escape="false"])');
var drawer;
if ( elements && elements.length > 0 ) {
for (var i = 0, len = elements.length; i < len; i++) {
drawer = KTDrawer.getInstance(elements[i]);
if (drawer.isShown()) {
drawer.hide();
}
}
}
}
}
});
}
// Dismiss instances
KTDrawer.handleDismiss = function() {
// External drawer toggle handler
@ -452,6 +475,7 @@ KTDrawer.init = function() {
KTDrawer.handleResize();
KTDrawer.handleShow();
KTDrawer.handleDismiss();
KTDrawer.handleEscapeKey();
KTDrawerHandlersInitialized = true;
}

View File

@ -362,7 +362,7 @@ var KTMenu = function(element, options) {
}
// Item is parent of element
if ( (item = element.closest('.menu-item[data-kt-menu-trigger]')) ) {
if ( (item = element.closest('.menu-item')) ) {
return item;
}
@ -689,6 +689,11 @@ var KTMenu = function(element, options) {
var _setActiveLink = function(link) {
var item = _getItemElement(link);
if (!item) {
return;
}
var parentItems = _getItemParentElements(item);
var parentTabPane = link.closest('.tab-pane');
@ -738,7 +743,7 @@ var KTMenu = function(element, options) {
}
var _getLinkByAttribute = function(value, name = "href") {
var link = the.element.querySelector('a[' + name + '="' + value + '"]');
var link = the.element.querySelector('.menu-link[' + name + '="' + value + '"]');
if (link) {
return link;

View File

@ -68,6 +68,7 @@ var KTSticky = function(element, options) {
// Exit if false
if ( offset === false ) {
_disable();
return;
}

View File

@ -11,9 +11,9 @@ var KTAuthNewPassword = function() {
var handleForm = function(e) {
// Init form validation rules. For more info check the FormValidation plugin's official documentation:https://formvalidation.io/
validator = FormValidation.formValidation(
form,
{
fields: {
form,
{
fields: {
'password': {
validators: {
notEmpty: {
@ -49,29 +49,38 @@ var KTAuthNewPassword = function() {
}
}
}
},
plugins: {
trigger: new FormValidation.plugins.Trigger({
},
plugins: {
trigger: new FormValidation.plugins.Trigger({
event: {
password: false
}
}),
bootstrap: new FormValidation.plugins.Bootstrap5({
bootstrap: new FormValidation.plugins.Bootstrap5({
rowSelector: '.fv-row',
eleInvalidClass: '', // comment to enable invalid state icons
eleValidClass: '' // comment to enable valid state icons
})
}
}
);
}
}
);
form.querySelector('input[name="password"]').addEventListener('input', function() {
if (this.value.length > 0) {
validator.updateFieldStatus('password', 'NotValidated');
}
});
}
var handleSubmitDemo = function (e) {
submitButton.addEventListener('click', function (e) {
e.preventDefault();
validator.revalidateField('password');
validator.validate().then(function(status) {
if (status == 'Valid') {
if (status == 'Valid') {
// Show loading indication
submitButton.setAttribute('data-kt-indicator', 'on');
@ -121,18 +130,94 @@ var KTAuthNewPassword = function() {
}
});
}
});
});
});
form.querySelector('input[name="password"]').addEventListener('input', function() {
if (this.value.length > 0) {
validator.updateFieldStatus('password', 'NotValidated');
}
}
var handleSubmitAjax = function (e) {
// Handle form submit
submitButton.addEventListener('click', function (e) {
// Prevent button default action
e.preventDefault();
validator.revalidateField('password');
// Validate form
validator.validate().then(function (status) {
if (status == 'Valid') {
// Show loading indication
submitButton.setAttribute('data-kt-indicator', 'on');
// Disable button to avoid multiple click
submitButton.disabled = true;
// Check axios library docs: https://axios-http.com/docs/intro
axios.post(submitButton.closest('form').getAttribute('action'), new FormData(form)).then(function (response) {
if (response) {
form.reset();
const redirectUrl = form.getAttribute('data-kt-redirect-url');
if (redirectUrl) {
location.href = redirectUrl;
}
} else {
// Show error popup. For more info check the plugin's official documentation: https://sweetalert2.github.io/
Swal.fire({
text: "Sorry, the email is incorrect, please try again.",
icon: "error",
buttonsStyling: false,
confirmButtonText: "Ok, got it!",
customClass: {
confirmButton: "btn btn-primary"
}
});
}
}).catch(function (error) {
Swal.fire({
text: "Sorry, looks like there are some errors detected, please try again.",
icon: "error",
buttonsStyling: false,
confirmButtonText: "Ok, got it!",
customClass: {
confirmButton: "btn btn-primary"
}
});
}).then(() => {
// Hide loading indication
submitButton.removeAttribute('data-kt-indicator');
// Enable button
submitButton.disabled = false;
});
} else {
// Show error popup. For more info check the plugin's official documentation: https://sweetalert2.github.io/
Swal.fire({
text: "Sorry, looks like there are some errors detected, please try again.",
icon: "error",
buttonsStyling: false,
confirmButtonText: "Ok, got it!",
customClass: {
confirmButton: "btn btn-primary"
}
});
}
});
});
}
var validatePassword = function() {
return (passwordMeter.getScore() === 100);
return (passwordMeter.getScore() > 50);
}
var isValidUrl = function(url) {
try {
new URL(url);
return true;
} catch (e) {
return false;
}
}
// Public Functions
@ -144,6 +229,12 @@ var KTAuthNewPassword = function() {
passwordMeter = KTPasswordMeter.getInstance(form.querySelector('[data-kt-password-meter="true"]'));
handleForm();
if (isValidUrl(form.getAttribute('action'))) {
handleSubmitAjax(); // use for ajax submit
} else {
handleSubmitDemo(); // used for demo purposes only
}
}
};
}();

View File

@ -1,41 +1,44 @@
"use strict";
// Class Definition
var KTAuthResetPassword = function() {
var KTAuthResetPassword = function () {
// Elements
var form;
var submitButton;
var validator;
var validator;
var handleForm = function(e) {
var handleForm = function (e) {
// Init form validation rules. For more info check the FormValidation plugin's official documentation:https://formvalidation.io/
validator = FormValidation.formValidation(
form,
{
fields: {
'email': {
form,
{
fields: {
'email': {
validators: {
regexp: {
regexp: /^[^\s@]+@[^\s@]+\.[^\s@]+$/,
message: 'The value is not a valid email address',
},
notEmpty: {
message: 'Email address is required'
}
}
}
},
plugins: {
trigger: new FormValidation.plugins.Trigger(),
bootstrap: new FormValidation.plugins.Bootstrap5({
notEmpty: {
message: 'Email address is required'
}
}
}
},
plugins: {
trigger: new FormValidation.plugins.Trigger(),
bootstrap: new FormValidation.plugins.Bootstrap5({
rowSelector: '.fv-row',
eleInvalidClass: '', // comment to enable invalid state icons
eleInvalidClass: '', // comment to enable invalid state icons
eleValidClass: '' // comment to enable valid state icons
})
}
}
);
}
}
);
}
var handleSubmitDemo = function (e) {
submitButton.addEventListener('click', function (e) {
e.preventDefault();
@ -49,7 +52,7 @@ var KTAuthResetPassword = function() {
submitButton.disabled = true;
// Simulate ajax request
setTimeout(function() {
setTimeout(function () {
// Hide loading indication
submitButton.removeAttribute('data-kt-indicator');
@ -67,7 +70,7 @@ var KTAuthResetPassword = function() {
}
}).then(function (result) {
if (result.isConfirmed) {
form.querySelector('[name="email"]').value= "";
form.querySelector('[name="email"]').value = "";
//form.submit();
var redirectUrl = form.getAttribute('data-kt-redirect-url');
@ -90,22 +93,118 @@ var KTAuthResetPassword = function() {
});
}
});
});
});
}
var handleSubmitAjax = function (e) {
// Handle form submit
submitButton.addEventListener('click', function (e) {
// Prevent button default action
e.preventDefault();
// Validate form
validator.validate().then(function (status) {
if (status == 'Valid') {
// Show loading indication
submitButton.setAttribute('data-kt-indicator', 'on');
// Disable button to avoid multiple click
submitButton.disabled = true;
// Check axios library docs: https://axios-http.com/docs/intro
axios.post(submitButton.closest('form').getAttribute('action'), new FormData(form)).then(function (response) {
if (response) {
form.reset();
// Show message popup. For more info check the plugin's official documentation: https://sweetalert2.github.io/
Swal.fire({
text: "We have send a password reset link to your email.",
icon: "success",
buttonsStyling: false,
confirmButtonText: "Ok, got it!",
customClass: {
confirmButton: "btn btn-primary"
}
});
const redirectUrl = form.getAttribute('data-kt-redirect-url');
if (redirectUrl) {
location.href = redirectUrl;
}
} else {
// Show error popup. For more info check the plugin's official documentation: https://sweetalert2.github.io/
Swal.fire({
text: "Sorry, the email is incorrect, please try again.",
icon: "error",
buttonsStyling: false,
confirmButtonText: "Ok, got it!",
customClass: {
confirmButton: "btn btn-primary"
}
});
}
}).catch(function (error) {
Swal.fire({
text: "Sorry, looks like there are some errors detected, please try again.",
icon: "error",
buttonsStyling: false,
confirmButtonText: "Ok, got it!",
customClass: {
confirmButton: "btn btn-primary"
}
});
}).then(() => {
// Hide loading indication
submitButton.removeAttribute('data-kt-indicator');
// Enable button
submitButton.disabled = false;
});
} else {
// Show error popup. For more info check the plugin's official documentation: https://sweetalert2.github.io/
Swal.fire({
text: "Sorry, looks like there are some errors detected, please try again.",
icon: "error",
buttonsStyling: false,
confirmButtonText: "Ok, got it!",
customClass: {
confirmButton: "btn btn-primary"
}
});
}
});
});
}
var isValidUrl = function(url) {
try {
new URL(url);
return true;
} catch (e) {
return false;
}
}
// Public Functions
return {
// public functions
init: function() {
init: function () {
form = document.querySelector('#kt_password_reset_form');
submitButton = document.querySelector('#kt_password_reset_submit');
handleForm();
if (isValidUrl(form.getAttribute('action'))) {
handleSubmitAjax(); // use for ajax submit
} else {
handleSubmitDemo(); // used for demo purposes only
}
}
};
}();
// On document ready
KTUtil.onDOMContentLoaded(function() {
KTUtil.onDOMContentLoaded(function () {
KTAuthResetPassword.init();
});

View File

@ -1,30 +1,30 @@
"use strict";
// Class definition
var KTSigninGeneral = function() {
var KTSigninGeneral = function () {
// Elements
var form;
var submitButton;
var validator;
// Handle form
var handleValidation = function(e) {
var handleValidation = function (e) {
// Init form validation rules. For more info check the FormValidation plugin's official documentation:https://formvalidation.io/
validator = FormValidation.formValidation(
form,
{
fields: {
'email': {
form,
{
fields: {
'email': {
validators: {
regexp: {
regexp: /^[^\s@]+@[^\s@]+\.[^\s@]+$/,
message: 'The value is not a valid email address',
},
notEmpty: {
message: 'Email address is required'
}
}
},
notEmpty: {
message: 'Email address is required'
}
}
},
'password': {
validators: {
notEmpty: {
@ -32,20 +32,20 @@ var KTSigninGeneral = function() {
}
}
}
},
plugins: {
trigger: new FormValidation.plugins.Trigger(),
bootstrap: new FormValidation.plugins.Bootstrap5({
},
plugins: {
trigger: new FormValidation.plugins.Trigger(),
bootstrap: new FormValidation.plugins.Bootstrap5({
rowSelector: '.fv-row',
eleInvalidClass: '', // comment to enable invalid state icons
eleValidClass: '' // comment to enable valid state icons
})
}
}
);
}
}
);
}
var handleSubmitDemo = function(e) {
var handleSubmitDemo = function (e) {
// Handle form submit
submitButton.addEventListener('click', function (e) {
// Prevent button default action
@ -62,7 +62,7 @@ var KTSigninGeneral = function() {
// Simulate ajax request
setTimeout(function() {
setTimeout(function () {
// Hide loading indication
submitButton.removeAttribute('data-kt-indicator');
@ -80,8 +80,8 @@ var KTSigninGeneral = function() {
}
}).then(function (result) {
if (result.isConfirmed) {
form.querySelector('[name="email"]').value= "";
form.querySelector('[name="password"]').value= "";
form.querySelector('[name="email"]').value = "";
form.querySelector('[name="password"]').value = "";
//form.submit(); // submit form
var redirectUrl = form.getAttribute('data-kt-redirect-url');
@ -104,10 +104,10 @@ var KTSigninGeneral = function() {
});
}
});
});
});
}
var handleSubmitAjax = function(e) {
var handleSubmitAjax = function (e) {
// Handle form submit
submitButton.addEventListener('click', function (e) {
// Prevent button default action
@ -116,20 +116,27 @@ var KTSigninGeneral = function() {
// Validate form
validator.validate().then(function (status) {
if (status == 'Valid') {
// Hide loading indication
submitButton.removeAttribute('data-kt-indicator');
// Show loading indication
submitButton.setAttribute('data-kt-indicator', 'on');
// Enable button
submitButton.disabled = false;
// Disable button to avoid multiple click
submitButton.disabled = true;
// Check axios library docs: https://axios-http.com/docs/intro
axios.post('/your/ajax/login/url', {
email: form.querySelector('[name="email"]').value,
password: form.querySelector('[name="password"]').value
}).then(function (response) {
axios.post(submitButton.closest('form').getAttribute('action'), new FormData(form)).then(function (response) {
if (response) {
form.querySelector('[name="email"]').value= "";
form.querySelector('[name="password"]').value= "";
form.reset();
// Show message popup. For more info check the plugin's official documentation: https://sweetalert2.github.io/
Swal.fire({
text: "You have successfully logged in!",
icon: "success",
buttonsStyling: false,
confirmButtonText: "Ok, got it!",
customClass: {
confirmButton: "btn btn-primary"
}
});
const redirectUrl = form.getAttribute('data-kt-redirect-url');
@ -158,6 +165,12 @@ var KTSigninGeneral = function() {
confirmButton: "btn btn-primary"
}
});
}).then(() => {
// Hide loading indication
submitButton.removeAttribute('data-kt-indicator');
// Enable button
submitButton.disabled = false;
});
} else {
// Show error popup. For more info check the plugin's official documentation: https://sweetalert2.github.io/
@ -172,24 +185,37 @@ var KTSigninGeneral = function() {
});
}
});
});
});
}
var isValidUrl = function(url) {
try {
new URL(url);
return true;
} catch (e) {
return false;
}
}
// Public functions
return {
// Initialization
init: function() {
init: function () {
form = document.querySelector('#kt_sign_in_form');
submitButton = document.querySelector('#kt_sign_in_submit');
handleValidation();
handleSubmitDemo(); // used for demo purposes only, if you use the below ajax version you can uncomment this one
//handleSubmitAjax(); // use for ajax submit
if (isValidUrl(submitButton.closest('form').getAttribute('action'))) {
handleSubmitAjax(); // use for ajax submit
} else {
handleSubmitDemo(); // used for demo purposes only
}
}
};
}();
// On document ready
KTUtil.onDOMContentLoaded(function() {
KTUtil.onDOMContentLoaded(function () {
KTSigninGeneral.init();
});

View File

@ -144,7 +144,7 @@ var KTSignupFreeTrial = function() {
// Password input validation
var validatePassword = function() {
return (passwordMeter.getScore() === 100);
return (passwordMeter.getScore() > 50);
}
// Public functions

View File

@ -1,7 +1,7 @@
"use strict";
// Class definition
var KTSignupGeneral = function() {
var KTSignupGeneral = function () {
// Elements
var form;
var submitButton;
@ -9,37 +9,37 @@ var KTSignupGeneral = function() {
var passwordMeter;
// Handle form
var handleForm = function(e) {
var handleForm = function (e) {
// Init form validation rules. For more info check the FormValidation plugin's official documentation:https://formvalidation.io/
validator = FormValidation.formValidation(
form,
{
fields: {
'first-name': {
validators: {
notEmpty: {
message: 'First Name is required'
}
}
form,
{
fields: {
'first-name': {
validators: {
notEmpty: {
message: 'First Name is required'
}
}
},
'last-name': {
validators: {
notEmpty: {
message: 'Last Name is required'
}
}
},
'email': {
validators: {
notEmpty: {
message: 'Last Name is required'
}
}
},
'email': {
validators: {
regexp: {
regexp: /^[^\s@]+@[^\s@]+\.[^\s@]+$/,
message: 'The value is not a valid email address',
},
notEmpty: {
message: 'Email address is required'
}
}
},
notEmpty: {
message: 'Email address is required'
}
}
},
'password': {
validators: {
notEmpty: {
@ -47,7 +47,7 @@ var KTSignupGeneral = function() {
},
callback: {
message: 'Please enter valid password',
callback: function(input) {
callback: function (input) {
if (input.value.length > 0) {
return validatePassword();
}
@ -61,7 +61,7 @@ var KTSignupGeneral = function() {
message: 'The password confirmation is required'
},
identical: {
compare: function() {
compare: function () {
return form.querySelector('[name="password"]').value;
},
message: 'The password and its confirm are not the same'
@ -75,21 +75,21 @@ var KTSignupGeneral = function() {
}
}
}
},
plugins: {
trigger: new FormValidation.plugins.Trigger({
},
plugins: {
trigger: new FormValidation.plugins.Trigger({
event: {
password: false
}
}),
bootstrap: new FormValidation.plugins.Bootstrap5({
bootstrap: new FormValidation.plugins.Bootstrap5({
rowSelector: '.fv-row',
eleInvalidClass: '', // comment to enable invalid state icons
eleValidClass: '' // comment to enable valid state icons
})
}
}
);
}
}
);
// Handle form submit
submitButton.addEventListener('click', function (e) {
@ -97,8 +97,8 @@ var KTSignupGeneral = function() {
validator.revalidateField('password');
validator.validate().then(function(status) {
if (status == 'Valid') {
validator.validate().then(function (status) {
if (status == 'Valid') {
// Show loading indication
submitButton.setAttribute('data-kt-indicator', 'on');
@ -106,7 +106,7 @@ var KTSignupGeneral = function() {
submitButton.disabled = true;
// Simulate ajax request
setTimeout(function() {
setTimeout(function () {
// Hide loading indication
submitButton.removeAttribute('data-kt-indicator');
@ -148,37 +148,206 @@ var KTSignupGeneral = function() {
}
});
}
});
});
});
// Handle password input
form.querySelector('input[name="password"]').addEventListener('input', function() {
form.querySelector('input[name="password"]').addEventListener('input', function () {
if (this.value.length > 0) {
validator.updateFieldStatus('password', 'NotValidated');
}
});
}
// Handle form ajax
var handleFormAjax = function (e) {
// Init form validation rules. For more info check the FormValidation plugin's official documentation:https://formvalidation.io/
validator = FormValidation.formValidation(
form,
{
fields: {
'name': {
validators: {
notEmpty: {
message: 'Name is required'
}
}
},
'email': {
validators: {
regexp: {
regexp: /^[^\s@]+@[^\s@]+\.[^\s@]+$/,
message: 'The value is not a valid email address',
},
notEmpty: {
message: 'Email address is required'
}
}
},
'password': {
validators: {
notEmpty: {
message: 'The password is required'
},
callback: {
message: 'Please enter valid password',
callback: function (input) {
if (input.value.length > 0) {
return validatePassword();
}
}
}
}
},
'password_confirmation': {
validators: {
notEmpty: {
message: 'The password confirmation is required'
},
identical: {
compare: function () {
return form.querySelector('[name="password"]').value;
},
message: 'The password and its confirm are not the same'
}
}
},
'toc': {
validators: {
notEmpty: {
message: 'You must accept the terms and conditions'
}
}
}
},
plugins: {
trigger: new FormValidation.plugins.Trigger({
event: {
password: false
}
}),
bootstrap: new FormValidation.plugins.Bootstrap5({
rowSelector: '.fv-row',
eleInvalidClass: '', // comment to enable invalid state icons
eleValidClass: '' // comment to enable valid state icons
})
}
}
);
// Handle form submit
submitButton.addEventListener('click', function (e) {
e.preventDefault();
validator.revalidateField('password');
validator.validate().then(function (status) {
if (status == 'Valid') {
// Show loading indication
submitButton.setAttribute('data-kt-indicator', 'on');
// Disable button to avoid multiple click
submitButton.disabled = true;
// Check axios library docs: https://axios-http.com/docs/intro
axios.post(submitButton.closest('form').getAttribute('action'), new FormData(form)).then(function (response) {
if (response) {
form.reset();
const redirectUrl = form.getAttribute('data-kt-redirect-url');
if (redirectUrl) {
location.href = redirectUrl;
}
} else {
// Show error popup. For more info check the plugin's official documentation: https://sweetalert2.github.io/
Swal.fire({
text: "Sorry, looks like there are some errors detected, please try again.",
icon: "error",
buttonsStyling: false,
confirmButtonText: "Ok, got it!",
customClass: {
confirmButton: "btn btn-primary"
}
});
}
}).catch(function (error) {
Swal.fire({
text: "Sorry, looks like there are some errors detected, please try again.",
icon: "error",
buttonsStyling: false,
confirmButtonText: "Ok, got it!",
customClass: {
confirmButton: "btn btn-primary"
}
});
}).then(() => {
// Hide loading indication
submitButton.removeAttribute('data-kt-indicator');
// Enable button
submitButton.disabled = false;
});
} else {
// Show error popup. For more info check the plugin's official documentation: https://sweetalert2.github.io/
Swal.fire({
text: "Sorry, looks like there are some errors detected, please try again.",
icon: "error",
buttonsStyling: false,
confirmButtonText: "Ok, got it!",
customClass: {
confirmButton: "btn btn-primary"
}
});
}
});
});
// Handle password input
form.querySelector('input[name="password"]').addEventListener('input', function () {
if (this.value.length > 0) {
validator.updateFieldStatus('password', 'NotValidated');
}
});
}
// Password input validation
var validatePassword = function() {
return (passwordMeter.getScore() === 100);
var validatePassword = function () {
return (passwordMeter.getScore() > 50);
}
var isValidUrl = function(url) {
try {
new URL(url);
return true;
} catch (e) {
return false;
}
}
// Public functions
return {
// Initialization
init: function() {
init: function () {
// Elements
form = document.querySelector('#kt_sign_up_form');
submitButton = document.querySelector('#kt_sign_up_submit');
passwordMeter = KTPasswordMeter.getInstance(form.querySelector('[data-kt-password-meter="true"]'));
handleForm ();
if (isValidUrl(submitButton.closest('form').getAttribute('action'))) {
handleFormAjax();
} else {
handleForm();
}
}
};
}();
// On document ready
KTUtil.onDOMContentLoaded(function() {
KTUtil.onDOMContentLoaded(function () {
KTSignupGeneral.init();
});

View File

@ -87,35 +87,38 @@ var KTLayoutSearch = function() {
var handlePreferences = function() {
// Preference show handler
preferencesShowElement.addEventListener('click', function() {
wrapperElement.classList.add('d-none');
preferencesElement.classList.remove('d-none');
});
if (preferencesShowElement) {
preferencesShowElement.addEventListener('click', function() {
wrapperElement.classList.add('d-none');
preferencesElement.classList.remove('d-none');
});
}
// Preference dismiss handler
preferencesDismissElement.addEventListener('click', function() {
wrapperElement.classList.remove('d-none');
preferencesElement.classList.add('d-none');
});
if (preferencesDismissElement) {
preferencesDismissElement.addEventListener('click', function() {
wrapperElement.classList.remove('d-none');
preferencesElement.classList.add('d-none');
});
}
}
var handleAdvancedOptionsForm = function() {
// Show
advancedOptionsFormShowElement.addEventListener('click', function() {
wrapperElement.classList.add('d-none');
advancedOptionsFormElement.classList.remove('d-none');
});
if (advancedOptionsFormShowElement) {
advancedOptionsFormShowElement.addEventListener('click', function() {
wrapperElement.classList.add('d-none');
advancedOptionsFormElement.classList.remove('d-none');
});
}
// Cancel
advancedOptionsFormCancelElement.addEventListener('click', function() {
wrapperElement.classList.remove('d-none');
advancedOptionsFormElement.classList.add('d-none');
});
// Search
advancedOptionsFormSearchElement.addEventListener('click', function() {
});
if (advancedOptionsFormCancelElement) {
advancedOptionsFormCancelElement.addEventListener('click', function() {
wrapperElement.classList.remove('d-none');
advancedOptionsFormElement.classList.add('d-none');
});
}
}
// Public methods
@ -156,8 +159,13 @@ var KTLayoutSearch = function() {
searchObject.on('kt.search.clear', clear);
// Custom handlers
handlePreferences();
handleAdvancedOptionsForm();
if (preferencesElement) {
handlePreferences();
}
if (advancedOptionsFormElement) {
handleAdvancedOptionsForm();
}
}
};
}();

View File

@ -7,7 +7,7 @@ var KTAppSidebar = function () {
var sidebar;
var headerMenu;
var menuDashboardsCollapse;
var menuWrapper;
var menuScroll;
var toggle;
// Private functions
@ -56,7 +56,7 @@ var KTAppSidebar = function () {
// Handle dashboards menu items collapse mode
var handleShowMore = function() {
menuDashboardsCollapse.addEventListener('hide.bs.collapse', event => {
menuWrapper.scrollTo({
menuScroll.scrollTo({
top: 0,
behavior: 'instant'
});
@ -64,18 +64,18 @@ var KTAppSidebar = function () {
}
var handleMenuScroll = function() {
var menuActiveItem = menuWrapper.querySelector(".menu-link.active");
var menuActiveItem = menuScroll.querySelector(".menu-link.active");
if ( !menuActiveItem ) {
return;
}
if ( KTUtil.isVisibleInContainer(menuActiveItem, menuWrapper) === true) {
if ( KTUtil.isVisibleInContainer(menuActiveItem, menuScroll) === true) {
return;
}
menuWrapper.scroll({
top: KTUtil.getRelativeTopPosition(menuActiveItem, menuWrapper),
menuScroll.scroll({
top: KTUtil.getRelativeTopPosition(menuActiveItem, menuScroll),
behavior: 'smooth'
});
}
@ -88,7 +88,7 @@ var KTAppSidebar = function () {
toggle = document.querySelector('#kt_app_sidebar_toggle');
headerMenu = document.querySelector('#kt_app_header_menu');
menuDashboardsCollapse = document.querySelector('#kt_app_sidebar_menu_dashboards_collapse');
menuWrapper = document.querySelector('#kt_app_sidebar_menu_wrapper');
menuScroll = document.querySelector('#kt_app_sidebar_menu_scroll');
if ( sidebar === null ) {
return;
@ -98,7 +98,7 @@ var KTAppSidebar = function () {
handleToggle();
}
if ( menuWrapper ) {
if ( menuScroll ) {
handleMenuScroll();
}

View File

@ -168,7 +168,7 @@ var KTTablesWidget4 = function () {
// Populate elements with data
const imageSrc = image.getAttribute('data-kt-src-path');
image.setAttribute('src', imageSrc + d.image + '.gif');
image.setAttribute('src', imageSrc + d.image + '.png');
name.innerText = d.name;
description.innerText = d.description;
cost.innerText = d.cost;

Binary file not shown.

Before

Width:  |  Height:  |  Size: 66 KiB

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 110 KiB

After

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 76 KiB

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 60 KiB

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 87 KiB

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 101 KiB

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 64 KiB

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 102 KiB

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 71 KiB

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 84 KiB

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 72 KiB

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 60 KiB

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 83 KiB

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 87 KiB

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 83 KiB

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 65 KiB

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 119 KiB

After

Width:  |  Height:  |  Size: 65 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 79 KiB

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 79 KiB

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.5 KiB

After

Width:  |  Height:  |  Size: 6.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 78 KiB

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 27 KiB

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 80 KiB

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 69 KiB

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 58 KiB

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 86 KiB

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 71 KiB

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 108 KiB

After

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 78 KiB

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 280 KiB

After

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 62 KiB

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 213 KiB

After

Width:  |  Height:  |  Size: 95 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 233 KiB

After

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 113 KiB

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 233 KiB

After

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 158 KiB

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 215 KiB

After

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 167 KiB

After

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 177 KiB

After

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 278 KiB

After

Width:  |  Height:  |  Size: 76 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 211 KiB

After

Width:  |  Height:  |  Size: 67 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 138 KiB

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 139 KiB

After

Width:  |  Height:  |  Size: 93 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 8.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 8.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 75 KiB

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 75 KiB

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 83 KiB

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 83 KiB

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 77 KiB

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 77 KiB

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 84 KiB

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 84 KiB

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 186 KiB

After

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 183 KiB

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 65 KiB

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 65 KiB

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 54 KiB

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 54 KiB

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 49 KiB

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 49 KiB

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 98 KiB

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 98 KiB

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 43 KiB

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 43 KiB

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 41 KiB

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 41 KiB

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 68 KiB

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 68 KiB

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 47 KiB

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 47 KiB

After

Width:  |  Height:  |  Size: 18 KiB

Some files were not shown because too many files have changed in this diff Show More