From 73740822a35c72d579eb62f9170211500a483290 Mon Sep 17 00:00:00 2001 From: Javier Segarra <jsegarra@verdnatura.es> Date: Mon, 24 Mar 2025 13:18:41 +0100 Subject: [PATCH] test: refs #7356 update ticket tracking components and remove unused TicketCreateTracking.vue --- src/pages/Claim/Card/ClaimSummaryAction.vue | 4 +- .../Ticket/Card/TicketCreateTracking.vue | 59 -------- src/pages/Ticket/Card/TicketTracking.vue | 135 +++++++++--------- .../Worker/Card/WorkerDescriptorProxy.vue | 2 +- .../integration/ticket/ticketTracking.spec.js | 19 ++- .../vnComponent/vnSelect.commands.js | 3 + .../vnComponent/vnTable.commands.js | 3 + test/cypress/support/commands.js | 5 + 8 files changed, 96 insertions(+), 134 deletions(-) delete mode 100644 src/pages/Ticket/Card/TicketCreateTracking.vue create mode 100644 test/cypress/integration/vnComponent/vnSelect.commands.js create mode 100644 test/cypress/integration/vnComponent/vnTable.commands.js diff --git a/src/pages/Claim/Card/ClaimSummaryAction.vue b/src/pages/Claim/Card/ClaimSummaryAction.vue index 577ac2a65..be3b9e896 100644 --- a/src/pages/Claim/Card/ClaimSummaryAction.vue +++ b/src/pages/Claim/Card/ClaimSummaryAction.vue @@ -88,13 +88,13 @@ const columns = [ auto-load > <template #column-itemFk="{ row }"> - <span class="link"> + <span class="link" @click.stop> {{ row.itemFk }} <ItemDescriptorProxy :id="row.itemFk" /> </span> </template> <template #column-ticketFk="{ row }"> - <span class="link"> + <span class="link" @click.stop> {{ row.ticketFk }} <TicketDescriptorProxy :id="row.ticketFk" /> </span> diff --git a/src/pages/Ticket/Card/TicketCreateTracking.vue b/src/pages/Ticket/Card/TicketCreateTracking.vue deleted file mode 100644 index 5c1e916f2..000000000 --- a/src/pages/Ticket/Card/TicketCreateTracking.vue +++ /dev/null @@ -1,59 +0,0 @@ -<script setup> -import { ref } from 'vue'; -import { useRoute } from 'vue-router'; -import { useI18n } from 'vue-i18n'; - -import FormModelPopup from 'components/FormModelPopup.vue'; -import VnRow from 'components/ui/VnRow.vue'; -import VnSelect from 'src/components/common/VnSelect.vue'; -import FetchData from 'components/FetchData.vue'; - -import { useState } from 'src/composables/useState'; -import VnSelectWorker from 'src/components/common/VnSelectWorker.vue'; - -const emit = defineEmits(['onRequestCreated']); - -const route = useRoute(); -const { t } = useI18n(); -const state = useState(); -const user = state.getUser(); -const stateFetchDataRef = ref(null); -const statesOptions = ref([]); - -const onStateFkChange = (formData) => (formData.userFk = user.value.id); -</script> -<template> - <FetchData - ref="stateFetchDataRef" - url="States" - auto-load - @on-fetch="(data) => (statesOptions = data)" - /> - <FormModelPopup - :title="t('Create tracking')" - url-create="Tickets/state" - model="CreateTicketTracking" - :form-initial-data="{ ticketFk: route.params.id }" - @on-data-saved="() => emit('onRequestCreated')" - > - <template #form-inputs="{ data }"> - <VnRow> - <VnSelect - v-model="data.stateFk" - :label="t('ticketList.state')" - :options="statesOptions" - @update:model-value="onStateFkChange(data)" - hide-selected - option-label="name" - option-value="id" - /> - <VnSelectWorker v-model="data.userFk" :fields="['id', 'name']" /> - </VnRow> - </template> - </FormModelPopup> -</template> - -<i18n> - es: - Create tracking: Crear estado -</i18n> diff --git a/src/pages/Ticket/Card/TicketTracking.vue b/src/pages/Ticket/Card/TicketTracking.vue index 00610de44..4cfc49290 100644 --- a/src/pages/Ticket/Card/TicketTracking.vue +++ b/src/pages/Ticket/Card/TicketTracking.vue @@ -1,27 +1,31 @@ <script setup> -import { ref, computed, watch, reactive } from 'vue'; +import { ref, reactive } from 'vue'; import { useI18n } from 'vue-i18n'; import { useRoute } from 'vue-router'; import WorkerDescriptorProxy from 'src/pages/Worker/Card/WorkerDescriptorProxy.vue'; -import TicketCreateTracking from './TicketCreateTracking.vue'; -import VnPaginate from 'components/ui/VnPaginate.vue'; +import VnSelect from 'src/components/common/VnSelect.vue'; +import VnSelectWorker from 'src/components/common/VnSelectWorker.vue'; +import { useState } from 'src/composables/useState'; import { toDateTimeFormat } from 'src/filters/date.js'; +import VnTable from 'src/components/VnTable/VnTable.vue'; +const state = useState(); + +const user = state.getUser(); const route = useRoute(); const { t } = useI18n(); -const createTrackingDialogRef = ref(null); -const paginateRef = ref(null); - -watch( - () => route.params.id, - async (val) => { - paginateFilter.where.ticketFk = val; - paginateRef.value.fetch(); - }, -); +const tableRef = ref(null); +// watch( +// () => route.params.id, +// async (val) => { +// paginateFilter.where.ticketFk = val; +// paginateRef.value.fetch(); +// }, +// ); +const onStateFkChange = (formData) => (formData.userFk = user.value.id); const paginateFilter = reactive({ include: [ { @@ -50,81 +54,74 @@ const paginateFilter = reactive({ }, }); -const columns = computed(() => [ +const columns = [ { label: t('ticketList.state'), name: 'state', field: 'state', align: 'left', - format: (val) => val.name, + format: (row) => row.state?.name, }, { label: t('expedition.worker'), name: 'worker', align: 'left', + field: 'user', }, { label: t('expedition.created'), name: 'created', field: 'created', align: 'left', - format: (val) => toDateTimeFormat(val), + format: (row) => toDateTimeFormat(row.created), }, -]); - -const openCreateModal = () => createTrackingDialogRef.value.show(); +]; </script> <template> - <QPage class="column items-center q-pa-md"> - <VnPaginate - ref="paginateRef" - data-key="TicketTracking" - :user-filter="paginateFilter" - search-url="table" - url="TicketTrackings" - auto-load - order="created DESC" - :limit="0" - > - <template #body="{ rows }"> - <QTable - :rows="rows" - :columns="columns" - row-key="id" - :pagination="{ rowsPerPage: 0 }" - class="full-width q-mt-md" - :no-data-label="t('globals.noResults')" - > - <template #body-cell-worker="{ row }"> - <QTd> - <QBtn flat class="link" @click.stop> - {{ row.user?.name }} - <WorkerDescriptorProxy :id="row.user?.worker?.id" /> - </QBtn> - </QTd> - </template> - </QTable> - </template> - </VnPaginate> - <QDialog - ref="createTrackingDialogRef" - transition-show="scale" - transition-hide="scale" - > - <TicketCreateTracking @on-request-created="paginateRef.fetch()" /> - </QDialog> - <QPageSticky :offset="[20, 20]"> - <QBtn - @click="openCreateModal()" - color="primary" - fab - icon="add" - v-shortcut="'+'" + <VnTable + ref="tableRef" + :right-search="false" + :column-search="false" + :disable-option="{ card: true, table: true }" + :search-url="false" + :columns="columns" + data-key="TicketTracking" + :user-filter="paginateFilter" + url="TicketTrackings" + auto-load + order="created DESC" + :limit="0" + :without-header="true" + :create="{ + urlCreate: 'Tickets/state', + title: t('Create tracking'), + onDataSaved: () => tableRef.reload(), + formInitialData: { + ticketFk: route.params.id, + }, + }" + > + <template #more-create-dialog="{ data }"> + <VnSelect + url="States" + v-model="data.stateFk" + :label="t('ticketList.state')" + auto-load + @update:model-value="onStateFkChange(data)" + hide-selected /> - <QTooltip class="text-no-wrap"> - {{ t('tracking.addState') }} - </QTooltip> - </QPageSticky> - </QPage> + <VnSelectWorker v-model="data.userFk" :fields="['id', 'name']" /> + </template> + <template #column-worker="{ row }"> + <span class="link" @click.stop> + {{ row.user.name }} + <WorkerDescriptorProxy :id="row.user?.worker?.id" /> + </span> + </template> + </VnTable> </template> +<i18n> + es: + Create tracking: Crear estado +</i18n> diff --git a/src/pages/Worker/Card/WorkerDescriptorProxy.vue b/src/pages/Worker/Card/WorkerDescriptorProxy.vue index 5f71abbea..baa9aa571 100644 --- a/src/pages/Worker/Card/WorkerDescriptorProxy.vue +++ b/src/pages/Worker/Card/WorkerDescriptorProxy.vue @@ -11,7 +11,7 @@ const $props = defineProps({ </script> <template> - <QPopupProxy> + <QPopupProxy data-cy="WorkerDescriptor"> <WorkerDescriptor v-if="$props.id" :id="$props.id" diff --git a/test/cypress/integration/ticket/ticketTracking.spec.js b/test/cypress/integration/ticket/ticketTracking.spec.js index 1f54af5b1..53bf6704e 100644 --- a/test/cypress/integration/ticket/ticketTracking.spec.js +++ b/test/cypress/integration/ticket/ticketTracking.spec.js @@ -1,12 +1,25 @@ /// <reference types="cypress" /> -describe('TicketRequest', () => { +describe('Ticket tracking', () => { beforeEach(() => { cy.login('developer'); cy.viewport(1920, 1080); - cy.visit('/#/ticket/31/request'); + cy.visit('/#/ticket/31/tracking'); }); - it('Should load layout', () => { + it('Add new tracking', () => { cy.get('.q-page').should('be.visible'); + + cy.firstRow('worker').find('span').should('have.class', 'link').click(); + cy.dataCy('WorkerDescriptor').should('exist'); + cy.get('[data-cy="vnTableCreateBtn"] > .q-btn__content > .q-icon').click(); + cy.selectOption('.q-field--float [data-cy="State_select"]', 'OK').click(); + cy.get('[data-cy="FormModelPopup_save"] > .q-btn__content > .block').click(); + cy.get( + ':last-child > [data-col-field="state"] > [data-cy="vnTableCell_state"]', + ).should('have.text', 'OK'); + cy.get(':last-child > [data-col-field="worker"]').should( + 'have.text', + 'developer ', + ); }); }); diff --git a/test/cypress/integration/vnComponent/vnSelect.commands.js b/test/cypress/integration/vnComponent/vnSelect.commands.js new file mode 100644 index 000000000..017b6e7ea --- /dev/null +++ b/test/cypress/integration/vnComponent/vnSelect.commands.js @@ -0,0 +1,3 @@ +Cypress.Commands.add('clickOption', (index = 1) => + cy.get(`.q-menu :nth-child(${index}) >.q-item__section`).click(), +); diff --git a/test/cypress/integration/vnComponent/vnTable.commands.js b/test/cypress/integration/vnComponent/vnTable.commands.js new file mode 100644 index 000000000..15cbf6f9a --- /dev/null +++ b/test/cypress/integration/vnComponent/vnTable.commands.js @@ -0,0 +1,3 @@ +Cypress.Commands.add('firstRow', (field, index = 1) => + cy.get(`:nth-child(${index}) > [data-col-field="${field}"]`), +); diff --git a/test/cypress/support/commands.js b/test/cypress/support/commands.js index 7f5203547..7ed6ef238 100755 --- a/test/cypress/support/commands.js +++ b/test/cypress/support/commands.js @@ -29,7 +29,12 @@ // import { registerCommands } from '@quasar/quasar-app-extension-testing-e2e-cypress'; import moment from 'moment'; import waitUntil from './waitUntil'; +// Importar dinĂ¡micamente todos los archivos con el sufijo .commands.js dentro de la carpeta src/test/cypress/integration +const requireCommands = require.context('../integration', true, /\.commands\.js$/); +// Iterar sobre cada archivo y requerirlo +requireCommands.keys().forEach(requireCommands); +// Common comma Cypress.Commands.add('waitUntil', { prevSubject: 'optional' }, waitUntil); Cypress.Commands.add('resetDB', () => {