Skip to content

Instantly share code, notes, and snippets.

@jlkeiper
Last active August 29, 2015 13:57
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jlkeiper/9864039 to your computer and use it in GitHub Desktop.
Save jlkeiper/9864039 to your computer and use it in GitHub Desktop.
OpenMRS module dependency visualization
<!DOCTYPE html>
<meta charset="utf-8">
<style>
.link {
fill: none;
stroke: #666;
stroke-width: 1px;
}
circle {
fill: #ccc;
stroke: #333;
stroke-width: 1.5px;
}
text {
font: 14px sans-serif;
pointer-events: none;
text-shadow: 0 1px 0 #fff, 1px 0 0 #fff, 0 -1px 0 #fff, -1px 0 0 #fff;
}
text.hover {
font-color: black;
}
marker { fill-opacity: 1; opacity: 1;}
marker#normal { fill: #666;}
marker#in { fill: darkblue;}
marker#out { fill: red;}
#chart { margin: 0.5em 3px; }
</style>
<body>
<script src="http://d3js.org/d3.v3.min.js"></script>
<script src="http://code.jquery.com/jquery-1.11.0.min.js"></script>
<form>
<input id="search" type="text" size="40" placeholder="search ..."/> <span id="echo"></span>
</form>
<div id="chart"></div>
<script>
$(document).ready(function(){
$("#search").keyup(function(){
foo = $("#search").val();
if (foo.trim() == "") {
resetGraph();
} else {
resetGraph();
d3.selectAll("circle[source*='" + foo + "'], text[source*='" + foo + "']")
.classed("lit", true);
killEverythingElse();
}
});
$("#search").focus();
});
var links = [{"source":"reporting","label":"Reporting","target":"serialization.xstream","org":"openmrs","targetOrg":"openmrs"},{"source":"reporting","label":"Reporting","target":"htmlwidgets","org":"openmrs","targetOrg":"openmrs"},{"source":"reporting","label":"Reporting","target":"org.openmrs.calculation","org":"openmrs","targetOrg":"Not Found"},{"source":"kenyaemr","label":"KenyaEMR","target":"appframework","org":"I-TECH","targetOrg":"openmrs"},{"source":"kenyaemr","label":"KenyaEMR","target":"org.openmrs.calculation","org":"I-TECH","targetOrg":"Not Found"},{"source":"kenyaemr","label":"KenyaEMR","target":"htmlformentry","org":"I-TECH","targetOrg":"openmrs"},{"source":"kenyaemr","label":"KenyaEMR","target":"idgen","org":"I-TECH","targetOrg":"Not Found"},{"source":"kenyaemr","label":"KenyaEMR","target":"kenyacore","org":"I-TECH","targetOrg":"I-TECH"},{"source":"kenyaemr","label":"KenyaEMR","target":"kenyaui","org":"I-TECH","targetOrg":"Not Found"},{"source":"kenyaemr","label":"KenyaEMR","target":"metadatasharing","org":"I-TECH","targetOrg":"openmrs"},{"source":"kenyaemr","label":"KenyaEMR","target":"reporting","org":"I-TECH","targetOrg":"openmrs"},{"source":"metadatasharing","label":"Metadata Sharing Module","target":"metadatamapping","org":"openmrs","targetOrg":"openmrs"},{"source":"patientsummary","label":"Patient Summary Module","target":"reporting","org":"nribeka","targetOrg":"openmrs"},{"source":"patientsummary","label":"Patient Summary Module","target":"htmlwidgets","org":"nribeka","targetOrg":"openmrs"},{"source":"uilibrary","label":"UI Library Module","target":"uiframework","org":"openmrs","targetOrg":"openmrs"},{"source":"emrapi","label":"EMR API Module","target":"reporting","org":"openmrs","targetOrg":"openmrs"},{"source":"emrapi","label":"EMR API Module","target":"providermanagement","org":"openmrs","targetOrg":"openmrs"},{"source":"emrapi","label":"EMR API Module","target":"metadatasharing","org":"openmrs","targetOrg":"openmrs"},{"source":"emrapi","label":"EMR API Module","target":"org.openmrs.event","org":"openmrs","targetOrg":"Not Found"},{"source":"emrapi","label":"EMR API Module","target":"webservices.rest","org":"openmrs","targetOrg":"openmrs"},{"source":"amrsreports","label":"AMRS Reports Module","target":"reporting","org":"AMPATH","targetOrg":"openmrs"},{"source":"reportingrest","label":"Reporting REST","target":"serialization.xstream","org":"openmrs","targetOrg":"openmrs"},{"source":"reportingrest","label":"Reporting REST","target":"reporting","org":"openmrs","targetOrg":"openmrs"},{"source":"reportingrest","label":"Reporting REST","target":"webservices.rest","org":"openmrs","targetOrg":"openmrs"},{"source":"reportingui","label":"Reporting UI Module","target":"reporting","org":"openmrs","targetOrg":"openmrs"},{"source":"reportingui","label":"Reporting UI Module","target":"uiframework","org":"openmrs","targetOrg":"openmrs"},{"source":"reportingui","label":"Reporting UI Module","target":"appui","org":"openmrs","targetOrg":"openmrs"},{"source":"raxacore","label":"RaxaEMR Core","target":"webservices.rest","org":"Raxa","targetOrg":"openmrs"},{"source":"registrationcore","label":"Registration Core Module","target":"idgen","org":"openmrs","targetOrg":"Not Found"},{"source":"registrationcore","label":"Registration Core Module","target":"org.openmrs.event","org":"openmrs","targetOrg":"Not Found"},{"source":"registrationapp","label":"Registration App Module","target":"uicommons","org":"openmrs","targetOrg":"openmrs"},{"source":"registrationapp","label":"Registration App Module","target":"emrapi","org":"openmrs","targetOrg":"openmrs"},{"source":"registrationapp","label":"Registration App Module","target":"appui","org":"openmrs","targetOrg":"openmrs"},{"source":"registrationapp","label":"Registration App Module","target":"registrationcore","org":"openmrs","targetOrg":"openmrs"},{"source":"muzima","label":"Muzima Processor Module","target":"webservices.rest","org":"muzima","targetOrg":"openmrs"},{"source":"htmlformentry19ext","label":"HTML Form Entry Extensions for OpenMRS 1.9 Module","target":"htmlformentry","org":"openmrs","targetOrg":"openmrs"},{"source":"coreapps","label":"Core Apps Module","target":"appframework","org":"openmrs","targetOrg":"openmrs"},{"source":"coreapps","label":"Core Apps Module","target":"uiframework","org":"openmrs","targetOrg":"openmrs"},{"source":"coreapps","label":"Core Apps Module","target":"emrapi","org":"openmrs","targetOrg":"openmrs"},{"source":"coreapps","label":"Core Apps Module","target":"appui","org":"openmrs","targetOrg":"openmrs"},{"source":"coreapps","label":"Core Apps Module","target":"idgen","org":"openmrs","targetOrg":"Not Found"},{"source":"coreapps","label":"Core Apps Module","target":"webservices.rest","org":"openmrs","targetOrg":"openmrs"},{"source":"uicommons","label":"UI Commons Module","target":"uiframework","org":"openmrs","targetOrg":"openmrs"},{"source":"dictionarypublishing","label":"Dictionary Publishing Module","target":"metadatasharing","org":"openmrs","targetOrg":"openmrs"},{"source":"adminapp","label":"Administration App Module","target":"uiframework","org":"AMPATH","targetOrg":"openmrs"},{"source":"adminapp","label":"Administration App Module","target":"uicommons","org":"AMPATH","targetOrg":"openmrs"},{"source":"adminapp","label":"Administration App Module","target":"appui","org":"AMPATH","targetOrg":"openmrs"},{"source":"adminapp","label":"Administration App Module","target":"appframework","org":"AMPATH","targetOrg":"openmrs"},{"source":"dictionarysubscribing","label":"Dictionary Subscribing Module","target":"metadatasharing","org":"openmrs","targetOrg":"openmrs"},{"source":"emr","label":"EMR Module","target":"emrapi","org":"PIH","targetOrg":"openmrs"},{"source":"emr","label":"EMR Module","target":"paperrecord","org":"PIH","targetOrg":"PIH"},{"source":"emr","label":"EMR Module","target":"uiframework","org":"PIH","targetOrg":"openmrs"},{"source":"emr","label":"EMR Module","target":"appframework","org":"PIH","targetOrg":"openmrs"},{"source":"emr","label":"EMR Module","target":"htmlformentry","org":"PIH","targetOrg":"openmrs"},{"source":"emr","label":"EMR Module","target":"providermanagement","org":"PIH","targetOrg":"openmrs"},{"source":"emr","label":"EMR Module","target":"idgen","org":"PIH","targetOrg":"Not Found"},{"source":"emr","label":"EMR Module","target":"reporting","org":"PIH","targetOrg":"openmrs"},{"source":"emr","label":"EMR Module","target":"uicommons","org":"PIH","targetOrg":"openmrs"},{"source":"emr","label":"EMR Module","target":"metadatasharing","org":"PIH","targetOrg":"openmrs"},{"source":"kenyacore","label":"KenyaCore","target":"appframework","org":"I-TECH","targetOrg":"openmrs"},{"source":"kenyacore","label":"KenyaCore","target":"org.openmrs.calculation","org":"I-TECH","targetOrg":"Not Found"},{"source":"kenyacore","label":"KenyaCore","target":"htmlformentry","org":"I-TECH","targetOrg":"openmrs"},{"source":"kenyacore","label":"KenyaCore","target":"idgen","org":"I-TECH","targetOrg":"Not Found"},{"source":"kenyacore","label":"KenyaCore","target":"metadatadeploy","org":"I-TECH","targetOrg":"I-TECH"},{"source":"kenyacore","label":"KenyaCore","target":"reporting","org":"I-TECH","targetOrg":"openmrs"},{"source":"kenyacore","label":"KenyaCore","target":"uiframework","org":"I-TECH","targetOrg":"openmrs"},{"source":"htmlformflowsheet","label":"htmlformflowsheet","target":"htmlformentry","org":"openmrs","targetOrg":"openmrs"},{"source":"htmlformflowsheet","label":"htmlformflowsheet","target":"1.7.2","org":"openmrs","targetOrg":"Not Found"},{"source":"mirebalais","label":"Mirebalais Hospital Module","target":"mirebalaismetadata","org":"PIH","targetOrg":"PIH"},{"source":"mirebalais","label":"Mirebalais Hospital Module","target":"uiframework","org":"PIH","targetOrg":"openmrs"},{"source":"mirebalais","label":"Mirebalais Hospital Module","target":"appframework","org":"PIH","targetOrg":"openmrs"},{"source":"mirebalais","label":"Mirebalais Hospital Module","target":"metadatasharing","org":"PIH","targetOrg":"openmrs"},{"source":"mirebalais","label":"Mirebalais Hospital Module","target":"htmlformentry","org":"PIH","targetOrg":"openmrs"},{"source":"mirebalais","label":"Mirebalais Hospital Module","target":"htmlformentry19ext","org":"PIH","targetOrg":"openmrs"},{"source":"mirebalais","label":"Mirebalais Hospital Module","target":"htmlformentryui","org":"PIH","targetOrg":"openmrs"},{"source":"mirebalais","label":"Mirebalais Hospital Module","target":"org.openmrs.calculation","org":"PIH","targetOrg":"Not Found"},{"source":"mirebalais","label":"Mirebalais Hospital Module","target":"reporting","org":"PIH","targetOrg":"openmrs"},{"source":"mirebalais","label":"Mirebalais Hospital Module","target":"idgen","org":"PIH","targetOrg":"Not Found"},{"source":"mirebalais","label":"Mirebalais Hospital Module","target":"patientregistration","org":"PIH","targetOrg":"PIH"},{"source":"mirebalais","label":"Mirebalais Hospital Module","target":"namephonetics","org":"PIH","targetOrg":"openmrs"},{"source":"mirebalais","label":"Mirebalais Hospital Module","target":"pacsintegration","org":"PIH","targetOrg":"PIH"},{"source":"mirebalais","label":"Mirebalais Hospital Module","target":"providermanagement","org":"PIH","targetOrg":"openmrs"},{"source":"mirebalais","label":"Mirebalais Hospital Module","target":"importpatientfromws","org":"PIH","targetOrg":"PIH"},{"source":"mirebalais","label":"Mirebalais Hospital Module","target":"uicommons","org":"PIH","targetOrg":"openmrs"},{"source":"mirebalais","label":"Mirebalais Hospital Module","target":"radiologyapp","org":"PIH","targetOrg":"PIH"},{"source":"mirebalais","label":"Mirebalais Hospital Module","target":"coreapps","org":"PIH","targetOrg":"openmrs"},{"source":"mirebalais","label":"Mirebalais Hospital Module","target":"dispensing","org":"PIH","targetOrg":"openmrs"},{"source":"jsslab","label":"JSSLab Module","target":"webservices.rest","org":"openmrs","targetOrg":"openmrs"},{"source":"keaddonexample","label":"KenyaEMR Add-on Example Module","target":"kenyaemr","org":"I-TECH","targetOrg":"I-TECH"},{"source":"rwandareports","label":"Rwanda Reports","target":"rowperpatientreports","org":"PIH","targetOrg":"openmrs"},{"source":"rwandareports","label":"Rwanda Reports","target":"reportingobjectgroup","org":"PIH","targetOrg":"PIH"},{"source":"rwandareports","label":"Rwanda Reports","target":"heightweighttracker","org":"PIH","targetOrg":"Not Found"},{"source":"rwandareports","label":"Rwanda Reports","target":"orderextension","org":"PIH","targetOrg":"openmrs"},{"source":"pharmacy","label":"Pharmacy Module","target":"jsonforms","org":"openmrs","targetOrg":"AMPATH"},{"source":"referenceapplication","label":"Reference Application Module","target":"appframework","org":"openmrs","targetOrg":"openmrs"},{"source":"referenceapplication","label":"Reference Application Module","target":"uiframework","org":"openmrs","targetOrg":"openmrs"},{"source":"referenceapplication","label":"Reference Application Module","target":"uicommons","org":"openmrs","targetOrg":"openmrs"},{"source":"referenceapplication","label":"Reference Application Module","target":"appui","org":"openmrs","targetOrg":"openmrs"},{"source":"referenceapplication","label":"Reference Application Module","target":"htmlformentry","org":"openmrs","targetOrg":"openmrs"},{"source":"referenceapplication","label":"Reference Application Module","target":"htmlformentryui","org":"openmrs","targetOrg":"openmrs"},{"source":"metadatadeploy","label":"Metadata Deploy","target":"metadatasharing","org":"I-TECH","targetOrg":"openmrs"},{"source":"register","label":"Register","target":"htmlformentry","org":"openmrs","targetOrg":"openmrs"},{"source":"ampathsummary","label":"Ampath Patient Summary Module","target":"reporting","org":"nribeka","targetOrg":"openmrs"},{"source":"dss","label":"Dss","target":"chirdlutil","org":"openmrs","targetOrg":"openmrs"},{"source":"dss","label":"Dss","target":"chirdlutilbackports","org":"openmrs","targetOrg":"openmrs"},{"source":"pcslabinterface","label":"PcsLabInterface","target":"restmodule","org":"AMPATH","targetOrg":"openmrs"},{"source":"referencemetadata","label":"Reference Metadata Module","target":"emrapi","org":"openmrs","targetOrg":"openmrs"},{"source":"referencemetadata","label":"Reference Metadata Module","target":"idgen","org":"openmrs","targetOrg":"Not Found"},{"source":"referencemetadata","label":"Reference Metadata Module","target":"dataexchange","org":"openmrs","targetOrg":"openmrs"},{"source":"openhmis.cashier","label":"OpenHMIS Cashier Module","target":"openhmis.backboneforms","org":"OpenHMIS","targetOrg":"OpenHMIS"},{"source":"openhmis.cashier","label":"OpenHMIS Cashier Module","target":"openhmis.commons","org":"OpenHMIS","targetOrg":"Not Found"},{"source":"openhmis.cashier","label":"OpenHMIS Cashier Module","target":"openhmis.inventory","org":"OpenHMIS","targetOrg":"OpenHMIS"},{"source":"openhmis.cashier","label":"OpenHMIS Cashier Module","target":"jasperreport","org":"OpenHMIS","targetOrg":"openmrs"},{"source":"rowperpatientreports","label":"Row Per Patient Reports","target":"reporting","org":"openmrs","targetOrg":"openmrs"},{"source":"filemanager","label":"File Manager Module","target":"uiframework","org":"gitahi86","targetOrg":"openmrs"},{"source":"filemanager","label":"File Manager Module","target":"uicommons","org":"gitahi86","targetOrg":"openmrs"},{"source":"filemanager","label":"File Manager Module","target":"emrapi","org":"gitahi86","targetOrg":"openmrs"},{"source":"filemanager","label":"File Manager Module","target":"appui","org":"gitahi86","targetOrg":"openmrs"},{"source":"filemanager","label":"File Manager Module","target":"appframework","org":"gitahi86","targetOrg":"openmrs"},{"source":"amrsmobileforms","label":"AMRS Mobile Forms","target":"xforms","org":"AMPATH","targetOrg":"openmrs"},{"source":"amrsmobileforms","label":"AMRS Mobile Forms","target":"household","org":"AMPATH","targetOrg":"openmrs"},{"source":"htmlformentryui","label":"HTML Form Entry UI Framework Integration Module","target":"htmlformentry","org":"openmrs","targetOrg":"openmrs"},{"source":"htmlformentryui","label":"HTML Form Entry UI Framework Integration Module","target":"uiframework","org":"openmrs","targetOrg":"openmrs"},{"source":"htmlformentryui","label":"HTML Form Entry UI Framework Integration Module","target":"emrapi","org":"openmrs","targetOrg":"openmrs"},{"source":"htmlformentryui","label":"HTML Form Entry UI Framework Integration Module","target":"appui","org":"openmrs","targetOrg":"openmrs"},{"source":"htmlformentryui","label":"HTML Form Entry UI Framework Integration Module","target":"uicommons","org":"openmrs","targetOrg":"openmrs"},{"source":"kenyadq","label":"KenyaDQ","target":"kenyaui","org":"I-TECH","targetOrg":"Not Found"},{"source":"kenyadq","label":"KenyaDQ","target":"kenyacore","org":"I-TECH","targetOrg":"I-TECH"},{"source":"clinicalsummary","label":"Summary Module","target":"org.openmrs.logic","org":"openmrs","targetOrg":"Not Found"},{"source":"birt","label":"Eclipse BIRT Module","target":"reporting","org":"jmiranda","targetOrg":"openmrs"},{"source":"patientDashboardApp","label":"patientDashboardApp Module","target":"uiframework","org":"nutsiepully","targetOrg":"openmrs"},{"source":"monitoringapp","label":"Monitoring App Module","target":"uiframework","org":"jembi","targetOrg":"openmrs"},{"source":"monitoringapp","label":"Monitoring App Module","target":"uicommons","org":"jembi","targetOrg":"openmrs"},{"source":"monitoringapp","label":"Monitoring App Module","target":"appui","org":"jembi","targetOrg":"openmrs"},{"source":"monitoringapp","label":"Monitoring App Module","target":"appframework","org":"jembi","targetOrg":"openmrs"},{"source":"monitoringapp","label":"Monitoring App Module","target":"webservices.rest-omod","org":"jembi","targetOrg":"Not Found"},{"source":"monitoringapp","label":"Monitoring App Module","target":"webservices.rest-omod-common","org":"jembi","targetOrg":"Not Found"},{"source":"providermanagement","label":"Provider Management Module","target":"org.openmrs.logic","org":"openmrs","targetOrg":"Not Found"},{"source":"providermanagement","label":"Provider Management Module","target":"uiframework","org":"openmrs","targetOrg":"openmrs"},{"source":"providermanagement","label":"Provider Management Module","target":"uilibrary","org":"openmrs","targetOrg":"openmrs"},{"source":"conceptmanagementapps","label":"Concept Management Apps Module","target":"uiframework","org":"openmrs","targetOrg":"openmrs"},{"source":"conceptmanagementapps","label":"Concept Management Apps Module","target":"uicommons","org":"openmrs","targetOrg":"openmrs"},{"source":"conceptmanagementapps","label":"Concept Management Apps Module","target":"appui","org":"openmrs","targetOrg":"openmrs"},{"source":"patientflags","label":"Patient Flags Module","target":"org.openmrs.logic","org":"openmrs","targetOrg":"Not Found"},{"source":"referenceemr","label":"EMR Reference Application Module","target":"uiframework","org":"djazayeri","targetOrg":"openmrs"},{"source":"referenceemr","label":"EMR Reference Application Module","target":"appframework","org":"djazayeri","targetOrg":"openmrs"},{"source":"referenceemr","label":"EMR Reference Application Module","target":"webservices.rest","org":"djazayeri","targetOrg":"openmrs"},{"source":"openhmis.workorder","label":"OpenHMIS Work Order Module","target":"openhmis.backboneforms","org":"OpenHMIS","targetOrg":"OpenHMIS"},{"source":"openhmis.workorder","label":"OpenHMIS Work Order Module","target":"openhmis.commons","org":"OpenHMIS","targetOrg":"Not Found"},{"source":"atomfeed","label":"Atom Feed Module","target":"org.openmrs.event","org":"openmrs","targetOrg":"Not Found"},{"source":"social","label":"Social Module","target":"uiframework","org":"djazayeri","targetOrg":"openmrs"},{"source":"social","label":"Social Module","target":"uilibrary","org":"djazayeri","targetOrg":"openmrs"},{"source":"formdataexport","label":"Form Data Export Module","target":"reporting","org":"openmrs","targetOrg":"openmrs"},{"source":"formdataexport","label":"Form Data Export Module","target":"htmlformentry","org":"openmrs","targetOrg":"openmrs"},{"source":"jembiregistration","label":"Jembi Registration Module","target":"addresshierarchy","org":"jembi","targetOrg":"openmrs"},{"source":"foodprescription","label":"Food Prescription Module","target":"household","org":"AMPATH","targetOrg":"openmrs"},{"source":"openhmis.eventbasedbilling","label":"Event Based Billing Module","target":"org.openmrs.event","org":"icchange","targetOrg":"Not Found"},{"source":"openhmis.eventbasedbilling","label":"Event Based Billing Module","target":"openhmis.billableobjects","org":"icchange","targetOrg":"icchange"},{"source":"openhmis.billableobjects","label":"Billable Objects","target":"org.openmrs.event","org":"icchange","targetOrg":"Not Found"},{"source":"openhmis.billableobjects","label":"Billable Objects","target":"openhmis.commons","org":"icchange","targetOrg":"Not Found"},{"source":"openhmis.billableobjects","label":"Billable Objects","target":"openhmis.inventory","org":"icchange","targetOrg":"OpenHMIS"},{"source":"openhmis.billableobjects","label":"Billable Objects","target":"openhmis.cashier","org":"icchange","targetOrg":"OpenHMIS"},{"source":"addresshierarchyrwanda","label":"Address Hierarchy Rwanda","target":"htmlformentry","org":"rubailly","targetOrg":"openmrs"},{"source":"conceptsusage","label":"Concepts Usage Module","target":"htmlformentry","org":"rubailly","targetOrg":"openmrs"},{"source":"integration","label":"Integration Module","target":"reporting","org":"maurya","targetOrg":"openmrs"},{"source":"integration","label":"Integration Module","target":"serialization.xstream","org":"maurya","targetOrg":"openmrs"},{"source":"remoteformentry","label":"Remote FormEntry","target":"formentry","org":"openmrs","targetOrg":"openmrs"},{"source":"openhmis.backboneforms","label":"OpenHMIS Backbone Forms Module","target":"webservices.rest","org":"OpenHMIS","targetOrg":"openmrs"},{"source":"openhmis.backboneforms","label":"OpenHMIS Backbone Forms Module","target":"openhmis.commons","org":"OpenHMIS","targetOrg":"Not Found"},{"source":"kenyalab","label":"KenyaLab","target":"appframework","org":"I-TECH","targetOrg":"openmrs"},{"source":"kenyalab","label":"KenyaLab","target":"kenyacore","org":"I-TECH","targetOrg":"I-TECH"},{"source":"kenyalab","label":"KenyaLab","target":"kenyaui","org":"I-TECH","targetOrg":"Not Found"},{"source":"kenyalab","label":"KenyaLab","target":"uiframework","org":"I-TECH","targetOrg":"openmrs"},{"source":"muzimaregistration","label":"Muzima Registration Module","target":"muzima","org":"muzima","targetOrg":"muzima"},{"source":"diagnosiscapturerwanda","label":"DiagnosisCaptureRwanda","target":"uiframework","org":"pihdave","targetOrg":"openmrs"},{"source":"lancearmstrong","label":"Personal Cancer Tookit","target":"personalhr","org":"openmrs","targetOrg":"Not Found"},{"source":"lancearmstrong","label":"Personal Cancer Tookit","target":"htmlformentry","org":"openmrs","targetOrg":"openmrs"},{"source":"lancearmstrong","label":"Personal Cancer Tookit","target":"htmlformflowsheet","org":"openmrs","targetOrg":"openmrs"},{"source":"patientregistration","label":"Patient Registration Module","target":"reporting","org":"PIH","targetOrg":"openmrs"},{"source":"patientregistration","label":"Patient Registration Module","target":"htmlwidgets","org":"PIH","targetOrg":"openmrs"},{"source":"patientregistration","label":"Patient Registration Module","target":"idgen","org":"PIH","targetOrg":"Not Found"},{"source":"patientregistration","label":"Patient Registration Module","target":"emr","org":"PIH","targetOrg":"PIH"},{"source":"patientregistration","label":"Patient Registration Module","target":"paperrecord","org":"PIH","targetOrg":"PIH"},{"source":"patientregistration","label":"Patient Registration Module","target":"importpatientfromws","org":"PIH","targetOrg":"PIH"},{"source":"patientregistration","label":"Patient Registration Module","target":"addresshierarchy","org":"PIH","targetOrg":"openmrs"},{"source":"patientregistration","label":"Patient Registration Module","target":"namephonetics","org":"PIH","targetOrg":"openmrs"},{"source":"mirebalaismetadata","label":"Mirebalais Metadata Module","target":"addresshierarchy","org":"PIH","targetOrg":"openmrs"},{"source":"mirebalaismetadata","label":"Mirebalais Metadata Module","target":"emrapi","org":"PIH","targetOrg":"openmrs"},{"source":"mirebalaismetadata","label":"Mirebalais Metadata Module","target":"radiologyapp","org":"PIH","targetOrg":"PIH"},{"source":"mirebalaismetadata","label":"Mirebalais Metadata Module","target":"dispensing","org":"PIH","targetOrg":"openmrs"},{"source":"appointmentschedulingui","label":"Appointment Scheduling UI Module","target":"appointmentscheduling","org":"PIH","targetOrg":"openmrs"},{"source":"appointmentschedulingui","label":"Appointment Scheduling UI Module","target":"appframework","org":"PIH","targetOrg":"openmrs"},{"source":"appointmentschedulingui","label":"Appointment Scheduling UI Module","target":"uiframework","org":"PIH","targetOrg":"openmrs"},{"source":"appointmentschedulingui","label":"Appointment Scheduling UI Module","target":"coreapps","org":"PIH","targetOrg":"openmrs"},{"source":"appointmentschedulingui","label":"Appointment Scheduling UI Module","target":"uicommons","org":"PIH","targetOrg":"openmrs"},{"source":"appointmentschedulingui","label":"Appointment Scheduling UI Module","target":"webservices.rest","org":"PIH","targetOrg":"openmrs"},{"source":"bahmniapps","label":"Bahmni Apps Module","target":"org.bahmni.module.bahmnicore","org":"Bhamni","targetOrg":"Not Found"},{"source":"bahmniapps","label":"Bahmni Apps Module","target":"addresshierarchy","org":"Bhamni","targetOrg":"openmrs"},{"source":"bahmniapps","label":"Bahmni Apps Module","target":"webservices.rest","org":"Bhamni","targetOrg":"openmrs"},{"source":"bahmniapps","label":"Bahmni Apps Module","target":"idgen","org":"Bhamni","targetOrg":"Not Found"},{"source":"radiologyapp","label":"Radiology App Module","target":"uiframework","org":"PIH","targetOrg":"openmrs"},{"source":"radiologyapp","label":"Radiology App Module","target":"appframework","org":"PIH","targetOrg":"openmrs"},{"source":"radiologyapp","label":"Radiology App Module","target":"uicommons","org":"PIH","targetOrg":"openmrs"},{"source":"radiologyapp","label":"Radiology App Module","target":"emrapi","org":"PIH","targetOrg":"openmrs"},{"source":"radiologyapp","label":"Radiology App Module","target":"emr","org":"PIH","targetOrg":"PIH"},{"source":"alphanutrition","label":"AlphaNutrition Module","target":"household","org":"kwatuha","targetOrg":"openmrs"},{"source":"movehtmlformcontent","label":"Move HTML Form Content Module","target":"htmlformentry","org":"djazayeri","targetOrg":"openmrs"},{"source":"webserviceexamplepatientstub","label":"WebServiceExamplePatientStub","target":"webservices.jaxws","org":"openmrs","targetOrg":"Not Found"},{"source":"referencedemodata","label":"Reference Demo Data Module","target":"metadatasharing","org":"openmrs","targetOrg":"openmrs"},{"source":"referencedemodata","label":"Reference Demo Data Module","target":"emrapi","org":"openmrs","targetOrg":"openmrs"},{"source":"referencedemodata","label":"Reference Demo Data Module","target":"referencemetadata","org":"openmrs","targetOrg":"openmrs"},{"source":"referencedemodata","label":"Reference Demo Data Module","target":"providermanagement","org":"openmrs","targetOrg":"openmrs"},{"source":"fdm","label":"Food Distribution Module","target":"household","org":"jmwogi","targetOrg":"openmrs"},{"source":"amrsreport","label":"AMRS Report Module","target":"reporting","org":"ningosi","targetOrg":"openmrs"},{"source":"odkconnector","label":"ODK Connector Module","target":"reporting","org":"nribeka","targetOrg":"openmrs"},{"source":"haitimobileclinic","label":"Haiti Mobile Clinic","target":"reporting","org":"PIH","targetOrg":"openmrs"},{"source":"haitimobileclinic","label":"Haiti Mobile Clinic","target":"htmlwidgets","org":"PIH","targetOrg":"openmrs"},{"source":"haitimobileclinic","label":"Haiti Mobile Clinic","target":"addresshierarchy","org":"PIH","targetOrg":"openmrs"},{"source":"haitimobileclinic","label":"Haiti Mobile Clinic","target":"htmlformentry","org":"PIH","targetOrg":"openmrs"},{"source":"pihrwanda","label":"PIH Rwanda","target":"reporting","org":"PIH","targetOrg":"openmrs"},{"source":"pihrwanda","label":"PIH Rwanda","target":"orderextension","org":"PIH","targetOrg":"openmrs"},{"source":"pihrwanda","label":"PIH Rwanda","target":"rwandareports","org":"PIH","targetOrg":"PIH"},{"source":"pihrwanda","label":"PIH Rwanda","target":"htmlformflowsheet","org":"PIH","targetOrg":"openmrs"},{"source":"dataintegrityworkflow","label":"Data Integrity Workflow Module","target":"dataintegrity","org":"openmrs","targetOrg":"openmrs"},{"source":"bedmanagement","label":"Bed Management Module","target":"webservices.rest","org":"RetroBahmni","targetOrg":"openmrs"},{"source":"settingsapp","label":"Settings App Module","target":"webservices.rest","org":"rkorytkowski","targetOrg":"openmrs"},{"source":"openhmis.pharmacy","label":"OpenHMIS Pharmacy Module Module","target":"webservices.rest","org":"OpenHMIS","targetOrg":"openmrs"},{"source":"openhmis.pharmacy","label":"OpenHMIS Pharmacy Module Module","target":"openhmis.commons","org":"OpenHMIS","targetOrg":"Not Found"},{"source":"openhmis.pharmacy","label":"OpenHMIS Pharmacy Module Module","target":"openhmis.backboneforms","org":"OpenHMIS","targetOrg":"OpenHMIS"},{"source":"openhmis.pharmacy","label":"OpenHMIS Pharmacy Module Module","target":"openhmis.workorder","org":"OpenHMIS","targetOrg":"OpenHMIS"},{"source":"patientnarratives","label":"Patient Narratives","target":"htmlformentry","org":"openmrs","targetOrg":"openmrs"},{"source":"patientnarratives","label":"Patient Narratives","target":"xforms","org":"openmrs","targetOrg":"openmrs"},{"source":"muzimapreferredform","label":"Muzima Preferred Form Module","target":"reporting","org":"muzima","targetOrg":"openmrs"},{"source":"muzimapreferredform","label":"Muzima Preferred Form Module","target":"muzima","org":"muzima","targetOrg":"muzima"},{"source":"caching","label":"Caching","target":"serialization.xstream","org":"devcritter","targetOrg":"openmrs"},{"source":"reportingmds","label":"Reporting MDS Module","target":"metadatasharing","org":"openmrs","targetOrg":"openmrs"},{"source":"reportingmds","label":"Reporting MDS Module","target":"reporting","org":"openmrs","targetOrg":"openmrs"},{"source":"shr-rest","label":"SHR REST Interface Module","target":"shr-contenthandler","org":"jembi","targetOrg":"jembi"},{"source":"shr-rest","label":"SHR REST Interface Module","target":"webservices.rest","org":"jembi","targetOrg":"openmrs"},{"source":"vtoxfordnicu","label":"VT Oxford NICU Module","target":"uiframework","org":"nickwilkie","targetOrg":"openmrs"},{"source":"vtoxfordnicu","label":"VT Oxford NICU Module","target":"webservices.rest","org":"nickwilkie","targetOrg":"openmrs"},{"source":"tracnetreportingsdmx","label":"Tracnet Report SDMX-HD Integration","target":"reporting","org":"mseaton","targetOrg":"openmrs"},{"source":"tracnetreportingsdmx","label":"Tracnet Report SDMX-HD Integration","target":"sdmxhdintegration","org":"mseaton","targetOrg":"Not Found"},{"source":"tracnetreportingsdmx","label":"Tracnet Report SDMX-HD Integration","target":"tracnetreporting","org":"mseaton","targetOrg":"Not Found"},{"source":"dcompare","label":"DCompare Module","target":"metadatasharing","org":"rubailly","targetOrg":"openmrs"},{"source":"cccgenerator","label":"CCC Generator","target":"reporting","org":"AMPATH","targetOrg":"openmrs"},{"source":"appui","label":"App UI Module","target":"appframework","org":"openmrs","targetOrg":"openmrs"},{"source":"appui","label":"App UI Module","target":"uiframework","org":"openmrs","targetOrg":"openmrs"},{"source":"appui","label":"App UI Module","target":"emrapi","org":"openmrs","targetOrg":"openmrs"},{"source":"appui","label":"App UI Module","target":"uicommons","org":"openmrs","targetOrg":"openmrs"},{"source":"appframeworkadmin","label":"App Framework Admin Module","target":"uiframework","org":"bwolfe","targetOrg":"openmrs"},{"source":"chartsearchadvanced","label":"Advanced Chart Search Module","target":"uiframework","org":"tallevi12","targetOrg":"openmrs"},{"source":"chartsearchadvanced","label":"Advanced Chart Search Module","target":"uicommons","org":"tallevi12","targetOrg":"openmrs"},{"source":"chartsearchadvanced","label":"Advanced Chart Search Module","target":"appui","org":"tallevi12","targetOrg":"openmrs"},{"source":"chartsearchadvanced","label":"Advanced Chart Search Module","target":"appframework","org":"tallevi12","targetOrg":"openmrs"},{"source":"reportingobjectgroup","label":"Reporting Object Group","target":"reporting","org":"PIH","targetOrg":"openmrs"},{"source":"muzimaconsultation","label":"Muzima Consultation Module","target":"muzima","org":"muzima","targetOrg":"muzima"},{"source":"bom","label":"BOM Module","target":"htmlformentry","org":"rubailly","targetOrg":"openmrs"},{"source":"bom","label":"BOM Module","target":"reporting","org":"rubailly","targetOrg":"openmrs"},{"source":"bom","label":"BOM Module","target":"htmlwidgets","org":"rubailly","targetOrg":"openmrs"},{"source":"pacsintegration","label":"PACS Integration Module","target":"org.openmrs.event","org":"PIH","targetOrg":"Not Found"},{"source":"pacsintegration","label":"PACS Integration Module","target":"emr","org":"PIH","targetOrg":"PIH"},{"source":"pacsintegration","label":"PACS Integration Module","target":"radiologyapp","org":"PIH","targetOrg":"PIH"},{"source":"formconcepts","label":"Form concepts Module","target":"htmlformentry","org":"rubailly","targetOrg":"openmrs"},{"source":"formconcepts","label":"Form concepts Module","target":"metadatasharing","org":"rubailly","targetOrg":"openmrs"},{"source":"reportingsummary","label":"Reporting Based Clinical Summary Module Module","target":"reporting","org":"nribeka","targetOrg":"openmrs"},{"source":"mirebalaisreports","label":"Mirebalais Hospital Reporting Module","target":"reporting","org":"PIH","targetOrg":"openmrs"},{"source":"mirebalaisreports","label":"Mirebalais Hospital Reporting Module","target":"emr","org":"PIH","targetOrg":"PIH"},{"source":"mirebalaisreports","label":"Mirebalais Hospital Reporting Module","target":"patientregistration","org":"PIH","targetOrg":"PIH"},{"source":"mirebalaisreports","label":"Mirebalais Hospital Reporting Module","target":"mirebalaismetadata","org":"PIH","targetOrg":"PIH"},{"source":"messagingphr","label":"PHR Messaging Module","target":"messaging","org":"openmrs","targetOrg":"medic"},{"source":"messagingphr","label":"PHR Messaging Module","target":"personalhr","org":"openmrs","targetOrg":"Not Found"},{"source":"pihmalawi","label":"PIH Malawi Customizations","target":"reporting","org":"PIH","targetOrg":"openmrs"},{"source":"openhmis.inventory","label":"OpenHMIS Inventory Module","target":"webservices.rest","org":"OpenHMIS","targetOrg":"openmrs"},{"source":"openhmis.inventory","label":"OpenHMIS Inventory Module","target":"openhmis.commons","org":"OpenHMIS","targetOrg":"Not Found"},{"source":"openhmis.inventory","label":"OpenHMIS Inventory Module","target":"openhmis.backboneforms","org":"OpenHMIS","targetOrg":"OpenHMIS"},{"source":"paperrecord","label":"Paper Record Management Module","target":"uiframework","org":"PIH","targetOrg":"openmrs"},{"source":"paperrecord","label":"Paper Record Management Module","target":"emrapi","org":"PIH","targetOrg":"openmrs"},{"source":"paperrecord","label":"Paper Record Management Module","target":"idgen","org":"PIH","targetOrg":"Not Found"},{"source":"paperrecord","label":"Paper Record Management Module","target":"appui","org":"PIH","targetOrg":"openmrs"},{"source":"paperrecord","label":"Paper Record Management Module","target":"appframework","org":"PIH","targetOrg":"openmrs"},{"source":"paperrecord","label":"Paper Record Management Module","target":"coreapps","org":"PIH","targetOrg":"openmrs"},{"source":"dispensing","label":"Dispensing Module","target":"appframework","org":"openmrs","targetOrg":"openmrs"},{"source":"dispensing","label":"Dispensing Module","target":"emrapi","org":"openmrs","targetOrg":"openmrs"},{"source":"dispensing","label":"Dispensing Module","target":"appui","org":"openmrs","targetOrg":"openmrs"},{"source":"dispensing","label":"Dispensing Module","target":"htmlformentryui","org":"openmrs","targetOrg":"openmrs"},{"source":"dispensing","label":"Dispensing Module","target":"providermanagement","org":"openmrs","targetOrg":"openmrs"},{"source":"uiframeworkpatientsummarysupport","label":"UI Framework Patient Summary Support Module","target":"uiframework","org":"openmrs","targetOrg":"openmrs"},{"source":"calculation19ext","label":"Calculation 1.9 Extensions","target":"calculation","org":"rkorytkowski","targetOrg":"openmrs"},{"source":"webservices.rest19ext","label":"Rest Web Services 1.9 Extension","target":"webservices.rest","org":"openmrs","targetOrg":"openmrs"},{"source":"spike1","label":"Spike1 Module","target":"appframework","org":"nutsiepully","targetOrg":"openmrs"},{"source":"rwandaprimarycare","label":"Rwanda Primary Care Module","target":"addresshierarchyrwanda","org":"openmrs","targetOrg":"rubailly"},{"source":"rwandaprimarycare","label":"Rwanda Primary Care Module","target":"idgen","org":"openmrs","targetOrg":"Not Found"},{"source":"rwandaprimarycare","label":"Rwanda Primary Care Module","target":"namephonetics","org":"openmrs","targetOrg":"openmrs"},{"source":"radiologyrest","label":"Radiology Rest Module","target":"webservices.rest","org":"akhilrv","targetOrg":"openmrs"},{"source":"hiemonitoring","label":"HIE Monitoring Module","target":"rheapocadapter","org":"jembi","targetOrg":"Not Found"},{"source":"quicklabdataentry","label":"Quick Lab data entry","target":"mohtracportal","org":"oynomak","targetOrg":"Not Found"},{"source":"atd","label":"ATD","target":"dss","org":"openmrs","targetOrg":"openmrs"},{"source":"atd","label":"ATD","target":"chirdlutil","org":"openmrs","targetOrg":"openmrs"},{"source":"atd","label":"ATD","target":"chirdlutilbackports","org":"openmrs","targetOrg":"openmrs"},{"source":"cardiologyreport","label":"Cardiology Report","target":"reporting","org":"openmrs","targetOrg":"openmrs"},{"source":"chica","label":"Chica","target":"dss","org":"openmrs","targetOrg":"openmrs"},{"source":"chica","label":"Chica","target":"atd","org":"openmrs","targetOrg":"openmrs"},{"source":"chica","label":"Chica","target":"sockethl7listener","org":"openmrs","targetOrg":"openmrs"},{"source":"chica","label":"Chica","target":"rgccd","org":"openmrs","targetOrg":"openmrs"},{"source":"chica","label":"Chica","target":"chirdlutil","org":"openmrs","targetOrg":"openmrs"},{"source":"chica","label":"Chica","target":"chirdlutilbackports","org":"openmrs","targetOrg":"openmrs"},{"source":"chicaops","label":"Chica Operations","target":"dss","org":"openmrs","targetOrg":"openmrs"},{"source":"chicaops","label":"Chica Operations","target":"atd","org":"openmrs","targetOrg":"openmrs"},{"source":"chicaops","label":"Chica Operations","target":"chirdlutil","org":"openmrs","targetOrg":"openmrs"},{"source":"chicaops","label":"Chica Operations","target":"chirdlutilbackports","org":"openmrs","targetOrg":"openmrs"},{"source":"chicaops","label":"Chica Operations","target":"chica","org":"openmrs","targetOrg":"openmrs"},{"source":"chirdlutil","label":"chirdlutil","target":"chirdlutilbackports","org":"openmrs","targetOrg":"openmrs"},{"source":"datasetbuilder","label":"Dataset Builder","target":"reporting","org":"openmrs","targetOrg":"openmrs"},{"source":"dduipd","label":"DDU ipd module","target":"hospitalcore","org":"openmrs","targetOrg":"Not Found"},{"source":"ddupatientdashboard","label":"DDU Patient Dashboard","target":"hospitalcore","org":"openmrs","targetOrg":"Not Found"},{"source":"ddupatientqueue","label":"ddupatientqueue","target":"hospitalcore","org":"openmrs","targetOrg":"Not Found"},{"source":"dhisconnector","label":"DHIS Connector","target":"mirthmessaging","org":"openmrs","targetOrg":"openmrs"},{"source":"diabetesmanagement","label":"Diabetes Management","target":"medicalproblem","org":"openmrs","targetOrg":"openmrs"},{"source":"opd","label":"opd","target":"billing","org":"openmrs","targetOrg":"Not Found"},{"source":"epihandy","label":"EpiHandy","target":"formEntry","org":"openmrs","targetOrg":"Not Found"},{"source":"htmlformentrydesigner","label":"HTML Form Entry Designer","target":"htmlformentry","org":"openmrs","targetOrg":"openmrs"},{"source":"htmlformentrydesigner","label":"HTML Form Entry Designer","target":"htmlwidgets","org":"openmrs","targetOrg":"openmrs"},{"source":"idgenws-parent","label":"IDGen Web Service","target":"idgen","org":"openmrs","targetOrg":"Not Found"},{"source":"idgenws-parent","label":"IDGen Web Service","target":"webservices.rest","org":"openmrs","targetOrg":"openmrs"},{"source":"inpatientcare","label":"Inpatient Care","target":"medicalproblem","org":"openmrs","targetOrg":"openmrs"},{"source":"logic","label":"Logic Module","target":"org.openmrs.calculation","org":"openmrs","targetOrg":"Not Found"},{"source":"mdrtbpatientchartwidgets","label":"Mdrtb Patient Chart Widgets","target":"htmlformentry","org":"openmrs","targetOrg":"openmrs"},{"source":"namibiadefense","label":"Namibia Defense","target":"htmlformentry","org":"openmrs","targetOrg":"openmrs"},{"source":"namibiadefense","label":"Namibia Defense","target":"ui.springmvc","org":"openmrs","targetOrg":"openmrs"},{"source":"nbs","label":"nbs","target":"dss","org":"openmrs","targetOrg":"openmrs"},{"source":"nbs","label":"nbs","target":"atd","org":"openmrs","targetOrg":"openmrs"},{"source":"nbs","label":"nbs","target":"sockethl7listener","org":"openmrs","targetOrg":"openmrs"},{"source":"nbs","label":"nbs","target":"chirdlutil","org":"openmrs","targetOrg":"openmrs"},{"source":"ncd","label":"NCD","target":"mrngen","org":"openmrs","targetOrg":"openmrs"},{"source":"ncd","label":"NCD","target":"messaging","org":"openmrs","targetOrg":"medic"},{"source":"nealreporting","label":"Neal Reporting","target":"reportingcompatibility","org":"openmrs","targetOrg":"Not Found"},{"source":"nutrition","label":"Nutrition Module","target":"household","org":"openmrs","targetOrg":"openmrs"},{"source":"patientchartwidgets","label":"Patient Chart Widgets","target":"htmlformentry","org":"openmrs","targetOrg":"openmrs"},{"source":"pearlgrlz","label":"Pearl Grlz","target":"dss","org":"openmrs","targetOrg":"openmrs"},{"source":"pearlgrlz","label":"Pearl Grlz","target":"atd","org":"openmrs","targetOrg":"openmrs"},{"source":"pearlgrlz","label":"Pearl Grlz","target":"chirdlutil","org":"openmrs","targetOrg":"openmrs"},{"source":"pihhaiti","label":"PIH Haiti Customizations","target":"reporting","org":"openmrs","targetOrg":"openmrs"},{"source":"pihlesothotbupload","label":"PIH Lesotho TB Upload","target":"spreadsheetupload","org":"openmrs","targetOrg":"openmrs"},{"source":"regimenreporting","label":"Regimen Reporting","target":"regimen","org":"openmrs","targetOrg":"openmrs"},{"source":"regimenreporting","label":"Regimen Reporting","target":"reporting","org":"openmrs","targetOrg":"openmrs"},{"source":"remoteregistration","label":"Remote Registration Module","target":"remoteformentry","org":"openmrs","targetOrg":"openmrs"},{"source":"reporttemplate","label":"Report Template Module","target":"versionedfileupload","org":"openmrs","targetOrg":"openmrs"},{"source":"rgccd","label":"RG CCD","target":"chirdlutil","org":"openmrs","targetOrg":"openmrs"},{"source":"rgccd","label":"RG CCD","target":"chirdlutilbackports","org":"openmrs","targetOrg":"openmrs"},{"source":"rgrta","label":"Rgrta","target":"dss","org":"openmrs","targetOrg":"openmrs"},{"source":"rgrta","label":"Rgrta","target":"atd","org":"openmrs","targetOrg":"openmrs"},{"source":"rgrta","label":"Rgrta","target":"sockethl7listener","org":"openmrs","targetOrg":"openmrs"},{"source":"rgrta","label":"Rgrta","target":"chirdlutil","org":"openmrs","targetOrg":"openmrs"},{"source":"sockethl7listener","label":"sockethl7listener","target":"chirdlutil","org":"openmrs","targetOrg":"openmrs"},{"source":"sockethl7listener","label":"sockethl7listener","target":"chirdlutilbackports","org":"openmrs","targetOrg":"openmrs"},{"source":"tbla","label":"TB in LA","target":"mrngen","org":"openmrs","targetOrg":"openmrs"},{"source":"tracnetreport","label":"TRACNet Report","target":"reporting","org":"openmrs","targetOrg":"openmrs"},{"source":"tracnetreport","label":"TRACNet Report","target":"sdmxhdintegration","org":"openmrs","targetOrg":"Not Found"},{"source":"tracnetreport","label":"TRACNet Report","target":"tracnetreporting","org":"openmrs","targetOrg":"Not Found"},{"source":"ui.springmvc","label":"Spring MVC UI Framework","target":"htmlwidgets","org":"openmrs","targetOrg":"openmrs"},{"source":"ui.springmvc","label":"Spring MVC UI Framework","target":"htmlformentry","org":"openmrs","targetOrg":"openmrs"}];
var TRANSITION_DURATION = 150;
var HIGHLIGHT_COLOR = "#FF4";
var IN_COLOR = "darkblue";
var OUT_COLOR = "red";
var DEFAULT_STROKE = "#666"
var nodes = {};
var orgs = {};
// Compute the distinct nodes from the links.
links.forEach(function(link) {
link.source = nodes[link.source] || (nodes[link.source] = {name: link.source});
link.target = nodes[link.target] || (nodes[link.target] = {name: link.target});
link.source.label = link.label;
link.source.org = link.org;
link.target.ins = link.target.ins + 1 || 1;
link.target.org = link.targetOrg;
// add source and target orgs to orgs object
if (orgs[link.org] == null) { orgs[link.org] = { org: link.org }; }
orgs[link.org].count = orgs[link.org].count + 1 || 1;
if (orgs[link.targetOrg] == null) { orgs[link.targetOrg] = { org: link.targetOrg }; }
orgs[link.targetOrg].count = orgs[link.targetOrg].count + 1 || 1;
});
// convert orgs to an array of objects
var orgArray = [];
var others = 0;
for (var k in orgs) {
// ignore orgs with just one repo
if (orgs[k].count > 1)
orgArray.push(orgs[k]);
else
others++;
}
// sort to put largest at top
orgArray.sort(function(a,b){
return b.count - a.count;
});
// add the catch-all at the bottomn
// orgArray.push({ org: "Other", count: others });
// generate a color scale based on count
var colorscale = d3.scale.linear()
// .domain([2, orgArray[0].count])
.domain([0, orgArray.length/2, orgArray.length])
.interpolate(d3.interpolateRgb)
.range(["#3D89E3", "#CF826D", "#BAA860"]);
// used to return a color based on org name
function colorize(org) {
// return colorscale(orgs[org].count);
for (i=0; i<orgArray.length; i++) {
if (orgArray[i].org == org) {
return colorscale(i);
}
}
}
// dynamically set width and height based on viewport
var width = $("#chart").width() - 20, height = $(document).height() - 50;
// force directed graph settings
var force = d3.layout.force()
.nodes(d3.values(nodes))
.links(links)
.size([width, height])
.linkDistance(120)
.charge(-250)
.on("tick", tick).start();
var svg = d3.select("#chart")
.append("svg")
.attr("width", width)
.attr("height", height)
.append("g")
.call(d3.behavior.zoom().on("zoom", redraw))
.append("g");
// for zooming
var baseplane = svg.append('svg:rect')
.attr('width', width)
.attr('height', height)
.attr('fill', 'white')
.on('click', resetGraph);
var chart = svg.append("g");
// Per-type markers, as they don't inherit styles.
chart.append("defs").selectAll("marker")
.data(["in", "out", "normal"])
.enter()
.append("marker")
.attr("id", function(d) { return d; })
.attr("viewBox", "0 0 6 6")
.attr("refX", 9)
.attr("refY", 3)
.attr("markerWidth", 7)
.attr("markerHeight", 7)
.attr("orient", "auto")
.append("path")
.classed("marker", true)
.style("stroke-width", 0)
.style("opacity", 1)
.attr("d", "M0,3v-3l6,3l-6,3z");
// arrow ends
var path = chart.append("g").selectAll("path")
.data(force.links())
.enter()
.append("path")
.attr("class", function(d) { return "link " + d.org; })
.attr("source", function(d) { return d.source.name; })
.attr("target", function(d) { return d.target.name; })
.style("marker-end", "url(#normal)");
// nodes
var circle = chart.append("g").selectAll("circle")
.data(force.nodes())
.enter()
.append("circle")
.attr("r", function(d){ return d.ins * 0.5 + 4 || 4; })
.attr("source", function(d){ return d.name; })
.attr("org", function(d){ return d.org; })
.style("fill", function(d, i){ return colorize(d.org); })
.style("stroke-width", "0")
.style("stroke", DEFAULT_STROKE)
// .on('mouseover', function(d, i) { transitionIn(d.org); })
// .on('mouseout', function(d, i) { transitionOut(); })
.on('click', function(d) { showPaths(d.name); })
.call(force.drag);
// node labels
var text = chart.append("g").selectAll("text")
.data(force.nodes())
.enter()
.append("text")
.attr("x", 8)
.attr("y", ".31em")
.attr("source", function(d){ return d.name; })
.style("font-size", function(d){ return (d.ins * 0.5 + 8 || 8) + "px"; })
.text(function(d) { return d.label || d.name; });
// legend
var legendHeight = 20;
var legendGap = 5;
var legendTextHeight = 10;
var legend = svg.append("g")
.attr("class", "legend");
// legend blocks
legend.selectAll("rect")
.data(orgArray)
.enter()
.append("rect")
.attr("x", 0)
.attr("y", function(d, i){ return (legendGap + legendHeight) * i; })
.attr("width", 100)
.attr("height", legendHeight)
.attr("org", function(d) { return d.org; })
.style("fill", function(d, i) { return colorize(d.org); })
.on('mouseover', function(d, i) { transitionIn(d.org); })
.on('mouseout', function(d, i) { transitionOut(); });
// legend labels
legend.selectAll("text")
.data(orgArray)
.enter()
.append("text")
.attr("x", 5)
.attr("y", function(d, i){ return (legendHeight / 2) + 3 + (legendGap + legendHeight) * i; })
.attr("org", function(d){ return d.org; })
.style("font-size", legendTextHeight + "px")
.style("text-shadow", "none")
.style("font-weight", "bold")
.style("font-color", "white")
.text(function(d) { return d.org; });
// Use elliptical arc path segments to doubly-encode directionality.
function tick() {
path.attr("d", linkArc);
circle.attr("transform", transform);
text.attr("transform", transform);
}
function linkArc(d) {
var dx = d.target.x - d.source.x, dy = d.target.y - d.source.y, dr = Math.sqrt(dx * dx + dy * dy);
return "M" + d.source.x + "," + d.source.y + "A" + dr + "," + dr + " 0 0,1 " + d.target.x + "," + d.target.y;
}
function transform(d) {
return "translate(" + d.x + "," + d.y + ")";
}
function redraw() {
chart.attr("transform", "translate(" + d3.event.translate + ") scale(" + d3.event.scale + ")");
}
function transitionIn(org) {
d3.select(".legend rect[org='" + org + "']")
.classed("hover", true)
.transition()
.duration(TRANSITION_DURATION)
.style("fill", HIGHLIGHT_COLOR);
d3.selectAll("circle[org='" + org + "']")
.classed("hover", true)
.transition()
.duration(TRANSITION_DURATION)
.attr("r", 30)
.style("stroke-width", "1")
.style("stroke", HIGHLIGHT_COLOR);
}
function transitionOut() {
d3.selectAll(".legend rect")
.classed("hover", false)
.transition()
.duration(TRANSITION_DURATION)
.style("fill", function (d, i) { return colorize(d.org); });
d3.selectAll("circle")
.classed("hover", false)
.transition()
.duration(TRANSITION_DURATION)
.attr("r", function(d){ return d.ins * 0.5 + 4 || 4; })
.style("stroke-width", 0)
.style("stroke", DEFAULT_STROKE);
}
function showPaths(x) {
resetGraph();
// mark this node as selected
d3.selectAll("circle[source='" + x + "']")
.classed("selected", true)
.classed("lit", true)
.style("fill", HIGHLIGHT_COLOR)
.style("opacity", "1");
showDependencies(x);
showDependenciesOn(x);
killEverythingElse();
// re-light the markers ...
d3.selectAll("path.marker")
.style("opacity", 1);
}
function killEverythingElse() {
// kill the paths
d3.selectAll("path:not(.lit)")
.style("stroke", DEFAULT_STROKE)
.style("opacity", "0.25")
.style("marker-end", "url(#normal)");
// kill the circles
d3.selectAll("circle:not(.lit)")
.classed("selected", false)
.style("opacity", "0.25")
.style("fill", function(d, i){ colorize(d.org); });
// kill the texts
d3.selectAll("text:not(.lit)")
.classed("selected", false)
.style("opacity", "0.25");
// kill the legend
d3.selectAll(".legend rect:not(.lit), .legend text:not(.lit)")
.transition()
.duration(TRANSITION_DURATION)
.style("opacity", "0.25");
}
function showDependencies(source) {
d3.selectAll("circle[source='" + source + "']:not(.selected)")
.classed("lit", true)
.transition()
.duration(TRANSITION_DURATION)
.style("fill", OUT_COLOR)
.style("opacity", "1");
d3.selectAll("text[source='" + source + "']")
.classed("lit", true)
.transition()
.duration(TRANSITION_DURATION)
.style("opacity", "1");
d3.selectAll("path[source='" + source + "']")
.classed("lit", true)
.transition()
.duration(TRANSITION_DURATION)
.style("marker-end", "url(#out)")
.style("stroke", OUT_COLOR)
.style("opacity", "1")
.call(showDependenciesForPath);
}
function showDependenciesForPath(path) {
if (path != null) {
path.each(function(p) {
lightUpLegendFor(p.source.org);
lightUpLegendFor(p.target.org);
showDependencies(p.target.name);
});
}
}
function showDependenciesOn(target) {
d3.selectAll("path[target='" + target + "']")
.classed("lit", true)
.transition()
.duration(TRANSITION_DURATION)
.style("marker-end", "url(#in)")
.style("stroke", IN_COLOR)
.style("opacity", 1)
.call(showTargetNodesForPath);
}
function showTargetNodesForPath(path) {
if (path != null) {
path.each(function(p) {
d3.selectAll("circle[source='" + p.source.name + "']")
.classed("lit", true)
.transition()
.duration(TRANSITION_DURATION)
.style("fill", IN_COLOR)
.style("opacity", "1");
d3.selectAll("text[source='" + p.source.name + "']")
.classed("lit", true)
.transition()
.duration(TRANSITION_DURATION)
.style("opacity", "1");
lightUpLegendFor(p.source.org);
lightUpLegendFor(p.target.org);
});
}
}
function lightUpLegendFor(org) {
d3.selectAll("rect[org='" + org + "'], text[org='" + org + "']")
.classed("lit", true)
.transition()
.duration(TRANSITION_DURATION)
.style("opacity", "1");
}
function resetGraph(){
d3.selectAll("rect, circle, path, text")
.classed("lit", false)
.classed("selected", false)
// .transition()
// .duration(TRANSITION_DURATION)
.style("opacity", 1);
d3.selectAll("path")
.style("stroke", DEFAULT_STROKE)
.style("marker-end", "url(#normal)");
d3.selectAll("circle")
.style("fill", function(d, i){ return colorize(d.org); })
}
</script>
</body>
import groovy.json.*
// prepare ourselves for ssl errors
System.setProperty("jsse.enableSNIExtension", "false");
def slurper = new JsonSlurper()
data = slurper.parseText(new File("github-modules.json").text).items
out = []
def plethora = [:]
println "github ..."
data.each{
baseurl = "https://raw.githubusercontent.com/" + [it.full_name, it.master_branch].join("/")
pomurl = baseurl + "/pom.xml"
configurl = baseurl + "/omod/src/main/resources/config.xml"
anturl = baseurl + "/metadata/config.xml"
pom = null
config = null
// first, try to get maven-based files
try {
pom = new XmlSlurper().parseText(pomurl.toURL().text)
config = new XmlSlurper().parseText(configurl.toURL().text)
} catch(e) {
print "not a maven project ... "
// now, try to get ant-based files
try {
config = new XmlSlurper().parseText(anturl.toURL().text)
println "success!"
} catch(x) {
println "couldn't do it ... " + it.full_name
}
}
if (config) {
id = pom ? "${pom.artifactId}" : "${config.id}"
name = pom ? "${pom.name}" : "${config.name}"
module = [ artifact: id, name: name, org: "${it.owner.login}", forks: it.forks_count ]
module.required = config.require_modules.children().collect({
it.text().replaceAll("org.openmrs.module.", "").trim().replaceAll("\n", "").replaceAll("\t", "")
})
if (plethora[module.artifact] == null || plethora[module.artifact].forks < module.forks) {
plethora[module.artifact] = module
}
}
}
// and now for the subversion repositories ...
println "subversion ... "
svnrepos = ["abandoned", "amrspharmacy", "amrsreporttools", "archetypes", "atd", "atomfeed", "backports14x", "basicmodule", "billing", "bloodbank", "cardiologyreporting", "chica", "chicaops", "childvctreport", "chirdlutil", "chirdlutilbackports", "chwdashboard", "cleaningvoided", "clinicalsummary", "cohortcreation", "cohortreports", "comparelists", "conceptimportexport", "conceptproposal", "databasebackup", "databasemessages", "datadeletion", "dataentrystatistics", "dataqualitytools", "datasetbuilder", "dduipd", "ddupatientdashboard", "ddupatientqueue", "ddurks", "devexamples", "dhisconnector", "diabetesmanagement", "doonoutpatient", "doonpatientsummary", "doubleentryreconciliation", "draftforms", "drugrequirements", "dss", "encounterattribute", "epihandy", "exceldataimport", "exportccd", "exporttocsvexample", "ezvacimmunization", "flashmediaviewer", "flowsheet", "foodprogram", "form2program", "formcompletion", "formdataexport", "formimportexport", "frontlinesmsmedic", "globalpropertyeditor", "gmapsimageviewer", "groovyforms", "growthchart", "helloworld", "hivtreamentfailure", "hospitalcore", "hr", "htmlformentrydesigner", "i2b2export", "idcards", "idgenws", "imageimport", "inpatientcare", "inventory", "jasperreport", "jsslab", "kettle", "labentry", "labsconnector", "ldap", "logic", "logicws", "longitudinaldataviewer", "mailscheduler", "mdrtb", "mdrtbpatientchartwidgets", "medicalproblem", "mentalhealth", "metadata", "mflgenerator", "mirthadmin", "mirthmessaging", "mrngen", "msf", "namibiadefense", "nbs", "ncd", "nealreporting", "nutrition", "obsgroupexport", "obstostate", "occmodule", "odamocklogicws", "openempi", "orderentry", "patientchartwidgets", "patientdatatransfer", "patientimage", "patientlookup", "patientnotes", "patientsearchbycohortdef", "patientsearchformlinks", "patientvisitscheduler", "pearlgrlz", "personportrait", "perufitnessstudy", "pharmacydataexport", "pihconsultsheet", "pihhacks", "pihhaiti", "pihlesothotbupload", "piht1000patientdataexport", "pixpdq", "portletlibrary", "printing", "programoverview", "quickstats", "radiology", "randomization", "raxa-jss", "regadbintegration", "regimen", "regimenpickup", "regimenreporting", "register", "registration", "releasetestinghelper", "remarks", "reminders", "remotedatatransfer", "remoteregistration", "reporttemplate", "requestaccount", "researchdataexport", "researchencounters", "restrictbyrole", "restrictencounterbyrole", "rgccd", "rgrta", "rolebasedhomepage", "rwandaprimarycare", "schedulerquartz", "search", "searchkeylogging", "sharemetadata", "simpledispensing", "simplefinance", "simplepharmacy", "siteolympics", "smartcontainer", "smsserver", "sockethl7listener", "specimentracking", "spreadsheetupload", "stat", "stateprocessing", "syncsds", "tbla", "touchscreen", "tracnetreport", "tracplus", "tsb", "ui.springmvc", "versionedfileupload", "visitmanagement", "visitregister", "visitscheduler", "whomod", "xformsdesigner", "xformsorbeon"];
svnrepos.each {
baseurl = "https://svn.openmrs.org/openmrs-modules/" + it
hastrunk = false
try {
ack = (baseurl + "/trunk/").toURL().text
hastrunk = true
} catch(x) {
// pass
}
if (hastrunk) {
baseurl += "/trunk"
}
pomurl = baseurl + "/pom.xml"
configurl = baseurl + "/omod/src/main/resources/config.xml"
anturl = baseurl + "/metadata/config.xml"
pom = null
config = null
try {
pom = new XmlSlurper().parseText(pomurl.toURL().text)
config = new XmlSlurper().parseText(configurl.toURL().text)
} catch(e) {
print "not a maven project ... "
// now, try to get ant-based files
try {
config = new XmlSlurper().parseText(anturl.toURL().text)
println "success!"
} catch(x) {
println "couldn't do it ... " + it
}
}
if (config) {
id = pom ? "${pom.artifactId}" : "${config.id}"
name = pom ? "${pom.name}" : "${config.name}"
module = [ artifact: id, name: name, org: "openmrs", forks: 999 ]
module.required = config.require_modules.children().collect({
it.text().replaceAll("org.openmrs.module.", "").trim().replaceAll("\n", "").replaceAll("\t", "")
})
if (plethora[module.artifact] == null || plethora[module.artifact].forks < module.forks) {
plethora[module.artifact] = module
}
}
}
plethora.each {
module, props ->
props.required.each {
requiredModule ->
rm = plethora.get(requiredModule)
targetOrg = rm ? rm.org : "Not Found"
out.add([ source: "${props.artifact}", label: "${props.name}", target: "${requiredModule}", org: "${props.org}", targetOrg: "${targetOrg}" ])
}
}
new File("vizdata.json").write(new JsonBuilder(out).toString())
out = [];
$("div .module").each(function(){
if ($(this).find("a.migrated").length == 0) {
out.push($(this).find("a").attr("href"));
}
});
$("body").append("div").text(out);
console.log(out);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment