Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
48 changes: 48 additions & 0 deletions database/schema/run.js
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,49 @@ const UploadNamesSchema = new mongoose.Schema ({
}
})

const PlotQuerySchema = new mongoose.Schema ({
activeResult: {
type: String,
default: null
},
selectedQC: {
type: String,
default: null
},
selectedFeature: {
type: String,
default: null
},
selectedFeatures: {
type: [String],
default: null
},
selectedScaleBy: {
type: String,
default: null
},
selectedExpRange: {
type: [String],
default: null
},
selectedGroup: {
type: String,
default: null
},
selectedAssay: {
type: String,
default: null
},
selectedDiffExpression: {
type: String,
default: null
},
selectedQCDataset: {
type: mongoose.Schema.Types.ObjectId,
default: null
},
})

const RunSchema = new mongoose.Schema({
runID: {
type: mongoose.Schema.Types.ObjectId,
Expand Down Expand Up @@ -109,6 +152,11 @@ const RunSchema = new mongoose.Schema({
uploadNames: {
type: UploadNamesSchema,
default: {metadata: null, gsva: null},
},

savedPlotQueries: {
type: [PlotQuerySchema],
default: []
}
})

Expand Down
43 changes: 42 additions & 1 deletion graphql/schema/run/resolvers.js
Original file line number Diff line number Diff line change
Expand Up @@ -240,7 +240,48 @@ const resolvers = {
run.name = newName
await run.save()
return run
}
},

savePlotQuery: async (parent, {runID, input}, {Runs}) => {
try {
const run = await Runs.findOne({runID})
run.savedPlotQueries = [...run.savedPlotQueries, R.omit(['plotQueryID'], input)]
await run.save()
return run
} catch (err) {
console.log(err)
}
},

updateSavedPlotQuery: async (parent, {runID, input}, {Runs}) => {
try {
const run = await Runs.findOne({runID})
const plotQueryIndex = R.findIndex(R.propEq('id', input.plotQueryID))(run.savedPlotQueries);
const fieldsToChange = R.compose(
R.reduce((obj, field) => {
obj[`savedPlotQueries.${plotQueryIndex}.${field}`] = input[field]
return obj
}, {}),
R.keys(R.__),
R.omit(['plotQueryID'])
)(input)
await Runs.updateOne({runID}, {$set: fieldsToChange})
return run
} catch (err) {
console.log(err)
}
},

removeSavedPlotQuery: async (parent, {runID, plotQueryID}, {Runs}) => {
try {
const run = await Runs.findOne({runID})
run.savedPlotQueries = R.filter(query => !R.equals(query.id, plotQueryID), run.savedPlotQueries)
await run.save()
return run
} catch (err) {
console.log(err)
}
},
},
Run: {
createdBy: async({createdBy}, variables, {Users}) => {
Expand Down
43 changes: 43 additions & 0 deletions graphql/schema/run/typeDefinitions.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,34 @@ const typeDefs = gql`
metadata: String
}

type PlotQuery {
id: ID
activeResult: String
selectedQC: String
selectedFeature: String
selectedFeatures: [String]
selectedScaleBy: String
selectedExpRange: [String]
selectedGroup: String
selectedAssay: String
selectedDiffExpression: String
selectedQCDataset: ID
}

input PlotQueryInput {
plotQueryID: ID
activeResult: String
selectedQC: String
selectedFeature: String
selectedFeatures: [String]
selectedScaleBy: String
selectedExpRange: [String]
selectedGroup: String
selectedAssay: String
selectedDiffExpression: String
selectedQCDataset: ID
}

type Run {
runID: ID
createdOn: Date
Expand All @@ -43,6 +71,8 @@ const typeDefs = gql`
datasets: [Dataset]
# Datasets selected within a run to act as reference/anchors for CWL
referenceDatasets: [Dataset]

savedPlotQueries: [PlotQuery]
}
type Query {
allRuns: [Run]
Expand Down Expand Up @@ -113,6 +143,19 @@ const typeDefs = gql`
updateRunName(
runID: ID!
newName: String!
savePlotQuery(
runID: ID!,
input: PlotQueryInput!
): Run

updateSavedPlotQuery(
runID: ID!,
input: PlotQueryInput!
): Run

removeSavedPlotQuery(
runID: ID!,
plotQueryID: ID!
): Run

}
Expand Down
7 changes: 7 additions & 0 deletions react/src/apollo/hooks/run/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,10 @@ import useUploadRunMetadataMutation from './useUploadRunMetadataMutation'
import useUploadRunGenesetMutation from './useUploadRunGenesetMutation'
import useUpdateRunReferenceDatasetsMutation from './useUpdateRunReferenceDatasetsMutation'
import useEditRunDetailsMutation from './useEditRunDetailsMutation'
import useSavePlotQueryMutation from './useSavePlotQueryMutation'
import useRemoveSavedPlotQueryMutation from './useRemoveSavedPlotQueryMutation'
import useUpdateSavedPlotQueryMutation from './useUpdateSavedPlotQueryMutation'


export {
useRunDetailsQuery,
Expand All @@ -30,4 +34,7 @@ export {
useUploadRunGenesetMutation,
useUpdateRunReferenceDatasetsMutation,
useEditRunDetailsMutation,
useSavePlotQueryMutation,
useRemoveSavedPlotQueryMutation,
useUpdateSavedPlotQueryMutation
}
36 changes: 36 additions & 0 deletions react/src/apollo/hooks/run/useRemoveSavedPlotQueryMutation.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
import { useMutation } from '@apollo/react-hooks'
import { gql } from 'apollo-boost'
import * as RA from 'ramda-adjunct'

export default function useRemoveSavedPlotQueryMutation(
runID,
plotQueryID,
updatePlotQueryID
) {
const [removeSavedPlotQuery, {loading, error}] = useMutation(gql`
mutation RemoveSavedPlotQuery(
$runID: ID!,
$plotQueryID: ID!
) {
removeSavedPlotQuery(
runID: $runID,
plotQueryID: $plotQueryID
) {
runID
savedPlotQueries {
id
}
}
}
`, {
variables: {
runID, plotQueryID
},
onCompleted: ({removeSavedPlotQuery}) => {
if (RA.isNotNil(removeSavedPlotQuery)) {
updatePlotQueryID()
}
}
})
return {removeSavedPlotQuery, loading}
}
14 changes: 14 additions & 0 deletions react/src/apollo/hooks/run/useRunDetailsQuery.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,20 @@ export default function useRunDetails(runID) {

status

savedPlotQueries {
id
activeResult
selectedQC
selectedFeature
selectedFeatures
selectedGroup
selectedAssay
selectedDiffExpression
selectedQCDataset
selectedScaleBy
selectedExpRange
}

secondaryRuns {
wesID
status
Expand Down
37 changes: 37 additions & 0 deletions react/src/apollo/hooks/run/useSavePlotQueryMutation.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
import { useMutation } from '@apollo/react-hooks'
import { gql } from 'apollo-boost'
import * as RA from 'ramda-adjunct'
import * as R from 'ramda'

export default function useSavePlotQueryMutation(
runID,
input,
updatePlotQueryID
) {
const [savePlotQuery, {loading, error}] = useMutation(gql`
mutation SavePlotQuery(
$runID: ID!,
$input: PlotQueryInput!
) {
savePlotQuery(
runID: $runID,
input: $input
) {
runID
savedPlotQueries {
id
}
}
}
`, {
variables: {
runID, input
},
onCompleted: ({savePlotQuery}) => {
if (RA.isNotNil(savePlotQuery)) {
updatePlotQueryID(R.last(savePlotQuery.savedPlotQueries).id)
}
}
})
return {savePlotQuery, loading}
}
26 changes: 26 additions & 0 deletions react/src/apollo/hooks/run/useUpdateSavedPlotQueryMutation.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import { useMutation } from '@apollo/react-hooks'
import { gql } from 'apollo-boost'

export default function useUpdateSavedPlotQueryMutation(
runID,
input,
) {
const [updateSavedPlotQuery, {loading, error}] = useMutation(gql`
mutation UpdateSavedPlotQuery(
$runID: ID!,
$input: PlotQueryInput!
) {
updateSavedPlotQuery(
runID: $runID,
input: $input
) {
runID
}
}
`, {
variables: {
runID, input
},
})
return {updateSavedPlotQuery, loading}
}
6 changes: 4 additions & 2 deletions react/src/components/main/resultsPage/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import SidebarComponent from './sidebar'
import ParametersComponent from './parameters'
import VisualizationsComponent from './visualizations'

import {resetResultsPage, setActiveSidebarTab} from '../../../redux/actions/resultsPage'
import {resetResultsPage, setActiveSidebarTab, addSavedPlots} from '../../../redux/actions/resultsPage'
import {useCrescentContext} from '../../../redux/hooks'
import {useDispatch} from 'react-redux'
import {useRunDetailsQuery} from '../../../apollo/hooks/run'
Expand All @@ -30,12 +30,14 @@ const ResultsPageComponent = ({
const runIsIncomplete = R.includes(status, ['pending'])
const sidebarTab = runIsIncomplete ? 'parameters' : 'visualizations' //'parameters' replaced by 'data', is disabled unless run.referenceDatasets is nonempty
dispatch(setActiveSidebarTab({sidebarTab}))
// add the saved plot queries
dispatch(addSavedPlots({value: R.map(plotQuery => RA.renameKeys({ id: 'plotQueryID'})(plotQuery), run.savedPlotQueries)}))
}
}, [run])
if (R.isNil(run)) {
return null
}

return (
<Fade duration={2000}>
<Segment basic style={{minHeight: 'calc(100vh - 10rem)'}} as={Grid} stretched columns={1}>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ const QualityControlMenu = ({
const datasetsOptions = useRunDatasetsDropdownQuery(runID, {
onNonEmptyOptions: options => {
const [{value}] = options
dispatch(setSelectedQCDataset({value}))
if (!selectedQCDataset) dispatch(setSelectedQCDataset({value}))
}
})
const [current, send] = useMachineService()
Expand Down
Loading