mirror of
https://git.imnavajas.es/jjimenez/safekat.git
synced 2025-07-25 22:52:08 +00:00
Merge branch 'dev/anadir_ficheros_presu' into 'main'
Dev/anadir ficheros presu See merge request jjimenez/safekat!263
This commit is contained in:
2
.gitignore
vendored
2
.gitignore
vendored
@ -1,4 +1,4 @@
|
|||||||
ci4/.env
|
ci4/.env
|
||||||
.vscode/
|
.vscode/
|
||||||
|
|
||||||
./xdebug.log
|
xdebug.log
|
||||||
@ -788,7 +788,7 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController
|
|||||||
|
|
||||||
return $this->respond([
|
return $this->respond([
|
||||||
'status' => $id,
|
'status' => $id,
|
||||||
'url' => site_url('presupuestocliente/list'),
|
'url' => site_url('presupuestos/presupuestocliente/edit'),
|
||||||
'message' => lang('Basic.global.saveSuccess', [lang('Basic.global.record')]),
|
'message' => lang('Basic.global.saveSuccess', [lang('Basic.global.record')]),
|
||||||
$csrfTokenName => $newTokenHash
|
$csrfTokenName => $newTokenHash
|
||||||
]);
|
]);
|
||||||
@ -797,6 +797,89 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function get_files(){
|
||||||
|
|
||||||
|
// Check if the request is a POST request
|
||||||
|
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
|
||||||
|
|
||||||
|
$presupuesto_id = $this->request->getPost()['presupuesto_id'] ?? 0;
|
||||||
|
|
||||||
|
$model = model('App\Models\Presupuestos\PresupuestoFicheroModel');
|
||||||
|
$files = $model->getFiles($presupuesto_id);
|
||||||
|
|
||||||
|
$result = [];
|
||||||
|
|
||||||
|
foreach ($files as $file) {
|
||||||
|
|
||||||
|
$size = filesize($file->file_path);
|
||||||
|
$splitPath = explode("presupuestos/", $file->file_path);
|
||||||
|
|
||||||
|
// se crea un objeto con el nombre del fichero y el tamaño
|
||||||
|
$obj = (object) array(
|
||||||
|
'name' => $file->nombre,
|
||||||
|
'size' => $size,
|
||||||
|
'hash' => $splitPath[1] ?? $file->file_path);
|
||||||
|
|
||||||
|
|
||||||
|
// se añade el objeto al array
|
||||||
|
array_push($result, $obj);
|
||||||
|
}
|
||||||
|
|
||||||
|
return json_encode($result);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function upload_files(){
|
||||||
|
|
||||||
|
$model = model('App\Models\Presupuestos\PresupuestoFicheroModel');
|
||||||
|
|
||||||
|
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
|
||||||
|
|
||||||
|
$presupuesto_id = $_POST['presupuesto_id'];
|
||||||
|
$old_files = json_decode($_POST['oldFiles']);
|
||||||
|
|
||||||
|
// Comprobar si se han subido archivos
|
||||||
|
if (!empty($_FILES['file']) || !empty($old_files)) {
|
||||||
|
|
||||||
|
|
||||||
|
// Borrar los archivos existentes del presupuesto
|
||||||
|
$model->deleteFiles($presupuesto_id, $old_files);
|
||||||
|
|
||||||
|
if (!empty($_FILES['file'])){
|
||||||
|
$files = $_FILES['file'];
|
||||||
|
|
||||||
|
// Iterar sobre los archivos
|
||||||
|
for ($i = 0; $i < count($files['name']); $i++) {
|
||||||
|
// Aquí puedes acceder a las propiedades del archivo
|
||||||
|
$name = $files['name'][$i];
|
||||||
|
$extension = explode('.', $files['name'][$i])[1];
|
||||||
|
$tmp_name = $files['tmp_name'][$i];
|
||||||
|
|
||||||
|
$new_name = $model->saveFileInBBDD($presupuesto_id, $name, $extension, auth()->id());
|
||||||
|
|
||||||
|
// Se sube el fichero
|
||||||
|
// Pero primero se comprueba que la carpeta presupuestos exista
|
||||||
|
if (!is_dir(WRITEPATH . 'uploads/presupuestos')) {
|
||||||
|
mkdir(WRITEPATH . 'uploads/presupuestos', 0777, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!is_null($new_name)){
|
||||||
|
move_uploaded_file($tmp_name, WRITEPATH . 'uploads/presupuestos/' . $new_name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
// Borrar los archivos existentes del presupuesto
|
||||||
|
$model->deleteFiles($presupuesto_id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return json_encode(['message' => 'Archivos subidos correctamente']);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/***********************
|
/***********************
|
||||||
*
|
*
|
||||||
@ -1479,7 +1562,6 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
protected function calcular_coste_linea($linea, &$totalPapel, &$margenPapel, &$sumForFactor, &$totalImpresion, &$margenImpresion)
|
protected function calcular_coste_linea($linea, &$totalPapel, &$margenPapel, &$sumForFactor, &$totalImpresion, &$margenImpresion)
|
||||||
{
|
{
|
||||||
if (count($linea) == 0)
|
if (count($linea) == 0)
|
||||||
@ -1676,14 +1758,18 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController
|
|||||||
protected function obtenerPaginasColor($presupuestoEntity)
|
protected function obtenerPaginasColor($presupuestoEntity)
|
||||||
{
|
{
|
||||||
$comparador_data = json_decode($presupuestoEntity->comparador_json_data);
|
$comparador_data = json_decode($presupuestoEntity->comparador_json_data);
|
||||||
if (property_exists($comparador_data, 'color')) {
|
if(!is_null($comparador_data)){
|
||||||
$presupuestoEntity->paginasColor = $comparador_data->color->paginas;
|
if (property_exists($comparador_data, 'color')) {
|
||||||
|
$presupuestoEntity->paginasColor = $comparador_data->color->paginas;
|
||||||
|
}
|
||||||
|
if (property_exists($comparador_data, 'colorhq')) {
|
||||||
|
$presupuestoEntity->paginasColor = $comparador_data->colorhq->paginas;
|
||||||
|
} else {
|
||||||
|
$presupuestoEntity->paginasColor = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (property_exists($comparador_data, 'colorhq')) {
|
else
|
||||||
$presupuestoEntity->paginasColor = $comparador_data->colorhq->paginas;
|
|
||||||
} else {
|
|
||||||
$presupuestoEntity->paginasColor = 0;
|
$presupuestoEntity->paginasColor = 0;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function obtenerTiradas($presupuestoEntity)
|
protected function obtenerTiradas($presupuestoEntity)
|
||||||
|
|||||||
37
ci4/app/Controllers/Sistema/Intranet.php
Normal file
37
ci4/app/Controllers/Sistema/Intranet.php
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Controllers\Sistema;
|
||||||
|
|
||||||
|
use CodeIgniter\Controller;
|
||||||
|
|
||||||
|
class Intranet extends Controller
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
function presupuestos($resource_name)
|
||||||
|
{
|
||||||
|
helper('file');
|
||||||
|
|
||||||
|
$resource_path = WRITEPATH . 'uploads/presupuestos/' . $resource_name;
|
||||||
|
|
||||||
|
if (file_exists($resource_path)) {
|
||||||
|
// Get the mime type of the file
|
||||||
|
$mime_type = mime_content_type($resource_path);
|
||||||
|
|
||||||
|
// Get an instance of the Response class
|
||||||
|
$response = service('response');
|
||||||
|
|
||||||
|
// Set the content type
|
||||||
|
$response->setContentType($mime_type);
|
||||||
|
|
||||||
|
// Set the output
|
||||||
|
$response->setBody(file_get_contents($resource_path));
|
||||||
|
|
||||||
|
// Send the response to the browser
|
||||||
|
$response->send();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
19
ci4/app/Entities/Presupuestos/PresupuestoFicheroEntity.php
Normal file
19
ci4/app/Entities/Presupuestos/PresupuestoFicheroEntity.php
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
<?php
|
||||||
|
namespace App\Entities\Presupuestos;
|
||||||
|
|
||||||
|
use CodeIgniter\Entity;
|
||||||
|
|
||||||
|
class PresupuestoFicheroEntity extends \CodeIgniter\Entity\Entity
|
||||||
|
{
|
||||||
|
protected $attributes = [
|
||||||
|
"id" => null,
|
||||||
|
"presupuesto_id" => null,
|
||||||
|
"nombre" => null,
|
||||||
|
"file_path" => null,
|
||||||
|
"upload_by" => null,
|
||||||
|
"upload_at" => null,
|
||||||
|
];
|
||||||
|
protected $casts = [
|
||||||
|
"presupuesto_id" => "int",
|
||||||
|
];
|
||||||
|
}
|
||||||
89
ci4/app/Models/Presupuestos/PresupuestoFicheroModel.php
Normal file
89
ci4/app/Models/Presupuestos/PresupuestoFicheroModel.php
Normal file
@ -0,0 +1,89 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Models\Presupuestos;
|
||||||
|
|
||||||
|
class PresupuestoFicheroModel extends \App\Models\BaseModel
|
||||||
|
{
|
||||||
|
protected $table = "presupuesto_ficheros";
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Whether primary key uses auto increment.
|
||||||
|
*
|
||||||
|
* @var bool
|
||||||
|
*/
|
||||||
|
protected $useAutoIncrement = true;
|
||||||
|
|
||||||
|
|
||||||
|
protected $allowedFields = ["presupuesto_id", "nombre", "file_path", "upload_by", "upload_at"];
|
||||||
|
protected $returnType = "App\Entities\Presupuestos\PresupuestoFicheroEntity";
|
||||||
|
|
||||||
|
protected $useTimestamps = false;
|
||||||
|
protected $useSoftDeletes = false;
|
||||||
|
|
||||||
|
public static $labelField = "nombre";
|
||||||
|
|
||||||
|
|
||||||
|
public function saveFileInBBDD($presupuesto_id, $filename, $extension ,$user_id) {
|
||||||
|
try{
|
||||||
|
$new_filename = $this->generateFileHash($filename) . '.' . $extension;
|
||||||
|
|
||||||
|
$this->db->table($this->table . " t1")
|
||||||
|
->set('presupuesto_id', $presupuesto_id)
|
||||||
|
->set('nombre', $filename)
|
||||||
|
->set('file_path', WRITEPATH . 'uploads/presupuestos/' . $new_filename)
|
||||||
|
->set('upload_by', $user_id)
|
||||||
|
->set('upload_at', date('Y-m-d H:i:s'))
|
||||||
|
->insert();
|
||||||
|
|
||||||
|
return $new_filename;
|
||||||
|
} catch (\Exception $e) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function deleteFiles($presupuesto_id, $old_files = []){
|
||||||
|
|
||||||
|
$files = $this->db
|
||||||
|
->table($this->table . " t1")
|
||||||
|
->where('presupuesto_id', $presupuesto_id)->get()->getResult();
|
||||||
|
if($files){
|
||||||
|
foreach($files as $file){
|
||||||
|
|
||||||
|
// se comprueba que el $file->nombre no sea igual a ninguno de los elementos del array $old_files
|
||||||
|
if (!in_array($file->nombre, $old_files)) {
|
||||||
|
if (file_exists($file->file_path)) {
|
||||||
|
unlink($file->file_path);
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->db
|
||||||
|
->table($this->table . " t1")
|
||||||
|
->where('presupuesto_id', $presupuesto_id)
|
||||||
|
->where('nombre', $file->nombre)
|
||||||
|
->delete();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public function getFiles($presupuesto_id){
|
||||||
|
return $this->db
|
||||||
|
->table($this->table . " t1")
|
||||||
|
->where('presupuesto_id', $presupuesto_id)->get()->getResult();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Función para convertir el nombre y extensión de un fichero en un hash único
|
||||||
|
* usando cifrado simétrico.
|
||||||
|
*
|
||||||
|
* @param string $filename Nombre del fichero con extensión
|
||||||
|
* @return string Hash encriptado del fichero
|
||||||
|
*/
|
||||||
|
private function generateFileHash($filename) {
|
||||||
|
return hash('sha256', $filename);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@ -145,10 +145,29 @@
|
|||||||
echo '</div>';
|
echo '</div>';
|
||||||
endforeach;
|
endforeach;
|
||||||
endif;
|
endif;
|
||||||
|
|
||||||
echo '</div>';
|
echo '</div>';
|
||||||
echo '</div>';
|
echo '</div>';
|
||||||
endif; ?>
|
endif; ?>
|
||||||
|
|
||||||
|
<?php if($presupuestoEntity->estado_id==2): ?>
|
||||||
|
<div class="row mb-3">
|
||||||
|
<h3>Ficheros</h3>
|
||||||
|
<div class="col-12">
|
||||||
|
<div class="dropzone needsclick" id="dropzone-multi" >
|
||||||
|
<div class="dz-message needsclick">
|
||||||
|
Arrastre aquí los ficheros o haga click
|
||||||
|
</div>
|
||||||
|
<div class="fallback">
|
||||||
|
<input name="file" type="file" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<button id="submit-all" class="btn mt-3 btn-primary btn-submit waves-effect waves-light ml-2">
|
||||||
|
<span class="align-middle d-sm-inline-block d-none me-sm-1">Actualizar ficheros</span>
|
||||||
|
<i class="ti ti-upload ti-xs"></i>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
<?php endif; ?>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Modal -->
|
<!-- Modal -->
|
||||||
@ -181,7 +200,117 @@ window.routes_resumen = {
|
|||||||
duplicarPresupuesto: "<?= route_to('duplicarPresupuesto') ?>",
|
duplicarPresupuesto: "<?= route_to('duplicarPresupuesto') ?>",
|
||||||
}
|
}
|
||||||
|
|
||||||
if(<?php echo $presupuestoEntity->estado_id?>==2)
|
if(<?php echo $presupuestoEntity->estado_id?>==2){
|
||||||
previewEsquemaCubierta(true);
|
previewEsquemaCubierta(true);
|
||||||
|
|
||||||
|
const previewTemplate = `<div class="dz-preview dz-file-preview">
|
||||||
|
<div class="dz-details">
|
||||||
|
<div class="dz-thumbnail">
|
||||||
|
<!---<img data-dz-thumbnail>
|
||||||
|
<span class="dz-nopreview">No preview</span> --->
|
||||||
|
<div class="dz-success-mark"></div>
|
||||||
|
<div class="dz-error-mark"></div>
|
||||||
|
<div class="dz-error-message"><span data-dz-errormessage></span></div>
|
||||||
|
<div class="progress">
|
||||||
|
<div class="progress-bar progress-bar-primary" role="progressbar" aria-valuemin="0" aria-valuemax="100" data-dz-uploadprogress></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="dz-filename" data-dz-name></div>
|
||||||
|
<div class="dz-size" data-dz-size></div>
|
||||||
|
</div>
|
||||||
|
</div>`;
|
||||||
|
|
||||||
|
Dropzone.autoDiscover = false;
|
||||||
|
|
||||||
|
var dropzoneMulti = new Dropzone('#dropzone-multi', {
|
||||||
|
url: "<?= site_url('presupuestos/presupuestocliente/upload_files') ?>",
|
||||||
|
addRemoveLinks: true,
|
||||||
|
previewTemplate: previewTemplate,
|
||||||
|
paramName: "file",
|
||||||
|
uploadMultiple: true,
|
||||||
|
parallelUploads: 4, // Ajusta este número al máximo número de archivos que esperas subir a la vez
|
||||||
|
maxFiles: 5, // Ajusta este número al máximo número de archivos que esperas subir a la vez
|
||||||
|
autoProcessQueue: true,
|
||||||
|
dictRemoveFile: "Eliminar",
|
||||||
|
acceptedFiles: 'image/*, application/pdf',
|
||||||
|
maxFilesize: 5e+7, // Bytes
|
||||||
|
init: function() {
|
||||||
|
thisDropzone = this;
|
||||||
|
$('#loader').show();
|
||||||
|
|
||||||
|
$.ajax({
|
||||||
|
url: "<?= site_url('presupuestos/presupuestocliente/get_files') ?>",
|
||||||
|
type: 'POST',
|
||||||
|
data: { presupuesto_id: <?= $presupuestoEntity->id ?> },
|
||||||
|
|
||||||
|
}).done(function(response) {
|
||||||
|
if(response == null || response == ""){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
values = JSON.parse(response);
|
||||||
|
for(var i = 0; i < values.length; i++){
|
||||||
|
var mockFile = { name: values[i].name, size: values[i].size, hash: values[i].hash};
|
||||||
|
|
||||||
|
thisDropzone.files.push(mockFile); // add to files array
|
||||||
|
thisDropzone.emit("addedfile", mockFile);
|
||||||
|
thisDropzone.emit("thumbnail", mockFile, window.location.host + "/sistema/intranet/presupuestos/"+values[i].hash);
|
||||||
|
thisDropzone.emit("complete", mockFile);
|
||||||
|
thisDropzone.options.success.call(thisDropzone, mockFile);
|
||||||
|
};
|
||||||
|
}).always(function() {
|
||||||
|
$('#loader').hide();
|
||||||
|
});
|
||||||
|
|
||||||
|
this.on("addedfile", function (file) {
|
||||||
|
if(file.hash){
|
||||||
|
var viewButton = Dropzone.createElement("<span class='dz-remove'>Ver</span>");
|
||||||
|
file.previewElement.appendChild(viewButton);
|
||||||
|
// Listen to the view button click event
|
||||||
|
viewButton.addEventListener("click", function (e) {
|
||||||
|
|
||||||
|
window.open(window.location.protocol + "//" + window.location.host + "/sistema/intranet/presupuestos/"+file.hash, '_blank');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#presupuesto-cliente-form').submit(function(e){
|
||||||
|
e.preventDefault();
|
||||||
|
var files = dropzoneMulti.files;
|
||||||
|
$('#loader').show();
|
||||||
|
|
||||||
|
var formData = new FormData();
|
||||||
|
var oldFiles = [];
|
||||||
|
var counter = 0;
|
||||||
|
for (var i = 0; i < files.length; i++) {
|
||||||
|
|
||||||
|
if(files[i].upload){
|
||||||
|
var file = files[i];
|
||||||
|
formData.append('file[' + counter + ']', file);
|
||||||
|
counter += 1;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
oldFiles.push(files[i].name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
formData.append('oldFiles', JSON.stringify(oldFiles));
|
||||||
|
|
||||||
|
formData.append('presupuesto_id', <?= $presupuestoEntity->id ?>);
|
||||||
|
|
||||||
|
$.ajax({
|
||||||
|
url: "<?= site_url('presupuestos/presupuestocliente/upload_files') ?>",
|
||||||
|
type: 'POST',
|
||||||
|
data: formData,
|
||||||
|
processData: false, // Indicar a jQuery que no procese los datos
|
||||||
|
contentType: false // Indicar a jQuery que no establezca el tipo de contenido
|
||||||
|
}).done(function(response) {
|
||||||
|
// Aquí puedes manejar la respuesta del servidor
|
||||||
|
}).always(function() {
|
||||||
|
$('#loader').hide();
|
||||||
|
})
|
||||||
|
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
}
|
||||||
<?= $this->endSection() ?>
|
<?= $this->endSection() ?>
|
||||||
|
|||||||
@ -735,7 +735,10 @@ async function calcularPresupuesto() {
|
|||||||
}
|
}
|
||||||
catch(error){
|
catch(error){
|
||||||
}
|
}
|
||||||
console.log(response);
|
|
||||||
|
//For debug only
|
||||||
|
//console.log(response);
|
||||||
|
|
||||||
$('#loader').hide();
|
$('#loader').hide();
|
||||||
|
|
||||||
$('#divTiradasPrecio').empty();
|
$('#divTiradasPrecio').empty();
|
||||||
|
|||||||
@ -279,11 +279,13 @@ function finalizarPresupuesto(confirmar){
|
|||||||
data: datos,
|
data: datos,
|
||||||
success: function(response) {
|
success: function(response) {
|
||||||
|
|
||||||
if(Object.keys(response).length > 0) {
|
if(confirmar){
|
||||||
if(response.status > 0){
|
if(Object.keys(response).length > 0) {
|
||||||
window.location.href = response.url;
|
if(response.status > 0){
|
||||||
|
window.location.href = response.url + '/' + response.status;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
$('#loader').hide();
|
$('#loader').hide();
|
||||||
|
|
||||||
|
|||||||
@ -78,7 +78,7 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="bs-stepper-content">
|
<div class="bs-stepper-content">
|
||||||
<form id="presupuesto-cliente-form" onsubmit="return false">
|
<form id="presupuesto-cliente-form" >
|
||||||
|
|
||||||
|
|
||||||
<!-- Tipo Libro -->
|
<!-- Tipo Libro -->
|
||||||
@ -179,7 +179,6 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -239,10 +238,12 @@ if(<?= $presupuestoEntity->estado_id ?>==1){
|
|||||||
|
|
||||||
<link rel="stylesheet" href="<?= site_url('themes/vuexy/vendor/libs/bs-stepper/bs-stepper.css') ?>" />
|
<link rel="stylesheet" href="<?= site_url('themes/vuexy/vendor/libs/bs-stepper/bs-stepper.css') ?>" />
|
||||||
<link rel="stylesheet" href="<?= site_url('themes/vuexy/vendor/libs/formvalidation/dist/css/formValidation.min.css') ?>" />
|
<link rel="stylesheet" href="<?= site_url('themes/vuexy/vendor/libs/formvalidation/dist/css/formValidation.min.css') ?>" />
|
||||||
|
<link rel="stylesheet" href="<?= site_url('themes/vuexy/vendor/libs/dropzone/dropzone.css') ?>" />
|
||||||
|
|
||||||
<?= $this->endSection() ?>
|
<?= $this->endSection() ?>
|
||||||
|
|
||||||
<?= $this->section('additionalExternalJs') ?>
|
<?= $this->section('additionalExternalJs') ?>
|
||||||
|
<script src="<?= site_url("themes/vuexy/vendor/libs/dropzone/dropzone.js") ?>"></script>
|
||||||
<script src="<?= site_url("themes/vuexy/vendor/libs/bs-stepper/bs-stepper.js") ?>"></script>
|
<script src="<?= site_url("themes/vuexy/vendor/libs/bs-stepper/bs-stepper.js") ?>"></script>
|
||||||
<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/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/Bootstrap5.min.js") ?>"></script>
|
||||||
|
|||||||
Reference in New Issue
Block a user