Merge branch 'dev' of https://gitea.verdnatura.es/verdnatura/salix-front into 6942-improveInvoceIn
gitea/salix-front/pipeline/pr-dev This commit looks good Details

This commit is contained in:
Jorge Penadés 2024-05-23 16:49:18 +02:00
commit 75c2800e55
7 changed files with 80 additions and 35 deletions

View File

@ -2,6 +2,7 @@
import { computed, ref } from 'vue'; import { computed, ref } from 'vue';
import { useI18n } from 'vue-i18n'; import { useI18n } from 'vue-i18n';
import isValidDate from 'filters/isValidDate'; import isValidDate from 'filters/isValidDate';
import VnInput from 'components/common/VnInput.vue';
const props = defineProps({ const props = defineProps({
modelValue: { modelValue: {
@ -74,7 +75,7 @@ const styleAttrs = computed(() => {
@click="isPopupOpen = true" @click="isPopupOpen = true"
> >
<template #append> <template #append>
<QIcon name="schedule" class="cursor-pointer"> <QIcon name="Schedule" class="cursor-pointer">
<QPopupProxy <QPopupProxy
v-model="isPopupOpen" v-model="isPopupOpen"
cover cover

View File

@ -59,12 +59,10 @@ const containerClasses = computed(() => {
// Clases para modificar el color de fecha seleccionada en componente QCalendarMonth // Clases para modificar el color de fecha seleccionada en componente QCalendarMonth
.q-dark div .q-calendar-mini .q-calendar-month__day.q-selected .q-calendar__button { .q-dark div .q-calendar-mini .q-calendar-month__day.q-selected .q-calendar__button {
background-color: $primary !important; background-color: $primary !important;
color: white !important;
} }
.q-calendar-mini .q-calendar-month__day.q-selected .q-calendar__button { .q-calendar-mini .q-calendar-month__day.q-selected .q-calendar__button {
background-color: $primary !important; background-color: $primary !important;
color: white !important;
} }
.q-calendar-month__head--weekday { .q-calendar-month__head--weekday {
@ -112,7 +110,6 @@ const containerClasses = computed(() => {
cursor: pointer; cursor: pointer;
} }
} }
.q-calendar-month__week--days > div:nth-child(6), .q-calendar-month__week--days > div:nth-child(6),
.q-calendar-month__week--days > div:nth-child(7) { .q-calendar-month__week--days > div:nth-child(7) {
// Cambia el color de los días sábado y domingo // Cambia el color de los días sábado y domingo

View File

@ -169,6 +169,13 @@ select:-webkit-autofill {
/* q-notification row items-stretch q-notification--standard bg-negative text-white */ /* q-notification row items-stretch q-notification--standard bg-negative text-white */
.q-card,
.q-table,
.q-table__bottom,
.q-drawer {
background-color: var(--vn-section-color);
}
input[type='number'] { input[type='number'] {
-moz-appearance: textfield; -moz-appearance: textfield;
} }

View File

@ -12,6 +12,7 @@ import VnInput from 'components/common/VnInput.vue';
import VnInputTime from 'components/common/VnInputTime.vue'; import VnInputTime from 'components/common/VnInputTime.vue';
import axios from 'axios'; import axios from 'axios';
import RouteSearchbar from 'pages/Route/Card/RouteSearchbar.vue'; import RouteSearchbar from 'pages/Route/Card/RouteSearchbar.vue';
import TableVisibleColumns from 'src/components/common/TableVisibleColumns.vue';
import RouteFilter from 'pages/Route/Card/RouteFilter.vue'; import RouteFilter from 'pages/Route/Card/RouteFilter.vue';
import RouteSummary from 'pages/Route/Card/RouteSummary.vue'; import RouteSummary from 'pages/Route/Card/RouteSummary.vue';
import VnSubToolbar from 'src/components/ui/VnSubToolbar.vue'; import VnSubToolbar from 'src/components/ui/VnSubToolbar.vue';
@ -19,6 +20,7 @@ import { useSession } from 'composables/useSession';
import { useSummaryDialog } from 'src/composables/useSummaryDialog'; import { useSummaryDialog } from 'src/composables/useSummaryDialog';
import RouteListTicketsDialog from 'pages/Route/Card/RouteListTicketsDialog.vue'; import RouteListTicketsDialog from 'pages/Route/Card/RouteListTicketsDialog.vue';
import { useQuasar } from 'quasar'; import { useQuasar } from 'quasar';
import { useArrayData } from 'composables/useArrayData';
const stateStore = useStateStore(); const stateStore = useStateStore();
const { t } = useI18n(); const { t } = useI18n();
@ -26,10 +28,7 @@ const { validate } = useValidator();
const quasar = useQuasar(); const quasar = useQuasar();
const session = useSession(); const session = useSession();
const { viewSummary } = useSummaryDialog(); const { viewSummary } = useSummaryDialog();
const visibleColumns = ref([]);
onMounted(() => (stateStore.rightDrawer = true));
onUnmounted(() => (stateStore.rightDrawer = false));
const selectedRows = ref([]); const selectedRows = ref([]);
const columns = computed(() => [ const columns = computed(() => [
{ {
@ -83,14 +82,14 @@ const columns = computed(() => [
}, },
{ {
name: 'started', name: 'started',
label: t('Hour started'), label: t('hourStarted'),
field: (row) => toHour(row.started), field: (row) => toHour(row.started),
sortable: true, sortable: true,
align: 'left', align: 'left',
}, },
{ {
name: 'finished', name: 'finished',
label: t('Hour finished'), label: t('hourFinished'),
field: (row) => toHour(row.finished), field: (row) => toHour(row.finished),
sortable: true, sortable: true,
align: 'left', align: 'left',
@ -109,7 +108,10 @@ const columns = computed(() => [
align: 'right', align: 'right',
}, },
]); ]);
const arrayData = useArrayData('EntryLatestBuys', {
url: 'Buys/latestBuysFilter',
order: ['itemFk DESC'],
});
const refreshKey = ref(0); const refreshKey = ref(0);
const workers = ref([]); const workers = ref([]);
const agencyList = ref([]); const agencyList = ref([]);
@ -121,7 +123,7 @@ const updateRoute = async (route) => {
return err; return err;
} }
}; };
const allColumnNames = ref([]);
const confirmationDialog = ref(false); const confirmationDialog = ref(false);
const startingDate = ref(null); const startingDate = ref(null);
@ -174,6 +176,13 @@ const openTicketsDialog = (id) => {
}) })
.onOk(() => refreshKey.value++); .onOk(() => refreshKey.value++);
}; };
onMounted(async () => {
stateStore.rightDrawer = true;
allColumnNames.value = columns.value.map((col) => col.name);
await arrayData.fetch({ append: false });
});
onUnmounted(() => (stateStore.rightDrawer = false));
</script> </script>
<template> <template>
@ -231,7 +240,16 @@ const openTicketsDialog = (id) => {
<FetchData url="AgencyModes" @on-fetch="(data) => (agencyList = data)" auto-load /> <FetchData url="AgencyModes" @on-fetch="(data) => (agencyList = data)" auto-load />
<FetchData url="Vehicles" @on-fetch="(data) => (vehicleList = data)" auto-load /> <FetchData url="Vehicles" @on-fetch="(data) => (vehicleList = data)" auto-load />
<QPage class="column items-center"> <QPage class="column items-center">
<VnSubToolbar class="justify-end"> <VnSubToolbar>
<template #st-data>
<TableVisibleColumns
class="LeftIcon"
:all-columns="allColumnNames"
table-code="routesList"
labels-traductions-path="globals"
@on-config-saved="visibleColumns = [...$event]"
/>
</template>
<template #st-actions> <template #st-actions>
<QBtn <QBtn
icon="vn:clone" icon="vn:clone"
@ -267,7 +285,7 @@ const openTicketsDialog = (id) => {
:key="refreshKey" :key="refreshKey"
data-key="RouteList" data-key="RouteList"
url="Routes/filter" url="Routes/filter"
:order="['created DESC', 'id DESC']" :order="['created ASC', 'started ASC', 'id ASC']"
:limit="20" :limit="20"
auto-load auto-load
> >
@ -281,9 +299,10 @@ const openTicketsDialog = (id) => {
row-key="id" row-key="id"
selection="multiple" selection="multiple"
:rows-per-page-options="[0]" :rows-per-page-options="[0]"
:visible-columns="visibleColumns"
hide-pagination hide-pagination
:pagination="{ sortBy: 'ID', descending: true }"
:no-data-label="t('globals.noResults')" :no-data-label="t('globals.noResults')"
style="max-height: 82vh"
> >
<template #body-cell-worker="{ row }"> <template #body-cell-worker="{ row }">
<QTd class="table-input-cell"> <QTd class="table-input-cell">
@ -336,7 +355,7 @@ const openTicketsDialog = (id) => {
</QTd> </QTd>
</template> </template>
<template #body-cell-vehicle="{ row }"> <template #body-cell-vehicle="{ row }">
<QTd class="table-input-cell"> <QTd class="table-input-cell small-column">
<VnSelect <VnSelect
:label="t('Vehicle')" :label="t('Vehicle')"
v-model="row.vehicleFk" v-model="row.vehicleFk"
@ -353,7 +372,7 @@ const openTicketsDialog = (id) => {
</QTd> </QTd>
</template> </template>
<template #body-cell-date="{ row }"> <template #body-cell-date="{ row }">
<QTd class="table-input-cell"> <QTd class="table-input-cell small-column">
<VnInputDate <VnInputDate
v-model="row.created" v-model="row.created"
hide-bottom-space hide-bottom-space
@ -378,10 +397,10 @@ const openTicketsDialog = (id) => {
</QTd> </QTd>
</template> </template>
<template #body-cell-started="{ row }"> <template #body-cell-started="{ row }">
<QTd class="table-input-cell"> <QTd class="table-input-cell small-column">
<VnInputTime <VnInputTime
v-model="row.started" v-model="row.started"
:label="t('Hour started')" :label="t('hourStarted')"
:rules="validate('route.started')" :rules="validate('route.started')"
:is-clearable="false" :is-clearable="false"
hide-bottom-space hide-bottom-space
@ -391,11 +410,11 @@ const openTicketsDialog = (id) => {
</QTd> </QTd>
</template> </template>
<template #body-cell-finished="{ row }"> <template #body-cell-finished="{ row }">
<QTd class="table-input-cell"> <QTd class="table-input-cell small-column">
<VnInputTime <VnInputTime
v-model="row.finished" v-model="row.finished"
autofocus autofocus
:label="t('Hour finished')" :label="t('hourFinished')"
:rules="validate('route.finished')" :rules="validate('route.finished')"
:is-clearable="false" :is-clearable="false"
hide-bottom-space hide-bottom-space
@ -405,7 +424,7 @@ const openTicketsDialog = (id) => {
</QTd> </QTd>
</template> </template>
<template #body-cell-isServed="props"> <template #body-cell-isServed="props">
<QTd> <QTd class="table-input-cell small-column">
<QCheckbox v-model="props.value" disable> <QCheckbox v-model="props.value" disable>
<QTooltip> <QTooltip>
{{ {{
@ -486,15 +505,18 @@ const openTicketsDialog = (id) => {
.table-actions { .table-actions {
gap: 12px; gap: 12px;
} }
th:last-child,
.lock-icon-cell { td:last-child {
text-align: center; background-color: var(--vn-section-color);
margin-left: -20%; position: sticky;
right: 0;
} }
</style> </style>
<i18n> <i18n>
en: en:
newRoute: New Route newRoute: New Route
hourStarted: Started hour
hourFinished: Finished hour
es: es:
ID: ID ID: ID
Worker: Trabajador Worker: Trabajador

View File

@ -1,8 +1,10 @@
<script setup> <script setup>
import { useStateStore } from 'stores/useStateStore'; import { useStateStore } from 'stores/useStateStore';
import LeftMenu from 'src/components/LeftMenu.vue'; import LeftMenu from 'src/components/LeftMenu.vue';
import { onMounted } from 'vue';
const stateStore = useStateStore(); const stateStore = useStateStore();
onMounted(() => (stateStore.leftDrawer = false));
</script> </script>
<template> <template>

View File

@ -82,6 +82,7 @@ const onFetchAbsences = (data) => {
type: type.code, type: type.code,
absenceId: absence.id, absenceId: absence.id,
isFestive: false, isFestive: false,
isHoliday: false,
}); });
}); });
} }

View File

@ -126,7 +126,7 @@ const handleEventSelected = (event, { year, month, day }) => {
} }
const date = new Date(year, month - 1, day); const date = new Date(year, month - 1, day);
if (!event.absenceId) createEvent(date); if (!event?.absenceId) createEvent(date);
else if (event.type == props.absenceType.code) deleteEvent(event, date); else if (event.type == props.absenceType.code) deleteEvent(event, date);
else editEvent(event); else editEvent(event);
}; };
@ -136,24 +136,31 @@ const getEventByTimestamp = ({ year, month, day }) => {
return props.events[stamp] || null; return props.events[stamp] || null;
}; };
const isFestive = (timestamp) => {
const event = getEventByTimestamp(timestamp);
if (!event) return false;
const { isFestive } = event;
return isFestive;
};
const getEventAttrs = (timestamp) => { const getEventAttrs = (timestamp) => {
const event = getEventByTimestamp(timestamp); const event = getEventByTimestamp(timestamp);
if (!event) return {}; if (!event) return {};
const { name, color, isFestive } = event; const { name, color, isFestive, type } = event;
// Atributos a asignar a cada slot que representa un evento en el calendario // Atributos a asignar a cada slot que representa un evento en el calendario
const attrs = { const attrs = {
title: name, title: name,
style: color ? `background-color: ${color};` : '', style: color ? `background-color: ${color};` : ``,
label: timestamp.day, label: timestamp.day,
}; };
if (isFestive) { if (isFestive) {
attrs.class = '--festive'; attrs.class = '--festive';
attrs.label = event.absenceId ? timestamp.day : ''; attrs.label = event.absenceId ?? timestamp.day;
} } else attrs.class = `--${type}`;
return attrs; return attrs;
}; };
@ -162,7 +169,6 @@ const isToday = (timestamp) => {
const { year, month, day } = timestamp; const { year, month, day } = timestamp;
return todayTimestamp.value === new Date(year, month - 1, day).getTime(); return todayTimestamp.value === new Date(year, month - 1, day).getTime();
}; };
onBeforeMount(() => { onBeforeMount(() => {
updateSelectedDate(_year.value); updateSelectedDate(_year.value);
}); });
@ -203,7 +209,6 @@ watch(_year, (newValue) => {
<template #day="{ scope: { timestamp } }"> <template #day="{ scope: { timestamp } }">
<!-- Este slot representa cada día del calendario y muestra un botón representando el correspondiente evento --> <!-- Este slot representa cada día del calendario y muestra un botón representando el correspondiente evento -->
<QBtn <QBtn
v-if="getEventByTimestamp(timestamp)"
v-bind="{ ...getEventAttrs(timestamp) }" v-bind="{ ...getEventAttrs(timestamp) }"
@click=" @click="
handleEventSelected(getEventByTimestamp(timestamp), timestamp) handleEventSelected(getEventByTimestamp(timestamp), timestamp)
@ -223,6 +228,11 @@ watch(_year, (newValue) => {
</template> </template>
<style lang="scss"> <style lang="scss">
.q-calendar-month__day:has(.q-calendar-month__day--content):has(.q-btn.--festive)
.q-calendar-month__day--label__wrapper
button {
color: transparent;
}
.calendar-event { .calendar-event {
display: flex; display: flex;
justify-content: center; justify-content: center;
@ -231,14 +241,19 @@ watch(_year, (newValue) => {
font-size: 13px; font-size: 13px;
line-height: 1.715em; line-height: 1.715em;
cursor: pointer; cursor: pointer;
color: white;
&.--today { &.--today {
border: 2px solid $info; border: 2px solid $info;
} }
&.--festive { &.--festive {
border: 2px solid $negative; color: $negative;
}
&.--holiday {
& > span:nth-child(2) .block {
color: white;
}
} }
&:hover { &:hover {