Skip to content

Commit

Permalink
Merge branch 'master' into feature/faster_sunbursts
Browse files Browse the repository at this point in the history
  • Loading branch information
eboileau committed Sep 19, 2024
2 parents d9b825e + 2557f7c commit a197ee6
Show file tree
Hide file tree
Showing 13 changed files with 710 additions and 266 deletions.
9 changes: 9 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,15 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/), and this

## [Release candidate] - started 2024-08-15

### Added

- Search table full export
- Search query modalities

### Fixed

- Missing query for chromosome end

## [2.0.6] 2024-08-15

First release.
1 change: 1 addition & 0 deletions client/src/components/search/ChromSelect.vue
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ watch(
showClear
:disabled="disabled"
:placeholder="placeholder"
v-tooltip.top="'Chromosome or gene (mutually exclusive)'"
:pt="{
root: { class: 'w-full md:w-full' }
}"
Expand Down
5 changes: 4 additions & 1 deletion client/src/components/search/GeneSelect.vue
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@ watch(
() => props.selectionIds,
() => {
if (props.selectionIds.length === 0) {
genes.value = null
filteredGenes.value = null
return
}
handleRequestWithErrorReporting(
Expand Down Expand Up @@ -63,8 +65,9 @@ function searchGene(event) {
@complete="searchGene"
@change="$emit('change')"
forceSelection
placeholder="4. Select gene (optional)"
:placeholder="placeholder"
:disabled="disabled"
v-tooltip.top="'Gene or chromosome (mutually exclusive)'"
:pt="{
root: { class: 'w-full md:w-full' },
input: { class: 'w-full md:w-full' }
Expand Down
163 changes: 163 additions & 0 deletions client/src/components/search/ModificationSelect.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,163 @@
<script setup>
import { ref, onMounted } from 'vue'
import { HTTP } from '@/services/API'
import {
updModification,
updOrganismFromMod,
updTechnologyFromModAndOrg,
updSelectionFromAll
} from '@/utils/selection.js'
const selectedModification = defineModel('selectedModification')
const selectedOrganism = defineModel('selectedOrganism')
const selectedTechnology = defineModel('selectedTechnology')
const selectionIds = defineModel('selectionIds')
const taxaId = defineModel('taxaId')
const taxaName = defineModel('taxaName')
const rnaType = defineModel('rnaType')
const selectedGene = defineModel('selectedGene')
const selectedBiotypes = defineModel('selectedBiotypes')
const selectedFeatures = defineModel('selectedFeatures')
const selectedChrom = defineModel('selectedChrom')
const selectedChromStart = defineModel('selectedChromStart')
const selectedChromEnd = defineModel('selectedChromEnd')
const allSelections = ref()
const modifications = ref()
const organisms = ref()
const technologies = ref()
const selectedTechnologyObject = ref()
// utilities to reset options/filters
const clearAll = (value) => {
if (value < 1) {
technologies.value = undefined
selectedOrganism.value = undefined
}
if (value < 2) {
selectedTechnologyObject.value = undefined
selectedTechnology.value = []
}
selectedGene.value = undefined
selectedBiotypes.value = undefined
selectedFeatures.value = undefined
selectedChrom.value = undefined
selectedChromStart.value = undefined
selectedChromEnd.value = undefined
selectionIds.value = []
taxaId.value = 0 // TODO
taxaName.value = undefined
rnaType.value = ''
}
const resetDefaults = () => {
selectedModification.value = undefined
selectedOrganism.value = undefined
selectedTechnology.value = []
selectionIds.value = []
taxaId.value = 0 // TODO
taxaName.value = undefined
rnaType.value = 'WTS' // TODO
selectedGene.value = undefined
selectedBiotypes.value = undefined
selectedFeatures.value = undefined
selectedChrom.value = undefined
selectedChromStart.value = undefined
selectedChromEnd.value = undefined
}
// search callbacks
const updateOrganism = (value) => {
// on first filter (selectedModification) change
clearAll(0)
organisms.value = updOrganismFromMod(allSelections.value, value)
}
const updateTechnology = (value) => {
// on second filter (selectedOrganism) change
clearAll(1)
technologies.value = updTechnologyFromModAndOrg(
allSelections.value,
selectedModification.value,
value
)
}
const updateSelection = (value) => {
// on third filter (selectedTechnologyObject) change
clearAll(2)
let result = updSelectionFromAll(
allSelections.value,
selectedModification.value,
selectedOrganism.value,
value
)
selectedTechnology.value = result.technology
selectionIds.value = result.selection
taxaId.value = result.taxaId
taxaName.value = result.taxaName
rnaType.value = result.rna
}
// lifecyle
onMounted(() => {
HTTP.get('/selections')
.then(function (response) {
allSelections.value = response.data
modifications.value = updModification(allSelections.value)
})
.catch((error) => {
console.log(error)
})
resetDefaults()
})
</script>

<template>
<div class="grid grid-cols-1 md:grid-cols-10 gap-6">
<div class="col-span-3">
<Dropdown
@change="updateOrganism($event.value)"
v-model="selectedModification"
:options="modifications"
optionLabel="label"
optionGroupLabel="label"
optionGroupChildren="children"
placeholder="1. Select RNA modification"
:pt="{
root: { class: 'w-full md:w-full' }
}"
:ptOptions="{ mergeProps: true }"
/>
</div>
<div class="col-span-3">
<CascadeSelect
@change="updateTechnology($event.value)"
v-model="selectedOrganism"
:options="organisms"
optionLabel="label"
optionGroupLabel="label"
:optionGroupChildren="['child1', 'child2']"
placeholder="2. Select organism"
:pt="{
root: { class: 'w-full md:w-full' }
}"
:ptOptions="{ mergeProps: true }"
/>
</div>
<div class="col-span-3">
<TreeSelect
@change="updateSelection($event)"
v-model="selectedTechnologyObject"
:options="technologies"
selectionMode="checkbox"
:metaKeySelection="false"
placeholder="3. Select technology"
:pt="{
root: { class: 'w-full md:w-full' }
}"
:ptOptions="{ mergeProps: true }"
/>
</div>
<div></div>
</div>
</template>
54 changes: 34 additions & 20 deletions client/src/components/search/SearchResults.vue
Original file line number Diff line number Diff line change
@@ -1,17 +1,19 @@
<script setup>
import { computed, onMounted, ref } from 'vue'
import { computed, watch, onMounted, ref } from 'vue'
import { useRouter } from 'vue-router'
import ModificationInfo from '@/components/modification/ModificationInfo.vue'
import { getApiUrl, HTTP } from '@/services/API'
import { fmtFilter, fmtOrder } from '@/utils'
import ChromeRegionEnsembleLink from '@/components/search/ChromeRegionEnsembleLink.vue'
import ChromRegionEnsemblLink from '@/components/search/ChromRegionEnsemblLink.vue'
import GenesilicoModificationLink from '@/components/search/GenesilicoModificationLink.vue'
const props = defineProps({
searchParameters: { type: Object },
taxaName: { type: String },
searchByValue: { type: String },
disabled: { type: Boolean }
})
/*
searchParameters look like this
Expand Down Expand Up @@ -45,6 +47,18 @@ const records = ref()
const router = useRouter()
const disableExportLink = computed(() => props.disabled || loading.value)
const exportLink = computed(() => getExportLink())
const endPoint = computed(() => (props.searchByValue === 'Modification' ? '' : '/gene'))
watch(
() => props.disabled,
() => {
if (props.disabled) {
records.value = undefined
totalRecords.value = 0
}
},
{ immediate: true }
)
onMounted(() => loadData())
Expand All @@ -66,23 +80,22 @@ function onOverlay(record) {
}
function loadData() {
if (props.disabled) {
return
}
loading.value = true
const params = getQueryParams(firstRecord.value, maxRecords.value)
HTTP.get('/modification/', {
params: params,
paramsSerializer: { indexes: null }
})
.then(function (response) {
records.value = response.data.records
totalRecords.value = response.data.totalRecords
loading.value = false
})
.catch((error) => {
console.log(error)
if (!props.disabled) {
loading.value = true
const params = getQueryParams(firstRecord.value, maxRecords.value)
HTTP.get(`/modification/query${endPoint.value}`, {
params: params,
paramsSerializer: { indexes: null }
})
.then(function (response) {
records.value = response.data.records
totalRecords.value = response.data.totalRecords
loading.value = false
})
.catch((error) => {
console.log(error)
})
}
}
function getQueryParams(myFirstRecord = null, myMaxRecords = null) {
Expand Down Expand Up @@ -115,7 +128,7 @@ function getExportLink() {
return ''
}
const rawParams = getQueryParams()
const url = new URL(getApiUrl('modification/csv'))
const url = new URL(getApiUrl(`modification/csv${endPoint.value}`))
for (const [k, v] of Object.entries(rawParams)) {
if (v != null) {
if (Array.isArray(v)) {
Expand All @@ -128,6 +141,7 @@ function getExportLink() {
return url.toString()
}
</script>

<template>
<DataTable
:value="records"
Expand Down Expand Up @@ -182,7 +196,7 @@ function getExportLink() {
<Column field="chrom" header="Chrom" sortable></Column>
<Column field="start" header="Start" sortable>
<template #body="{ data }">
<ChromeRegionEnsembleLink
<ChromRegionEnsemblLink
:taxa-name="taxaName"
:chrom="data.chrom"
:start="data.start"
Expand Down
Loading

0 comments on commit a197ee6

Please sign in to comment.