forked from verdnatura/salix-front
refs #6321 perf: move dialogs to new files
This commit is contained in:
parent
6b564bb648
commit
1e09e9e4bb
|
@ -0,0 +1,46 @@
|
|||
diff --git a/src/layouts/ViewLayout.vue b/src/layouts/ViewLayout.vue
|
||||
new file mode 100644
|
||||
index 00000000..4812e7a8
|
||||
--- /dev/null
|
||||
+++ b/src/layouts/ViewLayout.vue
|
||||
@@ -0,0 +1,16 @@
|
||||
+<script setup>
|
||||
+import { useStateStore } from 'stores/useStateStore';
|
||||
+import LeftMenu from 'components/LeftMenu.vue';
|
||||
+
|
||||
+const stateStore = useStateStore();
|
||||
+</script>
|
||||
+<template>
|
||||
+ <QDrawer v-model="stateStore.leftDrawer" show-if-above :width="256">
|
||||
+ <QScrollArea class="fit text-grey-8">
|
||||
+ <LeftMenu />
|
||||
+ </QScrollArea>
|
||||
+ </QDrawer>
|
||||
+ <QPageContainer>
|
||||
+ <RouterView></RouterView>
|
||||
+ </QPageContainer>
|
||||
+</template>
|
||||
diff --git a/src/pages/Claim/ClaimMain.vue b/src/pages/Claim/ClaimMain.vue
|
||||
index f0dc2e50..6a294fe8 100644
|
||||
--- a/src/pages/Claim/ClaimMain.vue
|
||||
+++ b/src/pages/Claim/ClaimMain.vue
|
||||
@@ -1,17 +1,7 @@
|
||||
<script setup>
|
||||
-import { useStateStore } from 'stores/useStateStore';
|
||||
-import LeftMenu from 'components/LeftMenu.vue';
|
||||
-
|
||||
-const stateStore = useStateStore();
|
||||
+import ViewLayout from 'src/layouts/ViewLayout.vue';
|
||||
</script>
|
||||
|
||||
<template>
|
||||
- <QDrawer v-model="stateStore.leftDrawer" show-if-above :width="256">
|
||||
- <QScrollArea class="fit text-grey-8">
|
||||
- <LeftMenu />
|
||||
- </QScrollArea>
|
||||
- </QDrawer>
|
||||
- <QPageContainer>
|
||||
- <RouterView></RouterView>
|
||||
- </QPageContainer>
|
||||
+ <ViewLayout></ViewLayout>
|
||||
</template>
|
|
@ -0,0 +1,72 @@
|
|||
diff --git a/quasar.config.js b/quasar.config.js
|
||||
index 2d828950..80ddc375 100644
|
||||
--- a/quasar.config.js
|
||||
+++ b/quasar.config.js
|
||||
@@ -29,7 +29,7 @@ module.exports = configure(function (/* ctx */) {
|
||||
// app boot file (/src/boot)
|
||||
// --> boot files are part of "main.js"
|
||||
// https://v2.quasar.dev/quasar-cli/boot-files
|
||||
- boot: ['i18n', 'axios', 'vnDate', 'validations'],
|
||||
+ boot: ['i18n', 'axios', 'vnDate', 'validations', 'quasar'],
|
||||
|
||||
// https://v2.quasar.dev/quasar-cli-vite/quasar-config-js#css
|
||||
css: ['app.scss'],
|
||||
diff --git a/src/boot/qformMixin.js b/src/boot/qformMixin.js
|
||||
new file mode 100644
|
||||
index 00000000..7130b071
|
||||
--- /dev/null
|
||||
+++ b/src/boot/qformMixin.js
|
||||
@@ -0,0 +1,28 @@
|
||||
+import { QForm } from 'quasar';
|
||||
+import { getCurrentInstance } from 'vue';
|
||||
+
|
||||
+export default {
|
||||
+ inject: { QForm },
|
||||
+ component: { QForm },
|
||||
+ components: { QForm },
|
||||
+ extends: { QForm },
|
||||
+ mounted: function () {
|
||||
+ const vm = getCurrentInstance();
|
||||
+ if (vm.type.name === 'QForm')
|
||||
+ if (![ 'searchbarForm'].includes(this.$el?.id)) {
|
||||
+ let that = this;
|
||||
+ const elementsArray = Array.from(this.$el.elements);
|
||||
+ const index = elementsArray.findIndex(element => element.classList.contains('q-field__native'));
|
||||
+
|
||||
+ if (index !== -1) {
|
||||
+ const firstInputElement = elementsArray[index];
|
||||
+ firstInputElement.focus();
|
||||
+ }
|
||||
+ document.addEventListener('keyup', function (evt) {
|
||||
+ if (evt.keyCode === 13) {
|
||||
+ that.onSubmit();
|
||||
+ }
|
||||
+ });
|
||||
+ }
|
||||
+ },
|
||||
+};
|
||||
diff --git a/src/boot/quasar.js b/src/boot/quasar.js
|
||||
new file mode 100644
|
||||
index 00000000..a8d9b7ad
|
||||
--- /dev/null
|
||||
+++ b/src/boot/quasar.js
|
||||
@@ -0,0 +1,6 @@
|
||||
+import { boot } from 'quasar/wrappers';
|
||||
+import qFormMixin from './qformMixin';
|
||||
+
|
||||
+export default boot(({ app }) => {
|
||||
+ app.mixin(qFormMixin);
|
||||
+});
|
||||
diff --git a/src/components/ui/VnSearchbar.vue b/src/components/ui/VnSearchbar.vue
|
||||
index baab4829..a8065948 100644
|
||||
--- a/src/components/ui/VnSearchbar.vue
|
||||
+++ b/src/components/ui/VnSearchbar.vue
|
||||
@@ -108,7 +108,7 @@ async function search() {
|
||||
</script>
|
||||
|
||||
<template>
|
||||
- <QForm @submit="search">
|
||||
+ <QForm @submit="search" id="searchbarForm">
|
||||
<VnInput
|
||||
id="searchbar"
|
||||
v-model="searchText"
|
|
@ -0,0 +1,33 @@
|
|||
diff --git a/test/cypress/support/commands.js b/test/cypress/support/commands.js
|
||||
index f075d500..515e9d81 100755
|
||||
--- a/test/cypress/support/commands.js
|
||||
+++ b/test/cypress/support/commands.js
|
||||
@@ -28,7 +28,7 @@
|
||||
// Imports Quasar Cypress AE predefined commands
|
||||
// import { registerCommands } from '@quasar/quasar-app-extension-testing-e2e-cypress';
|
||||
Cypress.Commands.add('login', (user) => {
|
||||
- //cy.visit('/#/login');
|
||||
+ cy.visit('/#/login');
|
||||
cy.request({
|
||||
method: 'POST',
|
||||
url: '/api/accounts/login',
|
||||
@@ -38,7 +38,18 @@ Cypress.Commands.add('login', (user) => {
|
||||
},
|
||||
}).then((response) => {
|
||||
window.localStorage.setItem('token', response.body.token);
|
||||
- });
|
||||
+
|
||||
+ cy.request({
|
||||
+ method: 'GET',
|
||||
+ url: '/api/VnUsers/ShareToken',
|
||||
+ headers:{
|
||||
+ Authorization: window.localStorage.getItem('token')
|
||||
+ }
|
||||
+ }).then(({body}) => {
|
||||
+ console.log();
|
||||
+ window.localStorage.setItem('tokenMultimedia', body.multimediaToken.id);
|
||||
+ })
|
||||
+});
|
||||
});
|
||||
|
||||
Cypress.Commands.add('waitForElement', (element) => {
|
|
@ -32,6 +32,7 @@
|
|||
"@intlify/unplugin-vue-i18n": "^0.8.1",
|
||||
"@pinia/testing": "^0.1.2",
|
||||
"@quasar/app-vite": "^1.7.3",
|
||||
"@quasar/quasar-app-extension-qcalendar": "4.0.0-beta.15",
|
||||
"@quasar/quasar-app-extension-testing-unit-vitest": "^0.4.0",
|
||||
"@vue/test-utils": "^2.4.4",
|
||||
"autoprefixer": "^10.4.14",
|
||||
|
|
|
@ -0,0 +1,245 @@
|
|||
diff --git a/src/composables/useCardSize.js b/src/composables/useCardSize.js
|
||||
new file mode 100644
|
||||
index 00000000..7f562106
|
||||
--- /dev/null
|
||||
+++ b/src/composables/useCardSize.js
|
||||
@@ -0,0 +1,8 @@
|
||||
+import { useQuasar } from 'quasar';
|
||||
+
|
||||
+export default function() {
|
||||
+ const quasar = useQuasar();
|
||||
+ if (quasar.screen.gt.xs) return 'q-pa-md'
|
||||
+ else return 'q-pa-xs';
|
||||
+
|
||||
+}
|
||||
diff --git a/src/pages/Claim/Card/ClaimCard.vue b/src/pages/Claim/Card/ClaimCard.vue
|
||||
index 249337c4..78eec9e8 100644
|
||||
--- a/src/pages/Claim/Card/ClaimCard.vue
|
||||
+++ b/src/pages/Claim/Card/ClaimCard.vue
|
||||
@@ -5,6 +5,7 @@ import { useStateStore } from 'stores/useStateStore';
|
||||
import { useI18n } from 'vue-i18n';
|
||||
import ClaimDescriptor from './ClaimDescriptor.vue';
|
||||
import VnSubToolbar from 'src/components/ui/VnSubToolbar.vue';
|
||||
+import useCardSize from 'src/composables/useCardSize';
|
||||
|
||||
const stateStore = useStateStore();
|
||||
const { t } = useI18n();
|
||||
@@ -28,7 +29,7 @@ const { t } = useI18n();
|
||||
<QPageContainer>
|
||||
<QPage>
|
||||
<VnSubToolbar />
|
||||
- <div :class="$q.screen.gt.xs ? 'q-pa-md' : 'q-pa-xs'">
|
||||
+ <div :class="useCardSize()">
|
||||
<RouterView></RouterView>
|
||||
</div>
|
||||
</QPage>
|
||||
diff --git a/src/pages/Customer/Card/CustomerCard.vue b/src/pages/Customer/Card/CustomerCard.vue
|
||||
index a3503628..9da9eb21 100644
|
||||
--- a/src/pages/Customer/Card/CustomerCard.vue
|
||||
+++ b/src/pages/Customer/Card/CustomerCard.vue
|
||||
@@ -6,6 +6,7 @@ import CustomerDescriptor from './CustomerDescriptor.vue';
|
||||
import LeftMenu from 'components/LeftMenu.vue';
|
||||
import VnSearchbar from 'src/components/ui/VnSearchbar.vue';
|
||||
import VnSubToolbar from 'src/components/ui/VnSubToolbar.vue';
|
||||
+import useCardSize from 'src/composables/useCardSize';
|
||||
|
||||
const stateStore = useStateStore();
|
||||
const route = useRoute();
|
||||
@@ -30,7 +31,7 @@ const { t } = useI18n();
|
||||
<QPageContainer>
|
||||
<QPage>
|
||||
<VnSubToolbar />
|
||||
- <div :class="$q.screen.gt.xs ? 'q-pa-md' : 'q-pa-xs'">
|
||||
+ <div :class="useCardSize()">
|
||||
<RouterView></RouterView>
|
||||
</div>
|
||||
</QPage>
|
||||
diff --git a/src/pages/Entry/Card/EntryCard.vue b/src/pages/Entry/Card/EntryCard.vue
|
||||
index eea0b3b6..5a2bef18 100644
|
||||
--- a/src/pages/Entry/Card/EntryCard.vue
|
||||
+++ b/src/pages/Entry/Card/EntryCard.vue
|
||||
@@ -7,6 +7,7 @@ import VnSubToolbar from 'src/components/ui/VnSubToolbar.vue';
|
||||
import EntryDescriptor from './EntryDescriptor.vue';
|
||||
|
||||
import { useStateStore } from 'stores/useStateStore';
|
||||
+import useCardSize from 'src/composables/useCardSize';
|
||||
|
||||
const { t } = useI18n();
|
||||
const stateStore = useStateStore();
|
||||
@@ -33,7 +34,7 @@ const stateStore = useStateStore();
|
||||
<QPage>
|
||||
<VnSubToolbar />
|
||||
|
||||
- <div :class="$q.screen.gt.xs ? 'q-pa-md' : 'q-pa-xs'">
|
||||
+ <div :class="useCardSize()">
|
||||
<RouterView></RouterView>
|
||||
</div>
|
||||
</QPage>
|
||||
diff --git a/src/pages/InvoiceIn/Card/InvoiceInCard.vue b/src/pages/InvoiceIn/Card/InvoiceInCard.vue
|
||||
index c0e36e58..0de31c18 100644
|
||||
--- a/src/pages/InvoiceIn/Card/InvoiceInCard.vue
|
||||
+++ b/src/pages/InvoiceIn/Card/InvoiceInCard.vue
|
||||
@@ -8,6 +8,7 @@ import VnSubToolbar from 'src/components/ui/VnSubToolbar.vue';
|
||||
import { useArrayData } from 'src/composables/useArrayData';
|
||||
import { onMounted, watch } from 'vue';
|
||||
import { useRoute } from 'vue-router';
|
||||
+import useCardSize from 'src/composables/useCardSize';
|
||||
|
||||
const stateStore = useStateStore();
|
||||
const { t } = useI18n();
|
||||
@@ -74,7 +75,7 @@ watch(
|
||||
<QPageContainer>
|
||||
<QPage>
|
||||
<VnSubToolbar />
|
||||
- <div :class="$q.screen.gt.xs ? 'q-pa-md' : 'q-pa-xs'">
|
||||
+ <div :class="useCardSize()">
|
||||
<RouterView></RouterView>
|
||||
</div>
|
||||
</QPage>
|
||||
diff --git a/src/pages/InvoiceOut/Card/InvoiceOutCard.vue b/src/pages/InvoiceOut/Card/InvoiceOutCard.vue
|
||||
index fe6649fb..6844df2d 100644
|
||||
--- a/src/pages/InvoiceOut/Card/InvoiceOutCard.vue
|
||||
+++ b/src/pages/InvoiceOut/Card/InvoiceOutCard.vue
|
||||
@@ -5,6 +5,7 @@ import InvoiceOutDescriptor from './InvoiceOutDescriptor.vue';
|
||||
import LeftMenu from 'components/LeftMenu.vue';
|
||||
import VnSearchbar from 'components/ui/VnSearchbar.vue';
|
||||
import VnSubToolbar from 'src/components/ui/VnSubToolbar.vue';
|
||||
+import useCardSize from 'src/composables/useCardSize';
|
||||
|
||||
const stateStore = useStateStore();
|
||||
const { t } = useI18n();
|
||||
@@ -28,7 +29,7 @@ const { t } = useI18n();
|
||||
<QPageContainer>
|
||||
<QPage>
|
||||
<VnSubToolbar />
|
||||
- <div :class="$q.screen.gt.xs ? 'q-pa-md' : 'q-pa-xs'">
|
||||
+ <div :class="useCardSize()">
|
||||
<RouterView></RouterView>
|
||||
</div>
|
||||
</QPage>
|
||||
diff --git a/src/pages/Item/Card/ItemCard.vue b/src/pages/Item/Card/ItemCard.vue
|
||||
index 5ca20d6f..3b3750b2 100644
|
||||
--- a/src/pages/Item/Card/ItemCard.vue
|
||||
+++ b/src/pages/Item/Card/ItemCard.vue
|
||||
@@ -4,6 +4,7 @@ import VnSubToolbar from 'src/components/ui/VnSubToolbar.vue';
|
||||
import ItemDescriptor from './ItemDescriptor.vue';
|
||||
|
||||
import { useStateStore } from 'stores/useStateStore';
|
||||
+import useCardSize from 'src/composables/useCardSize';
|
||||
|
||||
const stateStore = useStateStore();
|
||||
</script>
|
||||
@@ -19,7 +20,7 @@ const stateStore = useStateStore();
|
||||
<QPage>
|
||||
<VnSubToolbar />
|
||||
|
||||
- <div :class="$q.screen.gt.xs ? 'q-pa-md' : 'q-pa-xs'">
|
||||
+ <div :class="useCardSize()">
|
||||
<RouterView></RouterView>
|
||||
</div>
|
||||
</QPage>
|
||||
diff --git a/src/pages/Supplier/Card/SupplierCard.vue b/src/pages/Supplier/Card/SupplierCard.vue
|
||||
index 74b2dfb4..fdf1d785 100644
|
||||
--- a/src/pages/Supplier/Card/SupplierCard.vue
|
||||
+++ b/src/pages/Supplier/Card/SupplierCard.vue
|
||||
@@ -5,6 +5,7 @@ import VnSearchbar from 'src/components/ui/VnSearchbar.vue';
|
||||
import LeftMenu from 'components/LeftMenu.vue';
|
||||
import SupplierDescriptor from './SupplierDescriptor.vue';
|
||||
import VnSubToolbar from 'src/components/ui/VnSubToolbar.vue';
|
||||
+import useCardSize from 'src/composables/useCardSize';
|
||||
|
||||
const stateStore = useStateStore();
|
||||
const { t } = useI18n();
|
||||
@@ -30,7 +31,7 @@ const { t } = useI18n();
|
||||
<QPageContainer>
|
||||
<QPage>
|
||||
<VnSubToolbar />
|
||||
- <div :class="$q.screen.gt.xs ? 'q-pa-md' : 'q-pa-xs'">
|
||||
+ <div :class="useCardSize()">
|
||||
<RouterView></RouterView>
|
||||
</div>
|
||||
</QPage>
|
||||
diff --git a/src/pages/Ticket/Card/TicketCard.vue b/src/pages/Ticket/Card/TicketCard.vue
|
||||
index 568cf644..0d5d3803 100644
|
||||
--- a/src/pages/Ticket/Card/TicketCard.vue
|
||||
+++ b/src/pages/Ticket/Card/TicketCard.vue
|
||||
@@ -5,6 +5,7 @@ import TicketDescriptor from './TicketDescriptor.vue';
|
||||
import LeftMenu from 'components/LeftMenu.vue';
|
||||
import VnSearchbar from 'src/components/ui/VnSearchbar.vue';
|
||||
import VnSubToolbar from 'src/components/ui/VnSubToolbar.vue';
|
||||
+import useCardSize from 'src/composables/useCardSize';
|
||||
|
||||
const stateStore = useStateStore();
|
||||
const { t } = useI18n();
|
||||
@@ -29,7 +30,7 @@ const { t } = useI18n();
|
||||
<QPage>
|
||||
<VnSubToolbar />
|
||||
|
||||
- <div :class="$q.screen.gt.xs ? 'q-pa-md' : 'q-pa-xs'">
|
||||
+ <div :class="useCardSize()">
|
||||
<RouterView></RouterView>
|
||||
</div>
|
||||
</QPage>
|
||||
diff --git a/src/pages/Travel/Card/TravelCard.vue b/src/pages/Travel/Card/TravelCard.vue
|
||||
index 76bf74c6..e6c7b7e2 100644
|
||||
--- a/src/pages/Travel/Card/TravelCard.vue
|
||||
+++ b/src/pages/Travel/Card/TravelCard.vue
|
||||
@@ -3,6 +3,7 @@ import { useStateStore } from 'stores/useStateStore';
|
||||
import TravelDescriptor from './TravelDescriptor.vue';
|
||||
import LeftMenu from 'components/LeftMenu.vue';
|
||||
import VnSubToolbar from 'src/components/ui/VnSubToolbar.vue';
|
||||
+import useCardSize from 'src/composables/useCardSize';
|
||||
|
||||
const stateStore = useStateStore();
|
||||
</script>
|
||||
@@ -17,7 +18,7 @@ const stateStore = useStateStore();
|
||||
<QPageContainer>
|
||||
<QPage>
|
||||
<VnSubToolbar />
|
||||
- <div :class="$q.screen.gt.xs ? 'q-pa-md' : 'q-pa-xs'">
|
||||
+ <div :class="useCardSize()">
|
||||
<RouterView></RouterView>
|
||||
</div>
|
||||
</QPage>
|
||||
diff --git a/src/pages/Wagon/Card/WagonCard.vue b/src/pages/Wagon/Card/WagonCard.vue
|
||||
index ba451777..5ac18fb4 100644
|
||||
--- a/src/pages/Wagon/Card/WagonCard.vue
|
||||
+++ b/src/pages/Wagon/Card/WagonCard.vue
|
||||
@@ -3,6 +3,7 @@ import { useI18n } from 'vue-i18n';
|
||||
import { useStateStore } from 'stores/useStateStore';
|
||||
import { useRoute } from 'vue-router';
|
||||
import LeftMenu from 'components/LeftMenu.vue';
|
||||
+import useCardSize from 'src/composables/useCardSize';
|
||||
|
||||
const stateStore = useStateStore();
|
||||
const route = useRoute();
|
||||
@@ -17,7 +18,7 @@ const { t } = useI18n();
|
||||
</QDrawer>
|
||||
<QPageContainer>
|
||||
<QPage>
|
||||
- <div :class="$q.screen.gt.xs ? 'q-pa-md' : 'q-pa-xs'">
|
||||
+ <div :class="useCardSize()">
|
||||
<RouterView></RouterView>
|
||||
</div>
|
||||
</QPage>
|
||||
diff --git a/src/pages/Worker/Card/WorkerCard.vue b/src/pages/Worker/Card/WorkerCard.vue
|
||||
index 3b31f906..0d62dcfc 100644
|
||||
--- a/src/pages/Worker/Card/WorkerCard.vue
|
||||
+++ b/src/pages/Worker/Card/WorkerCard.vue
|
||||
@@ -5,6 +5,7 @@ import WorkerDescriptor from './WorkerDescriptor.vue';
|
||||
import LeftMenu from 'components/LeftMenu.vue';
|
||||
import VnSearchbar from 'src/components/ui/VnSearchbar.vue';
|
||||
import VnSubToolbar from 'src/components/ui/VnSubToolbar.vue';
|
||||
+import useCardSize from 'src/composables/useCardSize';
|
||||
|
||||
const stateStore = useStateStore();
|
||||
const { t } = useI18n();
|
||||
@@ -29,7 +30,7 @@ const { t } = useI18n();
|
||||
<QPage>
|
||||
<VnSubToolbar />
|
||||
|
||||
- <div :class="$q.screen.gt.xs ? 'q-pa-md' : 'q-pa-xs'">
|
||||
+ <div :class="useCardSize()">
|
||||
<RouterView></RouterView>
|
||||
</div>
|
||||
</QPage>
|
|
@ -0,0 +1,30 @@
|
|||
diff --git a/src/components/FormModel.vue b/src/components/FormModel.vue
|
||||
index 04b4b201..70c9369f 100644
|
||||
--- a/src/components/FormModel.vue
|
||||
+++ b/src/components/FormModel.vue
|
||||
@@ -113,6 +113,8 @@ onUnmounted(() => {
|
||||
state.unset($props.model);
|
||||
});
|
||||
|
||||
+const formRef = ref();
|
||||
+
|
||||
const isLoading = ref(false);
|
||||
// Si elegimos observar los cambios del form significa que inicialmente las actions estaran deshabilitadas
|
||||
const isResetting = ref(false);
|
||||
@@ -152,6 +154,8 @@ async function fetch() {
|
||||
}
|
||||
|
||||
async function save() {
|
||||
+ const isValid = await formRef.value.validate();
|
||||
+ if (!isValid) return;
|
||||
if ($props.observeFormChanges && !hasChanges.value) {
|
||||
notify('globals.noChanges', 'negative');
|
||||
return;
|
||||
@@ -214,6 +218,7 @@ watch(formUrl, async () => {
|
||||
<template>
|
||||
<div class="column items-center full-width">
|
||||
<QForm
|
||||
+ ref="formRef"
|
||||
v-if="formData"
|
||||
@submit="save"
|
||||
@reset="reset"
|
|
@ -0,0 +1,13 @@
|
|||
diff --git a/src/layouts/MainLayout.vue b/src/layouts/MainLayout.vue
|
||||
index 021ee685..8ff625d5 100644
|
||||
--- a/src/layouts/MainLayout.vue
|
||||
+++ b/src/layouts/MainLayout.vue
|
||||
@@ -5,7 +5,7 @@ const quasar = useQuasar();
|
||||
</script>
|
||||
|
||||
<template>
|
||||
- <QLayout view="hHh LpR fFf">
|
||||
+ <QLayout view="hHh LspR fFf">
|
||||
<Navbar />
|
||||
<RouterView></RouterView>
|
||||
<QFooter v-if="quasar.platform.is.mobile"></QFooter>
|
|
@ -0,0 +1,232 @@
|
|||
diff --git a/src/components/CreateBankEntityForm.vue b/src/components/CreateBankEntityForm.vue
|
||||
index 0ad35490..20550255 100644
|
||||
--- a/src/components/CreateBankEntityForm.vue
|
||||
+++ b/src/components/CreateBankEntityForm.vue
|
||||
@@ -60,6 +60,7 @@ const onDataSaved = (formData, requestResponse) => {
|
||||
v-model="data.name"
|
||||
:required="true"
|
||||
:rules="validate('bankEntity.name')"
|
||||
+ autofocus
|
||||
/>
|
||||
</div>
|
||||
<div class="col">
|
||||
diff --git a/src/components/ui/VnRow.vue b/src/components/ui/VnRow.vue
|
||||
index f2d2b55d..a2f89ff3 100644
|
||||
--- a/src/components/ui/VnRow.vue
|
||||
+++ b/src/components/ui/VnRow.vue
|
||||
@@ -1,17 +1,17 @@
|
||||
<template>
|
||||
- <div id="row" class="q-gutter-md q-mb-md">
|
||||
+ <div class="vn-row q-gutter-md q-mb-md">
|
||||
<slot></slot>
|
||||
</div>
|
||||
</template>
|
||||
<style lang="scss" scopped>
|
||||
-#row {
|
||||
+.vn-row {
|
||||
display: flex;
|
||||
> * {
|
||||
flex: 1;
|
||||
}
|
||||
}
|
||||
@media screen and (max-width: 800px) {
|
||||
- #row {
|
||||
+ .vn-row {
|
||||
flex-direction: column;
|
||||
}
|
||||
}
|
||||
diff --git a/src/css/app.scss b/src/css/app.scss
|
||||
index 4fec9db0..35a36797 100644
|
||||
--- a/src/css/app.scss
|
||||
+++ b/src/css/app.scss
|
||||
@@ -89,3 +89,6 @@ input::-webkit-inner-spin-button {
|
||||
-webkit-appearance: none;
|
||||
-moz-appearance: none;
|
||||
}
|
||||
+.vn-row > .flex-0 {
|
||||
+ flex: 0;
|
||||
+}
|
||||
diff --git a/src/pages/Supplier/Card/SupplierAccounts.vue b/src/pages/Supplier/Card/SupplierAccounts.vue
|
||||
index 41df6adb..8600d421 100644
|
||||
--- a/src/pages/Supplier/Card/SupplierAccounts.vue
|
||||
+++ b/src/pages/Supplier/Card/SupplierAccounts.vue
|
||||
@@ -102,64 +102,58 @@ onMounted(() => {
|
||||
:key="index"
|
||||
class="row q-gutter-md q-mb-md"
|
||||
>
|
||||
- <div class="col">
|
||||
- <VnInput :label="t('supplier.accounts.iban')" v-model="row.iban">
|
||||
- <template #append>
|
||||
- <QIcon name="info" class="cursor-info">
|
||||
- <QTooltip>{{
|
||||
- t('components.iban_tooltip')
|
||||
- }}</QTooltip>
|
||||
- </QIcon>
|
||||
- </template>
|
||||
- </VnInput>
|
||||
- </div>
|
||||
- <div class="col">
|
||||
- <VnSelectDialog
|
||||
- :label="t('worker.create.bankEntity')"
|
||||
- v-model="row.bankEntityFk"
|
||||
- :options="bankEntitiesOptions"
|
||||
- option-label="bic"
|
||||
- option-value="id"
|
||||
- hide-selected
|
||||
- >
|
||||
- <template #form>
|
||||
- <CreateBankEntityForm
|
||||
- @on-data-saved="
|
||||
- (_, requestResponse) =>
|
||||
- onBankEntityCreated(requestResponse, row)
|
||||
- "
|
||||
- :show-entity-field="false"
|
||||
- />
|
||||
- </template>
|
||||
- <template #option="scope">
|
||||
- <QItem v-bind="scope.itemProps">
|
||||
- <QItemSection v-if="scope.opt">
|
||||
- <QItemLabel
|
||||
- >{{ scope.opt.bic }}
|
||||
- {{ scope.opt.name }}</QItemLabel
|
||||
- >
|
||||
- </QItemSection>
|
||||
- </QItem>
|
||||
- </template>
|
||||
- </VnSelectDialog>
|
||||
- </div>
|
||||
- <div class="col">
|
||||
- <VnInput
|
||||
- :label="t('supplier.accounts.beneficiary')"
|
||||
- v-model="row.beneficiary"
|
||||
- >
|
||||
- <template #append>
|
||||
- <QIcon name="info" class="cursor-pointer">
|
||||
- <QTooltip>{{
|
||||
- t(
|
||||
- 'Name of the bank account holder if different from the provider'
|
||||
- )
|
||||
- }}</QTooltip>
|
||||
- </QIcon>
|
||||
- </template>
|
||||
- </VnInput>
|
||||
- </div>
|
||||
- <div class="col-1 row justify-center items-center">
|
||||
+ <VnInput :label="t('supplier.accounts.iban')" v-model="row.iban">
|
||||
+ <template #append>
|
||||
+ <QIcon name="info" class="cursor-info">
|
||||
+ <QTooltip>{{ t('components.iban_tooltip') }}</QTooltip>
|
||||
+ </QIcon>
|
||||
+ </template>
|
||||
+ </VnInput>
|
||||
+
|
||||
+ <VnSelectDialog
|
||||
+ :label="t('worker.create.bankEntity')"
|
||||
+ v-model="row.bankEntityFk"
|
||||
+ :options="bankEntitiesOptions"
|
||||
+ option-label="bic"
|
||||
+ option-value="id"
|
||||
+ hide-selected
|
||||
+ >
|
||||
+ <template #form>
|
||||
+ <CreateBankEntityForm
|
||||
+ @on-data-saved="
|
||||
+ (_, requestResponse) =>
|
||||
+ onBankEntityCreated(requestResponse, row)
|
||||
+ "
|
||||
+ :show-entity-field="false"
|
||||
+ />
|
||||
+ </template>
|
||||
+ <template #option="scope">
|
||||
+ <QItem v-bind="scope.itemProps">
|
||||
+ <QItemSection v-if="scope.opt">
|
||||
+ <QItemLabel
|
||||
+ >{{ scope.opt.bic }}
|
||||
+ {{ scope.opt.name }}</QItemLabel
|
||||
+ >
|
||||
+ </QItemSection>
|
||||
+ </QItem>
|
||||
+ </template>
|
||||
+ </VnSelectDialog>
|
||||
+
|
||||
+ <VnInput
|
||||
+ :label="t('supplier.accounts.beneficiary')"
|
||||
+ v-model="row.beneficiary"
|
||||
+ >
|
||||
+ <template #append>
|
||||
+ <QIcon name="info" class="cursor-pointer">
|
||||
+ <QTooltip>{{
|
||||
+ t(
|
||||
+ 'Name of the bank account holder if different from the provider'
|
||||
+ )
|
||||
+ }}</QTooltip>
|
||||
+ </QIcon>
|
||||
+ </template>
|
||||
+ </VnInput>
|
||||
+ <div class="row justify-end items-center flex-0">
|
||||
<QIcon
|
||||
name="delete"
|
||||
size="sm"
|
||||
@@ -174,23 +168,24 @@ onMounted(() => {
|
||||
</div>
|
||||
</VnRow>
|
||||
<VnRow>
|
||||
- <QIcon
|
||||
- name="add"
|
||||
- size="sm"
|
||||
- class="cursor-pointer"
|
||||
- color="primary"
|
||||
- @click="supplierAccountRef.insert()"
|
||||
- >
|
||||
- <QTooltip>
|
||||
- {{ t('Add account') }}
|
||||
- </QTooltip>
|
||||
- </QIcon>
|
||||
+ <div class="row items-center">
|
||||
+ <QIcon
|
||||
+ name="add"
|
||||
+ size="sm"
|
||||
+ class="cursor-pointer"
|
||||
+ color="primary"
|
||||
+ @click="supplierAccountRef.insert()"
|
||||
+ >
|
||||
+ <QTooltip>
|
||||
+ {{ t('Add account') }}
|
||||
+ </QTooltip>
|
||||
+ </QIcon>
|
||||
+ </div>
|
||||
</VnRow>
|
||||
</QCard>
|
||||
</template>
|
||||
</CrudModel>
|
||||
</template>
|
||||
-
|
||||
<i18n>
|
||||
es:
|
||||
Do you want to change the pay method to wire transfer?: ¿Quieres modificar la forma de pago a transferencia?
|
||||
diff --git a/src/pages/Supplier/Card/SupplierAgencyTerm.vue b/src/pages/Supplier/Card/SupplierAgencyTerm.vue
|
||||
index 769ff4da..b53ace0a 100644
|
||||
--- a/src/pages/Supplier/Card/SupplierAgencyTerm.vue
|
||||
+++ b/src/pages/Supplier/Card/SupplierAgencyTerm.vue
|
||||
@@ -108,7 +108,7 @@ onMounted(() => {
|
||||
type="number"
|
||||
/>
|
||||
</div>
|
||||
- <div class="col-1 row justify-center items-center">
|
||||
+ <div class="flex-0 row justify-center items-center">
|
||||
<QIcon
|
||||
name="delete"
|
||||
size="sm"
|
||||
diff --git a/src/pages/Supplier/Card/SupplierContacts.vue b/src/pages/Supplier/Card/SupplierContacts.vue
|
||||
index 3abe5a9c..5f1ecd83 100644
|
||||
--- a/src/pages/Supplier/Card/SupplierContacts.vue
|
||||
+++ b/src/pages/Supplier/Card/SupplierContacts.vue
|
||||
@@ -81,7 +81,7 @@ onMounted(() => {
|
||||
autogrow
|
||||
/>
|
||||
</div>
|
||||
- <div class="col-1 row justify-center items-center">
|
||||
+ <div class="flex-0 row justify-center items-center">
|
||||
<QIcon
|
||||
name="delete"
|
||||
size="sm"
|
|
@ -0,0 +1,230 @@
|
|||
diff --git a/src/components/common/VnInput.vue b/src/components/common/VnInput.vue
|
||||
index 8a01e0be..06654081 100644
|
||||
--- a/src/components/common/VnInput.vue
|
||||
+++ b/src/components/common/VnInput.vue
|
||||
@@ -1,5 +1,5 @@
|
||||
<script setup>
|
||||
-import { computed } from 'vue';
|
||||
+import { computed, ref } from 'vue';
|
||||
import { useI18n } from 'vue-i18n';
|
||||
|
||||
const emit = defineEmits(['update:modelValue', 'update:options', 'keyup.enter']);
|
||||
@@ -26,7 +26,7 @@ const value = computed({
|
||||
emit('update:modelValue', value);
|
||||
},
|
||||
});
|
||||
-
|
||||
+const focus = ref(false);
|
||||
const styleAttrs = computed(() => {
|
||||
return $props.isOutlined
|
||||
? {
|
||||
@@ -43,20 +43,32 @@ const onEnterPress = () => {
|
||||
</script>
|
||||
|
||||
<template>
|
||||
- <QInput
|
||||
- ref="vnInputRef"
|
||||
- v-model="value"
|
||||
- v-bind="{ ...$attrs, ...styleAttrs }"
|
||||
- type="text"
|
||||
- :class="{ required: $attrs.required }"
|
||||
- @keyup.enter="onEnterPress()"
|
||||
+ <div
|
||||
+ @mouseover="focus = true"
|
||||
+ @mouseleave="focus = false"
|
||||
:rules="$attrs.required ? [requiredFieldRule] : null"
|
||||
>
|
||||
- <template v-if="$slots.prepend" #prepend>
|
||||
- <slot name="prepend" />
|
||||
- </template>
|
||||
- <template v-if="$slots.append" #append>
|
||||
- <slot name="append" />
|
||||
- </template>
|
||||
- </QInput>
|
||||
+ <QInput
|
||||
+ ref="vnInputRef"
|
||||
+ v-model="value"
|
||||
+ v-bind="{ ...$attrs, ...styleAttrs }"
|
||||
+ :type="$attrs.type"
|
||||
+ :class="{ required: $attrs.required }"
|
||||
+ @keyup.enter="onEnterPress()"
|
||||
+ >
|
||||
+ <template v-if="$slots.prepend" #prepend>
|
||||
+ <slot name="prepend" />
|
||||
+ </template>
|
||||
+
|
||||
+ <template #append>
|
||||
+ <slot name="append" v-if="$slots.append" />
|
||||
+ <QIcon
|
||||
+ name="close"
|
||||
+ size="xs"
|
||||
+ v-if="focus && value"
|
||||
+ @click="value = null"
|
||||
+ ></QIcon>
|
||||
+ </template>
|
||||
+ </QInput>
|
||||
+ </div>
|
||||
</template>
|
||||
diff --git a/src/components/common/VnInputDate.vue b/src/components/common/VnInputDate.vue
|
||||
index 8e0ef289..2f0863d0 100644
|
||||
--- a/src/components/common/VnInputDate.vue
|
||||
+++ b/src/components/common/VnInputDate.vue
|
||||
@@ -16,6 +16,8 @@ const props = defineProps({
|
||||
default: false,
|
||||
},
|
||||
});
|
||||
+const focus = ref(false);
|
||||
+
|
||||
const emit = defineEmits(['update:modelValue']);
|
||||
const value = computed({
|
||||
get() {
|
||||
@@ -53,30 +55,41 @@ const styleAttrs = computed(() => {
|
||||
</script>
|
||||
|
||||
<template>
|
||||
- <QInput
|
||||
- class="vn-input-date"
|
||||
- rounded
|
||||
- readonly
|
||||
- :model-value="toDate(value)"
|
||||
- v-bind="{ ...$attrs, ...styleAttrs }"
|
||||
- >
|
||||
- <template #append>
|
||||
- <QIcon name="event" class="cursor-pointer">
|
||||
- <QPopupProxy
|
||||
- v-model="isPopupOpen"
|
||||
- cover
|
||||
- transition-show="scale"
|
||||
- transition-hide="scale"
|
||||
- :no-parent-event="props.readonly"
|
||||
- >
|
||||
- <QDate
|
||||
- :model-value="formatDate(value)"
|
||||
- @update:model-value="onDateUpdate"
|
||||
- />
|
||||
- </QPopupProxy>
|
||||
- </QIcon>
|
||||
- </template>
|
||||
- </QInput>
|
||||
+ <div @mouseover="focus = true" @mouseleave="focus = false">
|
||||
+ <QInput
|
||||
+ class="vn-input-date"
|
||||
+ rounded
|
||||
+ readonly
|
||||
+ :model-value="toDate(value)"
|
||||
+ v-bind="{ ...$attrs, ...styleAttrs }"
|
||||
+ @click="isPopupOpen = true"
|
||||
+ >
|
||||
+ <template #append>
|
||||
+ <QIcon
|
||||
+ name="close"
|
||||
+ size="xs"
|
||||
+ v-if="focus && value"
|
||||
+ @click="onDateUpdate(null)"
|
||||
+ ></QIcon>
|
||||
+ <QIcon name="event" class="cursor-pointer">
|
||||
+ <QPopupProxy
|
||||
+ v-model="isPopupOpen"
|
||||
+ cover
|
||||
+ transition-show="scale"
|
||||
+ transition-hide="scale"
|
||||
+ :no-parent-event="props.readonly"
|
||||
+ >
|
||||
+ <QDate
|
||||
+ :today-btn="true"
|
||||
+ mask="YYYY-MM-DD"
|
||||
+ :model-value="value"
|
||||
+ @update:model-value="onDateUpdate"
|
||||
+ />
|
||||
+ </QPopupProxy>
|
||||
+ </QIcon>
|
||||
+ </template>
|
||||
+ </QInput>
|
||||
+ </div>
|
||||
</template>
|
||||
|
||||
<style lang="scss">
|
||||
diff --git a/test/cypress/integration/VnLocation.spec.js b/test/cypress/integration/VnLocation.spec.js
|
||||
index 02b924e4..ab58395f 100644
|
||||
--- a/test/cypress/integration/VnLocation.spec.js
|
||||
+++ b/test/cypress/integration/VnLocation.spec.js
|
||||
@@ -1,7 +1,7 @@
|
||||
const locationOptions ='[role="listbox"] > div.q-virtual-scroll__content > .q-item'
|
||||
describe('VnLocation', () => {
|
||||
describe('Create',()=>{
|
||||
- const inputLocation = ':nth-child(3) > :nth-child(1) > .q-field > .q-field__inner > .q-field__control';
|
||||
+ const inputLocation = '.q-form .q-card> :nth-child(3) > :nth-child(1) > .q-field > .q-field__inner > .q-field__control';
|
||||
beforeEach(() => {
|
||||
cy.viewport(1280, 720);
|
||||
cy.login('developer');
|
||||
@@ -26,7 +26,7 @@ describe('VnLocation', () => {
|
||||
cy.get(inputLocation).type('ecuador');
|
||||
cy.get(locationOptions).should('have.length',1);
|
||||
cy.get(`${locationOptions}:nth-child(1)`).click();
|
||||
- cy.get(':nth-child(3) > :nth-child(1) > .q-field > .q-field__inner > .q-field__control > :nth-child(2) > .q-icon').click();
|
||||
+ cy.get(inputLocation+'> :nth-child(2) > .q-icon').click();
|
||||
|
||||
});
|
||||
});
|
||||
diff --git a/test/cypress/integration/claim/claimDevelopment.spec.js b/test/cypress/integration/claim/claimDevelopment.spec.js
|
||||
index 26c7ee19..903f58d4 100755
|
||||
--- a/test/cypress/integration/claim/claimDevelopment.spec.js
|
||||
+++ b/test/cypress/integration/claim/claimDevelopment.spec.js
|
||||
@@ -8,6 +8,7 @@ describe('ClaimDevelopment', () => {
|
||||
cy.viewport(1920, 1080);
|
||||
cy.login('developer');
|
||||
cy.visit(`/#/claim/${claimId}/development`);
|
||||
+ cy.waitForElement('tbody');
|
||||
});
|
||||
|
||||
it('should reset line', () => {
|
||||
diff --git a/test/cypress/integration/invoiceIn/invoiceInBasicData.spec.js b/test/cypress/integration/invoiceIn/invoiceInBasicData.spec.js
|
||||
index 20f137ae..fc989d6c 100644
|
||||
--- a/test/cypress/integration/invoiceIn/invoiceInBasicData.spec.js
|
||||
+++ b/test/cypress/integration/invoiceIn/invoiceInBasicData.spec.js
|
||||
@@ -1,6 +1,6 @@
|
||||
/// <reference types="cypress" />
|
||||
describe('InvoiceInBasicData', () => {
|
||||
- const selects = ':nth-child(1) > :nth-child(1) > .q-field';
|
||||
+ const selects = '.q-form .q-card>:nth-child(1) > :nth-child(1) > .q-field';
|
||||
const appendBtns = 'label button';
|
||||
const dialogAppendBtns = '.q-dialog label button';
|
||||
const dialogInputs = '.q-dialog input';
|
||||
diff --git a/test/cypress/support/commands.js b/test/cypress/support/commands.js
|
||||
index f075d500..70c6068e 100755
|
||||
--- a/test/cypress/support/commands.js
|
||||
+++ b/test/cypress/support/commands.js
|
||||
@@ -70,6 +70,7 @@ Cypress.Commands.add('getValue', (selector) => {
|
||||
|
||||
// Fill Inputs
|
||||
Cypress.Commands.add('selectOption', (selector, option) => {
|
||||
+ cy.waitForElement(selector);
|
||||
cy.get(selector).find('.q-select__dropdown-icon').click();
|
||||
cy.get('.q-menu .q-item').contains(option).click();
|
||||
});
|
||||
@@ -181,11 +182,11 @@ Cypress.Commands.add('closeLeftMenu', (element) => {
|
||||
|
||||
Cypress.Commands.add('clearSearchbar', (element) => {
|
||||
if (element) cy.waitForElement(element);
|
||||
- cy.get('#searchbar > form > label > div:nth-child(1) input').clear();
|
||||
+ cy.get('#searchbar > form > div:nth-child(1) > label > div:nth-child(1) input').clear();
|
||||
});
|
||||
|
||||
Cypress.Commands.add('writeSearchbar', (value) => {
|
||||
- cy.get('#searchbar > form > label > div:nth-child(1) input').type(value);
|
||||
+ cy.get('#searchbar > form > div:nth-child(1) > label > div:nth-child(1) input').type(value);
|
||||
});
|
||||
Cypress.Commands.add('validateContent', (selector, expectedValue) => {
|
||||
cy.get(selector).should('have.text', expectedValue);
|
||||
diff --git a/src/pages/Entry/EntryLatestBuys.vue b/src/pages/Entry/EntryLatestBuys.vue
|
||||
index 217a2587..438873a7 100644
|
||||
--- a/src/pages/Entry/EntryLatestBuys.vue
|
||||
+++ b/src/pages/Entry/EntryLatestBuys.vue
|
||||
@@ -88,6 +88,7 @@ const getInputEvents = (col) => {
|
||||
return col.columnFilter.type === 'select'
|
||||
? { 'update:modelValue': () => applyColumnFilter(col) }
|
||||
: {
|
||||
+ 'update:modelValue': () => applyColumnFilter(col),
|
||||
'keyup.enter': () => applyColumnFilter(col),
|
||||
};
|
||||
};
|
|
@ -0,0 +1,43 @@
|
|||
diff --git a/quasar.config.js b/quasar.config.js
|
||||
index 755e96bd..7afe7da1 100644
|
||||
--- a/quasar.config.js
|
||||
+++ b/quasar.config.js
|
||||
@@ -29,7 +29,7 @@ module.exports = configure(function (/* ctx */) {
|
||||
// app boot file (/src/boot)
|
||||
// --> boot files are part of "main.js"
|
||||
// https://v2.quasar.dev/quasar-cli/boot-files
|
||||
- boot: ['i18n', 'axios', 'vnDate', 'validations'],
|
||||
+ boot: ['i18n', 'axios', 'vnDate', 'vn-custom', 'validations'],
|
||||
|
||||
// https://v2.quasar.dev/quasar-cli-vite/quasar-config-js#css
|
||||
css: ['app.scss'],
|
||||
@@ -67,7 +67,7 @@ module.exports = configure(function (/* ctx */) {
|
||||
// analyze: true,
|
||||
// env: {},
|
||||
rawDefine: {
|
||||
- 'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV)
|
||||
+ 'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV),
|
||||
},
|
||||
// ignorePublicFolder: true,
|
||||
// minify: false,
|
||||
@@ -92,7 +92,7 @@ module.exports = configure(function (/* ctx */) {
|
||||
vitePlugins: [
|
||||
[
|
||||
VueI18nPlugin({
|
||||
- runtimeOnly: false
|
||||
+ runtimeOnly: false,
|
||||
}),
|
||||
{
|
||||
// if you want to use Vue I18n Legacy API, you need to set `compositionOnly: false`
|
||||
diff --git a/src/pages/Ticket/TicketList.vue b/src/pages/Ticket/TicketList.vue
|
||||
index 9186eb6a..c6266afb 100644
|
||||
--- a/src/pages/Ticket/TicketList.vue
|
||||
+++ b/src/pages/Ticket/TicketList.vue
|
||||
@@ -70,6 +70,7 @@ function viewSummary(id) {
|
||||
</template>
|
||||
<QDrawer v-model="stateStore.rightDrawer" side="right" :width="256">
|
||||
<QScrollArea class="fit text-grey-8">
|
||||
+ <my-input-number label="Measure" :step="0.001" v-model.number="measure" />
|
||||
<TicketFilter data-key="TicketList" />
|
||||
</QScrollArea>
|
||||
</QDrawer>
|
|
@ -49,6 +49,9 @@ devDependencies:
|
|||
'@quasar/app-vite':
|
||||
specifier: ^1.7.3
|
||||
version: 1.7.3(eslint@8.56.0)(pinia@2.1.7)(quasar@2.14.5)(vue-router@4.2.5)(vue@3.4.19)
|
||||
'@quasar/quasar-app-extension-qcalendar':
|
||||
specifier: 4.0.0-beta.15
|
||||
version: 4.0.0-beta.15
|
||||
'@quasar/quasar-app-extension-testing-unit-vitest':
|
||||
specifier: ^0.4.0
|
||||
version: 0.4.0(@vue/test-utils@2.4.4)(quasar@2.14.5)(vite@5.1.4)(vitest@0.31.4)(vue@3.4.19)
|
||||
|
@ -912,6 +915,13 @@ packages:
|
|||
resolution: {integrity: sha512-SlOhwzXyPQHWgQIS2ncyDdYdksCJvUYNtgsDQqzAKEG3r3d/ejOxvThle79HTK3Q6HB+gQWFG21Ux00Osr5XSw==}
|
||||
dev: false
|
||||
|
||||
/@quasar/quasar-app-extension-qcalendar@4.0.0-beta.15:
|
||||
resolution: {integrity: sha512-i6hQkcP70LXLfVMPZMKQjSg3681gjZmASV3vq6ULzc0LhtBiPneLdVNNtH2itkWxAmaUj+1heQDI5Pa0F7VKLQ==}
|
||||
engines: {node: '>= 10.0.0', npm: '>= 5.6.0', yarn: '>= 1.6.0'}
|
||||
dependencies:
|
||||
'@quasar/quasar-ui-qcalendar': 4.0.0-beta.16
|
||||
dev: true
|
||||
|
||||
/@quasar/quasar-app-extension-testing-unit-vitest@0.4.0(@vue/test-utils@2.4.4)(quasar@2.14.5)(vite@5.1.4)(vitest@0.31.4)(vue@3.4.19):
|
||||
resolution: {integrity: sha512-eyzdUdmZiCueNS+5nedjMmzdbpCetSrtdGIwW6KplW1dTzRbLiNvYUjpBOxQGmJCgEhWy9zuswJ7MZ/bTql24Q==}
|
||||
engines: {node: '>= 12.22.1', npm: '>= 6.14.12', yarn: '>= 1.17.3'}
|
||||
|
@ -939,6 +949,10 @@ packages:
|
|||
- vite
|
||||
dev: true
|
||||
|
||||
/@quasar/quasar-ui-qcalendar@4.0.0-beta.16:
|
||||
resolution: {integrity: sha512-KVbFJD1HQp91tiklv+6XsG7bq8FKK6mhhnoVzmjgoyhUAEb9csfbDPbpegy1/FzXy3o0wITe6mmRZ8nbaiMEZg==}
|
||||
dev: true
|
||||
|
||||
/@quasar/render-ssr-error@1.0.3:
|
||||
resolution: {integrity: sha512-A8RF99q6/sOSe1Ighnh5syEIbliD3qUYEJd2HyfFyBPSMF+WYGXon5dmzg4nUoK662NgOggInevkDyBDJcZugg==}
|
||||
engines: {node: '>= 16'}
|
||||
|
|
|
@ -3,5 +3,6 @@
|
|||
"options": [
|
||||
"scripts"
|
||||
]
|
||||
}
|
||||
},
|
||||
"@quasar/qcalendar": {}
|
||||
}
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,92 @@
|
|||
<script setup>
|
||||
import { ref } from 'vue';
|
||||
import { useI18n } from 'vue-i18n';
|
||||
import axios from 'axios';
|
||||
import { useDialogPluginComponent } from 'quasar';
|
||||
|
||||
const { t } = useI18n();
|
||||
const selectedRows = ref([]);
|
||||
const showNegativeOriginDialog = ref(false);
|
||||
const reasonegativeOriginDialog = ref(null);
|
||||
const { dialogRef, onDialogHide } = useDialogPluginComponent();
|
||||
|
||||
const updateNegativeOrigin = async () => {
|
||||
showNegativeOriginDialog.value = true;
|
||||
const negativeOrigins = selectedRows.value.map(({ itemFk, lack }) => ({
|
||||
itemFk,
|
||||
negativeType: reasonegativeOriginDialog.value,
|
||||
lack,
|
||||
}));
|
||||
|
||||
try {
|
||||
await axios.post(`Tickets/itemLack`, negativeOrigins);
|
||||
dialogRef.value.hide();
|
||||
} catch (err) {
|
||||
return err;
|
||||
}
|
||||
};
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<QDialog ref="dialogRef" @hide="onDialogHide" v-model="showNegativeOriginDialog">
|
||||
<QCard class="q-pa-sm">
|
||||
<QCardSection class="row items-center q-pb-none">
|
||||
<QAvatar
|
||||
:icon="icon"
|
||||
color="primary"
|
||||
text-color="white"
|
||||
size="xl"
|
||||
v-if="icon"
|
||||
/>
|
||||
<span class="text-h6 text-grey">{{
|
||||
t('ticket.negative.modalOrigin.title')
|
||||
}}</span>
|
||||
<QSpace />
|
||||
<QBtn icon="close" flat round dense v-close-popup />
|
||||
</QCardSection>
|
||||
<QCardSection class="row items-center justify-center column items-stretch">
|
||||
<span>{{ t('ticket.negative.modalOrigin.question') }}</span>
|
||||
<QSelect
|
||||
:label="t('globals.reason')"
|
||||
v-model="reasonegativeOriginDialog"
|
||||
:options="['FALTAS', 'CONTENEDOR', 'ENTRADAS', 'OVERBOOKING']"
|
||||
/>
|
||||
</QCardSection>
|
||||
<QCardActions align="right">
|
||||
<QBtn :label="t('globals.cancel')" color="primary" flat v-close-popup />
|
||||
<QBtn
|
||||
:label="t('globals.confirm')"
|
||||
color="primary"
|
||||
:disable="!reasonegativeOriginDialog"
|
||||
@click="updateNegativeOrigin()"
|
||||
unelevated
|
||||
autofocus
|
||||
/> </QCardActions
|
||||
></QCard>
|
||||
</QDialog>
|
||||
</template>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.list {
|
||||
max-height: 100%;
|
||||
padding: 15px;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.grid-style-transition {
|
||||
transition: transform 0.28s, background-color 0.28s;
|
||||
}
|
||||
|
||||
#true {
|
||||
background-color: $positive;
|
||||
}
|
||||
|
||||
#false {
|
||||
background-color: $negative;
|
||||
}
|
||||
|
||||
div.q-dialog__inner > div {
|
||||
max-width: fit-content !important;
|
||||
// background-color: red !important;
|
||||
}
|
||||
</style>
|
|
@ -6,6 +6,8 @@ import VnPaginate from 'components/ui/VnPaginate.vue';
|
|||
import { useSession } from 'src/composables/useSession';
|
||||
import TicketLackFilter from 'pages/Ticket/Negative/TicketLackFilter.vue';
|
||||
import TicketDescriptorDialog from 'pages/Ticket/Negative/TicketLackDescriptorDialog.vue';
|
||||
import NegativeOriginDialog from 'pages/Ticket/Negative/NegativeOriginDialog.vue';
|
||||
import TotalNegativeOriginDialog from 'pages/Ticket/Negative/TotalNegativeOriginDialog.vue';
|
||||
import ItemDescriptorProxy from 'src/pages/Item/Card/ItemDescriptorProxy.vue';
|
||||
import VnSubToolbar from 'src/components/ui/VnSubToolbar.vue';
|
||||
import axios from 'axios';
|
||||
|
@ -289,8 +291,18 @@ const updateNegativeOrigin = async () => {
|
|||
</QCardSection>
|
||||
</QCard>
|
||||
</QDialog>
|
||||
|
||||
<QDialog
|
||||
<TotalNegativeOriginDialog
|
||||
ref="totalNegativeDialogRef"
|
||||
v-model="showTotalNegativeOriginDialog"
|
||||
@hide="onDialogHide"
|
||||
></TotalNegativeOriginDialog>
|
||||
<NegativeOriginDialog
|
||||
ref="originDialogRef"
|
||||
@hide="onDialogHide"
|
||||
v-model="showNegativeOriginDialog"
|
||||
>
|
||||
</NegativeOriginDialog>
|
||||
<!-- <QDialog
|
||||
ref="totalNegativeDialogRef"
|
||||
@hide="onDialogHide"
|
||||
v-model="showTotalNegativeOriginDialog"
|
||||
|
@ -339,9 +351,9 @@ const updateNegativeOrigin = async () => {
|
|||
</VnPaginate>
|
||||
</QCardSection>
|
||||
</QCard>
|
||||
</QDialog>
|
||||
</QDialog> -->
|
||||
|
||||
<QDialog
|
||||
<!-- <QDialog
|
||||
ref="originDialogRef"
|
||||
@hide="onDialogHide"
|
||||
v-model="showNegativeOriginDialog"
|
||||
|
@ -387,7 +399,7 @@ const updateNegativeOrigin = async () => {
|
|||
autofocus
|
||||
/> </QCardActions
|
||||
></QCard>
|
||||
</QDialog>
|
||||
</QDialog> -->
|
||||
|
||||
<QDrawer v-model="stateStore.rightDrawer" side="right" :width="256" show-if-above>
|
||||
<QScrollArea class="fit text-grey-8">
|
||||
|
|
|
@ -0,0 +1,116 @@
|
|||
<script setup>
|
||||
import { computed, ref } from 'vue';
|
||||
import { useI18n } from 'vue-i18n';
|
||||
import VnPaginate from 'components/ui/VnPaginate.vue';
|
||||
import { useDialogPluginComponent } from 'quasar';
|
||||
|
||||
const { t } = useI18n();
|
||||
const selectedRows = ref([]);
|
||||
const showTotalNegativeOriginDialog = ref(false);
|
||||
const { dialogRef, onDialogHide } = useDialogPluginComponent();
|
||||
|
||||
const columns = computed(() => [
|
||||
{
|
||||
name: 'id',
|
||||
label: t('ticket.negative.id'),
|
||||
field: ({ id }) => id,
|
||||
sortable: true,
|
||||
},
|
||||
{
|
||||
name: 'itemFk',
|
||||
label: t('ticket.negative.detail.itemFk'),
|
||||
field: ({ itemFk }) => itemFk,
|
||||
sortable: true,
|
||||
},
|
||||
{
|
||||
name: 'type',
|
||||
label: t('ticket.negative.type'),
|
||||
field: ({ type }) => type,
|
||||
sortable: true,
|
||||
},
|
||||
{
|
||||
name: 'dated',
|
||||
label: t('ticket.negative.detail.shipped'),
|
||||
field: ({ dated }) => dated,
|
||||
sortable: true,
|
||||
},
|
||||
{
|
||||
name: 'quantity',
|
||||
label: t('ticket.negative.detail.quantity'),
|
||||
field: ({ quantity }) => quantity,
|
||||
sortable: true,
|
||||
},
|
||||
]);
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<QDialog ref="dialogRef" @hide="onDialogHide" v-model="showTotalNegativeOriginDialog">
|
||||
<QCard class="q-pa-sm">
|
||||
<QCardSection class="row items-center q-pb-none">
|
||||
<span class="text-h6 text-grey">{{
|
||||
t('ticket.negative.totalNegative')
|
||||
}}</span>
|
||||
<QSpace />
|
||||
<QBtn icon="close" flat round dense v-close-popup />
|
||||
</QCardSection>
|
||||
<QCardSection class="row items-center justify-center column items-stretch">
|
||||
<VnPaginate
|
||||
data-key="NegativeOriginList"
|
||||
:url="`Tickets/negativeOrigin`"
|
||||
auto-load
|
||||
>
|
||||
<template #body="{ rows }">
|
||||
<QTable
|
||||
:columns="columns"
|
||||
:rows="rows"
|
||||
:dense="$q.screen.lt.md"
|
||||
flat
|
||||
row-key="itemFk"
|
||||
selection="multiple"
|
||||
v-model:selected="selectedRows"
|
||||
:grid="$q.screen.lt.md"
|
||||
auto-load
|
||||
:rows-per-page-options="[0]"
|
||||
hide-pagination
|
||||
:pagination="{ rowsPerPage: null }"
|
||||
:no-data-label="t('globals.noResults')"
|
||||
>
|
||||
<template #top>
|
||||
<div style="width: 100%; display: table">
|
||||
<div style="float: right; color: lightgray">
|
||||
{{ `${rows.length} ${t('globals.results')}` }}
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
</QTable>
|
||||
</template>
|
||||
</VnPaginate>
|
||||
</QCardSection>
|
||||
</QCard>
|
||||
</QDialog>
|
||||
</template>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.list {
|
||||
max-height: 100%;
|
||||
padding: 15px;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.grid-style-transition {
|
||||
transition: transform 0.28s, background-color 0.28s;
|
||||
}
|
||||
|
||||
#true {
|
||||
background-color: $positive;
|
||||
}
|
||||
|
||||
#false {
|
||||
background-color: $negative;
|
||||
}
|
||||
|
||||
div.q-dialog__inner > div {
|
||||
max-width: fit-content !important;
|
||||
// background-color: red !important;
|
||||
}
|
||||
</style>
|
|
@ -0,0 +1,13 @@
|
|||
diff --git a/src/layouts/MainLayout.vue b/src/layouts/MainLayout.vue
|
||||
index 021ee685..8ff625d5 100644
|
||||
--- a/src/layouts/MainLayout.vue
|
||||
+++ b/src/layouts/MainLayout.vue
|
||||
@@ -5,7 +5,7 @@ const quasar = useQuasar();
|
||||
</script>
|
||||
|
||||
<template>
|
||||
- <QLayout view="hHh LpR fFf">
|
||||
+ <QLayout view="hHh LspR fFf">
|
||||
<Navbar />
|
||||
<RouterView></RouterView>
|
||||
<QFooter v-if="quasar.platform.is.mobile"></QFooter>
|
|
@ -0,0 +1,138 @@
|
|||
diff --git a/src/components/FormModel.vue b/src/components/FormModel.vue
|
||||
index 9f5ae319..61de5d9f 100644
|
||||
--- a/src/components/FormModel.vue
|
||||
+++ b/src/components/FormModel.vue
|
||||
@@ -10,6 +10,7 @@ import { useValidator } from 'src/composables/useValidator';
|
||||
import useNotify from 'src/composables/useNotify.js';
|
||||
import SkeletonForm from 'components/ui/SkeletonForm.vue';
|
||||
import VnConfirm from './ui/VnConfirm.vue';
|
||||
+import { tMobile } from 'src/composables/tMobile';
|
||||
|
||||
const quasar = useQuasar();
|
||||
const state = useState();
|
||||
@@ -43,6 +44,10 @@ const $props = defineProps({
|
||||
type: Boolean,
|
||||
default: true,
|
||||
},
|
||||
+ defaultButtons: {
|
||||
+ type: Object,
|
||||
+ default: () => {},
|
||||
+ },
|
||||
autoLoad: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
@@ -119,7 +124,19 @@ const hasChanges = ref(!$props.observeFormChanges);
|
||||
const originalData = ref({ ...$props.formInitialData });
|
||||
const formData = computed(() => state.get($props.model));
|
||||
const formUrl = computed(() => $props.url);
|
||||
-
|
||||
+const defaultButtons = computed(() => ({
|
||||
+ save: {
|
||||
+ color: 'primary',
|
||||
+ icon: 'restart_alt',
|
||||
+ label: 'globals.save',
|
||||
+ },
|
||||
+ reset: {
|
||||
+ color: 'primary',
|
||||
+ icon: 'save',
|
||||
+ label: 'globals.reset',
|
||||
+ },
|
||||
+ ...$props.defaultButtons,
|
||||
+}));
|
||||
const startFormWatcher = () => {
|
||||
watch(
|
||||
() => formData.value,
|
||||
@@ -131,10 +148,6 @@ const startFormWatcher = () => {
|
||||
);
|
||||
};
|
||||
|
||||
-function tMobile(...args) {
|
||||
- if (!quasar.platform.is.mobile) return t(...args);
|
||||
-}
|
||||
-
|
||||
async function fetch() {
|
||||
const { data } = await axios.get($props.url, {
|
||||
params: { filter: JSON.stringify($props.filter) },
|
||||
@@ -233,21 +246,21 @@ watch(formUrl, async () => {
|
||||
<QBtnGroup push class="q-gutter-x-sm">
|
||||
<slot name="moreActions" />
|
||||
<QBtn
|
||||
- :label="tMobile('globals.reset')"
|
||||
- color="primary"
|
||||
- icon="restart_alt"
|
||||
+ :label="tMobile(defaultButtons.reset.label)"
|
||||
+ :color="defaultButtons.reset.color"
|
||||
+ :icon="defaultButtons.reset.icon"
|
||||
flat
|
||||
@click="reset"
|
||||
:disable="!hasChanges"
|
||||
- :title="t('globals.reset')"
|
||||
+ :title="t(defaultButtons.reset.label)"
|
||||
/>
|
||||
<QBtn
|
||||
- :label="tMobile('globals.save')"
|
||||
- color="primary"
|
||||
- icon="save"
|
||||
+ :label="tMobile(defaultButtons.save.label)"
|
||||
+ :color="defaultButtons.save.color"
|
||||
+ :icon="defaultButtons.save.icon"
|
||||
@click="save"
|
||||
:disable="!hasChanges"
|
||||
- :title="t('globals.save')"
|
||||
+ :title="t(defaultButtons.save.label)"
|
||||
/>
|
||||
</QBtnGroup>
|
||||
</div>
|
||||
diff --git a/src/i18n/es/index.js b/src/i18n/es/index.js
|
||||
index be16e367..a9684e4d 100644
|
||||
--- a/src/i18n/es/index.js
|
||||
+++ b/src/i18n/es/index.js
|
||||
@@ -31,6 +31,7 @@ export default {
|
||||
close: 'Cerrar',
|
||||
cancel: 'Cancelar',
|
||||
confirm: 'Confirmar',
|
||||
+ assign: 'Asignar',
|
||||
back: 'Volver',
|
||||
yes: 'Si',
|
||||
no: 'No',
|
||||
@@ -881,6 +882,7 @@ export default {
|
||||
model: 'Modelo',
|
||||
serialNumber: 'Número de serie',
|
||||
removePDA: 'Desasignar PDA',
|
||||
+ assignPDA: 'Asignar PDA',
|
||||
},
|
||||
create: {
|
||||
name: 'Nombre',
|
||||
diff --git a/src/pages/Worker/Card/WorkerPda.vue b/src/pages/Worker/Card/WorkerPda.vue
|
||||
index a487f249..964846d7 100644
|
||||
--- a/src/pages/Worker/Card/WorkerPda.vue
|
||||
+++ b/src/pages/Worker/Card/WorkerPda.vue
|
||||
@@ -2,14 +2,16 @@
|
||||
import { useI18n } from 'vue-i18n';
|
||||
import { useRoute } from 'vue-router';
|
||||
import { onMounted, ref, computed } from 'vue';
|
||||
-
|
||||
import FetchData from 'components/FetchData.vue';
|
||||
import FormModel from 'components/FormModel.vue';
|
||||
import VnSelectFilter from 'src/components/common/VnSelectFilter.vue';
|
||||
-
|
||||
import useNotify from 'src/composables/useNotify.js';
|
||||
import axios from 'axios';
|
||||
import { useRole } from 'src/composables/useRole';
|
||||
+import { tMobile } from 'src/composables/tMobile';
|
||||
+import { useStateStore } from 'stores/useStateStore';
|
||||
+
|
||||
+const stateStore = useStateStore();
|
||||
|
||||
const route = useRoute();
|
||||
const { t } = useI18n();
|
||||
@@ -77,7 +79,9 @@ onMounted(async () => await fetchCurrentDeviceRef.value.fetch());
|
||||
:url-create="`Workers/${route.params.id}/allocatePDA`"
|
||||
model="DeviceProductionUser"
|
||||
:form-initial-data="newPDA"
|
||||
+ :default-actions="true"
|
||||
auto-load
|
||||
+ :default-buttons="{ save: { label: 'globals.assign' } }"
|
||||
@on-data-saved="(_, data) => setCurrentPDA(data)"
|
||||
>
|
||||
<template #form="{ data }">
|
Loading…
Reference in New Issue