Merge remote-tracking branch 'origin/dev' into 6321_negative_tickets

This commit is contained in:
Javier Segarra 2024-04-23 11:45:00 +02:00
commit 46aefa67d1
14 changed files with 43 additions and 71 deletions

View File

@ -5,6 +5,8 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [2420.01]
## [2418.01]
## [2416.01] - 2024-04-18

View File

@ -1,6 +1,6 @@
{
"name": "salix-front",
"version": "24.18.0",
"version": "24.20.0",
"description": "Salix frontend",
"productName": "Salix",
"author": "Verdnatura",

View File

@ -187,7 +187,7 @@ const columns = computed(() => [
downloadFile(
prop.row.id,
$props.downloadModel,
null,
undefined,
prop.row.download
),
},

View File

@ -32,7 +32,7 @@ async function insert() {
<template>
<QCard class="q-pa-xs q-mb-xl full-width" v-if="$props.addNote">
<QCardSection horizontal>
<VnAvatar :descriptor="false" :worker-id="1" size="md" />
<VnAvatar :worker-id="currentUser.id" size="md" />
<div class="full-width row justify-between q-pa-xs">
<VnUserLink :name="t('New note')" :worker-id="currentUser.id" />
{{ t('globals.now') }}
@ -78,8 +78,8 @@ async function insert() {
<TransitionGroup name="list" tag="div" class="column items-center full-width">
<QCard
class="q-pa-xs q-mb-sm full-width"
v-for="note in rows"
:key="note.id"
v-for="(note, index) in rows"
:key="note.id ?? index"
>
<QCardSection horizontal>
<VnAvatar

View File

@ -77,7 +77,6 @@ const arrayData = useArrayData(props.dataKey, {
userParams: props.userParams,
exprBuilder: props.exprBuilder,
});
const hasMoreData = ref();
const store = arrayData.store;
onMounted(() => {
@ -97,7 +96,7 @@ const addFilter = async (filter, params) => {
async function fetch() {
await arrayData.fetch({ append: false });
if (!arrayData.hasMoreData.value) {
if (!store.hasMoreData) {
isLoading.value = false;
}
emit('onFetch', store.data);
@ -110,8 +109,8 @@ async function paginate() {
isLoading.value = true;
await arrayData.loadMore();
if (!arrayData.hasMoreData.value) {
if (store.userParamsChanged) arrayData.hasMoreData.value = true;
if (!store.hasMoreData) {
if (store.userParamsChanged) store.hasMoreData = true;
store.userParamsChanged = false;
endPagination();
return;
@ -132,9 +131,7 @@ function endPagination() {
emit('onPaginate');
}
async function onLoad(index, done) {
if (!store.data) {
return done();
}
if (!store.data) return done();
if (store.data.length === 0 || !props.url) return done(false);
@ -142,7 +139,7 @@ async function onLoad(index, done) {
await paginate();
let isDone = false;
if (store.userParamsChanged) isDone = !arrayData.hasMoreData.value;
if (store.userParamsChanged) isDone = !store.hasMoreData;
done(isDone);
}
@ -182,13 +179,12 @@ defineExpose({ fetch, addFilter });
</QCard>
</div>
</div>
<QInfiniteScroll
v-if="store.data"
@load="onLoad"
:offset="offset"
:disable="disableInfiniteScroll || !arrayData.hasMoreData"
class="full-width"
:disable="disableInfiniteScroll || !store.hasMoreData"
v-bind="$attrs"
>
<slot name="body" :rows="store.data"></slot>
@ -196,7 +192,10 @@ defineExpose({ fetch, addFilter });
<QSpinner color="orange" size="md" />
</div>
</QInfiniteScroll>
<div v-if="!isLoading && hasMoreData" class="w-full flex justify-center q-mt-md">
<div
v-if="!isLoading && store.hasMoreData"
class="w-full flex justify-center q-mt-md"
>
<QBtn color="primary" :label="t('Load more data')" @click="paginate()" />
</div>
</template>

View File

@ -9,12 +9,9 @@ const arrayDataStore = useArrayDataStore();
export function useArrayData(key, userOptions) {
if (!key) throw new Error('ArrayData: A key is required to use this composable');
if (!arrayDataStore.get(key)) {
arrayDataStore.set(key);
}
if (!arrayDataStore.get(key)) arrayDataStore.set(key);
const store = arrayDataStore.get(key);
const hasMoreData = ref(false);
const route = useRoute();
let canceller = null;
@ -22,6 +19,7 @@ export function useArrayData(key, userOptions) {
onMounted(() => {
setOptions();
store.skip = 0;
const query = route.query;
if (query.params) {
@ -29,9 +27,7 @@ export function useArrayData(key, userOptions) {
}
});
if (key && userOptions) {
setOptions();
}
if (key && userOptions) setOptions();
function setOptions() {
const allowedOptions = [
@ -96,8 +92,7 @@ export function useArrayData(key, userOptions) {
});
const { limit } = filter;
hasMoreData.value = limit && response.data.length >= limit;
store.hasMoreData = hasMoreData.value;
store.hasMoreData = limit && response.data.length >= limit;
if (append) {
if (!store.data) store.data = [];
@ -169,7 +164,7 @@ export function useArrayData(key, userOptions) {
}
async function loadMore() {
if (!hasMoreData.value && !store.hasMoreData) return;
if (!store.hasMoreData) return;
store.skip = store.limit * page.value;
page.value += 1;
@ -211,7 +206,6 @@ export function useArrayData(key, userOptions) {
destroy,
loadMore,
store,
hasMoreData,
totalRows,
updateStateParams,
isLoading,

View File

@ -16,7 +16,7 @@ const claimId = computed(() => $props.id || route.params.id);
const claimFilter = {
where: { claimFk: claimId.value },
fields: ['created', 'workerFk', 'text'],
fields: ['id', 'created', 'workerFk', 'text'],
include: {
relation: 'worker',
scope: {

View File

@ -1,6 +1,6 @@
<script setup>
import { useRoute } from 'vue-router';
import { computed, onMounted } from 'vue';
import { useRoute } from 'vue-router';
import { useI18n } from 'vue-i18n';
import { useQuasar } from 'quasar';
@ -33,20 +33,8 @@ const arrayData = useArrayData('SupplierConsumption', {
const store = arrayData.store;
const dateRanges = computed(() => {
const ranges = {
from: null,
to: null,
};
if (route.query && route.query.params) {
const params = JSON.parse(route.query.params);
if (params.from && params.to) {
ranges.from = params.from;
ranges.to = params.to;
}
}
return ranges;
const { from, to } = arrayData.store?.userParams || {};
return { from, to };
});
const reportParams = computed(() => ({
@ -117,7 +105,7 @@ onMounted(async () => {
<template>
<Teleport to="#st-actions" v-if="stateStore.isSubToolbarShown()">
<QBtn
:disabled="!dateRanges.from && !dateRanges.to"
:disabled="!dateRanges.from || !dateRanges.to || !rows.length"
color="primary"
icon-right="picture_as_pdf"
no-caps
@ -129,7 +117,7 @@ onMounted(async () => {
</QTooltip>
</QBtn>
<QBtn
:disabled="!dateRanges.from && !dateRanges.to"
:disabled="!dateRanges.from || !dateRanges.to || !rows.length"
color="primary"
icon-right="email"
no-caps
@ -140,7 +128,6 @@ onMounted(async () => {
</QTooltip>
</QBtn>
</Teleport>
<QPage class="column items-center q-pa-md">
<QDrawer v-model="stateStore.rightDrawer" side="right" :width="256" show-if-above>
<QScrollArea class="fit text-grey-8">

View File

@ -31,7 +31,7 @@ const entityId = computed(() => {
});
const worker = ref();
const filter = { where: { id: route.params.id}};
const filter = { where: { id: entityId } };
const sip = ref(null);
@ -60,7 +60,7 @@ const setData = (entity) => {
<CardDescriptor
module="Worker"
data-key="workerData"
:url="`Workers/summary`"
url="Workers/summary"
:filter="filter"
:title="data.title"
:subtitle="data.subtitle"

View File

@ -1,5 +1,6 @@
const locationOptions = '[role="listbox"] > div.q-virtual-scroll__content > .q-item';
describe('VnLocation', () => {
const dialogInputs = '.q-dialog label input';
describe('Create', () => {
const inputLocation =
'.q-form .q-card> :nth-child(3) > :nth-child(1) > .q-field > .q-field__inner > .q-field__control';
@ -39,13 +40,9 @@ describe('VnLocation', () => {
cy.get(
':nth-child(6) > :nth-child(1) > .q-field > .q-field__inner > .q-field__control > :nth-child(3) > .q-icon'
).click();
cy.get(' .q-card > h1').should('have.text', 'New postcode');
cy.get(
'.q-card > :nth-child(4) > :nth-child(1) > .q-field > .q-field__inner > .q-field__control > :nth-child(1) > input'
).clear('12');
cy.get(
'.q-card > :nth-child(4) > :nth-child(1) > .q-field > .q-field__inner > .q-field__control > :nth-child(1) > input'
).type('1234453');
cy.get('.q-card > h1').should('have.text', 'New postcode');
cy.get(dialogInputs).eq(0).clear('12');
cy.get(dialogInputs).eq(0).type('1234453');
cy.selectOption(
'.q-dialog__inner > .column > #formModel > .q-card > :nth-child(4) > :nth-child(2) > .q-field > .q-field__inner > .q-field__control ',
'Valencia'

View File

@ -21,7 +21,8 @@ describe('ClaimPhoto', () => {
cy.get('.q-notification__message').should('have.text', 'Data saved');
});
it('should open first image dialog change to second and close', () => {
/* it.skip('should open first image dialog change to second and close', () => {
skiped fix on https://redmine.verdnatura.es/issues/7113
cy.get(
':nth-child(1) > .q-card > .q-img > .q-img__container > .q-img__image'
).click();
@ -37,7 +38,7 @@ describe('ClaimPhoto', () => {
cy.get('.q-carousel__slide > .q-img > .q-img__container > .q-img__image').should(
'not.be.visible'
);
});
}); */
it('should remove third and fourth file', () => {
cy.get(

View File

@ -1,7 +1,6 @@
/// <reference types="cypress" />
describe('InvoiceInDueDay', () => {
const inputs = 'label input';
const inputBtns = 'label button';
const addBtn = '.q-page-sticky > div > .q-btn > .q-btn__content';
beforeEach(() => {
@ -10,7 +9,6 @@ describe('InvoiceInDueDay', () => {
});
it('should update the amount', () => {
cy.get(inputBtns).eq(1).click();
cy.get(inputs).eq(3).type(23);
cy.saveCard();
cy.get('.q-notification__message').should('have.text', 'Data saved');

View File

@ -1,11 +1,11 @@
/// <reference types="cypress" />
describe('InvoiceInVat', () => {
const inputs = 'label input';
const inputBtns = 'label button';
const thirdRow = 'tbody > :nth-child(3)';
const firstLineVat = 'tbody > :nth-child(1) > :nth-child(4)';
const dialogInputs = '.q-dialog label input';
const dialogBtns = '.q-dialog button';
const acrossInput =
':nth-child(1) > .q-td.q-table--col-auto-width > .q-field > .q-field__inner > .q-field__control > :nth-child(2) > .default-icon';
const randomInt = Math.floor(Math.random() * 100);
beforeEach(() => {
@ -13,11 +13,8 @@ describe('InvoiceInVat', () => {
cy.visit(`/#/invoice-in/1/vat`);
});
it('should edit the first line', () => {
cy.get(inputBtns).eq(1).click();
cy.get(inputs).eq(2).type(23);
it('should edit the sage iva', () => {
cy.selectOption(firstLineVat, 'H.P. IVA 21% CEE');
cy.saveCard();
cy.visit(`/#/invoice-in/1/vat`);
@ -36,16 +33,13 @@ describe('InvoiceInVat', () => {
});
it('should throw an error if there are fields undefined', () => {
cy.get(inputBtns).eq(0).click();
cy.get(':nth-child(1) > .q-td.q-table--col-auto-width > .q-field > .q-field__inner > .q-field__control > :nth-child(2) > .default-icon').click();
cy.get(acrossInput).click();
cy.get(dialogBtns).eq(2).click();
cy.get('.q-notification__message').should('have.text', "The code can't be empty");
});
it('should correctly handle expense addition', () => {
cy.get(inputBtns).eq(0).click();
cy.get(':nth-child(1) > .q-td.q-table--col-auto-width > .q-field > .q-field__inner > .q-field__control > :nth-child(2) > .default-icon').click();
cy.get(acrossInput).click();
cy.get(dialogInputs).eq(0).type(randomInt);
cy.get(dialogInputs).eq(1).click();
cy.get(dialogInputs).eq(1).type('This is a dummy expense');

View File

@ -48,7 +48,7 @@ describe('VnPaginate', () => {
{ id: 3, name: 'Bruce Wayne' },
],
});
vm.arrayData.hasMoreData.value = true;
vm.store.hasMoreData = true;
await vm.$nextTick();
vm.store.data = [