From e126124182d727b0f3002c91424bb964a89cc3da Mon Sep 17 00:00:00 2001 From: Gregor Weber Date: Tue, 23 Jul 2024 18:52:13 +0200 Subject: [PATCH 1/4] feat: effects filter --- .../seqvar-filtration.spec.ts | 8 +- frontend/src/cases/styles/main.scss | 4 + .../EffectsSelect/EffectsSelect.vue | 211 ++++++++++++++++++ .../seqvars/components/EffectsSelect/utils.ts | 21 ++ .../FrequencySelect/FrequencyControlRow.vue | 2 +- .../FrequencySelect/FrequencySelect.vue | 34 +-- .../GenotypeSelect/GenotypeSelect.vue | 6 +- .../InheritanceModeControls.vue | 2 +- .../PathogenicityPrioSelect.vue | 38 +--- .../PhenotypePrioSelect.vue | 55 ++--- .../components/PredefinedQueryList.vue | 7 +- frontend/src/seqvars/components/QueryList.vue | 6 +- .../{GenotypeSelect => ui}/CheckButton.vue | 4 +- .../{ => ui}/CollapsibleGroup.stories.ts | 0 .../components/{ => ui}/CollapsibleGroup.vue | 0 .../src/seqvars/components/{ => ui}/Hr.vue | 0 .../src/seqvars/components/{ => ui}/Input.vue | 4 +- .../components/{ => ui}/Item.stories.ts | 0 .../src/seqvars/components/{ => ui}/Item.vue | 0 .../components/{ => ui}/ItemButton.vue | 0 .../components/{ => ui}/ModifiedIcon.vue | 0 .../seqvars/components/ui/PresetSelect.vue | 49 ++++ frontend/src/seqvars/components/utils.ts | 43 ++-- frontend/src/seqvars/types.ts | 3 +- .../src/seqvars/views/SeqvarsFiltration.vue | 41 ++-- 25 files changed, 397 insertions(+), 141 deletions(-) create mode 100644 frontend/src/seqvars/components/EffectsSelect/EffectsSelect.vue create mode 100644 frontend/src/seqvars/components/EffectsSelect/utils.ts rename frontend/src/seqvars/components/{GenotypeSelect => ui}/CheckButton.vue (92%) rename frontend/src/seqvars/components/{ => ui}/CollapsibleGroup.stories.ts (100%) rename frontend/src/seqvars/components/{ => ui}/CollapsibleGroup.vue (100%) rename frontend/src/seqvars/components/{ => ui}/Hr.vue (100%) rename frontend/src/seqvars/components/{ => ui}/Input.vue (88%) rename frontend/src/seqvars/components/{ => ui}/Item.stories.ts (100%) rename frontend/src/seqvars/components/{ => ui}/Item.vue (100%) rename frontend/src/seqvars/components/{ => ui}/ItemButton.vue (100%) rename frontend/src/seqvars/components/{ => ui}/ModifiedIcon.vue (100%) create mode 100644 frontend/src/seqvars/components/ui/PresetSelect.vue diff --git a/frontend/end-to-end-tests/seqvar-filtration.spec.ts b/frontend/end-to-end-tests/seqvar-filtration.spec.ts index 03ca0310d..1f3826320 100644 --- a/frontend/end-to-end-tests/seqvar-filtration.spec.ts +++ b/frontend/end-to-end-tests/seqvar-filtration.spec.ts @@ -30,16 +30,16 @@ test.describe('genotype', () => { test('any is checked when all types are checked', async ({ page }) => { const firstAnyButton = page .getByRole('button', { name: 'any' }) - .and(page.locator('[aria-selected]')) + .and(page.locator('[aria-checked]')) .first() - await expect(firstAnyButton).toHaveAttribute('aria-selected', 'false') + await expect(firstAnyButton).toHaveAttribute('aria-checked', 'false') for (const name of ['0/0', '1/0', '1/1']) { const button = page.getByRole('button', { name }).first() - if ((await button.getAttribute('aria-selected')) === 'false') { + if ((await button.getAttribute('aria-checked')) === 'false') { await button.click() } } - await expect(firstAnyButton).toHaveAttribute('aria-selected', 'true') + await expect(firstAnyButton).toHaveAttribute('aria-checked', 'true') }) }) diff --git a/frontend/src/cases/styles/main.scss b/frontend/src/cases/styles/main.scss index 22db8a29c..f65c97fe4 100644 --- a/frontend/src/cases/styles/main.scss +++ b/frontend/src/cases/styles/main.scss @@ -108,3 +108,7 @@ font-weight: 400; line-height: 20px; } + +.v-selection-control .v-label { + margin-bottom: 0; +} diff --git a/frontend/src/seqvars/components/EffectsSelect/EffectsSelect.vue b/frontend/src/seqvars/components/EffectsSelect/EffectsSelect.vue new file mode 100644 index 000000000..8e5262992 --- /dev/null +++ b/frontend/src/seqvars/components/EffectsSelect/EffectsSelect.vue @@ -0,0 +1,211 @@ + + + diff --git a/frontend/src/seqvars/components/EffectsSelect/utils.ts b/frontend/src/seqvars/components/EffectsSelect/utils.ts new file mode 100644 index 000000000..68d151fbb --- /dev/null +++ b/frontend/src/seqvars/components/EffectsSelect/utils.ts @@ -0,0 +1,21 @@ +import isEqual from 'fast-deep-equal/es6' + +import { LocalFields } from '@/seqvars/types' +import { + SeqvarsQueryPresetsConsequence, + SeqvarsQuerySettingsConsequence, +} from '@varfish-org/varfish-api/lib' + +export function matchesEffectsPreset( + value: LocalFields, + preset: SeqvarsQueryPresetsConsequence, +) { + return isEqual( + ...([value, preset].map((v) => [ + v.max_distance_to_exon, + new Set(v.variant_types), + new Set(v.transcript_types), + new Set(v.variant_consequences), + ]) as [unknown, unknown]), + ) +} diff --git a/frontend/src/seqvars/components/FrequencySelect/FrequencyControlRow.vue b/frontend/src/seqvars/components/FrequencySelect/FrequencyControlRow.vue index 0cbae96b6..0aec97bdf 100644 --- a/frontend/src/seqvars/components/FrequencySelect/FrequencyControlRow.vue +++ b/frontend/src/seqvars/components/FrequencySelect/FrequencyControlRow.vue @@ -3,7 +3,7 @@ import { computed, defineProps } from 'vue' import { SeqvarsQuerySettingsFrequency } from '@varfish-org/varfish-api/lib' -import Input from '@/seqvars/components/Input.vue' +import Input from '../ui/Input.vue' type ValueOf = T[keyof T] diff --git a/frontend/src/seqvars/components/FrequencySelect/FrequencySelect.vue b/frontend/src/seqvars/components/FrequencySelect/FrequencySelect.vue index 2dcbf823c..fcf4bf785 100644 --- a/frontend/src/seqvars/components/FrequencySelect/FrequencySelect.vue +++ b/frontend/src/seqvars/components/FrequencySelect/FrequencySelect.vue @@ -1,21 +1,15 @@