From c67ae3e17e3261692185d92861e62084cbc68b99 Mon Sep 17 00:00:00 2001 From: alexm Date: Tue, 25 Feb 2025 09:53:02 +0100 Subject: [PATCH] Revert "revert 1015acefb7e400be2d8b5958dba69b4d98276b34" This reverts commit 223a1ea4490ea6ad2a00c60297fd3c74cd713338. --- cypress.config.js | 15 +- quasar.config.js | 1 - src/boot/defaults/constants.js | 2 + src/boot/keyShortcut.js | 17 +- src/boot/qformMixin.js | 23 +- src/boot/quasar.js | 1 + src/components/CreateBankEntityForm.vue | 2 +- src/components/CrudModel.vue | 16 +- src/components/FilterTravelForm.vue | 4 +- src/components/FormModel.vue | 45 +- src/components/FormModelPopup.vue | 50 +- src/components/ItemsFilterPanel.vue | 4 +- src/components/LeftMenu.vue | 67 +- src/components/LeftMenuItem.vue | 1 + src/components/RefundInvoiceForm.vue | 15 +- src/components/TicketProblems.vue | 82 +- src/components/TransferInvoiceForm.vue | 15 +- src/components/VnTable/VnColumn.vue | 51 +- src/components/VnTable/VnFilter.vue | 58 +- src/components/VnTable/VnOrder.vue | 101 +- src/components/VnTable/VnTable.vue | 572 ++++++-- src/components/VnTable/VnTableFilter.vue | 57 +- src/components/VnTable/VnVisibleColumn.vue | 19 +- src/components/__tests__/FormModel.spec.js | 12 +- src/components/__tests__/Leftmenu.spec.js | 376 ++++- src/components/__tests__/UserPanel.spec.js | 100 +- src/components/common/VnCard.vue | 39 +- src/components/common/VnCardBeta.vue | 61 +- src/components/common/VnCheckbox.vue | 43 + src/components/common/VnColor.vue | 32 + src/components/common/VnComponent.vue | 6 +- src/components/common/VnDmsList.vue | 12 +- src/components/common/VnInput.vue | 22 +- src/components/common/VnInputDate.vue | 8 +- src/components/common/VnInputNumber.vue | 2 + src/components/common/VnPopupProxy.vue | 38 + src/components/common/VnSection.vue | 9 +- src/components/common/VnSelect.vue | 22 +- src/components/common/VnSelectCache.vue | 4 +- src/components/common/VnSelectDialog.vue | 2 - src/components/common/VnSelectSupplier.vue | 6 +- .../common/VnSelectTravelExtended.vue | 50 + .../common/__tests__/VnNotes.spec.js | 151 +- src/components/ui/CardDescriptor.vue | 46 +- src/components/ui/CardSummary.vue | 14 +- src/components/ui/SkeletonDescriptor.vue | 65 +- src/components/ui/VnConfirm.vue | 3 +- src/components/ui/VnFilterPanel.vue | 16 +- src/components/ui/VnMoreOptions.vue | 2 +- src/components/ui/VnNotes.vue | 94 +- src/components/ui/VnStockValueDisplay.vue | 41 + src/components/ui/VnSubToolbar.vue | 11 +- .../ui/__tests__/CardSummary.spec.js | 14 +- .../__tests__/useArrayData.spec.js | 29 +- src/composables/checkEntryLock.js | 65 + src/composables/getColAlign.js | 22 + src/composables/useArrayData.js | 13 +- src/composables/useRole.js | 10 + src/css/app.scss | 28 +- src/css/quasar.variables.scss | 6 +- src/filters/toDate.js | 11 +- src/i18n/locale/en.yml | 117 ++ src/i18n/locale/es.yml | 225 ++- src/layouts/MainLayout.vue | 2 +- src/layouts/OutLayout.vue | 5 +- src/pages/Account/AccountAliasList.vue | 10 +- src/pages/Account/AccountExprBuilder.js | 18 + src/pages/Account/AccountList.vue | 26 +- src/pages/Account/Alias/AliasExprBuilder.js | 8 + src/pages/Account/Alias/Card/AliasCard.vue | 10 +- .../Account/Alias/Card/AliasDescriptor.vue | 11 +- src/pages/Account/Alias/Card/AliasSummary.vue | 19 +- src/pages/Account/Card/AccountBasicData.vue | 38 +- src/pages/Account/Card/AccountCard.vue | 10 +- src/pages/Account/Card/AccountDescriptor.vue | 43 +- .../Account/Card/AccountDescriptorMenu.vue | 27 +- src/pages/Account/Card/AccountFilter.js | 3 + src/pages/Account/Card/AccountMailAlias.vue | 7 +- src/pages/Account/Card/AccountSummary.vue | 41 +- src/pages/Account/Role/AccountRoles.vue | 18 +- src/pages/Account/Role/Card/RoleBasicData.vue | 14 +- src/pages/Account/Role/Card/RoleCard.vue | 7 +- .../Account/Role/Card/RoleDescriptor.vue | 16 +- src/pages/Account/Role/Card/RoleSummary.vue | 23 +- src/pages/Account/Role/Card/SubRoles.vue | 6 +- src/pages/Account/Role/RoleExprBuilder.js | 16 + src/pages/Claim/Card/ClaimBasicData.vue | 1 - src/pages/Claim/Card/ClaimCard.vue | 9 +- src/pages/Claim/Card/ClaimDescriptor.vue | 17 +- src/pages/Claim/Card/ClaimLines.vue | 8 +- src/pages/Claim/Card/ClaimNotes.vue | 3 +- src/pages/Claim/Card/ClaimPhoto.vue | 4 +- src/pages/Claim/ClaimList.vue | 2 +- src/pages/Customer/Card/CustomerAddress.vue | 8 +- src/pages/Customer/Card/CustomerBalance.vue | 4 +- src/pages/Customer/Card/CustomerBasicData.vue | 4 +- .../Customer/Card/CustomerBillingData.vue | 2 +- src/pages/Customer/Card/CustomerCard.vue | 4 +- .../Customer/Card/CustomerConsumption.vue | 95 +- src/pages/Customer/Card/CustomerContacts.vue | 2 +- .../Customer/Card/CustomerCreditContracts.vue | 2 +- .../Customer/Card/CustomerDescriptor.vue | 42 +- .../Customer/Card/CustomerDescriptorMenu.vue | 17 + .../Customer/Card/CustomerFileManagement.vue | 2 +- .../Customer/Card/CustomerFiscalData.vue | 32 +- src/pages/Customer/Card/CustomerNotes.vue | 1 + src/pages/Customer/Card/CustomerSamples.vue | 2 +- src/pages/Customer/Card/CustomerWebAccess.vue | 2 +- src/pages/Customer/CustomerFilter.vue | 6 +- src/pages/Customer/CustomerList.vue | 4 +- .../Customer/Defaulter/CustomerDefaulter.vue | 2 +- .../components/CustomerAddressEdit.vue | 4 +- .../components/CustomerNewPayment.vue | 6 +- .../components/CustomerSamplesCreate.vue | 9 +- src/pages/Customer/locale/en.yml | 3 + src/pages/Customer/locale/es.yml | 3 + src/pages/Entry/Card/EntryBasicData.vue | 63 +- src/pages/Entry/Card/EntryBuys.vue | 1232 +++++++++++------ src/pages/Entry/Card/EntryCard.vue | 6 +- src/pages/Entry/Card/EntryDescriptor.vue | 158 ++- src/pages/Entry/Card/EntryFilter.js | 17 +- src/pages/Entry/Card/EntryNotes.vue | 4 +- src/pages/Entry/Card/EntrySummary.vue | 388 ++---- src/pages/Entry/EntryFilter.vue | 257 ++-- src/pages/Entry/EntryList.vue | 368 +++-- src/pages/Entry/EntryStockBought.vue | 18 +- src/pages/Entry/EntryStockBoughtDetail.vue | 22 +- src/pages/Entry/locale/en.yml | 84 +- src/pages/Entry/locale/es.yml | 107 +- .../InvoiceIn/Card/InvoiceInBasicData.vue | 6 +- src/pages/InvoiceIn/Card/InvoiceInCard.vue | 41 +- .../InvoiceIn/Card/InvoiceInDescriptor.vue | 33 +- .../Card/InvoiceInDescriptorMenu.vue | 4 +- src/pages/InvoiceIn/Card/InvoiceInDueDay.vue | 26 +- src/pages/InvoiceIn/Card/InvoiceInFilter.js | 33 + .../InvoiceIn/Card/InvoiceInIntrastat.vue | 2 +- src/pages/InvoiceIn/Card/InvoiceInSummary.vue | 13 +- src/pages/InvoiceIn/Card/InvoiceInVat.vue | 78 +- src/pages/InvoiceIn/InvoiceInList.vue | 5 +- src/pages/InvoiceIn/InvoiceInToBook.vue | 56 +- src/pages/InvoiceIn/locale/en.yml | 5 +- src/pages/InvoiceIn/locale/es.yml | 9 +- src/pages/InvoiceOut/Card/InvoiceOutCard.vue | 4 +- .../InvoiceOut/Card/InvoiceOutDescriptor.vue | 28 +- src/pages/InvoiceOut/Card/InvoiceOutFilter.js | 16 + src/pages/Item/Card/ItemBarcode.vue | 2 +- src/pages/Item/Card/ItemBasicData.vue | 42 +- src/pages/Item/Card/ItemBotanical.vue | 4 +- src/pages/Item/Card/ItemCard.vue | 2 +- src/pages/Item/Card/ItemDescriptor.vue | 26 +- src/pages/Item/Card/ItemDescriptorProxy.vue | 6 +- src/pages/Item/Card/ItemShelving.vue | 10 +- src/pages/Item/Card/ItemTags.vue | 2 +- src/pages/Item/ItemFixedPrice.vue | 16 +- .../Item/ItemType/Card/ItemTypeBasicData.vue | 7 +- src/pages/Item/ItemType/Card/ItemTypeCard.vue | 6 +- .../Item/ItemType/Card/ItemTypeDescriptor.vue | 40 +- .../Item/ItemType/Card/ItemTypeFilter.js | 8 + .../Item/ItemType/Card/ItemTypeSummary.vue | 15 +- .../{Card => components}/CreateGenusForm.vue | 0 .../{Card => components}/CreateSpecieForm.vue | 0 src/pages/Item/components/ItemProposal.vue | 332 +++++ .../Item/components/ItemProposalProxy.vue | 56 + src/pages/Item/locale/en.yml | 24 +- src/pages/Item/locale/es.yml | 31 +- src/pages/Monitor/MonitorOrders.vue | 2 +- src/pages/Monitor/locale/en.yml | 1 + src/pages/Monitor/locale/es.yml | 1 + .../Order/Card/CatalogFilterValueDialog.vue | 2 +- src/pages/Order/Card/OrderBasicData.vue | 6 +- src/pages/Order/Card/OrderCard.vue | 4 +- src/pages/Order/Card/OrderCatalogFilter.vue | 4 +- .../Order/Card/OrderCatalogItemDialog.vue | 8 +- src/pages/Order/Card/OrderDescriptor.vue | 38 +- src/pages/Order/Card/OrderFilter.js | 26 + src/pages/Order/Card/OrderLines.vue | 4 +- src/pages/Order/Card/OrderSummary.vue | 2 +- src/pages/Order/OrderList.vue | 7 +- src/pages/Route/Agency/AgencyList.vue | 4 +- .../Route/Agency/Card/AgencyBasicData.vue | 2 +- src/pages/Route/Agency/Card/AgencyCard.vue | 2 +- .../Route/Agency/Card/AgencyDescriptor.vue | 1 - .../Route/Agency/Card/AgencyWorkcenter.vue | 2 +- src/pages/Route/Card/RouteCard.vue | 5 +- src/pages/Route/Card/RouteDescriptor.vue | 70 +- src/pages/Route/Card/RouteFilter.js | 39 + src/pages/Route/Card/RouteFilter.vue | 2 +- src/pages/Route/Card/RouteForm.vue | 54 +- src/pages/Route/Roadmap/RoadmapBasicData.vue | 5 +- src/pages/Route/Roadmap/RoadmapCard.vue | 2 +- src/pages/Route/Roadmap/RoadmapDescriptor.vue | 18 +- src/pages/Route/Roadmap/RoadmapFilter.js | 3 + src/pages/Route/Roadmap/RoadmapStops.vue | 2 +- src/pages/Route/Roadmap/RoadmapSummary.vue | 3 +- src/pages/Route/RouteExtendedList.vue | 152 +- src/pages/Route/RouteList.vue | 31 + src/pages/Route/RouteTickets.vue | 18 +- .../Route/Vehicle/Card/VehicleBasicData.vue | 162 +++ src/pages/Route/Vehicle/Card/VehicleCard.vue | 13 + .../Route/Vehicle/Card/VehicleDescriptor.vue | 49 + .../Route/Vehicle/Card/VehicleSummary.vue | 127 ++ src/pages/Route/Vehicle/VehicleFilter.js | 76 + src/pages/Route/Vehicle/VehicleList.vue | 224 +++ src/pages/Route/Vehicle/locale/en.yml | 20 + src/pages/Route/Vehicle/locale/es.yml | 20 + src/pages/Shelving/Card/ShelvingCard.vue | 4 +- .../Shelving/Card/ShelvingDescriptor.vue | 30 +- src/pages/Shelving/Card/ShelvingFilter.js | 15 + src/pages/Shelving/Card/ShelvingForm.vue | 32 +- src/pages/Shelving/Card/ShelvingSearchbar.vue | 8 +- src/pages/Shelving/Card/ShelvingSummary.vue | 37 +- .../Parking/Card/ParkingBasicData.vue | 18 +- .../Parking/Card/ParkingCard.vue | 6 +- .../Parking/Card/ParkingDescriptor.vue | 16 +- .../Shelving/Parking/Card/ParkingFilter.js | 4 + .../Parking/Card/ParkingLog.vue | 0 .../Parking/Card/ParkingSummary.vue | 0 .../Shelving/Parking/ParkingExprBuilder.js | 10 + .../{ => Shelving}/Parking/ParkingFilter.vue | 0 .../{ => Shelving}/Parking/ParkingList.vue | 13 +- .../{ => Shelving}/Parking/locale/en.yml | 0 .../{ => Shelving}/Parking/locale/es.yml | 0 src/pages/Shelving/ShelvingExprBuilder.js | 10 + src/pages/Shelving/ShelvingList.vue | 26 +- src/pages/Supplier/Card/SupplierAccounts.vue | 6 +- src/pages/Supplier/Card/SupplierAddresses.vue | 2 +- .../Supplier/Card/SupplierAgencyTerm.vue | 2 +- src/pages/Supplier/Card/SupplierBasicData.vue | 3 +- src/pages/Supplier/Card/SupplierCard.vue | 16 +- .../Supplier/Card/SupplierConsumption.vue | 103 +- src/pages/Supplier/Card/SupplierContacts.vue | 2 +- .../Supplier/Card/SupplierDescriptor.vue | 49 +- src/pages/Supplier/Card/SupplierFilter.js | 35 + .../Supplier/Card/SupplierFiscalData.vue | 22 +- src/pages/Supplier/SupplierList.vue | 91 +- src/pages/Supplier/SupplierListFilter.vue | 122 -- .../Ticket/Card/BasicData/TicketBasicData.vue | 16 +- .../Card/BasicData/TicketBasicDataForm.vue | 4 +- .../Card/BasicData/TicketBasicDataView.vue | 116 +- src/pages/Ticket/Card/TicketCard.vue | 8 +- src/pages/Ticket/Card/TicketComponents.vue | 2 +- src/pages/Ticket/Card/TicketDescriptor.vue | 139 +- src/pages/Ticket/Card/TicketExpedition.vue | 2 +- src/pages/Ticket/Card/TicketFilter.js | 72 + src/pages/Ticket/Card/TicketNotes.vue | 4 +- src/pages/Ticket/Card/TicketPackage.vue | 4 +- src/pages/Ticket/Card/TicketSale.vue | 60 +- src/pages/Ticket/Card/TicketService.vue | 6 +- src/pages/Ticket/Card/TicketSplit.vue | 37 + src/pages/Ticket/Card/TicketSummary.vue | 81 +- src/pages/Ticket/Card/TicketTracking.vue | 4 +- src/pages/Ticket/Card/TicketTransfer.vue | 131 +- src/pages/Ticket/Card/TicketTransferProxy.vue | 54 + src/pages/Ticket/Card/components/split.js | 22 + .../Ticket/Negative/TicketLackDetail.vue | 198 +++ .../Ticket/Negative/TicketLackFilter.vue | 175 +++ src/pages/Ticket/Negative/TicketLackList.vue | 227 +++ src/pages/Ticket/Negative/TicketLackTable.vue | 356 +++++ .../Negative/components/ChangeItemDialog.vue | 90 ++ .../components/ChangeQuantityDialog.vue | 84 ++ .../Negative/components/ChangeStateDialog.vue | 91 ++ src/pages/Ticket/TicketFuture.vue | 555 +++----- src/pages/Ticket/TicketFutureFilter.vue | 4 +- src/pages/Ticket/locale/en.yml | 87 +- src/pages/Ticket/locale/es.yml | 83 ++ src/pages/Travel/Card/TravelBasicData.vue | 19 +- src/pages/Travel/Card/TravelCard.vue | 36 +- src/pages/Travel/Card/TravelDescriptor.vue | 1 - src/pages/Travel/Card/TravelFilter.js | 1 + src/pages/Travel/Card/TravelSummary.vue | 8 + src/pages/Travel/Card/TravelThermographs.vue | 2 +- src/pages/Travel/ExtraCommunityFilter.vue | 2 +- src/pages/Travel/TravelList.vue | 24 + src/pages/Wagon/Card/WagonCard.vue | 2 +- src/pages/Wagon/Type/WagonTypeList.vue | 8 +- src/pages/Worker/Card/WorkerBasicData.vue | 17 +- src/pages/Worker/Card/WorkerCalendar.vue | 32 +- .../Worker/Card/WorkerCalendarFilter.vue | 2 - src/pages/Worker/Card/WorkerCard.vue | 7 +- src/pages/Worker/Card/WorkerDescriptor.vue | 9 +- .../Worker/Card/WorkerDescriptorProxy.vue | 7 +- src/pages/Worker/Card/WorkerFormation.vue | 3 +- src/pages/Worker/Card/WorkerMedical.vue | 16 + src/pages/Worker/Card/WorkerOperator.vue | 19 +- src/pages/Worker/Card/WorkerPda.vue | 10 +- src/pages/Worker/Card/WorkerPit.vue | 2 +- src/pages/Worker/Card/WorkerSummary.vue | 2 +- src/pages/Worker/Card/WorkerTimeControl.vue | 16 +- .../Department/Card/DepartmentBasicData.vue | 35 +- .../Department/Card/DepartmentCard.vue | 4 +- .../Department/Card/DepartmentDescriptor.vue | 23 +- .../Card/DepartmentDescriptorProxy.vue | 0 .../Department/Card/DepartmentSummary.vue | 2 +- .../Card/DepartmentSummaryDialog.vue | 0 src/pages/Worker/WorkerDepartmentTree.vue | 4 +- src/pages/Zone/Card/ZoneBasicData.vue | 33 +- src/pages/Zone/Card/ZoneCard.vue | 12 +- src/pages/Zone/Card/ZoneDescriptor.vue | 44 +- src/pages/Zone/Card/ZoneEvents.vue | 4 +- src/pages/Zone/Card/ZoneFilter.js | 10 + src/pages/Zone/Card/ZoneSearchbar.vue | 41 +- src/pages/Zone/Card/ZoneSummary.vue | 18 +- src/pages/Zone/Card/ZoneWarehouses.vue | 2 +- src/pages/Zone/Delivery/ZoneDeliveryList.vue | 2 +- src/pages/Zone/Upcoming/ZoneUpcomingList.vue | 2 +- src/router/modules/account/aliasCard.js | 2 +- src/router/modules/account/roleCard.js | 1 + src/router/modules/entry.js | 17 +- src/router/modules/route.js | 52 + src/router/modules/shelving.js | 11 +- src/router/modules/supplier.js | 315 +++-- src/router/modules/ticket.js | 34 +- src/router/modules/worker.js | 9 +- .../__tests__/useNavigationStore.spec.js | 153 ++ src/stores/useArrayDataStore.js | 1 + src/utils/notifyResults.js | 19 + .../integration/Order/orderCatalog.spec.js | 1 - .../integration/entry/stockBought.spec.js | 37 +- .../invoiceIn/invoiceInBasicData.spec.js | 27 +- .../invoiceIn/invoiceInVat.spec.js | 2 +- .../invoiceOutNegativeBases.spec.js | 4 +- .../integration/item/ItemProposal.spec.js | 11 + test/cypress/integration/item/itemTag.spec.js | 5 +- .../parking/parkingBasicData.spec.js | 4 +- .../route/agency/agencyWorkCenter.spec.js | 1 + .../integration/route/routeList.spec.js | 19 +- .../route/vehicle/vehicleDescriptor.spec.js | 13 + .../ticket/negative/TicketLackDetail.spec.js | 147 ++ .../ticket/negative/TicketLackList.spec.js | 36 + .../integration/ticket/ticketList.spec.js | 25 + .../vnComponent/VnShortcut.spec.js | 11 + .../integration/zone/zoneBasicData.spec.js | 16 +- test/cypress/support/commands.js | 71 +- test/cypress/support/waitUntil.js | 2 +- 334 files changed, 9284 insertions(+), 4283 deletions(-) create mode 100644 src/boot/defaults/constants.js create mode 100644 src/components/common/VnCheckbox.vue create mode 100644 src/components/common/VnColor.vue create mode 100644 src/components/common/VnPopupProxy.vue create mode 100644 src/components/common/VnSelectTravelExtended.vue create mode 100644 src/components/ui/VnStockValueDisplay.vue create mode 100644 src/composables/checkEntryLock.js create mode 100644 src/composables/getColAlign.js create mode 100644 src/pages/Account/AccountExprBuilder.js create mode 100644 src/pages/Account/Alias/AliasExprBuilder.js create mode 100644 src/pages/Account/Card/AccountFilter.js create mode 100644 src/pages/Account/Role/RoleExprBuilder.js create mode 100644 src/pages/InvoiceIn/Card/InvoiceInFilter.js create mode 100644 src/pages/InvoiceOut/Card/InvoiceOutFilter.js create mode 100644 src/pages/Item/ItemType/Card/ItemTypeFilter.js rename src/pages/Item/{Card => components}/CreateGenusForm.vue (100%) rename src/pages/Item/{Card => components}/CreateSpecieForm.vue (100%) create mode 100644 src/pages/Item/components/ItemProposal.vue create mode 100644 src/pages/Item/components/ItemProposalProxy.vue create mode 100644 src/pages/Order/Card/OrderFilter.js create mode 100644 src/pages/Route/Card/RouteFilter.js create mode 100644 src/pages/Route/Roadmap/RoadmapFilter.js create mode 100644 src/pages/Route/Vehicle/Card/VehicleBasicData.vue create mode 100644 src/pages/Route/Vehicle/Card/VehicleCard.vue create mode 100644 src/pages/Route/Vehicle/Card/VehicleDescriptor.vue create mode 100644 src/pages/Route/Vehicle/Card/VehicleSummary.vue create mode 100644 src/pages/Route/Vehicle/VehicleFilter.js create mode 100644 src/pages/Route/Vehicle/VehicleList.vue create mode 100644 src/pages/Route/Vehicle/locale/en.yml create mode 100644 src/pages/Route/Vehicle/locale/es.yml create mode 100644 src/pages/Shelving/Card/ShelvingFilter.js rename src/pages/{ => Shelving}/Parking/Card/ParkingBasicData.vue (68%) rename src/pages/{ => Shelving}/Parking/Card/ParkingCard.vue (53%) rename src/pages/{ => Shelving}/Parking/Card/ParkingDescriptor.vue (58%) create mode 100644 src/pages/Shelving/Parking/Card/ParkingFilter.js rename src/pages/{ => Shelving}/Parking/Card/ParkingLog.vue (100%) rename src/pages/{ => Shelving}/Parking/Card/ParkingSummary.vue (100%) create mode 100644 src/pages/Shelving/Parking/ParkingExprBuilder.js rename src/pages/{ => Shelving}/Parking/ParkingFilter.vue (100%) rename src/pages/{ => Shelving}/Parking/ParkingList.vue (90%) rename src/pages/{ => Shelving}/Parking/locale/en.yml (100%) rename src/pages/{ => Shelving}/Parking/locale/es.yml (100%) create mode 100644 src/pages/Shelving/ShelvingExprBuilder.js create mode 100644 src/pages/Supplier/Card/SupplierFilter.js delete mode 100644 src/pages/Supplier/SupplierListFilter.vue create mode 100644 src/pages/Ticket/Card/TicketFilter.js create mode 100644 src/pages/Ticket/Card/TicketSplit.vue create mode 100644 src/pages/Ticket/Card/TicketTransferProxy.vue create mode 100644 src/pages/Ticket/Card/components/split.js create mode 100644 src/pages/Ticket/Negative/TicketLackDetail.vue create mode 100644 src/pages/Ticket/Negative/TicketLackFilter.vue create mode 100644 src/pages/Ticket/Negative/TicketLackList.vue create mode 100644 src/pages/Ticket/Negative/TicketLackTable.vue create mode 100644 src/pages/Ticket/Negative/components/ChangeItemDialog.vue create mode 100644 src/pages/Ticket/Negative/components/ChangeQuantityDialog.vue create mode 100644 src/pages/Ticket/Negative/components/ChangeStateDialog.vue rename src/pages/{ => Worker}/Department/Card/DepartmentBasicData.vue (73%) rename src/pages/{ => Worker}/Department/Card/DepartmentCard.vue (70%) rename src/pages/{ => Worker}/Department/Card/DepartmentDescriptor.vue (84%) rename src/pages/{ => Worker}/Department/Card/DepartmentDescriptorProxy.vue (100%) rename src/pages/{ => Worker}/Department/Card/DepartmentSummary.vue (99%) rename src/pages/{ => Worker}/Department/Card/DepartmentSummaryDialog.vue (100%) create mode 100644 src/pages/Zone/Card/ZoneFilter.js create mode 100644 src/stores/__tests__/useNavigationStore.spec.js create mode 100644 src/utils/notifyResults.js create mode 100644 test/cypress/integration/item/ItemProposal.spec.js create mode 100644 test/cypress/integration/route/vehicle/vehicleDescriptor.spec.js create mode 100644 test/cypress/integration/ticket/negative/TicketLackDetail.spec.js create mode 100644 test/cypress/integration/ticket/negative/TicketLackList.spec.js diff --git a/cypress.config.js b/cypress.config.js index dfe963a12..dd7de895c 100644 --- a/cypress.config.js +++ b/cypress.config.js @@ -39,10 +39,17 @@ export default defineConfig({ downloadsFolder: 'test/cypress/downloads', video: false, specPattern: 'test/cypress/integration/**/*.spec.js', - experimentalRunAllSpecs: true, - watchForFileChanges: true, - reporter, - reporterOptions, + experimentalRunAllSpecs: false, + watchForFileChanges: false, + reporter: 'cypress-mochawesome-reporter', + reporterOptions: { + charts: true, + reportPageTitle: 'Cypress Inline Reporter', + reportFilename: '[status]_[datetime]-report', + embeddedScreenshots: true, + reportDir: 'test/cypress/reports', + inlineAssets: true, + }, component: { componentFolder: 'src', testFiles: '**/*.spec.js', diff --git a/quasar.config.js b/quasar.config.js index df2cf246d..8b6125a90 100644 --- a/quasar.config.js +++ b/quasar.config.js @@ -31,7 +31,6 @@ export default configure(function (/* ctx */) { // --> boot files are part of "main.js" // https://v2.quasar.dev/quasar-cli/boot-files boot: ['i18n', 'axios', 'vnDate', 'validations', 'quasar', 'quasar.defaults'], - // https://v2.quasar.dev/quasar-cli-vite/quasar-config-js#css css: ['app.scss'], diff --git a/src/boot/defaults/constants.js b/src/boot/defaults/constants.js new file mode 100644 index 000000000..c96ceb2d1 --- /dev/null +++ b/src/boot/defaults/constants.js @@ -0,0 +1,2 @@ +export const langs = ['en', 'es']; +export const decimalPlaces = 2; diff --git a/src/boot/keyShortcut.js b/src/boot/keyShortcut.js index 5afb5b74a..6da06c8bf 100644 --- a/src/boot/keyShortcut.js +++ b/src/boot/keyShortcut.js @@ -1,6 +1,6 @@ export default { - mounted: function (el, binding) { - const shortcut = binding.value ?? '+'; + mounted(el, binding) { + const shortcut = binding.value || '+'; const { key, ctrl, alt, callback } = typeof shortcut === 'string' @@ -8,25 +8,24 @@ export default { key: shortcut, ctrl: true, alt: true, - callback: () => - document - .querySelector(`button[shortcut="${shortcut}"]`) - ?.click(), + callback: () => el?.click(), } : binding.value; + if (!el.hasAttribute('shortcut')) { + el.setAttribute('shortcut', key); + } + const handleKeydown = (event) => { if (event.key === key && (!ctrl || event.ctrlKey) && (!alt || event.altKey)) { callback(); } }; - // Attach the event listener to the window window.addEventListener('keydown', handleKeydown); - el._handleKeydown = handleKeydown; }, - unmounted: function (el) { + unmounted(el) { if (el._handleKeydown) { window.removeEventListener('keydown', el._handleKeydown); } diff --git a/src/boot/qformMixin.js b/src/boot/qformMixin.js index 97d80c670..182c51e47 100644 --- a/src/boot/qformMixin.js +++ b/src/boot/qformMixin.js @@ -9,19 +9,19 @@ export default { if (!form) return; try { const inputsFormCard = form.querySelectorAll( - `input:not([disabled]):not([type="checkbox"])` + `input:not([disabled]):not([type="checkbox"])`, ); if (inputsFormCard.length) { focusFirstInput(inputsFormCard[0]); } const textareas = document.querySelectorAll( - 'textarea:not([disabled]), [contenteditable]:not([disabled])' + 'textarea:not([disabled]), [contenteditable]:not([disabled])', ); if (textareas.length) { focusFirstInput(textareas[textareas.length - 1]); } const inputs = document.querySelectorAll( - 'form#formModel input:not([disabled]):not([type="checkbox"])' + 'form#formModel input:not([disabled]):not([type="checkbox"])', ); const input = inputs[0]; if (!input) return; @@ -30,22 +30,5 @@ export default { } catch (error) { console.error(error); } - form.addEventListener('keyup', function (evt) { - if (evt.key === 'Enter' && !that.$attrs['prevent-submit']) { - const input = evt.target; - if (input.type == 'textarea' && evt.shiftKey) { - evt.preventDefault(); - let { selectionStart, selectionEnd } = input; - input.value = - input.value.substring(0, selectionStart) + - '\n' + - input.value.substring(selectionEnd); - selectionStart = selectionEnd = selectionStart + 1; - return; - } - evt.preventDefault(); - that.onSubmit(); - } - }); }, }; diff --git a/src/boot/quasar.js b/src/boot/quasar.js index 547517682..a8c397b83 100644 --- a/src/boot/quasar.js +++ b/src/boot/quasar.js @@ -51,4 +51,5 @@ export default boot(({ app }) => { await useCau(response, message); }; + app.provide('app', app); }); diff --git a/src/components/CreateBankEntityForm.vue b/src/components/CreateBankEntityForm.vue index 2da3aa994..7c4b94a6a 100644 --- a/src/components/CreateBankEntityForm.vue +++ b/src/components/CreateBankEntityForm.vue @@ -14,7 +14,7 @@ const { t } = useI18n(); const bicInputRef = ref(null); const state = useState(); -const customer = computed(() => state.get('customer')); +const customer = computed(() => state.get('Customer')); const countriesFilter = { fields: ['id', 'name', 'code'], diff --git a/src/components/CrudModel.vue b/src/components/CrudModel.vue index d569dfda1..93a2ac96a 100644 --- a/src/components/CrudModel.vue +++ b/src/components/CrudModel.vue @@ -64,6 +64,10 @@ const $props = defineProps({ type: Function, default: null, }, + beforeSaveFn: { + type: Function, + default: null, + }, goTo: { type: String, default: '', @@ -176,7 +180,11 @@ async function saveChanges(data) { hasChanges.value = false; return; } - const changes = data || getChanges(); + let changes = data || getChanges(); + if ($props.beforeSaveFn) { + changes = await $props.beforeSaveFn(changes, getChanges); + } + try { await axios.post($props.saveUrl || $props.url + '/crud', changes); } finally { @@ -229,12 +237,12 @@ async function remove(data) { componentProps: { title: t('globals.confirmDeletion'), message: t('globals.confirmDeletionMessage'), - newData, + data: { deletes: ids }, ids, + promise: saveChanges, }, }) .onOk(async () => { - await saveChanges({ deletes: ids }); newData = newData.filter((form) => !ids.some((id) => id == form[pk])); fetch(newData); }); @@ -374,6 +382,8 @@ watch(formUrl, async () => { @click="onSubmit" :disable="!hasChanges" :title="t('globals.save')" + v-shortcut="'s'" + shortcut="s" data-cy="crudModelDefaultSaveBtn" /> diff --git a/src/components/FilterTravelForm.vue b/src/components/FilterTravelForm.vue index 4d43c3810..765d97763 100644 --- a/src/components/FilterTravelForm.vue +++ b/src/components/FilterTravelForm.vue @@ -181,6 +181,7 @@ const selectTravel = ({ id }) => { color="primary" :disabled="isLoading" :loading="isLoading" + data-cy="save-filter-travel-form" /> { :no-data-label="t('Enter a new search')" class="q-mt-lg" @row-click="(_, row) => selectTravel(row)" + data-cy="table-filter-travel-form" > diff --git a/src/components/ItemsFilterPanel.vue b/src/components/ItemsFilterPanel.vue index 36123b834..f73753a6b 100644 --- a/src/components/ItemsFilterPanel.vue +++ b/src/components/ItemsFilterPanel.vue @@ -281,7 +281,7 @@ const setCategoryList = (data) => { { return locale.includes(normalizedSearch); }); }); - const filteredPinnedModules = computed(() => { if (!search.value) return pinnedModules.value; const normalizedSearch = search.value @@ -72,7 +71,7 @@ watch( items.value = []; getRoutes(); }, - { deep: true } + { deep: true }, ); function findMatches(search, item) { @@ -104,33 +103,40 @@ function addChildren(module, route, parent) { } function getRoutes() { - if (props.source === 'main') { - const modules = Object.assign([], navigation.getModules().value); - - for (const item of modules) { - const moduleDef = routes.find( - (route) => toLowerCamel(route.name) === item.module - ); - if (!moduleDef) continue; - item.children = []; - - addChildren(item.module, moduleDef, item.children); - } - - items.value = modules; + const handleRoutes = { + main: getMainRoutes, + card: getCardRoutes, + }; + try { + handleRoutes[props.source](); + } catch (error) { + throw new Error(`Method is not defined`); } +} +function getMainRoutes() { + const modules = Object.assign([], navigation.getModules().value); - if (props.source === 'card') { - const currentRoute = route.matched[1]; - const currentModule = toLowerCamel(currentRoute.name); - let moduleDef = routes.find( - (route) => toLowerCamel(route.name) === currentModule + for (const item of modules) { + const moduleDef = routes.find( + (route) => toLowerCamel(route.name) === item.module, ); + if (!moduleDef) continue; + item.children = []; - if (!moduleDef) return; - if (!moduleDef?.menus) moduleDef = betaGetRoutes(); - addChildren(currentModule, moduleDef, items.value); + addChildren(item.module, moduleDef, item.children); } + + items.value = modules; +} + +function getCardRoutes() { + const currentRoute = route.matched[1]; + const currentModule = toLowerCamel(currentRoute.name); + let moduleDef = routes.find((route) => toLowerCamel(route.name) === currentModule); + + if (!moduleDef) return; + if (!moduleDef?.menus) moduleDef = betaGetRoutes(); + addChildren(currentModule, moduleDef, items.value); } function betaGetRoutes() { @@ -223,9 +229,16 @@ const searchModule = () => {