Merge pull request '#7356 - TicketServices and CrudModel updates' (!1479) from 7356_ticketService into test
gitea/salix-front/pipeline/head This commit looks good Details

Reviewed-on: #1479
Reviewed-by: Alex Moreno <alexm@verdnatura.es>
This commit is contained in:
Javier Segarra 2025-03-03 12:06:22 +00:00
commit c4dd24b394
3 changed files with 87 additions and 30 deletions

View File

@ -184,8 +184,11 @@ async function saveChanges(data) {
if ($props.beforeSaveFn) {
changes = await $props.beforeSaveFn(changes, getChanges);
}
try {
if (changes?.creates?.length === 0 && changes?.updates?.length === 0) {
return;
}
await axios.post($props.saveUrl || $props.url + '/crud', changes);
} finally {
isLoading.value = false;

View File

@ -168,16 +168,18 @@ describe('CrudModel', () => {
result = vm.isEmpty(dummyArray);
expect(result).toBe(false);
})
});
});
describe('resetData()', () => {
it('should add $index to elements in data[] and sets originalData and formData with data', async () => {
data = [{
data = [
{
name: 'Tony',
lastName: 'Stark',
age: 42,
}];
},
];
vm.resetData(data);
@ -210,11 +212,13 @@ describe('CrudModel', () => {
});
describe('saveChanges()', () => {
data = [{
data = [
{
name: 'Tony',
lastName: 'Stark',
age: 42,
}];
},
];
it('should call saveFn if exists', async () => {
await wrapper.setProps({ saveFn: vi.fn() });
@ -231,11 +235,13 @@ describe('CrudModel', () => {
it("should use default url if there's not saveFn", async () => {
const postMock = vi.spyOn(axios, 'post');
vm.formData = [{
vm.formData = [
{
name: 'Bruce',
lastName: 'Wayne',
age: 45,
}]
},
];
await vm.saveChanges(data);

View File

@ -121,6 +121,50 @@ async function handleSave() {
isSaving.value = false;
}
}
function validateFields(item) {
// Only validate fields that are being updated
const shouldExist = (field) => !isUpdate || field in item;
if (!shouldExist('ticketServiceTypeFk') && !item.ticketServiceTypeFk) {
notify('Description is required', 'negative');
return false;
}
if (!shouldExist('quantity') && (!item.quantity || item.quantity <= 0)) {
notify('Quantity must be greater than 0', 'negative');
return false;
}
if (!shouldExist('price') && (!item.price || item.price < 0)) {
notify('Price must be valid', 'negative');
return false;
}
return true;
}
function beforeSave(data) {
const { creates = [], updates = [] } = data;
const validData = { creates: [], updates: [] };
// Validate creates
if (creates.length) {
for (const create of creates) {
create.ticketFk = route.params.id;
if (validateFields(create)) {
validData.creates.push(create);
}
}
}
// Validate updates
if (updates.length) {
for (const update of updates) {
validData.updates.push(update);
}
}
return validData;
}
</script>
<template>
@ -141,6 +185,7 @@ async function handleSave() {
v-model:selected="selected"
:order="['description ASC']"
:default-remove="false"
:beforeSaveFn="beforeSave"
>
<template #moreBeforeActions>
<QBtn
@ -170,6 +215,7 @@ async function handleSave() {
option-value="id"
hide-selected
sort-by="name ASC"
:required="true"
>
<template #form>
<TicketCreateServiceType
@ -185,6 +231,7 @@ async function handleSave() {
:label="col.label"
v-model.number="row.quantity"
type="number"
:required="true"
min="0"
:info="t('service.quantityInfo')"
/>
@ -196,6 +243,7 @@ async function handleSave() {
:label="col.label"
v-model.number="row.price"
type="number"
:required="true"
min="0"
@keyup.enter="handleSave"
/>