Advertisement
Guest User

Untitled

a guest
Oct 14th, 2019
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 25.36 KB | None | 0 0
  1. <template>
  2. <div>
  3. <base-header class="pb-6">
  4. <div class="row align-items-center py-4">
  5. <div class="col-lg-6 col-7">
  6. <h6 class="h2 text-white d-inline-block mb-0">{{$route.name}}</h6>
  7. <nav aria-label="breadcrumb" class="d-none d-md-inline-block ml-md-4">
  8. <route-breadcrumb/>
  9. </nav>
  10. </div>
  11.  
  12. </div>
  13. </base-header>
  14.  
  15. <div class="container-fluid mt--6">
  16. <div class="row">
  17. <div class="col">
  18.  
  19. <div class="card">
  20. <div class="border-0 card-header">
  21. <div class="d-flex justify-content-between">
  22. <h3 class="mb-0">Listas</h3>
  23. <base-button tag="a" size="sm" outline type="celcompink" href="/contactos/nueva-lista"><i class="fas fa-plus"></i> Nueva Lista</base-button>
  24. </div>
  25.  
  26. <h4 v-show="tabContact" class="mb-0">Detalle lista "{{ listaNombre }}" </h4>
  27.  
  28. </div>
  29.  
  30. <div>
  31. <div class="col-12 d-flex justify-content-between mb-4">
  32. <el-select
  33. class="select-primary pagination-select"
  34. v-model="pagination.perPage"
  35. placeholder="Per page"
  36. >
  37. <el-option
  38. class="select-primary"
  39. v-for="item in pagination.perPageOptions"
  40. :key="item"
  41. :label="item"
  42. :value="item"
  43. >
  44. </el-option>
  45. </el-select>
  46.  
  47. <div v-show="tabContact">
  48. <el-tooltip content="Agregar Contacto" placement="left">
  49. <a href="#!" @click.prevent="abrirAgregar(contactSingle)" class="text-success" data-toggle="tooltip" data-original-title="Ver Lista">
  50. <i class="fas fa-user-plus"></i>
  51. </a>
  52. </el-tooltip>
  53. </div>
  54. </div>
  55. </div>
  56.  
  57. <div class="col-12" v-show="!tabContact">
  58. <el-table class="table-responsive table-flush"
  59. header-row-class-name="thead-light"
  60. :data="queriedData">
  61. <el-table-column label="Nombre"
  62. prop="name"
  63. min-width="200px"
  64. sortable>
  65. <template v-slot="{row}">
  66. <div class="media align-items-center">
  67. <div class="media-body">
  68. <span class="font-weight-600 mb-0 text-sm">{{row.name}}</span>
  69. </div>
  70. </div>
  71. </template>
  72. </el-table-column>
  73. <el-table-column label="Fecha Creación"
  74. prop="created"
  75. min-width="200px"
  76. sortable>
  77. </el-table-column>
  78.  
  79. <el-table-column label="Estado"
  80. prop="active"
  81. min-width="150px"
  82. sortable>
  83. <template v-slot="{row}">
  84. <badge class="mr-4" :type="(row.active==true) ? 'success' : 'danger'">
  85. <span class="status">{{ (row.active==true) ? "Activo" : "Inactivo" }}</span>
  86. </badge>
  87. </template>
  88. </el-table-column>
  89. <el-table-column label="Acción" min-width="150px">
  90. <div slot-scope="{row}" class="table-actions">
  91. <el-tooltip content="Ver Lista" placement="top">
  92. <a href="#!" @click.prevent="onShowList(row)" class="table-action" data-toggle="tooltip" data-original-title="Ver Lista">
  93. <i class="fas fa-eye"></i>
  94. </a>
  95. </el-tooltip>
  96. <el-tooltip content="Editar" placement="top">
  97. <a href="#!" @click.prevent="onEditContactGroup(row)" class="table-action table-action-edit" data-toggle="tooltip" data-original-title="Editar lista">
  98. <i class="fas fa-edit"></i>
  99. </a>
  100. </el-tooltip>
  101. <el-tooltip content="Eliminar" placement="top">
  102. <a href="#!" @click.prevent="onDeleteContactGroup(row)" class="table-action table-action-delete" data-toggle="tooltip"
  103. data-original-title="Eliminar Lista">
  104. <i class="fas fa-trash"></i>
  105. </a>
  106. </el-tooltip>
  107. </div>
  108. </el-table-column>
  109. </el-table>
  110. </div>
  111.  
  112. <div class="col-12" v-show="tabContact">
  113.  
  114. <el-table class="table-responsive table-flush"
  115. header-row-class-name="thead-light"
  116. :data="queriedData">
  117.  
  118. <el-table-column label="Código de área"
  119. prop="phoneCode"
  120. min-width="200px"
  121. sortable>
  122. </el-table-column>
  123.  
  124. <el-table-column label="Teléfono"
  125. prop="phone"
  126. min-width="250px"
  127. sortable>
  128. </el-table-column>
  129.  
  130.  
  131. <el-table-column label="Estado"
  132. prop="status"
  133. min-width="150px">
  134. <template v-slot="{row}">
  135. <badge class="mr-4" :type="(row.status==true) ? 'success' : 'danger'">
  136. <span class="status">{{ (row.status==true) ? "Activo" : "Inactivo" }}</span>
  137. </badge>
  138. </template>
  139. </el-table-column>
  140.  
  141. <el-table-column label="Acción" min-width="150px">
  142. <div slot-scope="{row}" class="table-actions">
  143. <el-tooltip content="Editar" placement="top">
  144. <a href="#!" @click.prevent="onEditContact(row)" class="table-action table-action-edit" data-toggle="tooltip" data-original-title="Editar lista">
  145. <i class="fas fa-edit"></i>
  146. </a>
  147. </el-tooltip>
  148. <el-tooltip content="Eliminar" placement="top">
  149. <a href="#!" @click.prevent="onDeleteContact(row)" class="table-action table-action-delete" data-toggle="tooltip"
  150. data-original-title="Eliminar Lista">
  151. <i class="fas fa-trash"></i>
  152. </a>
  153. </el-tooltip>
  154. </div>
  155. </el-table-column>
  156. </el-table>
  157.  
  158. </div>
  159.  
  160. <div
  161. slot="footer"
  162. class="col-12 mt-4 d-flex justify-content-center justify-content-sm-between flex-wrap"
  163. >
  164. <div class="">
  165. <small class="card-category">
  166. Mostrando {{ from + 1 }} a {{ to }} de {{ total }} entradas
  167.  
  168. <span v-if="selectedRows.length">
  169. &nbsp; &nbsp; {{selectedRows.length}} rows selected
  170. </span>
  171. </small>
  172.  
  173. </div>
  174. <base-pagination
  175. class="pagination-no-border"
  176. v-model="pagination.currentPage"
  177. :per-page="pagination.perPage"
  178. :total="total"
  179. >
  180. </base-pagination>
  181. </div>
  182. </div>
  183.  
  184. </div>
  185. </div>
  186.  
  187. <div class="row">
  188.  
  189. <modal :show.sync="modals.formSingle"
  190. modal-classes="modal-secondary text-default"
  191. modal-content-classes="bg-gradient-secondary">
  192. <h6 slot="header" class="modal-title text-default">Editar número contacto</h6>
  193. <form role="form">
  194. <div class="row">
  195. <base-input alternative
  196. v-model="contactSingle.phoneCode"
  197. class="mb-3 col-md-6"
  198. placeholder="Código"
  199. prepend-icon="ni ni-world">
  200. </base-input>
  201. <base-input alternative
  202. v-model="contactSingle.phone"
  203. class="mb-3 col-md-6"
  204. placeholder="Teléfono"
  205. prepend-icon="ni ni-email-83">
  206. </base-input>
  207. </div>
  208.  
  209. <div class="d-flex justify-content-between my-4">
  210. <base-button type="celcompink"
  211. @click="guardarEdicion(contactSingle)">
  212. Guardar
  213. </base-button>
  214. <base-button outline
  215. type="celcompink"
  216. @click="modals.formSingle = false">
  217. Cerrar
  218. </base-button>
  219. </div>
  220. </form>
  221.  
  222. </modal>
  223.  
  224. <modal :show.sync="modals.formGroup"
  225. modal-classes="modal-secondary text-default"
  226. modal-content-classes="bg-gradient-secondary">
  227. <h6 slot="header" class="modal-title text-default">Editar nombre lista</h6>
  228. <form role="form">
  229. <base-input alternative
  230. v-model="contactGroup.name"
  231. class="mb-3"
  232. placeholder="Nombre"
  233. prepend-icon="ni ni-badge">
  234. </base-input>
  235.  
  236. <div class="d-flex justify-content-between my-4">
  237. <base-button type="celcompink"
  238. @click="guardarEdicionGroup(contactGroup)">
  239. Guardar
  240. </base-button>
  241. <base-button outline
  242. type="celcompink"
  243. @click="salirSinCambios(contactGroup)">
  244. Cerrar
  245. </base-button>
  246. </div>
  247. </form>
  248.  
  249. </modal>
  250.  
  251. <modal :show.sync="modals.advertenciaSingle"
  252. gradient="danger"
  253. modal-classes="modal-danger modal-dialog-centered">
  254. <h6 slot="header" class="modal-title" id="modal-title-notification">Borrar contacto</h6>
  255.  
  256. <div class="text-center">
  257. <i class="fas fa-exclamation-circle ni-3x mb-3"></i>
  258. <p class="mb-0">Estás a punto de eliminar este contacto.</p>
  259. <span>{{ contactSingle.phoneCode }} {{ contactSingle.phone }}</span>
  260. </div>
  261.  
  262. <template slot="footer">
  263. <base-button type="white text-danger"
  264. @click="borrarContacto(contactSingle)">
  265. Borrar
  266. </base-button>
  267. <base-button type="link"
  268. class="ml-auto text-white"
  269. @click="modals.advertenciaSingle = false">
  270. Cerrar
  271. </base-button>
  272. </template>
  273. </modal>
  274.  
  275. <modal :show.sync="modals.advertenciaGroup"
  276. gradient="danger"
  277. modal-classes="modal-danger modal-dialog-centered">
  278. <h6 slot="header" class="modal-title" id="modal-title-notification">Borrar lista</h6>
  279.  
  280. <div class="text-center">
  281. <i class="fas fa-exclamation-circle ni-3x mb-3"></i>
  282. <p class="mb-0">Estás a punto de eliminar esta lista.</p>
  283. <span>{{ contactGroup.name }}</span>
  284. </div>
  285.  
  286. <template slot="footer">
  287. <base-button type="white text-danger"
  288. @click="borrarContactoGroup(contactGroup)">
  289. Borrar
  290. </base-button>
  291. <base-button type="link"
  292. class="ml-auto text-white"
  293. @click="modals.advertenciaGroup = false">
  294. Cerrar
  295. </base-button>
  296. </template>
  297. </modal>
  298.  
  299. <modal :show.sync="modals.agregarContacto"
  300. modal-classes="modal-secondary text-default"
  301. modal-content-classes="bg-gradient-secondary">
  302. <h6 slot="header" class="modal-title text-default">Agregar número contacto</h6>
  303. <form role="form">
  304. <div class="row">
  305. <base-input alternative
  306. v-model="contactSingle.phoneCode"
  307. class="mb-3 col-md-6"
  308. placeholder="Código"
  309. prepend-icon="ni ni-world">
  310. </base-input>
  311. <base-input alternative
  312. v-model="contactSingle.phone"
  313. class="mb-3 col-md-6"
  314. placeholder="Teléfono"
  315. prepend-icon="ni ni-email-83">
  316. </base-input>
  317. </div>
  318.  
  319. <div class="d-flex justify-content-between my-4">
  320. <base-button type="celcompink"
  321. @click="guardarNuevo(contactSingle)">
  322. Guardar
  323. </base-button>
  324. <base-button outline
  325. type="celcompink"
  326. @click="modals.agregarContacto = false">
  327. Cerrar
  328. </base-button>
  329. </div>
  330. </form>
  331.  
  332. </modal>
  333.  
  334. </div>
  335.  
  336. </div>
  337.  
  338. </div>
  339. </template>
  340. <script>
  341. import { Table, TableColumn, DropdownMenu, DropdownItem, Dropdown, Select, Option } from 'element-ui'
  342. import { BasePagination, Modal, Dialog } from '@/components';
  343.  
  344. import moment from 'moment';
  345. import clientPaginationMixin from '@/views/Tables/PaginatedTables/clientPaginationMixin';
  346. import modContacts from './modContacts'
  347.  
  348. import AES256 from 'aes-everywhere';
  349. import Vue from 'vue'
  350. import axios from 'axios'
  351. import VueAxios from 'vue-axios'
  352. import Config from '@/config/config.js'
  353. import { getUser, setUser, encryptAES, horaAhora } from '@/util/util.js';
  354.  
  355. Vue.use(VueAxios, axios)
  356. Vue.use(Dialog)
  357.  
  358. export default {
  359. mixins: [clientPaginationMixin],
  360. components: {
  361. BasePagination,
  362. [Table.name]: Table,
  363. [TableColumn.name]: TableColumn,
  364. [Dropdown.name]: Dropdown,
  365. [DropdownItem.name]: DropdownItem,
  366. [DropdownMenu.name]: DropdownMenu,
  367. [Select.name]: Select,
  368. [Option.name]: Option,
  369. Modal,
  370. Dialog
  371. },
  372. data() {
  373. return {
  374. currentPage: 1,
  375. tableData: [],
  376. listaContactos: [],
  377. selectedRows: [],
  378. tabContact: false,
  379. listaNombre: "",
  380. contactGroup: {},
  381. contactSingle: {},
  382. modals: {
  383. formSingle: false,
  384. formGroup: false,
  385. advertenciaSingle: false,
  386. advertenciaGroup: false,
  387. agregarContacto: false
  388. }
  389. };
  390. },
  391. methods: {
  392. obtenerLista() {
  393.  
  394. this.$loading.show() //delay default is 300ms
  395.  
  396. let self = this;
  397. let user = getUser();
  398.  
  399. let js = {
  400. "time_expired":horaAhora(),
  401. "customer":encodeURIComponent(JSON.stringify(user.customer))
  402. }
  403.  
  404. var body = new URLSearchParams(); body.append('TOKEN', (encryptAES(js)));
  405.  
  406. Vue.axios.post(Config.url_service+Config.contact_available, body, {
  407. headers: {
  408. 'Content-Type': 'application/x-www-form-urlencoded',
  409. },
  410. })
  411. .then(function (response) {
  412. console.log(response)
  413.  
  414. if (response.data.response === "200") {
  415. console.log(response.data.data);
  416.  
  417. self.tableData = response.data.data;
  418.  
  419. } else {
  420. console.log("No se encontró lista");
  421. alert("No se encontró lista");
  422. }
  423.  
  424. self.$loading.hide()
  425.  
  426. })
  427. .catch(function (error) {
  428. console.log("No se encontró lista",error);
  429. alert("No se encontró lista");
  430. self.$loading.hide();
  431. });
  432.  
  433. },
  434. onShowList(lista) {
  435.  
  436. this.$loading.show()
  437.  
  438. let self = this;
  439. let user = getUser();
  440.  
  441. let js = {
  442. "time_expired":horaAhora(),
  443. "contact_group":encodeURIComponent(JSON.stringify(lista)),
  444. "contact_status":"true"
  445. }
  446.  
  447. var body = new URLSearchParams(); body.append('TOKEN', (encryptAES(js)));
  448.  
  449. Vue.axios.post(Config.url_service+Config.contact_available_contact, body, {
  450. headers: {
  451. 'Content-Type': 'application/x-www-form-urlencoded',
  452. },
  453. })
  454.  
  455. .then(function (response) {
  456. console.log(response)
  457.  
  458. if (response.data.response === "200") {
  459. console.log(response.data.data);
  460. self.tabContact = true;
  461.  
  462. self.listaNombre = lista.name;
  463. self.tableData = response.data.data;
  464.  
  465. self.contactGroup = lista;
  466.  
  467. } else {
  468. console.log("No se encontró lista");
  469. alert("No se encontró lista");
  470. }
  471.  
  472. self.$loading.hide()
  473.  
  474. })
  475. .catch(function (error) {
  476. console.log("No se encontró lista",error);
  477. alert("No se encontró lista");
  478. self.$loading.hide();
  479. });
  480.  
  481. },
  482. onEditContactGroup(row) {
  483.  
  484. let self = this;
  485. let modals = modals;
  486.  
  487. self.contactGroup = row;
  488. self.modals.formGroup = true;
  489.  
  490. },
  491. onEditContact(row) {
  492.  
  493. let self = this;
  494. let modals = modals;
  495.  
  496. self.contactSingle = row;
  497. self.modals.formSingle = true;
  498.  
  499. },
  500. guardarEdicionGroup(contactGroup) {
  501.  
  502. this.$loading.show()
  503.  
  504. let self = this;
  505. let user = getUser();
  506.  
  507. let js = {
  508. "time_expired":horaAhora(),
  509. "contact_group":encodeURIComponent(JSON.stringify(this.contactGroup)),
  510. "customer":encodeURIComponent(JSON.stringify(user.customer)),
  511. }
  512.  
  513. var body = new URLSearchParams(); body.append('TOKEN', (encryptAES(js)));
  514.  
  515. Vue.axios.post(Config.url_service+Config.contact_edit_contact_group, body, {
  516. headers: {
  517. 'Content-Type': 'application/x-www-form-urlencoded',
  518. },
  519. })
  520. .then(function (response) {
  521. console.log(response)
  522.  
  523. if (response.data.response === "200") {
  524. console.log(response.data.data);
  525.  
  526. self.tableData = response.data.data;
  527. self.modals.formGroup = false;
  528.  
  529. } else {
  530. console.log("No se pudo editar nombre lista");
  531. alert("No se pudo editar nombre lista");
  532. }
  533.  
  534. self.$loading.hide()
  535.  
  536. })
  537.  
  538. },
  539. guardarEdicion(contactSingle) {
  540.  
  541. this.$loading.show()
  542.  
  543. let self = this;
  544. let user = getUser();
  545.  
  546. let js = {
  547. "time_expired":horaAhora(),
  548. "contact_group":encodeURIComponent(JSON.stringify(this.contactGroup)),
  549. "contact":encodeURIComponent(JSON.stringify(this.contactSingle)),
  550. "customer":encodeURIComponent(JSON.stringify(user.customer)),
  551. }
  552.  
  553. var body = new URLSearchParams(); body.append('TOKEN', (encryptAES(js)));
  554.  
  555. Vue.axios.post(Config.url_service+Config.contact_edit_contact, body, {
  556. headers: {
  557. 'Content-Type': 'application/x-www-form-urlencoded',
  558. },
  559. })
  560. .then(function (response) {
  561. console.log(response)
  562.  
  563. if (response.data.response === "200") {
  564. console.log(response.data.data);
  565.  
  566. self.tableData = response.data.data;
  567. self.modals.formSingle = false;
  568.  
  569. } else {
  570. console.log("No se pudo editar contacto");
  571. alert("No se pudo editar contacto");
  572. }
  573.  
  574. self.$loading.hide()
  575.  
  576. })
  577.  
  578. },
  579. onDeleteContact(row) {
  580.  
  581. let self = this;
  582. let modals = modals;
  583.  
  584. self.contactSingle = row;
  585. self.modals.advertenciaSingle = true;
  586.  
  587. },
  588. onDeleteContactGroup(row) {
  589.  
  590. let self = this;
  591. let modals = modals;
  592.  
  593. self.contactGroup = row;
  594. self.modals.advertenciaGroup = true;
  595.  
  596. },
  597. borrarContacto(contactSingle) {
  598.  
  599. this.$loading.show()
  600.  
  601. let self = this;
  602. let user = getUser();
  603.  
  604. let js = {
  605. "time_expired":horaAhora(),
  606. "contact_group":encodeURIComponent(JSON.stringify(this.contactGroup)),
  607. "contact":encodeURIComponent(JSON.stringify(this.contactSingle)),
  608. }
  609.  
  610. var body = new URLSearchParams(); body.append('TOKEN', (encryptAES(js)));
  611.  
  612. Vue.axios.post(Config.url_service+Config.contact_delete_contact, body, {
  613. headers: {
  614. 'Content-Type': 'application/x-www-form-urlencoded',
  615. },
  616. })
  617. .then(function (response) {
  618. console.log(response)
  619.  
  620. if (response.data.response === "200") {
  621. console.log(response.data.data);
  622.  
  623. self.tableData = response.data.data;
  624. self.modals.advertenciaSingle = false;
  625.  
  626. }
  627.  
  628. })
  629.  
  630. self.$loading.hide()
  631.  
  632. },
  633. borrarContactoGroup(contactGroup) {
  634.  
  635. this.$loading.show()
  636.  
  637. let self = this;
  638. let user = getUser();
  639.  
  640. let js = {
  641. "time_expired":horaAhora(),
  642. "contact_group":encodeURIComponent(JSON.stringify(this.contactGroup)),
  643. "customer":encodeURIComponent(JSON.stringify(user.customer)),
  644. }
  645.  
  646. var body = new URLSearchParams(); body.append('TOKEN', (encryptAES(js)));
  647.  
  648. Vue.axios.post(Config.url_service+Config.contact_delete_contact_group, body, {
  649. headers: {
  650. 'Content-Type': 'application/x-www-form-urlencoded',
  651. },
  652. })
  653. .then(function (response) {
  654. console.log(response)
  655.  
  656. if (response.data.response === "200") {
  657. console.log(response.data.data);
  658.  
  659. self.tableData = response.data.data;
  660. self.modals.advertenciaGroup = false;
  661.  
  662. }
  663.  
  664. })
  665.  
  666. self.$loading.hide()
  667.  
  668. },
  669. abrirAgregar(contactSingle) {
  670.  
  671. let self = this;
  672. let modals = modals;
  673.  
  674. self.modals.agregarContacto = true;
  675.  
  676. },
  677. guardarNuevo(contactSingle) {
  678.  
  679. this.$loading.show()
  680.  
  681. let self = this;
  682. let user = getUser();
  683.  
  684. let nuevoContacto = {
  685. "phoneCode": this.contactSingle.phoneCode,
  686. "phone": this.contactSingle.phone,
  687. "contactGroup": this.contactGroup,
  688. "field": "usuario1|21|23500||||||||||",
  689. "status": true,
  690. "selected": false
  691. };
  692.  
  693. let js = {
  694. "time_expired":horaAhora(),
  695. "contact_group":encodeURIComponent(JSON.stringify(this.contactGroup)),
  696. "contact":encodeURIComponent(JSON.stringify(nuevoContacto)),
  697. "customer":encodeURIComponent(JSON.stringify(user.customer)),
  698. }
  699.  
  700. var body = new URLSearchParams(); body.append('TOKEN', (encryptAES(js)));
  701.  
  702. Vue.axios.post(Config.url_service+Config.contact_add_contact, body, {
  703. headers: {
  704. 'Content-Type': 'application/x-www-form-urlencoded',
  705. },
  706. })
  707. .then(function (response) {
  708. console.log(response)
  709.  
  710. if (response.data.response === "200") {
  711. console.log(response.data.data);
  712.  
  713. self.tableData = response.data.data;
  714. self.modals.agregarContacto = false;
  715.  
  716. } else {
  717. console.log("No se pudo crear contacto");
  718. alert("No se pudo crear contacto");
  719. }
  720.  
  721. self.$loading.hide()
  722.  
  723. })
  724.  
  725. },
  726. fechaFormato(unixTimestam) {
  727. return moment.unix(unixTimestam).format('YYYY-MM-DD h:mm:ss');
  728. }
  729. },
  730. mounted() {
  731. this.obtenerLista();
  732. },
  733. create() {
  734. this.$loading.show();
  735. },
  736. }
  737. </script>
  738.  
  739. <style>
  740. .modal-secondary .close > span:not(.sr-only) {
  741. color: #172b4d;
  742. }
  743. .busy-mask {
  744. z-index: 1051;
  745. }
  746. </style>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement