forked from TDTP/admin_transporte_frontend
se cambia rol_linea por rol_operador
parent
e0a12ee7e4
commit
8c44d03f48
|
@ -3,13 +3,13 @@
|
||||||
import { getAplicaciones } from "$/services/aplicaciones";
|
import { getAplicaciones } from "$/services/aplicaciones";
|
||||||
import { createRol, getRol, updateRol } from "$/services/roles";
|
import { createRol, getRol, updateRol } from "$/services/roles";
|
||||||
import { createRolyaplicacion, deleteRolyaplicacion, getRolesyaplicaciones, updateRolyaplicacion } from "$/services/roles_aplicaciones";
|
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 { createEventDispatcher } from "svelte";
|
||||||
import TabForm from "./TabForm.svelte";
|
import TabForm from "./TabForm.svelte";
|
||||||
import TabAplicaciones from "./TabAplicaciones.svelte";
|
import TabAplicaciones from "./TabAplicaciones.svelte";
|
||||||
import TabLineas from "./TabLineas.svelte";
|
import TabOperadores from "./TabOperadores.svelte";
|
||||||
import "./modal.css"
|
import "./modal.css"
|
||||||
import { getLineas } from "$/services/lineas";
|
import { getOperadores } from "$/services/operadores";
|
||||||
const dispatch = createEventDispatcher()
|
const dispatch = createEventDispatcher()
|
||||||
|
|
||||||
export let rol = {};
|
export let rol = {};
|
||||||
|
@ -17,7 +17,7 @@
|
||||||
let loading = false
|
let loading = false
|
||||||
let form = {}
|
let form = {}
|
||||||
let permisos_app = []
|
let permisos_app = []
|
||||||
let permisos_lineas = []
|
let permisos_operadores = []
|
||||||
let tab = 0
|
let tab = 0
|
||||||
|
|
||||||
async function fetchRol({ id_rol = null }) {
|
async function fetchRol({ id_rol = null }) {
|
||||||
|
@ -25,7 +25,7 @@
|
||||||
if (!id_rol) return;
|
if (!id_rol) return;
|
||||||
form = await getRol(id_rol) || {}
|
form = await getRol(id_rol) || {}
|
||||||
await fetchPermisosAplicaciones(id_rol)
|
await fetchPermisosAplicaciones(id_rol)
|
||||||
await fetchPermisosLineas(id_rol)
|
await fetchPermisosOperadores(id_rol)
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
globalThis.toast.error(error)
|
globalThis.toast.error(error)
|
||||||
}
|
}
|
||||||
|
@ -48,15 +48,15 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async function fetchPermisosLineas(id_rol) {
|
async function fetchPermisosOperadores(id_rol) {
|
||||||
try {
|
try {
|
||||||
const lineas = await getLineas()
|
const operadores = await getOperadores({ ordering: 'nombre_operador' })
|
||||||
const rol_lineas = await getRolLineas({ id_rol })
|
const rol_operadores = await getRolOperadores({ id_rol })
|
||||||
|
|
||||||
permisos_lineas = lineas.map(linea => {
|
permisos_operadores = operadores.map(operador => {
|
||||||
const item = rol_lineas.find(el => el.id_linea === linea.id_linea)
|
const item = rol_operadores.find(el => el.id_operador === operador.id_operador)
|
||||||
const acceso = !!item;
|
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) {
|
} catch (error) {
|
||||||
globalThis.toast.error(error)
|
globalThis.toast.error(error)
|
||||||
|
@ -70,7 +70,7 @@
|
||||||
} else {
|
} else {
|
||||||
form = await createRol(form)
|
form = await createRol(form)
|
||||||
await fetchPermisosAplicaciones(form.id_rol)
|
await fetchPermisosAplicaciones(form.id_rol)
|
||||||
await fetchPermisosLineas(form.id_rol)
|
await fetchPermisosOperadores(form.id_rol)
|
||||||
}
|
}
|
||||||
dispatch('refresh')
|
dispatch('refresh')
|
||||||
globalThis.toast.success('Propiedades del Rol guardadas.')
|
globalThis.toast.success('Propiedades del Rol guardadas.')
|
||||||
|
@ -110,21 +110,21 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async function onSaveLineas() {
|
async function onSaveOperadores() {
|
||||||
try {
|
try {
|
||||||
const modificados = permisos_lineas.filter(el => el.modificado)
|
const modificados = permisos_operadores.filter(el => el.modificado)
|
||||||
const { id_rol } = rol;
|
const { id_rol } = rol;
|
||||||
|
|
||||||
for (let permiso of modificados) {
|
for (let permiso of modificados) {
|
||||||
if (!permiso.acceso && permiso.id_rol_linea) {
|
if (!permiso.acceso && permiso.id_rol_operador) {
|
||||||
await deleteRolLinea(permiso.id_rol_linea)
|
await deleteRolOperador(permiso.id_rol_operador)
|
||||||
}
|
}
|
||||||
if (permiso.acceso && !permiso.id_rol_linea) {
|
if (permiso.acceso && !permiso.id_rol_operador) {
|
||||||
const { id_linea } = permiso;
|
const { id_operador } = permiso;
|
||||||
await createRolLinea({ id_rol, id_linea })
|
await createRolOperador({ id_rol, id_operador })
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
globalThis.toast.success('Permisos de lineas guardadas')
|
globalThis.toast.success('Permisos de operadores guardadas')
|
||||||
|
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
globalThis.toast.error(error)
|
globalThis.toast.error(error)
|
||||||
|
@ -144,7 +144,7 @@
|
||||||
<a class={"nav-link" + (tab === 1 ? ' active' : '')} href={"#"} on:click|preventDefault={() => tab = 1}>Aplicaciones</a>
|
<a class={"nav-link" + (tab === 1 ? ' active' : '')} href={"#"} on:click|preventDefault={() => tab = 1}>Aplicaciones</a>
|
||||||
</li>
|
</li>
|
||||||
<li class={"nav-item" + (form.id_rol ? '' : ' disabled')}>
|
<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>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
|
@ -154,11 +154,11 @@
|
||||||
{/if}
|
{/if}
|
||||||
|
|
||||||
{#if tab === 1}
|
{#if tab === 1}
|
||||||
<TabAplicaciones bind:permisos={permisos_app} />
|
<TabAplicaciones bind:permisos={permisos_app} {escritura} />
|
||||||
{/if}
|
{/if}
|
||||||
|
|
||||||
{#if tab === 2}
|
{#if tab === 2}
|
||||||
<TabLineas bind:permisos={permisos_lineas} />
|
<TabOperadores bind:permisos={permisos_operadores} {escritura} />
|
||||||
{/if}
|
{/if}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -184,8 +184,8 @@
|
||||||
{/if}
|
{/if}
|
||||||
|
|
||||||
{#if tab === 2}
|
{#if tab === 2}
|
||||||
<button class="btn btn-primary" type="button" disabled={loading} on:click|preventDefault={onSaveLineas}>
|
<button class="btn btn-primary" type="button" disabled={loading} on:click|preventDefault={onSaveOperadores}>
|
||||||
<i class="bi bi-save"></i> Guardar Permisos Lineas
|
<i class="bi bi-save"></i> Guardar Permisos Operadores
|
||||||
</button>
|
</button>
|
||||||
{/if}
|
{/if}
|
||||||
{/if}
|
{/if}
|
||||||
|
|
|
@ -1,40 +1,43 @@
|
||||||
<script>
|
<script>
|
||||||
export let permisos = []
|
export let permisos = []
|
||||||
|
export let escritura = false
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<table class="table">
|
<div class={escritura ? '' : 'disabled'}>
|
||||||
<thead>
|
<table class="table">
|
||||||
<tr>
|
<thead>
|
||||||
<th>Aplicación</th>
|
<tr>
|
||||||
<th>Vigente</th>
|
<th>Aplicación</th>
|
||||||
<th>Acceso</th>
|
<th>Vigente</th>
|
||||||
<th>Solo Visualiza</th>
|
<th>Acceso</th>
|
||||||
</tr>
|
<th>Solo Visualiza</th>
|
||||||
</thead>
|
</tr>
|
||||||
<tbody>
|
</thead>
|
||||||
{#each permisos as app}
|
<tbody>
|
||||||
<tr>
|
{#each permisos as app}
|
||||||
<td>{app.nombre_app}</td>
|
<tr>
|
||||||
<td>{app.vigente ? '✅' : '⛔'}</td>
|
<td>{app.nombre_app}</td>
|
||||||
<td>
|
<td>{app.vigente ? '✅' : '⛔'}</td>
|
||||||
<div class="form-check form-switch">
|
<td>
|
||||||
<input class="form-check-input" type="checkbox" role="switch" id={`check-acceso-${app.id_aplicacion}`}
|
<div class="form-check form-switch">
|
||||||
bind:checked={app.acceso}
|
<input class="form-check-input" type="checkbox" role="switch" id={`check-acceso-${app.id_aplicacion}`}
|
||||||
on:change={() => app.modificado = true}
|
bind:checked={app.acceso}
|
||||||
disabled={!app.vigente}>
|
on:change={() => app.modificado = true}
|
||||||
<label class="form-check-label" for={`check-acceso-${app.id_aplicacion}`}> </label>
|
disabled={!app.vigente}>
|
||||||
</div>
|
<label class="form-check-label" for={`check-acceso-${app.id_aplicacion}`}> </label>
|
||||||
</td>
|
</div>
|
||||||
<td>
|
</td>
|
||||||
<div class="form-check form-switch">
|
<td>
|
||||||
<input class="form-check-input" type="checkbox" role="switch" id={`check-solo-visualiza-${app.id_aplicacion}`}
|
<div class="form-check form-switch">
|
||||||
bind:checked={app.solo_visualizar}
|
<input class="form-check-input" type="checkbox" role="switch" id={`check-solo-visualiza-${app.id_aplicacion}`}
|
||||||
on:change={() => app.modificado = true}
|
bind:checked={app.solo_visualizar}
|
||||||
disabled={!app.vigente || !app.acceso}>
|
on:change={() => app.modificado = true}
|
||||||
<label class="form-check-label" for={`check-solo-visualiza-${app.id_aplicacion}`}> </label>
|
disabled={!app.vigente || !app.acceso}>
|
||||||
</div>
|
<label class="form-check-label" for={`check-solo-visualiza-${app.id_aplicacion}`}> </label>
|
||||||
</td>
|
</div>
|
||||||
</tr>
|
</td>
|
||||||
{/each}
|
</tr>
|
||||||
</tbody>
|
{/each}
|
||||||
</table>
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
|
@ -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}`}> </label>
|
|
||||||
</div>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
{/each}
|
|
||||||
</tbody>
|
|
||||||
</TableResponsive>
|
|
|
@ -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}`}> </label>
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
{/each}
|
||||||
|
</tbody>
|
||||||
|
</TableResponsive>
|
||||||
|
</div>
|
|
@ -5,47 +5,40 @@
|
||||||
import CantidadParaderosComuna from "./CantidadParaderosComuna.svelte";
|
import CantidadParaderosComuna from "./CantidadParaderosComuna.svelte";
|
||||||
import CantidadBusesRecorrido from "./CantidadBusesRecorrido.svelte";
|
import CantidadBusesRecorrido from "./CantidadBusesRecorrido.svelte";
|
||||||
import CantidadBusesLinea from "./CantidadBusesLinea.svelte";
|
import CantidadBusesLinea from "./CantidadBusesLinea.svelte";
|
||||||
import ActualizandoGtfs from "$/components/ActualizandoGtfs.svelte";
|
|
||||||
|
|
||||||
let loading1 = false
|
let loading1 = false
|
||||||
let loading2 = false
|
let loading2 = false
|
||||||
let loading3 = false
|
let loading3 = false
|
||||||
let loading4 = false
|
let loading4 = false
|
||||||
let loading5 = false
|
let loading5 = false
|
||||||
|
|
||||||
let actualizando = true
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
{#if actualizando}
|
<PageTitle
|
||||||
<ActualizandoGtfs on:close={() => actualizando = false} />
|
loading={loading1 || loading2 || loading3 || loading4 || loading5 }
|
||||||
{:else}
|
><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="row">
|
||||||
<div class="col-xs-12 col-md-7">
|
<div class="col-xs-12 col-md-7">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col">
|
<div class="col">
|
||||||
<CantidadLineas on:loading={ev => loading1 = ev.detail} />
|
<CantidadLineas on:loading={ev => loading1 = ev.detail} />
|
||||||
</div>
|
|
||||||
<div class="col">
|
|
||||||
<CantidadParaderos on:loading={ev => loading2 = ev.detail} />
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
|
<div class="col">
|
||||||
<div class="row">
|
<CantidadParaderos on:loading={ev => loading2 = ev.detail} />
|
||||||
<div class="col">
|
|
||||||
<CantidadParaderosComuna on:loading={ev => loading3 = ev.detail} />
|
|
||||||
</div>
|
|
||||||
<div class="col">
|
|
||||||
<CantidadBusesRecorrido on:loading={ev => loading4 = ev.detail} />
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="col-xs-12 col-md-5">
|
<div class="row">
|
||||||
<CantidadBusesLinea on:loading={ev => loading5 = ev.detail} />
|
<div class="col">
|
||||||
|
<CantidadParaderosComuna on:loading={ev => loading3 = ev.detail} />
|
||||||
|
</div>
|
||||||
|
<div class="col">
|
||||||
|
<CantidadBusesRecorrido on:loading={ev => loading4 = ev.detail} />
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{/if}
|
|
||||||
|
<div class="col-xs-12 col-md-5">
|
||||||
|
<CantidadBusesLinea on:loading={ev => loading5 = ev.detail} />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
import { base, getToken } from './_config'
|
import { base, getToken } from './_config'
|
||||||
|
|
||||||
export async function getRolLineas(params) {
|
export async function getRolOperadores(params) {
|
||||||
const query = !params ? '' : '?' + (new URLSearchParams(params).toString());
|
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" }
|
headers: { "Authorization": `Bearer ${getToken()}`, "Content-Type": "application/json" }
|
||||||
})
|
})
|
||||||
if (!res.ok) throw await res.json()
|
if (!res.ok) throw await res.json()
|
||||||
|
@ -10,8 +10,8 @@ export async function getRolLineas(params) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
export async function createRolLinea(data) {
|
export async function createRolOperador(data) {
|
||||||
const res = await fetch(`${base}/roles-lineas/`, {
|
const res = await fetch(`${base}/roles-operadores/`, {
|
||||||
method: 'POST',
|
method: 'POST',
|
||||||
body: JSON.stringify(data),
|
body: JSON.stringify(data),
|
||||||
headers: { "Authorization": `Bearer ${getToken()}`, "Content-Type": "application/json" }
|
headers: { "Authorization": `Bearer ${getToken()}`, "Content-Type": "application/json" }
|
||||||
|
@ -20,8 +20,8 @@ export async function createRolLinea(data) {
|
||||||
return res.json()
|
return res.json()
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function deleteRolLinea(id) {
|
export async function deleteRolOperador(id) {
|
||||||
const res = await fetch(`${base}/roles-lineas/${id}/`, {
|
const res = await fetch(`${base}/roles-operadores/${id}/`, {
|
||||||
method: 'DELETE',
|
method: 'DELETE',
|
||||||
headers: { "Authorization": `Bearer ${getToken()}`, "Content-Type": "application/json" }
|
headers: { "Authorization": `Bearer ${getToken()}`, "Content-Type": "application/json" }
|
||||||
})
|
})
|
Loading…
Reference in New Issue