test: refs #7356 update ticket tracking components and remove unused TicketCreateTracking.vue

This commit is contained in:
Javier Segarra 2025-03-24 13:18:41 +01:00
parent 69629147ad
commit 73740822a3
8 changed files with 96 additions and 134 deletions

View File

@ -88,13 +88,13 @@ const columns = [
auto-load auto-load
> >
<template #column-itemFk="{ row }"> <template #column-itemFk="{ row }">
<span class="link"> <span class="link" @click.stop>
{{ row.itemFk }} {{ row.itemFk }}
<ItemDescriptorProxy :id="row.itemFk" /> <ItemDescriptorProxy :id="row.itemFk" />
</span> </span>
</template> </template>
<template #column-ticketFk="{ row }"> <template #column-ticketFk="{ row }">
<span class="link"> <span class="link" @click.stop>
{{ row.ticketFk }} {{ row.ticketFk }}
<TicketDescriptorProxy :id="row.ticketFk" /> <TicketDescriptorProxy :id="row.ticketFk" />
</span> </span>

View File

@ -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>

View File

@ -1,27 +1,31 @@
<script setup> <script setup>
import { ref, computed, watch, reactive } from 'vue'; import { ref, reactive } from 'vue';
import { useI18n } from 'vue-i18n'; import { useI18n } from 'vue-i18n';
import { useRoute } from 'vue-router'; import { useRoute } from 'vue-router';
import WorkerDescriptorProxy from 'src/pages/Worker/Card/WorkerDescriptorProxy.vue'; import WorkerDescriptorProxy from 'src/pages/Worker/Card/WorkerDescriptorProxy.vue';
import TicketCreateTracking from './TicketCreateTracking.vue'; import VnSelect from 'src/components/common/VnSelect.vue';
import VnPaginate from 'components/ui/VnPaginate.vue'; import VnSelectWorker from 'src/components/common/VnSelectWorker.vue';
import { useState } from 'src/composables/useState';
import { toDateTimeFormat } from 'src/filters/date.js'; 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 route = useRoute();
const { t } = useI18n(); const { t } = useI18n();
const createTrackingDialogRef = ref(null); const tableRef = ref(null);
const paginateRef = ref(null);
watch(
() => route.params.id,
async (val) => {
paginateFilter.where.ticketFk = val;
paginateRef.value.fetch();
},
);
// watch(
// () => route.params.id,
// async (val) => {
// paginateFilter.where.ticketFk = val;
// paginateRef.value.fetch();
// },
// );
const onStateFkChange = (formData) => (formData.userFk = user.value.id);
const paginateFilter = reactive({ const paginateFilter = reactive({
include: [ include: [
{ {
@ -50,81 +54,74 @@ const paginateFilter = reactive({
}, },
}); });
const columns = computed(() => [ const columns = [
{ {
label: t('ticketList.state'), label: t('ticketList.state'),
name: 'state', name: 'state',
field: 'state', field: 'state',
align: 'left', align: 'left',
format: (val) => val.name, format: (row) => row.state?.name,
}, },
{ {
label: t('expedition.worker'), label: t('expedition.worker'),
name: 'worker', name: 'worker',
align: 'left', align: 'left',
field: 'user',
}, },
{ {
label: t('expedition.created'), label: t('expedition.created'),
name: 'created', name: 'created',
field: 'created', field: 'created',
align: 'left', align: 'left',
format: (val) => toDateTimeFormat(val), format: (row) => toDateTimeFormat(row.created),
}, },
]); ];
const openCreateModal = () => createTrackingDialogRef.value.show();
</script> </script>
<template> <template>
<QPage class="column items-center q-pa-md"> <VnTable
<VnPaginate ref="tableRef"
ref="paginateRef" :right-search="false"
data-key="TicketTracking" :column-search="false"
:user-filter="paginateFilter" :disable-option="{ card: true, table: true }"
search-url="table" :search-url="false"
url="TicketTrackings" :columns="columns"
auto-load data-key="TicketTracking"
order="created DESC" :user-filter="paginateFilter"
:limit="0" url="TicketTrackings"
> auto-load
<template #body="{ rows }"> order="created DESC"
<QTable :limit="0"
:rows="rows" :without-header="true"
:columns="columns" :create="{
row-key="id" urlCreate: 'Tickets/state',
:pagination="{ rowsPerPage: 0 }" title: t('Create tracking'),
class="full-width q-mt-md" onDataSaved: () => tableRef.reload(),
:no-data-label="t('globals.noResults')" formInitialData: {
> ticketFk: route.params.id,
<template #body-cell-worker="{ row }"> },
<QTd> }"
<QBtn flat class="link" @click.stop> >
{{ row.user?.name }} <template #more-create-dialog="{ data }">
<WorkerDescriptorProxy :id="row.user?.worker?.id" /> <VnSelect
</QBtn> url="States"
</QTd> v-model="data.stateFk"
</template> :label="t('ticketList.state')"
</QTable> auto-load
</template> @update:model-value="onStateFkChange(data)"
</VnPaginate> hide-selected
<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="'+'"
/> />
<QTooltip class="text-no-wrap"> <VnSelectWorker v-model="data.userFk" :fields="['id', 'name']" />
{{ t('tracking.addState') }} </template>
</QTooltip> <template #column-worker="{ row }">
</QPageSticky> <span class="link" @click.stop>
</QPage> {{ row.user.name }}
<WorkerDescriptorProxy :id="row.user?.worker?.id" />
</span>
</template>
</VnTable>
</template> </template>
<i18n>
es:
Create tracking: Crear estado
</i18n>

View File

@ -11,7 +11,7 @@ const $props = defineProps({
</script> </script>
<template> <template>
<QPopupProxy> <QPopupProxy data-cy="WorkerDescriptor">
<WorkerDescriptor <WorkerDescriptor
v-if="$props.id" v-if="$props.id"
:id="$props.id" :id="$props.id"

View File

@ -1,12 +1,25 @@
/// <reference types="cypress" /> /// <reference types="cypress" />
describe('TicketRequest', () => { describe('Ticket tracking', () => {
beforeEach(() => { beforeEach(() => {
cy.login('developer'); cy.login('developer');
cy.viewport(1920, 1080); 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.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 ',
);
}); });
}); });

View File

@ -0,0 +1,3 @@
Cypress.Commands.add('clickOption', (index = 1) =>
cy.get(`.q-menu :nth-child(${index}) >.q-item__section`).click(),
);

View File

@ -0,0 +1,3 @@
Cypress.Commands.add('firstRow', (field, index = 1) =>
cy.get(`:nth-child(${index}) > [data-col-field="${field}"]`),
);

View File

@ -29,7 +29,12 @@
// import { registerCommands } from '@quasar/quasar-app-extension-testing-e2e-cypress'; // import { registerCommands } from '@quasar/quasar-app-extension-testing-e2e-cypress';
import moment from 'moment'; import moment from 'moment';
import waitUntil from './waitUntil'; 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('waitUntil', { prevSubject: 'optional' }, waitUntil);
Cypress.Commands.add('resetDB', () => { Cypress.Commands.add('resetDB', () => {