Merge pull request 'fixes #5255 Revisar ticket/boxing' (!49) from 5255-revisar-ticketBoxing into dev
gitea/salix-front/pipeline/head This commit looks good Details

Reviewed-on: #49
Reviewed-by: Alex Moreno <alexm@verdnatura.es>
This commit is contained in:
Alexandre Riera 2023-04-27 08:42:12 +00:00
commit b674bc4d41
11 changed files with 156 additions and 150 deletions

View File

@ -58,9 +58,12 @@ const onResponseError = (error) => {
break; break;
} }
if (session.isLoggedIn && response.status === 401) { if (session.isLoggedIn() && response.status === 401) {
session.destroy(); session.destroy();
Router.push({ path: '/login' }); Router.push({ path: '/login' });
} else if(!session.isLoggedIn())
{
message = 'login.loginError';
} }
Notify.create({ Notify.create({

View File

@ -70,7 +70,7 @@ async function saveDarkMode(value) {
} }
async function saveLanguage(value) { async function saveLanguage(value) {
const query = `/Accounts/${user.value.id}`; const query = `/VnUsers/${user.value.id}`;
await axios.patch(query, { await axios.patch(query, {
lang: value, lang: value,
}); });

View File

@ -5,7 +5,7 @@ export function useRole() {
const state = useState(); const state = useState();
async function fetch() { async function fetch() {
const { data } = await axios.get('Accounts/acl'); const { data } = await axios.get('VnUsers/acl');
const roles = data.roles.map((userRoles) => userRoles.role.name); const roles = data.roles.map((userRoles) => userRoles.role.name);
const userData = { const userData = {

View File

@ -48,25 +48,29 @@ const password = ref('');
const keepLogin = ref(true); const keepLogin = ref(true);
async function onSubmit() { async function onSubmit() {
const { data } = await axios.post('Accounts/login', { try {
user: username.value, const { data } = await axios.post('Accounts/login', {
password: password.value, user: username.value,
}); password: password.value,
});
if (!data) return; if (!data) return;
await session.login(data.token, keepLogin.value); await session.login(data.token, keepLogin.value);
quasar.notify({ quasar.notify({
message: t('login.loginSuccess'), message: t('login.loginSuccess'),
type: 'positive', type: 'positive',
}); });
const currentRoute = router.currentRoute.value; const currentRoute = router.currentRoute.value;
if (currentRoute.query && currentRoute.query.redirect) { if (currentRoute.query && currentRoute.query.redirect) {
router.push(currentRoute.query.redirect); router.push(currentRoute.query.redirect);
} else { } else {
router.push({ name: 'Dashboard' }); router.push({ name: 'Dashboard' });
}
} catch (e) {
//
} }
} }
</script> </script>

View File

@ -1,9 +1,9 @@
<script setup> <script setup>
import { useI18n } from 'vue-i18n';
import { computed, ref, onMounted } from 'vue';
import { useRouter } from 'vue-router';
import axios from 'axios'; import axios from 'axios';
import { date, useQuasar } from 'quasar'; import { date, useQuasar } from 'quasar';
import { computed, onMounted, reactive, ref } from 'vue';
import { useI18n } from 'vue-i18n';
import { useRouter } from 'vue-router';
const router = useRouter(); const router = useRouter();
const { t } = useI18n(); const { t } = useI18n();
@ -21,22 +21,25 @@ const expeditions = ref({});
const lastExpedition = ref(); const lastExpedition = ref();
const slide = ref(null); const slide = ref(null);
const videoList = ref([]); const videoList = ref([]);
const time = ref({ const time = reactive({
min: 0, min: 0,
max: 24, max: 24,
}); });
async function fetch() { async function fetch() {
const filter = { try {
where: { const filter = {
ticketFk: entityId.value, where: {
}, ticketFk: entityId.value,
}; },
const { data } = await axios.get(`/Expeditions/filter`, { };
params: { filter }, const { data } = await axios.get(`/Expeditions/filter`, {
}); params: { filter },
});
if (data) expeditions.value = data; if (data) expeditions.value = data;
} catch (e) {
//
}
} }
async function getVideoList(expeditionId, timed) { async function getVideoList(expeditionId, timed) {
@ -46,115 +49,108 @@ async function getVideoList(expeditionId, timed) {
}; };
if (timed) { if (timed) {
if (timed.max == timed.min) {
if (timed.max != 24) timed.max += 1;
else timed.min -= 1;
}
Object.assign(params, { from: timed.min, to: timed.max }); Object.assign(params, { from: timed.min, to: timed.max });
} }
const { data } = await axios.get(`/Boxings/getVideoList`, { params: params }); await axios.get(`/Boxings/getVideoList`, { params: params }).then((res) => {
const data = res.data;
if (!data.length) {
return quasar.notify({
message: t('ticket.boxing.notFound'),
type: 'negative',
});
}
const list = [];
for (const video of data) {
const videoName = video.split('.')[0].split('T')[1].replace(/-/g, ':');
list.push({
label: videoName,
value: video,
url: `api/Boxings/getVideo?id=${expeditionId}&filename=${video}`,
});
}
const list = []; videoList.value = list.reverse();
for (const video of data) { if (list[0]) {
const videName = video.split('.')[0].split('T')[1].replaceAll('-', ':'); slide.value = list[0].value;
list.push({ time.min = parseInt(list[0].label.split(':')[0]);
label: videName, time.max = parseInt(list[list.length - 1].label.split(':')[0]) + 1;
value: video, }
url: `api/Boxings/getVideo?id=${expeditionId}&filename=${video}`, });
});
}
videoList.value = list.reverse();
if (list[0]) {
slide.value = list[0].value;
time.value = {
min: parseInt(list[0].label.split(':')[0]),
max: parseInt(list[list.length - 1].label.split(':')[0]),
};
}
if (!data.length) {
return quasar.notify({
message: t('ticket.boxing.notFound'),
type: 'negative',
});
}
} }
</script> </script>
<template> <template>
<teleport to=".q-layout"> <QDrawer show-if-above side="right">
<QDrawer show-if-above side="right"> <QScrollArea class="fit">
<QScrollArea class="fit"> <QList bordered separator style="max-width: 318px">
<QList bordered separator style="max-width: 318px"> <QItem v-if="lastExpedition && videoList.length">
<QItem v-if="lastExpedition && videoList.length"> <QItemSection>
<QItemSection> <QItemLabel class="text-h6">
<QItemLabel class="text-h6"> {{ t('ticket.boxing.selectTime') }} ({{ time.min }}-{{
{{ t('ticket.boxing.selectTime') }} ({{ time.min }}-{{ time.max
time.max }})
}}) </QItemLabel>
</QItemLabel> <QRange
<QRange v-model="time"
v-model="time" @change="getVideoList(lastExpedition, time)"
@change="getVideoList(lastExpedition, time)" :min="0"
:min="0" :max="24"
:max="24" :step="1"
:step="1" :left-label-value="time.min + ':00'"
:left-label-value="time.min + ':00'" :right-label-value="time.max + ':00'"
:right-label-value="time.max + ':00'" label
label markers
markers snap
snap color="orange"
color="orange" />
/> </QItemSection>
</QItemSection> </QItem>
</QItem> <QItem v-if="lastExpedition && videoList.length">
<QItem v-if="lastExpedition && videoList.length"> <QItemSection>
<QItemSection> <QSelect
<QSelect color="orange"
color="orange" v-model="slide"
v-model="slide" :options="videoList"
:options="videoList" :label="t('ticket.boxing.selectVideo')"
:label="t('ticket.boxing.selectVideo')" emit-value
emit-value map-options
map-options >
> <template #prepend>
<template #prepend> <QIcon name="schedule" />
<QIcon name="schedule" /> </template>
</template> </QSelect>
</QSelect> </QItemSection>
</QItemSection> </QItem>
</QItem> <QItem
<QItem v-for="expedition in expeditions"
v-for="expedition in expeditions" :key="expedition.id"
:key="expedition.id" @click="getVideoList(expedition.id)"
@click="getVideoList(expedition.id)" clickable
clickable v-ripple
v-ripple >
> <QItemSection>
<QItemSection> <QItemLabel class="text-h6">#{{ expedition.id }}</QItemLabel>
<QItemLabel class="text-h6">#{{ expedition.id }}</QItemLabel> </QItemSection>
</QItemSection> <QItemSection>
<QItemSection> <QItemLabel caption>{{ t('ticket.boxing.created') }}</QItemLabel>
<QItemLabel caption>{{ <QItemLabel>
t('ticket.boxing.created') {{
}}</QItemLabel> date.formatDate(expedition.created, 'YYYY-MM-DD HH:mm:ss')
<QItemLabel> }}
{{ </QItemLabel>
date.formatDate( <QItemLabel caption>{{ t('ticket.boxing.item') }}</QItemLabel>
expedition.created, <QItemLabel>{{ expedition.packagingItemFk }}</QItemLabel>
'YYYY-MM-DD HH:mm:ss' <QItemLabel caption>{{ t('ticket.boxing.worker') }}</QItemLabel>
) <QItemLabel>{{ expedition.userName }}</QItemLabel>
}} </QItemSection>
</QItemLabel> </QItem>
<QItemLabel caption>{{ t('ticket.boxing.item') }}</QItemLabel> </QList>
<QItemLabel>{{ expedition.packagingItemFk }}</QItemLabel> </QScrollArea>
<QItemLabel caption>{{ </QDrawer>
t('ticket.boxing.worker')
}}</QItemLabel>
<QItemLabel>{{ expedition.userName }}</QItemLabel>
</QItemSection>
</QItem>
</QList>
</QScrollArea>
</QDrawer>
</teleport>
<QCard> <QCard>
<QCarousel animated v-model="slide" height="max-content"> <QCarousel animated v-model="slide" height="max-content">

View File

@ -43,13 +43,13 @@ describe('ClaimPhoto', () => {
cy.get( cy.get(
'.multimediaParent > :nth-child(3) > .q-btn > .q-btn__content > .q-icon' '.multimediaParent > :nth-child(3) > .q-btn > .q-btn__content > .q-icon'
).click(); ).click();
cy.get('.q-btn--standard > .q-btn__content > .block').click(); cy.get('.q-btn--unelevated > .q-btn__content > .block').click();
cy.get('.q-notification__message').should('have.text', 'Data deleted'); cy.get('.q-notification__message').should('have.text', 'Data deleted');
cy.get( cy.get(
'.multimediaParent > :nth-child(3) > .q-btn > .q-btn__content > .q-icon' '.multimediaParent > :nth-child(3) > .q-btn > .q-btn__content > .q-icon'
).click(); ).click();
cy.get('.q-btn--standard > .q-btn__content > .block').click(); cy.get('.q-btn--unelevated > .q-btn__content > .block').click();
cy.get('.q-notification__message').should('have.text', 'Data deleted'); cy.get('.q-notification__message').should('have.text', 'Data deleted');
}); });
}); });

View File

@ -1,5 +1,5 @@
/// <reference types="cypress" /> /// <reference types="cypress" />
xdescribe('TicketBoxing', () => { describe('TicketBoxing', () => {
beforeEach(() => { beforeEach(() => {
const ticketId = 1; const ticketId = 1;
cy.viewport(1280, 720); cy.viewport(1280, 720);
@ -26,9 +26,9 @@ xdescribe('TicketBoxing', () => {
}, },
['2022-01-01T01-01-00.mp4', '2022-02-02T02-02-00.mp4', '2022-03-03T03-03-00.mp4'] ['2022-01-01T01-01-00.mp4', '2022-02-02T02-02-00.mp4', '2022-03-03T03-03-00.mp4']
).as('getVideoList'); ).as('getVideoList');
cy.get('.q-list > :nth-child(3)').click(); cy.get('.q-list').eq(3).find('.q-item').eq(2).click();
cy.get('.q-list > :nth-child(1)').should('be.visible'); cy.get('.q-list').eq(3).find('.q-item').eq(0).find('.q-range');
cy.get('.q-list > :nth-child(2)').should('be.visible'); cy.get('.q-list').eq(3).find('.q-item').eq(1).find('.q-select');
}); });
}); });

View File

@ -12,7 +12,10 @@ describe('WorkerList', () => {
}); });
it('should open the worker summary', () => { it('should open the worker summary', () => {
cy.get('div[class="q-item__section column q-item__section--side justify-center q-pa-md"]').eq(0).click(); cy.get('div.text-h6')
.parentsUntil('div.q-card')
.find('div.q-card__actions')
.find('button').first().click();
cy.get('div[class="header bg-primary q-pa-sm q-mb-md"').should('have.text', '1110 - Jessica Jones'); cy.get('div[class="header bg-primary q-pa-sm q-mb-md"').should('have.text', '1110 - Jessica Jones');
cy.get('div[class="q-item__label q-item__label--header text-h6"]').eq(0).should('have.text', 'Basic data'); cy.get('div[class="q-item__label q-item__label--header text-h6"]').eq(0).should('have.text', 'Basic data');
cy.get('div[class="q-item__label q-item__label--header text-h6"]').eq(1).should('have.text', 'User data'); cy.get('div[class="q-item__label q-item__label--header text-h6"]').eq(1).should('have.text', 'User data');

View File

@ -6,10 +6,10 @@ describe('WorkerSummary', () => {
}); });
it('should load worker summary', () => { it('should load worker summary', () => {
cy.get('div[class="header bg-primary q-pa-sm q-mb-md"').should('have.text', '19 - salesBoss'); cy.get('div[class="header bg-primary q-pa-sm q-mb-md"').should('have.text', '19 - salesBoss salesBoss');
cy.get('div[class="q-item__label q-item__label--header text-h6"]').eq(0).should('have.text', 'Basic data'); cy.get('div[class="q-item__label q-item__label--header text-h6"]').eq(0).should('have.text', 'Basic data');
cy.get('div[class="q-item__label q-item__label--header text-h6"]').eq(1).should('have.text', 'User data'); cy.get('div[class="q-item__label q-item__label--header text-h6"]').eq(1).should('have.text', 'User data');
cy.get('div[class="q-item__section column q-item__section--main justify-center"]').eq(0).should('have.text', 'NamesalesBossNick'); cy.get('div[class="q-item__section column q-item__section--main justify-center"]').eq(0).should('have.text', 'NamesalesBossNick');
}); });
}); });

View File

@ -1,15 +1,15 @@
import { vi, describe, expect, it } from 'vitest'; import { Notify } from 'quasar';
import { onRequest, onResponseError } from 'src/boot/axios'; import { onRequest, onResponseError } from 'src/boot/axios';
import { Notify } from 'quasar' import { describe, expect, it, vi } from 'vitest';
vi.mock('src/composables/useSession', () => ({ vi.mock('src/composables/useSession', () => ({
useSession: () => ({ useSession: () => ({
getToken: () => 'DEFAULT_TOKEN' getToken: () => 'DEFAULT_TOKEN',
}), isLoggedIn: () => vi.fn(),
destroy: () => vi.fn(),
})
})); }));
vi.mock('src/router', () => ({}));
describe('Axios boot', () => { describe('Axios boot', () => {
describe('onRequest()', async () => { describe('onRequest()', async () => {

View File

@ -4,7 +4,7 @@ import TicketBoxing from 'pages/Ticket/Card/TicketBoxing.vue';
// #4836 - Investigate how to test q-drawer outside // #4836 - Investigate how to test q-drawer outside
// q-layout or how to teleport q-drawer inside // q-layout or how to teleport q-drawer inside
describe.skip('TicketBoxing', () => { describe('TicketBoxing', () => {
let vm; let vm;
beforeAll(() => { beforeAll(() => {
vm = createWrapper(TicketBoxing).vm; vm = createWrapper(TicketBoxing).vm;