frontend/orders/orders.js

// =========================
// Carga de modulos JS
// =========================

const { remote } = require('electron');
const { showLog } = remote.require('./util-functions/time');
const { NotasController } = remote.require('./controllers');
const deliveryNotes = document.querySelector('#delivery-note');

/** Clase de tabla notas de entrega */
class OrdersTableComponent {

	constructor() {

		this.deliveryNotes = [];
		this.loading = document.querySelector('app-loading');
		this.deliveryTable = document.querySelector('#tbody-delivery-notes');
		this.searchComponent = document.querySelector('search-bar-component');
		this.pagination = document.querySelector('#pagination-delivery');

		// exportador
		this.exportElement = document.querySelector('app-export');

		this.page = 1;

		// events
		this.setEvents();
		this.getAll();

		setTimeout( () => this.loading._show = 'false', 1000 );
	}

	/** establece los eventos */
	setEvents() {
		this.searchComponent.addEventListener('search', this.searchDeliveryNote.bind( this ) );

		this.pagination.addEventListener('pagination', ( $event ) => {
			this.page = $event.detail.page;
			this.getAll( $event.detail.value );
		});
		
		// inciamos los eventos del exportador
		this.exportElement.addEventListener('export-data', event => {
			const { nameEvent } = event.detail;

			if ( nameEvent === 'import-file' ) {
				this.importNotes();
				
			} else {
				this.exportNotes();

			}
		});
		
		if ( getUserLogged().area !== 'Administracion' ) {
			this.exportElement.style.display = 'none';
		}
	}

	/**
	 * obtiene todas las notas
	 * @param  {Array<number>} pagination paginacion
	 */
	async getAll( pagination = [0,10] ) {

		try {

			this.deliveryNotes = await NotasController.listarNotas( pagination );
			const totalOrders = await NotasController.obtenerTotalNotas();

			setPaginationStorage('notesTable', { pagination });

			// console.log( totalOrders );
			this.render( totalOrders.totalPaginas, totalOrders.totalRegistros );
		}

		catch ( error ) {

			console.error( error );
		}

	}

	/** redirecciona al formulario de notas al crear una nota */
	createDeliveryNote() {
		redirectTo('orders/orders-form/orders-form.html');
	}


	/**
	 * redirecciona al formulario de notas pasandole el id de la nota
	 * @param  {number} idDelivery identificador de la nota
	 */
	editDeiliveryNote( idDelivery ) {
		redirectTo('orders/orders-form/orders-form.html?idDelivery=' + idDelivery )
	}

	/**
	 * Busca las notas en la BD.
	 * @param {*} $event evento de formulario
	*/
	async searchDeliveryNote( $event ) {

		const search = $event.detail.value;
		const rexp = /^[\w-\d\s]+$/;

		if ( search.length === 0 ) {

		  let { pagination } = JSON.parse( sessionStorage.getItem('notesTable') );

		  this.getAll( pagination );

		  return;
		}

		if ( !rexp.test( search ) ) {

		  console.log('no concuerda con expresion regular');

		  return;
		}

		this.deliveryNotes = await NotasController.buscarNota({ search: '%' + search + '%' });

		// console.log( this.deliveryNotes );

		this.render( null, null, true );
	}


	/**
	 * Genera el archivo pdf de la nota de entrega
	 * @param  {number} idDeliveryNote identificador de la nota
	 */
	showPDF( idDeliveryNote ) {
		NotasController.generarPDFNota( idDeliveryNote );
	}


	/**
	 * establece las filas de la tabla de notas
	 * @param  {Note} deliveryNote instancia de la nota
	 * @param  {number} index indice de la tabla
	 */
	setRows( deliveryNote, index ) {

		return (`
			<tr class="text-center">
				<td>${ deliveryNote.id_nota }</td>
				<td>${ deliveryNote.descripcion_nota }</td>
				<td>${ this.getName( deliveryNote.nombre_usuario, deliveryNote.apellido_usuario ) }</td>
				<td>${ deliveryNote.nombre_cliente }</td>
				<td>${ deliveryNote.status }</td>
				<td>
				<button
					type="button"
					onclick="ordersTableComponent.editDeiliveryNote( ${ deliveryNote.id_nota } )"
					class="btn btn-primary btn-sm"
				>
					<i class="fas fa-edit"></i>
				</button>
				<button
					type="button"
					onclick="ordersTableComponent.showPDF( ${ deliveryNote.id_nota } )"
					class="btn btn-secondary btn-sm"
				>
					<i class="far fa-file-pdf"></i>
				</button>
				</td>
			</tr>
		`);
	}

	/**
	 * obtiene el nombre del usuario
	 *
	 * @param  {string} name   nombre del usuario
	 * @param  {string} surname apellido del usuario
	 * @returns {string} obtiene el nombre concatenado
	 */
	getName( name = '', surname = '' ) {

		if ( name.length > 0 && surname.length > 0 ) {
			return name + ' ' + surname;
		}

		return 'No disponible'
	}


	/**
	 * renderiza la tabla notas de entrega
	 *
	 * @param  {?number} totalPages  total de paginas
	 * @param  {?number} totalRegisters total de registros
	 * @param  {boolean} search flag de actualizacion de paginacion
	 */
	render( totalPages = 0, totalRegisters = 0, search = false ) {

		
		if ( !search ) {
			
			this.deliveryTable.innerHTML = '';
			this.pagination._limit = totalPages;
			this.pagination._registers = totalRegisters;
			this.pagination._page = this.page;
		}
		
		if ( this.deliveryNotes.length > 0 ) {
			
			this.pagination.style.display = 'block';

			this.deliveryTable.innerHTML = this.deliveryNotes.map(
				this.setRows.bind( this )
			).join('');
				
		} else {
			
			this.exportElement.style.display = 'none';
			this.pagination.style.display = 'none';

			this.deliveryTable.innerHTML = (`
				<tr class="text-center">
					<td colspan="8" class="text-danger">
							No existen registros de notas de entregas disponibles
					</td>
				</tr>
			`);
		}
	}

	async importNotes() {

		this.loading._show = 'true';

		try {
			await NotasController.importarNotas();
			await this.getAll();


		} catch ( error ) {
			console.log( error );
		
		} finally {
			this.loading._show = 'false';
		}
	}

	async exportNotes() {

		this.loading._show = 'true';

		try {
			await NotasController.exportarNotas();

		} catch ( error ) {
			console.log( error );
		
		} finally {
			this.loading._show = 'false';
		}

	}
}

/** @type {OrdersTableComponent} */
const ordersTableComponent = new OrdersTableComponent();