avance de carga de archivo gtfs

francisco/photos
Francisco Sandoval 2024-01-27 22:32:11 -03:00
parent 4376aaa184
commit c03076a58b
3 changed files with 110 additions and 183 deletions

View File

@ -11,36 +11,25 @@
let id_red; let id_red;
let escritura = false; let escritura = false;
const limit = 15; const limit = 15;
let page = 1; let page = 1;
let offset = 0; let offset = 0;
let count = 0; let count = 0;
let ordering = 'id_archivo' let ordering = 'id_archivo'
let redes = [] let redes = []
let red = null
let lista_gtfs = [] let lista_gtfs = []
let gtfs = null
let location = useLocation() let location = useLocation()
let loading = false; let loading = false;
let gtfsArchivo = null; let showUpload = null;
getPermisosPath($location.pathname) getPermisosPath($location.pathname)
.then(data => escritura = data.escritura) .then(data => escritura = data.escritura)
.catch(error => console.log({ error })) .catch(error => console.log({ error }))
$: onPage(page) getRedTransporte({ vigente: 1, ordering: 'nombre_red' })
.then(data => redes = data)
getRedTransporte({ vigente: 1 }) .then(() => id_red = redes[0]?.id_red || null)
.then(data => data.sort((a,b) => a.nombre_red < b.nombre_red? -1 : 1)) .then(() => onPage(1))
//.then(data => redes = data )
.then(data => {
redes = data;
if (redes.length > 0) {
id_red = redes[0].id_red; // Establece la primera red como seleccionada por defecto
onPage(1); // Carga los archivos GTFS para la red seleccionada por defecto
}
})
.catch(error => globalThis.toast.error(error)) .catch(error => globalThis.toast.error(error))
async function onPage(p) { async function onPage(p) {
@ -60,28 +49,32 @@
} }
} }
function onOrderBy(field) { function onOrderBy(field) {
ordering = ordering === field ? '-' + field : field; ordering = ordering === field ? '-' + field : field;
onPage(page) onPage(page)
} }
function onChangeRed() { function onChangeRed() {
page = 1; // Reinicia la paginación al cambiar de red page = 1; // Reinicia la paginación al cambiar de red
onPage(page); onPage(page);
} }
function onNuevo() { function onNuevo() {
gtfsArchivo = {} showUpload = true
} }
</script> </script>
<PageTitle {loading}>Listado Archivos GTFS</PageTitle> <PageTitle {loading}>Listado Archivos GTFS</PageTitle>
<div class="card">
<div class="row"> <div class="card-header">
<div class="col-md"> {#if escritura}
<button class="btn btn-primary" on:click|preventDefault={onNuevo}>
Cargar Archivo GTFS
</button>
{/if}
</div>
<div class="card-body">
<div class="input-group mb-3"> <div class="input-group mb-3">
<div class="input-group-text">Red de Transporte</div> <div class="input-group-text">Red de Transporte</div>
@ -93,17 +86,6 @@
</select> </select>
</div> </div>
</div>
</div>
<div class="card">
<div class="card-body">
<div class="table-responsive"> <div class="table-responsive">
<table class="table table-sm table-bordered"> <table class="table table-sm table-bordered">
<thead> <thead>
@ -164,23 +146,9 @@
/> />
</div> </div>
</div> </div>
<div class="row">
<div class="card-header">
{#if escritura}
<button class="btn btn-primary" on:click|preventDefault={onNuevo}>
Cargar Archivo GTFS
</button>
{/if}
</div>
</div>
{#if gtfsArchivo} {#if showUpload}
<ModalgtfsUpload <ModalgtfsUpload on:close={() => showUpload = false} {id_red} />
{gtfsArchivo}
{escritura}
{id_red}
on:close={() => gtfsArchivo = null}
/>
{/if} {/if}
<style> <style>

View File

@ -1,160 +1,109 @@
<script> <script>
import Modal from "../../components/Modal.svelte"; import Modal from "../../components/Modal.svelte";
import { getGtfsArchivo, createGtfsArchivo, updateGtfsArchivo, deleteGtfsArchivo } from "$/services/gtfs_archivo"; import {
// import Usuario from "../usuarios/Usuario.svelte"; getGtfsArchivo,
import { createEventDispatcher } from "svelte"; createGtfsArchivo,
const dispatch = createEventDispatcher(); updateGtfsArchivo,
deleteGtfsArchivo,
} from "$/services/gtfs_archivo";
import { getRedTransporte } from "$/services/red_transporte"; import { getRedTransporte } from "$/services/red_transporte";
import { createEventDispatcher } from "svelte";
import { storeSession } from "$/stores/global";
const dispatch = createEventDispatcher();
export let gtfsArchivo = {};
export let escritura = false;
export let id_red = null; export let id_red = null;
let form = {}
// fecha actual en formato yyyy-mm-dd
let fecha_hoy = (new Date()).toISOString().substring(0,10);
let form = { valid_from: fecha_hoy, id_red };
let loading = false; let loading = false;
let inputFile = null;
let redes = [];
getRedTransporte({ vigente: 1, ordering: 'nombre_red' })
let redes = [] .then((data) => redes = data)
let red = null .catch((error) => globalThis.toast.error(error));
let file;
let uploading = false;
getRedTransporte({ vigente: 1 })
.then(data => data.sort((a,b) => a.nombre_red < b.nombre_red? -1 : 1))
.then(data => {
redes = data;
})
.catch(error => globalThis.toast.error(error))
async function handleUpload() {
if (!file) {
toast.push('Por favor, seleccione un archivo para cargar.');
return;
}
const formData = new FormData();
formData.append('filezip', file); // 'filezip' es la clave que se espera en el backend
try {
uploading = true;
const response = await fetch('/api/upload_zip', {
method: 'POST',
body: formData, // Enviar los datos del formulario
// No establecer 'Content-Type': 'multipart/form-data',
// fetch lo hará automáticamente con el boundary correcto
});
if (!response.ok) {
throw new Error(`Error: ${response.statusText}`);
}
const result = await response.json();
toast.push(result.message);
onSave();
} catch (error) {
console.error('Error al subir el archivo:', error);
toast.push(error.message);
} finally {
uploading = false;
}
}
async function onSave() { async function onSave() {
try { try {
loading = true; loading = true;
const archivo = inputFile.files[0]
const vigente = form.valid_from >= fecha_hoy;
await createGtfsArchivo({ ...form, vigente, archivo });
form = await createGtfsArchivo(form) globalThis.toast.success("Se ha cargado el Archivo");
dispatch("refresh");
globalThis.toast.success('Se ha cargado el Archivo') dispatch("close");
dispatch('refresh')
dispatch('close')
} catch (error) { } catch (error) {
if (error.detail) { if (error.detail) {
globalThis.toast.success(error.detail) globalThis.toast.success(error.detail);
} else { } else {
globalThis.toast.success(JSON.stringify(error)) globalThis.toast.success(JSON.stringify(error));
} }
} finally { } finally {
loading = false; loading = false;
} }
} }
const hoy = new Date();
// Formatea la fecha como dd-mm-yyyy
const fechaHoy = [
String(hoy.getDate()).padStart(2, '0'), // Día
String(hoy.getMonth() + 1).padStart(2, '0'), // Mes
hoy.getFullYear(), // Año
].join('-');
let valorFecha = fechaHoy;
</script> </script>
<form on:submit|preventDefault={onSave}>
<form > <Modal
<Modal title={'Cargar Archivo GTFS'} title={"Cargar Archivo GTFS"}
size="lg" size="lg"
on:close={() => dispatch('close')}> classBody="bg-white"
on:close={() => dispatch("close")}
>
<div class="row"> <div class="row">
<div class="col-md"> <div class="col-md">
<div class="input-group mb-3"> <div class="input-group mb-3">
<div class="input-group-text">Red de Transporte</div> <div class="input-group-text">Red de Transporte</div>
<select bind:value={id_red} class="form-select"> <select bind:value={form.id_red} class="form-select">
{#each redes as rt} {#each redes as rt}
<option value={rt.id_red}>{rt.nombre_red}</option> <option value={rt.id_red}>{rt.nombre_red}</option>
{/each} {/each}
</select> </select>
</div> </div>
</div> </div>
</div> </div>
<div class="card">
<div class="row mb-3"> <div class="row mb-3">
<div class="col-md-3">Fecha Carga</div> <div class="col-md-3">Fecha Carga</div>
<div class="col-md"> <div class="col-md">
<input type="text" bind:value={valorFecha} disabled required class="form-control"> <input type="date" class="form-control" disabled value={fecha_hoy}>
</div> </div>
</div> </div>
<div class="row mb-4"> <div class="row mb-4">
<div class="col-md-3">Valido desde</div> <div class="col-md-3">Valido desde</div>
<div class="col-md"> <div class="col-md">
<input type="text" bind:value={valorFecha} disabled required class="form-control"> <input type="date" class="form-control" required bind:value={form.valid_from}>
</div> </div>
</div> </div>
<div class="row mb-5"> <div class="row mb-5">
<div class="col-md-3">Cargado por (PONER EL USUARIO)</div> <div class="col-md-3">Cargado por</div>
<div class="col-md"> <div class="col-md">
<input type="text" bind:value={id_red} disabled required class="form-control"> <div class="form-control bg-light">
{$storeSession.persona.nombres} {$storeSession.persona.apellido_a || ''} {$storeSession.persona.apellido_b || ''}
</div>
</div> </div>
</div> </div>
<div> <div class="mb-3">
<label for="formFile" class="form-label">Archivo ZIP</label>
<input class="form-control" type="file" id="formFile" accept=".zip" required bind:this={inputFile}>
</div>
<input type="file" accept=".zip" on:change="{(e) => file = e.target.files[0]}" /> <svelte:fragment slot="buttons">
{#if uploading} <button type="submit" class="btn btn-primary" disabled={loading}>
<p>Subiendo archivo...</p> <i class="bi bi-save"></i> Subir Archivo ZIP
{:else}
<button class="primary sm" on:click="{handleUpload}">
Cargar
</button> </button>
{/if} </svelte:fragment>
</div>
</div>
</Modal> </Modal>
</form> </form>
<style> <style>
.disabled { pointer-events: none !important; } .disabled {
pointer-events: none !important;
}
</style> </style>

View File

@ -18,10 +18,20 @@ export async function getGtfsArchivoId(id) {
} }
export async function createGtfsArchivo(data) { export async function createGtfsArchivo(data) {
const form = new FormData()
for (let key in data) {
if (key === 'archivo') {
const file = data[key]
form.append(key, file, file.name)
} else {
form.append(key, data[key])
}
}
const res = await fetch(`${base}/gtfs-archivo/`, { const res = await fetch(`${base}/gtfs-archivo/`, {
method: 'POST', method: 'POST',
body: JSON.stringify(data), body: form,
headers: { "Authorization": `Bearer ${getToken()}`, "Content-Type": "application/json" } headers: { "Authorization": `Bearer ${getToken()}` }
}) })
if (!res.ok) throw await res.json() if (!res.ok) throw await res.json()
return res.json() return res.json()