...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
Introduction
OpenSpecimen allows to configure graphical dashboards with various counters and graphs. This helps users to get a summary view of the data collected for the protocol. A default dashboard is shipped with OpenSpecimen which is set for all protocols. But users can change this to update the dashlets as per requirement. Dashboard feature is available as an enterprise plugin.
...
URL: http[s]:<host>:<port>/openspecimen/rest/ng/dashlet-configs
URL | http://<host>:<port>/ openspecimen/rest/ng/dashlet-configs |
Method | POST |
Request | application/json |
Example json for Metric | Dashlet to include metric : Count of completed visits Code Block |
---|
| {
"name":"visit_count",
"title":"Visits",
"type":"COUNTER",
"dataSource":{
"options":{
"criteria":" SpecimenCollectionGroup.activityStatus = \"Active\" and SpecimenCollectionGroup.collectionStatus = \"Complete\" and Specimen.collectionStatus = \"Collected\" ",
"metric":{
"expr":"count(distinct SpecimenCollectionGroup.name)",
"title":"Visits"
}
},
"type":"AQL"
},
"chartOpts":{},
"activityStatus":"Active"
} |
|
Example json for graph | Dashlet to include graph : Available aliquots by type Code Block |
---|
| {
"name": "dash_1_20161215_0251537",
"title": "Available aliquots by type",
"type": "CHART",
"dataSource": {
"options": {
"criteria": " Specimen.collectionStatus = \"Collected\" and Specimen.lineage = \"Aliquot\" and Specimen.specimenPosition.containerName exists ",
"metric": {
"expr": "count(distinct Specimen.id)",
"title": "Aliquots"
},
"category": {
"expr": "Specimen.type",
"title": "Type"
}
},
"type": "AQL"
},
"chartOpts": {
"type": "Pie"
},
"activityStatus": "Active"
} |
|
Example JSON for SQL based count dashlet |
Code Block |
---|
| {
"name": "dash-sys-active-dps",
"title": "Distribution Protocols",
"type": "COUNTER",
"dataSource": {
"type":"SQL",
"options": {
"metrics": [{"columnIndex": 0,"title": "Active Distribution Protocols"}],
"sql": "select count(dp.identifier) from catissue_distribution_protocol dp where dp.activity_status = 'Active'"
}
},
"chartOpts": {},
"activityStatus": "Active"
} |
|
Example JSON for SQL based graph dashlet |
Code Block |
---|
| {
"name": "specimensByAnatomicSiteGroup",
"title": "Collected specimens by anatomic site group",
"type": "CHART",
"dataSource": {
"type":"SQL",
"options": {
"category": {"columnIndex":0,"title":"Anatomic Site"},
"metrics":[{"columnIndex":1,"title":"Collected Specimens"}],
"sql": "select a.value, count(s.identifier) from catissue_specimen s inner join catissue_collection_protocol cp on cp.identifier = s.collection_protocol_id inner join catissue_permissible_value pv on pv.value = s.tissue_site inner join os_pvs_hierarchy h on h.descendant_id = pv.identifier inner join catissue_permissible_value a on a.identifier = h.ancestor_id where %sql_cp_restriction% and (a.parent_identifier is null and s.collection_status = 'Collected' and s.lineage = 'Aliquot' and s.available_quantity > 0 and pv.public_id = 'anatomic_site' and a.public_id = 'anatomic_site' and s.activity_status != 'Disabled') group by a.value order by count(s.identifier) desc",
"restrictionOpts":{"type":"sql_cp_restriction","opts":{"cpIdExpr":"cp.identifier"}}
}
},
"chartOpts": {"type":"Pie","showSectionValuePct":true},
"activityStatus": "Active"
} |
columnIndex in category and metrics specify what column of SQL result set should be used. In above example, first column of result set (i.e. columnIndex: 0) is used to create categories and second column of result set is used to show the count of each category. |
...
URL | http://<host>:<port>/ openspecimen/rest/ng/dashboards/{dashboardId} |
Method | PUT |
Request | application/json |
Example json |
Code Block |
---|
| {
"view": "CollectionProtocol",
"viewParams": {
"cpId": "-1"
},
"dashlets": [
{
"config": {
"name": "dash-sys-participants"
},
"sortOrder": 1
},
{
"config": {
"name": "visit_count"
},
"sortOrder": 2
},
{
"config": {
"name": "dash_1_20161214_0406950"
},
"sortOrder": 3
},
{
"config": {
"name": "dash_1_20161214_0357273"
},
"sortOrder": 4
},
{
"config": {
"name": "dash_1_20161215_0251537"
},
"sortOrder": 5
},
{
"config": {
"name": "dash-spmns-by-anatomic"
},
"sortOrder": 6
},
{
"config": {
"name": "dash-sys-coll-dist"
},
"sortOrder": 7
},
{
"config": {
"name": "dash-sys-coll-dist-yr"
},
"sortOrder": 8
},
{
"config": {
"name": "dash-spmns-by-path"
},
"sortOrder": 9
}
],
"activityStatus": "Active"
} |
|
...