Merge branch 'dev' of https://gitea.verdnatura.es/verdnatura/salix-front into 6321_negative_tickets
This commit is contained in:
commit
6c2c3b8f60
|
@ -16,7 +16,7 @@ onMounted(() => {
|
||||||
if (availableLocales.includes(userLang)) {
|
if (availableLocales.includes(userLang)) {
|
||||||
locale.value = userLang;
|
locale.value = userLang;
|
||||||
} else {
|
} else {
|
||||||
locale.value = fallbackLocale;
|
locale.value = fallbackLocale.value;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
@ -227,6 +227,7 @@ watch(formUrl, async () => {
|
||||||
defineExpose({
|
defineExpose({
|
||||||
save,
|
save,
|
||||||
isLoading,
|
isLoading,
|
||||||
|
hasChanges,
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
<template>
|
<template>
|
||||||
|
@ -284,6 +285,9 @@ defineExpose({
|
||||||
/>
|
/>
|
||||||
</template>
|
</template>
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
|
.q-notifications {
|
||||||
|
color: black;
|
||||||
|
}
|
||||||
#formModel {
|
#formModel {
|
||||||
max-width: 800px;
|
max-width: 800px;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
|
|
|
@ -20,12 +20,7 @@ const itemComputed = computed(() => {
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
<template>
|
<template>
|
||||||
<QItem
|
<QItem active-class="bg-hover" :to="{ name: itemComputed.name }" clickable v-ripple>
|
||||||
active-class="text-primary"
|
|
||||||
:to="{ name: itemComputed.name }"
|
|
||||||
clickable
|
|
||||||
v-ripple
|
|
||||||
>
|
|
||||||
<QItemSection avatar v-if="itemComputed.icon">
|
<QItemSection avatar v-if="itemComputed.icon">
|
||||||
<QIcon :name="itemComputed.icon" />
|
<QIcon :name="itemComputed.icon" />
|
||||||
</QItemSection>
|
</QItemSection>
|
||||||
|
|
|
@ -157,7 +157,7 @@ const emit = defineEmits(['onFetch']);
|
||||||
<div class="icons">
|
<div class="icons">
|
||||||
<slot name="icons" :entity="entity" />
|
<slot name="icons" :entity="entity" />
|
||||||
</div>
|
</div>
|
||||||
<div class="actions">
|
<div class="actions justify-center">
|
||||||
<slot name="actions" :entity="entity" />
|
<slot name="actions" :entity="entity" />
|
||||||
</div>
|
</div>
|
||||||
<slot name="after" />
|
<slot name="after" />
|
||||||
|
@ -176,22 +176,23 @@ const emit = defineEmits(['onFetch']);
|
||||||
.body {
|
.body {
|
||||||
background-color: var(--vn-section-color);
|
background-color: var(--vn-section-color);
|
||||||
.text-h5 {
|
.text-h5 {
|
||||||
|
font-size: 20px;
|
||||||
padding-top: 5px;
|
padding-top: 5px;
|
||||||
padding-bottom: 5px;
|
padding-bottom: 0px;
|
||||||
}
|
}
|
||||||
.q-item {
|
.q-item {
|
||||||
min-height: 20px;
|
min-height: 20px;
|
||||||
|
|
||||||
.link {
|
.link {
|
||||||
margin-left: 5px;
|
margin-left: 10px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.vn-label-value {
|
.vn-label-value {
|
||||||
display: flex;
|
display: flex;
|
||||||
padding: 2px 16px;
|
padding: 0px 16px;
|
||||||
.label {
|
.label {
|
||||||
color: var(--vn-label-color);
|
color: var(--vn-label-color);
|
||||||
font-size: 12px;
|
font-size: 14px;
|
||||||
|
|
||||||
&:not(:has(a))::after {
|
&:not(:has(a))::after {
|
||||||
content: ':';
|
content: ':';
|
||||||
|
@ -200,7 +201,7 @@ const emit = defineEmits(['onFetch']);
|
||||||
.value {
|
.value {
|
||||||
color: var(--vn-text-color);
|
color: var(--vn-text-color);
|
||||||
font-size: 14px;
|
font-size: 14px;
|
||||||
margin-left: 12px;
|
margin-left: 4px;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
text-overflow: ellipsis;
|
text-overflow: ellipsis;
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
|
@ -218,18 +219,19 @@ const emit = defineEmits(['onFetch']);
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
text-overflow: ellipsis;
|
text-overflow: ellipsis;
|
||||||
span {
|
span {
|
||||||
color: $primary;
|
color: var(--vn-text-color);
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.subtitle {
|
.subtitle {
|
||||||
color: var(--vn-text-color);
|
color: var(--vn-text-color);
|
||||||
font-size: 16px;
|
font-size: 16px;
|
||||||
margin-bottom: 15px;
|
margin-bottom: 2px;
|
||||||
}
|
}
|
||||||
.list-box {
|
.list-box {
|
||||||
.q-item__label {
|
.q-item__label {
|
||||||
color: var(--vn-label-color);
|
color: var(--vn-label-color);
|
||||||
|
padding-bottom: 0%;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.descriptor {
|
.descriptor {
|
||||||
|
@ -247,6 +249,7 @@ const emit = defineEmits(['onFetch']);
|
||||||
}
|
}
|
||||||
.actions {
|
.actions {
|
||||||
margin: 0 5px;
|
margin: 0 5px;
|
||||||
|
justify-content: center !important;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
|
@ -74,7 +74,7 @@ async function fetch() {
|
||||||
</router-link>
|
</router-link>
|
||||||
<span v-else></span>
|
<span v-else></span>
|
||||||
</slot>
|
</slot>
|
||||||
<slot name="header" :entity="entity">
|
<slot name="header" :entity="entity" dense>
|
||||||
<VnLv :label="`${entity.id} -`" :value="entity.name" />
|
<VnLv :label="`${entity.id} -`" :value="entity.name" />
|
||||||
</slot>
|
</slot>
|
||||||
<slot name="header-right">
|
<slot name="header-right">
|
||||||
|
@ -97,7 +97,6 @@ async function fetch() {
|
||||||
|
|
||||||
.cardSummary {
|
.cardSummary {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
|
|
||||||
.summaryHeader {
|
.summaryHeader {
|
||||||
text-align: center;
|
text-align: center;
|
||||||
font-size: 20px;
|
font-size: 20px;
|
||||||
|
@ -132,6 +131,7 @@ async function fetch() {
|
||||||
padding: 7px;
|
padding: 7px;
|
||||||
font-size: 16px;
|
font-size: 16px;
|
||||||
min-width: 275px;
|
min-width: 275px;
|
||||||
|
box-shadow: none;
|
||||||
|
|
||||||
.vn-label-value {
|
.vn-label-value {
|
||||||
display: flex;
|
display: flex;
|
||||||
|
|
|
@ -15,7 +15,6 @@ const { t } = useI18n();
|
||||||
color="primary"
|
color="primary"
|
||||||
padding="none"
|
padding="none"
|
||||||
:href="`sip:${props.phoneNumber}`"
|
:href="`sip:${props.phoneNumber}`"
|
||||||
:title="t('globals.microsip')"
|
|
||||||
@click.stop
|
@click.stop
|
||||||
/>
|
/>
|
||||||
</template>
|
</template>
|
||||||
|
|
|
@ -14,7 +14,7 @@ onUnmounted(() => {
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<QToolbar class="justify-end sticky">
|
<QToolbar class="bg-vn-section-color justify-end sticky">
|
||||||
<slot name="st-data">
|
<slot name="st-data">
|
||||||
<div id="st-data"></div>
|
<div id="st-data"></div>
|
||||||
</slot>
|
</slot>
|
||||||
|
@ -24,6 +24,11 @@ onUnmounted(() => {
|
||||||
</slot>
|
</slot>
|
||||||
</QToolbar>
|
</QToolbar>
|
||||||
</template>
|
</template>
|
||||||
|
<style lang="scss">
|
||||||
|
.q-toolbar {
|
||||||
|
background: var(--vn-section-color);
|
||||||
|
}
|
||||||
|
</style>
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
.sticky {
|
.sticky {
|
||||||
position: sticky;
|
position: sticky;
|
||||||
|
|
|
@ -14,8 +14,8 @@ export function useSession() {
|
||||||
return localToken || sessionToken || '';
|
return localToken || sessionToken || '';
|
||||||
}
|
}
|
||||||
function getTokenMultimedia() {
|
function getTokenMultimedia() {
|
||||||
const localTokenMultimedia = localStorage.getItem('tokenMultimedia');
|
const localTokenMultimedia = localStorage.getItem('token'); // Temporal
|
||||||
const sessionTokenMultimedia = sessionStorage.getItem('tokenMultimedia');
|
const sessionTokenMultimedia = sessionStorage.getItem('token'); // Temporal
|
||||||
|
|
||||||
return localTokenMultimedia || sessionTokenMultimedia || '';
|
return localTokenMultimedia || sessionTokenMultimedia || '';
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,21 +14,15 @@ body.body--light {
|
||||||
.q-header .q-toolbar {
|
.q-header .q-toolbar {
|
||||||
color: var(--font-color);
|
color: var(--font-color);
|
||||||
}
|
}
|
||||||
.q-card,
|
|
||||||
.q-table,
|
|
||||||
.q-table__bottom,
|
|
||||||
.q-drawer {
|
|
||||||
background-color: var(--vn-section-color);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
body.body--dark {
|
body.body--dark {
|
||||||
--vn-section-color: #403c3c;
|
--vn-page-color: #222;
|
||||||
|
--vn-section-color: #3d3d3d;
|
||||||
--vn-text-color: white;
|
--vn-text-color: white;
|
||||||
--vn-label-color: #a8a8a8;
|
--vn-label-color: #a8a8a8;
|
||||||
--vn-accent-color: #424242;
|
--vn-accent-color: #424242;
|
||||||
|
|
||||||
background-color: #222;
|
background-color: var(--vn-page-color);
|
||||||
}
|
}
|
||||||
|
|
||||||
a {
|
a {
|
||||||
|
@ -76,6 +70,9 @@ select:-webkit-autofill {
|
||||||
.bg-vn-section-color {
|
.bg-vn-section-color {
|
||||||
background-color: var(--vn-section-color);
|
background-color: var(--vn-section-color);
|
||||||
}
|
}
|
||||||
|
.bg-hover {
|
||||||
|
background-color: #666666;
|
||||||
|
}
|
||||||
|
|
||||||
.color-vn-text {
|
.color-vn-text {
|
||||||
color: var(--vn-text-color);
|
color: var(--vn-text-color);
|
||||||
|
@ -85,6 +82,11 @@ select:-webkit-autofill {
|
||||||
color: $white;
|
color: $white;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.card-width {
|
||||||
|
max-width: 800px;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
.vn-card {
|
.vn-card {
|
||||||
background-color: var(--vn-section-color);
|
background-color: var(--vn-section-color);
|
||||||
color: var(--vn-text-color);
|
color: var(--vn-text-color);
|
||||||
|
@ -118,9 +120,36 @@ select:-webkit-autofill {
|
||||||
content: ' *';
|
content: ' *';
|
||||||
}
|
}
|
||||||
|
|
||||||
.q-chip {
|
.q-card,
|
||||||
|
.q-table,
|
||||||
|
.q-table__bottom,
|
||||||
|
.q-drawer {
|
||||||
|
background-color: var(--vn-section-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
.q-chip,
|
||||||
|
.q-notification__message,
|
||||||
|
.q-notification__icon {
|
||||||
color: black;
|
color: black;
|
||||||
}
|
}
|
||||||
|
.q-notification--standard.bg-negative {
|
||||||
|
background-color: #fa3939 !important;
|
||||||
|
}
|
||||||
|
.q-notification--standard.bg-positive {
|
||||||
|
background-color: #a3d131 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.q-tooltip {
|
||||||
|
background-color: var(--vn-page-color);
|
||||||
|
color: var(--font-color);
|
||||||
|
font-size: medium;
|
||||||
|
}
|
||||||
|
|
||||||
|
.q-card__actions {
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* q-notification row items-stretch q-notification--standard bg-negative text-white */
|
||||||
|
|
||||||
input[type='number'] {
|
input[type='number'] {
|
||||||
-moz-appearance: textfield;
|
-moz-appearance: textfield;
|
||||||
|
|
|
@ -22,7 +22,7 @@ $warning: #f4b974;
|
||||||
$success: $positive;
|
$success: $positive;
|
||||||
$alert: $negative;
|
$alert: $negative;
|
||||||
$white: #fff;
|
$white: #fff;
|
||||||
$dark: #3c3b3b;
|
$dark: #3d3d3d;
|
||||||
// custom
|
// custom
|
||||||
$color-link: #66bfff;
|
$color-link: #66bfff;
|
||||||
$color-spacer-light: #a3a3a31f;
|
$color-spacer-light: #a3a3a31f;
|
||||||
|
|
|
@ -50,7 +50,6 @@ export default {
|
||||||
today: 'Today',
|
today: 'Today',
|
||||||
yesterday: 'Yesterday',
|
yesterday: 'Yesterday',
|
||||||
dateFormat: 'en-GB',
|
dateFormat: 'en-GB',
|
||||||
microsip: 'Open in MicroSIP',
|
|
||||||
noSelectedRows: `You don't have any line selected`,
|
noSelectedRows: `You don't have any line selected`,
|
||||||
downloadCSVSuccess: 'CSV downloaded successfully',
|
downloadCSVSuccess: 'CSV downloaded successfully',
|
||||||
reference: 'Reference',
|
reference: 'Reference',
|
||||||
|
@ -899,12 +898,14 @@ export default {
|
||||||
pageTitles: {
|
pageTitles: {
|
||||||
workers: 'Workers',
|
workers: 'Workers',
|
||||||
list: 'List',
|
list: 'List',
|
||||||
basicData: 'Basic data',
|
|
||||||
summary: 'Summary',
|
summary: 'Summary',
|
||||||
notifications: 'Notifications',
|
|
||||||
workerCreate: 'New worker',
|
workerCreate: 'New worker',
|
||||||
department: 'Department',
|
department: 'Department',
|
||||||
|
basicData: 'Basic data',
|
||||||
|
notes: 'Notes',
|
||||||
pda: 'PDA',
|
pda: 'PDA',
|
||||||
|
notifications: 'Notifications',
|
||||||
|
pbx: 'Private Branch Exchange',
|
||||||
log: 'Log',
|
log: 'Log',
|
||||||
},
|
},
|
||||||
list: {
|
list: {
|
||||||
|
|
|
@ -52,7 +52,6 @@ export default {
|
||||||
yesterday: 'Ayer',
|
yesterday: 'Ayer',
|
||||||
dateFormat: 'es-ES',
|
dateFormat: 'es-ES',
|
||||||
noSelectedRows: `No tienes ninguna línea seleccionada`,
|
noSelectedRows: `No tienes ninguna línea seleccionada`,
|
||||||
microsip: 'Abrir en MicroSIP',
|
|
||||||
downloadCSVSuccess: 'Descarga de CSV exitosa',
|
downloadCSVSuccess: 'Descarga de CSV exitosa',
|
||||||
reference: 'Referencia',
|
reference: 'Referencia',
|
||||||
agency: 'Agencia',
|
agency: 'Agencia',
|
||||||
|
@ -898,12 +897,14 @@ export default {
|
||||||
pageTitles: {
|
pageTitles: {
|
||||||
workers: 'Trabajadores',
|
workers: 'Trabajadores',
|
||||||
list: 'Listado',
|
list: 'Listado',
|
||||||
basicData: 'Datos básicos',
|
|
||||||
summary: 'Resumen',
|
summary: 'Resumen',
|
||||||
notifications: 'Notificaciones',
|
|
||||||
workerCreate: 'Nuevo trabajador',
|
workerCreate: 'Nuevo trabajador',
|
||||||
department: 'Departamentos',
|
department: 'Departamentos',
|
||||||
|
basicData: 'Datos básicos',
|
||||||
|
notes: 'Notas',
|
||||||
pda: 'PDA',
|
pda: 'PDA',
|
||||||
|
notifications: 'Notificaciones',
|
||||||
|
pbx: 'Centralita',
|
||||||
log: 'Historial',
|
log: 'Historial',
|
||||||
},
|
},
|
||||||
list: {
|
list: {
|
||||||
|
|
|
@ -29,6 +29,7 @@ const suppliersRef = ref();
|
||||||
order="nickname"
|
order="nickname"
|
||||||
limit="30"
|
limit="30"
|
||||||
@on-fetch="(data) => (suppliers = data)"
|
@on-fetch="(data) => (suppliers = data)"
|
||||||
|
auto-load
|
||||||
/>
|
/>
|
||||||
<VnFilterPanel :data-key="props.dataKey" :search-button="true">
|
<VnFilterPanel :data-key="props.dataKey" :search-button="true">
|
||||||
<template #tags="{ tag, formatFn }">
|
<template #tags="{ tag, formatFn }">
|
||||||
|
@ -38,46 +39,6 @@ const suppliersRef = ref();
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<template #body="{ params, searchFn }">
|
<template #body="{ params, searchFn }">
|
||||||
<QItem>
|
|
||||||
<QItemSection>
|
|
||||||
<VnInput
|
|
||||||
:label="t('Id or Supplier')"
|
|
||||||
v-model="params.search"
|
|
||||||
is-outlined
|
|
||||||
>
|
|
||||||
<template #prepend>
|
|
||||||
<QIcon name="badge" size="sm"></QIcon>
|
|
||||||
</template>
|
|
||||||
</VnInput>
|
|
||||||
</QItemSection>
|
|
||||||
</QItem>
|
|
||||||
<QItem>
|
|
||||||
<QItemSection>
|
|
||||||
<VnInput
|
|
||||||
:label="useCapitalize(t('params.correctedFk'))"
|
|
||||||
v-model="params.correctedFk"
|
|
||||||
is-outlined
|
|
||||||
>
|
|
||||||
<template #prepend>
|
|
||||||
<QIcon name="attachment" size="sm" />
|
|
||||||
</template>
|
|
||||||
</VnInput>
|
|
||||||
</QItemSection>
|
|
||||||
</QItem>
|
|
||||||
<QItem>
|
|
||||||
<QItemSection>
|
|
||||||
<VnInput
|
|
||||||
:label="t('params.supplierRef')"
|
|
||||||
v-model="params.supplierRef"
|
|
||||||
is-outlined
|
|
||||||
lazy-rules
|
|
||||||
>
|
|
||||||
<template #prepend>
|
|
||||||
<QIcon name="vn:client" size="sm"></QIcon>
|
|
||||||
</template>
|
|
||||||
</VnInput>
|
|
||||||
</QItemSection>
|
|
||||||
</QItem>
|
|
||||||
<QItem>
|
<QItem>
|
||||||
<QItemSection>
|
<QItemSection>
|
||||||
<VnSelectFilter
|
<VnSelectFilter
|
||||||
|
@ -97,31 +58,31 @@ const suppliersRef = ref();
|
||||||
<QItem>
|
<QItem>
|
||||||
<QItemSection>
|
<QItemSection>
|
||||||
<VnInput
|
<VnInput
|
||||||
:label="t('params.fi')"
|
:label="t('params.supplierRef')"
|
||||||
v-model="params.fi"
|
v-model="params.supplierRef"
|
||||||
is-outlined
|
is-outlined
|
||||||
lazy-rules
|
lazy-rules
|
||||||
>
|
>
|
||||||
<template #prepend>
|
<template #prepend>
|
||||||
<QIcon name="badge" size="sm"></QIcon>
|
<QIcon name="vn:client" size="sm"></QIcon>
|
||||||
</template>
|
</template>
|
||||||
</VnInput>
|
</VnInput>
|
||||||
</QItemSection>
|
</QItemSection>
|
||||||
</QItem>
|
</QItem>
|
||||||
<QItem>
|
<QItem>
|
||||||
<QItemSection>
|
<QItemSection>
|
||||||
<VnInput
|
<VnInputDate
|
||||||
:label="t('params.serialNumber')"
|
:label="t('From')"
|
||||||
v-model="params.serialNumber"
|
v-model="params.from"
|
||||||
is-outlined
|
is-outlined
|
||||||
lazy-rules
|
/>
|
||||||
>
|
</QItemSection>
|
||||||
<template #prepend>
|
</QItem>
|
||||||
<QIcon name="badge" size="sm"></QIcon>
|
<QItem>
|
||||||
</template>
|
<QItemSection>
|
||||||
</VnInput>
|
<VnInputDate :label="t('To')" v-model="params.to" is-outlined />
|
||||||
</QItemSection>
|
</QItemSection>
|
||||||
</QItem>
|
</QItem>
|
||||||
<QItem>
|
<QItem>
|
||||||
<QItemSection>
|
<QItemSection>
|
||||||
<VnInput
|
<VnInput
|
||||||
|
@ -152,6 +113,34 @@ const suppliersRef = ref();
|
||||||
</QItemSection>
|
</QItemSection>
|
||||||
</QItem>
|
</QItem>
|
||||||
<QExpansionItem :label="t('More options')" expand-separator>
|
<QExpansionItem :label="t('More options')" expand-separator>
|
||||||
|
<QItem>
|
||||||
|
<QItemSection>
|
||||||
|
<VnInput
|
||||||
|
:label="t('params.fi')"
|
||||||
|
v-model="params.fi"
|
||||||
|
is-outlined
|
||||||
|
lazy-rules
|
||||||
|
>
|
||||||
|
<template #prepend>
|
||||||
|
<QIcon name="badge" size="sm"></QIcon>
|
||||||
|
</template>
|
||||||
|
</VnInput>
|
||||||
|
</QItemSection>
|
||||||
|
</QItem>
|
||||||
|
<QItem>
|
||||||
|
<QItemSection>
|
||||||
|
<VnInput
|
||||||
|
:label="t('params.serialNumber')"
|
||||||
|
v-model="params.serialNumber"
|
||||||
|
is-outlined
|
||||||
|
lazy-rules
|
||||||
|
>
|
||||||
|
<template #prepend>
|
||||||
|
<QIcon name="badge" size="sm"></QIcon>
|
||||||
|
</template>
|
||||||
|
</VnInput>
|
||||||
|
</QItemSection>
|
||||||
|
</QItem>
|
||||||
<QItem>
|
<QItem>
|
||||||
<QItemSection>
|
<QItemSection>
|
||||||
<VnInput
|
<VnInput
|
||||||
|
@ -180,20 +169,6 @@ const suppliersRef = ref();
|
||||||
</VnInput>
|
</VnInput>
|
||||||
</QItemSection>
|
</QItemSection>
|
||||||
</QItem>
|
</QItem>
|
||||||
<QItem>
|
|
||||||
<QItemSection>
|
|
||||||
<VnInputDate
|
|
||||||
:label="t('From')"
|
|
||||||
v-model="params.from"
|
|
||||||
is-outlined
|
|
||||||
/>
|
|
||||||
</QItemSection>
|
|
||||||
</QItem>
|
|
||||||
<QItem>
|
|
||||||
<QItemSection>
|
|
||||||
<VnInputDate :label="t('To')" v-model="params.to" is-outlined />
|
|
||||||
</QItemSection>
|
|
||||||
</QItem>
|
|
||||||
<QItem>
|
<QItem>
|
||||||
<QItemSection>
|
<QItemSection>
|
||||||
<VnInputDate
|
<VnInputDate
|
||||||
|
|
|
@ -55,7 +55,7 @@ async function onSubmit() {
|
||||||
if (res.response?.data?.error?.code === 'REQUIRES_2FA') {
|
if (res.response?.data?.error?.code === 'REQUIRES_2FA') {
|
||||||
Notify.create({
|
Notify.create({
|
||||||
message: t('login.twoFactorRequired'),
|
message: t('login.twoFactorRequired'),
|
||||||
icon: 'phonelink_lock',
|
icon: 'phoneLink_lock',
|
||||||
type: 'warning',
|
type: 'warning',
|
||||||
});
|
});
|
||||||
params.keepLogin = keepLogin.value;
|
params.keepLogin = keepLogin.value;
|
||||||
|
|
|
@ -277,7 +277,6 @@ function navigateToRoadmapSummary(event, row) {
|
||||||
.route-list {
|
.route-list {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
}
|
}
|
||||||
|
|
||||||
.table-actions {
|
.table-actions {
|
||||||
gap: 12px;
|
gap: 12px;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
<script setup>
|
<script setup>
|
||||||
import { onMounted, ref, computed, onUpdated } from 'vue';
|
import { onMounted, ref, computed } from 'vue';
|
||||||
import { useRoute, useRouter } from 'vue-router';
|
import { useRoute, useRouter } from 'vue-router';
|
||||||
import { useI18n } from 'vue-i18n';
|
import { useI18n } from 'vue-i18n';
|
||||||
import axios from 'axios';
|
import axios from 'axios';
|
||||||
|
@ -14,8 +14,6 @@ import { getUrl } from 'src/composables/getUrl';
|
||||||
import VnUserLink from 'src/components/ui/VnUserLink.vue';
|
import VnUserLink from 'src/components/ui/VnUserLink.vue';
|
||||||
import VnTitle from 'src/components/common/VnTitle.vue';
|
import VnTitle from 'src/components/common/VnTitle.vue';
|
||||||
|
|
||||||
onUpdated(() => summaryRef.value.fetch());
|
|
||||||
|
|
||||||
const route = useRoute();
|
const route = useRoute();
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,168 @@
|
||||||
|
<script setup>
|
||||||
|
import { ref } from 'vue';
|
||||||
|
import { useRoute } from 'vue-router';
|
||||||
|
import { useI18n } from 'vue-i18n';
|
||||||
|
|
||||||
|
import FetchData from 'components/FetchData.vue';
|
||||||
|
import FormModel from 'src/components/FormModel.vue';
|
||||||
|
import VnRow from 'components/ui/VnRow.vue';
|
||||||
|
import VnInput from 'src/components/common/VnInput.vue';
|
||||||
|
import VnSelectFilter from 'src/components/common/VnSelectFilter.vue';
|
||||||
|
|
||||||
|
const route = useRoute();
|
||||||
|
const { t } = useI18n();
|
||||||
|
|
||||||
|
const workersOptions = ref([]);
|
||||||
|
const countriesOptions = ref([]);
|
||||||
|
const educationLevelsOptions = ref([]);
|
||||||
|
|
||||||
|
const workerFilter = {
|
||||||
|
include: [
|
||||||
|
{
|
||||||
|
relation: 'user',
|
||||||
|
scope: {
|
||||||
|
fields: ['name', 'emailVerified'],
|
||||||
|
include: { relation: 'emailUser', scope: { fields: ['email'] } },
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{ relation: 'sip', scope: { fields: ['extension', 'secret'] } },
|
||||||
|
{ relation: 'department', scope: { include: { relation: 'department' } } },
|
||||||
|
],
|
||||||
|
};
|
||||||
|
const workersFilter = {
|
||||||
|
fields: ['id', 'nickname'],
|
||||||
|
order: 'nickname ASC',
|
||||||
|
limit: 30,
|
||||||
|
};
|
||||||
|
const countriesFilter = {
|
||||||
|
fields: ['id', 'country', 'code'],
|
||||||
|
order: 'country ASC',
|
||||||
|
limit: 30,
|
||||||
|
};
|
||||||
|
const educationLevelsFilter = { fields: ['id', 'name'], order: 'name ASC', limit: 30 };
|
||||||
|
|
||||||
|
const maritalStatus = [
|
||||||
|
{ code: 'M', name: t('Married') },
|
||||||
|
{ code: 'S', name: t('Single') },
|
||||||
|
];
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<FetchData
|
||||||
|
:filter="workersFilter"
|
||||||
|
@on-fetch="(data) => (workersOptions = data)"
|
||||||
|
auto-load
|
||||||
|
url="Workers/search"
|
||||||
|
/>
|
||||||
|
<FetchData
|
||||||
|
:filter="countriesFilter"
|
||||||
|
@on-fetch="(data) => (countriesOptions = data)"
|
||||||
|
auto-load
|
||||||
|
url="Countries"
|
||||||
|
/>
|
||||||
|
<FetchData
|
||||||
|
:filter="educationLevelsFilter"
|
||||||
|
@on-fetch="(data) => (educationLevelsOptions = data)"
|
||||||
|
auto-load
|
||||||
|
url="EducationLevels"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<FormModel
|
||||||
|
:filter="workerFilter"
|
||||||
|
:url="`Workers/${route.params.id}`"
|
||||||
|
auto-load
|
||||||
|
model="Worker"
|
||||||
|
>
|
||||||
|
<template #form="{ data }">
|
||||||
|
<VnRow class="row q-gutter-md q-mb-md">
|
||||||
|
<VnInput :label="t('Name')" clearable v-model="data.firstName" />
|
||||||
|
<VnInput :label="t('Last name')" clearable v-model="data.lastName" />
|
||||||
|
</VnRow>
|
||||||
|
|
||||||
|
<VnRow class="row q-gutter-md q-mb-md">
|
||||||
|
<VnInput v-model="data.phone" :label="t('Business phone')" clearable />
|
||||||
|
<VnInput
|
||||||
|
v-model="data.mobileExtension"
|
||||||
|
:label="t('Mobile extension')"
|
||||||
|
clearable
|
||||||
|
/>
|
||||||
|
</VnRow>
|
||||||
|
|
||||||
|
<VnRow class="row q-gutter-md q-mb-md">
|
||||||
|
<VnSelectFilter
|
||||||
|
:label="t('Boss')"
|
||||||
|
:options="workersOptions"
|
||||||
|
hide-selected
|
||||||
|
option-label="nickname"
|
||||||
|
option-value="id"
|
||||||
|
v-model="data.bossFk"
|
||||||
|
>
|
||||||
|
<template #option="scope">
|
||||||
|
<QItem v-bind="scope.itemProps">
|
||||||
|
<QItemSection>
|
||||||
|
<QItemLabel>{{ scope.opt?.name }}</QItemLabel>
|
||||||
|
<QItemLabel caption>
|
||||||
|
{{ scope.opt?.nickname }},
|
||||||
|
{{ scope.opt?.code }}
|
||||||
|
</QItemLabel>
|
||||||
|
</QItemSection>
|
||||||
|
</QItem>
|
||||||
|
</template>
|
||||||
|
</VnSelectFilter>
|
||||||
|
<VnSelectFilter
|
||||||
|
:label="t('Marital status')"
|
||||||
|
:options="maritalStatus"
|
||||||
|
hide-selected
|
||||||
|
option-label="name"
|
||||||
|
option-value="code"
|
||||||
|
v-model="data.maritalStatus"
|
||||||
|
/>
|
||||||
|
</VnRow>
|
||||||
|
|
||||||
|
<VnRow class="row q-gutter-md q-mb-md">
|
||||||
|
<VnSelectFilter
|
||||||
|
:label="t('Origin country')"
|
||||||
|
:options="countriesOptions"
|
||||||
|
hide-selected
|
||||||
|
option-label="country"
|
||||||
|
option-value="id"
|
||||||
|
v-model="data.originCountryFk"
|
||||||
|
/>
|
||||||
|
<VnSelectFilter
|
||||||
|
:label="t('Education level')"
|
||||||
|
:options="educationLevelsOptions"
|
||||||
|
hide-selected
|
||||||
|
option-label="name"
|
||||||
|
option-value="id"
|
||||||
|
v-model="data.educationLevelFk"
|
||||||
|
/>
|
||||||
|
</VnRow>
|
||||||
|
|
||||||
|
<VnRow class="row q-gutter-md q-mb-md">
|
||||||
|
<VnInput v-model="data.SSN" :label="t('SSN')" clearable />
|
||||||
|
<VnInput
|
||||||
|
v-model="data.locker"
|
||||||
|
type="number"
|
||||||
|
:label="t('Locker')"
|
||||||
|
clearable
|
||||||
|
/>
|
||||||
|
</VnRow>
|
||||||
|
</template>
|
||||||
|
</FormModel>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<i18n>
|
||||||
|
es:
|
||||||
|
Name: Nombre
|
||||||
|
Last name: Apellidos
|
||||||
|
Business phone: Teléfono de empresa
|
||||||
|
Mobile extension: Extensión móvil
|
||||||
|
Boss: Jefe
|
||||||
|
Marital status: Estado civil
|
||||||
|
Married: Casado/a
|
||||||
|
Single: Soltero/a
|
||||||
|
Origin country: País origen
|
||||||
|
Education level: Nivel educación
|
||||||
|
SSN: NSS
|
||||||
|
Locker: Taquilla
|
||||||
|
</i18n>
|
|
@ -1,5 +1,5 @@
|
||||||
<script setup>
|
<script setup>
|
||||||
import { computed, ref } from 'vue';
|
import { computed, ref, watch } from 'vue';
|
||||||
import { useRoute } from 'vue-router';
|
import { useRoute } from 'vue-router';
|
||||||
import { useI18n } from 'vue-i18n';
|
import { useI18n } from 'vue-i18n';
|
||||||
import { useSession } from 'src/composables/useSession';
|
import { useSession } from 'src/composables/useSession';
|
||||||
|
@ -7,6 +7,7 @@ import CardDescriptor from 'src/components/ui/CardDescriptor.vue';
|
||||||
import VnLv from 'src/components/ui/VnLv.vue';
|
import VnLv from 'src/components/ui/VnLv.vue';
|
||||||
import VnLinkPhone from 'src/components/ui/VnLinkPhone.vue';
|
import VnLinkPhone from 'src/components/ui/VnLinkPhone.vue';
|
||||||
import useCardDescription from 'src/composables/useCardDescription';
|
import useCardDescription from 'src/composables/useCardDescription';
|
||||||
|
import { useState } from 'src/composables/useState';
|
||||||
|
|
||||||
const $props = defineProps({
|
const $props = defineProps({
|
||||||
id: {
|
id: {
|
||||||
|
@ -23,6 +24,7 @@ const $props = defineProps({
|
||||||
const route = useRoute();
|
const route = useRoute();
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
const { getTokenMultimedia } = useSession();
|
const { getTokenMultimedia } = useSession();
|
||||||
|
const state = useState();
|
||||||
|
|
||||||
const entityId = computed(() => {
|
const entityId = computed(() => {
|
||||||
return $props.id || route.params.id;
|
return $props.id || route.params.id;
|
||||||
|
@ -53,7 +55,18 @@ const filter = {
|
||||||
],
|
],
|
||||||
};
|
};
|
||||||
|
|
||||||
const sip = computed(() => worker.value?.sip && worker.value.sip.extension);
|
const sip = ref(null);
|
||||||
|
|
||||||
|
watch(
|
||||||
|
() => [worker.value?.sip?.extension, state.get('extension')],
|
||||||
|
([newWorkerSip, newStateExtension], [oldWorkerSip, oldStateExtension]) => {
|
||||||
|
if (newStateExtension !== oldStateExtension || sip.value === oldStateExtension) {
|
||||||
|
sip.value = newStateExtension;
|
||||||
|
} else if (newWorkerSip !== oldWorkerSip && sip.value !== newStateExtension) {
|
||||||
|
sip.value = newWorkerSip;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
function getWorkerAvatar() {
|
function getWorkerAvatar() {
|
||||||
const token = getTokenMultimedia();
|
const token = getTokenMultimedia();
|
||||||
|
|
|
@ -0,0 +1,38 @@
|
||||||
|
<script setup>
|
||||||
|
import { useRoute } from 'vue-router';
|
||||||
|
|
||||||
|
import VnNotes from 'src/components/ui/VnNotes.vue';
|
||||||
|
|
||||||
|
const route = useRoute();
|
||||||
|
|
||||||
|
const filter = {
|
||||||
|
order: 'created DESC',
|
||||||
|
where: { workerFk: route.params.id },
|
||||||
|
include: {
|
||||||
|
relation: 'worker',
|
||||||
|
scope: {
|
||||||
|
fields: ['id', 'firstName', 'lastName'],
|
||||||
|
include: {
|
||||||
|
relation: 'user',
|
||||||
|
scope: {
|
||||||
|
fields: ['id', 'nickname'],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
const body = {
|
||||||
|
workerFk: route.params.id,
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<VnNotes
|
||||||
|
style="overflow-y: auto"
|
||||||
|
:add-note="{ type: Boolean, default: true }"
|
||||||
|
url="WorkerObservations"
|
||||||
|
:filter="filter"
|
||||||
|
:body="body"
|
||||||
|
/>
|
||||||
|
</template>
|
|
@ -0,0 +1,70 @@
|
||||||
|
<script setup>
|
||||||
|
import { watch, ref } from 'vue';
|
||||||
|
import { useI18n } from 'vue-i18n';
|
||||||
|
import { useRoute } from 'vue-router';
|
||||||
|
|
||||||
|
import { useState } from 'src/composables/useState';
|
||||||
|
|
||||||
|
import FormModel from 'src/components/FormModel.vue';
|
||||||
|
import VnRow from 'components/ui/VnRow.vue';
|
||||||
|
import VnInput from 'src/components/common/VnInput.vue';
|
||||||
|
|
||||||
|
const { t } = useI18n();
|
||||||
|
const state = useState();
|
||||||
|
const route = useRoute();
|
||||||
|
const workerPBXForm = ref();
|
||||||
|
const extension = ref(null);
|
||||||
|
|
||||||
|
const filter = {
|
||||||
|
include: [
|
||||||
|
{
|
||||||
|
relation: 'sip',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
};
|
||||||
|
|
||||||
|
watch(
|
||||||
|
() => route.params.id,
|
||||||
|
() => state.set('extension', null)
|
||||||
|
);
|
||||||
|
|
||||||
|
const onFetch = (data) => {
|
||||||
|
state.set('extension', data?.sip?.extension);
|
||||||
|
extension.value = state.get('extension');
|
||||||
|
};
|
||||||
|
|
||||||
|
const updateModelValue = (data) => {
|
||||||
|
state.set('extension', data);
|
||||||
|
workerPBXForm.value.hasChanges = true;
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<FormModel
|
||||||
|
ref="workerPBXForm"
|
||||||
|
:filter="filter"
|
||||||
|
:url="`Workers/${route.params.id}`"
|
||||||
|
url-update="Sips"
|
||||||
|
auto-load
|
||||||
|
:mapper="
|
||||||
|
() => ({
|
||||||
|
userFk: +route.params.id,
|
||||||
|
extension,
|
||||||
|
})
|
||||||
|
"
|
||||||
|
model="DeviceProductionUser"
|
||||||
|
@on-fetch="onFetch"
|
||||||
|
>
|
||||||
|
<template #form="{}">
|
||||||
|
<VnRow class="row q-gutter-md q-mb-md">
|
||||||
|
<div class="col">
|
||||||
|
<VnInput
|
||||||
|
:label="t('worker.summary.sipExtension')"
|
||||||
|
v-model="extension"
|
||||||
|
@update:model-value="updateModelValue"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</VnRow>
|
||||||
|
</template>
|
||||||
|
</FormModel>
|
||||||
|
</template>
|
|
@ -12,7 +12,14 @@ export default {
|
||||||
redirect: { name: 'WorkerMain' },
|
redirect: { name: 'WorkerMain' },
|
||||||
menus: {
|
menus: {
|
||||||
main: ['WorkerList', 'WorkerDepartment'],
|
main: ['WorkerList', 'WorkerDepartment'],
|
||||||
card: ['WorkerNotificationsManager', 'WorkerPda', 'WorkerLog'],
|
card: [
|
||||||
|
'WorkerBasicData',
|
||||||
|
'WorkerNotes',
|
||||||
|
'WorkerPda',
|
||||||
|
'WorkerNotificationsManager',
|
||||||
|
'WorkerPBX',
|
||||||
|
'WorkerLog',
|
||||||
|
],
|
||||||
departmentCard: ['BasicData'],
|
departmentCard: ['BasicData'],
|
||||||
},
|
},
|
||||||
children: [
|
children: [
|
||||||
|
@ -66,6 +73,41 @@ export default {
|
||||||
},
|
},
|
||||||
component: () => import('src/pages/Worker/Card/WorkerSummary.vue'),
|
component: () => import('src/pages/Worker/Card/WorkerSummary.vue'),
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
path: 'basic-data',
|
||||||
|
name: 'WorkerBasicData',
|
||||||
|
meta: {
|
||||||
|
title: 'basicData',
|
||||||
|
icon: 'vn:settings',
|
||||||
|
},
|
||||||
|
component: () => import('src/pages/Worker/Card/WorkerBasicData.vue'),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: 'notes',
|
||||||
|
name: 'NotesCard',
|
||||||
|
redirect: { name: 'WorkerNotes' },
|
||||||
|
children: [
|
||||||
|
{
|
||||||
|
path: '',
|
||||||
|
name: 'WorkerNotes',
|
||||||
|
meta: {
|
||||||
|
title: 'notes',
|
||||||
|
icon: 'vn:notes',
|
||||||
|
},
|
||||||
|
component: () =>
|
||||||
|
import('src/pages/Worker/Card/WorkerNotes.vue'),
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'WorkerPda',
|
||||||
|
path: 'pda',
|
||||||
|
meta: {
|
||||||
|
title: 'pda',
|
||||||
|
icon: 'phone_android',
|
||||||
|
},
|
||||||
|
component: () => import('src/pages/Worker/Card/WorkerPda.vue'),
|
||||||
|
},
|
||||||
{
|
{
|
||||||
name: 'WorkerNotificationsManager',
|
name: 'WorkerNotificationsManager',
|
||||||
path: 'notifications',
|
path: 'notifications',
|
||||||
|
@ -77,13 +119,13 @@ export default {
|
||||||
import('src/pages/Worker/Card/WorkerNotificationsManager.vue'),
|
import('src/pages/Worker/Card/WorkerNotificationsManager.vue'),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: 'WorkerPda',
|
path: 'pbx',
|
||||||
path: 'pda',
|
name: 'WorkerPBX',
|
||||||
meta: {
|
meta: {
|
||||||
title: 'pda',
|
title: 'pbx',
|
||||||
icon: 'phone_android',
|
icon: 'vn:pbx',
|
||||||
},
|
},
|
||||||
component: () => import('src/pages/Worker/Card/WorkerPda.vue'),
|
component: () => import('src/pages/Worker/Card/WorkerPBX.vue'),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: 'WorkerLog',
|
name: 'WorkerLog',
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/// <reference types="cypress" />
|
/// <reference types="cypress" />
|
||||||
describe('Ticket descriptor', () => {
|
describe('Ticket descriptor', () => {
|
||||||
const toCloneOpt = '.q-list > :nth-child(5)';
|
const toCloneOpt = '.q-list > :nth-child(5)';
|
||||||
const warehouseValue = '.summaryBody > :nth-child(2) > :nth-child(6) > .value > span';
|
const warehouseValue = ':nth-child(1) > :nth-child(6) > .value > span';
|
||||||
const summaryHeader = '.summaryHeader > div';
|
const summaryHeader = '.summaryHeader > div';
|
||||||
|
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
|
|
Loading…
Reference in New Issue