0
0
Fork 0

Compare commits

..

437 Commits

Author SHA1 Message Date
William Buezas 868c80a187 test: tests order catalog 2024-11-19 09:56:18 -03:00
Jon Elias 3c5472ad4a Merge pull request 'Fix: changed route.query' (!959) from Fix-OrderCatalogCategoryFilter into dev
Reviewed-on: verdnatura/salix-front#959
Reviewed-by: Javier Segarra <jsegarra@verdnatura.es>
2024-11-18 11:28:25 +00:00
Jon Elias 0c0b9ca648 fix: changed route.query 2024-11-18 12:27:07 +01:00
Alex Moreno dd490888cf merge test in dev 2024-11-18 11:23:36 +01:00
Alex Moreno 09be2d4d41 Merge pull request 'solveConflicts_test_to_dev' (!957) from solveConflicts_test_to_dev into dev
Reviewed-on: verdnatura/salix-front#957
Reviewed-by: Alex Moreno <alexm@verdnatura.es>
2024-11-18 10:21:50 +00:00
Alex Moreno 1e7f2b3f4d Merge branch 'master' of https://gitea.verdnatura.es/verdnatura/salix-front into test 2024-11-18 11:14:29 +01:00
Alex Moreno 009a6b09d6 Merge pull request 'feat(TicketSummary): add ticketDescritporMenu' (!956) from hotFix_ticketSummary_add_ticketDescriptorMenu into master
Reviewed-on: verdnatura/salix-front#956
Reviewed-by: Carlos Satorres <carlossa@verdnatura.es>
2024-11-18 10:11:42 +00:00
Alex Moreno 5b4299114b Merge branch 'master' into hotFix_ticketSummary_add_ticketDescriptorMenu 2024-11-18 10:00:54 +00:00
Javier Segarra 5ab28c13d0 Merge pull request 'HOTFIX: CustomerSummary BalanceDue' (!955) from hotFix_customerSumamry_balanceDue into master
Reviewed-on: verdnatura/salix-front#955
Reviewed-by: Alex Moreno <alexm@verdnatura.es>
2024-11-18 10:00:08 +00:00
Javier Segarra f52095a2fc Merge branch 'test' into solveConflicts_test_to_dev 2024-11-18 10:57:49 +01:00
Alex Moreno 383f51c1b2 refactor(TicketDescritporMenu): url isEditable 2024-11-18 10:57:26 +01:00
Javier Segarra 0c36d385ec Merge branch 'test' into solveConflicts_test_to_dev 2024-11-18 10:50:42 +01:00
Alex Moreno 09aad5914f feat(TicketSummary): add ticketDescritporMenu 2024-11-18 10:49:30 +01:00
Javier Segarra 9ea9239250 fix: customerSummary balanceDue label value 2024-11-18 10:41:25 +01:00
Alex Moreno 29239ef2cd Merge branch 'master' of https://gitea.verdnatura.es/verdnatura/salix-front into test 2024-11-18 10:13:27 +01:00
Alex Moreno 03490b7f3a Merge pull request 'hotFix(TicketBasicData): getShipped, getLanded & bad try catch' (!953) from hotFix_ticketBasicData_getLanded_getShipped into master
Reviewed-on: verdnatura/salix-front#953
Reviewed-by: Javier Segarra <jsegarra@verdnatura.es>
2024-11-18 09:13:14 +00:00
Alex Moreno b74c1d1823 Merge branch 'master' into hotFix_ticketBasicData_getLanded_getShipped 2024-11-18 09:12:28 +00:00
Alex Moreno 27a1d7460d Merge pull request 'hotFix_arrayData_store_data' (!929) from hotFix_arrayData_store_data into master
Reviewed-on: verdnatura/salix-front#929
Reviewed-by: Javier Segarra <jsegarra@verdnatura.es>
Reviewed-by: Carlos Satorres <carlossa@verdnatura.es>
2024-11-18 09:12:21 +00:00
Alex Moreno 149f92bc93 Merge branch 'master' into hotFix_arrayData_store_data 2024-11-18 09:08:37 +00:00
Alex Moreno a50b22bb2a Merge branch 'master' into hotFix_ticketBasicData_getLanded_getShipped 2024-11-18 09:08:29 +00:00
Javier Segarra ff9d793378 Merge pull request 'HOTFIX: #7671 apply sort-by itemFk and name' (!949) from hotfix_itemFixedPrice_sortBy into master
Reviewed-on: verdnatura/salix-front#949
Reviewed-by: Javi Gallego <jgallego@verdnatura.es>
2024-11-18 09:08:05 +00:00
Alex Moreno 48513868b1 Merge branch 'master' into hotFix_arrayData_store_data 2024-11-18 09:04:21 +00:00
Alex Moreno e230cc61a0 fix(TicketBasicData): getShipped, getLanded & bad try catch 2024-11-18 09:18:06 +01:00
Jon Elias 80770b1165 Merge pull request '#8185 Fix LeftMenu to avoid duplicates' (!952) from 8185-DuplicateLeftMenu into dev
Reviewed-on: verdnatura/salix-front#952
Reviewed-by: Alex Moreno <alexm@verdnatura.es>
2024-11-18 06:33:54 +00:00
Jon Elias 3d8aa3cff9 Merge branch 'dev' into 8185-DuplicateLeftMenu 2024-11-18 06:21:42 +00:00
Alex Moreno 34ccbccf20 Merge pull request 'Down changes from master to test' (!950) from master into test
Reviewed-on: verdnatura/salix-front#950
Reviewed-by: Alex Moreno <alexm@verdnatura.es>
2024-11-18 06:15:13 +00:00
Jon Elias 2bc219a09b refactor: refs #8185 modified LeftMenu to avoid duplicates 2024-11-18 06:59:09 +01:00
Javier Segarra 5e5d2f3c42 fix: #7671 apply sort-by itemFk and name 2024-11-17 13:44:44 +00:00
Jon Elias 6de5864dd6 Merge pull request 'Hotix: deleted duplicate VnUsesMana' (!940) from Hotfix-SalesMana into master
Reviewed-on: verdnatura/salix-front#940
Reviewed-by: Alex Moreno <alexm@verdnatura.es>
2024-11-15 13:32:42 +00:00
Jon Elias 1dc2f54f61 Merge branch 'master' into Hotfix-SalesMana 2024-11-15 13:31:53 +00:00
Javier Segarra b8293d91e8 Merge pull request 'HOTFIX: #6943 hotFix_AddressObservation_crud' (!945) from hotFix_AddressObservation_crud into master
Reviewed-on: verdnatura/salix-front#945
Reviewed-by: Alex Moreno <alexm@verdnatura.es>
2024-11-15 13:14:26 +00:00
Javier Segarra 2e2a118627 Merge branch 'master' into hotFix_AddressObservation_crud 2024-11-15 12:55:08 +00:00
Javier Segarra 94873f7771 Merge pull request 'fix: Redirect to catalog when create new order' (!947) from hotfix_OrderNew_redirectTo into master
Reviewed-on: verdnatura/salix-front#947
Reviewed-by: Jon Elias <jon@verdnatura.es>
2024-11-15 12:52:17 +00:00
Javier Segarra 5916923521 fix: Redirect to catalog when create new order 2024-11-15 12:51:25 +00:00
Javier Segarra acaf7f2930 Merge pull request 'fix: Redirect to catalog when create new order' (!946) from hotfix_OrderNew_redirectTo_catalog into master
Reviewed-on: verdnatura/salix-front#946
Reviewed-by: Alex Moreno <alexm@verdnatura.es>
2024-11-15 12:38:39 +00:00
Javier Segarra 54a34e8034 fix: Redirect to catalog when create new order 2024-11-15 12:33:56 +00:00
Javier Segarra 064dbfc432 fix: #6943 Update AddressObservations 2024-11-15 12:20:50 +00:00
Jon Elias f03e5dc412 Merge pull request 'Hotfix: fixed state column in TicketList and translation' (!944) from Hotfix-TicketList into master
Reviewed-on: verdnatura/salix-front#944
Reviewed-by: Alex Moreno <alexm@verdnatura.es>
2024-11-15 11:11:14 +00:00
Carlos Satorres 3f486f6514 Merge pull request 'fix: refs #7310 clean warning' (!840) from 7310-warningTravelTermographs into dev
Reviewed-on: verdnatura/salix-front#840
Reviewed-by: Javi Gallego <jgallego@verdnatura.es>
Reviewed-by: Alex Moreno <alexm@verdnatura.es>
2024-11-15 11:10:28 +00:00
Jon Elias 89661397fb Merge branch 'master' into Hotfix-TicketList 2024-11-15 11:09:20 +00:00
Carlos Satorres 95291d4d4e Merge branch 'dev' into 7310-warningTravelTermographs 2024-11-15 11:06:03 +00:00
Javier Segarra d0427c17be Merge pull request 'HOTFIX: #6943 CustomerDescriptor actions' (!943) from hotfix-customerDescriptor_actions into master
Reviewed-on: verdnatura/salix-front#943
Reviewed-by: Alex Moreno <alexm@verdnatura.es>
2024-11-15 11:04:34 +00:00
Jon Elias 1fc2ae0689 Merge branch 'master' into Hotfix-TicketList 2024-11-15 10:53:53 +00:00
Jon Elias eb287696fa fix: fixed state column in ticket list 2024-11-15 11:49:46 +01:00
Javier Segarra e64ea2db19 feat: #6943 CustomerList salesPerson 2024-11-15 11:48:19 +01:00
Javier Segarra 4d8432feb5 revert: #6943 address star feature 2024-11-15 11:46:55 +01:00
Javier Segarra bdd36f6ba1 Merge branch 'master' into hotfix-customerDescriptor_actions 2024-11-15 11:44:41 +01:00
Javier Segarra c465c9b2c7 Merge branch 'master' into hotfix-customerDescriptor_actions 2024-11-15 11:41:28 +01:00
Javier Segarra 87ba74bcfc perf: #6943 Create ticket from client 2024-11-15 11:39:43 +01:00
Javier Segarra 8e52bd0688 perf: #6943 improve OrderList 2024-11-15 11:37:27 +01:00
Javier Segarra 2891e1363a feat: #6943 CustomerDescriptor actions 2024-11-15 11:36:20 +01:00
Javier Segarra c57ff7b3c9 Merge pull request 'HOTFIX: Customer Risk color' (!942) from hotFix_customerRisk_icon into master
Reviewed-on: verdnatura/salix-front#942
Reviewed-by: Alex Moreno <alexm@verdnatura.es>
2024-11-15 10:32:35 +00:00
Javier Segarra d3f538e37c perf: previous commit 2024-11-15 10:27:37 +00:00
Alex Moreno e8f0bc9965 Merge pull request 'feat(VnSelect): refs #7136 add scroll' (!890) from 7136-vnSelect_paginate_simplify_2 into dev
Reviewed-on: verdnatura/salix-front#890
Reviewed-by: Javier Segarra <jsegarra@verdnatura.es>
2024-11-15 10:24:46 +00:00
Javier Segarra d52a0fdc7f fix: customer Risk icon color 2024-11-15 10:23:57 +00:00
Alex Moreno 0e93766670 Merge branch 'dev' into 7136-vnSelect_paginate_simplify_2 2024-11-15 10:23:55 +00:00
Alex Moreno e19d11baa8 Merge branch 'master' into hotFix_arrayData_store_data 2024-11-15 08:21:27 +00:00
Alex Moreno f2b132db79 fix(VnPaginate): not start without data 2024-11-15 08:50:10 +01:00
Jon Elias 141cb32cae Merge branch 'master' into Hotfix-SalesMana 2024-11-15 07:23:59 +00:00
Jon Elias 354f2ce055 fix: deleted duplicate VnUsesMana 2024-11-15 08:21:29 +01:00
Guillermo Bonet 3c77076718 Merge pull request 'refactor: refs #7950 Created cmr model' (!911) from 7950-cmrModelUnify into dev
Reviewed-on: verdnatura/salix-front#911
Reviewed-by: Javi Gallego <jgallego@verdnatura.es>
2024-11-15 06:04:51 +00:00
Guillermo Bonet c607fc5f61 Merge branch 'dev' into 7950-cmrModelUnify 2024-11-15 06:03:30 +00:00
Javier Segarra 0a239e8c43 Merge pull request 'HOTFIX: customerFilter sales person input' (!939) from hotfix_customer_salesPerson_Filter into master
Reviewed-on: verdnatura/salix-front#939
Reviewed-by: Javi Gallego <jgallego@verdnatura.es>
2024-11-14 15:26:44 +00:00
Javier Segarra ca0d70933e Merge branch 'master' into hotfix_customer_salesPerson_Filter 2024-11-14 15:26:00 +00:00
Jorge Penadés 7626c777ed Merge pull request 'feat: refs #7874 improve vn-notes ui' (!938) from 7874-improveVnNotesUi into dev
Reviewed-on: verdnatura/salix-front#938
Reviewed-by: Javi Gallego <jgallego@verdnatura.es>
2024-11-14 15:21:24 +00:00
Javier Segarra 64c884693d Merge pull request 'HOTFIX #8192 Filter termopragh' (!934) from hotfix_termograph_filter into master
Reviewed-on: verdnatura/salix-front#934
Reviewed-by: Javi Gallego <jgallego@verdnatura.es>
2024-11-14 15:21:20 +00:00
Javier Segarra cb1c050343 fix: customerFilter sales person input 2024-11-14 16:18:22 +01:00
Javier Segarra 39e8f73d1b Merge branch 'dev' of https: refs #7136//gitea.verdnatura.es/verdnatura/salix-front into 7136-vnSelect_paginate_simplify_2 2024-11-14 16:05:08 +01:00
Jorge Penadés 8e0b098756 fix: refs #7874 add title 2024-11-14 16:01:09 +01:00
Jorge Penadés 59b40fed45 feat: refs #7874 improve vn-notes ui 2024-11-14 15:57:01 +01:00
Javier Segarra e6ba0c7c30 Merge branch 'master' into hotfix_termograph_filter 2024-11-14 14:56:30 +00:00
Jorge Penadés 8d070edf8d Merge pull request 'feat: refs #6839 normalize search' (!936) from 6839-normalizeSearch into dev
Reviewed-on: verdnatura/salix-front#936
Reviewed-by: Alex Moreno <alexm@verdnatura.es>
2024-11-14 14:06:03 +00:00
Alex Moreno 045a828bf9 fix(ZoneCard): fix ZoneLocations redirections 2024-11-14 13:59:04 +01:00
Jorge Penadés 7224860c5c feat: refs #6839 normalize search 2024-11-14 13:51:39 +01:00
Alex Moreno a929dec2ab fix(ZoneCard): fix ZoneLocations redirections 2024-11-14 13:42:46 +01:00
Javier Segarra c4cad9b7bb Merge branch 'master' into hotfix_termograph_filter 2024-11-14 12:27:57 +00:00
Javier Segarra 84414df487 Merge branch 'hotfix_termograph_filter' of https://gitea.verdnatura.es/verdnatura/salix-front into hotfix_termograph_filter 2024-11-14 13:27:41 +01:00
Javier Segarra aa5eb005fd feat: #8192 remove expr-builder proposal 2024-11-14 13:27:38 +01:00
Javier Segarra 68994db6ff Merge pull request 'Change layout CustomerDescriptor Actions' (!931) from warmFix_customerDescriptorActions into dev
Reviewed-on: verdnatura/salix-front#931
Reviewed-by: Jorge Penadés <jorgep@verdnatura.es>
2024-11-14 12:23:33 +00:00
Javier Segarra 61cd8c49c6 Merge branch 'dev' into warmFix_customerDescriptorActions 2024-11-14 12:22:33 +00:00
Alex Moreno 925ff859cc fix(ZoneCard): fix ZoneLocations redirections 2024-11-14 13:01:56 +01:00
Javier Segarra 259f0e30af Merge branch 'master' into hotfix_termograph_filter 2024-11-14 11:59:33 +00:00
Javier Segarra faf307bc16 fix: #8192 find by thermographFk instead id 2024-11-14 12:59:18 +01:00
Alex Moreno 218d041000 fix(ZoneCard): fix ZoneLocations redirections 2024-11-14 12:58:41 +01:00
Javier Segarra 291e97e540 feat: #6943 use openURL quasar 2024-11-14 12:48:33 +01:00
Alex Moreno 55b4c07e80 fix(ZoneCard): fix ZoneLocations searchbar 2024-11-14 12:33:44 +01:00
Alex Moreno 73c6dcfdd1 Merge branch 'test' of https://gitea.verdnatura.es/verdnatura/salix-front into dev 2024-11-14 12:20:17 +01:00
Alex Moreno c65f15d0f0 fix(Zone): if route is null 2024-11-14 12:18:39 +01:00
Carlos Satorres 27accd0e8b Merge pull request 'fix: refs #7306 clean warning' (!839) from 7306-warningCustomerUnpaid into dev
Reviewed-on: verdnatura/salix-front#839
Reviewed-by: Alex Moreno <alexm@verdnatura.es>
2024-11-14 11:09:25 +00:00
Carlos Satorres 857136a866 Merge branch 'dev' into 7306-warningCustomerUnpaid 2024-11-14 11:08:37 +00:00
Javier Segarra ecf131ba78 feat: move buttons to DescriptorMenu 2024-11-14 12:06:12 +01:00
Jorge Penadés 84802cf267 Merge pull request 'refactor: refs #6818 change channel source' (!932) from 6818-useDefaultChannel into dev
Reviewed-on: verdnatura/salix-front#932
Reviewed-by: Alex Moreno <alexm@verdnatura.es>
2024-11-14 10:31:15 +00:00
Jorge Penadés 877497e8ae Merge branch 'dev' of https://gitea.verdnatura.es/verdnatura/salix-front into 6818-useDefaultChannel 2024-11-14 11:29:58 +01:00
Alex Moreno e0e03526af Merge pull request 'warmFix: Revert previous commit e57a253c6f649382da187d1129449d265fb26d3b' (!930) from revert_warning_inject into dev
Reviewed-on: verdnatura/salix-front#930
Reviewed-by: Alex Moreno <alexm@verdnatura.es>
2024-11-14 10:28:37 +00:00
Jorge Penadés c4a4f7fcd6 refactor: refs #6818 change channel source 2024-11-14 11:20:16 +01:00
Carlos Satorres 5b444ef0f5 Merge branch 'dev' of https://gitea.verdnatura.es/verdnatura/salix-front into 7306-warningCustomerUnpaid 2024-11-14 10:54:22 +01:00
Javier Segarra 2bcd7061cb revert e57a253c6f
revert Merge pull request '#7308 Remove console warnings' (!928) from 7308-warning_inject into dev

Reviewed-on: verdnatura/salix-front#928
Reviewed-by: Alex Moreno <alexm@verdnatura.es>
2024-11-14 09:50:00 +00:00
Alex Moreno 139861f6cf test: fix limit 2024-11-14 10:38:02 +01:00
Alex Moreno 94c7ee3ae3 fix: arrayData store shared 2024-11-14 10:36:42 +01:00
Javier Segarra e57a253c6f Merge pull request '#7308 Remove console warnings' (!928) from 7308-warning_inject into dev
Reviewed-on: verdnatura/salix-front#928
Reviewed-by: Alex Moreno <alexm@verdnatura.es>
2024-11-14 08:09:09 +00:00
Javier Segarra b0bb09e9a6 perf: refs #7308 #7308 remove comments 2024-11-14 09:03:18 +01:00
Carlos Satorres a115caac71 Merge branch 'dev' of https://gitea.verdnatura.es/verdnatura/salix-front into 7310-warningTravelTermographs 2024-11-14 08:34:56 +01:00
Javier Segarra 0fe5f6d54d Merge branch 'dev' into 7308-warning_inject 2024-11-14 07:20:28 +00:00
Javier Segarra 590d495dbd test: refs #7308 #7308 axios.spec.js 2024-11-14 08:19:41 +01:00
Javier Segarra ef415d080a feat: refs #7308 #7308 remove warnings related to useSession 2024-11-14 08:19:19 +01:00
Jon Elias 483760c8cd Merge pull request '#7132 fix translations' (!843) from 7132-FixTranslations into dev
Reviewed-on: verdnatura/salix-front#843
Reviewed-by: Alex Moreno <alexm@verdnatura.es>
2024-11-14 07:10:49 +00:00
Jon Elias f9ef50db02 Merge branch 'dev' into 7132-FixTranslations 2024-11-14 07:10:02 +00:00
Guillermo Bonet c2b6b816a4 fix: refs #7283 Account image resolution 2024-11-14 08:04:06 +01:00
Jon Elias eecf8beb7a Merge pull request 'Hotfix: allow decimal numbers when creating a purchase request' (!927) from Hotfix-CreateRequest into master
Reviewed-on: verdnatura/salix-front#927
Reviewed-by: Alex Moreno <alexm@verdnatura.es>
2024-11-13 13:18:48 +00:00
Jon Elias bcb777d4bc Merge branch 'master' into Hotfix-CreateRequest 2024-11-13 13:18:00 +00:00
Jon Elias 540e0348a1 Merge branch 'dev' of https: refs #7132//gitea.verdnatura.es/verdnatura/salix-front into 7132-FixTranslations 2024-11-13 14:10:08 +01:00
Carlos Satorres 9e653b8c2d Merge branch 'dev' of https://gitea.verdnatura.es/verdnatura/salix-front into 7310-warningTravelTermographs 2024-11-13 14:05:57 +01:00
Javier Segarra 9afbcd5cea Merge pull request 'fix: customer last tickets' (!926) from fixCustomerSumarryLastTickets into master
Reviewed-on: verdnatura/salix-front#926
Reviewed-by: Javier Segarra <jsegarra@verdnatura.es>
2024-11-13 12:56:24 +00:00
Pablo Natek ddfea42c62 fix: add click stop on descriptorProxis 2024-11-13 13:51:37 +01:00
Jon Elias 75c33dabf1 Merge branch 'master' into Hotfix-CreateRequest 2024-11-13 12:41:40 +00:00
Jon Elias 244c23be1d fix: allow decimal numbers when creating a purchase request 2024-11-13 13:40:19 +01:00
Pablo Natek 1c5a02fe52 fix: customer last tickets 2024-11-13 13:17:15 +01:00
Pablo Natek 8d296daf1e Merge pull request 'fix: refs #7404 some filter issues' (!921) from 7404-fixFilterIsssues into master
Reviewed-on: verdnatura/salix-front#921
Reviewed-by: Alex Moreno <alexm@verdnatura.es>
2024-11-13 11:25:31 +00:00
Pablo Natek bccfb161e6 Merge branch 'master' into 7404-fixFilterIsssues 2024-11-13 11:24:25 +00:00
Jorge Penadés 76187f00a1 Merge pull request 'feat: add city name' (!925) from 7354-hotfix-showCity into master
Reviewed-on: verdnatura/salix-front#925
Reviewed-by: Alex Moreno <alexm@verdnatura.es>
2024-11-13 11:23:17 +00:00
Jorge Penadés b68868e103 feat: add city name 2024-11-13 12:11:15 +01:00
Jorge Penadés 7dba1a1846 Merge pull request 'feat: refs #6818 add icon' (!924) from 6818-addIcon into dev
Reviewed-on: verdnatura/salix-front#924
Reviewed-by: Alex Moreno <alexm@verdnatura.es>
2024-11-13 11:01:40 +00:00
Jorge Penadés 9291c4dd6a feat: refs #6818 add icon 2024-11-13 11:50:08 +01:00
Pablo Natek f93532d5b7 Merge pull request 'hotfixZoneFilter' (!922) from hotfixZoneFilter into master
Reviewed-on: verdnatura/salix-front#922
Reviewed-by: Javier Segarra <jsegarra@verdnatura.es>
Reviewed-by: Alex Moreno <alexm@verdnatura.es>
2024-11-13 09:22:15 +00:00
Pablo Natek 178753ddcc fix: add scope fields on filter 2024-11-13 10:11:14 +01:00
Pablo Natek 8eb76cd0fc fix: url name 2024-11-13 10:00:04 +01:00
Pablo Natek 81927c5af5 fix: zoneFilter 2024-11-13 09:58:41 +01:00
Jorge Penadés d474fb924f Merge pull request 'feat: refs #6818 saysimple integration' (!904) from 6818-saySimpleIntegration into dev
Reviewed-on: verdnatura/salix-front#904
Reviewed-by: Alex Moreno <alexm@verdnatura.es>
2024-11-13 08:25:27 +00:00
Jorge Penadés 96e9de519f Merge branch 'dev' into 6818-saySimpleIntegration 2024-11-13 08:22:44 +00:00
Pablo Natek 5c59ae8217 fix: refs #7404 some filter issues 2024-11-13 09:12:51 +01:00
Alex Moreno 1f8ead608c Merge pull request 'feat(VnSelect): order data equal salix' (!918) from warmFix_order_equalSalix into dev
Reviewed-on: verdnatura/salix-front#918
Reviewed-by: Javier Segarra <jsegarra@verdnatura.es>
2024-11-13 06:48:55 +00:00
Alex Moreno 2ae9d68fec Merge branch 'dev' into warmFix_order_equalSalix 2024-11-13 06:21:59 +00:00
Alex Moreno 8269037faa chore: perf 2024-11-13 07:21:42 +01:00
Guillermo Bonet 8db3ab4d47 Merge branch 'dev' into 7950-cmrModelUnify 2024-11-13 06:13:23 +00:00
Jorge Penadés 83be57a0c4 chore: refs #6818 drop useless code & comment 2024-11-12 15:01:17 +01:00
Jorge Penadés e29cd38ae9 Merge branch 'dev' of https://gitea.verdnatura.es/verdnatura/salix-front into 6818-saySimpleIntegration 2024-11-12 15:00:18 +01:00
Alex Moreno fc28639556 Merge branch 'test' of https://gitea.verdnatura.es/verdnatura/salix-front into dev 2024-11-12 14:40:42 +01:00
Alex Moreno 3f15c3cce0 feat(VnSelect): order data equal salix 2024-11-12 14:35:55 +01:00
Jorge Penadés 679107d7ea Merge pull request 'fix: refs #7354 redirect to ticket' (!917) from 7354-hotfix-redirectToTicket into master
Reviewed-on: verdnatura/salix-front#917
Reviewed-by: Alex Moreno <alexm@verdnatura.es>
2024-11-12 12:47:35 +00:00
Jorge Penadés 86b8f9bf54 Merge pull request 'feat: refs #6919 sync entry data' (!913) from 6919-reactiveDescriptor into dev
Reviewed-on: verdnatura/salix-front#913
Reviewed-by: Javi Gallego <jgallego@verdnatura.es>
2024-11-12 12:37:39 +00:00
Jorge Penadés 90f04cc010 Merge branch 'dev' into 6919-reactiveDescriptor 2024-11-12 12:36:48 +00:00
Jorge Penadés 18f544f8dc fix: refs #7354 redirect to ticket 2024-11-12 13:23:28 +01:00
Javier Segarra 830c3658d4 Merge pull request 'fix/OrderCatalog' (!893) from wbuezas/salix-front-mindshore-fork2:fix/OrderCatalog into dev
Reviewed-on: verdnatura/salix-front#893
Reviewed-by: Javier Segarra <jsegarra@verdnatura.es>
2024-11-12 12:01:43 +00:00
Jorge Penadés 1554333e07 Merge pull request 'fix: refs #7354 zip filter' (!916) from 7354-hotfix-zipFilter into master
Reviewed-on: verdnatura/salix-front#916
Reviewed-by: Alex Moreno <alexm@verdnatura.es>
2024-11-12 11:53:41 +00:00
Jorge Penadés db8340bde5 Merge branch 'master' of https://gitea.verdnatura.es/verdnatura/salix-front into 7354-hotfix-zipFilter 2024-11-12 12:51:09 +01:00
Alex Moreno 26af102804 fix(CreateThermographForm): remove limit 2024-11-12 12:47:30 +01:00
Jorge Penadés 2afddeb063 fix: refs #7354 zip filter 2024-11-12 12:41:10 +01:00
Javier Segarra a7d53fcbe6 Merge branch 'dev' into fix/OrderCatalog 2024-11-12 11:30:36 +00:00
Javier Segarra a76d63ff00 Merge pull request 'HOTFIX: Send SMS using mobile instead phone' (!914) from hotFix-customer_sms into master
Reviewed-on: verdnatura/salix-front#914
Reviewed-by: Carlos Satorres <carlossa@verdnatura.es>
2024-11-12 11:13:32 +00:00
Javier Segarra 2139b7e8e8 Merge branch 'master' into hotFix-customer_sms 2024-11-12 11:12:46 +00:00
Carlos Satorres d8ae6c056e Merge pull request 'fix: fix termo' (!915) from hotfix-termog into master
Reviewed-on: verdnatura/salix-front#915
Reviewed-by: Javier Segarra <jsegarra@verdnatura.es>
2024-11-12 11:09:41 +00:00
Carlos Satorres fefa61ea5c fix: fix termo 2024-11-12 12:07:02 +01:00
Javier Segarra 6355993c14 fix: mobile is more relevant than phone 2024-11-12 11:00:05 +00:00
Jorge Penadés b4d7653661 refactor: refs #6919 export filter 2024-11-12 11:15:34 +01:00
Jorge Penadés efd66ea02a feat: refs #6919 sync entry data 2024-11-12 11:08:45 +01:00
Alex Moreno 95b6e72e6c Merge pull request 'HOTFIX(CustomerBalance): getClientRisk' (!912) from hotFix_customer_balance into master
Reviewed-on: verdnatura/salix-front#912
Reviewed-by: Carlos Satorres <carlossa@verdnatura.es>
2024-11-12 09:27:54 +00:00
Alex Moreno 700fb7481b fix(CustomerBalance): getClientRisk 2024-11-12 10:15:31 +01:00
Jorge Penadés 81b35aa75b chore: refs #6818 add spaces 2024-11-12 10:11:26 +01:00
Jorge Penadés 700701f055 refactor: refs #6818 channel logic 2024-11-12 10:10:26 +01:00
Jorge Penadés c775ba8592 Merge branch 'dev' of https://gitea.verdnatura.es/verdnatura/salix-front into 6818-saySimpleIntegration 2024-11-12 09:45:05 +01:00
Jorge Penadés cc12250109 Merge pull request 'feat: refs #6839 module searching' (!910) from 6839-addSearchMenu into dev
Reviewed-on: verdnatura/salix-front#910
Reviewed-by: Alex Moreno <alexm@verdnatura.es>
2024-11-12 08:35:42 +00:00
Guillermo Bonet 40ecd6e358 refactor: refs #7950 Created cmr model 2024-11-12 08:28:02 +01:00
Alex Moreno 8c78991163 fix(EntryStockBought): min width 2024-11-12 08:23:49 +01:00
Alex Moreno 87b7fd6db4 Merge pull request '8179-testToMaster' (!909) from 8179-testToMaster into master
Reviewed-on: verdnatura/salix-front#909
Reviewed-by: Guillermo Bonet <guillermo@verdnatura.es>
2024-11-12 07:01:11 +00:00
Jorge Penadés 7f1a4d6cc8 Merge branch 'dev' of https://gitea.verdnatura.es/verdnatura/salix-front into 6818-saySimpleIntegration 2024-11-11 16:42:20 +01:00
Jorge Penadés 07e7cbc355 feat: refs #6839 module searching 2024-11-11 16:36:18 +01:00
Alex Moreno e21087e645 Merge pull request 'feat(Supplier): add companySize' (!906) from 6828-supplier_companySize into dev
Reviewed-on: verdnatura/salix-front#906
Reviewed-by: Jorge Penadés <jorgep@verdnatura.es>
2024-11-11 12:48:16 +00:00
Alex Moreno 777ac58f04 feat(Supplier): add companySize 2024-11-11 10:31:41 +01:00
Jorge Penadés 462382ecb5 Merge branch 'dev' of https://gitea.verdnatura.es/verdnatura/salix-front into 6818-saySimpleIntegration 2024-11-08 17:49:35 +01:00
Jorge Penadés 7fb3e71688 feat: refs #6818 fetch url & default channel 2024-11-08 17:41:27 +01:00
William Buezas ade90afd03 refactor: change keyup.enter for update:model-value 2024-11-08 10:13:35 -03:00
William Buezas c1d623622d refactor: remove unused variable 2024-11-08 10:11:15 -03:00
Jorge Penadés 3bae121ed7 fix: refs #6818 use right icon 2024-11-08 13:04:40 +01:00
Javier Segarra 3825dc3851 feat: disabled buttons 2024-11-08 11:54:04 +01:00
Jorge Penadés a467c44b91 feat: refs #6818 saysimple integration 2024-11-08 11:51:13 +01:00
Javier Segarra c22c8d9f11 Merge pull request 'Improve required attrs for VnInput*' (!886) from improve_isRequired_input into dev
Reviewed-on: verdnatura/salix-front#886
Reviewed-by: Alex Moreno <alexm@verdnatura.es>
2024-11-08 10:47:56 +00:00
Javier Segarra ead326c66b Merge branch 'improve_isRequired_input' of https://gitea.verdnatura.es/verdnatura/salix-front into improve_isRequired_input 2024-11-08 08:39:29 +01:00
Alex Moreno dce57f4638 Merge branch 'dev' into improve_isRequired_input 2024-11-08 07:32:07 +00:00
Alex Moreno 0c6d6d6925 Merge pull request 'refs: #7782 Cypress features' (!891) from cypress_features into dev
Reviewed-on: verdnatura/salix-front#891
Reviewed-by: Javi Gallego <jgallego@verdnatura.es>
Reviewed-by: Alex Moreno <alexm@verdnatura.es>
2024-11-08 07:31:46 +00:00
Javier Segarra 0a5c3bfe5b Merge branch 'dev' into improve_isRequired_input 2024-11-08 07:29:54 +00:00
Javier Segarra 570c09bab5 Merge branch 'dev' into cypress_features 2024-11-08 07:27:26 +00:00
Javier Segarra 96d68ed106 Merge branch 'dev' into fix/OrderCatalog 2024-11-08 06:59:26 +00:00
William Buezas 8bff7fc1d6 fix: reset category 2024-11-07 21:09:39 -03:00
William Buezas 52a2250acc refactor: apply QPopupProxy 2024-11-07 19:16:06 -03:00
William Buezas 498a52a3e5 refactor: small change 2024-11-07 19:07:03 -03:00
Alex Moreno 624ba2c13d Merge pull request 'FIX: #6943 Customer issues' (!885) from fix_customer_issues into dev
Reviewed-on: verdnatura/salix-front#885
Reviewed-by: Alex Moreno <alexm@verdnatura.es>
2024-11-07 16:20:22 +00:00
Alex Moreno 0b5be9e67f chore: correct checkNotification 2024-11-07 17:19:35 +01:00
Javier Segarra e210ad7de4 Merge branch 'dev' into fix_customer_issues 2024-11-07 13:06:33 +01:00
Javier Segarra 489df51d64 Merge branch 'dev' into fix_customer_issues 2024-11-07 12:54:19 +01:00
Javier Segarra 2bf7fa46ca perf: remove appendParams 2024-11-07 12:53:17 +01:00
Alex Moreno 5d0c91187e Merge pull request 'fix(InvoiceOutGlobal): parallelism' (!900) from warmFix_invoiceOut_Global into dev
Reviewed-on: verdnatura/salix-front#900
Reviewed-by: Jorge Penadés <jorgep@verdnatura.es>
2024-11-07 09:43:18 +00:00
Alex Moreno 18cc3888e5 Merge branch 'dev' into warmFix_invoiceOut_Global 2024-11-07 09:42:09 +00:00
Alex Moreno cc236cac03 Merge branch 'test' of https://gitea.verdnatura.es/verdnatura/salix-front into dev 2024-11-07 10:19:02 +01:00
Alex Moreno dd2ee2a7de Merge pull request 'fix(worker): add searchurls' (!901) from warmFix_worker_searchUrls into test
Reviewed-on: verdnatura/salix-front#901
Reviewed-by: Jorge Penadés <jorgep@verdnatura.es>
2024-11-07 09:17:18 +00:00
Alex Moreno 6c9627c6c5 fix(worker): add searchurls 2024-11-06 17:51:21 +01:00
Alex Moreno 2b02c9fbd3 Merge branch 'dev' into warmFix_invoiceOut_Global 2024-11-06 12:54:18 +00:00
Alex Moreno ead241e7da chore: remove console.log 2024-11-06 13:53:58 +01:00
Alex Moreno a2bbf4474d fix(InvoiceOutGlobal): parallelism 2024-11-06 13:52:59 +01:00
Alex Moreno 473b0808e8 Merge pull request 'feat(VnInput): empty to null' (!898) from 6766-vnInput_emptyToNull into dev
Reviewed-on: verdnatura/salix-front#898
Reviewed-by: Jorge Penadés <jorgep@verdnatura.es>
2024-11-05 14:05:01 +00:00
Alex Moreno abd7b76636 feat(VnInput): empty to null 2024-11-05 13:50:25 +01:00
Jorge Penadés ec88bcbc44 Merge pull request '#7273 fixItemTags' (!895) from 7273-fixItemTags into dev
Reviewed-on: verdnatura/salix-front#895
Reviewed-by: Alex Moreno <alexm@verdnatura.es>
2024-11-05 11:56:14 +00:00
Jorge Penadés 9959fbf005 fix: refs #7273 use same filter 2024-11-05 12:23:11 +01:00
Jorge Penadés 4a95a0e39a chore: refs #7273 sticky add btn & refactor 2024-11-05 11:59:38 +01:00
Jorge Penadés 9ee05721a4 Merge pull request '#8078 enable multi choice' (!848) from 8078-enableMultiSelection into dev
Reviewed-on: verdnatura/salix-front#848
Reviewed-by: Alex Moreno <alexm@verdnatura.es>
2024-11-05 10:20:04 +00:00
Jorge Penadés ca9a7f2932 Merge branch 'dev' into 8078-enableMultiSelection 2024-11-05 10:18:46 +00:00
Alex Moreno 14498a78b2 Merge pull request '6920-invoiceInBasicData_useVnDms' (!892) from 6920-invoiceInBasicData_useVnDms into dev
Reviewed-on: verdnatura/salix-front#892
Reviewed-by: Jorge Penadés <jorgep@verdnatura.es>
2024-11-05 09:57:31 +00:00
Jorge Penadés 86e6bef90f chore: refs #8078 fiz tests 2024-11-05 10:37:35 +01:00
Jorge Penadés a4a4190e4e Merge branch '8078-enableMultiSelection' of https://gitea.verdnatura.es/verdnatura/salix-front into 8078-enableMultiSelection 2024-11-05 10:02:33 +01:00
Jorge Penadés 1f9d850fbe chore: refs #8078 rollback ref 2024-11-05 10:02:29 +01:00
Jorge Penadés a542f69b0f Merge branch 'dev' of https: refs #8078//gitea.verdnatura.es/verdnatura/salix-front into 8078-enableMultiSelection 2024-11-05 10:02:09 +01:00
Alex Moreno e050a077d4 test: refactor e2e 2024-11-04 13:41:37 +01:00
Alex Moreno 08204aa5f0 refactor(InvoiceInBasicData): use VnDms 2024-11-04 13:02:39 +01:00
William Buezas d627c1f698 fix: order catalog 2024-11-03 10:29:03 -03:00
Javier Segarra 1761cc23e0 feat: use composable to unify logic 2024-10-30 08:29:04 +01:00
Javier Segarra 4de23c31b3 feat: use composable to unify logic 2024-10-29 15:01:49 +01:00
Javier Segarra fbbbc331a9 feat: #7782 add cypress report 2024-10-29 14:27:24 +01:00
Javier Segarra 2090b78ce6 feat: #7782 cypress.config watchForFileChanges 2024-10-29 14:25:34 +01:00
Javier Segarra b817aa92c2 feat: #7782 npm run resetDatabase 2024-10-29 14:23:22 +01:00
Javier Segarra ed8225bf6c feat: #7782 waitUntil domContentLoad 2024-10-29 14:23:06 +01:00
Alex Moreno f4bdefd4e7 Merge branch 'dev' into improve_isRequired_input 2024-10-29 13:13:59 +00:00
Alex Moreno bf4bee0f95 feat(VnSelect): refs #7136 add scroll 2024-10-29 14:07:34 +01:00
Jon Elias e26fdfe4a3 Merge pull request '#7206 added inactive label and corrected minor errors' (!889) from 7206-ModifySelectAddress into dev
Reviewed-on: verdnatura/salix-front#889
Reviewed-by: Alex Moreno <alexm@verdnatura.es>
2024-10-29 13:05:38 +00:00
Jon Elias 282999c49e fix: refs #7206 deleted duplicate code 2024-10-29 13:23:15 +01:00
Jon Elias bf480c20f8 Merge branch '7206-ModifySelectAddress' of https://gitea.verdnatura.es/verdnatura/salix-front into 7206-ModifySelectAddress 2024-10-29 13:22:01 +01:00
Jon Elias 8be4210138 Merge branch 'dev' of https://gitea.verdnatura.es/verdnatura/salix-front into 7206-ModifySelectAddress 2024-10-29 13:21:56 +01:00
Jon Elias 00b4e885c1 Merge branch 'dev' into 7206-ModifySelectAddress 2024-10-29 12:19:19 +00:00
Jon Elias 476ef1dedd feat: refs #7206 added inactive label and corrected minor errors 2024-10-29 13:14:42 +01:00
Alex Moreno fa5750bce4 Merge branch 'dev' into 8078-enableMultiSelection 2024-10-29 11:44:04 +00:00
Jon Elias 89dfc0aff5 Merge pull request '#6896 fix Order module problems' (!817) from Fix_OrderModuleProblems into dev
Reviewed-on: verdnatura/salix-front#817
Reviewed-by: Javier Segarra <jsegarra@verdnatura.es>
2024-10-29 11:20:13 +00:00
Jon Elias 9104e13a6d Merge branch 'dev' into Fix_OrderModuleProblems 2024-10-29 11:19:21 +00:00
Alex Moreno 53887277ca Merge pull request 'fix: refs #7283 filter' (!887) from 7283-itemFilterWorkerBuyer into dev
Reviewed-on: verdnatura/salix-front#887
Reviewed-by: Alex Moreno <alexm@verdnatura.es>
2024-10-29 10:43:32 +00:00
Alex Moreno c7c1343c06 Merge branch 'dev' into 7283-itemFilterWorkerBuyer 2024-10-29 10:42:39 +00:00
Jorge Penadés e39f85ff4b fix: refs #8078 improve handleSelection 2024-10-29 09:56:06 +01:00
Jorge Penadés 19a7e52605 fix: refs #8078 handleSelection 2024-10-29 09:39:56 +01:00
Jorge Penadés 77cb2d84be fix: refs #8078 handleSelection 2024-10-29 09:38:40 +01:00
Jorge Penadés 71420da586 Merge branch 'dev' of https: refs #8078//gitea.verdnatura.es/verdnatura/salix-front into 8078-enableMultiSelection 2024-10-29 09:27:30 +01:00
Jon Elias 1ff77abaf5 Merge branch 'dev' into Fix_OrderModuleProblems 2024-10-29 08:26:16 +00:00
Jon Elias 5663064dd8 refactor: modified composable 2024-10-29 09:23:49 +01:00
Alex Moreno 42fbdff5bd test: fix e2e 2024-10-29 08:48:06 +01:00
Carlos Satorres 96f894cc6c fix: refs #7283 filter 2024-10-29 08:17:18 +01:00
Guillermo Bonet df7f9b47d3 Merge pull request 'refactor: refs #7266 Changed method name' (!884) from 7266-buyLabelSupplier into dev
Reviewed-on: verdnatura/salix-front#884
Reviewed-by: Javi Gallego <jgallego@verdnatura.es>
2024-10-29 06:04:21 +00:00
Guillermo Bonet b8ecf40777 Merge branch 'dev' into 7266-buyLabelSupplier 2024-10-29 06:03:07 +00:00
Javier Segarra d2680b0a1f test: fix arrayData 2024-10-29 02:40:47 +01:00
Javier Segarra 4b00ab877c perf: use required instead :required="true" 2024-10-29 02:26:35 +01:00
Javier Segarra 0b2c404ab3 perf: minor bugs detected 2024-10-29 02:15:21 +01:00
Javier Segarra 0de4dfd4f8 feat: apply changes for customerModule 2024-10-29 02:15:02 +01:00
Jorge Penadés 1e16e3312e fix: refs #8078 improve cy command 2024-10-28 16:21:00 +01:00
Jorge Penadés 57488503aa fix: refs #8078 e2e #7970 2024-10-28 16:19:24 +01:00
Jorge Penadés 7e3e194b46 fix: refs #8078 e2e #7970 2024-10-28 16:19:13 +01:00
Jorge Penadés d5639471cf feat: refs #8078 add tests 2024-10-28 15:40:36 +01:00
Jorge Penadés 5ef5285abc Merge branch 'dev' of https://gitea.verdnatura.es/verdnatura/salix-front into 8078-enableMultiSelection 2024-10-28 14:45:40 +01:00
Jorge Penadés 458c6b0f42 Merge pull request 'feat: refs #7524 add front test' (!881) from 7524-addTests into dev
Reviewed-on: verdnatura/salix-front#881
Reviewed-by: Alex Moreno <alexm@verdnatura.es>
2024-10-28 13:43:04 +00:00
Jorge Penadés fecf9fddff Merge branch 'dev' into 7524-addTests 2024-10-28 13:41:41 +00:00
Carlos Andrés b8ba313132 Merge pull request 'feat: refs #8087 Traspasar redadas a travels' (!864) from 8087-nuevoCampoTravel into dev
Reviewed-on: verdnatura/salix-front#864
Reviewed-by: Alex Moreno <alexm@verdnatura.es>
2024-10-28 13:29:05 +00:00
Jorge Penadés 934b32092b chore: refs #7524 fix test 2024-10-28 14:21:03 +01:00
Jorge Penadés a73a451cd8 Merge branch 'dev' of https://gitea.verdnatura.es/verdnatura/salix-front into 7524-addTests 2024-10-28 14:19:36 +01:00
Guillermo Bonet 15977357d9 refactor: refs #7266 Changed method name 2024-10-28 14:11:34 +01:00
Jon Elias d4f92812cf Merge pull request '#7970 notify changes in lines' (!877) from 7970-NotifySaleChanges into dev
Reviewed-on: verdnatura/salix-front#877
Reviewed-by: Alex Moreno <alexm@verdnatura.es>
2024-10-28 12:41:47 +00:00
Jon Elias 76dd27638a Merge branch 'dev' into 7970-NotifySaleChanges 2024-10-28 12:40:47 +00:00
Carlos Satorres a9092251a8 Merge pull request 'fix: refs #7283 item filters' (!880) from 7283-fixItemFilters into dev
Reviewed-on: verdnatura/salix-front#880
Reviewed-by: Alex Moreno <alexm@verdnatura.es>
2024-10-28 12:28:04 +00:00
Jorge Penadés 526b7d91de Merge branch 'dev' of https://gitea.verdnatura.es/verdnatura/salix-front into 8078-enableMultiSelection 2024-10-28 13:26:27 +01:00
Jorge Penadés a1105f2ef1 feat: refs #7524 add front test 2024-10-28 13:24:46 +01:00
Carlos Satorres d252f6d2a3 fix: refs #7283 fix preview 2024-10-28 13:22:33 +01:00
Carlos Satorres 965c2f7b20 fix: refs #7283 preview 2024-10-28 13:16:51 +01:00
Carlos Satorres f2803a6313 fix: refs #7283 item filters 2024-10-28 13:08:19 +01:00
Jon Elias c997081303 Merge branch 'Fix_OrderModuleProblems' of https://gitea.verdnatura.es/verdnatura/salix-front into Fix_OrderModuleProblems 2024-10-28 12:59:26 +01:00
Jon Elias cab5a165d2 refactor: changed confirmOrder directory 2024-10-28 12:59:25 +01:00
Jon Elias ac3013205e Merge branch 'dev' into 7970-NotifySaleChanges 2024-10-28 11:46:02 +00:00
Jon Elias 3d4ca2bc67 refactor: refs #7970 added emit 2024-10-28 12:45:13 +01:00
Jon Elias 639e08406e Merge branch 'dev' into Fix_OrderModuleProblems 2024-10-28 11:22:23 +00:00
Jon Elias ea05637bf2 Merge branch 'Fix_OrderModuleProblems' of https://gitea.verdnatura.es/verdnatura/salix-front into Fix_OrderModuleProblems 2024-10-28 12:21:28 +01:00
Jon Elias 17b1921af6 feat: added composable to confirm orders 2024-10-28 12:21:26 +01:00
Jon Elias 30f88070ff Merge pull request '#7193 modified parking to use the scope' (!879) from 7193-ParkingCreateScope into dev
Reviewed-on: verdnatura/salix-front#879
Reviewed-by: Alex Moreno <alexm@verdnatura.es>
2024-10-28 10:48:03 +00:00
Jon Elias e5a221d073 Merge branch '7970-NotifySaleChanges' of https://gitea.verdnatura.es/verdnatura/salix-front into 7970-NotifySaleChanges 2024-10-28 11:44:50 +01:00
Jon Elias 9347bb1ef5 refactor: refs #7970 refactored VnConfirm to emit events 2024-10-28 11:44:49 +01:00
Jon Elias 68478c4d13 Merge branch '7193-ParkingCreateScope' of https://gitea.verdnatura.es/verdnatura/salix-front into 7193-ParkingCreateScope 2024-10-28 11:37:33 +01:00
Jon Elias 2cde850132 fix: refs #7193 fixed e2e test 2024-10-28 11:37:32 +01:00
Jon Elias 18a71e63e1 Merge branch 'dev' into 7193-ParkingCreateScope 2024-10-28 09:41:08 +00:00
Jon Elias df1c123444 feat: refs #7193 modified parking to use the scope and corrected small errors 2024-10-28 10:39:45 +01:00
Carlos Satorres 9d37d78e8b Merge pull request 'fix: itemType redirection and fix filters' (!878) from fix_itemType-redirection into dev
Reviewed-on: verdnatura/salix-front#878
Reviewed-by: Carlos Satorres <carlossa@verdnatura.es>
2024-10-28 09:22:33 +00:00
Alex Moreno ffee9fb27c Merge branch 'dev' into fix_itemType-redirection 2024-10-28 09:14:21 +00:00
Alex Moreno bc8a87b267 chore: typo 2024-10-28 09:58:07 +01:00
Alex Moreno cca255507a fix: itemType redirection and fix filters 2024-10-28 09:57:25 +01:00
Jorge Penadés bb106e25a0 Merge pull request 'fix: refs #7524 e2e & worker module' (!876) from 7524-fixE2e into dev
Reviewed-on: verdnatura/salix-front#876
Reviewed-by: Alex Moreno <alexm@verdnatura.es>
2024-10-28 08:51:17 +00:00
Jon Elias 454be43884 Merge branch 'dev' into 7970-NotifySaleChanges 2024-10-28 07:17:06 +00:00
Jon Elias ca6547e174 feat: refs #7970 notify changes 2024-10-28 07:48:11 +01:00
William Buezas c93f152060 fix: order catalog fixes 2024-10-27 15:27:53 -03:00
Jorge Penadés 0cc0e82aaa feat: refs #8078 add shortcut multi selection 2024-10-27 14:48:44 +01:00
Jorge Penadés 1da86900e6 fix: refs #7524 e2e & worker module 2024-10-27 13:43:38 +01:00
Guillermo Bonet 0537213a58 Merge pull request 'feat: refs #7006 itemTypeLog added' (!825) from 7006-itemTypeLog into dev
Reviewed-on: verdnatura/salix-front#825
Reviewed-by: Alex Moreno <alexm@verdnatura.es>
2024-10-25 12:32:37 +00:00
Alex Moreno d14f2bd638 Merge branch 'dev' into 7006-itemTypeLog 2024-10-25 12:30:07 +00:00
Guillermo Bonet 494fc66c06 feat: refs #7006 itemType basic data new inputs 2024-10-25 14:14:51 +02:00
William Buezas 211da859bd fix: catalog view category and type filter 2024-10-25 08:57:16 -03:00
Guillermo Bonet 8edba36a74 feat: refs #7006 itemType basic data new inputs 2024-10-25 13:46:36 +02:00
Alex Moreno c127fee467 Merge branch 'test' of https://gitea.verdnatura.es/verdnatura/salix-front into dev 2024-10-25 13:08:37 +02:00
Alex Moreno c1e4c45318 Merge branch 'master' of https://gitea.verdnatura.es/verdnatura/salix-front into test 2024-10-25 13:08:26 +02:00
Guillermo Bonet 57a3504a7f Merge branch 'dev' into 7006-itemTypeLog 2024-10-25 11:06:49 +00:00
Alex Moreno 48a1e6b15d Merge pull request 'fix: performance addEventListeners' (!874) from fix_performance into master
Reviewed-on: verdnatura/salix-front#874
Reviewed-by: Javier Segarra <jsegarra@verdnatura.es>
2024-10-25 11:06:41 +00:00
Alex Moreno 5b24aa4570 fix: performance addEventListeners 2024-10-25 12:58:23 +02:00
Jorge Penadés 1b05a5173d Merge pull request 'fix: refs #7943 use summary' (!873) from 7943-fixWorker into dev
Reviewed-on: verdnatura/salix-front#873
Reviewed-by: Alex Moreno <alexm@verdnatura.es>
2024-10-25 09:54:14 +00:00
Jorge Penadés cdb73f7a17 fix: refs #7943 use correct data-key 2024-10-25 11:50:20 +02:00
Jorge Penadés bb51a9e687 fix: refs #7943 use summary 2024-10-25 11:38:00 +02:00
Jon Elias 32a9a40392 Merge pull request 'Hotfix: reload window when price is recalculated' (!863) from Hotfix-RecalculatePriceReload into master
Reviewed-on: verdnatura/salix-front#863
Reviewed-by: Javier Segarra <jsegarra@verdnatura.es>
2024-10-25 09:32:23 +00:00
Alex Moreno fc175666b1 Merge pull request '#6943 add comands to solve tests' (!851) from 6943_customer_spec into dev
Reviewed-on: verdnatura/salix-front#851
Reviewed-by: Alex Moreno <alexm@verdnatura.es>
2024-10-25 09:08:09 +00:00
Javier Segarra 6bb6cd8d93 Merge branch 'dev' into 6943_customer_spec 2024-10-25 08:55:04 +00:00
Javier Segarra 02f682ac0b perf: refs #6943 #6943 merge command 2024-10-25 10:53:19 +02:00
Alex Moreno e7d0ecf6bb Merge branch 'test' of https://gitea.verdnatura.es/verdnatura/salix-front into dev 2024-10-25 10:40:57 +02:00
Javier Segarra ff559384aa perf: refs #6943 #6943 merge command 2024-10-25 10:33:59 +02:00
Javier Segarra 21c4468fce Merge branch 'dev' into 6943_customer_spec 2024-10-25 10:33:34 +02:00
Alex Moreno 100dfbec3e Merge branch 'dev' into 8087-nuevoCampoTravel 2024-10-25 08:14:09 +00:00
Carlos Andrés 9e57c5e452 feat: refs #8087 Traspasar redadas a travels 2024-10-25 10:13:09 +02:00
Carlos Andrés 4c1e4aedd2 feat: refs #8087 Traspasar redadas a travels 2024-10-25 10:03:09 +02:00
Jon Elias 88fe60e296 Merge pull request 'Warmfix: packaging type field showing repetitive values' (!856) from Fix-CustomerSummaryTable into test
Reviewed-on: verdnatura/salix-front#856
Reviewed-by: Alex Moreno <alexm@verdnatura.es>
2024-10-25 08:02:24 +00:00
Jon Elias 139744d90b Merge branch 'test' into Fix-CustomerSummaryTable 2024-10-25 08:01:28 +00:00
Jon Elias 1daa8be635 perf: optimize get packing type function 2024-10-25 09:41:28 +02:00
Carlos Satorres a01e685d5d Merge pull request '#7283 #7831 itemMigration' (!553) from 7283-itemMigration into dev
Reviewed-on: verdnatura/salix-front#553
Reviewed-by: Alex Moreno <alexm@verdnatura.es>
Reviewed-by: Javier Segarra <jsegarra@verdnatura.es>
2024-10-25 07:09:13 +00:00
Carlos Satorres 0cb5f34b15 Merge branch 'dev' into 7283-itemMigration 2024-10-25 07:08:16 +00:00
Alex Moreno c274641334 Merge pull request 'fix: better performance' (!869) from warmFix_accountAcls into dev
Reviewed-on: verdnatura/salix-front#869
Reviewed-by: Carlos Satorres <carlossa@verdnatura.es>
2024-10-25 06:52:31 +00:00
Carlos Satorres 69aec0cd83 Merge branch 'dev' into warmFix_accountAcls 2024-10-25 06:18:47 +00:00
Carlos Satorres 0aec073cf1 Merge pull request 'fix: entryFilters' (!872) from fix-entryFilters into dev
Reviewed-on: verdnatura/salix-front#872
Reviewed-by: Alex Moreno <alexm@verdnatura.es>
2024-10-25 06:18:07 +00:00
Carlos Satorres e8d2a40daf fix: entryFilters 2024-10-25 08:11:31 +02:00
Jon Elias 1889dd02e4 Merge branch 'master' into Hotfix-RecalculatePriceReload 2024-10-25 04:49:34 +00:00
Jon Elias 9ba16e4116 Merge branch 'Hotfix-RecalculatePriceReload' of https://gitea.verdnatura.es/verdnatura/salix-front into Hotfix-RecalculatePriceReload 2024-10-25 06:48:11 +02:00
Jon Elias 994237260e refactor: changed name of emitted event 2024-10-25 06:48:09 +02:00
Carlos Andrés 12c236276d feat: refs #8087 Traspasar redadas a travels 2024-10-24 19:32:20 +02:00
Alex Moreno 92e147355f fix: better performance 2024-10-24 15:13:05 +02:00
Carlos Satorres 67a5d10a5e Merge branch 'dev' into 7283-itemMigration 2024-10-24 13:10:23 +00:00
Javier Segarra 855979d22d perf: refs #7283 #7283 i18n params 2024-10-24 14:59:14 +02:00
Javier Segarra 791af46202 Merge pull request 'Warmfix: CreateNewPostcodeForm sync fields and sort selects' (!867) from warmfix_createNewPostcodeForm into test
Reviewed-on: verdnatura/salix-front#867
Reviewed-by: Alex Moreno <alexm@verdnatura.es>
2024-10-24 12:49:05 +00:00
Javier Segarra 9a518ed990 Merge branch 'test' into warmfix_createNewPostcodeForm 2024-10-24 12:48:25 +00:00
Javier Segarra 26de0cf72f perf: remove limit 2024-10-24 12:39:49 +00:00
Jon Elias 7a4e43a025 Merge branch 'master' into Hotfix-RecalculatePriceReload 2024-10-24 12:13:48 +00:00
Carlos Satorres 8cee3ac713 Merge branch '7283-itemMigration' of https://gitea.verdnatura.es/verdnatura/salix-front into 7283-itemMigration 2024-10-24 14:08:14 +02:00
Carlos Satorres c2043902f8 fix: refs #7283 fix required 2024-10-24 14:08:11 +02:00
Javier Segarra 70dcadc57d Actualizar src/components/CreateNewPostcodeForm.vue 2024-10-24 11:52:13 +00:00
Carlos Satorres 92ff8c188e Merge branch 'dev' into 7283-itemMigration 2024-10-24 11:39:33 +00:00
Carlos Satorres 551b81e421 Merge branch '7283-itemMigration' of https://gitea.verdnatura.es/verdnatura/salix-front into 7283-itemMigration 2024-10-24 13:38:16 +02:00
Carlos Satorres 671d9fd6fb fix: refs #7283 itemtype fix 2024-10-24 13:38:13 +02:00
Carlos Andrés 64f36c7d4b feat: refs #8087 Traspasar redadas a travels 2024-10-24 12:35:11 +02:00
Javier Segarra 3f640c650b perf: refs #7283 #7283 handle i18n 2024-10-24 12:32:15 +02:00
Jon Elias c9e82f2caf refactor: deleted log 2024-10-24 12:04:54 +02:00
Jon Elias b02199eb07 fix: reload window when price is recalculated 2024-10-24 12:03:49 +02:00
Javier Segarra 2d8789312b test: refs #6943 #6943 remove skip tests 2024-10-24 11:34:55 +02:00
Javier Segarra 87d2e0a39b perf: refs #7283 #7283 handle composable i18n 2024-10-24 10:36:48 +02:00
Javier Segarra 45e6d2011f Merge branch '7283-itemMigration' of https://gitea.verdnatura.es/verdnatura/salix-front into 7283-itemMigration 2024-10-24 10:35:24 +02:00
Carlos Satorres 56ef811584 fix: refs #7283 order translation 2024-10-24 07:47:26 +02:00
Javier Segarra 1c8eabe293 perf: refs #7283 #7283 declare composable inst4ead code duplicated 2024-10-24 00:39:35 +02:00
Jon Elias 76ed5150a5 Merge branch 'dev' into Fix_OrderModuleProblems 2024-10-23 11:05:14 +00:00
Jon Elias 37b3affdbf refactor: revert catalog changes 2024-10-23 13:02:28 +02:00
Carlos Satorres d8b80cfa6d fix: refs #7283 fix pr 2024-10-23 12:30:04 +02:00
Jon Elias b69ef48a44 refactor: refs #7132 deleted pageTitles repeated 2024-10-23 12:21:34 +02:00
Jon Elias 03f2da8169 Merge branch 'dev' of https: refs #7132//gitea.verdnatura.es/verdnatura/salix-front into 7132-FixTranslations 2024-10-23 12:14:50 +02:00
Carlos Satorres d2da1e3544 Merge branch 'dev' of https: refs #7283//gitea.verdnatura.es/verdnatura/salix-front into 7283-itemMigration 2024-10-23 09:54:25 +02:00
Carlos Satorres b40af0ce7b fix: refs #7283 fix pr 2024-10-23 09:49:48 +02:00
Jon Elias 4bde0dffa7 fix: fixed item packaging type field showing repetitive values 2024-10-23 09:17:14 +02:00
Carlos Satorres 84dae53d66 Merge branch 'dev' of https: refs #7283//gitea.verdnatura.es/verdnatura/salix-front into 7283-itemMigration 2024-10-23 07:53:02 +02:00
Javier Segarra d25cdbf34e test: refs #6943 #6943 use command correctly 2024-10-22 12:43:58 +02:00
Javier Segarra 0ba577ad04 Merge branch 'dev' into 6943_customer_spec 2024-10-22 12:37:24 +02:00
Javier Segarra 49c0d64c07 fix: refs #7283 #7283 ItemSummary bugs 2024-10-22 12:13:43 +02:00
Javier Segarra fff3310658 fix: refs #7283 tooltips !Item 2024-10-22 12:09:32 +02:00
Javier Segarra d6b8d41b6c fix: refs #7283 #7283 ItemSummary bugs 2024-10-22 12:09:19 +02:00
Jon Elias 1346a2e7fd fix: tag chips 2024-10-22 12:05:44 +02:00
Javier Segarra f3a6209189 fix: refs #7283 #7283 bugs 2024-10-22 12:00:11 +02:00
Jon Elias 5b116a7301 Merge branch 'dev' of https://gitea.verdnatura.es/verdnatura/salix-front into Fix_OrderModuleProblems 2024-10-22 11:31:45 +02:00
Javier Segarra f4a7e20c57 test: refs #6943 #6943 add comands to solve tests 2024-10-21 14:31:31 +02:00
Javier Segarra 29a7f3b2fe fix: refs #7283 #7283 ItemDiary subToolbar 2024-10-21 13:48:43 +02:00
Jon Elias df3b4e7a18 refactor: refs #7132 deleted useless code 2024-10-21 13:07:07 +02:00
Jon Elias 1d41647022 Merge branch 'dev' of https: refs #7132//gitea.verdnatura.es/verdnatura/salix-front into 7132-FixTranslations 2024-10-21 12:57:32 +02:00
Jon Elias e5cd9d4b8f refactor: refs #7132 global translations files changed 2024-10-21 12:56:09 +02:00
Jon Elias fa0625aa86 Merge branch 'Fix_OrderModuleProblems' of https://gitea.verdnatura.es/verdnatura/salix-front into Fix_OrderModuleProblems 2024-10-18 14:12:25 +02:00
Jon Elias 11bf70d76c fix: category and tags filters 2024-10-18 14:12:23 +02:00
Jon Elias 89cb9aacec refactor: refs #7132 1st wave of changes in global translations files 2024-10-18 12:54:21 +02:00
Jon Elias 0e77d4b68f refactor: refs #7132 account's module translations 2024-10-18 10:40:40 +02:00
Jon Elias 8eef9c0009 refactor: refs #7132 customer's module translations 2024-10-18 09:21:18 +02:00
Jon Elias 58e88f605c refactor: refs #7132 delete duplicate translations' keys 2024-10-18 08:04:52 +02:00
Carlos Satorres 608e6c717a fix: refs #7310 clean warning 2024-10-17 09:34:48 +02:00
Carlos Satorres 16ef5d3722 fix: refs #7306 clean warning 2024-10-17 08:30:45 +02:00
Carlos Satorres f2cb0111eb fix: refs #7283 fix image 2024-10-16 14:45:33 +02:00
Carlos Satorres d1c61c5aed Merge branch 'dev' of https: refs #7283//gitea.verdnatura.es/verdnatura/salix-front into 7283-itemMigration 2024-10-16 14:01:01 +02:00
Guillermo Bonet 787ce2fc48 feat: refs #7006 itemTypeLog added 2024-10-14 09:33:00 +02:00
Javier Segarra 3d5d267345 revert: commit 2024-10-10 09:29:12 +02:00
Javier Segarra f16707756e fix: change type vnput 2024-10-10 09:29:04 +02:00
Jon Elias d721083795 fix: filter panel 2024-10-10 08:43:33 +02:00
Jon Elias 419d3d2d45 fix: refs #6896 fixed module problems 2024-10-10 07:20:33 +02:00
Carlos Satorres 55ddc8644f refs #7283 fix itemMigration list filters 2024-10-02 12:51:33 +02:00
Carlos Satorres 54015fb6bf refs #7283 fix itemMigration 2024-10-01 08:44:08 +02:00
Carlos Satorres 06a1b3b409 Merge branch 'dev' of https://gitea.verdnatura.es/verdnatura/salix-front into 7283-itemMigration 2024-10-01 06:30:19 +02:00
Carlos Satorres 716d018121 refs #72983 fix filters 2024-09-20 14:20:26 +02:00
Carlos Satorres fc26fa12be Merge branch 'dev' of https://gitea.verdnatura.es/verdnatura/salix-front into 7283-itemMigration 2024-09-18 13:34:14 +02:00
Carlos Satorres db783e1538 refs #7283 item Descriptor 2024-09-17 15:03:30 +02:00
Carlos Satorres ae97e32826 Merge branch 'dev' of https://gitea.verdnatura.es/verdnatura/salix-front into 7283-itemMigration 2024-09-17 14:55:48 +02:00
Carlos Satorres 8c91cb42f6 Merge branch 'dev' of https://gitea.verdnatura.es/verdnatura/salix-front into 7283-itemMigration 2024-09-17 11:11:57 +02:00
Carlos Satorres 1916c6e4bf refs #7283 itemFilters 2024-09-16 14:29:39 +02:00
Carlos Satorres 70759b8a4e Merge branch 'dev' of https://gitea.verdnatura.es/verdnatura/salix-front into 7283-itemMigration 2024-09-16 09:28:51 +02:00
Carlos Satorres 0fcc4fe232 Merge branch 'dev' of https://gitea.verdnatura.es/verdnatura/salix-front into 7283-itemMigration 2024-09-13 13:50:01 +02:00
Carlos Satorres 050d8ae208 refs #7283 fix items error get images 2024-09-12 11:43:37 +02:00
Carlos Satorres 68a2ac385f refs #7283 fix items images 2024-09-12 11:36:02 +02:00
Carlos Satorres 039a8d1d02 refs #7283 fix items 2024-09-12 09:32:41 +02:00
Carlos Satorres b66e66eb0a Merge branch 'dev' of https://gitea.verdnatura.es/verdnatura/salix-front into 7283-itemMigration 2024-09-12 07:44:35 +02:00
Carlos Satorres 04c8481b51 refs #7283 fix itemFixed 2024-09-12 07:43:12 +02:00
Carlos Satorres 04070a5a85 Merge branch 'dev' of https://gitea.verdnatura.es/verdnatura/salix-front into 7283-itemMigration 2024-09-12 07:42:55 +02:00
Carlos Satorres dc39dd5a76 Merge branch 'dev' of https://gitea.verdnatura.es/verdnatura/salix-front into 7283-itemMigration 2024-09-06 13:26:34 +02:00
Carlos Satorres dfb098d440 Merge branch 'dev' of https://gitea.verdnatura.es/verdnatura/salix-front into 7283-itemMigration 2024-09-02 12:32:47 +02:00
Carlos Satorres 488dc74c1f refs #7283 itemRequest fix reload 2024-09-02 12:14:23 +02:00
Carlos Satorres 3bf3e8eeaa refs #7283 itemRequest fix deny 2024-09-02 11:08:50 +02:00
Carlos Satorres 388036a2eb refs #7283 itemRequest fix 2024-09-02 09:19:49 +02:00
Carlos Satorres 268a27878c Merge branch 'dev' of https://gitea.verdnatura.es/verdnatura/salix-front into 7283-itemMigration 2024-08-30 13:23:42 +02:00
Carlos Satorres a2254d145e Merge branch 'dev' of https://gitea.verdnatura.es/verdnatura/salix-front into 7283-itemMigration 2024-08-29 15:40:43 +02:00
Carlos Satorres e4aec1773b refs #7283 itemRequest fix deny 2024-08-29 12:38:57 +02:00
Carlos Satorres cd1b5f56f7 refs #7283 column-action 2024-08-28 11:35:57 +02:00
Carlos Satorres 98be567ead Merge branch 'dev' of https://gitea.verdnatura.es/verdnatura/salix-front into 7283-itemMigration 2024-08-28 10:28:58 +02:00
Carlos Satorres 6de59c6419 refs #7283 itemRequestFixed 2024-08-27 14:39:21 +02:00
Carlos Satorres 477984076b Merge branch 'dev' of https://gitea.verdnatura.es/verdnatura/salix-front into 7283-itemMigration 2024-08-27 10:55:17 +02:00
Carlos Satorres 2ef56f9f97 refs #7283 fixedPrice 2024-08-27 08:00:07 +02:00
Javier Segarra bae0b4de35 fix: itemBotanical 2024-08-22 10:38:15 +02:00
Jorge Penadés 12a5d6cec0 fix: refs #7283 css 2024-08-19 17:05:00 +02:00
Jorge Penadés f34f3a78cb Merge branch 'dev' of https://gitea.verdnatura.es/verdnatura/salix-front into 7283-itemMigration 2024-08-19 16:39:39 +02:00
Carlos Satorres 1df089cef7 refs #7283 fix itemFixedPrice 2024-08-14 15:50:13 +02:00
Carlos Satorres 589ee629cf refs #7283 fix conflicts 2024-08-13 12:45:30 +02:00
Carlos Satorres ec9c2fb3ee Merge branch 'dev' of https://gitea.verdnatura.es/verdnatura/salix-front into 7283-itemMigration 2024-08-12 14:13:26 +02:00
Carlos Satorres 6ca8ede946 refs #7283 item request 2024-08-07 09:53:42 +02:00
Carlos Satorres fe78de0c47 refs #7283 fixedPrices 2024-08-05 11:49:06 +02:00
Carlos Satorres b668d07e2d refs #7283 fetchedTags 2024-08-01 13:20:33 +02:00
Carlos Satorres 2604441c13 Merge branch 'dev' of https://gitea.verdnatura.es/verdnatura/salix-front into 7283-itemMigration 2024-08-01 10:19:26 +02:00
Carlos Satorres f678c63043 refs #7283 request 2024-07-22 13:35:41 +02:00
Carlos Satorres 4d394a98a4 refs #7283 fix yml list basicData 2024-07-22 08:24:59 +02:00
Carlos Satorres e647cbcf36 Merge branch 'dev' of https://gitea.verdnatura.es/verdnatura/salix-front into 7283-itemMigration 2024-07-22 06:32:11 +02:00
Carlos Satorres 86ae827fda refs #7283 clone 2024-07-16 13:48:32 +02:00
Carlos Satorres f29d873ed4 refs #7283 fix request 2024-07-16 12:15:39 +02:00
Carlos Satorres 339f6e810b refs #7283 fix descriptorproxy 2024-07-16 10:34:00 +02:00
Carlos Satorres cce1d891fb refs #7283 fix viewSummary 2024-07-16 08:48:50 +02:00
Carlos Satorres 85b030c7bc refs #7283 view summary 2024-07-16 08:31:04 +02:00
Carlos Satorres b7ba8eec3d refs #7283 fix searchbar 2024-07-16 08:24:57 +02:00
Carlos Satorres daf99f4730 refs #7283 itemRequestList 2024-07-15 15:00:43 +02:00
Carlos Satorres afbcd2ebda refs #7283 item filters 2024-07-15 14:31:33 +02:00
Carlos Satorres 16b5b5d9a1 refs #7283 filter 2024-07-15 13:48:59 +02:00
Carlos Satorres 168201c755 refs #7283 itemList table 2024-07-15 12:25:54 +02:00
289 changed files with 4664 additions and 4267 deletions

View File

@ -11,12 +11,22 @@ module.exports = defineConfig({
video: false,
specPattern: 'test/cypress/integration/**/*.spec.js',
experimentalRunAllSpecs: true,
watchForFileChanges: true,
reporter: 'cypress-mochawesome-reporter',
reporterOptions: {
charts: true,
reportPageTitle: 'Cypress Inline Reporter',
embeddedScreenshots: true,
reportDir: 'test/cypress/reports',
inlineAssets: true,
},
component: {
componentFolder: 'src',
testFiles: '**/*.spec.js',
supportFile: 'test/cypress/support/unit.js',
},
setupNodeEvents(on, config) {
require('cypress-mochawesome-reporter/plugin')(on);
// implement node event listeners here
},
},

View File

@ -7,10 +7,11 @@
"private": true,
"packageManager": "pnpm@8.15.1",
"scripts": {
"resetDatabase": "cd ../salix && gulp docker",
"lint": "eslint --ext .js,.vue ./",
"format": "prettier --write \"**/*.{js,vue,scss,html,md,json}\" --ignore-path .gitignore",
"test:e2e": "cypress open",
"test:e2e:ci": "cd ../salix && gulp docker && cd ../salix-front && cypress run",
"test:e2e:ci": "npm run resetDatabase && cd ../salix-front && cypress run",
"test": "echo \"See package.json => scripts for available tests.\" && exit 0",
"test:unit": "vitest",
"test:unit:ci": "vitest run",
@ -42,6 +43,7 @@
"@vue/test-utils": "^2.4.4",
"autoprefixer": "^10.4.14",
"cypress": "^13.6.6",
"cypress-mochawesome-reporter": "^3.8.2",
"eslint": "^8.41.0",
"eslint-config-prettier": "^8.8.0",
"eslint-plugin-cypress": "^2.13.3",

View File

@ -70,6 +70,9 @@ devDependencies:
cypress:
specifier: ^13.6.6
version: 13.6.6
cypress-mochawesome-reporter:
specifier: ^3.8.2
version: 3.8.2(cypress@13.6.6)(mocha@10.7.3)
eslint:
specifier: ^8.41.0
version: 8.56.0
@ -829,8 +832,8 @@ packages:
vue-i18n:
optional: true
dependencies:
'@intlify/message-compiler': 10.0.0-beta.5
'@intlify/shared': 10.0.0-beta.5
'@intlify/message-compiler': 10.0.0
'@intlify/shared': 10.0.0
jsonc-eslint-parser: 1.4.1
source-map: 0.6.1
vue-i18n: 9.9.1(vue@3.4.19)
@ -844,11 +847,11 @@ packages:
'@intlify/message-compiler': 9.9.1
'@intlify/shared': 9.9.1
/@intlify/message-compiler@10.0.0-beta.5:
resolution: {integrity: sha512-hLLchnM1dmtSEruerkzvU9vePsLqBXz3RU85SCx/Vd12fFQiymP+/5Rn9MJ8MyfLmIOLDEx4PRh+/GkIQP6oog==}
/@intlify/message-compiler@10.0.0:
resolution: {integrity: sha512-OcaWc63NC/9p1cMdgoNKBj4d61BH8sUW1Hfs6YijTd9656ZR4rNqXAlRnBrfS5ABq0vjQjpa8VnyvH9hK49yBw==}
engines: {node: '>= 16'}
dependencies:
'@intlify/shared': 10.0.0-beta.5
'@intlify/shared': 10.0.0
source-map-js: 1.0.2
dev: true
@ -859,8 +862,8 @@ packages:
'@intlify/shared': 9.9.1
source-map-js: 1.0.2
/@intlify/shared@10.0.0-beta.5:
resolution: {integrity: sha512-g9bq5Y1bOcC9qxtNk4UWtF3sXm6Wh0fGISb7vD5aLyF7yQv7ZFjxQjJzBP2GqG/9+PAGYutqjP1GGadNqFtyAQ==}
/@intlify/shared@10.0.0:
resolution: {integrity: sha512-6ngLfI7DOTew2dcF9WMJx+NnMWghMBhIiHbGg+wRvngpzD5KZJZiJVuzMsUQE1a5YebEmtpTEfUrDp/NqVGdiw==}
engines: {node: '>= 16'}
dev: true
@ -884,7 +887,7 @@ packages:
optional: true
dependencies:
'@intlify/bundle-utils': 4.0.0(vue-i18n@9.9.1)
'@intlify/shared': 10.0.0-beta.5
'@intlify/shared': 10.0.0
'@rollup/pluginutils': 4.2.1
'@vue/compiler-sfc': 3.4.19
debug: 4.3.4(supports-color@8.1.1)
@ -1999,6 +2002,10 @@ packages:
dependencies:
fill-range: 7.0.1
/browser-stdout@1.3.1:
resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==}
dev: true
/browserslist@4.23.0:
resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==}
engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
@ -2106,6 +2113,16 @@ packages:
upper-case: 1.1.3
dev: true
/camelcase@5.3.1:
resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==}
engines: {node: '>=6'}
dev: true
/camelcase@6.3.0:
resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==}
engines: {node: '>=10'}
dev: true
/camelcase@7.0.1:
resolution: {integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==}
engines: {node: '>=14.16'}
@ -2255,6 +2272,22 @@ packages:
engines: {node: '>= 10'}
dev: true
/cliui@6.0.0:
resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==}
dependencies:
string-width: 4.2.3
strip-ansi: 6.0.1
wrap-ansi: 6.2.0
dev: true
/cliui@7.0.4:
resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==}
dependencies:
string-width: 4.2.3
strip-ansi: 6.0.1
wrap-ansi: 7.0.0
dev: true
/cliui@8.0.1:
resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==}
engines: {node: '>=12'}
@ -2558,6 +2591,23 @@ packages:
/csstype@3.1.3:
resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==}
/cypress-mochawesome-reporter@3.8.2(cypress@13.6.6)(mocha@10.7.3):
resolution: {integrity: sha512-oJZkNzhNmN9ZD+LmZyFuPb8aWaIijyHyqYh52YOBvR6B6ckfJNCHP3A98a+/nG0H4t46CKTNwo+wNpMa4d2kjA==}
engines: {node: '>=14'}
hasBin: true
peerDependencies:
cypress: '>=6.2.0'
dependencies:
commander: 10.0.1
cypress: 13.6.6
fs-extra: 10.1.0
mochawesome: 7.1.3(mocha@10.7.3)
mochawesome-merge: 4.3.0
mochawesome-report-generator: 6.2.0
transitivePeerDependencies:
- mocha
dev: true
/cypress@13.6.6:
resolution: {integrity: sha512-S+2S9S94611hXimH9a3EAYt81QM913ZVA03pUmGDfLTFa5gyp85NJ8dJGSlEAEmyRsYkioS1TtnWtbv/Fzt11A==}
engines: {node: ^16.0.0 || ^18.0.0 || >=20.0.0}
@ -2627,6 +2677,10 @@ packages:
time-zone: 1.0.0
dev: true
/dateformat@4.6.3:
resolution: {integrity: sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==}
dev: true
/dayjs@1.11.10:
resolution: {integrity: sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==}
dev: true
@ -2676,6 +2730,29 @@ packages:
ms: 2.1.2
supports-color: 8.1.1
/debug@4.3.7(supports-color@8.1.1):
resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==}
engines: {node: '>=6.0'}
peerDependencies:
supports-color: '*'
peerDependenciesMeta:
supports-color:
optional: true
dependencies:
ms: 2.1.3
supports-color: 8.1.1
dev: true
/decamelize@1.2.0:
resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==}
engines: {node: '>=0.10.0'}
dev: true
/decamelize@4.0.0:
resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==}
engines: {node: '>=10'}
dev: true
/decompress-response@6.0.0:
resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==}
engines: {node: '>=10'}
@ -2758,6 +2835,11 @@ packages:
resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==}
engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16}
/diff@5.2.0:
resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==}
engines: {node: '>=0.3.1'}
dev: true
/doctrine@3.0.0:
resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==}
engines: {node: '>=6.0.0'}
@ -3550,6 +3632,14 @@ packages:
transitivePeerDependencies:
- supports-color
/find-up@4.1.0:
resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==}
engines: {node: '>=8'}
dependencies:
locate-path: 5.0.0
path-exists: 4.0.0
dev: true
/find-up@5.0.0:
resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==}
engines: {node: '>=10'}
@ -3646,6 +3736,15 @@ packages:
resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==}
dev: true
/fs-extra@10.1.0:
resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==}
engines: {node: '>=12'}
dependencies:
graceful-fs: 4.2.11
jsonfile: 6.1.0
universalify: 2.0.1
dev: true
/fs-extra@11.2.0:
resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==}
engines: {node: '>=14.14'}
@ -3654,6 +3753,15 @@ packages:
jsonfile: 6.1.0
universalify: 2.0.1
/fs-extra@7.0.1:
resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==}
engines: {node: '>=6 <7 || >=8'}
dependencies:
graceful-fs: 4.2.11
jsonfile: 4.0.0
universalify: 0.1.2
dev: true
/fs-extra@9.1.0:
resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==}
engines: {node: '>=10'}
@ -3675,6 +3783,10 @@ packages:
dev: true
optional: true
/fsu@1.1.1:
resolution: {integrity: sha512-xQVsnjJ/5pQtcKh+KjUoZGzVWn4uNkchxTF6Lwjr4Gf7nQr8fmUfhKJ62zE77+xQg9xnxi5KUps7XGs+VC986A==}
dev: true
/function-bind@1.1.2:
resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==}
@ -3775,6 +3887,18 @@ packages:
once: 1.4.0
path-is-absolute: 1.0.1
/glob@8.1.0:
resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==}
engines: {node: '>=12'}
deprecated: Glob versions prior to v9 are no longer supported
dependencies:
fs.realpath: 1.0.0
inflight: 1.0.6
inherits: 2.0.4
minimatch: 5.1.6
once: 1.4.0
dev: true
/global-directory@4.0.1:
resolution: {integrity: sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==}
engines: {node: '>=18'}
@ -4189,6 +4313,11 @@ packages:
resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==}
engines: {node: '>=8'}
/is-plain-obj@2.1.0:
resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==}
engines: {node: '>=8'}
dev: true
/is-plain-obj@3.0.0:
resolution: {integrity: sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==}
engines: {node: '>=10'}
@ -4361,6 +4490,12 @@ packages:
resolution: {integrity: sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==}
dev: true
/jsonfile@4.0.0:
resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==}
optionalDependencies:
graceful-fs: 4.2.11
dev: true
/jsonfile@6.1.0:
resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==}
dependencies:
@ -4452,6 +4587,13 @@ packages:
engines: {node: '>=14'}
dev: true
/locate-path@5.0.0:
resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==}
engines: {node: '>=8'}
dependencies:
p-locate: 4.1.0
dev: true
/locate-path@6.0.0:
resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==}
engines: {node: '>=10'}
@ -4486,10 +4628,26 @@ packages:
resolution: {integrity: sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==}
dev: true
/lodash.isempty@4.4.0:
resolution: {integrity: sha512-oKMuF3xEeqDltrGMfDxAPGIVMSSRv8tbRSODbrs4KGsRRLEhrW8N8Rd4DRgB2+621hY8A8XwwrTVhXWpxFvMzg==}
dev: true
/lodash.isfunction@3.0.9:
resolution: {integrity: sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==}
dev: true
/lodash.isobject@3.0.2:
resolution: {integrity: sha512-3/Qptq2vr7WeJbB4KHUSKlq8Pl7ASXi3UG6CMbBm8WRtXi8+GHm7mKaU3urfpSEzWe2wCIChs6/sdocUsTKJiA==}
dev: true
/lodash.isplainobject@4.0.6:
resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==}
dev: true
/lodash.isstring@4.0.1:
resolution: {integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==}
dev: true
/lodash.kebabcase@4.1.1:
resolution: {integrity: sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==}
dev: true
@ -4552,6 +4710,13 @@ packages:
wrap-ansi: 6.2.0
dev: true
/loose-envify@1.4.0:
resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==}
hasBin: true
dependencies:
js-tokens: 4.0.0
dev: true
/loupe@2.3.7:
resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==}
dependencies:
@ -4722,6 +4887,79 @@ packages:
ufo: 1.4.0
dev: true
/mocha@10.7.3:
resolution: {integrity: sha512-uQWxAu44wwiACGqjbPYmjo7Lg8sFrS3dQe7PP2FQI+woptP4vZXSMcfMyFL/e1yFEeEpV4RtyTpZROOKmxis+A==}
engines: {node: '>= 14.0.0'}
hasBin: true
dependencies:
ansi-colors: 4.1.3
browser-stdout: 1.3.1
chokidar: 3.6.0
debug: 4.3.7(supports-color@8.1.1)
diff: 5.2.0
escape-string-regexp: 4.0.0
find-up: 5.0.0
glob: 8.1.0
he: 1.2.0
js-yaml: 4.1.0
log-symbols: 4.1.0
minimatch: 5.1.6
ms: 2.1.3
serialize-javascript: 6.0.2
strip-json-comments: 3.1.1
supports-color: 8.1.1
workerpool: 6.5.1
yargs: 16.2.0
yargs-parser: 20.2.9
yargs-unparser: 2.0.0
dev: true
/mochawesome-merge@4.3.0:
resolution: {integrity: sha512-1roR6g+VUlfdaRmL8dCiVpKiaUhbPVm1ZQYUM6zHX46mWk+tpsKVZR6ba98k2zc8nlPvYd71yn5gyH970pKBSw==}
engines: {node: '>=10.0.0'}
hasBin: true
dependencies:
fs-extra: 7.0.1
glob: 7.2.3
yargs: 15.4.1
dev: true
/mochawesome-report-generator@6.2.0:
resolution: {integrity: sha512-Ghw8JhQFizF0Vjbtp9B0i//+BOkV5OWcQCPpbO0NGOoxV33o+gKDYU0Pr2pGxkIHnqZ+g5mYiXF7GMNgAcDpSg==}
hasBin: true
dependencies:
chalk: 4.1.2
dateformat: 4.6.3
escape-html: 1.0.3
fs-extra: 10.1.0
fsu: 1.1.1
lodash.isfunction: 3.0.9
opener: 1.5.2
prop-types: 15.8.1
tcomb: 3.2.29
tcomb-validation: 3.4.1
validator: 13.11.0
yargs: 17.7.2
dev: true
/mochawesome@7.1.3(mocha@10.7.3):
resolution: {integrity: sha512-Vkb3jR5GZ1cXohMQQ73H3cZz7RoxGjjUo0G5hu0jLaW+0FdUxUwg3Cj29bqQdh0rFcnyV06pWmqmi5eBPnEuNQ==}
peerDependencies:
mocha: '>=7'
dependencies:
chalk: 4.1.2
diff: 5.2.0
json-stringify-safe: 5.0.1
lodash.isempty: 4.4.0
lodash.isfunction: 3.0.9
lodash.isobject: 3.0.2
lodash.isstring: 4.0.1
mocha: 10.7.3
mochawesome-report-generator: 6.2.0
strip-ansi: 6.0.1
uuid: 8.3.2
dev: true
/ms@2.0.0:
resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==}
@ -4870,6 +5108,11 @@ packages:
is-wsl: 2.2.0
dev: false
/opener@1.5.2:
resolution: {integrity: sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==}
hasBin: true
dev: true
/optionator@0.9.3:
resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==}
engines: {node: '>= 0.8.0'}
@ -4915,6 +5158,13 @@ packages:
engines: {node: '>=12.20'}
dev: false
/p-limit@2.3.0:
resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==}
engines: {node: '>=6'}
dependencies:
p-try: 2.2.0
dev: true
/p-limit@3.1.0:
resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==}
engines: {node: '>=10'}
@ -4929,6 +5179,13 @@ packages:
yocto-queue: 1.0.0
dev: true
/p-locate@4.1.0:
resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==}
engines: {node: '>=8'}
dependencies:
p-limit: 2.3.0
dev: true
/p-locate@5.0.0:
resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==}
engines: {node: '>=10'}
@ -4950,6 +5207,11 @@ packages:
aggregate-error: 3.1.0
dev: true
/p-try@2.2.0:
resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==}
engines: {node: '>=6'}
dev: true
/package-json@8.1.1:
resolution: {integrity: sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA==}
engines: {node: '>=14.16'}
@ -5139,6 +5401,14 @@ packages:
engines: {node: '>=0.4.0'}
dev: false
/prop-types@15.8.1:
resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==}
dependencies:
loose-envify: 1.4.0
object-assign: 4.1.1
react-is: 16.13.1
dev: true
/proto-list@1.2.4:
resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==}
@ -5242,6 +5512,10 @@ packages:
strip-json-comments: 2.0.1
dev: false
/react-is@16.13.1:
resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==}
dev: true
/react-is@17.0.2:
resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==}
dev: true
@ -5328,6 +5602,10 @@ packages:
engines: {node: '>=0.10.0'}
dev: true
/require-main-filename@2.0.0:
resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==}
dev: true
/requires-port@1.0.0:
resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==}
@ -5573,6 +5851,10 @@ packages:
transitivePeerDependencies:
- supports-color
/set-blocking@2.0.0:
resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==}
dev: true
/set-function-length@1.2.1:
resolution: {integrity: sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==}
engines: {node: '>= 0.4'}
@ -5829,6 +6111,16 @@ packages:
readable-stream: 3.6.2
dev: true
/tcomb-validation@3.4.1:
resolution: {integrity: sha512-urVVMQOma4RXwiVCa2nM2eqrAomHROHvWPuj6UkDGz/eb5kcy0x6P0dVt6kzpUZtYMNoAqJLWmz1BPtxrtjtrA==}
dependencies:
tcomb: 3.2.29
dev: true
/tcomb@3.2.29:
resolution: {integrity: sha512-di2Hd1DB2Zfw6StGv861JoAF5h/uQVu/QJp2g8KVbtfKnoHdBQl5M32YWq6mnSYBQ1vFFrns5B1haWJL7rKaOQ==}
dev: true
/text-extensions@2.4.0:
resolution: {integrity: sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==}
engines: {node: '>=8'}
@ -6048,6 +6340,11 @@ packages:
crypto-random-string: 4.0.0
dev: false
/universalify@0.1.2:
resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==}
engines: {node: '>= 4.0.0'}
dev: true
/universalify@0.2.0:
resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==}
engines: {node: '>= 4.0.0'}
@ -6137,7 +6434,6 @@ packages:
/validator@13.11.0:
resolution: {integrity: sha512-Ii+sehpSfZy+At5nPdnyMhx78fEoPDkR2XW/zimHEL3MyGJQOCQ7WeP20jPYRz7ZCpcKLB21NxuXHF3bxjStBQ==}
engines: {node: '>= 0.10'}
dev: false
/vary@1.1.2:
resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==}
@ -6484,6 +6780,10 @@ packages:
engines: {node: '>=12'}
dev: true
/which-module@2.0.1:
resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==}
dev: true
/which@2.0.2:
resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
engines: {node: '>= 8'}
@ -6511,6 +6811,10 @@ packages:
resolution: {integrity: sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==}
dev: true
/workerpool@6.5.1:
resolution: {integrity: sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==}
dev: true
/wrap-ansi@6.2.0:
resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==}
engines: {node: '>=8'}
@ -6559,6 +6863,10 @@ packages:
engines: {node: '>=12'}
dev: true
/y18n@4.0.3:
resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==}
dev: true
/y18n@5.0.8:
resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==}
engines: {node: '>=10'}
@ -6584,11 +6892,64 @@ packages:
engines: {node: '>= 6'}
dev: true
/yargs-parser@18.1.3:
resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==}
engines: {node: '>=6'}
dependencies:
camelcase: 5.3.1
decamelize: 1.2.0
dev: true
/yargs-parser@20.2.9:
resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==}
engines: {node: '>=10'}
dev: true
/yargs-parser@21.1.1:
resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==}
engines: {node: '>=12'}
dev: true
/yargs-unparser@2.0.0:
resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==}
engines: {node: '>=10'}
dependencies:
camelcase: 6.3.0
decamelize: 4.0.0
flat: 5.0.2
is-plain-obj: 2.1.0
dev: true
/yargs@15.4.1:
resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==}
engines: {node: '>=8'}
dependencies:
cliui: 6.0.0
decamelize: 1.2.0
find-up: 4.1.0
get-caller-file: 2.0.5
require-directory: 2.1.1
require-main-filename: 2.0.0
set-blocking: 2.0.0
string-width: 4.2.3
which-module: 2.0.1
y18n: 4.0.3
yargs-parser: 18.1.3
dev: true
/yargs@16.2.0:
resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==}
engines: {node: '>=10'}
dependencies:
cliui: 7.0.4
escalade: 3.1.2
get-caller-file: 2.0.5
require-directory: 2.1.1
string-width: 4.2.3
y18n: 5.0.8
yargs-parser: 20.2.9
dev: true
/yargs@17.7.2:
resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==}
engines: {node: '>=12'}

View File

@ -1,38 +0,0 @@
import routes from 'src/router/modules';
import { useRouter } from 'vue-router';
let isNotified = false;
export default {
created: function () {
const router = useRouter();
const keyBindingMap = routes
.filter((route) => route.meta.keyBinding)
.reduce((map, route) => {
map['Key' + route.meta.keyBinding.toUpperCase()] = route.path;
return map;
}, {});
const handleKeyDown = (event) => {
const { ctrlKey, altKey, code } = event;
if (ctrlKey && altKey && keyBindingMap[code] && !isNotified) {
event.preventDefault();
router.push(keyBindingMap[code]);
isNotified = true;
}
};
const handleKeyUp = (event) => {
const { ctrlKey, altKey } = event;
// Resetea la bandera cuando se sueltan las teclas ctrl o alt
if (!ctrlKey || !altKey) {
isNotified = false;
}
};
window.addEventListener('keydown', handleKeyDown);
window.addEventListener('keyup', handleKeyUp);
},
};

View File

@ -1,6 +1,5 @@
import { boot } from 'quasar/wrappers';
import qFormMixin from './qformMixin';
import mainShortcutMixin from './mainShortcutMixin';
import keyShortcut from './keyShortcut';
import useNotify from 'src/composables/useNotify.js';
import { CanceledError } from 'axios';
@ -9,7 +8,6 @@ const { notify } = useNotify();
export default boot(({ app }) => {
app.mixin(qFormMixin);
app.mixin(mainShortcutMixin);
app.directive('shortcut', keyShortcut);
app.config.errorHandler = (error) => {
let message;

View File

@ -108,11 +108,11 @@ watch(
watch(
() => postcodeFormData.provinceFk,
async (newProvinceFk) => {
async (newProvinceFk, oldValueFk) => {
if (Array.isArray(newProvinceFk)) {
newProvinceFk = newProvinceFk[0];
}
if (newProvinceFk !== postcodeFormData.provinceFk) {
if (newProvinceFk !== oldValueFk) {
await townsFetchDataRef.value.fetch({
where: { provinceFk: newProvinceFk },
});
@ -147,13 +147,7 @@ async function handleCountries(data) {
auto-load
url="Towns/location"
/>
<FetchData
@on-fetch="handleCountries"
:sort-by="['name ASC']"
:limit="30"
auto-load
url="Countries"
/>
<FormModelPopup
url-create="postcodes"
model="postcode"
@ -219,8 +213,10 @@ async function handleCountries(data) {
@on-province-created="onProvinceCreated"
/>
<VnSelect
url="Countries"
:sort-by="['name ASC']"
:label="t('Country')"
:options="countriesOptions"
@update:options="handleCountries"
hide-selected
option-label="name"
option-value="id"

View File

@ -38,7 +38,7 @@ const onDataSaved = (dataSaved) => {
@on-fetch="(data) => (warehousesOptions = data)"
auto-load
url="Warehouses"
:filter="{ fields: ['id', 'name'], order: 'name ASC', limit: 30 }"
:filter="{ fields: ['id', 'name'], order: 'name ASC' }"
/>
<FetchData
@on-fetch="(data) => (temperaturesOptions = data)"

View File

@ -77,7 +77,7 @@ const isLoading = ref(false);
const hasChanges = ref(false);
const originalData = ref();
const vnPaginateRef = ref();
const formData = ref();
const formData = ref([]);
const saveButtonRef = ref(null);
const watchChanges = ref();
const formUrl = computed(() => $props.url);

View File

@ -50,25 +50,25 @@ const loading = ref(false);
const tableColumns = computed(() => [
{
label: t('entry.buys.id'),
label: t('globals.id'),
name: 'id',
field: 'id',
align: 'left',
},
{
label: t('entry.buys.name'),
label: t('globals.name'),
name: 'name',
field: 'name',
align: 'left',
},
{
label: t('entry.buys.size'),
label: t('globals.size'),
name: 'size',
field: 'size',
align: 'left',
},
{
label: t('entry.buys.producer'),
label: t('globals.producer'),
name: 'producerName',
field: 'producer',
align: 'left',
@ -152,10 +152,10 @@ const selectItem = ({ id }) => {
</span>
<h1 class="title">{{ t('Filter item') }}</h1>
<VnRow>
<VnInput :label="t('entry.buys.name')" v-model="itemFilterParams.name" />
<VnInput :label="t('globals.name')" v-model="itemFilterParams.name" />
<VnInput :label="t('entry.buys.size')" v-model="itemFilterParams.size" />
<VnSelect
:label="t('entry.buys.producer')"
:label="t('globals.producer')"
:options="producersOptions"
hide-selected
option-label="name"
@ -163,7 +163,7 @@ const selectItem = ({ id }) => {
v-model="itemFilterParams.producerFk"
/>
<VnSelect
:label="t('entry.buys.type')"
:label="t('globals.type')"
:options="ItemTypesOptions"
hide-selected
option-label="name"

View File

@ -48,13 +48,13 @@ const loading = ref(false);
const tableColumns = computed(() => [
{
label: t('entry.basicData.id'),
label: t('globals.id'),
name: 'id',
field: 'id',
align: 'left',
},
{
label: t('entry.basicData.warehouseOut'),
label: t('globals.warehouseOut'),
name: 'warehouseOutFk',
field: 'warehouseOutFk',
align: 'left',
@ -62,7 +62,7 @@ const tableColumns = computed(() => [
warehousesOptions.value.find((warehouse) => warehouse.id === val).name,
},
{
label: t('entry.basicData.warehouseIn'),
label: t('globals.warehouseIn'),
name: 'warehouseInFk',
field: 'warehouseInFk',
align: 'left',
@ -70,14 +70,14 @@ const tableColumns = computed(() => [
warehousesOptions.value.find((warehouse) => warehouse.id === val).name,
},
{
label: t('entry.basicData.shipped'),
label: t('globals.shipped'),
name: 'shipped',
field: 'shipped',
align: 'left',
format: (val) => toDate(val),
},
{
label: t('entry.basicData.landed'),
label: t('globals.landed'),
name: 'landed',
field: 'landed',
align: 'left',
@ -146,7 +146,7 @@ const selectTravel = ({ id }) => {
<h1 class="title">{{ t('Filter travels') }}</h1>
<VnRow>
<VnSelect
:label="t('entry.basicData.agency')"
:label="t('globals.agency')"
:options="agenciesOptions"
hide-selected
option-label="name"
@ -154,7 +154,7 @@ const selectTravel = ({ id }) => {
v-model="travelFilterParams.agencyModeFk"
/>
<VnSelect
:label="t('entry.basicData.warehouseOut')"
:label="t('globals.warehouseOut')"
:options="warehousesOptions"
hide-selected
option-label="name"
@ -162,7 +162,7 @@ const selectTravel = ({ id }) => {
v-model="travelFilterParams.warehouseOutFk"
/>
<VnSelect
:label="t('entry.basicData.warehouseIn')"
:label="t('globals.warehouseIn')"
:options="warehousesOptions"
hide-selected
option-label="name"
@ -170,11 +170,11 @@ const selectTravel = ({ id }) => {
v-model="travelFilterParams.warehouseInFk"
/>
<VnInputDate
:label="t('entry.basicData.shipped')"
:label="t('globals.shipped')"
v-model="travelFilterParams.shipped"
/>
<VnInputDate
:label="t('entry.basicData.landed')"
:label="t('globals.landed')"
v-model="travelFilterParams.landed"
/>
</VnRow>

View File

@ -272,6 +272,7 @@ defineExpose({
hasChanges,
reset,
fetch,
formData,
});
</script>
<template>

View File

@ -248,7 +248,7 @@ const removeTag = (index, params, search) => {
>
<QItemSection class="col">
<VnSelect
:label="t('components.itemsFilterPanel.tag')"
:label="t('globals.tag')"
v-model="value.selectedTag"
:options="tagOptions"
option-label="name"

View File

@ -1,6 +1,6 @@
<script setup>
import axios from 'axios';
import { onMounted, watch, ref, reactive } from 'vue';
import { onMounted, watch, ref, reactive, computed } from 'vue';
import { useI18n } from 'vue-i18n';
import { QSeparator, useQuasar } from 'quasar';
import { useRoute } from 'vue-router';
@ -9,6 +9,7 @@ import { toLowerCamel } from 'src/filters';
import routes from 'src/router/modules';
import LeftMenuItem from './LeftMenuItem.vue';
import LeftMenuItemGroup from './LeftMenuItemGroup.vue';
import VnInput from './common/VnInput.vue';
const { t } = useI18n();
const route = useRoute();
@ -21,17 +22,52 @@ const props = defineProps({
default: 'main',
},
});
const initialized = ref(false);
const items = ref([]);
const expansionItemElements = reactive({});
const pinnedModules = computed(() => {
const map = new Map();
items.value.forEach((item) => item.isPinned && map.set(item.name, item));
return map;
});
const search = ref(null);
const filteredItems = computed(() => {
if (!search.value) return items.value;
const normalizedSearch = normalize(search.value);
return items.value.filter((item) => {
const locale = normalize(t(item.title));
return locale.includes(normalizedSearch);
});
});
const filteredPinnedModules = computed(() => {
if (!search.value) return pinnedModules.value;
const normalizedSearch = search.value
.normalize('NFD')
.replace(/[\u0300-\u036f]/g, '')
.toLowerCase();
const map = new Map();
for (const [key, pinnedModule] of pinnedModules.value) {
const locale = t(pinnedModule.title)
.normalize('NFD')
.replace(/[\u0300-\u036f]/g, '')
.toLowerCase();
if (locale.includes(normalizedSearch)) map.set(key, pinnedModule);
}
return map;
});
onMounted(async () => {
await navigation.fetchPinned();
getRoutes();
initialized.value = true;
});
watch(
() => route.matched,
() => {
if (!initialized.value) return;
items.value = [];
getRoutes();
},
@ -66,8 +102,6 @@ function addChildren(module, route, parent) {
}
}
const items = ref([]);
function getRoutes() {
if (props.source === 'main') {
const modules = Object.assign([], navigation.getModules().value);
@ -123,21 +157,57 @@ async function togglePinned(item, event) {
const handleItemExpansion = (itemName) => {
expansionItemElements[itemName].scrollToLastElement();
};
function normalize(text) {
return text
.normalize('NFD')
.replace(/[\u0300-\u036f]/g, '')
.toLowerCase();
}
</script>
<template>
<QList padding class="column-max-width">
<template v-if="$props.source === 'main'">
<template v-if="$route?.matched[1]?.name === 'Dashboard'">
<QItem class="header">
<QItemSection avatar>
<QIcon name="view_module" />
</QItemSection>
<QItemSection> {{ t('globals.modules') }}</QItemSection>
<QItem class="q-pb-md">
<VnInput
v-model="search"
:label="t('Search modules')"
class="full-width"
filled
dense
/>
</QItem>
<QSeparator />
<template v-for="item in items" :key="item.name">
<template v-if="item.children">
<template v-if="filteredPinnedModules.size">
<LeftMenuItem
v-for="[key, pinnedModule] of filteredPinnedModules"
:key="key"
:item="pinnedModule"
group="modules"
>
<template #side>
<QBtn
v-if="pinnedModule.isPinned === true"
@click="togglePinned(pinnedModule, $event)"
icon="remove_circle"
size="xs"
flat
round
>
<QTooltip>
{{ t('components.leftMenu.removeFromPinned') }}
</QTooltip>
</QBtn>
</template>
</LeftMenuItem>
<QSeparator />
</template>
<template v-for="item in filteredItems" :key="item.name">
<template
v-if="item.children && !filteredPinnedModules.has(item.name)"
>
<LeftMenuItem :item="item" group="modules">
<template #side>
<QBtn
@ -256,3 +326,7 @@ const handleItemExpansion = (itemName) => {
color: var(--vn-label-color);
}
</style>
<i18n>
es:
Search modules: Buscar módulos
</i18n>

View File

@ -1,5 +1,5 @@
<script setup>
import { markRaw, computed, defineModel } from 'vue';
import { markRaw, computed } from 'vue';
import { QIcon, QCheckbox } from 'quasar';
import { dashIfEmpty } from 'src/filters';

View File

@ -1,5 +1,5 @@
<script setup>
import { markRaw, computed, defineModel } from 'vue';
import { markRaw, computed } from 'vue';
import { QCheckbox } from 'quasar';
import { useArrayData } from 'composables/useArrayData';
@ -25,7 +25,7 @@ const $props = defineProps({
},
searchUrl: {
type: String,
default: 'params',
default: 'table',
},
});

View File

@ -17,7 +17,7 @@ const $props = defineProps({
},
searchUrl: {
type: String,
default: 'params',
default: 'table',
},
vertical: {
type: Boolean,

View File

@ -62,7 +62,7 @@ const $props = defineProps({
default: 'flex-one',
},
searchUrl: {
type: String,
type: [String, Boolean],
default: 'table',
},
isEditable: {
@ -151,8 +151,8 @@ const tableModes = [
},
];
onBeforeMount(() => {
setUserParams(route.query[$props.searchUrl]);
hasParams.value = params.value && Object.keys(params.value).length !== 0;
const urlParams = route.query[$props.searchUrl];
hasParams.value = urlParams && Object.keys(urlParams).length !== 0;
});
onMounted(() => {
@ -185,7 +185,8 @@ watch(
watch(
() => route.query[$props.searchUrl],
(val) => setUserParams(val)
(val) => setUserParams(val),
{ immediate: true, deep: true }
);
const isTableMode = computed(() => mode.value == TABLE_MODE);
@ -330,6 +331,20 @@ function handleScroll() {
const isAtBottom = Math.abs(scrollHeight - scrollTop - clientHeight) <= 40;
if (isAtBottom) CrudModelRef.value.vnPaginateRef.paginate();
}
function handleSelection({ evt, added, rows: selectedRows }, rows) {
if (evt?.shiftKey && added) {
const rowIndex = selectedRows[0].$index;
const selectedIndexes = new Set(selected.value.map((row) => row.$index));
for (const row of rows) {
if (row.$index == rowIndex) break;
if (!selectedIndexes.has(row.$index)) {
selected.value.push(row);
selectedIndexes.add(row.$index);
}
}
}
}
</script>
<template>
<QDrawer
@ -430,6 +445,7 @@ function handleScroll() {
@virtual-scroll="handleScroll"
@row-click="(_, row) => rowClickFunction && rowClickFunction(row)"
@update:selected="emit('update:selected', $event)"
@selection="(details) => handleSelection(details, rows)"
>
<template #top-left v-if="!$props.withoutHeader">
<slot name="top-left"></slot>

View File

@ -1,5 +1,5 @@
<script setup>
import { computed, defineModel } from 'vue';
import { computed } from 'vue';
const model = defineModel(undefined, { required: true });
const $props = defineProps({

View File

@ -31,6 +31,10 @@ const $props = defineProps({
type: String,
default: null,
},
description: {
type: String,
default: null,
},
});
const warehouses = ref();
@ -43,7 +47,8 @@ const dms = ref({});
onMounted(() => {
defaultData();
if (!$props.formInitialData)
dms.value.description = t($props.model + 'Description', dms.value);
dms.value.description =
$props.description ?? t($props.model + 'Description', dms.value);
});
function onFileChange(files) {
dms.value.hasFileAttached = !!files;
@ -54,7 +59,6 @@ function mapperDms(data) {
const formData = new FormData();
const { files } = data;
if (files) formData.append(files?.name, files);
delete data.files;
const dms = {
hasFile: !!data.hasFile,
@ -78,6 +82,7 @@ async function save() {
const body = mapperDms(dms.value);
const response = await axios.post(getUrl(), body[0], body[1]);
emit('onDataSaved', body[1].params, response);
delete dms.value.files;
return response;
}
@ -158,13 +163,14 @@ function addDefaultData(data) {
/>
<QFile
ref="inputFileRef"
:label="t('entry.buys.file')"
:label="t('globals.file')"
v-model="dms.files"
:multiple="false"
:accept="allowedContentTypes"
@update:model-value="onFileChange(dms.files)"
class="required"
:display-value="dms.file"
data-cy="VnDms_inputFile"
>
<template #append>
<QIcon

View File

@ -1,8 +1,11 @@
<script setup>
import { computed, ref } from 'vue';
import { computed, ref, useAttrs } from 'vue';
import { useI18n } from 'vue-i18n';
import { useValidator } from 'src/composables/useValidator';
import { useRequired } from 'src/composables/useRequired';
const $attrs = useAttrs();
const { isRequired, requiredFieldRule } = useRequired($attrs);
const { t } = useI18n();
const emit = defineEmits([
'update:modelValue',
'update:options',
@ -27,11 +30,11 @@ const $props = defineProps({
type: Boolean,
default: true,
},
emptyToNull: {
type: Boolean,
default: true,
},
});
const { validations } = useValidator();
const { t } = useI18n();
const requiredFieldRule = (val) => validations().required($attrs.required, val);
const vnInputRef = ref(null);
const value = computed({
@ -39,6 +42,7 @@ const value = computed({
return $props.modelValue;
},
set(value) {
if ($props.emptyToNull && value === '') value = null;
emit('update:modelValue', value);
},
});
@ -60,8 +64,6 @@ const focus = () => {
defineExpose({
focus,
});
import { useAttrs } from 'vue';
const $attrs = useAttrs();
const mixinRules = [
requiredFieldRule,
@ -85,7 +87,7 @@ const mixinRules = [
v-model="value"
v-bind="{ ...$attrs, ...styleAttrs }"
:type="$attrs.type"
:class="{ required: $attrs.required }"
:class="{ required: isRequired }"
@keyup.enter="emit('keyup.enter')"
:clearable="false"
:rules="mixinRules"

View File

@ -4,8 +4,13 @@ import { date } from 'quasar';
import { useI18n } from 'vue-i18n';
import { useAttrs } from 'vue';
import VnDate from './VnDate.vue';
import { useRequired } from 'src/composables/useRequired';
const $attrs = useAttrs();
const { isRequired, requiredFieldRule } = useRequired($attrs);
const model = defineModel({ type: [String, Date] });
const { t } = useI18n();
const $props = defineProps({
isOutlined: {
type: Boolean,
@ -16,18 +21,13 @@ const $props = defineProps({
default: true,
},
});
import { useValidator } from 'src/composables/useValidator';
const { validations } = useValidator();
const { t } = useI18n();
const requiredFieldRule = (val) => validations().required($attrs.required, val);
const vnInputDateRef = ref(null);
const dateFormat = 'DD/MM/YYYY';
const isPopupOpen = ref();
const hover = ref();
const mask = ref();
const $attrs = useAttrs();
const mixinRules = [requiredFieldRule, ...($attrs.rules ?? [])];
@ -104,7 +104,7 @@ const manageDate = (date) => {
:mask="mask"
placeholder="dd/mm/aaaa"
v-bind="{ ...$attrs, ...styleAttrs }"
:class="{ required: $attrs.required }"
:class="{ required: isRequired }"
:rules="mixinRules"
:clearable="false"
@click="isPopupOpen = true"

View File

@ -1,8 +1,13 @@
<script setup>
import VnInput from 'src/components/common/VnInput.vue';
import { ref } from 'vue';
import { useAttrs } from 'vue';
const model = defineModel({ type: [Number, String] });
const $attrs = useAttrs();
const step = ref($attrs.step || 0.01);
</script>
<template>
<VnInput v-bind="$attrs" v-model.number="model" type="number" />
<VnInput v-bind="$attrs" v-model.number="model" type="number" :step="step" />
</template>

View File

@ -2,11 +2,12 @@
import { computed, ref, useAttrs } from 'vue';
import { useI18n } from 'vue-i18n';
import { date } from 'quasar';
import { useValidator } from 'src/composables/useValidator';
import VnTime from './VnTime.vue';
import { useRequired } from 'src/composables/useRequired';
const { validations } = useValidator();
const $attrs = useAttrs();
const { isRequired, requiredFieldRule } = useRequired($attrs);
const { t } = useI18n();
const model = defineModel({ type: String });
const props = defineProps({
timeOnly: {
@ -20,8 +21,6 @@ const props = defineProps({
});
const vnInputTimeRef = ref(null);
const initialDate = ref(model.value ?? Date.vnNew());
const { t } = useI18n();
const requiredFieldRule = (val) => validations().required($attrs.required, val);
const mixinRules = [requiredFieldRule, ...($attrs.rules ?? [])];
const dateFormat = 'HH:mm';
const isPopupOpen = ref();
@ -78,7 +77,7 @@ function dateToTime(newDate) {
placeholder="--:--"
v-model="formattedTime"
v-bind="{ ...$attrs, ...styleAttrs }"
:class="{ required: $attrs.required }"
:class="{ required: isRequired }"
style="min-width: 100px"
:rules="mixinRules"
@click="isPopupOpen = false"

View File

@ -3,9 +3,12 @@ import CreateNewPostcode from 'src/components/CreateNewPostcodeForm.vue';
import VnSelectDialog from 'components/common/VnSelectDialog.vue';
import { useI18n } from 'vue-i18n';
import { ref } from 'vue';
import { useAttrs } from 'vue';
import { useRequired } from 'src/composables/useRequired';
const { t } = useI18n();
const emit = defineEmits(['update:model-value', 'update:options']);
const $attrs = useAttrs();
const { isRequired, requiredFieldRule } = useRequired($attrs);
const props = defineProps({
location: {
type: Object,
@ -13,6 +16,7 @@ const props = defineProps({
},
});
const mixinRules = [requiredFieldRule];
const locationProperties = [
'postcode',
(obj) =>
@ -69,11 +73,13 @@ const handleModelValue = (data) => {
:label="t('Location')"
:placeholder="t('search_by_postalcode')"
:input-debounce="300"
:class="{ required: $attrs.required }"
:class="{ required: isRequired }"
v-bind="$attrs"
clearable
:emit-value="false"
:tooltip="t('Create new location')"
:rules="mixinRules"
:lazy-rules="true"
>
<template #form>
<CreateNewPostcode

View File

@ -1,10 +1,14 @@
<script setup>
import { ref, toRefs, computed, watch, onMounted, useAttrs } from 'vue';
import { useI18n } from 'vue-i18n';
import FetchData from 'src/components/FetchData.vue';
import { useValidator } from 'src/composables/useValidator';
const emit = defineEmits(['update:modelValue', 'update:options', 'remove']);
import { useArrayData } from 'src/composables/useArrayData';
import { useRequired } from 'src/composables/useRequired';
import dataByOrder from 'src/utils/dataByOrder';
const emit = defineEmits(['update:modelValue', 'update:options', 'remove']);
const $attrs = useAttrs();
const { t } = useI18n();
const { isRequired, requiredFieldRule } = useRequired($attrs);
const $props = defineProps({
modelValue: {
type: [String, Number, Object],
@ -86,25 +90,26 @@ const $props = defineProps({
type: Boolean,
default: false,
},
dataKey: {
type: String,
default: null,
},
});
const { validations } = useValidator();
const requiredFieldRule = (val) => validations().required($attrs.required, val);
const $attrs = useAttrs();
const { t } = useI18n();
const mixinRules = [requiredFieldRule, ...($attrs.rules ?? [])];
const { optionLabel, optionValue, optionFilter, optionFilterValue, options, modelValue } =
toRefs($props);
const myOptions = ref([]);
const myOptionsOriginal = ref([]);
const vnSelectRef = ref();
const dataRef = ref();
const lastVal = ref();
const noOneText = t('globals.noOne');
const noOneOpt = ref({
[optionValue.value]: false,
[optionLabel.value]: noOneText,
});
const isLoading = ref(false);
const useURL = computed(() => $props.url);
const value = computed({
get() {
return $props.modelValue;
@ -120,7 +125,7 @@ watch(options, (newValue) => {
});
watch(modelValue, async (newValue) => {
if (!myOptions.value.some((option) => option[optionValue.value] == newValue))
if (!myOptions?.value?.some((option) => option[optionValue.value] == newValue))
await fetchFilter(newValue);
if ($props.noOne) myOptions.value.unshift(noOneOpt.value);
@ -128,17 +133,25 @@ watch(modelValue, async (newValue) => {
onMounted(() => {
setOptions(options.value);
if ($props.url && $props.modelValue && !findKeyInOptions())
if (useURL.value && $props.modelValue && !findKeyInOptions())
fetchFilter($props.modelValue);
if ($props.focusOnMount) setTimeout(() => vnSelectRef.value.showPopup(), 300);
});
defineExpose({ opts: myOptions });
const arrayDataKey =
$props.dataKey ?? ($props.url?.length > 0 ? $props.url : $attrs.name ?? $attrs.label);
const arrayData = useArrayData(arrayDataKey, { url: $props.url, searchUrl: false });
function findKeyInOptions() {
if (!$props.options) return;
return filter($props.modelValue, $props.options)?.length;
}
function setOptions(data) {
data = dataByOrder(data, $props.sortBy);
myOptions.value = JSON.parse(JSON.stringify(data));
myOptionsOriginal.value = JSON.parse(JSON.stringify(data));
emit('update:options', data);
@ -166,7 +179,7 @@ function filter(val, options) {
}
async function fetchFilter(val) {
if (!$props.url || !dataRef.value) return;
if (!$props.url) return;
const { fields, include, sortBy, limit } = $props;
const key =
@ -188,8 +201,8 @@ async function fetchFilter(val) {
const fetchOptions = { where, include, limit };
if (fields) fetchOptions.fields = fields;
if (sortBy) fetchOptions.order = sortBy;
return dataRef.value.fetch(fetchOptions);
arrayData.reset(['skip', 'filter.skip', 'page']);
return (await arrayData.applyFilter({ filter: fetchOptions }))?.data;
}
async function filterHandler(val, update) {
@ -229,20 +242,23 @@ function nullishToTrue(value) {
const getVal = (val) => ($props.useLike ? { like: `%${val}%` } : val);
defineExpose({ opts: myOptions });
async function onScroll({ to, direction, from, index }) {
const lastIndex = myOptions.value.length - 1;
if (from === 0 && index === 0) return;
if (!useURL.value && !$props.fetchRef) return;
if (direction === 'decrease') return;
if (to === lastIndex && arrayData.store.hasMoreData && !isLoading.value) {
isLoading.value = true;
await arrayData.loadMore();
setOptions(arrayData.store.data);
vnSelectRef.value.scrollTo(lastIndex);
isLoading.value = false;
}
}
</script>
<template>
<FetchData
ref="dataRef"
:url="$props.url"
@on-fetch="(data) => setOptions(data)"
:where="where || { [optionValue]: value }"
:limit="limit"
:sort-by="sortBy"
:fields="fields"
:params="params"
/>
<QSelect
v-model="value"
:options="myOptions"
@ -257,10 +273,13 @@ defineExpose({ opts: myOptions });
:fill-input="nullishToTrue($attrs['fill-input'])"
ref="vnSelectRef"
lazy-rules
:class="{ required: $attrs.required }"
:class="{ required: isRequired }"
:rules="mixinRules"
virtual-scroll-slice-size="options.length"
hide-bottom-space
:input-debounce="useURL ? '300' : '0'"
:loading="isLoading"
@virtual-scroll="onScroll"
>
<template v-if="isClearable" #append>
<QIcon

View File

@ -8,7 +8,7 @@ defineProps({
<template>
<div :class="$q.screen.gt.md ? 'q-pb-lg' : 'q-pb-md'">
<div class="header-link" :style="{ cursor: url ? 'pointer' : 'default' }">
<a :href="url" :class="url ? 'link' : 'color-vn-text'">
<a :href="url" :class="url ? 'link' : 'color-vn-text'" v-bind="$attrs">
{{ text }}
<QIcon v-if="url" :name="icon" />
</a>

View File

@ -167,6 +167,7 @@ const toModule = computed(() =>
icon="more_vert"
round
size="md"
data-cy="descriptor-more-opts"
>
<QTooltip>
{{ t('components.cardDescriptor.moreOptions') }}

View File

@ -4,6 +4,7 @@ import { useRoute } from 'vue-router';
import SkeletonSummary from 'components/ui/SkeletonSummary.vue';
import VnLv from 'src/components/ui/VnLv.vue';
import { useArrayData } from 'src/composables/useArrayData';
import { isDialogOpened } from 'src/filters';
const props = defineProps({
url: {
@ -58,22 +59,6 @@ async function fetch() {
emit('onFetch', Array.isArray(data) ? data[0] : data);
isLoading.value = false;
}
const showRedirectToSummaryIcon = computed(() => {
const exist = existSummary(route.matched);
return !isSummary.value && route.meta.moduleName && exist;
});
function existSummary(routes) {
const hasSummary = routes.some((r) => r.name === `${route.meta.moduleName}Summary`);
if (hasSummary) return hasSummary;
for (const current of routes) {
if (current.path != '/' && current.children) {
const exist = existSummary(current.children);
if (exist) return exist;
}
}
}
</script>
<template>
@ -84,7 +69,7 @@ function existSummary(routes) {
<div class="summaryHeader bg-primary q-pa-sm text-weight-bolder">
<slot name="header-left">
<router-link
v-if="showRedirectToSummaryIcon"
v-if="isDialogOpened()"
class="header link"
:to="{
name: `${moduleName ?? route.meta.moduleName}Summary`,
@ -98,7 +83,7 @@ function existSummary(routes) {
<slot name="header" :entity="entity" dense>
<VnLv :label="`${entity.id} -`" :value="entity.name" />
</slot>
<slot name="header-right">
<slot name="header-right" :entity="entity">
<span></span>
</slot>
</div>
@ -118,6 +103,7 @@ function existSummary(routes) {
.cardSummary {
width: 100%;
max-height: 70vh;
.summaryHeader {
text-align: center;
font-size: 20px;

View File

@ -30,10 +30,11 @@ const props = defineProps({
},
});
defineEmits(['confirm', ...useDialogPluginComponent.emits]);
const emit = defineEmits(['confirm', 'cancel', ...useDialogPluginComponent.emits]);
defineExpose({ show: () => dialogRef.value.show(), hide: () => dialogRef.value.hide() });
const { dialogRef, onDialogOK } = useDialogPluginComponent();
const { dialogRef, onDialogHide, onDialogOK, onDialogCancel } =
useDialogPluginComponent();
const title = props.title || t('Confirm');
const message =
@ -53,9 +54,14 @@ async function confirm() {
}
onDialogOK(props.data);
}
function cancel() {
emit('cancel');
onDialogCancel();
}
</script>
<template>
<QDialog ref="dialogRef">
<QDialog ref="dialogRef" @hide="onDialogHide">
<QCard class="q-pa-sm">
<QCardSection class="row items-center q-pb-none">
<QAvatar
@ -67,7 +73,14 @@ async function confirm() {
/>
<span class="text-h6">{{ title }}</span>
<QSpace />
<QBtn icon="close" :disable="isLoading" flat round dense v-close-popup />
<QBtn
icon="close"
:disable="isLoading"
flat
round
dense
@click="cancel()"
/>
</QCardSection>
<QCardSection class="q-pb-none">
<span v-if="message !== false" v-html="message" />
@ -81,7 +94,7 @@ async function confirm() {
color="primary"
:disable="isLoading"
flat
v-close-popup
@click="cancel()"
/>
<QBtn
:label="t('globals.confirm')"
@ -90,6 +103,7 @@ async function confirm() {
@click="confirm()"
unelevated
autofocus
data-cy="VnConfirm_confirm"
/>
</QCardActions>
</QCard>

View File

@ -49,7 +49,7 @@ const $props = defineProps({
},
searchUrl: {
type: String,
default: 'params',
default: 'table',
},
redirect: {
type: Boolean,
@ -57,7 +57,6 @@ const $props = defineProps({
},
});
defineExpose({ search, sanitizer });
const emit = defineEmits([
'update:modelValue',
'refresh',
@ -170,9 +169,29 @@ const tagsList = computed(() => {
return tagList;
});
const formatTags = (tags) => {
const formattedTags = [];
tags.forEach((tag) => {
if (tag.label === 'and') {
tag.value.forEach((item) => {
for (const key in item) {
formattedTags.push({ label: key, value: item[key] });
}
});
} else {
formattedTags.push(tag);
}
});
return formattedTags;
};
const tags = computed(() => {
return tagsList.value.filter((tag) => !($props.customTags || []).includes(tag.label));
const filteredTags = tagsList.value.filter(
(tag) => !($props.customTags || []).includes(tag.label)
);
return formatTags(filteredTags);
});
const customTags = computed(() =>
tagsList.value.filter((tag) => ($props.customTags || []).includes(tag.label))
);
@ -193,13 +212,20 @@ function formatValue(value) {
function sanitizer(params) {
for (const [key, value] of Object.entries(params)) {
if (value && typeof value === 'object') {
if (key === 'and' && Array.isArray(value)) {
value.forEach((item) => {
Object.assign(params, item);
});
delete params[key];
} else if (value && typeof value === 'object') {
const param = Object.values(value)[0];
if (typeof param == 'string') params[key] = param.replaceAll('%', '');
}
}
return params;
}
defineExpose({ search, sanitizer, userParams });
</script>
<template>
@ -247,6 +273,7 @@ function sanitizer(params) {
:key="chip.label"
:removable="!unremovableParams?.includes(chip.label)"
@remove="remove(chip.label)"
data-cy="vnFilterPanelChip"
>
<slot name="tags" :tag="chip" :format-fn="formatValue">
<div class="q-gutter-x-xs">

View File

@ -0,0 +1,16 @@
<script setup>
defineProps({ email: { type: [String], default: null } });
</script>
<template>
<QBtn
v-if="email"
flat
round
icon="email"
size="sm"
color="primary"
padding="none"
:href="`mailto:${email}`"
@click.stop
/>
</template>

View File

@ -1,16 +1,49 @@
<script setup>
defineProps({ phoneNumber: { type: [String, Number], default: null } });
import { reactive, useAttrs, onBeforeMount, capitalize } from 'vue';
import axios from 'axios';
const props = defineProps({
phoneNumber: { type: [String, Number], default: null },
channel: { type: Number, default: null },
});
const config = reactive({
sip: { icon: 'phone', href: `sip:${props.phoneNumber}` },
'say-simple': {
icon: 'vn:saysimple',
href: null,
channel: props.channel,
},
});
const type = Object.keys(config).find((key) => key in useAttrs()) || 'sip';
onBeforeMount(async () => {
let { channel } = config[type];
if (type === 'say-simple') {
const { url, defaultChannel } = (await axios.get('SaySimpleConfigs/findOne'))
.data;
if (!channel) channel = defaultChannel;
config[
type
].href = `${url}?customerIdentity=%2B${props.phoneNumber}&channelId=${channel}`;
}
});
</script>
<template>
<QBtn
v-if="phoneNumber"
flat
round
icon="phone"
:icon="config[type].icon"
size="sm"
color="primary"
padding="none"
:href="`sip:${phoneNumber}`"
:href="config[type].href"
@click.stop
/>
>
<QTooltip>
{{ capitalize(type).replace('-', '') }}
</QTooltip>
</QBtn>
</template>

View File

@ -65,13 +65,9 @@ onBeforeRouteLeave((to, from, next) => {
auto-load
@on-fetch="(data) => (observationTypes = data)"
/>
<QCard class="q-pa-xs q-mb-xl full-width" v-if="$props.addNote">
<QCard class="q-pa-xs q-mb-lg full-width" v-if="$props.addNote">
<QCardSection horizontal>
<VnAvatar :worker-id="currentUser.id" size="md" />
<div class="full-width row justify-between q-pa-xs">
<VnUserLink :name="t('New note')" :worker-id="currentUser.id" />
{{ t('globals.now') }}
</div>
{{ t('New note') }}
</QCardSection>
<QCardSection class="q-px-xs q-my-none q-py-none">
<VnRow class="full-width">
@ -144,7 +140,7 @@ onBeforeRouteLeave((to, from, next) => {
<div class="full-width row justify-between q-pa-xs">
<div>
<VnUserLink
:name="`${note.worker.user.nickname}`"
:name="`${note.worker.user.name}`"
:worker-id="note.worker.id"
/>
<QBadge

View File

@ -44,7 +44,7 @@ const props = defineProps({
},
limit: {
type: Number,
default: 10,
default: 20,
},
userParams: {
type: Object,
@ -100,7 +100,7 @@ const arrayData = useArrayData(props.dataKey, {
const store = arrayData.store;
onMounted(async () => {
if (props.autoLoad) await fetch();
if (props.autoLoad && !store.data?.length) await fetch();
mounted.value = true;
});
@ -115,7 +115,11 @@ watch(
watch(
() => store.data,
(data) => emit('onChange', data)
(data) => {
if (!mounted.value) return;
emit('onChange', data);
},
{ immediate: true }
);
watch(

View File

@ -1,6 +1,3 @@
<script setup>
defineProps({ wrap: { type: Boolean, default: false } });
</script>
<template>
<div class="vn-row q-gutter-md q-mb-md">
<slot />

View File

@ -45,7 +45,7 @@ const props = defineProps({
},
limit: {
type: Number,
default: 10,
default: 20,
},
userParams: {
type: Object,

View File

@ -0,0 +1,11 @@
import axios from 'axios';
import { useRole } from './useRole';
export async function useAdvancedSummary(model, id, roles = ['hr']) {
if (useRole().hasAny(roles)) {
const { data } = await axios.get(`${model}/advancedSummary`, {
params: { filter: { where: { id } } },
});
return Array.isArray(data) ? data[0] : data;
}
}

View File

@ -3,6 +3,7 @@ import { useRouter, useRoute } from 'vue-router';
import axios from 'axios';
import { useArrayDataStore } from 'stores/useArrayDataStore';
import { buildFilter } from 'filters/filterPanel';
import { isDialogOpened } from 'src/filters';
const arrayDataStore = useArrayDataStore();
@ -114,8 +115,7 @@ export function useArrayData(key = useRoute().meta.moduleName, userOptions) {
for (const row of response.data) store.data.push(row);
} else {
store.data = response.data;
if (!document.querySelectorAll('[role="dialog"][aria-modal="true"]').length)
updateRouter && updateStateParams();
if (!isDialogOpened()) updateRouter && updateStateParams();
}
store.isLoading = false;
@ -247,8 +247,10 @@ export function useArrayData(key = useRoute().meta.moduleName, userOptions) {
}
function updateStateParams() {
if (!route?.path) return;
const newUrl = { path: route.path, query: { ...(route.query ?? {}) } };
newUrl.query[store.searchUrl] = JSON.stringify(store.currentFilter);
if (store?.searchUrl)
newUrl.query[store.searchUrl] = JSON.stringify(store.currentFilter);
if (store.navigate) {
const { customRouteRedirectName, searchText } = store.navigate;
@ -269,7 +271,7 @@ export function useArrayData(key = useRoute().meta.moduleName, userOptions) {
const pushUrl = { path: to };
if (to.endsWith('/list') || to.endsWith('/'))
pushUrl.query = newUrl.query;
destroy();
else destroy();
return router.push(pushUrl);
}
}

View File

@ -0,0 +1,8 @@
import { openURL } from 'quasar';
const defaultWindowFeatures = {
noopener: true,
noreferrer: true,
};
export default function (url, windowFeatures = defaultWindowFeatures, fn = undefined) {
openURL(url, fn, windowFeatures);
}

View File

@ -0,0 +1,13 @@
import { useValidator } from 'src/composables/useValidator';
export function useRequired($attrs) {
const { validations } = useValidator();
const isRequired = Object.keys($attrs).includes('required');
const requiredFieldRule = (val) => validations().required(isRequired, val);
return {
isRequired,
requiredFieldRule,
};
}

View File

@ -9,12 +9,20 @@ function parseJSON(str, fallback) {
}
export default function (route, param) {
// catch route query params
const params = parseJSON(route?.query?.params, {});
const params = parseJSON(route?.query?.table, {});
// extract and parse filter from params
const { filter: filterStr = '{}' } = params;
const where = parseJSON(filterStr, {})?.where;
if (where && where[param] !== undefined) {
if (where && !param) {
return where;
} else if (where && where.and) {
const foundParam = where.and.find((p) => p[param]);
if (foundParam) {
return foundParam[param];
}
} else if (where && where[param]) {
return where[param];
}
return null;

View File

@ -12,8 +12,10 @@ import dateRange from './dateRange';
import toHour from './toHour';
import dashOrCurrency from './dashOrCurrency';
import getParamWhere from './getParamWhere';
import isDialogOpened from './isDialogOpened';
export {
isDialogOpened,
toLowerCase,
toLowerCamel,
toDate,

View File

@ -0,0 +1,3 @@
export default function isDialogOpened(query = '[role="dialog"]') {
return document.querySelectorAll(query).length > 0;
}

View File

@ -59,7 +59,7 @@ globals:
downloadCSVSuccess: CSV downloaded successfully
reference: Reference
agency: Agency
wareHouseOut: Warehouse Out
warehouseOut: Warehouse Out
wareHouseIn: Warehouse In
landed: Landed
shipped: Shipped
@ -106,6 +106,29 @@ globals:
weight: Weight
error: Ups! Something went wrong
recalc: Recalculate
alias: Alias
vat: VAT
intrastat: Intrastat
tags: Tags
size: Size
producer: Producer
origin: Origin
state: State
subtotal: Subtotal
visible: Visible
price: Price
client: Client
country: Country
phone: Phone
mobile: Mobile
postcode: Postcode
street: Street
tag: Tag
ticketId: Ticket ID
confirmed: Confirmed
small: Small
medium: Medium
big: Big
pageTitles:
logIn: Login
addressEdit: Update address
@ -278,6 +301,7 @@ globals:
RouteExtendedList: Router
wasteRecalc: Waste recaclulate
operator: Operator
parking: Parking
supplier: Supplier
created: Created
worker: Worker
@ -296,13 +320,10 @@ globals:
maxTemperature: Max
minTemperature: Min
params:
id: ID
clientFk: Client id
salesPersonFk: Sales person
warehouseFk: Warehouse
provinceFk: Province
from: From
To: To
stateFk: State
email: Email
SSN: SSN
@ -312,6 +333,7 @@ globals:
changePass: Change password
deleteConfirmTitle: Delete selected elements
changeState: Change state
raid: 'Raid {daysInForward} days'
errors:
statusUnauthorized: Access denied
statusInternalServerError: An internal server error has ocurred
@ -331,16 +353,12 @@ login:
loginError: Invalid username or password
fieldRequired: This field is required
twoFactorRequired: Two-factor verification required
twoFactor:
code: Code
twoFactorRequired:
validate: Validate
insert: Enter the verification code
explanation: >-
Please, enter the verification code that we have sent to your email in the
next 5 minutes
verifyEmail:
pageTitles:
verifyEmail: Email verification
recoverPassword:
userOrEmail: User or recovery email
explanation: >-
@ -352,15 +370,7 @@ resetPassword:
entry:
list:
newEntry: New entry
landed: Landed
invoiceNumber: Invoice number
supplier: Supplier
booked: Booked
confirmed: Confirmed
ordered: Ordered
tableVisibleColumns:
id: Id
reference: Reference
created: Creation
supplierFk: Supplier
isBooked: Booked
@ -369,244 +379,121 @@ entry:
companyFk: Company
travelFk: Travel
isExcludedFromAvailable: Inventory
isRaid: Raid
invoiceAmount: Import
summary:
commission: Commission
currency: Currency
company: Company
reference: Reference
invoiceNumber: Invoice number
ordered: Ordered
confirmed: Confirmed
booked: Booked
raid: Raid
excludedFromAvailable: Inventory
travelReference: Reference
travelAgency: Agency
travelShipped: Shipped
travelWarehouseOut: Warehouse Out
travelDelivered: Delivered
travelLanded: Landed
travelWarehouseIn: Warehouse In
travelReceived: Received
buys: Buys
quantity: Quantity
stickers: Stickers
package: Package
weight: Weight
packing: Packing
grouping: Grouping
buyingValue: Buying value
import: Import
pvp: PVP
item: Item
basicData:
supplier: Supplier
travel: Travel
reference: Reference
invoiceNumber: Invoice number
company: Company
currency: Currency
commission: Commission
observation: Observation
ordered: Ordered
confirmed: Confirmed
booked: Booked
raid: Raid
excludedFromAvailable: Inventory
agency: Agency
warehouseOut: Warehouse Out
warehouseIn: Warehouse In
shipped: Shipped
landed: Landed
id: ID
buys:
groupingPrice: Grouping price
packingPrice: Packing price
reference: Reference
observations: Observations
item: Item
size: Size
packing: Packing
grouping: Grouping
buyingValue: Buying value
packagingFk: Box
file: File
name: Name
producer: Producer
type: Type
color: Color
id: ID
printedStickers: Printed stickers
notes:
observationType: Observation type
descriptor:
agency: Agency
landed: Landed
warehouseOut: Warehouse Out
latestBuys:
tableVisibleColumns:
image: Picture
itemFk: Item ID
packing: Packing
grouping: Grouping
quantity: Quantity
size: Size
tags: Tags
type: Type
intrastat: Intrastat
origin: Origin
weightByPiece: Weight/Piece
isActive: Active
family: Family
entryFk: Entry
buyingValue: Buying value
freightValue: Freight value
comissionValue: Commission value
description: Description
packageValue: Package value
isIgnored: Is ignored
price2: Grouping
price3: Packing
minPrice: Min
ektFk: Ekt
weight: Weight
packagingFk: Package
packingOut: Package out
landing: Landing
isExcludedFromAvailable: Es inventory
isRaid: Raid
ticket:
pageTitles:
tickets: Tickets
list: List
ticketCreate: New ticket
summary: Summary
basicData: Basic Data
boxing: Boxing
sms: Sms
notes: Notes
sale: Sale
dms: File management
volume: Volume
observation: Notes
ticketAdvance: Advance tickets
futureTickets: Future tickets
purchaseRequest: Purchase request
weeklyTickets: Weekly tickets
list:
nickname: Nickname
state: State
shipped: Shipped
landed: Landed
salesPerson: Sales person
total: Total
card:
ticketId: Ticket ID
state: State
customerId: Customer ID
salesPerson: Sales person
agency: Agency
shipped: Shipped
warehouse: Warehouse
customerCard: Customer card
alias: Alias
ticketList: Ticket List
newOrder: New Order
boxing:
expedition: Expedition
item: Item
created: Created
worker: Worker
selectTime: 'Select time:'
selectVideo: 'Select video:'
notFound: No videos available
summary:
state: State
salesPerson: Sales person
agency: Agency
zone: Zone
warehouse: Warehouse
collection: Collection
route: Route
invoice: Invoice
shipped: Shipped
landed: Landed
consigneePhone: Consignee phone
consigneeMobile: Consignee mobile
consigneeAddress: Consignee address
clientPhone: Client phone
clientMobile: Client mobile
consignee: Consignee
subtotal: Subtotal
vat: VAT
total: Total
saleLines: Line items
item: Item
visible: Visible
available: Available
quantity: Quantity
price: Price
discount: Discount
packing: Packing
hasComponentLack: Component lack
itemShortage: Not visible
claim: Claim
reserved: Reserved
created: Created
package: Package
taxClass: Tax class
services: Services
requester: Requester
atender: Atender
request: Request
weight: Weight
goTo: Go to
summaryAmount: Summary
purchaseRequest: Purchase request
service: Service
description: Description
attender: Attender
ok: Ok
create:
client: Client
address: Address
landed: Landed
warehouse: Warehouse
agency: Agency
invoiceOut:
list:
ref: Reference
issued: Issued
shortIssued: Issued
client: Client
created: Created
shortCreated: Created
company: Company
dued: Due date
shortDued: Due date
amount: Amount
card:
issued: Issued
client: Client
company: Company
customerCard: Customer card
summary:
issued: Issued
created: Created
dued: Due
booked: Booked
company: Company
taxBreakdown: Tax breakdown
type: Type
taxableBase: Taxable base
rate: Rate
fee: Fee
tickets: Tickets
ticketId: Ticket id
nickname: Alias
shipped: Shipped
totalWithVat: Amount
globalInvoices:
errors:
@ -620,22 +507,14 @@ invoiceOut:
noTicketsToInvoice: There are not tickets to invoice
criticalInvoiceError: 'Critical invoicing error, process stopped'
table:
client: Client
addressId: Address id
streetAddress: Street
statusCard:
percentageText: '{getPercentage}% {getAddressNumber} of {getNAddresses}'
pdfsNumberText: '{nPdfs} of {totalPdfs} PDFs'
negativeBases:
from: From
to: To
company: Company
country: Country
clientId: Client Id
client: Client
amount: Amount
base: Base
ticketId: Ticket Id
active: Active
hasToInvoice: Has to Invoice
verifiedData: Verified Data
@ -648,77 +527,39 @@ shelving:
priority: Priority
newShelving: New Shelving
summary:
code: Code
parking: Parking
priority: Priority
worker: Worker
recyclable: Recyclable
basicData:
code: Code
parking: Parking
priority: Priority
recyclable: Recyclable
parking:
pickingOrder: Picking order
sector: Sector
row: Row
column: Column
pageTitles:
parking: Parking
searchBar:
info: You can search by parking code
label: Search parking...
order:
field:
salesPersonFk: Sales Person
clientFk: Client
isConfirmed: Confirmed
created: Created
landed: Landed
hour: Hour
agency: Agency
total: Total
form:
clientFk: Client
addressFk: Address
landed: Landed
agencyModeFk: Agency
list:
newOrder: New Order
summary:
basket: Basket
nickname: Nickname
company: Company
confirmed: Confirmed
notConfirmed: Not confirmed
created: Created
landed: Landed
phone: Phone
createdFrom: Created From
address: Address
notes: Notes
subtotal: Subtotal
total: Total
vat: VAT
state: State
alias: Alias
items: Items
orderTicketList: Order Ticket List
details: Details
item: Item
quantity: Quantity
price: Price
amount: Amount
confirm: Confirm
confirmLines: Confirm lines
department:
pageTitles:
basicData: Basic data
department: Department
summary: Summary
name: Name
code: Code
chat: Chat
bossDepartment: Boss Department
email: Email
selfConsumptionCustomer: Self-consumption customer
telework: Telework
notifyOnErrors: Notify on errors
@ -727,47 +568,11 @@ department:
hasToSendMail: Send check-ins by email
departmentRemoved: Department removed
worker:
pageTitles:
workers: Workers
list: List
basicData: Basic data
summary: Summary
notifications: Notifications
workerCreate: New worker
department: Department
pda: PDA
notes: Notas
dms: My documentation
pbx: Private Branch Exchange
log: Log
calendar: Calendar
timeControl: Time control
locker: Locker
balance: Balance
medical: Medical
operator: Operator
list:
name: Name
email: Email
phone: Phone
mobile: Mobile
active: Active
department: Department
schedule: Schedule
newWorker: New worker
card:
workerId: Worker ID
user: User
name: Name
email: Email
phone: Phone
mobile: Mobile
active: Active
warehouse: Warehouse
agency: Agency
salesPerson: Sales person
summary:
basicData: Basic data
boss: Boss
phoneExtension: Phone extension
entPhone: Enterprise phone
@ -799,19 +604,12 @@ worker:
serialNumber: Serial number
removePDA: Deallocate PDA
create:
name: Name
lastName: Last name
birth: Birth
fi: Fi
code: Worker code
phone: Phone
postcode: Postcode
province: Province
city: City
street: Street
webUser: Web user
personalEmail: Personal email
company: Company
boss: Boss
payMethods: Pay method
iban: IBAN
@ -823,16 +621,13 @@ worker:
endDate: End date
center: Training center
invoice: Invoice
amount: Amount
remark: Remark
hasDiploma: Has diploma
medical:
tableVisibleColumns:
date: Date
time: Hour
center: Formation Center
invoice: Invoice
amount: Amount
isFit: Fit
remark: Observations
imageNotFound: Image not found
@ -856,18 +651,7 @@ worker:
isOnReservationMode: Reservation mode
machine: Machine
wagon:
pageTitles:
wagons: Wagons
wagonsList: Wagons List
wagonCreate: Create wagon
wagonEdit: Edit wagon
typesList: Types List
typeCreate: Create type
typeEdit: Edit type
wagonCounter: Trolley counter
wagonTray: Tray List
type:
name: Name
submit: Submit
reset: Reset
trayColor: Tray color
@ -875,13 +659,10 @@ wagon:
list:
plate: Plate
volume: Volume
type: Type
remove: Remove
removeItem: Wagon removed successfully
create:
plate: Plate
volume: Volume
type: Type
label: Label
warnings:
noData: No data available
@ -898,26 +679,17 @@ wagon:
supplier:
list:
payMethod: Pay method
payDeadline: Pay deadline
payDay: Pay day
account: Account
newSupplier: New supplier
tableVisibleColumns:
id: Id
name: Name
nif: NIF/CIF
nickname: Alias
account: Account
payMethod: Pay Method
payDay: Pay Day
country: Country
summary:
responsible: Responsible
notes: Notes
verified: Verified
isActive: Is active
billingData: Billing data
payMethod: Pay method
payDeadline: Pay deadline
payDay: Pay day
account: Account
@ -930,20 +702,16 @@ supplier:
fiscalAddress: Fiscal address
socialName: Social name
taxNumber: Tax number
street: Street
city: City
postCode: Postcode
province: Province
country: Country
create:
supplierName: Supplier name
basicData:
alias: Alias
workerFk: Responsible
isSerious: Verified
isActive: Active
isPayMethodChecked: PayMethod checked
note: Notes
size: Size
fiscalData:
name: Social name *
nif: Tax number *
@ -952,36 +720,18 @@ supplier:
sageWithholdingFk: Sage withholding
sageTransactionTypeFk: Sage transaction type
supplierActivityFk: Supplier activity
healthRegister: Health register
street: Street
postcode: Postcode
city: City *
provinceFk: Province
country: Country
isTrucker: Trucker
isVies: Vies
billingData:
payMethodFk: Billing data
payDemFk: Payment deadline
payDay: Pay day
accounts:
iban: Iban
bankEntity: Bank entity
beneficiary: Beneficiary
contacts:
name: Name
phone: Phone
mobile: Mobile
email: Email
observation: Notes
addresses:
street: Street
postcode: Postcode
phone: Phone
name: Name
city: City
province: Province
mobile: Mobile
agencyTerms:
agencyFk: Agency
minimumM3: Minimum M3
@ -993,25 +743,16 @@ supplier:
addRow: Add row
consumption:
entry: Entry
date: Date
reference: Reference
travel:
travelList:
tableVisibleColumns:
id: Id
ref: Reference
agency: Agency
shipped: Shipped
landed: Landed
shipHour: Shipment Hour
landHour: Landing Hour
warehouseIn: Warehouse in
warehouseOut: Warehouse out
totalEntries: Total entries
totalEntriesTooltip: Total entries
daysOnward: Landed days onwards
summary:
confirmed: Confirmed
entryId: Entry Id
freight: Freight
package: Package
@ -1024,66 +765,30 @@ travel:
AddEntry: Add entry
thermographs: Thermographs
hb: HB
variables:
search: Id/Reference
agencyModeFk: Agency
warehouseInFk: ' Warehouse In'
warehouseOutFk: Warehouse Out
landedFrom: Landed from
landedTo: Landed to
continent: Continent out
totalEntries: Total entries
basicData:
reference: Reference
agency: Agency
shipped: Shipped
landed: Landed
warehouseOut: Warehouse Out
warehouseIn: Warehouse In
delivered: Delivered
received: Received
daysInForward: Days in forward
thermographs:
code: Code
temperature: Temperature
state: State
destination: Destination
created: Created
thermograph: Thermograph
reference: Reference
type: Type
company: Company
warehouse: Warehouse
travelFileDescription: 'Travel id { travelId }'
file: File
item:
descriptor:
item: Item
buyer: Buyer
color: Color
category: Category
stems: Stems
visible: Visible
available: Available
warehouseText: 'Calculated on the warehouse of { warehouseName }'
itemDiary: Item diary
producer: Producer
list:
id: Identifier
grouping: Grouping
packing: Packing
description: Description
stems: Stems
category: Category
typeName: Type
intrastat: Intrastat
isActive: Active
size: Size
origin: Origin
userName: Buyer
weightByPiece: Weight/Piece
stemMultiplier: Multiplier
producer: Producer
landed: Landed
fixedPrice:
itemFk: Item ID
groupingPrice: Grouping price
@ -1092,81 +797,57 @@ item:
minPrice: Min price
started: Started
ended: Ended
warehouse: Warehouse
create:
name: Name
tag: Tag
priority: Priority
type: Type
intrastat: Intrastat
origin: Origin
buyRequest:
ticketId: 'Ticket ID'
shipped: 'Shipped'
requester: 'Requester'
requested: 'Requested'
price: 'Price'
attender: 'Atender'
item: 'Item'
achieved: 'Achieved'
concept: 'Concept'
state: 'State'
requester: Requester
requested: Requested
attender: Atender
achieved: Achieved
concept: Concept
summary:
basicData: 'Basic data'
otherData: 'Other data'
description: 'Description'
tax: 'Tax'
tags: 'Tags'
botanical: 'Botanical'
barcode: 'Barcode'
name: 'Nombre'
completeName: 'Nombre completo'
family: 'Familia'
size: 'Medida'
origin: 'Origen'
stems: 'Tallos'
multiplier: 'Multiplicador'
buyer: 'Comprador'
doPhoto: 'Do photo'
intrastatCode: 'Código intrastat'
intrastat: 'Intrastat'
ref: 'Referencia'
relevance: 'Relevancia'
weight: 'Peso (gramos)/tallo'
units: 'Unidades/caja'
expense: 'Gasto'
generic: 'Genérico'
recycledPlastic: 'Plástico reciclado'
nonRecycledPlastic: 'Plástico no reciclado'
minSalesQuantity: 'Cantidad mínima de venta'
genus: 'Genus'
specie: 'Specie'
otherData: Other data
tax: Tax
botanical: Botanical
barcode: Barcode
completeName: Complete name
family: Familiy
stems: Stems
multiplier: Multiplier
buyer: Buyer
doPhoto: Do photo
intrastatCode: Intrastat code
ref: Reference
relevance: Relevance
weight: Weight (gram)/stem
units: Units/box
expense: Expense
generic: Generic
recycledPlastic: Recycled plastic
nonRecycledPlastic: Non recycled plastic
minSalesQuantity: Min sales quantity
genus: Genus
specie: Specie
components:
topbar: {}
itemsFilterPanel:
typeFk: Type
tag: Tag
value: Value
# ItemFixedPriceFilter
buyerFk: Buyer
warehouseFk: Warehouse
started: From
ended: To
mine: For me
hasMinPrice: Minimum price
# LatestBuysFilter
salesPersonFk: Buyer
supplierFk: Supplier
from: From
to: To
active: Is active
visible: Is visible
floramondo: Is floramondo
showBadDates: Show future items
userPanel:
copyToken: Token copied to clipboard
settings: Settings
logOut: Log Out
localWarehouse: Local warehouse
localBank: Local bank
localCompany: Local company
@ -1174,7 +855,6 @@ components:
userCompany: User company
smartCard:
downloadFile: Download file
clone: Clone
openCard: View
openSummary: Summary
cardDescriptor:

View File

@ -58,8 +58,8 @@ globals:
downloadCSVSuccess: Descarga de CSV exitosa
reference: Referencia
agency: Agencia
wareHouseOut: Alm. salida
wareHouseIn: Alm. entrada
warehouseOut: Alm. salida
warehouseIn: Alm. entrada
landed: F. entrega
shipped: F. envío
totalEntries: Ent. totales
@ -108,6 +108,29 @@ globals:
weight: Peso
error: ¡Ups! Algo salió mal
recalc: Recalcular
alias: Alias
vat: IVA
intrastat: Intrastat
tags: Etiquetas
size: Medida
producer: Productor
origin: Origen
state: Estado
subtotal: Subtotal
visible: Visible
price: Precio
client: Cliente
country: País
phone: Teléfono
mobile: Móvil
postcode: Código postal
street: Dirección
tag: Etiqueta
ticketId: ID ticket
confirmed: Confirmado
small: Pequeño/a
medium: Mediano/a
big: Grande
pageTitles:
logIn: Inicio de sesión
addressEdit: Modificar consignatario
@ -282,6 +305,7 @@ globals:
medical: Mutua
wasteRecalc: Recalcular mermas
operator: Operario
parking: Parking
supplier: Proveedor
created: Fecha creación
worker: Trabajador
@ -300,13 +324,10 @@ globals:
maxTemperature: Máx
minTemperature: Mín
params:
id: Id
clientFk: Id cliente
salesPersonFk: Comercial
warehouseFk: Almacén
provinceFk: Provincia
from: Desde
To: Hasta
stateFk: Estado
departmentFk: Departamento
email: Correo
@ -316,6 +337,7 @@ globals:
changePass: Cambiar contraseña
deleteConfirmTitle: Eliminar los elementos seleccionados
changeState: Cambiar estado
raid: 'Redada {daysInForward} días'
errors:
statusUnauthorized: Acceso denegado
statusInternalServerError: Ha ocurrido un error interno del servidor
@ -336,13 +358,9 @@ login:
fieldRequired: Este campo es obligatorio
twoFactorRequired: Verificación de doble factor requerida
twoFactor:
code: Código
validate: Validar
insert: Introduce el código de verificación
explanation: Por favor introduce el código de verificación que te hemos enviado a tu email en los próximos 5 minutos
verifyEmail:
pageTitles:
verifyEmail: Verificación de correo
recoverPassword:
userOrEmail: Usuario o correo de recuperación
explanation: >-
@ -354,15 +372,7 @@ resetPassword:
entry:
list:
newEntry: Nueva entrada
landed: F. entrega
invoiceNumber: Núm. factura
supplier: Proveedor
booked: Asentado
confirmed: Confirmado
ordered: Pedida
tableVisibleColumns:
id: Id
reference: Referencia
created: Creación
supplierFk: Proveedor
isBooked: Asentado
@ -371,18 +381,13 @@ entry:
companyFk: Empresa
travelFk: Envio
isExcludedFromAvailable: Inventario
isRaid: Redada
invoiceAmount: Importe
summary:
commission: Comisión
currency: Moneda
company: Empresa
reference: Referencia
invoiceNumber: Núm. factura
ordered: Pedida
confirmed: Confirmada
booked: Contabilizada
raid: Redada
excludedFromAvailable: Inventario
travelReference: Referencia
travelAgency: Agencia
@ -390,232 +395,108 @@ entry:
travelWarehouseOut: Alm. salida
travelDelivered: Enviada
travelLanded: F. entrega
travelWarehouseIn: Alm. entrada
travelReceived: Recibida
buys: Compras
quantity: Cantidad
stickers: Etiquetas
package: Embalaje
weight: Peso
packing: Packing
grouping: Grouping
buyingValue: Coste
import: Importe
pvp: PVP
item: Artículo
basicData:
supplier: Proveedor
travel: Envío
reference: Referencia
invoiceNumber: Núm. factura
company: Empresa
currency: Moneda
observation: Observación
commission: Comisión
ordered: Pedida
confirmed: Confirmado
booked: Asentado
raid: Redada
excludedFromAvailable: Inventario
agency: Agencia
warehouseOut: Alm. salida
warehouseIn: Alm. entrada
shipped: F. envío
landed: F. entrega
id: ID
buys:
groupingPrice: Precio grouping
packingPrice: Precio packing
reference: Referencia
observations: Observaciónes
item: Artículo
size: Medida
packing: Packing
grouping: Grouping
buyingValue: Coste
packagingFk: Embalaje
file: Fichero
name: Nombre
producer: Productor
type: Tipo
color: Color
id: ID
printedStickers: Etiquetas impresas
notes:
observationType: Tipo de observación
descriptor:
agency: Agencia
landed: F. entrega
warehouseOut: Alm. salida
latestBuys:
tableVisibleColumns:
image: Foto
itemFk: Id Artículo
packing: packing
grouping: Grouping
quantity: Cantidad
size: Medida
tags: Etiquetas
type: Tipo
intrastat: Intrastat
origin: Origen
weightByPiece: Peso (gramos)/tallo
isActive: Activo
family: Familia
entryFk: Entrada
buyingValue: Coste
freightValue: Porte
comissionValue: Comisión
description: Descripción
packageValue: Embalaje
isIgnored: Ignorado
price2: Grouping
price3: Packing
minPrice: Min
ektFk: Ekt
weight: Peso
packagingFk: Embalaje
packingOut: Embalaje envíos
landing: Llegada
isExcludedFromAvailable: Es inventario
isRaid: Redada
ticket:
pageTitles:
tickets: Tickets
list: Listado
ticketCreate: Nuevo ticket
summary: Resumen
basicData: Datos básicos
boxing: Encajado
sms: Sms
notes: Notas
sale: Lineas del pedido
dms: Gestión documental
volume: Volumen
observation: Notas
ticketAdvance: Adelantar tickets
futureTickets: Tickets a futuro
expedition: Expedición
purchaseRequest: Petición de compra
weeklyTickets: Tickets programados
saleTracking: Líneas preparadas
services: Servicios
tracking: Estados
components: Componentes
pictures: Fotos
packages: Embalajes
list:
nickname: Alias
state: Estado
shipped: Enviado
landed: Entregado
salesPerson: Comercial
total: Total
card:
ticketId: ID ticket
state: Estado
customerId: ID cliente
salesPerson: Comercial
agency: Agencia
shipped: Enviado
warehouse: Almacén
customerCard: Ficha del cliente
alias: Alias
ticketList: Listado de tickets
newOrder: Nuevo pedido
boxing:
expedition: Expedición
item: Artículo
created: Creado
worker: Trabajador
selectTime: 'Seleccionar hora:'
selectVideo: 'Seleccionar vídeo:'
notFound: No hay vídeos disponibles
summary:
state: Estado
salesPerson: Comercial
agency: Agencia
zone: Zona
warehouse: Almacén
collection: Colección
route: Ruta
invoice: Factura
shipped: Enviado
landed: Entregado
consigneePhone: Tel. consignatario
consigneeMobile: Móv. consignatario
consigneeAddress: Dir. consignatario
clientPhone: Tel. cliente
clientMobile: Móv. cliente
consignee: Consignatario
subtotal: Subtotal
vat: IVA
total: Total
saleLines: Líneas del pedido
item: Artículo
visible: Visible
available: Disponible
quantity: Cantidad
price: Precio
discount: Descuento
packing: Encajado
hasComponentLack: Faltan componentes
itemShortage: No visible
claim: Reclamación
reserved: Reservado
created: Fecha creación
package: Embalaje
taxClass: Tipo IVA
services: Servicios
requester: Solicitante
atender: Comprador
request: Petición de compra
weight: Peso
goTo: Ir a
summaryAmount: Resumen
purchaseRequest: Petición de compra
service: Servicio
description: Descripción
attender: Consignatario
create:
client: Cliente
address: Dirección
landed: F. entrega
warehouse: Almacén
agency: Agencia
invoiceOut:
list:
ref: Referencia
issued: Fecha emisión
shortIssued: F. emisión
client: Cliente
created: Fecha creación
shortCreated: F. creación
company: Empresa
dued: Fecha vencimineto
shortDued: F. vencimiento
amount: Importe
card:
issued: Fecha emisión
client: Cliente
company: Empresa
customerCard: Ficha del cliente
ticketList: Listado de tickets
summary:
issued: Fecha
created: Fecha creación
dued: Vencimiento
booked: Contabilizada
company: Empresa
taxBreakdown: Desglose impositivo
type: Tipo
taxableBase: Base imp.
rate: Tarifa
fee: Cuota
tickets: Tickets
ticketId: Id ticket
nickname: Alias
shipped: F. envío
totalWithVat: Importe
globalInvoices:
errors:
@ -629,20 +510,14 @@ invoiceOut:
noTicketsToInvoice: No existen tickets para facturar
criticalInvoiceError: Error crítico en la facturación proceso detenido
table:
client: Cliente
addressId: Id dirección
streetAddress: Dirección fiscal
statusCard:
percentageText: '{getPercentage}% {getAddressNumber} de {getNAddresses}'
pdfsNumberText: '{nPdfs} de {totalPdfs} PDFs'
negativeBases:
company: Empresa
country: País
clientId: Id cliente
client: Cliente
amount: Importe
base: Base
ticketId: Id ticket
active: Activo
hasToInvoice: Facturar
verifiedData: Datos comprobados
@ -652,79 +527,44 @@ invoiceOut:
order:
field:
salesPersonFk: Comercial
clientFk: Cliente
isConfirmed: Confirmada
created: Creado
landed: F. entrega
hour: Hora
agency: Agencia
total: Total
form:
clientFk: Cliente
addressFk: Dirección
landed: F. entrega
agencyModeFk: Agencia
list:
newOrder: Nuevo Pedido
summary:
basket: Cesta
nickname: Alias
company: Empresa
confirmed: Confirmada
notConfirmed: No confirmada
created: Creado
landed: F. entrega
phone: Teléfono
createdFrom: Creado desde
address: Dirección
notes: Notas
subtotal: Subtotal
total: Total
vat: IVA
state: Estado
alias: Alias
items: Items
items: Artículos
orderTicketList: Tickets del pedido
details: Detalles
item: Item
quantity: Cantidad
price: Precio
amount: Monto
confirm: Confirmar
confirmLines: Confirmar lineas
shelving:
list:
parking: Parking
priority: Prioridad
newShelving: Nuevo Carro
summary:
code: Código
parking: Parking
priority: Prioridad
worker: Trabajador
recyclable: Reciclable
basicData:
code: Código
parking: Parking
priority: Prioridad
recyclable: Reciclable
parking:
pickingOrder: Orden de recogida
row: Fila
column: Columna
pageTitles:
parking: Parking
searchBar:
info: Puedes buscar por código de parking
label: Buscar parking...
department:
pageTitles:
basicData: Basic data
department: Departamentos
summary: Resumen
name: Nombre
code: Código
chat: Chat
bossDepartment: Jefe de departamento
email: Email
selfConsumptionCustomer: Cliente autoconsumo
telework: Teletrabaja
notifyOnErrors: Notificar errores
@ -733,48 +573,11 @@ department:
hasToSendMail: Enviar fichadas por mail
departmentRemoved: Departamento eliminado
worker:
pageTitles:
workers: Trabajadores
list: Listado
basicData: Datos básicos
summary: Resumen
notifications: Notificaciones
workerCreate: Nuevo trabajador
department: Departamentos
pda: PDA
notes: Notas
dms: Mi documentación
pbx: Centralita
log: Historial
calendar: Calendario
timeControl: Control de horario
locker: Taquilla
balance: Balance
formation: Formación
medical: Mutua
operator: Operario
list:
name: Nombre
email: Email
phone: Teléfono
mobile: Móvil
active: Activo
department: Departamento
schedule: Horario
newWorker: Nuevo trabajador
card:
workerId: ID Trabajador
user: Usuario
name: Nombre
email: Correo personal
phone: Teléfono
mobile: Móvil
active: Activo
warehouse: Almacén
agency: Empresa
salesPerson: Comercial
summary:
basicData: Datos básicos
boss: Jefe
phoneExtension: Extensión de teléfono
entPhone: Teléfono de empresa
@ -797,19 +600,12 @@ worker:
serialNumber: Número de serie
removePDA: Desasignar PDA
create:
name: Nombre
lastName: Apellido
birth: Fecha de nacimiento
fi: DNI/NIF/NIE
code: Código de trabajador
phone: Teléfono
postcode: Código postal
province: Provincia
city: Población
street: Dirección
webUser: Usuario Web
personalEmail: Correo personal
company: Empresa
boss: Jefe
payMethods: Método de pago
iban: IBAN
@ -821,16 +617,13 @@ worker:
endDate: Fecha Fin
center: Centro Formación
invoice: Factura
amount: Importe
remark: Bonficado
hasDiploma: Diploma
medical:
tableVisibleColumns:
date: Fecha
time: Hora
center: Centro de Formación
invoice: Factura
amount: Importe
isFit: Apto
remark: Observaciones
imageNotFound: No se ha encontrado la imagen
@ -855,18 +648,7 @@ worker:
machine: Máquina
wagon:
pageTitles:
wagons: Vagones
wagonsList: Listado vagones
wagonCreate: Crear tipo
wagonEdit: Editar tipo
typesList: Listado tipos
typeCreate: Crear tipo
typeEdit: Editar tipo
wagonCounter: Contador de carros
wagonTray: Listado bandejas
type:
name: Nombre
submit: Guardar
reset: Deshacer cambios
trayColor: Color de la bandeja
@ -874,13 +656,9 @@ wagon:
list:
plate: Matrícula
volume: Volumen
type: Tipo
remove: Borrar
removeItem: Vagón borrado correctamente
create:
plate: Matrícula
volume: Volumen
type: Tipo
label: Etiqueta
warnings:
noData: Sin datos disponibles
@ -896,26 +674,16 @@ wagon:
supplier:
list:
payMethod: Método de pago
payDeadline: Plazo de pago
payDay: Día de pago
account: Cuenta
newSupplier: Nuevo proveedor
tableVisibleColumns:
id: Id
name: Nombre
nif: NIF/CIF
nickname: Alias
account: Cuenta
payMethod: Método de pago
payDay: Dia de pago
country: País
summary:
responsible: Responsable
notes: Notas
verified: Verificado
isActive: Está activo
billingData: Forma de pago
payMethod: Método de pago
payDeadline: Plazo de pago
payDay: Día de pago
account: Cuenta
@ -928,20 +696,17 @@ supplier:
fiscalAddress: Dirección fiscal
socialName: Razón social
taxNumber: NIF/CIF
street: Dirección
city: Población
postCode: Código postal
province: Provincia
country: País
create:
supplierName: Nombre del proveedor
basicData:
alias: Alias
workerFk: Responsable
isSerious: Verificado
isActive: Activo
isPayMethodChecked: Método de pago validado
note: Notas
size: Tamaño
fiscalData:
name: Razón social *
nif: NIF/CIF *
@ -950,36 +715,17 @@ supplier:
sageWithholdingFk: Retención sage
sageTransactionTypeFk: Tipo de transacción sage
supplierActivityFk: Actividad proveedor
healthRegister: Pasaporte sanitario
street: Calle
postcode: Código postal
city: Población *
provinceFk: Provincia
country: País
isTrucker: Transportista
isVies: Vies
billingData:
payMethodFk: Forma de pago
payDemFk: Plazo de pago
payDay: Día de pago
accounts:
iban: Iban
bankEntity: Entidad bancaria
beneficiary: Beneficiario
contacts:
name: Nombre
phone: Teléfono
mobile: Móvil
email: Email
observation: Notas
addresses:
street: Dirección
postcode: Código postal
phone: Teléfono
name: Nombre
city: Población
province: Provincia
mobile: Móvil
agencyTerms:
agencyFk: Agencia
minimumM3: M3 mínimos
@ -991,25 +737,16 @@ supplier:
addRow: Añadir fila
consumption:
entry: Entrada
date: Fecha
reference: Referencia
travel:
travelList:
tableVisibleColumns:
id: Id
ref: Referencia
agency: Agencia
shipped: F.envío
shipHour: Hora de envío
landHour: Hora de llegada
landed: F.entrega
warehouseIn: Alm.salida
warehouseOut: Alm.entrada
totalEntries:
totalEntriesTooltip: Entradas totales
daysOnward: Días de llegada en adelante
summary:
confirmed: Confirmado
entryId: Id entrada
freight: Porte
package: Embalaje
@ -1022,66 +759,30 @@ travel:
AddEntry: Añadir entrada
thermographs: Termógrafos
hb: HB
variables:
search: Id/Referencia
agencyModeFk: Agencia
warehouseInFk: Alm. entrada
warehouseOutFk: ' Alm. salida'
landedFrom: Llegada desde
landedTo: Llegada hasta
continent: Cont. Salida
totalEntries: Ent. totales
basicData:
reference: Referencia
agency: Agencia
shipped: F. Envío
landed: F. entrega
warehouseOut: Alm. salida
warehouseIn: Alm. entrada
delivered: Enviada
received: Recibida
daysInForward: Días redada
thermographs:
code: Código
temperature: Temperatura
state: Estado
destination: Destino
created: Fecha creación
thermograph: Termógrafo
reference: Referencia
type: Tipo
company: Empresa
warehouse: Almacén
travelFileDescription: 'Id envío { travelId }'
file: Fichero
item:
descriptor:
item: Artículo
buyer: Comprador
color: Color
category: Categoría
stems: Tallos
visible: Visible
available: Disponible
warehouseText: 'Calculado sobre el almacén de { warehouseName }'
itemDiary: Registro de compra-venta
producer: Productor
list:
id: Identificador
grouping: Grouping
packing: Packing
description: Descripción
stems: Tallos
category: Reino
typeName: Tipo
intrastat: Intrastat
isActive: Activo
size: Medida
origin: Origen
weightByPiece: Peso (gramos)/tallo
userName: Comprador
stemMultiplier: Multiplicador
producer: Productor
landed: F. entrega
fixedPrice:
itemFk: ID Artículo
groupingPrice: Precio grouping
@ -1090,79 +791,56 @@ item:
minPrice: Precio min
started: Inicio
ended: Fin
warehouse: Almacén
create:
name: Nombre
tag: Etiqueta
priority: Prioridad
type: Tipo
intrastat: Intrastat
origin: Origen
summary:
basicData: 'Datos básicos'
otherData: 'Otros datos'
description: 'Descripción'
tax: 'IVA'
tags: 'Etiquetas'
botanical: 'Botánico'
barcode: 'Código de barras'
name: 'Nombre'
completeName: 'Nombre completo'
family: 'Familia'
size: 'Medida'
origin: 'Origen'
stems: 'Tallos'
multiplier: 'Multiplicador'
buyer: 'Comprador'
doPhoto: 'Hacer foto'
intrastatCode: 'Código intrastat'
intrastat: 'Intrastat'
ref: 'Referencia'
relevance: 'Relevancia'
weight: 'Peso (gramos)/tallo'
units: 'Unidades/caja'
expense: 'Gasto'
generic: 'Genérico'
recycledPlastic: 'Plástico reciclado'
nonRecycledPlastic: 'Plástico no reciclado'
minSalesQuantity: 'Cantidad mínima de venta'
genus: 'Genus'
specie: 'Specie'
otherData: Otros datos
tax: IVA
botanical: Botánico
barcode: Código de barras
completeName: Nombre completo
family: Familia
stems: Tallos
multiplier: Multiplicador
buyer: Comprador
doPhoto: Hacer foto
intrastatCode: Código intrastat
ref: Referencia
relevance: Relevancia
weight: Peso (gramos)/tallo
units: Unidades/caja
expense: Gasto
generic: Genérico
recycledPlastic: Plástico reciclado
nonRecycledPlastic: Plástico no reciclado
minSalesQuantity: Cantidad mínima de venta
genus: Genus
specie: Specie
buyRequest:
ticketId: 'ID Ticket'
shipped: 'F. envío'
requester: 'Solicitante'
requested: 'Solicitado'
price: 'Precio'
attender: 'Comprador'
item: 'Artículo'
achieved: 'Conseguido'
concept: 'Concepto'
state: 'Estado'
requester: Solicitante
requested: Solicitado
attender: Comprador
achieved: Conseguido
concept: Concepto
components:
topbar: {}
itemsFilterPanel:
typeFk: Tipo
tag: Etiqueta
value: Valor
# ItemFixedPriceFilter
buyerFk: Comprador
warehouseFk: Almacén
started: Desde
ended: Hasta
mine: Para mi
hasMinPrice: Precio mínimo
# LatestBuysFilter
salesPersonFk: Comprador
supplierFk: Proveedor
active: Activo
visible: Visible
floramondo: Floramondo
showBadDates: Ver items a futuro
userPanel:
copyToken: Token copiado al portapapeles
settings: Configuración
logOut: Cerrar sesión
localWarehouse: Almacén local
localBank: Banco local
localCompany: Empresa local
@ -1170,7 +848,6 @@ components:
userCompany: Empresa del usuario
smartCard:
downloadFile: Descargar archivo
clone: Clonar
openCard: Ficha
openSummary: Detalles
viewSummary: Vista previa

View File

@ -1,7 +1,44 @@
<script setup>
import { useQuasar } from 'quasar';
import Navbar from 'src/components/NavBar.vue';
import { useRouter } from 'vue-router';
import routes from 'src/router/modules';
import { onMounted } from 'vue';
const quasar = useQuasar();
onMounted(() => {
let isNotified = false;
const router = useRouter();
const keyBindingMap = routes
.filter((route) => route.meta.keyBinding)
.reduce((map, route) => {
map['Key' + route.meta.keyBinding.toUpperCase()] = route.path;
return map;
}, {});
const handleKeyDown = (event) => {
const { ctrlKey, altKey, code } = event;
if (ctrlKey && altKey && keyBindingMap[code] && !isNotified) {
event.preventDefault();
router.push(keyBindingMap[code]);
isNotified = true;
}
};
const handleKeyUp = (event) => {
const { ctrlKey, altKey } = event;
if (!ctrlKey || !altKey) {
isNotified = false;
}
};
window.addEventListener('keydown', handleKeyDown);
window.addEventListener('keyup', handleKeyUp);
});
</script>
<template>

View File

@ -9,6 +9,8 @@ import { useQuasar } from 'quasar';
import VnTable from 'components/VnTable/VnTable.vue';
import VnSearchbar from 'components/ui/VnSearchbar.vue';
import VnConfirm from 'components/ui/VnConfirm.vue';
import FetchData from 'src/components/FetchData.vue';
import { useValidator } from 'src/composables/useValidator';
defineProps({
id: {
@ -23,11 +25,18 @@ const stateStore = useStateStore();
const quasar = useQuasar();
const tableRef = ref();
const roles = ref();
const validationsStore = useValidator();
const { models } = validationsStore;
const exprBuilder = (param, value) => {
switch (param) {
case 'search':
return { model: { like: `%${value}%` } };
return {
or: [
{ model: { like: `%${value}%` } },
{ property: { like: `%${value}%` } },
],
};
default:
return { [param]: value };
}
@ -47,6 +56,13 @@ const columns = computed(() => [
label: t('model'),
cardVisible: true,
create: true,
columnCreate: {
label: t('model'),
component: 'select',
attrs: {
options: Object.keys(models),
},
},
},
{
align: 'left',
@ -55,9 +71,10 @@ const columns = computed(() => [
cardVisible: true,
component: 'select',
attrs: {
url: 'VnRoles',
options: roles,
optionLabel: 'name',
optionValue: 'name',
inputDebounce: 0,
},
create: true,
},
@ -130,6 +147,11 @@ const deleteAcl = async ({ id }) => {
/>
<QDrawer v-model="stateStore.rightDrawer" side="right" :width="256" show-if-above>
</QDrawer>
<FetchData
url="VnRoles?fields=['name']"
auto-load
@on-fetch="(data) => (roles = data)"
/>
<VnTable
ref="tableRef"
data-key="AccountAcls"

View File

@ -37,7 +37,7 @@ const redirectToAccountBasicData = (_, { id }) => {
<div class="column q-gutter-sm">
<VnInput
v-model="data.name"
:label="t('account.create.name')"
:label="t('globals.name')"
:rules="validate('VnUser.name')"
/>
<VnInput
@ -47,12 +47,12 @@ const redirectToAccountBasicData = (_, { id }) => {
/>
<VnInput
v-model="data.email"
:label="t('account.create.email')"
:label="t('globals.params.email')"
type="email"
:rules="validate('VnUser.email')"
/>
<VnSelect
:label="t('account.create.role')"
:label="t('account.card.role')"
v-model="data.roleFk"
:options="rolesOptions"
option-value="id"
@ -63,7 +63,7 @@ const redirectToAccountBasicData = (_, { id }) => {
/>
<VnInput
v-model="data.password"
:label="t('account.create.password')"
:label="t('ldap.password')"
type="password"
:rules="validate('VnUser.password')"
/>

View File

@ -33,6 +33,7 @@ const rolesOptions = ref([]);
:search-button="true"
:hidden-tags="['search']"
:redirect="false"
search-url="table"
>
<template #tags="{ tag, formatFn }">
<div class="q-gutter-x-xs">
@ -44,7 +45,7 @@ const rolesOptions = ref([]);
<QItem class="q-my-sm">
<QItemSection>
<VnInput
:label="t('account.card.name')"
:label="t('globals.name')"
v-model="params.name"
lazy-rules
is-outlined

View File

@ -102,11 +102,11 @@ onMounted(async () => await getInitialLdapConfig());
<QBtn
class="q-ml-none"
color="primary"
:label="t('ldap.testConnection')"
:label="t('account.card.testConnection')"
@click="onTestConection()"
>
<QTooltip>
{{ t('ldap.testConnection') }}
{{ t('account.card.testConnection') }}
</QTooltip>
</QBtn>
</template>
@ -114,7 +114,7 @@ onMounted(async () => await getInitialLdapConfig());
<VnRow class="row q-gutter-md">
<div class="col">
<QCheckbox
:label="t('ldap.enableSync')"
:label="t('account.card.enableSync')"
v-model="data.hasData"
@update:model-value="($event) => (hasData = $event)"
:toggle-indeterminate="false"
@ -146,7 +146,7 @@ onMounted(async () => await getInitialLdapConfig());
/>
<VnInput :label="t('ldap.userDN')" clearable v-model="data.userDn" />
<VnInput
:label="t('ldap.groupDN')"
:label="t('account.card.groupDN')"
clearable
v-model="data.groupDn"
/>

View File

@ -74,7 +74,7 @@ const columns = computed(() => [
name: 'tableActions',
actions: [
{
title: t('View Summary'),
title: t('components.smartCard.viewSummary'),
icon: 'preview',
action: (row) => viewSummary(row.id, AccountSummary),
isPrimary: true,
@ -104,7 +104,7 @@ const exprBuilder = (param, value) => {
<template>
<VnSearchbar
data-key="AccountUsers"
data-key="AccountList"
:expr-builder="exprBuilder"
:label="t('account.search')"
:info="t('account.searchInfo')"
@ -112,12 +112,12 @@ const exprBuilder = (param, value) => {
/>
<RightMenu>
<template #right-panel>
<AccountFilter data-key="AccountUsers" />
<AccountFilter data-key="AccountList" />
</template>
</RightMenu>
<VnTable
ref="tableRef"
data-key="AccountUsers"
data-key="AccountList"
url="VnUsers/preview"
:filter="filter"
order="id DESC"

View File

@ -110,12 +110,12 @@ onMounted(async () => await getInitialSambaConfig());
<QBtn
class="q-ml-none"
color="primary"
:label="t('samba.testConnection')"
:label="t('account.card.testConnection')"
:disable="formModel.hasChanges"
@click="onTestConection()"
>
<QTooltip>
{{ t('samba.testConnection') }}
{{ t('account.card.testConnection') }}
</QTooltip>
</QBtn>
</template>
@ -123,7 +123,7 @@ onMounted(async () => await getInitialSambaConfig());
<VnRow class="row q-gutter-md">
<div class="col">
<QCheckbox
:label="t('samba.enableSync')"
:label="t('account.card.enableSync')"
v-model="data.hasData"
@update:model-value="($event) => (hasData = $event)"
:toggle-indeterminate="false"

View File

@ -36,15 +36,12 @@ const onDataSaved = ({ id }) => {
<template #form-inputs="{ data }">
<VnRow>
<div class="col">
<VnInput v-model="data.alias" :label="t('mailAlias.name')" />
<VnInput v-model="data.alias" :label="t('globals.name')" />
</div>
</VnRow>
<VnRow>
<div class="col">
<VnInput
v-model="data.description"
:label="t('mailAlias.description')"
/>
<VnInput v-model="data.description" :label="t('role.description')" />
</div>
</VnRow>
</template>

View File

@ -11,8 +11,8 @@ const { t } = useI18n();
<FormModel model="Alias">
<template #form="{ data }">
<div class="column q-gutter-y-md">
<VnInput v-model="data.alias" :label="t('mailAlias.name')" />
<VnInput v-model="data.description" :label="t('mailAlias.description')" />
<VnInput v-model="data.alias" :label="t('globals.name')" />
<VnInput v-model="data.description" :label="t('role.description')" />
<QCheckbox :label="t('mailAlias.isPublic')" v-model="data.isPublic" />
</div>
</template>

View File

@ -71,7 +71,7 @@ const removeAlias = () => {
</QItem>
</template>
<template #body="{ entity }">
<VnLv :label="t('mailAlias.description')" :value="entity.description" />
<VnLv :label="t('role.description')" :value="entity.description" />
</template>
</CardDescriptor>
</template>

View File

@ -42,8 +42,8 @@ const entityId = computed(() => $props.id || route.params.id);
<QIcon name="open_in_new" />
</router-link>
</QCardSection>
<VnLv :label="t('mailAlias.id')" :value="alias.id" />
<VnLv :label="t('mailAlias.description')" :value="alias.description" />
<VnLv :label="t('role.id')" :value="alias.id" />
<VnLv :label="t('role.description')" :value="alias.description" />
</QCard>
</template>
</CardSummary>

View File

@ -36,7 +36,7 @@ watch(
<div class="q-gutter-y-sm">
<VnInput v-model="data.name" :label="t('account.card.nickname')" />
<VnInput v-model="data.nickname" :label="t('account.card.alias')" />
<VnInput v-model="data.email" :label="t('account.card.email')" />
<VnInput v-model="data.email" :label="t('globals.params.email')" />
<VnSelect
url="Languages"
v-model="data.lang"

View File

@ -54,7 +54,7 @@ const hasAccount = ref(false);
</template>
<template #before>
<!-- falla id :id="entityId.value" collection="user" size="160x160" -->
<VnImg :id="entityId" collection="user" resolution="160x160" class="photo">
<VnImg :id="entityId" collection="user" resolution="520x520" class="photo">
<template #error>
<div
class="absolute-full picture text-center q-pa-md flex flex-center"

View File

@ -54,7 +54,7 @@ const columns = computed(() => [
name: 'tableActions',
actions: [
{
title: t('View Summary'),
title: t('components.smartCard.viewSummary'),
icon: 'preview',
action: (row) => viewSummary(row.id, RoleSummary),
isPrimary: true,
@ -82,14 +82,14 @@ const exprBuilder = (param, value) => {
<template>
<VnSearchbar
data-key="Roles"
data-key="AccountRolesList"
:expr-builder="exprBuilder"
:label="t('role.searchRoles')"
:info="t('role.searchInfo')"
/>
<VnTable
ref="tableRef"
data-key="Roles"
data-key="AccountRolesList"
:url="`VnRoles`"
:create="{
urlCreate: 'VnRoles',

View File

@ -29,7 +29,7 @@ const props = defineProps({
<QItem class="q-my-sm">
<QItemSection>
<VnInput
:label="t('role.name')"
:label="t('globals.name')"
v-model="params.name"
lazy-rules
is-outlined

View File

@ -12,15 +12,12 @@ const { t } = useI18n();
<template #form="{ data }">
<VnRow>
<div class="col">
<VnInput v-model="data.name" :label="t('role.card.name')" />
<VnInput v-model="data.name" :label="t('globals.name')" />
</div>
</VnRow>
<VnRow>
<div class="col">
<VnInput
v-model="data.description"
:label="t('role.card.description')"
/>
<VnInput v-model="data.description" :label="t('role.description')" />
</div>
</VnRow>
</template>

View File

@ -9,7 +9,7 @@ const { t } = useI18n();
<VnCard
data-key="Role"
:descriptor="RoleDescriptor"
search-data-key="AccountRoles"
search-data-key="AccountRolesList"
:searchbar-props="{
url: 'VnRoles',
label: t('role.searchRoles'),

View File

@ -58,7 +58,7 @@ const removeRole = async () => {
</QItem>
</template>
<template #body="{ entity }">
<VnLv :label="t('role.card.description')" :value="entity.description" />
<VnLv :label="t('role.description')" :value="entity.description" />
</template>
</CardDescriptor>
</template>

View File

@ -22,15 +22,12 @@ const { t } = useI18n();
<template #form-inputs="{ data }">
<VnRow>
<div class="col">
<VnInput v-model="data.name" :label="t('role.card.name')" />
<VnInput v-model="data.name" :label="t('globals.name')" />
</div>
</VnRow>
<VnRow>
<div class="col">
<VnInput
v-model="data.description"
:label="t('role.card.description')"
/>
<VnInput v-model="data.description" :label="t('role.description')" />
</div>
</VnRow>
</template>

View File

@ -44,9 +44,9 @@ const filter = {
<QIcon name="open_in_new" />
</a>
</QCardSection>
<VnLv :label="t('role.card.id')" :value="role.id" />
<VnLv :label="t('role.card.name')" :value="role.name" />
<VnLv :label="t('role.card.description')" :value="role.description" />
<VnLv :label="t('role.id')" :value="role.id" />
<VnLv :label="t('globals.name')" :value="role.name" />
<VnLv :label="t('role.description')" :value="role.description" />
</QCard>
</template>
</CardSummary>

View File

@ -1,32 +1,15 @@
account:
pageTitles:
users: Users
list: Users
roles: Roles
alias: Mail aliasses
accounts: Accounts
ldap: LDAP
samba: Samba
acls: ACLs
connections: Connections
inheritedRoles: Inherited Roles
subRoles: Sub Roles
newRole: New role
privileges: Privileges
mailAlias: Mail Alias
mailForwarding: Mail Forwarding
accountCreate: New user
aliasUsers: Users
card:
name: Name
nickname: User
role: Role
email: Email
alias: Alias
lang: Language
roleFk: Role
newUser: New user
ticketTracking: Ticket tracking
enableSync: Habilitar sincronización
groupDN: DN grupos
testConnection: Probar conexión
privileges:
delegate: Can delegate privileges
enabled: Account enabled!
@ -74,11 +57,7 @@ account:
search: Search user
searchInfo: You can search by id, name or nickname
create:
name: Name
nickname: Nickname
email: Email
role: Role
password: Password
active: Active
mailForwarding:
forwardingMail: Forward email
@ -86,50 +65,30 @@ account:
enableMailForwarding: Enable mail forwarding
mailInputInfo: All emails will be forwarded to the specified address.
role:
pageTitles:
inheritedRoles: Inherited Roles
subRoles: Sub Roles
card:
description: Description
id: Id
name: Name
newRole: New role
searchRoles: Search role
searchInfo: Search role by id or name
name: Name
description: Description
id: Id
mailAlias:
pageTitles:
aliasUsers: Users
search: Search mail alias
searchInfo: Search alias by id or name
alias: Alias
description: Description
id: Id
newAlias: New alias
name: Name
isPublic: Public
ldap:
enableSync: Enable synchronization
server: Server
rdn: RDN
userDN: User DN
filter: Filter
groupDN: Group DN
testConnection: Test connection
success: LDAP connection established!
password: Password
samba:
enableSync: Enable synchronization
domainController: Domain controller
domainAD: AD domain
userAD: AD user
groupDN: Group DN
passwordAD: AD password
domainPart: User DN (without domain part)
verifyCertificate: Verify certificate
testConnection: Test connection
success: Samba connection established!
accounts:
homedir: Homedir base
@ -147,8 +106,6 @@ connections:
created: Created
killSession: Kill session
acls:
role: Role
accessType: Access type
permissions: Permission
search: Search acls
searchInfo: Search acls by model name

View File

@ -1,27 +1,7 @@
account:
pageTitles:
users: Usuarios
list: Usuarios
roles: Roles
alias: Alias de correo
accounts: Cuentas
ldap: LDAP
samba: Samba
acls: ACLs
connections: Conexiones
inheritedRoles: Roles heredados
newRole: Nuevo rol
subRoles: Subroles
privileges: Privilegios
mailAlias: Alias de correo
mailForwarding: Reenvío de correo
accountCreate: Nuevo usuario
aliasUsers: Usuarios
card:
nickname: Usuario
name: Nombre
role: Rol
email: Mail
alias: Alias
lang: Idioma
roleFk: Rol
@ -33,6 +13,9 @@ account:
deactivated: ¡Usuario desactivado!
newUser: Nuevo usuario
twoFactor: Doble factor
enableSync: Habilitar sincronización
groupDN: DN grupos
testConnection: Probar conexión
privileges:
delegate: Puede delegar privilegios
actions:
@ -73,11 +56,7 @@ account:
search: Buscar usuario
searchInfo: Puedes buscar por id, nombre o usuario
create:
name: Nombre
nickname: Nombre mostrado
email: Email
role: Rol
password: Contraseña
active: Activo
mailForwarding:
forwardingMail: Dirección de reenvío
@ -85,51 +64,30 @@ account:
enableMailForwarding: Habilitar redirección de correo
mailInputInfo: Todos los correos serán reenviados a la dirección especificada, no se mantendrá copia de los mismos en el buzón del usuario.
role:
pageTitles:
inheritedRoles: Roles heredados
subRoles: Subroles
newRole: Nuevo rol
card:
description: Descripción
id: Id
name: Nombre
newRole: Nuevo rol
searchRoles: Buscar roles
searchInfo: Buscar rol por id o nombre
name: Nombre
description: Descripción
id: Id
mailAlias:
pageTitles:
aliasUsers: Usuarios
search: Buscar alias de correo
searchInfo: Buscar alias por id o nombre
alias: Alias
description: Descripción
id: Id
newAlias: Nuevo alias
name: Nombre
isPublic: Público
ldap:
password: Contraseña
enableSync: Habilitar sincronización
server: Servidor
rdn: RDN
userDN: DN usuarios
filter: Filtro
groupDN: DN grupos
testConnection: Probar conexión
success: ¡Conexión con LDAP establecida!
samba:
enableSync: Habilitar sincronización
domainController: Controlador de dominio
domainAD: Dominio AD
groupDN: DN grupos
userAD: Usuario AD
passwordAD: Contraseña AD
domainPart: DN usuarios (sin la parte del dominio)
verifyCertificate: Verificar certificado
testConnection: Probar conexión
success: ¡Conexión con Samba establecida!
accounts:
homedir: Directorio base para carpetas de usuario
@ -147,8 +105,6 @@ connections:
created: Creado
killSession: Matar sesión
acls:
role: Rol
accessType: Tipo de acceso
permissions: Permiso
search: Buscar acls
searchInfo: Buscar acls por nombre

View File

@ -23,7 +23,7 @@ defineExpose({ states });
<template>
<FetchData url="ClaimStates" @on-fetch="(data) => (states = data)" auto-load />
<VnFilterPanel :data-key="props.dataKey" :search-button="true" search-url="table">
<VnFilterPanel :data-key="props.dataKey" :search-button="true">
<template #tags="{ tag, formatFn }">
<div class="q-gutter-x-xs">
<strong>{{ t(`params.${tag.label}`) }}: </strong>

View File

@ -27,7 +27,7 @@ const addressFilter = {
'isLogifloraAllowed',
'postalCode',
],
order: ['isDefaultAddress DESC', 'isActive DESC', 'nickname ASC'],
order: ['isDefaultAddress DESC', 'isActive DESC', 'id DESC', 'nickname ASC'],
include: [
{
relation: 'observations',

View File

@ -5,7 +5,7 @@ import { useRoute } from 'vue-router';
import { useAcl } from 'src/composables/useAcl';
import axios from 'axios';
import { useQuasar } from 'quasar';
import FetchData from 'components/FetchData.vue';
import { getClientRisk } from '../composables/getClientRisk';
import { toCurrency, toDate, toDateHourMin } from 'src/filters';
import { useState } from 'composables/useState';
@ -16,7 +16,7 @@ import { useVnConfirm } from 'composables/useVnConfirm';
import VnTable from 'components/VnTable/VnTable.vue';
import VnInput from 'components/common/VnInput.vue';
import VnSubToolbar from 'components/ui/VnSubToolbar.vue';
import VnSelect from 'src/components/common/VnSelect.vue';
import VnFilter from 'components/VnTable/VnFilter.vue';
import CustomerNewPayment from 'src/pages/Customer/components/CustomerNewPayment.vue';
import InvoiceOutDescriptorProxy from 'src/pages/InvoiceOut/Card/InvoiceOutDescriptorProxy.vue';
@ -25,7 +25,7 @@ const { openConfirmationModal } = useVnConfirm();
const { sendEmail, openReport } = usePrintService();
const { t } = useI18n();
const { hasAny } = useAcl();
const currentBalance = ref({});
const quasar = useQuasar();
const route = useRoute();
const state = useState();
@ -33,28 +33,53 @@ const stateStore = useStateStore();
const user = state.getUser();
const clientRisk = ref([]);
const companies = ref([]);
const tableRef = ref();
const companyId = ref(user.value.companyFk);
const companyId = ref();
const companyUser = ref(user.value.companyFk);
const balances = ref([]);
const vnFilterRef = ref({});
const filter = computed(() => {
return {
clientId: route.params.id,
companyId: companyId.value ?? user.value.companyFk,
companyId: companyId.value ?? companyUser.value,
};
});
const companyFilterColumn = {
align: 'left',
name: 'companyId',
label: t('Company'),
component: 'select',
attrs: {
url: 'Companies',
optionLabel: 'code',
optionValue: 'id',
sortBy: 'code',
},
columnFilter: {
event: {
remove: () => (companyId.value = null),
'update:modelValue': (newCompanyFk) => {
if (!newCompanyFk) return;
vnFilterRef.value.addFilter(newCompanyFk);
companyUser.value = newCompanyFk;
},
blur: () => !companyId.value && (companyId.value = companyUser.value),
},
},
visible: false,
};
const columns = computed(() => [
{
align: 'right',
align: 'left',
name: 'payed',
label: t('Date'),
format: ({ payed }) => toDate(payed),
cardVisible: true,
},
{
align: 'right',
align: 'left',
name: 'created',
label: t('Creation date'),
format: ({ created }) => toDateHourMin(created),
@ -65,7 +90,12 @@ const columns = computed(() => [
label: t('Employee'),
columnField: {
component: 'userLink',
attrs: ({ row }) => ({ workerId: row.workerFk, name: row.userName }),
attrs: ({ row }) => {
return {
workerId: row.workerFk,
name: row.userName,
};
},
},
cardVisible: true,
},
@ -77,13 +107,13 @@ const columns = computed(() => [
class: 'extend',
},
{
align: 'right',
align: 'left',
name: 'bankFk',
label: t('Bank'),
cardVisible: true,
},
{
align: 'right',
align: 'left',
name: 'debit',
label: t('Debit'),
format: ({ debit }) => debit && toCurrency(debit),
@ -136,20 +166,37 @@ const columns = computed(() => [
onBeforeMount(() => {
stateStore.rightDrawer = true;
companyId.value = companyUser.value;
});
async function getCurrentBalance(data) {
currentBalance.value[companyId.value] = {
amount: 0,
code: companies.value.find((c) => c.id === companyId.value)?.code,
async function getClientRisks() {
const filter = {
where: { clientFk: route.params.id, companyFk: companyUser.value },
};
const { data } = await getClientRisk(filter);
clientRisk.value = data;
return clientRisk.value;
}
for (const balance of data) {
currentBalance.value[balance.companyFk] = {
code: balance.company.code,
amount: balance.amount,
};
async function getCurrentBalance() {
const currentBalance = (await getClientRisks()).find((balance) => {
return balance.companyFk === companyId.value;
});
return currentBalance && currentBalance.amount;
}
async function onFetch(data) {
balances.value = [];
for (const [index, balance] of data.entries()) {
if (index === 0) {
balance.balance = await getCurrentBalance();
continue;
}
const previousBalance = data[index - 1];
balance.balance =
previousBalance?.balance - (previousBalance?.debit - previousBalance?.credit);
}
balances.value = data;
}
const showNewPaymentDialog = () => {
@ -169,43 +216,25 @@ const showBalancePdf = ({ id }) => {
</script>
<template>
<FetchData
url="Companies"
auto-load
@on-fetch="(data) => (companies = data)"
></FetchData>
<FetchData
v-if="companies.length > 0"
url="clientRisks"
:filter="{
include: { relation: 'company', scope: { fields: ['code'] } },
where: { clientFk: route.params.id },
}"
auto-load
@on-fetch="getCurrentBalance"
></FetchData>
<VnSubToolbar class="q-mb-md">
<template #st-data>
<div class="column justify-center q-px-md q-py-sm">
<span class="text-bold">{{ t('Total by company') }}</span>
<div class="row justify-center">
{{ currentBalance[companyId]?.code }}:
{{ toCurrency(currentBalance[companyId]?.amount) }}
<div class="row justify-center" v-if="clientRisk?.length">
{{ clientRisk[0].company.code }}:
{{ toCurrency(clientRisk[0].amount) }}
</div>
</div>
</template>
<template #st-actions>
<div>
<VnSelect
:label="t('Company')"
<VnFilter
ref="vnFilterRef"
v-model="companyId"
data-key="CustomerBalance"
:options="companies"
option-label="code"
option-value="id"
></VnSelect>
:column="companyFilterColumn"
search-url="balance"
/>
</div>
</template>
</VnSubToolbar>
@ -219,6 +248,7 @@ const showBalancePdf = ({ id }) => {
:right-search="false"
:is-editable="false"
:column-search="false"
@on-fetch="onFetch"
:disable-option="{ card: true }"
auto-load
>

View File

@ -55,7 +55,7 @@ const exprBuilder = (param, value) => {
/>
<VnSelect
:input-debounce="0"
:label="t('customer.basicData.businessType')"
:label="t('customer.summary.businessType')"
:options="businessTypes"
:rules="validate('client.businessTypeFk')"
emit-value
@ -67,13 +67,13 @@ const exprBuilder = (param, value) => {
</VnRow>
<VnRow>
<VnInput
:label="t('customer.basicData.contact')"
:label="t('customer.summary.contact')"
:rules="validate('client.contact')"
clearable
v-model="data.contact"
/>
<VnInput
:label="t('customer.basicData.email')"
:label="t('globals.params.email')"
:rules="validate('client.email')"
clearable
type="email"
@ -90,13 +90,13 @@ const exprBuilder = (param, value) => {
</VnRow>
<VnRow>
<VnInput
:label="t('customer.basicData.phone')"
:label="t('customer.extendedList.tableVisibleColumns.phone')"
:rules="validate('client.phone')"
clearable
v-model="data.phone"
/>
<VnInput
:label="t('customer.basicData.mobile')"
:label="t('customer.summary.mobile')"
:rules="validate('client.mobile')"
clearable
v-model="data.mobile"
@ -106,7 +106,7 @@ const exprBuilder = (param, value) => {
<VnSelect
url="Workers/search"
v-model="data.salesPersonFk"
:label="t('customer.basicData.salesPerson')"
:label="t('customer.summary.salesPerson')"
:params="{
departmentCodes: ['VT', 'shopping'],
}"
@ -144,7 +144,7 @@ const exprBuilder = (param, value) => {
option-value="id"
option-label="name"
emit-value
:label="t('customer.basicData.contactChannel')"
:label="t('customer.summary.contactChannel')"
map-options
:rules="validate('client.contactChannelFk')"
:input-debounce="0"

View File

@ -49,7 +49,9 @@ const columns = computed(() => [
name: 'credit',
create: true,
visible: false,
attrs: {
columnCreate: {
component: 'number',
required: true,
autofocus: true,
},
},

View File

@ -37,6 +37,9 @@ const entityId = computed(() => {
const data = ref(useCardDescription());
const setData = (entity) => (data.value = useCardDescription(entity?.name, entity?.id));
const debtWarning = computed(() => {
return customer.value?.debt > customer.value?.credit ? 'negative' : 'primary';
});
</script>
<template>
@ -53,11 +56,17 @@ const setData = (entity) => (data.value = useCardDescription(entity?.name, entit
<CustomerDescriptorMenu :customer="entity" />
</template>
<template #body="{ entity }">
<VnLv :label="t('customer.card.payMethod')" :value="entity.payMethod.name" />
<VnLv :label="t('customer.card.credit')" :value="toCurrency(entity.credit)" />
<VnLv
:label="t('customer.card.securedCredit')"
:label="t('customer.summary.payMethod')"
:value="entity.payMethod.name"
/>
<VnLv
:label="t('customer.summary.credit')"
:value="toCurrency(entity.credit)"
/>
<VnLv
:label="t('customer.summary.securedCredit')"
:value="toCurrency(entity.creditInsurance)"
/>
@ -66,7 +75,7 @@ const setData = (entity) => (data.value = useCardDescription(entity?.name, entit
:value="toCurrency(entity.debt)"
:info="t('customer.summary.riskInfo')"
/>
<VnLv :label="t('customer.card.salesPerson')">
<VnLv :label="t('customer.summary.salesPerson')">
<template #value>
<VnUserLink
v-if="entity.salesPersonUser"
@ -77,7 +86,7 @@ const setData = (entity) => (data.value = useCardDescription(entity?.name, entit
</template>
</VnLv>
<VnLv
:label="t('customer.card.businessTypeFk')"
:label="t('customer.extendedList.tableVisibleColumns.businessTypeFk')"
:value="entity.businessType.description"
/>
</template>
@ -111,7 +120,7 @@ const setData = (entity) => (data.value = useCardDescription(entity?.name, entit
v-if="customer.debt > customer.credit"
name="vn:risk"
size="xs"
color="primary"
:color="debtWarning"
>
<QTooltip>{{ t('customer.card.hasDebt') }}</QTooltip>
</QIcon>
@ -150,7 +159,7 @@ const setData = (entity) => (data.value = useCardDescription(entity?.name, entit
</QCardActions>
</template>
<template #actions="{ entity }">
<QCardActions class="flex justify-center">
<QCardActions class="flex justify-center" style="padding-inline: 0">
<QBtn
:to="{
name: 'TicketList',
@ -215,6 +224,8 @@ es:
Go to module index: Ir al índice del módulo
Customer ticket list: Listado de tickets del cliente
Customer invoice out list: Listado de facturas del cliente
New order: Nuevo pedido
New ticket: Nuevo ticket
Go to user: Ir al usuario
Go to supplier: Ir al proveedor
Customer unpaid: Cliente impago

View File

@ -6,11 +6,8 @@ import axios from 'axios';
import { useQuasar } from 'quasar';
import useNotify from 'src/composables/useNotify';
import VnSmsDialog from 'src/components/common/VnSmsDialog.vue';
import TicketCreateDialog from 'src/pages/Ticket/TicketCreateDialog.vue';
import OrderCreateDialog from 'src/pages/Order/Card/OrderCreateDialog.vue';
import { ref } from 'vue';
import useOpenURL from 'src/composables/useOpenURL';
const $props = defineProps({
customer: {
@ -18,7 +15,6 @@ const $props = defineProps({
required: true,
},
});
const { notify } = useNotify();
const { t } = useI18n();
const quasar = useQuasar();
@ -28,7 +24,7 @@ const showSmsDialog = () => {
quasar.dialog({
component: VnSmsDialog,
componentProps: {
phone: $props.customer.phone || $props.customer.mobile,
phone: $props.customer.mobile || $props.customer.phone,
promise: sendSms,
},
});
@ -44,31 +40,39 @@ const sendSms = async (payload) => {
}
};
const ticketCreateFormDialog = ref(null);
const openTicketCreateForm = () => {
ticketCreateFormDialog.value.show();
};
const orderCreateFormDialog = ref(null);
const openOrderCreateForm = () => {
orderCreateFormDialog.value.show();
const openCreateForm = (type) => {
const query = {
table: {
clientFk: $props.customer.id,
},
createForm: {
addressId: $props.customer.defaultAddressFk,
},
};
const clientFk = {
ticket: 'clientId',
order: 'clientFk',
};
const key = clientFk[type];
if (!key) return;
query.createForm[key] = $props.customer.id;
const params = Object.entries(query)
.map(([key, value]) => `${key}=${JSON.stringify(value)}`)
.join('&');
useOpenURL(`/#/${type}/list?${params}`);
};
</script>
<template>
<QItem v-ripple clickable @click="openTicketCreateForm()">
<QItem v-ripple clickable @click="openCreateForm('ticket')">
<QItemSection>
{{ t('globals.pageTitles.createTicket') }}
<QDialog ref="ticketCreateFormDialog">
<TicketCreateDialog />
</QDialog>
</QItemSection>
</QItem>
<QItem v-ripple clickable @click="openOrderCreateForm()">
<QItem v-ripple clickable @click="openCreateForm('order')">
<QItemSection>
{{ t('globals.pageTitles.createOrder') }}
<QDialog ref="orderCreateFormDialog">
<OrderCreateDialog :client-fk="customer.id" />
</QDialog>
</QItemSection>
</QItem>
<QItem v-ripple clickable>

View File

@ -53,11 +53,11 @@ function handleLocation(data, location) {
</QIcon>
</template>
</VnInput>
<VnInput :label="t('Tax number')" clearable v-model="data.fi" />
<VnInput :label="t('Tax number')" clearable v-model="data.fi" required />
</VnRow>
<VnRow>
<VnInput :label="t('Street')" clearable v-model="data.street" />
<VnInput :label="t('Street')" clearable v-model="data.street" required />
</VnRow>
<VnRow>
@ -68,6 +68,7 @@ function handleLocation(data, location) {
option-label="vat"
option-value="id"
v-model="data.sageTaxTypeFk"
:required="data.isTaxDataChecked"
/>
<VnSelect
:label="t('Sage transaction type')"
@ -76,6 +77,7 @@ function handleLocation(data, location) {
option-label="transaction"
option-value="id"
v-model="data.sageTransactionTypeFk"
:required="data.isTaxDataChecked"
>
<template #option="scope">
<QItem v-bind="scope.itemProps">
@ -96,6 +98,7 @@ function handleLocation(data, location) {
:roles-allowed-to-create="['deliveryAssistant', 'administrative']"
:acls="[{ model: 'Town', props: '*', accessType: 'WRITE' }]"
:location="data"
:required="true"
@update:model-value="(location) => handleLocation(data, location)"
/>
</VnRow>

View File

@ -80,6 +80,11 @@ const columns = computed(() => [
align: 'left',
name: 'amount',
label: t('Amount'),
columnCreate: {
component: 'number',
autofocus: true,
required: true,
},
format: ({ amount }) => toCurrency(amount),
create: true,
},

View File

@ -56,6 +56,7 @@ const columns = computed(() => [
label: t('Period'),
create: true,
...componentColumn('number'),
required: true,
},
{
align: 'left',

View File

@ -1,13 +1,15 @@
<script setup>
import { computed, ref } from 'vue';
import { computed, ref, onMounted } from 'vue';
import { useRoute } from 'vue-router';
import { useI18n } from 'vue-i18n';
import VnUserLink from 'src/components/ui/VnUserLink.vue';
import { toCurrency, toPercentage, toDate } from 'src/filters';
import { toCurrency, toPercentage, toDate, dashOrCurrency } from 'src/filters';
import CardSummary from 'components/ui/CardSummary.vue';
import { getUrl } from 'src/composables/getUrl';
import VnLv from 'src/components/ui/VnLv.vue';
import VnLinkPhone from 'src/components/ui/VnLinkPhone.vue';
import VnLinkMail from 'src/components/ui/VnLinkMail.vue';
import CustomerSummaryTable from 'src/pages/Customer/components/CustomerSummaryTable.vue';
import VnTitle from 'src/components/common/VnTitle.vue';
import VnRow from 'src/components/ui/VnRow.vue';
@ -25,16 +27,16 @@ const $props = defineProps({
const entityId = computed(() => $props.id || route.params.id);
const customer = computed(() => summary.value.entity);
const summary = ref();
const defaulterAmount = computed(() => customer.value.defaulters[0]?.amount);
const balanceDue = computed(() => {
return (
customer.value &&
customer.value.defaulters.length &&
customer.value.defaulters[0].amount
);
const amount = defaulterAmount.value;
if (!amount || amount < 0) {
return null;
}
return amount;
});
const balanceDueWarning = computed(() => (balanceDue.value ? 'negative' : ''));
const balanceDueWarning = computed(() => (defaulterAmount.value ? 'negative' : ''));
const claimRate = computed(() => {
return customer.value.claimsRatio?.claimingRate ?? 0;
@ -67,6 +69,7 @@ const sumRisk = ({ clientRisks }) => {
ref="summary"
:url="`Clients/${entityId}/summary`"
data-key="CustomerSummary"
module-name="Customer"
>
<template #body="{ entity }">
<QCard class="vn-one">
@ -79,7 +82,7 @@ const sumRisk = ({ clientRisks }) => {
<VnLv :label="t('customer.summary.contact')" :value="entity.contact" />
<VnLv :value="entity.phone">
<template #label>
{{ t('customer.summary.phone') }}
{{ t('customer.extendedList.tableVisibleColumns.phone') }}
<VnLinkPhone :phone-number="entity.phone" />
</template>
</VnLv>
@ -87,9 +90,19 @@ const sumRisk = ({ clientRisks }) => {
<template #label>
{{ t('customer.summary.mobile') }}
<VnLinkPhone :phone-number="entity.mobile" />
<VnLinkPhone
say-simple
:phone-number="entity.mobile"
:channel="entity.country?.saySimpleCountry?.channel"
class="q-ml-xs"
/>
</template>
</VnLv>
<VnLv :label="t('customer.summary.email')" :value="entity.email" copy />
<VnLv :value="entity.email" copy
><template #label>
{{ t('globals.params.email') }}
<VnLinkMail email="entity.email"></VnLinkMail> </template
></VnLv>
<VnLv
:label="t('customer.summary.salesPerson')"
:value="entity?.salesPersonUser?.name"
@ -130,7 +143,7 @@ const sumRisk = ({ clientRisks }) => {
<VnLv
v-if="entity.country"
:label="t('customer.summary.country')"
:value="entity.country.country"
:value="entity.country.name"
/>
<VnLv :label="t('customer.summary.street')" :value="entity.street" />
</QCard>
@ -166,7 +179,7 @@ const sumRisk = ({ clientRisks }) => {
<QCard class="vn-one">
<VnTitle
:url="`#/customer/${entityId}/billing-data`"
:text="t('customer.summary.payMethodFk')"
:text="t('customer.summary.billingData')"
/>
<VnLv
:label="t('customer.summary.payMethod')"
@ -201,7 +214,7 @@ const sumRisk = ({ clientRisks }) => {
:value="entity.defaultAddress.city"
/>
<VnLv
:label="t('customer.summary.addressStreet')"
:label="t('customer.summary.street')"
:value="entity.defaultAddress.street"
/>
</QCard>
@ -222,6 +235,7 @@ const sumRisk = ({ clientRisks }) => {
</QCard>
<QCard class="vn-one" v-if="entity.account">
<VnTitle
target="_blank"
:url="`${grafanaUrl}/d/adjlxzv5yjt34d/analisis-de-clientes-7c-crm?orgId=1&var-clientFk=${entityId}`"
:text="t('customer.summary.businessData')"
icon="vn:grafana"
@ -235,6 +249,7 @@ const sumRisk = ({ clientRisks }) => {
:value="toCurrency(entity?.mana?.mana)"
/>
<VnLv
v-if="entity.claimsRatio"
:label="t('customer.summary.priceIncreasingRate')"
:value="toPercentage(priceIncreasingRate)"
/>
@ -243,12 +258,14 @@ const sumRisk = ({ clientRisks }) => {
:value="toCurrency(entity?.averageInvoiced?.invoiced)"
/>
<VnLv
v-if="entity.claimsRatio"
:label="t('customer.summary.claimRate')"
:value="toPercentage(claimRate)"
/>
</QCard>
<QCard class="vn-one" v-if="entity.account">
<VnTitle
target="_blank"
:url="`${grafanaUrl}/d/40buzE4Vk/comportamiento-pagos-clientes?orgId=1&var-clientFk=${entityId}`"
:text="t('customer.summary.payMethodFk')"
icon="vn:grafana"
@ -268,10 +285,12 @@ const sumRisk = ({ clientRisks }) => {
/>
<VnLv
v-if="entity.creditInsurance"
:label="t('customer.summary.securedCredit')"
:value="toCurrency(entity.creditInsurance)"
:info="t('customer.summary.securedCreditInfo')"
/>
<VnLv
:label="t('customer.summary.balance')"
:value="toCurrency(sumRisk(entity)) || toCurrency(0)"
@ -281,7 +300,7 @@ const sumRisk = ({ clientRisks }) => {
<VnLv
v-if="entity.defaulters"
:label="t('customer.summary.balanceDue')"
:value="toCurrency(balanceDue)"
:value="dashOrCurrency(balanceDue)()"
:class="balanceDueWarning"
:info="t('customer.summary.balanceDueInfo')"
/>
@ -301,7 +320,7 @@ const sumRisk = ({ clientRisks }) => {
:value="entity.recommendedCredit"
/>
</QCard>
<QCard>
<QCard class="vn-one">
<VnTitle :text="t('Latest tickets')" />
<CustomerSummaryTable />
</QCard>

View File

@ -2,10 +2,9 @@
import { computed, onBeforeMount, ref, watch, nextTick } from 'vue';
import { useI18n } from 'vue-i18n';
import { useRoute } from 'vue-router';
import VnInputDate from 'components/common/VnInputDate.vue';
import VnInput from 'src/components/common/VnInput.vue';
import VnRow from 'components/ui/VnRow.vue';
import axios from 'axios';
import useNotify from 'src/composables/useNotify';
import { useStateStore } from 'stores/useStateStore';

View File

@ -11,10 +11,24 @@ defineProps({
required: true,
},
});
const handleSalesModelValue = (val) => ({
or: [
{ id: val },
{ name: val },
{ nickname: { like: '%' + val + '%' } },
{ code: { like: `${val}%` } },
],
});
const exprBuilder = (param, value) => {
return {
and: [{ active: { neq: false } }, handleSalesModelValue(value)],
};
};
</script>
<template>
<VnFilterPanel :data-key="dataKey" :search-button="true" search-url="table">
<VnFilterPanel :data-key="dataKey" :search-button="true">
<template #tags="{ tag, formatFn }">
<div class="q-gutter-x-xs">
<strong>{{ t(`params.${tag.label}`) }}: </strong>
@ -34,7 +48,7 @@ defineProps({
<QItem class="q-mb-sm">
<QItemSection>
<VnInput
:label="t('customerFilter.filter.name')"
:label="t('globals.name')"
v-model="params.name"
is-outlined
/>
@ -43,7 +57,7 @@ defineProps({
<QItem class="q-mb-sm">
<QItemSection>
<VnInput
:label="t('customerFilter.filter.socialName')"
:label="t('customer.summary.socialName')"
v-model="params.socialName"
is-outlined
/>
@ -52,14 +66,18 @@ defineProps({
<QItem class="q-mb-sm">
<QItemSection>
<VnSelect
url="Workers/activeWithInheritedRole"
:filter="{ where: { role: 'salesPerson' } }"
url="Workers/search"
:params="{
departmentCodes: ['VT'],
}"
auto-load
:label="t('Salesperson')"
:expr-builder="exprBuilder"
v-model="params.salesPersonFk"
@update:model-value="searchFn()"
option-value="id"
option-label="name"
sort-by="nickname ASC"
emit-value
map-options
use-input
@ -68,7 +86,18 @@ defineProps({
outlined
rounded
:input-debounce="0"
/>
>
<template #option="{ itemProps, opt }">
<QItem v-bind="itemProps">
<QItemSection>
<QItemLabel>{{ opt.name }}</QItemLabel>
<QItemLabel caption>
{{ opt.nickname }},{{ opt.code }}
</QItemLabel>
</QItemSection>
</QItem>
</template></VnSelect
>
</QItemSection>
</QItem>
<QItem class="q-mb-sm">

View File

@ -68,7 +68,6 @@ const columns = computed(() => [
fields: ['id', 'name'],
where: { role: 'salesPerson' },
optionFilter: 'firstName',
useLike: false,
},
create: false,
columnField: {
@ -78,7 +77,7 @@ const columns = computed(() => [
},
{
align: 'left',
label: t('customer.extendedList.tableVisibleColumns.credit'),
label: t('customer.summary.credit'),
name: 'credit',
columnFilter: {
component: 'number',
@ -116,7 +115,7 @@ const columns = computed(() => [
},
{
align: 'left',
label: t('customer.extendedList.tableVisibleColumns.mobile'),
label: t('customer.summary.mobile'),
name: 'mobile',
cardVisible: true,
columnFilter: {
@ -163,17 +162,17 @@ const columns = computed(() => [
},
{
align: 'left',
label: t('customer.extendedList.tableVisibleColumns.city'),
label: t('customer.summary.city'),
name: 'city',
},
{
align: 'left',
label: t('customer.extendedList.tableVisibleColumns.postcode'),
label: t('customer.summary.postcode'),
name: 'postcode',
},
{
align: 'left',
label: t('customer.extendedList.tableVisibleColumns.email'),
label: t('globals.params.email'),
name: 'email',
cardVisible: true,
},
@ -208,7 +207,7 @@ const columns = computed(() => [
},
{
align: 'left',
label: t('customer.extendedList.tableVisibleColumns.payMethodFk'),
label: t('customer.summary.payMethodFk'),
name: 'payMethodFk',
columnFilter: {
component: 'select',
@ -251,7 +250,7 @@ const columns = computed(() => [
},
{
align: 'left',
label: t('customer.extendedList.tableVisibleColumns.isActive'),
label: t('customer.summary.isActive'),
name: 'isActive',
chip: {
color: null,
@ -280,7 +279,7 @@ const columns = computed(() => [
},
{
align: 'left',
label: t('customer.extendedList.tableVisibleColumns.isEqualizated'),
label: t('customer.summary.isEqualizated'),
name: 'isEqualizated',
create: true,
columnFilter: {
@ -326,7 +325,7 @@ const columns = computed(() => [
},
{
align: 'left',
label: t('customer.extendedList.tableVisibleColumns.hasLcr'),
label: t('customer.summary.hasLcr'),
name: 'hasLcr',
columnFilter: {
inWhere: true,
@ -334,7 +333,7 @@ const columns = computed(() => [
},
{
align: 'left',
label: t('customer.extendedList.tableVisibleColumns.hasCoreVnl'),
label: t('customer.summary.hasCoreVnl'),
name: 'hasCoreVnl',
columnFilter: {
inWhere: true,
@ -395,16 +394,16 @@ function handleLocation(data, location) {
<VnSearchbar
:info="t('You can search by customer id or name')"
:label="t('Search customer')"
data-key="Customer"
data-key="CustomerList"
/>
<RightMenu>
<template #right-panel>
<CustomerFilter data-key="Customer" />
<CustomerFilter data-key="CustomerList" />
</template>
</RightMenu>
<VnTable
ref="tableRef"
data-key="Customer"
data-key="CustomerList"
url="Clients/filter"
:create="{
urlCreate: 'Clients/createWithUser',
@ -425,13 +424,14 @@ function handleLocation(data, location) {
<VnSelect
url="Workers/search"
v-model="data.salesPersonFk"
:label="t('customer.basicData.salesPerson')"
:label="t('customer.summary.salesPerson')"
:params="{
departmentCodes: ['VT', 'shopping'],
}"
:fields="['id', 'nickname']"
:fields="['id', 'nickname', 'code']"
sort-by="nickname ASC"
:use-like="false"
option-label="nickname"
option-value="id"
emit-value
auto-load
>

View File

@ -85,15 +85,26 @@ function handleLocation(data, location) {
<QCheckbox :label="t('Default')" v-model="data.isDefaultAddress" />
<VnRow>
<VnInput :label="t('Consignee')" clearable v-model="data.nickname" />
<VnInput
:label="t('Consignee')"
required
clearable
v-model="data.nickname"
/>
<VnInput :label="t('Street address')" clearable v-model="data.street" />
<VnInput
:label="t('Street address')"
clearable
v-model="data.street"
required
/>
</VnRow>
<VnLocation
:rules="validate('Worker.postcode')"
:acls="[{ model: 'Town', props: '*', accessType: 'WRITE' }]"
v-model="data.location"
:required="true"
@update:model-value="(location) => handleLocation(data, location)"
/>

View File

@ -23,6 +23,7 @@ const incoterms = ref([]);
const customsAgents = ref([]);
const observationTypes = ref([]);
const notes = ref([]);
let originalNotes = [];
const deletes = ref([]);
onBeforeMount(() => {
@ -42,7 +43,8 @@ const getData = async (observations) => {
});
if (data.length) {
notes.value = data
originalNotes = data;
notes.value = originalNotes
.map((observation) => {
const type = observationTypes.value.find(
(type) => type.id === observation.observationTypeFk
@ -81,14 +83,24 @@ const deleteNote = (id, index) => {
};
const onDataSaved = async () => {
let payload = {};
const creates = notes.value.filter((note) => note.$isNew);
if (creates.length) {
payload.creates = creates;
}
if (deletes.value.length) {
payload.deletes = deletes.value;
}
let payload = {
creates: notes.value.filter((note) => note.$isNew),
deletes: deletes.value,
updates: notes.value
.filter((note) =>
originalNotes.some(
(oNote) =>
oNote.id === note.id &&
(note.description !== oNote.description ||
note.observationTypeFk !== oNote.observationTypeFk)
)
)
.map((note) => ({
data: note,
where: { id: note.id },
})),
};
await axios.post('AddressObservations/crud', payload);
notes.value = [];
deletes.value = [];

View File

@ -3,7 +3,7 @@ import { onBeforeMount, reactive, ref } from 'vue';
import { useI18n } from 'vue-i18n';
import { useRoute } from 'vue-router';
import axios from 'axios';
import { getClientRisk } from '../composables/getClientRisk';
import { useDialogPluginComponent } from 'quasar';
import { usePrintService } from 'composables/usePrintService';
@ -158,9 +158,7 @@ async function getAmountPaid() {
},
};
const { data } = await axios(`ClientRisks`, {
params: { filter: JSON.stringify(filter) },
});
const { data } = await getClientRisk(filter);
initialData.amountPaid = (data?.length && data[0].amount) || undefined;
}
</script>
@ -241,7 +239,7 @@ async function getAmountPaid() {
</QItem>
</template>
</VnSelect>
<VnInput
<VnInputNumber
:label="t('Amount')"
:required="true"
@update:model-value="calculateFromAmount($event)"
@ -254,7 +252,7 @@ async function getAmountPaid() {
{{ t('Compensation') }}
</div>
<VnRow>
<VnInput
<VnInputNumber
:label="t('Compensation account')"
clearable
v-model="data.compensationAccount"

View File

@ -63,7 +63,7 @@ const columns = computed(() => [
},
{
align: 'left',
format: (row) => row.agencyMode.name,
format: (row) => dashIfEmpty(row.agencyMode?.name),
columnClass: 'expand',
label: t('Agency'),
},
@ -101,7 +101,7 @@ const columns = computed(() => [
align: 'left',
name: 'itemPackingTypeFk',
label: t('ticketSale.packaging'),
format: (row) => getItemPackagingType(row),
format: (row) => getItemPackagingType(row.ticketSales),
},
{
align: 'right',
@ -111,7 +111,11 @@ const columns = computed(() => [
{
title: t('customer.summary.goToLines'),
icon: 'vn:lines',
action: ({ id }) => router.push({ params: { id }, name: 'TicketSale' }),
action: ({ id }) =>
window.open(
router.resolve({ params: { id }, name: 'TicketSale' }).href,
'_blank'
),
isPrimary: true,
},
{
@ -150,14 +154,24 @@ const setShippedColor = (date) => {
if (difference == 0) return 'warning';
if (difference < 0) return 'success';
};
const rowClick = ({ id }) =>
window.open(router.resolve({ params: { id }, name: 'TicketSummary' }).href, '_blank');
const getItemPackagingType = (row) => {
const packagingType = row?.ticketSales
.map((sale) => sale.item?.itemPackingTypeFk || '-')
.filter((value) => value !== '-')
.join(', ');
const getItemPackagingType = (ticketSales) => {
if (!ticketSales?.length) return '-';
return dashIfEmpty(packagingType);
const packagingTypes = ticketSales.reduce((types, sale) => {
const { itemPackingTypeFk } = sale.item;
if (
!types.includes(itemPackingTypeFk) &&
(itemPackingTypeFk === 'H' || itemPackingTypeFk === 'V')
) {
types.push(itemPackingTypeFk);
}
return types;
}, []);
return dashIfEmpty(packagingTypes.join(', ') || '-');
};
</script>
@ -169,23 +183,25 @@ const getItemPackagingType = (row) => {
:column-search="false"
url="Tickets"
:columns="columns"
search-url="tickets"
:without-header="true"
auto-load
:row-click="rowClick"
order="shipped DESC, id"
:disable-option="{ card: true, table: true }"
class="full-width"
:disable-infinite-scroll="true"
:search-url="false"
redirect="ticket"
>
<template #column-nickname="{ row }">
<span class="link">
<span class="link" @click.stop>
{{ row.nickname }}
<CustomerDescriptorProxy :id="row.clientFk" />
</span>
</template>
<template #column-routeFk="{ row }">
<span class="link">
<span class="link" @click.stop>
{{ row.routeFk }}
<RouteDescriptorProxy :id="row.routeFk" />
</span>
@ -202,7 +218,7 @@ const getItemPackagingType = (row) => {
<span v-else> {{ toCurrency(row.totalWithVat) }}</span>
</template>
<template #column-state="{ row }">
<span v-if="row.invoiceOut">
<span v-if="row.invoiceOut" @click.stop>
<span :class="{ link: row.invoiceOut.ref }">
{{ row.invoiceOut.ref }}
<InvoiceOutDescriptorProxy :id="row.invoiceOut.id" />

View File

@ -0,0 +1,12 @@
import axios from 'axios';
export async function getClientRisk(_filter) {
const filter = {
..._filter,
include: { relation: 'company', scope: { fields: ['code'] } },
};
return await axios(`ClientRisks`, {
params: { filter: JSON.stringify(filter) },
});
}

View File

@ -1,21 +1,5 @@
customerFilter:
filter:
name: Name
socialName: Social name
customer:
list:
phone: Phone
email: Email
customerOrders: Display customer orders
moreOptions: More options
card:
customerList: Customer list
customerId: Claim ID
salesPerson: Sales person
credit: Credit
risk: Risk
securedCredit: Secured credit
payMethod: Pay method
debt: Debt
isFrozen: Customer frozen
hasDebt: Customer has debt
@ -23,9 +7,7 @@ customer:
notChecked: Customer no checked
webAccountInactive: Web account inactive
noWebAccess: Web access is disabled
businessType: Business type
passwordRequirements: 'The password must have at least { length } length characters, {nAlpha} alphabetic characters, {nUpper} capital letters, {nDigits} digits and {nPunct} symbols (Ex: $%&.)\n'
businessTypeFk: Business type
summary:
basicData: Basic data
fiscalAddress: Fiscal address
@ -37,9 +19,7 @@ customer:
customerId: Customer ID
name: Name
contact: Contact
phone: Phone
mobile: Mobile
email: Email
salesPerson: Sales person
contactChannel: Contact channel
socialName: Social name
@ -63,7 +43,6 @@ customer:
hasB2BVnl: Has B2B VNL
addressName: Address name
addressCity: City
addressStreet: Street
username: Username
webAccess: Web access
totalGreuge: Total greuge
@ -92,45 +71,27 @@ customer:
goToLines: Go to lines
basicData:
socialName: Fiscal name
businessType: Business type
contact: Contact
youCanSaveMultipleEmails: You can save multiple emails
email: Email
phone: Phone
mobile: Mobile
salesPerson: Sales person
contactChannel: Contact channel
previousClient: Previous client
extendedList:
tableVisibleColumns:
id: Identifier
name: Name
socialName: Social name
fi: Tax number
salesPersonFk: Salesperson
credit: Credit
creditInsurance: Credit insurance
phone: Phone
mobile: Mobile
street: Street
countryFk: Country
provinceFk: Province
city: City
postcode: Postcode
email: Email
created: Created
businessTypeFk: Business type
payMethodFk: Billing data
sageTaxTypeFk: Sage tax type
sageTransactionTypeFk: Sage tr. type
isActive: Active
isVies: Vies
isTaxDataChecked: Verified data
isEqualizated: Is equalizated
isFreezed: Freezed
hasToInvoice: Invoice
hasToInvoiceByAddress: Invoice by address
isToBeMailed: Mailing
hasLcr: Received LCR
hasCoreVnl: VNL core received
hasSepaVnl: VNL B2B received

View File

@ -1,22 +1,7 @@
Search customer: Buscar cliente
You can search by customer id or name: Puedes buscar por id o nombre del cliente
customerFilter:
filter:
name: Nombre
socialName: Razón Social
customer:
list:
phone: Teléfono
email: Email
customerOrders: Mostrar órdenes del cliente
moreOptions: Más opciones
card:
customerId: ID cliente
salesPerson: Comercial
credit: Crédito
risk: Riesgo
securedCredit: Crédito asegurado
payMethod: Método de pago
debt: Riesgo
isFrozen: Cliente congelado
hasDebt: Cliente con riesgo
@ -24,9 +9,7 @@ customer:
notChecked: Cliente no comprobado
webAccountInactive: Sin acceso web
noWebAccess: El acceso web está desactivado
businessType: Tipo de negocio
passwordRequirements: 'La contraseña debe tener al menos { length } caracteres de longitud, {nAlpha} caracteres alfabéticos, {nUpper} letras mayúsculas, {nDigits} dígitos y {nPunct} símbolos (Ej: $%&.)'
businessTypeFk: Tipo de negocio
summary:
basicData: Datos básicos
fiscalAddress: Dirección fiscal
@ -38,9 +21,7 @@ customer:
customerId: ID cliente
name: Nombre
contact: Contacto
phone: Teléfono
mobile: Móvil
email: Email
salesPerson: Comercial
contactChannel: Canal de contacto
socialName: Razón social
@ -64,7 +45,6 @@ customer:
hasB2BVnl: Recibido B2B VNL
addressName: Nombre de la dirección
addressCity: Ciudad
addressStreet: Calle
username: Usuario
webAccess: Acceso web
totalGreuge: Greuge total
@ -93,45 +73,27 @@ customer:
goToLines: Ir a líneas
basicData:
socialName: Nombre fiscal
businessType: Tipo de negocio
contact: Contacto
youCanSaveMultipleEmails: Puede guardar varios correos electrónicos encadenándolos mediante comas sin espacios{','} ejemplo{':'} user{'@'}dominio{'.'}com, user2{'@'}dominio{'.'}com siendo el primer correo electrónico el principal
email: Email
phone: Teléfono
mobile: Móvil
salesPerson: Comercial
contactChannel: Canal de contacto
previousClient: Cliente anterior
extendedList:
tableVisibleColumns:
id: Identificador
name: Nombre
socialName: Razón social
fi: NIF / CIF
salesPersonFk: Comercial
credit: Crédito
creditInsurance: Crédito asegurado
phone: Teléfono
mobile: Móvil
street: Dirección fiscal
countryFk: País
provinceFk: Provincia
city: Población
postcode: Código postal
email: Email
created: Fecha creación
businessTypeFk: Tipo de negocio
payMethodFk: Forma de pago
sageTaxTypeFk: Tipo de impuesto Sage
sageTransactionTypeFk: Tipo tr. sage
isActive: Activo
isVies: Vies
isTaxDataChecked: Datos comprobados
isEqualizated: Recargo de equivalencias
isFreezed: Congelado
hasToInvoice: Factura
hasToInvoiceByAddress: Factura por consigna
isToBeMailed: Env. emails
hasLcr: Recibido LCR
hasCoreVnl: Recibido core VNL
hasSepaVnl: Recibido B2B VNL

View File

@ -20,16 +20,16 @@ const { t } = useI18n();
<template #form="{ data, validate }">
<VnRow>
<VnInput
:label="t('department.name')"
:label="t('globals.name')"
v-model="data.name"
:rules="validate('department.name')"
:rules="validate('globals.name')"
clearable
autofocus
/>
<VnInput
v-model="data.code"
:label="t('department.code')"
:rules="validate('department.code')"
:label="t('globals.code')"
:rules="validate('globals.code')"
clearable
/>
</VnRow>
@ -42,8 +42,8 @@ const { t } = useI18n();
/>
<VnInput
v-model="data.notificationEmail"
:label="t('department.email')"
:rules="validate('department.email')"
:label="t('globals.params.email')"
:rules="validate('globals.params.email')"
clearable
/>
</VnRow>

View File

@ -45,16 +45,8 @@ onMounted(async () => {
/>
<div class="full-width row wrap justify-between content-between">
<div class="column" style="min-width: 50%">
<VnLv
:label="t('department.name')"
:value="department.name"
dash
/>
<VnLv
:label="t('department.code')"
:value="department.code"
dash
/>
<VnLv :label="t('globals.name')" :value="department.name" dash />
<VnLv :label="t('globals.code')" :value="department.code" dash />
<VnLv
:label="t('department.chat')"
:value="department.chatName"

View File

@ -44,16 +44,15 @@ const onFilterTravelSelected = (formData, id) => {
auto-load
/>
<FormModel
:url="`Entries/${route.params.id}`"
:url-update="`Entries/${route.params.id}`"
model="entry"
model="Entry"
auto-load
:clear-store-on-unmount="false"
>
<template #form="{ data }">
<VnRow>
<VnSelect
:label="t('entry.basicData.supplier')"
:label="t('globals.supplier')"
v-model="data.supplierFk"
url="Suppliers"
option-value="id"
@ -108,18 +107,15 @@ const onFilterTravelSelected = (formData, id) => {
</VnSelectDialog>
</VnRow>
<VnRow>
<VnInput
v-model="data.reference"
:label="t('entry.basicData.reference')"
/>
<VnInput v-model="data.reference" :label="t('globals.reference')" />
</VnRow>
<VnRow>
<VnInput
v-model="data.invoiceNumber"
:label="t('entry.basicData.invoiceNumber')"
:label="t('entry.summary.invoiceNumber')"
/>
<VnSelect
:label="t('entry.basicData.company')"
:label="t('globals.company')"
v-model="data.companyFk"
:options="companiesOptions"
option-value="id"
@ -131,14 +127,14 @@ const onFilterTravelSelected = (formData, id) => {
</VnRow>
<VnRow>
<VnSelect
:label="t('entry.basicData.currency')"
:label="t('entry.summary.currency')"
v-model="data.currencyFk"
:options="currenciesOptions"
option-value="id"
option-label="code"
/>
<QInput
:label="t('entry.basicData.commission')"
:label="t('entry.summary.commission')"
v-model="data.commission"
type="number"
autofocus
@ -156,19 +152,12 @@ const onFilterTravelSelected = (formData, id) => {
/>
</VnRow>
<VnRow>
<QCheckbox
v-model="data.isOrdered"
:label="t('entry.basicData.ordered')"
/>
<QCheckbox
v-model="data.isConfirmed"
:label="t('entry.basicData.confirmed')"
/>
<QCheckbox v-model="data.isOrdered" :label="t('entry.summary.ordered')" />
<QCheckbox v-model="data.isConfirmed" :label="t('globals.confirmed')" />
<QCheckbox
v-model="data.isExcludedFromAvailable"
:label="t('entry.basicData.excludedFromAvailable')"
:label="t('entry.summary.excludedFromAvailable')"
/>
<QCheckbox v-model="data.isRaid" :label="t('entry.basicData.raid')" />
<QCheckbox
v-if="isAdministrative()"
v-model="data.isBooked"

View File

@ -5,7 +5,6 @@ import { useI18n } from 'vue-i18n';
import { QBtn } from 'quasar';
import VnPaginate from 'src/components/ui/VnPaginate.vue';
import FetchData from 'src/components/FetchData.vue';
import VnSelect from 'components/common/VnSelect.vue';
import VnInput from 'src/components/common/VnInput.vue';
import FetchedTags from 'components/ui/FetchedTags.vue';
@ -157,13 +156,13 @@ const tableColumnComponents = computed(() => ({
const entriesTableColumns = computed(() => {
return [
{
label: t('entry.summary.item'),
label: t('globals.item'),
field: 'itemFk',
name: 'item',
align: 'left',
},
{
label: t('entry.summary.quantity'),
label: t('globals.quantity'),
field: 'quantity',
name: 'quantity',
align: 'left',
@ -187,7 +186,7 @@ const entriesTableColumns = computed(() => {
align: 'left',
},
{
label: t('entry.summary.weight'),
label: t('globals.weight'),
field: 'weight',
name: 'weight',
align: 'left',
@ -212,13 +211,13 @@ const entriesTableColumns = computed(() => {
format: (value) => toCurrency(value),
},
{
label: t('entry.buys.groupingPrice'),
label: t('item.fixedPrice.groupingPrice'),
field: 'price2',
name: 'price2',
align: 'left',
},
{
label: t('entry.buys.packingPrice'),
label: t('item.fixedPrice.packingPrice'),
field: 'price3',
name: 'price3',
align: 'left',

View File

@ -35,7 +35,7 @@ const packagingsOptions = ref([]);
const columns = computed(() => [
{
label: t('entry.buys.item'),
label: t('globals.item'),
name: 'item',
field: 'itemFk',
options: lastItemBuysOptions.value,
@ -56,19 +56,19 @@ const columns = computed(() => [
align: 'left',
},
{
label: t('entry.buys.packing'),
label: t('entry.summary.packing'),
name: 'packing',
field: 'packing',
align: 'left',
},
{
label: t('entry.buys.grouping'),
label: t('entry.summary.grouping'),
name: 'grouping',
field: 'grouping',
align: 'left',
},
{
label: t('entry.buys.buyingValue'),
label: t('entry.summary.buyingValue'),
name: 'buyingValue',
field: 'buyingValue',
align: 'left',
@ -200,7 +200,7 @@ const redirectToBuysView = () => {
<VnRow>
<QFile
ref="inputFileRef"
:label="t('entry.buys.file')"
:label="t('globals.file')"
v-model="importData.file"
:multiple="false"
accept=".json"
@ -220,10 +220,7 @@ const redirectToBuysView = () => {
</VnRow>
<div v-if="importData.file">
<VnRow>
<VnInput
:label="t('entry.buys.reference')"
v-model="importData.ref"
/>
<VnInput :label="t('globals.reference')" v-model="importData.ref" />
</VnRow>
<VnRow>
<VnInput

View File

@ -2,11 +2,13 @@
import VnCard from 'components/common/VnCard.vue';
import EntryDescriptor from './EntryDescriptor.vue';
import EntryFilter from '../EntryFilter.vue';
import filter from './EntryFilter.js';
</script>
<template>
<VnCard
data-key="Entry"
base-url="Entries"
:filter="filter"
:descriptor="EntryDescriptor"
:filter-panel="EntryFilter"
search-data-key="EntryList"

View File

@ -1,16 +1,15 @@
<script setup>
import { ref, computed, watch, onMounted } from 'vue';
import { ref, computed, onMounted } from 'vue';
import { useRoute } from 'vue-router';
import { useI18n } from 'vue-i18n';
import CardDescriptor from 'components/ui/CardDescriptor.vue';
import VnLv from 'src/components/ui/VnLv.vue';
import useCardDescription from 'src/composables/useCardDescription';
import { useState } from 'src/composables/useState';
import { toDate } from 'src/filters';
import { usePrintService } from 'composables/usePrintService';
import { getUrl } from 'src/composables/getUrl';
import filter from './EntryFilter.js';
const $props = defineProps({
id: {
@ -23,47 +22,9 @@ const $props = defineProps({
const route = useRoute();
const { t } = useI18n();
const { openReport } = usePrintService();
const state = useState();
const entryDescriptorRef = ref(null);
const url = ref();
const entryFilter = {
include: [
{
relation: 'travel',
scope: {
fields: ['id', 'landed', 'shipped', 'agencyModeFk', 'warehouseOutFk'],
include: [
{
relation: 'agency',
scope: {
fields: ['name'],
},
},
{
relation: 'warehouseOut',
scope: {
fields: ['name'],
},
},
{
relation: 'warehouseIn',
scope: {
fields: ['name'],
},
},
],
},
},
{
relation: 'supplier',
scope: {
fields: ['id', 'nickname'],
},
},
],
};
const entityId = computed(() => {
return $props.id || route.params.id;
});
@ -71,12 +32,6 @@ onMounted(async () => {
url.value = await getUrl('');
});
const data = ref(useCardDescription());
const setData = (entity) =>
(data.value = useCardDescription(entity.supplier?.nickname, entity.id));
const currentEntry = computed(() => state.get('entry'));
const getEntryRedirectionFilter = (entry) => {
let entryTravel = entry && entry.travel;
@ -101,8 +56,6 @@ const getEntryRedirectionFilter = (entry) => {
const showEntryReport = () => {
openReport(`Entries/${route.params.id}/entry-order-pdf`);
};
watch;
</script>
<template>
@ -110,11 +63,9 @@ watch;
ref="entryDescriptorRef"
module="Entry"
:url="`Entries/${entityId}`"
:filter="entryFilter"
:title="data.title"
:subtitle="data.subtitle"
@on-fetch="setData"
data-key="entry"
:filter="filter"
title="supplier.nickname"
data-key="Entry"
>
<template #menu="{ entity }">
<QItem v-ripple clickable @click="showEntryReport(entity)">
@ -122,21 +73,18 @@ watch;
</QItem>
</template>
<template #body="{ entity }">
<VnLv
:label="t('entry.descriptor.agency')"
:value="entity.travel?.agency?.name"
/>
<VnLv :label="t('globals.agency')" :value="entity.travel?.agency?.name" />
<VnLv :label="t('shipped')" :value="toDate(entity.travel?.shipped)" />
<VnLv :label="t('landed')" :value="toDate(entity.travel?.landed)" />
<VnLv
:label="t('entry.descriptor.warehouseOut')"
:label="t('globals.warehouseOut')"
:value="entity.travel?.warehouseOut?.name"
/>
</template>
<template #icons>
<template #icons="{ entity }">
<QCardActions class="q-gutter-x-md">
<QIcon
v-if="currentEntry?.isExcludedFromAvailable"
v-if="entity?.isExcludedFromAvailable"
name="vn:inventory"
color="primary"
size="xs"
@ -144,19 +92,25 @@ watch;
<QTooltip>{{ t('Inventory entry') }}</QTooltip>
</QIcon>
<QIcon
v-if="currentEntry?.isRaid"
v-if="entity?.travel?.daysInForward"
name="vn:net"
color="primary"
size="xs"
>
<QTooltip>{{ t('Virtual entry') }}</QTooltip>
<QTooltip>
{{
t('globals.raid', {
daysInForward: entity?.travel?.daysInForward,
})
}}</QTooltip
>
</QIcon>
</QCardActions>
</template>
<template #actions="{ entity }">
<QCardActions>
<QBtn
:to="`/supplier/${entity.supplier.id}`"
:to="`/supplier/${entity.supplier?.id}`"
size="md"
icon="vn:supplier"
color="primary"

View File

@ -0,0 +1,43 @@
export default {
include: [
{
relation: 'travel',
scope: {
fields: [
'id',
'landed',
'shipped',
'agencyModeFk',
'warehouseOutFk',
'daysInForward',
],
include: [
{
relation: 'agency',
scope: {
fields: ['name'],
},
},
{
relation: 'warehouseOut',
scope: {
fields: ['name'],
},
},
{
relation: 'warehouseIn',
scope: {
fields: ['name'],
},
},
],
},
},
{
relation: 'supplier',
scope: {
fields: ['id', 'nickname'],
},
},
],
};

View File

@ -84,7 +84,7 @@ const tableColumnComponents = {
const entriesTableColumns = computed(() => {
return [
{
label: t('entry.summary.quantity'),
label: t('globals.quantity'),
field: 'quantity',
name: 'quantity',
align: 'left',
@ -102,7 +102,7 @@ const entriesTableColumns = computed(() => {
align: 'left',
},
{
label: t('entry.summary.weight'),
label: t('globals.weight'),
field: 'weight',
name: 'weight',
align: 'left',
@ -188,8 +188,8 @@ const fetchEntryBuys = async () => {
:label="t('entry.summary.currency')"
:value="entry.currency?.name"
/>
<VnLv :label="t('entry.summary.company')" :value="entry.company.code" />
<VnLv :label="t('entry.summary.reference')" :value="entry.reference" />
<VnLv :label="t('globals.company')" :value="entry.company.code" />
<VnLv :label="t('globals.reference')" :value="entry.reference" />
<VnLv
:label="t('entry.summary.invoiceNumber')"
:value="entry.invoiceNumber"
@ -217,7 +217,7 @@ const fetchEntryBuys = async () => {
/>
<VnLv :label="t('shipped')" :value="toDate(entry.travel.shipped)" />
<VnLv
:label="t('entry.summary.travelWarehouseOut')"
:label="t('globals.warehouseOut')"
:value="entry.travel.warehouseOut?.name"
/>
<QCheckbox
@ -227,7 +227,7 @@ const fetchEntryBuys = async () => {
/>
<VnLv :label="t('landed')" :value="toDate(entry.travel.landed)" />
<VnLv
:label="t('entry.summary.travelWarehouseIn')"
:label="t('globals.warehouseIn')"
:value="entry.travel.warehouseIn?.name"
/>
<QCheckbox
@ -250,7 +250,7 @@ const fetchEntryBuys = async () => {
:disable="true"
/>
<QCheckbox
:label="t('entry.summary.confirmed')"
:label="t('globals.confirmed')"
v-model="entry.isConfirmed"
:disable="true"
/>
@ -259,11 +259,6 @@ const fetchEntryBuys = async () => {
v-model="entry.isBooked"
:disable="true"
/>
<QCheckbox
:label="t('entry.summary.raid')"
v-model="entry.isRaid"
:disable="true"
/>
<QCheckbox
:label="t('entry.summary.excludedFromAvailable')"
v-model="entry.isExcludedFromAvailable"

View File

@ -35,7 +35,7 @@ const entriesTableColumns = computed(() => [
{
align: 'left',
name: 'item',
label: t('entry.summary.item'),
label: t('globals.item'),
field: (row) => row.item.name,
},
{
@ -121,7 +121,7 @@ const entriesTableColumns = computed(() => [
:loading="isLoading"
@click="
openReport(
`Entries/${props.row.id}/buy-label`
`Entries/${props.row.id}/buy-label-supplier`
)
"
unelevated

View File

@ -23,7 +23,6 @@ const columns = [
return {
id: row.id,
size: '50x50',
width: '50px',
};
},
},
@ -34,56 +33,80 @@ const columns = [
label: t('entry.latestBuys.tableVisibleColumns.itemFk'),
name: 'itemFk',
isTitle: true,
columnFilter: {
component: 'number',
inWhere: true,
},
},
{
align: 'left',
label: t('entry.latestBuys.tableVisibleColumns.packing'),
label: t('entry.summary.packing'),
name: 'packing',
columnFilter: {
component: 'number',
inWhere: true,
},
},
{
align: 'left',
label: t('entry.latestBuys.tableVisibleColumns.grouping'),
label: t('entry.summary.grouping'),
name: 'grouping',
columnFilter: {
component: 'number',
inWhere: true,
},
},
{
align: 'left',
label: t('entry.latestBuys.tableVisibleColumns.quantity'),
label: t('globals.quantity'),
name: 'quantity',
columnFilter: {
component: 'number',
inWhere: true,
},
},
{
align: 'left',
label: t('entry.latestBuys.tableVisibleColumns.description'),
label: t('globals.description'),
name: 'description',
},
{
align: 'left',
label: t('entry.latestBuys.tableVisibleColumns.size'),
label: t('globals.size'),
name: 'size',
columnFilter: {
component: 'number',
inWhere: true,
},
},
{
align: 'left',
label: t('entry.latestBuys.tableVisibleColumns.tags'),
label: t('globals.tags'),
name: 'tags',
},
{
align: 'left',
label: t('entry.latestBuys.tableVisibleColumns.type'),
label: t('globals.type'),
name: 'type',
},
{
align: 'left',
label: t('entry.latestBuys.tableVisibleColumns.intrastat'),
label: t('globals.intrastat'),
name: 'intrastat',
},
{
align: 'left',
label: t('entry.latestBuys.tableVisibleColumns.origin'),
label: t('globals.origin'),
name: 'origin',
},
{
align: 'left',
label: t('entry.latestBuys.tableVisibleColumns.weightByPiece'),
label: t('globals.weightByPiece'),
name: 'weightByPiece',
columnFilter: {
component: 'number',
inWhere: true,
},
},
{
align: 'left',
@ -99,26 +122,46 @@ const columns = [
align: 'left',
label: t('entry.latestBuys.tableVisibleColumns.entryFk'),
name: 'entryFk',
columnFilter: {
component: 'number',
inWhere: true,
},
},
{
align: 'left',
label: t('entry.latestBuys.tableVisibleColumns.buyingValue'),
label: t('entry.summary.buyingValue'),
name: 'buyingValue',
columnFilter: {
component: 'number',
inWhere: true,
},
},
{
align: 'left',
label: t('entry.latestBuys.tableVisibleColumns.freightValue'),
name: 'freightValue',
columnFilter: {
component: 'number',
inWhere: true,
},
},
{
align: 'left',
label: t('entry.latestBuys.tableVisibleColumns.comissionValue'),
name: 'comissionValue',
columnFilter: {
component: 'number',
inWhere: true,
},
},
{
align: 'left',
label: t('entry.latestBuys.tableVisibleColumns.packageValue'),
label: t('entry.buys.packageValue'),
name: 'packageValue',
columnFilter: {
component: 'number',
inWhere: true,
},
},
{
align: 'left',
@ -129,16 +172,28 @@ const columns = [
align: 'left',
label: t('entry.latestBuys.tableVisibleColumns.price2'),
name: 'price2',
columnFilter: {
component: 'number',
inWhere: true,
},
},
{
align: 'left',
label: t('entry.latestBuys.tableVisibleColumns.price3'),
name: 'price3',
columnFilter: {
component: 'number',
inWhere: true,
},
},
{
align: 'left',
label: t('entry.latestBuys.tableVisibleColumns.minPrice'),
name: 'minPrice',
columnFilter: {
component: 'number',
inWhere: true,
},
},
{
align: 'left',
@ -147,13 +202,21 @@ const columns = [
},
{
align: 'left',
label: t('entry.latestBuys.tableVisibleColumns.weight'),
label: t('globals.weight'),
name: 'weight',
columnFilter: {
component: 'number',
inWhere: true,
},
},
{
align: 'left',
label: t('entry.latestBuys.tableVisibleColumns.packagingFk'),
label: t('entry.buys.packagingFk'),
name: 'packagingFk',
columnFilter: {
component: 'number',
inWhere: true,
},
},
{
align: 'left',

View File

@ -41,16 +41,20 @@ const entryFilter = {
};
const columns = computed(() => [
{
name: 'status',
columnFilter: false,
},
{
align: 'left',
label: t('entry.list.tableVisibleColumns.id'),
label: t('globals.id'),
name: 'id',
isTitle: true,
cardVisible: true,
},
{
align: 'left',
label: t('entry.list.tableVisibleColumns.reference'),
label: t('globals.reference'),
name: 'reference',
isTitle: true,
component: 'input',
@ -154,27 +158,8 @@ const columns = computed(() => [
cardVisible: true,
},
{
align: 'left',
label: t('entry.list.tableVisibleColumns.isExcludedFromAvailable'),
name: 'isExcludedFromAvailable',
chip: {
color: null,
condition: (value) => value,
icon: 'vn:inventory',
},
columnFilter: {
inWhere: true,
},
},
{
align: 'left',
label: t('entry.list.tableVisibleColumns.isRaid'),
name: 'isRaid',
chip: {
color: null,
condition: (value) => value,
icon: 'vn:net',
},
columnFilter: {
inWhere: true,
},
@ -225,6 +210,26 @@ onMounted(async () => {
auto-load
:right-search="false"
>
<template #column-status="{ row }">
<div class="row q-gutter-xs">
<QIcon
v-if="!!row.isExcludedFromAvailable"
name="vn:inventory"
color="primary"
>
<QTooltip>{{
t('entry.list.tableVisibleColumns.isExcludedFromAvailable')
}}</QTooltip>
</QIcon>
<QIcon v-if="!!row.daysInForward" name="vn:net" color="primary">
<QTooltip>
{{
t('globals.raid', { daysInForward: row.daysInForward })
}}</QTooltip
>
</QIcon>
</div>
</template>
<template #column-supplierFk="{ row }">
<span class="link" @click.stop>
{{ row.supplierName }}

Some files were not shown because too many files have changed in this diff Show More