forked from verdnatura/salix-front
feat: requested changes in item module
This commit is contained in:
parent
b4a4c4a0a4
commit
4276cefd7a
|
@ -610,6 +610,7 @@ function handleSelection({ evt, added, rows: selectedRows }, rows) {
|
||||||
$props.rowClick && $props.rowClick(row);
|
$props.rowClick && $props.rowClick(row);
|
||||||
}
|
}
|
||||||
"
|
"
|
||||||
|
style="height: 100%"
|
||||||
>
|
>
|
||||||
<QCardSection
|
<QCardSection
|
||||||
vertical
|
vertical
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
<script setup>
|
<script setup>
|
||||||
import { ref, onUnmounted, watch } from 'vue';
|
import { ref, onUnmounted, watch, onMounted } from 'vue';
|
||||||
import { useI18n } from 'vue-i18n';
|
import { useI18n } from 'vue-i18n';
|
||||||
import { useRoute, useRouter } from 'vue-router';
|
import { useRoute, useRouter } from 'vue-router';
|
||||||
import axios from 'axios';
|
import axios from 'axios';
|
||||||
|
@ -369,6 +369,10 @@ async function clearFilter() {
|
||||||
await applyFilter();
|
await applyFilter();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
onMounted(() => {
|
||||||
|
stateStore.rightDrawer = true;
|
||||||
|
});
|
||||||
|
|
||||||
onUnmounted(() => {
|
onUnmounted(() => {
|
||||||
stateStore.rightDrawer = false;
|
stateStore.rightDrawer = false;
|
||||||
});
|
});
|
||||||
|
|
|
@ -127,7 +127,6 @@ async function search(evt) {
|
||||||
userParams.value = newParams;
|
userParams.value = newParams;
|
||||||
|
|
||||||
if (!$props.showAll && !Object.values(filter).length) store.data = [];
|
if (!$props.showAll && !Object.values(filter).length) store.data = [];
|
||||||
emit('search');
|
|
||||||
} finally {
|
} finally {
|
||||||
isLoading.value = false;
|
isLoading.value = false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -397,8 +397,8 @@ entry:
|
||||||
buys: Buys
|
buys: Buys
|
||||||
stickers: Stickers
|
stickers: Stickers
|
||||||
package: Package
|
package: Package
|
||||||
packing: Packing
|
packing: Pack.
|
||||||
grouping: Grouping
|
grouping: Group.
|
||||||
buyingValue: Buying value
|
buyingValue: Buying value
|
||||||
import: Import
|
import: Import
|
||||||
pvp: PVP
|
pvp: PVP
|
||||||
|
|
|
@ -400,8 +400,8 @@ entry:
|
||||||
buys: Compras
|
buys: Compras
|
||||||
stickers: Etiquetas
|
stickers: Etiquetas
|
||||||
package: Embalaje
|
package: Embalaje
|
||||||
packing: Packing
|
packing: Pack.
|
||||||
grouping: Grouping
|
grouping: Group.
|
||||||
buyingValue: Coste
|
buyingValue: Coste
|
||||||
import: Importe
|
import: Importe
|
||||||
pvp: PVP
|
pvp: PVP
|
||||||
|
|
|
@ -2,12 +2,15 @@
|
||||||
import { ref, nextTick } from 'vue';
|
import { ref, nextTick } from 'vue';
|
||||||
import { useRoute } from 'vue-router';
|
import { useRoute } from 'vue-router';
|
||||||
import { useI18n } from 'vue-i18n';
|
import { useI18n } from 'vue-i18n';
|
||||||
|
import axios from 'axios';
|
||||||
|
|
||||||
import CrudModel from 'src/components/CrudModel.vue';
|
import CrudModel from 'src/components/CrudModel.vue';
|
||||||
import VnInput from 'src/components/common/VnInput.vue';
|
import VnInput from 'src/components/common/VnInput.vue';
|
||||||
|
import useNotify from 'src/composables/useNotify.js';
|
||||||
|
|
||||||
const route = useRoute();
|
const route = useRoute();
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
|
const { notify } = useNotify();
|
||||||
|
|
||||||
const itemBarcodeRef = ref(null);
|
const itemBarcodeRef = ref(null);
|
||||||
|
|
||||||
|
@ -23,6 +26,24 @@ const focusLastInput = () => {
|
||||||
if (lastInput) lastInput.focus();
|
if (lastInput) lastInput.focus();
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const removeRow = (row) => {
|
||||||
|
itemBarcodeRef.value.remove([row]);
|
||||||
|
};
|
||||||
|
|
||||||
|
const submit = async (rows) => {
|
||||||
|
const params = rows[rows.length - 1];
|
||||||
|
let { data } = await axios.get('ItemBarcodes');
|
||||||
|
const code = params.code;
|
||||||
|
|
||||||
|
if (data.some((codes) => codes.code === code)) {
|
||||||
|
notify(t('Codes can not be repeated'), 'negative');
|
||||||
|
itemBarcodeRef.value.reset();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
await axios.patch(`ItemBarcodes`, params);
|
||||||
|
notify(t('globals.dataSaved'), 'positive');
|
||||||
|
};
|
||||||
</script>
|
</script>
|
||||||
<template>
|
<template>
|
||||||
<div class="full-width flex justify-center">
|
<div class="full-width flex justify-center">
|
||||||
|
@ -39,6 +60,7 @@ const focusLastInput = () => {
|
||||||
ref="itemBarcodeRef"
|
ref="itemBarcodeRef"
|
||||||
url="ItemBarcodes"
|
url="ItemBarcodes"
|
||||||
auto-load
|
auto-load
|
||||||
|
:save-fn="submit"
|
||||||
>
|
>
|
||||||
<template #body="{ rows }">
|
<template #body="{ rows }">
|
||||||
<QCard class="q-px-lg q-py-md">
|
<QCard class="q-px-lg q-py-md">
|
||||||
|
@ -54,7 +76,7 @@ const focusLastInput = () => {
|
||||||
focusable-input
|
focusable-input
|
||||||
/>
|
/>
|
||||||
<QIcon
|
<QIcon
|
||||||
@click="itemBarcodeRef.remove([row])"
|
@click="removeRow(row)"
|
||||||
class="cursor-pointer q-ml-md"
|
class="cursor-pointer q-ml-md"
|
||||||
color="primary"
|
color="primary"
|
||||||
name="delete"
|
name="delete"
|
||||||
|
@ -89,4 +111,5 @@ es:
|
||||||
Code: Código
|
Code: Código
|
||||||
Remove barcode: Quitar código de barras
|
Remove barcode: Quitar código de barras
|
||||||
Add barcode: Añadir código de barras
|
Add barcode: Añadir código de barras
|
||||||
|
Codes can not be repeated: Los códigos no puden ser repetidos
|
||||||
</i18n>
|
</i18n>
|
||||||
|
|
|
@ -70,6 +70,7 @@ const onIntrastatCreated = (response, formData) => {
|
||||||
option-label="name"
|
option-label="name"
|
||||||
hide-selected
|
hide-selected
|
||||||
map-options
|
map-options
|
||||||
|
required
|
||||||
>
|
>
|
||||||
<template #option="scope">
|
<template #option="scope">
|
||||||
<QItem v-bind="scope.itemProps">
|
<QItem v-bind="scope.itemProps">
|
||||||
|
|
|
@ -1,19 +1,15 @@
|
||||||
<script setup>
|
<script setup>
|
||||||
import { onMounted, ref, computed, reactive } from 'vue';
|
import { onMounted, ref, computed, reactive, watchEffect } from 'vue';
|
||||||
import { useI18n } from 'vue-i18n';
|
import { useI18n } from 'vue-i18n';
|
||||||
import { useRoute } from 'vue-router';
|
import { useRoute } from 'vue-router';
|
||||||
|
|
||||||
import VnInput from 'src/components/common/VnInput.vue';
|
|
||||||
import VnSelect from 'src/components/common/VnSelect.vue';
|
|
||||||
import ItemDescriptorProxy from 'src/pages/Item/Card/ItemDescriptorProxy.vue';
|
import ItemDescriptorProxy from 'src/pages/Item/Card/ItemDescriptorProxy.vue';
|
||||||
|
|
||||||
import { toDateFormat } from 'src/filters/date.js';
|
import { toDateFormat } from 'src/filters/date.js';
|
||||||
import { dashIfEmpty } from 'src/filters';
|
|
||||||
import { useArrayData } from 'src/composables/useArrayData';
|
import { useArrayData } from 'src/composables/useArrayData';
|
||||||
import useNotify from 'src/composables/useNotify.js';
|
import useNotify from 'src/composables/useNotify.js';
|
||||||
import { useVnConfirm } from 'composables/useVnConfirm';
|
import { useVnConfirm } from 'composables/useVnConfirm';
|
||||||
import axios from 'axios';
|
import axios from 'axios';
|
||||||
import { useStateStore } from 'stores/useStateStore';
|
import { useStateStore } from 'stores/useStateStore';
|
||||||
|
import VnTable from 'src/components/VnTable/VnTable.vue';
|
||||||
|
|
||||||
const stateStore = useStateStore();
|
const stateStore = useStateStore();
|
||||||
|
|
||||||
|
@ -21,8 +17,9 @@ const route = useRoute();
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
const { notify } = useNotify();
|
const { notify } = useNotify();
|
||||||
const { openConfirmationModal } = useVnConfirm();
|
const { openConfirmationModal } = useVnConfirm();
|
||||||
|
const tableRef = ref();
|
||||||
const rowsSelected = ref([]);
|
const selectedRows = ref([]);
|
||||||
|
const hasSelectedCards = computed(() => selectedRows.value.length > 0);
|
||||||
|
|
||||||
const exprBuilder = (param, value) => {
|
const exprBuilder = (param, value) => {
|
||||||
switch (param) {
|
switch (param) {
|
||||||
|
@ -36,6 +33,11 @@ const exprBuilder = (param, value) => {
|
||||||
};
|
};
|
||||||
|
|
||||||
const params = reactive({ itemFk: route.params.id });
|
const params = reactive({ itemFk: route.params.id });
|
||||||
|
const filter = reactive({
|
||||||
|
where: {
|
||||||
|
itemFk: route.params.id,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
const arrayData = useArrayData('ItemShelvings', {
|
const arrayData = useArrayData('ItemShelvings', {
|
||||||
url: 'ItemShelvingPlacementSupplyStocks',
|
url: 'ItemShelvingPlacementSupplyStocks',
|
||||||
|
@ -44,123 +46,69 @@ const arrayData = useArrayData('ItemShelvings', {
|
||||||
});
|
});
|
||||||
const rows = computed(() => arrayData.store.data || []);
|
const rows = computed(() => arrayData.store.data || []);
|
||||||
|
|
||||||
const applyColumnFilter = async (col) => {
|
|
||||||
const paramKey = col.columnFilter?.filterParamKey || col.field;
|
|
||||||
params[paramKey] = col.columnFilter.filterValue;
|
|
||||||
await arrayData.addFilter({ filter: null, params });
|
|
||||||
};
|
|
||||||
|
|
||||||
const getInputEvents = (col) => {
|
|
||||||
return col.columnFilter.type === 'select'
|
|
||||||
? { 'update:modelValue': () => applyColumnFilter(col) }
|
|
||||||
: {
|
|
||||||
'keyup.enter': () => applyColumnFilter(col),
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
const columns = computed(() => [
|
const columns = computed(() => [
|
||||||
{
|
{
|
||||||
label: t('shelvings.created'),
|
label: t('shelvings.created'),
|
||||||
name: 'created',
|
name: 'created',
|
||||||
field: 'created',
|
|
||||||
align: 'left',
|
align: 'left',
|
||||||
sortable: true,
|
columnFilter: false,
|
||||||
columnFilter: null,
|
format: (row) => toDateFormat(row.created),
|
||||||
format: (val) => toDateFormat(val),
|
|
||||||
},
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
label: t('shelvings.item'),
|
label: t('shelvings.item'),
|
||||||
name: 'item',
|
name: 'itemFk',
|
||||||
field: 'itemFk',
|
|
||||||
align: 'left',
|
align: 'left',
|
||||||
sortable: true,
|
columnFilter: false,
|
||||||
columnFilter: null,
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: t('shelvings.concept'),
|
label: t('shelvings.concept'),
|
||||||
name: 'concept',
|
name: 'longName',
|
||||||
align: 'left',
|
align: 'left',
|
||||||
sortable: true,
|
columnFilter: false,
|
||||||
columnFilter: null,
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: t('shelvings.parking'),
|
label: t('shelvings.parking'),
|
||||||
name: 'parking',
|
name: 'parking',
|
||||||
field: 'parking',
|
|
||||||
align: 'left',
|
align: 'left',
|
||||||
sortable: true,
|
component: 'select',
|
||||||
format: (val) => dashIfEmpty(val),
|
attrs: {
|
||||||
columnFilter: {
|
url: 'parkings',
|
||||||
component: VnSelect,
|
fields: ['code'],
|
||||||
type: 'select',
|
'sort-by': 'code ASC',
|
||||||
filterValue: null,
|
'option-value': 'code',
|
||||||
event: getInputEvents,
|
'option-label': 'code',
|
||||||
attrs: {
|
dense: true,
|
||||||
url: 'parkings',
|
|
||||||
fields: ['code'],
|
|
||||||
'sort-by': 'code ASC',
|
|
||||||
'option-value': 'code',
|
|
||||||
'option-label': 'code',
|
|
||||||
dense: true,
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
|
columnField: { component: null },
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: t('shelvings.shelving'),
|
label: t('shelvings.shelving'),
|
||||||
name: 'shelving',
|
name: 'shelving',
|
||||||
field: 'shelving',
|
|
||||||
align: 'left',
|
align: 'left',
|
||||||
sortable: true,
|
component: 'select',
|
||||||
format: (val) => dashIfEmpty(val),
|
attrs: {
|
||||||
columnFilter: {
|
url: 'shelvings',
|
||||||
component: VnSelect,
|
fields: ['code'],
|
||||||
type: 'select',
|
'sort-by': 'code ASC',
|
||||||
filterValue: null,
|
'option-value': 'code',
|
||||||
event: getInputEvents,
|
'option-label': 'code',
|
||||||
attrs: {
|
dense: true,
|
||||||
url: 'shelvings',
|
|
||||||
fields: ['code'],
|
|
||||||
'sort-by': 'code ASC',
|
|
||||||
'option-value': 'code',
|
|
||||||
'option-label': 'code',
|
|
||||||
dense: true,
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
|
columnField: { component: null },
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: t('shelvings.label'),
|
label: t('shelvings.label'),
|
||||||
name: 'label',
|
name: 'label',
|
||||||
align: 'left',
|
align: 'left',
|
||||||
sortable: true,
|
columnFilter: { inWhere: true },
|
||||||
format: (_, row) => (row.stock / row.packing).toFixed(2),
|
format: (row) => (row.stock / row.packing).toFixed(2),
|
||||||
columnFilter: {
|
|
||||||
component: VnInput,
|
|
||||||
type: 'text',
|
|
||||||
filterParamKey: 'label',
|
|
||||||
filterValue: null,
|
|
||||||
event: getInputEvents,
|
|
||||||
attrs: {
|
|
||||||
dense: true,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: t('shelvings.packing'),
|
label: t('shelvings.packing'),
|
||||||
field: 'packing',
|
|
||||||
name: 'packing',
|
name: 'packing',
|
||||||
|
attrs: { inWhere: true },
|
||||||
align: 'left',
|
align: 'left',
|
||||||
sortable: true,
|
|
||||||
columnFilter: {
|
|
||||||
component: VnInput,
|
|
||||||
type: 'text',
|
|
||||||
filterValue: null,
|
|
||||||
event: getInputEvents,
|
|
||||||
attrs: {
|
|
||||||
dense: true,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
format: (val) => dashIfEmpty(val),
|
|
||||||
},
|
},
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
@ -169,15 +117,16 @@ const totalLabels = computed(() =>
|
||||||
);
|
);
|
||||||
|
|
||||||
const removeLines = async () => {
|
const removeLines = async () => {
|
||||||
const itemShelvingIds = rowsSelected.value.map((row) => row.itemShelvingFk);
|
const itemShelvingIds = selectedRows.value.map((row) => row.itemShelvingFk);
|
||||||
await axios.post('ItemShelvings/deleteItemShelvings', { itemShelvingIds });
|
await axios.post('ItemShelvings/deleteItemShelvings', { itemShelvingIds });
|
||||||
rowsSelected.value = [];
|
selectedRows.value = [];
|
||||||
notify('shelvings.shelvingsRemoved', 'positive');
|
notify('shelvings.shelvingsRemoved', 'positive');
|
||||||
await arrayData.fetch({ append: false });
|
await tableRef.value.reload();
|
||||||
};
|
};
|
||||||
onMounted(async () => {
|
onMounted(async () => {
|
||||||
await arrayData.fetch({ append: false });
|
await arrayData.fetch({ append: false });
|
||||||
});
|
});
|
||||||
|
watchEffect(selectedRows);
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
|
@ -203,7 +152,7 @@ onMounted(async () => {
|
||||||
<QBtn
|
<QBtn
|
||||||
color="primary"
|
color="primary"
|
||||||
icon="delete"
|
icon="delete"
|
||||||
:disabled="!rowsSelected.length"
|
:disabled="!hasSelectedCards"
|
||||||
@click="
|
@click="
|
||||||
openConfirmationModal(
|
openConfirmationModal(
|
||||||
t('shelvings.removeConfirmTitle'),
|
t('shelvings.removeConfirmTitle'),
|
||||||
|
@ -219,41 +168,27 @@ onMounted(async () => {
|
||||||
</Teleport>
|
</Teleport>
|
||||||
</template>
|
</template>
|
||||||
<QPage class="column items-center q-pa-md">
|
<QPage class="column items-center q-pa-md">
|
||||||
<QTable
|
<VnTable
|
||||||
:rows="rows"
|
ref="tableRef"
|
||||||
|
data-key="ItemShelving"
|
||||||
:columns="columns"
|
:columns="columns"
|
||||||
row-key="id"
|
:url="`ItemShelvingPlacementSupplyStocks`"
|
||||||
:pagination="{ rowsPerPage: 0 }"
|
:filter="filter"
|
||||||
class="full-width q-mt-md"
|
:expr-builder="exprBuilder"
|
||||||
selection="multiple"
|
:right-search="false"
|
||||||
v-model:selected="rowsSelected"
|
v-model:selected="selectedRows"
|
||||||
:no-data-label="t('globals.noResults')"
|
:table="{
|
||||||
|
'row-key': 'itemShelvingFk',
|
||||||
|
selection: 'multiple',
|
||||||
|
}"
|
||||||
|
auto-load
|
||||||
>
|
>
|
||||||
<template #top-row="{ cols }">
|
<template #column-longName="{ row }">
|
||||||
<QTr>
|
<span class="link" @click.stop>
|
||||||
<QTd />
|
{{ row.longName }}
|
||||||
<QTd
|
|
||||||
v-for="(col, index) in cols"
|
|
||||||
:key="index"
|
|
||||||
style="max-width: 100px"
|
|
||||||
>
|
|
||||||
<component
|
|
||||||
:is="col.columnFilter.component"
|
|
||||||
v-if="col.columnFilter"
|
|
||||||
v-model="col.columnFilter.filterValue"
|
|
||||||
v-bind="col.columnFilter.attrs"
|
|
||||||
v-on="col.columnFilter.event(col)"
|
|
||||||
dense
|
|
||||||
/>
|
|
||||||
</QTd>
|
|
||||||
</QTr>
|
|
||||||
</template>
|
|
||||||
<template #body-cell-concept="{ row }">
|
|
||||||
<QTd @click.stop>
|
|
||||||
<span class="link">{{ row.longName }}</span>
|
|
||||||
<ItemDescriptorProxy :id="row.itemFk" />
|
<ItemDescriptorProxy :id="row.itemFk" />
|
||||||
</QTd>
|
</span>
|
||||||
</template>
|
</template>
|
||||||
</QTable>
|
</VnTable>
|
||||||
</QPage>
|
</QPage>
|
||||||
</template>
|
</template>
|
||||||
|
|
|
@ -89,7 +89,7 @@ const getUrl = (id, param) => `#/Item/${id}/${param}`;
|
||||||
<QCard class="vn-one">
|
<QCard class="vn-one">
|
||||||
<VnTitle
|
<VnTitle
|
||||||
:url="getUrl(entityId, 'basic-data')"
|
:url="getUrl(entityId, 'basic-data')"
|
||||||
:text="t('item.summary.otherData')"
|
:text="t('item.summary.basicData')"
|
||||||
/>
|
/>
|
||||||
<VnLv
|
<VnLv
|
||||||
:label="t('item.summary.intrastatCode')"
|
:label="t('item.summary.intrastatCode')"
|
||||||
|
|
|
@ -8,11 +8,12 @@ import VnRow from 'components/ui/VnRow.vue';
|
||||||
import VnInput from 'src/components/common/VnInput.vue';
|
import VnInput from 'src/components/common/VnInput.vue';
|
||||||
import FetchData from 'components/FetchData.vue';
|
import FetchData from 'components/FetchData.vue';
|
||||||
import VnSelect from 'src/components/common/VnSelect.vue';
|
import VnSelect from 'src/components/common/VnSelect.vue';
|
||||||
|
import useNotify from 'src/composables/useNotify.js';
|
||||||
import axios from 'axios';
|
import axios from 'axios';
|
||||||
|
|
||||||
const route = useRoute();
|
const route = useRoute();
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
|
const { notify } = useNotify();
|
||||||
|
|
||||||
const itemTagsRef = ref(null);
|
const itemTagsRef = ref(null);
|
||||||
const tagOptions = ref([]);
|
const tagOptions = ref([]);
|
||||||
|
@ -60,6 +61,39 @@ const insertTag = (rows) => {
|
||||||
itemTagsRef.value.formData[itemTagsRef.value.formData.length - 1].priority =
|
itemTagsRef.value.formData[itemTagsRef.value.formData.length - 1].priority =
|
||||||
getHighestPriority(rows);
|
getHighestPriority(rows);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const submitTags = async (data) => {
|
||||||
|
data.forEach((item, index) => {
|
||||||
|
console.log(`Elemento ${index}:`, item.tag.name); // Muestra el valor de `value`
|
||||||
|
if (!item.value) {
|
||||||
|
console.error(`Elemento ${index} no tiene la propiedad "value".`);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
const tagNameCounts = data.reduce((counts, item) => {
|
||||||
|
const tagName = item.tag.name; // Accede al nombre del tag
|
||||||
|
counts[tagName] = (counts[tagName] || 0) + 1; // Incrementa el contador
|
||||||
|
return counts;
|
||||||
|
}, {});
|
||||||
|
|
||||||
|
// Filtra los nombres duplicados
|
||||||
|
const duplicates = Object.keys(tagNameCounts).filter(
|
||||||
|
(name) => tagNameCounts[name] > 1
|
||||||
|
);
|
||||||
|
|
||||||
|
console.log('Nombres duplicados:', duplicates);
|
||||||
|
|
||||||
|
if (duplicates.length > 0) {
|
||||||
|
notify(t('Tags can not be repeated'), 'negative');
|
||||||
|
itemTagsRef.value.reset();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const params = {
|
||||||
|
...data,
|
||||||
|
};
|
||||||
|
await axios.patch(`Tags/onSubmit`, params);
|
||||||
|
notify(t('globals.dataSaved'), 'positive');
|
||||||
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
|
@ -189,3 +223,8 @@ const insertTag = (rows) => {
|
||||||
</QPage>
|
</QPage>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
<i18n>
|
||||||
|
es:
|
||||||
|
Tags can not be repeated: Las etiquetas no pueden repetirse
|
||||||
|
</i18n>
|
||||||
|
|
|
@ -28,7 +28,7 @@ const taxesFilter = {
|
||||||
],
|
],
|
||||||
};
|
};
|
||||||
|
|
||||||
const ItemTaxRef = ref(null);
|
const ItemTaxRef = ref();
|
||||||
const taxesOptions = ref([]);
|
const taxesOptions = ref([]);
|
||||||
|
|
||||||
const submitTaxes = async (data) => {
|
const submitTaxes = async (data) => {
|
||||||
|
@ -36,7 +36,10 @@ const submitTaxes = async (data) => {
|
||||||
id: tax.id,
|
id: tax.id,
|
||||||
taxClassFk: tax.taxClassFk,
|
taxClassFk: tax.taxClassFk,
|
||||||
}));
|
}));
|
||||||
|
if (payload.some((item) => item.taxClassFk === null)) {
|
||||||
|
notify(t('Tax class cannot be blank'), 'negative');
|
||||||
|
return;
|
||||||
|
}
|
||||||
await axios.post(`Items/updateTaxes`, payload);
|
await axios.post(`Items/updateTaxes`, payload);
|
||||||
notify(t('globals.dataSaved'), 'positive');
|
notify(t('globals.dataSaved'), 'positive');
|
||||||
};
|
};
|
||||||
|
|
|
@ -413,7 +413,6 @@ function handleOnDataSave({ CrudModelRef }) {
|
||||||
save-url="FixedPrices/crud"
|
save-url="FixedPrices/crud"
|
||||||
:user-params="{ warehouseFk: user.warehouseFk }"
|
:user-params="{ warehouseFk: user.warehouseFk }"
|
||||||
ref="tableRef"
|
ref="tableRef"
|
||||||
dense
|
|
||||||
:columns="columns"
|
:columns="columns"
|
||||||
default-mode="table"
|
default-mode="table"
|
||||||
auto-load
|
auto-load
|
||||||
|
|
|
@ -184,7 +184,7 @@ const columns = computed(() => [
|
||||||
cardVisible: true,
|
cardVisible: true,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: t('globals.origin'),
|
label: t('item.list.origin'),
|
||||||
name: 'origin',
|
name: 'origin',
|
||||||
align: 'left',
|
align: 'left',
|
||||||
component: 'select',
|
component: 'select',
|
||||||
|
@ -228,7 +228,8 @@ const columns = computed(() => [
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: t('item.list.weightByPiece'),
|
label: t('item.list.weight'),
|
||||||
|
toolTip: t('item.list.weightByPiece'),
|
||||||
name: 'weightByPiece',
|
name: 'weightByPiece',
|
||||||
align: 'left',
|
align: 'left',
|
||||||
component: 'input',
|
component: 'input',
|
||||||
|
@ -322,7 +323,6 @@ const columns = computed(() => [
|
||||||
ref="tableRef"
|
ref="tableRef"
|
||||||
data-key="ItemList"
|
data-key="ItemList"
|
||||||
url="Items/filter"
|
url="Items/filter"
|
||||||
url-create="Items"
|
|
||||||
:create="{
|
:create="{
|
||||||
urlCreate: 'Items',
|
urlCreate: 'Items',
|
||||||
title: t('Create Item'),
|
title: t('Create Item'),
|
||||||
|
@ -333,11 +333,10 @@ const columns = computed(() => [
|
||||||
}"
|
}"
|
||||||
:order="['isActive DESC', 'name', 'id']"
|
:order="['isActive DESC', 'name', 'id']"
|
||||||
:columns="columns"
|
:columns="columns"
|
||||||
auto-load
|
|
||||||
redirect="Item"
|
redirect="Item"
|
||||||
:is-editable="false"
|
:is-editable="false"
|
||||||
:right-search="false"
|
:right-search="false"
|
||||||
:filer="itemFilter"
|
:filter="itemFilter"
|
||||||
>
|
>
|
||||||
<template #column-id="{ row }">
|
<template #column-id="{ row }">
|
||||||
<span class="link" @click.stop>
|
<span class="link" @click.stop>
|
||||||
|
@ -348,7 +347,7 @@ const columns = computed(() => [
|
||||||
<template #column-userName="{ row }">
|
<template #column-userName="{ row }">
|
||||||
<span class="link" @click.stop>
|
<span class="link" @click.stop>
|
||||||
{{ row.userName }}
|
{{ row.userName }}
|
||||||
<WorkerDescriptorProxy :id="row.workerFk" />
|
<WorkerDescriptorProxy :id="row.buyerFk" />
|
||||||
</span>
|
</span>
|
||||||
</template>
|
</template>
|
||||||
<template #column-description="{ row }">
|
<template #column-description="{ row }">
|
||||||
|
|
|
@ -199,7 +199,17 @@ onMounted(async () => {
|
||||||
dense
|
dense
|
||||||
outlined
|
outlined
|
||||||
rounded
|
rounded
|
||||||
/>
|
>
|
||||||
|
<template #option="scope">
|
||||||
|
<QItem v-bind="scope.itemProps">
|
||||||
|
<QItemSection>
|
||||||
|
<QItemLabel>{{
|
||||||
|
t(`params.${scope.opt?.name}`)
|
||||||
|
}}</QItemLabel>
|
||||||
|
</QItemSection>
|
||||||
|
</QItem>
|
||||||
|
</template>
|
||||||
|
</VnSelect>
|
||||||
</QItemSection>
|
</QItemSection>
|
||||||
</QItem>
|
</QItem>
|
||||||
<QItem>
|
<QItem>
|
||||||
|
@ -434,6 +444,13 @@ en:
|
||||||
description: Description
|
description: Description
|
||||||
name: Name
|
name: Name
|
||||||
id: Id
|
id: Id
|
||||||
|
Accessories: Accessories
|
||||||
|
Artificial: Artificial
|
||||||
|
Flower: Flower
|
||||||
|
Fruit: Fruit
|
||||||
|
Green: Green
|
||||||
|
Handmade: Handmade
|
||||||
|
Plant: Plant
|
||||||
es:
|
es:
|
||||||
More fields: Más campos
|
More fields: Más campos
|
||||||
params:
|
params:
|
||||||
|
@ -450,4 +467,11 @@ es:
|
||||||
description: Descripción
|
description: Descripción
|
||||||
name: Nombre
|
name: Nombre
|
||||||
id: Id
|
id: Id
|
||||||
|
Accessories: Accesorios
|
||||||
|
Artificial: Artificial
|
||||||
|
Flower: Flor
|
||||||
|
Fruit: Fruta
|
||||||
|
Green: Verde
|
||||||
|
Handmade: Hecho a mano
|
||||||
|
Plant: Planta
|
||||||
</i18n>
|
</i18n>
|
||||||
|
|
|
@ -5,13 +5,16 @@ import TicketDescriptorProxy from 'src/pages/Ticket/Card/TicketDescriptorProxy.v
|
||||||
import WorkerDescriptorProxy from 'src/pages/Worker/Card/WorkerDescriptorProxy.vue';
|
import WorkerDescriptorProxy from 'src/pages/Worker/Card/WorkerDescriptorProxy.vue';
|
||||||
import { useStateStore } from 'stores/useStateStore';
|
import { useStateStore } from 'stores/useStateStore';
|
||||||
import { useArrayData } from 'composables/useArrayData';
|
import { useArrayData } from 'composables/useArrayData';
|
||||||
import { dashIfEmpty, toCurrency } from 'filters/index';
|
import { toCurrency } from 'filters/index';
|
||||||
import useNotify from 'src/composables/useNotify.js';
|
import useNotify from 'src/composables/useNotify.js';
|
||||||
import axios from 'axios';
|
import axios from 'axios';
|
||||||
import ItemRequestDenyForm from './ItemRequestDenyForm.vue';
|
import ItemRequestDenyForm from './ItemRequestDenyForm.vue';
|
||||||
import { toDate } from 'src/filters';
|
import { toDate } from 'src/filters';
|
||||||
import VnTable from 'components/VnTable/VnTable.vue';
|
import VnTable from 'components/VnTable/VnTable.vue';
|
||||||
import VnInput from 'src/components/common/VnInput.vue';
|
import VnInput from 'src/components/common/VnInput.vue';
|
||||||
|
import VnInputNumber from 'src/components/common/VnInputNumber.vue';
|
||||||
|
import ItemRequestFilter from './ItemRequestFilter.vue';
|
||||||
|
import RightMenu from 'src/components/common/RightMenu.vue';
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
const { notify } = useNotify();
|
const { notify } = useNotify();
|
||||||
const stateStore = useStateStore();
|
const stateStore = useStateStore();
|
||||||
|
@ -228,6 +231,11 @@ onMounted(async () => {
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
|
<RightMenu>
|
||||||
|
<template #right-panel>
|
||||||
|
<ItemRequestFilter data-key="itemRequest" />
|
||||||
|
</template>
|
||||||
|
</RightMenu>
|
||||||
<VnTable
|
<VnTable
|
||||||
ref="tableRef"
|
ref="tableRef"
|
||||||
data-key="itemRequest"
|
data-key="itemRequest"
|
||||||
|
@ -239,6 +247,7 @@ onMounted(async () => {
|
||||||
auto-load
|
auto-load
|
||||||
:disable-option="{ card: true }"
|
:disable-option="{ card: true }"
|
||||||
chip-locale="item.params"
|
chip-locale="item.params"
|
||||||
|
:right-search="false"
|
||||||
>
|
>
|
||||||
<template #column-ticketFk="{ row }">
|
<template #column-ticketFk="{ row }">
|
||||||
<span class="link">
|
<span class="link">
|
||||||
|
@ -306,30 +315,28 @@ onMounted(async () => {
|
||||||
/>
|
/>
|
||||||
</template>
|
</template>
|
||||||
<template #column-denyOptions="{ row, rowIndex }">
|
<template #column-denyOptions="{ row, rowIndex }">
|
||||||
<QTd class="sticky no-padding">
|
<QIcon
|
||||||
<QIcon
|
v-if="row.response?.length"
|
||||||
v-if="row.response?.length"
|
name="insert_drive_file"
|
||||||
name="insert_drive_file"
|
color="primary"
|
||||||
color="primary"
|
size="sm"
|
||||||
size="sm"
|
>
|
||||||
>
|
<QTooltip>
|
||||||
<QTooltip>
|
{{ row.response }}
|
||||||
{{ row.response }}
|
</QTooltip>
|
||||||
</QTooltip>
|
</QIcon>
|
||||||
</QIcon>
|
<QIcon
|
||||||
<QIcon
|
v-if="row.isOk == null"
|
||||||
v-if="row.isOk == null"
|
name="thumb_down"
|
||||||
name="thumb_down"
|
color="primary"
|
||||||
color="primary"
|
size="sm"
|
||||||
size="sm"
|
class="fill-icon"
|
||||||
class="fill-icon"
|
@click="showDenyRequestForm(row.id, rowIndex)"
|
||||||
@click="showDenyRequestForm(row.id, rowIndex)"
|
>
|
||||||
>
|
<QTooltip>
|
||||||
<QTooltip>
|
{{ t('Discard') }}
|
||||||
{{ t('Discard') }}
|
</QTooltip>
|
||||||
</QTooltip>
|
</QIcon>
|
||||||
</QIcon>
|
|
||||||
</QTd>
|
|
||||||
</template>
|
</template>
|
||||||
</VnTable>
|
</VnTable>
|
||||||
<QDialog ref="denyFormRef" transition-show="scale" transition-hide="scale">
|
<QDialog ref="denyFormRef" transition-show="scale" transition-hide="scale">
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
<script setup>
|
<script setup>
|
||||||
import { ref } from 'vue';
|
import { onMounted, ref } from 'vue';
|
||||||
import { useI18n } from 'vue-i18n';
|
import { useI18n } from 'vue-i18n';
|
||||||
import { dateRange } from 'src/filters';
|
import { dateRange } from 'src/filters';
|
||||||
import VnFilterPanel from 'src/components/ui/VnFilterPanel.vue';
|
import VnFilterPanel from 'src/components/ui/VnFilterPanel.vue';
|
||||||
|
@ -7,6 +7,7 @@ import VnSelect from 'src/components/common/VnSelect.vue';
|
||||||
import VnInput from 'src/components/common/VnInput.vue';
|
import VnInput from 'src/components/common/VnInput.vue';
|
||||||
import FetchData from 'components/FetchData.vue';
|
import FetchData from 'components/FetchData.vue';
|
||||||
import VnInputDate from 'src/components/common/VnInputDate.vue';
|
import VnInputDate from 'src/components/common/VnInputDate.vue';
|
||||||
|
import { useArrayData } from 'src/composables/useArrayData';
|
||||||
|
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
|
@ -21,7 +22,8 @@ const stateOptions = [
|
||||||
{ code: 'accepted', name: t('accepted') },
|
{ code: 'accepted', name: t('accepted') },
|
||||||
{ code: 'denied', name: t('denied') },
|
{ code: 'denied', name: t('denied') },
|
||||||
];
|
];
|
||||||
|
const arrayData = useArrayData(props.dataKey);
|
||||||
|
const fieldFiltersValues = ref([]);
|
||||||
const itemTypesOptions = ref([]);
|
const itemTypesOptions = ref([]);
|
||||||
const warehousesOptions = ref([]);
|
const warehousesOptions = ref([]);
|
||||||
|
|
||||||
|
@ -56,6 +58,22 @@ const decrement = (paramsObj, key) => {
|
||||||
|
|
||||||
paramsObj[key]--;
|
paramsObj[key]--;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
onMounted(async () => {
|
||||||
|
// Fill fieldFiltersValues with existent userParams
|
||||||
|
console.log('arrayData: ', arrayData.store?.userParams);
|
||||||
|
if (arrayData.store?.userParams) {
|
||||||
|
fieldFiltersValues.value = Object.entries(arrayData.store.userParams).map(
|
||||||
|
([key, value]) => ({
|
||||||
|
name: key,
|
||||||
|
value,
|
||||||
|
selectedField: { name: key, label: t(`params.${key}`) },
|
||||||
|
})
|
||||||
|
);
|
||||||
|
}
|
||||||
|
exprBuilder('state', arrayData.store?.userParams?.state);
|
||||||
|
console.log('fieldFiltersValues.value: ', fieldFiltersValues.value);
|
||||||
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
|
|
|
@ -10,7 +10,6 @@ const { t } = useI18n();
|
||||||
url="ItemTypes"
|
url="ItemTypes"
|
||||||
:label="t('Search item type')"
|
:label="t('Search item type')"
|
||||||
:info="t('Search itemType by id, name or code')"
|
:info="t('Search itemType by id, name or code')"
|
||||||
search-url="table"
|
|
||||||
/>
|
/>
|
||||||
</template>
|
</template>
|
||||||
<i18n>
|
<i18n>
|
||||||
|
|
|
@ -6,6 +6,7 @@ import VnTable from 'components/VnTable/VnTable.vue';
|
||||||
import FetchData from 'components/FetchData.vue';
|
import FetchData from 'components/FetchData.vue';
|
||||||
import RightMenu from 'src/components/common/RightMenu.vue';
|
import RightMenu from 'src/components/common/RightMenu.vue';
|
||||||
import ItemTypeFilter from './ItemType/ItemTypeFilter.vue';
|
import ItemTypeFilter from './ItemType/ItemTypeFilter.vue';
|
||||||
|
import WorkerDescriptorProxy from '../Worker/Card/WorkerDescriptorProxy.vue';
|
||||||
|
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
const tableRef = ref();
|
const tableRef = ref();
|
||||||
|
@ -31,13 +32,14 @@ const columns = computed(() => [
|
||||||
{
|
{
|
||||||
align: 'left',
|
align: 'left',
|
||||||
name: 'name',
|
name: 'name',
|
||||||
label: t('name'),
|
label: t('globals.name'),
|
||||||
cardVisible: true,
|
cardVisible: true,
|
||||||
create: true,
|
create: true,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
align: 'left',
|
align: 'left',
|
||||||
label: t('worker'),
|
label: t('worker'),
|
||||||
|
name: 'workerFk',
|
||||||
create: true,
|
create: true,
|
||||||
component: 'select',
|
component: 'select',
|
||||||
attrs: {
|
attrs: {
|
||||||
|
@ -45,20 +47,20 @@ const columns = computed(() => [
|
||||||
optionLabel: 'nickname',
|
optionLabel: 'nickname',
|
||||||
optionValue: 'id',
|
optionValue: 'id',
|
||||||
},
|
},
|
||||||
|
format: (row) => row.worker?.user?.name,
|
||||||
cardVisible: true,
|
cardVisible: true,
|
||||||
visible: true,
|
columnField: { component: null },
|
||||||
columnField: {
|
|
||||||
component: 'userLink',
|
|
||||||
attrs: ({ row }) => {
|
|
||||||
return {
|
|
||||||
workerId: row?.worker?.id,
|
|
||||||
name: row.worker?.user?.name,
|
|
||||||
defaultName: true,
|
|
||||||
};
|
|
||||||
},
|
|
||||||
},
|
|
||||||
columnFilter: {
|
columnFilter: {
|
||||||
name: 'workerFk',
|
attrs: {
|
||||||
|
url: 'Workers/activeWithInheritedRole',
|
||||||
|
fields: ['id', 'name'],
|
||||||
|
where: { role: 'buyer' },
|
||||||
|
optionFilter: 'firstName',
|
||||||
|
optionLabel: 'name',
|
||||||
|
optionValue: 'id',
|
||||||
|
useLike: false,
|
||||||
|
},
|
||||||
|
inWhere: true,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -135,24 +137,27 @@ const columns = computed(() => [
|
||||||
:columns="columns"
|
:columns="columns"
|
||||||
auto-load
|
auto-load
|
||||||
:right-search="false"
|
:right-search="false"
|
||||||
:is-editable="false"
|
|
||||||
:use-model="true"
|
|
||||||
redirect="item/item-type"
|
redirect="item/item-type"
|
||||||
/>
|
>
|
||||||
|
<template #column-workerFk="{ row }">
|
||||||
|
<span class="link" @click.stop>
|
||||||
|
{{ row.worker?.user?.name }}
|
||||||
|
<WorkerDescriptorProxy :id="row.workerFk" />
|
||||||
|
</span>
|
||||||
|
</template>
|
||||||
|
</VnTable>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<i18n>
|
<i18n>
|
||||||
es:
|
es:
|
||||||
id: Id
|
id: Id
|
||||||
code: Código
|
code: Código
|
||||||
name: Nombre
|
|
||||||
worker: Trabajador
|
worker: Trabajador
|
||||||
ItemCategory: Reino
|
ItemCategory: Reino
|
||||||
Temperature: Temperatura
|
Temperature: Temperatura
|
||||||
Create ItemTypes: Crear familia
|
Create ItemTypes: Crear familia
|
||||||
en:
|
en:
|
||||||
code: Code
|
code: Code
|
||||||
name: Name
|
|
||||||
worker: Worker
|
worker: Worker
|
||||||
ItemCategory: ItemCategory
|
ItemCategory: ItemCategory
|
||||||
Temperature: Temperature
|
Temperature: Temperature
|
||||||
|
|
|
@ -95,6 +95,15 @@ item:
|
||||||
mine: For me
|
mine: For me
|
||||||
state: State
|
state: State
|
||||||
myTeam: My team
|
myTeam: My team
|
||||||
|
shipped: Shipped
|
||||||
|
description: Description
|
||||||
|
quantity: Quantity
|
||||||
|
price: Price
|
||||||
|
item: Item
|
||||||
|
achieved: Achieved
|
||||||
|
concept: Concept
|
||||||
|
denyOptions: Deny
|
||||||
|
scopeDays: Scope days
|
||||||
searchbar:
|
searchbar:
|
||||||
label: Search item
|
label: Search item
|
||||||
descriptor:
|
descriptor:
|
||||||
|
@ -112,7 +121,7 @@ item:
|
||||||
title: All its properties will be copied
|
title: All its properties will be copied
|
||||||
subTitle: Do you want to clone this item?
|
subTitle: Do you want to clone this item?
|
||||||
list:
|
list:
|
||||||
id: Identifier
|
id: Id
|
||||||
grouping: Grouping
|
grouping: Grouping
|
||||||
packing: Packing
|
packing: Packing
|
||||||
description: Description
|
description: Description
|
||||||
|
@ -122,8 +131,9 @@ item:
|
||||||
intrastat: Intrastat
|
intrastat: Intrastat
|
||||||
isActive: Active
|
isActive: Active
|
||||||
size: Size
|
size: Size
|
||||||
origin: Origin
|
origin: Orig.
|
||||||
userName: Buyer
|
userName: Buyer
|
||||||
|
weight: Weight
|
||||||
weightByPiece: Weight/Piece
|
weightByPiece: Weight/Piece
|
||||||
stemMultiplier: Multiplier
|
stemMultiplier: Multiplier
|
||||||
producer: Producer
|
producer: Producer
|
||||||
|
|
|
@ -97,6 +97,15 @@ item:
|
||||||
mine: Para mi
|
mine: Para mi
|
||||||
state: Estado
|
state: Estado
|
||||||
myTeam: Mi equipo
|
myTeam: Mi equipo
|
||||||
|
shipped: Enviado
|
||||||
|
description: Descripción
|
||||||
|
quantity: Cantidad
|
||||||
|
price: Precio
|
||||||
|
item: Artículo
|
||||||
|
achieved: Conseguido
|
||||||
|
concept: Concepto
|
||||||
|
denyOptions: Denegado
|
||||||
|
scopeDays: Días en adelante
|
||||||
searchbar:
|
searchbar:
|
||||||
label: Buscar artículo
|
label: Buscar artículo
|
||||||
descriptor:
|
descriptor:
|
||||||
|
@ -114,7 +123,7 @@ item:
|
||||||
title: Todas sus propiedades serán copiadas
|
title: Todas sus propiedades serán copiadas
|
||||||
subTitle: ¿Desea clonar este artículo?
|
subTitle: ¿Desea clonar este artículo?
|
||||||
list:
|
list:
|
||||||
id: Identificador
|
id: Id
|
||||||
grouping: Grouping
|
grouping: Grouping
|
||||||
packing: Packing
|
packing: Packing
|
||||||
description: Descripción
|
description: Descripción
|
||||||
|
@ -124,7 +133,8 @@ item:
|
||||||
intrastat: Intrastat
|
intrastat: Intrastat
|
||||||
isActive: Activo
|
isActive: Activo
|
||||||
size: Medida
|
size: Medida
|
||||||
origin: Origen
|
origin: Orig.
|
||||||
|
weight: Peso
|
||||||
weightByPiece: Peso (gramos)/tallo
|
weightByPiece: Peso (gramos)/tallo
|
||||||
userName: Comprador
|
userName: Comprador
|
||||||
stemMultiplier: Multiplicador
|
stemMultiplier: Multiplicador
|
||||||
|
|
Loading…
Reference in New Issue