@openmrs/esm-implementer-tools-app 3.3.2-pre.30 → 3.3.2-pre.31
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +24 -25
- package/dist/16.js +2 -0
- package/dist/16.js.map +1 -0
- package/dist/24.js +2 -0
- package/dist/24.js.map +1 -0
- package/dist/25.js +1 -1
- package/dist/25.js.LICENSE.txt +13 -15
- package/dist/25.js.map +1 -1
- package/dist/280.js +1 -1
- package/dist/280.js.map +1 -1
- package/dist/284.js +1 -1
- package/dist/284.js.map +1 -1
- package/dist/531.js +1 -1
- package/dist/531.js.map +1 -1
- package/dist/739.js +2 -0
- package/dist/739.js.map +1 -0
- package/dist/811.js +1 -1
- package/dist/811.js.map +1 -1
- package/dist/889.js +1 -1
- package/dist/889.js.map +1 -1
- package/dist/933.js +3 -0
- package/dist/{769.js.LICENSE.txt → 933.js.LICENSE.txt} +0 -0
- package/dist/933.js.map +1 -0
- package/dist/openmrs-esm-implementer-tools-app.js +1 -1
- package/dist/openmrs-esm-implementer-tools-app.js.buildmanifest.json +57 -198
- package/dist/openmrs-esm-implementer-tools-app.js.map +1 -1
- package/dist/openmrs-esm-implementer-tools-app.old +1 -1
- package/jest.config.js +0 -2
- package/package.json +5 -10
- package/src/backend-dependencies/backend-dependencies.component.tsx +3 -2
- package/src/backend-dependencies/backend-dependencies.styles.scss +8 -0
- package/src/configuration/configuration.component.tsx +31 -32
- package/src/configuration/configuration.styles.scss +37 -3
- package/src/configuration/configuration.test.tsx +50 -28
- package/src/configuration/interactive-editor/config-tree.component.tsx +1 -1
- package/src/configuration/interactive-editor/config-tree.styles.scss +1 -1
- package/src/configuration/interactive-editor/description.styles.scss +11 -8
- package/src/configuration/interactive-editor/display-value.scss +2 -1
- package/src/configuration/interactive-editor/display-value.tsx +1 -1
- package/src/configuration/interactive-editor/editable-value.component.tsx +4 -5
- package/src/configuration/interactive-editor/editable-value.styles.scss +3 -2
- package/src/configuration/interactive-editor/layout/subtree.component.tsx +1 -1
- package/src/configuration/interactive-editor/layout/tree-container.component.tsx +1 -4
- package/src/configuration/interactive-editor/value-editor.scss +2 -1
- package/src/configuration/interactive-editor/value-editor.tsx +10 -7
- package/src/configuration/interactive-editor/value-editors/array-editor.styles.css +2 -2
- package/src/configuration/interactive-editor/value-editors/array-editor.tsx +5 -6
- package/src/configuration/interactive-editor/value-editors/concept-search.styles.scss +2 -1
- package/src/configuration/interactive-editor/value-editors/concept-search.tsx +1 -1
- package/src/configuration/interactive-editor/value-editors/extension-slot-add.tsx +1 -1
- package/src/configuration/interactive-editor/value-editors/extension-slot-remove.tsx +1 -1
- package/src/configuration/interactive-editor/value-editors/object-editor.styles.css +2 -2
- package/src/configuration/interactive-editor/value-editors/object-editor.tsx +1 -1
- package/src/configuration/interactive-editor/value-editors/patient-identifier-type-search.tsx +1 -1
- package/src/configuration/interactive-editor/value-editors/person-attribute-search.tsx +1 -1
- package/src/configuration/interactive-editor/value-editors/uuid-search.scss +7 -5
- package/src/configuration/interactive-editor/value-editors/value-editor-field.tsx +1 -1
- package/src/configuration/json-editor/json-editor.component.tsx +2 -2
- package/src/implementer-tools.button.tsx +3 -4
- package/src/implementer-tools.component.tsx +2 -2
- package/src/implementer-tools.styles.scss +5 -5
- package/src/{implementer-tools.component.test.tsx → implementer-tools.test.tsx} +0 -0
- package/src/popup/popup.component.tsx +5 -4
- package/src/popup/popup.styles.scss +1 -9
- package/src/ui-editor/ui-editor.tsx +3 -3
- package/dist/1.js +0 -2
- package/dist/1.js.map +0 -1
- package/dist/105.js +0 -2
- package/dist/105.js.map +0 -1
- package/dist/475.js +0 -2
- package/dist/475.js.map +0 -1
- package/dist/652.js +0 -2
- package/dist/652.js.map +0 -1
- package/dist/769.js +0 -3
- package/dist/769.js.map +0 -1
- package/dist/839.js +0 -2
- package/dist/839.js.map +0 -1
- package/dist/860.js +0 -2
- package/dist/860.js.map +0 -1
- package/dist/890.js +0 -3
- package/dist/890.js.LICENSE.txt +0 -38
- package/dist/890.js.map +0 -1
package/dist/811.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"811.js","mappings":"yLA2BIA,E,8EA3BJ,iB,qiCA6BeC,I,OAAAA,EAA2B,sB,SAA3BA,I,OAAAA,EAAf,yB,IAEUC,E,0FAAiBC,I,cAAjBD,EAAW,EAAH,K,kBACPA,EAASE,KAAKC,S,gCAErBC,QAAQC,MAAM,EAAD,I,iCAGR,I,0DARiC,sBAW1C,SAASC,EACPC,EACAC,G,IAcAC,EAZMA,EAA6C,GAE7CC,EAwCR,SACEC,EACAH,GAEA,IAAMI,EAA8BC,OAAOC,KAAKH,GAC1CI,EAA8BP,EAAwBQ,KAC1D,SAACC,G,OAAQA,EAAIC,QAQf,OALuBC,EAAAA,EAAAA,GACrBP,EACAG,GAGoBC,KAAI,SAACI,G,MAAS,CAClCF,KAAME,EACNC,QAASV,EAAuBS,OAxDLE,CAC3Bf,EAAOgB,oBACPf,GAGIgB,EAuDR,SACEb,EACAH,GAOA,OALwBK,OAAOC,KAAKH,GAAwBK,KAAI,SAACI,G,MAAS,CACxEF,KAAME,EACNC,QAASV,EAAuBS,OAGXK,QAAO,SAACC,GAC7B,OAAOlB,EAAwBmB,MAAK,SAACC,GACnC,OAAOF,EAAeR,OAASU,EAAgBV,WAlEfW,CAClCtB,EAAOgB,oBACPf,GAqBF,OAlBAC,EAAAA,GAAaqB,KAAbrB,MAAAA,EAAAA,EACKC,EAAqBM,KAAI,SAACe,G,MAAO,CAClCC,KAAMD,EAAEb,KACRe,gBAAiBF,EAAEV,QACnBa,KAAM,eAHLxB,OAKH,EAAGc,EAA4BR,KAAI,SAACe,GAClC,IAAME,EAAkBF,EAAEV,QACpBc,EA0DZ,SACEC,EACA5B,G,IAIEA,EAAAA,EAFI6B,EAAaD,EAAkClB,KACrD,OACwE,QAAtEV,EAA6D,QAA7DA,EAAAA,EAAwBmB,MAAK,SAACW,G,OAAQA,EAAIpB,MAAQmB,YAAW,IAA7D7B,OAAAA,EAAAA,EAA+Da,eAAO,IAAtEb,EAAAA,EAA0E,GAhE/C+B,CAAoBR,EAAGvB,GAChD,MAAO,CACLwB,KAAMD,EAAEb,KACRe,gBAAAA,EACAE,iBAAAA,EACAD,KAAMM,EAAsBP,EAAiBE,UAK5C,CACLH,KAAMzB,EAAO8B,WACb5B,aAAAA,GAIJ,SAASR,IACP,OAAOwC,EAAAA,EAAAA,cAAc,6CAA6C,CAChEC,OAAQ,QAkDZ,SAASF,EACPP,EACAE,GAEA,OAAKQ,EAAAA,EAAAA,oBAAmBV,EAAiBE,GAIlC,OAHE,mB,SAMWS,I,OAAAA,EAAf,yB,IAEcC,EAAXC,EAOAtC,E,oEARHV,EAAuB,C,sBACpBgD,GAAkC,QAAvBD,EAAAA,OAAOE,wBAAgB,IAAvBF,EAAAA,EAA2B,IACzCpB,QAAO,SAAClB,G,OAAWA,EAAO,GAAGgB,uBAC7BP,KAAI,SAACT,G,MAAY,CAChBgB,oBAAqBhB,EAAO,GAAGgB,oBAC/Bc,WAAY9B,EAAO,O,SAGeR,I,OAAhCS,EAA0B,EAAH,KAC7BV,EAAwBgD,EAAQ9B,KAAI,SAACe,G,OACnCzB,EAA2ByB,EAAGvB,M,gCAI3BV,G,4CAfyB,sBC/IlC,iB,yFAGO,SAASkD,IACd,I,IAGIC,G,GAAAA,EAAAA,EAAAA,UAAgC,I,EAAG,E,+zBAFrCC,EAEED,EAAmC,GADrCE,EACEF,EAAmC,GAOvC,OALAG,EAAAA,EAAAA,YAAU,YDsIL,W,OAAeR,EAAY,uBCpI9BA,GAAeS,KAAKF,KACnB,IAEID,E,cCdT,iB,yFAiBA,IAAMI,EAAQC,IAAAA,MAAW,W,OAAM,2EACzBC,EAAWD,IAAAA,MAAW,W,OAAM,2EAElC,SAASE,IACP,I,IAAMC,EAAkBV,IACoCC,G,GAAAA,EAAAA,EAAAA,WAAS,G,EAAM,E,+zBAApEU,EAAqDV,EAAe,GAA5CW,EAA6BX,EAAe,GACrE,GAAQY,EAAAA,EAAAA,kBAANC,GACRV,EAAAA,EAAAA,YAAU,WAERQ,GACE,SAACG,G,OACCA,GFqID,SAAgCL,GACrC,OAAOA,EAAgBM,MAAK,SAACjC,G,OAC3BA,EAAEtB,aAAauD,MAAK,SAACC,G,MAAiB,SAAXA,EAAE/B,WEvIPgC,CAAuBR,QAE5C,CAACA,KAEJN,EAAAA,EAAAA,YAAU,WAEJO,IACFQ,EAAAA,EAAAA,kBAAiB,CACfC,YAAa,sDACbC,OACE,kBAACC,EAAAA,yBAAwB,CAACC,QAASC,EAAAA,IAChCV,EAAE,OAAQ,SAGfW,KAAM,YAGT,CAACd,IAEJ,IAAoDe,GAAAA,EAAAA,EAAAA,UAClDC,EAAAA,IADMC,EAA4CF,EAA5CE,OAAQC,EAAoCH,EAApCG,kBAAmBC,EAAiBJ,EAAjBI,aAGnC,OACE,oCACGF,EACC,kBAACtB,EAAK,CACJyB,MAAOC,EAAAA,GACPtB,gBAAiBA,EACjBuB,gBAAiBH,IAEjB,KACHD,EAAoB,kBAACrB,EAAQ,MAAM,MAK3B,SAAS0B,IACtB,OACE,kBAACC,EAAAA,cAAa,CAACC,UAAU,iCACvB,kBAAC3B,EAAY","sources":["webpack://@openmrs/esm-implementer-tools-app/./src/backend-dependencies/openmrs-backend-dependencies.ts","webpack://@openmrs/esm-implementer-tools-app/./src/backend-dependencies/useBackendDependencies.ts","webpack://@openmrs/esm-implementer-tools-app/./src/implementer-tools.component.tsx"],"sourcesContent":["import { isVersionSatisfied, openmrsFetch } from \"@openmrs/esm-framework\";\nimport difference from \"lodash-es/difference\";\n\nexport type ResolvedBackendModuleType = \"missing\" | \"version-mismatch\" | \"okay\";\n\nexport interface ResolvedBackendModule {\n name: string;\n requiredVersion: string;\n installedVersion?: string;\n type: ResolvedBackendModuleType;\n}\n\nexport interface FrontendModule {\n name: string;\n dependencies: Array<ResolvedBackendModule>;\n}\n\ninterface Module {\n moduleName: string;\n backendDependencies: Record<string, string>;\n}\n\ninterface BackendModule {\n uuid: string;\n version: string;\n}\n\nlet cachedFrontendModules: Array<FrontendModule>;\n\nasync function initInstalledBackendModules(): Promise<Array<BackendModule>> {\n try {\n const response = await fetchInstalledBackendModules();\n return response.data.results;\n } catch (err) {\n console.error(err);\n }\n\n return [];\n}\n\nfunction checkIfModulesAreInstalled(\n module: Module,\n installedBackendModules: Array<BackendModule>\n): FrontendModule {\n const dependencies: Array<ResolvedBackendModule> = [];\n\n const missingBackendModule = getMissingBackendModules(\n module.backendDependencies,\n installedBackendModules\n );\n\n const installedAndRequiredModules = getInstalledAndRequiredBackendModules(\n module.backendDependencies,\n installedBackendModules\n );\n\n dependencies.push(\n ...missingBackendModule.map((m) => ({\n name: m.uuid,\n requiredVersion: m.version,\n type: \"missing\" as ResolvedBackendModuleType,\n })),\n ...installedAndRequiredModules.map((m) => {\n const requiredVersion = m.version;\n const installedVersion = getInstalledVersion(m, installedBackendModules);\n return {\n name: m.uuid,\n requiredVersion,\n installedVersion,\n type: getResolvedModuleType(requiredVersion, installedVersion),\n };\n })\n );\n\n return {\n name: module.moduleName,\n dependencies,\n };\n}\n\nfunction fetchInstalledBackendModules() {\n return openmrsFetch(`/ws/rest/v1/module?v=custom:(uuid,version)`, {\n method: \"GET\",\n });\n}\n\nfunction getMissingBackendModules(\n requiredBackendModules: Record<string, string>,\n installedBackendModules: Array<BackendModule>\n): Array<BackendModule> {\n const requiredBackendModulesUuids = Object.keys(requiredBackendModules);\n const installedBackendModuleUuids = installedBackendModules.map(\n (res) => res.uuid\n );\n\n const missingModules = difference(\n requiredBackendModulesUuids,\n installedBackendModuleUuids\n );\n\n return missingModules.map((key) => ({\n uuid: key,\n version: requiredBackendModules[key],\n }));\n}\n\nfunction getInstalledAndRequiredBackendModules(\n requiredBackendModules: Record<string, string>,\n installedBackendModules: Array<BackendModule>\n): Array<BackendModule> {\n const requiredModules = Object.keys(requiredBackendModules).map((key) => ({\n uuid: key,\n version: requiredBackendModules[key],\n }));\n\n return requiredModules.filter((requiredModule) => {\n return installedBackendModules.find((installedModule) => {\n return requiredModule.uuid === installedModule.uuid;\n });\n });\n}\n\nfunction getInstalledVersion(\n installedAndRequiredBackendModule: BackendModule,\n installedBackendModules: Array<BackendModule>\n) {\n const moduleName = installedAndRequiredBackendModule.uuid;\n return (\n installedBackendModules.find((mod) => mod.uuid == moduleName)?.version ?? \"\"\n );\n}\n\nfunction getResolvedModuleType(\n requiredVersion: string,\n installedVersion: string\n): ResolvedBackendModuleType {\n if (!isVersionSatisfied(requiredVersion, installedVersion)) {\n return \"version-mismatch\";\n }\n\n return \"okay\";\n}\n\nexport async function checkModules(): Promise<Array<FrontendModule>> {\n if (!cachedFrontendModules) {\n const modules = (window.installedModules ?? [])\n .filter((module) => module[1].backendDependencies)\n .map((module) => ({\n backendDependencies: module[1].backendDependencies,\n moduleName: module[0],\n }));\n\n const installedBackendModules = await initInstalledBackendModules();\n cachedFrontendModules = modules.map((m) =>\n checkIfModulesAreInstalled(m, installedBackendModules)\n );\n }\n\n return cachedFrontendModules;\n}\n\nexport function hasInvalidDependencies(frontendModules: Array<FrontendModule>) {\n return frontendModules.some((m) =>\n m.dependencies.some((n) => n.type !== \"okay\")\n );\n}\n","import { useEffect, useState } from \"react\";\nimport { checkModules, FrontendModule } from \"./openmrs-backend-dependencies\";\n\nexport function useBackendDependencies() {\n const [\n modulesWithMissingBackendModules,\n setModulesWithMissingBackendModules,\n ] = useState<Array<FrontendModule>>([]);\n\n useEffect(() => {\n // loading missing modules\n checkModules().then(setModulesWithMissingBackendModules);\n }, []);\n\n return modulesWithMissingBackendModules;\n}\n","import React, { useState, useEffect } from \"react\";\nimport { NotificationActionButton } from \"carbon-components-react\";\nimport {\n showNotification,\n UserHasAccess,\n useStore,\n} from \"@openmrs/esm-framework\";\nimport {\n implementerToolsStore,\n showModuleDiagnostics,\n togglePopup,\n} from \"./store\";\n\nimport { useBackendDependencies } from \"./backend-dependencies/useBackendDependencies\";\nimport { hasInvalidDependencies } from \"./backend-dependencies/openmrs-backend-dependencies\";\nimport { useTranslation } from \"react-i18next\";\n\nconst Popup = React.lazy(() => import(\"./popup/popup.component\"));\nconst UiEditor = React.lazy(() => import(\"./ui-editor/ui-editor\"));\n\nfunction PopupHandler() {\n const frontendModules = useBackendDependencies();\n const [shouldShowNotification, setShouldShowNotification] = useState(false);\n const { t } = useTranslation();\n useEffect(() => {\n // displaying toast if modules are missing\n setShouldShowNotification(\n (alreadyShowing) =>\n alreadyShowing || hasInvalidDependencies(frontendModules)\n );\n }, [frontendModules]);\n\n useEffect(() => {\n // only show notification max. 1 time\n if (shouldShowNotification) {\n showNotification({\n description: \"Found modules with unresolved backend dependencies.\",\n action: (\n <NotificationActionButton onClick={showModuleDiagnostics}>\n {t(\"view\", \"View\")}\n </NotificationActionButton>\n ),\n kind: \"error\",\n });\n }\n }, [shouldShowNotification]);\n\n const { isOpen, isUIEditorEnabled, openTabIndex } = useStore(\n implementerToolsStore\n );\n return (\n <>\n {isOpen ? (\n <Popup\n close={togglePopup}\n frontendModules={frontendModules}\n visibleTabIndex={openTabIndex}\n />\n ) : null}\n {isUIEditorEnabled ? <UiEditor /> : null}\n </>\n );\n}\n\nexport default function ImplementerTools() {\n return (\n <UserHasAccess privilege=\"coreapps.systemAdministration\">\n <PopupHandler />\n </UserHasAccess>\n );\n}\n"],"names":["cachedFrontendModules","initInstalledBackendModules","response","fetchInstalledBackendModules","data","results","console","error","checkIfModulesAreInstalled","module","installedBackendModules","dependencies","missingBackendModule","requiredBackendModules","requiredBackendModulesUuids","Object","keys","installedBackendModuleUuids","map","res","uuid","difference","key","version","getMissingBackendModules","backendDependencies","installedAndRequiredModules","filter","requiredModule","find","installedModule","getInstalledAndRequiredBackendModules","push","m","name","requiredVersion","type","installedVersion","installedAndRequiredBackendModule","moduleName","mod","getInstalledVersion","getResolvedModuleType","openmrsFetch","method","isVersionSatisfied","checkModules","window","modules","installedModules","useBackendDependencies","useState","modulesWithMissingBackendModules","setModulesWithMissingBackendModules","useEffect","then","Popup","React","UiEditor","PopupHandler","frontendModules","shouldShowNotification","setShouldShowNotification","useTranslation","t","alreadyShowing","some","n","hasInvalidDependencies","showNotification","description","action","NotificationActionButton","onClick","showModuleDiagnostics","kind","useStore","implementerToolsStore","isOpen","isUIEditorEnabled","openTabIndex","close","togglePopup","visibleTabIndex","ImplementerTools","UserHasAccess","privilege"],"sourceRoot":""}
|
|
1
|
+
{"version":3,"file":"811.js","mappings":"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","sources":["webpack://@openmrs/esm-implementer-tools-app/./src/backend-dependencies/openmrs-backend-dependencies.ts","webpack://@openmrs/esm-implementer-tools-app/./src/backend-dependencies/useBackendDependencies.ts","webpack://@openmrs/esm-implementer-tools-app/./src/implementer-tools.component.tsx"],"sourcesContent":["import { isVersionSatisfied, openmrsFetch } from \"@openmrs/esm-framework\";\nimport difference from \"lodash-es/difference\";\n\nexport type ResolvedBackendModuleType = \"missing\" | \"version-mismatch\" | \"okay\";\n\nexport interface ResolvedBackendModule {\n name: string;\n requiredVersion: string;\n installedVersion?: string;\n type: ResolvedBackendModuleType;\n}\n\nexport interface FrontendModule {\n name: string;\n dependencies: Array<ResolvedBackendModule>;\n}\n\ninterface Module {\n moduleName: string;\n backendDependencies: Record<string, string>;\n}\n\ninterface BackendModule {\n uuid: string;\n version: string;\n}\n\nlet cachedFrontendModules: Array<FrontendModule>;\n\nasync function initInstalledBackendModules(): Promise<Array<BackendModule>> {\n try {\n const response = await fetchInstalledBackendModules();\n return response.data.results;\n } catch (err) {\n console.error(err);\n }\n\n return [];\n}\n\nfunction checkIfModulesAreInstalled(\n module: Module,\n installedBackendModules: Array<BackendModule>\n): FrontendModule {\n const dependencies: Array<ResolvedBackendModule> = [];\n\n const missingBackendModule = getMissingBackendModules(\n module.backendDependencies,\n installedBackendModules\n );\n\n const installedAndRequiredModules = getInstalledAndRequiredBackendModules(\n module.backendDependencies,\n installedBackendModules\n );\n\n dependencies.push(\n ...missingBackendModule.map((m) => ({\n name: m.uuid,\n requiredVersion: m.version,\n type: \"missing\" as ResolvedBackendModuleType,\n })),\n ...installedAndRequiredModules.map((m) => {\n const requiredVersion = m.version;\n const installedVersion = getInstalledVersion(m, installedBackendModules);\n return {\n name: m.uuid,\n requiredVersion,\n installedVersion,\n type: getResolvedModuleType(requiredVersion, installedVersion),\n };\n })\n );\n\n return {\n name: module.moduleName,\n dependencies,\n };\n}\n\nfunction fetchInstalledBackendModules() {\n return openmrsFetch(`/ws/rest/v1/module?v=custom:(uuid,version)`, {\n method: \"GET\",\n });\n}\n\nfunction getMissingBackendModules(\n requiredBackendModules: Record<string, string>,\n installedBackendModules: Array<BackendModule>\n): Array<BackendModule> {\n const requiredBackendModulesUuids = Object.keys(requiredBackendModules);\n const installedBackendModuleUuids = installedBackendModules.map(\n (res) => res.uuid\n );\n\n const missingModules = difference(\n requiredBackendModulesUuids,\n installedBackendModuleUuids\n );\n\n return missingModules.map((key) => ({\n uuid: key,\n version: requiredBackendModules[key],\n }));\n}\n\nfunction getInstalledAndRequiredBackendModules(\n requiredBackendModules: Record<string, string>,\n installedBackendModules: Array<BackendModule>\n): Array<BackendModule> {\n const requiredModules = Object.keys(requiredBackendModules).map((key) => ({\n uuid: key,\n version: requiredBackendModules[key],\n }));\n\n return requiredModules.filter((requiredModule) => {\n return installedBackendModules.find((installedModule) => {\n return requiredModule.uuid === installedModule.uuid;\n });\n });\n}\n\nfunction getInstalledVersion(\n installedAndRequiredBackendModule: BackendModule,\n installedBackendModules: Array<BackendModule>\n) {\n const moduleName = installedAndRequiredBackendModule.uuid;\n return (\n installedBackendModules.find((mod) => mod.uuid == moduleName)?.version ?? \"\"\n );\n}\n\nfunction getResolvedModuleType(\n requiredVersion: string,\n installedVersion: string\n): ResolvedBackendModuleType {\n if (!isVersionSatisfied(requiredVersion, installedVersion)) {\n return \"version-mismatch\";\n }\n\n return \"okay\";\n}\n\nexport async function checkModules(): Promise<Array<FrontendModule>> {\n if (!cachedFrontendModules) {\n const modules = (window.installedModules ?? [])\n .filter((module) => module[1].backendDependencies)\n .map((module) => ({\n backendDependencies: module[1].backendDependencies,\n moduleName: module[0],\n }));\n\n const installedBackendModules = await initInstalledBackendModules();\n cachedFrontendModules = modules.map((m) =>\n checkIfModulesAreInstalled(m, installedBackendModules)\n );\n }\n\n return cachedFrontendModules;\n}\n\nexport function hasInvalidDependencies(frontendModules: Array<FrontendModule>) {\n return frontendModules.some((m) =>\n m.dependencies.some((n) => n.type !== \"okay\")\n );\n}\n","import { useEffect, useState } from \"react\";\nimport { checkModules, FrontendModule } from \"./openmrs-backend-dependencies\";\n\nexport function useBackendDependencies() {\n const [\n modulesWithMissingBackendModules,\n setModulesWithMissingBackendModules,\n ] = useState<Array<FrontendModule>>([]);\n\n useEffect(() => {\n // loading missing modules\n checkModules().then(setModulesWithMissingBackendModules);\n }, []);\n\n return modulesWithMissingBackendModules;\n}\n","import React, { useState, useEffect } from \"react\";\nimport { NotificationActionButton } from \"@carbon/react\";\nimport {\n showNotification,\n UserHasAccess,\n useStore,\n} from \"@openmrs/esm-framework\";\nimport {\n implementerToolsStore,\n showModuleDiagnostics,\n togglePopup,\n} from \"./store\";\n\nimport { useBackendDependencies } from \"./backend-dependencies/useBackendDependencies\";\nimport { hasInvalidDependencies } from \"./backend-dependencies/openmrs-backend-dependencies\";\nimport { useTranslation } from \"react-i18next\";\n\nconst Popup = React.lazy(() => import(\"./popup/popup.component\"));\nconst UiEditor = React.lazy(() => import(\"./ui-editor/ui-editor\"));\n\nfunction PopupHandler() {\n const frontendModules = useBackendDependencies();\n const [shouldShowNotification, setShouldShowNotification] = useState(false);\n const { t } = useTranslation();\n useEffect(() => {\n // displaying toast if modules are missing\n setShouldShowNotification(\n (alreadyShowing) =>\n alreadyShowing || hasInvalidDependencies(frontendModules)\n );\n }, [frontendModules]);\n\n useEffect(() => {\n // only show notification max. 1 time\n if (shouldShowNotification) {\n showNotification({\n description: \"Found modules with unresolved backend dependencies.\",\n action: (\n <NotificationActionButton onClick={showModuleDiagnostics}>\n {t(\"view\", \"View\")}\n </NotificationActionButton>\n ),\n kind: \"error\",\n });\n }\n }, [t, shouldShowNotification]);\n\n const { isOpen, isUIEditorEnabled, openTabIndex } = useStore(\n implementerToolsStore\n );\n return (\n <>\n {isOpen ? (\n <Popup\n close={togglePopup}\n frontendModules={frontendModules}\n visibleTabIndex={openTabIndex}\n />\n ) : null}\n {isUIEditorEnabled ? <UiEditor /> : null}\n </>\n );\n}\n\nexport default function ImplementerTools() {\n return (\n <UserHasAccess privilege=\"coreapps.systemAdministration\">\n <PopupHandler />\n </UserHasAccess>\n );\n}\n"],"names":["cachedFrontendModules","initInstalledBackendModules","response","fetchInstalledBackendModules","data","results","console","error","checkIfModulesAreInstalled","module","installedBackendModules","dependencies","missingBackendModule","requiredBackendModules","requiredBackendModulesUuids","Object","keys","installedBackendModuleUuids","map","res","uuid","difference","key","version","getMissingBackendModules","backendDependencies","installedAndRequiredModules","filter","requiredModule","find","installedModule","getInstalledAndRequiredBackendModules","push","m","name","requiredVersion","type","installedVersion","installedAndRequiredBackendModule","moduleName","mod","getInstalledVersion","getResolvedModuleType","openmrsFetch","method","isVersionSatisfied","checkModules","window","modules","installedModules","useBackendDependencies","useState","modulesWithMissingBackendModules","setModulesWithMissingBackendModules","useEffect","then","Popup","React","UiEditor","PopupHandler","frontendModules","shouldShowNotification","setShouldShowNotification","useTranslation","t","alreadyShowing","some","n","hasInvalidDependencies","showNotification","description","action","NotificationActionButton","onClick","showModuleDiagnostics","kind","useStore","implementerToolsStore","isOpen","isUIEditorEnabled","openTabIndex","close","togglePopup","visibleTabIndex","ImplementerTools","UserHasAccess","privilege"],"sourceRoot":""}
|