diff --git a/.eslintrc.js b/.eslintrc.js index c8bdecb1a4..1d09a896f6 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -58,7 +58,7 @@ module.exports = { rules: { 'prefer-promise-reject-errors': 'off', 'no-unused-vars': 'warn', - + "vue/no-multiple-template-root": "off" , // allow debugger during development only 'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off', }, diff --git a/package-lock.json b/package-lock.json index 6a60c95c67..ce9c4d7c1c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,6 +12,7 @@ "@quasar/extras": "^1.16.4", "axios": "^1.4.0", "chromium": "^3.0.3", + "croppie": "^2.6.5", "pinia": "^2.1.3", "quasar": "^2.12.0", "validator": "^13.9.0", @@ -3169,6 +3170,11 @@ "node": ">= 10" } }, + "node_modules/croppie": { + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/croppie/-/croppie-2.6.5.tgz", + "integrity": "sha512-IlChnVUGG5T3w2gRZIaQgBtlvyuYnlUWs2YZIXXR3H9KrlO1PtBT3j+ykxvy9eZIWhk+V5SpBmhCQz5UXKrEKQ==" + }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", diff --git a/package.json b/package.json index 1d729b82fe..27ba190a62 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "salix-front", - "version": "24.02.01", + "version": "24.8.0", "description": "Salix frontend", "productName": "Salix", "author": "Verdnatura", @@ -19,6 +19,7 @@ "@quasar/extras": "^1.16.4", "axios": "^1.4.0", "chromium": "^3.0.3", + "croppie": "^2.6.5", "pinia": "^2.1.3", "quasar": "^2.12.0", "validator": "^13.9.0", diff --git a/src/components/CreateBankEntityForm.vue b/src/components/CreateBankEntityForm.vue index 2a13859455..106dbec3ac 100644 --- a/src/components/CreateBankEntityForm.vue +++ b/src/components/CreateBankEntityForm.vue @@ -1,6 +1,7 @@ + + + + +es: + Identifier: Identificador + Model: Modelo + Warehouse: Almacén + Temperature: Temperatura + New thermograph: Nuevo termógrafo + diff --git a/src/components/CrudModel.vue b/src/components/CrudModel.vue index 17fc8fc4ac..9bb05d4390 100644 --- a/src/components/CrudModel.vue +++ b/src/components/CrudModel.vue @@ -196,7 +196,6 @@ function getChanges() { const creates = []; const pk = $props.primaryKey; - for (const [i, row] of formData.value.entries()) { if (!row[pk]) { creates.push(row); diff --git a/src/components/EditPictureForm.vue b/src/components/EditPictureForm.vue new file mode 100644 index 0000000000..9f69896b51 --- /dev/null +++ b/src/components/EditPictureForm.vue @@ -0,0 +1,359 @@ + + + + + + + +es: + Edit photo: Editar foto + Select from computer: Seleccionar desde ordenador + Import from external URL: Importar desde URL externa + Vertical: Vertical + Normal: Normal + Panoramic: Panorámica + Orientation: Orientación + File: Fichero + This photo provider doesn't allow remote downloads: Este proveedor de fotos no permite descargas remotas + Rotate left: Girar a la izquierda + Rotate right: Girar a la derecha + Select an image: Selecciona una imagen + diff --git a/src/components/EditTableCellValueForm.vue b/src/components/EditTableCellValueForm.vue new file mode 100644 index 0000000000..6d3b7b08ba --- /dev/null +++ b/src/components/EditTableCellValueForm.vue @@ -0,0 +1,141 @@ + + + + + + + + en: + editBuyTitle: Edit {buysAmount} buy(s) + es: + editBuyTitle: Editar {buysAmount} compra(s) + Field to edit: Campo a editar + Value: Valor + diff --git a/src/components/FetchData.vue b/src/components/FetchData.vue index 137f751db1..4f5d7a57d4 100644 --- a/src/components/FetchData.vue +++ b/src/components/FetchData.vue @@ -45,7 +45,7 @@ onMounted(async () => { async function fetch(fetchFilter = {}) { try { const filter = Object.assign(fetchFilter, $props.filter); // eslint-disable-line vue/no-dupe-keys - if ($props.where) filter.where = $props.where; + if ($props.where && !fetchFilter.where) filter.where = $props.where; if ($props.sortBy) filter.order = $props.sortBy; if ($props.limit) filter.limit = $props.limit; @@ -54,6 +54,7 @@ async function fetch(fetchFilter = {}) { }); emit('onFetch', data); + return data; } catch (e) { // } diff --git a/src/components/FilterItemForm.vue b/src/components/FilterItemForm.vue new file mode 100644 index 0000000000..4c329a8e80 --- /dev/null +++ b/src/components/FilterItemForm.vue @@ -0,0 +1,242 @@ + + + + + +es: + Filter item: Filtrar artículo + Enter a new search: Introduce una nueva búsqueda + + + diff --git a/src/components/FilterTravelForm.vue b/src/components/FilterTravelForm.vue new file mode 100644 index 0000000000..499d5bc4e3 --- /dev/null +++ b/src/components/FilterTravelForm.vue @@ -0,0 +1,240 @@ + + + + + +es: + Filter travels: Filtro envíos + Enter a new search: Introduce una nueva búsqueda + + + diff --git a/src/components/FormModel.vue b/src/components/FormModel.vue index 4ad566bf8b..9fd16088c7 100644 --- a/src/components/FormModel.vue +++ b/src/components/FormModel.vue @@ -1,6 +1,6 @@ diff --git a/src/components/common/VnSelectCreate.vue b/src/components/common/VnSelectDialog.vue similarity index 74% rename from src/components/common/VnSelectCreate.vue rename to src/components/common/VnSelectDialog.vue index bdc3f5cc8a..355a25109e 100644 --- a/src/components/common/VnSelectCreate.vue +++ b/src/components/common/VnSelectDialog.vue @@ -20,6 +20,14 @@ const $props = defineProps({ type: Array, default: () => ['developer'], }, + actionIcon: { + type: String, + default: 'add', + }, + tooltip: { + type: String, + default: '', + }, }); const role = useRole(); @@ -48,10 +56,12 @@ const toggleForm = () => { diff --git a/src/components/common/VnSelectFilter.vue b/src/components/common/VnSelectFilter.vue index 244fb50bb0..5c26443f27 100644 --- a/src/components/common/VnSelectFilter.vue +++ b/src/components/common/VnSelectFilter.vue @@ -1,5 +1,8 @@ + + diff --git a/src/pages/Worker/Card/WorkerSummaryDialog.vue b/src/components/common/VnSummaryDialog.vue similarity index 61% rename from src/pages/Worker/Card/WorkerSummaryDialog.vue rename to src/components/common/VnSummaryDialog.vue index 59ea702e0f..08fc8870dc 100644 --- a/src/pages/Worker/Card/WorkerSummaryDialog.vue +++ b/src/components/common/VnSummaryDialog.vue @@ -1,21 +1,23 @@ - diff --git a/src/components/ui/CardDescriptor.vue b/src/components/ui/CardDescriptor.vue index 9571c742e2..0e72188922 100644 --- a/src/components/ui/CardDescriptor.vue +++ b/src/components/ui/CardDescriptor.vue @@ -1,9 +1,9 @@ + + + + {{ t('New consignee') }} + + + + +es: + Total: Total + Date: Fecha + Created by: Creado por + Comment: Comentario + Type: Tipo + Amount: Importe + New greuge: Nuevo greuge + diff --git a/src/pages/Customer/Card/CustomerLog.vue b/src/pages/Customer/Card/CustomerLog.vue index fe59bf2dc4..36d79959d5 100644 --- a/src/pages/Customer/Card/CustomerLog.vue +++ b/src/pages/Customer/Card/CustomerLog.vue @@ -1,3 +1,262 @@ + + + + +es: + Search: Buscar + Search by id or concept: xxx + Entity: Entidad + All: Todo + User: Usuario + System: Sistema + Changes: Cambios + Search by changes: xxx + Creates: Crea + Edits: Modifica + Deletes: Elimina + Accesses: Accede + Date: Fecha + To: Hasta + Quit filter: Quitar filtro + diff --git a/src/pages/Customer/Card/CustomerNotes.vue b/src/pages/Customer/Card/CustomerNotes.vue index 09f5c0ce6e..781c57e501 100644 --- a/src/pages/Customer/Card/CustomerNotes.vue +++ b/src/pages/Customer/Card/CustomerNotes.vue @@ -62,7 +62,7 @@ const toCustomerNoteCreate = () => { +import { ref, computed, onBeforeMount } from 'vue'; +import { useI18n } from 'vue-i18n'; +import { useRoute, useRouter } from 'vue-router'; + +import { date, QBtn } from 'quasar'; + +import { useArrayData } from 'composables/useArrayData'; +import { useStateStore } from 'stores/useStateStore'; +import { toCurrency } from 'src/filters'; + +import WorkerDescriptorProxy from 'src/pages/Worker/Card/WorkerDescriptorProxy.vue'; + +const { t } = useI18n(); +const route = useRoute(); +const router = useRouter(); +const stateStore = useStateStore(); + +const arrayData = ref(null); +const workerId = ref(0); +const rows = computed(() => arrayData.value.store.data); + +onBeforeMount(async () => { + const filter = { + where: { clientFk: `${route.params.id}` }, + order: ['started DESC'], + limit: 20, + }; + + arrayData.value = useArrayData('CustomerRecoveriesCard', { + url: 'Recoveries', + filter, + }); + await arrayData.value.fetch({ append: false }); + stateStore.rightDrawer = true; +}); + +const tableColumnComponents = { + since: { + component: 'span', + props: () => {}, + event: () => {}, + }, + to: { + component: 'span', + props: () => {}, + event: () => {}, + }, + amount: { + component: 'span', + props: () => {}, + event: () => {}, + }, + period: { + component: 'span', + props: () => {}, + event: () => {}, + }, +}; + +const columns = computed(() => [ + { + align: 'left', + field: 'started', + label: t('Since'), + name: 'since', + format: (value) => date.formatDate(value, 'DD/MM/YYYY'), + }, + { + align: 'left', + field: 'finished', + label: t('To'), + name: 'to', + format: (value) => date.formatDate(value, 'DD/MM/YYYY'), + }, + { + align: 'left', + field: 'amount', + label: t('Amount'), + name: 'amount', + format: (value) => toCurrency(value), + }, + { + align: 'left', + field: 'period', + label: t('Period'), + name: 'period', + }, +]); + +const toCustomerRecoverieCreate = () => { + router.push({ name: 'CustomerRecoverieCreate' }); +}; + + + + + + +es: + Since: Desde + To: Hasta + Amount: Importe + Period: Periodo + New recoverie: Nuevo recobro + diff --git a/src/pages/Customer/Card/CustomerSummary.vue b/src/pages/Customer/Card/CustomerSummary.vue index 4ebd6efabd..c46b8a8de0 100644 --- a/src/pages/Customer/Card/CustomerSummary.vue +++ b/src/pages/Customer/Card/CustomerSummary.vue @@ -81,7 +81,7 @@ const creditWarning = computed(() => { - + -import { useDialogPluginComponent } from 'quasar'; -import CustomerSummary from './CustomerSummary.vue'; - -const $props = defineProps({ - id: { - type: Number, - required: true, - }, -}); - -defineEmits([...useDialogPluginComponent.emits]); - -const { dialogRef, onDialogHide } = useDialogPluginComponent(); - - - - - diff --git a/src/pages/Customer/Card/CustomerWebAccess.vue b/src/pages/Customer/Card/CustomerWebAccess.vue index 95ec77c3de..d3be7bec85 100644 --- a/src/pages/Customer/Card/CustomerWebAccess.vue +++ b/src/pages/Customer/Card/CustomerWebAccess.vue @@ -1,3 +1,69 @@ + + + + +es: + Enable web access: Habilitar acceso web + User: Usuario + Recovery email: Correo de recuperacion + This email is used for user to regain access their account: Este correo electrónico se usa para que el usuario recupere el acceso a su cuenta + diff --git a/src/pages/Customer/CustomerCreate.vue b/src/pages/Customer/CustomerCreate.vue index 310deb71a5..5d36c6c37a 100644 --- a/src/pages/Customer/CustomerCreate.vue +++ b/src/pages/Customer/CustomerCreate.vue @@ -2,12 +2,11 @@ import { reactive, ref } from 'vue'; import { useI18n } from 'vue-i18n'; -import CustomerCreateNewPostcode from 'src/components/CreateNewPostcodeForm.vue'; import FetchData from 'components/FetchData.vue'; import FormModel from 'components/FormModel.vue'; import VnRow from 'components/ui/VnRow.vue'; import VnSelectFilter from 'src/components/common/VnSelectFilter.vue'; -import VnSelectCreate from 'src/components/common/VnSelectCreate.vue'; +import VnLocation from 'src/components/common/VnLocation.vue'; import VnSubToolbar from 'src/components/ui/VnSubToolbar.vue'; const { t } = useI18n(); @@ -29,23 +28,17 @@ const newClientForm = reactive({ isEqualizated: false, }); -const postcodeFetchDataRef = ref(null); -const townsFetchDataRef = ref(null); const workersOptions = ref([]); const businessTypesOptions = ref([]); -const citiesLocationOptions = ref([]); -const provincesLocationOptions = ref([]); -const countriesOptions = ref([]); const postcodesOptions = ref([]); -const onPostcodeCreated = async ({ code, provinceFk, townFk, countryFk }, formData) => { - await postcodeFetchDataRef.value.fetch(); - await townsFetchDataRef.value.fetch(); - formData.postcode = code; - formData.provinceFk = provinceFk; - formData.city = citiesLocationOptions.value.find((town) => town.id === townFk).name; - formData.countryFk = countryFk; -}; +function handleLocation(data, location) { + const { town, code, provinceFk, countryFk } = location ?? {}; + data.postcode = code; + data.city = town; + data.provinceFk = provinceFk; + data.countryFk = countryFk; +} - - en: params: diff --git a/src/pages/Customer/CustomerList.vue b/src/pages/Customer/CustomerList.vue index 540afcc4cc..56c3749d49 100644 --- a/src/pages/Customer/CustomerList.vue +++ b/src/pages/Customer/CustomerList.vue @@ -1,34 +1,25 @@ - - es: Social name: Razón social diff --git a/src/pages/Customer/Notifications/CustomerNotificationsFilter.vue b/src/pages/Customer/Notifications/CustomerNotificationsFilter.vue index 6501582782..957abb7a36 100644 --- a/src/pages/Customer/Notifications/CustomerNotificationsFilter.vue +++ b/src/pages/Customer/Notifications/CustomerNotificationsFilter.vue @@ -36,91 +36,80 @@ const clients = ref(); - - en: params: diff --git a/src/pages/Customer/Payments/CustomerPayments.vue b/src/pages/Customer/Payments/CustomerPayments.vue index de774e63e0..eedaaf1372 100644 --- a/src/pages/Customer/Payments/CustomerPayments.vue +++ b/src/pages/Customer/Payments/CustomerPayments.vue @@ -122,7 +122,7 @@ function stateColor(row) { -
+
.customer-payments { - .card-list { - width: 100%; - max-width: 60em; - - .q-table--dense .q-table th:first-child { - padding-left: 0; - } - td { - max-width: 130px; - overflow: hidden; - text-overflow: ellipsis; - } + .q-table--dense .q-table th:first-child { + padding-left: 0; + } + td { + max-width: 130px; + overflow: hidden; + text-overflow: ellipsis; } } diff --git a/src/pages/Customer/Payments/CustomerPaymentsFilter.vue b/src/pages/Customer/Payments/CustomerPaymentsFilter.vue index a19b35a206..74ea2c2037 100644 --- a/src/pages/Customer/Payments/CustomerPaymentsFilter.vue +++ b/src/pages/Customer/Payments/CustomerPaymentsFilter.vue @@ -27,71 +27,60 @@ function isValidNumber(value) {
diff --git a/src/pages/Customer/components/CustomerConsigneeCreate.vue b/src/pages/Customer/components/CustomerConsigneeCreate.vue index 92ce47bf2c..ef01879c29 100644 --- a/src/pages/Customer/components/CustomerConsigneeCreate.vue +++ b/src/pages/Customer/components/CustomerConsigneeCreate.vue @@ -10,9 +10,9 @@ import FormModel from 'components/FormModel.vue'; import VnRow from 'components/ui/VnRow.vue'; import VnInput from 'src/components/common/VnInput.vue'; import VnSelectFilter from 'src/components/common/VnSelectFilter.vue'; -import VnSelectCreate from 'src/components/common/VnSelectCreate.vue'; +import VnSelectDialog from 'src/components/common/VnSelectDialog.vue'; import CustomerCreateNewPostcode from 'src/components/CreateNewPostcodeForm.vue'; -import CustomsNewCustomsAgent from 'src/pages/Customer/components/CustomerNewCustomsAgent.vue'; +import CustomerNewCustomsAgent from 'src/pages/Customer/components/CustomerNewCustomsAgent.vue'; const { t } = useI18n(); const route = useRoute(); @@ -113,7 +113,7 @@ const toCustomerConsignees = () => {
- { - +
@@ -223,7 +223,7 @@ const toCustomerConsignees = () => { />
- { v-model="data.customsAgentFk" > - +
diff --git a/src/pages/Customer/components/CustomerConsigneeEdit.vue b/src/pages/Customer/components/CustomerConsigneeEdit.vue index 43649c58e5..98996e479a 100644 --- a/src/pages/Customer/components/CustomerConsigneeEdit.vue +++ b/src/pages/Customer/components/CustomerConsigneeEdit.vue @@ -10,7 +10,7 @@ import FormModel from 'components/FormModel.vue'; import VnRow from 'components/ui/VnRow.vue'; import VnInput from 'src/components/common/VnInput.vue'; import VnSelectFilter from 'src/components/common/VnSelectFilter.vue'; -import VnSelectCreate from 'src/components/common/VnSelectCreate.vue'; +import VnSelectDialog from 'src/components/common/VnSelectDialog.vue'; import CustomerCreateNewPostcode from 'src/components/CreateNewPostcodeForm.vue'; import CustomsNewCustomsAgent from 'src/pages/Customer/components/CustomerNewCustomsAgent.vue'; @@ -168,7 +168,7 @@ const onDataSaved = () => {
- { - +
@@ -278,7 +278,7 @@ const onDataSaved = () => { />
- { - +
diff --git a/src/pages/Customer/components/CustomerGreugeCreate.vue b/src/pages/Customer/components/CustomerGreugeCreate.vue new file mode 100644 index 0000000000..1ff467d972 --- /dev/null +++ b/src/pages/Customer/components/CustomerGreugeCreate.vue @@ -0,0 +1,93 @@ + + + + + + + +es: + Amount: Importe + Date: Fecha + Comment: Comentario + Type: Tipo + diff --git a/src/pages/Customer/components/CustomerNewPayment.vue b/src/pages/Customer/components/CustomerNewPayment.vue new file mode 100644 index 0000000000..fc0c52b0fe --- /dev/null +++ b/src/pages/Customer/components/CustomerNewPayment.vue @@ -0,0 +1,286 @@ + + + + + +es: + New payment: Añadir pago + Date: Fecha + Company: Empresa + Bank: Caja + Amount: Importe + Reference: Referencia + Cash: Efectivo + Delivered amount: Cantidad entregada + Amount to return: Cantidad a devolver + View recipt: Ver recibido + Send email: Enviar correo + Compensation: Compensación + Compensation account: Cuenta para compensar + diff --git a/src/pages/Customer/components/CustomerNoteCreate.vue b/src/pages/Customer/components/CustomerNoteCreate.vue index cea90f9758..640f6f3a02 100644 --- a/src/pages/Customer/components/CustomerNoteCreate.vue +++ b/src/pages/Customer/components/CustomerNoteCreate.vue @@ -32,8 +32,8 @@ const toCustomerNotes = () => { + + +es: + Responsible for approving invoices: Responsable de aprobar las facturas + diff --git a/src/pages/Supplier/Card/SupplierBillingData.vue b/src/pages/Supplier/Card/SupplierBillingData.vue index 1237a0403c..bf5ccb1156 100644 --- a/src/pages/Supplier/Card/SupplierBillingData.vue +++ b/src/pages/Supplier/Card/SupplierBillingData.vue @@ -13,6 +13,13 @@ const { t } = useI18n(); const paymethodsOptions = ref([]); const payDemsOptions = ref([]); + +const formatPayDems = (data) => { + payDemsOptions.value = data.map(({ id, payDem }) => ({ + id: id, + payDem: payDem || '0', + })); +}; diff --git a/src/pages/Worker/WorkerList.vue b/src/pages/Worker/WorkerList.vue index e7e86d16ee..5214a9066e 100644 --- a/src/pages/Worker/WorkerList.vue +++ b/src/pages/Worker/WorkerList.vue @@ -1,33 +1,24 @@