forked from verdnatura/salix-front
Merge branch 'salix-dev' into feature/route-module
# Conflicts: # src/components/ui/VnPaginate.vue
This commit is contained in:
commit
d3a93da849
|
@ -1,5 +1,6 @@
|
||||||
FROM node:stretch-slim
|
FROM node:stretch-slim
|
||||||
RUN npm install -g @quasar/cli
|
RUN corepack enable pnpm
|
||||||
|
RUN pnpm install -g @quasar/cli
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
COPY dist/spa ./
|
COPY dist/spa ./
|
||||||
CMD ["quasar", "serve", "./", "--history", "--hostname", "0.0.0.0"]
|
CMD ["quasar", "serve", "./", "--history", "--hostname", "0.0.0.0"]
|
||||||
|
|
|
@ -62,7 +62,7 @@ pipeline {
|
||||||
NODE_ENV = ""
|
NODE_ENV = ""
|
||||||
}
|
}
|
||||||
steps {
|
steps {
|
||||||
sh 'npm install --prefer-offline'
|
sh 'pnpm install --prefer-offline'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
stage('Test') {
|
stage('Test') {
|
||||||
|
@ -73,7 +73,7 @@ pipeline {
|
||||||
NODE_ENV = ""
|
NODE_ENV = ""
|
||||||
}
|
}
|
||||||
steps {
|
steps {
|
||||||
sh 'npm run test:unit:ci'
|
sh 'pnpm run test:unit:ci'
|
||||||
}
|
}
|
||||||
post {
|
post {
|
||||||
always {
|
always {
|
||||||
|
|
19
package.json
19
package.json
|
@ -1,10 +1,11 @@
|
||||||
{
|
{
|
||||||
"name": "salix-front",
|
"name": "salix-front",
|
||||||
"version": "24.10.0",
|
"version": "24.12.0",
|
||||||
"description": "Salix frontend",
|
"description": "Salix frontend",
|
||||||
"productName": "Salix",
|
"productName": "Salix",
|
||||||
"author": "Verdnatura",
|
"author": "Verdnatura",
|
||||||
"private": true,
|
"private": true,
|
||||||
|
"packageManager": "pnpm@8.15.1",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"lint": "eslint --ext .js,.vue ./",
|
"lint": "eslint --ext .js,.vue ./",
|
||||||
"format": "prettier --write \"**/*.{js,vue,scss,html,md,json}\" --ignore-path .gitignore",
|
"format": "prettier --write \"**/*.{js,vue,scss,html,md,json}\" --ignore-path .gitignore",
|
||||||
|
@ -16,12 +17,12 @@
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@quasar/cli": "^2.3.0",
|
"@quasar/cli": "^2.3.0",
|
||||||
"@quasar/extras": "^1.16.4",
|
"@quasar/extras": "^1.16.9",
|
||||||
"axios": "^1.4.0",
|
"axios": "^1.4.0",
|
||||||
"chromium": "^3.0.3",
|
"chromium": "^3.0.3",
|
||||||
"croppie": "^2.6.5",
|
"croppie": "^2.6.5",
|
||||||
"pinia": "^2.1.3",
|
"pinia": "^2.1.3",
|
||||||
"quasar": "^2.12.0",
|
"quasar": "^2.14.5",
|
||||||
"validator": "^13.9.0",
|
"validator": "^13.9.0",
|
||||||
"vue": "^3.3.4",
|
"vue": "^3.3.4",
|
||||||
"vue-i18n": "^9.2.2",
|
"vue-i18n": "^9.2.2",
|
||||||
|
@ -30,11 +31,11 @@
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@intlify/unplugin-vue-i18n": "^0.8.1",
|
"@intlify/unplugin-vue-i18n": "^0.8.1",
|
||||||
"@pinia/testing": "^0.1.2",
|
"@pinia/testing": "^0.1.2",
|
||||||
"@quasar/app-vite": "^1.4.3",
|
"@quasar/app-vite": "^1.7.3",
|
||||||
"@quasar/quasar-app-extension-testing-unit-vitest": "^0.3.0",
|
"@quasar/quasar-app-extension-testing-unit-vitest": "^0.4.0",
|
||||||
"@vue/test-utils": "^2.3.2",
|
"@vue/test-utils": "^2.4.4",
|
||||||
"autoprefixer": "^10.4.14",
|
"autoprefixer": "^10.4.14",
|
||||||
"cypress": "^12.13.0",
|
"cypress": "^13.6.6",
|
||||||
"eslint": "^8.41.0",
|
"eslint": "^8.41.0",
|
||||||
"eslint-config-prettier": "^8.8.0",
|
"eslint-config-prettier": "^8.8.0",
|
||||||
"eslint-plugin-cypress": "^2.13.3",
|
"eslint-plugin-cypress": "^2.13.3",
|
||||||
|
@ -50,8 +51,8 @@
|
||||||
"bun": ">= 1.0.25"
|
"bun": ">= 1.0.25"
|
||||||
},
|
},
|
||||||
"overrides": {
|
"overrides": {
|
||||||
"@vitejs/plugin-vue": "^4.0.0",
|
"@vitejs/plugin-vue": "^5.0.4",
|
||||||
"vite": "^4.3.5",
|
"vite": "^5.1.4",
|
||||||
"vitest": "^0.31.1"
|
"vitest": "^0.31.1"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
758
pnpm-lock.yaml
758
pnpm-lock.yaml
File diff suppressed because it is too large
Load Diff
|
@ -67,7 +67,7 @@ module.exports = configure(function (/* ctx */) {
|
||||||
// analyze: true,
|
// analyze: true,
|
||||||
// env: {},
|
// env: {},
|
||||||
rawDefine: {
|
rawDefine: {
|
||||||
'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV)
|
'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV),
|
||||||
},
|
},
|
||||||
// ignorePublicFolder: true,
|
// ignorePublicFolder: true,
|
||||||
// minify: false,
|
// minify: false,
|
||||||
|
@ -92,7 +92,7 @@ module.exports = configure(function (/* ctx */) {
|
||||||
vitePlugins: [
|
vitePlugins: [
|
||||||
[
|
[
|
||||||
VueI18nPlugin({
|
VueI18nPlugin({
|
||||||
runtimeOnly: false
|
runtimeOnly: false,
|
||||||
}),
|
}),
|
||||||
{
|
{
|
||||||
// if you want to use Vue I18n Legacy API, you need to set `compositionOnly: false`
|
// if you want to use Vue I18n Legacy API, you need to set `compositionOnly: false`
|
||||||
|
@ -123,9 +123,6 @@ module.exports = configure(function (/* ctx */) {
|
||||||
framework: {
|
framework: {
|
||||||
config: {
|
config: {
|
||||||
config: {
|
config: {
|
||||||
brand: {
|
|
||||||
primary: 'orange',
|
|
||||||
},
|
|
||||||
dark: 'auto',
|
dark: 'auto',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
|
@ -81,7 +81,7 @@ onMounted(async () => {
|
||||||
});
|
});
|
||||||
|
|
||||||
// Podemos enviarle al form la estructura de data inicial sin necesidad de fetchearla
|
// Podemos enviarle al form la estructura de data inicial sin necesidad de fetchearla
|
||||||
state.set($props.model, $props.formInitialData ?? {});
|
state.set($props.model, $props.formInitialData);
|
||||||
if ($props.autoLoad && !$props.formInitialData) {
|
if ($props.autoLoad && !$props.formInitialData) {
|
||||||
await fetch();
|
await fetch();
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,34 @@
|
||||||
|
<script setup>
|
||||||
|
import { computed } from 'vue';
|
||||||
|
import { useI18n } from 'vue-i18n';
|
||||||
|
import { useCapitalize } from 'src/composables/useCapitalize';
|
||||||
|
import VnInput from 'src/components/common/VnInput.vue';
|
||||||
|
|
||||||
|
const props = defineProps({
|
||||||
|
modelValue: { type: String, default: '' },
|
||||||
|
});
|
||||||
|
|
||||||
|
const { t } = useI18n();
|
||||||
|
const emit = defineEmits(['update:modelValue']);
|
||||||
|
|
||||||
|
const amount = computed({
|
||||||
|
get() {
|
||||||
|
return props.modelValue;
|
||||||
|
},
|
||||||
|
set(val) {
|
||||||
|
emit('update:modelValue', val);
|
||||||
|
},
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
<template>
|
||||||
|
<VnInput
|
||||||
|
v-model="amount"
|
||||||
|
type="number"
|
||||||
|
step="any"
|
||||||
|
:label="useCapitalize(t('amount'))"
|
||||||
|
/>
|
||||||
|
</template>
|
||||||
|
<i18n>
|
||||||
|
es:
|
||||||
|
amount: importe
|
||||||
|
</i18n>
|
|
@ -116,7 +116,7 @@ function addDefaultData(data) {
|
||||||
<FormModelPopup
|
<FormModelPopup
|
||||||
:title="formInitialData ? t('globals.edit') : t('globals.create')"
|
:title="formInitialData ? t('globals.edit') : t('globals.create')"
|
||||||
model="dms"
|
model="dms"
|
||||||
:form-initial-data="formInitialData"
|
:form-initial-data="formInitialData ?? {}"
|
||||||
:save-fn="save"
|
:save-fn="save"
|
||||||
>
|
>
|
||||||
<template #form-inputs>
|
<template #form-inputs>
|
||||||
|
|
|
@ -1046,7 +1046,7 @@ es:
|
||||||
tooltips:
|
tooltips:
|
||||||
search: Buscar por identificador o concepto
|
search: Buscar por identificador o concepto
|
||||||
changes: Buscar por cambios. Los atributos deben buscarse por su nombre interno, para obtenerlo situar el cursor sobre el atributo.
|
changes: Buscar por cambios. Los atributos deben buscarse por su nombre interno, para obtenerlo situar el cursor sobre el atributo.
|
||||||
Audit logs: Registros de auditoría
|
Audit logs: Historial
|
||||||
Property: Propiedad
|
Property: Propiedad
|
||||||
Before: Antes
|
Before: Antes
|
||||||
After: Después
|
After: Después
|
||||||
|
|
|
@ -171,6 +171,7 @@ const emit = defineEmits(['onFetch']);
|
||||||
|
|
||||||
<style lang="scss">
|
<style lang="scss">
|
||||||
.body {
|
.body {
|
||||||
|
background-color: var(--vn-gray);
|
||||||
.text-h5 {
|
.text-h5 {
|
||||||
padding-top: 5px;
|
padding-top: 5px;
|
||||||
padding-bottom: 5px;
|
padding-bottom: 5px;
|
||||||
|
@ -188,7 +189,8 @@ const emit = defineEmits(['onFetch']);
|
||||||
.label {
|
.label {
|
||||||
color: var(--vn-label);
|
color: var(--vn-label);
|
||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
::after {
|
|
||||||
|
&:not(:has(a))::after {
|
||||||
content: ':';
|
content: ':';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -223,8 +225,6 @@ const emit = defineEmits(['onFetch']);
|
||||||
margin-bottom: 15px;
|
margin-bottom: 15px;
|
||||||
}
|
}
|
||||||
.list-box {
|
.list-box {
|
||||||
background-color: var(--vn-gray);
|
|
||||||
|
|
||||||
.q-item__label {
|
.q-item__label {
|
||||||
color: var(--vn-label);
|
color: var(--vn-label);
|
||||||
}
|
}
|
||||||
|
|
|
@ -46,7 +46,7 @@ watch(props, async () => {
|
||||||
<QCard class="cardSummary">
|
<QCard class="cardSummary">
|
||||||
<SkeletonSummary v-if="!entity" />
|
<SkeletonSummary v-if="!entity" />
|
||||||
<template v-if="entity">
|
<template v-if="entity">
|
||||||
<div class="summaryHeader bg-primary q-pa-md text-weight-bolder">
|
<div class="summaryHeader bg-primary q-pa-sm text-weight-bolder">
|
||||||
<slot name="header-left">
|
<slot name="header-left">
|
||||||
<span></span>
|
<span></span>
|
||||||
</slot>
|
</slot>
|
||||||
|
@ -85,8 +85,8 @@ watch(props, async () => {
|
||||||
flex-direction: row;
|
flex-direction: row;
|
||||||
flex-wrap: wrap;
|
flex-wrap: wrap;
|
||||||
justify-content: space-evenly;
|
justify-content: space-evenly;
|
||||||
gap: 15px;
|
gap: 10px;
|
||||||
padding: 15px;
|
padding: 10px;
|
||||||
background-color: var(--vn-gray);
|
background-color: var(--vn-gray);
|
||||||
|
|
||||||
> .q-card.vn-one {
|
> .q-card.vn-one {
|
||||||
|
@ -105,14 +105,14 @@ watch(props, async () => {
|
||||||
> .q-card {
|
> .q-card {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
background-color: var(--vn-gray);
|
background-color: var(--vn-gray);
|
||||||
padding: 15px;
|
padding: 7px;
|
||||||
font-size: 16px;
|
font-size: 16px;
|
||||||
min-width: 275px;
|
min-width: 275px;
|
||||||
|
|
||||||
.vn-label-value {
|
.vn-label-value {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: row;
|
flex-direction: row;
|
||||||
margin-top: 5px;
|
margin-top: 2px;
|
||||||
.label {
|
.label {
|
||||||
color: var(--vn-label);
|
color: var(--vn-label);
|
||||||
width: 8em;
|
width: 8em;
|
||||||
|
@ -131,13 +131,27 @@ watch(props, async () => {
|
||||||
.header {
|
.header {
|
||||||
color: $primary;
|
color: $primary;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
margin-bottom: 25px;
|
margin-bottom: 10px;
|
||||||
font-size: 20px;
|
font-size: 20px;
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
}
|
}
|
||||||
.header.link:hover {
|
.header.link:hover {
|
||||||
color: lighten($primary, 20%);
|
color: lighten($primary, 20%);
|
||||||
}
|
}
|
||||||
|
.q-checkbox {
|
||||||
|
display: flex;
|
||||||
|
margin-bottom: 9px;
|
||||||
|
& .q-checkbox__label {
|
||||||
|
margin-left: 25px;
|
||||||
|
color: var(--vn-text);
|
||||||
|
}
|
||||||
|
& .q-checkbox__inner {
|
||||||
|
position: absolute;
|
||||||
|
left: 0;
|
||||||
|
margin-left: 5px;
|
||||||
|
color: var(--vn-label);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -13,12 +13,49 @@ defineProps({
|
||||||
<template>
|
<template>
|
||||||
<div class="fetchedTags">
|
<div class="fetchedTags">
|
||||||
<div class="wrap">
|
<div class="wrap">
|
||||||
<div class="inline-tag" :class="{ empty: !$props.item.value5 }">{{ $props.item.value5 }}</div>
|
<div
|
||||||
<div class="inline-tag" :class="{ empty: !$props.item.value6 }">{{ $props.item.value6 }}</div>
|
class="inline-tag"
|
||||||
<div class="inline-tag" :class="{ empty: !$props.item.value7 }">{{ $props.item.value7 }}</div>
|
:class="{ empty: !$props.item.value5 }"
|
||||||
<div class="inline-tag" :class="{ empty: !$props.item.value8 }">{{ $props.item.value8 }}</div>
|
:title="$props.item.tag5 + ': ' + $props.item.value5"
|
||||||
<div class="inline-tag" :class="{ empty: !$props.item.value9 }">{{ $props.item.value9 }}</div>
|
>
|
||||||
<div class="inline-tag" :class="{ empty: !$props.item.value10 }">{{ $props.item.value10 }}</div>
|
{{ $props.item.value5 }}
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
class="inline-tag"
|
||||||
|
:class="{ empty: !$props.item.tag6 }"
|
||||||
|
:title="$props.item.tag6 + ': ' + $props.item.value6"
|
||||||
|
>
|
||||||
|
{{ $props.item.value6 }}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div
|
||||||
|
class="inline-tag"
|
||||||
|
:class="{ empty: !$props.item.value7 }"
|
||||||
|
:title="$props.item.tag7 + ': ' + $props.item.value7"
|
||||||
|
>
|
||||||
|
{{ $props.item.value7 }}
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
class="inline-tag"
|
||||||
|
:class="{ empty: !$props.item.value8 }"
|
||||||
|
:title="$props.item.tag8 + ': ' + $props.item.value8"
|
||||||
|
>
|
||||||
|
{{ $props.item.value8 }}
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
class="inline-tag"
|
||||||
|
:class="{ empty: !$props.item.value9 }"
|
||||||
|
:title="$props.item.tag9 + ': ' + $props.item.value9"
|
||||||
|
>
|
||||||
|
{{ $props.item.value9 }}
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
class="inline-tag"
|
||||||
|
:class="{ empty: !$props.item.value10 }"
|
||||||
|
:title="$props.item.tag10 + ': ' + $props.item.value10"
|
||||||
|
>
|
||||||
|
{{ $props.item.value10 }}
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
<script setup>
|
<script setup>
|
||||||
import { computed } from 'vue';
|
|
||||||
import { dashIfEmpty } from 'src/filters';
|
import { dashIfEmpty } from 'src/filters';
|
||||||
import { useI18n } from 'vue-i18n';
|
import { useI18n } from 'vue-i18n';
|
||||||
import { useClipboard } from 'src/composables/useClipboard';
|
import { useClipboard } from 'src/composables/useClipboard';
|
||||||
|
@ -16,7 +15,6 @@ const $props = defineProps({
|
||||||
});
|
});
|
||||||
|
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
const isBooleanValue = computed(() => typeof $props.value === 'boolean');
|
|
||||||
const { copyText } = useClipboard();
|
const { copyText } = useClipboard();
|
||||||
|
|
||||||
function copyValueText() {
|
function copyValueText() {
|
||||||
|
@ -42,14 +40,7 @@ function copyValueText() {
|
||||||
</slot>
|
</slot>
|
||||||
</div>
|
</div>
|
||||||
<div class="value">
|
<div class="value">
|
||||||
<span v-if="isBooleanValue">
|
<slot name="value">
|
||||||
<QIcon
|
|
||||||
:name="$props.value ? `check` : `close`"
|
|
||||||
:color="$props.value ? `positive` : `negative`"
|
|
||||||
size="sm"
|
|
||||||
/>
|
|
||||||
</span>
|
|
||||||
<slot v-else name="value">
|
|
||||||
<span :title="$props.value">
|
<span :title="$props.value">
|
||||||
{{ $props.dash ? dashIfEmpty($props.value) : $props.value }}
|
{{ $props.dash ? dashIfEmpty($props.value) : $props.value }}
|
||||||
</span>
|
</span>
|
||||||
|
|
|
@ -8,7 +8,6 @@ import VnPaginate from './VnPaginate.vue';
|
||||||
import VnUserLink from '../ui/VnUserLink.vue';
|
import VnUserLink from '../ui/VnUserLink.vue';
|
||||||
|
|
||||||
const $props = defineProps({
|
const $props = defineProps({
|
||||||
id: { type: String, required: true },
|
|
||||||
url: { type: String, default: null },
|
url: { type: String, default: null },
|
||||||
filter: { type: Object, default: () => {} },
|
filter: { type: Object, default: () => {} },
|
||||||
body: { type: Object, default: () => {} },
|
body: { type: Object, default: () => {} },
|
||||||
|
@ -28,7 +27,7 @@ async function insert() {
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
<template>
|
<template>
|
||||||
<div class="column items-center full-height">
|
<div class="column items-center full-height full-width">
|
||||||
<VnPaginate
|
<VnPaginate
|
||||||
:data-key="$props.url"
|
:data-key="$props.url"
|
||||||
:url="$props.url"
|
:url="$props.url"
|
||||||
|
@ -39,12 +38,21 @@ async function insert() {
|
||||||
ref="vnPaginateRef"
|
ref="vnPaginateRef"
|
||||||
>
|
>
|
||||||
<template #body="{ rows }">
|
<template #body="{ rows }">
|
||||||
<QCard class="q-pa-xs q-mb-md" v-for="(note, index) in rows" :key="index">
|
<div class="column items-center full-width">
|
||||||
|
<QCard
|
||||||
|
class="q-pa-xs q-mb-sm full-width"
|
||||||
|
v-for="(note, index) in rows"
|
||||||
|
:key="index"
|
||||||
|
>
|
||||||
<QCardSection horizontal>
|
<QCardSection horizontal>
|
||||||
<slot name="picture">
|
<slot name="picture">
|
||||||
<VnAvatar :descriptor="false" :worker-id="note.workerFk" />
|
<VnAvatar
|
||||||
|
:descriptor="false"
|
||||||
|
:worker-id="note.workerFk"
|
||||||
|
size="md"
|
||||||
|
/>
|
||||||
</slot>
|
</slot>
|
||||||
<QItem class="full-width justify-between items-start">
|
<div class="full-width row justify-between q-pa-xs">
|
||||||
<VnUserLink
|
<VnUserLink
|
||||||
:name="`${note.worker.user.nickname}`"
|
:name="`${note.worker.user.nickname}`"
|
||||||
:worker-id="note.worker.id"
|
:worker-id="note.worker.id"
|
||||||
|
@ -53,14 +61,15 @@ async function insert() {
|
||||||
<slot name="actions">
|
<slot name="actions">
|
||||||
{{ toDateHour(note.created) }}
|
{{ toDateHour(note.created) }}
|
||||||
</slot>
|
</slot>
|
||||||
</QItem>
|
</div>
|
||||||
</QCardSection>
|
</QCardSection>
|
||||||
<QCardSection class="q-pa-sm">
|
<QCardSection class="q-pa-xs q-my-none q-py-none">
|
||||||
<slot name="text">
|
<slot name="text">
|
||||||
{{ note.text }}
|
{{ note.text }}
|
||||||
</slot>
|
</slot>
|
||||||
</QCardSection>
|
</QCardSection>
|
||||||
</QCard>
|
</QCard>
|
||||||
|
</div>
|
||||||
</template>
|
</template>
|
||||||
</VnPaginate>
|
</VnPaginate>
|
||||||
<QPageSticky position="bottom-right" :offset="[25, 25]" v-if="addNote">
|
<QPageSticky position="bottom-right" :offset="[25, 25]" v-if="addNote">
|
||||||
|
@ -108,8 +117,10 @@ async function insert() {
|
||||||
</template>
|
</template>
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
.q-card {
|
.q-card {
|
||||||
max-width: 80em;
|
width: 90%;
|
||||||
|
@media (max-width: $breakpoint-sm) {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
&__section {
|
&__section {
|
||||||
word-wrap: break-word;
|
word-wrap: break-word;
|
||||||
}
|
}
|
||||||
|
|
|
@ -143,7 +143,7 @@ async function onLoad(index, done) {
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<div>
|
<div class="full-width">
|
||||||
<div
|
<div
|
||||||
v-if="!props.autoLoad && !store.data && !isLoading"
|
v-if="!props.autoLoad && !store.data && !isLoading"
|
||||||
class="info-row q-pa-md text-center"
|
class="info-row q-pa-md text-center"
|
||||||
|
@ -181,6 +181,7 @@ async function onLoad(index, done) {
|
||||||
:offset="offset"
|
:offset="offset"
|
||||||
:disable="disableInfiniteScroll || !arrayData.hasMoreData.value"
|
:disable="disableInfiniteScroll || !arrayData.hasMoreData.value"
|
||||||
class="full-width"
|
class="full-width"
|
||||||
|
v-bind="$attrs"
|
||||||
>
|
>
|
||||||
<slot name="body" :rows="store.data"></slot>
|
<slot name="body" :rows="store.data"></slot>
|
||||||
<div v-if="isLoading" class="info-row q-pa-md text-center">
|
<div v-if="isLoading" class="info-row q-pa-md text-center">
|
||||||
|
|
|
@ -1,16 +1,18 @@
|
||||||
<template>
|
<template>
|
||||||
<div id="row" class="q-gutter-md">
|
<div id="row" class="q-gutter-md q-mb-md">
|
||||||
<slot></slot>
|
<slot></slot>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<style lang="scss" scopped>
|
<style lang="scss" scopped>
|
||||||
#row {
|
#row {
|
||||||
display: grid;
|
display: flex;
|
||||||
grid-template-columns: 1fr 1fr;
|
> * {
|
||||||
|
flex: 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@media screen and (max-width: 800px) {
|
@media screen and (max-width: 800px) {
|
||||||
#row {
|
#row {
|
||||||
grid-template-columns: 1fr;
|
flex-direction: column;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
|
@ -81,8 +81,9 @@ onMounted(() => {
|
||||||
});
|
});
|
||||||
|
|
||||||
async function search() {
|
async function search() {
|
||||||
const staticParams = Object.entries(store.userParams)
|
const staticParams = Object.entries(store.userParams).filter(
|
||||||
.filter(([key, value]) => value && (props.staticParams || []).includes(key));
|
([key, value]) => value && (props.staticParams || []).includes(key)
|
||||||
|
);
|
||||||
await arrayData.applyFilter({
|
await arrayData.applyFilter({
|
||||||
params: {
|
params: {
|
||||||
...Object.fromEntries(staticParams),
|
...Object.fromEntries(staticParams),
|
||||||
|
@ -155,11 +156,9 @@ async function search() {
|
||||||
.cursor-info {
|
.cursor-info {
|
||||||
cursor: help;
|
cursor: help;
|
||||||
}
|
}
|
||||||
|
#searchbar {
|
||||||
.body--light #searchbar {
|
|
||||||
.q-field--standout.q-field--highlighted .q-field__control {
|
.q-field--standout.q-field--highlighted .q-field__control {
|
||||||
background-color: $grey-7;
|
background-color: var(--vn-text);
|
||||||
color: #333;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
|
@ -0,0 +1,7 @@
|
||||||
|
import { useQuasar } from 'quasar';
|
||||||
|
|
||||||
|
export default function() {
|
||||||
|
const quasar = useQuasar();
|
||||||
|
return quasar.screen.gt.xs ? 'q-pa-md': 'q-pa-xs';
|
||||||
|
|
||||||
|
}
|
|
@ -1,17 +1,59 @@
|
||||||
// app global css in SCSS form
|
// app global css in SCSS form
|
||||||
@import './icons.scss';
|
@import './icons.scss';
|
||||||
|
|
||||||
|
body.body--light {
|
||||||
|
--fount-color: black;
|
||||||
|
--vn-sectionColor: #ffffff;
|
||||||
|
--vn-pageColor: #e0e0e0;
|
||||||
|
background-color: var(--vn-pageColor);
|
||||||
|
.q-header .q-toolbar {
|
||||||
|
color: var(--fount-color);
|
||||||
|
}
|
||||||
|
--vn-text: var(--fount-color);
|
||||||
|
--vn-gray: var(--vn-sectionColor);
|
||||||
|
--vn-label: #5f5f5f;
|
||||||
|
--vn-dark: var(--vn-sectionColor);
|
||||||
|
--vn-light-gray: #e7e3e3;
|
||||||
|
}
|
||||||
|
|
||||||
|
body.body--dark {
|
||||||
|
--vn-pageColor: #222;
|
||||||
|
--vn-SectionColor: #3c3b3b;
|
||||||
|
background-color: var(--vn-pageColor);
|
||||||
|
--vn-text: white;
|
||||||
|
--vn-gray: var(--vn-SectionColor);
|
||||||
|
--vn-label: #a8a8a8;
|
||||||
|
--vn-dark: var(--vn-SectionColor);
|
||||||
|
--vn-light-gray: #424242;
|
||||||
|
}
|
||||||
|
|
||||||
a {
|
a {
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
.link {
|
.link {
|
||||||
color: $primary;
|
color: $color-link;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.tx-color-link {
|
||||||
|
color: $color-link !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.header-link {
|
||||||
|
color: $color-link !important;
|
||||||
|
cursor: pointer;
|
||||||
|
border-bottom: solid $primary;
|
||||||
|
border-width: 2px;
|
||||||
|
width: 100%;
|
||||||
|
.q-icon {
|
||||||
|
float: right;
|
||||||
|
}
|
||||||
|
text-transform: uppercase;
|
||||||
|
}
|
||||||
|
|
||||||
.link:hover {
|
.link:hover {
|
||||||
color: $orange-4;
|
text-decoration: underline;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Removes chrome autofill background
|
// Removes chrome autofill background
|
||||||
|
@ -24,26 +66,6 @@ select:-webkit-autofill {
|
||||||
background-clip: text !important;
|
background-clip: text !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
body.body--light {
|
|
||||||
.q-header .q-toolbar {
|
|
||||||
background-color: $white;
|
|
||||||
color: #555;
|
|
||||||
}
|
|
||||||
--vn-text: #000000;
|
|
||||||
--vn-gray: #f5f5f5;
|
|
||||||
--vn-label: #5f5f5f;
|
|
||||||
--vn-dark: white;
|
|
||||||
--vn-light-gray: #e7e3e3;
|
|
||||||
}
|
|
||||||
|
|
||||||
body.body--dark {
|
|
||||||
--vn-text: #ffffff;
|
|
||||||
--vn-gray: #313131;
|
|
||||||
--vn-label: #a8a8a8;
|
|
||||||
--vn-dark: #292929;
|
|
||||||
--vn-light-gray: #424242;
|
|
||||||
}
|
|
||||||
|
|
||||||
.bg-vn-dark {
|
.bg-vn-dark {
|
||||||
background-color: var(--vn-dark);
|
background-color: var(--vn-dark);
|
||||||
}
|
}
|
||||||
|
|
Binary file not shown.
File diff suppressed because one or more lines are too long
Before Width: | Height: | Size: 162 KiB After Width: | Height: | Size: 173 KiB |
Binary file not shown.
Binary file not shown.
File diff suppressed because one or more lines are too long
|
@ -1,10 +1,10 @@
|
||||||
@font-face {
|
@font-face {
|
||||||
font-family: 'icon';
|
font-family: 'icon';
|
||||||
src: url('fonts/icon.eot?7zbcv0');
|
src: url('fonts/icon.eot?2omjsr');
|
||||||
src: url('fonts/icon.eot?7zbcv0#iefix') format('embedded-opentype'),
|
src: url('fonts/icon.eot?2omjsr#iefix') format('embedded-opentype'),
|
||||||
url('fonts/icon.ttf?7zbcv0') format('truetype'),
|
url('fonts/icon.ttf?2omjsr') format('truetype'),
|
||||||
url('fonts/icon.woff?7zbcv0') format('woff'),
|
url('fonts/icon.woff?2omjsr') format('woff'),
|
||||||
url('fonts/icon.svg?7zbcv0#icon') format('svg');
|
url('fonts/icon.svg?2omjsr#icon') format('svg');
|
||||||
font-weight: normal;
|
font-weight: normal;
|
||||||
font-style: normal;
|
font-style: normal;
|
||||||
font-display: block;
|
font-display: block;
|
||||||
|
@ -28,6 +28,9 @@
|
||||||
.icon-100:before {
|
.icon-100:before {
|
||||||
content: "\e926";
|
content: "\e926";
|
||||||
}
|
}
|
||||||
|
.icon-Client_unpaid:before {
|
||||||
|
content: "\e925";
|
||||||
|
}
|
||||||
.icon-History:before {
|
.icon-History:before {
|
||||||
content: "\e964";
|
content: "\e964";
|
||||||
}
|
}
|
||||||
|
@ -46,9 +49,15 @@
|
||||||
.icon-addperson:before {
|
.icon-addperson:before {
|
||||||
content: "\e929";
|
content: "\e929";
|
||||||
}
|
}
|
||||||
|
.icon-agency:before {
|
||||||
|
content: "\e92a";
|
||||||
|
}
|
||||||
.icon-agency-term:before {
|
.icon-agency-term:before {
|
||||||
content: "\e92b";
|
content: "\e92b";
|
||||||
}
|
}
|
||||||
|
.icon-albaran:before {
|
||||||
|
content: "\e92c";
|
||||||
|
}
|
||||||
.icon-anonymous:before {
|
.icon-anonymous:before {
|
||||||
content: "\e92d";
|
content: "\e92d";
|
||||||
}
|
}
|
||||||
|
@ -172,6 +181,9 @@
|
||||||
.icon-funeral:before {
|
.icon-funeral:before {
|
||||||
content: "\e95f";
|
content: "\e95f";
|
||||||
}
|
}
|
||||||
|
.icon-grafana:before {
|
||||||
|
content: "\e931";
|
||||||
|
}
|
||||||
.icon-greenery:before {
|
.icon-greenery:before {
|
||||||
content: "\e91e";
|
content: "\e91e";
|
||||||
}
|
}
|
||||||
|
@ -355,6 +367,9 @@
|
||||||
.icon-traceability:before {
|
.icon-traceability:before {
|
||||||
content: "\e919";
|
content: "\e919";
|
||||||
}
|
}
|
||||||
|
.icon-transaction:before {
|
||||||
|
content: "\e93b";
|
||||||
|
}
|
||||||
.icon-treatments:before {
|
.icon-treatments:before {
|
||||||
content: "\e91c";
|
content: "\e91c";
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,26 +11,32 @@
|
||||||
// It's highly recommended to change the default colors
|
// It's highly recommended to change the default colors
|
||||||
// to match your app's branding.
|
// to match your app's branding.
|
||||||
// Tip: Use the "Theme Builder" on Quasar's documentation website.
|
// Tip: Use the "Theme Builder" on Quasar's documentation website.
|
||||||
|
// Tip: to add new colors https://quasar.dev/style/color-palette/#adding-your-own-colors
|
||||||
$primary: #ec8916;
|
$primary: #ec8916;
|
||||||
$primary-light: lighten($primary, 35%);
|
$secondary: $primary;
|
||||||
$secondary: #26a69a;
|
|
||||||
$accent: #9c27b0;
|
|
||||||
$white: #fff;
|
|
||||||
|
|
||||||
$positive: #21ba45;
|
$positive: #21ba45;
|
||||||
$negative: #c10015;
|
$negative: #c10015;
|
||||||
$info: #31ccec;
|
$info: #31ccec;
|
||||||
$warning: #f2c037;
|
$warning: #f2c037;
|
||||||
$vnColor: #8ebb27;
|
|
||||||
|
|
||||||
// Pendiente de cuadrar con la base de datos
|
// Pendiente de cuadrar con la base de datos
|
||||||
$success: $positive;
|
$success: $positive;
|
||||||
$alert: $negative;
|
$alert: $negative;
|
||||||
|
$white: #fff;
|
||||||
|
$dark: #3c3b3b;
|
||||||
|
// custom
|
||||||
|
$color-link: #66bfff;
|
||||||
|
$color-spacer-light: #a3a3a31f;
|
||||||
|
$color-spacer: #7979794d;
|
||||||
|
$border-thin-light: 1px solid $color-spacer-light;
|
||||||
|
$primary-light: lighten($primary, 35%);
|
||||||
|
$dark-shadow-color: black;
|
||||||
|
$layout-shadow-dark: 0 0 10px 2px #00000033, 0 0px 10px #0000003d;
|
||||||
|
$spacing-md: 16px;
|
||||||
|
|
||||||
.bg-success {
|
.bg-success {
|
||||||
background-color: $positive;
|
background-color: $positive;
|
||||||
}
|
}
|
||||||
|
|
||||||
.bg-notice {
|
.bg-notice {
|
||||||
background-color: $info;
|
background-color: $info;
|
||||||
}
|
}
|
||||||
|
@ -40,12 +46,3 @@ $alert: $negative;
|
||||||
.bg-alert {
|
.bg-alert {
|
||||||
background-color: $negative;
|
background-color: $negative;
|
||||||
}
|
}
|
||||||
|
|
||||||
$color-spacer-light: rgba(255, 255, 255, 0.12);
|
|
||||||
$color-spacer: rgba(255, 255, 255, 0.3);
|
|
||||||
$border-thin-light: 1px solid $color-spacer-light;
|
|
||||||
|
|
||||||
$dark-shadow-color: #000;
|
|
||||||
$dark: #292929;
|
|
||||||
$layout-shadow-dark: 0 0 10px 2px rgba(0, 0, 0, 0.2), 0 0px 10px rgba(0, 0, 0, 0.24);
|
|
||||||
$spacing-md: 16px;
|
|
||||||
|
|
|
@ -83,6 +83,7 @@ export default {
|
||||||
file: 'File',
|
file: 'File',
|
||||||
selectFile: 'Select a file',
|
selectFile: 'Select a file',
|
||||||
copyClipboard: 'Copy on clipboard',
|
copyClipboard: 'Copy on clipboard',
|
||||||
|
salesPerson: 'SalesPerson',
|
||||||
},
|
},
|
||||||
errors: {
|
errors: {
|
||||||
statusUnauthorized: 'Access denied',
|
statusUnauthorized: 'Access denied',
|
||||||
|
@ -173,6 +174,7 @@ export default {
|
||||||
hasDebt: 'Customer has debt',
|
hasDebt: 'Customer has debt',
|
||||||
notChecked: 'Customer not checked',
|
notChecked: 'Customer not checked',
|
||||||
noWebAccess: 'Web access is disabled',
|
noWebAccess: 'Web access is disabled',
|
||||||
|
businessTypeFk: 'Business type',
|
||||||
},
|
},
|
||||||
summary: {
|
summary: {
|
||||||
basicData: 'Basic data',
|
basicData: 'Basic data',
|
||||||
|
@ -438,6 +440,7 @@ export default {
|
||||||
shipped: 'Shipped',
|
shipped: 'Shipped',
|
||||||
warehouse: 'Warehouse',
|
warehouse: 'Warehouse',
|
||||||
customerCard: 'Customer card',
|
customerCard: 'Customer card',
|
||||||
|
alias: 'Alias',
|
||||||
},
|
},
|
||||||
boxing: {
|
boxing: {
|
||||||
expedition: 'Expedition',
|
expedition: 'Expedition',
|
||||||
|
@ -528,6 +531,8 @@ export default {
|
||||||
ticketId: 'Ticket ID',
|
ticketId: 'Ticket ID',
|
||||||
customerSummary: 'Customer summary',
|
customerSummary: 'Customer summary',
|
||||||
claimedTicket: 'Claimed ticket',
|
claimedTicket: 'Claimed ticket',
|
||||||
|
saleTracking: 'Sale tracking',
|
||||||
|
ticketTracking: 'Ticket tracking',
|
||||||
commercial: 'Commercial',
|
commercial: 'Commercial',
|
||||||
province: 'Province',
|
province: 'Province',
|
||||||
zone: 'Zone',
|
zone: 'Zone',
|
||||||
|
|
|
@ -83,6 +83,7 @@ export default {
|
||||||
file: 'Fichero',
|
file: 'Fichero',
|
||||||
selectFile: 'Seleccione un fichero',
|
selectFile: 'Seleccione un fichero',
|
||||||
copyClipboard: 'Copiar en portapapeles',
|
copyClipboard: 'Copiar en portapapeles',
|
||||||
|
salesPerson: 'Comercial',
|
||||||
},
|
},
|
||||||
errors: {
|
errors: {
|
||||||
statusUnauthorized: 'Acceso denegado',
|
statusUnauthorized: 'Acceso denegado',
|
||||||
|
@ -172,6 +173,7 @@ export default {
|
||||||
hasDebt: 'El cliente tiene riesgo',
|
hasDebt: 'El cliente tiene riesgo',
|
||||||
notChecked: 'El cliente no está comprobado',
|
notChecked: 'El cliente no está comprobado',
|
||||||
noWebAccess: 'El acceso web está desactivado',
|
noWebAccess: 'El acceso web está desactivado',
|
||||||
|
businessTypeFk: 'Tipo de negocio',
|
||||||
},
|
},
|
||||||
summary: {
|
summary: {
|
||||||
basicData: 'Datos básicos',
|
basicData: 'Datos básicos',
|
||||||
|
@ -437,6 +439,7 @@ export default {
|
||||||
shipped: 'Enviado',
|
shipped: 'Enviado',
|
||||||
warehouse: 'Almacén',
|
warehouse: 'Almacén',
|
||||||
customerCard: 'Ficha del cliente',
|
customerCard: 'Ficha del cliente',
|
||||||
|
alias: 'Alias',
|
||||||
},
|
},
|
||||||
boxing: {
|
boxing: {
|
||||||
expedition: 'Expedición',
|
expedition: 'Expedición',
|
||||||
|
@ -501,7 +504,7 @@ export default {
|
||||||
rma: 'RMA',
|
rma: 'RMA',
|
||||||
development: 'Trazabilidad',
|
development: 'Trazabilidad',
|
||||||
photos: 'Fotos',
|
photos: 'Fotos',
|
||||||
log: 'Registros de auditoría',
|
log: 'Historial',
|
||||||
notes: 'Notas',
|
notes: 'Notas',
|
||||||
action: 'Acción',
|
action: 'Acción',
|
||||||
},
|
},
|
||||||
|
@ -527,6 +530,8 @@ export default {
|
||||||
ticketId: 'ID ticket',
|
ticketId: 'ID ticket',
|
||||||
customerSummary: 'Resumen del cliente',
|
customerSummary: 'Resumen del cliente',
|
||||||
claimedTicket: 'Ticket reclamado',
|
claimedTicket: 'Ticket reclamado',
|
||||||
|
saleTracking: 'Líneas preparadas',
|
||||||
|
ticketTracking: 'Estados del ticket',
|
||||||
commercial: 'Comercial',
|
commercial: 'Comercial',
|
||||||
province: 'Provincia',
|
province: 'Provincia',
|
||||||
zone: 'Zona',
|
zone: 'Zona',
|
||||||
|
@ -724,7 +729,7 @@ export default {
|
||||||
create: 'Crear',
|
create: 'Crear',
|
||||||
summary: 'Resumen',
|
summary: 'Resumen',
|
||||||
basicData: 'Datos básicos',
|
basicData: 'Datos básicos',
|
||||||
log: 'Registros de auditoría',
|
log: 'Historial',
|
||||||
},
|
},
|
||||||
list: {
|
list: {
|
||||||
parking: 'Parking',
|
parking: 'Parking',
|
||||||
|
@ -756,7 +761,7 @@ export default {
|
||||||
dueDay: 'Vencimiento',
|
dueDay: 'Vencimiento',
|
||||||
intrastat: 'Intrastat',
|
intrastat: 'Intrastat',
|
||||||
corrective: 'Rectificativa',
|
corrective: 'Rectificativa',
|
||||||
log: 'Registros de auditoría',
|
log: 'Historial',
|
||||||
},
|
},
|
||||||
list: {
|
list: {
|
||||||
ref: 'Referencia',
|
ref: 'Referencia',
|
||||||
|
|
|
@ -40,7 +40,7 @@ const langs = ['en', 'es'];
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<QLayout view="hHh LpR fFf">
|
<QLayout view="hHh LpR fFf">
|
||||||
<QHeader reveal class="bg-dark">
|
<QHeader reveal class="bg-vn-dark">
|
||||||
<QToolbar class="justify-end">
|
<QToolbar class="justify-end">
|
||||||
<QBtn
|
<QBtn
|
||||||
id="switchLanguage"
|
id="switchLanguage"
|
||||||
|
|
|
@ -5,6 +5,7 @@ import { useStateStore } from 'stores/useStateStore';
|
||||||
import { useI18n } from 'vue-i18n';
|
import { useI18n } from 'vue-i18n';
|
||||||
import ClaimDescriptor from './ClaimDescriptor.vue';
|
import ClaimDescriptor from './ClaimDescriptor.vue';
|
||||||
import VnSubToolbar from 'src/components/ui/VnSubToolbar.vue';
|
import VnSubToolbar from 'src/components/ui/VnSubToolbar.vue';
|
||||||
|
import useCardSize from 'src/composables/useCardSize';
|
||||||
|
|
||||||
const stateStore = useStateStore();
|
const stateStore = useStateStore();
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
|
@ -28,7 +29,9 @@ const { t } = useI18n();
|
||||||
<QPageContainer>
|
<QPageContainer>
|
||||||
<QPage>
|
<QPage>
|
||||||
<VnSubToolbar />
|
<VnSubToolbar />
|
||||||
<div class="q-pa-md"><RouterView></RouterView></div>
|
<div :class="useCardSize()">
|
||||||
|
<RouterView></RouterView>
|
||||||
|
</div>
|
||||||
</QPage>
|
</QPage>
|
||||||
</QPageContainer>
|
</QPageContainer>
|
||||||
</template>
|
</template>
|
||||||
|
|
|
@ -105,7 +105,6 @@ onMounted(async () => {
|
||||||
<ClaimDescriptorMenu :claim="entity" />
|
<ClaimDescriptorMenu :claim="entity" />
|
||||||
</template>
|
</template>
|
||||||
<template #body="{ entity }">
|
<template #body="{ entity }">
|
||||||
<VnLv :label="t('claim.card.created')" :value="toDate(entity.created)" />
|
|
||||||
<VnLv v-if="entity.claimState" :label="t('claim.card.state')">
|
<VnLv v-if="entity.claimState" :label="t('claim.card.state')">
|
||||||
<template #value>
|
<template #value>
|
||||||
<QBadge :color="stateColor(entity.claimState.code)" dense>
|
<QBadge :color="stateColor(entity.claimState.code)" dense>
|
||||||
|
@ -113,13 +112,13 @@ onMounted(async () => {
|
||||||
</QBadge>
|
</QBadge>
|
||||||
</template>
|
</template>
|
||||||
</VnLv>
|
</VnLv>
|
||||||
<VnLv :label="t('claim.card.ticketId')">
|
<VnLv :label="t('claim.card.created')" :value="toDate(entity.created)" />
|
||||||
|
<VnLv :label="t('claim.card.commercial')">
|
||||||
<template #value>
|
<template #value>
|
||||||
<span class="link">
|
<VnUserLink
|
||||||
{{ entity.ticketFk }}
|
:name="entity.client?.salesPersonUser?.name"
|
||||||
|
:worker-id="entity.client?.salesPersonFk"
|
||||||
<TicketDescriptorProxy :id="entity.ticketFk" />
|
/>
|
||||||
</span>
|
|
||||||
</template>
|
</template>
|
||||||
</VnLv>
|
</VnLv>
|
||||||
<VnLv
|
<VnLv
|
||||||
|
@ -134,19 +133,20 @@ onMounted(async () => {
|
||||||
/>
|
/>
|
||||||
</template>
|
</template>
|
||||||
</VnLv>
|
</VnLv>
|
||||||
<VnLv :label="t('claim.card.commercial')">
|
<VnLv :label="t('claim.card.zone')" :value="entity.ticket?.zone?.name" />
|
||||||
<template #value>
|
|
||||||
<VnUserLink
|
|
||||||
:name="entity.client?.salesPersonUser?.name"
|
|
||||||
:worker-id="entity.client?.salesPersonFk"
|
|
||||||
/>
|
|
||||||
</template>
|
|
||||||
</VnLv>
|
|
||||||
<VnLv
|
<VnLv
|
||||||
:label="t('claim.card.province')"
|
:label="t('claim.card.province')"
|
||||||
:value="entity.ticket?.address?.province?.name"
|
:value="entity.ticket?.address?.province?.name"
|
||||||
/>
|
/>
|
||||||
<VnLv :label="t('claim.card.zone')" :value="entity.ticket?.zone?.name" />
|
<VnLv :label="t('claim.card.ticketId')">
|
||||||
|
<template #value>
|
||||||
|
<span class="link">
|
||||||
|
{{ entity.ticketFk }}
|
||||||
|
|
||||||
|
<TicketDescriptorProxy :id="entity.ticketFk" />
|
||||||
|
</span>
|
||||||
|
</template>
|
||||||
|
</VnLv>
|
||||||
<VnLv
|
<VnLv
|
||||||
:label="t('claimRate')"
|
:label="t('claimRate')"
|
||||||
:value="toPercentage(entity.client?.claimsRatio?.claimingRate)"
|
:value="toPercentage(entity.client?.claimsRatio?.claimingRate)"
|
||||||
|
@ -176,6 +176,7 @@ onMounted(async () => {
|
||||||
color="primary"
|
color="primary"
|
||||||
:href="salixUrl + 'ticket/' + entity.ticketFk + '/sale-tracking'"
|
:href="salixUrl + 'ticket/' + entity.ticketFk + '/sale-tracking'"
|
||||||
>
|
>
|
||||||
|
<QTooltip>{{ t('claim.card.saleTracking') }}</QTooltip>
|
||||||
</QBtn>
|
</QBtn>
|
||||||
<QBtn
|
<QBtn
|
||||||
size="md"
|
size="md"
|
||||||
|
@ -183,6 +184,7 @@ onMounted(async () => {
|
||||||
color="primary"
|
color="primary"
|
||||||
:href="salixUrl + 'ticket/' + entity.ticketFk + '/tracking/index'"
|
:href="salixUrl + 'ticket/' + entity.ticketFk + '/tracking/index'"
|
||||||
>
|
>
|
||||||
|
<QTooltip>{{ t('claim.card.ticketTracking') }}</QTooltip>
|
||||||
</QBtn>
|
</QBtn>
|
||||||
</QCardActions>
|
</QCardActions>
|
||||||
</template>
|
</template>
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
<script setup>
|
<script setup>
|
||||||
|
import { computed } from 'vue';
|
||||||
import { useRoute } from 'vue-router';
|
import { useRoute } from 'vue-router';
|
||||||
import { useState } from 'src/composables/useState';
|
import { useState } from 'src/composables/useState';
|
||||||
import VnNotes from 'src/components/ui/VnNotes.vue';
|
import VnNotes from 'src/components/ui/VnNotes.vue';
|
||||||
|
@ -6,14 +7,15 @@ import VnNotes from 'src/components/ui/VnNotes.vue';
|
||||||
const route = useRoute();
|
const route = useRoute();
|
||||||
const state = useState();
|
const state = useState();
|
||||||
const user = state.getUser();
|
const user = state.getUser();
|
||||||
const id = route.params.id;
|
|
||||||
|
|
||||||
const $props = defineProps({
|
const $props = defineProps({
|
||||||
|
id: { type: Number, default: null },
|
||||||
addNote: { type: Boolean, default: true },
|
addNote: { type: Boolean, default: true },
|
||||||
});
|
});
|
||||||
|
const claimId = computed(() => $props.id || route.params.id);
|
||||||
|
|
||||||
const claimFilter = {
|
const claimFilter = {
|
||||||
where: { claimFk: id },
|
where: { claimFk: claimId.value },
|
||||||
fields: ['created', 'workerFk', 'text'],
|
fields: ['created', 'workerFk', 'text'],
|
||||||
include: {
|
include: {
|
||||||
relation: 'worker',
|
relation: 'worker',
|
||||||
|
@ -30,19 +32,16 @@ const claimFilter = {
|
||||||
};
|
};
|
||||||
|
|
||||||
const body = {
|
const body = {
|
||||||
claimFk: id,
|
claimFk: claimId.value,
|
||||||
workerFk: user.value.id,
|
workerFk: user.value.id,
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
<template>
|
<template>
|
||||||
<div class="column items-center">
|
|
||||||
<VnNotes
|
<VnNotes
|
||||||
style="overflow-y: scroll"
|
style="overflow-y: auto"
|
||||||
:add-note="$props.addNote"
|
:add-note="$props.addNote"
|
||||||
:id="id"
|
|
||||||
url="claimObservations"
|
url="claimObservations"
|
||||||
:filter="claimFilter"
|
:filter="claimFilter"
|
||||||
:body="body"
|
:body="body"
|
||||||
/>
|
/>
|
||||||
</div>
|
|
||||||
</template>
|
</template>
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
<script setup>
|
<script setup>
|
||||||
import { onMounted, ref, computed, watch } from 'vue';
|
import { onMounted, ref, computed } from 'vue';
|
||||||
import { useRoute } from 'vue-router';
|
import { useRoute } from 'vue-router';
|
||||||
import { useI18n } from 'vue-i18n';
|
import { useI18n } from 'vue-i18n';
|
||||||
import { toDate, toCurrency } from 'src/filters';
|
import { toDate, toCurrency } from 'src/filters';
|
||||||
|
@ -70,7 +70,7 @@ const detailsColumns = ref([
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: 'description',
|
name: 'description',
|
||||||
label: 'claim.summary.description',
|
label: 'globals.description',
|
||||||
field: (row) => row.sale.concept,
|
field: (row) => row.sale.concept,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -179,9 +179,9 @@ function openDialog(dmsId) {
|
||||||
</template>
|
</template>
|
||||||
<template #body="{ entity: { claim, salesClaimed, developments } }">
|
<template #body="{ entity: { claim, salesClaimed, developments } }">
|
||||||
<QCard class="vn-one">
|
<QCard class="vn-one">
|
||||||
<a class="header" :href="`#/claim/${entityId}/basic-data`">
|
<a class="header header-link" :href="`#/claim/${entityId}/basic-data`">
|
||||||
{{ t('claim.pageTitles.basicData') }}
|
{{ t('claim.pageTitles.basicData') }}
|
||||||
<QIcon name="open_in_new" color="primary" />
|
<QIcon name="open_in_new" />
|
||||||
</a>
|
</a>
|
||||||
<VnLv
|
<VnLv
|
||||||
:label="t('claim.summary.created')"
|
:label="t('claim.summary.created')"
|
||||||
|
@ -194,19 +194,19 @@ function openDialog(dmsId) {
|
||||||
</QChip>
|
</QChip>
|
||||||
</template>
|
</template>
|
||||||
</VnLv>
|
</VnLv>
|
||||||
<VnLv :label="t('claim.summary.assignedTo')">
|
<VnLv :label="t('globals.salesPerson')">
|
||||||
<template #value>
|
<template #value>
|
||||||
<VnUserLink
|
<VnUserLink
|
||||||
:name="claim.worker?.user?.nickname"
|
:name="claim.client?.salesPersonUser?.name"
|
||||||
:worker-id="claim.workerFk"
|
:worker-id="claim.client?.salesPersonFk"
|
||||||
/>
|
/>
|
||||||
</template>
|
</template>
|
||||||
</VnLv>
|
</VnLv>
|
||||||
<VnLv :label="t('claim.summary.attendedBy')">
|
<VnLv :label="t('claim.summary.attendedBy')">
|
||||||
<template #value>
|
<template #value>
|
||||||
<VnUserLink
|
<VnUserLink
|
||||||
:name="claim.client?.salesPersonUser?.name"
|
:name="claim.worker?.user?.nickname"
|
||||||
:worker-id="claim.client?.salesPersonFk"
|
:worker-id="claim.workerFk"
|
||||||
/>
|
/>
|
||||||
</template>
|
</template>
|
||||||
</VnLv>
|
</VnLv>
|
||||||
|
@ -218,26 +218,37 @@ function openDialog(dmsId) {
|
||||||
/>
|
/>
|
||||||
</template>
|
</template>
|
||||||
</VnLv>
|
</VnLv>
|
||||||
<VnLv :label="t('claim.summary.returnOfMaterial')" :value="claim.rma" />
|
|
||||||
<QCheckbox
|
<QCheckbox
|
||||||
:align-items="right"
|
|
||||||
:label="t('claim.basicData.picked')"
|
:label="t('claim.basicData.picked')"
|
||||||
v-model="claim.hasToPickUp"
|
v-model="claim.hasToPickUp"
|
||||||
|
:disable="true"
|
||||||
/>
|
/>
|
||||||
</QCard>
|
</QCard>
|
||||||
<QCard class="vn-three claimVnNotes full-height">
|
<QCard class="vn-three">
|
||||||
<a class="header" :href="`#/claim/${entityId}/notes`">
|
<a class="header header-link" :href="`#/claim/${entityId}/notes`">
|
||||||
{{ t('claim.summary.notes') }}
|
{{ t('claim.summary.notes') }}
|
||||||
<QIcon name="open_in_new" color="primary" />
|
<QIcon name="open_in_new" />
|
||||||
</a>
|
</a>
|
||||||
<ClaimNotes :add-note="false" style="height: 350px" order="created ASC" />
|
<ClaimNotes
|
||||||
|
:id="entityId"
|
||||||
|
:add-note="false"
|
||||||
|
style="max-height: 300px"
|
||||||
|
order="created ASC"
|
||||||
|
/>
|
||||||
</QCard>
|
</QCard>
|
||||||
<QCard class="vn-two" v-if="salesClaimed.length > 0">
|
<QCard class="vn-two" v-if="salesClaimed.length > 0">
|
||||||
<a class="header" :href="`#/claim/${entityId}/lines`">
|
<a class="header header-link" :href="`#/claim/${entityId}/lines`">
|
||||||
{{ t('claim.summary.details') }}
|
{{ t('claim.summary.details') }}
|
||||||
<QIcon name="open_in_new" color="primary" />
|
<QIcon name="open_in_new" />
|
||||||
</a>
|
</a>
|
||||||
<QTable :columns="detailsColumns" :rows="salesClaimed" flat>
|
<QTable
|
||||||
|
:columns="detailsColumns"
|
||||||
|
:rows="salesClaimed"
|
||||||
|
flat
|
||||||
|
dense
|
||||||
|
:rows-per-page-options="[0]"
|
||||||
|
hide-bottom
|
||||||
|
>
|
||||||
<template #header="props">
|
<template #header="props">
|
||||||
<QTr :props="props">
|
<QTr :props="props">
|
||||||
<QTh v-for="col in props.cols" :key="col.name" :props="props">
|
<QTh v-for="col in props.cols" :key="col.name" :props="props">
|
||||||
|
@ -268,11 +279,19 @@ function openDialog(dmsId) {
|
||||||
</QTable>
|
</QTable>
|
||||||
</QCard>
|
</QCard>
|
||||||
<QCard class="vn-two" v-if="developments.length > 0">
|
<QCard class="vn-two" v-if="developments.length > 0">
|
||||||
<a class="header" :href="claimUrl + 'development'">
|
<a class="header header-link" :href="claimUrl + 'development'">
|
||||||
{{ t('claim.summary.development') }}
|
{{ t('claim.summary.development') }}
|
||||||
<QIcon name="open_in_new" color="primary" />
|
<QIcon name="open_in_new" />
|
||||||
</a>
|
</a>
|
||||||
<QTable :columns="developmentColumns" :rows="developments" flat>
|
|
||||||
|
<QTable
|
||||||
|
:columns="developmentColumns"
|
||||||
|
:rows="developments"
|
||||||
|
flat
|
||||||
|
dense
|
||||||
|
:rows-per-page-options="[0]"
|
||||||
|
hide-bottom
|
||||||
|
>
|
||||||
<template #header="props">
|
<template #header="props">
|
||||||
<QTr :props="props">
|
<QTr :props="props">
|
||||||
<QTh v-for="col in props.cols" :key="col.name" :props="props">
|
<QTh v-for="col in props.cols" :key="col.name" :props="props">
|
||||||
|
@ -283,9 +302,9 @@ function openDialog(dmsId) {
|
||||||
</QTable>
|
</QTable>
|
||||||
</QCard>
|
</QCard>
|
||||||
<QCard class="vn-max" v-if="claimDms.length > 0">
|
<QCard class="vn-max" v-if="claimDms.length > 0">
|
||||||
<a class="header" :href="`#/claim/${entityId}/photos`">
|
<a class="header header-link" :href="`#/claim/${entityId}/photos`">
|
||||||
{{ t('claim.summary.photos') }}
|
{{ t('claim.summary.photos') }}
|
||||||
<QIcon name="open_in_new" color="primary" />
|
<QIcon name="open_in_new" />
|
||||||
</a>
|
</a>
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<div
|
<div
|
||||||
|
@ -302,7 +321,7 @@ function openDialog(dmsId) {
|
||||||
v-if="media.isVideo"
|
v-if="media.isVideo"
|
||||||
@click.stop="openDialog(media.dmsFk)"
|
@click.stop="openDialog(media.dmsFk)"
|
||||||
>
|
>
|
||||||
<QTooltip>Video</QTooltip>
|
<QTooltip>Video</QTooltip>header
|
||||||
</QIcon>
|
</QIcon>
|
||||||
<QCard class="multimedia relative-position">
|
<QCard class="multimedia relative-position">
|
||||||
<QImg
|
<QImg
|
||||||
|
@ -326,9 +345,9 @@ function openDialog(dmsId) {
|
||||||
</QCard>
|
</QCard>
|
||||||
|
|
||||||
<QCard class="vn-max">
|
<QCard class="vn-max">
|
||||||
<a class="header" :href="claimUrl + 'action'">
|
<a class="header header-link" :href="claimUrl + 'action'">
|
||||||
{{ t('claim.summary.actions') }}
|
{{ t('claim.summary.actions') }}
|
||||||
<QIcon name="open_in_new" color="primary" />
|
<QIcon name="open_in_new" class="link" />
|
||||||
</a>
|
</a>
|
||||||
<div id="slider-container" class="q-px-xl q-py-md">
|
<div id="slider-container" class="q-px-xl q-py-md">
|
||||||
<QSlider
|
<QSlider
|
||||||
|
@ -336,7 +355,7 @@ function openDialog(dmsId) {
|
||||||
label
|
label
|
||||||
:label-value="t('claim.summary.responsibility')"
|
:label-value="t('claim.summary.responsibility')"
|
||||||
label-always
|
label-always
|
||||||
color="primary"
|
color="var()"
|
||||||
markers
|
markers
|
||||||
:marker-labels="[
|
:marker-labels="[
|
||||||
{ value: 1, label: t('claim.summary.company') },
|
{ value: 1, label: t('claim.summary.company') },
|
||||||
|
@ -390,13 +409,7 @@ function openDialog(dmsId) {
|
||||||
</template>
|
</template>
|
||||||
</CardSummary>
|
</CardSummary>
|
||||||
</template>
|
</template>
|
||||||
<style lang="scss">
|
|
||||||
.claimVnNotes {
|
|
||||||
.q-card {
|
|
||||||
max-width: 100%;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
.q-dialog__inner--minimized > div {
|
.q-dialog__inner--minimized > div {
|
||||||
max-width: 80%;
|
max-width: 80%;
|
||||||
|
@ -406,7 +419,6 @@ function openDialog(dmsId) {
|
||||||
flex-direction: row;
|
flex-direction: row;
|
||||||
flex-wrap: wrap;
|
flex-wrap: wrap;
|
||||||
gap: 15px;
|
gap: 15px;
|
||||||
flex-basis: 30%;
|
|
||||||
}
|
}
|
||||||
.multimedia-container {
|
.multimedia-container {
|
||||||
flex: 1 0 21%;
|
flex: 1 0 21%;
|
||||||
|
|
|
@ -115,12 +115,6 @@ function navigate(event, id) {
|
||||||
</VnLv>
|
</VnLv>
|
||||||
</template>
|
</template>
|
||||||
<template #actions>
|
<template #actions>
|
||||||
<QBtn
|
|
||||||
:label="t('components.smartCard.openCard')"
|
|
||||||
@click.stop="navigate(row.id)"
|
|
||||||
class="bg-vn-dark"
|
|
||||||
outline
|
|
||||||
/>
|
|
||||||
<QBtn
|
<QBtn
|
||||||
:label="t('globals.description')"
|
:label="t('globals.description')"
|
||||||
@click.stop
|
@click.stop
|
||||||
|
|
|
@ -6,6 +6,7 @@ import CustomerDescriptor from './CustomerDescriptor.vue';
|
||||||
import LeftMenu from 'components/LeftMenu.vue';
|
import LeftMenu from 'components/LeftMenu.vue';
|
||||||
import VnSearchbar from 'src/components/ui/VnSearchbar.vue';
|
import VnSearchbar from 'src/components/ui/VnSearchbar.vue';
|
||||||
import VnSubToolbar from 'src/components/ui/VnSubToolbar.vue';
|
import VnSubToolbar from 'src/components/ui/VnSubToolbar.vue';
|
||||||
|
import useCardSize from 'src/composables/useCardSize';
|
||||||
|
|
||||||
const stateStore = useStateStore();
|
const stateStore = useStateStore();
|
||||||
const route = useRoute();
|
const route = useRoute();
|
||||||
|
@ -30,7 +31,9 @@ const { t } = useI18n();
|
||||||
<QPageContainer>
|
<QPageContainer>
|
||||||
<QPage>
|
<QPage>
|
||||||
<VnSubToolbar />
|
<VnSubToolbar />
|
||||||
<div class="q-pa-md"><RouterView></RouterView></div>
|
<div :class="useCardSize()">
|
||||||
|
<RouterView></RouterView>
|
||||||
|
</div>
|
||||||
</QPage>
|
</QPage>
|
||||||
</QPageContainer>
|
</QPageContainer>
|
||||||
</template>
|
</template>
|
||||||
|
|
|
@ -40,6 +40,15 @@ const setData = (entity) => (data.value = useCardDescription(entity.name, entity
|
||||||
data-key="customerData"
|
data-key="customerData"
|
||||||
>
|
>
|
||||||
<template #body="{ entity }">
|
<template #body="{ entity }">
|
||||||
|
<VnLv :label="t('customer.card.payMethod')" :value="entity.payMethod.name" />
|
||||||
|
|
||||||
|
<VnLv :label="t('customer.card.credit')" :value="toCurrency(entity.credit)" />
|
||||||
|
<VnLv
|
||||||
|
:label="t('customer.card.securedCredit')"
|
||||||
|
:value="toCurrency(entity.creditInsurance)"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<VnLv :label="t('customer.card.debt')" :value="toCurrency(entity.debt)" />
|
||||||
<VnLv v-if="entity.salesPersonUser" :label="t('customer.card.salesPerson')">
|
<VnLv v-if="entity.salesPersonUser" :label="t('customer.card.salesPerson')">
|
||||||
<template #value>
|
<template #value>
|
||||||
<VnUserLink
|
<VnUserLink
|
||||||
|
@ -48,13 +57,10 @@ const setData = (entity) => (data.value = useCardDescription(entity.name, entity
|
||||||
/>
|
/>
|
||||||
</template>
|
</template>
|
||||||
</VnLv>
|
</VnLv>
|
||||||
<VnLv :label="t('customer.card.credit')" :value="toCurrency(entity.credit)" />
|
|
||||||
<VnLv
|
<VnLv
|
||||||
:label="t('customer.card.securedCredit')"
|
:label="t('customer.card.businessTypeFk')"
|
||||||
:value="toCurrency(entity.creditInsurance)"
|
:value="entity.businessTypeFk"
|
||||||
/>
|
/>
|
||||||
<VnLv :label="t('customer.card.payMethod')" :value="entity.payMethod.name" />
|
|
||||||
<VnLv :label="t('customer.card.debt')" :value="toCurrency(entity.debt)" />
|
|
||||||
</template>
|
</template>
|
||||||
<template #icons="{ entity }">
|
<template #icons="{ entity }">
|
||||||
<QCardActions>
|
<QCardActions>
|
||||||
|
|
|
@ -62,9 +62,9 @@ const creditWarning = computed(() => {
|
||||||
<CardSummary ref="summary" :url="`Clients/${entityId}/summary`">
|
<CardSummary ref="summary" :url="`Clients/${entityId}/summary`">
|
||||||
<template #body="{ entity }">
|
<template #body="{ entity }">
|
||||||
<QCard class="vn-one">
|
<QCard class="vn-one">
|
||||||
<a class="header" :href="clientUrl + `basic-data`">
|
<a class="header header-link" :href="`#/customer/${entityId}/basic-data`">
|
||||||
{{ t('customer.summary.basicData') }}
|
{{ t('customer.summary.basicData') }}
|
||||||
<QIcon name="open_in_new" color="primary" />
|
<QIcon name="open_in_new" />
|
||||||
</a>
|
</a>
|
||||||
<VnLv :label="t('customer.summary.customerId')" :value="entity.id" />
|
<VnLv :label="t('customer.summary.customerId')" :value="entity.id" />
|
||||||
<VnLv :label="t('customer.summary.name')" :value="entity.name" />
|
<VnLv :label="t('customer.summary.name')" :value="entity.name" />
|
||||||
|
@ -96,9 +96,12 @@ const creditWarning = computed(() => {
|
||||||
/>
|
/>
|
||||||
</QCard>
|
</QCard>
|
||||||
<QCard class="vn-one">
|
<QCard class="vn-one">
|
||||||
<a class="header" :href="clientUrl + `fiscal-data`">
|
<a
|
||||||
|
class="header header-link"
|
||||||
|
:href="`#/customer/${entityId}/fiscal-data`"
|
||||||
|
>
|
||||||
{{ t('customer.summary.fiscalAddress') }}
|
{{ t('customer.summary.fiscalAddress') }}
|
||||||
<QIcon name="open_in_new" color="primary" />
|
<QIcon name="open_in_new" />
|
||||||
</a>
|
</a>
|
||||||
<VnLv
|
<VnLv
|
||||||
:label="t('customer.summary.socialName')"
|
:label="t('customer.summary.socialName')"
|
||||||
|
@ -121,37 +124,58 @@ const creditWarning = computed(() => {
|
||||||
<VnLv :label="t('customer.summary.street')" :value="entity.street" />
|
<VnLv :label="t('customer.summary.street')" :value="entity.street" />
|
||||||
</QCard>
|
</QCard>
|
||||||
<QCard class="vn-one">
|
<QCard class="vn-one">
|
||||||
<a class="header link" :href="clientUrl + `fiscal-data`" link>
|
<a
|
||||||
|
class="header header-link"
|
||||||
|
:href="`#/customer/${entityId}/fiscal-data`"
|
||||||
|
link
|
||||||
|
>
|
||||||
{{ t('customer.summary.fiscalData') }}
|
{{ t('customer.summary.fiscalData') }}
|
||||||
<QIcon name="open_in_new" color="primary" />
|
<QIcon name="open_in_new" />
|
||||||
</a>
|
</a>
|
||||||
<VnLv
|
<QCheckbox
|
||||||
:label="t('customer.summary.isEqualizated')"
|
:label="t('customer.summary.isEqualizated')"
|
||||||
:value="entity.isEqualizated"
|
v-model="entity.isEqualizated"
|
||||||
|
:disable="true"
|
||||||
/>
|
/>
|
||||||
<VnLv :label="t('customer.summary.isActive')" :value="entity.isActive" />
|
<QCheckbox
|
||||||
<VnLv
|
:label="t('customer.summary.isActive')"
|
||||||
|
v-model="entity.isActive"
|
||||||
|
:disable="true"
|
||||||
|
/>
|
||||||
|
<QCheckbox
|
||||||
:label="t('customer.summary.invoiceByAddress')"
|
:label="t('customer.summary.invoiceByAddress')"
|
||||||
:value="entity.hasToInvoiceByAddress"
|
v-model="entity.hasToInvoiceByAddress"
|
||||||
|
:disable="true"
|
||||||
/>
|
/>
|
||||||
<VnLv
|
<QCheckbox
|
||||||
:label="t('customer.summary.verifiedData')"
|
:label="t('customer.summary.verifiedData')"
|
||||||
:value="entity.isTaxDataChecked"
|
v-model="entity.isTaxDataChecked"
|
||||||
|
:disable="true"
|
||||||
/>
|
/>
|
||||||
<VnLv
|
<QCheckbox
|
||||||
:label="t('customer.summary.hasToInvoice')"
|
:label="t('customer.summary.hasToInvoice')"
|
||||||
:value="entity.hasToInvoice"
|
v-model="entity.hasToInvoice"
|
||||||
|
:disable="true"
|
||||||
/>
|
/>
|
||||||
<VnLv
|
<QCheckbox
|
||||||
:label="t('customer.summary.notifyByEmail')"
|
:label="t('customer.summary.notifyByEmail')"
|
||||||
:value="entity.isToBeMailed"
|
v-model="entity.isToBeMailed"
|
||||||
|
:disable="true"
|
||||||
|
/>
|
||||||
|
<QCheckbox
|
||||||
|
:label="t('customer.summary.vies')"
|
||||||
|
v-model="entity.isVies"
|
||||||
|
:disable="true"
|
||||||
/>
|
/>
|
||||||
<VnLv :label="t('customer.summary.vies')" :value="entity.isVies" />
|
|
||||||
</QCard>
|
</QCard>
|
||||||
<QCard class="vn-one">
|
<QCard class="vn-one">
|
||||||
<a class="header link" :href="clientUrl + `billing-data`" link>
|
<a
|
||||||
|
class="header header-link"
|
||||||
|
:href="`#/customer/${entityId}/billing-data`"
|
||||||
|
link
|
||||||
|
>
|
||||||
{{ t('customer.summary.billingData') }}
|
{{ t('customer.summary.billingData') }}
|
||||||
<QIcon name="open_in_new" color="primary" />
|
<QIcon name="open_in_new" />
|
||||||
</a>
|
</a>
|
||||||
<VnLv
|
<VnLv
|
||||||
:label="t('customer.summary.payMethod')"
|
:label="t('customer.summary.payMethod')"
|
||||||
|
@ -159,20 +183,32 @@ const creditWarning = computed(() => {
|
||||||
/>
|
/>
|
||||||
<VnLv :label="t('customer.summary.bankAccount')" :value="entity.iban" />
|
<VnLv :label="t('customer.summary.bankAccount')" :value="entity.iban" />
|
||||||
<VnLv :label="t('customer.summary.dueDay')" :value="entity.dueDay" />
|
<VnLv :label="t('customer.summary.dueDay')" :value="entity.dueDay" />
|
||||||
<VnLv :label="t('customer.summary.hasLcr')" :value="entity.hasLcr" />
|
<QCheckbox
|
||||||
<VnLv
|
style="padding: 0"
|
||||||
:label="t('customer.summary.hasCoreVnl')"
|
:label="t('customer.summary.hasLcr')"
|
||||||
:value="entity.hasCoreVnl"
|
v-model="entity.hasLcr"
|
||||||
|
:disable="true"
|
||||||
/>
|
/>
|
||||||
<VnLv
|
<QCheckbox
|
||||||
|
:label="t('customer.summary.hasCoreVnl')"
|
||||||
|
v-model="entity.hasCoreVnl"
|
||||||
|
:disable="true"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<QCheckbox
|
||||||
:label="t('customer.summary.hasB2BVnl')"
|
:label="t('customer.summary.hasB2BVnl')"
|
||||||
:value="entity.hasSepaVnl"
|
v-model="entity.hasSepaVnl"
|
||||||
|
:disable="true"
|
||||||
/>
|
/>
|
||||||
</QCard>
|
</QCard>
|
||||||
<QCard class="vn-one" v-if="entity.defaultAddress">
|
<QCard class="vn-one" v-if="entity.defaultAddress">
|
||||||
<a class="header link" :href="clientUrl + `address/index`" link>
|
<a
|
||||||
|
class="header header-link"
|
||||||
|
:href="`#/customer/${entityId}/consignees`"
|
||||||
|
link
|
||||||
|
>
|
||||||
{{ t('customer.summary.consignee') }}
|
{{ t('customer.summary.consignee') }}
|
||||||
<QIcon name="open_in_new" color="primary" />
|
<QIcon name="open_in_new" />
|
||||||
</a>
|
</a>
|
||||||
<VnLv
|
<VnLv
|
||||||
:label="t('customer.summary.addressName')"
|
:label="t('customer.summary.addressName')"
|
||||||
|
@ -188,21 +224,22 @@ const creditWarning = computed(() => {
|
||||||
/>
|
/>
|
||||||
</QCard>
|
</QCard>
|
||||||
<QCard class="vn-one" v-if="entity.account">
|
<QCard class="vn-one" v-if="entity.account">
|
||||||
<a class="header link" :href="clientUrl + `web-access`">
|
<a class="header header-link" :href="`#/customer/${entityId}/web-access`">
|
||||||
{{ t('customer.summary.webAccess') }}
|
{{ t('customer.summary.webAccess') }}
|
||||||
<QIcon name="open_in_new" color="primary" />
|
<QIcon name="open_in_new" />
|
||||||
</a>
|
</a>
|
||||||
<VnLv
|
<VnLv
|
||||||
:label="t('customer.summary.username')"
|
:label="t('customer.summary.username')"
|
||||||
:value="entity.account.name"
|
:value="entity.account.name"
|
||||||
/>
|
/>
|
||||||
<VnLv
|
<QCheckbox
|
||||||
:label="t('customer.summary.webAccess')"
|
:label="t('customer.summary.webAccess')"
|
||||||
:value="entity.account.active"
|
v-model="entity.account.active"
|
||||||
|
:disable="true"
|
||||||
/>
|
/>
|
||||||
</QCard>
|
</QCard>
|
||||||
<QCard class="vn-one" v-if="entity.account">
|
<QCard class="vn-one" v-if="entity.account">
|
||||||
<div class="header">
|
<div class="header header-link">
|
||||||
{{ t('customer.summary.businessData') }}
|
{{ t('customer.summary.businessData') }}
|
||||||
</div>
|
</div>
|
||||||
<VnLv
|
<VnLv
|
||||||
|
@ -230,13 +267,12 @@ const creditWarning = computed(() => {
|
||||||
</QCard>
|
</QCard>
|
||||||
<QCard class="vn-one" v-if="entity.account">
|
<QCard class="vn-one" v-if="entity.account">
|
||||||
<a
|
<a
|
||||||
class="header link"
|
class="header header-link"
|
||||||
:href="`https://grafana.verdnatura.es/d/40buzE4Vk/comportamiento-pagos-clientes?orgId=1&var-clientFk=${entityId}`"
|
:href="`https://grafana.verdnatura.es/d/40buzE4Vk/comportamiento-pagos-clientes?orgId=1&var-clientFk=${entityId}`"
|
||||||
link
|
link
|
||||||
>
|
>
|
||||||
{{ t('customer.summary.financialData') }}
|
{{ t('customer.summary.financialData') }}
|
||||||
<QIcon name="open_in_new" color="primary" />
|
<QIcon name="vn:grafana" />
|
||||||
<!-- Pendiente de añadir el icono <QIcon name="vn:grafana" color="primary" /> -->
|
|
||||||
</a>
|
</a>
|
||||||
<VnLv
|
<VnLv
|
||||||
:label="t('customer.summary.risk')"
|
:label="t('customer.summary.risk')"
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
<script setup>
|
<script setup>
|
||||||
import { useI18n } from 'vue-i18n';
|
import { useI18n } from 'vue-i18n';
|
||||||
|
|
||||||
import VnFilterPanel from 'src/components/ui/VnFilterPanel.vue';
|
import VnFilterPanel from 'src/components/ui/VnFilterPanel.vue';
|
||||||
import VnInput from 'src/components/common/VnInput.vue';
|
import VnInput from 'src/components/common/VnInput.vue';
|
||||||
import VnInputDate from 'components/common/VnInputDate.vue';
|
import VnInputDate from 'components/common/VnInputDate.vue';
|
||||||
|
import VnCurrency from 'src/components/common/VnCurrency.vue';
|
||||||
|
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
|
@ -12,10 +12,6 @@ const props = defineProps({
|
||||||
required: true,
|
required: true,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
function isValidNumber(value) {
|
|
||||||
return /^(\d|\d+(\.|,)?\d+)$/.test(value);
|
|
||||||
}
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
|
@ -51,28 +47,9 @@ function isValidNumber(value) {
|
||||||
</QItem>
|
</QItem>
|
||||||
<QItem>
|
<QItem>
|
||||||
<QItemSection>
|
<QItemSection>
|
||||||
<VnInput
|
<VnCurrency v-model="params.amount" is-outlined />
|
||||||
:label="t('Amount')"
|
|
||||||
v-model="params.amount"
|
|
||||||
is-outlined
|
|
||||||
@update:model-value="
|
|
||||||
(value) => {
|
|
||||||
if (value.includes(','))
|
|
||||||
params.amount = params.amount.replace(',', '.');
|
|
||||||
}
|
|
||||||
"
|
|
||||||
:rules="[
|
|
||||||
(val) => isValidNumber(val) || !val || 'Please type a number',
|
|
||||||
]"
|
|
||||||
lazy-rules
|
|
||||||
>
|
|
||||||
<template #prepend>
|
|
||||||
<QIcon name="euro" size="sm" />
|
|
||||||
</template>
|
|
||||||
</VnInput>
|
|
||||||
</QItemSection>
|
</QItemSection>
|
||||||
</QItem>
|
</QItem>
|
||||||
|
|
||||||
<QItem>
|
<QItem>
|
||||||
<QItemSection>
|
<QItemSection>
|
||||||
<VnInputDate v-model="params.from" :label="t('From')" is-outlined />
|
<VnInputDate v-model="params.from" :label="t('From')" is-outlined />
|
||||||
|
|
|
@ -36,9 +36,12 @@ onMounted(async () => {
|
||||||
</template>
|
</template>
|
||||||
<template #body="{ entity: department }">
|
<template #body="{ entity: department }">
|
||||||
<QCard class="column">
|
<QCard class="column">
|
||||||
<a class="header" :href="department + `basic-data`">
|
<a
|
||||||
|
class="header header-link"
|
||||||
|
:href="`#/department/department/${entityId}/basic-data`"
|
||||||
|
>
|
||||||
{{ t('Basic data') }}
|
{{ t('Basic data') }}
|
||||||
<QIcon name="open_in_new" color="primary" />
|
<QIcon name="open_in_new" />
|
||||||
</a>
|
</a>
|
||||||
<div class="full-width row wrap justify-between content-between">
|
<div class="full-width row wrap justify-between content-between">
|
||||||
<div class="column" style="min-width: 50%">
|
<div class="column" style="min-width: 50%">
|
||||||
|
|
|
@ -7,6 +7,7 @@ import VnSubToolbar from 'src/components/ui/VnSubToolbar.vue';
|
||||||
import EntryDescriptor from './EntryDescriptor.vue';
|
import EntryDescriptor from './EntryDescriptor.vue';
|
||||||
|
|
||||||
import { useStateStore } from 'stores/useStateStore';
|
import { useStateStore } from 'stores/useStateStore';
|
||||||
|
import useCardSize from 'src/composables/useCardSize';
|
||||||
|
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
const stateStore = useStateStore();
|
const stateStore = useStateStore();
|
||||||
|
@ -33,7 +34,9 @@ const stateStore = useStateStore();
|
||||||
<QPage>
|
<QPage>
|
||||||
<VnSubToolbar />
|
<VnSubToolbar />
|
||||||
|
|
||||||
<div class="q-pa-md"><RouterView></RouterView></div>
|
<div :class="useCardSize()">
|
||||||
|
<RouterView></RouterView>
|
||||||
|
</div>
|
||||||
</QPage>
|
</QPage>
|
||||||
</QPageContainer>
|
</QPageContainer>
|
||||||
</template>
|
</template>
|
||||||
|
|
|
@ -50,7 +50,6 @@ onMounted(() => {
|
||||||
:key="index"
|
:key="index"
|
||||||
class="row q-gutter-md q-mb-md"
|
class="row q-gutter-md q-mb-md"
|
||||||
>
|
>
|
||||||
<div class="col-3">
|
|
||||||
<VnSelectFilter
|
<VnSelectFilter
|
||||||
:label="t('entry.notes.observationType')"
|
:label="t('entry.notes.observationType')"
|
||||||
v-model="row.observationTypeFk"
|
v-model="row.observationTypeFk"
|
||||||
|
@ -60,15 +59,14 @@ onMounted(() => {
|
||||||
option-value="id"
|
option-value="id"
|
||||||
hide-selected
|
hide-selected
|
||||||
/>
|
/>
|
||||||
</div>
|
|
||||||
<div class="col">
|
|
||||||
<VnInput
|
<VnInput
|
||||||
:label="t('globals.description')"
|
:label="t('globals.description')"
|
||||||
v-model="row.description"
|
v-model="row.description"
|
||||||
:rules="validate('EntryObservation.description')"
|
:rules="validate('EntryObservation.description')"
|
||||||
/>
|
/>
|
||||||
</div>
|
|
||||||
<div class="col-1 row justify-center items-center">
|
<div class="row justify-center items-center">
|
||||||
<QIcon
|
<QIcon
|
||||||
name="delete"
|
name="delete"
|
||||||
size="sm"
|
size="sm"
|
||||||
|
@ -82,7 +80,6 @@ onMounted(() => {
|
||||||
</QIcon>
|
</QIcon>
|
||||||
</div>
|
</div>
|
||||||
</VnRow>
|
</VnRow>
|
||||||
<VnRow>
|
|
||||||
<QIcon
|
<QIcon
|
||||||
name="add"
|
name="add"
|
||||||
size="sm"
|
size="sm"
|
||||||
|
@ -94,7 +91,6 @@ onMounted(() => {
|
||||||
{{ t('Add note') }}
|
{{ t('Add note') }}
|
||||||
</QTooltip>
|
</QTooltip>
|
||||||
</QIcon>
|
</QIcon>
|
||||||
</VnRow>
|
|
||||||
</QCard>
|
</QCard>
|
||||||
</template>
|
</template>
|
||||||
</CrudModel>
|
</CrudModel>
|
||||||
|
|
|
@ -39,30 +39,47 @@ onMounted(async () => {
|
||||||
const tableColumnComponents = {
|
const tableColumnComponents = {
|
||||||
quantity: {
|
quantity: {
|
||||||
component: () => 'span',
|
component: () => 'span',
|
||||||
|
props: () => {},
|
||||||
},
|
},
|
||||||
stickers: {
|
stickers: {
|
||||||
component: () => 'span',
|
component: () => 'span',
|
||||||
|
props: () => {},
|
||||||
|
event: () => {},
|
||||||
},
|
},
|
||||||
packagingFk: {
|
packagingFk: {
|
||||||
component: () => 'span',
|
component: () => 'span',
|
||||||
|
props: () => {},
|
||||||
|
event: () => {},
|
||||||
},
|
},
|
||||||
weight: {
|
weight: {
|
||||||
component: () => 'span',
|
component: () => 'span',
|
||||||
|
props: () => {},
|
||||||
|
event: () => {},
|
||||||
},
|
},
|
||||||
packing: {
|
packing: {
|
||||||
component: () => 'span',
|
component: () => 'span',
|
||||||
|
props: () => {},
|
||||||
|
event: () => {},
|
||||||
},
|
},
|
||||||
grouping: {
|
grouping: {
|
||||||
component: () => 'span',
|
component: () => 'span',
|
||||||
|
props: () => {},
|
||||||
|
event: () => {},
|
||||||
},
|
},
|
||||||
buyingValue: {
|
buyingValue: {
|
||||||
component: () => 'span',
|
component: () => 'span',
|
||||||
|
props: () => {},
|
||||||
|
event: () => {},
|
||||||
},
|
},
|
||||||
amount: {
|
amount: {
|
||||||
component: () => 'span',
|
component: () => 'span',
|
||||||
|
props: () => {},
|
||||||
|
event: () => {},
|
||||||
},
|
},
|
||||||
pvp: {
|
pvp: {
|
||||||
component: () => 'span',
|
component: () => 'span',
|
||||||
|
props: () => {},
|
||||||
|
event: () => {},
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -148,7 +165,7 @@ const fetchEntryBuys = async () => {
|
||||||
@on-fetch="(data) => setEntryData(data)"
|
@on-fetch="(data) => setEntryData(data)"
|
||||||
>
|
>
|
||||||
<template #header-left>
|
<template #header-left>
|
||||||
<a class="header link" :href="entryUrl">
|
<a class="header-link" :href="entryUrl">
|
||||||
<QIcon name="open_in_new" color="white" size="sm" />
|
<QIcon name="open_in_new" color="white" size="sm" />
|
||||||
</a>
|
</a>
|
||||||
</template>
|
</template>
|
||||||
|
@ -158,77 +175,55 @@ const fetchEntryBuys = async () => {
|
||||||
|
|
||||||
<template #body>
|
<template #body>
|
||||||
<QCard class="vn-one">
|
<QCard class="vn-one">
|
||||||
<a class="header link" :href="entryUrl">
|
<a class="header header-link" :href="`#/entry/${entityId}/basic-data`">
|
||||||
{{ t('globals.summary.basicData') }}
|
{{ t('globals.summary.basicData') }}
|
||||||
<QIcon name="open_in_new" color="primary" />
|
<QIcon name="open_in_new" />
|
||||||
</a>
|
</a>
|
||||||
<VnRow>
|
|
||||||
<div class="col">
|
<VnLv :label="t('entry.summary.commission')" :value="entry.commission" />
|
||||||
<VnLv
|
|
||||||
:label="t('entry.summary.commission')"
|
<VnLv :label="t('entry.summary.currency')" :value="entry.currency.name" />
|
||||||
:value="entry.commission"
|
|
||||||
/>
|
<VnLv :label="t('entry.summary.company')" :value="entry.company.code" />
|
||||||
</div>
|
|
||||||
<div class="col">
|
<VnLv :label="t('entry.summary.reference')" :value="entry.reference" />
|
||||||
<VnLv
|
|
||||||
:label="t('entry.summary.currency')"
|
|
||||||
:value="entry.currency.name"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
<div class="col">
|
|
||||||
<VnLv
|
|
||||||
:label="t('entry.summary.company')"
|
|
||||||
:value="entry.company.code"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
<div class="col">
|
|
||||||
<VnLv
|
|
||||||
:label="t('entry.summary.reference')"
|
|
||||||
:value="entry.reference"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
<div class="col">
|
|
||||||
<VnLv
|
<VnLv
|
||||||
:label="t('entry.summary.invoiceNumber')"
|
:label="t('entry.summary.invoiceNumber')"
|
||||||
:value="entry.invoiceNumber"
|
:value="entry.invoiceNumber"
|
||||||
/>
|
/>
|
||||||
</div>
|
<QCheckbox
|
||||||
<div class="col">
|
|
||||||
<VnLv
|
|
||||||
:label="t('entry.summary.ordered')"
|
:label="t('entry.summary.ordered')"
|
||||||
:value="entry.isOrdered"
|
v-model="entry.isOrdered"
|
||||||
|
:disable="true"
|
||||||
/>
|
/>
|
||||||
</div>
|
<QCheckbox
|
||||||
<div class="col">
|
|
||||||
<VnLv
|
|
||||||
:label="t('entry.summary.confirmed')"
|
:label="t('entry.summary.confirmed')"
|
||||||
:value="entry.isConfirmed"
|
v-model="entry.isConfirmed"
|
||||||
|
:disable="true"
|
||||||
/>
|
/>
|
||||||
</div>
|
<QCheckbox
|
||||||
<div class="col">
|
|
||||||
<VnLv
|
|
||||||
:label="t('entry.summary.booked')"
|
:label="t('entry.summary.booked')"
|
||||||
:value="entry.isBooked"
|
v-model="entry.isBooked"
|
||||||
|
:disable="true"
|
||||||
/>
|
/>
|
||||||
</div>
|
<QCheckbox
|
||||||
<div class="col">
|
:label="t('entry.summary.raid')"
|
||||||
<VnLv :label="t('entry.summary.raid')" :value="entry.isRaid" />
|
v-model="entry.isRaid"
|
||||||
</div>
|
:disable="true"
|
||||||
<div class="col">
|
/>
|
||||||
<VnLv
|
<QCheckbox
|
||||||
:label="t('entry.summary.excludedFromAvailable')"
|
:label="t('entry.summary.excludedFromAvailable')"
|
||||||
:value="entry.isExcludedFromAvailable"
|
v-model="entry.isExcludedFromAvailable"
|
||||||
|
:disable="true"
|
||||||
/>
|
/>
|
||||||
</div>
|
|
||||||
</VnRow>
|
|
||||||
</QCard>
|
</QCard>
|
||||||
<QCard class="vn-one">
|
<QCard class="vn-one">
|
||||||
<a class="header link" :href="entryUrl">
|
<a class="header header-link" :href="entryUrl">
|
||||||
{{ t('Travel data') }}
|
{{ t('Travel data') }}
|
||||||
<QIcon name="open_in_new" color="primary" />
|
<QIcon name="open_in_new" />
|
||||||
</a>
|
</a>
|
||||||
<VnRow>
|
|
||||||
<div class="col">
|
|
||||||
<VnLv :label="t('entry.summary.travelReference')">
|
<VnLv :label="t('entry.summary.travelReference')">
|
||||||
<template #value>
|
<template #value>
|
||||||
<span class="link">
|
<span class="link">
|
||||||
|
@ -237,54 +232,47 @@ const fetchEntryBuys = async () => {
|
||||||
</span>
|
</span>
|
||||||
</template>
|
</template>
|
||||||
</VnLv>
|
</VnLv>
|
||||||
</div>
|
|
||||||
<div class="col">
|
|
||||||
<VnLv
|
<VnLv
|
||||||
:label="t('entry.summary.travelAgency')"
|
:label="t('entry.summary.travelAgency')"
|
||||||
:value="entry.travel.agency.name"
|
:value="entry.travel.agency.name"
|
||||||
/>
|
/>
|
||||||
</div>
|
|
||||||
<div class="col">
|
|
||||||
<VnLv
|
<VnLv
|
||||||
:label="t('entry.summary.travelShipped')"
|
:label="t('entry.summary.travelShipped')"
|
||||||
:value="toDate(entry.travel.shipped)"
|
:value="toDate(entry.travel.shipped)"
|
||||||
/>
|
/>
|
||||||
</div>
|
|
||||||
<div class="col">
|
|
||||||
<VnLv
|
<VnLv
|
||||||
:label="t('entry.summary.travelWarehouseOut')"
|
:label="t('entry.summary.travelWarehouseOut')"
|
||||||
:value="entry.travel.warehouseOut.name"
|
:value="entry.travel.warehouseOut.name"
|
||||||
/>
|
/>
|
||||||
</div>
|
|
||||||
<div class="col">
|
<QCheckbox
|
||||||
<VnLv
|
|
||||||
:label="t('entry.summary.travelDelivered')"
|
:label="t('entry.summary.travelDelivered')"
|
||||||
:value="entry.travel.isDelivered"
|
v-model="entry.isDelivered"
|
||||||
|
:disable="true"
|
||||||
/>
|
/>
|
||||||
</div>
|
|
||||||
<div class="col">
|
|
||||||
<VnLv
|
<VnLv
|
||||||
:label="t('entry.summary.travelLanded')"
|
:label="t('entry.summary.travelLanded')"
|
||||||
:value="toDate(entry.travel.landed)"
|
:value="toDate(entry.travel.landed)"
|
||||||
/>
|
/>
|
||||||
</div>
|
|
||||||
<div class="col">
|
|
||||||
<VnLv
|
<VnLv
|
||||||
:label="t('entry.summary.travelWarehouseIn')"
|
:label="t('entry.summary.travelWarehouseIn')"
|
||||||
:value="entry.travel.warehouseIn.name"
|
:value="entry.travel.warehouseIn.name"
|
||||||
/>
|
/>
|
||||||
</div>
|
|
||||||
<div class="col">
|
<QCheckbox
|
||||||
<VnLv
|
|
||||||
:label="t('entry.summary.travelReceived')"
|
:label="t('entry.summary.travelReceived')"
|
||||||
:value="entry.travel.isReceived"
|
v-model="entry.isReceived"
|
||||||
|
:disable="true"
|
||||||
/>
|
/>
|
||||||
</div>
|
|
||||||
</VnRow>
|
|
||||||
</QCard>
|
</QCard>
|
||||||
<QCard class="vn-two" style="min-width: 100%">
|
<QCard class="vn-two" style="min-width: 100%">
|
||||||
<a class="header">
|
<a class="header header-link">
|
||||||
{{ t('entry.summary.buys') }}
|
{{ t('entry.summary.buys') }}
|
||||||
|
<QIcon name="open_in_new" />
|
||||||
</a>
|
</a>
|
||||||
<QTable
|
<QTable
|
||||||
:rows="entryBuys"
|
:rows="entryBuys"
|
||||||
|
@ -297,7 +285,10 @@ const fetchEntryBuys = async () => {
|
||||||
<QTr no-hover>
|
<QTr no-hover>
|
||||||
<QTd v-for="col in cols" :key="col.name">
|
<QTd v-for="col in cols" :key="col.name">
|
||||||
<component
|
<component
|
||||||
:is="tableColumnComponents[col.name].component()"
|
:is="tableColumnComponents[col.name].component(props)"
|
||||||
|
v-bind="tableColumnComponents[col.name].props(props)"
|
||||||
|
@click="tableColumnComponents[col.name].event(props)"
|
||||||
|
class="col-content"
|
||||||
>
|
>
|
||||||
<template
|
<template
|
||||||
v-if="
|
v-if="
|
||||||
|
|
|
@ -8,6 +8,7 @@ import VnSubToolbar from 'src/components/ui/VnSubToolbar.vue';
|
||||||
import { useArrayData } from 'src/composables/useArrayData';
|
import { useArrayData } from 'src/composables/useArrayData';
|
||||||
import { onMounted, watch } from 'vue';
|
import { onMounted, watch } from 'vue';
|
||||||
import { useRoute } from 'vue-router';
|
import { useRoute } from 'vue-router';
|
||||||
|
import useCardSize from 'src/composables/useCardSize';
|
||||||
|
|
||||||
const stateStore = useStateStore();
|
const stateStore = useStateStore();
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
|
@ -74,7 +75,9 @@ watch(
|
||||||
<QPageContainer>
|
<QPageContainer>
|
||||||
<QPage>
|
<QPage>
|
||||||
<VnSubToolbar />
|
<VnSubToolbar />
|
||||||
<div class="q-pa-md"><RouterView></RouterView></div>
|
<div :class="useCardSize()">
|
||||||
|
<RouterView></RouterView>
|
||||||
|
</div>
|
||||||
</QPage>
|
</QPage>
|
||||||
</QPageContainer>
|
</QPageContainer>
|
||||||
</template>
|
</template>
|
||||||
|
|
|
@ -8,6 +8,7 @@ import { useArrayData } from 'src/composables/useArrayData';
|
||||||
import CrudModel from 'src/components/CrudModel.vue';
|
import CrudModel from 'src/components/CrudModel.vue';
|
||||||
import FetchData from 'src/components/FetchData.vue';
|
import FetchData from 'src/components/FetchData.vue';
|
||||||
import VnSelectFilter from 'src/components/common/VnSelectFilter.vue';
|
import VnSelectFilter from 'src/components/common/VnSelectFilter.vue';
|
||||||
|
import VnCurrency from 'src/components/common/VnCurrency.vue';
|
||||||
|
|
||||||
const route = useRoute();
|
const route = useRoute();
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
|
@ -158,7 +159,12 @@ async function insert() {
|
||||||
</template>
|
</template>
|
||||||
<template #body-cell-amount="{ row }">
|
<template #body-cell-amount="{ row }">
|
||||||
<QTd>
|
<QTd>
|
||||||
<QInput v-model="row.amount" clearable clear-icon="close" />
|
<VnCurrency
|
||||||
|
v-model="row.amount"
|
||||||
|
:is-outlined="false"
|
||||||
|
clearable
|
||||||
|
clear-icon="close"
|
||||||
|
/>
|
||||||
</QTd>
|
</QTd>
|
||||||
</template>
|
</template>
|
||||||
<template #body-cell-foreignvalue="{ row }">
|
<template #body-cell-foreignvalue="{ row }">
|
||||||
|
|
|
@ -209,9 +209,9 @@ function getLink(param) {
|
||||||
<!--Basic Data-->
|
<!--Basic Data-->
|
||||||
<QCard class="vn-one">
|
<QCard class="vn-one">
|
||||||
<QCardSection class="q-pa-none">
|
<QCardSection class="q-pa-none">
|
||||||
<a class="header" :href="getLink('basic-data')">
|
<a class="header header-link" :href="getLink('basic-data')">
|
||||||
{{ t('invoiceIn.pageTitles.basicData') }}
|
{{ t('invoiceIn.pageTitles.basicData') }}
|
||||||
<QIcon name="open_in_new" color="primary" />
|
<QIcon name="open_in_new" />
|
||||||
</a>
|
</a>
|
||||||
</QCardSection>
|
</QCardSection>
|
||||||
<VnLv
|
<VnLv
|
||||||
|
@ -233,9 +233,9 @@ function getLink(param) {
|
||||||
</QCard>
|
</QCard>
|
||||||
<QCard class="vn-one">
|
<QCard class="vn-one">
|
||||||
<QCardSection class="q-pa-none">
|
<QCardSection class="q-pa-none">
|
||||||
<a class="header" :href="getLink('basic-data')">
|
<a class="header header-link" :href="getLink('basic-data')">
|
||||||
{{ t('invoiceIn.pageTitles.basicData') }}
|
{{ t('invoiceIn.pageTitles.basicData') }}
|
||||||
<QIcon name="open_in_new" color="primary" />
|
<QIcon name="open_in_new" />
|
||||||
</a>
|
</a>
|
||||||
</QCardSection>
|
</QCardSection>
|
||||||
<VnLv
|
<VnLv
|
||||||
|
@ -258,9 +258,9 @@ function getLink(param) {
|
||||||
</QCard>
|
</QCard>
|
||||||
<QCard class="vn-one">
|
<QCard class="vn-one">
|
||||||
<QCardSection class="q-pa-none">
|
<QCardSection class="q-pa-none">
|
||||||
<a class="header" :href="getLink('basic-data')">
|
<a class="header header-link" :href="getLink('basic-data')">
|
||||||
{{ t('invoiceIn.pageTitles.basicData') }}
|
{{ t('invoiceIn.pageTitles.basicData') }}
|
||||||
<QIcon name="open_in_new" color="primary" />
|
<QIcon name="open_in_new" />
|
||||||
</a>
|
</a>
|
||||||
</QCardSection>
|
</QCardSection>
|
||||||
<VnLv
|
<VnLv
|
||||||
|
@ -275,16 +275,17 @@ function getLink(param) {
|
||||||
:label="t('invoiceIn.summary.company')"
|
:label="t('invoiceIn.summary.company')"
|
||||||
:value="invoiceIn.company?.code"
|
:value="invoiceIn.company?.code"
|
||||||
/>
|
/>
|
||||||
<VnLv
|
<QCheckbox
|
||||||
:label="t('invoiceIn.summary.booked')"
|
:label="t('invoiceIn.summary.booked')"
|
||||||
:value="invoiceIn.isBooked"
|
v-model="invoiceIn.isBooked"
|
||||||
|
:disable="true"
|
||||||
/>
|
/>
|
||||||
</QCard>
|
</QCard>
|
||||||
<QCard class="vn-one">
|
<QCard class="vn-one">
|
||||||
<QCardSection class="q-pa-none">
|
<QCardSection class="q-pa-none">
|
||||||
<a class="header" :href="getLink('basic-data')">
|
<a class="header header-link" :href="getLink('basic-data')">
|
||||||
{{ t('invoiceIn.pageTitles.basicData') }}
|
{{ t('invoiceIn.pageTitles.basicData') }}
|
||||||
<QIcon name="open_in_new" color="primary" />
|
<QIcon name="open_in_new" />
|
||||||
</a>
|
</a>
|
||||||
</QCardSection>
|
</QCardSection>
|
||||||
<QCardSection class="q-pa-none">
|
<QCardSection class="q-pa-none">
|
||||||
|
@ -318,9 +319,9 @@ function getLink(param) {
|
||||||
</QCard>
|
</QCard>
|
||||||
<!--Vat-->
|
<!--Vat-->
|
||||||
<QCard v-if="invoiceIn.invoiceInTax.length">
|
<QCard v-if="invoiceIn.invoiceInTax.length">
|
||||||
<a class="header" :href="getLink('vat')">
|
<a class="header header-link" :href="getLink('vat')">
|
||||||
{{ t('invoiceIn.card.vat') }}
|
{{ t('invoiceIn.card.vat') }}
|
||||||
<QIcon name="open_in_new" color="primary" />
|
<QIcon name="open_in_new" />
|
||||||
</a>
|
</a>
|
||||||
<QTable
|
<QTable
|
||||||
:columns="vatColumns"
|
:columns="vatColumns"
|
||||||
|
@ -351,9 +352,9 @@ function getLink(param) {
|
||||||
</QCard>
|
</QCard>
|
||||||
<!--Due Day-->
|
<!--Due Day-->
|
||||||
<QCard v-if="invoiceIn.invoiceInDueDay.length">
|
<QCard v-if="invoiceIn.invoiceInDueDay.length">
|
||||||
<a class="header" :href="getLink('due-day')">
|
<a class="header header-link" :href="getLink('due-day')">
|
||||||
{{ t('invoiceIn.card.dueDay') }}
|
{{ t('invoiceIn.card.dueDay') }}
|
||||||
<QIcon name="open_in_new" color="primary" />
|
<QIcon name="open_in_new" />
|
||||||
</a>
|
</a>
|
||||||
<QTable
|
<QTable
|
||||||
class="full-width"
|
class="full-width"
|
||||||
|
@ -381,9 +382,9 @@ function getLink(param) {
|
||||||
</QCard>
|
</QCard>
|
||||||
<!--Intrastat-->
|
<!--Intrastat-->
|
||||||
<QCard v-if="invoiceIn.invoiceInIntrastat.length">
|
<QCard v-if="invoiceIn.invoiceInIntrastat.length">
|
||||||
<a class="header" :href="getUrl('intrastat')">
|
<a class="header header-link" :href="getLink('intrastat')">
|
||||||
{{ t('invoiceIn.card.intrastat') }}
|
{{ t('invoiceIn.card.intrastat') }}
|
||||||
<QIcon name="open_in_new" color="primary" />
|
<QIcon name="open_in_new" />
|
||||||
</a>
|
</a>
|
||||||
<QTable
|
<QTable
|
||||||
:columns="intrastatColumns"
|
:columns="intrastatColumns"
|
||||||
|
|
|
@ -9,6 +9,7 @@ import { toCurrency } from 'src/filters';
|
||||||
import FetchData from 'src/components/FetchData.vue';
|
import FetchData from 'src/components/FetchData.vue';
|
||||||
import VnSelectFilter from 'src/components/common/VnSelectFilter.vue';
|
import VnSelectFilter from 'src/components/common/VnSelectFilter.vue';
|
||||||
import CrudModel from 'src/components/CrudModel.vue';
|
import CrudModel from 'src/components/CrudModel.vue';
|
||||||
|
import VnCurrency from 'src/components/common/VnCurrency.vue';
|
||||||
|
|
||||||
const route = useRoute();
|
const route = useRoute();
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
|
@ -225,7 +226,7 @@ async function addExpense() {
|
||||||
</template>
|
</template>
|
||||||
<template #body-cell-taxablebase="{ row }">
|
<template #body-cell-taxablebase="{ row }">
|
||||||
<QTd>
|
<QTd>
|
||||||
<QInput
|
<VnCurrency
|
||||||
:class="{
|
:class="{
|
||||||
'no-pointer-events': isNotEuro(invoiceIn.currency.code),
|
'no-pointer-events': isNotEuro(invoiceIn.currency.code),
|
||||||
}"
|
}"
|
||||||
|
@ -234,11 +235,7 @@ async function addExpense() {
|
||||||
clear-icon="close"
|
clear-icon="close"
|
||||||
v-model="row.taxableBase"
|
v-model="row.taxableBase"
|
||||||
clearable
|
clearable
|
||||||
>
|
/>
|
||||||
<template #prepend>
|
|
||||||
<QIcon name="euro" size="xs" flat />
|
|
||||||
</template>
|
|
||||||
</QInput>
|
|
||||||
</QTd>
|
</QTd>
|
||||||
</template>
|
</template>
|
||||||
<template #body-cell-sageiva="{ row, col }">
|
<template #body-cell-sageiva="{ row, col }">
|
||||||
|
@ -328,7 +325,7 @@ async function addExpense() {
|
||||||
</VnSelectFilter>
|
</VnSelectFilter>
|
||||||
</QItem>
|
</QItem>
|
||||||
<QItem>
|
<QItem>
|
||||||
<QInput
|
<VnCurrency
|
||||||
:label="t('Taxable base')"
|
:label="t('Taxable base')"
|
||||||
:class="{
|
:class="{
|
||||||
'no-pointer-events': isNotEuro(
|
'no-pointer-events': isNotEuro(
|
||||||
|
@ -340,11 +337,7 @@ async function addExpense() {
|
||||||
clear-icon="close"
|
clear-icon="close"
|
||||||
v-model="props.row.taxableBase"
|
v-model="props.row.taxableBase"
|
||||||
clearable
|
clearable
|
||||||
>
|
/>
|
||||||
<template #append>
|
|
||||||
<QIcon name="euro" size="xs" flat />
|
|
||||||
</template>
|
|
||||||
</QInput>
|
|
||||||
</QItem>
|
</QItem>
|
||||||
<QItem>
|
<QItem>
|
||||||
<VnSelectFilter
|
<VnSelectFilter
|
||||||
|
|
|
@ -8,6 +8,7 @@ import FetchData from 'components/FetchData.vue';
|
||||||
import VnInput from 'src/components/common/VnInput.vue';
|
import VnInput from 'src/components/common/VnInput.vue';
|
||||||
import VnInputDate from 'components/common/VnInputDate.vue';
|
import VnInputDate from 'components/common/VnInputDate.vue';
|
||||||
import { useCapitalize } from 'src/composables/useCapitalize';
|
import { useCapitalize } from 'src/composables/useCapitalize';
|
||||||
|
import VnCurrency from 'src/components/common/VnCurrency.vue';
|
||||||
|
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
|
@ -137,16 +138,7 @@ const suppliersRef = ref();
|
||||||
</QItem>
|
</QItem>
|
||||||
<QItem>
|
<QItem>
|
||||||
<QItemSection>
|
<QItemSection>
|
||||||
<VnInput
|
<VnCurrency v-model="params.amount" is-outlined />
|
||||||
:label="t('Amount')"
|
|
||||||
v-model="params.amount"
|
|
||||||
is-outlined
|
|
||||||
lazy-rules
|
|
||||||
>
|
|
||||||
<template #prepend>
|
|
||||||
<QIcon name="euro" size="sm"></QIcon>
|
|
||||||
</template>
|
|
||||||
</VnInput>
|
|
||||||
</QItemSection>
|
</QItemSection>
|
||||||
</QItem>
|
</QItem>
|
||||||
<QItem class="q-mb-md">
|
<QItem class="q-mb-md">
|
||||||
|
|
|
@ -5,6 +5,7 @@ import InvoiceOutDescriptor from './InvoiceOutDescriptor.vue';
|
||||||
import LeftMenu from 'components/LeftMenu.vue';
|
import LeftMenu from 'components/LeftMenu.vue';
|
||||||
import VnSearchbar from 'components/ui/VnSearchbar.vue';
|
import VnSearchbar from 'components/ui/VnSearchbar.vue';
|
||||||
import VnSubToolbar from 'src/components/ui/VnSubToolbar.vue';
|
import VnSubToolbar from 'src/components/ui/VnSubToolbar.vue';
|
||||||
|
import useCardSize from 'src/composables/useCardSize';
|
||||||
|
|
||||||
const stateStore = useStateStore();
|
const stateStore = useStateStore();
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
|
@ -28,7 +29,9 @@ const { t } = useI18n();
|
||||||
<QPageContainer>
|
<QPageContainer>
|
||||||
<QPage>
|
<QPage>
|
||||||
<VnSubToolbar />
|
<VnSubToolbar />
|
||||||
<div class="q-pa-md"><RouterView></RouterView></div>
|
<div :class="useCardSize()">
|
||||||
|
<RouterView></RouterView>
|
||||||
|
</div>
|
||||||
</QPage>
|
</QPage>
|
||||||
</QPageContainer>
|
</QPageContainer>
|
||||||
</template>
|
</template>
|
||||||
|
|
|
@ -101,9 +101,10 @@ const ticketsColumns = ref([
|
||||||
</template>
|
</template>
|
||||||
<template #body="{ entity: { invoiceOut } }">
|
<template #body="{ entity: { invoiceOut } }">
|
||||||
<QCard class="vn-one">
|
<QCard class="vn-one">
|
||||||
<div class="header">
|
<a class="header header-link">
|
||||||
{{ t('invoiceOut.pageTitles.basicData') }}
|
{{ t('invoiceOut.pageTitles.basicData') }}
|
||||||
</div>
|
<QIcon name="open_in_new" />
|
||||||
|
</a>
|
||||||
<VnLv
|
<VnLv
|
||||||
:label="t('invoiceOut.summary.issued')"
|
:label="t('invoiceOut.summary.issued')"
|
||||||
:value="toDate(invoiceOut.issued)"
|
:value="toDate(invoiceOut.issued)"
|
||||||
|
@ -126,9 +127,10 @@ const ticketsColumns = ref([
|
||||||
/>
|
/>
|
||||||
</QCard>
|
</QCard>
|
||||||
<QCard class="vn-three">
|
<QCard class="vn-three">
|
||||||
<div class="header">
|
<a class="header header-link">
|
||||||
{{ t('invoiceOut.summary.taxBreakdown') }}
|
{{ t('invoiceOut.summary.taxBreakdown') }}
|
||||||
</div>
|
<QIcon name="open_in_new" />
|
||||||
|
</a>
|
||||||
<QTable :columns="taxColumns" :rows="invoiceOut.taxesBreakdown" flat>
|
<QTable :columns="taxColumns" :rows="invoiceOut.taxesBreakdown" flat>
|
||||||
<template #header="props">
|
<template #header="props">
|
||||||
<QTr :props="props">
|
<QTr :props="props">
|
||||||
|
@ -140,9 +142,10 @@ const ticketsColumns = ref([
|
||||||
</QTable>
|
</QTable>
|
||||||
</QCard>
|
</QCard>
|
||||||
<QCard class="vn-three">
|
<QCard class="vn-three">
|
||||||
<div class="header">
|
<a class="header header-link">
|
||||||
{{ t('invoiceOut.summary.tickets') }}
|
{{ t('invoiceOut.summary.tickets') }}
|
||||||
</div>
|
<QIcon name="open_in_new" />
|
||||||
|
</a>
|
||||||
<QTable v-if="tickets" :columns="ticketsColumns" :rows="tickets" flat>
|
<QTable v-if="tickets" :columns="ticketsColumns" :rows="tickets" flat>
|
||||||
<template #header="props">
|
<template #header="props">
|
||||||
<QTr :props="props">
|
<QTr :props="props">
|
||||||
|
|
|
@ -6,6 +6,7 @@ import FetchData from 'components/FetchData.vue';
|
||||||
import VnFilterPanel from 'src/components/ui/VnFilterPanel.vue';
|
import VnFilterPanel from 'src/components/ui/VnFilterPanel.vue';
|
||||||
import VnInput from 'src/components/common/VnInput.vue';
|
import VnInput from 'src/components/common/VnInput.vue';
|
||||||
import VnInputDate from 'components/common/VnInputDate.vue';
|
import VnInputDate from 'components/common/VnInputDate.vue';
|
||||||
|
import VnCurrency from 'src/components/common/VnCurrency.vue';
|
||||||
|
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
|
@ -57,7 +58,11 @@ function setWorkers(data) {
|
||||||
</QItem>
|
</QItem>
|
||||||
<QItem>
|
<QItem>
|
||||||
<QItemSection>
|
<QItemSection>
|
||||||
<VnInput :label="t('Amount')" v-model="params.amount" is-outlined />
|
<VnCurrency
|
||||||
|
:label="t('Amount')"
|
||||||
|
v-model="params.amount"
|
||||||
|
is-outlined
|
||||||
|
/>
|
||||||
</QItemSection>
|
</QItemSection>
|
||||||
</QItem>
|
</QItem>
|
||||||
<QItem>
|
<QItem>
|
||||||
|
|
|
@ -4,6 +4,7 @@ import { useI18n } from 'vue-i18n';
|
||||||
import VnFilterPanel from 'src/components/ui/VnFilterPanel.vue';
|
import VnFilterPanel from 'src/components/ui/VnFilterPanel.vue';
|
||||||
import VnInput from 'src/components/common/VnInput.vue';
|
import VnInput from 'src/components/common/VnInput.vue';
|
||||||
import VnInputDate from 'components/common/VnInputDate.vue';
|
import VnInputDate from 'components/common/VnInputDate.vue';
|
||||||
|
import VnCurrency from 'src/components/common/VnCurrency.vue';
|
||||||
|
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
|
@ -84,7 +85,7 @@ const props = defineProps({
|
||||||
</QItem>
|
</QItem>
|
||||||
<QItem>
|
<QItem>
|
||||||
<QItemSection>
|
<QItemSection>
|
||||||
<VnInput
|
<VnCurrency
|
||||||
v-model="params.amount"
|
v-model="params.amount"
|
||||||
:label="t('invoiceOut.negativeBases.amount')"
|
:label="t('invoiceOut.negativeBases.amount')"
|
||||||
is-outlined
|
is-outlined
|
||||||
|
|
|
@ -4,6 +4,7 @@ import VnSubToolbar from 'src/components/ui/VnSubToolbar.vue';
|
||||||
import ItemDescriptor from './ItemDescriptor.vue';
|
import ItemDescriptor from './ItemDescriptor.vue';
|
||||||
|
|
||||||
import { useStateStore } from 'stores/useStateStore';
|
import { useStateStore } from 'stores/useStateStore';
|
||||||
|
import useCardSize from 'src/composables/useCardSize';
|
||||||
|
|
||||||
const stateStore = useStateStore();
|
const stateStore = useStateStore();
|
||||||
</script>
|
</script>
|
||||||
|
@ -19,7 +20,9 @@ const stateStore = useStateStore();
|
||||||
<QPage>
|
<QPage>
|
||||||
<VnSubToolbar />
|
<VnSubToolbar />
|
||||||
|
|
||||||
<div class="q-pa-md"><RouterView></RouterView></div>
|
<div :class="useCardSize()">
|
||||||
|
<RouterView></RouterView>
|
||||||
|
</div>
|
||||||
</QPage>
|
</QPage>
|
||||||
</QPageContainer>
|
</QPageContainer>
|
||||||
</template>
|
</template>
|
||||||
|
|
|
@ -69,12 +69,12 @@ async function onSubmit() {
|
||||||
<template>
|
<template>
|
||||||
<QForm @submit="onSubmit" class="q-gutter-y-md q-pa-lg formCard">
|
<QForm @submit="onSubmit" class="q-gutter-y-md q-pa-lg formCard">
|
||||||
<VnLogo alt="Logo" fit="contain" :ratio="16 / 9" class="q-mb-md" />
|
<VnLogo alt="Logo" fit="contain" :ratio="16 / 9" class="q-mb-md" />
|
||||||
|
|
||||||
<VnInput
|
<VnInput
|
||||||
v-model="username"
|
v-model="username"
|
||||||
:label="t('login.username')"
|
:label="t('login.username')"
|
||||||
lazy-rules
|
lazy-rules
|
||||||
:rules="[(val) => (val && val.length > 0) || t('login.fieldRequired')]"
|
:rules="[(val) => (val && val.length > 0) || t('login.fieldRequired')]"
|
||||||
|
color="primary"
|
||||||
/>
|
/>
|
||||||
<VnInput
|
<VnInput
|
||||||
type="password"
|
type="password"
|
||||||
|
@ -82,9 +82,8 @@ async function onSubmit() {
|
||||||
:label="t('login.password')"
|
:label="t('login.password')"
|
||||||
lazy-rules
|
lazy-rules
|
||||||
:rules="[(val) => (val && val.length > 0) || t('login.fieldRequired')]"
|
:rules="[(val) => (val && val.length > 0) || t('login.fieldRequired')]"
|
||||||
|
class="red"
|
||||||
/>
|
/>
|
||||||
<QToggle v-model="keepLogin" :label="t('login.keepLogin')" />
|
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<QBtn
|
<QBtn
|
||||||
:label="t('login.submit')"
|
:label="t('login.submit')"
|
||||||
|
@ -95,6 +94,7 @@ async function onSubmit() {
|
||||||
unelevated
|
unelevated
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
<QToggle v-model="keepLogin" :label="t('login.keepLogin')" />
|
||||||
</QForm>
|
</QForm>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
@ -104,6 +104,9 @@ async function onSubmit() {
|
||||||
min-width: 300px;
|
min-width: 300px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.q-input {
|
||||||
|
color: $primary;
|
||||||
|
}
|
||||||
@media (max-width: $breakpoint-xs-max) {
|
@media (max-width: $breakpoint-xs-max) {
|
||||||
.formCard {
|
.formCard {
|
||||||
min-width: 100%;
|
min-width: 100%;
|
||||||
|
|
|
@ -99,6 +99,8 @@ onMounted(async () => {
|
||||||
</i18n>
|
</i18n>
|
||||||
|
|
||||||
<style lang="scss">
|
<style lang="scss">
|
||||||
|
$vnColor: #8ebb27;
|
||||||
|
|
||||||
.formCard {
|
.formCard {
|
||||||
max-width: 1500px;
|
max-width: 1500px;
|
||||||
min-width: 700px;
|
min-width: 700px;
|
||||||
|
|
|
@ -71,11 +71,11 @@ const filter = {
|
||||||
<template #body="{ entity }">
|
<template #body="{ entity }">
|
||||||
<QCard class="vn-one">
|
<QCard class="vn-one">
|
||||||
<RouterLink
|
<RouterLink
|
||||||
class="header"
|
class="header header-link"
|
||||||
:to="{ name: 'ShelvingBasicData', params: { id: entityId } }"
|
:to="{ name: 'ShelvingBasicData', params: { id: entityId } }"
|
||||||
>
|
>
|
||||||
{{ t('shelving.pageTitles.basicData') }}
|
{{ t('shelving.pageTitles.basicData') }}
|
||||||
<QIcon name="open_in_new" color="primary" />
|
<QIcon name="open_in_new" />
|
||||||
</RouterLink>
|
</RouterLink>
|
||||||
<VnLv :label="t('shelving.summary.code')" :value="entity.code" />
|
<VnLv :label="t('shelving.summary.code')" :value="entity.code" />
|
||||||
<VnLv
|
<VnLv
|
||||||
|
|
|
@ -5,6 +5,7 @@ import VnSearchbar from 'src/components/ui/VnSearchbar.vue';
|
||||||
import LeftMenu from 'components/LeftMenu.vue';
|
import LeftMenu from 'components/LeftMenu.vue';
|
||||||
import SupplierDescriptor from './SupplierDescriptor.vue';
|
import SupplierDescriptor from './SupplierDescriptor.vue';
|
||||||
import VnSubToolbar from 'src/components/ui/VnSubToolbar.vue';
|
import VnSubToolbar from 'src/components/ui/VnSubToolbar.vue';
|
||||||
|
import useCardSize from 'src/composables/useCardSize';
|
||||||
|
|
||||||
const stateStore = useStateStore();
|
const stateStore = useStateStore();
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
|
@ -30,7 +31,9 @@ const { t } = useI18n();
|
||||||
<QPageContainer>
|
<QPageContainer>
|
||||||
<QPage>
|
<QPage>
|
||||||
<VnSubToolbar />
|
<VnSubToolbar />
|
||||||
<div class="q-pa-md"><RouterView></RouterView></div>
|
<div :class="useCardSize()">
|
||||||
|
<RouterView></RouterView>
|
||||||
|
</div>
|
||||||
</QPage>
|
</QPage>
|
||||||
</QPageContainer>
|
</QPageContainer>
|
||||||
</template>
|
</template>
|
||||||
|
|
|
@ -52,7 +52,7 @@ const isAdministrative = computed(() => {
|
||||||
@on-fetch="(data) => setData(data)"
|
@on-fetch="(data) => setData(data)"
|
||||||
>
|
>
|
||||||
<template #header-left>
|
<template #header-left>
|
||||||
<a v-if="isAdministrative" class="header link" :href="supplierUrl">
|
<a v-if="isAdministrative" class="header header-link" :href="supplierUrl">
|
||||||
<QIcon name="open_in_new" color="white" size="sm" />
|
<QIcon name="open_in_new" color="white" size="sm" />
|
||||||
</a>
|
</a>
|
||||||
</template>
|
</template>
|
||||||
|
@ -62,9 +62,13 @@ const isAdministrative = computed(() => {
|
||||||
|
|
||||||
<template #body>
|
<template #body>
|
||||||
<QCard class="vn-one">
|
<QCard class="vn-one">
|
||||||
<a v-if="isAdministrative" class="header link" :href="supplierUrl">
|
<a
|
||||||
|
v-if="isAdministrative"
|
||||||
|
class="header header-link"
|
||||||
|
:href="`#/supplier/${entityId}/basic-data`"
|
||||||
|
>
|
||||||
{{ t('globals.summary.basicData') }}
|
{{ t('globals.summary.basicData') }}
|
||||||
<QIcon name="open_in_new" color="primary" />
|
<QIcon name="open_in_new" />
|
||||||
</a>
|
</a>
|
||||||
<span v-else> {{ t('globals.summary.basicData') }}</span>
|
<span v-else> {{ t('globals.summary.basicData') }}</span>
|
||||||
<VnLv label="Id" :value="supplier.id" />
|
<VnLv label="Id" :value="supplier.id" />
|
||||||
|
@ -82,32 +86,25 @@ const isAdministrative = computed(() => {
|
||||||
<span> {{ dashIfEmpty(supplier.note) }} </span>
|
<span> {{ dashIfEmpty(supplier.note) }} </span>
|
||||||
</template>
|
</template>
|
||||||
</VnLv>
|
</VnLv>
|
||||||
|
|
||||||
<VnLv :label="t('supplier.summary.verified')" class="q-mb-xs">
|
|
||||||
<template #value>
|
|
||||||
<QCheckbox
|
<QCheckbox
|
||||||
|
:label="t('supplier.summary.verified')"
|
||||||
v-model="supplier.isSerious"
|
v-model="supplier.isSerious"
|
||||||
dense
|
:disable="true"
|
||||||
disable
|
|
||||||
class="full-width q-mb-xs"
|
|
||||||
/>
|
/>
|
||||||
</template>
|
|
||||||
</VnLv>
|
|
||||||
<VnLv :label="t('supplier.summary.isActive')" class="q-mb-xs">
|
|
||||||
<template #value>
|
|
||||||
<QCheckbox
|
<QCheckbox
|
||||||
|
:label="t('supplier.summary.isActive')"
|
||||||
v-model="supplier.isActive"
|
v-model="supplier.isActive"
|
||||||
dense
|
:disable="true"
|
||||||
disable
|
|
||||||
class="full-width q-mb-xs"
|
|
||||||
/>
|
/>
|
||||||
</template>
|
|
||||||
</VnLv>
|
|
||||||
</QCard>
|
</QCard>
|
||||||
<QCard class="vn-one">
|
<QCard class="vn-one">
|
||||||
<a v-if="isAdministrative" class="header link" :href="supplierUrl">
|
<a
|
||||||
|
v-if="isAdministrative"
|
||||||
|
class="header header-link"
|
||||||
|
:href="`#/supplier/${entityId}/billing-data`"
|
||||||
|
>
|
||||||
{{ t('supplier.summary.billingData') }}
|
{{ t('supplier.summary.billingData') }}
|
||||||
<QIcon name="open_in_new" color="primary" />
|
<QIcon name="open_in_new" />
|
||||||
</a>
|
</a>
|
||||||
<span v-else> {{ t('supplier.summary.billingData') }}</span>
|
<span v-else> {{ t('supplier.summary.billingData') }}</span>
|
||||||
<VnLv
|
<VnLv
|
||||||
|
@ -124,9 +121,13 @@ const isAdministrative = computed(() => {
|
||||||
<VnLv :label="t('supplier.summary.account')" :value="supplier.account" />
|
<VnLv :label="t('supplier.summary.account')" :value="supplier.account" />
|
||||||
</QCard>
|
</QCard>
|
||||||
<QCard class="vn-one">
|
<QCard class="vn-one">
|
||||||
<a v-if="isAdministrative" class="header link" :href="supplierUrl">
|
<a
|
||||||
|
v-if="isAdministrative"
|
||||||
|
class="header header-link"
|
||||||
|
:href="`#/supplier/${entityId}/fiscal-data`"
|
||||||
|
>
|
||||||
{{ t('supplier.summary.fiscalData') }}
|
{{ t('supplier.summary.fiscalData') }}
|
||||||
<QIcon name="open_in_new" color="primary" />
|
<QIcon name="open_in_new" />
|
||||||
</a>
|
</a>
|
||||||
<span v-else> {{ t('supplier.summary.fiscalData') }}</span>
|
<span v-else> {{ t('supplier.summary.fiscalData') }}</span>
|
||||||
<VnLv
|
<VnLv
|
||||||
|
@ -155,9 +156,13 @@ const isAdministrative = computed(() => {
|
||||||
/>
|
/>
|
||||||
</QCard>
|
</QCard>
|
||||||
<QCard class="vn-one">
|
<QCard class="vn-one">
|
||||||
<a v-if="isAdministrative" class="header link" :href="supplierUrl">
|
<a
|
||||||
|
v-if="isAdministrative"
|
||||||
|
class="header header-link"
|
||||||
|
:href="`#/supplier/${entityId}/fiscal-data`"
|
||||||
|
>
|
||||||
{{ t('supplier.summary.fiscalAddress') }}
|
{{ t('supplier.summary.fiscalAddress') }}
|
||||||
<QIcon name="open_in_new" color="primary" />
|
<QIcon name="open_in_new" />
|
||||||
</a>
|
</a>
|
||||||
<span v-else> {{ t('supplier.summary.fiscalAddress') }}</span>
|
<span v-else> {{ t('supplier.summary.fiscalAddress') }}</span>
|
||||||
<VnLv :label="t('supplier.summary.socialName')" :value="supplier.name" />
|
<VnLv :label="t('supplier.summary.socialName')" :value="supplier.name" />
|
||||||
|
|
|
@ -5,6 +5,7 @@ import TicketDescriptor from './TicketDescriptor.vue';
|
||||||
import LeftMenu from 'components/LeftMenu.vue';
|
import LeftMenu from 'components/LeftMenu.vue';
|
||||||
import VnSearchbar from 'src/components/ui/VnSearchbar.vue';
|
import VnSearchbar from 'src/components/ui/VnSearchbar.vue';
|
||||||
import VnSubToolbar from 'src/components/ui/VnSubToolbar.vue';
|
import VnSubToolbar from 'src/components/ui/VnSubToolbar.vue';
|
||||||
|
import useCardSize from 'src/composables/useCardSize';
|
||||||
|
|
||||||
const stateStore = useStateStore();
|
const stateStore = useStateStore();
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
|
@ -29,7 +30,9 @@ const { t } = useI18n();
|
||||||
<QPage>
|
<QPage>
|
||||||
<VnSubToolbar />
|
<VnSubToolbar />
|
||||||
|
|
||||||
<div class="q-pa-md"><RouterView></RouterView></div>
|
<div :class="useCardSize()">
|
||||||
|
<RouterView></RouterView>
|
||||||
|
</div>
|
||||||
</QPage>
|
</QPage>
|
||||||
</QPageContainer>
|
</QPageContainer>
|
||||||
</template>
|
</template>
|
||||||
|
|
|
@ -88,14 +88,6 @@ const setData = (entity) =>
|
||||||
<TicketDescriptorMenu :ticket="entity" />
|
<TicketDescriptorMenu :ticket="entity" />
|
||||||
</template>
|
</template>
|
||||||
<template #body="{ entity }">
|
<template #body="{ entity }">
|
||||||
<VnLv v-if="entity.ticketState" :label="t('ticket.card.state')">
|
|
||||||
<template #value>
|
|
||||||
<QBadge :color="entity.ticketState.state.classColor">
|
|
||||||
{{ entity.ticketState.state.name }}
|
|
||||||
</QBadge>
|
|
||||||
</template>
|
|
||||||
</VnLv>
|
|
||||||
<VnLv :label="t('ticket.card.shipped')" :value="toDate(entity.shipped)" />
|
|
||||||
<VnLv :label="t('ticket.card.customerId')">
|
<VnLv :label="t('ticket.card.customerId')">
|
||||||
<template #value>
|
<template #value>
|
||||||
<span class="link">
|
<span class="link">
|
||||||
|
@ -104,6 +96,13 @@ const setData = (entity) =>
|
||||||
</span>
|
</span>
|
||||||
</template>
|
</template>
|
||||||
</VnLv>
|
</VnLv>
|
||||||
|
<VnLv v-if="entity.ticketState" :label="t('ticket.card.state')">
|
||||||
|
<template #value>
|
||||||
|
<QBadge :color="entity.ticketState.state.classColor">
|
||||||
|
{{ entity.ticketState.state.name }}
|
||||||
|
</QBadge>
|
||||||
|
</template>
|
||||||
|
</VnLv>
|
||||||
<VnLv :label="t('ticket.summary.salesPerson')">
|
<VnLv :label="t('ticket.summary.salesPerson')">
|
||||||
<template #value>
|
<template #value>
|
||||||
<VnUserLink
|
<VnUserLink
|
||||||
|
@ -112,12 +111,14 @@ const setData = (entity) =>
|
||||||
/>
|
/>
|
||||||
</template>
|
</template>
|
||||||
</VnLv>
|
</VnLv>
|
||||||
<VnLv :label="t('ticket.card.warehouse')" :value="entity.warehouse?.name" />
|
<VnLv :label="t('ticket.card.shipped')" :value="toDate(entity.shipped)" />
|
||||||
<VnLv
|
<VnLv
|
||||||
v-if="entity.agencyMode"
|
v-if="entity.agencyMode"
|
||||||
:label="t('ticket.card.agency')"
|
:label="t('ticket.card.agency')"
|
||||||
:value="entity.agencyMode.name"
|
:value="entity.agencyMode.name"
|
||||||
/>
|
/>
|
||||||
|
<VnLv :label="t('ticket.card.warehouse')" :value="entity.warehouse?.name" />
|
||||||
|
<VnLv :label="t('ticket.card.alias')" :value="entity.nickname" />
|
||||||
</template>
|
</template>
|
||||||
<template #icons="{ entity }">
|
<template #icons="{ entity }">
|
||||||
<QCardActions>
|
<QCardActions>
|
||||||
|
|
|
@ -147,9 +147,9 @@ async function changeState(value) {
|
||||||
</div>
|
</div>
|
||||||
</QCard>
|
</QCard>
|
||||||
<QCard class="vn-one">
|
<QCard class="vn-one">
|
||||||
<a class="header link" :href="ticketUrl + 'basic-data/step-one'">
|
<a class="header header-link" :href="ticketUrl + 'basic-data/step-one'">
|
||||||
{{ t('globals.summary.basicData') }}
|
{{ t('globals.summary.basicData') }}
|
||||||
<QIcon name="open_in_new" color="primary" />
|
<QIcon name="open_in_new" />
|
||||||
</a>
|
</a>
|
||||||
<VnLv :label="t('ticket.summary.state')">
|
<VnLv :label="t('ticket.summary.state')">
|
||||||
<template #value>
|
<template #value>
|
||||||
|
@ -193,9 +193,9 @@ async function changeState(value) {
|
||||||
/>
|
/>
|
||||||
</QCard>
|
</QCard>
|
||||||
<QCard class="vn-one">
|
<QCard class="vn-one">
|
||||||
<a class="header link" :href="ticketUrl + 'basic-data/step-one'">
|
<a class="header header-link" :href="ticketUrl + 'basic-data/step-one'">
|
||||||
{{ t('globals.summary.basicData') }}
|
{{ t('globals.summary.basicData') }}
|
||||||
<QIcon name="open_in_new" color="primary" />
|
<QIcon name="open_in_new" />
|
||||||
</a>
|
</a>
|
||||||
<VnLv
|
<VnLv
|
||||||
:label="t('ticket.summary.shipped')"
|
:label="t('ticket.summary.shipped')"
|
||||||
|
@ -236,9 +236,9 @@ async function changeState(value) {
|
||||||
/>
|
/>
|
||||||
</QCard>
|
</QCard>
|
||||||
<QCard class="vn-one">
|
<QCard class="vn-one">
|
||||||
<a class="header link" :href="ticketUrl + 'observation'">
|
<a class="header header-link" :href="ticketUrl + 'observation'">
|
||||||
{{ t('ticket.pageTitles.notes') }}
|
{{ t('ticket.pageTitles.notes') }}
|
||||||
<QIcon name="open_in_new" color="primary" />
|
<QIcon name="open_in_new" />
|
||||||
</a>
|
</a>
|
||||||
<VnLv
|
<VnLv
|
||||||
v-for="note in ticket.notes"
|
v-for="note in ticket.notes"
|
||||||
|
@ -258,9 +258,9 @@ async function changeState(value) {
|
||||||
</VnLv>
|
</VnLv>
|
||||||
</QCard>
|
</QCard>
|
||||||
<QCard class="vn-max">
|
<QCard class="vn-max">
|
||||||
<a class="header link" :href="ticketUrl + 'sale'">
|
<a class="header header-link" :href="ticketUrl + 'sale'">
|
||||||
{{ t('ticket.summary.saleLines') }}
|
{{ t('ticket.summary.saleLines') }}
|
||||||
<QIcon name="open_in_new" color="primary" />
|
<QIcon name="open_in_new" />
|
||||||
</a>
|
</a>
|
||||||
<QTable :rows="ticket.sales">
|
<QTable :rows="ticket.sales">
|
||||||
<template #header="props">
|
<template #header="props">
|
||||||
|
@ -396,9 +396,9 @@ async function changeState(value) {
|
||||||
class="vn-max"
|
class="vn-max"
|
||||||
v-if="ticket.packagings.length > 0 || ticket.services.length > 0"
|
v-if="ticket.packagings.length > 0 || ticket.services.length > 0"
|
||||||
>
|
>
|
||||||
<a class="header link" :href="ticketUrl + 'package'">
|
<a class="header header-link" :href="ticketUrl + 'package'">
|
||||||
{{ t('globals.packages') }}
|
{{ t('globals.packages') }}
|
||||||
<QIcon name="open_in_new" color="primary" />
|
<QIcon name="open_in_new" />
|
||||||
</a>
|
</a>
|
||||||
<QTable :rows="ticket.packagings" flat>
|
<QTable :rows="ticket.packagings" flat>
|
||||||
<template #header="props">
|
<template #header="props">
|
||||||
|
@ -417,9 +417,9 @@ async function changeState(value) {
|
||||||
</template>
|
</template>
|
||||||
</QTable>
|
</QTable>
|
||||||
|
|
||||||
<a class="header link q-mt-xl" :href="ticketUrl + 'service'">
|
<a class="header header-link q-mt-xl" :href="ticketUrl + 'service'">
|
||||||
{{ t('ticket.summary.service') }}
|
{{ t('ticket.summary.service') }}
|
||||||
<QIcon name="open_in_new" color="primary" />
|
<QIcon name="open_in_new" />
|
||||||
</a>
|
</a>
|
||||||
<QTable :rows="ticket.services" flat>
|
<QTable :rows="ticket.services" flat>
|
||||||
<template #header="props">
|
<template #header="props">
|
||||||
|
|
|
@ -3,6 +3,7 @@ import { useStateStore } from 'stores/useStateStore';
|
||||||
import TravelDescriptor from './TravelDescriptor.vue';
|
import TravelDescriptor from './TravelDescriptor.vue';
|
||||||
import LeftMenu from 'components/LeftMenu.vue';
|
import LeftMenu from 'components/LeftMenu.vue';
|
||||||
import VnSubToolbar from 'src/components/ui/VnSubToolbar.vue';
|
import VnSubToolbar from 'src/components/ui/VnSubToolbar.vue';
|
||||||
|
import useCardSize from 'src/composables/useCardSize';
|
||||||
|
|
||||||
const stateStore = useStateStore();
|
const stateStore = useStateStore();
|
||||||
</script>
|
</script>
|
||||||
|
@ -17,7 +18,9 @@ const stateStore = useStateStore();
|
||||||
<QPageContainer>
|
<QPageContainer>
|
||||||
<QPage>
|
<QPage>
|
||||||
<VnSubToolbar />
|
<VnSubToolbar />
|
||||||
<div class="q-pa-md"><RouterView></RouterView></div>
|
<div :class="useCardSize()">
|
||||||
|
<RouterView></RouterView>
|
||||||
|
</div>
|
||||||
</QPage>
|
</QPage>
|
||||||
</QPageContainer>
|
</QPageContainer>
|
||||||
</template>
|
</template>
|
||||||
|
|
|
@ -269,15 +269,11 @@ async function setTravelData(travelData) {
|
||||||
:label="t('globals.wareHouseOut')"
|
:label="t('globals.wareHouseOut')"
|
||||||
:value="travel.warehouseOut?.name"
|
:value="travel.warehouseOut?.name"
|
||||||
/>
|
/>
|
||||||
<VnLv :label="t('travel.summary.delivered')" class="q-mb-xs">
|
<QCheckbox
|
||||||
<template #value>
|
:label="t('travel.summary.delivered')"
|
||||||
<QIcon
|
v-model="travel.isDelivered"
|
||||||
:name="travel.isDelivered ? 'check' : 'close'"
|
:disable="true"
|
||||||
:color="travel.isDelivered ? 'positive' : 'negative'"
|
|
||||||
size="sm"
|
|
||||||
/>
|
/>
|
||||||
</template>
|
|
||||||
</VnLv>
|
|
||||||
</QCard>
|
</QCard>
|
||||||
<QCard class="vn-one">
|
<QCard class="vn-one">
|
||||||
<VnLv :label="t('globals.landed')" :value="toDate(travel.landed)" />
|
<VnLv :label="t('globals.landed')" :value="toDate(travel.landed)" />
|
||||||
|
@ -285,15 +281,11 @@ async function setTravelData(travelData) {
|
||||||
:label="t('globals.wareHouseIn')"
|
:label="t('globals.wareHouseIn')"
|
||||||
:value="travel.warehouseIn?.name"
|
:value="travel.warehouseIn?.name"
|
||||||
/>
|
/>
|
||||||
<VnLv :label="t('travel.summary.received')" class="q-mb-xs">
|
<QCheckbox
|
||||||
<template #value>
|
:label="t('travel.summary.received')"
|
||||||
<QIcon
|
v-model="travel.isReceived"
|
||||||
:name="travel.isReceived ? 'check' : 'close'"
|
:disable="true"
|
||||||
:color="travel.isReceived ? 'positive' : 'negative'"
|
|
||||||
size="sm"
|
|
||||||
/>
|
/>
|
||||||
</template>
|
|
||||||
</VnLv>
|
|
||||||
</QCard>
|
</QCard>
|
||||||
<QCard class="vn-one">
|
<QCard class="vn-one">
|
||||||
<VnLv :label="t('globals.agency')" :value="travel.agency?.name" />
|
<VnLv :label="t('globals.agency')" :value="travel.agency?.name" />
|
||||||
|
@ -302,7 +294,7 @@ async function setTravelData(travelData) {
|
||||||
<VnLv :label="t('globals.totalEntries')" :value="travel.totalEntries" />
|
<VnLv :label="t('globals.totalEntries')" :value="travel.totalEntries" />
|
||||||
</QCard>
|
</QCard>
|
||||||
<QCard class="full-width" v-if="entriesTableRows.length > 0">
|
<QCard class="full-width" v-if="entriesTableRows.length > 0">
|
||||||
<span class="header">
|
<span class="header header-link">
|
||||||
{{ t('travel.summary.entries') }}
|
{{ t('travel.summary.entries') }}
|
||||||
</span>
|
</span>
|
||||||
<QTable
|
<QTable
|
||||||
|
@ -361,14 +353,14 @@ async function setTravelData(travelData) {
|
||||||
|
|
||||||
<QCard class="full-width" v-if="thermographs.length > 0">
|
<QCard class="full-width" v-if="thermographs.length > 0">
|
||||||
<RouterLink
|
<RouterLink
|
||||||
class="header"
|
class="header header-link"
|
||||||
:to="{
|
:to="{
|
||||||
name: 'TravelThermographsIndex',
|
name: 'TravelThermographsIndex',
|
||||||
params: { id: travel.id },
|
params: { id: travel.id },
|
||||||
}"
|
}"
|
||||||
>
|
>
|
||||||
{{ t('travel.summary.thermographs') }}
|
{{ t('travel.summary.thermographs') }}
|
||||||
<QIcon name="open_in_new" color="primary" />
|
<QIcon name="open_in_new" />
|
||||||
</RouterLink>
|
</RouterLink>
|
||||||
<QTable
|
<QTable
|
||||||
:rows="thermographs"
|
:rows="thermographs"
|
||||||
|
|
|
@ -3,6 +3,7 @@ import { useI18n } from 'vue-i18n';
|
||||||
import { useStateStore } from 'stores/useStateStore';
|
import { useStateStore } from 'stores/useStateStore';
|
||||||
import { useRoute } from 'vue-router';
|
import { useRoute } from 'vue-router';
|
||||||
import LeftMenu from 'components/LeftMenu.vue';
|
import LeftMenu from 'components/LeftMenu.vue';
|
||||||
|
import useCardSize from 'src/composables/useCardSize';
|
||||||
|
|
||||||
const stateStore = useStateStore();
|
const stateStore = useStateStore();
|
||||||
const route = useRoute();
|
const route = useRoute();
|
||||||
|
@ -17,7 +18,9 @@ const { t } = useI18n();
|
||||||
</QDrawer>
|
</QDrawer>
|
||||||
<QPageContainer>
|
<QPageContainer>
|
||||||
<QPage>
|
<QPage>
|
||||||
<div class="q-pa-md"><RouterView></RouterView></div>
|
<div :class="useCardSize()">
|
||||||
|
<RouterView></RouterView>
|
||||||
|
</div>
|
||||||
</QPage>
|
</QPage>
|
||||||
</QPageContainer>
|
</QPageContainer>
|
||||||
</template>
|
</template>
|
||||||
|
|
|
@ -5,6 +5,7 @@ import WorkerDescriptor from './WorkerDescriptor.vue';
|
||||||
import LeftMenu from 'components/LeftMenu.vue';
|
import LeftMenu from 'components/LeftMenu.vue';
|
||||||
import VnSearchbar from 'src/components/ui/VnSearchbar.vue';
|
import VnSearchbar from 'src/components/ui/VnSearchbar.vue';
|
||||||
import VnSubToolbar from 'src/components/ui/VnSubToolbar.vue';
|
import VnSubToolbar from 'src/components/ui/VnSubToolbar.vue';
|
||||||
|
import useCardSize from 'src/composables/useCardSize';
|
||||||
|
|
||||||
const stateStore = useStateStore();
|
const stateStore = useStateStore();
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
|
@ -29,7 +30,9 @@ const { t } = useI18n();
|
||||||
<QPage>
|
<QPage>
|
||||||
<VnSubToolbar />
|
<VnSubToolbar />
|
||||||
|
|
||||||
<div class="q-pa-md"><RouterView></RouterView></div>
|
<div :class="useCardSize()">
|
||||||
|
<RouterView></RouterView>
|
||||||
|
</div>
|
||||||
</QPage>
|
</QPage>
|
||||||
</QPageContainer>
|
</QPageContainer>
|
||||||
</template>
|
</template>
|
||||||
|
|
|
@ -71,14 +71,14 @@ const filter = {
|
||||||
</template>
|
</template>
|
||||||
<template #body="{ entity: worker }">
|
<template #body="{ entity: worker }">
|
||||||
<QCard class="vn-one">
|
<QCard class="vn-one">
|
||||||
<a class="header" :href="workerUrl + `basic-data`">
|
<a class="header header-link" :href="workerUrl + `basic-data`">
|
||||||
{{ t('worker.summary.basicData') }}
|
{{ t('worker.summary.basicData') }}
|
||||||
<QIcon name="open_in_new" color="primary" />
|
<QIcon name="open_in_new" />
|
||||||
</a>
|
</a>
|
||||||
<VnLv :label="t('worker.card.name')" :value="worker.user.nickname" />
|
<VnLv :label="t('worker.card.name')" :value="worker.user.nickname" />
|
||||||
<VnLv
|
<VnLv
|
||||||
:label="t('worker.list.department')"
|
:label="t('worker.list.department')"
|
||||||
:value="worker.department.department.name"
|
:value="worker.department?.department?.name"
|
||||||
/>
|
/>
|
||||||
<VnLv :label="t('worker.list.email')" :value="worker.user.email" copy />
|
<VnLv :label="t('worker.list.email')" :value="worker.user.email" copy />
|
||||||
<VnLv :label="t('worker.summary.boss')" link>
|
<VnLv :label="t('worker.summary.boss')" link>
|
||||||
|
@ -102,16 +102,16 @@ const filter = {
|
||||||
<VnLinkPhone :phone-number="worker.phone" />
|
<VnLinkPhone :phone-number="worker.phone" />
|
||||||
</template>
|
</template>
|
||||||
</VnLv>
|
</VnLv>
|
||||||
<VnLv :value="worker.client.phone">
|
<VnLv :value="worker.client?.phone">
|
||||||
<template #label>
|
<template #label>
|
||||||
{{ t('worker.summary.personalPhone') }}
|
{{ t('worker.summary.personalPhone') }}
|
||||||
<VnLinkPhone :phone-number="worker.client.phone" />
|
<VnLinkPhone :phone-number="worker.client?.phone" />
|
||||||
</template>
|
</template>
|
||||||
</VnLv>
|
</VnLv>
|
||||||
<VnLv :label="t('worker.summary.locker')" :value="worker.locker" />
|
<VnLv :label="t('worker.summary.locker')" :value="worker.locker" />
|
||||||
</QCard>
|
</QCard>
|
||||||
<QCard class="vn-one">
|
<QCard class="vn-one">
|
||||||
<div class="header">
|
<div class="header header-link">
|
||||||
{{ t('worker.summary.userData') }}
|
{{ t('worker.summary.userData') }}
|
||||||
</div>
|
</div>
|
||||||
<VnLv :label="t('worker.summary.userId')" :value="worker.user.id" />
|
<VnLv :label="t('worker.summary.userId')" :value="worker.user.id" />
|
||||||
|
|
|
@ -16,10 +16,10 @@ export default {
|
||||||
'ClaimLines',
|
'ClaimLines',
|
||||||
'ClaimRma',
|
'ClaimRma',
|
||||||
'ClaimPhotos',
|
'ClaimPhotos',
|
||||||
'ClaimLog',
|
|
||||||
'ClaimNotes',
|
'ClaimNotes',
|
||||||
'ClaimDevelopment',
|
'ClaimDevelopment',
|
||||||
'ClaimAction',
|
'ClaimAction',
|
||||||
|
'ClaimLog',
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
children: [
|
children: [
|
||||||
|
@ -103,6 +103,15 @@ export default {
|
||||||
},
|
},
|
||||||
component: () => import('src/pages/Claim/Card/ClaimPhoto.vue'),
|
component: () => import('src/pages/Claim/Card/ClaimPhoto.vue'),
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: 'ClaimNotes',
|
||||||
|
path: 'notes',
|
||||||
|
meta: {
|
||||||
|
title: 'notes',
|
||||||
|
icon: 'draft',
|
||||||
|
},
|
||||||
|
component: () => import('src/pages/Claim/Card/ClaimNotes.vue'),
|
||||||
|
},
|
||||||
{
|
{
|
||||||
name: 'ClaimDevelopment',
|
name: 'ClaimDevelopment',
|
||||||
path: 'development',
|
path: 'development',
|
||||||
|
@ -113,24 +122,6 @@ export default {
|
||||||
},
|
},
|
||||||
component: () => import('src/pages/Claim/Card/ClaimDevelopment.vue'),
|
component: () => import('src/pages/Claim/Card/ClaimDevelopment.vue'),
|
||||||
},
|
},
|
||||||
{
|
|
||||||
name: 'ClaimLog',
|
|
||||||
path: 'log',
|
|
||||||
meta: {
|
|
||||||
title: 'log',
|
|
||||||
icon: 'history',
|
|
||||||
},
|
|
||||||
component: () => import('src/pages/Claim/Card/ClaimLog.vue'),
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'ClaimNotes',
|
|
||||||
path: 'notes',
|
|
||||||
meta: {
|
|
||||||
title: 'notes',
|
|
||||||
icon: 'draft',
|
|
||||||
},
|
|
||||||
component: () => import('src/pages/Claim/Card/ClaimNotes.vue'),
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
name: 'ClaimAction',
|
name: 'ClaimAction',
|
||||||
path: 'action',
|
path: 'action',
|
||||||
|
@ -140,6 +131,15 @@ export default {
|
||||||
},
|
},
|
||||||
component: () => import('src/pages/Claim/Card/ClaimAction.vue'),
|
component: () => import('src/pages/Claim/Card/ClaimAction.vue'),
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: 'ClaimLog',
|
||||||
|
path: 'log',
|
||||||
|
meta: {
|
||||||
|
title: 'log',
|
||||||
|
icon: 'history',
|
||||||
|
},
|
||||||
|
component: () => import('src/pages/Claim/Card/ClaimLog.vue'),
|
||||||
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
|
|
|
@ -5,11 +5,12 @@ describe('InvoiceInList', () => {
|
||||||
':nth-child(1) > :nth-child(1) > .justify-between > .flex > .q-chip > .q-chip__content';
|
':nth-child(1) > :nth-child(1) > .justify-between > .flex > .q-chip > .q-chip__content';
|
||||||
const firstDetailBtn = '.q-card:nth-child(1) .q-btn:nth-child(2)';
|
const firstDetailBtn = '.q-card:nth-child(1) .q-btn:nth-child(2)';
|
||||||
const summaryHeaders = '.summaryBody .header';
|
const summaryHeaders = '.summaryBody .header';
|
||||||
|
const screen = '.q-page-container > .q-drawer-container > .fullscreen';
|
||||||
|
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
cy.viewport(1920, 1080);
|
|
||||||
cy.login('developer');
|
cy.login('developer');
|
||||||
cy.visit(`/#/invoice-in/list`);
|
cy.visit(`/#/invoice-in/list`);
|
||||||
|
cy.get(screen).click();
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should redirect on clicking a invoice', () => {
|
it('should redirect on clicking a invoice', () => {
|
||||||
|
|
Loading…
Reference in New Issue