| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709 |
- <template>
- <div>
- <ol class="breadcrumb mb-2">
- <li class="breadcrumb-item">
- <router-link :to="{name:'homeAdmin'}">Inicio</router-link>
- </li>
- <li class="breadcrumb-item active">Usuarios</li>
- </ol>
- <div class="row">
- <div class="col-12">
- <div class="card">
- <div class="card-body">
- <!-- Manejo de error -->
- <div class="alert alert-danger alert-rounded" v-if="strError.length != 0">
- <button type="button" class="close" data-dismiss="alert" aria-label="Close"></button>
- <i class="material-icons icon-align">report_problem</i>
- {{ strError }}
- </div>
- <h4 class="card-title">Usuarios</h4>
- <span
- class="text-dark"
- >En esta página se pueden visualizar una lista de usuarios disponible.</span>
- <div class="col-sm-12 mt-3">
- <form class="form-material">
- <input
- type="text"
- class="form-control col-sm-3 mb-4 float-left"
- placeholder="Buscar..."
- v-model="buscar"
- />
-
- </form>
- <b-table
- responsive
- hover
- table-bordered
- show-empty
- :fields="titulos"
- :items="usuarios"
- :busy.sync="loading"
- :current-page="currentPage"
- :per-page="perPage"
- :filter="buscar"
- @filtered="onFiltered"
- >
- <!-- Mensaje cuando no hay registros -->
- <template v-slot:empty="scope">
- <p class="text-center">No se encontraron usuarios para mostrar.</p>
- </template>
- <!-- Mensaje cuando no se encuentra ningun registro en la busqueda -->
- <template v-slot:emptyfiltered="scope">
- <p class="text-center">Su búsqueda no arrojó resultados.</p>
- </template>
- <!-- columna Perfil -->
- <template v-slot:cell(IDPERFIL)="data">
- <label
- class="label"
- :class="[data.item.IDPERFIL=='ADMINISTRADOR' ?'label-primary' :'label-info']"
- >{{ data.item.IDPERFIL }}</label>
- </template>
- <!-- columna activo -->
- <template v-slot:cell(ACTI)="data">
- <label class="label label-primary" v-if="data.item.ACTI == null">No definido</label>
- <label
- class="label"
- v-else
- :class="[data.item.ACTI ==='S'?'label-success':'label-danger']"
- >{{ (data.item.ACTI ==='S')? 'Activado':'Desactivado' }}</label>
- </template>
- <!-- Loading al extraer los datos -->
- <template v-slot:table-busy>
- <div class="text-center text-danger my-2">
- <b-spinner variant="danger" class="align-middle"></b-spinner>
- <p>Cargando...</p>
- </div>
- </template>
- <!-- Integrar columna de acciones a la tabla -->
- <template v-slot:cell(actions)="row">
- <i
- class="material-icons"
- data-toggle="tooltip"
- title="Ver Usuario"
- style="color:#f42849;cursor:pointer"
- @click="infoModalEvento(row.item, $event.target)"
- >remove_red_eye</i>
- <i
- class="material-icons"
- data-toggle="tooltip"
- title="Permisos"
- style="color:#f42849;cursor:pointer"
- @click="permisosModalEvento(row.item, $event.target)"
- v-if="row.item.ACTI !== null && row.item.ACTI !== 'N' "
- >lock</i>
- </template>
- </b-table>
- <!-- Paginación de la tabla -->
- <b-pagination
- v-model="currentPage"
- :total-rows="totalRows"
- :per-page="perPage"
- align="center"
- size="md"
- class="my-0"
- v-show="usuarios.length > 0"
- ></b-pagination>
- <!-- Modal para mostrar información del usuario -->
- <b-modal
- hide-backdrop
- content-class="shadow"
- :id="infoModal.id"
- :title="infoModal.title"
- size="lg"
- >
- <div class="row">
- <div class="col-lg-12">
- <div class="card card-outline-secondary">
- <div class="card-body">
- <form class="form-horizontal" role="form">
- <div class="form-body">
- <div class="row">
- <div class="col-lg-6 col-md-12">
- <div class="form-group row">
- <label
- class="control-label text-right col-md-4 col-4 font-bold"
- >Nombre:</label>
- <div class="col-md-8 col-8">
- <p class="form-control-static">{{ infoModal.content.IDUSNOMBRE}}</p>
- </div>
- </div>
- </div>
- <!--/span-->
- <div class="col-lg-6 col-md-12">
- <div class="form-group row">
- <label
- class="control-label text-right col-md-4 col-4 font-bold"
- >ID Usuario:</label>
- <div class="col-md-8 col-4">
- <p class="form-control-static">{{ infoModal.content.IDUS}}</p>
- </div>
- </div>
- </div>
- <!--/span-->
- </div>
- <!--/row-->
- <div class="row">
- <div class="col-lg-6 col-md-12">
- <div class="form-group row">
- <label
- class="control-label text-right col-md-4 col-4 font-bold"
- >Perfil:</label>
- <div class="col-md-8 col-8">
- <p class="form-control-static">{{ infoModal.content.IDPERFIL}}</p>
- </div>
- </div>
- </div>
- <!--/span-->
- <div class="col-lg-6 col-md-12">
- <div class="form-group row">
- <label
- class="control-label text-right col-md-4 col-4 font-bold"
- >Activo:</label>
- <div class="col-md-8 col-8">
- <p v-if="infoModal.content.ACTI == null">
- <label class="label label-warning mr-2">No definido</label>
- <a
- href="#"
- @click.prevent="cambiarEstadoUsuarioEvento(infoModal.content.IDUS,'activar', $event.target)"
- >Activar</a>
- </p>
- <p v-else>
- <b-form-checkbox
- v-model="userActive"
- value="SI"
- unchecked-value="NO"
- :disabled="infoModal.content.ACTI !== null && infoModal.content.PERM === null ? true: false"
- switch
- >
- <label
- class="label"
- :class="[userActive === 'SI' ? 'label-success' :'label-danger']"
- >{{ userActive }}</label>
- </b-form-checkbox>
- </p>
- </div>
- </div>
- </div>
- <!--/span-->
- </div>
- <p
- class="text-center"
- v-show="infoModal.content.ACTI !== null && infoModal.content.PERM === null"
- >
- Este Usuario no tiene permisos asignados,
- <a
- href="#"
- @click.prevent="permisosModalEvento(infoModal.content, $event.target)"
- >asignar permisos</a>.
- <br />
- <i>Mientras no tenga permisos asignados no podrá iniciar sesión en el Portal de Quiosco.</i>
- </p>
- </div>
- </form>
- </div>
- </div>
- </div>
- </div>
- <template v-slot:modal-footer="{ hide }">
- <div class="w-100">
- <button
- id="aceptarInfo"
- type="button"
- class="btn btn-danger float-right"
- @click="hide('forget')"
- >Aceptar</button>
- <button
- v-show="infoModal.content.ACTI == 'S' && userActive === 'NO'"
- id="guardar"
- type="button"
- class="btn btn-outline-danger mr-1 float-right"
- @click="cambiarEstadoUsuarioEvento(infoModal.content.IDUS,'desactivar', $event.target)"
- >Guardar</button>
- </div>
- </template>
- </b-modal>
- <!-- end info modal -->
- <!-- start activar/desactivar usuario modal -->
- <b-modal
- content-class="shadow"
- :id="cambiarEstadoUsuarioModal.id"
- :title="cambiarEstadoUsuarioModal.title"
- size="sm"
- ok-only
- >
- <p class="my-1" v-html="cambiarEstadoUsuarioModal.msg"></p>
- <template v-slot:modal-footer="{ hide }">
- <div class="w-100">
- <button
- id="cambiarEstadoUsuario"
- type="button"
- class="btn btn-danger float-right"
- @click="cambiarEstadoUsuarioModal.estado === 'activar'
- ? cambiarEstadoUser('activar'): cambiarEstadoUser('desactivar')"
- >
- <span v-if="!loading">
- {{ cambiarEstadoUsuarioModal.estado === 'activar'
- ? 'Activar': 'Desactivar'}}
- </span>
- <span
- class="spinner-border spinner-grow-sm"
- role="status"
- aria-hidden="true"
- style="color:white"
- v-if="loading"
- ></span>
- </button>
- <button
- type="button"
- class="btn btn-secondary mr-2 float-right"
- @click="hide('forget')"
- >Cancelar</button>
- </div>
- </template>
- </b-modal>
- <!-- end activar/desactivar usuario modal -->
-
- <!-- Modal permisos -->
- <b-modal
- hide-backdrop
- content-class="shadow"
- :id="permisosModal.id"
- :title="permisosModal.title"
- size="lg"
- >
- <div class="row">
- <div class="col-sm-12">
- <label class="float-left">
- <b>USUARIO:</b>
- {{ permisosModal.content.IDUSNOMBRE}}
- </label>
- <!-- <label class="float-right"> -->
- <!-- <h5 class="text-left">Permisos</h5> -->
- <!-- </label> -->
- </div>
- </div>
- <div class="row">
- <div class="col-lg-8 col-sm-12 col-12">
- <div class="navigation-filter">
- <input
- class="form-control mb-2"
- type="text"
- v-model="treeFilter"
- value
- placeholder="Buscar..."
- />
- </div>
- <tree
- v-if="treeData"
- :data="treeData"
- @node:selected="onSelect"
- :options="optsTree"
- :filter="treeFilter"
- ref="tree"
- class="card card-outline-secondary"
- >
- <span class="tree-scope" slot-scope="{ node }">
- <template v-if="!node.hasChildren()">
- <i class="material-icons icon-align" style="color:#f42849">folder_open</i>
- {{ node.text }}
- </template>
- <template v-else>
- <i
- class="material-icons icon-align"
- style="color:#f42849"
- >{{ node.expanded() ? 'folder' : 'create_new_folder' }}</i>
- {{ node.text }}
- </template>
- </span>
- </tree>
- </div>
- <div
- class="col-lg-4 col-sm-12 col-12 card card-outline-secondary pb-4"
- v-if="selectedNode"
- >
- <h6 class="mt-3 text-center">Establecer permisos</h6>
- <!-- checkbox permisos -->
- <div class="m-auto p-3 card card-outline-secondary">
- <b-form-radio
- v-model="permisos.tipo"
- name="permisoSinAcceso"
- @input="cambiarPermisoRadio"
- value="Sin Acceso"
- >Sin Acceso</b-form-radio>
- <b-form-radio
- v-model="permisos.tipo"
- name="permisoPublicaryVer"
- @input="cambiarPermisoRadio"
- value="Ver + Publicar"
- >Ver + Publicar</b-form-radio>
- <b-form-radio
- v-model="permisos.tipo"
- name="permisoVer"
- value="Ver"
- @input="cambiarPermisoRadio"
- >Ver</b-form-radio>
- </div>
- </div>
- </div>
- <template v-slot:modal-footer="{ hide }">
- <div class="w-100">
- <button
- id="guardarPermisos"
- type="button"
- class="btn btn-danger float-right"
- @click="guardarPermisos()"
- :disabled="!verBtnGuardarPermisos"
- >Guardar</button>
- <button
- id="cancelarPermisos"
- type="button"
- class="btn btn-secondary mr-1 float-right"
- @click="hide('forget')"
- >Cancelar</button>
- <button
- v-if="editandoPermiso"
- id="previsualizarPermisos"
- @click="cambiarPermisos"
- class="btn btn-outline-danger mr-1 float-right"
- type="button"
- value="Previsualizar"
- >Previsualizar</button>
- </div>
- </template>
- </b-modal>
- <!-- end modal permisos -->
- </div>
- </div>
- </div>
- </div>
- </div>
-
- </div>
- </template>
- <script>
- import "bootstrap-vue/dist/bootstrap-vue.css";
- import {
- BTable,
- BSpinner,
- BModal,
- BPagination,
- BFormCheckbox,
- BFormRadio,
- ModalPlugin,
- BTooltip
- } from "bootstrap-vue";
- import { token } from "../../_mixin/user_mixin.js";
- import LiquorTree from "liquor-tree";
- var _ = require("lodash");
- export default {
- name: "UsuariosAdmin",
- mixins: [token],
- components: {
- BTable,
- BModal,
- BSpinner,
- BPagination,
- BFormCheckbox,
- BFormRadio,
- ModalPlugin,
- BTooltip,
- [LiquorTree.name]: LiquorTree
- },
- data: () => ({
- selectedNode: "",
- treeFilter: "",
- buscar: "",
- totalRows: 1,
- currentPage: 1,
- perPage: 25,
- userActive: "NO",
- verBtnGuardarInfo: false,
- editandoPermiso: false,
- verBtnGuardarPermisos: false,
- infoModal: {
- id: "info-modal",
- title: "",
- content: {}
- },
- cambiarEstadoUsuarioModal: {
- id: "modal-activar",
- title: "",
- msg: "",
- estado: ""
- },
- permisosModal: {
- id: "permisos-modal",
- title: "",
- content: {}
- },
- permisos: {
- tipo: "Sin Acceso"
- },
- optsTree: {
- parentSelect: true,
- filter: {
- emptyText: "No se ha encontrado nada :( "
- }
- },
- treeData: [],
- titulos: [
- {
- key: "IDUS",
- label: "ID",
- sortable: true
- },
- {
- key: "IDUSNOMBRE",
- label: "Nombre",
- sortable: true
- },
- {
- key: "IDPERFIL",
- label: "Perfil",
- sortable: true
- },
- {
- key: "ACTI",
- label: "Estado",
- sortable: true
- },
- { key: "actions", label: "Acciones" }
- ]
- }),
- async created() {
- await this.getUsuarios();
- await this.getEstantes();
- this.totalRows = this.usuarios.length;
- },
- methods: {
- cambiarPermisoRadio(permisoSelect) {
- let arrNode = this.selectedNode.text.split("|");
- let permisoSeleccionado = arrNode[1];
- this.editandoPermiso =
- this.permisos.tipo.trim() !== permisoSeleccionado.trim() ? true : false;
- this.cambiarPermisos();
- },
- getJsonPermisosFiltrado() {
- var dataTree = this.$refs.tree;
- var data = dataTree.toJSON();
- var treeCloned = _.cloneDeep(data);
- // Remover nodo data
- var startTree = _.omit(treeCloned[0], "data");
- // Filtrar solo estado expanded y selectable para primer nivel
- var stateFirst = _.pick(startTree.state, ["expanded", "selectable"]);
- // Asignar primer estado
- startTree.state = stateFirst;
- var firtsChildren = _.values(
- _.mapValues(startTree.children, function(esta) {
- return _.omit(esta, ["state", "data"]);
- })
- );
- // Filtros anidados para remover state y data de estantes,categorias y secciones.
- var filterChild = _.values(
- _.mapValues(firtsChildren, estantes => {
- estantes.children = _.values(
- _.mapValues(estantes.children, seccciones => {
- seccciones.children = _.values(
- _.mapValues(seccciones.children, categorias => {
- return _.omit(categorias, ["state", "data"]);
- })
- );
- return _.omit(seccciones, ["state", "data"]);
- })
- );
- return _.omit(estantes, ["state", "data"]);
- })
- );
- // Asignar hijos filtrados al arreglo padre
- startTree.children = filterChild;
- let treeFiltered = "[" + JSON.stringify(startTree) + "]";
- return treeFiltered;
- },
- guardarPermisos() {
- let jsonPermisos = this.getJsonPermisosFiltrado();
- let datos = {
- IDUS: this.permisosModal.content.IDUS,
- PERM: jsonPermisos
- };
- this.sendPermisos(datos).then(data => {
- this.getUsuarios();
- //cerrar modales
- this.$root.$emit("bv::hide::modal", "permisos-modal");
- this.$root.$emit("bv::hide::modal", "info-modal");
- });
- },
- cambiarPermisos() {
- this.getFullPath(this.selectedNode);
- this.editandoPermiso = false;
- },
- onSelect(node) {
- var arrNode = node.text.split("|");
- if (arrNode.length > 1) {
- var arrPermiso = arrNode[1];
- this.permisos.tipo = arrPermiso.trim();
- }
- this.selectedNode = node;
- },
- getFullPath(nodoSeleccionado) {
- this.verBtnGuardarPermisos = true;
- // asignamos el nodo actual para despues iterarlo
- const nodoActual = [nodoSeleccionado];
- const fullPathUp = [nodoSeleccionado];
- const fullPathDown = [nodoSeleccionado];
- // asignamos los elementos recursivos a fullPathUp y FullPathDown
- nodoSeleccionado.recurseUp(parent => fullPathUp.unshift(parent));
- nodoSeleccionado.recurseDown(children => fullPathDown.push(children));
- if (this.permisos.tipo === "Sin Acceso" || this.permisos.tipo === "Ver") {
- // Recursivos hacia abajo
- return fullPathDown.forEach(node => {
- const perm = node.text.split("| ");
- const text = perm[0];
- const tipoPermiso = perm[1];
- return (node.text = text + "| " + this.permisos.tipo);
- });
- } else {
- // Recursivo hacia arriba
- return fullPathUp.forEach((node, key) => {
- const perm = node.text.split("| ");
- const text = perm[0];
- const tipoPermiso = perm[1];
- // si es == sin acceso o ver el parent cambiarlo
- if (tipoPermiso === "Sin Acceso" || tipoPermiso === "Ver") {
- return (node.text = text + "| " + this.permisos.tipo);
- }
- if (nodoSeleccionado.text === node.text) {
- // Solo cambiar el nodo actual
- return (node.text = text + "| " + this.permisos.tipo);
- }
- });
- }
- },
- infoModalEvento(item, button) {
- this.infoModal.title = "Información de usuario";
- this.infoModal.content = item;
- this.$root.$emit("bv::show::modal", this.infoModal.id, button);
- this.verBtnGuardarInfo = false;
- this.userActive = this.infoModal.content.ACTI === "S" ? "SI" : "NO";
- },
- permisosModalEvento(item, button) {
- this.permisosModal.title = "Permisos de usuario";
- this.permisosModal.content = item;
- // Obtener los permisos del usuario
- this.getPermisos(item.IDUS).then(resut => {
- this.$refs.tree.setModel(this.permisosDatos);
- });
- this.$root.$emit("bv::show::modal", this.permisosModal.id, button);
- this.selectedNode = "";
- this.verBtnGuardarPermisos = false;
- this.treeFilter = "";
- },
- cambiarEstadoUsuarioEvento(id, estado, button) {
- this.cambiarEstadoUsuarioModal.estado = estado;
- if (estado === "activar") {
- this.cambiarEstadoUsuarioModal.title = "Activar usuario";
- this.cambiarEstadoUsuarioModal.msg =
- "¿ Desea activar el usuario con ID: <b>" + id + "</b> en el sistema?";
- } else {
- this.cambiarEstadoUsuarioModal.title = "Desactivar usuario";
- this.cambiarEstadoUsuarioModal.msg =
- "¿ Desea desactivar el usuario con ID: <b>" +
- id +
- "</b> ?, si desactiva al usuario, no podrá <i>iniciar sesión</i> y sus permisos serán <b>removidos</b>.";
- }
- this.$root.$emit(
- "bv::show::modal",
- this.cambiarEstadoUsuarioModal.id,
- button
- );
- },
- onFiltered(filteredItems) {
- // Actualiza el paginador al utilizar el filtro
- this.totalRows = filteredItems.length;
- this.currentPage = 1;
- },
- cambiarEstadoUser(action) {
- const idperfil = this.infoModal.content.IDPERFIL;
- const idus = this.infoModal.content.IDUS;
- // Insertamos los datos en BD
- this.sendEstadoUser(idus, action).then(res => {
- this.$root.$emit("bv::hide::modal", "modal-activar");
- // Actualizamos los datos del usuario actual
- this.getUsuarios().then(() => {
- const setNewContent = this.usuarios.filter(
- user => user.IDUS === idus && user.IDPERFIL === idperfil
- );
- this.infoModal.content = setNewContent[0];
- });
- });
- this.verBtnGuardarInfo = false;
- },
- sendPermisos(datos) {
- return this.$http
- .post(this.url_api + "/usuario/permisos", datos, this.config_header)
- .then(response => {
- if (response.data.response) {
- return this.$toasted.show(
- response.data.message,
- this.$toast_success
- );
- } else {
- return this.$toasted.show(response.data.message, this.$toast_error);
- }
- })
- .catch(error => {
- this.strError =
- "Se ha producido un error al guardar los permisos. error: " + error;
- });
- },
- sendEstadoUser(idus, method) {
- let action =
- method === "activar" ? "/usuario/activar" : "/usuario/desactivar";
- return this.$http
- .post(this.url_api + action, [idus], this.config_header)
- .then(response => {
- if (response.data.response) {
- return this.$toasted.show(
- response.data.message,
- this.$toast_success
- );
- } else {
- return this.$toasted.show(response.data.message, this.$toast_error);
- }
- })
- .catch(error => {
- this.strError =
- "Se ha producido un error al activar el usuario, error: " + error;
- });
- }
- }
- };
- </script>
- <style scoped>
- table.b-table[aria-busy="true"] {
- opacity: 0.7;
- }
- .page-titles .breadcrumb .breadcrumb-item + .breadcrumb-item::before {
- content: "/";
- }
- .table-responsive {
- box-shadow: 0px 0px 7px 2px #f2f2f2;
- padding: 15px;
- }
- </style>
|