From 6e54d93b9bd154a471ce6abbd1a6c33c21f3991e Mon Sep 17 00:00:00 2001 From: Yamel Senih Date: Wed, 28 Oct 2020 17:19:53 -0400 Subject: [PATCH] Add API REST support based on proxy-adempiere-api and backend implementation (#529) --- README.es.md | 5 +- README.md | 7 +- package.json | 11 +- public/img/icons/favicon-16x16.png | Bin 0 -> 417 bytes public/img/icons/favicon-32x32.png | Bin 0 -> 965 bytes public/index.html | 12 + public/logo.png | Bin 0 -> 1794 bytes public/manifest.json | 15 + src/api/ADempiere/browser.js | 73 +- src/api/ADempiere/constants.js | 14 +- src/api/ADempiere/dashboard/dashboard.js | 137 +- src/api/ADempiere/dictionary.js | 195 ++- src/api/ADempiere/enrollment.js | 111 +- src/api/ADempiere/field/location.js | 26 +- src/api/ADempiere/field/locator.js | 10 +- src/api/ADempiere/form/point-of-sales.js | 354 +++-- src/api/ADempiere/form/price-checking.js | 37 +- src/api/ADempiere/instances.js | 141 +- src/api/ADempiere/persistence.js | 257 ++- src/api/ADempiere/private-access.js | 69 +- src/api/ADempiere/process.js | 101 +- src/api/ADempiere/report.js | 142 +- src/api/ADempiere/rule.js | 42 +- src/api/ADempiere/system-core.js | 264 +++- src/api/ADempiere/user-interface.js | 48 + src/api/ADempiere/values.js | 141 +- src/api/ADempiere/window.js | 273 +++- src/api/role.js | 51 + src/api/user.js | 101 +- src/components/ADempiere/Badge/index.vue | 17 +- .../ADempiere/ChatEntries/index.vue | 157 ++ .../ADempiere/ChatEntries/inputChat.vue | 68 + .../ADempiere/ContainerInfo/chatEntries.vue | 51 - .../ADempiere/ContainerInfo/mixinInfo.js | 69 - .../ADempiere/ContainerInfo/recordLogs.vue | 61 +- .../ADempiere/ContainerInfo/workflowLogs.vue | 18 +- .../ContextMenu/contextMenuDesktop.vue | 25 +- .../ADempiere/ContextMenu/contextMenuMixin.js | 86 +- .../ADempiere/ContextMenu/items.vue | 2 +- .../ADempiere/Dashboard/docstatus/index.vue | 4 +- .../ADempiere/Dashboard/mixinDashboard.js | 6 +- .../ADempiere/Dashboard/recentItems/index.vue | 20 +- .../Dashboard/userfavorites/index.vue | 8 +- .../ADempiere/DataTable/dataTables-Script.js | 720 +++++++++ .../DataTable/dataTables-StyleGlobal.scss | 132 ++ .../DataTable/dataTables-StyleScoped.scss | 104 ++ .../ADempiere/DataTable/filterColumns.vue | 18 +- .../ADempiere/DataTable/fixedColumns.vue | 14 +- src/components/ADempiere/DataTable/index.vue | 1262 ++------------- .../ADempiere/DataTable/menu/index.vue | 10 +- .../DataTable/menu/menuTableMixin.js | 147 +- .../DataTable/menu/tableContextMenu.vue | 4 +- .../DataTable/mixin/mixinTableSort.js | 40 + .../ADempiere/DataTable/mixin/tableMixin.js | 109 ++ src/components/ADempiere/Dialog/index.vue | 4 +- src/components/ADempiere/Dropdown/index.vue | 4 +- .../ADempiere/Field/FieldAutocomplete.vue | 3 - src/components/ADempiere/Field/FieldDate.vue | 22 +- .../Field/FieldLocation/fieldsList.js | 9 + .../FieldLocation/locationAddressForm.vue | 43 +- .../Field/FieldLocation/mixinLocation.js | 6 +- .../ADempiere/Field/FieldLocator.vue | 14 +- .../ADempiere/Field/FieldNumber.vue | 6 +- .../ADempiere/Field/FieldSelect.vue | 71 +- .../ADempiere/Field/FieldSelectMultiple.vue | 4 +- .../ADempiere/Field/chatTextLong.vue | 164 -- src/components/ADempiere/Field/index.vue | 107 +- .../ADempiere/Field/mixin/mixinField.js | 48 +- .../ADempiere/Field/popover/contextInfo.vue | 6 +- .../Field/popover/operatorComparison.vue | 1 - .../ADempiere/Field/popover/translated.vue | 2 +- .../Form/PriceChecking/fieldsList.js | 2 +- .../ADempiere/Form/PriceChecking/index.vue | 173 +- .../BusinessPartner/businessPartnerCreate.vue | 190 +++ .../BusinessPartner/businessPartnersList.vue | 206 +++ .../VPOS/BusinessPartner/fieldsListCreate.js | 68 + .../VPOS/BusinessPartner/fieldsListSearch.js | 59 + .../Form/VPOS/BusinessPartner/index.vue | 386 +++++ .../BusinessPartner/mixinBusinessPartner.js | 141 ++ .../fieldsListConvertAmountCollection.js | 18 + .../VPOS/Collection/convertAmount/index.vue | 100 ++ .../VPOS/Collection/fieldsListCollection.js | 136 ++ .../ADempiere/Form/VPOS/Collection/index.vue | 714 +++++++++ .../Form/VPOS/Collection/typeCollection.vue | 193 +++ .../ADempiere/Form/VPOS/KeyLayout/index.vue | 351 +++++ .../ADempiere/Form/VPOS/Options/index.vue | 456 ++++++ .../Form/VPOS/Order/fieldsListOrder.js | 51 + .../ADempiere/Form/VPOS/Order/index.vue | 570 +++++++ .../Form/VPOS/Order/orderLineMixin.js | 212 +++ .../Form/VPOS/OrderList/fieldsListOrders.js | 105 ++ .../ADempiere/Form/VPOS/OrderList/index.vue | 318 ++++ .../Form/VPOS/ProductInfo/fieldsList.js | 12 + .../ADempiere/Form/VPOS/ProductInfo/index.vue | 254 +++ .../Form/VPOS/ProductInfo/productList.vue | 208 +++ src/components/ADempiere/Form/VPOS/index.vue | 271 ++++ .../ADempiere/Form/VPOS/posMixin.js | 444 ++++++ src/components/ADempiere/Form/formMixin.js | 8 +- src/components/ADempiere/Form/index.vue | 3 + src/components/ADempiere/Pagination/index.vue | 2 +- .../ADempiere/Panel/filterFields.vue | 6 +- src/components/ADempiere/Panel/index.css | 26 + .../ADempiere/Panel/mainPanelDesktop.vue | 29 +- .../ADempiere/Panel/mainPanelMixin.js | 101 +- .../ADempiere/Panel/mainPanelMobile.vue | 28 +- .../ADempiere/SequenceOrder/index.vue | 19 +- src/components/ADempiere/Tab/index.vue | 4 +- src/components/ADempiere/Tab/tabChildren.vue | 22 +- .../ADempiere/WorkflowStatusBar/index.vue | 2 +- src/components/HeaderSearch/index.vue | 17 +- src/image/ADempiere/pos/no-image.jpg | Bin 0 -> 14280 bytes .../ADempiere/priceChecking/no-image.jpg | Bin 0 -> 14280 bytes .../price-checking-background.png | Bin 402972 -> 0 bytes src/lang/ADempiere/en.js | 6 +- src/lang/ADempiere/es.js | 6 +- src/layout/components/Navbar.vue | 37 +- .../components/ProfilePreview.vue} | 29 +- src/layout/components/Sidebar/Logo.vue | 8 +- src/permission.js | 7 +- src/router/modules/ADempiere/menu.js | 203 +-- src/router/modules/ADempiere/staticRoutes.js | 70 + src/store/getters.js | 4 +- src/store/modules/ADempiere/browser.js | 14 +- .../modules/ADempiere/browserDefinition.js | 16 +- .../modules/ADempiere/businessPartner.js | 120 ++ src/store/modules/ADempiere/chatEntries.js | 108 ++ src/store/modules/ADempiere/containerInfo.js | 156 +- src/store/modules/ADempiere/dashboard.js | 11 +- src/store/modules/ADempiere/data.js | 1038 ------------ src/store/modules/ADempiere/data/actions.js | 864 ++++++++++ src/store/modules/ADempiere/data/getters.js | 107 ++ src/store/modules/ADempiere/data/index.js | 23 + src/store/modules/ADempiere/data/mutations.js | 57 + src/store/modules/ADempiere/field.js | 32 +- src/store/modules/ADempiere/fieldValue.js | 35 +- src/store/modules/ADempiere/formDefinition.js | 13 +- src/store/modules/ADempiere/language.js | 17 +- src/store/modules/ADempiere/lookup.js | 20 +- src/store/modules/ADempiere/panel.js | 1388 ----------------- src/store/modules/ADempiere/panel/actions.js | 810 ++++++++++ src/store/modules/ADempiere/panel/getters.js | 502 ++++++ src/store/modules/ADempiere/panel/index.js | 42 + src/store/modules/ADempiere/persistence.js | 19 +- .../ADempiere/pointOfSales/collection.js | 126 ++ .../modules/ADempiere/pointOfSales/index.js | 161 ++ .../ADempiere/pointOfSales/keyLayout.js | 82 + .../pointOfSales/listProductPrice.js | 138 ++ .../modules/ADempiere/pointOfSales/order.js | 170 ++ .../ADempiere/pointOfSales/orderLines.js | 86 + src/store/modules/ADempiere/preference.js | 25 +- src/store/modules/ADempiere/process.js | 52 +- .../modules/ADempiere/processDefinition.js | 8 +- src/store/modules/ADempiere/report.js | 24 +- src/store/modules/ADempiere/system.js | 108 ++ src/store/modules/ADempiere/utils.js | 100 +- src/store/modules/ADempiere/window.js | 205 ++- .../modules/ADempiere/windowDefinition.js | 210 +-- src/store/modules/permission.js | 63 +- src/store/modules/tagsView.js | 25 + src/store/modules/user.js | 430 ++--- src/utils/ADempiere/apiConverts/core.js | 326 ++++ src/utils/ADempiere/apiConverts/dashboard.js | 69 + src/utils/ADempiere/apiConverts/dictionary.js | 166 ++ src/utils/ADempiere/apiConverts/field.js | 192 +++ .../ADempiere/apiConverts/persistence.js | 31 + src/utils/ADempiere/apiConverts/pos.js | 138 ++ .../ADempiere/apiConverts/privateAccess.js | 8 + src/utils/ADempiere/apiConverts/process.js | 18 + src/utils/ADempiere/apiConverts/report.js | 69 + src/utils/ADempiere/apiConverts/user.js | 42 + src/utils/ADempiere/apiConverts/values.js | 23 + src/utils/ADempiere/apiConverts/window.js | 192 +++ src/utils/ADempiere/contextUtils.js | 4 +- src/utils/ADempiere/convertResponseValues.js | 16 + src/utils/ADempiere/dictionaryUtils.js | 28 +- src/utils/ADempiere/evaluator.js | 73 +- src/utils/ADempiere/globalMethods.js | 6 +- src/utils/ADempiere/lookupFactory.js | 16 +- src/utils/ADempiere/notification.js | 14 +- src/utils/ADempiere/references.js | 22 +- src/utils/ADempiere/resource.js | 66 +- src/utils/ADempiere/valueFormat.js | 6 +- src/utils/ADempiere/valueUtils.js | 119 +- src/utils/auth.js | 6 +- src/views/ADempiere/Browser/index.vue | 2 + src/views/ADempiere/Form/index.vue | 35 +- src/views/ADempiere/ProcessActivity/index.vue | 4 +- src/views/ADempiere/ReportViewer/index.vue | 4 +- src/views/ADempiere/Test/fieldsList.js | 24 +- src/views/ADempiere/Test/index.vue | 5 +- src/views/ADempiere/Unsupported/index.vue | 4 +- src/views/ADempiere/Window/index.vue | 162 +- src/views/dashboard/admin/index.vue | 8 +- src/views/login/forgotPassword.vue | 4 +- src/views/login/index.vue | 23 +- src/views/login/loginMixin.js | 2 +- src/views/login/setPassword.vue | 4 +- src/views/login/userEnrollment.vue | 7 +- src/views/profile/components/RolesNavbar.vue | 114 +- src/views/profile/components/UserCard.vue | 29 +- src/views/profile/components/role.vue | 2 +- sw.js | 110 ++ vue.config.js | 10 + 202 files changed, 16030 insertions(+), 6156 deletions(-) create mode 100644 public/img/icons/favicon-16x16.png create mode 100644 public/img/icons/favicon-32x32.png create mode 100644 public/logo.png create mode 100644 public/manifest.json create mode 100644 src/api/ADempiere/user-interface.js create mode 100644 src/components/ADempiere/ChatEntries/index.vue create mode 100644 src/components/ADempiere/ChatEntries/inputChat.vue delete mode 100644 src/components/ADempiere/ContainerInfo/chatEntries.vue create mode 100644 src/components/ADempiere/DataTable/dataTables-Script.js create mode 100644 src/components/ADempiere/DataTable/dataTables-StyleGlobal.scss create mode 100644 src/components/ADempiere/DataTable/dataTables-StyleScoped.scss create mode 100644 src/components/ADempiere/DataTable/mixin/mixinTableSort.js create mode 100644 src/components/ADempiere/DataTable/mixin/tableMixin.js delete mode 100644 src/components/ADempiere/Field/chatTextLong.vue create mode 100644 src/components/ADempiere/Form/VPOS/BusinessPartner/businessPartnerCreate.vue create mode 100644 src/components/ADempiere/Form/VPOS/BusinessPartner/businessPartnersList.vue create mode 100644 src/components/ADempiere/Form/VPOS/BusinessPartner/fieldsListCreate.js create mode 100644 src/components/ADempiere/Form/VPOS/BusinessPartner/fieldsListSearch.js create mode 100644 src/components/ADempiere/Form/VPOS/BusinessPartner/index.vue create mode 100644 src/components/ADempiere/Form/VPOS/BusinessPartner/mixinBusinessPartner.js create mode 100644 src/components/ADempiere/Form/VPOS/Collection/convertAmount/fieldsListConvertAmountCollection.js create mode 100644 src/components/ADempiere/Form/VPOS/Collection/convertAmount/index.vue create mode 100644 src/components/ADempiere/Form/VPOS/Collection/fieldsListCollection.js create mode 100644 src/components/ADempiere/Form/VPOS/Collection/index.vue create mode 100644 src/components/ADempiere/Form/VPOS/Collection/typeCollection.vue create mode 100644 src/components/ADempiere/Form/VPOS/KeyLayout/index.vue create mode 100644 src/components/ADempiere/Form/VPOS/Options/index.vue create mode 100644 src/components/ADempiere/Form/VPOS/Order/fieldsListOrder.js create mode 100644 src/components/ADempiere/Form/VPOS/Order/index.vue create mode 100644 src/components/ADempiere/Form/VPOS/Order/orderLineMixin.js create mode 100644 src/components/ADempiere/Form/VPOS/OrderList/fieldsListOrders.js create mode 100644 src/components/ADempiere/Form/VPOS/OrderList/index.vue create mode 100644 src/components/ADempiere/Form/VPOS/ProductInfo/fieldsList.js create mode 100644 src/components/ADempiere/Form/VPOS/ProductInfo/index.vue create mode 100644 src/components/ADempiere/Form/VPOS/ProductInfo/productList.vue create mode 100644 src/components/ADempiere/Form/VPOS/index.vue create mode 100644 src/components/ADempiere/Form/VPOS/posMixin.js create mode 100644 src/components/ADempiere/Panel/index.css create mode 100644 src/image/ADempiere/pos/no-image.jpg create mode 100644 src/image/ADempiere/priceChecking/no-image.jpg delete mode 100644 src/image/ADempiere/priceChecking/price-checking-background.png rename src/{views/profile/components/Profile.vue => layout/components/ProfilePreview.vue} (70%) create mode 100644 src/router/modules/ADempiere/staticRoutes.js create mode 100644 src/store/modules/ADempiere/businessPartner.js create mode 100644 src/store/modules/ADempiere/chatEntries.js delete mode 100644 src/store/modules/ADempiere/data.js create mode 100644 src/store/modules/ADempiere/data/actions.js create mode 100644 src/store/modules/ADempiere/data/getters.js create mode 100644 src/store/modules/ADempiere/data/index.js create mode 100644 src/store/modules/ADempiere/data/mutations.js delete mode 100644 src/store/modules/ADempiere/panel.js create mode 100644 src/store/modules/ADempiere/panel/actions.js create mode 100644 src/store/modules/ADempiere/panel/getters.js create mode 100644 src/store/modules/ADempiere/panel/index.js create mode 100644 src/store/modules/ADempiere/pointOfSales/collection.js create mode 100644 src/store/modules/ADempiere/pointOfSales/index.js create mode 100644 src/store/modules/ADempiere/pointOfSales/keyLayout.js create mode 100644 src/store/modules/ADempiere/pointOfSales/listProductPrice.js create mode 100644 src/store/modules/ADempiere/pointOfSales/order.js create mode 100644 src/store/modules/ADempiere/pointOfSales/orderLines.js create mode 100644 src/store/modules/ADempiere/system.js create mode 100644 src/utils/ADempiere/apiConverts/core.js create mode 100644 src/utils/ADempiere/apiConverts/dashboard.js create mode 100644 src/utils/ADempiere/apiConverts/dictionary.js create mode 100644 src/utils/ADempiere/apiConverts/field.js create mode 100644 src/utils/ADempiere/apiConverts/persistence.js create mode 100644 src/utils/ADempiere/apiConverts/pos.js create mode 100644 src/utils/ADempiere/apiConverts/privateAccess.js create mode 100644 src/utils/ADempiere/apiConverts/process.js create mode 100644 src/utils/ADempiere/apiConverts/report.js create mode 100644 src/utils/ADempiere/apiConverts/user.js create mode 100644 src/utils/ADempiere/apiConverts/values.js create mode 100644 src/utils/ADempiere/apiConverts/window.js create mode 100644 src/utils/ADempiere/convertResponseValues.js create mode 100644 sw.js diff --git a/README.es.md b/README.es.md index 413d5d44..92ab2889 100644 --- a/README.es.md +++ b/README.es.md @@ -39,7 +39,7 @@ Este es una gran UI para [ADempiere ERP, CRM & SCM](https://github.com/adempiere - [Canal de Gitter](https://gitter.im/adempiere/adempiere-vue) -- [Para Donaciones](https://www.paypal.me/?) +- [Para Donaciones](https://www.paypal.me/YamelSenih) - [Enlace de Wiki](http://wiki.adempiere.net/ADempiere_ERP) @@ -129,6 +129,7 @@ Sea un patrocinante y coloque su logo en nuestro LEEME en GitHub con un enlace d - Componente para soltar archivos - Adhesión de objetos - Contador hasta + - Soporte a ADempiere - Ventana - Proceso @@ -205,7 +206,7 @@ Los cambios detallados por cada liberación se encuentran en [notas de liberaci Si este proyecto es de mucha ayuda para ti, puedes ayudar a hacer una mejor UI -[dona por Paypal](https://www.paypal.me/?) +[dona por Paypal](https://www.paypal.me/YamelSenih) ## Navegadores Soportados diff --git a/README.md b/README.md index bc865155..5a8d08a9 100644 --- a/README.md +++ b/README.md @@ -62,12 +62,12 @@ Understanding and learning this knowledge in advance will greatly help the use o ## Sponsors - + -Become a sponsor and get your logo on our README on GitHub with a link to your site. [Become a sponsor](https://www.paypal.me/?) +Become a sponsor and get your logo on our README on GitHub with a link to your site. [Become a sponsor](https://www.paypal.me/YamelSenih) ## Features @@ -129,6 +129,7 @@ Become a sponsor and get your logo on our README on GitHub with a link to your s - Dropzone - Sticky - CountTo + - ADempiere supported - Window - Process @@ -204,7 +205,7 @@ Detailed changes for each release are documented in the [release notes](https:// If you find this project useful, you can help this make a better UI -[Paypal Me](https://www.paypal.me/?) +[Paypal Me](https://www.paypal.me/YamelSenih) ## Browsers support diff --git a/package.json b/package.json index 778a7ecc..931ac4b2 100644 --- a/package.json +++ b/package.json @@ -22,12 +22,7 @@ "test:ci": "npm run lint && npm run test:unit" }, "dependencies": { - "@adempiere/grpc-access-client": "^1.2.3", - "@adempiere/grpc-core-client": "^1.2.4", - "@adempiere/grpc-data-client": "^2.4.9", - "@adempiere/grpc-dictionary-client": "^1.4.5", - "@adempiere/grpc-enrollment-client": "^1.1.2", - "@adempiere/grpc-pos-client": "^1.4.1", + "@toast-ui/vue-editor": "^2.4.0", "axios": "0.19.2", "clipboard": "2.0.6", "codemirror": "5.56.0", @@ -57,7 +52,7 @@ "vue-i18n": "8.19.0", "vue-multipane": "^0.9.5", "vue-resize": "^0.5.0", - "vue-router": "3.3.4", + "vue-router": "3.4.3", "vue-shortkey": "^3.1.7", "vue-split-panel": "^1.0.4", "vue-splitpane": "1.0.6", @@ -68,6 +63,7 @@ "devDependencies": { "@vue/cli-plugin-babel": "4.4.6", "@vue/cli-plugin-eslint": "4.4.6", + "@vue/cli-plugin-pwa": "4.5.6", "@vue/cli-plugin-unit-jest": "4.4.6", "@vue/cli-service": "4.4.6", "@vue/test-utils": "1.0.3", @@ -80,6 +76,7 @@ "connect": "3.7.0", "eslint": "7.5.0", "eslint-plugin-vue": "6.2.2", + "fs": "0.0.1-security", "html-webpack-plugin": "4.3.0", "husky": "4.2.5", "lint-staged": "10.2.11", diff --git a/public/img/icons/favicon-16x16.png b/public/img/icons/favicon-16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..ac0c993f389235ee008b153eba870fef2f9a6558 GIT binary patch literal 417 zcmV;S0bc%zP)*k-JJmQ4mGf%)J_g5R5kY1T7SN6!`!@Ky8Ahwmu-0 z62TAD5aF}|vJ&sf}RLPRjFyE}W%teJB*{Ci2uY2$Vj zPjg^@cNzh7X8jh^*LlpQexLILs#@Ugt*Q-UtJn)nB2q_W8RR|el|3K}vV>?U@(h&& zcE{>Xfao-kz_>)cGO9;W;Tj=_N)`)NL24jRyuF?Pgn+#Hh?~I-j5Cl;oV!50003t` z&ZR&{5Pd-Gl$CU)2}qXGzz`x8G`PaKZPXrto92dMKpE&mbieU!QFRt`9jJE>x`x>} z`1hzBf>Y2PM5&6+aK0EP_7S5Ub$142hih%!{XhBwNXu}OXZ$ep00000 LNkvXXu0mjf6kezO literal 0 HcmV?d00001 diff --git a/public/img/icons/favicon-32x32.png b/public/img/icons/favicon-32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..5a12bbcb56da563aa0c76758c3d3aff5761e500c GIT binary patch literal 965 zcmV;$13LVPP))HUIsdXm&fu5^<~7xHHh&!&--?Bco!k(aqZXF{(mQ}nVPSYxWaERGwK?>HIyym% z8s5#YYkVOcpg5aDbs7svlNvn&_AA09X2~jd8Tb^DMZgnm2+>hQh6z5mwk}&BN!|sq zbb!90TM(IORx7%Q3p;S}99e$|7zd-#75RqsNAKn2*k*ziz)m4r#@LEPMa&Phsuu$} zz{8^_&n>N;f#(k8QN17YnUyFA;UKtQ$huLmR}kv0Lot3D$sxQ<9KVf5pF^~p;Ab)a z1gcA`+P{d@-&mb)Er9h8gWQI#jJ`+!-Xu=$Aj&+1mroG=aZOyX4Bi#6(1UO{QT#Z# zw+Qxavk>ekXO|Cm22g(&*j1}mzQaNZWE;UvA$A5IK3X$)=fSv$;J1*C1eFq^pkkQK zuRu+>V8n#!4MyKS^bhB)5m)TDKx^FA!>bAbJXbrMl6dKY>Puh0|DgkGg-AINpKC z2159nDECFXMl}G6MMa~ni1ao)s?pE*+B~Y;akXA7XcIu>PLgOhUP`DA&=+Medla{v zA<@(LY!3-L5qS_ZMQk6BTw6^C7`$f?GTR8gHCDl|L*v)5aAhkwfPvWrF8U1fyOjm_tb0ew@cmvu-qmH8=H3@z``XM8&czfZ|#{IY3mXNvx6K9 z$I}3m;%p2yjZsK5{R34o_Vdz>^)y3F|IkK^E&s}I7oB67!yRoDXD_99XdUJ{JZ*nd nF1N&!Bc~cLU3Jyfe^h?}1Vm$*FWXv-00000NkvXXu0mjf)&Z}` literal 0 HcmV?d00001 diff --git a/public/index.html b/public/index.html index e9185009..b786772e 100644 --- a/public/index.html +++ b/public/index.html @@ -3,6 +3,7 @@ + @@ -11,5 +12,16 @@
+ diff --git a/public/logo.png b/public/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..501dcadab17c144db8a43381d66fa225da4619d0 GIT binary patch literal 1794 zcmV+d2mSboP)5 z+YXaON&G`-#?ZYGWsn#(W+KSg*0rl!1q_aX>59X((3g9k=bU5Cxwo~w_xASQ#)e*U zze!)tx%c@!zwi0IAIWZ#%YLGx=eu}`2Z_^jqR_11 z1)$Y-npZtc*`(T@TYzB`#>|y^C7XVDYCA-p5eUT&OoYNDl;0v2)G2 ziLJ5(X!B+KVE)9R5TK$MqaU5TUAltpJs&}s4XAi7)SDeVAGAIO!^b9XmmX7^&4h`| z3ML2}sMZa1Oi|MIWbJqDUyJeBv}^mneb(rbRdSF#PV+6JlebDE)pl+H^5Pv(AVF9% zD(Xf>uL0L1f`%8oT>XghTihG#(}@(#deDHZiHcyK+*WIk(S1iO1aN)&AY zy&XTiqG;Lh154^KUtj*O*^$!v9{hxdP8AS5dYByzeQtgA>Mq{s{XKs8xq=D_B1h=a z{)Jq4vl&SJ~*7E{yA391h`9oTJ4nh0~UbqfbNRF_C6v8}40r#0XQT(*;T41A# zmmCd=(=nPoBoVZqT2GTu2!4iA+I?P#mc@nF7bEx%L1Gtv_yB&;f#*HXk}v*&_U=Y@ zHT02=??go}xnz(Fx2I1aUVE<4OJ*je;>`p#m*x4mwURb}X6UWwsq1aD^lAP3`?*T~ z4x_s8i#S2Jz+gx_YuX=M_w0EGiS^(e|@<}CM zt-tc%?V zPR>LAjf#FfouuNV7F}G2=QrfJo=e}+KS|Xd;K$vUW5gFQ$_D#aNg9a`_Y$QC-1o|b zi$!xg?OjXRRzHN`#VK-v5QI6zuEw*oBjp8mA^jk)*Rwt?!~wo}-5|c)fFFL?owAUh zWXYKuX<7aTu;10Ba$)O~5bwhaug$D^Wx`U{N>M6C$j6I`n4VPYXb+DwqB%PXXr z)Bh9AE4yhsvj*XP#wCStLH4EG>s)8y=wC7Vq}wYO0*%o_+10`cPmxaD$6VYNLE$$( z{BnYL^zJ-DXyQJ7RbavRcLo7cx>T9ba%!e`uiXJa?eJ+1V}{1%b=Hqxsr znUo(wq@Sd@;Ud52yM&?WW|w_!92<3*mX*^ch$5tnK%Cl&A9^nMCnGaqKFxjC5764P z0#DwLFg|8dRTl`?WJ=s0x*>3x3Y!BW^dWvy`zDLdTOP`nB0U*jyLRfO^O zmUJ$8JMAZzfxj`o&9TWKRv`Ch2+A)}yZGKb;^Xy6iD#YvYxd!p%}mZ1=~015gw86K ztaIrY;;|zbcCvlt%lxSCDu}*^Kq9hD^I)oA2Qf1#v2?Q)635 z4Hq6Yf*MfVjxn7)^3op}Nu4FEy~c*W`@HVzAuhc6eWFyR_Y?FZy`x;&`yx$Eiq;b= z@zfstU^#J=kr$`;lDui8d{RF@R?8?&1zpAYbkxaxYlms;`7}bVo_0L22O`9+>^Xe} z-&oa8$KMVhy`2~Wl1a(kR}KR|$a`-0>3VjbZbHY~@cql39DA5?YJk8zSqdS@?PWSn zZh+t!jLt7EHl1p76wG-9^&nRi9q3%9)GvS-06vKH8qsP5#BtE)5n>QMd7k1!zzqb6 zrBmi9KVjRaPFfniQYxvbmNN1lf6~GAUYRnpPod@q%?l zC*Rz6tH>buWvPUwl5%$tVx#ln>0lKrr{?6wrB%F~`@+m1cpURi(GDUP|LZ8Ew*@b} zwCp>AIfbxR+)vBYJBXQ(A(cEk literal 0 HcmV?d00001 diff --git a/public/manifest.json b/public/manifest.json new file mode 100644 index 00000000..1ecc6006 --- /dev/null +++ b/public/manifest.json @@ -0,0 +1,15 @@ +{ + "name": "ADempiere-Vue", + "short_name": "AD-Vue", + "icons": [ + { + "src": "./logo.png", + "sizes": "200x200", + "type": "image/png" + } + ], + "start_url": "/adempiere-vue/", + "display": "standalone", + "background_color": "#2d3a4b", + "theme_color": "#3d5165" +} \ No newline at end of file diff --git a/src/api/ADempiere/browser.js b/src/api/ADempiere/browser.js index 1dd31861..e73d66b7 100644 --- a/src/api/ADempiere/browser.js +++ b/src/api/ADempiere/browser.js @@ -1,28 +1,69 @@ // Get Instance for connection -import { BusinessDataInstance as Instance } from '@/api/ADempiere/instances.js' +import { + ApiRest as requestRest, + evaluateResponse +} from '@/api/ADempiere/instances.js' /** * Request a browser search * @param {string} uuid + * @param {string} tableName + * @param {array} parametersList, This allows follow structure: + * [{ + * columnName, + * key + * }] + * @param {array} filters + * @param {array} columns * @param {string} query * @param {string} whereClause + * @param {number} limit * @param {string} orderByClause * @param {string} nextPageToken - * @param {array} parametersList, This allows follow structure: - * [{ - * columnName, - * value - * }] */ -export function getBrowserSearch({ uuid, parametersList = [], query, whereClause, orderByClause, nextPageToken: pageToken, pageSize }) { - // Run browser - return Instance.call(this).requestListBrowserSearch({ - uuid, - parametersList, - query, - whereClause, - orderByClause, - pageToken, - pageSize +export function requestBrowserSearch({ + uuid, + parametersList = [], + tableName, + query, + whereClause, + orderByClause, + limit, + nextPageToken: pageToken, + pageSize +}) { + const filters = parametersList.map(parameter => { + return { + key: parameter.columnName, + value: parameter.value, + values: parameter.values + } }) + + return requestRest({ + url: '/ui/list-browser-items', + data: { + // Running Parameters + uuid, + table_name: tableName, + // DSL Query + filters, + // Custom Query + query, + where_clause: whereClause, + order_by_clause: orderByClause, + limit + }, + params: { + // Page Data + page_token: pageToken, + page_size: pageSize + } + }) + .then(evaluateResponse) + .then(responseBrowserSearch => { + const { convertEntityList } = require('@/utils/ADempiere/apiConverts/persistence.js') + + return convertEntityList(responseBrowserSearch) + }) } diff --git a/src/api/ADempiere/constants.js b/src/api/ADempiere/constants.js index 3e18774f..3835b6b1 100644 --- a/src/api/ADempiere/constants.js +++ b/src/api/ADempiere/constants.js @@ -1,13 +1,5 @@ -const proxyAddress = process.env.VUE_APP_PROXY_ADDRESS || 'localhost' -const proxyPort = process.env.VUE_APP_PROXY_PORT || '8989' +const apiRestAddress = process.env.VUE_APP_API_REST_ADDRESS || '0.0.0.0' +const apiRestPort = process.env.VUE_APP_API_REST_PORT || '8085' -export const API_ADDRESS = `http://${proxyAddress}:${proxyPort}` - -export const ACCESS_ADDRESS = `${API_ADDRESS}/access` - -export const DICTIONARY_ADDRESS = `${API_ADDRESS}/dictionary` - -export const BUSINESS_DATA_ADDRESS = `${API_ADDRESS}/businessdata` - -export const ENROLLMENT_ADDRESS = `${API_ADDRESS}/enrollment` +export const API_REST_ADDRESS = `http://${apiRestAddress}:${apiRestPort}/adempiere-api` diff --git a/src/api/ADempiere/dashboard/dashboard.js b/src/api/ADempiere/dashboard/dashboard.js index f13b0f9f..86e29179 100644 --- a/src/api/ADempiere/dashboard/dashboard.js +++ b/src/api/ADempiere/dashboard/dashboard.js @@ -2,36 +2,141 @@ // please if you want to implement a custom dashboard create a new fielwith api definition // Get Instance for connection -import { BusinessDataInstance as Instance } from '@/api/ADempiere/instances.js' +import { + ApiRest as requestRest, + evaluateResponse +} from '@/api/ADempiere/instances.js' // Get Recent Items based on selection option -export function getRecentItems({ pageToken, pageSize }) { - return Instance.call(this).requestListRecentItems({ pageToken, pageSize }) +export function requestListRecentItems({ + userUuid, + roleUuid, + pageToken, + pageSize +}) { + return requestRest({ + url: '/logs/list-recent-items', + data: { + user_uuid: userUuid, + role_uuid: roleUuid, + current_session: true + }, + params: { + // Page Data + pageToken, + pageSize + } + }) + .then(evaluateResponse) + .then(recentItmesReponse => { + const { convertRecentItemsList } = require('@/utils/ADempiere/apiConverts/dashboard.js') + + return convertRecentItemsList(recentItmesReponse) + }) } /** * Request Favorites List * @param {string} userUuid */ -export function getFavoritesFromServer({ userUuid, pageToken, pageSize }) { - return Instance.call(this).requestListFavorites({ userUuid, pageToken, pageSize }) +export function getFavoritesFromServer({ + userId, + userUuid, + pageToken, + pageSize +}) { + return requestRest({ + url: '/dashboard/list-favorites', + data: { + user_id: userId, + user_uuid: userUuid + }, + params: { + // Page Data + pageToken, + pageSize + } + }) + .then(evaluateResponse) + .then(favoritesListReponse => { + const { convertFavorite } = require('@/utils/ADempiere/apiConverts/dashboard.js') + + return { + recordCount: favoritesListReponse.record_count, + favoritesList: favoritesListReponse.records.map(favorite => { + return convertFavorite(favorite) + }), + nextPageToken: favoritesListReponse.next_page_token + } + }) } // Get pending documents -export function getPendingDocumentsFromServer({ userUuid, roleUuid, pageToken, pageSize }) { - return Instance.call(this).requestListPendingDocuments({ - userUuid, - roleUuid, - pageToken, - pageSize +export function getPendingDocumentsFromServer({ + userId, + userUuid, + roleId, + roleUuid, + pageToken, + pageSize +}) { + return requestRest({ + url: '/dashboard/list-pending-documents', + data: { + user_id: userId, + user_uuid: userUuid, + role_id: roleId, + role_uuid: roleUuid + }, + params: { + // Page Data + pageToken, + pageSize + } }) + .then(evaluateResponse) + .then(pendingDocumentsListResponse => { + const { convertPendingDocument } = require('@/utils/ADempiere/apiConverts/dashboard.js') + + return { + recordCount: pendingDocumentsListResponse.record_count, + pendingDocumentsList: pendingDocumentsListResponse.records.map(pendingDocument => { + return convertPendingDocument(pendingDocument) + }), + nextPageToken: pendingDocumentsListResponse.next_page_token + } + }) } // List all dashboard for role -export function requestLisDashboards({ roleUuid, pageToken, pageSize }) { - return Instance.call(this).requestListDashboards({ - roleUuid, - pageToken, - pageSize +export function requestLisDashboards({ + roleId, + roleUuid, + pageToken, + pageSize +}) { + return requestRest({ + url: '/dashboard/list-dashboards', + data: { + role_id: roleId, + role_uuid: roleUuid + }, + params: { + // Page Data + pageToken, + pageSize + } }) + .then(evaluateResponse) + .then(dashboardsListResponse => { + const { convertDashboard } = require('@/utils/ADempiere/apiConverts/dashboard.js') + + return { + recordCount: dashboardsListResponse.record_count, + dashboardsList: dashboardsListResponse.records.map(favorite => { + return convertDashboard(favorite) + }), + nextPageToken: dashboardsListResponse.next_page_token + } + }) } diff --git a/src/api/ADempiere/dictionary.js b/src/api/ADempiere/dictionary.js index 4a279e49..0a2b5519 100644 --- a/src/api/ADempiere/dictionary.js +++ b/src/api/ADempiere/dictionary.js @@ -1,78 +1,177 @@ // Get Instance for connection -import { DictionaryInstance as Instance } from '@/api/ADempiere/instances.js' +import { + ApiRest as requestRest, + evaluateResponse +} from '@/api/ADempiere/instances.js' -export function getWindow({ uuid, id, isWithTabs = true }) { - return Instance.call(this).requestWindow({ - uuid, - id, - isWithTabs +/** + * Request dictionary Window metadata + * @param {string} uuid universally unique identifier + * @param {number} id, identifier + */ +export function requestWindowMetadata({ + uuid, + id +}) { + return requestRest({ + url: '/dictionary/window', + method: 'get', + params: { + uuid, + id + } }) + .then(evaluateResponse) + .then(windowResponse => { + const { convertWindow } = require('@/utils/ADempiere/apiConverts/dictionary.js') + + return convertWindow(windowResponse) + }) } -export function getProcess({ uuid, id }) { - return Instance.call(this).requestProcess({ - uuid, - id, - isWithFields: true +/** + * Request dictionary Process/Report metadata + * @param {string} uuid universally unique identifier + * @param {number} id, identifier + */ +export function requestProcessMetadata({ + uuid, + id +}) { + return requestRest({ + url: '/dictionary/process', + method: 'get', + params: { + uuid, + id + } }) + .then(evaluateResponse) + .then(processResponse => { + const { convertProcess } = require('@/utils/ADempiere/apiConverts/dictionary.js') + + return convertProcess(processResponse) + }) } -export function getBrowser({ uuid, id }) { - return Instance.call(this).requestBrowser({ - uuid, - id +/** + * Request dictionary Smart Browser metadata + * @param {string} uuid universally unique identifier + * @param {number} id, identifier + */ +export function requestBrowserMetadata({ + uuid, + id +}) { + return requestRest({ + url: '/dictionary/browser', + method: 'get', + params: { + uuid, + id + } }) + .then(evaluateResponse) + .then(browserResponse => { + const { convertBrowser } = require('@/utils/ADempiere/apiConverts/dictionary.js') + + return convertBrowser(browserResponse) + }) } -export function getTab({ uuid, id, isWithFields = true }) { - return Instance.call(this).requestTab({ - uuid, - id, - isWithFields +/** + * Request dictionary Form metadata + * @param {string} uuid universally unique identifier + * @param {number} id, integer identifier + */ +export function requestForm({ + uuid, + id +}) { + return requestRest({ + url: '/dictionary/form', + method: 'get', + params: { + uuid, + id + } }) + .then(evaluateResponse) + .then(formResponse => { + const { convertForm } = require('@/utils/ADempiere/apiConverts/dictionary.js') + + return convertForm(formResponse) + }) } -export function getField({ - fieldUuid, +export function requestFieldMetadata({ + uuid, columnUuid, elementUuid, + fieldUuid, // TableName + ColumnName tableName, columnName, elementColumnName }) { - return Instance.call(this).requestField({ - fieldUuid, - columnUuid, - elementUuid, - // TableName + ColumnName - tableName, - columnName, - elementColumnName + return requestRest({ + url: '/dictionary/field', + method: 'get', + params: { + uuid, + column_uuid: columnUuid, + element_uuid: elementUuid, + field_uuid: fieldUuid, + // TableName + ColumnName + table_name: tableName, + column_name: columnName, + element_column_name: elementColumnName + } }) + .then(evaluateResponse) + .then(fieldResponse => { + const { convertField } = require('@/utils/ADempiere/apiConverts/field.js') + + return convertField(fieldResponse) + }) } -/** - * Request Form - * @param {string} uuid - * @param {number} id, integer identifier - */ -export function requestForm({ uuid, id }) { - return Instance.call(this).requestForm({ - uuid, - id +export function requestReference({ + uuid, + columnName +}) { + return requestRest({ + url: '/dictionary/reference', + method: 'get', + params: { + uuid, + column_name: columnName + } }) + .then(evaluateResponse) + .then(validationResponse => { + const { convertReference } = require('@/utils/ADempiere/apiConverts/field.js') + + return convertReference(validationResponse) + }) } -export function requestReference({ referenceUuid, columnName }) { - return Instance.call(this).requestReference({ - referenceUuid, - columnName +export function requestValidationRule({ + uuid, + id +}) { + return requestRest({ + url: '/dictionary/validation', + method: 'get', + params: { + uuid, + id + } }) -} + .then(evaluateResponse) + .then(validationResponse => { + const { convertValidationRule } = require('@/utils/ADempiere/apiConverts/dictionary.js') -export function requestValidationRule({ validationRuleUuid }) { - return Instance.call(this).requestValidationRule({ - validationRuleUuid - }) + return convertValidationRule(validationResponse) + }) } diff --git a/src/api/ADempiere/enrollment.js b/src/api/ADempiere/enrollment.js index be84721e..48a25920 100644 --- a/src/api/ADempiere/enrollment.js +++ b/src/api/ADempiere/enrollment.js @@ -1,5 +1,11 @@ // Get Instance for connection -import { EnrollmentInstance as Instance } from '@/api/ADempiere/instances.js' +import { + ApiRest as requestRest, + evaluateResponse +} from '@/api/ADempiere/instances.js' + +const clientVersion = '1.0.0' +const applicationType = 'ADempiere-Vue' /** * enroll User @@ -7,21 +13,61 @@ import { EnrollmentInstance as Instance } from '@/api/ADempiere/instances.js' * @param {string} userData.userName * @param {string} userData.password */ -export function enrollmentUser({ name, userName, password, eMail }) { - return Instance.call(this).enrollUser({ - name, - userName, - password, - eMail +export function requestEnrollUser({ + name, + userName, + password, + eMail +}) { + return requestRest({ + url: '/enrollment/enroll', + data: { + user_name: userName, + name, + email: eMail, + password, + client_version: clientVersion, + application_type: applicationType + } }) + .then(evaluateResponse) + .then(enrollResponse => { + return { + userName: enrollResponse.user_name, + name: enrollResponse.name, + eMail: enrollResponse.email + } + }) } /** * Request from forgot password * @param {string} eMailOrUserName */ -export function forgotPassword(eMailOrUserName) { - return Instance.call(this).requestResetPassword(eMailOrUserName) +export function requestForgotPassword(eMailOrUserName) { + let userName, eMail + if (String(eMailOrUserName).includes('@')) { + eMail = eMailOrUserName + } else { + userName = eMailOrUserName + } + + return requestRest({ + url: '/enrollment/reset-password', + data: { + user_name: userName, + email: eMail, + client_version: clientVersion, + application_type: applicationType + } + }) + .then(evaluateResponse) + .then(forgotResponse => { + return { + responseType: forgotResponse.response_type, + responseTypeStatus: forgotResponse.response_type_status + } + }) } /** @@ -29,6 +75,49 @@ export function forgotPassword(eMailOrUserName) { * @param {string} token * @param {string} password */ -export function resetPasswordFromToken({ token, password }) { - return Instance.call(this).resetPasswordFromToken({ token, password }) +export function requestChangePassword({ + token, + password +}) { + return requestRest({ + url: '/enrollment/change-password', + data: { + token, + password, + client_version: clientVersion, + application_type: applicationType + } + }) + .then(evaluateResponse) + .then(changePasswordResponse => { + return { + responseType: changePasswordResponse.response_type, + responseTypeStatus: changePasswordResponse.response_type_status + } + }) +} + +/** + * Request from reset password with token + * @param {string} token + * @param {string} password + */ +export function requestActivateUser({ + token +}) { + return requestRest({ + url: '/enrollment/activate-user', + data: { + token, + client_version: clientVersion, + application_type: applicationType + } + }) + .then(evaluateResponse) + .then(activateUserResponse => { + return { + responseType: activateUserResponse.response_type, + responseTypeStatus: activateUserResponse.response_type_status + } + }) } diff --git a/src/api/ADempiere/field/location.js b/src/api/ADempiere/field/location.js index 82291df9..4fa7320c 100644 --- a/src/api/ADempiere/field/location.js +++ b/src/api/ADempiere/field/location.js @@ -2,17 +2,16 @@ const tableName = 'C_Location' /** * Create a location and return the created entity - * @param {array} attributes + * @param {array} attributesList */ export function requestCreateLocationAddress({ - attributes + attributesList }) { - const { createEntity } = require('@/api/ADempiere/persistence.js') + const { requestCreateEntity } = require('@/api/ADempiere/persistence.js') - return createEntity({ + return requestCreateEntity({ tableName, - attributes, - formatReturn: 'object' + attributesList }) } @@ -25,9 +24,9 @@ export function requestGetLocationAddress({ id, uuid }) { - const { getEntity } = require('@/api/ADempiere/persistence.js') + const { requestGetEntity } = require('@/api/ADempiere/persistence.js') - return getEntity({ + return requestGetEntity({ tableName, recordId: id, recordUuid: uuid @@ -38,20 +37,19 @@ export function requestGetLocationAddress({ * Update an existing location by id or uuid * @param {number} id as C_Location_ID * @param {string} uuid - * @param {array} attributes, all attributes (including empty values) + * @param {array} attributesList, all attributes (including empty values) */ export function requestUpdateLocationAddress({ id, uuid, - attributes + attributesList }) { - const { updateEntity } = require('@/api/ADempiere/persistence.js') + const { requestUpdateEntity } = require('@/api/ADempiere/persistence.js') - return updateEntity({ + return requestUpdateEntity({ tableName, recordId: id, recordUuid: uuid, - attributes, - formatReturn: 'object' + attributesList }) } diff --git a/src/api/ADempiere/field/locator.js b/src/api/ADempiere/field/locator.js index 08db43d8..c8ce7c9e 100644 --- a/src/api/ADempiere/field/locator.js +++ b/src/api/ADempiere/field/locator.js @@ -1,10 +1,12 @@ -export function getLocatorList({ +const tableName = 'M_Locator' + +export function requestLocatorList({ warehouseId }) { - const { getEntitiesList } = require('@/api/ADempiere/persistence') + const { requestListEntities } = require('@/api/ADempiere/persistence.js') - return getEntitiesList({ - tableName: 'M_Locator', + return requestListEntities({ + tableName, whereClause: `M_Warehouse_ID = ${warehouseId}` }) } diff --git a/src/api/ADempiere/form/point-of-sales.js b/src/api/ADempiere/form/point-of-sales.js index 13282a22..0409a48b 100644 --- a/src/api/ADempiere/form/point-of-sales.js +++ b/src/api/ADempiere/form/point-of-sales.js @@ -1,78 +1,144 @@ -import { POSInstance as Instance } from '@/api/ADempiere/instances.js' -import Criteria from '@/utils/ADempiere/criteria.js' +// Get Instance for connection +import { + ApiRest as requestRest, + evaluateResponse +} from '@/api/ADempiere/instances.js' /** - * method in price-checking.js as getProductPrice + * method in api/price-checking.js as requestGetProductPrice */ -export { getProductPrice as findProduct } from '@/api/ADempiere/form/price-checking.js' +export { requestGetProductPrice as findProduct } from '@/api/ADempiere/form/price-checking.js' +export { requestGetConversionRate } from '@/api/ADempiere/system-core.js' // List Point of sales -export function requestlistPointOfSales({ +export function requestGetPointOfSales({ + posUuid +}) { + return requestRest({ + url: '/pos/get-point-of-sales', + data: { + point_of_sales_uuid: posUuid + } + }) + .then(evaluateResponse) + .then(posResponse => { + const { convertPointOfSales } = require('@/utils/ADempiere/apiConverts/pos.js') + + return convertPointOfSales(posResponse) + }) +} + +// List Point of sales +export function requestListPointOfSales({ userUuid, pageSize, pageToken }) { - return Instance.call(this).listPointOfSales({ - userUuid, - pageSize, - pageToken + return requestRest({ + url: '/pos/list-point-of-sales', + data: { + user_uuid: userUuid + }, + params: { + page_size: pageSize, + page_token: pageToken + } }) + .then(evaluateResponse) + .then(posListResponse => { + const { convertPointOfSales } = require('@/utils/ADempiere/apiConverts/pos.js') + + return { + nextPageToken: posListResponse.next_page_token, + recordCount: posListResponse.record_count, + sellingPointsList: posListResponse.records.map(pos => { + return convertPointOfSales(pos) + }) + } + }) } // Create order from POS -export function createOrder({ +export function requestCreateOrder({ posUuid, customerUuid, - documentTypeUuid + documentTypeUuid, + salesRepresentativeUuid }) { - return Instance.call(this).createOrder({ - posUuid, - customerUuid, - documentTypeUuid + return requestRest({ + url: '/pos/create-order', + data: { + pos_uuid: posUuid, + customer_uuid: customerUuid, + document_type_uuid: documentTypeUuid, + sales_representative_uuid: salesRepresentativeUuid + } }) + .then(evaluateResponse) + .then(createOrderResponse => { + const { convertOrder } = require('@/utils/ADempiere/apiConverts/pos.js') + + return convertOrder(createOrderResponse) + }) } // Update order from POS -export function updateOrder({ +export function requestUpdateOrder({ orderUuid, posUuid, customerUuid, description }) { - return Instance.call(this).updateOrder({ - orderUuid, - posUuid, - customerUuid, - description + return requestRest({ + url: '/pos/update-order', + data: { + order_uuid: orderUuid, + pos_uuid: posUuid, + customer_uuid: customerUuid, + description + } }) + .then(evaluateResponse) + .then(updateOrderResponse => { + const { convertOrder } = require('@/utils/ADempiere/apiConverts/pos.js') + + return convertOrder(updateOrderResponse) + }) } -// Create order line from order uuid and product -export function createOrderLine({ - orderUuid, - warehouseUuid, - productUuid, - chargeUuid, - description, - quantity, - price, - discountRate +// Get order from uuid +export function requestGetOrder(orderUuid) { + return requestRest({ + url: '/pos/update-order', + data: { + order_uuid: orderUuid + } + }) + .then(evaluateResponse) + .then(getOrderResponse => { + const { convertOrder } = require('@/utils/ADempiere/apiConverts/pos.js') + + return convertOrder(getOrderResponse) + }) +} + +// Create order from POS +export function requestDeleteOrder({ + posUuid, + customerUuid, + documentTypeUuid, + salesRepresentativeUuid }) { - return Instance.call(this).createOrderLine({ - orderUuid, - warehouseUuid, - productUuid, - chargeUuid, - description, - quantity, - price, - discountRate + return requestRest({ + url: '/pos/delete-order', + data: { + pos_uuid: posUuid, + customer_uuid: customerUuid, + document_type_uuid: documentTypeUuid, + sales_representative_uuid: salesRepresentativeUuid + } }) -} - -// Create order line from order uuid and product -export function getOrder(orderUuid) { - return Instance.call(this).getOrder({ orderUuid }) + .then(evaluateResponse) } // List orders from pos uuid @@ -92,9 +158,12 @@ export function requestListOrders({ pageSize, pageToken }) { - const criteria = new Criteria({ tableName: 'C_Order' }) - /* + const Criteria = require('@/utils/ADempiere/criteria.js') + const criteria = new Criteria({ + tableName: 'C_Order' + }) + criteria.addCondition({ columnName: 'DocumentNo', value: documentNo @@ -131,23 +200,71 @@ export function requestListOrders({ }) */ - return Instance.call(this).listOrders({ - posUuid, - documentNo, - businessPartnerUuid, - grandTotal, - openAmount, - isPaid, - isProcessed, - isAisleSeller, - isInvoiced, - dateOrderedFrom, - dateOrderedTo, - salesRepresentativeUuid, - criteria: criteria.getCriteria(), - pageSize, - pageToken + return requestRest({ + url: '/pos/list-orders', + data: { + pos_uuid: posUuid, + document_no: documentNo, + business_partner_uuid: businessPartnerUuid, + sales_representative_uuid: salesRepresentativeUuid, + grand_total: grandTotal, + open_amount: openAmount, + is_paid: isPaid, + is_processed: isProcessed, + is_aisle_seller: isAisleSeller, + is_invoiced: isInvoiced, + date_ordered_from: dateOrderedFrom, + date_ordered_to: dateOrderedTo + }, + params: { + page_size: pageSize, + page_token: pageToken + } }) + .then(evaluateResponse) + .then(ordersListResponse => { + const { convertOrder } = require('@/utils/ADempiere/apiConverts/core.js') + + return { + nextPageToken: ordersListResponse.next_page_token, + recordCount: ordersListResponse.record_count, + ordersList: ordersListResponse.records.map(productPrice => { + return convertOrder(productPrice) + }) + } + }) +} + +// Create order line from order uuid and product +export function requestCreateOrderLine({ + orderUuid, + warehouseUuid, + productUuid, + chargeUuid, + description, + quantity, + price, + discountRate +}) { + return requestRest({ + url: '/pos/create-order-line', + data: { + order_uuid: orderUuid, + product_uuid: productUuid, + description, + quantity, + price, + discount_rate: discountRate, + charge_uuid: chargeUuid, + warehouse_uuid: warehouseUuid + } + }) + .then(evaluateResponse) + .then(createOrderLineResponse => { + const { convertOrderLine } = require('@/utils/ADempiere/apiConverts/pos.js') + + return convertOrderLine(createOrderLineResponse) + }) } // updateOrderLine orders from pos uuid @@ -158,36 +275,80 @@ export function updateOrderLine({ price, discountRate }) { - return Instance.call(this).updateOrderLine({ - orderLineUuid, - description, - quantity, - price, - discountRate + return requestRest({ + url: '/pos/update-order-line', + data: { + is_add_quantity: true, + order_line_uuid: orderLineUuid, + description, + quantity, + price, + discount_rate: discountRate + } }) + .then(evaluateResponse) + .then(createOrderLineResponse => { + const { convertOrderLine } = require('@/utils/ADempiere/apiConverts/pos.js') + + return convertOrderLine(createOrderLineResponse) + }) } // delete Order Line -export function deleteOrderLine({ +export function requestDeleteOrderLine({ orderLineUuid }) { - return Instance.call(this).deleteOrderLine({ - orderLineUuid + return requestRest({ + url: '/pos/create-order-line', + data: { + order_line_uuid: orderLineUuid + } }) + .then(evaluateResponse) } -export function listOrderLines({ - orderUuid +export function requestListOrderLines({ + orderUuid, + pageSize, + pageToken }) { - return Instance.call(this).listOrderLines({ - orderUuid + return requestRest({ + url: '/pos/list-order-lines', + data: { + order_uuid: orderUuid + }, + params: { + page_size: pageSize, + page_token: pageToken + } }) + .then(evaluateResponse) + .then(ordersLineListResponse => { + const { convertOrderLine } = require('@/utils/ADempiere/apiConverts/pos.js') + + return { + nextPageToken: ordersLineListResponse.next_page_token, + recordCount: ordersLineListResponse.record_count, + orderLineList: ordersLineListResponse.records.map(productPrice => { + return convertOrderLine(productPrice) + }) + } + }) } export function getKeyLayout({ keyLayoutUuid }) { - return Instance.call(this).getKeyLayout({ - keyLayoutUuid + return requestRest({ + url: '/pos/get-key-layout', + data: { + key_layout_uuid: keyLayoutUuid + } }) + .then(evaluateResponse) + .then(keyLayoutResponse => { + const { convertKeyLayout } = require('@/utils/ADempiere/apiConverts/pos.js') + + return convertKeyLayout(keyLayoutResponse) + }) } // ListProductPrice @@ -198,21 +359,36 @@ export function requestListProductPrice({ warehouseUuid, validFrom, // Query - criteria, + // criteria, pageSize, pageToken }) { - return Instance.call(this).requestListProductPrice({ - searchValue, - priceListUuid, - businessPartnerUuid, - warehouseUuid, - validFrom, - // Query - criteria, - pageSize, - pageToken + return requestRest({ + url: '/pos/list-product-prices', + data: { + price_list_uuid: priceListUuid, + search_value: searchValue, + valid_from: validFrom, + business_partner_uuid: businessPartnerUuid, + warehouse_uuid: warehouseUuid + }, + params: { + page_size: pageSize, + page_token: pageToken + } }) + .then(evaluateResponse) + .then(productPriceListResponse => { + const { convertProductPrice } = require('@/utils/ADempiere/apiConverts/core.js') + + return { + nextPageToken: productPriceListResponse.next_page_token, + recordCount: productPriceListResponse.record_count, + productPricesList: productPriceListResponse.records.map(productPrice => { + return convertProductPrice(productPrice) + }) + } + }) } export function requestPrintOrder({ diff --git a/src/api/ADempiere/form/price-checking.js b/src/api/ADempiere/form/price-checking.js index 08175171..286839bf 100644 --- a/src/api/ADempiere/form/price-checking.js +++ b/src/api/ADempiere/form/price-checking.js @@ -1,7 +1,11 @@ -// Get Instance for connection -import { POSInstance as Instance } from '@/api/ADempiere/instances.js' +// Get Instance for connectionimport { +import { + ApiRest as requestRest, + evaluateResponse +} from '@/api/ADempiere/instances.js' -export function getProductPrice({ +// List Point of sales +export function requestGetProductPrice({ searchValue, upc, value, @@ -11,14 +15,23 @@ export function getProductPrice({ warehouseUuid, validFrom }) { - return Instance.call(this).getProductPrice({ - searchValue, - upc, - value, - name, - priceListUuid, - businessPartnerUuid, - warehouseUuid, - validFrom + return requestRest({ + url: '/pos/get-product-price', + data: { + search_value: searchValue, + upc, + value, + name, + price_list_uuid: priceListUuid, + business_partner_uuid: businessPartnerUuid, + warehouse_uuid: warehouseUuid, + valid_from: validFrom + } }) + .then(evaluateResponse) + .then(productPriceResponse => { + const { convertProductPrice } = require('@/utils/ADempiere/apiConverts/core.js') + + return convertProductPrice(productPriceResponse) + }) } diff --git a/src/api/ADempiere/instances.js b/src/api/ADempiere/instances.js index 8412376c..eadb5d0f 100644 --- a/src/api/ADempiere/instances.js +++ b/src/api/ADempiere/instances.js @@ -1,85 +1,72 @@ -// Get Instance for connection System Core -export const SystemCoreInstance = () => { - const SystemCore = require('@adempiere/grpc-core-client') - const { BUSINESS_DATA_ADDRESS } = require('@/api/ADempiere/constants') - const { getLanguage } = require('@/lang/index') - const { getToken, getCurrentOrganization, getCurrentWarehouse } = require('@/utils/auth') +/** + * Instance for connection to API RESTful with axios + * @author EdwinBetanc0urt + * @param {string} url to resource request + * @param {string} method rest, 'get' and 'post' (as default) + * @param {object} data body to send post request + * @param {object} params to send get uri + * @param {string} responseType default is 'json' + * @returns {function} + */ +export function ApiRest({ + url, + method = 'post', + data = {}, + params = {}, + responseType = 'json' +}) { + const setInterceptor = (request) => { + request.interceptors.response.use(response => { + return response.data + }, error => { + return Promise.reject(error) + }) + return request.interceptors + } + const { API_REST_ADDRESS } = require('@/api/ADempiere/constants.js') + const axios = require('axios') - return new SystemCore({ - host: BUSINESS_DATA_ADDRESS, - sessionUuid: getToken(), - organizationUuid: getCurrentOrganization(), - warehouseUuid: getCurrentWarehouse(), - language: getLanguage() || 'en_US' + const request = axios.create({ + baseURL: API_REST_ADDRESS, + // timeout: 10000, // 10s + headers: { + 'Content-Type': 'application/json;charset=UTF-8' + }, + responseType }) -} + request.interceptors = setInterceptor(request) -// Instance for connection Access (or Security) -export const AccessInstance = () => { - const Access = require('@adempiere/grpc-access-client') - const { ACCESS_ADDRESS } = require('@/api/ADempiere/constants') - const { getLanguage } = require('@/lang/index') - - return new Access({ - host: ACCESS_ADDRESS, - version: 'Version Epale', - language: getLanguage() || 'en_US' - }) -} - -// Instance for connection Business Data -export const BusinessDataInstance = () => { - const BusinessData = require('@adempiere/grpc-data-client') - const { BUSINESS_DATA_ADDRESS } = require('@/api/ADempiere/constants') - const { getLanguage } = require('@/lang/index') - const { getToken, getCurrentOrganization, getCurrentWarehouse } = require('@/utils/auth') - - return new BusinessData({ - host: BUSINESS_DATA_ADDRESS, - sessionUuid: getToken(), - organizationUuid: getCurrentOrganization(), - warehouseUuid: getCurrentWarehouse(), - language: getLanguage() || 'en_US' - }) -} - -// Get Instance for connection -export const DictionaryInstance = () => { - const Dictionary = require('@adempiere/grpc-dictionary-client') - const { DICTIONARY_ADDRESS } = require('@/api/ADempiere/constants') - const { getLanguage } = require('@/lang/index') const { getToken } = require('@/utils/auth') - - return new Dictionary({ - host: DICTIONARY_ADDRESS, - sessionUuid: getToken(), - language: getLanguage() || 'en_US' - }) -} - -// Instance for connection Enrollment -export const EnrollmentInstance = () => { - const Enrollment = require('@adempiere/grpc-enrollment-client') - const { ENROLLMENT_ADDRESS } = require('@/api/ADempiere/constants') - - return new Enrollment( - ENROLLMENT_ADDRESS, - 3.9, - 'ADempiere-Vue' - ) -} - -export const POSInstance = () => { - const POS = require('@adempiere/grpc-pos-client') - const { BUSINESS_DATA_ADDRESS } = require('@/api/ADempiere/constants') const { getLanguage } = require('@/lang/index') - const { getToken, getCurrentOrganization, getCurrentWarehouse } = require('@/utils/auth') + const language = getLanguage() || 'en_US' + params = { + token: getToken(), + language, + ...params + } - return new POS({ - host: BUSINESS_DATA_ADDRESS, - sessionUuid: getToken(), - organizationUuid: getCurrentOrganization(), - warehouseUuid: getCurrentWarehouse(), - language: getLanguage() || 'en_US' + return request({ + url, + method, + data, + params }) } + +/** + * Evaluate the response if is a success or error + * @author EdwinBetanc0urt + * @param {object} response + * @returns {mixed} + */ +export const evaluateResponse = (response) => { + if (response.code >= 400) { + const error = { + code: response.code, + message: response.result + } + throw error + } + + return response.result +} diff --git a/src/api/ADempiere/persistence.js b/src/api/ADempiere/persistence.js index b0ba7752..d97a911a 100644 --- a/src/api/ADempiere/persistence.js +++ b/src/api/ADempiere/persistence.js @@ -1,21 +1,38 @@ // Get Instance for connection -import { BusinessDataInstance as Instance } from '@/api/ADempiere/instances.js' +import { + ApiRest as requestRest, + evaluateResponse +} from '@/api/ADempiere/instances.js' /** * Create entity * @param {string} tableName * @param {array} attributesList */ -export function createEntity({ +export function requestCreateEntity({ tableName, - attributes, - formatReturn = 'array' + attributesList }) { - return Instance.call(this).requestCreateEntity({ - tableName, - attributesList: attributes, - formatToConvert: formatReturn + attributesList = attributesList.map(parameter => { + return { + key: parameter.columnName, + value: parameter.value + } }) + + return requestRest({ + url: '/data/create', + data: { + table_name: tableName, + attributes: attributesList + } + }) + .then(evaluateResponse) + .then(entityCreateResponse => { + const { convertEntity } = require('@/utils/ADempiere/apiConverts/persistence.js') + + return convertEntity(entityCreateResponse) + }) } /** @@ -25,20 +42,34 @@ export function createEntity({ * @param {string} recordUuid * @param {array} attributesList */ -export function updateEntity({ +export function requestUpdateEntity({ tableName, recordId, recordUuid, - attributes, - formatReturn = 'array' + attributesList }) { - return Instance.call(this).requestUpdateEntity({ - tableName, - recordId, - recordUuid, - attributesList: attributes, - formatToConvert: formatReturn + attributesList = attributesList.map(parameter => { + return { + key: parameter.columnName, + value: parameter.value + } }) + + return requestRest({ + url: '/data/update', + data: { + table_name: tableName, + id: recordId, + uuid: recordUuid, + attributes: attributesList + } + }) + .then(evaluateResponse) + .then(entityUpdateResponse => { + const { convertEntity } = require('@/utils/ADempiere/apiConverts/persistence.js') + + return convertEntity(entityUpdateResponse) + }) } /** @@ -47,12 +78,19 @@ export function updateEntity({ * @param {number} recordId * @param {string} recordUuid */ -export function deleteEntity({ tableName, recordId, recordUuid }) { - return Instance.call(this).requestDeleteEntity({ - tableName, - recordId, - recordUuid - }) +export function requestDeleteEntity({ + tableName, + recordId, + recordUuid +}) { + return requestRest({ + url: '/data/delete', + data: { + table_name: tableName, + id: recordId, + uuid: recordUuid + } + }).then(evaluateResponse) } /** @@ -64,22 +102,47 @@ export function deleteEntity({ tableName, recordId, recordUuid }) { export function rollbackEntity({ tableName, recordId, + recordUuid, eventType }) { - return Instance.call(this).requestRollbackEntity({ - tableName, - recordId, - eventTypeExecuted: eventType + return requestRest({ + url: '/data/rollback-entity', + data: { + table_name: tableName, + id: recordId, + uuid: recordUuid, + event_type: eventType + } }) + .then(evaluateResponse) + .then(entityResponse => { + const { convertEntity } = require('@/utils/ADempiere/apiConverts/persistence.js') + + return convertEntity(entityResponse) + }) } // Get entity from table name and record id or record uuid -export function getEntity({ tableName, recordId, recordUuid }) { - return Instance.call(this).requestGetEntity({ - tableName, - recordId, - recordUuid +export function requestGetEntity({ + tableName, + recordId, + recordUuid +}) { + return requestRest({ + url: '/data/entity', + method: 'get', + params: { + table_name: tableName, + uuid: recordUuid, + id: recordId + } }) + .then(evaluateResponse) + .then(entityResponse => { + const { convertEntity } = require('@/utils/ADempiere/apiConverts/persistence.js') + + return convertEntity(entityResponse) + }) } /** @@ -88,27 +151,57 @@ export function getEntity({ tableName, recordId, recordUuid }) { * @param {string} query * @param {string} whereClause * @param {array} conditionsList + * @param {array} columnsList // TODO: Add support on adempiere-vue * @param {string} orderByClause * @param {string} pageToken */ -export function getEntitiesList({ +export function requestListEntities({ tableName, query, whereClause, conditionsList = [], + columnsList = [], orderByClause, + limit, pageToken, pageSize }) { - return Instance.call(this).requestListEntities({ - tableName, - query, - whereClause, - conditionsList, - orderByClause, - pageToken, - pageSize + const filters = conditionsList.map(condition => { + const { value, operator, columnName, valueTo, values } = condition + return { + column_name: columnName, + value, + operator, + value_to: valueTo, + values + } }) + + return requestRest({ + url: '/data/list', + data: { + table_name: tableName, + // DSL Query + filters, + columns: columnsList, + // Custom Query + query, + where_clause: whereClause, + order_by_clause: orderByClause, + limit + }, + params: { + // Page Data + pageToken, + pageSize + } + }) + .then(evaluateResponse) + .then(entitiesListResponse => { + const { convertEntityList } = require('@/utils/ADempiere/apiConverts/persistence.js') + + return convertEntityList(entitiesListResponse) + }) } /** @@ -118,25 +211,54 @@ export function getEntitiesList({ * @param {string} recordUuid * @param {number} recordId */ -export function requestTranslations({ tableName, language, recordUuid, recordId, pageToken, pageSize }) { - return Instance.call(this).requestListTranslations({ - tableName, - recordUuid, - recordId, - language, - pageToken, - pageSize +export function requestTranslations({ + tableName, + language, + recordUuid, + recordId, + pageToken, + pageSize +}) { + return requestRest({ + url: '/ui/list-translations', + data: { + table_name: tableName, + id: recordId, + uuid: recordUuid + }, + params: { + language, + // Page Data + pageToken, + pageSize + } }) + .then(evaluateResponse) + .then(languageListResponse => { + const { convertTranslation } = require('@/utils/ADempiere/apiConverts/persistence.js') + + return { + nextPageToken: languageListResponse.next_page_token, + recordCount: languageListResponse.record_count, + translationsList: languageListResponse.records.map(record => { + return convertTranslation(record) + }) + } + }) } // Download a resource from file name -export function getResource({ resourceUuid }, callBack = { +export function requestResource({ resourceUuid }, callBack = { onData: () => {}, onStatus: () => {}, onEnd: () => {} }) { - const stream = Instance.call(this).getResource({ - resourceUuid + const stream = requestRest({ + url: '/resource', + method: 'get', + params: { + resource_uuid: resourceUuid + } }) stream.on('data', (response) => callBack.onData(response)) @@ -145,3 +267,34 @@ export function getResource({ resourceUuid }, callBack = { return stream } + +/** + * Get image with uri request + * @author EdwinBetanc0urt + * @param {string} file + * @param {number} width + * @param {number} height + * @param {string} operation fit, resize + * @returns {promise} with array buffer in response + */ +export function requestImage({ + file, + width = 300, + height = 300, + operation = 'fit' +}) { + const { getImagePath } = require('@/utils/ADempiere/resource.js') + + const { urn } = getImagePath({ + file, + width, + height, + operation + }) + + return requestRest({ + url: urn, + method: 'get', + responseType: 'arraybuffer' + }) +} diff --git a/src/api/ADempiere/private-access.js b/src/api/ADempiere/private-access.js index 2622a36c..c5705d15 100644 --- a/src/api/ADempiere/private-access.js +++ b/src/api/ADempiere/private-access.js @@ -1,29 +1,66 @@ // Get Instance for connection -import { BusinessDataInstance as Instance } from '@/api/ADempiere/instances.js' +import { + ApiRest as requestRest, + evaluateResponse +} from '@/api/ADempiere/instances.js' +import { convertPrivateAccess } from '@/utils/ADempiere/apiConverts/privateAccess.js' // Get private access for a record -export function getPrivateAccessFromServer({ tableName, recordId, userUuid }) { - return Instance.call(this).requestGetPrivateAccess({ - tableName, - recordId, - userUuid +export function requestGetPrivateAccess({ + tableName, + recordId, + recordUuid +}) { + return requestRest({ + url: '/ui/get-private-access', + data: { + table_name: tableName, + id: recordId, + uuid: recordUuid + } }) + .then(evaluateResponse) + .then(responsePrivateAccess => { + return convertPrivateAccess(responsePrivateAccess) + }) } // Lock a record for a user -export function lockPrivateAccessFromServer({ tableName, recordId, userUuid }) { - return Instance.call(this).requestLockPrivateAccess({ - tableName, - recordId, - userUuid +export function requestLockPrivateAccess({ + tableName, + recordId, + recordUuid +}) { + return requestRest({ + url: '/ui/lock-private-access', + data: { + table_name: tableName, + id: recordId, + uuid: recordUuid + } }) + .then(evaluateResponse) + .then(responsePrivateAccess => { + return convertPrivateAccess(responsePrivateAccess) + }) } // Unlock a record from a user -export function unlockPrivateAccessFromServer({ tableName, recordId, userUuid }) { - return Instance.call(this).requestUnlockPrivateAccess({ - tableName, - recordId, - userUuid +export function requestUnlockPrivateAccess({ + tableName, + recordId, + recordUuid +}) { + return requestRest({ + url: '/ui/unlock-private-access', + data: { + table_name: tableName, + id: recordId, + uuid: recordUuid + } }) + .then(evaluateResponse) + .then(responsePrivateAccess => { + return convertPrivateAccess(responsePrivateAccess) + }) } diff --git a/src/api/ADempiere/process.js b/src/api/ADempiere/process.js index 47eb30a8..5e2cab64 100644 --- a/src/api/ADempiere/process.js +++ b/src/api/ADempiere/process.js @@ -1,13 +1,17 @@ // Get Instance for connection -import { BusinessDataInstance as Instance } from '@/api/ADempiere/instances.js' +import { + ApiRest as requestRest, + evaluateResponse +} from '@/api/ADempiere/instances.js' /** * Request a process * This function allows follow structure: * @param {string} uuid, uuid from process to run - * @param {number} reportType - * @param {number} tableName, table name of tab, used only window + * @param {string} reportType, format to output report (pdf, html, csv, ...) + * @param {string} tableName, table name of tab, used only window * @param {number} recordId, record identifier, used only window + * @param {string} recordUuid, record universal unique identifier, used only window * @param {array} parametersList, parameters from process [{ columnName, value }] * @param {array} selectionsList, selection records, used only browser [{ @@ -15,22 +19,89 @@ import { BusinessDataInstance as Instance } from '@/api/ADempiere/instances.js' selectionValues: [{ columnName, value }] }] * @param {string} printFormatUuid + * @param {boolean} isSummary + * @param {number} tableSelectedId, used only browser // TODO: Add support on adempiere-vue + * @param {string} reportViewUuid */ -export function runProcess({ uuid, reportType, tableName, recordId, parametersList = [], selectionsList = [], printFormatUuid }) { - // Run Process - return Instance.call(this).requestRunProcess({ - uuid, - reportType, - tableName, - recordId, - parametersList, - selectionsList, - printFormatUuid +export function requestRunProcess({ + uuid, + reportType, + tableName, + recordId, + recordUuid, + parametersList = [], + selectionsList = [], + isSummary, + tableSelectedId, + printFormatUuid, + reportViewUuid +}) { + parametersList = parametersList.map(parameter => { + return { + key: parameter.columnName, + value: parameter.value + } }) + + return requestRest({ + url: '/data/process', + data: { + process_uuid: uuid, + table_name: tableName, + id: recordId, + uuid: recordUuid, + is_summary: isSummary, + report_type: reportType, + table_selected_id: tableSelectedId, + report_view_uuid: reportViewUuid, + parameters: parametersList, + selections: selectionsList, + print_format_uuid: printFormatUuid + } + }) + .then(evaluateResponse) + .then(processRunResponse => { + const { convertProcessLog } = require('@/utils/ADempiere/apiConverts/process.js') + + return convertProcessLog(processRunResponse) + }) } // Request a Process Activity list -export function requestListProcessesLogs({ pageToken, pageSize }) { +export function requestListProcessesLogs({ + tableName, + instanceUuid, + userUuid, + recordId, + recordUuid, + pageToken, + pageSize +}) { // Get Process Activity - return Instance.call(this).requestListProcessesLogs({ pageToken, pageSize }) + return requestRest({ + url: '/logs/list-process-logs', + data: { + instance_uuid: instanceUuid, + user_uuid: userUuid, + table_name: tableName, + id: recordId, + uuid: recordUuid + }, + params: { + page_size: pageSize, + page_token: pageToken + } + }) + .then(evaluateResponse) + .then(processLogResponse => { + const { convertProcessLog } = require('@/utils/ADempiere/apiConverts/process.js') + + return { + recordCount: processLogResponse.record_count, + processLogsList: processLogResponse.records.map(itemProcess => { + return convertProcessLog(itemProcess) + }), + nextPageToken: processLogResponse.next_page_token + } + }) } diff --git a/src/api/ADempiere/report.js b/src/api/ADempiere/report.js index 4492b7e5..a2f5dd2f 100644 --- a/src/api/ADempiere/report.js +++ b/src/api/ADempiere/report.js @@ -1,57 +1,139 @@ // Get Instance for connection -import { BusinessDataInstance as Instance } from '@/api/ADempiere/instances.js' +import { + ApiRest as requestRest, + evaluateResponse +} from '@/api/ADempiere/instances.js' /** * Request Pending Documents List * @param {string} tableName * @param {string} processUuid */ -export function requestReportViews({ tableName, processUuid, pageToken, pageSize }) { - return Instance.call(this).requestListReportViews({ - tableName, - processUuid, - pageToken, - pageSize +export function requestListReportsViews({ + tableName, + processUuid, + pageToken, + pageSize +}) { + return requestRest({ + url: '/ui/list-report-views', + data: { + table_name: tableName, + process_uuid: processUuid + }, + params: { + page_token: pageToken, + page_size: pageSize + } }) + .then(evaluateResponse) + .then(reportViewResponse => { + const { convertReportView } = require('@/utils/ADempiere/apiConverts/report.js') + + return { + nextPageToken: reportViewResponse.next_page_token, + recordCount: reportViewResponse.record_count, + reportViewsList: reportViewResponse.records.map(drill => { + return convertReportView(drill) + }) + } + }) } // Get print formats from table name, report view uuid or process uuid -export function requestPrintFormats({ tableName, reportViewUuid, processUuid, pageToken, pageSize }) { - return Instance.call(this).requestListPrintFormats({ - tableName, - reportViewUuid, - processUuid, - pageToken, - pageSize +export function requestListPrintFormats({ + tableName, + reportViewUuid, + processUuid, + pageToken, + pageSize +}) { + return requestRest({ + url: '/ui/list-print-formats', + data: { + table_name: tableName, + report_view_uuid: reportViewUuid, + process_uuid: processUuid + }, + params: { + page_token: pageToken, + page_size: pageSize + } }) + .then(evaluateResponse) + .then(responseListPrintFormats => { + const { convertListPrintFormats } = require('@/utils/ADempiere/apiConverts/report.js') + + return convertListPrintFormats(responseListPrintFormats) + }) } // Get drill tables for a report -export function requestDrillTables({ tableName, pageToken, pageSize }) { - return Instance.call(this).requestListDrillTables({ - tableName, - pageToken, - pageSize +export function requestListDrillTables({ + tableName, + pageToken, + pageSize +}) { + requestRest({ + url: '/ui/list-drill-tables', + data: { + table_name: tableName + }, + params: { + page_token: pageToken, + page_size: pageSize + } }) + .then(evaluateResponse) + .then(drillTablesResponse => { + const { convertDrillTables } = require('@/utils/ADempiere/apiConverts/report.js') + + return { + drillTablesList: drillTablesResponse.records.map(drill => { + return convertDrillTables(drill) + }), + nextPageToken: drillTablesResponse.next_page_token, + recordCount: drillTablesResponse.record_count + } + }) } // Get report output from parameters -export function getReportOutput({ - parametersList, +export function requestGetReportOutput({ tableName, printFormatUuid, reportViewUuid, isSummary, reportName, - reportType + reportType, + parametersList, + // query criteria + query, + whereClause, + orderByClause }) { - return Instance.call(this).requestGetReportOutput({ - parametersList, - tableName, - printFormatUuid, - reportViewUuid, - isSummary, - reportName, - reportType + return requestRest({ + url: '/ui/get-report-output', + data: { + table_name: tableName, + // reference + print_format_uuid: printFormatUuid, + report_view_uuid: reportViewUuid, + is_summary: isSummary, + report_name: reportName, + report_type: reportType, + // DSL Query + filters: parametersList, + // Custom Query + query, + where_clause: whereClause, + order_by_clause: orderByClause + } }) + .then(evaluateResponse) + .then(reportOutpuResponse => { + const { convertReportOutput } = require('@/utils/ADempiere/apiConverts/report.js') + + return convertReportOutput(reportOutpuResponse) + }) } diff --git a/src/api/ADempiere/rule.js b/src/api/ADempiere/rule.js index b8fea13a..47075b9c 100644 --- a/src/api/ADempiere/rule.js +++ b/src/api/ADempiere/rule.js @@ -1,5 +1,8 @@ // Get Instance for connection -import { BusinessDataInstance as Instance } from '@/api/ADempiere/instances.js' +import { + ApiRest as requestRest, + evaluateResponse +} from '@/api/ADempiere/instances.js' /** * Run callout request @@ -14,17 +17,30 @@ import { BusinessDataInstance as Instance } from '@/api/ADempiere/instances.js' * @param {array} attributesList * @returns {Map} Entity */ -export function runCallOutRequest({ windowUuid, windowNo, tabUuid, tableName, columnName, value, oldValue, valueType, callout, attributesList = [] }) { - return Instance.call(this).requestRunCallout({ - windowUuid, - windowNo, - tabUuid, - tableName, - columnName, - value, - oldValue, - valueType, - callout, - attributesList +export function runCallOutRequest({ + windowUuid, + windowNo, + tabUuid, + tableName, + columnName, + value, + oldValue, + callout, + attributesList = [] +}) { + return requestRest({ + url: '/ui/run-callout', + data: { + table_name: tableName, + window_uuid: windowUuid, + tab_uuid: tabUuid, + callout, + column_name: columnName, + old_value: oldValue, + value, + window_no: windowNo, + attributes: attributesList + } }) + .then(evaluateResponse) } diff --git a/src/api/ADempiere/system-core.js b/src/api/ADempiere/system-core.js index e425addd..66322b56 100644 --- a/src/api/ADempiere/system-core.js +++ b/src/api/ADempiere/system-core.js @@ -1,46 +1,69 @@ // Get Instance for connection -import { BusinessDataInstance as Instance, SystemCoreInstance } from '@/api/ADempiere/instances.js' - -/** - * Checks if value is empty. Deep-checks arrays and objects - * Note: isEmpty([]) == true, isEmpty({}) == true, isEmpty([{0:false},"",0]) == true, isEmpty({0:1}) == false - * @param {boolean|array|object|number|string|date|map|set|function} value - * @returns {boolean} - */ -export function isEmptyValue(value) { - const { isEmptyValue } = require('@adempiere/grpc-core-client/src/convertValues.js') - - return isEmptyValue(value) -} +import { + ApiRest as requestRest, + evaluateResponse +} from '@/api/ADempiere/instances.js' // Get Organization list from role -export function getOrganizationsList({ +export function requestOrganizationsList({ roleUuid, roleId, pageToken, pageSize }) { - return Instance.call(this).requestListOrganizations({ - roleUuid, - roleId, - pageToken, - pageSize + return requestRest({ + url: '/core/list-organizations', + data: { + role_id: roleId, + role_uuid: roleUuid + }, + params: { + // Page Data + pageToken, + pageSize + } }) + .then(evaluateResponse) + .then(organizationsListResponse => { + const { convertOrganization } = require('@/utils/ADempiere/apiConverts/core.js') + + return { + nextPageToken: organizationsListResponse.next_page_token, + recordCount: organizationsListResponse.record_count, + organizationsList: organizationsListResponse.records.map(organization => { + return convertOrganization(organization) + }) + } + }) } // Get Warehouses of Organization -export function getWarehousesList({ +export function requestWarehousesList({ organizationUuid, organizationId, pageToken, pageSize }) { - return Instance.call(this).requestListWarehouses({ - organizationUuid, - organizationId, - pageToken, - pageSize + return requestRest({ + url: '/core/list-warehouses', + data: { + organization_id: organizationId, + organization_uuid: organizationUuid + }, + params: { + // Page Data + pageToken, + pageSize + } }) + .then(evaluateResponse) + .then(warehousesListResponse => { + return { + nextPageToken: warehousesListResponse.next_page_token, + recordCount: warehousesListResponse.record_count, + warehousesList: warehousesListResponse.records + } + }) } /** @@ -48,16 +71,51 @@ export function getWarehousesList({ * @param {string} uuid * @param {number} id */ -export function getCountryDefinition({ uuid, id }) { - return SystemCoreInstance.call(this).requestGetCountry({ - uuid, - id +export function requestGetCountryDefinition({ + id, + uuid +}) { + return requestRest({ + url: '/core/country', + method: 'get', + params: { + id, + uuid + } }) + .then(evaluateResponse) + .then(countryResponse => { + const { convertCountry } = require('@/utils/ADempiere/apiConverts/core.js') + + return convertCountry(countryResponse) + }) } // Get languages from api -export function listLanguages({ pageToken, pageSize }) { - return Instance.call(this).requestListLanguages({ pageToken, pageSize }) +export function requestLanguagesList({ + pageToken, + pageSize +}) { + return requestRest({ + url: '/core/list-languages', + params: { + // Page Data + pageToken, + pageSize + } + }) + .then(evaluateResponse) + .then(languagesListResponse => { + const { convertLanguage } = require('@/utils/ADempiere/apiConverts/core.js') + + return { + nextPageToken: languagesListResponse.next_page_token, + recordCount: languagesListResponse.record_count, + languagesList: languagesListResponse.records.map(language => { + return convertLanguage(language) + }) + } + }) } export function requestCreateBusinessPartner({ @@ -85,39 +143,58 @@ export function requestCreateBusinessPartner({ countryUuid, posUuid }) { - return SystemCoreInstance.call(this).requestCreateBusinessPartner({ - value, - taxId, - duns, - naics, - name, - lastName, - description, - contactName, - eMail, - phone, - businessPartnerGroupUuid, - // Location - address1, - address2, - address3, - address4, - cityUuid, - cityName, - postalCode, - regionUuid, - regionName, - countryUuid, - posUuid + return requestRest({ + url: '/core/create-business-partner', + data: { + value, + tax_id: taxId, + duns, + naics, + name, + last_name: lastName, + description, + contact_name: contactName, + e_mail: eMail, + phone, + business_partner_group_uid: businessPartnerGroupUuid, + // Location + address1, + address2, + address3, + address4, + city_uuid: cityUuid, + city_name: cityName, + postal_code: postalCode, + region_uuid: regionUuid, + region_name: regionName, + country_uuid: countryUuid, + pos_uuid: posUuid + } }) + .then(evaluateResponse) + .then(businessPartnerResponse => { + const { convertBusinessPartner } = require('@/utils/ADempiere/apiConverts/core.js') + + return convertBusinessPartner(businessPartnerResponse) + }) } export function requestGetBusinessPartner({ searchValue }) { - return SystemCoreInstance.call(this).requestGetBusinessPartner({ - searchValue + return requestRest({ + url: '/core/get-business-partner', + method: 'get', + params: { + search_value: searchValue + } }) + .then(evaluateResponse) + .then(businessPartnerResponse => { + const { convertBusinessPartner } = require('@/utils/ADempiere/apiConverts/core.js') + + return convertBusinessPartner(businessPartnerResponse) + }) } export function requestListBusinessPartner({ @@ -129,21 +206,68 @@ export function requestListBusinessPartner({ postalCode, phone, // Query - criteria, + // criteria, pageSize, pageToken }) { - return SystemCoreInstance.call(this).requestListBusinessPartner({ - searchValue, - value, - name, - contactName, - eMail, - postalCode, - phone, - // Query - criteria, - pageSize, - pageToken + return requestRest({ + url: '/core/list-business-partner', + data: { + search_value: searchValue, + value, + name, + contact_name: contactName, + e_mail: eMail, + phone, + // Location + postal_code: postalCode + }, + params: { + page_size: pageSize, + page_token: pageToken + } }) + .then(evaluateResponse) + .then(businessPartnerResponse => { + const { convertBusinessPartner } = require('@/utils/ADempiere/apiConverts/core.js') + + return { + nextPageToken: businessPartnerResponse.next_page_token, + recordCount: businessPartnerResponse.record_count, + businessPartnersList: businessPartnerResponse.records.map(businessPartner => { + return convertBusinessPartner(businessPartner) + }) + } + }) +} + +/** + * TODO: Add uuid support + * @param {string} conversionTypeUuid + * @param {string} currencyFromUuid + * @param {string} currencyToUuid + * @param {date} conversionDate + * @returns {promise} + */ +export function requestGetConversionRate({ + conversionTypeUuid, + currencyFromUuid, + currencyToUuid, + conversionDate +}) { + return requestRest({ + url: '/core/get-conversion-rate', + data: { + conversion_type_uuid: conversionTypeUuid, + currency_from_uuid: currencyFromUuid, + currency_to_uuid: currencyToUuid, + conversion_date: conversionDate + } + }) + .then(evaluateResponse) + .then(conversionRateResponse => { + const { convertConversionRate } = require('@/utils/ADempiere/apiConverts/core.js') + + return convertConversionRate(conversionRateResponse) + }) } diff --git a/src/api/ADempiere/user-interface.js b/src/api/ADempiere/user-interface.js new file mode 100644 index 00000000..2c568f00 --- /dev/null +++ b/src/api/ADempiere/user-interface.js @@ -0,0 +1,48 @@ +// Get Instance for connection +import { + ApiRest as requestRest, + evaluateResponse +} from '@/api/ADempiere/instances.js' + +/** + * Get Attachment + * @param {number} recordId + * @param {string} recordUuid // TODO: Add suppport to record uuid on backend + */ +export function requestResourceReference({ + recordId, + recordUuid +}) { + return requestRest({ + url: '/ui/resource-reference', + method: 'get', + params: { + image_id: recordId, + image_uuid: recordUuid + } + }) + .then(evaluateResponse) +} + +/** + * Get Attachment + * @param {string} tableName + * @param {number} recordId + * @param {string} recordUuid + */ +export function requestAttachment({ + tableName, + recordId, + recordUuid +}) { + return requestRest({ + url: '/ui/attachment', + method: 'get', + params: { + table_name: tableName, + id: recordId, + uuid: recordUuid + } + }) + .then(evaluateResponse) +} diff --git a/src/api/ADempiere/values.js b/src/api/ADempiere/values.js index d68daebd..f3916890 100644 --- a/src/api/ADempiere/values.js +++ b/src/api/ADempiere/values.js @@ -1,23 +1,40 @@ // Get Instance for connection -import { BusinessDataInstance as Instance } from '@/api/ADempiere/instances.js' +import { + ApiRest as requestRest, + evaluateResponse +} from '@/api/ADempiere/instances.js' +import { isEmptyValue } from '@/utils/ADempiere/valueUtils.js' /** * Request a Lookup data from Reference * The main attributes that function hope are: + * @param {string} columnName * @param {string} tableName * @param {string} directQuery * @param {string|number} value */ export function requestLookup({ + columnName, tableName, directQuery, value }) { - return Instance.call(this).requestLookupFromReference({ - tableName, - directQuery, - value + let filters = [] + if (!isEmptyValue(value)) { + filters = [{ + column_name: columnName, + value + }] + } + return requestRest({ + url: '/ui/get-lookup-item', + data: { + table_name: tableName, + query: directQuery, + filters + } }) + .then(evaluateResponse) } /** @@ -25,24 +42,50 @@ export function requestLookup({ * The main attributes that function hope are: * @param {string} tableName * @param {string} query - * @param {Array|} valuesList + * @param {string} whereClause + * @param {array} valuesList // TODO: Add support * @param {string} pageToken * @param {number} pageSize */ export function requestLookupList({ tableName, query, + whereClause, + columnName, valuesList = [], pageToken, pageSize }) { - return Instance.call(this).requestListLookupFromReference({ - tableName, - query, - valuesList, - pageToken, - pageSize + let filters = [] + if (!isEmptyValue(valuesList)) { + filters = [{ + column_name: columnName, + values: valuesList + }] + } + + return requestRest({ + url: '/ui/list-lookup-items', + data: { + table_name: tableName, + query, + where_clause: whereClause, + filters + }, + params: { + // Page Data + pageToken, + pageSize + } }) + .then(evaluateResponse) + .then(lookupListResponse => { + return { + nextPageToken: lookupListResponse.next_page_token, + recordCount: lookupListResponse.record_count, + recordsList: lookupListResponse.records + } + }) } /** @@ -52,23 +95,71 @@ export function requestLookupList({ * @param {string} recordUuid * @param {number} recordId */ -export function getReferencesList({ windowUuid, tableName, recordId, recordUuid, pageToken, pageSize }) { - return Instance.call(this).requestListReferences({ - windowUuid, - tableName, - recordId, - recordUuid, - pageToken, - pageSize +export function requestReferencesList({ + windowUuid, + tableName, + recordId, + recordUuid, + pageToken, + pageSize +}) { + return requestRest({ + url: '/ui/list-references', + data: { + id: recordId, + uuid: recordUuid, + window_uuid: windowUuid, + table_name: tableName + }, + params: { + // Page Data + pageToken, + pageSize + } }) + .then(evaluateResponse) + .then(referencesListResposnse => { + const { convertReferencesList } = require('@/utils/ADempiere/apiConverts/values.js') + + return convertReferencesList(referencesListResposnse) + }) } // Get default value for a field -export function getDefaultValueFromServer(query) { - return Instance.call(this).requestGetDefaultValue(query) +export function requestDefaultValue(query) { + return requestRest({ + url: '/ui/get-default-value', + data: { + query + } + }) + .then(evaluateResponse) } -// Get context information for a window, tab or field -export function getContextInfoValueFromServer({ uuid, query }) { - return Instance.call(this).requestGetContextInfoValue({ uuid, query }) +/** + * Get context information for a window, tab or field + * @param {string} query + * @param {string} uuid + * @param {number} id + */ +export function requestGetContextInfoValue({ + uuid, + id, + query +}) { + return requestRest({ + url: '/ui/get-context-info-value', + data: { + query, + uuid, + id + } + }) + .then(evaluateResponse) + .then(contextInfoValueResponse => { + return { + messageText: contextInfoValueResponse.message_text, + messageTip: contextInfoValueResponse.message_tip + } + }) } diff --git a/src/api/ADempiere/window.js b/src/api/ADempiere/window.js index fcb45017..ea0fc439 100644 --- a/src/api/ADempiere/window.js +++ b/src/api/ADempiere/window.js @@ -1,34 +1,77 @@ // Get Instance for connection -import { BusinessDataInstance as Instance } from '@/api/ADempiere/instances.js' +import { + ApiRest as requestRest, + evaluateResponse +} from '@/api/ADempiere/instances.js' // Get list of log for a records -export function requestListRecordsLogs({ +export function requestListEntityLogs({ tableName, recordId, + recordUuid, pageToken, pageSize }) { - return Instance.call(this).requestListRecordsLogs({ - tableName, - recordId, - pageToken, - pageSize + return requestRest({ + url: '/logs/list-entity-logs', + data: { + table_name: tableName, + id: recordId, + uuid: recordUuid + }, + params: { + // Page Data + pageToken, + pageSize + } }) + .then(evaluateResponse) + .then(entityLogsListResponse => { + const { convertEntityLog } = require('@/utils/ADempiere/apiConverts/window.js') + + return { + nextPageToken: entityLogsListResponse.next_page_token, + recordCount: entityLogsListResponse.record_count, + entityLogsList: entityLogsListResponse.records.map(entityLog => { + return convertEntityLog(entityLog) + }) + } + }) } // Get workflow log for a record export function requestListWorkflowsLogs({ tableName, recordId, + recordUuid, pageToken, pageSize }) { - return Instance.call(this).requestListWorkflowsLogs({ - tableName, - recordId, - pageToken, - pageSize + return requestRest({ + url: '/logs/list-workflow-logs', + data: { + table_name: tableName, + id: recordId, + uuid: recordUuid + }, + params: { + // Page Data + pageToken, + pageSize + } }) + .then(evaluateResponse) + .then(workflowLogsListResponse => { + const { convertWorkflowProcess } = require('@/utils/ADempiere/apiConverts/window.js') + + return { + nextPageToken: workflowLogsListResponse.next_page_token, + recordCount: workflowLogsListResponse.record_count, + workflowLogsList: workflowLogsListResponse.records.map(workflowLog => { + return convertWorkflowProcess(workflowLog) + }) + } + }) } // Get workflow list for a document @@ -37,11 +80,29 @@ export function requestListWorkflows({ pageToken, pageSize }) { - return Instance.call(this).requestListWorkflows({ - tableName, - pageToken, - pageSize + return requestRest({ + url: '/workflow/list-workflow', + data: { + table_name: tableName + }, + params: { + // Page Data + pageToken, + pageSize + } }) + .then(evaluateResponse) + .then(workflowListResponse => { + const { convertWorkflowDefinition } = require('@/utils/ADempiere/apiConverts/window.js') + + return { + nextPageToken: workflowListResponse.next_page_token, + recordCount: workflowListResponse.record_count, + workflowsList: workflowListResponse.records.map(workflowDefinition => { + return convertWorkflowDefinition(workflowDefinition) + }) + } + }) } /** @@ -50,13 +111,38 @@ export function requestListWorkflows({ * @param {string} pageToken * @param {string} pageSize */ -export function requestListRecordChats({ tableName, recordId, pageToken, pageSize }) { - return Instance.call(this).requestListRecordChats({ - tableName, - recordId, - pageToken, - pageSize +export function requestListEntityChats({ + tableName, + recordId, + recordUuid, + pageToken, + pageSize +}) { + return requestRest({ + url: '/logs/list-entity-chats', + data: { + table_name: tableName, + id: recordId, + uuid: recordUuid + }, + params: { + // Page Data + pageToken, + pageSize + } }) + .then(evaluateResponse) + .then(entityChatListResponse => { + const { convertEntityChat } = require('@/utils/ADempiere/apiConverts/window.js') + + return { + nextPageToken: entityChatListResponse.next_page_token, + recordCount: entityChatListResponse.record_count, + entityChatsList: entityChatListResponse.records.map(entityChat => { + return convertEntityChat(entityChat) + }) + } + }) } /** @@ -64,25 +150,65 @@ export function requestListRecordChats({ tableName, recordId, pageToken, pageSiz * @param {string} pageToken * @param {string} pageSize */ -export function requestListChatEntries({ uuid, pageToken, pageSize }) { - return Instance.call(this).requestListChatEntries({ - uuid, - pageToken, - pageSize +export function requestListChatsEntries({ + id, + uuid, + pageToken, + pageSize +}) { + return requestRest({ + url: '/logs/list-chat-entries', + data: { + id, + uuid + }, + params: { + // Page Data + pageToken, + pageSize + } }) + .then(evaluateResponse) + .then(chatEntriesListResponse => { + const { convertChatEntry } = require('@/utils/ADempiere/apiConverts/window.js') + + return { + nextPageToken: chatEntriesListResponse.next_page_token, + recordCount: chatEntriesListResponse.record_count, + chatEntriesList: chatEntriesListResponse.records.map(chatEntry => { + return convertChatEntry(chatEntry) + }) + } + }) } /** * @param {string} tableName * @param {string} recordId + * @param {string} recordUuid * @param {string} comment */ -export function requestCreateChatEntry({ tableName, recordId, comment }) { - return Instance.call(this).requestCreateChatEntry({ - tableName, - recordId, - comment +export function requestCreateChatEntry({ + tableName, + recordId, + recordUuid, + comment +}) { + return requestRest({ + url: '/ui/create-chat-entry', + data: { + table_name: tableName, + id: recordId, + uuid: recordUuid, + comment: comment + } }) + .then(evaluateResponse) + .then(chatEntryResponse => { + const { convertChatEntry } = require('@/utils/ADempiere/apiConverts/window.js') + + return convertChatEntry(chatEntryResponse) + }) } /** @@ -95,27 +221,74 @@ export function requestCreateChatEntry({ tableName, recordId, comment }) { * @param {number} pageSize * @param {string} pageToken */ -export function requestListDocumentStatuses({ tableName, recordId, recordUuid, documentStatus, documentAction, pageSize, pageToken }) { - return Instance.call(this).requestListDocumentStatuses({ - tableName, - recordId, - recordUuid, - documentStatus, - documentAction, - pageSize, - pageToken +export function requestListDocumentStatuses({ + tableName, + recordId, + recordUuid, + documentStatus, + documentAction, + pageSize, + pageToken +}) { + return requestRest({ + url: '/workflow/list-document-actions', + data: { + id: recordId, + uuid: recordUuid, + table_name: tableName, + document_action: documentAction, + document_status: documentStatus + }, + params: { + // Page Data + pageToken, + pageSize + } }) + .then(evaluateResponse) + .then(listDocumentsActionsResponse => { + return { + nextPageToken: listDocumentsActionsResponse.next_page_token, + recordCount: listDocumentsActionsResponse.record_count, + documentStatusesList: listDocumentsActionsResponse.records + } + }) } // Request a document action list from current status of document -export function requestListDocumentActions({ tableName, recordId, recordUuid, documentStatus, documentAction, pageSize, pageToken }) { - return Instance.call(this).requestListDocumentActions({ - tableName, - recordId, - recordUuid, - documentStatus, - documentAction, - pageSize, - pageToken +export function requestListDocumentActions({ + tableName, + recordId, + recordUuid, + documentStatus, + documentAction, + pageSize, + pageToken +}) { + return requestRest({ + url: '/workflow/list-document-actions', + data: { + id: recordId, + uuid: recordUuid, + table_name: tableName, + document_action: documentAction, + document_status: documentStatus + }, + params: { + // Page Data + pageToken, + pageSize + } }) + .then(evaluateResponse) + .then(listDocumentsActionsResponse => { + return { + nextPageToken: listDocumentsActionsResponse.next_page_token, + recordCount: listDocumentsActionsResponse.record_count, + defaultDocumentAction: { + ...listDocumentsActionsResponse.default_document_action + }, + documentActionsList: listDocumentsActionsResponse.records + } + }) } diff --git a/src/api/role.js b/src/api/role.js index 959bbd21..f73988b4 100644 --- a/src/api/role.js +++ b/src/api/role.js @@ -1,4 +1,8 @@ import request from '@/utils/request' +import { + ApiRest as requestRest, + evaluateResponse +} from '@/api/ADempiere/instances.js' export function getRoutes() { return request({ @@ -14,6 +18,25 @@ export function getRoles() { }) } +export function requestRolesList(token) { + return requestRest({ + url: 'user/roles', + method: 'get', + params: { + token + } + }) + .then(evaluateResponse) + .then(responseRoles => { + const { convertRole } = require('@/utils/ADempiere/apiConverts/user.js') + const rolesList = responseRoles.map(itemRol => { + return convertRole(itemRol) + }) + + return rolesList + }) +} + export function addRole(data) { return request({ url: '/vue-element-admin/role', @@ -36,3 +59,31 @@ export function deleteRole(id) { method: 'delete' }) } + +/** + * Change role of access + * @param {string} roleUuid + * @param {string} organizationUuid + * @param {string} warehouseUuid + */ +export function requestChangeRole({ + roleUuid, + organizationUuid, + warehouseUuid +}) { + return requestRest({ + url: 'user/change-role', + method: 'post', + data: { + role: roleUuid, + organization: organizationUuid, + warehouse: warehouseUuid + } + }) + .then(evaluateResponse) + .then(responseChangeRole => { + const { convertSession } = require('@/utils/ADempiere/apiConverts/user.js') + + return convertSession(responseChangeRole) + }) +} diff --git a/src/api/user.js b/src/api/user.js index a0970318..a45b7972 100644 --- a/src/api/user.js +++ b/src/api/user.js @@ -1,54 +1,89 @@ // Instance for connection -import { AccessInstance as Instance } from '@/api/ADempiere/instances.js' +import { + ApiRest as requestRest, + evaluateResponse +} from '@/api/ADempiere/instances.js' -// Make login by UserName and password, this function can return user data for show +/** + * Make login by UserName and password, this function can return user data for show + * @param {string} userName + * @param {string} password + */ export function login({ userName, - password: userPass, - role + password }) { - if (role && role.trim() !== '') { - return Instance.call(this).requestLogin({ - userName, - userPass, - role - }) - } - return Instance.call(this).requestLoginDefault({ - userName, - userPass + return requestRest({ + url: '/user/login', + method: 'post', + data: { + username: userName, + password + } }) } -// Get User Info from session Uuid or token +/** + * Get User Info + * @param {string} token or session UUID + */ export function requestUserInfoFromSession(token) { - return Instance.call(this).requestUserInfoFromSession(token) + return requestRest({ + url: '/user/info', + method: 'get', + params: { + token + } + }) + .then(evaluateResponse) } /** * Get session info - * @param {string} sessionUuid + * @param {string} token or session UUID */ -export function getSessionInfo(sessionUuid) { - return Instance.call(this).getSession(sessionUuid) -} +export function requestSessionInfo(token) { + return requestRest({ + url: '/user/session', + method: 'get', + params: { + token + } + }) + .then(evaluateResponse) + .then(responseSession => { + const { convertSession } = require('@/utils/ADempiere/apiConverts/user.js') -// Logout from server -export function logout(sessionUuid) { - return Instance.call(this).requestLogOut(sessionUuid) + return convertSession(responseSession) + }) } /** - * - * @param {string} attributes.sessionUuid - * @param {string} attributes.roleUuid - * @param {string} attributes.organizationUuid - * @param {string} attributes.warehouseUuid + * Logout from server + * @param {string} token or session UUID */ -// Get User menu from server -export function getMenu(sessionUuid) { - return Instance.call(this).requestUserMenuFromSession(sessionUuid) +export function logout(token) { + return requestRest({ + url: '/user/logout', + data: { + token + } + }) } -export function changeRole(attributes) { - return Instance.call(this).requestChangeRole(attributes) + +/** + * Get User menu from server + * @param {string} sessionUuid + */ +export function requestMenu({ + sessionUuid +}) { + return requestRest({ + url: '/user/menu', + method: 'get', + params: { + token: sessionUuid + } + }) + .then(evaluateResponse) } diff --git a/src/components/ADempiere/Badge/index.vue b/src/components/ADempiere/Badge/index.vue index fb61baeb..cc5bf5b2 100644 --- a/src/components/ADempiere/Badge/index.vue +++ b/src/components/ADempiere/Badge/index.vue @@ -75,24 +75,21 @@ export default { }, handleCurrentChange(getRecordNotification, val, index, rows) { if (val !== null) { + let options = { + name: 'ProcessActivity' + } if (getRecordNotification && getRecordNotification.isReport && val.className !== 'procesActivity') { - this.$router.push({ + options = { name: 'Report Viewer', params: { processId: getRecordNotification.processId, instanceUuid: getRecordNotification.instanceUuid, fileName: getRecordNotification.download } - }).catch(error => { - console.info(`${this.name} Component: ${error.name}, ${error.message}`) - }) - } else { - this.$router.push({ - name: 'ProcessActivity' - }).catch(error => { - console.info(`${this.name} Component: ${error.name}, ${error.message}`) - }) + } } + + this.$router.push(options, () => {}) } }, deleteRow(index, rows) { diff --git a/src/components/ADempiere/ChatEntries/index.vue b/src/components/ADempiere/ChatEntries/index.vue new file mode 100644 index 00000000..99260781 --- /dev/null +++ b/src/components/ADempiere/ChatEntries/index.vue @@ -0,0 +1,157 @@ + + + + + diff --git a/src/components/ADempiere/ChatEntries/inputChat.vue b/src/components/ADempiere/ChatEntries/inputChat.vue new file mode 100644 index 00000000..a2b5eb13 --- /dev/null +++ b/src/components/ADempiere/ChatEntries/inputChat.vue @@ -0,0 +1,68 @@ + + + diff --git a/src/components/ADempiere/ContainerInfo/chatEntries.vue b/src/components/ADempiere/ContainerInfo/chatEntries.vue deleted file mode 100644 index 73b0c770..00000000 --- a/src/components/ADempiere/ContainerInfo/chatEntries.vue +++ /dev/null @@ -1,51 +0,0 @@ - - - diff --git a/src/components/ADempiere/ContainerInfo/mixinInfo.js b/src/components/ADempiere/ContainerInfo/mixinInfo.js index 93a635fd..86b59b28 100644 --- a/src/components/ADempiere/ContainerInfo/mixinInfo.js +++ b/src/components/ADempiere/ContainerInfo/mixinInfo.js @@ -1,80 +1,11 @@ export default { name: 'MixinContainerInfo', - data() { - return { - currentKey: 100, - typeAction: 0, - chatNote: '' - } - }, computed: { - gettersLischat() { - const commentLogs = this.$store.getters.getChatEntries - if (this.isEmptyValue(commentLogs)) { - return commentLogs - } - commentLogs.sort((a, b) => { - const c = new Date(a.logDate) - const d = new Date(b.logDate) - return c - d - }) - return commentLogs - }, - gettersListRecordLogs() { - const changeLog = this.$store.getters.getRecordLogs.recorLogs - return changeLog - }, - getIsChangeLog() { - if (this.isEmptyValue(this.gettersListRecordLogs)) { - return false - } - return true - }, - getIsChat() { - return this.$store.getters.getIsNote - }, - gettersListWorkflow() { - return this.$store.getters.getWorkflow - }, - getIsWorkflowLog() { - if (this.isEmptyValue(this.gettersListWorkflow)) { - return false - } - return true - }, language() { return this.$store.getters.language - }, - isNote() { - return this.$store.getters.getIsNote } }, methods: { - sendComment() { - const chatTextLong = this.$store.getters.getChatTextLong - if (!this.isEmptyValue(chatTextLong)) { - this.$store.dispatch('createChatEntry', { - tableName: this.$route.params.tableName, - recordId: this.$route.params.recordId, - comment: chatTextLong - }) - .then(() => { - this.$store.dispatch('setMarkDown', true) - this.$store.dispatch('listChatEntries', { - tableName: this.$route.params.tableName, - recordId: this.$route.params.recordId - }) - }) - } - }, - showkey(key, index) { - if (key === this.currentKey && index === this.typeAction) { - this.currentKey = 1000 - } else { - this.currentKey = key - this.typeAction = index - } - }, translateDate(value) { return this.$d(new Date(value), 'long', this.language) } diff --git a/src/components/ADempiere/ContainerInfo/recordLogs.vue b/src/components/ADempiere/ContainerInfo/recordLogs.vue index d14518eb..da0a7ca8 100644 --- a/src/components/ADempiere/ContainerInfo/recordLogs.vue +++ b/src/components/ADempiere/ContainerInfo/recordLogs.vue @@ -16,13 +16,39 @@
{{ listLogs.userName }} - {{ $t('window.containerInfo.changeDetail') }} + + {{ $t('window.containerInfo.changeDetail') }} +
-

{{ list.displayColumnName }} : {{ list.oldDisplayValue }} {{ list.newDisplayValue }}

-

{{ list.displayColumnName }} : {{ list.oldDisplayValue }} {{ list.newDisplayValue }}

+

+ {{ list.displayColumnName }} : + + + {{ list.oldDisplayValue }} + + + + {{ list.newDisplayValue }} + +

+

+ {{ list.displayColumnName }} : + + + {{ list.oldDisplayValue }} + + + + {{ list.newDisplayValue }} + +

@@ -39,7 +65,15 @@ import MixinInfo from './mixinInfo.js' export default { name: 'RecordLogs', - mixins: [MixinInfo], + mixins: [ + MixinInfo + ], + data() { + return { + currentKey: 100, + typeAction: 0 + } + }, computed: { isMobile() { return this.$store.state.app.device === 'mobile' @@ -55,6 +89,25 @@ export default { return 'panel-mobile' } return 'panel' + }, + gettersListRecordLogs() { + return this.$store.getters.getRecordLogs.entityLogs + }, + getIsChangeLog() { + if (this.isEmptyValue(this.gettersListRecordLogs)) { + return false + } + return true + } + }, + methods: { + showkey(key, index) { + if (key === this.currentKey && index === this.typeAction) { + this.currentKey = 1000 + } else { + this.currentKey = key + this.typeAction = index + } } } } diff --git a/src/components/ADempiere/ContainerInfo/workflowLogs.vue b/src/components/ADempiere/ContainerInfo/workflowLogs.vue index db22a56c..95f00930 100644 --- a/src/components/ADempiere/ContainerInfo/workflowLogs.vue +++ b/src/components/ADempiere/ContainerInfo/workflowLogs.vue @@ -32,7 +32,10 @@ width="400" trigger="hover" > -

{{ $t('login.userName') }}: {{ nodeList.userName }}

+

+ {{ $t('login.userName') }}: + {{ nodeList.userName }} +

{{ $t('window.containerInfo.logWorkflow.message') }}: {{ nodeList.textMessage }} @@ -70,7 +73,18 @@ import MixinInfo from './mixinInfo.js' export default { name: 'WorkflowLogs', - mixins: [MixinInfo] + mixins: [MixinInfo], + computed: { + gettersListWorkflow() { + return this.$store.getters.getWorkflow + }, + getIsWorkflowLog() { + if (this.isEmptyValue(this.gettersListWorkflow)) { + return false + } + return true + } + } } diff --git a/src/components/ADempiere/ContextMenu/contextMenuDesktop.vue b/src/components/ADempiere/ContextMenu/contextMenuDesktop.vue index 18dae85e..5bbfbfc5 100644 --- a/src/components/ADempiere/ContextMenu/contextMenuDesktop.vue +++ b/src/components/ADempiere/ContextMenu/contextMenuDesktop.vue @@ -69,14 +69,27 @@ - + {{ format }} - + {{ $t('components.contextMenuPrintFormatSetup') }} - + {{ $t('components.contextMenuRefresh') }} @@ -87,7 +100,11 @@ {{ $t('components.contextMenuActions') }} - + diff --git a/src/components/ADempiere/ContextMenu/contextMenuMixin.js b/src/components/ADempiere/ContextMenu/contextMenuMixin.js index 71b346e5..cd00a109 100644 --- a/src/components/ADempiere/ContextMenu/contextMenuMixin.js +++ b/src/components/ADempiere/ContextMenu/contextMenuMixin.js @@ -1,6 +1,6 @@ import { showNotification } from '@/utils/ADempiere/notification.js' import Item from './items' -import { convertFieldListToShareLink, recursiveTreeSearch } from '@/utils/ADempiere/valueUtils.js' +import { convertFieldsListToShareLink, recursiveTreeSearch } from '@/utils/ADempiere/valueUtils.js' import { supportedTypes, exportFileFromJson } from '@/utils/ADempiere/exportUtil.js' import ROUTES from '@/utils/ADempiere/zoomWindow' @@ -67,9 +67,7 @@ export default { downloads: this.$store.getters.getProcessResult.url, metadataMenu: {}, recordUuid: this.$route.query.action, - isLoadedReferences: false, - exportDefault: 'xls', - ROUTES + isLoadedReferences: false } }, computed: { @@ -111,17 +109,21 @@ export default { return this.$store.getters.permission_routes }, valuesPanelToShare() { + let containerUuid = this.containerUuid + if (this.$route.query.action === 'advancedQuery') { + containerUuid = 'table_' + containerUuid + } + return this.$store.getters.getParametersToShare({ - containerUuid: this.containerUuid, - isOnlyDisplayed: true, - isAdvancedQuery: this.$route.query.action === 'advancedQuery' + containerUuid, + isOnlyDisplayed: true }) }, - getterFieldList() { + getterFieldsList() { return this.$store.getters.getFieldsListFromPanel(this.containerUuid) }, - getterFieldListHeader() { - const header = this.getterFieldList.filter(fieldItem => { + getterFieldsListHeader() { + const header = this.getterFieldsList.filter(fieldItem => { const isDisplayed = fieldItem.isDisplayed || fieldItem.isDisplayedFromLogic if (fieldItem.isActive && isDisplayed && !fieldItem.isKey) { return fieldItem.name @@ -131,8 +133,8 @@ export default { return fieldItem.name }) }, - getterFieldListValue() { - const value = this.getterFieldList.filter(fieldItem => { + getterFieldsListValue() { + const value = this.getterFieldsList.filter(fieldItem => { const isDisplayed = fieldItem.isDisplayed || fieldItem.isDisplayedFromLogic if (fieldItem.isActive && isDisplayed && !fieldItem.isKey) { return fieldItem @@ -275,14 +277,15 @@ export default { console.warn(`Error getting data list tab. Message: ${error.message}, code ${error.code}.`) }) } else if (this.panelType === 'browser') { - const fieldsEmpty = this.$store.getters.getFieldListEmptyMandatory({ + const fieldsEmpty = this.$store.getters.getFieldsListEmptyMandatory({ containerUuid: this.containerUuid, - fieldsList: this.getterFieldList + fieldsList: this.getterFieldsList }) if (fieldsEmpty.length) { this.$message({ message: this.$t('notifications.mandatoryFieldMissing') + fieldsEmpty, - type: 'info' + type: 'info', + showClose: true }) } else { this.$store.dispatch('getBrowserSearch', { @@ -319,8 +322,8 @@ export default { } }, exportRecord(fotmatToExport) { - const tHeader = this.getterFieldListHeader - const filterVal = this.getterFieldListValue + const tHeader = this.getterFieldsListHeader + const filterVal = this.getterFieldsListValue let list = [] if (this.panelType === 'window') { list = this.getDataRecord @@ -355,7 +358,9 @@ export default { this.actions = this.metadataMenu.actions // TODO: Add store attribute to avoid making repeated requests - if (this.panelType === 'window') { + let isChangePrivateAccess = true + if (this.isReferecesContent) { + isChangePrivateAccess = false if (!this.isEmptyValue(this.$route.params.tableName)) { this.$store.dispatch('getPrivateAccessFromServer', { tableName: this.$route.params.tableName, @@ -371,6 +376,7 @@ export default { } const processAction = this.actions.find(item => { + // TODO: Compare with 'action' attribute and not with 'name' (this change with language) if (item.name === 'Procesar Orden' || (item.name === 'Process Order')) { return item } @@ -380,24 +386,32 @@ export default { if (this.actions && this.actions.length) { this.actions.forEach(itemAction => { - if (this.$route.meta.type === 'report' && itemAction.action === 'startProcess') { + const { action } = itemAction + if (this.$route.meta.type === 'report' && action === 'startProcess') { itemAction.reportExportType = 'html' } // if no exists set prop with value itemAction.disabled = false - if ((this.$route.name !== 'Report Viewer' && itemAction.action === 'changeParameters') || + if ((this.$route.name !== 'Report Viewer' && action === 'changeParameters') || (this.$route.meta.type === 'process' && itemAction.type === 'summary')) { itemAction.disabled = true } if (this.$route.meta.type === 'window') { - if (this.recordUuid === 'create-new' || !this.isInsertRecord) { - itemAction.disabled = true + if (isChangePrivateAccess) { + if (action === 'lockRecord') { + itemAction.hidden = false + } else if (action === 'unlockRecord') { + itemAction.hidden = true + } } + // rollback if (itemAction.action === 'undoModifyData') { itemAction.disabled = Boolean(!this.getDataLog && !this.getOldRouteOfWindow) + } else if (this.recordUuid === 'create-new' || !this.isInsertRecord) { + itemAction.disabled = true } } }) @@ -444,10 +458,12 @@ export default { query: { ...this.getOldRouteOfWindow.query } - }).catch(error => { - console.info(`Context Menu Mixin: ${error.name}, ${error.message}`) - }) + }, () => {}) } else { + if (action.action === 'setDefaultValues' && this.$route.query.action === 'create-new') { + return + } + this.$store.dispatch(action.action, { parentUuid: this.parentUuid, containerUuid: this.containerUuid, @@ -472,7 +488,7 @@ export default { if (this.lastParameter !== undefined) { containerParams = this.lastParameter } - const fieldsNotReady = this.$store.getters.getFieldListEmptyMandatory({ + const fieldsNotReady = this.$store.getters.getFieldsListEmptyMandatory({ containerUuid: containerParams }) @@ -590,13 +606,12 @@ export default { // windowUuid: this.parentUuid, tabParent: 0 } - }).catch(error => { - console.info(`Context Menu Mixin: ${error.name}, ${error.message}`) - }) + }, () => {}) } else { this.$message({ type: 'error', - message: this.$t('notifications.noRoleAccess') + message: this.$t('notifications.noRoleAccess'), + showClose: true }) } } @@ -604,7 +619,7 @@ export default { setShareLink() { let shareLink = this.panelType === 'window' || window.location.href.includes('?') ? `${window.location.href}&` : `${window.location.href}?` if (this.$route.name === 'Report Viewer') { - const processParameters = convertFieldListToShareLink(this.processParametersExecuted) + const processParameters = convertFieldsListToShareLink(this.processParametersExecuted) const reportFormat = this.$store.getters.getReportType shareLink = this.$store.getters.getTempShareLink if (String(processParameters).length) { @@ -661,15 +676,14 @@ export default { }) }, redirect() { + const { uuid: name, tabParent } = ROUTES.PRINT_FORMAT_SETUP_WINDOW this.$router.push({ - name: ROUTES.PRINT_FORMAT_SETUP_WINDOW.uuid, + name, query: { action: this.getReportDefinition.output.printFormatUuid, - tabParent: ROUTES.PRINT_FORMAT_SETUP_WINDOW.tabParent + tabParent } - }).catch(error => { - console.info(`Context Menu Mixin: ${error.name}, ${error.message}`) - }) + }, () => {}) }, validatePrivateAccess({ isLocked, tableName, recordId }) { if (this.isPersonalLock) { diff --git a/src/components/ADempiere/ContextMenu/items.vue b/src/components/ADempiere/ContextMenu/items.vue index e0df502a..3fcb9d53 100644 --- a/src/components/ADempiere/ContextMenu/items.vue +++ b/src/components/ADempiere/ContextMenu/items.vue @@ -54,7 +54,7 @@ export default { query: { tabParent: 0 } - }) + }, () => {}) } } } diff --git a/src/components/ADempiere/Dashboard/docstatus/index.vue b/src/components/ADempiere/Dashboard/docstatus/index.vue index 4d327f93..a9bc27e7 100644 --- a/src/components/ADempiere/Dashboard/docstatus/index.vue +++ b/src/components/ADempiere/Dashboard/docstatus/index.vue @@ -107,9 +107,7 @@ export default { action: 'criteria', tabParent } - }).catch(error => { - console.info(`Dashboard/docstatus Component: ${error.name}, ${error.message}`) - }) + }, () => {}) } else { this.$message({ type: 'error', diff --git a/src/components/ADempiere/Dashboard/mixinDashboard.js b/src/components/ADempiere/Dashboard/mixinDashboard.js index acd7967d..4eeef55d 100644 --- a/src/components/ADempiere/Dashboard/mixinDashboard.js +++ b/src/components/ADempiere/Dashboard/mixinDashboard.js @@ -24,7 +24,7 @@ export default { handleClick(row) { const viewSearch = this.recursiveTreeSearch({ treeData: this.permissionRoutes, - attributeValue: row.windowUuid, + attributeValue: row.referenceUuid, attributeName: 'meta', secondAttribute: 'uuid', attributeChilds: 'children' @@ -46,9 +46,7 @@ export default { action: recordUuid, tabParent } - }).catch(error => { - console.info(`Dashboard ${this.name}: ${error.name}, ${error.message}`) - }) + }, () => {}) } else { this.$message({ type: 'error', diff --git a/src/components/ADempiere/Dashboard/recentItems/index.vue b/src/components/ADempiere/Dashboard/recentItems/index.vue index 92fbf275..a188371a 100644 --- a/src/components/ADempiere/Dashboard/recentItems/index.vue +++ b/src/components/ADempiere/Dashboard/recentItems/index.vue @@ -35,13 +35,15 @@ - - diff --git a/src/components/ADempiere/DataTable/menu/index.vue b/src/components/ADempiere/DataTable/menu/index.vue index b39bf92d..edce3d35 100644 --- a/src/components/ADempiere/DataTable/menu/index.vue +++ b/src/components/ADempiere/DataTable/menu/index.vue @@ -17,7 +17,7 @@ {{ $t('table.dataTable.deleteSelection') }} @@ -26,9 +26,9 @@ {{ process.name }} @@ -39,7 +39,7 @@ {{ $t('table.dataTable.exportZip') }} @@ -72,7 +72,7 @@ diff --git a/src/components/ADempiere/DataTable/menu/menuTableMixin.js b/src/components/ADempiere/DataTable/menu/menuTableMixin.js index eae18e2e..06bec655 100644 --- a/src/components/ADempiere/DataTable/menu/menuTableMixin.js +++ b/src/components/ADempiere/DataTable/menu/menuTableMixin.js @@ -1,42 +1,22 @@ import { supportedTypes, exportFileFromJson, exportFileZip } from '@/utils/ADempiere/exportUtil.js' import { recursiveTreeSearch } from '@/utils/ADempiere/valueUtils.js' import { FIELDS_QUANTITY } from '@/utils/ADempiere/references' +import TableMixin from '@/components/ADempiere/DataTable/mixin/tableMixin.js' export default { name: 'MixinMenuTable', + mixins: [ + TableMixin + ], props: { - parentUuid: { - type: String, - default: undefined - }, - containerUuid: { - type: String, - required: true - }, - panelType: { - type: String, - default: 'window' - }, currentRow: { type: Object, default: () => {} }, - isParent: { - type: Boolean, - default: false - }, processMenu: { type: Array, default: () => [] }, - isPanelWindow: { - type: Boolean, - default: false - }, - isMobile: { - type: Boolean, - default: false - }, panelMetadata: { type: Object, default: () => {} @@ -60,73 +40,23 @@ export default { } return 'menu-table' }, - getterDataRecordsAndSelection() { - return this.$store.getters.getDataRecordAndSelection(this.containerUuid) - }, - getterNewRecords() { - if (this.isPanelWindow && !this.isParent) { - const newRecordTable = this.getterDataRecordsAndSelection.record.filter(recordItem => { - return recordItem.isNew - }) - return newRecordTable.length - } - return 0 - }, - getDataSelection() { - return this.getterDataRecordsAndSelection.selection - }, - getDataAllRecord() { - return this.getterDataRecordsAndSelection.record - }, fieldsList() { - if (this.panelMetadata && this.panelMetadata.fieldList) { - return this.panelMetadata.fieldList + if (this.panelMetadata && this.panelMetadata.fieldsList) { + return this.panelMetadata.fieldsList } return [] }, - isReadOnlyParent() { - if (this.isPanelWindow) { - if (!this.$store.getters.getContainerIsActive(this.parentUuid)) { - return true - } - if (this.$store.getters.getContainerProcessing(this.parentUuid)) { - return true - } - if (this.$store.getters.getContainerProcessed(this.parentUuid)) { - return true - } - } - return false - }, - isDisabledAddNew() { - if (this.isParent) { - return true - } - if (this.$route.query.action === 'create-new') { - return true - } - if (!this.panelMetadata.isInsertRecord) { - return true - } - if (this.isReadOnlyParent) { - return true - } - if (this.getterNewRecords) { - return true - } - return false - }, isFieldsQuantity() { - const fieldsQuantity = this.getterFieldList.filter(fieldItem => { + const fieldsQuantity = this.getterFieldsList.filter(fieldItem => { return FIELDS_QUANTITY.includes(fieldItem.displayType) }).length return !fieldsQuantity }, - getterFieldList() { + getterFieldsList() { return this.$store.getters.getFieldsListFromPanel(this.containerUuid) }, - getterFieldListHeader() { - const header = this.getterFieldList.filter(fieldItem => { + getterFieldsListHeader() { + const header = this.getterFieldsList.filter(fieldItem => { const isDisplayed = fieldItem.isDisplayed || fieldItem.isDisplayedFromLogic if (fieldItem.isActive && isDisplayed && !fieldItem.isKey) { return fieldItem.name @@ -136,8 +66,8 @@ export default { return fieldItem.name }) }, - getterFieldListValue() { - const value = this.getterFieldList.filter(fieldItem => { + getterFieldsListValue() { + const value = this.getterFieldsList.filter(fieldItem => { const isDisplayed = fieldItem.isDisplayed || fieldItem.isDisplayedFromLogic if (fieldItem.isActive && isDisplayed && !fieldItem.isKey) { return fieldItem @@ -163,16 +93,12 @@ export default { parentRecordUuid: this.$route.query.action }) }, - closeMenu() { - // TODO: Validate to dispatch one action - this.$store.dispatch('showMenuTable', { - isShowedTable: false - }) - this.$store.dispatch('showMenuTabChildren', { - isShowedTabChildren: false - }) - }, showModalTable(process) { + if (process.type === 'application') { + this.sortTab(process) + return + } + const processData = this.$store.getters.getProcess(process.uuid) if (!this.currentRow) { this.$store.dispatch('setProcessSelect', { @@ -231,30 +157,18 @@ export default { containerUuid: this.containerUuid }) }, - deleteSelection() { - this.$store.dispatch('deleteSelectionDataList', { - parentUuid: this.parentUuid, - containerUuid: this.containerUuid - }).then(() => { - this.$store.dispatch('setRecordSelection', { - parentUuid: this.parentUuid, - containerUuid: this.containerUuid, - panelType: this.panelType - }) - }) - }, addNewRow() { - if (this.getterNewRecords <= 0) { + if (this.newRecordsQuantity <= 0) { this.$store.dispatch('addNewRow', { parentUuid: this.parentUuid, containerUuid: this.containerUuid, - fieldList: this.fieldsList, + fieldsList: this.fieldsList, isEdit: true, isSendServer: false }) return } - const fieldsEmpty = this.$store.getters.getFieldListEmptyMandatory({ + const fieldsEmpty = this.$store.getters.getFieldsListEmptyMandatory({ containerUuid: this.containerUuid }) this.$message({ @@ -273,11 +187,14 @@ export default { * @param {string} formatToExport */ exporRecordTable(formatToExport) { - const header = this.getterFieldListHeader - const filterVal = this.getterFieldListValue - let list = this.getDataSelection + const header = this.getterFieldsListHeader + const filterVal = this.getterFieldsListValue + + let list = [] if (this.menuType === 'tableContextMenu') { list = [this.currentRow] + } else { + list = this.getDataSelection } const data = this.formatJson(filterVal, list) @@ -290,11 +207,11 @@ export default { this.closeMenu() }, exporZipRecordTable() { - const header = this.getterFieldListHeader - const filterVal = this.getterFieldListValue + const header = this.getterFieldsListHeader + const filterVal = this.getterFieldsListValue let list = this.getDataSelection if (this.getDataSelection.length <= 0) { - list = this.getDataAllRecord + list = this.recordsData } const data = this.formatJson(filterVal, list) exportFileZip({ @@ -313,7 +230,7 @@ export default { }, zoomRecord() { const browserMetadata = this.$store.getters.getBrowser(this.$route.meta.uuid) - const { elementName } = browserMetadata.fieldList.find(field => field.columnName === browserMetadata.keyColumn) + const { elementName } = browserMetadata.fieldsList.find(field => field.columnName === browserMetadata.keyColumn) const records = [] this.getDataSelection.forEach(recordItem => { let record = recordItem[browserMetadata.keyColumn] @@ -337,9 +254,7 @@ export default { action: 'advancedQuery', [elementName]: records } - }).catch(error => { - console.info(`Table Menu Mixin: ${error.name}, ${error.message}`) - }) + }, () => {}) } } } diff --git a/src/components/ADempiere/DataTable/menu/tableContextMenu.vue b/src/components/ADempiere/DataTable/menu/tableContextMenu.vue index 28d60af2..8e8c2f5a 100644 --- a/src/components/ADempiere/DataTable/menu/tableContextMenu.vue +++ b/src/components/ADempiere/DataTable/menu/tableContextMenu.vue @@ -4,7 +4,7 @@ >