se cambia rol_linea por rol_operador

francisco/photos
Francisco Sandoval 2024-02-07 14:57:13 -03:00
parent e0a12ee7e4
commit 8c44d03f48
6 changed files with 147 additions and 147 deletions

View File

@ -3,13 +3,13 @@
import { getAplicaciones } from "$/services/aplicaciones";
import { createRol, getRol, updateRol } from "$/services/roles";
import { createRolyaplicacion, deleteRolyaplicacion, getRolesyaplicaciones, updateRolyaplicacion } from "$/services/roles_aplicaciones";
import { createRolLinea, deleteRolLinea, getRolLineas } from '$/services/roles_lineas';
import { createRolOperador, deleteRolOperador, getRolOperadores } from '$/services/roles_operadores';
import { createEventDispatcher } from "svelte";
import TabForm from "./TabForm.svelte";
import TabAplicaciones from "./TabAplicaciones.svelte";
import TabLineas from "./TabLineas.svelte";
import TabOperadores from "./TabOperadores.svelte";
import "./modal.css"
import { getLineas } from "$/services/lineas";
import { getOperadores } from "$/services/operadores";
const dispatch = createEventDispatcher()
export let rol = {};
@ -17,7 +17,7 @@
let loading = false
let form = {}
let permisos_app = []
let permisos_lineas = []
let permisos_operadores = []
let tab = 0
async function fetchRol({ id_rol = null }) {
@ -25,7 +25,7 @@
if (!id_rol) return;
form = await getRol(id_rol) || {}
await fetchPermisosAplicaciones(id_rol)
await fetchPermisosLineas(id_rol)
await fetchPermisosOperadores(id_rol)
} catch (error) {
globalThis.toast.error(error)
}
@ -48,15 +48,15 @@
}
}
async function fetchPermisosLineas(id_rol) {
async function fetchPermisosOperadores(id_rol) {
try {
const lineas = await getLineas()
const rol_lineas = await getRolLineas({ id_rol })
const operadores = await getOperadores({ ordering: 'nombre_operador' })
const rol_operadores = await getRolOperadores({ id_rol })
permisos_lineas = lineas.map(linea => {
const item = rol_lineas.find(el => el.id_linea === linea.id_linea)
permisos_operadores = operadores.map(operador => {
const item = rol_operadores.find(el => el.id_operador === operador.id_operador)
const acceso = !!item;
return { ...linea, id_rol_linea: item?.id_rol_linea || null, acceso, modificado: false }
return { ...operador, id_rol_operador: item?.id_rol_operador || null, acceso, modificado: false }
})
} catch (error) {
globalThis.toast.error(error)
@ -70,7 +70,7 @@
} else {
form = await createRol(form)
await fetchPermisosAplicaciones(form.id_rol)
await fetchPermisosLineas(form.id_rol)
await fetchPermisosOperadores(form.id_rol)
}
dispatch('refresh')
globalThis.toast.success('Propiedades del Rol guardadas.')
@ -110,21 +110,21 @@
}
}
async function onSaveLineas() {
async function onSaveOperadores() {
try {
const modificados = permisos_lineas.filter(el => el.modificado)
const modificados = permisos_operadores.filter(el => el.modificado)
const { id_rol } = rol;
for (let permiso of modificados) {
if (!permiso.acceso && permiso.id_rol_linea) {
await deleteRolLinea(permiso.id_rol_linea)
if (!permiso.acceso && permiso.id_rol_operador) {
await deleteRolOperador(permiso.id_rol_operador)
}
if (permiso.acceso && !permiso.id_rol_linea) {
const { id_linea } = permiso;
await createRolLinea({ id_rol, id_linea })
if (permiso.acceso && !permiso.id_rol_operador) {
const { id_operador } = permiso;
await createRolOperador({ id_rol, id_operador })
}
}
globalThis.toast.success('Permisos de lineas guardadas')
globalThis.toast.success('Permisos de operadores guardadas')
} catch (error) {
globalThis.toast.error(error)
@ -144,7 +144,7 @@
<a class={"nav-link" + (tab === 1 ? ' active' : '')} href={"#"} on:click|preventDefault={() => tab = 1}>Aplicaciones</a>
</li>
<li class={"nav-item" + (form.id_rol ? '' : ' disabled')}>
<a class={"nav-link" + (tab === 2 ? ' active' : '')} href={"#"} on:click|preventDefault={() => tab = 2}>Lineas</a>
<a class={"nav-link" + (tab === 2 ? ' active' : '')} href={"#"} on:click|preventDefault={() => tab = 2}>Operadores</a>
</li>
</ul>
@ -154,11 +154,11 @@
{/if}
{#if tab === 1}
<TabAplicaciones bind:permisos={permisos_app} />
<TabAplicaciones bind:permisos={permisos_app} {escritura} />
{/if}
{#if tab === 2}
<TabLineas bind:permisos={permisos_lineas} />
<TabOperadores bind:permisos={permisos_operadores} {escritura} />
{/if}
</div>
@ -184,8 +184,8 @@
{/if}
{#if tab === 2}
<button class="btn btn-primary" type="button" disabled={loading} on:click|preventDefault={onSaveLineas}>
<i class="bi bi-save"></i> Guardar Permisos Lineas
<button class="btn btn-primary" type="button" disabled={loading} on:click|preventDefault={onSaveOperadores}>
<i class="bi bi-save"></i> Guardar Permisos Operadores
</button>
{/if}
{/if}

View File

@ -1,40 +1,43 @@
<script>
export let permisos = []
export let escritura = false
</script>
<table class="table">
<thead>
<tr>
<th>Aplicación</th>
<th>Vigente</th>
<th>Acceso</th>
<th>Solo Visualiza</th>
</tr>
</thead>
<tbody>
{#each permisos as app}
<tr>
<td>{app.nombre_app}</td>
<td>{app.vigente ? '✅' : '⛔'}</td>
<td>
<div class="form-check form-switch">
<input class="form-check-input" type="checkbox" role="switch" id={`check-acceso-${app.id_aplicacion}`}
bind:checked={app.acceso}
on:change={() => app.modificado = true}
disabled={!app.vigente}>
<label class="form-check-label" for={`check-acceso-${app.id_aplicacion}`}>&nbsp;</label>
</div>
</td>
<td>
<div class="form-check form-switch">
<input class="form-check-input" type="checkbox" role="switch" id={`check-solo-visualiza-${app.id_aplicacion}`}
bind:checked={app.solo_visualizar}
on:change={() => app.modificado = true}
disabled={!app.vigente || !app.acceso}>
<label class="form-check-label" for={`check-solo-visualiza-${app.id_aplicacion}`}>&nbsp;</label>
</div>
</td>
</tr>
{/each}
</tbody>
</table>
<div class={escritura ? '' : 'disabled'}>
<table class="table">
<thead>
<tr>
<th>Aplicación</th>
<th>Vigente</th>
<th>Acceso</th>
<th>Solo Visualiza</th>
</tr>
</thead>
<tbody>
{#each permisos as app}
<tr>
<td>{app.nombre_app}</td>
<td>{app.vigente ? '✅' : '⛔'}</td>
<td>
<div class="form-check form-switch">
<input class="form-check-input" type="checkbox" role="switch" id={`check-acceso-${app.id_aplicacion}`}
bind:checked={app.acceso}
on:change={() => app.modificado = true}
disabled={!app.vigente}>
<label class="form-check-label" for={`check-acceso-${app.id_aplicacion}`}>&nbsp;</label>
</div>
</td>
<td>
<div class="form-check form-switch">
<input class="form-check-input" type="checkbox" role="switch" id={`check-solo-visualiza-${app.id_aplicacion}`}
bind:checked={app.solo_visualizar}
on:change={() => app.modificado = true}
disabled={!app.vigente || !app.acceso}>
<label class="form-check-label" for={`check-solo-visualiza-${app.id_aplicacion}`}>&nbsp;</label>
</div>
</td>
</tr>
{/each}
</tbody>
</table>
</div>

View File

@ -1,51 +0,0 @@
<script>
import TableResponsive from "$/components/TableResponsive.svelte";
export let permisos = []
let resultado = []
let search = '';
function normalize_string(str) {
if (!str) return str;
return str.toLowerCase().normalize("NFD").replace(/[\u0300-\u036f]/g, "");
}
function filtrar_lineas(search) {
return permisos.filter(el => !search || normalize_string(el.route_long_name).includes(normalize_string(search)))
}
$: resultado = filtrar_lineas(search)
</script>
<div class="input-group my-3">
<input type="text" class="form-control" bind:value={search} placeholder="Nombre de línea...">
<div class="input-group-text"><i class="bi bi-search"></i></div>
</div>
<TableResponsive>
<thead>
<tr>
<th>Linea</th>
<th>Vigente</th>
<th>Visualiza</th>
</tr>
</thead>
<tbody>
{#each resultado as linea}
<tr>
<td>{linea.route_long_name}</td>
<td>{linea.vigente ? '✅' : '⛔'}</td>
<td>
<div class="form-check form-switch">
<input class="form-check-input" type="checkbox" role="switch"
bind:checked={linea.acceso}
on:change={() => linea.modificado = true}
disabled={!linea.vigente}
id={`check-linea-${linea.id_linea}`}>
<label class="form-check-label" for={`check-linea-${linea.id_linea}`}>&nbsp;</label>
</div>
</td>
</tr>
{/each}
</tbody>
</TableResponsive>

View File

@ -0,0 +1,55 @@
<script>
import TableResponsive from "$/components/TableResponsive.svelte";
export let permisos = []
export let escritura = false
let resultado = []
let search = '';
function normalize_string(str) {
if (!str) return str;
return str.toLowerCase().normalize("NFD").replace(/[\u0300-\u036f]/g, "");
}
function filtrar_operadores(search) {
return permisos.filter(el => !search || normalize_string(el.nombre_operador).includes(normalize_string(search)))
}
$: resultado = filtrar_operadores(search)
</script>
<div class="input-group my-3">
<input type="text" class="form-control" bind:value={search} placeholder="Nombre de línea...">
<div class="input-group-text"><i class="bi bi-search"></i></div>
</div>
<div class={escritura ? '' : 'disabled'}>
<TableResponsive>
<thead>
<tr>
<th>Operador</th>
<th>Vigente</th>
<th>Visualiza</th>
</tr>
</thead>
<tbody>
{#each resultado as operador}
<tr>
<td>{operador.nombre_operador}</td>
<td>{operador.vigente ? '✅' : '⛔'}</td>
<td>
<div class="form-check form-switch">
<input class="form-check-input" type="checkbox" role="switch"
bind:checked={operador.acceso}
on:change={() => operador.modificado = true}
disabled={!operador.vigente}
id={`check-operador-${operador.id_operador}`}>
<label class="form-check-label" for={`check-operador-${operador.id_operador}`}>&nbsp;</label>
</div>
</td>
</tr>
{/each}
</tbody>
</TableResponsive>
</div>

View File

@ -5,47 +5,40 @@
import CantidadParaderosComuna from "./CantidadParaderosComuna.svelte";
import CantidadBusesRecorrido from "./CantidadBusesRecorrido.svelte";
import CantidadBusesLinea from "./CantidadBusesLinea.svelte";
import ActualizandoGtfs from "$/components/ActualizandoGtfs.svelte";
let loading1 = false
let loading2 = false
let loading3 = false
let loading4 = false
let loading5 = false
let actualizando = true
</script>
{#if actualizando}
<ActualizandoGtfs on:close={() => actualizando = false} />
{:else}
<PageTitle
loading={loading1 || loading2 || loading3 || loading4 || loading5 }
><strong>Análisis</strong> de datos</PageTitle>
<PageTitle
loading={loading1 || loading2 || loading3 || loading4 || loading5 }
><strong>Análisis</strong> de datos</PageTitle>
<div class="row">
<div class="col-xs-12 col-md-7">
<div class="row">
<div class="col">
<CantidadLineas on:loading={ev => loading1 = ev.detail} />
</div>
<div class="col">
<CantidadParaderos on:loading={ev => loading2 = ev.detail} />
</div>
<div class="row">
<div class="col-xs-12 col-md-7">
<div class="row">
<div class="col">
<CantidadLineas on:loading={ev => loading1 = ev.detail} />
</div>
<div class="row">
<div class="col">
<CantidadParaderosComuna on:loading={ev => loading3 = ev.detail} />
</div>
<div class="col">
<CantidadBusesRecorrido on:loading={ev => loading4 = ev.detail} />
</div>
<div class="col">
<CantidadParaderos on:loading={ev => loading2 = ev.detail} />
</div>
</div>
<div class="col-xs-12 col-md-5">
<CantidadBusesLinea on:loading={ev => loading5 = ev.detail} />
<div class="row">
<div class="col">
<CantidadParaderosComuna on:loading={ev => loading3 = ev.detail} />
</div>
<div class="col">
<CantidadBusesRecorrido on:loading={ev => loading4 = ev.detail} />
</div>
</div>
</div>
{/if}
<div class="col-xs-12 col-md-5">
<CantidadBusesLinea on:loading={ev => loading5 = ev.detail} />
</div>
</div>

View File

@ -1,8 +1,8 @@
import { base, getToken } from './_config'
export async function getRolLineas(params) {
export async function getRolOperadores(params) {
const query = !params ? '' : '?' + (new URLSearchParams(params).toString());
const res = await fetch(`${base}/roles-lineas/${query}`, {
const res = await fetch(`${base}/roles-operadores/${query}`, {
headers: { "Authorization": `Bearer ${getToken()}`, "Content-Type": "application/json" }
})
if (!res.ok) throw await res.json()
@ -10,8 +10,8 @@ export async function getRolLineas(params) {
}
export async function createRolLinea(data) {
const res = await fetch(`${base}/roles-lineas/`, {
export async function createRolOperador(data) {
const res = await fetch(`${base}/roles-operadores/`, {
method: 'POST',
body: JSON.stringify(data),
headers: { "Authorization": `Bearer ${getToken()}`, "Content-Type": "application/json" }
@ -20,8 +20,8 @@ export async function createRolLinea(data) {
return res.json()
}
export async function deleteRolLinea(id) {
const res = await fetch(`${base}/roles-lineas/${id}/`, {
export async function deleteRolOperador(id) {
const res = await fetch(`${base}/roles-operadores/${id}/`, {
method: 'DELETE',
headers: { "Authorization": `Bearer ${getToken()}`, "Content-Type": "application/json" }
})