From eabf5300fa8634070f79a7bc91a3de39acae03d0 Mon Sep 17 00:00:00 2001 From: Macharia Muguku Date: Mon, 18 Oct 2021 10:04:32 +0300 Subject: [PATCH 01/15] add get organisation by practitioner endpoint --- packages/keycloak-user-management/src/constants.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/keycloak-user-management/src/constants.ts b/packages/keycloak-user-management/src/constants.ts index 104579c56..62ca3443a 100644 --- a/packages/keycloak-user-management/src/constants.ts +++ b/packages/keycloak-user-management/src/constants.ts @@ -8,6 +8,7 @@ export const URL_USER_GROUP_EDIT = `${URL_ADMIN}/users/group/edit`; export const URL_USER_CREATE = URL_ADMIN + '/users/new'; export const URL_USER_GROUP_CREATE = `${URL_ADMIN}/users/group/new`; export const URL_USER_CREDENTIALS = URL_ADMIN + '/users/credentials'; +export const ORGANIZATION_BY_PRACTITIONER = 'organization/by-practitioner'; // Route params export const ROUTE_PARAM_USER_ID = 'userId'; From 6e0ade957e8cecfdfe25b0033b69dfb76f5136fc Mon Sep 17 00:00:00 2001 From: Macharia Muguku Date: Mon, 18 Oct 2021 10:05:02 +0300 Subject: [PATCH 02/15] add team management dependency --- .../keycloak-user-management/package.json | 3 +- yarn.lock | 371 +++++++++++++----- 2 files changed, 276 insertions(+), 98 deletions(-) diff --git a/packages/keycloak-user-management/package.json b/packages/keycloak-user-management/package.json index 6fe53de87..67f2ecdb2 100644 --- a/packages/keycloak-user-management/package.json +++ b/packages/keycloak-user-management/package.json @@ -52,6 +52,7 @@ "@opensrp/pkg-config": "^0.0.9", "@opensrp/react-utils": "^0.0.11", "@opensrp/server-service": "^0.0.16", + "@opensrp/team-management": "^0.0.9", "antd": "^4.6.3", "babel-plugin-transform-es2015-modules-commonjs": "^6.26.2", "bootstrap": "^4.5.2", @@ -61,8 +62,8 @@ "formik-antd": "^2.0.1", "lodash": "^4.17.20", "react-i18next": "^11.8.10", - "uuid": "^8.3.1", "react-query": "^3.15.1", + "uuid": "^8.3.1", "yup": "^0.29.3" }, "devDependencies": { diff --git a/yarn.lock b/yarn.lock index d9eb0fc22..0d87e1805 100644 --- a/yarn.lock +++ b/yarn.lock @@ -85,18 +85,23 @@ dependencies: "@babel/highlight" "^7.10.4" -"@babel/code-frame@^7.12.11": - version "7.12.11" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f" - integrity sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw== +"@babel/code-frame@^7.14.5", "@babel/code-frame@^7.15.8": + version "7.15.8" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.15.8.tgz#45990c47adadb00c03677baa89221f7cc23d2503" + integrity sha512-2IAnmn8zbvC/jKYhq5Ki9I+DwjlrtMPUCH/CpHvqI4dNnlwHwsxoIhlc8WcYY5LSYknXQtAlFYuHfqAFCvQ4Wg== dependencies: - "@babel/highlight" "^7.10.4" + "@babel/highlight" "^7.14.5" "@babel/compat-data@^7.12.5", "@babel/compat-data@^7.12.7", "@babel/compat-data@^7.9.0": version "7.12.7" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.12.7.tgz#9329b4782a7d6bbd7eef57e11addf91ee3ef1e41" integrity sha512-YaxPMGs/XIWtYqrdEOZOCPsVWfEoriXopnsz3/i7apYPXQ3698UFhS6dVT1KN5qOsWmVgw/FOrmQgpRaZayGsw== +"@babel/compat-data@^7.15.0": + version "7.15.0" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.15.0.tgz#2dbaf8b85334796cafbb0f5793a90a2fc010b176" + integrity sha512-0NqAC1IJE0S0+lL1SWFMxMkz1pKCNCjI4tr2Zx4LJSXxCLAdr6KyArnY+sno5m3yH9g737ygOyPABDsnXkpxiA== + "@babel/core@7.9.0": version "7.9.0" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.9.0.tgz#ac977b538b77e132ff706f3b8a4dbad09c03c56e" @@ -141,34 +146,25 @@ semver "^5.4.1" source-map "^0.5.0" -"@babel/core@^7.7.5": - version "7.12.10" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.12.10.tgz#b79a2e1b9f70ed3d84bbfb6d8c4ef825f606bccd" - integrity sha512-eTAlQKq65zHfkHZV0sIVODCPGVgoo1HdBlbSLi9CqOzuZanMv2ihzY+4paiKr1mH+XmYESMAmJ/dpZ68eN6d8w== - dependencies: - "@babel/code-frame" "^7.10.4" - "@babel/generator" "^7.12.10" - "@babel/helper-module-transforms" "^7.12.1" - "@babel/helpers" "^7.12.5" - "@babel/parser" "^7.12.10" - "@babel/template" "^7.12.7" - "@babel/traverse" "^7.12.10" - "@babel/types" "^7.12.10" +"@babel/core@^7.12.3", "@babel/core@^7.7.5": + version "7.15.8" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.15.8.tgz#195b9f2bffe995d2c6c159e72fe525b4114e8c10" + integrity sha512-3UG9dsxvYBMYwRv+gS41WKHno4K60/9GPy1CJaH6xy3Elq8CTtvtjT5R5jmNhXfCYLX2mTw+7/aq5ak/gOE0og== + dependencies: + "@babel/code-frame" "^7.15.8" + "@babel/generator" "^7.15.8" + "@babel/helper-compilation-targets" "^7.15.4" + "@babel/helper-module-transforms" "^7.15.8" + "@babel/helpers" "^7.15.4" + "@babel/parser" "^7.15.8" + "@babel/template" "^7.15.4" + "@babel/traverse" "^7.15.4" + "@babel/types" "^7.15.6" convert-source-map "^1.7.0" debug "^4.1.0" - gensync "^1.0.0-beta.1" + gensync "^1.0.0-beta.2" json5 "^2.1.2" - lodash "^4.17.19" - semver "^5.4.1" - source-map "^0.5.0" - -"@babel/generator@^7.12.10", "@babel/generator@^7.12.11": - version "7.12.11" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.12.11.tgz#98a7df7b8c358c9a37ab07a24056853016aba3af" - integrity sha512-Ggg6WPOJtSi8yYQvLVjG8F/TlpWDlKx0OpS4Kt+xMQPs5OaGYWy+v1A+1TvxI6sAMGZpKWWoAQ1DaeQbImlItA== - dependencies: - "@babel/types" "^7.12.11" - jsesc "^2.5.1" + semver "^6.3.0" source-map "^0.5.0" "@babel/generator@^7.12.5", "@babel/generator@^7.4.0", "@babel/generator@^7.9.0": @@ -180,6 +176,15 @@ jsesc "^2.5.1" source-map "^0.5.0" +"@babel/generator@^7.15.4", "@babel/generator@^7.15.8": + version "7.15.8" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.15.8.tgz#fa56be6b596952ceb231048cf84ee499a19c0cd1" + integrity sha512-ECmAKstXbp1cvpTTZciZCgfOt6iN64lR0d+euv3UZisU5awfRawOvg07Utn/qBGuH4bRIEZKrA/4LzZyXhZr8g== + dependencies: + "@babel/types" "^7.15.6" + jsesc "^2.5.1" + source-map "^0.5.0" + "@babel/helper-annotate-as-pure@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.4.tgz#5bf0d495a3f757ac3bda48b5bf3b3ba309c72ba3" @@ -222,6 +227,16 @@ browserslist "^4.14.5" semver "^5.5.0" +"@babel/helper-compilation-targets@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.4.tgz#cf6d94f30fbefc139123e27dd6b02f65aeedb7b9" + integrity sha512-rMWPCirulnPSe4d+gwdWXLfAXTTBj8M3guAf5xFQJ0nvFY7tfNAFnWdqaHegHlgDZOCT4qvhF3BYlSJag8yhqQ== + dependencies: + "@babel/compat-data" "^7.15.0" + "@babel/helper-validator-option" "^7.14.5" + browserslist "^4.16.6" + semver "^6.3.0" + "@babel/helper-create-class-features-plugin@^7.12.1", "@babel/helper-create-class-features-plugin@^7.8.3": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.12.1.tgz#3c45998f431edd4a9214c5f1d3ad1448a6137f6e" @@ -266,14 +281,14 @@ "@babel/template" "^7.10.4" "@babel/types" "^7.10.4" -"@babel/helper-function-name@^7.12.11": - version "7.12.11" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.12.11.tgz#1fd7738aee5dcf53c3ecff24f1da9c511ec47b42" - integrity sha512-AtQKjtYNolKNi6nNNVLQ27CP6D9oFR6bq/HPYSizlzbp7uC1M59XJe8L+0uXjbIaZaUJF99ruHqVGiKXU/7ybA== +"@babel/helper-function-name@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.15.4.tgz#845744dafc4381a4a5fb6afa6c3d36f98a787ebc" + integrity sha512-Z91cOMM4DseLIGOnog+Z8OI6YseR9bua+HpvLAQ2XayUGU+neTtX+97caALaLdyu53I/fjhbeCnWnRH1O3jFOw== dependencies: - "@babel/helper-get-function-arity" "^7.12.10" - "@babel/template" "^7.12.7" - "@babel/types" "^7.12.11" + "@babel/helper-get-function-arity" "^7.15.4" + "@babel/template" "^7.15.4" + "@babel/types" "^7.15.4" "@babel/helper-get-function-arity@^7.10.4": version "7.10.4" @@ -282,12 +297,12 @@ dependencies: "@babel/types" "^7.10.4" -"@babel/helper-get-function-arity@^7.12.10": - version "7.12.10" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.10.tgz#b158817a3165b5faa2047825dfa61970ddcc16cf" - integrity sha512-mm0n5BPjR06wh9mPQaDdXWDoll/j5UpCAPl1x8fS71GHm7HA6Ua2V4ylG1Ju8lvcTOietbPNNPaSilKj+pj+Ag== +"@babel/helper-get-function-arity@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.15.4.tgz#098818934a137fce78b536a3e015864be1e2879b" + integrity sha512-1/AlxSF92CmGZzHnC515hm4SirTxtpDnLEJ0UyEMgTMZN+6bxXKg04dKhiRx5Enel+SUA1G1t5Ed/yQia0efrA== dependencies: - "@babel/types" "^7.12.10" + "@babel/types" "^7.15.4" "@babel/helper-hoist-variables@^7.10.4": version "7.10.4" @@ -296,6 +311,13 @@ dependencies: "@babel/types" "^7.10.4" +"@babel/helper-hoist-variables@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.15.4.tgz#09993a3259c0e918f99d104261dfdfc033f178df" + integrity sha512-VTy085egb3jUGVK9ycIxQiPbquesq0HUQ+tPO0uv5mPEBZipk+5FkRKiWq5apuyTE9FUrjENB0rCf8y+n+UuhA== + dependencies: + "@babel/types" "^7.15.4" + "@babel/helper-member-expression-to-functions@^7.12.1": version "7.12.7" resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.7.tgz#aa77bd0396ec8114e5e30787efa78599d874a855" @@ -303,6 +325,13 @@ dependencies: "@babel/types" "^7.12.7" +"@babel/helper-member-expression-to-functions@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.4.tgz#bfd34dc9bba9824a4658b0317ec2fd571a51e6ef" + integrity sha512-cokOMkxC/BTyNP1AlY25HuBWM32iCEsLPI4BHDpJCHHm1FU2E7dKWWIXJgQgSFiu4lp8q3bL1BIKwqkSUviqtA== + dependencies: + "@babel/types" "^7.15.4" + "@babel/helper-module-imports@^7.12.1", "@babel/helper-module-imports@^7.12.5", "@babel/helper-module-imports@^7.8.3": version "7.12.5" resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.12.5.tgz#1bfc0229f794988f76ed0a4d4e90860850b54dfb" @@ -310,6 +339,13 @@ dependencies: "@babel/types" "^7.12.5" +"@babel/helper-module-imports@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.15.4.tgz#e18007d230632dea19b47853b984476e7b4e103f" + integrity sha512-jeAHZbzUwdW/xHgHQ3QmWR4Jg6j15q4w/gCfwZvtqOxoo5DKtLHk8Bsf4c5RZRC7NmLEs+ohkdq8jFefuvIxAA== + dependencies: + "@babel/types" "^7.15.4" + "@babel/helper-module-transforms@^7.12.1", "@babel/helper-module-transforms@^7.9.0": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.12.1.tgz#7954fec71f5b32c48e4b303b437c34453fd7247c" @@ -325,6 +361,20 @@ "@babel/types" "^7.12.1" lodash "^4.17.19" +"@babel/helper-module-transforms@^7.15.8": + version "7.15.8" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.15.8.tgz#d8c0e75a87a52e374a8f25f855174786a09498b2" + integrity sha512-DfAfA6PfpG8t4S6npwzLvTUpp0sS7JrcuaMiy1Y5645laRJIp/LiLGIBbQKaXSInK8tiGNI7FL7L8UvB8gdUZg== + dependencies: + "@babel/helper-module-imports" "^7.15.4" + "@babel/helper-replace-supers" "^7.15.4" + "@babel/helper-simple-access" "^7.15.4" + "@babel/helper-split-export-declaration" "^7.15.4" + "@babel/helper-validator-identifier" "^7.15.7" + "@babel/template" "^7.15.4" + "@babel/traverse" "^7.15.4" + "@babel/types" "^7.15.6" + "@babel/helper-optimise-call-expression@^7.10.4": version "7.12.7" resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.7.tgz#7f94ae5e08721a49467346aa04fd22f750033b9c" @@ -332,11 +382,23 @@ dependencies: "@babel/types" "^7.12.7" +"@babel/helper-optimise-call-expression@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.15.4.tgz#f310a5121a3b9cc52d9ab19122bd729822dee171" + integrity sha512-E/z9rfbAOt1vDW1DR7k4SzhzotVV5+qMciWV6LaG1g4jeFrkDlJedjtV4h0i4Q/ITnUu+Pk08M7fczsB9GXBDw== + dependencies: + "@babel/types" "^7.15.4" + "@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz#2f75a831269d4f677de49986dff59927533cf375" integrity sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg== +"@babel/helper-plugin-utils@^7.12.13": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz#5ac822ce97eec46741ab70a517971e443a70c5a9" + integrity sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ== + "@babel/helper-remap-async-to-generator@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.12.1.tgz#8c4dbbf916314f6047dc05e6a2217074238347fd" @@ -356,6 +418,16 @@ "@babel/traverse" "^7.12.5" "@babel/types" "^7.12.5" +"@babel/helper-replace-supers@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.15.4.tgz#52a8ab26ba918c7f6dee28628b07071ac7b7347a" + integrity sha512-/ztT6khaXF37MS47fufrKvIsiQkx1LBRvSJNzRqmbyeZnTwU9qBxXYLaaT/6KaxfKhjs2Wy8kG8ZdsFUuWBjzw== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.15.4" + "@babel/helper-optimise-call-expression" "^7.15.4" + "@babel/traverse" "^7.15.4" + "@babel/types" "^7.15.4" + "@babel/helper-simple-access@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.12.1.tgz#32427e5aa61547d38eb1e6eaf5fd1426fdad9136" @@ -363,6 +435,13 @@ dependencies: "@babel/types" "^7.12.1" +"@babel/helper-simple-access@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.15.4.tgz#ac368905abf1de8e9781434b635d8f8674bcc13b" + integrity sha512-UzazrDoIVOZZcTeHHEPYrr1MvTR/K+wgLg6MY6e1CJyaRhbibftF6fR2KU2sFRtI/nERUZR9fBd6aKgBlIBaPg== + dependencies: + "@babel/types" "^7.15.4" + "@babel/helper-skip-transparent-expression-wrappers@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz#462dc63a7e435ade8468385c63d2b84cce4b3cbf" @@ -377,28 +456,33 @@ dependencies: "@babel/types" "^7.11.0" -"@babel/helper-split-export-declaration@^7.12.11": - version "7.12.11" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.11.tgz#1b4cc424458643c47d37022223da33d76ea4603a" - integrity sha512-LsIVN8j48gHgwzfocYUSkO/hjYAOJqlpJEc7tGXcIm4cubjVUf8LGW6eWRyxEu7gA25q02p0rQUWoCI33HNS5g== +"@babel/helper-split-export-declaration@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.15.4.tgz#aecab92dcdbef6a10aa3b62ab204b085f776e257" + integrity sha512-HsFqhLDZ08DxCpBdEVtKmywj6PQbwnF6HHybur0MAnkAKnlS6uHkwnmRIkElB2Owpfb4xL4NwDmDLFubueDXsw== dependencies: - "@babel/types" "^7.12.11" + "@babel/types" "^7.15.4" "@babel/helper-validator-identifier@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz#a78c7a7251e01f616512d31b10adcf52ada5e0d2" integrity sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw== -"@babel/helper-validator-identifier@^7.12.11": - version "7.12.11" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz#c9a1f021917dcb5ccf0d4e453e399022981fc9ed" - integrity sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw== +"@babel/helper-validator-identifier@^7.14.5", "@babel/helper-validator-identifier@^7.14.9", "@babel/helper-validator-identifier@^7.15.7": + version "7.15.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz#220df993bfe904a4a6b02ab4f3385a5ebf6e2389" + integrity sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w== "@babel/helper-validator-option@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.12.1.tgz#175567380c3e77d60ff98a54bb015fe78f2178d9" integrity sha512-YpJabsXlJVWP0USHjnC/AQDTLlZERbON577YUVO/wLpqyj6HAtVYnWaQaN0iUN+1/tWn3c+uKKXjRut5115Y2A== +"@babel/helper-validator-option@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz#6e72a1fff18d5dfcb878e1e62f1a021c4b72d5a3" + integrity sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow== + "@babel/helper-wrap-function@^7.10.4": version "7.12.3" resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.12.3.tgz#3332339fc4d1fbbf1c27d7958c27d34708e990d9" @@ -418,6 +502,15 @@ "@babel/traverse" "^7.12.5" "@babel/types" "^7.12.5" +"@babel/helpers@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.15.4.tgz#5f40f02050a3027121a3cf48d497c05c555eaf43" + integrity sha512-V45u6dqEJ3w2rlryYYXf6i9rQ5YMNu4FLS6ngs8ikblhu2VdR1AqAd6aJjBzmf2Qzh6KOLqKHxEN9+TFbAkAVQ== + dependencies: + "@babel/template" "^7.15.4" + "@babel/traverse" "^7.15.4" + "@babel/types" "^7.15.4" + "@babel/highlight@^7.10.4", "@babel/highlight@^7.8.3": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.10.4.tgz#7d1bdfd65753538fabe6c38596cdb76d9ac60143" @@ -427,15 +520,24 @@ chalk "^2.0.0" js-tokens "^4.0.0" +"@babel/highlight@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.14.5.tgz#6861a52f03966405001f6aa534a01a24d99e8cd9" + integrity sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg== + dependencies: + "@babel/helper-validator-identifier" "^7.14.5" + chalk "^2.0.0" + js-tokens "^4.0.0" + "@babel/parser@^7.1.0", "@babel/parser@^7.10.4", "@babel/parser@^7.12.7", "@babel/parser@^7.4.3", "@babel/parser@^7.7.0", "@babel/parser@^7.9.0": version "7.12.7" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.12.7.tgz#fee7b39fe809d0e73e5b25eecaf5780ef3d73056" integrity sha512-oWR02Ubp4xTLCAqPRiNIuMVgNO5Aif/xpXtabhzW2HWUD47XJsAB4Zd/Rg30+XeQA3juXigV7hlquOTmwqLiwg== -"@babel/parser@^7.12.10", "@babel/parser@^7.12.11": - version "7.12.11" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.12.11.tgz#9ce3595bcd74bc5c466905e86c535b8b25011e79" - integrity sha512-N3UxG+uuF4CMYoNj8AhnbAcJF0PiuJ9KHuy1lQmkYsxTer/MAH9UBNHsBoAX/4s6NvlDD047No8mYVGGzLL4hg== +"@babel/parser@^7.14.7", "@babel/parser@^7.15.4", "@babel/parser@^7.15.8": + version "7.15.8" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.15.8.tgz#7bacdcbe71bdc3ff936d510c15dcea7cf0b99016" + integrity sha512-BRYa3wcQnjS/nqI8Ac94pYYpJfojHVvVXJ97+IDCImX4Jc8W8Xv1+47enbruk+q1etOpsQNwnfFcNGw+gtPGxA== "@babel/plugin-proposal-async-generator-functions@^7.12.1", "@babel/plugin-proposal-async-generator-functions@^7.8.3": version "7.12.1" @@ -599,13 +701,20 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-class-properties@^7.12.1", "@babel/plugin-syntax-class-properties@^7.8.3": +"@babel/plugin-syntax-class-properties@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.1.tgz#bcb297c5366e79bebadef509549cd93b04f19978" integrity sha512-U40A76x5gTwmESz+qiqssqmeEsKvcSyvtgktrm0uzcARAmM9I1jR221f6Oq+GmHrcD+LvZDag1UTOTe2fL3TeA== dependencies: "@babel/helper-plugin-utils" "^7.10.4" +"@babel/plugin-syntax-class-properties@^7.8.3": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" + integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/plugin-syntax-decorators@^7.8.3": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.12.1.tgz#81a8b535b284476c41be6de06853a8802b98c5dd" @@ -1302,7 +1411,7 @@ "@babel/parser" "^7.10.4" "@babel/types" "^7.10.4" -"@babel/template@^7.12.7", "@babel/template@^7.3.3": +"@babel/template@^7.12.7": version "7.12.7" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.12.7.tgz#c817233696018e39fbb6c491d2fb684e05ed43bc" integrity sha512-GkDzmHS6GV7ZeXfJZ0tLRBhZcMcY0/Lnb+eEbXDBfCAcZCjrZKe6p3J4we/D24O9Y8enxWAg1cWwof59yLh2ow== @@ -1311,6 +1420,15 @@ "@babel/parser" "^7.12.7" "@babel/types" "^7.12.7" +"@babel/template@^7.15.4", "@babel/template@^7.3.3": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.15.4.tgz#51898d35dcf3faa670c4ee6afcfd517ee139f194" + integrity sha512-UgBAfEa1oGuYgDIPM2G+aHa4Nlo9Lh6mGD2bDBGMTbYnc38vulXPuC1MGjYILIEmlwl6Rd+BPR9ee3gm20CBtg== + dependencies: + "@babel/code-frame" "^7.14.5" + "@babel/parser" "^7.15.4" + "@babel/types" "^7.15.4" + "@babel/traverse@^7.1.0", "@babel/traverse@^7.10.4", "@babel/traverse@^7.12.1", "@babel/traverse@^7.12.5", "@babel/traverse@^7.12.8", "@babel/traverse@^7.4.3", "@babel/traverse@^7.7.0", "@babel/traverse@^7.9.0": version "7.12.8" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.12.8.tgz#c1c2983bf9ba0f4f0eaa11dff7e77fa63307b2a4" @@ -1326,20 +1444,20 @@ globals "^11.1.0" lodash "^4.17.19" -"@babel/traverse@^7.12.10": - version "7.12.12" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.12.12.tgz#d0cd87892704edd8da002d674bc811ce64743376" - integrity sha512-s88i0X0lPy45RrLM8b9mz8RPH5FqO9G9p7ti59cToE44xFm1Q+Pjh5Gq4SXBbtb88X7Uy7pexeqRIQDDMNkL0w== - dependencies: - "@babel/code-frame" "^7.12.11" - "@babel/generator" "^7.12.11" - "@babel/helper-function-name" "^7.12.11" - "@babel/helper-split-export-declaration" "^7.12.11" - "@babel/parser" "^7.12.11" - "@babel/types" "^7.12.12" +"@babel/traverse@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.15.4.tgz#ff8510367a144bfbff552d9e18e28f3e2889c22d" + integrity sha512-W6lQD8l4rUbQR/vYgSuCAE75ADyyQvOpFVsvPPdkhf6lATXAsQIG9YdtOcu8BB1dZ0LKu+Zo3c1wEcbKeuhdlA== + dependencies: + "@babel/code-frame" "^7.14.5" + "@babel/generator" "^7.15.4" + "@babel/helper-function-name" "^7.15.4" + "@babel/helper-hoist-variables" "^7.15.4" + "@babel/helper-split-export-declaration" "^7.15.4" + "@babel/parser" "^7.15.4" + "@babel/types" "^7.15.4" debug "^4.1.0" globals "^11.1.0" - lodash "^4.17.19" "@babel/types@^7.0.0", "@babel/types@^7.10.4", "@babel/types@^7.10.5", "@babel/types@^7.11.0", "@babel/types@^7.12.1", "@babel/types@^7.12.5", "@babel/types@^7.12.7", "@babel/types@^7.3.0", "@babel/types@^7.4.0", "@babel/types@^7.4.4", "@babel/types@^7.7.0", "@babel/types@^7.9.0": version "7.12.7" @@ -1350,13 +1468,12 @@ lodash "^4.17.19" to-fast-properties "^2.0.0" -"@babel/types@^7.12.10", "@babel/types@^7.12.11", "@babel/types@^7.12.12", "@babel/types@^7.3.3": - version "7.12.12" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.12.12.tgz#4608a6ec313abbd87afa55004d373ad04a96c299" - integrity sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ== +"@babel/types@^7.15.4", "@babel/types@^7.15.6", "@babel/types@^7.3.3": + version "7.15.6" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.15.6.tgz#99abdc48218b2881c058dd0a7ab05b99c9be758f" + integrity sha512-BPU+7QhqNjmWyDO0/vitH/CuhpV8ZmK1wpKva8nuyNF5MJfuRNWMc+hc14+u9xT93kvykMdncrJT19h74uB1Ig== dependencies: - "@babel/helper-validator-identifier" "^7.12.11" - lodash "^4.17.19" + "@babel/helper-validator-identifier" "^7.14.9" to-fast-properties "^2.0.0" "@bcoe/v8-coverage@^0.2.3": @@ -1478,9 +1595,9 @@ resolve-from "^5.0.0" "@istanbuljs/schema@^0.1.2": - version "0.1.2" - resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.2.tgz#26520bf09abe4a5644cd5414e37125a8954241dd" - integrity sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw== + version "0.1.3" + resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" + integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== "@jest/console@^24.9.0": version "24.9.0" @@ -3085,7 +3202,7 @@ resolved "https://registry.yarnpkg.com/@types/aria-query/-/aria-query-4.2.0.tgz#14264692a9d6e2fa4db3df5e56e94b5e25647ac0" integrity sha512-iIgQNzCm0v7QMhhe4Jjn9uRh+I6GoPmt03CbEtwx3ao8/EfoQcmgtqH4vQ5Db/lxiIGaWDv6nwvunuh0RyX0+A== -"@types/babel__core@^7.1.0", "@types/babel__core@^7.1.7": +"@types/babel__core@^7.1.0": version "7.1.12" resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.12.tgz#4d8e9e51eb265552a7e4f1ff2219ab6133bdfb2d" integrity sha512-wMTHiiTiBAAPebqaPiPDLFA4LYPKr6Ph0Xq/6rq1Ur3v66HXyG+clfR9CNETkD7MQS8ZHvpQOtA53DLws5WAEQ== @@ -3096,6 +3213,17 @@ "@types/babel__template" "*" "@types/babel__traverse" "*" +"@types/babel__core@^7.1.7": + version "7.1.16" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.16.tgz#bc12c74b7d65e82d29876b5d0baf5c625ac58702" + integrity sha512-EAEHtisTMM+KaKwfWdC3oyllIqswlznXCIVCt7/oRNrh+DhgT4UEBNC/jlADNjvw7UnfbcdkGQcPVZ1xYiLcrQ== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + "@types/babel__generator" "*" + "@types/babel__template" "*" + "@types/babel__traverse" "*" + "@types/babel__generator@*": version "7.6.2" resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.2.tgz#f3d71178e187858f7c45e30380f8f1b7415a12d8" @@ -4479,14 +4607,14 @@ babel-plugin-istanbul@^5.1.0: test-exclude "^5.2.3" babel-plugin-istanbul@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz#e159ccdc9af95e0b570c75b4573b7c34d671d765" - integrity sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ== + version "6.1.1" + resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" + integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@istanbuljs/load-nyc-config" "^1.0.0" "@istanbuljs/schema" "^0.1.2" - istanbul-lib-instrument "^4.0.0" + istanbul-lib-instrument "^5.0.4" test-exclude "^6.0.0" babel-plugin-jest-hoist@^24.9.0: @@ -4954,6 +5082,17 @@ browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.14.5, browserslist@^4 escalade "^3.1.1" node-releases "^1.1.66" +browserslist@^4.16.6: + version "4.17.4" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.17.4.tgz#72e2508af2a403aec0a49847ef31bd823c57ead4" + integrity sha512-Zg7RpbZpIJRW3am9Lyckue7PLytvVxxhJj1CaJVlCWENsGEAOlnlt8X0ZxGRPp7Bt9o8tIRM5SEXy4BCPMJjLQ== + dependencies: + caniuse-lite "^1.0.30001265" + electron-to-chromium "^1.3.867" + escalade "^3.1.1" + node-releases "^2.0.0" + picocolors "^1.0.0" + bser@2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" @@ -5213,6 +5352,11 @@ caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001035, can resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001241.tgz" integrity sha512-1uoSZ1Pq1VpH0WerIMqwptXHNNGfdl7d1cJUFs80CwQ/lVzdhTvsFZCeNFslze7AjsQnb4C85tzclPa1VShbeQ== +caniuse-lite@^1.0.30001265: + version "1.0.30001269" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001269.tgz#3a71bee03df627364418f9fd31adfc7aa1cc2d56" + integrity sha512-UOy8okEVs48MyHYgV+RdW1Oiudl1H6KolybD6ZquD0VcrPSgj25omXO1S7rDydjpqaISCwA8Pyx+jUQKZwWO5w== + capture-exit@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-2.0.0.tgz#fb953bfaebeb781f62898239dabb426d08a509a4" @@ -5894,7 +6038,7 @@ conventional-recommended-bump@^6.1.0: meow "^8.0.0" q "^1.5.1" -convert-source-map@1.7.0, convert-source-map@^1.1.0, convert-source-map@^1.4.0, convert-source-map@^1.5.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: +convert-source-map@1.7.0, convert-source-map@^1.1.0, convert-source-map@^1.4.0, convert-source-map@^1.5.0, convert-source-map@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== @@ -5906,6 +6050,13 @@ convert-source-map@^0.3.3: resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-0.3.5.tgz#f1d802950af7dd2631a1febe0596550c86ab3190" integrity sha1-8dgClQr33SYxof6+BZZVDIarMZA= +convert-source-map@^1.6.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369" + integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== + dependencies: + safe-buffer "~5.1.1" + cookie-signature@1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" @@ -6996,6 +7147,11 @@ electron-to-chromium@^1.3.378, electron-to-chromium@^1.3.591: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.606.tgz#6ef2655d9a7c1b447dfdd6344657d00461a65e26" integrity sha512-+/2yPHwtNf6NWKpaYt0KoqdSZ6Qddt6nDfH/pnhcrHq9hSb23e5LFy06Mlf0vF2ykXvj7avJ597psqcbKnG5YQ== +electron-to-chromium@^1.3.867: + version "1.3.871" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.871.tgz#6e87365fd72037a6c898fb46050ad4be3ac9ef62" + integrity sha512-qcLvDUPf8DSIMWarHT2ptgcqrYg62n3vPA7vhrOF24d8UNzbUBaHu2CySiENR3nEDzYgaN60071t0F6KLYMQ7Q== + elliptic@^6.5.3: version "6.5.3" resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.3.tgz#cb59eb2efdaf73a0bd78ccd7015a62ad6e0f93d6" @@ -8370,7 +8526,7 @@ gauge@~2.7.3: strip-ansi "^3.0.1" wide-align "^1.1.0" -gensync@^1.0.0-beta.1: +gensync@^1.0.0-beta.1, gensync@^1.0.0-beta.2: version "1.0.0-beta.2" resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== @@ -9926,9 +10082,9 @@ istanbul-lib-coverage@^2.0.5: integrity sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA== istanbul-lib-coverage@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz#f5944a37c70b550b02a78a5c3b2055b280cec8ec" - integrity sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg== + version "3.0.2" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.2.tgz#36786d4d82aad2ea5911007e255e2da6b5f80d86" + integrity sha512-o5+eTUYzCJ11/+JhW5/FUCdfsdoYVdQ/8I/OveE2XsjehYn5DdeSnNQAbjYaO8gQ6hvGTN6GM6ddQqpTVG5j8g== istanbul-lib-instrument@^3.3.0: version "3.3.0" @@ -9953,6 +10109,17 @@ istanbul-lib-instrument@^4.0.0: istanbul-lib-coverage "^3.0.0" semver "^6.3.0" +istanbul-lib-instrument@^5.0.4: + version "5.0.4" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.0.4.tgz#e976f2aa66ebc6737f236d3ab05b76e36f885c80" + integrity sha512-W6jJF9rLGEISGoCyXRqa/JCGQGmmxPO10TMu7izaUTynxvBvTjqzAIIGCK9USBmIbQAaSWD6XJPrM9Pv5INknw== + dependencies: + "@babel/core" "^7.12.3" + "@babel/parser" "^7.14.7" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-coverage "^3.0.0" + semver "^6.3.0" + istanbul-lib-report@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" @@ -9963,18 +10130,18 @@ istanbul-lib-report@^3.0.0: supports-color "^7.1.0" istanbul-lib-source-maps@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz#75743ce6d96bb86dc7ee4352cf6366a23f0b1ad9" - integrity sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg== + version "4.0.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551" + integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== dependencies: debug "^4.1.1" istanbul-lib-coverage "^3.0.0" source-map "^0.6.1" istanbul-reports@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.0.2.tgz#d593210e5000683750cb09fc0644e4b6e27fd53b" - integrity sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw== + version "3.0.5" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.0.5.tgz#a2580107e71279ea6d661ddede929ffc6d693384" + integrity sha512-5+19PlhnGabNWB7kOFnuxT8H3T/iIyQzIbQMxXsURmmvKg86P2sbkrGOT77VnHw0Qr0gc2XzRaRfMZYYbSQCJQ== dependencies: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" @@ -12091,6 +12258,11 @@ node-releases@^1.1.52, node-releases@^1.1.66: resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.67.tgz#28ebfcccd0baa6aad8e8d4d8fe4cbc49ae239c12" integrity sha512-V5QF9noGFl3EymEwUYzO+3NTDpGfQB4ve6Qfnzf3UNydMhjQRVPR1DZTuvWiLzaFJYw2fmDwAfnRNEVb64hSIg== +node-releases@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.0.tgz#67dc74903100a7deb044037b8a2e5f453bb05400" + integrity sha512-aA87l0flFYMzCHpTM3DERFSYxc6lv/BltdbRTOMZuxZ0cwZCD3mejE5n9vLhSJCN++/eOqr77G1IO5uXxlQYWA== + noms@0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/noms/-/noms-0.0.0.tgz#da8ebd9f3af9d6760919b27d9cdc8092a7332859" @@ -12963,6 +13135,11 @@ performance-now@^2.1.0: resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + picomatch@^2.0.4, picomatch@^2.0.5, picomatch@^2.2.1: version "2.2.2" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" @@ -18209,9 +18386,9 @@ ws@^6.1.2, ws@^6.2.1: async-limiter "~1.0.0" ws@^7.0.0: - version "7.4.2" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.2.tgz#782100048e54eb36fe9843363ab1c68672b261dd" - integrity sha512-T4tewALS3+qsrpGI/8dqNMLIVdq/g/85U98HPMa6F0m6xTbvhXU6RCQLqPH3+SlomNV/LdY6RXEbBpMH6EOJnA== + version "7.5.5" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.5.tgz#8b4bc4af518cfabd0473ae4f99144287b33eb881" + integrity sha512-BAkMFcAzl8as1G/hArkxOxq3G7pjUqQ3gzYbLL0/5zNkph70e+lCoxBGnm6AW1+/aiNeV4fnKqZ8m4GZewmH2w== ws@^7.2.3: version "7.4.0" From 267d9cfb591c1627db2d7c80d954bb28b910ffb5 Mon Sep 17 00:00:00 2001 From: Macharia Muguku Date: Mon, 18 Oct 2021 10:05:40 +0300 Subject: [PATCH 03/15] add language translation strings --- packages/keycloak-user-management/src/lang.ts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/packages/keycloak-user-management/src/lang.ts b/packages/keycloak-user-management/src/lang.ts index 63ebc768e..2c45c36fd 100644 --- a/packages/keycloak-user-management/src/lang.ts +++ b/packages/keycloak-user-management/src/lang.ts @@ -86,6 +86,13 @@ function fill() { lang.CONTACT_REGEX_ERROR = i18n.t(`Contact should be 10 digits and start with 0`, { ns: namespace, }); + lang.KEYCLOAK_UUID = i18n.t(`Keycloak UUID`, { ns: namespace }); + lang.PRACTITIONER_UUID = i18n.t(`Practitioner UUID`, { ns: namespace }); + lang.PRACTITIONER_STATUS = i18n.t(`Practitioner Status`, { ns: namespace }); + lang.ASSIGNED_TEAMS = i18n.t(`Assigned Teams`, { ns: namespace }); + lang.NO_ASSIGNED_TEAMS = i18n.t(`No Assigned Teams`, { ns: namespace }); + lang.PRACTITIONER = i18n.t(`Practitioner`, { ns: namespace }); + lang.NO_ACTIVE_PRACTITIONER = i18n.t(`No Active Practitioner`, { ns: namespace }); } // run it initial From 7491bc91ce33367a499e32c7fca4fc777c5fb11c Mon Sep 17 00:00:00 2001 From: Macharia Muguku Date: Mon, 18 Oct 2021 10:07:09 +0300 Subject: [PATCH 04/15] add user details section and tests --- .../src/components/UserDetails/index.tsx | 76 +++++++++++++++++++ .../UserDetails/tests/index.test.tsx | 65 ++++++++++++++++ 2 files changed, 141 insertions(+) create mode 100644 packages/keycloak-user-management/src/components/UserDetails/index.tsx create mode 100644 packages/keycloak-user-management/src/components/UserDetails/tests/index.test.tsx diff --git a/packages/keycloak-user-management/src/components/UserDetails/index.tsx b/packages/keycloak-user-management/src/components/UserDetails/index.tsx new file mode 100644 index 000000000..60d413c52 --- /dev/null +++ b/packages/keycloak-user-management/src/components/UserDetails/index.tsx @@ -0,0 +1,76 @@ +import React from 'react'; +import { CloseOutlined } from '@ant-design/icons'; +import { Button } from 'antd'; +import lang from '../../lang'; +import { Organization } from '@opensrp/team-management'; +import { Practitioner, KeycloakUser } from '../../ducks/user'; +import { Spin } from 'antd'; + +interface UserDetailProps { + onClose: Function; + keycloakUser: KeycloakUser; + practitioner?: Practitioner; + assignedTeams: Organization[]; +} + +// remove onclose from type and export the rest +export type UserDetailType = Omit; + +export const UserDetails = (props: Partial) => { + const { onClose, keycloakUser, practitioner, assignedTeams } = props; + + if (!keycloakUser) return ; + + return ( +
+
+ ); +}; diff --git a/packages/keycloak-user-management/src/components/UserDetails/tests/index.test.tsx b/packages/keycloak-user-management/src/components/UserDetails/tests/index.test.tsx new file mode 100644 index 000000000..899ddf268 --- /dev/null +++ b/packages/keycloak-user-management/src/components/UserDetails/tests/index.test.tsx @@ -0,0 +1,65 @@ +import { mount } from 'enzyme'; +import React from 'react'; +import { UserDetails } from '../'; +import { Organization } from '@opensrp/team-management'; +import { Practitioner, KeycloakUser } from '../../../ducks/user'; + +describe('components/TeamsDetail', () => { + const props = { + keycloakUser: { + id: 'c1d36d9a-b771-410b-959e-af2c04d132a2', + username: 'allay_allan', + } as KeycloakUser, + practitioner: { + identifier: 'f713620c-076e-407f-98fd-ae655b3dc5ba', + active: true, + } as Practitioner, + assignedTeams: [ + { + identifier: 'b0d21cea-9e0f-4ff8-b3e3-808a2655b9c5', + active: true, + name: 'Goldsmith CHW', + }, + { + identifier: '88e63364-53c1-436f-94b4-92d4bf7fc6c7', + active: true, + name: 'New team test', + }, + ] as Organization[], + }; + it('shows details section with data', () => { + const wrapper = mount(); + + const keycloakUsername = wrapper.find('#username').text(); + expect(keycloakUsername).toEqual(props.keycloakUser.username); + + const keycloakId = wrapper.find('#keycloakId').text(); + expect(keycloakId).toEqual(props.keycloakUser.id); + + const practitionerId = wrapper.find('#practitionerId').text(); + expect(practitionerId).toEqual(props.practitioner.identifier); + + const practitionerStatus = wrapper.find('#practitionerStatus').text(); + expect(practitionerStatus).toMatchInlineSnapshot(`"active"`); + + const assignedTeams = wrapper.find('#assignedTeam').map((team) => team.text()); + expect(assignedTeams).toEqual(props.assignedTeams.map((team) => team.name)); + }); + it('shows no practitioner message when practitioner not available', () => { + const newProps = { ...props, practitioner: undefined }; + const wrapper = mount(); + expect(wrapper.find('#noActivePractitioner').text()).toMatchInlineSnapshot( + `"No Active Practitioner"` + ); + }); + it('shows no team available message when team not available', () => { + const newProps = { ...props, assignedTeams: [] }; + const wrapper = mount(); + expect(wrapper.find('#noAssignedTeams').text()).toMatchInlineSnapshot(`"No Assigned Teams"`); + }); + it('shows spinner', () => { + const newProps = { ...props, keycloakUser: undefined }; + const wrapper = mount(); + expect(wrapper.find('.ant-spin').exists()).toBeTruthy(); + }); +}); From 6bbeb5a59f0e1c5b298b6f0d44b2f1f8657ece69 Mon Sep 17 00:00:00 2001 From: Macharia Muguku Date: Mon, 18 Oct 2021 10:10:55 +0300 Subject: [PATCH 05/15] add view details button with open details callback fn --- .../UserList/TableActions/index.tsx | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/packages/keycloak-user-management/src/components/UserList/TableActions/index.tsx b/packages/keycloak-user-management/src/components/UserList/TableActions/index.tsx index 47e6d096a..5f6706ba4 100644 --- a/packages/keycloak-user-management/src/components/UserList/TableActions/index.tsx +++ b/packages/keycloak-user-management/src/components/UserList/TableActions/index.tsx @@ -15,6 +15,7 @@ export interface Props { opensrpBaseURL: string; record: KeycloakUser; extraData: Dictionary; + setDetailsCallback: (keycloakUser: KeycloakUser) => void; } /** @@ -24,7 +25,14 @@ export interface Props { * @returns {Element} - actions */ const TableActions = (props: Props): JSX.Element => { - const { record, removeKeycloakUsersCreator, keycloakBaseURL, opensrpBaseURL, extraData } = props; + const { + record, + removeKeycloakUsersCreator, + keycloakBaseURL, + opensrpBaseURL, + extraData, + setDetailsCallback, + } = props; const { user_id } = extraData; const menu = ( @@ -52,6 +60,15 @@ const TableActions = (props: Props): JSX.Element => { } + setDetailsCallback(record)} + > + {lang.VIEW_DETAILS} + ); return ( From a2eb9b56b0e8d8833fe4e5f268e85cc4f299f8e2 Mon Sep 17 00:00:00 2001 From: Macharia Muguku Date: Mon, 18 Oct 2021 10:13:09 +0300 Subject: [PATCH 06/15] add callback function to populate user details section: fetch practitioners, fetch assigned teams, populate section, open details drawer, add user details section --- .../src/components/UserList/index.tsx | 89 ++++++++++++++++++- 1 file changed, 86 insertions(+), 3 deletions(-) diff --git a/packages/keycloak-user-management/src/components/UserList/index.tsx b/packages/keycloak-user-management/src/components/UserList/index.tsx index 3693e589b..6f2daab54 100644 --- a/packages/keycloak-user-management/src/components/UserList/index.tsx +++ b/packages/keycloak-user-management/src/components/UserList/index.tsx @@ -1,4 +1,4 @@ -import * as React from 'react'; +import React, { useState } from 'react'; import { Row, Col, Button, Space } from 'antd'; import { KeycloakService } from '@opensrp/keycloak-service'; import { Store } from 'redux'; @@ -10,6 +10,7 @@ import { SearchForm, TableLayout, PaginateData, + OpenSRPService, } from '@opensrp/react-utils'; import reducerRegistry from '@onaio/redux-reducer-registry'; import { PlusOutlined } from '@ant-design/icons'; @@ -19,12 +20,15 @@ import { removeKeycloakUsers, reducerName as keycloakUsersReducerName, reducer as keycloakUsersReducer, + Practitioner, } from '../../ducks/user'; import { URL_USER_CREATE, KEYCLOAK_URL_USERS, KEYCLOAK_URL_USERS_COUNT, SEARCH_QUERY_PARAM, + OPENSRP_CREATE_PRACTITIONER_ENDPOINT, + ORGANIZATION_BY_PRACTITIONER, } from '../../constants'; import lang from '../../lang'; import { getTableColumns } from './utils'; @@ -32,6 +36,8 @@ import { getExtraData } from '@onaio/session-reducer'; import { RouteComponentProps, useHistory } from 'react-router'; import { sendErrorNotification } from '@opensrp/notifications'; import { TableActions } from './TableActions'; +import { UserDetails, UserDetailType } from '../UserDetails'; +import { Organization } from '@opensrp/team-management'; reducerRegistry.register(keycloakUsersReducerName, keycloakUsersReducer); @@ -75,7 +81,9 @@ const UserList = (props: UserListTypes): JSX.Element => { const history = useHistory(); const searchParam = getQueryParams(props.location)[SEARCH_QUERY_PARAM] ?? ''; - const [sortedInfo, setSortedInfo] = React.useState(); + const [sortedInfo, setSortedInfo] = useState(); + const [userDetails, setUserDetails] = useState(null); + const [openDetails, setOpenDetails] = useState(false); /** * Function to fetch Users @@ -100,11 +108,80 @@ const UserList = (props: UserListTypes): JSX.Element => { const isSearchActive = searchParam && searchParam.length; + // fetch practitioner tied to keycloak user + const fetchPractitioner = async (userId: string) => { + const serve = new OpenSRPService(OPENSRP_CREATE_PRACTITIONER_ENDPOINT, opensrpBaseURL); + try { + const practitioner: Practitioner | undefined = await serve.read(userId); + return practitioner; + } catch (error) { + sendErrorNotification(lang.ERROR_OCCURED); + return undefined; + } + }; + + // fetch teams (organizations) a practitioner is assigned to + const fetchAssignedTeams = async (practitionerId: string) => { + const serve = new OpenSRPService(ORGANIZATION_BY_PRACTITIONER, opensrpBaseURL); + try { + const organizations: Organization[] = await serve.read(practitionerId); + // endpoint returns empty object instead of array on failure + const response = Array.isArray(organizations) ? organizations : []; + return response; + } catch (error) { + sendErrorNotification(lang.ERROR_OCCURED); + return []; + } + }; + + // Callback function that populates the user details section from table row data (keycloak user) + const setDetailsCallback = async (keycloakUser: KeycloakUser) => { + // show spinner between evaluations without closing modal + onCloseCallback(); + + // open details section + setOpenDetails(true); + + // fetch practitioner + fetchPractitioner(keycloakUser.id) + .then((practitioner: Practitioner | undefined) => { + if (practitioner) { + // fetch assigned teams + fetchAssignedTeams(practitioner.identifier) + .then((assignedTeams: Organization[]) => { + setUserDetails({ + keycloakUser: keycloakUser, + practitioner: practitioner, + assignedTeams: assignedTeams, + }); + }) + .catch(() => { + sendErrorNotification(lang.ERROR_OCCURED); + }); + } else { + setUserDetails({ + keycloakUser: keycloakUser, + practitioner: practitioner, + assignedTeams: [], + }); + } + }) + .catch(() => { + sendErrorNotification(lang.ERROR_OCCURED); + }); + }; + + // reset values and close modal + const onCloseCallback = () => { + setUserDetails(null); + setOpenDetails(false); + }; + return (
{lang.USER_MANAGEMENT_PAGE_HEADER}
- +
{ opensrpBaseURL, record, extraData, + setDetailsCallback, }; return ; }, @@ -164,6 +242,11 @@ const UserList = (props: UserListTypes): JSX.Element => { + {openDetails ? ( + + onCloseCallback()} {...userDetails} /> + + ) : null}
); From dc6a347cb6d3187c84aed43394e5723568a48b5b Mon Sep 17 00:00:00 2001 From: Macharia Muguku Date: Mon, 18 Oct 2021 10:13:36 +0300 Subject: [PATCH 07/15] update snapshots --- .../tests/__snapshots__/index.test.tsx.snap | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/packages/keycloak-user-management/src/components/UserList/TableActions/tests/__snapshots__/index.test.tsx.snap b/packages/keycloak-user-management/src/components/UserList/TableActions/tests/__snapshots__/index.test.tsx.snap index 5a8c23328..ac4d23247 100644 --- a/packages/keycloak-user-management/src/components/UserList/TableActions/tests/__snapshots__/index.test.tsx.snap +++ b/packages/keycloak-user-management/src/components/UserList/TableActions/tests/__snapshots__/index.test.tsx.snap @@ -31,6 +31,17 @@ exports[`components/UserList/TableActions hides delete element if entry is logge + + View Details + `; @@ -114,6 +125,17 @@ Object { + + View Details + , } `; @@ -172,5 +194,16 @@ exports[`components/UserList/TableActions shows delete element if entry is not l + + View Details + `; From 5c5e28a1935758f9df52586de7e9d222a296a18f Mon Sep 17 00:00:00 2001 From: Macharia Muguku Date: Mon, 18 Oct 2021 10:45:29 +0300 Subject: [PATCH 08/15] increase nodejs memmory for circle ci, prevents from erroring on default 2gb exhaustion --- .circleci/config.yml | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 9a9272186..279e94d25 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -10,17 +10,20 @@ jobs: - image: circleci/node:14.9.0 environment: - SKIP_PREFLIGHT_CHECK: "true" - REACT_APP_WEBSITE_NAME: "OpenSRP-web" - REACT_APP_DOMAIN_NAME: "http://localhost:3000" - REACT_APP_OPENSRP_ACCESS_TOKEN_URL: "https://keycloak-stage.smartregister.org/auth/realms/reveal-stage/protocol/openid-connect/token" - REACT_APP_OPENSRP_AUTHORIZATION_URL: "https://keycloak-stage.smartregister.org/auth/realms/reveal-stage/protocol/openid-connect/auth" - REACT_APP_OPENSRP_OAUTH_STATE: "opensrp" - REACT_APP_OPENSRP_CLIENT_ID: "reveal-stage-server" - REACT_APP_ENABLE_OPENSRP_OAUTH: "true" - REACT_APP_OPENSRP_API_BASE_URL: "https://reveal-stage.smartregister.org/opensrp/rest/" - REACT_APP_OPENSRP_USER_URL: "https://reveal-stage.smartregister.org/opensrp/user-details" - REACT_APP_DISABLE_LOGIN_PROTECTION: "false" + SKIP_PREFLIGHT_CHECK: 'true' + REACT_APP_WEBSITE_NAME: 'OpenSRP-web' + REACT_APP_DOMAIN_NAME: 'http://localhost:3000' + REACT_APP_OPENSRP_ACCESS_TOKEN_URL: 'https://keycloak-stage.smartregister.org/auth/realms/reveal-stage/protocol/openid-connect/token' + REACT_APP_OPENSRP_AUTHORIZATION_URL: 'https://keycloak-stage.smartregister.org/auth/realms/reveal-stage/protocol/openid-connect/auth' + REACT_APP_OPENSRP_OAUTH_STATE: 'opensrp' + REACT_APP_OPENSRP_CLIENT_ID: 'reveal-stage-server' + REACT_APP_ENABLE_OPENSRP_OAUTH: 'true' + REACT_APP_OPENSRP_API_BASE_URL: 'https://reveal-stage.smartregister.org/opensrp/rest/' + REACT_APP_OPENSRP_USER_URL: 'https://reveal-stage.smartregister.org/opensrp/user-details' + REACT_APP_DISABLE_LOGIN_PROTECTION: 'false' + # increase max memory for node. prevents ci err 'Error: spawn ENOMEM' + # https://support.circleci.com/hc/en-us/articles/360009208393-How-can-I-increase-the-max-memory-for-Node- + NODE_OPTIONS: '--max-old-space-size=8192' working_directory: ~/web From d5ec4ad84e1413a85f83cbccdb19bb03145f324c Mon Sep 17 00:00:00 2001 From: Macharia Muguku Date: Tue, 19 Oct 2021 10:55:52 +0300 Subject: [PATCH 09/15] Revert "increase nodejs memmory for circle ci, prevents from erroring on default 2gb exhaustion" This reverts commit 5c5e28a1935758f9df52586de7e9d222a296a18f. Didn't help, memory exceeds shared memory allocated by CI --- .circleci/config.yml | 25 +++++++++++-------------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 279e94d25..9a9272186 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -10,20 +10,17 @@ jobs: - image: circleci/node:14.9.0 environment: - SKIP_PREFLIGHT_CHECK: 'true' - REACT_APP_WEBSITE_NAME: 'OpenSRP-web' - REACT_APP_DOMAIN_NAME: 'http://localhost:3000' - REACT_APP_OPENSRP_ACCESS_TOKEN_URL: 'https://keycloak-stage.smartregister.org/auth/realms/reveal-stage/protocol/openid-connect/token' - REACT_APP_OPENSRP_AUTHORIZATION_URL: 'https://keycloak-stage.smartregister.org/auth/realms/reveal-stage/protocol/openid-connect/auth' - REACT_APP_OPENSRP_OAUTH_STATE: 'opensrp' - REACT_APP_OPENSRP_CLIENT_ID: 'reveal-stage-server' - REACT_APP_ENABLE_OPENSRP_OAUTH: 'true' - REACT_APP_OPENSRP_API_BASE_URL: 'https://reveal-stage.smartregister.org/opensrp/rest/' - REACT_APP_OPENSRP_USER_URL: 'https://reveal-stage.smartregister.org/opensrp/user-details' - REACT_APP_DISABLE_LOGIN_PROTECTION: 'false' - # increase max memory for node. prevents ci err 'Error: spawn ENOMEM' - # https://support.circleci.com/hc/en-us/articles/360009208393-How-can-I-increase-the-max-memory-for-Node- - NODE_OPTIONS: '--max-old-space-size=8192' + SKIP_PREFLIGHT_CHECK: "true" + REACT_APP_WEBSITE_NAME: "OpenSRP-web" + REACT_APP_DOMAIN_NAME: "http://localhost:3000" + REACT_APP_OPENSRP_ACCESS_TOKEN_URL: "https://keycloak-stage.smartregister.org/auth/realms/reveal-stage/protocol/openid-connect/token" + REACT_APP_OPENSRP_AUTHORIZATION_URL: "https://keycloak-stage.smartregister.org/auth/realms/reveal-stage/protocol/openid-connect/auth" + REACT_APP_OPENSRP_OAUTH_STATE: "opensrp" + REACT_APP_OPENSRP_CLIENT_ID: "reveal-stage-server" + REACT_APP_ENABLE_OPENSRP_OAUTH: "true" + REACT_APP_OPENSRP_API_BASE_URL: "https://reveal-stage.smartregister.org/opensrp/rest/" + REACT_APP_OPENSRP_USER_URL: "https://reveal-stage.smartregister.org/opensrp/user-details" + REACT_APP_DISABLE_LOGIN_PROTECTION: "false" working_directory: ~/web From 6a410acb8d6f5947a7f7763ecb19accf579a3e94 Mon Sep 17 00:00:00 2001 From: Macharia Muguku Date: Tue, 19 Oct 2021 10:58:55 +0300 Subject: [PATCH 10/15] run all tests serially in the current process rather than pool of workers --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 9a9272186..dc907011a 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -54,7 +54,7 @@ jobs: - run: name: Run test with coverage - command: yarn test --verbose --collectCoverage=true --forceExit --detectOpenHandles + command: yarn test --verbose --collectCoverage=true --forceExit --detectOpenHandles --runInBand - run: name: upload coverage to coveralls From ef7b94daec9b3e979c794d1e69fb4e05b8efed90 Mon Sep 17 00:00:00 2001 From: Macharia Muguku Date: Tue, 19 Oct 2021 11:11:45 +0300 Subject: [PATCH 11/15] run the tests in parallel with two jest worker processes --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index dc907011a..e450d589c 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -54,7 +54,7 @@ jobs: - run: name: Run test with coverage - command: yarn test --verbose --collectCoverage=true --forceExit --detectOpenHandles --runInBand + command: yarn test --verbose --collectCoverage=true --forceExit --detectOpenHandles --maxWorkers=2 - run: name: upload coverage to coveralls From 7e0f7fad2a7115d1e3992089e4dbde3badb9d670 Mon Sep 17 00:00:00 2001 From: Macharia Muguku Date: Tue, 19 Oct 2021 16:46:29 +0300 Subject: [PATCH 12/15] add test for closing button, update props --- .../src/components/UserDetails/tests/index.test.tsx | 6 ++++++ .../components/UserList/TableActions/tests/index.test.tsx | 1 + 2 files changed, 7 insertions(+) diff --git a/packages/keycloak-user-management/src/components/UserDetails/tests/index.test.tsx b/packages/keycloak-user-management/src/components/UserDetails/tests/index.test.tsx index 899ddf268..1d585e957 100644 --- a/packages/keycloak-user-management/src/components/UserDetails/tests/index.test.tsx +++ b/packages/keycloak-user-management/src/components/UserDetails/tests/index.test.tsx @@ -62,4 +62,10 @@ describe('components/TeamsDetail', () => { const wrapper = mount(); expect(wrapper.find('.ant-spin').exists()).toBeTruthy(); }); + it('removes it self on close', () => { + const wrapper = mount( wrapper.unmount()} />); + expect(wrapper.children()).toHaveLength(1); + wrapper.find('Button.close-btn').simulate('click'); + expect(wrapper).toHaveLength(0); + }); }); diff --git a/packages/keycloak-user-management/src/components/UserList/TableActions/tests/index.test.tsx b/packages/keycloak-user-management/src/components/UserList/TableActions/tests/index.test.tsx index a78f5656e..21a82f330 100644 --- a/packages/keycloak-user-management/src/components/UserList/TableActions/tests/index.test.tsx +++ b/packages/keycloak-user-management/src/components/UserList/TableActions/tests/index.test.tsx @@ -16,6 +16,7 @@ describe('components/UserList/TableActions', () => { extraData: { user_id: 'e8b07278-c75b-4dc7-b1f4-bcbf01b7d353' }, opensrpBaseURL: 'https://test.smartregister.org/opensrp/rest/', keycloakBaseURL: 'https://keycloak-stage.smartregister.org/auth/admin/realms/opensrp-web-stage', + setDetailsCallback: jest.fn(), }; it('does not crash', () => { From 513d224f844194c57658d16e93d8cd2c8cbe714b Mon Sep 17 00:00:00 2001 From: Macharia Muguku Date: Tue, 19 Oct 2021 16:53:55 +0300 Subject: [PATCH 13/15] endpoint returns wrong data structure on match failure - fix should be done to api --- .../src/components/UserList/index.tsx | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/keycloak-user-management/src/components/UserList/index.tsx b/packages/keycloak-user-management/src/components/UserList/index.tsx index 6f2daab54..0796f695b 100644 --- a/packages/keycloak-user-management/src/components/UserList/index.tsx +++ b/packages/keycloak-user-management/src/components/UserList/index.tsx @@ -125,9 +125,7 @@ const UserList = (props: UserListTypes): JSX.Element => { const serve = new OpenSRPService(ORGANIZATION_BY_PRACTITIONER, opensrpBaseURL); try { const organizations: Organization[] = await serve.read(practitionerId); - // endpoint returns empty object instead of array on failure - const response = Array.isArray(organizations) ? organizations : []; - return response; + return organizations; } catch (error) { sendErrorNotification(lang.ERROR_OCCURED); return []; From 2172ac10900bb7a075240310bdea69ac804d300d Mon Sep 17 00:00:00 2001 From: Macharia Muguku Date: Wed, 20 Oct 2021 03:17:57 +0300 Subject: [PATCH 14/15] add test for user details component, re-use props, generic prop naming, add test fixture data --- .../components/UserList/tests/index.test.tsx | 225 ++++++++---------- .../forms/UserForm/tests/fixtures.ts | 20 ++ 2 files changed, 121 insertions(+), 124 deletions(-) diff --git a/packages/keycloak-user-management/src/components/UserList/tests/index.test.tsx b/packages/keycloak-user-management/src/components/UserList/tests/index.test.tsx index 671834506..7e8bd81e0 100644 --- a/packages/keycloak-user-management/src/components/UserList/tests/index.test.tsx +++ b/packages/keycloak-user-management/src/components/UserList/tests/index.test.tsx @@ -20,7 +20,12 @@ import { fetchKeycloakUsers, removeKeycloakUsers, } from '../../../ducks/user'; -import { keycloakUsersArray, keycloakUsersArray1 } from '../../forms/UserForm/tests/fixtures'; +import { + keycloakUsersArray, + keycloakUsersArray1, + practitioner1, + organization, +} from '../../forms/UserForm/tests/fixtures'; import { authenticateUser } from '@onaio/session-reducer'; import { URL_USER } from '../../../constants'; import lang from '../../../lang'; @@ -38,25 +43,38 @@ jest.mock('@opensrp/notifications', () => ({ const history = createBrowserHistory(); -const locationProps = { - history, - location: { - hash: '', - pathname: `${URL_USER}`, - search: '', - state: {}, - }, - match: { - isExact: true, - params: {}, - path: `${URL_USER}`, - url: `${URL_USER}`, - }, -}; - reducerRegistry.register(keycloakUsersReducerName, keycloakUsersReducer); describe('components/UserList', () => { + const locationProps = { + history, + location: { + hash: '', + pathname: `${URL_USER}`, + search: '', + state: {}, + }, + match: { + isExact: true, + params: {}, + path: `${URL_USER}`, + url: `${URL_USER}`, + }, + }; + + const props = { + ...locationProps, + extraData: { + user_id: fixtures.keycloakUser.id, + }, + fetchKeycloakUsersCreator: fetchKeycloakUsers, + removeKeycloakUsersCreator: removeKeycloakUsers, + serviceClass: KeycloakService, + keycloakBaseURL: 'https://some-keycloak.server/auth/admin/realms/some-realm', + opensrpBaseURL: 'https://some-opensrp.server/app/', + usersPageSize: 20, + }; + beforeEach(() => { fetch.resetMocks(); opensrpStore.store.dispatch(removeKeycloakUsers()); @@ -84,18 +102,7 @@ describe('components/UserList', () => { it('works correctly with store', async () => { fetch.mockResponseOnce(JSON.stringify(fixtures.keycloakUsersArray)); fetch.mockResponseOnce(JSON.stringify(4)); - const props = { - ...locationProps, - extraData: { - user_id: fixtures.keycloakUser.id, - }, - fetchKeycloakUsersCreator: fetchKeycloakUsers, - removeKeycloakUsersCreator: removeKeycloakUsers, - serviceClass: KeycloakService, - keycloakBaseURL: - 'https://keycloak-stage.smartregister.org/auth/admin/realms/opensrp-web-stage', - usersPageSize: 20, - }; + const queryClient = new QueryClient({ defaultOptions: { queries: { retry: false } } }); const wrapper = mount( @@ -120,18 +127,6 @@ describe('components/UserList', () => { it('renders user list correctly', async () => { fetch.mockResponseOnce(JSON.stringify(fixtures.keycloakUsersArray)); fetch.mockResponseOnce(JSON.stringify(4)); - const props = { - ...locationProps, - extraData: { - user_id: fixtures.keycloakUser.id, - }, - fetchKeycloakUsersCreator: fetchKeycloakUsers, - removeKeycloakUsersCreator: removeKeycloakUsers, - serviceClass: KeycloakService, - keycloakBaseURL: - 'https://keycloak-stage.smartregister.org/auth/admin/realms/opensrp-web-stage', - usersPageSize: 20, - }; const queryClient = new QueryClient({ defaultOptions: { queries: { retry: false } } }); const wrapper = mount( @@ -153,29 +148,9 @@ describe('components/UserList', () => { // Loader should be hiddern expect(toJson(wrapper.find('.ant-spin'))).toBeFalsy(); - expect(fetch.mock.calls).toMatchObject([ - [ - 'https://keycloak-stage.smartregister.org/auth/admin/realms/opensrp-web-stage/users?first=0&max=20', - { - headers: { - accept: 'application/json', - authorization: 'Bearer simple-token', - 'content-type': 'application/json;charset=UTF-8', - }, - method: 'GET', - }, - ], - [ - 'https://keycloak-stage.smartregister.org/auth/admin/realms/opensrp-web-stage/users/count', - { - headers: { - accept: 'application/json', - authorization: 'Bearer simple-token', - 'content-type': 'application/json;charset=UTF-8', - }, - method: 'GET', - }, - ], + expect(fetch.mock.calls.map((call) => call[0])).toMatchObject([ + 'https://some-keycloak.server/auth/admin/realms/some-realm/users?first=0&max=20', + 'https://some-keycloak.server/auth/admin/realms/some-realm/users/count', ]); const userList = wrapper.find('UserList'); @@ -191,21 +166,13 @@ describe('components/UserList', () => { it('search works correctly', async () => { fetch.mockResponseOnce(JSON.stringify(keycloakUsersArray)); fetch.mockResponseOnce(JSON.stringify(4)); - const props = { - ...locationProps, + + const newProps = { + ...props, location: { - ...locationProps.location, + ...props.location, search: '?searchQuery=opensrp', }, - extraData: { - user_id: fixtures.keycloakUser.id, - }, - fetchKeycloakUsersCreator: fetchKeycloakUsers, - removeKeycloakUsersCreator: removeKeycloakUsers, - serviceClass: KeycloakService, - keycloakBaseURL: - 'https://keycloak-stage.smartregister.org/auth/admin/realms/opensrp-web-stage', - usersPageSize: 20, }; const queryClient = new QueryClient({ defaultOptions: { queries: { retry: false } } }); @@ -213,7 +180,7 @@ describe('components/UserList', () => { - + @@ -239,7 +206,7 @@ describe('components/UserList', () => { expect(history.location.search).toEqual('?searchQuery=test'); expect(fetch.mock.calls).toMatchObject([ [ - 'https://keycloak-stage.smartregister.org/auth/admin/realms/opensrp-web-stage/users?first=0&max=20&search=opensrp', + 'https://some-keycloak.server/auth/admin/realms/some-realm/users?first=0&max=20&search=opensrp', { headers: { accept: 'application/json', @@ -259,16 +226,8 @@ describe('components/UserList', () => { fetch.mockResponseOnce(JSON.stringify(data.slice(5, 10))); fetch.mockResponseOnce(JSON.stringify(7)); - const props = { - ...locationProps, - extraData: { - user_id: fixtures.keycloakUser.id, - }, - fetchKeycloakUsersCreator: fetchKeycloakUsers, - removeKeycloakUsersCreator: removeKeycloakUsers, - serviceClass: KeycloakService, - keycloakBaseURL: - 'https://keycloak-stage.smartregister.org/auth/admin/realms/opensrp-web-stage', + const newProps = { + ...props, usersPageSize: 5, }; const queryClient = new QueryClient({ defaultOptions: { queries: { retry: false } } }); @@ -276,7 +235,7 @@ describe('components/UserList', () => { - + @@ -301,18 +260,7 @@ describe('components/UserList', () => { const historyPushMock = jest.spyOn(history, 'push'); fetch.mockResponseOnce(JSON.stringify(fixtures.keycloakUsersArray)); fetch.mockResponseOnce(JSON.stringify(4)); - const props = { - ...locationProps, - extraData: { - user_id: fixtures.keycloakUser.id, - }, - fetchKeycloakUsersCreator: fetchKeycloakUsers, - removeKeycloakUsersCreator: removeKeycloakUsers, - serviceClass: KeycloakService, - keycloakBaseURL: - 'https://keycloak-stage.smartregister.org/auth/admin/realms/opensrp-web-stage', - usersPageSize: 20, - }; + const queryClient = new QueryClient({ defaultOptions: { queries: { retry: false } } }); const wrapper = mount( @@ -337,23 +285,18 @@ describe('components/UserList', () => { fetch.mockReject(() => Promise.reject('API is down')); const mockNotificationError = jest.spyOn(notifications, 'sendErrorNotification'); - const props = { - ...locationProps, - extraData: { - user_id: fixtures.keycloakUser.id, - }, - fetchKeycloakUsersCreator: fetchKeycloakUsers, - removeKeycloakUsersCreator: removeKeycloakUsers, - serviceClass: KeycloakService, - keycloakBaseURL: - 'https://keycloak-stage.smartregister.org/auth/admin/realms/opensrp-web-stage', + + const newProps = { + ...props, + usersPageSize: undefined, }; + const queryClient = new QueryClient({ defaultOptions: { queries: { retry: false } } }); const wrapper = mount( - + @@ -383,18 +326,7 @@ describe('components/UserList', () => { it('sorting works', async () => { fetch.mockResponseOnce(JSON.stringify(keycloakUsersArray)); fetch.mockResponseOnce(JSON.stringify(4)); - const props = { - ...locationProps, - extraData: { - user_id: fixtures.keycloakUser.id, - }, - fetchKeycloakUsersCreator: fetchKeycloakUsers, - removeKeycloakUsersCreator: removeKeycloakUsers, - serviceClass: KeycloakService, - keycloakBaseURL: - 'https://keycloak-stage.smartregister.org/auth/admin/realms/opensrp-web-stage', - usersPageSize: 20, - }; + const queryClient = new QueryClient({ defaultOptions: { queries: { retry: false } } }); const wrapper = mount( @@ -440,4 +372,49 @@ describe('components/UserList', () => { wrapper.unmount(); }); + + it('user details render correctly', async () => { + fetch.mockResponseOnce(JSON.stringify(keycloakUsersArray)); + fetch.mockResponseOnce(JSON.stringify(keycloakUsersArray.length)); + + const queryClient = new QueryClient({ defaultOptions: { queries: { retry: false } } }); + const wrapper = mount( + + + + + + + + ); + + await act(async () => { + await flushPromises(); + wrapper.update(); + }); + + // find view details button + const dropdown = wrapper.find('TableActions').find('Dropdown').at(0); + const subMenu = shallow(
{dropdown.prop('overlay')}
); + const viewDetails = subMenu.find('MenuItem.viewDetails'); + + fetch.mockResponseOnce(JSON.stringify(practitioner1)); + fetch.mockResponseOnce(JSON.stringify(organization)); + + // click view details + viewDetails.simulate('click'); + + await act(async () => { + await flushPromises(); + wrapper.update(); + }); + + // find the user details + expect(wrapper.find('#username').text()).toEqual(keycloakUsersArray[0].username); + expect(wrapper.find('#keycloakId').text()).toEqual(keycloakUsersArray[0].id); + expect(wrapper.find('#practitionerId').text()).toEqual(practitioner1.identifier); + expect(wrapper.find('#practitionerStatus').text()).toMatchInlineSnapshot(`"active"`); + const assignedTeams = wrapper.find('#assignedTeam').map((team) => team.text()); + expect(assignedTeams).toEqual(organization.map((team) => team.name)); + }); }); diff --git a/packages/keycloak-user-management/src/components/forms/UserForm/tests/fixtures.ts b/packages/keycloak-user-management/src/components/forms/UserForm/tests/fixtures.ts index 018f12e4c..7a3854fbc 100644 --- a/packages/keycloak-user-management/src/components/forms/UserForm/tests/fixtures.ts +++ b/packages/keycloak-user-management/src/components/forms/UserForm/tests/fixtures.ts @@ -1,5 +1,6 @@ import { FormFields } from '../types'; import { KeycloakUser, UserGroup } from '../../../../ducks/user'; +import { Organization } from '@opensrp/team-management'; export const userGroup: UserGroup[] = [ { id: '283c5d6e-9b83-4954-9f3b-4c2103e4370c', name: 'Admin', path: '/Admin', subGroups: [] }, @@ -287,3 +288,22 @@ export const value: FormFields = { email: 'janedoe@example.com', userGroups: userGroup.splice(3).map((e) => e.id), }; + +export const organization: Organization[] = [ + { + active: true, + id: 2, + identifier: 'd23f7350-d406-11e9-bb65-2a2ae2dbcce4', + name: 'Takang 1', + partOf: 1, + type: { + coding: [ + { + code: 'team', + display: 'Team', + system: 'http://terminology.hl7.org/CodeSystem/team-type', + }, + ], + }, + }, +]; From 387eccbfb0c4219978c3c6813c82064d2c166011 Mon Sep 17 00:00:00 2001 From: Kipchirchir Sigei Date: Fri, 22 Oct 2021 14:59:53 +0300 Subject: [PATCH 15/15] Extract translation strings Signed-off-by: Kipchirchir Sigei --- .../locales/core/ar.json | 82 +++++++++++++------ .../locales/core/en.json | 82 +++++++++++++------ .../locales/core/fr.json | 82 +++++++++++++------ .../locales/core/sw.json | 82 +++++++++++++------ .../locales/core/th.json | 70 ++++++++++++++++ 5 files changed, 306 insertions(+), 92 deletions(-) create mode 100644 packages/keycloak-user-management/locales/core/th.json diff --git a/packages/keycloak-user-management/locales/core/ar.json b/packages/keycloak-user-management/locales/core/ar.json index b0bf3fbba..9aa249480 100644 --- a/packages/keycloak-user-management/locales/core/ar.json +++ b/packages/keycloak-user-management/locales/core/ar.json @@ -1,34 +1,70 @@ { + "Actions": "", + "Add User": "", "An error occurred": "", - "First Name is required": "", - "Last Name is required": "", - "Username is required": "", + "Assigned Roles": "", + "Assigned Teams": "", + "Available Roles": "", + "Cancel": "", + "Composite": "", + "Confirm Password": "", "Confirm Password is required": "", - "Password is required": "", - "The two passwords that you entered do not match!": "", - "User deleted successfully": "", - "User edited successfully": "", - "User created successfully": "", + "Contact": "", + "Contact is required": "", + "Contact should be 10 digits and start with 0": "", "Credentials updated successfully": "", - "Practitioner created successfully": "", - "Practitioner updated successfully": "", - "No Data Found": "", - "User Credentials": "", - "Set password": "", + "Description": "", + "Edit": "", "Edit User": "", - "Add User": "", - "Cancel": "", - "User Management": "", - "Temporary": "", - "Password": "", - "Confirm Password": "", + "Edit User Group": "", + "Effective Roles": "", + "Email": "", + "Enable user": "", "First Name": "", + "First Name is required": "", + "Group": "", + "Keycloak UUID": "", "Last Name": "", - "Email": "", - "Username": "", + "Last Name is required": "", "Mark as Practitioner": "", - "Required Actions": "", + "Members": "", + "Name": "", + "Name is required": "", + "New User Group": "", + "No Active Practitioner": "", + "No Assigned Teams": "", + "No Data Found": "", + "Password": "", + "Password is required": "", "Please select": "", + "Practitioner": "", + "Practitioner created successfully": "", + "Practitioner deactivated successfully": "", + "Practitioner Status": "", + "Practitioner unassigned successfully": "", + "Practitioner updated successfully": "", + "Practitioner UUID": "", + "Realm Roles": "", + "Required Actions": "", + "Role Mappings Updated Successfully": "", + "Roles": "", "Save": "", - "Saving": "" + "Saving": "", + "Search": "", + "Set password": "", + "Temporary": "", + "The list is empty": "", + "The two passwords that you entered do not match!": "", + "User created successfully": "", + "User Credentials": "", + "User deleted successfully": "", + "User edited successfully": "", + "User Group created successfully": "", + "User Group edited successfully": "", + "User Groups": "", + "User Management": "", + "User Roles": "", + "Username": "", + "Username is required": "", + "View Details": "" } diff --git a/packages/keycloak-user-management/locales/core/en.json b/packages/keycloak-user-management/locales/core/en.json index b0bf3fbba..9aa249480 100644 --- a/packages/keycloak-user-management/locales/core/en.json +++ b/packages/keycloak-user-management/locales/core/en.json @@ -1,34 +1,70 @@ { + "Actions": "", + "Add User": "", "An error occurred": "", - "First Name is required": "", - "Last Name is required": "", - "Username is required": "", + "Assigned Roles": "", + "Assigned Teams": "", + "Available Roles": "", + "Cancel": "", + "Composite": "", + "Confirm Password": "", "Confirm Password is required": "", - "Password is required": "", - "The two passwords that you entered do not match!": "", - "User deleted successfully": "", - "User edited successfully": "", - "User created successfully": "", + "Contact": "", + "Contact is required": "", + "Contact should be 10 digits and start with 0": "", "Credentials updated successfully": "", - "Practitioner created successfully": "", - "Practitioner updated successfully": "", - "No Data Found": "", - "User Credentials": "", - "Set password": "", + "Description": "", + "Edit": "", "Edit User": "", - "Add User": "", - "Cancel": "", - "User Management": "", - "Temporary": "", - "Password": "", - "Confirm Password": "", + "Edit User Group": "", + "Effective Roles": "", + "Email": "", + "Enable user": "", "First Name": "", + "First Name is required": "", + "Group": "", + "Keycloak UUID": "", "Last Name": "", - "Email": "", - "Username": "", + "Last Name is required": "", "Mark as Practitioner": "", - "Required Actions": "", + "Members": "", + "Name": "", + "Name is required": "", + "New User Group": "", + "No Active Practitioner": "", + "No Assigned Teams": "", + "No Data Found": "", + "Password": "", + "Password is required": "", "Please select": "", + "Practitioner": "", + "Practitioner created successfully": "", + "Practitioner deactivated successfully": "", + "Practitioner Status": "", + "Practitioner unassigned successfully": "", + "Practitioner updated successfully": "", + "Practitioner UUID": "", + "Realm Roles": "", + "Required Actions": "", + "Role Mappings Updated Successfully": "", + "Roles": "", "Save": "", - "Saving": "" + "Saving": "", + "Search": "", + "Set password": "", + "Temporary": "", + "The list is empty": "", + "The two passwords that you entered do not match!": "", + "User created successfully": "", + "User Credentials": "", + "User deleted successfully": "", + "User edited successfully": "", + "User Group created successfully": "", + "User Group edited successfully": "", + "User Groups": "", + "User Management": "", + "User Roles": "", + "Username": "", + "Username is required": "", + "View Details": "" } diff --git a/packages/keycloak-user-management/locales/core/fr.json b/packages/keycloak-user-management/locales/core/fr.json index b0bf3fbba..9aa249480 100644 --- a/packages/keycloak-user-management/locales/core/fr.json +++ b/packages/keycloak-user-management/locales/core/fr.json @@ -1,34 +1,70 @@ { + "Actions": "", + "Add User": "", "An error occurred": "", - "First Name is required": "", - "Last Name is required": "", - "Username is required": "", + "Assigned Roles": "", + "Assigned Teams": "", + "Available Roles": "", + "Cancel": "", + "Composite": "", + "Confirm Password": "", "Confirm Password is required": "", - "Password is required": "", - "The two passwords that you entered do not match!": "", - "User deleted successfully": "", - "User edited successfully": "", - "User created successfully": "", + "Contact": "", + "Contact is required": "", + "Contact should be 10 digits and start with 0": "", "Credentials updated successfully": "", - "Practitioner created successfully": "", - "Practitioner updated successfully": "", - "No Data Found": "", - "User Credentials": "", - "Set password": "", + "Description": "", + "Edit": "", "Edit User": "", - "Add User": "", - "Cancel": "", - "User Management": "", - "Temporary": "", - "Password": "", - "Confirm Password": "", + "Edit User Group": "", + "Effective Roles": "", + "Email": "", + "Enable user": "", "First Name": "", + "First Name is required": "", + "Group": "", + "Keycloak UUID": "", "Last Name": "", - "Email": "", - "Username": "", + "Last Name is required": "", "Mark as Practitioner": "", - "Required Actions": "", + "Members": "", + "Name": "", + "Name is required": "", + "New User Group": "", + "No Active Practitioner": "", + "No Assigned Teams": "", + "No Data Found": "", + "Password": "", + "Password is required": "", "Please select": "", + "Practitioner": "", + "Practitioner created successfully": "", + "Practitioner deactivated successfully": "", + "Practitioner Status": "", + "Practitioner unassigned successfully": "", + "Practitioner updated successfully": "", + "Practitioner UUID": "", + "Realm Roles": "", + "Required Actions": "", + "Role Mappings Updated Successfully": "", + "Roles": "", "Save": "", - "Saving": "" + "Saving": "", + "Search": "", + "Set password": "", + "Temporary": "", + "The list is empty": "", + "The two passwords that you entered do not match!": "", + "User created successfully": "", + "User Credentials": "", + "User deleted successfully": "", + "User edited successfully": "", + "User Group created successfully": "", + "User Group edited successfully": "", + "User Groups": "", + "User Management": "", + "User Roles": "", + "Username": "", + "Username is required": "", + "View Details": "" } diff --git a/packages/keycloak-user-management/locales/core/sw.json b/packages/keycloak-user-management/locales/core/sw.json index b0bf3fbba..9aa249480 100644 --- a/packages/keycloak-user-management/locales/core/sw.json +++ b/packages/keycloak-user-management/locales/core/sw.json @@ -1,34 +1,70 @@ { + "Actions": "", + "Add User": "", "An error occurred": "", - "First Name is required": "", - "Last Name is required": "", - "Username is required": "", + "Assigned Roles": "", + "Assigned Teams": "", + "Available Roles": "", + "Cancel": "", + "Composite": "", + "Confirm Password": "", "Confirm Password is required": "", - "Password is required": "", - "The two passwords that you entered do not match!": "", - "User deleted successfully": "", - "User edited successfully": "", - "User created successfully": "", + "Contact": "", + "Contact is required": "", + "Contact should be 10 digits and start with 0": "", "Credentials updated successfully": "", - "Practitioner created successfully": "", - "Practitioner updated successfully": "", - "No Data Found": "", - "User Credentials": "", - "Set password": "", + "Description": "", + "Edit": "", "Edit User": "", - "Add User": "", - "Cancel": "", - "User Management": "", - "Temporary": "", - "Password": "", - "Confirm Password": "", + "Edit User Group": "", + "Effective Roles": "", + "Email": "", + "Enable user": "", "First Name": "", + "First Name is required": "", + "Group": "", + "Keycloak UUID": "", "Last Name": "", - "Email": "", - "Username": "", + "Last Name is required": "", "Mark as Practitioner": "", - "Required Actions": "", + "Members": "", + "Name": "", + "Name is required": "", + "New User Group": "", + "No Active Practitioner": "", + "No Assigned Teams": "", + "No Data Found": "", + "Password": "", + "Password is required": "", "Please select": "", + "Practitioner": "", + "Practitioner created successfully": "", + "Practitioner deactivated successfully": "", + "Practitioner Status": "", + "Practitioner unassigned successfully": "", + "Practitioner updated successfully": "", + "Practitioner UUID": "", + "Realm Roles": "", + "Required Actions": "", + "Role Mappings Updated Successfully": "", + "Roles": "", "Save": "", - "Saving": "" + "Saving": "", + "Search": "", + "Set password": "", + "Temporary": "", + "The list is empty": "", + "The two passwords that you entered do not match!": "", + "User created successfully": "", + "User Credentials": "", + "User deleted successfully": "", + "User edited successfully": "", + "User Group created successfully": "", + "User Group edited successfully": "", + "User Groups": "", + "User Management": "", + "User Roles": "", + "Username": "", + "Username is required": "", + "View Details": "" } diff --git a/packages/keycloak-user-management/locales/core/th.json b/packages/keycloak-user-management/locales/core/th.json new file mode 100644 index 000000000..9aa249480 --- /dev/null +++ b/packages/keycloak-user-management/locales/core/th.json @@ -0,0 +1,70 @@ +{ + "Actions": "", + "Add User": "", + "An error occurred": "", + "Assigned Roles": "", + "Assigned Teams": "", + "Available Roles": "", + "Cancel": "", + "Composite": "", + "Confirm Password": "", + "Confirm Password is required": "", + "Contact": "", + "Contact is required": "", + "Contact should be 10 digits and start with 0": "", + "Credentials updated successfully": "", + "Description": "", + "Edit": "", + "Edit User": "", + "Edit User Group": "", + "Effective Roles": "", + "Email": "", + "Enable user": "", + "First Name": "", + "First Name is required": "", + "Group": "", + "Keycloak UUID": "", + "Last Name": "", + "Last Name is required": "", + "Mark as Practitioner": "", + "Members": "", + "Name": "", + "Name is required": "", + "New User Group": "", + "No Active Practitioner": "", + "No Assigned Teams": "", + "No Data Found": "", + "Password": "", + "Password is required": "", + "Please select": "", + "Practitioner": "", + "Practitioner created successfully": "", + "Practitioner deactivated successfully": "", + "Practitioner Status": "", + "Practitioner unassigned successfully": "", + "Practitioner updated successfully": "", + "Practitioner UUID": "", + "Realm Roles": "", + "Required Actions": "", + "Role Mappings Updated Successfully": "", + "Roles": "", + "Save": "", + "Saving": "", + "Search": "", + "Set password": "", + "Temporary": "", + "The list is empty": "", + "The two passwords that you entered do not match!": "", + "User created successfully": "", + "User Credentials": "", + "User deleted successfully": "", + "User edited successfully": "", + "User Group created successfully": "", + "User Group edited successfully": "", + "User Groups": "", + "User Management": "", + "User Roles": "", + "Username": "", + "Username is required": "", + "View Details": "" +}