hotfix: refs #7323 generate code & minor changes #635
|
@ -152,7 +152,7 @@ const getEventAttrs = (timestamp) => {
|
|||
|
||||
if (isFestive) {
|
||||
attrs.class = '--festive';
|
||||
attrs.label = event.absenceId ?? timestamp.day;
|
||||
|
||||
attrs.label = timestamp.day;
|
||||
} else attrs.class = `--${type}`;
|
||||
|
||||
return attrs;
|
||||
|
|
|
@ -93,7 +93,6 @@ const filter = {
|
|||
/>
|
||||
</template>
|
||||
</VnLv>
|
||||
<VnLv :label="t('worker.list.email')" :value="worker.user.email" copy />
|
||||
<VnLv :label="t('worker.summary.boss')" link>
|
||||
<template #value>
|
||||
<VnUserLink
|
||||
|
@ -139,29 +138,25 @@ const filter = {
|
|||
/>
|
||||
<VnLv :label="t('worker.summary.fi')" :value="worker.fi" />
|
||||
<VnLv :label="t('worker.summary.birth')" :value="toDate(worker.birth)" />
|
||||
<VnRow class="q-mt-sm" wrap>
|
||||
<VnLv
|
||||
:label="t('worker.summary.isFreelance')"
|
||||
:value="worker.isFreelance"
|
||||
/>
|
||||
<VnLv
|
||||
:label="t('worker.summary.isSsDiscounted')"
|
||||
:value="worker.isSsDiscounted"
|
||||
/>
|
||||
<VnLv
|
||||
:label="t('worker.summary.hasMachineryAuthorized')"
|
||||
:value="worker.hasMachineryAuthorized"
|
||||
/>
|
||||
<VnLv
|
||||
:label="t('worker.summary.isDisable')"
|
||||
:value="worker.isDisable"
|
||||
/>
|
||||
</VnRow>
|
||||
<VnLv
|
||||
jorgep
commented
Uno debajo del otro. Uno debajo del otro.
|
||||
:label="t('worker.summary.isFreelance')"
|
||||
:value="worker.isFreelance"
|
||||
/>
|
||||
<VnLv
|
||||
:label="t('worker.summary.isSsDiscounted')"
|
||||
:value="worker.isSsDiscounted"
|
||||
/>
|
||||
<VnLv
|
||||
:label="t('worker.summary.hasMachineryAuthorized')"
|
||||
:value="worker.hasMachineryAuthorized"
|
||||
/>
|
||||
<VnLv :label="t('worker.summary.isDisable')" :value="worker.isDisable" />
|
||||
</QCard>
|
||||
<QCard class="vn-one">
|
||||
<VnTitle :text="t('worker.summary.userData')" />
|
||||
<VnLv :label="t('worker.summary.userId')" :value="worker.user.id" />
|
||||
<VnLv :label="t('worker.card.name')" :value="worker.user.nickname" />
|
||||
<VnLv :label="t('worker.list.email')" :value="worker.user.email" copy />
|
||||
<VnLv :label="t('worker.summary.role')">
|
||||
<template #value>
|
||||
<span class="link">
|
||||
|
|
|
@ -34,6 +34,10 @@ const weekdayStore = useWeekdayStore();
|
|||
const weekDays = ref([]);
|
||||
const { openConfirmationModal } = useVnConfirm();
|
||||
const { getWeekOfYear } = date;
|
||||
const defaultDate = computed(() => {
|
||||
const timestamp = route.query.timestamp;
|
||||
return timestamp ? new Date(timestamp * 1000) : Date.vnNew();
|
||||
});
|
||||
|
||||
const workerTimeFormDialogRef = ref(null);
|
||||
const workerTimeReasonFormDialogRef = ref(null);
|
||||
|
@ -56,7 +60,7 @@ const workerTimeFormProps = reactive({
|
|||
// Array utilizado por QCalendar para seleccionar un rango de fechas
|
||||
const selectedCalendarDates = ref([]);
|
||||
// Date formateada para bindear al componente QDate
|
||||
const selectedDateFormatted = ref(toDateString(Date.vnNew()));
|
||||
const selectedDateFormatted = ref(toDateString(defaultDate.value));
|
||||
|
||||
const arrayData = useArrayData('workerData');
|
||||
|
||||
|
@ -423,7 +427,7 @@ onBeforeMount(() => {
|
|||
});
|
||||
|
||||
onMounted(async () => {
|
||||
await setDate(Date.vnNew());
|
||||
await setDate(defaultDate.value);
|
||||
await getMailStates(selectedDate.value);
|
||||
stateStore.rightDrawer = true;
|
||||
});
|
||||
|
@ -547,7 +551,10 @@ onMounted(async () => {
|
|||
<QTd
|
||||
v-for="(day, index) in props.cols"
|
||||
:key="index"
|
||||
style="padding: 20px 16px !important"
|
||||
:style="{
|
||||
padding: '20px 16px !important',
|
||||
'vertical-align': 'baseline',
|
||||
jorgep
commented
Alinea arriba del todo las horas. Probado en Firefox, chorme y Edge. Alinea arriba del todo las horas. Probado en Firefox, chorme y Edge.
|
||||
}"
|
||||
>
|
||||
<div class="full-width column items-center">
|
||||
<WorkerTimeHourChip
|
||||
|
|
|
@ -2,7 +2,6 @@
|
|||
import { onBeforeMount, ref } from 'vue';
|
||||
import { useI18n } from 'vue-i18n';
|
||||
import axios from 'axios';
|
||||
import { useUserConfig } from 'src/composables/useUserConfig';
|
||||
import VnRow from 'components/ui/VnRow.vue';
|
||||
import VnSubToolbar from 'src/components/ui/VnSubToolbar.vue';
|
||||
import VnInputDate from 'components/common/VnInputDate.vue';
|
||||
|
@ -14,15 +13,26 @@ import FetchData from 'components/FetchData.vue';
|
|||
import FormModel from 'components/FormModel.vue';
|
||||
import CreateBankEntityForm from 'src/components/CreateBankEntityForm.vue';
|
||||
import VnRadio from 'src/components/common/VnRadio.vue';
|
||||
import { useState } from 'src/composables/useState';
|
||||
|
||||
const { t } = useI18n();
|
||||
const user = useState().getUser();
|
||||
|
||||
const companiesOptions = ref([]);
|
||||
const workersOptions = ref([]);
|
||||
const payMethodsOptions = ref([]);
|
||||
const bankEntitiesOptions = ref([]);
|
||||
const formData = ref({ isFreelance: false });
|
||||
const defaultPayMethod = ref(0);
|
||||
const formData = ref({ companyFk: user.value.companyFk, isFreelance: false });
|
||||
const defaultPayMethod = ref();
|
||||
|
||||
onBeforeMount(async () => {
|
||||
defaultPayMethod.value = (
|
||||
await axios.get('WorkerConfigs/findOne', {
|
||||
params: { field: ['payMethodFk'] },
|
||||
})
|
||||
).data.payMethodFk;
|
||||
formData.value.payMethodFk = defaultPayMethod.value;
|
||||
});
|
||||
|
||||
function handleLocation(data, location) {
|
||||
const { town, code, provinceFk, countryFk } = location ?? {};
|
||||
|
@ -32,16 +42,20 @@ function handleLocation(data, location) {
|
|||
data.countryFk = countryFk;
|
||||
}
|
||||
|
||||
onBeforeMount(async () => {
|
||||
const userInfo = await useUserConfig().fetch();
|
||||
formData.value.companyFk = userInfo.companyFk;
|
||||
function generateCodeUser(worker) {
|
||||
if (!worker.firstName || !worker.lastNames) return;
|
||||
|
||||
const { data } = await axios.get('WorkerConfigs/findOne', {
|
||||
params: { field: ['payMethodFk'] },
|
||||
});
|
||||
defaultPayMethod.value = data.payMethodFk;
|
||||
formData.value.payMethodFk = defaultPayMethod.value;
|
||||
});
|
||||
const totalName = worker.firstName.concat(' ' + worker.lastNames).toLowerCase();
|
||||
const totalNameArray = totalName.split(' ');
|
||||
let newCode = '';
|
||||
|
||||
for (let part of totalNameArray) newCode += part.charAt(0);
|
||||
|
||||
worker.code = newCode.toUpperCase().slice(0, 3);
|
||||
worker.name = totalNameArray[0] + newCode.slice(1);
|
||||
|
||||
if (!worker.companyFk) worker.companyFk = user.companyFk;
|
||||
}
|
||||
</script>
|
||||
<template>
|
||||
<FetchData
|
||||
|
@ -93,11 +107,13 @@ onBeforeMount(async () => {
|
|||
v-model="data.firstName"
|
||||
:label="t('worker.create.name')"
|
||||
:rules="validate('Worker.firstName')"
|
||||
@update:model-value="generateCodeUser(data)"
|
||||
/>
|
||||
<VnInput
|
||||
v-model="data.lastNames"
|
||||
:label="t('worker.create.lastName')"
|
||||
:rules="validate('Worker.lastNames')"
|
||||
@update:model-value="generateCodeUser(data)"
|
||||
/>
|
||||
<VnInput
|
||||
v-model="data.code"
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
<script setup>
|
||||
import { computed, ref } from 'vue';
|
||||
import { onBeforeMount, computed, ref } from 'vue';
|
||||
import { useI18n } from 'vue-i18n';
|
||||
import { useSummaryDialog } from 'src/composables/useSummaryDialog';
|
||||
import VnSearchbar from 'src/components/ui/VnSearchbar.vue';
|
||||
|
@ -16,6 +16,8 @@ import CreateBankEntityForm from 'src/components/CreateBankEntityForm.vue';
|
|||
import FetchData from 'src/components/FetchData.vue';
|
||||
import RightMenu from 'src/components/common/RightMenu.vue';
|
||||
import WorkerFilter from './WorkerFilter.vue';
|
||||
import { useState } from 'src/composables/useState';
|
||||
import axios from 'axios';
|
||||
|
||||
const { t } = useI18n();
|
||||
const tableRef = ref();
|
||||
|
@ -26,6 +28,8 @@ const payMethodsOptions = ref([]);
|
|||
const bankEntitiesOptions = ref([]);
|
||||
const postcodesOptions = ref([]);
|
||||
|
||||
const user = useState().getUser();
|
||||
const defaultPayMethod = ref();
|
||||
const columns = computed(() => [
|
||||
{
|
||||
align: 'left',
|
||||
|
@ -82,6 +86,14 @@ const columns = computed(() => [
|
|||
},
|
||||
]);
|
||||
|
||||
onBeforeMount(async () => {
|
||||
defaultPayMethod.value = (
|
||||
await axios.get('WorkerConfigs/findOne', {
|
||||
params: { field: ['payMethodFk'] },
|
||||
})
|
||||
).data?.payMethodFk;
|
||||
});
|
||||
|
||||
function handleLocation(data, location) {
|
||||
const { town, code, provinceFk, countryFk } = location ?? {};
|
||||
data.postcode = code;
|
||||
|
@ -98,6 +110,21 @@ function uppercaseStreetModel(data) {
|
|||
},
|
||||
};
|
||||
}
|
||||
|
||||
function generateCodeUser(worker) {
|
||||
if (!worker.firstName || !worker.lastNames) return;
|
||||
|
||||
const totalName = worker.firstName.concat(' ' + worker.lastNames).toLowerCase();
|
||||
const totalNameArray = totalName.split(' ');
|
||||
let newCode = '';
|
||||
|
||||
for (let part of totalNameArray) newCode += part.charAt(0);
|
||||
|
||||
worker.code = newCode.toUpperCase().slice(0, 3);
|
||||
worker.name = totalNameArray[0] + newCode.slice(1);
|
||||
|
||||
if (!worker.companyFk) worker.companyFk = user.companyFk;
|
||||
}
|
||||
</script>
|
||||
<template>
|
||||
<VnSearchbar
|
||||
|
@ -131,6 +158,7 @@ function uppercaseStreetModel(data) {
|
|||
</template>
|
||||
</RightMenu>
|
||||
<VnTable
|
||||
v-if="defaultPayMethod"
|
||||
ref="tableRef"
|
||||
data-key="Worker"
|
||||
url="Workers/filter"
|
||||
|
@ -139,6 +167,8 @@ function uppercaseStreetModel(data) {
|
|||
title: t('Create worker'),
|
||||
onDataSaved: ({ id }) => tableRef.redirect(id),
|
||||
formInitialData: {
|
||||
payMethodFk: defaultPayMethod,
|
||||
companyFk: user.companyFk,
|
||||
isFreelance: false,
|
||||
},
|
||||
}"
|
||||
|
@ -149,7 +179,7 @@ function uppercaseStreetModel(data) {
|
|||
auto-load
|
||||
>
|
||||
<template #more-create-dialog="{ data }">
|
||||
<div class="q-pa-lg full-width" style="max-width: 1200px">
|
||||
jorgep
commented
No hacía nada No hacía nada
|
||||
<div class="q-pa-lg full-width">
|
||||
<VnRadio
|
||||
v-model="data.isFreelance"
|
||||
:val="false"
|
||||
|
@ -163,10 +193,16 @@ function uppercaseStreetModel(data) {
|
|||
@update:model-value="delete data.payMethodFk"
|
||||
/>
|
||||
<VnRow>
|
||||
<VnInput v-model="data.firstName" :label="t('worker.create.name')" />
|
||||
<VnInput
|
||||
jorgep
commented
He creado un punto en la próxima reunión de Salix para que se haga refactor de los componentes create y se pueda usar en los VnTable. Ahora mismo en todos los listados se ha duplicado el código... He creado un punto en la próxima reunión de Salix para que se haga refactor de los componentes create y se pueda usar en los VnTable. Ahora mismo en todos los listados se ha duplicado el código...
|
||||
next
|
||||
v-model="data.firstName"
|
||||
:label="t('worker.create.name')"
|
||||
@update:model-value="generateCodeUser(data)"
|
||||
/>
|
||||
<VnInput
|
||||
v-model="data.lastNames"
|
||||
:label="t('worker.create.lastName')"
|
||||
@update:model-value="generateCodeUser(data)"
|
||||
/>
|
||||
<VnInput v-model="data.code" :label="t('worker.create.code')" />
|
||||
</VnRow>
|
||||
|
|
|
@ -2,6 +2,9 @@ describe('WorkerCreate', () => {
|
|||
const externalRadio = '.q-radio:nth-child(2)';
|
||||
const notification = '.q-notification__message';
|
||||
const developerBossId = 120;
|
||||
const payMethodCross =
|
||||
'.grid-create .full-width > :nth-child(9) .q-select .q-field__append:not(.q-anchor--skip)';
|
||||
const saveBtn = '.q-mt-lg > .q-btn--standard';
|
||||
|
||||
const internal = {
|
||||
Fi: { val: '78457139E' },
|
||||
|
@ -36,7 +39,8 @@ describe('WorkerCreate', () => {
|
|||
|
||||
it('should throw an error if a pay method has not been selected', () => {
|
||||
cy.fillInForm(internal);
|
||||
cy.get('.q-mt-lg > .q-btn--standard').click();
|
||||
cy.get(payMethodCross).click();
|
||||
cy.get(saveBtn).click();
|
||||
cy.get(notification).should('contains.text', 'Payment method is required');
|
||||
});
|
||||
|
||||
|
@ -45,14 +49,14 @@ describe('WorkerCreate', () => {
|
|||
...internal,
|
||||
'Pay method': { val: 'PayMethod one', type: 'select' },
|
||||
});
|
||||
cy.get('.q-mt-lg > .q-btn--standard').click();
|
||||
cy.get(saveBtn).click();
|
||||
cy.get(notification).should('contains.text', 'Data created');
|
||||
});
|
||||
|
||||
it('should create an external', () => {
|
||||
cy.get(externalRadio).click();
|
||||
cy.fillInForm(external);
|
||||
cy.get('.q-mt-lg > .q-btn--standard').click();
|
||||
cy.get(saveBtn).click();
|
||||
cy.get(notification).should('contains.text', 'Data created');
|
||||
});
|
||||
});
|
||||
|
|
Loading…
Reference in New Issue
Esto mostraba el id de la ausencia... en lugar del día. Además, en la lógica de Salix, no he visto nada parecido.