#8078 enable multi choice #848

Merged
jorgep merged 17 commits from 8078-enableMultiSelection into dev 2024-11-05 10:20:05 +00:00
5 changed files with 68 additions and 1 deletions

View File

@ -331,6 +331,20 @@ function handleScroll() {
const isAtBottom = Math.abs(scrollHeight - scrollTop - clientHeight) <= 40;
if (isAtBottom) CrudModelRef.value.vnPaginateRef.paginate();
}
function handleSelection({ evt, added, rows: selectedRows }, rows) {
if (evt?.shiftKey && added) {
const rowIndex = selectedRows[0].$index;
Review

Solo selecciona 1, en el unico momento en que se pueden seleccionar más, es cuando le das al checkbox para seleccionarlas todas y evt es undefined. Además, quasar siempre añade la propiedad $index.

Solo selecciona 1, en el unico momento en que se pueden seleccionar más, es cuando le das al checkbox para seleccionarlas todas y **evt es undefined**. Además, quasar siempre añade la propiedad **$index**.
Review
Quasar o CrudModel? https://gitea.verdnatura.es/verdnatura/salix-front/src/commit/6248a4117d06e60ee4f141dcb5b65969c590bfbe/src/components/CrudModel.vue#L123 😏
const selectedIndexes = new Set(selected.value.map((row) => row.$index));
for (const row of rows) {
if (row.$index == rowIndex) break;
if (!selectedIndexes.has(row.$index)) {
Review

Así se comprueba si la fila ya está seleccionada y no se recorren todas las filas.

Así se comprueba si la fila ya está seleccionada y no se recorren todas las filas.
selected.value.push(row);
selectedIndexes.add(row.$index);
}
}
}
}
</script>
<template>
<QDrawer
@ -431,6 +445,7 @@ function handleScroll() {
@virtual-scroll="handleScroll"
@row-click="(_, row) => rowClickFunction && rowClickFunction(row)"
@update:selected="emit('update:selected', $event)"
@selection="(details) => handleSelection(details, rows)"
>
<template #top-left v-if="!$props.withoutHeader">
<slot name="top-left"></slot>

View File

@ -167,6 +167,7 @@ const toModule = computed(() =>
icon="more_vert"
round
size="md"
data-cy="descriptor-more-opts"
>
<QTooltip>
{{ t('components.cardDescriptor.moreOptions') }}

View File

@ -14,6 +14,8 @@ describe('Ticket descriptor', () => {
it('should clone the ticket without warehouse', () => {
cy.visit('/#/ticket/1/summary');
cy.intercept('GET', /\/api\/Tickets\/\d/).as('ticket');
cy.wait('@ticket');
cy.openActionsDescriptor();
cy.contains(listItem, toCloneOpt).click();
cy.clickConfirm();
@ -28,6 +30,8 @@ describe('Ticket descriptor', () => {
it('should set the weight of the ticket', () => {
cy.visit('/#/ticket/10/summary');
cy.intercept('GET', /\/api\/Tickets\/\d/).as('ticket');
cy.wait('@ticket');
cy.openActionsDescriptor();
cy.contains(listItem, setWeightOpt).click();
cy.intercept('POST', /\/api\/Tickets\/\d+\/setWeight/).as('weight');

View File

@ -261,7 +261,7 @@ Cypress.Commands.add('openActionDescriptor', (opt) => {
});
Cypress.Commands.add('openActionsDescriptor', () => {
cy.get('.header > :nth-child(3) > .q-btn__content > .q-icon').click();
Review

Fallaba

Fallaba
cy.get('[data-cy="descriptor-more-opts"]').click();
});
Cypress.Commands.add('openUserPanel', () => {

View File

@ -0,0 +1,47 @@
import { describe, expect, it, beforeAll, beforeEach } from 'vitest';
import { createWrapper } from 'app/test/vitest/helper';
import VnTable from 'src/components/VnTable/VnTable.vue';
describe('VnTable', () => {
let wrapper;
let vm;
beforeAll(() => {
wrapper = createWrapper(VnTable, {
propsData: {
columns: [],
},
});
vm = wrapper.vm;
});
beforeEach(() => (vm.selected = []));
describe('handleSelection()', () => {
const rows = [{ $index: 0 }, { $index: 1 }, { $index: 2 }];
const selectedRows = [{ $index: 1 }];
it('should add rows to selected when shift key is pressed and rows are added except last one', () => {
vm.handleSelection(
{ evt: { shiftKey: true }, added: true, rows: selectedRows },
rows
);
expect(vm.selected).toEqual([{ $index: 0 }]);
Review

El de index 1 no lo pongo xq se añade desde el evt update:selected no desde esta fn.

El de index 1 no lo pongo xq se añade desde el evt update:selected no desde esta fn.
});
it('should not add rows to selected when shift key is not pressed', () => {
Review

No se añade dentro de la fn, pero si que se selecciona la fila en el evt @update:selected , se ejecuta después de @selection

No se añade dentro de la fn, pero si que se selecciona la fila en el evt **@update:selected** , se ejecuta después de **@selection**
vm.handleSelection(
{ evt: { shiftKey: false }, added: true, rows: selectedRows },
rows
);
expect(vm.selected).toEqual([]);
});
it('should not add rows to selected when rows are not added', () => {
Review

Si es la acción de desmarcar added está a false.

Si es la acción de desmarcar added está a false.
vm.handleSelection(
{ evt: { shiftKey: true }, added: false, rows: selectedRows },
rows
);
expect(vm.selected).toEqual([]);
});
});
});