mirror of
https://git.imnavajas.es/jjimenez/safekat.git
synced 2025-07-25 22:52:08 +00:00
Igualando a rama dev/formateando
This commit is contained in:
58
.idea/workspace.xml
generated
58
.idea/workspace.xml
generated
@ -5,13 +5,31 @@
|
||||
</component>
|
||||
<component name="ChangeListManager">
|
||||
<list default="true" id="7c8f7059-cd40-417c-936e-48dbc0507d86" name="Changes" comment="Add static Vuexy files">
|
||||
<change afterPath="$PROJECT_DIR$/httpdocs/themes/vuexy/vendor/libs/toastr/toastr.min.js" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/ci4/app/Config/Boot/development.php" beforeDir="false" afterPath="$PROJECT_DIR$/ci4/app/Config/Boot/development.php" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/ci4/app/Config/Routes.php" beforeDir="false" afterPath="$PROJECT_DIR$/ci4/app/Config/Routes.php" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/ci4/app/Controllers/Integration.php" beforeDir="false" afterPath="$PROJECT_DIR$/ci4/app/Controllers/Integration.php" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/ci4/app/Controllers/Login.php" beforeDir="false" afterPath="$PROJECT_DIR$/ci4/app/Controllers/Login.php" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/ci4/app/Helpers/general_helper.php" beforeDir="false" afterPath="$PROJECT_DIR$/ci4/app/Helpers/general_helper.php" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/ci4/app/Language/es/App.php" beforeDir="false" afterPath="$PROJECT_DIR$/ci4/app/Language/es/App.php" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/ci4/app/Config/App.php" beforeDir="false" afterPath="$PROJECT_DIR$/ci4/app/Config/App.php" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/ci4/app/Config/Email.php" beforeDir="false" afterPath="$PROJECT_DIR$/ci4/app/Config/Email.php" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/ci4/app/Controllers/GoBaseController.php" beforeDir="false" afterPath="$PROJECT_DIR$/ci4/app/Controllers/GoBaseController.php" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/ci4/app/Controllers/Home.php" beforeDir="false" afterPath="$PROJECT_DIR$/ci4/app/Controllers/Home.php" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/ci4/app/Controllers/Settings.php" beforeDir="false" afterPath="$PROJECT_DIR$/ci4/app/Controllers/Settings.php" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/ci4/app/Filters/LoginAuthFilter.php" beforeDir="false" afterPath="$PROJECT_DIR$/ci4/app/Filters/LoginAuthFilter.php" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/ci4/app/Language/en/App.php" beforeDir="false" afterPath="$PROJECT_DIR$/ci4/app/Language/en/App.php" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/ci4/app/Language/es-ES/Tarifaaacabado.php" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/ci4/app/Views/themes/_commonPartialsBs/datatables.php" beforeDir="false" afterPath="$PROJECT_DIR$/ci4/app/Views/themes/_commonPartialsBs/datatables.php" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/ci4/app/Views/themes/_commonPartialsBs/select2bs5.php" beforeDir="false" afterPath="$PROJECT_DIR$/ci4/app/Views/themes/_commonPartialsBs/select2bs5.php" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/ci4/app/Views/themes/backend/vuexy/form/group/viewUserGroupForm.php" beforeDir="false" afterPath="$PROJECT_DIR$/ci4/app/Views/themes/backend/vuexy/form/group/viewUserGroupForm.php" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/ci4/app/Views/themes/backend/vuexy/form/group/viewUserGroupList.php" beforeDir="false" afterPath="$PROJECT_DIR$/ci4/app/Views/themes/backend/vuexy/form/group/viewUserGroupList.php" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/ci4/app/Views/themes/backend/vuexy/form/login/index.php" beforeDir="false" afterPath="$PROJECT_DIR$/ci4/app/Views/themes/backend/vuexy/form/login/index.php" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/ci4/app/Views/themes/backend/vuexy/form/user/_userFormItems.php" beforeDir="false" afterPath="$PROJECT_DIR$/ci4/app/Views/themes/backend/vuexy/form/user/_userFormItems.php" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/ci4/app/Views/themes/backend/vuexy/login/footer.php" beforeDir="false" afterPath="$PROJECT_DIR$/ci4/app/Views/themes/backend/vuexy/login/footer.php" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/ci4/app/Views/themes/backend/vuexy/login/header.php" beforeDir="false" afterPath="$PROJECT_DIR$/ci4/app/Views/themes/backend/vuexy/login/header.php" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/ci4/app/Views/themes/backend/vuexy/main/all.php" beforeDir="false" afterPath="$PROJECT_DIR$/ci4/app/Views/themes/backend/vuexy/main/all.php" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/ci4/app/Views/themes/backend/vuexy/main/all_selects.php" beforeDir="false" afterPath="$PROJECT_DIR$/ci4/app/Views/themes/backend/vuexy/main/all_selects.php" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/ci4/app/Views/themes/backend/vuexy/main/crud_layout.php" beforeDir="false" afterPath="$PROJECT_DIR$/ci4/app/Views/themes/backend/vuexy/main/crud_layout.php" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/ci4/app/Views/themes/backend/vuexy/main/defaultlayout.php" beforeDir="false" afterPath="$PROJECT_DIR$/ci4/app/Views/themes/backend/vuexy/main/defaultlayout.php" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/ci4/app/Views/themes/backend/vuexy/main/header.php" beforeDir="false" afterPath="$PROJECT_DIR$/ci4/app/Views/themes/backend/vuexy/main/header.php" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/datos web.txt" beforeDir="false" afterPath="$PROJECT_DIR$/datos web.txt" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/httpdocs/assets/js/login.js" beforeDir="false" afterPath="$PROJECT_DIR$/httpdocs/assets/js/login.js" afterDir="false" />
|
||||
</list>
|
||||
<option name="SHOW_DIALOG" value="false" />
|
||||
<option name="HIGHLIGHT_CONFLICTS" value="true" />
|
||||
@ -33,20 +51,20 @@
|
||||
<option name="hideEmptyMiddlePackages" value="true" />
|
||||
<option name="showLibraryContents" value="true" />
|
||||
</component>
|
||||
<component name="PropertiesComponent">{
|
||||
"keyToString": {
|
||||
"RunOnceActivity.OpenProjectViewOnStart": "true",
|
||||
"RunOnceActivity.ShowReadmeOnStart": "true",
|
||||
"WebServerToolWindowFactoryState": "false",
|
||||
"last_opened_file_path": "C:/temp-sk/safekat/ci4/app/Views/themes/backend/vuexy/main",
|
||||
"node.js.detected.package.eslint": "true",
|
||||
"node.js.detected.package.tslint": "true",
|
||||
"node.js.selected.package.eslint": "(autodetect)",
|
||||
"node.js.selected.package.tslint": "(autodetect)",
|
||||
"nodejs_package_manager_path": "npm",
|
||||
"vue.rearranger.settings.migration": "true"
|
||||
<component name="PropertiesComponent"><![CDATA[{
|
||||
"keyToString": {
|
||||
"RunOnceActivity.OpenProjectViewOnStart": "true",
|
||||
"RunOnceActivity.ShowReadmeOnStart": "true",
|
||||
"WebServerToolWindowFactoryState": "false",
|
||||
"last_opened_file_path": "C:/temp-sk/safekat/httpdocs/themes/vuexy/vendor/libs/toastr",
|
||||
"node.js.detected.package.eslint": "true",
|
||||
"node.js.detected.package.tslint": "true",
|
||||
"node.js.selected.package.eslint": "(autodetect)",
|
||||
"node.js.selected.package.tslint": "(autodetect)",
|
||||
"nodejs_package_manager_path": "npm",
|
||||
"vue.rearranger.settings.migration": "true"
|
||||
}
|
||||
}</component>
|
||||
}]]></component>
|
||||
<component name="RecentsManager">
|
||||
<key name="CopyFile.RECENT_KEYS">
|
||||
<recent name="C:\temp-sk\safekat\ci4\app\Views\themes\backend\vuexy\main" />
|
||||
@ -78,6 +96,8 @@
|
||||
<workItem from="1683716769681" duration="8512000" />
|
||||
<workItem from="1683796910193" duration="12918000" />
|
||||
<workItem from="1684147458134" duration="7379000" />
|
||||
<workItem from="1684221025785" duration="2261000" />
|
||||
<workItem from="1684226343116" duration="557000" />
|
||||
</task>
|
||||
<task id="LOCAL-00001" summary="Starting Vuexy Theme creation">
|
||||
<created>1682339938559</created>
|
||||
|
||||
@ -109,7 +109,7 @@ class App extends BaseConfig
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
public $appTimezone = 'America/Sao_Paulo';
|
||||
public $appTimezone = 'Europe/Madrid';
|
||||
|
||||
/**
|
||||
* --------------------------------------------------------------------------
|
||||
|
||||
@ -26,14 +26,14 @@ class Email extends BaseConfig
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
public $userAgent = 'CodeIgniter';
|
||||
public $userAgent = 'Safekat ERP';
|
||||
|
||||
/**
|
||||
* The mail sending protocol: mail, sendmail, smtp
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
public $protocol = 'mail';
|
||||
public $protocol = 'smtp';
|
||||
|
||||
/**
|
||||
* The server path to Sendmail.
|
||||
@ -47,21 +47,21 @@ class Email extends BaseConfig
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
public $SMTPHost;
|
||||
public $SMTPHost = "imnavajas.es";
|
||||
|
||||
/**
|
||||
* SMTP Username
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
public $SMTPUser;
|
||||
public $SMTPUser = "safekat@imnavajas.es";
|
||||
|
||||
/**
|
||||
* SMTP Password
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
public $SMTPPass;
|
||||
public $SMTPPass = "Etkd9~448";
|
||||
|
||||
/**
|
||||
* SMTP Port
|
||||
@ -110,7 +110,7 @@ class Email extends BaseConfig
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
public $mailType = 'text';
|
||||
public $mailType = 'html';
|
||||
|
||||
/**
|
||||
* Character set (utf-8, iso-8859-1, etc.)
|
||||
|
||||
@ -9,7 +9,7 @@ use App\Models\SettingsModel;
|
||||
use App\Models\TemplateModel;
|
||||
use App\Models\ThemeModel;
|
||||
use App\Models\TimezoneModel;
|
||||
use App\Models\UserGroupModel;
|
||||
use App\Models\Usuarios\UserGroupModel;
|
||||
use App\Models\Usuarios\UserModel;
|
||||
|
||||
class Settings extends BaseController
|
||||
|
||||
@ -139,7 +139,9 @@ class LoginAuthFilter implements FilterInterface
|
||||
'Integration',
|
||||
'Migrate',
|
||||
'Test',
|
||||
'GoBaseController'
|
||||
'GoBaseController',
|
||||
'GoBaseResourceController'
|
||||
|
||||
];
|
||||
}
|
||||
|
||||
|
||||
@ -1,114 +0,0 @@
|
||||
<?php
|
||||
|
||||
|
||||
|
||||
return [
|
||||
'ajuste' => 'Ajuste',
|
||||
'createdAt' => 'Creado en',
|
||||
'deletedAt' => 'Borrado en',
|
||||
'formulaPrice' => 'Fórmula precio',
|
||||
'id' => 'ID',
|
||||
'moduleTitle' => 'Tarifas Acabado',
|
||||
'nombre' => 'Nombre',
|
||||
'precioMax' => 'Precio Max',
|
||||
'precioMin' => 'Precio Min',
|
||||
'tarifaacabado' => 'Tarifas Acabado',
|
||||
'tarifaacabadoList' => 'Lista Tarifas Acabado',
|
||||
'tarifasacabado' => 'Tarifas Acabado',
|
||||
'tiradaMax' => 'Tirada Max',
|
||||
'tiradaMin' => 'Tirada Min',
|
||||
'updatedAt' => 'Actualizado en',
|
||||
'userCreatedId' => 'ID Usuario "Creado en"',
|
||||
'userUpdateId' => 'ID Usuario "Actualizado en"',
|
||||
'validation' => [
|
||||
'formula_price' => [
|
||||
'max_length' => 'El campo {field} no puede exceder {param} caracteres en longitud.',
|
||||
'required' => 'El campo {field} es obligatorio.',
|
||||
|
||||
],
|
||||
|
||||
|
||||
],
|
||||
|
||||
'validation' => [
|
||||
'nombre' => [
|
||||
'max_length' => 'El campo {field} no puede exceder {param} caracteres en longitud.',
|
||||
'required' => 'El campo {field} es obligatorio.',
|
||||
|
||||
],
|
||||
|
||||
|
||||
],
|
||||
|
||||
'validation' => [
|
||||
'precio_max' => [
|
||||
'decimal' => 'El campo {field} debe contener un número decimal.',
|
||||
'required' => 'El campo {field} es obligatorio.',
|
||||
|
||||
],
|
||||
|
||||
|
||||
],
|
||||
|
||||
'validation' => [
|
||||
'precio_min' => [
|
||||
'decimal' => 'El campo {field} debe contener un número decimal.',
|
||||
'required' => 'El campo {field} es obligatorio.',
|
||||
|
||||
],
|
||||
|
||||
|
||||
],
|
||||
|
||||
'validation' => [
|
||||
'tirada_max' => [
|
||||
'integer' => 'El campo {field} debe contener un número entero.',
|
||||
'required' => 'El campo {field} es obligatorio.',
|
||||
|
||||
],
|
||||
|
||||
|
||||
],
|
||||
|
||||
'validation' => [
|
||||
'tirada_min' => [
|
||||
'integer' => 'El campo {field} debe contener un número entero.',
|
||||
'required' => 'El campo {field} es obligatorio.',
|
||||
|
||||
],
|
||||
|
||||
|
||||
],
|
||||
|
||||
'validation' => [
|
||||
'user_created_id' => [
|
||||
'integer' => 'El campo {field} debe contener un número entero.',
|
||||
'required' => 'El campo {field} es obligatorio.',
|
||||
|
||||
],
|
||||
|
||||
|
||||
],
|
||||
|
||||
'validation' => [
|
||||
'user_update_id' => [
|
||||
'integer' => 'El campo {field} debe contener un número entero.',
|
||||
'required' => 'El campo {field} es obligatorio.',
|
||||
|
||||
],
|
||||
|
||||
|
||||
],
|
||||
|
||||
'validation' => [
|
||||
'ajuste' => [
|
||||
'decimal' => 'El campo {field} debe contener un número decimal',
|
||||
'required' => 'El campo {field} es obligatorio.',
|
||||
|
||||
],
|
||||
|
||||
|
||||
],
|
||||
|
||||
|
||||
];
|
||||
@ -4,7 +4,7 @@
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/select2@4.0.13/dist/css/select2.min.css">
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/select2-bootstrap-5-theme@1.1.1/dist/select2-bootstrap-5-theme.min.css" />
|
||||
*/ ?>
|
||||
<link rel="stylesheet" href="<?= site_url('themes/vuexy/vendor/libs/select2/select2.css') ?>">
|
||||
<link rel="stylesheet" href="<?= site_url('themes/vuexy/vendor/libs/select2/select2.css') ?>"/>
|
||||
<?= $this->endSection() ?>
|
||||
|
||||
<!-- Push additional js -->
|
||||
@ -17,15 +17,19 @@
|
||||
|
||||
<?= $this->section('additionalInlineJs') ?>
|
||||
|
||||
<?php /*
|
||||
$('.select2bs').select2({
|
||||
theme: "bootstrap-5",
|
||||
allowClear: false,
|
||||
});
|
||||
*/ ?>
|
||||
'use strict';
|
||||
const select2 = $('.select2');
|
||||
|
||||
$('.select2').select2({
|
||||
|
||||
});
|
||||
// Select2
|
||||
// --------------------------------------------------------------------
|
||||
if (select2.length) {
|
||||
select2.each(function () {
|
||||
var $this = $(this);
|
||||
$this.wrap('<div class="position-relative"></div>').select2({
|
||||
placeholder: 'Select value',
|
||||
dropdownParent: $this.parent()
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
<?= $this->endSection() ?>
|
||||
@ -1,123 +1,155 @@
|
||||
<?= $this->include("themes/_commonPartialsBs/select2bs5") ?>
|
||||
<?=$this->extend('themes/backend/vuexy/main/defaultlayout') ?>
|
||||
<?= $this->extend('themes/backend/vuexy/main/defaultlayout') ?>
|
||||
|
||||
<?= $this->section("content") ?>
|
||||
<div class="row">
|
||||
<div class="col-12">
|
||||
<div class="card card-info">
|
||||
<div class="card-header">
|
||||
<h3 class="card-title"><?= $boxTitle ?? $pageTitle ?></h3>
|
||||
</div><!--//.card-header -->
|
||||
<div class="card-body">
|
||||
<?= formAlert() ?>
|
||||
<form id="groupForm" method="post" action="<?= $formAction ?>">
|
||||
<?= csrf_field() ?>
|
||||
<input type="hidden" name="id_group" value="<?= (isset($obj)) ? $obj['id_group'] : set_value('id_group') ?>">
|
||||
<input type="hidden" name="token" value="<?= (isset($obj)) ? $obj['token'] : set_value('token') ?>">
|
||||
<div class="form-body">
|
||||
<div class="row">
|
||||
<div class="col-md-8">
|
||||
<div class="form-group">
|
||||
<label for="title" class="text-dark"><?=lang("App.group_field_title")?></label>
|
||||
<input type="text" name="title" id="title" class="form-control" value="<?= old('title', $group->title) ?>">
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<div class="form-group">
|
||||
<label for="dashboard" class="text-dark"><?=lang("App.group_field_dashboard")?></label>
|
||||
<?php $id_select = (isset($group)) ? $group->dashboard : set_value('dashboard');?>
|
||||
<select name="dashboard" id="dashboard" class="form-control">
|
||||
<option value="user" <?= $id_select == "user" ? 'selected' : '' ?>><?=lang("App.group_label_user")?></option>
|
||||
<option value="admin" <?= $id_select == "admin" ? 'selected' : '' ?>><?=lang("App.group_label_admin")?></option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-md-12 right">
|
||||
<div class="form-group">
|
||||
<button type="button" name="select_all" id="select_all" class="btn btn-primary round"><i class="la la-toggle-on"></i> <?=lang("App.group_btn_select")?></button>
|
||||
<button type="button" name="remove_all" id="remove_all" class="btn btn-primary round ml-1"><i class="la la-toggle-off"></i> <?=lang("App.group_btn_remove")?></button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-md-12 right">
|
||||
<div class="card">
|
||||
<div class="card-header">
|
||||
<h4 class="card-title"><?= lang("App.permisos_general") ?></h4>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-12">
|
||||
<div class="card card-info">
|
||||
<div class="card-header">
|
||||
<h3 class="card-title"><?= $boxTitle ?? $pageTitle ?></h3>
|
||||
</div><!--//.card-header -->
|
||||
<div class="card-body">
|
||||
<?= formAlert() ?>
|
||||
<form id="groupForm" method="post" action="<?= $formAction ?>">
|
||||
<?= csrf_field() ?>
|
||||
<input type="hidden" name="id_group"
|
||||
value="<?= (isset($obj)) ? $obj['id_group'] : set_value('id_group') ?>">
|
||||
<input type="hidden" name="token"
|
||||
value="<?= (isset($obj)) ? $obj['token'] : set_value('token') ?>">
|
||||
<div class="form-body">
|
||||
<div class="row">
|
||||
<div class="col-md-8">
|
||||
<div class="form-group">
|
||||
<label for="title"
|
||||
class="text-dark"><?= lang("App.group_field_title") ?></label>
|
||||
<input type="text" name="title" id="title" class="form-control"
|
||||
value="<?= old('title', $group->title) ?>">
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="row">
|
||||
<?php foreach(getAllClass() as $item): ?>
|
||||
<?php if (empty($item['path'])): ?>
|
||||
<div class="col-md-3 col-lg-2">
|
||||
<h4 class="danger"><?=getDictionary($item['name'])?></h4>
|
||||
<?php foreach($item['methods'] as $subitem): ?>
|
||||
<?php if(!getIgnoreMethod($subitem)): ?>
|
||||
<div class="custom-control custom-switch">
|
||||
<input type="checkbox" id="<?=$item['name'].'_'.$subitem?>" name="<?=$item['name'].'_'.$subitem?>" class="custom-control-input">
|
||||
<label for="<?=$item['name'].'_'.$subitem?>" class="custom-control-label"><?=getDictionary($subitem)?></label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<div class="form-group">
|
||||
<label for="dashboard"
|
||||
class="text-dark"><?= lang("App.group_field_dashboard") ?></label>
|
||||
<?php $id_select = (isset($group)) ? $group->dashboard : set_value('dashboard'); ?>
|
||||
<select name="dashboard" id="dashboard" class="form-control">
|
||||
<option value="user" <?= $id_select == "user" ? 'selected' : '' ?>><?= lang("App.group_label_user") ?></option>
|
||||
<option value="admin" <?= $id_select == "admin" ? 'selected' : '' ?>><?= lang("App.group_label_admin") ?></option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-md-12 right">
|
||||
<div class="form-group">
|
||||
<button type="button" name="select_all" id="select_all"
|
||||
class="btn btn-primary round"><i
|
||||
class="la la-toggle-on"></i> <?= lang("App.group_btn_select") ?>
|
||||
</button>
|
||||
<button type="button" name="remove_all" id="remove_all"
|
||||
class="btn btn-primary round ml-1"><i
|
||||
class="la la-toggle-off"></i> <?= lang("App.group_btn_remove") ?>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
<h5>Role Permissions</h5>
|
||||
<!-- Permission table -->
|
||||
<div class="table-responsive">
|
||||
<table class="table table-flush-spacing">
|
||||
<tbody>
|
||||
<!-- <tr>-->
|
||||
<!-- <td class="text-nowrap fw-semibold">-->
|
||||
<!-- Permisos GLobales-->
|
||||
<!-- <i-->
|
||||
<!-- class="ti ti-info-circle"-->
|
||||
<!-- data-bs-toggle="tooltip"-->
|
||||
<!-- data-bs-placement="top"-->
|
||||
<!-- title="Allows a full access to the system"></i>-->
|
||||
<!-- </td>-->
|
||||
<!-- <td>-->
|
||||
<!-- <div class="form-check">-->
|
||||
<!-- <input class="form-check-input" type="checkbox" id="selectAll"/>-->
|
||||
<!-- <label class="form-check-label" for="selectAll"> Seleccionar-->
|
||||
<!-- todos </label>-->
|
||||
<!-- </div>-->
|
||||
<!-- </td>-->
|
||||
<!-- </tr>-->
|
||||
<?php foreach (getAllFolder() as $folder): ?>
|
||||
|
||||
<?php foreach (getAllClass() as $item): ?>
|
||||
<?php if (str_contains($item['path'], $folder)): ?>
|
||||
<tr>
|
||||
<td class="text-nowrap fw-semibold"><?= getDictionary($folder) ?? '' ?> >> <?= getDictionary($item['name']) ?></td>
|
||||
<?php foreach ($item['methods'] as $subitem): ?>
|
||||
<?php if (!getIgnoreMethod($subitem)): ?>
|
||||
<td>
|
||||
<div class="form-check">
|
||||
<input type="checkbox"
|
||||
id="<?= $item['name'] . '_' . $subitem ?>"
|
||||
name="<?= $item['name'] . '_' . $subitem ?>"
|
||||
class="form-check-input">
|
||||
<label for="<?= $item['name'] . '_' . $subitem ?>"
|
||||
class="form-check-label"><?= getDictionary($subitem) ?></label>
|
||||
</div>
|
||||
</td>
|
||||
<?php endif; ?>
|
||||
<?php endforeach; ?>
|
||||
</tr>
|
||||
<?php endif; ?>
|
||||
<?php endforeach; ?>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
<?php endforeach; ?>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<?php foreach(getAllFolder() as $folder): ?>
|
||||
<div class="card">
|
||||
<div class="card-header">
|
||||
<h4 class="card-title"><?= getDictionary($folder)??'' ?></h4>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="row">
|
||||
<?php foreach(getAllClass() as $item): ?>
|
||||
<?php if (str_contains($item['path'], $folder)): ?>
|
||||
<div class="col-md-3 col-lg-2">
|
||||
<h4 class="danger"><?=getDictionary($item['name'])?></h4>
|
||||
<?php foreach($item['methods'] as $subitem): ?>
|
||||
<?php if(!getIgnoreMethod($subitem)): ?>
|
||||
<div class="custom-control custom-switch">
|
||||
<input type="checkbox" id="<?=$item['name'].'_'.$subitem?>" name="<?=$item['name'].'_'.$subitem?>" class="custom-control-input">
|
||||
<label for="<?=$item['name'].'_'.$subitem?>" class="custom-control-label"><?=getDictionary($subitem)?></label>
|
||||
</div>
|
||||
|
||||
<?php foreach (getAllClass() as $item): ?>
|
||||
<?php if (empty($item['path'])): ?>
|
||||
<tr>
|
||||
<td class="text-nowrap fw-semibold"><?= getDictionary($item['name']) ?></td>
|
||||
<?php foreach ($item['methods'] as $subitem): ?>
|
||||
<?php if (!getIgnoreMethod($subitem)): ?>
|
||||
<td>
|
||||
<div class="form-check">
|
||||
<input type="checkbox"
|
||||
id="<?= $item['name'] . '_' . $subitem ?>"
|
||||
name="<?= $item['name'] . '_' . $subitem ?>"
|
||||
class="form-check-input">
|
||||
<label for="<?= $item['name'] . '_' . $subitem ?>"
|
||||
class="form-check-label"><?= getDictionary($subitem) ?></label>
|
||||
</div>
|
||||
</td>
|
||||
<?php endif; ?>
|
||||
<?php endforeach; ?>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
<?php endforeach; ?>
|
||||
</div>
|
||||
</div>
|
||||
</tr>
|
||||
<?php endif; ?>
|
||||
<?php endforeach; ?>
|
||||
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<?php endforeach; ?>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-actions mt-2">
|
||||
<?= anchor(route_to("groupIndex"), lang("Basic.global.Cancel"), ["class" => "btn btn-secondary float-start"]) ?>
|
||||
<input type="submit" class="btn btn-primary float-end" name="save" value="<?= lang("Basic.global.Save") ?>">
|
||||
</div>
|
||||
</form>
|
||||
<div class="form-actions mt-2">
|
||||
<?= anchor(route_to("groupIndex"), lang("Basic.global.Cancel"), ["class" => "btn btn-secondary float-start"]) ?>
|
||||
<input type="submit" class="btn btn-primary float-end" name="save"
|
||||
value="<?= lang("Basic.global.Save") ?>">
|
||||
</div>
|
||||
</form>
|
||||
|
||||
</div><!-- /.card-body -->
|
||||
|
||||
</div><!-- /.card-body -->
|
||||
|
||||
</div><!-- //.card -->
|
||||
</div><!--//.col -->
|
||||
</div><!--//.row -->
|
||||
</div><!-- //.card -->
|
||||
</div><!--//.col -->
|
||||
</div><!--//.row -->
|
||||
<?= $this->endSection() ?>
|
||||
|
||||
<?= $this->section('additionalInlineJs') ?>
|
||||
|
||||
|
||||
|
||||
$('#select_all').on('click', function () {
|
||||
$(':checkbox').each(function() {
|
||||
$(':checkbox').each(function() {
|
||||
this.checked = true;
|
||||
});
|
||||
});
|
||||
});
|
||||
$('#remove_all').on('click', function () {
|
||||
$(':checkbox').each(function() {
|
||||
@ -125,5 +157,4 @@
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
<?= $this->endSection() ?>
|
||||
@ -1,66 +1,82 @@
|
||||
<?=$this->include('themes/_commonPartialsBs/datatables') ?>
|
||||
<?=$this->extend('themes/backend/vuexy/main/defaultlayout') ?>
|
||||
<?=$this->section('content'); ?>
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
<?= $this->include('themes/_commonPartialsBs/datatables') ?>
|
||||
<?= $this->extend('themes/backend/vuexy/main/defaultlayout') ?>
|
||||
<?= $this->section('content'); ?>
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
<div class="card card-info">
|
||||
<div class="card-header">
|
||||
<h3 class="card-title"><?= lang('Group.grouplist') ?></h3>
|
||||
</div><!--//.card-header -->
|
||||
<div class="card-body">
|
||||
<div class="container-xxl flex-grow-1 container-p-y">
|
||||
<!-- Role cards -->
|
||||
<div class="row g-4">
|
||||
<div class="col-xl-4 col-lg-6 col-md-6">
|
||||
<div class="card h-100">
|
||||
<div class="row h-100">
|
||||
<div class="col-sm-5">
|
||||
<div class="d-flex align-items-end h-100 justify-content-center mt-sm-0 mt-3">
|
||||
<img
|
||||
src="<?= site_url('themes/vuexy/img/illustrations/add-new-roles.png') ?>"
|
||||
class="img-fluid mt-sm-4 mt-md-0"
|
||||
alt="add-new-roles"
|
||||
width="83"/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-sm-7">
|
||||
<div class="card-body text-sm-end text-center ps-sm-0">
|
||||
<button
|
||||
onclick="window.location='<?= route_to('newGroup') ?>'"
|
||||
class="btn btn-primary mb-2 text-nowrap add-new-role"
|
||||
>
|
||||
<?= lang('Basic.global.addNew') ?>
|
||||
</button>
|
||||
<p class="mb-0 mt-1">Añadir rol si no existe</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card card-info">
|
||||
<div class="card-header">
|
||||
<h3 class="card-title"><?=lang('Group.grouplist') ?></h3>
|
||||
<?=anchor(route_to('newGroup'), lang('Basic.global.addNew').' '.lang('Group.group'), ['class'=>'btn btn-primary float-end']); ?>
|
||||
</div><!--//.card-header -->
|
||||
<div class="card-body">
|
||||
<?= view('themes/_commonPartialsBs/_alertBoxes'); ?>
|
||||
<?php foreach ($userGroupList as $item) : ?>
|
||||
<div class="col-xl-4 col-lg-6 col-md-6">
|
||||
<div class="card">
|
||||
<div class="card-body">
|
||||
<div class="d-flex justify-content-between">
|
||||
<h6 class="fw-normal mb-2">Total 4 users</h6>
|
||||
</div>
|
||||
<div class="d-flex justify-content-between align-items-end mt-1">
|
||||
<div class="role-heading">
|
||||
<h4 class="mb-1"><?= esc($item->title) ?></h4>
|
||||
<a href="<?= route_to('editGroup', $item->id_group) ?>">
|
||||
<span><?= lang('Basic.global.edit') ?></span>
|
||||
</a>
|
||||
</div>
|
||||
<?=
|
||||
anchor('#confirm2delete', "<i class='ti ti-trash ti-md'></i>",
|
||||
[
|
||||
'class' => 'text-muted',
|
||||
'data-href' => route_to('deleteGroup', $item->id_group),
|
||||
'data-bs-toggle' => 'modal',
|
||||
'data-bs-target' => '#confirm2delete'
|
||||
]);
|
||||
?>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<?php endforeach; ?>
|
||||
</div>
|
||||
<!--/ Role cards -->
|
||||
</div>
|
||||
<?= view('themes/_commonPartialsBs/_alertBoxes'); ?>
|
||||
|
||||
<table id="tableOfGroups" class="table table-striped table-hover using-data-table" style="width: 100%;">
|
||||
<thead>
|
||||
<tr>
|
||||
<th><?=lang("Group.id")?></th>
|
||||
<th><?=lang("Group.group_grid_title")?></th>
|
||||
<th><?=lang("Group.group_grid_dashboard")?></th>
|
||||
<th><?= lang('UserGroups.token') ?></th>
|
||||
<th><?= lang('UserGroups.createdAt') ?></th>
|
||||
<th><?= lang('UserGroups.updatedAt') ?></th>
|
||||
<th class="text-nowrap"><?= lang('Basic.global.Action') ?></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<?php foreach ($userGroupList as $item ) : ?>
|
||||
<tr>
|
||||
<td class="align-middle text-center">
|
||||
<?=$item->id_group ?>
|
||||
</td>
|
||||
<td class="align-middle">
|
||||
<?= esc($item->title) ?>
|
||||
</td>
|
||||
<td class="align-middle">
|
||||
<?= esc($item->dashboard) ?>
|
||||
</td>
|
||||
<td class="align-middle">
|
||||
<?= esc($item->token) ?>
|
||||
</td>
|
||||
</td>
|
||||
<td class="align-middle text-nowrap">
|
||||
<?= empty($item->created_at) ? '' : date('d/m/Y H:m:s', strtotime($item->created_at)) ?>
|
||||
</td>
|
||||
<td class="align-middle text-nowrap">
|
||||
<?= empty($item->updated_at) ? '' : date('d/m/Y H:m:s', strtotime($item->updated_at)) ?>
|
||||
</td>
|
||||
<td class="align-middle text-center text-nowrap">
|
||||
<?=anchor(route_to('editGroup', $item->id_group), lang('Basic.global.edit'), ['class'=>'btn btn-sm btn-warning btn-edit me-1', 'data-id'=>$item->id_group,]); ?>
|
||||
<?=anchor('#confirm2delete', lang('Basic.global.Delete'), ['class'=>'btn btn-sm btn-danger btn-delete ms-1', 'data-href'=>route_to('deleteGroup', $item->id_group), 'data-bs-toggle'=>'modal', 'data-bs-target'=>'#confirm2delete']); ?>
|
||||
</td>
|
||||
</tr>
|
||||
</div><!--//.card-body -->
|
||||
<div class="card-footer">
|
||||
|
||||
<?php endforeach; ?>
|
||||
</tbody>
|
||||
</table>
|
||||
</div><!--//.card-body -->
|
||||
<div class="card-footer">
|
||||
|
||||
</div><!--//.card-footer -->
|
||||
</div><!--//.card -->
|
||||
</div><!--//.col -->
|
||||
</div><!--//.row -->
|
||||
</div><!--//.card-footer -->
|
||||
</div><!--//.card -->
|
||||
</div><!--//.col -->
|
||||
</div><!--//.row -->
|
||||
|
||||
<?=$this->endSection() ?>
|
||||
<?= $this->endSection() ?>
|
||||
@ -71,7 +71,7 @@
|
||||
aria-describedby="password"
|
||||
onclick="pass()"
|
||||
/>
|
||||
<span class="input-group-text cursor-pointer"><i class="ti ti-eye-off"></i></span>
|
||||
<span id="show_pass" class="input-group-text cursor-pointer"><i class="ti ti-eye-off"></i></span>
|
||||
</div>
|
||||
</div>
|
||||
<?php if($settings['remember_me']??false): ?>
|
||||
|
||||
@ -27,7 +27,7 @@
|
||||
<?=lang('Users.country') ?>*
|
||||
</label>
|
||||
|
||||
<select id="country" name="country" required class="form-control " style="width: 100%;" >
|
||||
<select id="country" name="country" required class="select2 form-control " style="width: 100%;" >
|
||||
<option value=""><?=lang('Basic.global.pleaseSelectA', [lang('Users.country')]) ?></option>
|
||||
|
||||
<?php foreach ($paisList as $item) : ?>
|
||||
@ -136,7 +136,7 @@
|
||||
<?=lang('Users.blocked') ?>*
|
||||
</label>
|
||||
<?php $id_select = old('blocked', $user->blocked);?>
|
||||
<select name="blocked" id="blocked" class="form-control">
|
||||
<select name="blocked" id="blocked" class="select2 form-control">
|
||||
<option value="0" <?= $id_select == "0" ? 'selected' : '' ?>><?=lang("User.user_non_blocked")?></option>
|
||||
<option value="1" <?= $id_select == "1" ? 'selected' : '' ?>><?=lang("User.user_blocked")?></option>
|
||||
</select>
|
||||
@ -147,7 +147,7 @@
|
||||
<?=lang('Users.emailConfirmed') ?>*
|
||||
</label>
|
||||
<?php $id_select = old('email_confirmed', $user->email_confirmed);?>
|
||||
<select name="email_confirmed" id="email_confirmed" class="form-control">
|
||||
<select name="email_confirmed" id="email_confirmed" class="select2 form-control">
|
||||
<option value="0" <?= $id_select == "0" ? 'selected' : '' ?>><?=lang("User.user_alert_not_confirmed")?></option>
|
||||
<option value="1" <?= $id_select == "1" ? 'selected' : '' ?>><?=lang("User.user_alert_confirmed")?></option>
|
||||
</select>
|
||||
|
||||
@ -14,18 +14,16 @@
|
||||
|
||||
|
||||
<!-- Vendors JS -->
|
||||
<script src="<?= site_url('themes/vuexy/vendor/libs/formvalidation/dist/js/FormValidation.min.js') ?>"></script>
|
||||
<script src="<?= site_url('themes/vuexy/vendor/libs/formvalidation/dist/js/plugins/Bootstrap5.min.js') ?>"></script>
|
||||
<script src="<?= site_url('themes/vuexy/vendor/libs/formvalidation/dist/js/plugins/AutoFocus.min.js') ?>"></script>
|
||||
<script src="<?= site_url('themes/vuexy/vendor/libs/toastr/toastr.min.js'); ?>"></script>
|
||||
|
||||
<!-- Main JS -->
|
||||
<script src="<?= site_url('themes/vuexy/js/main.js') ?>"></script>
|
||||
|
||||
<!-- Page JS -->
|
||||
<script src="<?= site_url('themes/vuexy/js/pages-auth.js') ?>"></script>
|
||||
|
||||
<!-- Custom JS -->
|
||||
<script src="<?= site_url('assets/js/login.js'); ?>"></script>
|
||||
|
||||
<?= toastAlert() ?>
|
||||
</body>
|
||||
</html>
|
||||
@ -57,8 +57,8 @@ if (!empty($token) && $tfa == false) {
|
||||
<link rel="manifest" href="<?= site_url('themes/vuexy/img/favicon/manifest.json') ?>">
|
||||
|
||||
<!-- Fonts -->
|
||||
<link rel="preconnect" href="https:/fonts.googleapis.com"/>
|
||||
<link rel="preconnect" href="https:/fonts.gstatic.com" crossorigin/>
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com"/>
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin/>
|
||||
<link
|
||||
href="https://fonts.googleapis.com/css2?family=Public+Sans:ital,wght@0,300;0,400;0,500;0,600;0,700;1,300;1,400;1,500;1,600;1,700&display=swap"
|
||||
rel="stylesheet"
|
||||
@ -78,6 +78,8 @@ if (!empty($token) && $tfa == false) {
|
||||
<link rel="stylesheet" href="<?= site_url('themes/vuexy/vendor/libs/perfect-scrollbar/perfect-scrollbar.css') ?>"/>
|
||||
<link rel="stylesheet" href="<?= site_url('themes/vuexy/vendor/libs/node-waves/node-waves.css') ?>"/>
|
||||
<link rel="stylesheet" href="<?= site_url('themes/vuexy/vendor/libs/typeahead-js/typeahead.css') ?>"/>
|
||||
<link rel="stylesheet" href="<?= site_url('themes/vuexy/vendor/libs/toastr/toastr.css') ?>"/>
|
||||
|
||||
<!-- Vendor -->
|
||||
<link rel="stylesheet"
|
||||
href="<?= site_url('themes/vuexy/vendor/libs/formvalidation/dist/css/formValidation.min.css') ?>"/>
|
||||
@ -91,9 +93,9 @@ if (!empty($token) && $tfa == false) {
|
||||
|
||||
<?php
|
||||
if ($settings['captcha_gateway'] == 'recaptcha') {
|
||||
echo "<script src='https:/www.google.com/recaptcha/api.js' async defer></script>";
|
||||
echo "<script src='https://www.google.com/recaptcha/api.js' async defer></script>";
|
||||
} else {
|
||||
echo "<script src='https:/www.hCaptcha.com/1/api.js' async defer></script>";
|
||||
echo "<script src='https://www.hCaptcha.com/1/api.js' async defer></script>";
|
||||
}
|
||||
?>
|
||||
</head>
|
||||
|
||||
@ -61,8 +61,8 @@ if (!empty($token) && $tfa == false) {
|
||||
<link rel="manifest" href="<?= site_url('themes/vuexy/img/favicon/manifest.json') ?>">
|
||||
|
||||
<!-- Fonts -->
|
||||
<link rel="preconnect" href="https:/fonts.googleapis.com"/>
|
||||
<link rel="preconnect" href="https:/fonts.gstatic.com" crossorigin/>
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com"/>
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin/>
|
||||
<link
|
||||
href="https://fonts.googleapis.com/css2?family=Public+Sans:ital,wght@0,300;0,400;0,500;0,600;0,700;1,300;1,400;1,500;1,600;1,700&display=swap"
|
||||
rel="stylesheet"
|
||||
@ -82,9 +82,6 @@ if (!empty($token) && $tfa == false) {
|
||||
<link rel="stylesheet" href="<?= site_url('themes/vuexy/vendor/libs/perfect-scrollbar/perfect-scrollbar.css') ?>"/>
|
||||
<link rel="stylesheet" href="<?= site_url('themes/vuexy/vendor/libs/node-waves/node-waves.css') ?>"/>
|
||||
<link rel="stylesheet" href="<?= site_url('themes/vuexy/vendor/libs/select2/select2.css') ?>"/>
|
||||
<link rel="stylesheet" href="<?= site_url('themes/vuexy/vendor/libs/tagify/tagify.css') ?>"/>
|
||||
<link rel="stylesheet" href="<?= site_url('themes/vuexy/vendor/libs/bootstrap-select/bootstrap-select.css') ?>"/>
|
||||
<link rel="stylesheet" href="<?= site_url('themes/vuexy/vendor/libs/typeahead-js/typeahead.css') ?>"/>
|
||||
|
||||
<!-- Page CSS -->
|
||||
|
||||
@ -402,32 +399,23 @@ if (!empty($token) && $tfa == false) {
|
||||
<script src="<?= site_url('themes/vuexy/vendor/js/bootstrap.js') ?>"></script>
|
||||
<script src="<?= site_url('themes/vuexy/vendor/libs/perfect-scrollbar/perfect-scrollbar.js') ?>"></script>
|
||||
<script src="<?= site_url('themes/vuexy/vendor/libs/node-waves/node-waves.js') ?>"></script>
|
||||
|
||||
<script src="<?= site_url('themes/vuexy/vendor/libs/hammer/hammer.js') ?>"></script>
|
||||
<!--<script src="--><?php //= site_url('themes/vuexy/vendor/libs/i18n/i18n.js') ?><!--"></script>-->
|
||||
<script src="<?= site_url('themes/vuexy/vendor/libs/typeahead-js/typeahead.js') ?>"></script>
|
||||
|
||||
<script src="<?= site_url('themes/vuexy/vendor/js/menu.js') ?>"></script>
|
||||
<!-- endbuild -->
|
||||
|
||||
<!-- Vendors JS -->
|
||||
<script src="<?= site_url('themes/vuexy/vendor/libs/select2/select2.js') ?>"></script>
|
||||
<script src="<?= site_url('themes/vuexy/vendor/libs/tagify/tagify.js') ?>"></script>
|
||||
<script src="<?= site_url('themes/vuexy/vendor/libs/bootstrap-select/bootstrap-select.js') ?>"></script>
|
||||
<script src="<?= site_url('themes/vuexy/vendor/libs/bloodhound/bloodhound.js') ?>"></script>
|
||||
|
||||
<!-- Main JS -->
|
||||
<script src="<?= site_url('themes/vuexy/js/main.js') ?>"></script>
|
||||
|
||||
<!-- Page JS -->
|
||||
|
||||
<script>
|
||||
'use strict';
|
||||
|
||||
$(function () {
|
||||
const selectPicker = $('.selectpicker'),
|
||||
select2 = $('.select2'),
|
||||
select2Icons = $('.select2-icons');
|
||||
select2 = $('.select2');
|
||||
|
||||
// Bootstrap Select
|
||||
// --------------------------------------------------------------------
|
||||
@ -448,324 +436,8 @@ if (!empty($token) && $tfa == false) {
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
// Select2 Icons
|
||||
if (select2Icons.length) {
|
||||
// custom template to render icons
|
||||
function renderIcons(option) {
|
||||
if (!option.id) {
|
||||
return option.text;
|
||||
}
|
||||
var $icon = "<i class='" + $(option.element).data('icon') + " me-2'></i>" + option.text;
|
||||
|
||||
return $icon;
|
||||
}
|
||||
select2Icons.wrap('<div class="position-relative"></div>').select2({
|
||||
templateResult: renderIcons,
|
||||
templateSelection: renderIcons,
|
||||
escapeMarkup: function (es) {
|
||||
return es;
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
(function () {
|
||||
// Basic
|
||||
//------------------------------------------------------
|
||||
const tagifyBasicEl = document.querySelector('#TagifyBasic');
|
||||
const TagifyBasic = new Tagify(tagifyBasicEl);
|
||||
|
||||
// Read only
|
||||
//------------------------------------------------------
|
||||
const tagifyReadonlyEl = document.querySelector('#TagifyReadonly');
|
||||
const TagifyReadonly = new Tagify(tagifyReadonlyEl);
|
||||
|
||||
// Custom list & inline suggestion
|
||||
//------------------------------------------------------
|
||||
const TagifyCustomInlineSuggestionEl = document.querySelector('#TagifyCustomInlineSuggestion');
|
||||
const TagifyCustomListSuggestionEl = document.querySelector('#TagifyCustomListSuggestion');
|
||||
|
||||
const whitelist = [
|
||||
'A# .NET',
|
||||
'A# (Axiom)',
|
||||
'A-0 System',
|
||||
'A+',
|
||||
'A++',
|
||||
'ABAP',
|
||||
'ABC',
|
||||
'ABC ALGOL',
|
||||
'ABSET',
|
||||
'ABSYS',
|
||||
'ACC',
|
||||
'Accent',
|
||||
'Ace DASL',
|
||||
'ACL2',
|
||||
'Avicsoft',
|
||||
'ACT-III',
|
||||
'Action!',
|
||||
'ActionScript',
|
||||
'Ada',
|
||||
'Adenine',
|
||||
'Agda',
|
||||
'Agilent VEE',
|
||||
'Agora',
|
||||
'AIMMS',
|
||||
'Alef',
|
||||
'ALF',
|
||||
'ALGOL 58',
|
||||
'ALGOL 60',
|
||||
'ALGOL 68',
|
||||
'ALGOL W',
|
||||
'Alice',
|
||||
'Alma-0',
|
||||
'AmbientTalk',
|
||||
'Amiga E',
|
||||
'AMOS',
|
||||
'AMPL',
|
||||
'Apex (Salesforce.com)',
|
||||
'APL',
|
||||
'AppleScript',
|
||||
'Arc',
|
||||
'ARexx',
|
||||
'Argus',
|
||||
'AspectJ',
|
||||
'Assembly language',
|
||||
'ATS',
|
||||
'Ateji PX',
|
||||
'AutoHotkey',
|
||||
'Autocoder',
|
||||
'AutoIt',
|
||||
'AutoLISP / Visual LISP',
|
||||
'Averest',
|
||||
'AWK',
|
||||
'Axum',
|
||||
'Active Server Pages',
|
||||
'ASP.NET'
|
||||
];
|
||||
// Inline
|
||||
let TagifyCustomInlineSuggestion = new Tagify(TagifyCustomInlineSuggestionEl, {
|
||||
whitelist: whitelist,
|
||||
maxTags: 10,
|
||||
dropdown: {
|
||||
maxItems: 20,
|
||||
classname: 'tags-inline',
|
||||
enabled: 0,
|
||||
closeOnSelect: false
|
||||
}
|
||||
});
|
||||
// List
|
||||
let TagifyCustomListSuggestion = new Tagify(TagifyCustomListSuggestionEl, {
|
||||
whitelist: whitelist,
|
||||
maxTags: 10,
|
||||
dropdown: {
|
||||
maxItems: 20,
|
||||
classname: '',
|
||||
enabled: 0,
|
||||
closeOnSelect: false
|
||||
}
|
||||
});
|
||||
|
||||
// Users List suggestion
|
||||
//------------------------------------------------------
|
||||
const TagifyUserListEl = document.querySelector('#TagifyUserList');
|
||||
|
||||
const usersList = [
|
||||
{
|
||||
value: 1,
|
||||
name: 'Justinian Hattersley',
|
||||
avatar: 'https://i.pravatar.cc/80?img=1',
|
||||
email: 'jhattersley0@ucsd.edu'
|
||||
},
|
||||
{
|
||||
value: 2,
|
||||
name: 'Antons Esson',
|
||||
avatar: 'https://i.pravatar.cc/80?img=2',
|
||||
email: 'aesson1@ning.com'
|
||||
},
|
||||
{
|
||||
value: 3,
|
||||
name: 'Ardeen Batisse',
|
||||
avatar: 'https://i.pravatar.cc/80?img=3',
|
||||
email: 'abatisse2@nih.gov'
|
||||
},
|
||||
{
|
||||
value: 4,
|
||||
name: 'Graeme Yellowley',
|
||||
avatar: 'https://i.pravatar.cc/80?img=4',
|
||||
email: 'gyellowley3@behance.net'
|
||||
},
|
||||
{
|
||||
value: 5,
|
||||
name: 'Dido Wilford',
|
||||
avatar: 'https://i.pravatar.cc/80?img=5',
|
||||
email: 'dwilford4@jugem.jp'
|
||||
},
|
||||
{
|
||||
value: 6,
|
||||
name: 'Celesta Orwin',
|
||||
avatar: 'https://i.pravatar.cc/80?img=6',
|
||||
email: 'corwin5@meetup.com'
|
||||
},
|
||||
{
|
||||
value: 7,
|
||||
name: 'Sally Main',
|
||||
avatar: 'https://i.pravatar.cc/80?img=7',
|
||||
email: 'smain6@techcrunch.com'
|
||||
},
|
||||
{
|
||||
value: 8,
|
||||
name: 'Grethel Haysman',
|
||||
avatar: 'https://i.pravatar.cc/80?img=8',
|
||||
email: 'ghaysman7@mashable.com'
|
||||
},
|
||||
{
|
||||
value: 9,
|
||||
name: 'Marvin Mandrake',
|
||||
avatar: 'https://i.pravatar.cc/80?img=9',
|
||||
email: 'mmandrake8@sourceforge.net'
|
||||
},
|
||||
{
|
||||
value: 10,
|
||||
name: 'Corrie Tidey',
|
||||
avatar: 'https://i.pravatar.cc/80?img=10',
|
||||
email: 'ctidey9@youtube.com'
|
||||
}
|
||||
];
|
||||
|
||||
function tagTemplate(tagData) {
|
||||
return `
|
||||
<tag title="${tagData.title || tagData.email}"
|
||||
contenteditable='false'
|
||||
spellcheck='false'
|
||||
tabIndex="-1"
|
||||
class="${this.settings.classNames.tag} ${tagData.class ? tagData.class : ''}"
|
||||
${this.getAttributes(tagData)}
|
||||
>
|
||||
<x title='' class='tagify__tag__removeBtn' role='button' aria-label='remove tag'></x>
|
||||
<div>
|
||||
<div class='tagify__tag__avatar-wrap'>
|
||||
<img onerror="this.style.visibility='hidden'" src="${tagData.avatar}">
|
||||
</div>
|
||||
<span class='tagify__tag-text'>${tagData.name}</span>
|
||||
</div>
|
||||
</tag>
|
||||
`;
|
||||
}
|
||||
|
||||
function suggestionItemTemplate(tagData) {
|
||||
return `
|
||||
<div ${this.getAttributes(tagData)}
|
||||
class='tagify__dropdown__item align-items-center ${tagData.class ? tagData.class : ''}'
|
||||
tabindex="0"
|
||||
role="option"
|
||||
>
|
||||
${
|
||||
tagData.avatar
|
||||
? `<div class='tagify__dropdown__item__avatar-wrap'>
|
||||
<img onerror="this.style.visibility='hidden'" src="${tagData.avatar}">
|
||||
</div>`
|
||||
: ''
|
||||
}
|
||||
<strong>${tagData.name}</strong>
|
||||
<span>${tagData.email}</span>
|
||||
</div>
|
||||
`;
|
||||
}
|
||||
|
||||
// initialize Tagify on the above input node reference
|
||||
let TagifyUserList = new Tagify(TagifyUserListEl, {
|
||||
tagTextProp: 'name', // very important since a custom template is used with this property as text. allows typing a "value" or a "name" to match input with whitelist
|
||||
enforceWhitelist: true,
|
||||
skipInvalid: true, // do not remporarily add invalid tags
|
||||
dropdown: {
|
||||
closeOnSelect: false,
|
||||
enabled: 0,
|
||||
classname: 'users-list',
|
||||
searchKeys: ['name', 'email'] // very important to set by which keys to search for suggesttions when typing
|
||||
},
|
||||
templates: {
|
||||
tag: tagTemplate,
|
||||
dropdownItem: suggestionItemTemplate
|
||||
},
|
||||
whitelist: usersList
|
||||
});
|
||||
|
||||
TagifyUserList.on('dropdown:show dropdown:updated', onDropdownShow);
|
||||
TagifyUserList.on('dropdown:select', onSelectSuggestion);
|
||||
|
||||
let addAllSuggestionsEl;
|
||||
|
||||
function onDropdownShow(e) {
|
||||
let dropdownContentEl = e.detail.tagify.DOM.dropdown.content;
|
||||
|
||||
if (TagifyUserList.suggestedListItems.length > 1) {
|
||||
addAllSuggestionsEl = getAddAllSuggestionsEl();
|
||||
|
||||
// insert "addAllSuggestionsEl" as the first element in the suggestions list
|
||||
dropdownContentEl.insertBefore(addAllSuggestionsEl, dropdownContentEl.firstChild);
|
||||
}
|
||||
}
|
||||
|
||||
function onSelectSuggestion(e) {
|
||||
if (e.detail.elm == addAllSuggestionsEl) TagifyUserList.dropdown.selectAll.call(TagifyUserList);
|
||||
}
|
||||
|
||||
// create an "add all" custom suggestion element every time the dropdown changes
|
||||
function getAddAllSuggestionsEl() {
|
||||
// suggestions items should be based on "dropdownItem" template
|
||||
return TagifyUserList.parseTemplate('dropdownItem', [
|
||||
{
|
||||
class: 'addAll',
|
||||
name: 'Add all',
|
||||
email:
|
||||
TagifyUserList.settings.whitelist.reduce(function (remainingSuggestions, item) {
|
||||
return TagifyUserList.isTagDuplicate(item.value) ? remainingSuggestions : remainingSuggestions + 1;
|
||||
}, 0) + ' Members'
|
||||
}
|
||||
]);
|
||||
}
|
||||
|
||||
// Email List suggestion
|
||||
//------------------------------------------------------
|
||||
// generate random whitelist items (for the demo)
|
||||
let randomStringsArr = Array.apply(null, Array(100)).map(function () {
|
||||
return (
|
||||
Array.apply(null, Array(~~(Math.random() * 10 + 3)))
|
||||
.map(function () {
|
||||
return String.fromCharCode(Math.random() * (123 - 97) + 97);
|
||||
})
|
||||
.join('') + '@gmail.com'
|
||||
);
|
||||
});
|
||||
|
||||
const TagifyEmailListEl = document.querySelector('#TagifyEmailList'),
|
||||
TagifyEmailList = new Tagify(TagifyEmailListEl, {
|
||||
// email address validation (https://stackoverflow.com/a/46181/104380)
|
||||
pattern:
|
||||
/^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/,
|
||||
whitelist: randomStringsArr,
|
||||
callbacks: {
|
||||
invalid: onInvalidTag
|
||||
},
|
||||
dropdown: {
|
||||
position: 'text',
|
||||
enabled: 1 // show suggestions dropdown after 1 typed character
|
||||
}
|
||||
}),
|
||||
button = TagifyEmailListEl.nextElementSibling; // "add new tag" action-button
|
||||
|
||||
button.addEventListener('click', onAddButtonClick);
|
||||
|
||||
function onAddButtonClick() {
|
||||
TagifyEmailList.addEmptyTag();
|
||||
}
|
||||
|
||||
function onInvalidTag(e) {
|
||||
console.log('invalid', e.detail);
|
||||
}
|
||||
})();
|
||||
|
||||
</script>
|
||||
|
||||
|
||||
|
||||
@ -137,237 +137,6 @@ if (!empty($token) && $tfa == false) {
|
||||
<i class="ti ti-bell ti-md"></i>
|
||||
<span class="badge bg-danger rounded-pill badge-notifications">5</span>
|
||||
</a>
|
||||
<ul class="dropdown-menu dropdown-menu-end py-0">
|
||||
<li class="dropdown-menu-header border-bottom">
|
||||
<div class="dropdown-header d-flex align-items-center py-3">
|
||||
<h5 class="text-body mb-0 me-auto">Notification</h5>
|
||||
<a
|
||||
href="javascript:void(0)"
|
||||
class="dropdown-notifications-all text-body"
|
||||
data-bs-toggle="tooltip"
|
||||
data-bs-placement="top"
|
||||
title="Mark all as read"
|
||||
><i class="ti ti-mail-opened fs-4"></i
|
||||
></a>
|
||||
</div>
|
||||
</li>
|
||||
<li class="dropdown-notifications-list scrollable-container">
|
||||
<ul class="list-group list-group-flush">
|
||||
<li class="list-group-item list-group-item-action dropdown-notifications-item">
|
||||
<div class="d-flex">
|
||||
<div class="flex-shrink-0 me-3">
|
||||
<div class="avatar">
|
||||
<img src="../../assets/img/avatars/1.png" alt class="h-auto rounded-circle" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex-grow-1">
|
||||
<h6 class="mb-1">Congratulation Lettie 🎉</h6>
|
||||
<p class="mb-0">Won the monthly best seller gold badge</p>
|
||||
<small class="text-muted">1h ago</small>
|
||||
</div>
|
||||
<div class="flex-shrink-0 dropdown-notifications-actions">
|
||||
<a href="javascript:void(0)" class="dropdown-notifications-read"
|
||||
><span class="badge badge-dot"></span
|
||||
></a>
|
||||
<a href="javascript:void(0)" class="dropdown-notifications-archive"
|
||||
><span class="ti ti-x"></span
|
||||
></a>
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
<li class="list-group-item list-group-item-action dropdown-notifications-item">
|
||||
<div class="d-flex">
|
||||
<div class="flex-shrink-0 me-3">
|
||||
<div class="avatar">
|
||||
<span class="avatar-initial rounded-circle bg-label-danger">CF</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex-grow-1">
|
||||
<h6 class="mb-1">Charles Franklin</h6>
|
||||
<p class="mb-0">Accepted your connection</p>
|
||||
<small class="text-muted">12hr ago</small>
|
||||
</div>
|
||||
<div class="flex-shrink-0 dropdown-notifications-actions">
|
||||
<a href="javascript:void(0)" class="dropdown-notifications-read"
|
||||
><span class="badge badge-dot"></span
|
||||
></a>
|
||||
<a href="javascript:void(0)" class="dropdown-notifications-archive"
|
||||
><span class="ti ti-x"></span
|
||||
></a>
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
<li class="list-group-item list-group-item-action dropdown-notifications-item marked-as-read">
|
||||
<div class="d-flex">
|
||||
<div class="flex-shrink-0 me-3">
|
||||
<div class="avatar">
|
||||
<img src="../../assets/img/avatars/2.png" alt class="h-auto rounded-circle" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex-grow-1">
|
||||
<h6 class="mb-1">New Message ✉️</h6>
|
||||
<p class="mb-0">You have new message from Natalie</p>
|
||||
<small class="text-muted">1h ago</small>
|
||||
</div>
|
||||
<div class="flex-shrink-0 dropdown-notifications-actions">
|
||||
<a href="javascript:void(0)" class="dropdown-notifications-read"
|
||||
><span class="badge badge-dot"></span
|
||||
></a>
|
||||
<a href="javascript:void(0)" class="dropdown-notifications-archive"
|
||||
><span class="ti ti-x"></span
|
||||
></a>
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
<li class="list-group-item list-group-item-action dropdown-notifications-item">
|
||||
<div class="d-flex">
|
||||
<div class="flex-shrink-0 me-3">
|
||||
<div class="avatar">
|
||||
<span class="avatar-initial rounded-circle bg-label-success"
|
||||
><i class="ti ti-shopping-cart"></i
|
||||
></span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex-grow-1">
|
||||
<h6 class="mb-1">Whoo! You have new order 🛒</h6>
|
||||
<p class="mb-0">ACME Inc. made new order $1,154</p>
|
||||
<small class="text-muted">1 day ago</small>
|
||||
</div>
|
||||
<div class="flex-shrink-0 dropdown-notifications-actions">
|
||||
<a href="javascript:void(0)" class="dropdown-notifications-read"
|
||||
><span class="badge badge-dot"></span
|
||||
></a>
|
||||
<a href="javascript:void(0)" class="dropdown-notifications-archive"
|
||||
><span class="ti ti-x"></span
|
||||
></a>
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
<li class="list-group-item list-group-item-action dropdown-notifications-item marked-as-read">
|
||||
<div class="d-flex">
|
||||
<div class="flex-shrink-0 me-3">
|
||||
<div class="avatar">
|
||||
<img src="../../assets/img/avatars/9.png" alt class="h-auto rounded-circle" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex-grow-1">
|
||||
<h6 class="mb-1">Application has been approved 🚀</h6>
|
||||
<p class="mb-0">Your ABC project application has been approved.</p>
|
||||
<small class="text-muted">2 days ago</small>
|
||||
</div>
|
||||
<div class="flex-shrink-0 dropdown-notifications-actions">
|
||||
<a href="javascript:void(0)" class="dropdown-notifications-read"
|
||||
><span class="badge badge-dot"></span
|
||||
></a>
|
||||
<a href="javascript:void(0)" class="dropdown-notifications-archive"
|
||||
><span class="ti ti-x"></span
|
||||
></a>
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
<li class="list-group-item list-group-item-action dropdown-notifications-item marked-as-read">
|
||||
<div class="d-flex">
|
||||
<div class="flex-shrink-0 me-3">
|
||||
<div class="avatar">
|
||||
<span class="avatar-initial rounded-circle bg-label-success"
|
||||
><i class="ti ti-chart-pie"></i
|
||||
></span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex-grow-1">
|
||||
<h6 class="mb-1">Monthly report is generated</h6>
|
||||
<p class="mb-0">July monthly financial report is generated</p>
|
||||
<small class="text-muted">3 days ago</small>
|
||||
</div>
|
||||
<div class="flex-shrink-0 dropdown-notifications-actions">
|
||||
<a href="javascript:void(0)" class="dropdown-notifications-read"
|
||||
><span class="badge badge-dot"></span
|
||||
></a>
|
||||
<a href="javascript:void(0)" class="dropdown-notifications-archive"
|
||||
><span class="ti ti-x"></span
|
||||
></a>
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
<li class="list-group-item list-group-item-action dropdown-notifications-item marked-as-read">
|
||||
<div class="d-flex">
|
||||
<div class="flex-shrink-0 me-3">
|
||||
<div class="avatar">
|
||||
<img src="../../assets/img/avatars/5.png" alt class="h-auto rounded-circle" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex-grow-1">
|
||||
<h6 class="mb-1">Send connection request</h6>
|
||||
<p class="mb-0">Peter sent you connection request</p>
|
||||
<small class="text-muted">4 days ago</small>
|
||||
</div>
|
||||
<div class="flex-shrink-0 dropdown-notifications-actions">
|
||||
<a href="javascript:void(0)" class="dropdown-notifications-read"
|
||||
><span class="badge badge-dot"></span
|
||||
></a>
|
||||
<a href="javascript:void(0)" class="dropdown-notifications-archive"
|
||||
><span class="ti ti-x"></span
|
||||
></a>
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
<li class="list-group-item list-group-item-action dropdown-notifications-item">
|
||||
<div class="d-flex">
|
||||
<div class="flex-shrink-0 me-3">
|
||||
<div class="avatar">
|
||||
<img src="../../assets/img/avatars/6.png" alt class="h-auto rounded-circle" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex-grow-1">
|
||||
<h6 class="mb-1">New message from Jane</h6>
|
||||
<p class="mb-0">Your have new message from Jane</p>
|
||||
<small class="text-muted">5 days ago</small>
|
||||
</div>
|
||||
<div class="flex-shrink-0 dropdown-notifications-actions">
|
||||
<a href="javascript:void(0)" class="dropdown-notifications-read"
|
||||
><span class="badge badge-dot"></span
|
||||
></a>
|
||||
<a href="javascript:void(0)" class="dropdown-notifications-archive"
|
||||
><span class="ti ti-x"></span
|
||||
></a>
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
<li class="list-group-item list-group-item-action dropdown-notifications-item marked-as-read">
|
||||
<div class="d-flex">
|
||||
<div class="flex-shrink-0 me-3">
|
||||
<div class="avatar">
|
||||
<span class="avatar-initial rounded-circle bg-label-warning"
|
||||
><i class="ti ti-alert-triangle"></i
|
||||
></span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex-grow-1">
|
||||
<h6 class="mb-1">CPU is running high</h6>
|
||||
<p class="mb-0">CPU Utilization Percent is currently at 88.63%,</p>
|
||||
<small class="text-muted">5 days ago</small>
|
||||
</div>
|
||||
<div class="flex-shrink-0 dropdown-notifications-actions">
|
||||
<a href="javascript:void(0)" class="dropdown-notifications-read"
|
||||
><span class="badge badge-dot"></span
|
||||
></a>
|
||||
<a href="javascript:void(0)" class="dropdown-notifications-archive"
|
||||
><span class="ti ti-x"></span
|
||||
></a>
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li class="dropdown-menu-footer border-top">
|
||||
<a
|
||||
href="javascript:void(0);"
|
||||
class="dropdown-item d-flex justify-content-center text-primary p-2 h-px-40 mb-1 align-items-center"
|
||||
>
|
||||
View all notifications
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
<!--/ Notification -->
|
||||
|
||||
|
||||
@ -6,5 +6,5 @@ datos web guard:
|
||||
email admin: jajaime.jim@gmail.com
|
||||
password: 1234
|
||||
|
||||
FTP SK-IMN: Kqd1s#917
|
||||
FTP SK-IMN: pjS9~l138
|
||||
|
||||
|
||||
@ -9,10 +9,10 @@ function pass(){
|
||||
"use strict";
|
||||
if(document.getElementById('password').type === 'text'){
|
||||
document.getElementById('password').type = 'password';
|
||||
document.getElementById('btn_pass').innerHTML = '<i class="far fa-eye"></i>';
|
||||
document.getElementById('show_pass').innerHTML = '<i class="ti ti-eye"></i>';
|
||||
}else{
|
||||
document.getElementById('password').type = 'text';
|
||||
document.getElementById('btn_pass').innerHTML = '<i class="far fa-eye-slash"></i>';
|
||||
document.getElementById('show_pass').innerHTML = '<i class="ti ti-eye-off"></i>';
|
||||
}
|
||||
}
|
||||
function accepted(){
|
||||
|
||||
2
httpdocs/themes/vuexy/vendor/libs/toastr/toastr.min.js
vendored
Normal file
2
httpdocs/themes/vuexy/vendor/libs/toastr/toastr.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user