Skip to content

Commit 317ce54

Browse files
authored
Refactor TabbedReport to allow a distributed provider model (#338)
* Refactor TabbedReport to allow a distributed provider model * Allow admin to turn tabbed report filter types on/off
1 parent f68bc4b commit 317ce54

File tree

5 files changed

+212
-9
lines changed

5 files changed

+212
-9
lines changed

SequenceAnalysis/src/org/labkey/sequenceanalysis/SequenceProvider.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -236,17 +236,17 @@ public List<TabbedReportItem> getTabbedReportItems(Container c, User u)
236236
TabbedReportItem analyses = new QueryTabbedReportItem(cache, this, SequenceAnalysisSchema.SCHEMA_NAME, SequenceAnalysisSchema.TABLE_ANALYSES, "Sequence Analyses", category);
237237
analyses.setSubjectIdFieldKey(FieldKey.fromString("readset/subjectid"));
238238
analyses.setSampleDateFieldKey(FieldKey.fromString("readset/sampledate"));
239-
analyses.setAllProjectsFieldKey(FieldKey.fromString("readset/allProjectsPivot"));
240-
analyses.setOverlappingProjectsFieldKey(FieldKey.fromString("readset/overlappingProjectsPivot"));
239+
analyses.setKeyOverride("allProjectsFieldName", FieldKey.fromString("readset/allProjectsPivot"));
240+
analyses.setKeyOverride("overlappingProjectsFieldName", FieldKey.fromString("readset/overlappingProjectsPivot"));
241241
analyses.setOwnerKey(owner.getPropertyManagerKey());
242242
analyses.setVisible(owner.isVisible(c, u));
243243
items.add(analyses);
244244

245245
TabbedReportItem outputs = new QueryTabbedReportItem(cache, this, SequenceAnalysisSchema.SCHEMA_NAME, SequenceAnalysisSchema.TABLE_OUTPUTFILES, "Sequence Outputs", category);
246246
outputs.setSubjectIdFieldKey(FieldKey.fromString("readset/subjectid"));
247247
outputs.setSampleDateFieldKey(FieldKey.fromString("readset/sampledate"));
248-
outputs.setAllProjectsFieldKey(FieldKey.fromString("readset/allProjectsPivot"));
249-
outputs.setOverlappingProjectsFieldKey(FieldKey.fromString("readset/overlappingProjectsPivot"));
248+
outputs.setKeyOverride("allProjectsFieldName", FieldKey.fromString("readset/allProjectsPivot"));
249+
outputs.setKeyOverride("overlappingProjectsFieldName", FieldKey.fromString("readset/overlappingProjectsPivot"));
250250
outputs.setOwnerKey(owner.getPropertyManagerKey());
251251
outputs.setVisible(owner.isVisible(c, u));
252252
items.add(outputs);
Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
Ext4.define('Laboratory.panel.StudiesFilterType', {
2+
extend: 'LDK.panel.AbstractFilterType',
3+
alias: 'widget.studies-filtertype',
4+
5+
statics: {
6+
filterName: 'study',
7+
label: 'Studies'
8+
},
9+
10+
initComponent: function(){
11+
this.items = this.getItems();
12+
13+
this.callParent();
14+
},
15+
16+
getItems: function(){
17+
var ctx = this.filterContext;
18+
var toAdd = [];
19+
20+
toAdd.push({
21+
width: 200,
22+
html: 'Choose Study:',
23+
style: 'margin-bottom:10px'
24+
});
25+
26+
toAdd.push({
27+
xtype: 'panel',
28+
items: [{
29+
xtype: 'combo',
30+
width: 265,
31+
itemId: 'studyField',
32+
displayField: 'studyName',
33+
valueField: 'studyName',
34+
multiSelect: false,
35+
store: {
36+
type: 'labkey-store',
37+
schemaName: 'studies',
38+
queryName: 'studies',
39+
autoLoad: true
40+
},
41+
value: Ext4.isArray(ctx.studies) ? ctx.studies.join(';') : ctx.studies
42+
}]
43+
});
44+
45+
return toAdd;
46+
},
47+
48+
getFilters: function(){
49+
return {
50+
studies: this.getStudies()
51+
}
52+
},
53+
54+
getFilterArray: function(tab){
55+
var filterArray = {
56+
removable: [],
57+
nonRemovable: []
58+
};
59+
60+
if (this.reportQCStates?.length) {
61+
filterArray.nonRemovable.push(LABKEY.Filter.create('qcstate/label', this.reportQCStates, LABKEY.Filter.Types.EQUALS_ONE_OF));
62+
}
63+
64+
var filters = this.getFilters();
65+
var report = tab.report;
66+
var studyFieldName = report.additionalFieldKeys?.studyAssignmentFieldKey;
67+
if (!studyFieldName){
68+
LDK.Utils.logToServer({
69+
message: 'A TabbedReport is attempting to load a study filter when it should have been stopped upstream',
70+
level: 'ERROR',
71+
includeContext: true
72+
});
73+
74+
return filterArray;
75+
}
76+
77+
var studyName = filters.studies[0];
78+
filterArray.nonRemovable.push(LABKEY.Filter.create(studyFieldName, studyName, LABKEY.Filter.Types.CONTAINS));
79+
80+
return filterArray;
81+
},
82+
83+
isValid: function(){
84+
var val = this.down('#studyField').getValue();
85+
if (!val || !val.length){
86+
return false;
87+
}
88+
89+
return true;
90+
},
91+
92+
getFilterInvalidMessage: function(){
93+
return 'Error: Must choose a study';
94+
},
95+
96+
validateReportForFilterType: function(report){
97+
if (!report.additionalFieldKeys?.studyAssignmentFieldKey){
98+
return 'This report cannot be used with the selected filter type, because the report does not contain a field with study assignment information';
99+
}
100+
101+
return null;
102+
},
103+
104+
getTitle: function(){
105+
var studies = this.getStudies();
106+
107+
if (studies && studies.length){
108+
return studies.join(', ');
109+
}
110+
111+
return '';
112+
},
113+
114+
getStudies: function(){
115+
var projectArray = this.down('#studyField').getValue();
116+
if (projectArray && !Ext4.isArray(projectArray)) {
117+
projectArray = [projectArray];
118+
}
119+
120+
if (projectArray && projectArray.length > 0){
121+
projectArray = Ext4.unique(projectArray);
122+
projectArray.sort();
123+
}
124+
125+
return projectArray;
126+
}
127+
});

Studies/src/org/labkey/studies/StudiesModule.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,17 @@
33
import org.jetbrains.annotations.NotNull;
44
import org.jetbrains.annotations.Nullable;
55
import org.labkey.api.data.Container;
6+
import org.labkey.api.laboratory.LaboratoryService;
67
import org.labkey.api.ldk.ExtendedSimpleModule;
78
import org.labkey.api.module.Module;
89
import org.labkey.api.module.ModuleContext;
910
import org.labkey.api.query.DefaultSchema;
1011
import org.labkey.api.query.QuerySchema;
1112
import org.labkey.api.security.roles.RoleManager;
1213
import org.labkey.api.studies.StudiesService;
13-
import org.labkey.studies.query.StudiesUserSchema;
1414
import org.labkey.api.studies.security.StudiesDataAdminRole;
15+
import org.labkey.studies.query.StudiesUserSchema;
16+
import org.labkey.studies.study.StudiesFilterProvider;
1517
import org.labkey.studies.study.StudyEnrollmentEventProvider;
1618

1719
import java.util.Collection;
@@ -42,6 +44,7 @@ protected void init()
4244
StudiesService.setInstance(StudiesServiceImpl.get());
4345
StudiesService.get().registerEventProvider(new StudyEnrollmentEventProvider());
4446
RoleManager.registerRole(new StudiesDataAdminRole());
47+
LaboratoryService.get().registerTabbedReportFilterProvider(new StudiesFilterProvider());
4548
}
4649

4750
@Override
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
package org.labkey.studies.study;
2+
3+
import org.jetbrains.annotations.NotNull;
4+
import org.labkey.api.data.ColumnInfo;
5+
import org.labkey.api.data.TableInfo;
6+
import org.labkey.api.laboratory.TabbedReportItem;
7+
import org.labkey.api.laboratory.query.TabbedReportFilterProvider;
8+
import org.labkey.api.module.Module;
9+
import org.labkey.api.module.ModuleLoader;
10+
import org.labkey.api.query.FieldKey;
11+
import org.labkey.api.util.PageFlowUtil;
12+
import org.labkey.api.view.template.ClientDependency;
13+
import org.labkey.studies.StudiesModule;
14+
15+
import java.util.Collection;
16+
import java.util.HashMap;
17+
import java.util.List;
18+
import java.util.Map;
19+
20+
public class StudiesFilterProvider implements TabbedReportFilterProvider
21+
{
22+
@Override
23+
public Module getOwningModule()
24+
{
25+
return ModuleLoader.getInstance().getModule(StudiesModule.class);
26+
}
27+
28+
@Override
29+
public Collection<ClientDependency> getClientDependencies()
30+
{
31+
return List.of(ClientDependency.fromPath("studies/panel/StudiesFilterType.js"));
32+
}
33+
34+
@Override
35+
public String getXType()
36+
{
37+
return "studies-filtertype";
38+
}
39+
40+
@Override
41+
public String getLabel()
42+
{
43+
return "Study";
44+
}
45+
46+
@Override
47+
public String getInputValue()
48+
{
49+
return "studies";
50+
}
51+
52+
@Override
53+
public @NotNull Map<String, FieldKey> getAdditionalFieldKeys(TableInfo ti, TabbedReportItem tri, Map<String, FieldKey> overrides)
54+
{
55+
Map<String, FieldKey> ret = new HashMap<>();
56+
57+
if (overrides.get("studyAssignmentFieldKey") == null)
58+
{
59+
FieldKey subject = tri.getSubjectIdFieldKey();
60+
if (subject != null)
61+
{
62+
subject = subject.getParent();
63+
}
64+
65+
FieldKey fk = FieldKey.fromString(subject, "projects/allStudies");
66+
Map<FieldKey, ColumnInfo> colMap = tri.getQueryCache().getColumns(ti, PageFlowUtil.set(fk));
67+
if (colMap.containsKey(fk))
68+
ret.put("studyAssignmentFieldKey", colMap.get(fk).getFieldKey());
69+
}
70+
71+
return ret;
72+
}
73+
}

singlecell/src/org/labkey/singlecell/SingleCellProvider.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -173,15 +173,15 @@ public List<TabbedReportItem> getTabbedReportItems(Container c, User u)
173173
TabbedReportItem sorts = new QueryTabbedReportItem(cache, this, SingleCellSchema.NAME, SingleCellSchema.TABLE_SORTS, "Single Cell Sorts", category);
174174
sorts.setSubjectIdFieldKey(FieldKey.fromString("sampleId/subjectId"));
175175
sorts.setSampleDateFieldKey(FieldKey.fromString("sampleId/date"));
176-
sorts.setAllProjectsFieldKey(FieldKey.fromString("sampleId/allProjectsPivot"));
177-
sorts.setOverlappingProjectsFieldKey(FieldKey.fromString("sampleId/overlappingProjectsPivot"));
176+
sorts.setKeyOverride("allProjectsFieldName", FieldKey.fromString("sampleId/allProjectsPivot"));
177+
sorts.setKeyOverride("overlappingProjectsFieldName", FieldKey.fromString("sampleId/overlappingProjectsPivot"));
178178
items.add(sorts);
179179

180180
TabbedReportItem cdnas = new QueryTabbedReportItem(cache, this, SingleCellSchema.NAME, SingleCellSchema.TABLE_CDNAS, "Single Cell Libraries", category);
181181
cdnas.setSubjectIdFieldKey(FieldKey.fromString("sortId/sampleId/subjectId"));
182182
cdnas.setSampleDateFieldKey(FieldKey.fromString("sortId/sampleId/date"));
183-
cdnas.setAllProjectsFieldKey(FieldKey.fromString("sortId/sampleId/allProjectsPivot"));
184-
cdnas.setOverlappingProjectsFieldKey(FieldKey.fromString("sortId/sampleId/overlappingProjectsPivot"));
183+
cdnas.setKeyOverride("allProjectsFieldName", FieldKey.fromString("sortId/sampleId/allProjectsPivot"));
184+
cdnas.setKeyOverride("overlappingProjectsFieldName", FieldKey.fromString("sortId/sampleId/overlappingProjectsPivot"));
185185
items.add(cdnas);
186186

187187
return items;

0 commit comments

Comments
 (0)