Completada visualizacion y traduccion de roles y permisos

This commit is contained in:
imnavajas
2024-05-05 21:52:42 +02:00
parent c152cf699d
commit 122e194b16
14 changed files with 283 additions and 540 deletions

View File

@ -1,25 +0,0 @@
<?php
namespace App\Controllers\Configuracion;
use App\Controllers\BaseController;
class Calendario extends BaseController
{
function __construct()
{
}
public function index()
{
echo 'Calendario';
}
public function edit()
{
}
}

View File

@ -3,6 +3,7 @@
use App\Models\Usuarios\GroupModel;
use App\Models\Usuarios\GroupsUsersModel;
use App\Models\Usuarios\PermisosModel;
class Group extends \App\Controllers\GoBaseController
{
@ -24,9 +25,14 @@ class Group extends \App\Controllers\GoBaseController
public function initController(\CodeIgniter\HTTP\RequestInterface $request, \CodeIgniter\HTTP\ResponseInterface $response, \Psr\Log\LoggerInterface $logger)
{
$this->viewData['pageTitle'] = lang('Group.moduleTitle');
self::$viewPath = getenv('theme.path') . 'form/group/';
// Breadcrumbs
$this->viewData['breadcrumb'] = [
['title' => "Home", 'route' => "javascript:void(0);", 'active' => false],
['title' => lang("App.menu_permission_group"), 'route' => site_url("configuracion/group"), 'active' => true]
];
parent::initController($request, $response, $logger);
}
@ -47,46 +53,35 @@ class Group extends \App\Controllers\GoBaseController
if ($this->request->getPost()) :
$nullIfEmpty = true; // !(phpversion() >= '8.1');
$postData = $this->request->getPost();
$temp_data['id'] = $groupEntity->id;
$temp_data['name'] = $postData['name'];
$temp_data['description'] = $postData['description'];
$name = $postData['name'];
unset($postData['name']);
// Clear not rules fields
unset($postData['safekat_token']);
unset($postData['id']);
unset($postData['name']);
unset($postData['description']);
unset($postData['save']);
unset($postData['selectAll']);
$controller = null;
$rules_access = null;
$rules_access = [];
foreach ($postData as $key => $value) {
$exp = explode('_', $key);
$controller[] = $exp[0];
}
if ($controller != null) {
foreach (array_unique($controller) as $item) {
$rules_access[$item] = [];
foreach ($postData as $key => $value) {
$exp = explode('_', $key);
if ($exp[0] == $item) {
array_push($rules_access[$item], str_replace($exp[0] . '_', '', $key));
}
}
if (!isset($rules_access[$exp[0]])) {
$rules_access[$exp[0]] = [];
}
array_push($rules_access[$exp[0]], str_replace($exp[0] . '_', '', $key));
}
$temp_data['rules'] = json_encode($rules_access ?? '{}');
$temp_data['name'] = $name;
$sanitizedData = $this->sanitized($temp_data, $nullIfEmpty);
$sanitizedData = $this->sanitized($temp_data, true);
$noException = true;
if ($successfulResult = $this->canValidate()) : // if ($successfulResult = $this->validate($this->formValidationRules) ) :
if ($successfulResult = $this->canValidate()) :
if ($this->canValidate()) :
try {
@ -123,9 +118,8 @@ class Group extends \App\Controllers\GoBaseController
endif; // ($requestMethod === 'post')
$this->viewData['group'] = isset($sanitizedData) ? new GroupModel($sanitizedData) : new GroupModel();
$this->viewData['permisos'] = (new PermisosModel())->find();
$this->viewData['formAction'] = route_to('createGroup');
$this->viewData['boxTitle'] = lang('Basic.global.addNew') . ' ' . lang('Group.moduleTitle') . ' ' . lang('Basic.global.addNewSuffix');
return $this->displayForm(__METHOD__);
}
@ -135,7 +129,6 @@ class Group extends \App\Controllers\GoBaseController
{
helper('general');
$session = session();
if ($requestedId == null) :
return $this->redirect2listView();
@ -148,49 +141,37 @@ class Group extends \App\Controllers\GoBaseController
return $this->redirect2listView('errorMessage', $message);
endif;
if ($this->request->getPost()) :
$nullIfEmpty = true; // !(phpversion() >= '8.1');
$postData = $this->request->getPost();
$id_group = $groupEntity->id;
$name = $postData['name'];
$temp_data['id'] = $groupEntity->id;
$temp_data['name'] = $postData['name'];
$temp_data['description'] = $postData['description'];
// Clear not rules fields
unset($postData['safekat_token']);
unset($postData['id']);
unset($postData['name']);
unset($postData['description']);
unset($postData['save']);
unset($postData['selectAll']);
$controller = null;
$rules_access = null;
$rules_access = [];
foreach ($postData as $key => $value) {
$exp = explode('_', $key);
$controller[] = $exp[0];
}
if ($controller != null) {
foreach (array_unique($controller) as $item) {
$rules_access[$item] = [];
foreach ($postData as $key => $value) {
$exp = explode('_', $key);
if ($exp[0] == $item) {
array_push($rules_access[$item], str_replace($exp[0] . '_', '', $key));
}
}
if (!isset($rules_access[$exp[0]])) {
$rules_access[$exp[0]] = [];
}
array_push($rules_access[$exp[0]], str_replace($exp[0] . '_', '', $key));
}
$temp_data['id'] = $id_group;
$temp_data['rules'] = json_encode($rules_access ?? '{}');
$temp_data['name'] = $name;
$sanitizedData = $this->sanitized($temp_data, $nullIfEmpty);
$sanitizedData = $this->sanitized($temp_data, true);
$noException = true;
if ($successfulResult = $this->canValidate()) : // if ($successfulResult = $this->validate($this->formValidationRules) ) :
if ($successfulResult = $this->canValidate()) :
if ($this->canValidate()) :
try {
@ -209,13 +190,11 @@ class Group extends \App\Controllers\GoBaseController
$thenRedirect = false;
endif;
if ($noException && $successfulResult) :
$id = $groupEntity->id ?? $id;
$message = lang('Basic.global.updateSuccess', [lang('Basic.global.record')]) . '.';
if ($session->get('group') == $this->request->getPost('token')) {
$session->set('rules', $temp_data['rules']);
}
if ($thenRedirect) :
if (!empty($this->indexRoute)) :
return redirect()->to(route_to($this->indexRoute))->with('successMessage', $message);
@ -230,9 +209,8 @@ class Group extends \App\Controllers\GoBaseController
endif; // ($requestMethod === 'post')
$this->viewData['group'] = $groupEntity;
$this->viewData['permisos'] = (new PermisosModel())->find();
$this->viewData['formAction'] = route_to('updateGroup', $id);
$this->viewData['boxTitle'] = lang('Basic.global.edit2') . ' ' . lang('Group.userGroup') . ' ' . lang('Basic.global.edit3');
return $this->displayForm(__METHOD__, $id);
} // end function edit(...)

View File

@ -3,10 +3,11 @@ namespace App\Entities\Usuarios;
use CodeIgniter\Entity;
class UserGroupEntity extends \CodeIgniter\Entity\Entity
class GroupEntity extends \CodeIgniter\Entity\Entity
{
protected $attributes = [
"id" => null,
"keyword" => null,
"name" => null,
"description" => null,
"rules" => null,

View File

@ -0,0 +1,20 @@
<?php
namespace App\Entities\Usuarios;
use CodeIgniter\Entity;
class PermisosEntity extends \CodeIgniter\Entity\Entity
{
protected $attributes = [
"id" => null,
"keyword" => null,
"name" => null,
"description" => null,
"rules" => null,
"created_at" => null,
"updated_at" => null,
];
protected $casts = [
"rules" => "json",
];
}

View File

@ -1,56 +0,0 @@
<?php
return [
'createdAt' => 'Creado en',
'dashboard' => 'Panel',
'group_grid_dashboard' => 'Panel',
'idGroup' => 'ID Rol',
'moduleTitle' => 'Roles y Permisos',
'rules' => 'Reglas',
'title' => 'Nombre',
'group_grid_title' => 'Nombre',
'token' => 'Token',
'updatedAt' => 'Actualizado en',
'groups' => 'Roles y Permisos',
'Group' => 'Rol y Permisos',
'userGroup' => 'Rol y Permisos',
'group' => 'Rol y Permisos',
'grouplist' => 'Lista Roles y Permisos',
'Groups' => 'Roles y Permisos',
'validation' => [
'id_group' => [
'max_length' => 'El campo {field} no puede exceder {param} caracteres en longitud.',
],
'dashboard' => [
'max_length' => 'El campo {field} no puede exceder {param} caracteres en longitud.',
'required' => 'El campo {field} es obligatorio.',
],
'rules' => [
'max_length' => 'El campo {field} no puede exceder {param} caracteres en longitud.',
'required' => 'El campo {field} es obligatorio.',
],
'title' => [
'max_length' => 'El campo {field} no puede exceder {param} caracteres en longitud.',
'required' => 'El campo {field} es obligatorio.',
],
'token' => [
'max_length' => 'El campo {field} no puede exceder {param} caracteres en longitud.',
'required' => 'El campo {field} es obligatorio.',
],
],
];

View File

@ -0,0 +1,65 @@
<?php
return [
'pageTitle' => 'Roles y Permisos',
'name' => 'Nombre del Grupo',
'rules' => 'Reglas',
'createdAt' => 'Creado en',
'updatedAt' => 'Actualizado en',
'addRol' => 'Añadir rol si no existe',
'totalUsers' => ' usuarios en total',
'editRol' => 'Editar Rol',
'rolName' => 'Nombre del Rol',
'rolDescription' => 'Descripción del Rol',
'rolPermissions' => 'Permisos del Rol',
'selectAll' => 'Seleccionar todos',
'adminRol' => 'Rol de Administrador',
'adminRolTooltip' => 'Permitir acceso completo al sistema',
// System permissions
'createPermission' => 'Crear',
'editPermission' => 'Editar',
'deletePermission' => 'Eliminar',
// System sections
'clientesSection' => 'Clientes',
'plantillaTarifaSection' => 'Plantilla de tarifas',
'presupuestoSection' => 'Presupuestos',
'tarifaPreimpresionSection' => 'Tarifas de preimpresión',
'tarifaManipuladoSection' => 'Tarifas de manipulado',
'tarifaAcabadoSection' => 'Tarifas de acabado',
'tarifaEncuadernacionSection' => 'Tarifas de encuadernación',
'tarifaEnvioSection' => 'Tarifas de envio',
'proveedoresSection' => 'Proveedores',
'ajustesSection' => 'Ajustes',
'actividadSection' => 'Accesos',
'validation' => [
'id' => [
'max_length' => 'El campo {field} no puede exceder {param} caracteres en longitud.',
],
'keyword' => [
'max_length' => 'El campo {field} no puede exceder {param} caracteres en longitud.',
'required' => 'El campo {field} es obligatorio.',
],
'name' => [
'max_length' => 'El campo {field} no puede exceder {param} caracteres en longitud.',
'required' => 'El campo {field} es obligatorio.',
],
'description' => [
'max_length' => 'El campo {field} no puede exceder {param} caracteres en longitud.',
'required' => 'El campo {field} es obligatorio.',
],
'rules' => [
'max_length' => 'El campo {field} no puede exceder {param} caracteres en longitud.',
'required' => 'El campo {field} es obligatorio.',
],
],
];

View File

@ -30,15 +30,15 @@ class GroupModel extends \App\Models\BaseModel
7 => "t1.updated_at",
];
protected $allowedFields = ["id", "name", "description", "rules"];
protected $returnType = "App\Entities\Usuarios\UserGroupEntity";
protected $allowedFields = ["id", "keyword", "name", "description", "rules"];
protected $returnType = "App\Entities\Usuarios\GroupEntity";
public static $labelField = "name";
protected $validationRules = [
"description" => [
"label" => "UserGroups.description",
"rules" => "required|max_length[150]",
"rules" => "max_length[150]",
],
"name" => [
"label" => "UserGroups.name",

View File

@ -1,16 +0,0 @@
<?php
namespace App\Models\Usuarios;
use App\Models\BaseModel;
class GroupsUsersModel extends BaseModel
{
protected $table = 'auth_groups_users';
protected $allowedFields = [ ];
public function getUsersWithRol($token_group){
$result = $this->select('token_user')->where('token_group', $token_group)->countAllResults();
return $result;
}
}

View File

@ -0,0 +1,92 @@
<?php
namespace App\Models\Usuarios;
class PermisosModel extends \App\Models\BaseModel
{
protected $table = "auth_permissions";
/**
* Whether primary key uses auto increment.
*
* @var bool
*/
protected $useAutoIncrement = true;
protected $primaryKey = "id";
protected $useTimestamps = true;
protected $dateFormat = 'datetime';
protected $createdField = 'created_at';
protected $updatedField = 'updated_at';
const SORTABLE = [
1 => "t1.id",
2 => "t1.keyword",
3 => "t1.name",
4 => "t1.description",
5 => "t1.rules",
6 => "t1.created_at",
7 => "t1.updated_at",
];
protected $allowedFields = ["id", "keyword", "name", "description", "rules"];
protected $returnType = "App\Entities\Usuarios\PermisosEntity";
public static $labelField = "name";
protected $validationRules = [
"description" => [
"label" => "UserGroups.description",
"rules" => "max_length[150]",
],
"name" => [
"label" => "UserGroups.name",
"rules" => "required|max_length[50]",
],
];
protected $validationMessages = [
"description" => [
"max_length" => "UserGroups.validation.description.max_length",
"required" => "UserGroups.validation.description.required",
],
"name" => [
"max_length" => "UserGroups.validation.name.max_length",
"required" => "UserGroups.validation.name.required",
],
];
/**
* Get resource data.
*
* @param string $search
*
* @return \CodeIgniter\Database\BaseBuilder
*/
public function getResource(string $search = "")
{
$builder = $this->db
->table($this->table . " t1")
->select(
"t1.id AS id, t1.keyword AS keyword, t1.name AS name, t1.description AS description, t1.rules AS rules,
t1.token AS token, t1.created_at AS created_at, t1.updated_at AS updated_at"
);
return empty($search)
? $builder
: $builder
->groupStart()
->like("t1.id", $search)
->orLike("t1.keyword", $search)
->orLike("t1.name", $search)
->orLike("t1.description", $search)
->orLike("t1.rules", $search)
->orLike("t1.created_at", $search)
->orLike("t1.updated_at", $search)
->groupEnd();
}
}

View File

@ -6,7 +6,7 @@
<div class="row">
<div class="col-12">
<div class="card card-info">
<h3 class="card-header"><?= $boxTitle ?? $pageTitle ?></h3>
<h3 class="card-header"><?= lang("RolesPermisos.editRol") ?></h3>
<div class="card-body">
<?= formAlert() ?>
<form id="groupForm" method="post" class="card-body" action="<?= $formAction ?>">
@ -14,79 +14,81 @@
<div class="row g-3">
<input type="hidden"
name="id_group"
name="id"
value="<?= old('id', $group->id) ?>"
>
<div class="col-md-6">
<div class="col-md-4">
<label for="title" class="form-label text-dark">
<?= lang("App.group_field_title") ?>
<?= lang("RolesPermisos.rolName") ?>
</label>
<input type="text" name="name" id="name" class="form-control"
value="<?= old('name', $group->name) ?>">
</div>
</div>
<div class="row g-3 mt-3">
<div class="col-md-6">
<button type="button" name="select_all"
id="select_all"
class="btn btn-primary me-sm-3 me-1">
<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-secondary ">
<i class="la la-toggle-off"></i> <?= lang("App.group_btn_remove") ?>
</button>
<div class="col-md-8">
<label for="description" class="form-label text-dark">
<?= lang("RolesPermisos.rolDescription") ?>
</label>
<input type="text" name="description" id="description" class="form-control"
value="<?= old('description', $group->description) ?>">
</div>
</div>
<div class="row g-3 mt-3">
<div class="col-md-12">
<h5>Role Permissions</h5>
<h5><?= lang("RolesPermisos.rolPermissions") ?></h5>
<!-- Permission table -->
<div class="table-responsive">
<table class="table table-flush-spacing">
<tbody>
<tr>
<td class="text-nowrap fw-semibold">
Recurso
<td class="text-nowrap fw-semibold" colspan="1">
<?= lang("RolesPermisos.adminRol") ?>
<i class="ti ti-info-circle" data-bs-toggle="tooltip"
data-bs-placement="top"
aria-label="<?= lang("RolesPermisos.adminRolTooltip") ?>"
data-bs-original-title="<?= lang("RolesPermisos.adminRolTooltip") ?>">
</i>
</td>
<td colspan="3">
<div class="form-check">
<input class="form-check-input" type="checkbox" name="selectAll">
<label class="form-check-label" for="selectAll">
<?= lang("RolesPermisos.selectAll") ?>
</label>
</div>
</td>
<td>
<div class="form-check">
<input type="checkbox"
id="recurso_name"
name="recurso_name"
class="form-check-input"
checked
>
<label for="recurso_name"
class="form-check-label">Permiso</label>
</div>
</td>
</tr>
<?php /*foreach (getAllClass() as $item): ?>
<?php if (empty($item['path'])): ?>
<?php foreach ($permisos as $permiso): ?>
<tr>
<td colspan="4" class="text-nowrap fw-semibold">
<?= $permiso->name ?>
</td>
</tr>
<?php foreach ($permiso->rules as $key => $rules): ?>
<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"
<?= ruleIsChecked($group->rules, $item['name'], $subitem) ? 'checked' : '' ?>
>
<label for="<?= $item['name'] . '_' . $subitem ?>"
class="form-check-label"><?= getDictionary($subitem) ?></label>
</div>
</td>
<?php endif; ?>
<td class="text-nowrap fw-semibold" >
&emsp;&emsp;<?= lang("RolesPermisos." . $key . "Section") ?>
</td>
<?php foreach ($rules as $rule): ?>
<td>
<div class="form-check">
<input type="checkbox"
id="<?= $key . '_' . $rule ?>"
name="<?= $key . '_' . $rule ?>"
class="form-check-input"
<?= ruleIsChecked($group->rules, $key, $rule) ? 'checked' : '' ?>
>
<label for="<?= $key . '_' . $rule ?>" class="form-check-label">
<?= lang("RolesPermisos." . $rule . "Permission") ?>
</label>
</div>
</td>
<?php endforeach; ?>
</tr>
<?php endif; ?>
<?php endforeach; */?>
<?php endforeach;
endforeach;
?>
</tbody>
</table>
</div>
@ -109,15 +111,12 @@
<?= $this->section('additionalInlineJs') ?>
$('#select_all').on('click', function () {
$(':checkbox').each(function() {
this.checked = true;
});
});
$('#remove_all').on('click', function () {
$(':checkbox').each(function() {
this.checked = false;
$('input[name="selectAll"]').click(function() {
var checkedStatus = this.checked;
$('input[type="checkbox"]').each(function() {
this.checked = checkedStatus;
});
});
<?= $this->endSection() ?>

View File

@ -5,7 +5,7 @@
<div class="col-md-12">
<div class="card card-info">
<div class="card-header">
<h3 class="card-title"><?= lang('Group.grouplist') ?></h3>
<h3 class="card-title"><?= lang('RolesPermisos.pageTitle') ?></h3>
</div><!--//.card-header -->
<div class="card-body">
<div class="container-xxl flex-grow-1 container-p-y">
@ -31,7 +31,7 @@
>
<?= lang('Basic.global.addNew') ?>
</button>
<p class="mb-0 mt-1">Añadir rol si no existe</p>
<p class="mb-0 mt-1"><?= lang("RolesPermisos.addRol") ?></p>
</div>
</div>
</div>
@ -43,7 +43,7 @@
<div class="card">
<div class="card-body">
<div class="d-flex justify-content-between">
<h6 class="fw-normal mb-2"><?= $model->getUsersWithRol($item->keyword); ?> usuarios en total</h6>
<h6 class="fw-normal mb-2"><?= $model->getUsersWithRol($item->keyword); ?><?= lang("RolesPermisos.totalUsers") ?></h6>
</div>
<div class="d-flex justify-content-between align-items-end mt-1">
<div class="role-heading">

View File

@ -1,166 +0,0 @@
<!--Style-->
<link href="<?=site_url("themes/focus2/vendor/summernote/summernote.css")?>" rel="stylesheet">
<!--Content Body-->
<div class="content-body">
<div class="container-fluid">
<div class="row page-titles mx-0">
<div class="col-sm-6 p-md-0">
<div class="welcome-text">
<h4><i class="<?= $title['icon']??'' ?>"></i> <?= $title['module']??'' ?></h4>
<span class="ml-1"><?= $title['page']??'' ?></span>
</div>
</div>
<div class="col-sm-6 p-md-0 justify-content-sm-end mt-2 mt-sm-0 d-flex">
<ol class="breadcrumb">
<?php foreach ($breadcrumb??[] as $item) : ?>
<?php if (!$item['active']) : ?>
<li class="breadcrumb-item"><a href="<?= site_url($item['route']) ?>"><?= $item['title'] ?></a></li>
<?php else : ?>
<li class="breadcrumb-item active"><?= $item['title'] ?></li>
<?php endif; ?>
<?php endforeach; ?>
</ol>
</div>
</div>
<div class="row">
<div class="col-12">
<div class="card">
<div class="card-header">
<div class="row mx-0" style="width: 100%;">
<div class="col-sm-6 p-md-0">
<h4 class="card-title"><?= $title['page']??'' ?></h4>
</div>
<div class="col-sm-6 p-md-0 justify-content-sm-end mt-2 mt-sm-0 d-flex">
<button type="button" class="btn btn-sm btn-secondary" data-toggle="modal" data-target="#tagModalCenter" title="<?=lang("App.template_label_tag")?>">
<i class="fas fa-tags"></i>
</button>
<!-- Modal -->
<div class="modal fade" id="tagModalCenter">
<div class="modal-dialog modal-dialog-centered" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title"><?=lang("App.template_modal_title")?></h5>
<button type="button" class="close" data-dismiss="modal"><span>×</span></button>
</div>
<div class="modal-body">
<p><?=lang("App.template_modal_subtitle")?></p>
<?php foreach (keywordEmail()??[] as $item) : ?>
<button type="button" class="btn btn-primary btn-sm mt-1 mr-1" onclick="copy('[<?=$item?>]')">[<?=$item?>]</button>
<?php endforeach; ?>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-dark" data-dismiss="modal"><?=lang("App.template_modal_btn_1")?></button>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="card-body">
<?= formAlert() ?>
<form class="form" action="<?=site_url("notification/store")?>" method="post">
<?= csrf_field() ?>
<div class="form-body">
<div class="row">
<div class="col-lg-4">
<div class="form-group">
<label for="email_gateway" class="text-dark"><?=lang("App.notification_field_user")?></label>
<?php $id_select = (isset($obj)) ? $obj['user_recipient'] : set_value('user_recipient');?>
<select name="user_recipient" id="user_recipient" class="form-control">
<option value="" <?= $id_select == "" ? 'selected' : '' ?>><?=lang("App.notification_field_user_all")?></option>
<?php foreach($user??[] as $item): ?>
<option value="<?=$item['token']?>" <?= $id_select == $item['token'] ? 'selected' : '' ?>><?=$item['first_name']?> - <?=$item['email']?></option>
<?php endforeach; ?>
</select>
</div>
</div>
<div class="col-md-8">
<div class="form-group">
<label for="title" class="text-dark"><?=lang("App.notification_field_title")?></label>
<input type="text" name="title" id="title" class="form-control" value="<?= (isset($obj)) ? $obj['title'] : set_value('title') ?>">
</div>
</div>
<div class="col-md-12">
<div class="form-group">
<label class="text-dark"><?=lang("App.notification_field_body")?></label>
<textarea class="form-control" id="body" name="body" rows="3"><?= (isset($obj)) ? $obj['body'] : set_value('body') ?></textarea>
</div>
</div>
</div>
<div class="row">
<div class="col-lg-12">
<label class="text-primary"><?=lang("App.notification_field_send_msg")?></label>
</div>
<div class="col-md-3">
<div class="form-group">
<label class="text-dark"><?=lang("App.notification_field_send_email")?></label>
<div class="custom-control custom-switch">
<input type="checkbox" id="send_email_notification" name="send_email_notification" class="custom-control-input" <?= $obj['send_email_notification']??false ? 'checked' : ''?>>
<label for="send_email_notification" class="custom-control-label"><?=lang("App.notification_field_send_label")?></label>
</div>
</div>
</div>
</div>
</div>
<div class="form-actions mt-2">
<a href="<?= site_url($btn_return['route']??'#') ?>" class="<?= $btn_return['class']??''?>">
<i class="<?= $btn_return['icon']??'' ?>"></i> <?= $btn_return['title']??'' ?>
</a>
<button type="submit" class="<?= $btn_submit['class']??''?>">
<i class="<?= $btn_submit['icon']??'' ?>"></i> <?= $btn_submit['title']??'' ?>
</button>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Required vendors -->
<script src="<?=site_url("themes/focus2/vendor/global/global.min.js")?>"></script>
<script src="<?=site_url("themes/focus2/js/quixnav-init.js")?>"></script>
<script src="<?=site_url("themes/focus2/js/custom.min.js")?>"></script>
<script src="<?=site_url("themes/focus2/vendor/select2/js/select2.full.min.js")?>"></script>
<!-- Summernote -->
<script src="<?=site_url("themes/focus2/vendor/summernote/summernote.min.js")?>"></script>
<!-- Alert -->
<script src="<?=site_url("themes/focus2/vendor/sweetalert2/dist/sweetalert2.min.js")?>"></script>
<script src="<?=site_url("themes/focus2/vendor/toastr/js/toastr.min.js")?>"></script>
<!-- Form -->
<script>
"use strict";
$(document).ready(function () {
$('#title').focus();
$("#user_recipient").select2();
let configSummerNote = {
height: 150, // set editor height
minHeight: null, // set minimum height of editor
maxHeight: null, // set maximum height of editor
focus: true, // set focus to editable area after initializing summernote
toolbar: [
['style', ['style']],
['font', ['bold', 'italic', 'underline', 'clear']],
['fontname', ['fontname']],
['color', ['color']],
['para', ['ul', 'ol', 'paragraph']],
['height', ['height']],
['table', ['table']],
['insert', ['link', 'picture', 'hr']],
['view', ['codeview']]
]
}
$("#body").summernote(configSummerNote);
});
$("#body").on("summernote.enter", function(we, e) {
$(this).summernote("pasteHTML", "<br><br>");
e.preventDefault();
});
function copy(copyText) {
navigator.clipboard.writeText(copyText);
toastr.success('<?= lang("App.template_modal_copy_msg") ?>','<?= lang("App.template_modal_copy") ?>!',{positionClass: 'toast-top-center'})
$('#tagModalCenter').modal('hide')
}
</script>
<?= toastAlert() ?>

View File

@ -1,149 +0,0 @@
<!--Content Body-->
<div class="content-body">
<div class="container-fluid">
<div class="row page-titles mx-0">
<div class="col-sm-6 p-md-0">
<div class="welcome-text">
<h4><i class="<?= $title['icon']??'' ?>"></i> <?= $title['module']??'' ?></h4>
<span class="ml-1"><?= $title['page']??'' ?></span>
</div>
</div>
<div class="col-sm-6 p-md-0 justify-content-sm-end mt-2 mt-sm-0 d-flex">
<ol class="breadcrumb">
<?php foreach ($breadcrumb??[] as $item) : ?>
<?php if (!$item['active']) : ?>
<li class="breadcrumb-item"><a href="<?= site_url($item['route']) ?>"><?= $item['title'] ?></a></li>
<?php else : ?>
<li class="breadcrumb-item active"><?= $item['title'] ?></li>
<?php endif; ?>
<?php endforeach; ?>
</ol>
</div>
</div>
<div class="row">
<div class="col-12">
<div class="card">
<div class="card-header row">
<div class="col-sm-6">
<h4 class="card-title"><?= $title['page']??'' ?></h4>
</div>
<div class="col-sm-6 justify-content-sm-end mt-2 mt-sm-0 d-flex">
<a href="<?= site_url($btn_add['route']??'#')?>" class="<?= $btn_add['class']??''?>">
<i class="<?= $btn_add['icon']??'' ?>"></i> <?= $btn_add['title']??'' ?>
</a>
</div>
</div>
<div class="card-body">
<!-- CSRF token -->
<input type="hidden" class="txt_csrfname" name="<?= csrf_token() ?>" value="<?= csrf_hash() ?>" />
<!-- Table -->
<div class="table-responsive">
<table id='table-grid' class="table table-striped nowrap" style="width:100%">
<thead>
<tr>
<th><?=lang("App.notification_grid_sender")?></th>
<th><?=lang("App.notification_grid_recipient")?></th>
<th><?=lang("App.notification_grid_title")?></th>
<th><?=lang("App.notification_grid_email")?></th>
<th><?=lang("App.notification_grid_view")?></th>
<th><?=lang("App.notification_grid_created")?></th>
<th><?=lang("App.user_grid_options")?></th>
</tr>
</thead>
</table>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Required vendors -->
<script src="<?=site_url("themes/focus2/vendor/global/global.min.js")?>"></script>
<script src="<?=site_url("themes/focus2/js/quixnav-init.js")?>"></script>
<script src="<?=site_url("themes/focus2/js/custom.min.js")?>"></script>
<!-- Datatable -->
<script src="<?=site_url("themes/focus2/vendor/datatables/js/jquery.dataTables.min.js")?>"></script>
<script src="<?=site_url("themes/focus2/vendor/pickers/daterange/moment.min.js")?>"></script>
<script src="<?=site_url("themes/focus2/vendor/datatables/js/dataTables.datetime.js")?>"></script>
<script src="<?=site_url("themes/focus2/vendor/datatables/js/dataTables.buttons.min.js")?>"></script>
<script src="<?=site_url("themes/focus2/vendor/datatables/js/buttons.bootstrap4.min.js")?>"></script>
<script src="<?=site_url("themes/focus2/vendor/datatables/js/jszip.min.js")?>"></script>
<script src="<?=site_url("themes/focus2/vendor/datatables/js/pdfmake.min.js")?>"></script>
<script src="<?=site_url("themes/focus2/vendor/datatables/js/vfs_fonts.js")?>"></script>
<script src="<?=site_url("themes/focus2/vendor/datatables/js/buttons.html5.min.js")?>"></script>
<script src="<?=site_url("themes/focus2/vendor/datatables/js/buttons.print.min.js")?>"></script>
<script src="<?=site_url("themes/focus2/vendor/datatables/js/buttons.colVis.min.js")?>"></script>
<!-- Alert -->
<script src="<?=site_url("themes/focus2/vendor/sweetalert2/dist/sweetalert2.min.js")?>"></script>
<script src="<?=site_url("themes/focus2/vendor/toastr/js/toastr.min.js")?>"></script>
<!-- Custom -->
<script src="<?=site_url("assets/js/main.js")?>"></script>
<script>
"use strict";
$(document).ready(function () {
let dataFormat = [
{
targets: 3,
render: function ( data, type, row ) {
switch (data) {
case '1':
return '<span class="badge badge-success"><?=lang("App.notification_grid_yes")?></span>';
default:
return '<span class="badge badge-dark"><?=lang("App.notification_grid_no")?></span>';
}
}
},
{
targets: 4,
render: function ( data, type, row ) {
switch (data) {
case '1':
return '<span class="badge badge-success"><?=lang("App.notification_grid_yes")?></span>';
default:
return '<span class="badge badge-dark"><?=lang("App.notification_grid_no")?></span>';
}
}
},
{
targets: 5,
render: function ( data, type, row ) {
switch (data) {
case '1':
return '<span class="badge badge-success"><?=lang("App.notification_grid_yes")?></span>';
default:
return '<span class="badge badge-dark"><?=lang("App.notification_grid_no")?></span>';
}
}
},
{
targets: 6,
render: $.fn.dataTable.render.moment('YYYY-MM-DD HH:mm:ss','<?=momentDateTimeJS()?>')
}
];
let order = [[0, "asc"]];
let translate = '/themes/focus2/vendor/datatables/locales/<?=langJS()?>.json';
let button = ["<?=lang("App.global_copy")?>","<?=lang("App.global_print")?>","<?=lang("App.global_excel")?>","<?=lang("App.global_pdf")?>"];
let columns = [{ data: 'sender' },{ data: 'recipient' },{ data: 'title' },{ data: 'is_send_email' },{ data: 'is_read' },{ data: 'created_at' },{ data: 'options' }];
loadDataTableAjax('table-grid', '<?=site_url('ajax/getNotification')?>', translate, true, true, order, columns,dataFormat, button);
});
function delete_this(id){
swal({
title: "<?=lang("App.notification_delete_title")?>",
text: "<?=lang("App.notification_delete_subtitle")?>",
type: "warning",
showCancelButton: !0,
confirmButtonColor: "#f34141",
confirmButtonText: "<?=lang("App.notification_delete_btn_ok")?>",
cancelButtonText: "<?=lang("App.notification_delete_btn_cancel")?>",
closeOnConfirm: !1
}).then(function(isConfirm) {
if (isConfirm.value) {
window.location.href = '<?=site_url("notification/delete/")?>'+id;
}
})
}
</script>
<?= sweetAlert() ?>

View File