diff --git a/viscstudies/resources/views/migrateStudyDesigns.html b/viscstudies/resources/views/migrateStudyDesigns.html deleted file mode 100644 index 6f0e4741..00000000 --- a/viscstudies/resources/views/migrateStudyDesigns.html +++ /dev/null @@ -1,1062 +0,0 @@ - - -
Each of the following studies has an XML study design. Those marked '[already done]' have already been migrated or already - have data in study design tables, such as Treatment, Product or Personnel. Clicking 'Migrate' will migrate those not yet migrated.
-
- - \ No newline at end of file diff --git a/viscstudies/resources/views/migrateStudyDesigns.view.xml b/viscstudies/resources/views/migrateStudyDesigns.view.xml deleted file mode 100644 index f05eef82..00000000 --- a/viscstudies/resources/views/migrateStudyDesigns.view.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/viscstudies/resources/views/studydesigns.html b/viscstudies/resources/views/studydesigns.html deleted file mode 100644 index f8f2c41a..00000000 --- a/viscstudies/resources/views/studydesigns.html +++ /dev/null @@ -1,10 +0,0 @@ - -
Export Vaccination Info
- -
- -
\ No newline at end of file diff --git a/viscstudies/resources/views/studydesigns.view.xml b/viscstudies/resources/views/studydesigns.view.xml deleted file mode 100644 index b4422da3..00000000 --- a/viscstudies/resources/views/studydesigns.view.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/viscstudies/resources/views/updateStudyProperties.html b/viscstudies/resources/views/updateStudyProperties.html deleted file mode 100644 index 9227146d..00000000 --- a/viscstudies/resources/views/updateStudyProperties.html +++ /dev/null @@ -1,95 +0,0 @@ - -
- \ No newline at end of file diff --git a/viscstudies/resources/views/updateStudyProperties.view.xml b/viscstudies/resources/views/updateStudyProperties.view.xml deleted file mode 100644 index 6894769d..00000000 --- a/viscstudies/resources/views/updateStudyProperties.view.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/viscstudies/src/org/labkey/viscstudies/StudyDesignTable.java b/viscstudies/src/org/labkey/viscstudies/StudyDesignTable.java new file mode 100644 index 00000000..65ac173c --- /dev/null +++ b/viscstudies/src/org/labkey/viscstudies/StudyDesignTable.java @@ -0,0 +1,29 @@ +package org.labkey.viscstudies; + +import org.labkey.api.data.ColumnInfo; +import org.labkey.api.data.ContainerFilter; +import org.labkey.api.data.ContainerForeignKey; +import org.labkey.api.data.DbSchema; +import org.labkey.api.data.DbSchemaType; +import org.labkey.api.query.FilteredTable; + +import static org.labkey.viscstudies.ViscStudySchema.STUDY_DESIGN_TABLE_NAME; + +public class StudyDesignTable extends FilteredTable +{ + public StudyDesignTable(ViscStudySchema schema, ContainerFilter cf) + { + super(DbSchema.get("study", DbSchemaType.Module).getTable(STUDY_DESIGN_TABLE_NAME), schema, null); + setName(STUDY_DESIGN_TABLE_NAME); + for (ColumnInfo baseColumn : _rootTable.getColumns()) + { + String name = baseColumn.getName(); + + var colInfo = addWrapColumn(baseColumn); + if ("Container".equalsIgnoreCase(name) || "_ts".equalsIgnoreCase(name)) + colInfo.setHidden(true); + } + + getMutableColumn("Container").setFk(new ContainerForeignKey(schema)); + } +} diff --git a/viscstudies/src/org/labkey/viscstudies/StudyDesignVersionTable.java b/viscstudies/src/org/labkey/viscstudies/StudyDesignVersionTable.java new file mode 100644 index 00000000..1f4ad408 --- /dev/null +++ b/viscstudies/src/org/labkey/viscstudies/StudyDesignVersionTable.java @@ -0,0 +1,29 @@ +package org.labkey.viscstudies; + +import org.labkey.api.data.ColumnInfo; +import org.labkey.api.data.ContainerFilter; +import org.labkey.api.data.ContainerForeignKey; +import org.labkey.api.data.DbSchema; +import org.labkey.api.data.DbSchemaType; +import org.labkey.api.query.FilteredTable; + +import static org.labkey.viscstudies.ViscStudySchema.STUDY_DESIGN_VERSION_TABLE_NAME; + +public class StudyDesignVersionTable extends FilteredTable +{ + public StudyDesignVersionTable(ViscStudySchema schema, ContainerFilter cf) + { + super(DbSchema.get("study", DbSchemaType.Module).getTable(STUDY_DESIGN_VERSION_TABLE_NAME), schema, null); + setName(STUDY_DESIGN_VERSION_TABLE_NAME); + for (ColumnInfo baseColumn : _rootTable.getColumns()) + { + String name = baseColumn.getName(); + + var colInfo = addWrapColumn(baseColumn); + if ("Container".equalsIgnoreCase(name) || "_ts".equalsIgnoreCase(name)) + colInfo.setHidden(true); + } + + getMutableColumn("Container").setFk(new ContainerForeignKey(schema)); + } +} diff --git a/viscstudies/src/org/labkey/viscstudies/ViscStudiesController.java b/viscstudies/src/org/labkey/viscstudies/ViscStudiesController.java deleted file mode 100644 index 5b4b6c92..00000000 --- a/viscstudies/src/org/labkey/viscstudies/ViscStudiesController.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (c) 2011-2019 LabKey Corporation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.labkey.viscstudies; - -import org.labkey.api.action.SimpleRedirectAction; -import org.labkey.api.action.SpringActionController; -import org.labkey.api.security.RequiresPermission; -import org.labkey.api.security.permissions.ReadPermission; -import org.labkey.api.util.URLHelper; -import org.labkey.api.view.ActionURL; -import org.springframework.validation.Errors; - -public class ViscStudiesController extends SpringActionController -{ - private static final DefaultActionResolver _actionResolver = new DefaultActionResolver(ViscStudiesController.class); - - public ViscStudiesController() - { - setActionResolver(_actionResolver); - } - - @RequiresPermission(ReadPermission.class) - public class BeginAction extends SimpleRedirectAction - { - @Override - public URLHelper getRedirectURL(Object o) - { - return new ActionURL("viscstudies", "studydesigns", getContainer()); - } - } -} \ No newline at end of file diff --git a/viscstudies/src/org/labkey/viscstudies/ViscStudiesModule.java b/viscstudies/src/org/labkey/viscstudies/ViscStudiesModule.java index c559f42c..aed9ee67 100644 --- a/viscstudies/src/org/labkey/viscstudies/ViscStudiesModule.java +++ b/viscstudies/src/org/labkey/viscstudies/ViscStudiesModule.java @@ -46,8 +46,6 @@ protected Collection createWebPartFactories() @Override protected void init() { - addController("viscstudies", ViscStudiesController.class); - DefaultSchema.registerProvider(ViscStudySchema.NAME, new DefaultSchema.SchemaProvider(this) { @Override diff --git a/viscstudies/src/org/labkey/viscstudies/ViscStudyFolderTabs.java b/viscstudies/src/org/labkey/viscstudies/ViscStudyFolderTabs.java index 6a9aeb3d..459842de 100644 --- a/viscstudies/src/org/labkey/viscstudies/ViscStudyFolderTabs.java +++ b/viscstudies/src/org/labkey/viscstudies/ViscStudyFolderTabs.java @@ -21,7 +21,6 @@ import org.labkey.api.portal.ProjectUrls; import org.labkey.api.security.User; import org.labkey.api.security.permissions.AdminPermission; -import org.labkey.api.security.permissions.ReadPermission; import org.labkey.api.study.Study; import org.labkey.api.study.StudyService; import org.labkey.api.study.StudyUrls; @@ -56,30 +55,6 @@ public boolean isVisible(Container c, User user) } protected abstract String getPanelName(); - - @Override - public ActionURL getURL(Container container, User user) - { - if (container.hasPermission(user, ReadPermission.class) && showGWTStudyDesigner(container, user) && getPanelName() != null) - { - ActionURL actionURL = new ActionURL("study-designer", "designer", container); - actionURL.addParameter("panel", getPanelName()); - return actionURL; - } - else - return super.getURL(container, user); - } - - public boolean showGWTStudyDesigner(Container c, User user) - { - // Issue 21092: show deprecated GWT study designer if we have a non-empty XML study design and no data in the study design hard tables - Study study = StudyService.get().getStudy(c); - return study != null - && study.hasGWTStudyDesign(c, user) - && study.getStudyProducts(user, null).isEmpty() - && study.getStudyTreatments(user).isEmpty() - && study.getAssaySpecimenConfigs().isEmpty(); - } } public static class OverviewPage extends FolderTab diff --git a/viscstudies/src/org/labkey/viscstudies/ViscStudySchema.java b/viscstudies/src/org/labkey/viscstudies/ViscStudySchema.java index b2febbfb..2d050749 100644 --- a/viscstudies/src/org/labkey/viscstudies/ViscStudySchema.java +++ b/viscstudies/src/org/labkey/viscstudies/ViscStudySchema.java @@ -23,7 +23,6 @@ import org.labkey.api.query.UserSchema; import org.labkey.api.security.User; -import java.util.Collections; import java.util.Set; /** @@ -34,6 +33,8 @@ public class ViscStudySchema extends UserSchema { public static final String NAME = "viscstudies"; public static final String STUDY_TABLE_NAME = "studies"; + public static final String STUDY_DESIGN_TABLE_NAME = "StudyDesign"; + public static final String STUDY_DESIGN_VERSION_TABLE_NAME = "StudyDesignVersion"; public ViscStudySchema(User user, Container container) { @@ -56,12 +57,20 @@ public TableInfo createTable(String name, ContainerFilter cf) } return new ProjectStudiesTable(this, studyTable); } + if (STUDY_DESIGN_TABLE_NAME.equalsIgnoreCase(name)) + { + return new StudyDesignTable(this, cf); + } + if (STUDY_DESIGN_VERSION_TABLE_NAME.equalsIgnoreCase(name)) + { + return new StudyDesignVersionTable(this, cf); + } return null; } @Override public Set getTableNames() { - return Collections.singleton(STUDY_TABLE_NAME); + return Set.of(STUDY_TABLE_NAME, STUDY_DESIGN_TABLE_NAME, STUDY_DESIGN_VERSION_TABLE_NAME); } } diff --git a/viscstudies/test/src/org/labkey/test/tests/viscstudies/CAVDStudyTest.java b/viscstudies/test/src/org/labkey/test/tests/viscstudies/CAVDStudyTest.java deleted file mode 100644 index 0d9da3af..00000000 --- a/viscstudies/test/src/org/labkey/test/tests/viscstudies/CAVDStudyTest.java +++ /dev/null @@ -1,826 +0,0 @@ -/* - * Copyright (c) 2016-2019 LabKey Corporation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.labkey.test.tests.viscstudies; - -import org.junit.experimental.categories.Category; -import org.labkey.remoteapi.CommandException; -import org.labkey.serverapi.reader.TabLoader; -import org.labkey.test.BaseWebDriverTest; -import org.labkey.test.Locator; -import org.labkey.test.TestFileUtils; -import org.labkey.test.TestTimeoutException; -import org.labkey.test.categories.CustomModules; -import org.labkey.test.pages.ImportDataPage; -import org.labkey.test.params.FieldDefinition; -import org.labkey.test.params.FieldDefinition.ColumnType; -import org.labkey.test.params.list.IntListDefinition; -import org.labkey.test.tests.StudyBaseTest; -import org.labkey.test.util.Crawler; -import org.labkey.test.util.DataRegionExportHelper; -import org.labkey.test.util.DataRegionTable; -import org.labkey.test.util.Ext4Helper; -import org.labkey.test.util.LogMethod; -import org.labkey.test.util.LoggedParam; -import org.labkey.test.util.OptionalFeatureHelper; -import org.labkey.test.util.PortalHelper; -import org.labkey.test.util.PostgresOnlyTest; -import org.labkey.test.util.StudyHelper; - -import java.io.File; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Map; -import java.util.TreeMap; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; -import static org.labkey.test.WebTestHelper.getContextPath; - -@Category({CustomModules.class}) -@BaseWebDriverTest.ClassTimeout(minutes = 20) -public class CAVDStudyTest extends StudyBaseTest implements PostgresOnlyTest -{ - private static final String PROJECT_NAME = "CAVDStudyTest Project"; - private static final String FOLDER_NAME = "CAVDStudyTest Folder"; - private static final String STUDY_NAME = FOLDER_NAME + " Study"; - private static final String FOLDER_NAME2 = "CAVDStudy2"; - private static final String STUDY_NAME2 = FOLDER_NAME2 + " Study"; - private static final String FOLDER_NAME3 = "CAVDStudy3"; - private static final String FOLDER_NAME4 = "VerifyStudyList"; - private static final File CAVD_TEST_STUDY_ZIP = TestFileUtils.getSampleData("studies/CAVDTestStudy.folder.zip"); - private static Map DATASETS = new TreeMap<>(); - private ArrayList _expectedVaccineDesignText = new ArrayList<>(); - private ArrayList _expectedImmunizationText = new ArrayList<>(); - private ArrayList _expectedAssayDesignText = new ArrayList<>(); - - private static final String[] IMMUNOGEN_TYPES = {"Canarypox", "Subunit Protein", "Fowlpox"}; - private static final String[] GENES = {"Gag", "Env", "Tat", "Nef"}; - private static final String[] SUB_TYPES = {"Clade B", "Clade C", "Clade D"}; - private static final String[] ROUTES = {"Intramuscular (IM)"}; - private static final String[] ASSAYS = {"ELISPOT", "Neutralizing Antibodies Panel 1", "ICS", "CAVDTestAssay"}; - private static final String[] LABS = {"Schmitz", "Seaman", "McElrath", "CAVDLab1"}; - private static final String[] UNITS = {"ul"}; - private static final String[] SAMPLE_TYPES = {"Platelets"}; - - @Override - public List getAssociatedModules() - { - return Arrays.asList("viscstudies"); - } - - @Override - protected void doCleanup(boolean afterTest) throws TestTimeoutException - { - OptionalFeatureHelper.disableOptionalFeature(createDefaultConnection(), "GWTStudyDesign"); - super.doCleanup(afterTest); - } - - @Override @LogMethod - protected void doCreateSteps() - { - OptionalFeatureHelper.enableOptionalFeature(createDefaultConnection(), "GWTStudyDesign"); - _containerHelper.createProject(PROJECT_NAME, "None"); - _containerHelper.createSubfolder(PROJECT_NAME, PROJECT_NAME, FOLDER_NAME, "CAVD Study", null); - - // used for doVerifyCrossContainerDatasetStatus - configureStudy(FOLDER_NAME2); - configureStudy(FOLDER_NAME3); - _containerHelper.createSubfolder(PROJECT_NAME, PROJECT_NAME, FOLDER_NAME4, "Collaboration", null); - } - - @Override @LogMethod - protected void doVerifySteps() - { - doVerifyEmptyStudy(); - doVerifyStudyDesign(); - doVerifyAssaySchedule(); - doVerifyDatasets(); - doVerifyCrossContainerDatasetStatus(); - doVerifyIssue15610(); - } - - @LogMethod - public void configureStudy(String folderName) - { - _containerHelper.createSubfolder(PROJECT_NAME, PROJECT_NAME, folderName, "Collaboration", null); - importFolderFromZip(CAVD_TEST_STUDY_ZIP); - waitForPipelineJobsToComplete(1, "Folder import", false); - } - - @Override - protected String getProjectName() - { - return PROJECT_NAME; - } - - @LogMethod - private void doVerifyEmptyStudy() - { - log("Verifying that the study is empty."); - clickFolder(FOLDER_NAME); - - // Make sure a study was made. - assertTextNotPresent("No study is active in the current container."); - assertTextPresent(STUDY_NAME + " tracks data in"); - - // Change timepoint type. - clickAndWait(Locator.linkWithText("Edit")); - waitForElement(Ext4Helper.Locators.radiobutton(this, "DATE")); - _ext4Helper.selectRadioButton("DATE"); - - clickButton("Submit"); - - //Check to see if date is checked. - clickAndWait(Locator.linkWithText("Edit")); - waitForElement(Ext4Helper.Locators.radiobutton(this, "DATE")); - assertTrue(_ext4Helper.isChecked(Ext4Helper.Locators.ext4Radio("DATE"))); - } - - @LogMethod - private void doVerifyStudyDesign() - { - populateStudyDesignLookups(); - - clickFolder(FOLDER_NAME); - - goToGWTStudyDesignerPanel(FOLDER_NAME, "VACCINE"); - clickEditDesign(); - - addStudyDesignRow(RowType.Immunogen, "Immunogen1", IMMUNOGEN_TYPES[0], "1.5e10 Ad vg", ROUTES[0]); - addStudyDesignRow(RowType.Immunogen, "gp120", IMMUNOGEN_TYPES[1], "1.6e8 Ad vg", ROUTES[0]); - saveRevision(); - - addStudyDesignRow(RowType.Adjuvant, "Adjuvant1", "1cc"); - finishRevision(); - - goToGWTStudyDesignerPanel(FOLDER_NAME, "VACCINE"); - waitForText("Immunogens"); - assertTextPresent(_expectedVaccineDesignText); - - clickEditDesign(); - addStudyDesignRow(RowType.Immunogen, "Immunogen3", IMMUNOGEN_TYPES[2], "1.9e8 Ad vg", ROUTES[0]); - addStudyDesignRow(RowType.Adjuvant, "Adjuvant2"); - addAntigen(1, GENES[0], SUB_TYPES[0]); - addAntigen(2, GENES[1]); - addAntigen(3, GENES[2], SUB_TYPES[1]); - addAntigen(3, GENES[3], SUB_TYPES[2]); - - finishRevision(); - waitForText("Immunogens"); - assertTextPresent(_expectedVaccineDesignText); - - goToGWTStudyDesignerPanel(FOLDER_NAME, "IMMUNIZATIONS"); - clickEditDesign(); - addGroup("Vaccine", false, "1", 1); - addGroup("Placebo", false, "2", 2); - finishRevision(); - - clickTab("Manage"); - clickAndWait(Locator.linkWithText("Manage Cohorts")); - DataRegionTable.DataRegion(getDriver()).find().clickInsertNewRow(); - setFormElement(Locator.name("quf_label"), "Vaccine2"); - clickButton("Submit"); - waitForText("Placebo"); - assertTextPresentInThisOrder("Vaccine", "Placebo", "Vaccine2"); - - goToGWTStudyDesignerPanel(FOLDER_NAME, "IMMUNIZATIONS"); - clickEditDesign(); - addGroup("Vaccine2", true, "3", 3); - addTimepoint("CAVDImmTimepoint", "0", TimeUnit.Days); - finishRevision(); - waitForText("Immunization Schedule", 3, defaultWaitForPage); // WebPart title and schedule table header - assertElementPresent(Locator.tagWithId("a", "ImmunizationSchedule")); // Verify anchor tag on WebPart title - assertTextPresent(_expectedImmunizationText); - assertElementNotPresent(Locator.tagWithText("div", "30")); // From deleted rows - - // - // Test 'inactive' study design option - // - // 1. inactivate the Canarypox type - goToGWTStudyDesignerPanel(FOLDER_NAME, "VACCINE"); - waitForText("Adjuvants"); - clickAndWait(Locator.id("button_Edit")); - waitForText("Configure Dropdown Options"); - click(Locator.linkContainingText("Configure Dropdown Options")); - clickAndWait(Locator.linkWithText("folder").index(0)); // configure the first type 'Immunogen Types' - DataRegionTable dt = DataRegionTable.DataRegion(getDriver()).find(); - dt.clickEditRow(dt.getRowIndex("Name", "Canarypox")); - click(Locator.checkboxByName("quf_Inactive")); - clickAndWait(Locator.linkWithText("Submit")); - // 2. verify that the Canarypox option, although inactive is still present. - goToGWTStudyDesignerPanel(FOLDER_NAME, "VACCINE"); - clickButton("Edit", defaultWaitForPage); - waitForElement(Locator.lkButton("Finished")); - selectOptionByText(Locator.xpath("//select[@title='Immunogen 1 type']"), "Canarypox"); - } - - @LogMethod(quiet = true) - private void goToGWTStudyDesignerPanel(String folderName, @LoggedParam String panel) - { - beginAt("/study-designer/" + getProjectName() + "/" + folderName + "/designer.view?panel=" + panel); - } - - @LogMethod - private void doVerifyAssaySchedule() - { - goToGWTStudyDesignerPanel(FOLDER_NAME, "ASSAYS"); - clickEditDesign(); - addStudyDesignRow(RowType.Assay, ASSAYS[0], LABS[0]); - addStudyDesignRow(RowType.Assay, ASSAYS[1], LABS[1]); - addStudyDesignRow(RowType.Assay, ASSAYS[2], LABS[2]); - saveRevision(); - - clickButton("Create Study Timepoints", 0); - assertAlert("No timepoints are defined in the assay schedule."); - - addTimepoint("CAVDTestTimepoint", "13", TimeUnit.Days); - waitForText(WAIT_FOR_JAVASCRIPT,"CAVDTestTimepoint: 13 days"); - - addStudyDesignRow(RowType.Assay, ASSAYS[3], LABS[3]); - - finishRevision(); - } - - @LogMethod - private void populateStudyDesignLookups() - { - // StudyDesignAssays - goToAssayConfigureLookupValues(true, 0); - importLookupRecords(ASSAYS); - - // StudyDesignLabs - goToAssayConfigureLookupValues(false, 1); - importLookupRecords(LABS); - - // StudyDesignRoutes - goToVaccineConfigureLookupValues(true, 1); - importLookupRecords(ROUTES); - - // StudyDesignImmunogenTypes - goToVaccineConfigureLookupValues(false, 0); - importLookupRecords(IMMUNOGEN_TYPES); - - // StudyDesignGenes - goToVaccineConfigureLookupValues(true, 2); - importLookupRecords(GENES); - - // StudyDesignSubTypes - goToVaccineConfigureLookupValues(false, 3); - importLookupRecords(SUB_TYPES); - - // StudyDesignUnits - goToAssayConfigureLookupValues(true, 2); - importLookupRecords(UNITS); - - // StudyDesignSampleTypes - goToAssayConfigureLookupValues(false, 3); - for (String sampleType : SAMPLE_TYPES) - { - DataRegionTable.findDataRegion(this).clickInsertNewRow(); - setFormElement(Locator.name("quf_Name"), sampleType); - setFormElement(Locator.name("quf_PrimaryType"), "Blood"); - setFormElement(Locator.name("quf_ShortSampleCode"), sampleType.substring(0, 1).toUpperCase()); - clickButton("Submit"); - } - } - - private void goToAssayConfigureLookupValues(boolean project, int index) - { - // project true - project - // project false - folder - // index 0 - Assays - // index 1 - Labs - // index 2 - Units - // index 3 - SampleTypes - - String projectStr = project ? "project" : "folder"; - - clickFolder(FOLDER_NAME); - goToGWTStudyDesignerPanel(FOLDER_NAME, "ASSAYS"); - clickButton("Edit", defaultWaitForPage); - waitAndClick(Locator.linkContainingText("Configure Dropdown Options")); - waitAndClickAndWait(Locator.linkWithText(projectStr).index(index)); - } - - private void goToVaccineConfigureLookupValues(boolean project, int index) - { - // project true - project - // project false - folder - // index 0 - Immunogen Types - // index 1 - Routes - // index 2 - Genes - // index 3 - SubTypes - - String projectStr = project ? "project" : "folder"; - - clickFolder(FOLDER_NAME); - goToGWTStudyDesignerPanel(FOLDER_NAME, "VACCINE"); - clickButton("Edit", defaultWaitForPage); - waitAndClick(Locator.linkContainingText("Configure Dropdown Options")); - waitAndClickAndWait(Locator.linkWithText(projectStr).index(index)); - } - - private void importLookupRecords(String... names) - { - ImportDataPage importDataPage = DataRegionTable.DataRegion(getDriver()).find().clickImportBulkData(); - StringBuilder tsvBuilder = new StringBuilder("Name\tLabel"); - for (String name : names) - { - tsvBuilder.append("\n"); - tsvBuilder.append(name); - tsvBuilder.append("\t"); - tsvBuilder.append(name); - tsvBuilder.append(" Label"); - } - importDataPage.setText(tsvBuilder.toString()); - importDataPage.submit(); - } - - @LogMethod - private void doVerifyDatasets() - { - clickFolder(FOLDER_NAME); - goToGWTStudyDesignerPanel(FOLDER_NAME, "ASSAYS"); - - clickButton("Create Assay Datasets", 0); - waitForAlert("Placeholder datasets created. Use Manage/Study Schedule to define datasets or link to assay data.", WAIT_FOR_JAVASCRIPT); - - clickButton("Create Study Timepoints", 0); - waitForAlert("2 timepoints created.", WAIT_FOR_JAVASCRIPT); - - clickAndWait(Locator.linkWithText("Manage")); - clickAndWait(Locator.linkWithText("Manage Datasets")); - - assertTextPresent("Placeholder", 4); - assertElementPresent(Locator.linkWithText("ELISPOT")); - assertElementPresent(Locator.linkWithText("Neutralizing Antibodies Panel 1")); - assertElementPresent(Locator.linkWithText("ICS")); - assertElementPresent(Locator.linkWithText("CAVDTestAssay")); - - clickAndWait(Locator.linkWithText("Manage")); - clickAndWait(Locator.linkWithText("Manage Timepoints")); - - assertTextPresent("Study Start: 0 days", "CAVDTestTimepoint: 13 days"); -// -// addDataset(); -// -// clickAndWait(Locator.linkWithText("Overview")); -// -// assertTabPresent("Data"); -// -// clickAndWait(Locator.linkWithText("Edit")); -// -// waitForText("Timepoint Type"); -// assertEquals(2, getXpathCount(Locator.xpath("//input[@type='radio'][@name='TimepointType'][@disabled]"))); - } - - @LogMethod - private void doVerifyCrossContainerDatasetStatus() - { - final String myStudyNameCol = "My Study Name"; - final String studyNameCol = "Study Name"; - final String statusCol = "Dataset Status"; - - // setup the dataset map (ID > Name) - DATASETS.put(5001, "NAbTest"); - DATASETS.put(5002, "FlowTest"); - DATASETS.put(5003, "LuminexTest"); - DATASETS.put(5004, "ELISATest"); - - String[][] statuses = { - {"Draft", getContextPath() + "/reports/icon_draft.png", "D"}, - {"Final", getContextPath() + "/reports/icon_final.png", "F"}, - {"Locked", getContextPath() + "/reports/icon_locked.png", "L"}, - {"Unlocked", getContextPath() + "/reports/icon_unlocked.png", "U"} - }; - - String study2name = FOLDER_NAME2 + " Study"; - String study3name = FOLDER_NAME3 + " Study"; - - log("Set study name for " + FOLDER_NAME2 + " and verify datasets exist."); - navigateToFolder(PROJECT_NAME, FOLDER_NAME2); - // workaround for issue 15023: go to manage views page to initialize study dataset properties - goToManageViews(); - waitForText("Manage Views"); - clickAndWait(Locator.linkWithText("Manage")); - clickAndWait(Locator.linkWithText("Study Properties")); - waitForElement(Locator.name("Label"), WAIT_FOR_JAVASCRIPT); - setFormElement(Locator.name("Label"), study2name); - clickButton("Submit"); - waitForText("General Study Settings"); - assertTextPresent(study2name); - clickAndWait(Locator.linkWithText("Manage Datasets")); - for (Map.Entry dataset : DATASETS.entrySet()) - { - assertTextPresentInThisOrder(dataset.getKey().toString(), dataset.getValue()); - } - - log("Set study name for " + FOLDER_NAME3 + " and verify datasets exist."); - navigateToFolder(PROJECT_NAME, FOLDER_NAME3); - // workaround for issue 15023: go to manage views page to initialize study dataset properties - goToManageViews(); - waitForText("Manage Views"); - clickAndWait(Locator.linkWithText("Manage")); - clickAndWait(Locator.linkWithText("Study Properties")); - waitForElement(Locator.name("Label"), WAIT_FOR_JAVASCRIPT); - setFormElement(Locator.name("Label"), study3name); - clickButton("Submit"); - waitForText("General Study Settings"); - assertTextPresent(study3name); - clickAndWait(Locator.linkWithText("Manage Datasets")); - for (Map.Entry dataset : DATASETS.entrySet()) - { - assertTextPresentInThisOrder(dataset.getKey().toString(), dataset.getValue()); - } - - log("Verify study list query from sibling folder contains studies and dataset status."); - clickFolder(FOLDER_NAME4); - _containerHelper.enableModule("ViscStudies"); - goToViscStudiesQuery(FOLDER_NAME4); - assertElementPresent(Locator.linkWithText(study2name)); - assertElementPresent(Locator.linkWithText(study3name)); - for (String datasetName : DATASETS.values()) - { - assertElementPresent(Locator.xpath("//td[text()='" + datasetName + "']"), 2); - } - // verify that there are no status icons to start - for (String[] status : statuses) - { - assertElementNotPresent("Status icon not expected in studies query at this time.", Locator.tagWithAttribute("img", "src", status[1])); - } - - log("Change study dataset status for " + FOLDER_NAME2 + " and verify changes in study list query."); - navigateToFolder(PROJECT_NAME, FOLDER_NAME2); - waitForText("Study Schedule"); - // wait for the study schedule grid to load, any dataset name will do - waitForText(DATASETS.values().iterator().next()); - int statusCounter = 0; - for (String dataset : DATASETS.values()) - { - setDatasetStatus(dataset, statuses[statusCounter][0]); - statusCounter++; - } - - log("Verify each status icon appears once in the studies list."); - goToViscStudiesQuery(FOLDER_NAME4); - for (String[] status : statuses) - { - assertElementPresent(Locator.tagWithAttribute("img", "src", status[1]), 1); - } - - log("Create list in " + FOLDER_NAME4 + " with lookup to the studies list query."); - navigateToFolder(PROJECT_NAME, FOLDER_NAME4); - new PortalHelper(this).addWebPart("Lists"); - try - { - new IntListDefinition("AllStudiesList", "Key") - .setFields(List.of( - new FieldDefinition(myStudyNameCol, ColumnType.String).setLabel(myStudyNameCol), - new FieldDefinition("StudyLookup", new FieldDefinition.StringLookup("viscstudies", "studies")).setLabel("StudyLookup"))) - .create(createDefaultConnection(), PROJECT_NAME + "/" + FOLDER_NAME4); - } - catch (IOException | CommandException e) - { - throw new RuntimeException(e); - } - - log("Add records to list for each study."); - navigateToFolder(PROJECT_NAME, FOLDER_NAME4); - clickAndWait(Locator.linkWithText("AllStudiesList")); - DataRegionTable.findDataRegion(this).clickInsertNewRow(); - setFormElement(Locator.name("quf_" + myStudyNameCol), "Something"); - selectOptionByText(Locator.name("quf_StudyLookup"), study2name); - clickButton("Submit"); - DataRegionTable.findDataRegion(this).clickInsertNewRow(); - setFormElement(Locator.name("quf_" + myStudyNameCol), "TheOtherOne"); - selectOptionByText(Locator.name("quf_StudyLookup"), study3name); - clickButton("Submit"); - - log("Verify that the list lookup displays dataset status values."); - navigateToFolder(PROJECT_NAME, FOLDER_NAME4); - clickAndWait(Locator.linkWithText("AllStudiesList")); - _customizeViewsHelper.openCustomizeViewPanel(); - _customizeViewsHelper.removeColumn("StudyLookup"); - _customizeViewsHelper.addColumn("StudyLookup/Dataset Status"); - _customizeViewsHelper.addColumn("StudyLookup/Label"); - _customizeViewsHelper.applyCustomView(); - // verify each status icon appears once originally - for (String[] status : statuses) - { - assertElementPresent(Locator.tagWithAttribute("img", "src", status[1]), 1); - } - log("Verify that you can navigate to study and set status from study list."); - clickAndWait(Locator.linkWithText(study3name)); - // wait for the study schedule grid to load, any dataset name will do - waitForText(DATASETS.values().iterator().next()); - // set the status to Locked for all of the datasets - for (String dataset : DATASETS.values()) - { - setDatasetStatus(dataset, "Locked"); - } - assertElementPresent(Locator.tagWithAttribute("img", "src", getContextPath() + "/reports/icon_locked.png"), DATASETS.size()); - clickButton("Save Changes", defaultWaitForPage); - // verify that we are back on the list view - assertTextPresent("AllStudiesList", statusCol); - // locked icon should now appear once for study2 and for all datasets in study3 - assertElementPresent(Locator.tagWithAttribute("img", "src", getContextPath() + "/reports/icon_locked.png"), DATASETS.size() + 1); - - log("Verify data status exports to text as expected."); - - DataRegionTable drt = new DataRegionTable("query", getDriver()); - DataRegionExportHelper drtHelper = new DataRegionExportHelper(drt); - File exportTextFile = drtHelper.exportText(); - - String[][] tsvData; - try (TabLoader tsvLoader = new TabLoader(exportTextFile, true)) - { - tsvData = tsvLoader.getFirstNLines(4); - } - catch (IOException e) - { - throw new RuntimeException(e); - } - assertEquals("Wrong number of rows in exported study list.", 3, tsvData.length); - - String[] columnLabels = tsvData[0]; - assertEquals("Wrong columns in exported study list.", - Arrays.asList(myStudyNameCol, studyNameCol, statusCol), Arrays.asList(columnLabels)); - - log("verify first study values"); - List expectedDatasetStatuses = new ArrayList<>(); - statusCounter = 0; - for (String dataset : DATASETS.values()) - { - expectedDatasetStatuses.add(statuses[statusCounter][2] + ": " + dataset); - statusCounter++; - } - assertEquals("Wrong data for first study.", Arrays.asList("Something", study2name, String.join("\n", expectedDatasetStatuses)), Arrays.asList(tsvData[1])); - - log("verify second study values"); - expectedDatasetStatuses = new ArrayList<>(); - for (String dataset : DATASETS.values()) - { - expectedDatasetStatuses.add("L: " + dataset); - } - assertEquals("Wrong data for second study.", Arrays.asList("TheOtherOne", study3name, String.join("\n", expectedDatasetStatuses)), Arrays.asList(tsvData[2])); - } - - // Issue 15610: viscstudieslist - URLs generated from lookups are broken - @LogMethod - private void doVerifyIssue15610() - { - goToProjectHome(); - _containerHelper.enableModule("ViscStudies"); - - log("** Creating list with lookup to viscstudies.studies"); - List cols = List.of( - new FieldDefinition("StudyLookup", new FieldDefinition.StringLookup("viscstudies", "studies")).setDescription("Study Lookup") - ); - try - { - new IntListDefinition("Issue15610-List", "Key").setFields(cols) - .create(createDefaultConnection(), getProjectName()); - } - catch (IOException | CommandException e) - { - throw new RuntimeException(e); - } - - log("** Inserting row into list"); - goToProjectHome(); - goToManageLists(); - clickAndWait(Locator.linkWithText("Issue15610-List")); - DataRegionTable.findDataRegion(this).clickInsertNewRow(); - selectOptionByText(Locator.name("quf_StudyLookup"), STUDY_NAME); - clickButton("Submit"); - - DataRegionTable.findDataRegion(this).clickInsertNewRow(); - selectOptionByText(Locator.name("quf_StudyLookup"), STUDY_NAME2); - clickButton("Submit"); - - log("** Checking URLs go to correct container..."); - Crawler.ControllerActionId studyLinkAction = new Crawler.ControllerActionId(getAttribute(Locator.linkWithText(STUDY_NAME), "href")); - assertEquals("'" + STUDY_NAME + "' link, target container", getProjectName() + "/" + FOLDER_NAME, studyLinkAction.getContainerPath()); - assertEquals("'" + STUDY_NAME + "' link, target action", new Crawler.ControllerActionId("study", "studySchedule"), studyLinkAction); - - studyLinkAction = new Crawler.ControllerActionId(getAttribute(Locator.linkWithText(STUDY_NAME2), "href")); - assertEquals("'" + STUDY_NAME2 + "' link, target container", getProjectName() + "/" + FOLDER_NAME2, studyLinkAction.getContainerPath()); - assertEquals("'" + STUDY_NAME2 + "' link, target action", new Crawler.ControllerActionId("study", "studySchedule"), studyLinkAction); - } - - private void setDatasetStatus(String dataset, String status) - { - clickEditDatasetIcon(dataset); - Locator.XPathLocator comboParent = Locator.xpath("//label[contains(text(), 'Status')]/../.."); - _ext4Helper.selectComboBoxItem("Status", status); - clickButton("Save", 0); - - // verify that the status icon appears - Locator statusLink = Locator.xpath("//div[contains(@class, 'x4-grid-cell-inner')]//div[contains(text(), '" + dataset + "')]/../../..//img[@alt='" + status + "']"); - waitForElement(statusLink, WAIT_FOR_JAVASCRIPT); - } - - private void goToViscStudiesQuery(String folderName) - { - navigateToFolder(PROJECT_NAME, folderName); - goToSchemaBrowser(); - selectQuery("viscstudies", "studies"); - waitForText("view data"); - clickAndWait(Locator.linkContainingText("view data")); - } - - private void clickEditDatasetIcon(String dataset) - { - Locator editLink = Locator.xpath("//div[contains(@class, 'x4-grid-cell-inner')]//div[contains(text(), '" + dataset + "')]/../../..//span[contains(@class, 'edit-views-link')]"); - waitForElement(editLink, WAIT_FOR_JAVASCRIPT); - click(editLink); - - _extHelper.waitForExtDialog(dataset); - } - - private void deleteStudyDesignRow(RowType type, int row) - { - int count = getElementCount(Locator.xpath("//table[@id='" + type + "Grid']//div[starts-with(@title, 'Click to delete ')]")); - click(Locator.xpath("//table[@id='"+type+"Grid']//div[starts-with(@title, 'Click to delete ')][text()='"+row+"']")); - waitAndClick(Locator.xpath("//td[@role='menuitem'][starts-with(text(), 'Delete ')]")); - waitForElementToDisappear(Locator.xpath("(//table[@id='"+type+"Grid']//div[starts-with(@title, 'Click to delete ')])["+count+"]"), WAIT_FOR_JAVASCRIPT); - click(Locator.xpath("/html/body")); - } - - private void addStudyDesignRow(RowType type, String... values) - { - waitForElement(Locator.lkButton("Finished")); - int rowCount = getElementCount(Locator.xpath("//table[@id='" + type + "Grid']//div[starts-with(@title, 'Click to delete ')]")); - int rowOffset = getElementCount(Locator.xpath("//table[@id='" + type + "Grid']/tbody/tr[not(.//input or .//select)]")) + 1; - String tablePath = "//table[@id='"+type+"Grid']"; - assertElementPresent(Locator.xpath(tablePath)); - String rowPath = tablePath + "/tbody/tr["+(rowCount+rowOffset)+"]"; - assertElementPresent(Locator.xpath(rowPath)); - for(int i = 0; i < values.length; i++) - { - String cellPath = rowPath + "/td["+(i+2)+"]"; - if(isElementPresent(Locator.xpath(cellPath+"/select"))) - selectOptionByText(Locator.xpath(cellPath+"/select"), values[i]); - else if(isElementPresent(Locator.xpath(cellPath+"/input"))) - setFormElement(Locator.xpath(cellPath+"/input"), values[i]); - else - fail("Non input/select cell found when adding new " + type); - switch(type) - { - case Adjuvant: - _expectedVaccineDesignText.add(values[i]); - break; - case Immunogen: - _expectedVaccineDesignText.add(values[i]); - break; - case Immunization: - _expectedImmunizationText.add(values[i]); - break; - case Assay: - _expectedAssayDesignText.add(values[i]); - break; - } - } - - waitForElement(Locator.xpath("(//div[starts-with(@title, 'Click to delete ')])["+(rowCount+1)+"]"), WAIT_FOR_JAVASCRIPT); - } - - private void addAntigen(int immunogenNumber, String... values) - { - String tablePath = "(//table[starts-with(@id, 'AntigenGrid')])["+immunogenNumber+"]"; - assertElementPresent(Locator.xpath(tablePath)); - int rowCount = getElementCount(Locator.xpath(tablePath + "//div[@title='Click to delete antigen']")); - String rowPath = tablePath + "/tbody/tr["+(rowCount+2)+"]"; - assertElementPresent(Locator.xpath(rowPath)); - for(int i = 0; i < values.length; i++) - { - String cellPath = rowPath + "/td["+(i+2)+"]"; - if(isElementPresent(Locator.xpath(cellPath+"/select"))) - selectOptionByText(Locator.xpath(cellPath+"/select"), values[i]); - else if(isElementPresent(Locator.xpath(cellPath+"/input"))) - setFormElement(Locator.xpath(cellPath+"/input"), values[i]); - else - fail("Non input/select cell found when adding new antigen"); - _expectedVaccineDesignText.add(values[i]); - } - - waitForElement(Locator.xpath("(//div[@title='Click to delete antigen'])["+(rowCount+1)+"]"), WAIT_FOR_JAVASCRIPT); - - } - - enum RowType - { - Immunogen, - Adjuvant, - Immunization, - Antigen, - Assay - } - - enum TimeUnit - { - Days, - Weeks - } - - private void clickEditDesign() - { - clickButton("Edit", defaultWaitForPage * 2); - waitForElement(Locator.lkButton("Finished")); - } - - private void addGroup(String name, boolean cohortExists, String count, int groupCount) - { - click(Locator.xpath("//div[text() = 'Add New']")); - waitForElement(Locator.id("DefineGroupDialog")); - if (cohortExists) - { - checkRadioButton(Locator.name("cohortType").index(1)); - selectOptionByText(Locator.name("existName"), name); - } - else - { - setFormElement(Locator.name("newName"), name); - } - clickButton("OK", 0); - waitForElementToDisappear(Locator.id("DefineGroupDialog"), WAIT_FOR_JAVASCRIPT); - - Locator loc = Locator.xpath("//table[@id='ImmunizationGrid']/tbody/tr[" + (groupCount+2) + "]/td[3]/input"); - waitForElement(loc); - setFormElement(loc, count); - _expectedImmunizationText.add(name); - } - - private void addTimepoint(String name, String count, TimeUnit unit) - { - click(Locator.xpath("//div[text() = 'Add Timepoint']")); - waitForElement(Locator.id("DefineTimepointDialog")); - setFormElement(Locator.name("timepointName"), name); - setFormElement(Locator.name("timepointCount"), count); - selectOptionByText(Locator.name("timepointUnit"), unit.toString()); - clickButton("OK", 0); - waitForElementToDisappear(Locator.id("DefineTimepointDialog"), WAIT_FOR_JAVASCRIPT); - } - - private void addDataset() - { - clickAndWait(Locator.linkWithText("Manage")); - clickAndWait(Locator.linkWithText("Study Schedule")); - - log("adding dataset: " + "ImportedDataset"); - - clickButton("Add Dataset", 0); - waitForElement(Locator.xpath("//span[text() = 'New Dataset']"), WAIT_FOR_JAVASCRIPT); - setFormElement(Locator.xpath("//label[text() = 'Name:']/..//input"), "ImportedDataset"); - - - click(Ext4Helper.Locators.ext4Radio("Import data from file")); - clickButton("Next"); - - File file = StudyHelper.getFolderArchiveFile("study/datasets/plate001.tsv"); - - Locator fileUpload = Locator.xpath("//input[@name = 'uploadFormElement']"); - waitForElement(fileUpload, WAIT_FOR_JAVASCRIPT); - setFormElement(fileUpload, file.getAbsolutePath()); - - waitForElement(Locator.xpath("//div[@class = 'gwt-HTML' and contains(text(), 'Showing first 5 rows')]"), WAIT_FOR_JAVASCRIPT); - clickButton("Import"); - } - - private int revision = 1; - private void saveRevision() - { - waitForElementToDisappear(Locator.tag("a").withText("Save").withClass("labkey-disabled-button")); - clickButton("Save", 0); - Locator successText = Locator.tag("div").withClass("gwt-Label").withText("Revision "+(++revision)+" saved successfully."); - if (!waitForElement(successText, WAIT_FOR_JAVASCRIPT, false)) - { - clickButton("Save", 0); // GWT retry - } - waitForElement(successText); - waitForElement(Locator.tag("a").withText("Save").withClass("labkey-disabled-button")); - } - - private void finishRevision() - { - clickButton("Finished"); - revision++; - } -} diff --git a/viscstudies/webapp/viscstudies/study.js b/viscstudies/webapp/viscstudies/study.js deleted file mode 100644 index f1b2d2b2..00000000 --- a/viscstudies/webapp/viscstudies/study.js +++ /dev/null @@ -1,565 +0,0 @@ -/* - * Copyright (c) 2011-2019 LabKey Corporation - * - * Licensed under the Apache License, Version 2.0: http://www.apache.org/licenses/LICENSE-2.0 - */ -var _allStudies = null; -var _selectedStudies = null; -var _isViscUser = false; - -LABKEY.NavTrail.setTrail("Browse Study Designs"); -function getStudyDesigns(config) -{ - var params = {includeSubfolders:config.includeSubfolders}; - Ext.Ajax.request({ - url : LABKEY.ActionURL.buildURL('study-designer', 'getStudyDesigns', config.containerPath, params), - method : 'GET', - success: LABKEY.Utils.getCallbackWrapper(LABKEY.Utils.getOnSuccess(config), config.scope), - failure: LABKEY.Utils.getCallbackWrapper(LABKEY.Utils.getOnFailure(config), config.scope, true) - }); - - LABKEY.Security.getUserPermissions({userId:LABKEY.Security.currentUser.id, - successCallback:function(userPermsInfo) { - if (userPermsInfo.container.groups && userPermsInfo.container.groups.length > 0) - { - for (var i = 0; i < userPermsInfo.container.groups.length; i++) - { - if ("Users" == userPermsInfo.container.groups[i].name) //Really any project level group, but can't tell proj from site gruops - { - _isViscUser = true; - return; - } - } - } - } - }); -} - - Ext.onReady(function() { - Ext.QuickTips.init(); - getStudyDesigns({successCallback:initStudyDesigns, includeSubfolders:true }); - }); - - function initStudyDesigns(result) { - _allStudies = result.studyDesigns; - _selectedStudies = _allStudies; - showStudyDesigns(_selectedStudies); - initFacets(); - } - - function showStudyDesigns(designs) { - if (null == designs || designs.length == 0) - { - Ext.get("result").update("
No studies match the current filter. Try showing more options.
"); - return; - } - designs.sort(function (a, b) { - return a.studyDefinition.name.localeCompare(b.studyDefinition.name); - }); - Ext.get("result").update(""); - for (var i = 0; i < designs.length; i++) - { - //var design = result.studyDesigns[i].studyDefinition; - Ext.get("result").insertHtml("beforeEnd", getStudyOverview(designs[i])); - } - } - - function h(s) { - if (null == s) - return ""; - else - return LABKEY.Utils.encodeHtml(s); - } - - function getStudyOverview(info) { - var design = info.studyDefinition; - var html = "
"; - html += ""; - html += ""; - html += "
" +"" + - "" + - h(design.name) + "" + (design.animalSpecies ? h(design.animalSpecies) : " ") + "" + h(design.investigator) + "
"; - - if (design.description) - html+= h(design.description) +"

"; - - html += "Immunogens: "; - var immunogenNames = []; - if (design.immunogens) { - for (var i = 0; i < design.immunogens.length; i++) - immunogenNames.push(immunogenSummary(design.immunogens[i])); - } - html += (immunogenNames.length ? immunogenNames.join(", ") : "(none)") + "
"; - - html += "Adjuvants: "; - var adjuvantNames = []; - if (design.adjuvants) { - for (var i = 0; i < design.adjuvants.length; i++) - adjuvantNames.push(design.adjuvants[i].name); - } - html += (adjuvantNames.length ? h(adjuvantNames.join(", ")) : "(none)") + "

"; - - html += graphicalVaccinationSummary(design); - return html; - - } - -function immunogenSummary(immunogen) -{ - var ret = "" + h(immunogen.name) + ""; - if (immunogen.type) - ret += ", " + immunogen.type; - if (immunogen.admin) - ret += ", " + immunogen.admin; - - if (immunogen.antigens) - { - var a = []; - for (var i = 0; i < immunogen.antigens.length; i++) - if (immunogen.antigens[i]) - a.push(h(immunogen.antigens[i].name)); - - if (a.length) - ret += " (" + a.join(", ") + ") "; - } - return ret; -} - -function graphicalVaccinationSummary(design) -{ - if (null == design.immunizations || design.immunizations.length == 0) - return ""; - - var html = ""; - var timepoints = []; - var timepointMap = {}; - for (var i = 0; i < design.immunizations.length; i++) - { - var immunization = design.immunizations[i]; - //Some "blank" immunizations have crept in. - if (null == immunization.adjuvants && null == immunization.immunogens) - continue; - if (timepointMap[immunization.timepoint.days]) - continue; - timepointMap[immunization.timepoint.days] = immunization.timepoint; - timepoints.push(immunization.timepoint); - } - if (timepoints.length == 0) - return ""; - - timepoints.sort(function(a, b) { - return a.days - b.days; - }); - - var PIXELS_PER_DAY = 8; - var IMG_WIDTH = 16; - var ZERO_OFFSET = 150; - var imgSrc = LABKEY.contextPath + "/viscstudies/syringeSmall.gif"; - var left = Ext.get("result").getLeft(); - html += "
Week"; - for (var tpi = 0; tpi < timepoints.length; tpi++) - { - var week = Math.round(timepoints[tpi].days / 7); - var iconLeft = left + ZERO_OFFSET + (week * 7 * PIXELS_PER_DAY )- (IMG_WIDTH /2); - html += "" + week + ""; - } - html += "
"; - - for (var ci = 0; ci < design.cohorts.length; ci++) - { - html += "
" + h(design.cohorts[ci].name) + " (" + design.cohorts[ci].count + ")" + ""; - for (var tpi = 0; tpi < timepoints.length; tpi++) - { - var vaccination = findVaccination(design, design.cohorts[ci], timepoints[tpi]); - if (null != vaccination) - { - var components = []; - if (vaccination.immunogens) - components = components.concat(vaccination.immunogens); - if (vaccination.adjuvants) - components = components.concat(vaccination.adjuvants); - var iconLeft = left + ZERO_OFFSET + (vaccination.timepoint.days * PIXELS_PER_DAY )- (IMG_WIDTH /2); - html += "" - + "
" + components.join(" | ") + "
" - +"
"; - } - } - html += "
"; - - } - - return html + "
"; - -// var html = "
header
"; -// return html; - -} - function vaccinationSummary(design) { - if (null == design.immunizations || design.immunizations.length == 0) - return ""; - - var html = ""; - var timepoints = []; - var timepointMap = {}; - for (var i = 0; i < design.immunizations.length; i++) - { - var immunization = design.immunizations[i]; - //Some "blank" immunizations have crept in. - if (null == immunization.adjuvants && null == immunization.immunogens) - continue; - if (timepointMap[immunization.timepoint.days]) - continue; - timepointMap[immunization.timepoint.days] = immunization.timepoint; - timepoints.push(immunization.timepoint); - } - if (timepoints.length == 0) - return ""; - - timepoints.sort(function(a, b) { - return a.days - b.days; - }); - - for (var tpi = 0; tpi < timepoints.length; tpi++) - html += ""; - html += ""; - - for (var ci = 0; ci < design.cohorts.length; ci++) - { - html += ""; - for (var tpi = 0; tpi < timepoints.length; tpi++) - { - var vaccination = findVaccination(design, design.cohorts[ci], timepoints[tpi]); - if (null == vaccination) - html += ""; - else - { - var components = []; - if (vaccination.immunogens) - components = components.concat(vaccination.immunogens); - if (vaccination.adjuvants) - components = components.concat(vaccination.adjuvants); - html += ""; - } - } - html += ""; - - } - - return html + "
" + h(timepoints[tpi].name) + "
" + h(design.cohorts[ci].name) + " (" + design.cohorts[ci].count + ")" + "" + components.join(" | ") + "


"; - } - -function findVaccination(design, cohort, timepoint) -{ - for (var i = 0; i < design.immunizations.length; i++) - { - var immunization = design.immunizations[i]; - if (immunization.groupName == cohort.name && immunization.timepoint.days == timepoint.days) - return immunization; - } - return null; -} - -function addIfNotPresent(array, value) -{ - var isobj = typeof value == 'object'; - var id = isobj ? value.id : null; - - for (var i = 0; i < array.length; i++) - { - if (value == array[i] || (isobj && id == array[i].id)) - return; - } - - array.push(value); -} - -function Facet(id, caption, getOptionsFn) { - this.allOptions = []; - this.id = id; - this.caption = caption; - this.getOptionsForStudy = getOptionsFn; - this.selected = {}; -} - -Facet.prototype = { - allOptions:[], - - setSelected:function(index, selected) { - this.selected[this.allOptions[index].name] = selected; - }, - - isSelected:function(index) { - return this.selected[this.allOptions[index].name]; - }, - - selectAll:function() { - for (var i = 0; i < this.allOptions.length; i++) - this.selected[this.allOptions[i].name] = true; - }, - - selectOnly:function(index) { - var sel = {}; - sel[this.allOptions[index].name] = true; - this.selected = sel; - }, - - init:function(infos) { - var seen = {}; - for (var i = 0; i < infos.length; i++) - { - var optionsForStudy = this.getOptionsForStudy(infos[i]); - for (var j = 0; j < optionsForStudy.length; j++) - { - if(!seen[optionsForStudy[j].name]) - { - seen[optionsForStudy[j].name] = true; - this.allOptions.push(optionsForStudy[j]); - } - } - } - this.allOptions.sort(function(a, b) { return a.name.localeCompare(b.name); }); - this.selected = seen; //All selected initially - }, - - getMatchingDesigns:function (infos) { - var ret = []; - for (var i = 0; i < infos.length; i++) - { - var optionsForStudy = this.getOptionsForStudy(infos[i]); - for (var j = 0; j < optionsForStudy.length; j++) - { - if (this.selected[optionsForStudy[j].name]) - { - ret.push(infos[i]); - break; - } - } - } - return ret; - } -}; - -var investigatorFacet = new Facet("investigators", "Investigators", function(info) { - return [{name:info.studyDefinition.investigator}]; - }); - -var speciesFacet = new Facet("species", "Species", function (info) { - return [{name:info.studyDefinition.animalSpecies ? info.studyDefinition.animalSpecies : "(none)"}]; -}); - -var adjuvantFacet = new Facet("adjuvants", "Adjuvants", function (info) { - var design = info.studyDefinition; - var options = []; - if (design.adjuvants) { - for (var i = 0; i < design.adjuvants.length; i++) - options.push({name:design.adjuvants[i].name}); - } - else - options.push({name:"(none)"}); - - return options; -}); - -var immunogenFacet = new Facet("immunogens", "Immunogens", function (info) { - var design = info.studyDefinition; - var options = []; - if (design.immunogens) { - for (var i = 0; i < design.immunogens.length; i++) - options.push({name:design.immunogens[i].name}); - } - else - options.push({name:"(none)"}); - - return options; -}); - -var facets = [immunogenFacet, investigatorFacet, speciesFacet, adjuvantFacet]; -function initFacets() -{ - for (let f = 0; f < facets.length; f++) - { - var facet = facets[f]; - var header = "

" + h(facet.caption) + "

Showing all " + h(facet.caption) + "
"; - var html = ""; - html += "Show All

" ; - facet.init(_allStudies); - html += "
"; - const colLength = Math.round(facet.allOptions.length / 3); - for (let i = 0; i < facet.allOptions.length; i++) - { - let option = facet.allOptions[i]; - html += ""; - html += ""+ h(option.name) + "
"; - if (i === colLength || i === colLength * 2) - html += "
"; - } - html += "
"; - Ext.get("facets").insertHtml("beforeEnd", header); - - const id = facet.id; - const facet2 = facet; - const tip = new LABKEY.ext.CalloutTip({target:"facet_header_" + facet.id, html:html, closable:true}); - tip.on("render", function(t) { - t.getEl().alignTo("facet_header_" + id, "tl-bl"); - }); - tip.on("afterrender", function(t) { - // Attach event handlers after HTML is rendered - document.getElementById('showAll_' + id)['onclick'] = function() { selectAll(id); return false;} - for (let i = 0; i < facet2.allOptions.length; i++) - { - const id = facet2.id; - const idx = i; - document.getElementById(checkboxId(facet2, i))['onclick'] = function() { optionClicked(this, id, idx); }; - document.getElementById('selectOnly_' + i)['onclick'] = function() { selectOnly(id, i); return false; } - } - }); - } -} - -function checkboxId(facet, index) { - return facet.id + index + "_check"; -} - -function optionClicked(cb, facetId, index) -{ - var facet = getFacet(facetId); - facet.setSelected(index, cb.checked); - updateSummary(facet); - updateVisibleStudies(); -} - -function selectOnly(facetId, index) -{ - var facet = getFacet(facetId); - facet.selectOnly(index); - updateCheckboxes(facet); - updateSummary(facet); - updateVisibleStudies(); -} - -function selectAll(facetId) -{ - var facet = getFacet(facetId); - facet.selectAll(); - updateCheckboxes(facet); - updateSummary(facet); - updateVisibleStudies(); -} - -function updateCheckboxes(facet) { - for (var i = 0; i < facet.allOptions.length; i++) - Ext.getDom(checkboxId(facet, i)).checked = facet.isSelected(i); -} - -function updateVisibleStudies() -{ - var infos = _allStudies; - var facet = null; - for (var i = 0; i < facets.length; i++) - { - facet = facets[i]; - infos = facet.getMatchingDesigns(infos); - } - _selectedStudies = infos; - showStudyDesigns(_selectedStudies); -} - -function generateDesignSpreadsheet() { - - var infos = _selectedStudies; - var rows = [["# One row per antigen/adjuvant. A single vaccination may be described in several rows"],["Study", "Cohort", "Days", "Component", "Name", "Admin", "Dose", "Type", "Antigen Name", "Gene", "GenBank Id", "SubType", "Sequence"]]; - for (var i = 0; i < infos.length; i++) - { - var info = infos[i]; - var design = info.studyDefinition; - if (!design.immunizations) - continue; - - for (var vi = 0; vi < design.immunizations.length; vi++) - { - vaccination = design.immunizations[vi]; - if (vaccination.immunogens) - { - for (var immi = 0; immi < vaccination.immunogens.length; immi++) - { - var immunogen = findImmunogen(design, vaccination.immunogens[immi]); - if (immunogen.antigens && immunogen.antigens.length) { - - for (var anti = 0; anti < immunogen.antigens.length; anti++) - { - var antigen = immunogen.antigens[anti]; - rows.push([info.label, vaccination.groupName, vaccination.timepoint.days, "Immunogen", immunogen.name, immunogen.admin, immunogen.dose, immunogen.type, antigen.name, antigen.gene, antigen.genBankId, antigen.subtype, antigen.sequence]); - } - - } - else - rows.push([info.label, vaccination.groupName, vaccination.timepoint.days, "Immunogen", immunogen.name, immunogen.admin, immunogen.dose, immunogen.type]); - } - } - if (vaccination.adjuvants) - { - for (var adji = 0; adji < vaccination.adjuvants.length; adji++) - { - var adjuvant = findAdjuvant(design, vaccination.adjuvants[adji]); - rows.push([info.label, vaccination.groupName, vaccination.timepoint.days, "Adjuvant", adjuvant.name, adjuvant.admin, adjuvant.dose]); - } - } - } - - } - - var workbook = {fileName:"ProtocolDescriptions", sheets:[{name:"Vaccine Summary", data:rows}]} ; - LABKEY.Utils.convertToExcel(workbook); - - function findAdjuvant(design, adjuvantName) - { - for (var i = 0; i < design.adjuvants.length; i++) - if (design.adjuvants[i].name == adjuvantName) - return design.adjuvants[i]; - - return adjuvantName + " (no description found)"; - } - - function findImmunogen(design, immunogenName) - { - for (var i = 0; i < design.immunogens.length; i++) - if (design.immunogens[i].name == immunogenName) - return design.immunogens[i]; - - return immunogenName + " (no description found)"; - } -} - -function updateSummary(facet) -{ - var elem = Ext.get("facet_summary_" + facet.id); - var selCount = 0; - var allSelected = []; - for (var key in facet.selected) - { - allSelected.push(key); - selCount++; - } - - if (selCount == facet.allOptions.length) - { - elem.update("Showing all " + facet.caption); - return; - } - - var extraText = ""; - allSelected.sort(function (a, b) {return a.localeCompare(b)}); - if (selCount > 3) - { - allSelected = allSelected.slice(0, 3); - extraText = ", " + (selCount - allSelected.length) + " more"; - } - elem.update("Showing " + allSelected.join(", ") + extraText); -} - -function getFacet(facetId) -{ - for (var i = 0; i < facets.length; i++) - if (facets[i].id == facetId) - return facets[i]; -} \ No newline at end of file diff --git a/viscstudies/webapp/viscstudies/syringe2.jpg b/viscstudies/webapp/viscstudies/syringe2.jpg deleted file mode 100644 index 2ce804b5..00000000 Binary files a/viscstudies/webapp/viscstudies/syringe2.jpg and /dev/null differ diff --git a/viscstudies/webapp/viscstudies/syringeSmall.gif b/viscstudies/webapp/viscstudies/syringeSmall.gif deleted file mode 100644 index 59b12a16..00000000 Binary files a/viscstudies/webapp/viscstudies/syringeSmall.gif and /dev/null differ