forked from verdnatura/salix-front
Merge branch 'dev' into 7180_bug_supplierListScroll
This commit is contained in:
commit
817a8fcc71
|
@ -3,31 +3,29 @@ import { useRole } from './useRole';
|
|||
import { useUserConfig } from './useUserConfig';
|
||||
import axios from 'axios';
|
||||
import useNotify from './useNotify';
|
||||
const TOKEN_MULTIMEDIA = 'tokenMultimedia';
|
||||
const TOKEN = 'token';
|
||||
|
||||
export function useSession() {
|
||||
const { notify } = useNotify();
|
||||
|
||||
function getToken() {
|
||||
const localToken = localStorage.getItem('token');
|
||||
const sessionToken = sessionStorage.getItem('token');
|
||||
const localToken = localStorage.getItem(TOKEN);
|
||||
const sessionToken = sessionStorage.getItem(TOKEN);
|
||||
|
||||
return localToken || sessionToken || '';
|
||||
}
|
||||
function getTokenMultimedia() {
|
||||
const localTokenMultimedia = localStorage.getItem('token'); // Temporal
|
||||
const sessionTokenMultimedia = sessionStorage.getItem('token'); // Temporal
|
||||
const localTokenMultimedia = localStorage.getItem(TOKEN_MULTIMEDIA);
|
||||
const sessionTokenMultimedia = sessionStorage.getItem(TOKEN_MULTIMEDIA);
|
||||
|
||||
return localTokenMultimedia || sessionTokenMultimedia || '';
|
||||
}
|
||||
|
||||
function setToken(data) {
|
||||
if (data.keepLogin) {
|
||||
localStorage.setItem('token', data.token);
|
||||
localStorage.setItem('tokenMultimedia', data.tokenMultimedia);
|
||||
} else {
|
||||
sessionStorage.setItem('token', data.token);
|
||||
sessionStorage.setItem('tokenMultimedia', data.tokenMultimedia);
|
||||
}
|
||||
const storage = data.keepLogin ? localStorage : sessionStorage;
|
||||
storage.setItem(TOKEN, data.token);
|
||||
storage.setItem(TOKEN_MULTIMEDIA, data.tokenMultimedia);
|
||||
}
|
||||
async function destroyToken(url, storage, key) {
|
||||
if (storage.getItem(key)) {
|
||||
|
@ -71,8 +69,8 @@ export function useSession() {
|
|||
}
|
||||
|
||||
function isLoggedIn() {
|
||||
const localToken = localStorage.getItem('token');
|
||||
const sessionToken = sessionStorage.getItem('token');
|
||||
const localToken = localStorage.getItem(TOKEN);
|
||||
const sessionToken = sessionStorage.getItem(TOKEN);
|
||||
|
||||
return !!(localToken || sessionToken);
|
||||
}
|
||||
|
|
|
@ -1095,6 +1095,7 @@ item:
|
|||
list: List
|
||||
diary: Diary
|
||||
tags: Tags
|
||||
wasteBreakdown: Waste breakdown
|
||||
itemCreate: New item
|
||||
descriptor:
|
||||
item: Item
|
||||
|
@ -1123,6 +1124,13 @@ item:
|
|||
stemMultiplier: Multiplier
|
||||
producer: Producer
|
||||
landed: Landed
|
||||
create:
|
||||
name: Name
|
||||
tag: Tag
|
||||
priority: Priority
|
||||
type: Type
|
||||
intrastat: Intrastat
|
||||
origin: Origin
|
||||
components:
|
||||
topbar: {}
|
||||
userPanel:
|
||||
|
|
|
@ -1094,6 +1094,7 @@ item:
|
|||
list: Listado
|
||||
diary: Histórico
|
||||
tags: Etiquetas
|
||||
wasteBreakdown: Deglose de mermas
|
||||
itemCreate: Nuevo artículo
|
||||
descriptor:
|
||||
item: Artículo
|
||||
|
@ -1122,6 +1123,13 @@ item:
|
|||
stemMultiplier: Multiplicador
|
||||
producer: Productor
|
||||
landed: F. entrega
|
||||
create:
|
||||
name: Nombre
|
||||
tag: Etiqueta
|
||||
priority: Prioridad
|
||||
type: Tipo
|
||||
intrastat: Intrastat
|
||||
origin: Origen
|
||||
components:
|
||||
topbar: {}
|
||||
userPanel:
|
||||
|
|
|
@ -268,16 +268,11 @@ const importBuys = () => {
|
|||
|
||||
const toggleGroupingMode = async (buy, mode) => {
|
||||
try {
|
||||
const grouping = 1;
|
||||
const packing = 2;
|
||||
const groupingMode = mode === 'grouping' ? grouping : packing;
|
||||
|
||||
const newGroupingMode = buy.groupingMode === groupingMode ? 0 : groupingMode;
|
||||
|
||||
const groupingMode = mode === 'grouping' ? mode : 'packing';
|
||||
const newGroupingMode = buy.groupingMode === groupingMode ? null : groupingMode;
|
||||
const params = {
|
||||
groupingMode: newGroupingMode,
|
||||
};
|
||||
|
||||
await axios.patch(`Buys/${buy.id}`, params);
|
||||
buy.groupingMode = newGroupingMode;
|
||||
} catch (err) {
|
||||
|
@ -287,9 +282,9 @@ const toggleGroupingMode = async (buy, mode) => {
|
|||
|
||||
const lockIconType = (groupingMode, mode) => {
|
||||
if (mode === 'packing') {
|
||||
return groupingMode === 2 ? 'lock' : 'lock_open';
|
||||
return groupingMode === 'packing' ? 'lock' : 'lock_open';
|
||||
} else {
|
||||
return groupingMode === 1 ? 'lock' : 'lock_open';
|
||||
return groupingMode === 'grouping' ? 'lock' : 'lock_open';
|
||||
}
|
||||
};
|
||||
</script>
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
<template>Item basic data</template>
|
|
@ -1 +1,170 @@
|
|||
<template>Item create view</template>
|
||||
<script setup>
|
||||
import { reactive, ref, onBeforeMount } from 'vue';
|
||||
import { useI18n } from 'vue-i18n';
|
||||
import { useRouter } from 'vue-router';
|
||||
|
||||
import FetchData from 'components/FetchData.vue';
|
||||
import VnSelectFilter from 'src/components/common/VnSelectFilter.vue';
|
||||
import FormModel from 'components/FormModel.vue';
|
||||
import VnRow from 'components/ui/VnRow.vue';
|
||||
import VnInput from 'src/components/common/VnInput.vue';
|
||||
import VnSubToolbar from 'src/components/ui/VnSubToolbar.vue';
|
||||
|
||||
import axios from 'axios';
|
||||
|
||||
const { t } = useI18n();
|
||||
const router = useRouter();
|
||||
|
||||
const newItemForm = reactive({});
|
||||
|
||||
const originsOptions = ref([]);
|
||||
const tagsOptions = ref([]);
|
||||
const validPriorities = ref([]);
|
||||
const itemTypesOptions = ref([]);
|
||||
const intrastatsOptions = ref([]);
|
||||
|
||||
const fetchDefaultPriorityTag = async () => {
|
||||
const filter = {
|
||||
fields: ['defaultPriority', 'defaultTag', 'validPriorities'],
|
||||
limit: 1,
|
||||
};
|
||||
const { data } = await axios.get(`ItemConfigs`, { filter });
|
||||
if (!data) return;
|
||||
|
||||
const dataRow = data[0];
|
||||
validPriorities.value = [...dataRow.validPriorities];
|
||||
newItemForm.priority = dataRow.defaultPriority;
|
||||
newItemForm.tag = dataRow.defaultTag;
|
||||
};
|
||||
|
||||
const redirectToItemBasicData = (_, { id }) => {
|
||||
router.push({ name: 'ItemBasicData', params: { id } });
|
||||
};
|
||||
|
||||
onBeforeMount(async () => {
|
||||
await fetchDefaultPriorityTag();
|
||||
});
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<FetchData
|
||||
url="Origins"
|
||||
@on-fetch="(data) => (originsOptions = data)"
|
||||
:filter="{ order: 'name' }"
|
||||
auto-load
|
||||
/>
|
||||
<FetchData
|
||||
url="Tags"
|
||||
:filter="{ fields: ['id', 'name'], order: 'name ASC' }"
|
||||
@on-fetch="(data) => (tagsOptions = data)"
|
||||
auto-load
|
||||
/>
|
||||
<FetchData
|
||||
url="ItemTypes"
|
||||
:filter="{
|
||||
fields: ['id', 'code', 'categoryFk', 'name'],
|
||||
include: 'category',
|
||||
order: 'name ASC',
|
||||
}"
|
||||
@on-fetch="(data) => (itemTypesOptions = data)"
|
||||
auto-load
|
||||
/>
|
||||
<FetchData
|
||||
url="Intrastats"
|
||||
:filter="{ fields: ['id', 'description'], order: 'description ASC' }"
|
||||
@on-fetch="(data) => (intrastatsOptions = data)"
|
||||
auto-load
|
||||
/>
|
||||
<QPage>
|
||||
<VnSubToolbar />
|
||||
<FormModel
|
||||
url-create="Items/new"
|
||||
model="item"
|
||||
:form-initial-data="newItemForm"
|
||||
observe-form-changes
|
||||
@on-data-saved="redirectToItemBasicData"
|
||||
>
|
||||
<template #form="{ data }">
|
||||
<VnRow class="row q-gutter-md q-mb-md">
|
||||
<VnInput
|
||||
v-model="data.provisionalName"
|
||||
:label="t('item.create.name')"
|
||||
/>
|
||||
<VnSelectFilter
|
||||
:label="t('item.create.tag')"
|
||||
v-model="data.tag"
|
||||
:options="tagsOptions"
|
||||
option-value="id"
|
||||
option-label="name"
|
||||
hide-selected
|
||||
/>
|
||||
<VnSelectFilter
|
||||
:label="t('item.create.priority')"
|
||||
v-model="data.priority"
|
||||
:options="validPriorities"
|
||||
option-value="priority"
|
||||
option-label="priority"
|
||||
hide-selected
|
||||
/>
|
||||
</VnRow>
|
||||
<VnRow class="row q-gutter-md q-mb-md">
|
||||
<VnSelectFilter
|
||||
:label="t('item.create.type')"
|
||||
v-model="data.typeFk"
|
||||
:options="itemTypesOptions"
|
||||
option-label="name"
|
||||
option-value="id"
|
||||
hide-selected
|
||||
>
|
||||
<template #option="scope">
|
||||
<QItem class="column" v-bind="scope.itemProps">
|
||||
<QItemLabel class="row">
|
||||
<span style="width: 3em">
|
||||
{{ scope.opt?.code }}
|
||||
</span>
|
||||
<span>
|
||||
{{ scope.opt?.name }}
|
||||
</span>
|
||||
</QItemLabel>
|
||||
<QItemLabel v-if="scope.opt?.category" caption>
|
||||
{{ scope.opt?.category?.name }}
|
||||
</QItemLabel>
|
||||
</QItem>
|
||||
</template>
|
||||
</VnSelectFilter>
|
||||
<VnSelectFilter
|
||||
:label="t('item.create.intrastat')"
|
||||
v-model="data.intrastatFk"
|
||||
:options="intrastatsOptions"
|
||||
option-label="description"
|
||||
option-value="id"
|
||||
hide-selected
|
||||
>
|
||||
<template #option="scope">
|
||||
<QItem v-bind="scope.itemProps">
|
||||
<QItemSection>
|
||||
<QItemLabel>
|
||||
{{ scope.opt?.description }}
|
||||
</QItemLabel>
|
||||
<QItemLabel caption>
|
||||
#{{ scope.opt?.id }}
|
||||
</QItemLabel>
|
||||
</QItemSection>
|
||||
</QItem>
|
||||
</template>
|
||||
</VnSelectFilter>
|
||||
</VnRow>
|
||||
<VnRow class="row q-gutter-md q-mb-md">
|
||||
<VnSelectFilter
|
||||
:label="t('item.create.origin')"
|
||||
v-model="data.originFk"
|
||||
:options="originsOptions"
|
||||
option-value="id"
|
||||
option-label="name"
|
||||
hide-selected
|
||||
/>
|
||||
</VnRow>
|
||||
</template>
|
||||
</FormModel>
|
||||
</QPage>
|
||||
</template>
|
||||
|
|
|
@ -1,10 +1,9 @@
|
|||
<script setup>
|
||||
import { onMounted, ref, computed, onUpdated } from 'vue';
|
||||
import { ref, computed, onUpdated } from 'vue';
|
||||
import { useRoute } from 'vue-router';
|
||||
import { useI18n } from 'vue-i18n';
|
||||
import CardSummary from 'components/ui/CardSummary.vue';
|
||||
import VnLv from 'src/components/ui/VnLv.vue';
|
||||
import { getUrl } from 'src/composables/getUrl';
|
||||
import { useRole } from 'src/composables/useRole';
|
||||
import { dashIfEmpty } from 'src/filters';
|
||||
import VnUserLink from 'src/components/ui/VnUserLink.vue';
|
||||
|
@ -28,12 +27,6 @@ const entityId = computed(() => $props.id || route.params.id);
|
|||
|
||||
const summaryRef = ref();
|
||||
const supplier = ref();
|
||||
const supplierUrl = ref();
|
||||
|
||||
onMounted(async () => {
|
||||
await roleState.fetch();
|
||||
supplierUrl.value = (await getUrl('supplier/')) + entityId.value;
|
||||
});
|
||||
|
||||
async function setData(data) {
|
||||
if (data) {
|
||||
|
@ -44,6 +37,10 @@ async function setData(data) {
|
|||
const isAdministrative = computed(() => {
|
||||
return roleState.hasAny(['administrative']);
|
||||
});
|
||||
|
||||
function getUrl(section) {
|
||||
return isAdministrative.value && `#/supplier/${entityId.value}/${section}`;
|
||||
}
|
||||
</script>
|
||||
|
||||
<template>
|
||||
|
@ -58,15 +55,10 @@ const isAdministrative = computed(() => {
|
|||
|
||||
<template #body>
|
||||
<QCard class="vn-one">
|
||||
<router-link
|
||||
v-if="isAdministrative"
|
||||
class="header link"
|
||||
:to="{ name: 'SupplierBasicData', params: { id: entityId } }"
|
||||
>
|
||||
{{ t('globals.summary.basicData') }}
|
||||
<QIcon name="open_in_new" />
|
||||
</router-link>
|
||||
<span v-else> {{ t('globals.summary.basicData') }}</span>
|
||||
<VnTitle
|
||||
:url="getUrl('basic-data')"
|
||||
:text="t('globals.summary.basicData')"
|
||||
/>
|
||||
<VnLv label="Id" :value="supplier.id" />
|
||||
<VnLv label="Alias" :value="supplier.nickname" />
|
||||
<VnLv :label="t('supplier.summary.responsible')">
|
||||
|
@ -94,15 +86,10 @@ const isAdministrative = computed(() => {
|
|||
/>
|
||||
</QCard>
|
||||
<QCard class="vn-one">
|
||||
<router-link
|
||||
v-if="isAdministrative"
|
||||
class="header link"
|
||||
:to="{ name: 'SupplierBillingData', params: { id: entityId } }"
|
||||
>
|
||||
{{ t('supplier.summary.billingData') }}
|
||||
<QIcon name="open_in_new" />
|
||||
</router-link>
|
||||
<span v-else> {{ t('supplier.summary.billingData') }}</span>
|
||||
<VnTitle
|
||||
:url="getUrl('billing-data')"
|
||||
:text="t('supplier.summary.billingData')"
|
||||
/>
|
||||
<VnLv
|
||||
:label="t('supplier.summary.payMethod')"
|
||||
:value="supplier.payMethod?.name"
|
||||
|
@ -117,15 +104,10 @@ const isAdministrative = computed(() => {
|
|||
<VnLv :label="t('supplier.summary.account')" :value="supplier.account" />
|
||||
</QCard>
|
||||
<QCard class="vn-one">
|
||||
<router-link
|
||||
v-if="isAdministrative"
|
||||
class="header link"
|
||||
:to="{ name: 'SupplierFiscalData', params: { id: entityId } }"
|
||||
>
|
||||
{{ t('supplier.summary.fiscalData') }}
|
||||
<QIcon name="open_in_new" />
|
||||
</router-link>
|
||||
<span v-else> {{ t('supplier.summary.fiscalData') }}</span>
|
||||
<VnTitle
|
||||
:url="getUrl('fiscal-data')"
|
||||
:text="t('supplier.summary.fiscalData')"
|
||||
/>
|
||||
<VnLv
|
||||
:label="t('supplier.summary.sageTaxType')"
|
||||
:value="supplier.sageTaxType?.vat"
|
||||
|
@ -152,15 +134,10 @@ const isAdministrative = computed(() => {
|
|||
/>
|
||||
</QCard>
|
||||
<QCard class="vn-one">
|
||||
<router-link
|
||||
v-if="isAdministrative"
|
||||
class="header link"
|
||||
:to="{ name: 'SupplierFiscalData', params: { id: entityId } }"
|
||||
>
|
||||
{{ t('supplier.summary.fiscalAddress') }}
|
||||
<QIcon name="open_in_new" />
|
||||
</router-link>
|
||||
<span v-else> {{ t('supplier.summary.fiscalAddress') }}</span>
|
||||
<VnTitle
|
||||
:url="getUrl('fiscal-data')"
|
||||
:text="t('supplier.summary.fiscalAddress')"
|
||||
/>
|
||||
<VnLv :label="t('supplier.summary.socialName')" :value="supplier.name" />
|
||||
<VnLv :label="t('supplier.summary.taxNumber')" :value="supplier.nif" />
|
||||
<VnLv :label="t('supplier.summary.street')" :value="supplier.street" />
|
||||
|
|
|
@ -10,8 +10,8 @@ export default {
|
|||
component: RouterView,
|
||||
redirect: { name: 'ItemMain' },
|
||||
menus: {
|
||||
main: ['ItemList'],
|
||||
card: [],
|
||||
main: ['ItemList', 'WasteBreakdown'],
|
||||
card: ['ItemBasicData'],
|
||||
},
|
||||
children: [
|
||||
{
|
||||
|
@ -37,6 +37,19 @@ export default {
|
|||
},
|
||||
component: () => import('src/pages/Item/ItemCreate.vue'),
|
||||
},
|
||||
{
|
||||
path: 'waste-breakdown',
|
||||
name: 'WasteBreakdown',
|
||||
meta: {
|
||||
title: 'wasteBreakdown',
|
||||
icon: 'vn:claims',
|
||||
},
|
||||
beforeEnter: (to, from, next) => {
|
||||
next({ name: 'ItemList' });
|
||||
window.location.href =
|
||||
'https://grafana.verdnatura.es/d/TTNXQAxVk';
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
|
@ -72,6 +85,15 @@ export default {
|
|||
},
|
||||
component: () => import('src/pages/Item/Card/ItemTags.vue'),
|
||||
},
|
||||
{
|
||||
path: 'basic-data',
|
||||
name: 'ItemBasicData',
|
||||
meta: {
|
||||
title: 'basicData',
|
||||
icon: 'vn:settings',
|
||||
},
|
||||
component: () => import('src/pages/Item/Card/ItemBasicData.vue'),
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
|
|
Loading…
Reference in New Issue