From b57dd27a93306a0bbd3696fde3e66fa77350df32 Mon Sep 17 00:00:00 2001 From: Remi PLANEL <rplanel@pasteur.fr> Date: Fri, 15 Dec 2023 18:53:57 +0100 Subject: [PATCH] Cell distri --- components/LayoutWrapper.vue | 4 +- components/Nav/Drawer.vue | 24 +-- components/ServerDbTable.vue | 128 ++++++++----- components/content/MolstarPdbePlugin.vue | 2 +- components/content/RefseqDb.vue | 218 +++++++++++++++-------- components/content/StructureDb.vue | 17 +- content/4.refseq.md | 13 ++ content/5.structure.md | 4 + stores/facets.ts | 26 --- 9 files changed, 274 insertions(+), 162 deletions(-) delete mode 100644 stores/facets.ts diff --git a/components/LayoutWrapper.vue b/components/LayoutWrapper.vue index 872c0d51..174b7931 100644 --- a/components/LayoutWrapper.vue +++ b/components/LayoutWrapper.vue @@ -38,7 +38,9 @@ function onScroll() { <v-row justify="center"> <v-col cols="auto"> <v-card flat color="transparent" :min-width="mobile ? undefined : 900" :max-width="fluid ? undefined : 1500"> - <slot /> + <v-card-text> + <slot /> + </v-card-text> <EditGitlab v-if="edit" /> <NavPrevNext v-if="edit" /> </v-card> diff --git a/components/Nav/Drawer.vue b/components/Nav/Drawer.vue index 645e512f..a0bb7e91 100644 --- a/components/Nav/Drawer.vue +++ b/components/Nav/Drawer.vue @@ -13,23 +13,23 @@ import { useDisplay, useTheme } from "vuetify"; const { navigation, page } = useContent(); // const drawer = ref(true); -// const computedNavigation = computed(() => { -// return navigation.value -// .filter((item: { layout: string }) => { -// if (item?.layout === "db") { -// console.log(item) -// return false -// } -// return true -// // return item?.layout !== "db" -// }) +const computedNavigation = computed(() => { + return navigation.value + .filter((item: { layout: string }) => { + if (item?.layout === "db") { + console.log(item) + return false + } + return true + // return item?.layout !== "db" + }) -// }); +}); </script> <template> <v-navigation-drawer :model-value="drawer" :border="1" color="background"> <v-list nav density="compact" :lines="false"> - <NavNavigation :navigation="navigation" /> + <NavNavigation :navigation="computedNavigation" /> </v-list> </v-navigation-drawer> </template> \ No newline at end of file diff --git a/components/ServerDbTable.vue b/components/ServerDbTable.vue index b85e8eeb..c0ffaa00 100644 --- a/components/ServerDbTable.vue +++ b/components/ServerDbTable.vue @@ -2,9 +2,10 @@ // import type { FacetDistribution } from "meilisearch"; import { useSlots } from 'vue' import { useDisplay } from "vuetify"; -import { useFacetsStore } from '~~/stores/facets' - - +import * as Plot from "@observablehq/plot"; +import PlotFigure from "~/components/PlotFigure"; +import * as d3 from "d3"; +import { useThrottleFn } from '@vueuse/core' import { useMeiliSearch } from "#imports" export interface SortItem { key: string, @@ -36,17 +37,15 @@ const props = withDefaults(defineProps<Props>(), { -console.log(props.dataTableServerProps) - const slots = useSlots() const sortByRef = toRef(props.sortBy) const facetsRef = toRef(props.facets) - +const emit = defineEmits(["refresh:search"]) const { search: msSearch, result: msResult } = useMeiliSearch(props.db) -const facetStore = useFacetsStore() const search: Ref<string> = ref(""); const filterOrSearch: Ref<FilterItem[] | null> = ref(null) const hitsPerPage: Ref<number> = ref(25) +const itemsPerPage: Ref<number[]> = ref([25, 50, 100]) const filterError: Ref<string | null> = ref(null) const msFilter: Ref<string | undefined> = ref(undefined) const page = ref(1) @@ -58,6 +57,7 @@ const computedTableHeight = computed(() => { const computedHeight = height.value - 350 return computedHeight > minTableHeight.value ? computedHeight : minTableHeight.value }) +const plddtRange = ref([0, 100]) // const { pending: pendingDownloadData, downloadCsv } = useCsvDownload(props.db, `df-${props.db}`) @@ -126,7 +126,40 @@ watch([paginationParams, msSortBy, page], ([newParams, newSort, newPage]) => { onMounted(async () => { searchOrFilter() }) + +const hasPlddt = computed(() => props.db === 'structure') + // Fetch results +const plddtFilter = computed(() => { + const plddtRangeValue = plddtRange.value + if (hasPlddt.value && plddtRangeValue?.length === 2) { + return `plddts ${plddtRangeValue[0]} TO ${plddtRangeValue[1]}` + } else { + return undefined + } + +}) + + +const computedFilter = computed(() => { + if (toValue(msFilter)) { + if (toValue(plddtFilter)) { + return `${toValue(msFilter)} AND ${toValue(plddtFilter)}` + } + else { + return toValue(msFilter) + } + } else { + if (toValue(plddtFilter)) { + return `${toValue(plddtFilter)}` + } + else { + return undefined + } + } +}) + + const msError = computed(() => { if (filterError.value?.type && filterError.value?.message) { @@ -134,16 +167,26 @@ const msError = computed(() => { } else { return false } }) +const throttleSearch = useThrottleFn(async () => { searchOrFilter() }, 300) + async function searchOrFilter(pagination = true) { + + // do something, it will be called at most 1 time per second try { loading.value = true // const q = queryInputValue.value === null ? "" : queryInputValue.value const q = search.value + emit("refresh:search", { + index: props.db, + query: q, + params: { ...notPaginatedParams.value, filter: toValue(computedFilter), sort: msSortBy.value } + }) if (pagination) { - await msSearch(q, { ...paginationParams.value, filter: msFilter.value, sort: msSortBy.value }) + await msSearch(q, { ...paginationParams.value, filter: toValue(computedFilter), sort: msSortBy.value }) + } else { - await msSearch(q, { ...notPaginatedParams.value, filter: msFilter.value, sort: msSortBy.value }) + await msSearch(q, { ...notPaginatedParams.value, filter: toValue(computedFilter), sort: msSortBy.value }) } } catch (error: any) { @@ -153,9 +196,11 @@ async function searchOrFilter(pagination = true) { finally { loading.value = false } + } + function clearFilterOrSearch() { filterOrSearch.value = null searchOrFilter() @@ -167,11 +212,6 @@ watch(msFilter, async (fos) => { }) -watch(msResult, (newRes) => { - facetStore.setFacets({ facetDistribution: newRes.facetDistribution, facetStat: newRes.facetStat }) -}, { deep: true }) - - const totalHits = computed(() => { return toValue(msResult)?.totalHits ?? toValue(msResult)?.estimatedTotalHits ?? 0 @@ -195,7 +235,7 @@ watch(filterInputValues, (newSoF) => { }) watch(search, () => { searchOrFilter() }) - +// watch(plddtRange, () => { searchOrFilter() }) const filterStep = computed(() => { return filterInputValues.value !== null && filterInputValues.value.length > 0 ? filterInputValues.value?.length % 3 : null }) @@ -239,7 +279,7 @@ const autocompleteItems = computed(() => { const { type, value } = filterOrSearch.value?.slice(-2, -1)[0] const sanitizedValue = value.split("-")[0] // console.log("compute new facets") - const facetDistri = facetStore.facets?.facetDistribution + const facetDistri = msResult.value?.facetDistribution // console.log(facetDistri) return facetDistri?.[sanitizedValue] ? Object.entries(facetDistri[sanitizedValue]).map(([key, val]) => { return { @@ -276,32 +316,19 @@ function clearSearch() { -// function runTextSearch() { -// if (canAddTextSearch) { -// const item: FilterItem = reactive({ -// type: 'text', title: search.value, value: search.value, deletable: true, props: { type: "text", deletable: true, } -// }) -// if (Array.isArray(filterOrSearch.value)) { -// filterOrSearch.value = [ -// ...filterOrSearch.value, item -// ] -// } else { -// filterOrSearch.value = [item] -// } -// search.value = "" -// searchOrFilter() -// } -// } +// const groupSortDomain = computed(() => { +// console.log(msResult.value) +// return msResult.value ? d3.groupSort(msResult.value?.hits?.filter((d) => d.phylum), (g) => d3.median(g, (d) => d.phylum), (d) => d.type) : [] +// }) -// function downloadData() { -// downloadCsv(search, msFilter, msSortBy, notPaginatedParams) -// } </script> <template> <v-card flat color="transparent"> + <v-card-text> + </v-card-text> <v-card-text> <v-row> <v-col cols="5"> @@ -327,23 +354,28 @@ function clearSearch() { </v-autocomplete> </v-col> </v-row> + <v-row v-if="props.db === 'structure'"> + <v-col> + <v-range-slider v-model="plddtRange" density="compact" hide-details="auto" label="pLDDT" step="0.1" + @update:modelValue="throttleSearch()"> + <template v-slot:prepend> + <span hide-details single-line type="number" variant="outlined" density="compact" + style="width: 70px">{{ plddtRange[0] }}</span> + </template> + <template v-slot:append> + <span hide-details single-line type="number" variant="outlined" style="width: 70px" + density="compact">{{ plddtRange[1] }}</span> + </template> + + </v-range-slider> + </v-col> + </v-row> </v-card-text> <v-data-table-server v-if="!msError" v-model:page="page" color="primary" v-bind="dataTableServerProps" v-model:items-per-page="hitsPerPage" v-model:sortBy="sortByRef" v-model:expanded="expanded" fixed-header :loading="loading" :items="msResult?.hits ?? []" :items-length="totalHits" density="compact" - :height="computedTableHeight" class="elevation-1 mt-2"> - <template #top> - <v-toolbar><v-toolbar-title class="text-capitalize"> - {{ props.db }} - </v-toolbar-title><v-spacer></v-spacer> - - - <!-- <v-btn :loading="pendingDownloadData" :disabled="totalHits > 10000" @click="downloadData" icon - variant="text" class="text-none mr-15"> - <v-badge :content="totalHits" color="info" floating> - <v-icon>md:download</v-icon></v-badge></v-btn> --> - </v-toolbar> - </template> + :items-per-page-options="itemsPerPage" :height="computedTableHeight" class="elevation-1 mt-2"> + <template v-for="(slot, index) of Object.keys(slots)" :key="index" v-slot:[slot]="data"> <slot :name="slot" v-bind="data"></slot> </template> diff --git a/components/content/MolstarPdbePlugin.vue b/components/content/MolstarPdbePlugin.vue index adc59535..79949bc6 100644 --- a/components/content/MolstarPdbePlugin.vue +++ b/components/content/MolstarPdbePlugin.vue @@ -196,7 +196,7 @@ const moleculeFormat: Ref<string> = ref("pdb") <template> <span class="d-flex flex-wrap align-center justify-center"> <v-col> - <v-btn v-if="uniq" size="x-small" variant="tonal" icon="mdi-molecule" @click="setSelectedPdbToFirst()"></v-btn> + <v-btn v-if="uniq" size="x-small" variant="tonal" icon="md:visibility" @click="setSelectedPdbToFirst()"></v-btn> <v-select v-else v-model="selectedPdb" label="Select PDB" :items="refinedDataUrls" hide-details="auto"> </v-select> </v-col> diff --git a/components/content/RefseqDb.vue b/components/content/RefseqDb.vue index f78fdb69..44b23ff4 100644 --- a/components/content/RefseqDb.vue +++ b/components/content/RefseqDb.vue @@ -1,17 +1,15 @@ <script setup lang="ts"> -import { useFacetsStore } from '~~/stores/facets' import * as Plot from "@observablehq/plot"; import PlotFigure from "~/components/PlotFigure"; import { useDisplay } from "vuetify"; import type { SortItem } from "@/components/ServerDbTable.vue" import { ServerDbTable } from "#components" -const facetStore = useFacetsStore() const sortBy: Ref<SortItem[]> = ref([{ key: 'type', order: "asc" }]) const itemValue = ref("id"); const { width } = useDisplay(); -const distriTool: Ref<string[]> = ref([]) +const scaleTransform: Ref<string[]> = ref([]) const facets = ref([ "replicon", @@ -50,11 +48,9 @@ const headers = ref([ sortable: false } ]) -const logTransform = computed(() => { - return distriTool.value.includes('log') -}) + const fullWidth = computed(() => { - return distriTool.value.includes('fullwidth') + return layoutPlot.value === 'fullwidth' }) const computedHeaders = computed(() => { return [...headers.value, ...availableTaxo.value.map(taxo => { @@ -64,12 +60,38 @@ const computedHeaders = computed(() => { } })] }) +const { result: msResult } = useMeiliSearch('refseq') const computedWidth = computed(() => { const currentWidth = fullWidth.value ? width.value : width.value / 2 return Math.max(currentWidth, 550); }); +const allHits = ref([]) +onMounted(async () => { + const params = { + facets: ["*"], + filter: [], + sort: ["type:asc"], + limit: 500000 + } + await getAllHits({ index: "refseq", params, query: "" }) +}) + +async function getAllHits(params) { + console.log("refresh hits") + console.log(params) + console.log(params.index) + if (params.index === 'refseq') { + console.log(params.index) + const { data, error } = await useAsyncMeiliSearch(params) + console.log(error.value) + console.log(data.value) + allHits.value = data.value + } +} + + const plotHeight = computed(() => { return computedWidth.value / 3; // return 500 @@ -87,11 +109,10 @@ const dataTableServerProps = computed(() => { } }) const defaultBarPlotOptions = computed(() => { - const y = logTransform.value ? { nice: true, grid: true, type: 'symlog' } : { nice: true, grid: true, type: "linear" } - // const y = { nice: true, grid: true } + return { x: { label: null, tickRotate: 45, ticks: 10 }, - y, + y: { grid: true, type: scaleType.value }, color: { legend: true }, width: computedWidth.value, height: plotHeight.value + 100, @@ -99,11 +120,10 @@ const defaultBarPlotOptions = computed(() => { }) const computedSystemDistribution = computed(() => { - if (facetStore.facets?.facetDistribution?.type) { - return Object.entries(facetStore.facets.facetDistribution.type).map(([key, value]) => { + if (toValue(msResult)?.facetDistribution?.type) { + return Object.entries(toValue(msResult).facetDistribution.type).map(([key, value]) => { return { type: key, - // count: logTransform.value ? Math.log(value) : value count: value } }).sort() @@ -129,8 +149,8 @@ const computedDistriSystemOptions = computed(() => { }; }); const computedTaxonomyDistribution = computed(() => { - if (facetStore.facets?.facetDistribution?.[selectedTaxoRank.value]) { - return Object.entries(facetStore.facets.facetDistribution[selectedTaxoRank.value]).map(([key, value]) => { + if (toValue(msResult)?.facetDistribution?.[selectedTaxoRank.value]) { + return Object.entries(toValue(msResult).facetDistribution[selectedTaxoRank.value]).map(([key, value]) => { return { [selectedTaxoRank.value]: key, count: value @@ -172,71 +192,125 @@ function namesToAccessionChips(names: string[]) { return { ...it, href: new URL(it.title, "http://toto.pasteur.cloud").toString() } }) } -const taxoPanel: Ref<number> = ref(0) -const systemPanel: Ref<number> = ref(0) +const systemPanel: Ref<number> = ref(["table"]) +const layoutPlot: Ref<string[]> = ref("grid") + +const binPlotOptions = ref({ + marginLeft: 150, + marginBottom: 200, + padding: 0, + width: 1920, + grid: true, + x: { tickRotate: 90, tip: true, }, + + color: { scheme: "turbo", legend: true }, +}) + +const binPlotDataOptions = computed(() => { + return allHits.value?.hits?.length > 0 ? { + ...binPlotOptions.value, + color: { + ...binPlotOptions.value.color, + type: scaleType.value + }, + // fy: { domain: groupSortDomain.value }, + marks: [ + Plot.cell(allHits.value?.hits ?? [], Plot.group({ fill: "count" }, { x: "type", y: selectedTaxoRank.value, tip: true, inset: 0.5, sort: { y: "fill" } })), + ] + } : null +}) +const scaleType = ref("linear") </script> <template> <v-card flat class="mb-2" color="transparent"> - <v-toolbar density="compact"> - <v-toolbar-title>Distributions</v-toolbar-title> - <v-btn-toggle v-model="distriTool" multiple density="compact" rounded="false" variant="text" color="primary" + <v-toolbar> + <!-- <v-toolbar-title>Plots</v-toolbar-title> --> + <v-btn-toggle v-model="layoutPlot" density="compact" rounded="false" variant="text" color="primary" mandatory class="mx-2"> - <v-btn icon="md:fullscreen" value="fullwidth"></v-btn> - <v-btn icon="mdi-math-log" value="log"></v-btn> + <v-btn icon="md:grid_view" value="grid"></v-btn> + <v-btn icon="md:view_agenda" value="fullwidth"></v-btn> </v-btn-toggle> + <v-spacer></v-spacer> + <v-select v-model="selectedTaxoRank" :items="availableTaxo" density="compact" label="Select taxonomic rank" + hide-details="auto" class="mx-2"></v-select> + + + <!-- <v-btn-toggle v-model="scaleTransform" density="compact" mandatory rounded="false" variant="text" + color="primary" class="mx-2"> + <v-btn icon="mdi-math-log" value="linear">linear</v-btn> + <v-btn value="pow">pow</v-btn> + <v-btn icon="mdi-math-log" value="sqrt">sqrt</v-btn> + <v-btn icon="mdi-math-log" value="symlog">symlog</v-btn> + <v-btn icon="mdi-math-log" value="log">log</v-btn> + </v-btn-toggle> --> + + <v-select v-model="scaleType" class="mx-2" density="compact" :items="['linear', 'sqrt', 'symlog']" + label="Scale Type" hide-details="auto"></v-select> + + </v-toolbar> - <v-row align="start" class="my-2"> - - <v-col :cols="fullWidth ? 12 : 6"> - - <v-card color="transparent" flat> - <v-expansion-panels v-model="systemPanel"> - <v-expansion-panel elevation="3"> - <v-expansion-panel-title color="grey-lighten-4">Systems</v-expansion-panel-title> - <v-expansion-panel-text> - <PlotFigure :options="unref(computedDistriSystemOptions)" defer></PlotFigure> - </v-expansion-panel-text> - </v-expansion-panel> - </v-expansion-panels> - </v-card> - </v-col> - <v-col :cols="fullWidth ? 12 : 6"> - <v-card flat color="transparent"> - <v-expansion-panels v-model="taxoPanel"> - <v-expansion-panel elevation="3" :value="true"> - <v-expansion-panel-title color="grey-lighten-4"> - Taxonomic - - - </v-expansion-panel-title> - <v-expansion-panel-text> - <v-select v-model="selectedTaxoRank" :items="availableTaxo" density="compact" - label="Select taxonomic rank"></v-select> - - - <PlotFigure defer :options="unref(computedDistriTaxoOptions)"></PlotFigure> - - </v-expansion-panel-text> - </v-expansion-panel> - </v-expansion-panels> - </v-card> - </v-col> - </v-row> + + + <v-card color="transparent" flat> + <v-expansion-panels v-model="systemPanel" class="my-2" density="compact" multiple> + <v-expansion-panel elevation="3" value="barplot"> + <v-expansion-panel-title color="grey-lighten-4"><v-icon color="primary" + class="mr-2">mdi-chart-bar</v-icon>Systems - Taxonomic</v-expansion-panel-title> + <v-expansion-panel-text> + <v-card flat color="transparent"> + + <v-row align="start"> + <v-col :cols="fullWidth ? 12 : 6"> + <PlotFigure :options="unref(computedDistriSystemOptions)" defer></PlotFigure> + + </v-col> + <v-col :cols="fullWidth ? 12 : 6"> + + <PlotFigure defer :options="unref(computedDistriTaxoOptions)"></PlotFigure> + + </v-col> + </v-row> + </v-card> + + </v-expansion-panel-text> + </v-expansion-panel> + <v-expansion-panel elevation="3" value="matrix"> + <v-expansion-panel-title color="grey-lighten-4"><v-icon color="primary" + class="mr-2">mdi-data-matrix</v-icon>Matrix</v-expansion-panel-title> + <v-expansion-panel-text> + <v-card flat color="transparent"> + <PlotFigure v-if="toValue(binPlotDataOptions) !== null" :options="unref(binPlotDataOptions)" + defer> + </PlotFigure> + </v-card> + </v-expansion-panel-text> + </v-expansion-panel> + <v-expansion-panel elevation="3" value="table"> + <v-expansion-panel-title color="grey-lighten-4"><v-icon color="primary" + class="mr-2">mdi-table</v-icon>Table</v-expansion-panel-title> + <v-expansion-panel-text> + <ServerDbTable title="RefSeq" db="refseq" :sortBy="sortBy" :facets="facets" + :data-table-server-props="dataTableServerProps" @refresh:search="getAllHits"> + <template #top> + <v-toolbar><v-toolbar-title class="text-capitalize"> + RefSeq + </v-toolbar-title><v-spacer></v-spacer> + + </v-toolbar> + </template> + <template #[`item.accession_in_sys`]="{ item }"> + <CollapsibleChips :items="namesToAccessionChips(item.accession_in_sys)"> + </CollapsibleChips> + </template> + </ServerDbTable> + </v-expansion-panel-text> + </v-expansion-panel> + </v-expansion-panels> + + </v-card> + </v-card> - <ServerDbTable title="RefSeq" db="refseq" :sortBy="sortBy" :facets="facets" - :data-table-server-props="dataTableServerProps"> - <template #top> - <v-toolbar><v-toolbar-title class="text-capitalize"> - RefSeq - </v-toolbar-title><v-spacer></v-spacer> - - </v-toolbar> - </template> - <template #[`item.accession_in_sys`]="{ item }"> - <CollapsibleChips :items="namesToAccessionChips(item.accession_in_sys)"></CollapsibleChips> - </template> - </ServerDbTable> </template> \ No newline at end of file diff --git a/components/content/StructureDb.vue b/components/content/StructureDb.vue index f85ee39f..8ef19c3c 100644 --- a/components/content/StructureDb.vue +++ b/components/content/StructureDb.vue @@ -1,10 +1,13 @@ <script setup lang="ts"> +import * as Plot from "@observablehq/plot"; +import PlotFigure from "~/components/PlotFigure"; import type { SortItem } from "@/components/ServerDbTable.vue" import { ServerDbTable } from "#components" const sortBy: Ref<SortItem[]> = ref([{ key: 'system', order: "asc" }]) const itemValue = ref("id"); const facets: Ref<string[]> = ref(["system", "completed"]) const headers: Ref<Object[]> = ref([ + { title: 'Structure', key: 'structure', sortable: false, removable: false }, { title: "System", key: "system", removable: false }, // { title: "pdb file", key: "pdb" }, // { title: "fasta", key: "fasta_file" }, @@ -19,12 +22,12 @@ const headers: Ref<Object[]> = ref([ { title: "iptm+ptm", key: "iptm+ptm", removable: true }, { title: "pDockQ", key: "pDockQ", removable: true }, { title: "Type", key: "type", removable: true }, - { title: 'Structure', key: 'structure', sortable: false, removable: false }, ]) +const { search: msSearch, result: msResult } = useMeiliSearch('structure') const defaultDataTableServerProps = ref({ - showExpand: true + showExpand: false }) const dataTableServerProps = computed(() => { @@ -35,6 +38,9 @@ const dataTableServerProps = computed(() => { } }) + + + function namesToCollapsibleChips(names: string[], file: string | null = null) { if (file === null) { return names.filter((it) => it !== "").map(it => ({ title: it.split("__").pop() })) @@ -54,6 +60,13 @@ function toSystemName(rawName: string) { } + +const plddtDistribution = computed(() => { + if (toValue(msResult)?.facetDistribution?.plddts) { + return Object.entries(toValue(msResult).facetDistribution.plddts).map(([key, value]) => { }) + } +}) + function remove(key) { headers.value = headers.value.filter(header => header.key !== key) } diff --git a/content/4.refseq.md b/content/4.refseq.md index 5f47b8c5..13605c24 100644 --- a/content/4.refseq.md +++ b/content/4.refseq.md @@ -5,6 +5,19 @@ navigation: true --- + + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. +Cras lobortis nulla ac mauris aliquet lacinia. +Praesent viverra turpis orci, eget blandit ligula placerat nec. +Mauris a libero dui. Aenean sit amet quam at enim molestie tristique nec consequat libero. +Vestibulum rutrum tellus nec dui ornare, sit amet euismod velit faucibus. Aenean lectus mauris, convallis non dolor tincidunt, laoreet pulvinar diam. Maecenas at dignissim massa. Curabitur felis felis, maximus vitae mi non, condimentum rutrum urna. Phasellus consectetur libero sit amet iaculis dapibus. + + + + +Sed varius eget metus sed congue. Donec ut sodales lectus. Integer auctor maximus quam nec porta. Nulla urna magna, congue in sodales non, blandit eu lorem. Maecenas id massa sit amet libero elementum lobortis ut vel nibh. Integer sed ante eu tellus iaculis porttitor id at ante. Fusce at venenatis ante, et faucibus magna. Integer ut egestas diam. In vel blandit urna. Mauris nec tellus ut orci blandit consectetur. Nulla cursus tellus velit, vitae finibus lacus efficitur ut. + ::refseq-db :: diff --git a/content/5.structure.md b/content/5.structure.md index 7fdd6f72..ea48cb51 100644 --- a/content/5.structure.md +++ b/content/5.structure.md @@ -5,5 +5,9 @@ navigation: true --- + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras lobortis nulla ac mauris aliquet lacinia. Praesent viverra turpis orci, eget blandit ligula placerat nec. Mauris a libero dui. Aenean sit amet quam at enim molestie tristique nec consequat libero. Vestibulum rutrum tellus nec dui ornare, sit amet euismod velit faucibus. Aenean lectus mauris, convallis non dolor tincidunt, laoreet pulvinar diam. Maecenas at dignissim massa. Curabitur felis felis, maximus vitae mi non, condimentum rutrum urna. Phasellus consectetur libero sit amet iaculis dapibus. + +Sed varius eget metus sed congue. Donec ut sodales lectus. Integer auctor maximus quam nec porta. Nulla urna magna, congue in sodales non, blandit eu lorem. Maecenas id massa sit amet libero elementum lobortis ut vel nibh. Integer sed ante eu tellus iaculis porttitor id at ante. Fusce at venenatis ante, et faucibus magna. Integer ut egestas diam. In vel blandit urna. Mauris nec tellus ut orci blandit consectetur. Nulla cursus tellus velit, vitae finibus lacus efficitur ut. + ::structure-db :: \ No newline at end of file diff --git a/stores/facets.ts b/stores/facets.ts deleted file mode 100644 index 1ed39033..00000000 --- a/stores/facets.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { defineStore } from 'pinia' -import type { FacetDistribution, FacetStat } from 'meilisearch'; - - -export interface Facets { - facetDistribution: FacetDistribution | undefined; - facetStats: FacetStat | undefined; -} - -export const useFacetsStore = defineStore('facets', () => { - - - const facets: Ref<Facets> = ref({ facetDistribution: undefined, facetStats: undefined }) - - - function setFacets(newFacets: Facets) { - // console.log("start set facets") - // console.log(newFacets) - facets.value = newFacets - // console.log("end set facets") - - } - - - return { facets, setFacets } -}) \ No newline at end of file -- GitLab