Merge branch 'master' of https://gitea.verdnatura.es/verdnatura/salix-front into 7409-hotfix-addValidations
gitea/salix-front/pipeline/pr-master This commit looks good Details

This commit is contained in:
Jorge Penadés 2024-12-09 09:55:48 +01:00
commit fe037ce511
5 changed files with 60 additions and 33 deletions

View File

@ -67,7 +67,7 @@ const dialog = ref(null);
<QTooltip>{{ t('globals.add') }}</QTooltip> <QTooltip>{{ t('globals.add') }}</QTooltip>
<QPopupProxy ref="dialog"> <QPopupProxy ref="dialog">
<OrderCatalogItemDialog <OrderCatalogItemDialog
:prices="item.prices" :item="item"
@added="() => dialog.hide()" @added="() => dialog.hide()"
/> />
</QPopupProxy> </QPopupProxy>

View File

@ -1,5 +1,5 @@
<script setup> <script setup>
import { onMounted, computed, onUnmounted, reactive, ref, nextTick, watch } from 'vue'; import { onMounted, computed, reactive, ref, nextTick, watch } from 'vue';
import { useI18n } from 'vue-i18n'; import { useI18n } from 'vue-i18n';
import { useRoute, useRouter } from 'vue-router'; import { useRoute, useRouter } from 'vue-router';
@ -12,20 +12,18 @@ import FetchData from 'components/FetchData.vue';
import VnSelect from 'src/components/common/VnSelect.vue'; import VnSelect from 'src/components/common/VnSelect.vue';
import VnInputDate from 'src/components/common/VnInputDate.vue'; import VnInputDate from 'src/components/common/VnInputDate.vue';
import { useStateStore } from 'stores/useStateStore';
import { toDateFormat } from 'src/filters/date.js'; import { toDateFormat } from 'src/filters/date.js';
import { dashIfEmpty } from 'src/filters'; import { dashIfEmpty } from 'src/filters';
import { date } from 'quasar'; import { date } from 'quasar';
import { useState } from 'src/composables/useState'; import { useState } from 'src/composables/useState';
import { useArrayData } from 'src/composables/useArrayData'; import { useArrayData } from 'src/composables/useArrayData';
import axios from 'axios'; import axios from 'axios';
import VnSubToolbar from 'components/ui/VnSubToolbar.vue';
const { t } = useI18n(); const { t } = useI18n();
const route = useRoute(); const route = useRoute();
const router = useRouter(); const router = useRouter();
const stateStore = useStateStore();
const state = useState(); const state = useState();
const user = state.getUser(); const user = state.getUser();
const today = ref(Date.vnNew()); const today = ref(Date.vnNew());
const warehousesOptions = ref([]); const warehousesOptions = ref([]);
@ -145,8 +143,6 @@ onMounted(async () => {
await updateWarehouse(warehouseFk.value); await updateWarehouse(warehouseFk.value);
}); });
onUnmounted(() => (stateStore.rightDrawer = false));
watch( watch(
() => router.currentRoute.value.params.id, () => router.currentRoute.value.params.id,
(newId) => { (newId) => {
@ -205,8 +201,8 @@ async function updateWarehouse(warehouseFk) {
auto-load auto-load
@on-fetch="(data) => (warehousesOptions = data)" @on-fetch="(data) => (warehousesOptions = data)"
/> />
<template v-if="stateStore.isHeaderMounted()"> <VnSubToolbar class="q-mb-md">
<Teleport to="#st-data"> <template #st-data>
<div class="row"> <div class="row">
<VnSelect <VnSelect
:label="t('itemDiary.warehouse')" :label="t('itemDiary.warehouse')"
@ -235,9 +231,8 @@ async function updateWarehouse(warehouseFk) {
@update:model-value="fetchItemBalances" @update:model-value="fetchItemBalances"
/> />
</div> </div>
</Teleport>
<Teleport to="#st-actions"> </Teleport>
</template> </template>
</VnSubToolbar>
<QPage class="column items-center q-pa-md"> <QPage class="column items-center q-pa-md">
<QTable <QTable
:rows="itemBalances" :rows="itemBalances"

View File

@ -1,7 +1,7 @@
<script setup> <script setup>
import { useStateStore } from 'stores/useStateStore'; import { useStateStore } from 'stores/useStateStore';
import { useRoute, useRouter } from 'vue-router'; import { useRoute, useRouter } from 'vue-router';
import { onMounted, onUnmounted, ref, computed, watch } from 'vue'; import { onMounted, onUnmounted, ref, computed, watch, provide, nextTick } from 'vue';
import axios from 'axios'; import axios from 'axios';
import { useI18n } from 'vue-i18n'; import { useI18n } from 'vue-i18n';
import VnPaginate from 'src/components/ui/VnPaginate.vue'; import VnPaginate from 'src/components/ui/VnPaginate.vue';
@ -18,6 +18,7 @@ const dataKey = 'OrderCatalogList';
const arrayData = useArrayData(dataKey); const arrayData = useArrayData(dataKey);
const store = arrayData.store; const store = arrayData.store;
const tags = ref([]); const tags = ref([]);
const itemRefs = ref({});
let catalogParams = { let catalogParams = {
orderFk: route.params.id, orderFk: route.params.id,
@ -76,6 +77,19 @@ watch(
}, },
{ immediate: true } { immediate: true }
); );
const onItemSaved = (updatedItem) => {
requestAnimationFrame(() => {
scrollToItem(updatedItem.items[0].itemFk);
});
};
const scrollToItem = async (id) => {
const element = itemRefs.value[id]?.$el;
if (element) {
element.scrollIntoView({ behavior: 'smooth', block: 'center' });
}
};
provide('onItemSaved', onItemSaved);
</script> </script>
<template> <template>
@ -115,6 +129,7 @@ watch(
<CatalogItem <CatalogItem
v-for="row in rows" v-for="row in rows"
:key="row.id" :key="row.id"
:ref="(el) => (itemRefs[row.id] = el)"
:item="row" :item="row"
is-catalog is-catalog
class="fill-icon" class="fill-icon"

View File

@ -1,41 +1,53 @@
<script setup> <script setup>
import toCurrency from '../../../filters/toCurrency'; import toCurrency from 'src/filters/toCurrency';
import { ref } from 'vue'; import { inject, ref } from 'vue';
import { useI18n } from 'vue-i18n'; import { useI18n } from 'vue-i18n';
import axios from 'axios'; import axios from 'axios';
import { useRoute } from 'vue-router'; import { useRoute } from 'vue-router';
import useNotify from 'composables/useNotify'; import useNotify from 'composables/useNotify';
import { useArrayData } from 'composables/useArrayData'; import { useArrayData } from 'composables/useArrayData';
import VnInputNumber from 'src/components/common/VnInputNumber.vue';
const { t } = useI18n(); const { t } = useI18n();
const { notify } = useNotify(); const { notify } = useNotify();
const emit = defineEmits(['added']); const emit = defineEmits(['added']);
const route = useRoute(); const route = useRoute();
const props = defineProps({ const props = defineProps({
prices: { item: {
type: Array, type: Array,
required: true, required: true,
}, },
}); });
const onItemSaved = inject('onItemSaved');
const fields = ref((props.prices || []).map((item) => ({ ...item, quantity: 0 }))); const prices = ref((props.item.prices || []).map((item) => ({ ...item, quantity: 0 })));
const descriptorData = useArrayData('orderData'); const descriptorData = useArrayData('orderData');
const isLoading = ref(false); const isLoading = ref(false);
const addToOrder = async () => { const addToOrder = async () => {
if (isLoading.value) return; if (isLoading.value) return;
isLoading.value = true; isLoading.value = true;
const items = (fields.value || []).filter((item) => Number(item.quantity) > 0); const items = (prices.value || []).filter((item) => Number(item.quantity) > 0);
await axios.post('/OrderRows/addToOrder', { await axios.post('/OrderRows/addToOrder', {
items, items,
orderFk: Number(route.params.id), orderFk: Number(route.params.id),
}); });
notify(t('globals.dataSaved'), 'positive'); notify(t('globals.dataSaved'), 'positive');
emit('added'); await descriptorData.fetch({});
descriptorData.fetch({}); onItemSaved({ ...props, items, saved: true });
emit('added', items);
isLoading.value = false; isLoading.value = false;
}; };
const canAddToOrder = () => { const canAddToOrder = () => {
return (fields.value || []).some((item) => Number(item.quantity) > 0); let canAddToOrder = (prices.value || []).some((price) => Number(price.quantity) > 0);
if (canAddToOrder) {
const excedQuantity = prices.value.reduce(
(acc, { quantity }) => acc + quantity,
0
);
if (excedQuantity > props.item.available) {
canAddToOrder = false;
}
}
return canAddToOrder;
}; };
</script> </script>
@ -44,30 +56,33 @@ const canAddToOrder = () => {
<QForm @submit="addToOrder"> <QForm @submit="addToOrder">
<QMarkupTable class="shadow-0"> <QMarkupTable class="shadow-0">
<tbody> <tbody>
<tr v-for="item in fields" :key="item.warehouse"> <tr v-for="price in prices" :key="price.warehouse">
<td class="text-bold q-pr-md td" style="width: 35%"> <td class="text-bold q-pr-md td" style="width: 35%">
{{ item.warehouse }} {{ price.warehouse }}
</td> </td>
<td class="text-right" style="width: 35%"> <td class="text-right" style="width: 35%">
<span <span
class="link" class="link"
@click=" @click.shift="
() => { () => {
item.quantity += item.grouping; price.quantity -= price.grouping;
}
"
@click.exact="
() => {
price.quantity += price.grouping;
} }
" "
> >
{{ item.grouping }} {{ price.grouping }}
</span> </span>
x {{ toCurrency(item.price) }} x {{ toCurrency(price.price) }}
</td> </td>
<td class="text-right"> <td class="text-right">
<QInput <VnInputNumber
v-model.number="item.quantity" v-model.number="price.quantity"
type="number" :step="price.grouping"
:step="item.grouping"
min="0" min="0"
dense
/> />
</td> </td>
</tr> </tr>

View File

@ -206,6 +206,8 @@ const handlePhotoUpdated = (evt = false) => {
<i18n> <i18n>
es: es:
Go to client: Ir a cliente
Go to user: Ir al usuario
Click to allow the user to be disabled: Marcar para deshabilitar Click to allow the user to be disabled: Marcar para deshabilitar
Click to exclude the user from getting disabled: Marcar para no deshabilitar Click to exclude the user from getting disabled: Marcar para no deshabilitar
</i18n> </i18n>