diff --git a/LabPurchasing/test/src/org/labkey/test/tests/labpurchasing/LabPurchasingTest.java b/LabPurchasing/test/src/org/labkey/test/tests/labpurchasing/LabPurchasingTest.java index acbc0370f..0bb8ef0cb 100644 --- a/LabPurchasing/test/src/org/labkey/test/tests/labpurchasing/LabPurchasingTest.java +++ b/LabPurchasing/test/src/org/labkey/test/tests/labpurchasing/LabPurchasingTest.java @@ -11,16 +11,12 @@ import org.labkey.test.categories.External; import org.labkey.test.categories.LabModule; import org.labkey.test.components.ext4.Window; -import org.labkey.test.util.DataRegion; 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.ext4cmp.Ext4ComboRef; import org.labkey.test.util.ext4cmp.Ext4FieldRef; import org.labkey.test.util.ext4cmp.Ext4GridRef; import org.openqa.selenium.WebElement; -import org.openqa.selenium.support.ui.ExpectedConditions; import java.util.Collections; import java.util.List; @@ -98,7 +94,26 @@ public void testLabPurchasingModule() // Adding the new vendor should have updated the combo: grid.clickTbarButton("Add New"); + checker().withScreenshot("LabPurchasingBeforeVendor"); grid.setGridCell(1, "vendorId", "New Vendor 1"); + try + { + Assert.assertTrue("Missing vendor cell", isElementPresent(Ext4GridRef.locateExt4GridCell("New Vendor 1"))); + } + catch (AssertionError e) + { + checker().withScreenshot("LabPurchasingVendor0"); + WebElement el = grid.startEditing(1, "vendorId"); + checker().withScreenshot("LabPurchasingVendor1"); + + setFormElementJS(el, ""); + el.sendKeys("New Vendor 1"); + sleep(1000); + + checker().withScreenshot("LabPurchasingVendor2"); + + throw e; + } // Try to save, expect error: click(Ext4Helper.Locators.ext4Button("Order Items")); diff --git a/mGAP/resources/etls/prime-seq.xml b/mGAP/resources/etls/prime-seq.xml index a8f394aa7..ea71e51b5 100644 --- a/mGAP/resources/etls/prime-seq.xml +++ b/mGAP/resources/etls/prime-seq.xml @@ -131,9 +131,10 @@ + Copy to local table - + releaseId contig diff --git a/mGAP/resources/queries/mGAP/releaseTracks/.qview.xml b/mGAP/resources/queries/mGAP/releaseTracks/.qview.xml new file mode 100644 index 000000000..2462f2d16 --- /dev/null +++ b/mGAP/resources/queries/mGAP/releaseTracks/.qview.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/mGAP/resources/schemas/mgap.xml b/mGAP/resources/schemas/mgap.xml index 5f75392b1..1c135af37 100644 --- a/mGAP/resources/schemas/mgap.xml +++ b/mGAP/resources/schemas/mgap.xml @@ -1076,8 +1076,7 @@ lsidtype true true - false - true + false ObjectUri Object @@ -1141,4 +1140,4 @@ - \ No newline at end of file + diff --git a/mGAP/src/org/labkey/mgap/pipeline/GenerateMgapTracksStep.java b/mGAP/src/org/labkey/mgap/pipeline/GenerateMgapTracksStep.java index 0a49a2109..7556dd25f 100644 --- a/mGAP/src/org/labkey/mgap/pipeline/GenerateMgapTracksStep.java +++ b/mGAP/src/org/labkey/mgap/pipeline/GenerateMgapTracksStep.java @@ -75,8 +75,9 @@ public static class Provider extends AbstractVariantProcessingStepProvider newRow = new CaseInsensitiveHashMap<>(); newRow.put("trackName", trackName); newRow.put("label", trackName); @@ -259,13 +250,15 @@ private void createOrUpdateTrack(SequenceOutputFile so, PipelineJob job, String } else { - job.getLogger().debug("Updating existing track: " + so.getName()); + int rowId = ts.getObject(Integer.class); + job.getLogger().debug("Updating existing track: " + so.getName() + " / " + rowId); + Map toUpdate = new CaseInsensitiveHashMap<>(); - toUpdate.put("rowId", ts.getObject(Integer.class)); + toUpdate.put("rowId", rowId); toUpdate.put("vcfId", so.getRowid()); Map oldKeys = new CaseInsensitiveHashMap<>(); - toUpdate.put("rowId", ts.getObject(Integer.class)); + oldKeys.put("rowId", rowId); releaseTracks.getUpdateService().updateRows(job.getUser(), targetContainer, Arrays.asList(toUpdate), Arrays.asList(oldKeys), null, null); } diff --git a/mGAP/src/org/labkey/mgap/pipeline/mGapReleaseGenerator.java b/mGAP/src/org/labkey/mgap/pipeline/mGapReleaseGenerator.java index de1b00c8d..e9462a65a 100644 --- a/mGAP/src/org/labkey/mgap/pipeline/mGapReleaseGenerator.java +++ b/mGAP/src/org/labkey/mgap/pipeline/mGapReleaseGenerator.java @@ -99,8 +99,10 @@ public class mGapReleaseGenerator extends AbstractParameterizedOutputHandler(PageFlowUtil.set("sequenceanalysis/field/GenomeFileSelectorField.js")), Arrays.asList( - ToolParameterDescriptor.create("releaseVersion", "Version", "This string will be used as the version when published.", "textfield", new JSONObject(){{ + ToolParameterDescriptor.create("releaseVersion", "Version", "This value will be used as the version when published.", "ldk-numberfield", new JSONObject(){{ put("allowBlank", false); + put("decimalPrecision", 1); + put("doNotIncludeInTemplates", true); }}, null), ToolParameterDescriptor.createExpDataParam("gtfFile", "GTF File", "The gene file used to create these annotations.", "sequenceanalysis-genomefileselectorfield", new JSONObject() {{ diff --git a/mcc/package-lock.json b/mcc/package-lock.json index 68c3ae536..dfa8d782d 100644 --- a/mcc/package-lock.json +++ b/mcc/package-lock.json @@ -20419,11 +20419,6 @@ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" }, - "caniuse-lite": { - "version": "1.0.30001332", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001332.tgz", - "integrity": "sha512-10T30NYOEQtN6C11YGg411yebhvpnC6Z102+B95eAsN0oB6KUs01ivE8u+G6FMIRtIrVlYXhL+LUwQ3/hXwDWw==" - }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -27183,4 +27178,4 @@ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==" } } -} +} \ No newline at end of file diff --git a/mcc/resources/etls/snprc-datasets.xml b/mcc/resources/etls/snprc-datasets.xml index e13e9c112..981a4855b 100644 --- a/mcc/resources/etls/snprc-datasets.xml +++ b/mcc/resources/etls/snprc-datasets.xml @@ -7,7 +7,7 @@ Copy to target - + AnimalId date diff --git a/mcc/resources/queries/mcc/aggregatedDemographics.query.xml b/mcc/resources/queries/mcc/aggregatedDemographics.query.xml new file mode 100644 index 000000000..35dc16238 --- /dev/null +++ b/mcc/resources/queries/mcc/aggregatedDemographics.query.xml @@ -0,0 +1,29 @@ + + + + + MCC Aggregated Demographics + + + MCC ID + + + Center Id + + + Dam MCC Id + + + Dam Center Id + + + Sire Center Id + + + Sire MCC Id + + +
+
+
+
\ No newline at end of file diff --git a/mcc/resources/queries/mcc/aggregatedDemographics.sql b/mcc/resources/queries/mcc/aggregatedDemographics.sql index ef703373d..b3d1af05f 100644 --- a/mcc/resources/queries/mcc/aggregatedDemographics.sql +++ b/mcc/resources/queries/mcc/aggregatedDemographics.sql @@ -7,6 +7,7 @@ SELECT d.birth, d.death, d.colony, + d.source, d.damMccAlias.externalAlias as dam, d.sireMccAlias.externalAlias as sire, d.dam as originalDam, @@ -18,6 +19,7 @@ SELECT WHEN d.calculated_status = 'Alive' AND (SELECT COUNT(f.flag.value) as total FROM "/data/Colonies/SNPRC/".study.flags f WHERE f.Id = d.Id AND f.isActive = true) > 0 THEN true ELSE false END as u24_status, + d.Id.mostRecentDeparture.mostRecentDeparture, o.availability, o.current_housing_status, o.infant_history, @@ -50,6 +52,7 @@ SELECT d.birth, d.death, d.colony, + d.source, d.damMccAlias.externalAlias as dam, d.sireMccAlias.externalAlias as sire, d.dam as originalDam, @@ -61,6 +64,7 @@ SELECT WHEN d.calculated_status = 'Alive' AND (SELECT COUNT(f.flag.value) as total FROM "/data/Colonies/WNPRC/".study.flags f WHERE f.Id = d.Id AND f.isActive = true) > 0 THEN true ELSE false END as u24_status, + d.Id.mostRecentDeparture.mostRecentDeparture, o.availability, o.current_housing_status, o.infant_history, @@ -93,6 +97,7 @@ SELECT d.birth, d.death, d.colony, + d.source, d.damMccAlias.externalAlias as dam, d.sireMccAlias.externalAlias as sire, d.dam as originalDam, @@ -101,6 +106,7 @@ SELECT d.objectid, d.calculated_status, d.u24_status, + d.Id.mostRecentDeparture.mostRecentDeparture, o.availability, o.current_housing_status, o.infant_history, @@ -133,6 +139,7 @@ SELECT d.birth, d.death, d.colony, + d.source, d.damMccAlias.externalAlias as dam, d.sireMccAlias.externalAlias as sire, d.dam as originalDam, @@ -141,6 +148,7 @@ SELECT d.objectid, d.calculated_status, d.u24_status, + d.Id.mostRecentDeparture.mostRecentDeparture, o.availability, o.current_housing_status, o.infant_history, diff --git a/mcc/resources/queries/mcc/aggregatedDemographics/.qview.xml b/mcc/resources/queries/mcc/aggregatedDemographics/.qview.xml new file mode 100644 index 000000000..a5b17c161 --- /dev/null +++ b/mcc/resources/queries/mcc/aggregatedDemographics/.qview.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/mcc/resources/queries/mcc/aggregatedDemographics/Transfers.qview.xml b/mcc/resources/queries/mcc/aggregatedDemographics/Transfers.qview.xml new file mode 100644 index 000000000..a17c66c79 --- /dev/null +++ b/mcc/resources/queries/mcc/aggregatedDemographics/Transfers.qview.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/mcc/resources/queries/mcc/animalRequests.js b/mcc/resources/queries/mcc/animalRequests.js index 952a378e5..e069b428e 100644 --- a/mcc/resources/queries/mcc/animalRequests.js +++ b/mcc/resources/queries/mcc/animalRequests.js @@ -121,10 +121,11 @@ function calculatePreliminaryScore(row, oldRow) { console.error('Unknown MCC institutiontype: ' + row.institutiontype) } - if (['nih', 'other-federal', 'start-up', 'foundation'].indexOf(row.fundingsource) !== -1) { + var fs = row.fundingsource ? row.fundingsource.split(',') : [] + if (fs.indexOf('nih') !== -1 || fs.indexOf('other-federal') !== -1 || fs.indexOf('start-up') !== -1 || fs.indexOf('foundation') !== -1) { score += 1; } - else if (row.fundingsource === 'private' || row.fundingsource === 'no-funding') { + else if (fs.indexOf('private') !== -1 || fs.indexOf('no-funding') !== -1) { // no score change } else { diff --git a/mcc/resources/queries/mcc/animalRequests/Non-Draft.qview.xml b/mcc/resources/queries/mcc/animalRequests/Non-Draft.qview.xml index 835a123cd..1ac293000 100644 --- a/mcc/resources/queries/mcc/animalRequests/Non-Draft.qview.xml +++ b/mcc/resources/queries/mcc/animalRequests/Non-Draft.qview.xml @@ -1,6 +1,8 @@ + + diff --git a/mcc/resources/queries/mcc/requestScores/Pending Requests.qview.xml b/mcc/resources/queries/mcc/requestScores/Pending Requests.qview.xml index 9a0b82fa5..d9c239e9e 100644 --- a/mcc/resources/queries/mcc/requestScores/Pending Requests.qview.xml +++ b/mcc/resources/queries/mcc/requestScores/Pending Requests.qview.xml @@ -1,6 +1,7 @@ - + + diff --git a/mcc/resources/queries/study/departure.query.xml b/mcc/resources/queries/study/departure.query.xml new file mode 100644 index 000000000..af495244e --- /dev/null +++ b/mcc/resources/queries/study/departure.query.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + Destination + + ehr_lookups + source + code + + + + +
+
+
+
\ No newline at end of file diff --git a/mcc/resources/schemas/dbscripts/postgresql/mcc-20.013-20.014.sql b/mcc/resources/schemas/dbscripts/postgresql/mcc-20.013-20.014.sql new file mode 100644 index 000000000..0cc134275 --- /dev/null +++ b/mcc/resources/schemas/dbscripts/postgresql/mcc-20.013-20.014.sql @@ -0,0 +1 @@ +ALTER TABLE mcc.animalrequests add diseasefocus varchar(4000); \ No newline at end of file diff --git a/mcc/resources/schemas/dbscripts/sqlserver/mcc-20.013-20.014.sql b/mcc/resources/schemas/dbscripts/sqlserver/mcc-20.013-20.014.sql new file mode 100644 index 000000000..0cc134275 --- /dev/null +++ b/mcc/resources/schemas/dbscripts/sqlserver/mcc-20.013-20.014.sql @@ -0,0 +1 @@ +ALTER TABLE mcc.animalrequests add diseasefocus varchar(4000); \ No newline at end of file diff --git a/mcc/resources/schemas/mcc.xml b/mcc/resources/schemas/mcc.xml index 3b6e8e167..47dd4816c 100644 --- a/mcc/resources/schemas/mcc.xml +++ b/mcc/resources/schemas/mcc.xml @@ -302,6 +302,9 @@ Neuroscience Relevance true + + Research/Disease Focus + Participate In Census? true diff --git a/mcc/resources/views/mccColony.html b/mcc/resources/views/mccColony.html index 896712d19..a5456a030 100644 --- a/mcc/resources/views/mccColony.html +++ b/mcc/resources/views/mccColony.html @@ -41,6 +41,9 @@ },{ name: 'View Files', url: LABKEY.ActionURL.buildURL('filecontent', 'begin.view') + },{ + name: 'View All MCC Transfers', + url: LABKEY.ActionURL.buildURL('query', 'executeQuery.view', null, {schemaName: 'mcc', queryName: 'aggregatedDemographics', 'query.viewName': 'Transfers'}) }] },{ header: 'Configuration/Data Management', diff --git a/mcc/resources/views/mccRequestAdmin.html b/mcc/resources/views/mccRequestAdmin.html index 153bdcf30..32661a15f 100644 --- a/mcc/resources/views/mccRequestAdmin.html +++ b/mcc/resources/views/mccRequestAdmin.html @@ -44,7 +44,7 @@ frame: 'left-nav', schemaName: 'mcc', queryName: 'requestScores', - //viewName: 'Pending Requests', + viewName: 'Pending Requests', showRecordSelectors: true, showDetailsColumn: true }).render(webpart.wrapperDivId + '-webpartPending'); diff --git a/mcc/resources/web/mcc/window/ChangeStatusWindow.js b/mcc/resources/web/mcc/window/ChangeStatusWindow.js new file mode 100644 index 000000000..3e3e3ddab --- /dev/null +++ b/mcc/resources/web/mcc/window/ChangeStatusWindow.js @@ -0,0 +1,68 @@ +/** + * @cfg dataRegionName + */ +Ext4.define('MCC.window.ChangeStatusWindow', { + extend: 'Ext.window.Window', + + fieldName: 'disabled', + + statics: { + buttonHandler: function(dataRegionName, requestId, status){ + Ext4.create('MCC.window.ChangeStatusWindow', { + dataRegionName: dataRegionName, + requestId: requestId, + status: status + }).show(); + }, + }, + + initComponent: function(){ + Ext4.apply(this, { + modal: true, + title: 'Change Status', + closeAction: 'destroy', + width: 380, + items: [{ + bodyStyle: 'padding: 5px;', + html: 'This will update request #' + this.requestId + ' to: ' + this.status + }], + buttons: [{ + text:'Submit', + disabled:false, + scope: this, + handler: this.onSubmit + },{ + text: 'Close', + handler: function(btn){ + btn.up('window').close(); + } + }] + }); + + this.callParent(arguments); + }, + + onSubmit: function(btn){ + Ext4.Msg.wait('Loading...'); + var dataRegion = this.dataRegionName ? LABKEY.DataRegions[this.dataRegionName] : null; + + LABKEY.Query.updateRows({ + method: 'POST', + schemaName: 'mcc', + queryName: 'animalRequests', + rows: [{ + rowid: this.requestId, + status: this.status + }], + scope: this, + success: function(){ + this.close(); + Ext4.Msg.hide(); + if (dataRegion) { + dataRegion.refresh(); + } + }, + failure: LDK.Utils.getErrorCallback() + }); + } +}); \ No newline at end of file diff --git a/mcc/src/client/AnimalRequest/animal-request.tsx b/mcc/src/client/AnimalRequest/animal-request.tsx index 704af6297..0f34d9349 100644 --- a/mcc/src/client/AnimalRequest/animal-request.tsx +++ b/mcc/src/client/AnimalRequest/animal-request.tsx @@ -132,6 +132,13 @@ export function AnimalRequest() { return "Draft" === requestData.request.status } + function shouldShowWithdraw() + { + const ctx = getServerContext().getModuleContext('mcc') || {}; + + return !!ctx.hasRequestAdminPermission + } + function handleSubmitButton(e, isSubmitting) { setIsSubmitting(isSubmitting); @@ -273,6 +280,7 @@ export function AnimalRequest() { "title": data.get("project-title"), "narrative": data.get("project-narrative"), "neuroscience": data.get("neuroscience"), + "diseasefocus": data.get("diseasefocus"), "lastname": data.get("investigator-last-name"), "firstname": data.get("investigator-first-name"), "middleinitial": data.get("investigator-middle-initial"), @@ -453,7 +461,14 @@ export function AnimalRequest() { - + <Title text="3. Research/Disease Focus*"/> + <div className="tw-w-full tw-px-3 tw-mb-6 md:tw-mb-0"> + <ErrorMessageHandler isSubmitting={isSubmitting}> + <Input id="diseasefocus" ariaLabel="Research/Disease Focus" isSubmitting={isSubmitting} required={doEnforceRequiredFields()} placeholder="What is the research area or disease focus of this project" defaultValue={requestData.request.diseasefocus}/> + </ErrorMessageHandler> + </div> + + <Title text="4. How does the research relate to neuroscience?*"/> <div className="tw-w-full tw-px-3 tw-mb-6 md:tw-mb-0"> <ErrorMessageHandler isSubmitting={isSubmitting}> <TextArea id="neuroscience" ariaLabel="Connection to neuroscience" isSubmitting={isSubmitting} placeholder="How does the research relate to neuroscience" required={doEnforceRequiredFields()} defaultValue={requestData.request.neuroscience}/> @@ -694,6 +709,11 @@ export function AnimalRequest() { <Button onClick={(e) => { handleSubmitButton(e, true); }} text={getSubmitButtonText()} display={hasEditPermission()}/> + + <Button onClick={(e) => { + requestData.request.status = "withdrawn" + handleSubmitButton(e, false); + }} text={"Widthdraw"} display={shouldShowWithdraw()}/> </div> </form> diff --git a/mcc/src/client/RequestReview/components/ReadOnlyRequest.tsx b/mcc/src/client/RequestReview/components/ReadOnlyRequest.tsx index 9cb7933fc..1c6f5b4bd 100644 --- a/mcc/src/client/RequestReview/components/ReadOnlyRequest.tsx +++ b/mcc/src/client/RequestReview/components/ReadOnlyRequest.tsx @@ -91,6 +91,12 @@ export default function ReadOnlyRequest(props: {requestData: AnimalRequestModel} <Grid item xs={10}> {requestData.request.narrative} </Grid> + <Grid item xs={2} className={styles.fieldLabel}> + Research/disease focus: + </Grid> + <Grid item xs={10}> + {requestData.request.diseasefocus} + </Grid> <Grid item xs={2} className={styles.fieldLabel}> Relation to neuroscience: </Grid> diff --git a/mcc/src/client/components/RequestUtils.tsx b/mcc/src/client/components/RequestUtils.tsx index 661e7c70a..9a6974dd1 100644 --- a/mcc/src/client/components/RequestUtils.tsx +++ b/mcc/src/client/components/RequestUtils.tsx @@ -14,6 +14,7 @@ export class AnimalRequestProps { narrative: string; title: string; neuroscience: string; + diseasefocus: string; census: boolean; censusreason: string; middleinitial: string; @@ -88,6 +89,7 @@ export async function queryRequestInformation(requestId, handleFailure) { "narrative", "title", "neuroscience", + "diseasefocus", "census", "censusreason", "terminalprocedures", diff --git a/mcc/src/org/labkey/mcc/MccManager.java b/mcc/src/org/labkey/mcc/MccManager.java index fdbee6eb3..7b5b8d1b7 100644 --- a/mcc/src/org/labkey/mcc/MccManager.java +++ b/mcc/src/org/labkey/mcc/MccManager.java @@ -53,7 +53,8 @@ public enum RequestStatus Approved(5, "Approved", MccRequestAdminPermission.class), Rejected(6, "Rejected", MccRequestAdminPermission.class), Processing(7, "Processing", MccRequestAdminPermission.class), - Fulfilled(8, "Fulfilled", MccRequestAdminPermission.class); + Fulfilled(8, "Fulfilled", MccRequestAdminPermission.class), + Withdrawn(9, "Withdrawn", MccRequestorPermission.class); int sortOrder; String label; diff --git a/mcc/src/org/labkey/mcc/MccModule.java b/mcc/src/org/labkey/mcc/MccModule.java index 0c5ccc55b..1adc4744f 100644 --- a/mcc/src/org/labkey/mcc/MccModule.java +++ b/mcc/src/org/labkey/mcc/MccModule.java @@ -59,7 +59,7 @@ public String getName() @Override public @Nullable Double getSchemaVersion() { - return 20.013; + return 20.014; } @Override diff --git a/mcc/src/org/labkey/mcc/query/MccRequest.java b/mcc/src/org/labkey/mcc/query/MccRequest.java index e8814c94e..300b196b3 100644 --- a/mcc/src/org/labkey/mcc/query/MccRequest.java +++ b/mcc/src/org/labkey/mcc/query/MccRequest.java @@ -13,6 +13,7 @@ public class MccRequest private String _title; private String _narrative; private String _neuroscience; + private String _diseasefocus; private boolean _census; private String _censusReason; diff --git a/mcc/src/org/labkey/mcc/query/RequestScoreActionsDisplayColumnFactory.java b/mcc/src/org/labkey/mcc/query/RequestScoreActionsDisplayColumnFactory.java index 029ccd955..d075223cc 100644 --- a/mcc/src/org/labkey/mcc/query/RequestScoreActionsDisplayColumnFactory.java +++ b/mcc/src/org/labkey/mcc/query/RequestScoreActionsDisplayColumnFactory.java @@ -5,7 +5,6 @@ import org.jetbrains.annotations.NotNull; import org.labkey.api.data.ColumnInfo; import org.labkey.api.data.Container; -import org.labkey.api.data.DataColumn; import org.labkey.api.data.DisplayColumn; import org.labkey.api.data.DisplayColumnFactory; import org.labkey.api.data.RenderContext; @@ -13,6 +12,7 @@ import org.labkey.api.query.FieldKey; import org.labkey.api.security.User; import org.labkey.api.security.UserManager; +import org.labkey.api.util.PageFlowUtil; import org.labkey.api.view.template.ClientDependency; import org.labkey.mcc.MccManager; import org.labkey.mcc.security.MccFinalReviewPermission; @@ -20,6 +20,7 @@ import java.io.IOException; import java.io.Writer; +import java.util.LinkedHashSet; import java.util.Set; public class RequestScoreActionsDisplayColumnFactory implements DisplayColumnFactory @@ -73,6 +74,7 @@ public void renderGridCellContents(RenderContext ctx, Writer out) throws IOExcep { DetailsURL url = DetailsURL.fromString("/mcc/requestReview.view?requestId=" + requestId + "&mode=primaryReview", requestContainer); out.write("<br><a class=\"labkey-text-link\" href=\"" + url.getActionURL().addReturnURL(ctx.getViewContext().getActionURL()) + "\">Enter MCC Internal Review</a>"); + out.write(getWithdrawnLine(ctx, requestRowId)); } } else if (st == MccManager.RequestStatus.RabReview && ctx.get(FieldKey.fromString("pendingRabReviews"), Integer.class) == 0) @@ -81,6 +83,7 @@ else if (st == MccManager.RequestStatus.RabReview && ctx.get(FieldKey.fromString { DetailsURL url = DetailsURL.fromString("/mcc/requestReview.view?requestId=" + requestId + "&mode=resourceAvailability", requestContainer); out.write("<br><a class=\"labkey-text-link\" href=\"" + url.getActionURL().addReturnURL(ctx.getViewContext().getActionURL()) + "\">Enter Resource Availability Assessment</a>"); + out.write(getWithdrawnLine(ctx, requestRowId)); } } else if (st == MccManager.RequestStatus.PendingDecision) @@ -89,11 +92,13 @@ else if (st == MccManager.RequestStatus.PendingDecision) { DetailsURL url = DetailsURL.fromString("/mcc/requestReview.view?requestId=" + requestId + "&mode=finalReview", requestContainer); out.write("<br><a class=\"labkey-text-link\" href=\"" + url.getActionURL().addReturnURL(ctx.getViewContext().getActionURL()) + "\">Enter Final Review</a>"); + out.write(getWithdrawnLine(ctx, requestRowId)); } } else if (st == MccManager.RequestStatus.Approved) { - out.write("<br><a class=\"labkey-text-link\" href=\"javascript:alert('This is not enabled yet')\">Update Animal Availability</a>"); + out.write("<br><a class=\"labkey-text-link\" onclick=\"MCC.window.ChangeStatusWindow.buttonHandler(" + PageFlowUtil.jsString(ctx.getCurrentRegion().getName()) + "," + requestRowId + ", 'Fulfilled')\">Mark Fulfilled</a>"); + out.write(getWithdrawnLine(ctx, requestRowId)); } } catch (IllegalArgumentException e) @@ -115,6 +120,21 @@ public void addQueryFieldKeys(Set<FieldKey> keys) keys.add(getBoundKey("requestId", "status")); keys.add(getBoundKey("requestId" , "rowid")); } + + @Override + public @NotNull Set<ClientDependency> getClientDependencies() + { + Set<ClientDependency> ret = new LinkedHashSet<>(super.getClientDependencies()); + ret.add(ClientDependency.fromPath("LDK/LDKApi.lib.xml")); + ret.add(ClientDependency.fromPath("mcc/window/ChangeStatusWindow.js")); + + return ret; + } }; } + + private String getWithdrawnLine(RenderContext ctx, int requestRowId) + { + return "<br><a class=\"labkey-text-link\" onclick=\"MCC.window.ChangeStatusWindow.buttonHandler(" + PageFlowUtil.jsString(ctx.getCurrentRegion().getName()) + "," + requestRowId + ", 'Withdrawn')\">Withdraw Request</a>"; + } } diff --git a/mcc/test/src/org/labkey/test/tests/mcc/MccTest.java b/mcc/test/src/org/labkey/test/tests/mcc/MccTest.java index a8d35cad8..f609b554f 100644 --- a/mcc/test/src/org/labkey/test/tests/mcc/MccTest.java +++ b/mcc/test/src/org/labkey/test/tests/mcc/MccTest.java @@ -362,6 +362,7 @@ else if ("radio".equals(inputType)) new FormElement("project-narrative", "narrative", "the narrative").inputType("textarea"), new FormElement("investigator-last-name", "lastName", "last name"), new FormElement("neuroscience", "neuroscience", "neuroscience connection").inputType("textarea"), + new FormElement("diseasefocus", "diseasefocus", "my disease focus"), new FormElement("investigator-first-name", "firstName", "first name"), new FormElement("investigator-middle-initial", "middleinitial", "m"), new FormElement("is-early-stage-investigator", "earlystageinvestigator", true).radio(), diff --git a/primeseq/resources/etls/prime-blooddraws.xml b/primeseq/resources/etls/prime-blooddraws.xml new file mode 100644 index 000000000..8faf28096 --- /dev/null +++ b/primeseq/resources/etls/prime-blooddraws.xml @@ -0,0 +1,30 @@ +<?xml version="1.0" encoding="UTF-8"?> +<etl xmlns="http://labkey.org/etl/xml" standalone="false"> + <name>PRIME_Blood_Data</name> + <description>PRIMe Blood Data</description> + <transforms> + <transform type="RemoteQueryTransformStep" id="blood"> + <description>Copy to target</description> + <source remoteSource="PRIME" schemaName="study" queryName="blood" sourceTimeout="0"> + <sourceColumns> + <column>Id</column> + <column>date</column> + <column>reason</column> + <column>quantity</column> + <column>objectid</column> + <column>QCState</column> + </sourceColumns> + </source> + <destination schemaName="study" queryName="blood" targetOption="merge" bulkLoad="true"> + + </destination> + </transform> + </transforms> + <incrementalFilter timestampColumnName="modified" pkColumnName="lsid" className="ModifiedSinceFilterStrategy" > + <deletedRowsSource remoteSource="PRIME" schemaName="auditlog" queryName="DatasetAuditEvent" timestampColumnName="Created" sourceTimeout="0" deletedSourceKeyColumnName="lsid" targetKeyColumnName="lsid"> + <sourceFilters> + <sourceFilter column="datasetid/Name" operator="eq" value="blood" /> + </sourceFilters> + </deletedRowsSource> + </incrementalFilter> +</etl> diff --git a/primeseq/resources/etls/prime-demographics.xml b/primeseq/resources/etls/prime-demographics.xml new file mode 100644 index 000000000..6485f5ee1 --- /dev/null +++ b/primeseq/resources/etls/prime-demographics.xml @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="UTF-8"?> +<etl xmlns="http://labkey.org/etl/xml" standalone="false"> + <name>PRIME_Demographics_Data</name> + <description>PRIMe Demographics Data</description> + <transforms> + <transform type="RemoteQueryTransformStep" id="demographics"> + <description>Copy to target</description> + <source remoteSource="PRIME" schemaName="study" queryName="Demographics" sourceTimeout="0"> + <sourceColumns> + <column>Id</column> + <column>date</column> + <column>gender</column> + <column>geographic_origin</column> + <column>birth</column> + <column>death</column> + <column>species</column> + <column>status</column> + <column>objectid</column> + <column>QCState</column> + </sourceColumns> + </source> + <destination schemaName="study" queryName="Demographics" targetOption="merge" bulkLoad="true"> + + </destination> + </transform> + </transforms> + <incrementalFilter timestampColumnName="modified" pkColumnName="lsid" className="ModifiedSinceFilterStrategy" > + <deletedRowsSource remoteSource="PRIME" schemaName="auditlog" queryName="DatasetAuditEvent" timestampColumnName="Created" sourceTimeout="0" deletedSourceKeyColumnName="lsid" targetKeyColumnName="lsid"> + <sourceFilters> + <sourceFilter column="datasetid/Name" operator="eq" value="blood" /> + </sourceFilters> + </deletedRowsSource> + </incrementalFilter> +</etl> diff --git a/primeseq/resources/etls/prime-parentage.xml b/primeseq/resources/etls/prime-parentage.xml new file mode 100644 index 000000000..107683da9 --- /dev/null +++ b/primeseq/resources/etls/prime-parentage.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<etl xmlns="http://labkey.org/etl/xml" standalone="false"> + <name>PRIME_Parentage_Data</name> + <description>PRIMe Parentage Data</description> + <transforms> + <transform type="RemoteQueryTransformStep" id="demographics"> + <description>Copy to target</description> + <source remoteSource="PRIME" schemaName="study" queryName="Parentage" sourceTimeout="0"> + <sourceColumns> + <column>Id</column> + <column>date</column> + <column>parent</column> + <column>relationship</column> + <column>method</column> + <column>datedisabled</column> + <column>objectid</column> + <column>QCState</column> + </sourceColumns> + </source> + <destination schemaName="study" queryName="Parentage" targetOption="merge" bulkLoad="true"> + + </destination> + </transform> + </transforms> + <incrementalFilter timestampColumnName="modified" pkColumnName="lsid" className="ModifiedSinceFilterStrategy" > + <deletedRowsSource remoteSource="PRIME" schemaName="auditlog" queryName="DatasetAuditEvent" timestampColumnName="Created" sourceTimeout="0" deletedSourceKeyColumnName="lsid" targetKeyColumnName="lsid"> + <sourceFilters> + <sourceFilter column="datasetid/Name" operator="eq" value="parentage" /> + </sourceFilters> + </deletedRowsSource> + </incrementalFilter> +</etl> diff --git a/primeseq/resources/etls/prime-weight.xml b/primeseq/resources/etls/prime-weight.xml new file mode 100644 index 000000000..dba86c54d --- /dev/null +++ b/primeseq/resources/etls/prime-weight.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="UTF-8"?> +<etl xmlns="http://labkey.org/etl/xml" standalone="false"> + <name>PRIME_Parentage_Data</name> + <description>PRIMe Parentage Data</description> + <transforms> + <transform type="RemoteQueryTransformStep" id="weight"> + <description>Copy to target</description> + <source remoteSource="PRIME" schemaName="study" queryName="weight" sourceTimeout="0"> + <sourceColumns> + <column>Id</column> + <column>date</column> + <column>weight</column> + <column>objectid</column> + <column>QCState</column> + </sourceColumns> + </source> + <destination schemaName="study" queryName="weight" targetOption="merge" bulkLoad="true"> + + </destination> + </transform> + </transforms> + <incrementalFilter timestampColumnName="modified" pkColumnName="lsid" className="ModifiedSinceFilterStrategy" > + <deletedRowsSource remoteSource="PRIME" schemaName="auditlog" queryName="DatasetAuditEvent" timestampColumnName="Created" sourceTimeout="0" deletedSourceKeyColumnName="lsid" targetKeyColumnName="lsid"> + <sourceFilters> + <sourceFilter column="datasetid/Name" operator="eq" value="weight" /> + </sourceFilters> + </deletedRowsSource> + </incrementalFilter> +</etl> diff --git a/primeseq/resources/etls/prime.xml b/primeseq/resources/etls/prime.xml new file mode 100644 index 000000000..f84182ab3 --- /dev/null +++ b/primeseq/resources/etls/prime.xml @@ -0,0 +1,43 @@ +<?xml version="1.0" encoding="UTF-8"?> +<etl xmlns="http://labkey.org/etl/xml"> + <name>PRIME_Data</name> + <description>PRIMe Clinical/Demographics Data</description> + <transforms> + <transform id="demographics" type="TaskrefTransformStep"> + <taskref ref="org.labkey.di.steps.QueueJobTask"> + <settings> + <setting name="transformId" value="{primeseq}/prime-demographics"/> + </settings> + </taskref> + </transform> + + <transform id="parentage" type="TaskrefTransformStep"> + <taskref ref="org.labkey.di.steps.QueueJobTask"> + <settings> + <setting name="transformId" value="{primeseq}/prime-parentage"/> + </settings> + </taskref> + </transform> + + <transform id="weight" type="TaskrefTransformStep"> + <taskref ref="org.labkey.di.steps.QueueJobTask"> + <settings> + <setting name="transformId" value="{primeseq}/prime-weight"/> + </settings> + </taskref> + </transform> + + <transform id="blooddraws" type="TaskrefTransformStep"> + <taskref ref="org.labkey.di.steps.QueueJobTask"> + <settings> + <setting name="transformId" value="{primeseq}/prime-blooddraws"/> + </settings> + </taskref> + </transform> + + </transforms> + + <schedule> + <cron expression="0 0 3 * * ?"/> + </schedule> +</etl> diff --git a/tcrdb/resources/schemas/tcrdb.xml b/tcrdb/resources/schemas/tcrdb.xml index 96bb782ad..a6dd79ed1 100644 --- a/tcrdb/resources/schemas/tcrdb.xml +++ b/tcrdb/resources/schemas/tcrdb.xml @@ -171,7 +171,6 @@ <isReadOnly>true</isReadOnly> <isHidden>true</isHidden> <isUserEditable>false</isUserEditable> - <isUnselectable>true</isUnselectable> <fk> <fkColumnName>ObjectUri</fkColumnName> <fkTable>Object</fkTable> @@ -269,7 +268,6 @@ <isReadOnly>true</isReadOnly> <isHidden>true</isHidden> <isUserEditable>false</isUserEditable> - <isUnselectable>true</isUnselectable> <fk> <fkColumnName>ObjectUri</fkColumnName> <fkTable>Object</fkTable> @@ -397,7 +395,6 @@ <isReadOnly>true</isReadOnly> <isHidden>true</isHidden> <isUserEditable>false</isUserEditable> - <isUnselectable>true</isUnselectable> <fk> <fkColumnName>ObjectUri</fkColumnName> <fkTable>Object</fkTable>