+
+
+ {{ variant.category }}
+
+ |
variantAliasInput: Maybe
variantTypeNameInput: Maybe
+ variantCategoryInput: Maybe
hasNoVariantTypeInput: boolean = false
+ variantCategories = VariantCategories
+
private initialQueryArgs?: BrowseVariantsQueryVariables
sortColumns = VariantsSortColumns
@@ -115,6 +118,7 @@ export class CvcVariantsTableComponent implements OnInit {
variantTypeId: this.variantTypeId,
variantGroupId: this.variantGroupId,
hasNoVariantType: this.hasNoVariantTypeInput,
+ variantCategory: this.variantCategoryInput,
}
this.queryRef = this.gql.watch(this.initialQueryArgs)
@@ -210,8 +214,11 @@ export class CvcVariantsTableComponent implements OnInit {
? this.variantAliasInput
: undefined,
featureName: this.featureNameInput,
- variantTypeName: this.variantTypeNameInput ? this.variantTypeNameInput : undefined,
- hasNoVariantType: this.hasNoVariantTypeInput
+ variantTypeName: this.variantTypeNameInput
+ ? this.variantTypeNameInput
+ : undefined,
+ hasNoVariantType: this.hasNoVariantTypeInput,
+ variantCategory: this.variantCategoryInput,
})
.then(() => this.scrollIndex$.next(0))
@@ -219,13 +226,15 @@ export class CvcVariantsTableComponent implements OnInit {
}
// virtual scroll helpers
- trackByIndex(_: number, data: Maybe): Maybe {
- return data?.id;
+ trackByIndex(
+ _: number,
+ data: Maybe
+ ): Maybe {
+ return data?.id
}
onHasNoVariantTypeInputChange(value: boolean[]) {
this.hasNoVariantTypeInput = value[0]
this.filterChange$.next()
}
-
}
diff --git a/client/src/app/components/variants/variants-table/variants-table.module.ts b/client/src/app/components/variants/variants-table/variants-table.module.ts
index 5b010beac..672a1f116 100644
--- a/client/src/app/components/variants/variants-table/variants-table.module.ts
+++ b/client/src/app/components/variants/variants-table/variants-table.module.ts
@@ -20,6 +20,8 @@ import { NzToolTipModule } from 'ng-zorro-antd/tooltip'
import { NzTypographyModule } from 'ng-zorro-antd/typography'
import { CvcVariantTagModule } from '../variant-tag/variant-tag.module'
import { CvcVariantsTableComponent } from './variants-table.component'
+import { NzSelectModule } from 'ng-zorro-antd/select'
+import { FormsModule } from '@angular/forms'
@NgModule({
declarations: [CvcVariantsTableComponent],
@@ -27,6 +29,7 @@ import { CvcVariantsTableComponent } from './variants-table.component'
CommonModule,
LetDirective,
PushPipe,
+ FormsModule,
NzButtonModule,
NzCardModule,
@@ -35,6 +38,7 @@ import { CvcVariantsTableComponent } from './variants-table.component'
NzTagModule,
NzToolTipModule,
NzTypographyModule,
+ NzSelectModule,
CvcAutoHeightCardModule,
CvcAutoHeightTableModule,
diff --git a/client/src/app/components/variants/variants-table/variants-table.query.gql b/client/src/app/components/variants/variants-table/variants-table.query.gql
index 8917d8cd5..8ee06a060 100644
--- a/client/src/app/components/variants/variants-table/variants-table.query.gql
+++ b/client/src/app/components/variants/variants-table/variants-table.query.gql
@@ -8,6 +8,7 @@ query BrowseVariants(
$variantGroupId: Int
$variantTypeName: String
$hasNoVariantType: Boolean
+ $variantCategory: VariantCategories
$sortBy: VariantsSort
$first: Int
$last: Int
@@ -24,6 +25,7 @@ query BrowseVariants(
variantGroupId: $variantGroupId
variantTypeName: $variantTypeName
hasNoVariantType: $hasNoVariantType
+ category: $variantCategory
sortBy: $sortBy
first: $first
last: $last
@@ -56,6 +58,7 @@ fragment BrowseVariantsFields on BrowseVariant {
featureId
featureName
featureLink
+ category
diseases {
id
name
diff --git a/client/src/app/forms/config/factor-variant-revise/factor-variant-revise.form.config.ts b/client/src/app/forms/config/factor-variant-revise/factor-variant-revise.form.config.ts
new file mode 100644
index 000000000..61db592ee
--- /dev/null
+++ b/client/src/app/forms/config/factor-variant-revise/factor-variant-revise.form.config.ts
@@ -0,0 +1,145 @@
+import { factorVariantReviseFormInitialModel } from '@app/forms/models/factor-variant-revise.model'
+import assignFieldConfigDefaultValues from '@app/forms/utilities/assign-field-default-values'
+import { CvcFormCardWrapperProps } from '@app/forms/wrappers/form-card/form-card.wrapper'
+import { CvcFormLayoutWrapperProps } from '@app/forms/wrappers/form-layout/form-layout.wrapper'
+import { FormlyFieldConfig } from '@ngx-formly/core'
+import { CvcFormRowWrapperProps } from '@app/forms/wrappers/form-row/form-row.wrapper'
+import { CvcOrgSubmitButtonFieldConfig } from '@app/forms/types/org-submit-button/org-submit-button.type'
+import { FeatureInstanceTypes } from '@app/generated/civic.apollo'
+
+const formFieldConfig: FormlyFieldConfig[] = [
+ {
+ wrappers: ['form-layout'],
+ props: {
+ showDevPanel: false,
+ },
+ fieldGroup: [
+ {
+ key: 'clientMutationId',
+ props: {
+ hidden: true,
+ },
+ },
+ {
+ key: 'fields',
+ wrappers: ['form-card'],
+ props: {
+ formCardOptions: { title: 'Revise Variant' },
+ },
+ fieldGroup: [
+ {
+ wrappers: ['form-row'],
+ props: {
+ formRowOptions: {
+ responsiveIndexed: [
+ { xs: 24, md: 12, lg: 8 },
+ { xs: 24, md: 12, lg: 8 },
+ { xs: 24, lg: 8 },
+ ],
+ },
+ },
+ fieldGroup: [
+ {
+ key: 'featureId',
+ type: 'feature-select',
+ props: {
+ description: 'Enter a Factor for this Variant',
+ required: true,
+ featureType: FeatureInstanceTypes.Factor,
+ canChangeFeatureType: false,
+ },
+ },
+ {
+ key: 'name',
+ type: 'base-input',
+ props: {
+ placeholder: 'Enter a name for this Variant',
+ description:
+ "Enter the name of the Variant according to the Variant Curation SOP",
+ label: 'Name',
+ required: true,
+ rows: 1,
+ },
+ },
+ {
+ key: 'aliases',
+ type: 'tag-multi-input',
+ props: {
+ label: 'Aliases',
+ description:
+ 'List any aliases commonly used to refer to this Variant',
+ placeholder: 'Enter Alias and hit return',
+ },
+ },
+ ],
+ },
+ {
+ wrappers: ['form-row'],
+ props: {
+ formRowOptions: {
+ responsiveIndexed: [
+ { xs: 24, lg: 12, xl: 6, xxl: 8 },
+ { xs: 24, lg: 12, xl: 6, xxl: 8 },
+ { xs: 24, xl: 12, xxl: 8 },
+ ],
+ },
+ },
+ fieldGroup: [
+ {
+ key: 'variantTypeIds',
+ type: 'variant-type-multi-select',
+ },
+ {
+ key: 'ncitId',
+ type: 'base-input',
+ props: {
+ placeholder: 'NCI Thesaurus Code',
+ description:
+ 'Enter the NCI Thesaurus ID for this Factor Variant',
+ label: 'NCI Thesaurus ID',
+ required: false,
+ },
+ },
+ ],
+ },
+ ],
+ },
+ {
+ wrappers: ['form-row'],
+ props: {
+ formRowOptions: {
+ spanIndexed: [24, 12, 12],
+ },
+ },
+ fieldGroup: [
+ {
+ key: 'comment',
+ type: 'base-textarea',
+ props: {
+ label: 'Comment',
+ placeholder: 'Please enter a comment describing your revisions.',
+ required: true,
+ minLength: 10,
+ },
+ },
+ {
+ type: 'cvc-cancel-button',
+ },
+ {
+ key: 'organizationId',
+ type: 'org-submit-button',
+ props: {
+ submitLabel: 'Submit Variant Revisions',
+ align: 'right',
+ },
+ },
+ ],
+ },
+ ],
+ },
+]
+export const factorVariantReviseFields: FormlyFieldConfig[] =
+ assignFieldConfigDefaultValues(
+ formFieldConfig,
+ factorVariantReviseFormInitialModel
+ )
diff --git a/client/src/app/forms/config/variant-revise/variant-revise.form.html b/client/src/app/forms/config/factor-variant-revise/factor-variant-revise.form.html
similarity index 100%
rename from client/src/app/forms/config/variant-revise/variant-revise.form.html
rename to client/src/app/forms/config/factor-variant-revise/factor-variant-revise.form.html
diff --git a/client/src/app/forms/config/factor-variant-revise/factor-variant-revise.form.module.ts b/client/src/app/forms/config/factor-variant-revise/factor-variant-revise.form.module.ts
new file mode 100644
index 000000000..0f2c94094
--- /dev/null
+++ b/client/src/app/forms/config/factor-variant-revise/factor-variant-revise.form.module.ts
@@ -0,0 +1,26 @@
+import { NgModule } from '@angular/core'
+import { CommonModule } from '@angular/common'
+import { NzFormModule } from 'ng-zorro-antd/form'
+import { NzButtonModule } from 'ng-zorro-antd/button'
+import { CvcForms2Module } from '@app/forms/forms.module'
+import { NgxJsonViewerModule } from 'ngx-json-viewer'
+import { LetDirective, PushPipe } from '@ngrx/component'
+import { CvcFormSubmissionStatusDisplayModule } from '@app/forms/components/form-submission-status-display/form-submission-status-display.module'
+import { CvcFactorVariantReviseForm } from './factor-variant-revise.form'
+
+@NgModule({
+ declarations: [CvcFactorVariantReviseForm],
+ imports: [
+ CommonModule,
+ LetDirective,
+ PushPipe,
+ NzFormModule,
+ NzButtonModule,
+ CvcForms2Module,
+ CvcFormSubmissionStatusDisplayModule,
+
+ NgxJsonViewerModule, // debug
+ ],
+ exports: [CvcFactorVariantReviseForm],
+})
+export class CvcFactorVariantReviseFormModule {}
diff --git a/client/src/app/forms/config/factor-variant-revise/factor-variant-revise.form.ts b/client/src/app/forms/config/factor-variant-revise/factor-variant-revise.form.ts
new file mode 100644
index 000000000..f4f788fdc
--- /dev/null
+++ b/client/src/app/forms/config/factor-variant-revise/factor-variant-revise.form.ts
@@ -0,0 +1,100 @@
+import {
+ AfterViewInit,
+ ChangeDetectionStrategy,
+ ChangeDetectorRef,
+ Component,
+ Input,
+ OnInit,
+} from '@angular/core'
+import { UntypedFormGroup } from '@angular/forms'
+import { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy'
+import { FormlyFieldConfig } from '@ngx-formly/core'
+import {
+ MutationState,
+ MutatorWithState,
+} from '@app/core/utilities/mutation-state-wrapper'
+import { NetworkErrorsService } from '@app/core/services/network-errors.service'
+import { FactorVariantReviseModel } from '@app/forms/models/factor-variant-revise.model'
+import {
+ FactorVariantRevisableFieldsGQL,
+ SuggestFactorVariantRevisionGQL,
+ SuggestFactorVariantRevisionMutation,
+ SuggestFactorVariantRevisionMutationVariables,
+} from '@app/generated/civic.apollo'
+import { factorVariantReviseFields } from './factor-variant-revise.form.config'
+import {
+ factorVariantFormModelToReviseInput,
+ factorVariantToModelFields,
+} from '@app/forms/utilities/factor-variant-to-model-fields'
+
+@UntilDestroy()
+@Component({
+ selector: 'cvc-factor-variant-revise-form',
+ templateUrl: './factor-variant-revise.form.html',
+ changeDetection: ChangeDetectionStrategy.OnPush,
+})
+export class CvcFactorVariantReviseForm implements OnInit, AfterViewInit {
+ @Input() variantId!: number
+ model?: FactorVariantReviseModel
+ form: UntypedFormGroup
+ fields: FormlyFieldConfig[]
+
+ reviseVariantMutator: MutatorWithState<
+ SuggestFactorVariantRevisionGQL,
+ SuggestFactorVariantRevisionMutation,
+ SuggestFactorVariantRevisionMutationVariables
+ >
+
+ mutationState?: MutationState
+ url?: string
+
+ constructor(
+ private revisableFieldsGQL: FactorVariantRevisableFieldsGQL,
+ private submitRevisionsGQL: SuggestFactorVariantRevisionGQL,
+ private networkErrorService: NetworkErrorsService,
+ private cdr: ChangeDetectorRef
+ ) {
+ this.form = new UntypedFormGroup({})
+ this.fields = factorVariantReviseFields
+ this.reviseVariantMutator = new MutatorWithState(networkErrorService)
+ }
+
+ ngOnInit() {
+ this.url = `/variants/${this.variantId}/revisions`
+ }
+
+ ngAfterViewInit(): void {
+ this.revisableFieldsGQL
+ .fetch({ variantId: this.variantId })
+ .pipe(untilDestroyed(this))
+ .subscribe({
+ next: ({ data: { variant } }) => {
+ if (variant && variant.__typename == 'FactorVariant') {
+ this.model = {
+ id: variant.id,
+ fields: factorVariantToModelFields(variant),
+ }
+ this.cdr.detectChanges()
+ }
+ },
+ error: (error) => {
+ console.error('Error retrieving Variant.')
+ console.error(error)
+ },
+ complete: () => {},
+ })
+ }
+
+ onSubmit(model: FactorVariantReviseModel) {
+ if (!this.variantId) {
+ return
+ }
+ let input = factorVariantFormModelToReviseInput(this.variantId, model)
+ if (input) {
+ this.mutationState = this.reviseVariantMutator.mutate(
+ this.submitRevisionsGQL,
+ { input: input }
+ )
+ }
+ }
+}
diff --git a/client/src/app/forms/config/factor-variant-revise/factor-variant-revise.query.gql b/client/src/app/forms/config/factor-variant-revise/factor-variant-revise.query.gql
new file mode 100644
index 000000000..ac03b8b44
--- /dev/null
+++ b/client/src/app/forms/config/factor-variant-revise/factor-variant-revise.query.gql
@@ -0,0 +1,37 @@
+query FactorVariantRevisableFields($variantId: Int!) {
+ variant(id: $variantId) {
+ id
+ ... on FactorVariant {
+ ...RevisableFactorVariantFields
+ }
+ }
+}
+
+fragment RevisableFactorVariantFields on FactorVariant {
+ name
+ feature {
+ id
+ name
+ }
+ variantAliases
+ variantTypes {
+ id
+ name
+ soid
+ }
+ ncitId
+}
+
+mutation SuggestFactorVariantRevision($input: SuggestFactorVariantRevisionInput!) {
+ suggestFactorVariantRevision(input: $input) {
+ clientMutationId
+ variant {
+ id
+ }
+ results {
+ id
+ fieldName
+ newlyCreated
+ }
+ }
+}
diff --git a/client/src/app/forms/config/variant-revise/variant-revise.form.config.ts b/client/src/app/forms/config/factor-variant-revise/variant-revise.form.config.ts
similarity index 98%
rename from client/src/app/forms/config/variant-revise/variant-revise.form.config.ts
rename to client/src/app/forms/config/factor-variant-revise/variant-revise.form.config.ts
index 773576b3b..ff35f4cf3 100644
--- a/client/src/app/forms/config/variant-revise/variant-revise.form.config.ts
+++ b/client/src/app/forms/config/factor-variant-revise/variant-revise.form.config.ts
@@ -1,6 +1,6 @@
import { AbstractControl } from '@angular/forms'
import { Chromosomes } from '@app/forms/utilities/input-formatters'
-import { variantReviseFormInitialModel } from '@app/forms/models/variant-revise.model'
+import { geneVariantReviseFormInitialModel } from '@app/forms/models/gene-variant-revise.model'
import assignFieldConfigDefaultValues from '@app/forms/utilities/assign-field-default-values'
import { CvcFormCardWrapperProps } from '@app/forms/wrappers/form-card/form-card.wrapper'
import { CvcFormLayoutWrapperProps } from '@app/forms/wrappers/form-layout/form-layout.wrapper'
@@ -359,5 +359,8 @@ const formFieldConfig: FormlyFieldConfig[] = [
],
},
]
-export const variantReviseFields: FormlyFieldConfig[] =
- assignFieldConfigDefaultValues(formFieldConfig, variantReviseFormInitialModel)
+export const geneVariantReviseFields: FormlyFieldConfig[] =
+ assignFieldConfigDefaultValues(
+ formFieldConfig,
+ geneVariantReviseFormInitialModel
+ )
diff --git a/client/src/app/forms/config/gene-variant-revise/gene-variant-revise.form.config.ts b/client/src/app/forms/config/gene-variant-revise/gene-variant-revise.form.config.ts
new file mode 100644
index 000000000..2eedb98dc
--- /dev/null
+++ b/client/src/app/forms/config/gene-variant-revise/gene-variant-revise.form.config.ts
@@ -0,0 +1,367 @@
+import { AbstractControl } from '@angular/forms'
+import { Chromosomes } from '@app/forms/utilities/input-formatters'
+import { geneVariantReviseFormInitialModel } from '@app/forms/models/gene-variant-revise.model'
+import assignFieldConfigDefaultValues from '@app/forms/utilities/assign-field-default-values'
+import { CvcFormCardWrapperProps } from '@app/forms/wrappers/form-card/form-card.wrapper'
+import { CvcFormLayoutWrapperProps } from '@app/forms/wrappers/form-layout/form-layout.wrapper'
+import { FormlyFieldConfig } from '@ngx-formly/core'
+import { CvcFormRowWrapperProps } from '@app/forms/wrappers/form-row/form-row.wrapper'
+import { CvcOrgSubmitButtonFieldConfig } from '@app/forms/types/org-submit-button/org-submit-button.type'
+
+const formFieldConfig: FormlyFieldConfig[] = [
+ {
+ wrappers: ['form-layout'],
+ props: {
+ showDevPanel: false,
+ },
+ fieldGroup: [
+ {
+ key: 'clientMutationId',
+ props: {
+ hidden: true,
+ },
+ },
+ {
+ key: 'fields',
+ wrappers: ['form-card'],
+ props: {
+ formCardOptions: { title: 'Revise Variant' },
+ },
+ fieldGroup: [
+ {
+ wrappers: ['form-row'],
+ props: {
+ formRowOptions: {
+ responsiveIndexed: [
+ { xs: 24, md: 12, lg: 8 },
+ { xs: 24, md: 12, lg: 8 },
+ { xs: 24, lg: 8 },
+ ],
+ },
+ },
+ fieldGroup: [
+ {
+ key: 'featureId',
+ type: 'feature-select',
+ props: {
+ description: 'Enter an Entrez Gene for this Variant',
+ required: true,
+ canChangeFeatureType: false,
+ },
+ },
+ {
+ key: 'name',
+ type: 'base-input',
+ props: {
+ placeholder: 'Enter a name for this Variant',
+ description:
+ "Enter the name of the Variant according to the Variant Curation SOP",
+ label: 'Name',
+ required: true,
+ rows: 1,
+ },
+ },
+ {
+ key: 'aliases',
+ type: 'tag-multi-input',
+ props: {
+ label: 'Aliases',
+ description:
+ 'List any aliases commonly used to refer to this Variant',
+ placeholder: 'Enter Alias and hit return',
+ },
+ },
+ ],
+ },
+ {
+ wrappers: ['form-row'],
+ props: {
+ formRowOptions: {
+ responsiveIndexed: [
+ { xs: 24, lg: 12, xl: 6, xxl: 8 },
+ { xs: 24, lg: 12, xl: 6, xxl: 8 },
+ { xs: 24, xl: 12, xxl: 8 },
+ ],
+ },
+ },
+ fieldGroup: [
+ {
+ key: 'hgvsDescriptions',
+ type: 'tag-multi-input',
+ props: {
+ label: 'HGVS Descriptions',
+ description:
+ 'Enter any HGVS nomenclature descriptions of this Variant',
+ tooltip:
+ 'Human Genome Variation Society nomenclature descriptions',
+ placeholder: 'Enter HGVS and hit return',
+ },
+ },
+ {
+ key: 'variantTypeIds',
+ type: 'variant-type-multi-select',
+ },
+ {
+ key: 'clinvarIds',
+ type: 'clinvar-multi-input',
+ wrappers: ['form-field'],
+ props: {
+ label: 'ClinVar IDs',
+ },
+ },
+ ],
+ },
+ {
+ wrappers: ['form-row'],
+ props: {
+ formRowOptions: {
+ span: 24,
+ },
+ },
+ fieldGroup: [
+ {
+ wrappers: ['form-card'],
+ props: {
+ formCardOptions: {
+ title: `Primary (5') Coordinates`,
+ size: 'small',
+ },
+ },
+ fieldGroup: [
+ {
+ wrappers: ['form-row'],
+ props: {
+ formRowOptions: {
+ responsive: { xs: 24, md: 12, lg: 8, xxl: 6 },
+ },
+ },
+ fieldGroup: [
+ {
+ key: 'referenceBuild',
+ type: 'reference-build-select',
+ },
+ {
+ key: 'ensemblVersion',
+ type: 'base-input',
+ validators: {
+ nccnVersionNumber: {
+ expression: (c: AbstractControl) =>
+ c.value ? /^\d{2,3}$/.test(c.value) : true,
+ message: (_: any, field: FormlyFieldConfig) =>
+ `"${field.formControl?.value}" does not appear to be an Ensembl version number`,
+ },
+ },
+ props: {
+ label: 'Ensembl Version',
+ description:
+ 'Enter a valid Ensembl database version (e.g. 75)',
+ },
+ },
+ {
+ key: 'referenceBases',
+ type: 'base-input',
+ validators: {
+ nccnVersionNumber: {
+ expression: (c: AbstractControl) =>
+ c.value ? /^[ACTG\\]+$/.test(c.value) : true,
+ message: (_: any, field: FormlyFieldConfig) =>
+ `"${field.formControl?.value}" contains invalid characters.`,
+ },
+ },
+ props: {
+ label: 'Reference Bases',
+ description:
+ 'The nucleotide(s) of the reference genome affected by the variant. Only used for SNVs and Indels (otherwise leave blank)',
+ },
+ },
+ {
+ key: 'variantBases',
+ type: 'base-input',
+ validators: {
+ nccnVersionNumber: {
+ expression: (c: AbstractControl) =>
+ c.value ? /^[ACTG\\]+$/.test(c.value) : true,
+ message: (_: any, field: FormlyFieldConfig) =>
+ `"${field.formControl?.value}" contains invalid characters.`,
+ },
+ },
+ props: {
+ label: 'Variant Bases',
+ description:
+ 'The nucleotide(s) of the variant allele. Only used for SNVs and Indels (otherwise leave blank)',
+ },
+ },
+ {
+ key: 'chromosome',
+ type: 'base-select',
+ props: {
+ label: 'Chromosome',
+ options: Chromosomes,
+ description:
+ 'Specify the chromosome in which this variant occurs (e.g. 17).',
+ },
+ },
+ {
+ key: 'start',
+ type: 'base-input',
+ validators: {
+ isNumeric: {
+ expression: (c: AbstractControl) =>
+ c.value ? /^\d+$/.test(c.value) : true,
+ message: (_: any, field: FormlyFieldConfig) =>
+ 'Start coordinate must be numeric',
+ },
+ },
+ props: {
+ label: 'Start',
+ description:
+ 'Enter the left/first coordinate of this variant. Must be ≤ the Stop coordinate. Coordinate must be compatible with the selected reference build.',
+ },
+ },
+ {
+ key: 'stop',
+ type: 'base-input',
+ validators: {
+ isNumeric: {
+ expression: (c: AbstractControl) =>
+ c.value ? /^\d+$/.test(c.value) : true,
+ message: (_: any, field: FormlyFieldConfig) =>
+ 'Stop coordinate must be numeric',
+ },
+ },
+ props: {
+ label: 'Stop',
+ description:
+ 'Provide the right/second coordinate of this variant. Must be ≥ the Start coordinate. Coordinate must be compatible with the selected reference build.',
+ },
+ },
+ {
+ key: 'representativeTranscript',
+ type: 'base-input',
+ props: {
+ label: 'Representative Transcript',
+ description:
+ 'Specify a transcript ID, including version number (e.g. ENST00000348159.4, the canonical transcript defined by Ensembl).',
+ },
+ },
+ ],
+ },
+ ],
+ },
+ {
+ wrappers: ['form-card'],
+ props: {
+ formCardOptions: {
+ title: `Secondary (3') Coordinates`,
+ size: 'small',
+ },
+ },
+ fieldGroup: [
+ {
+ wrappers: ['form-row'],
+ props: {
+ formRowOptions: {
+ responsive: { xs: 24, md: 12, lg: 8, xxl: 6 },
+ },
+ },
+ fieldGroup: [
+ {
+ key: 'chromosome2',
+ type: 'base-select',
+ props: {
+ label: 'Chromosome',
+ options: Chromosomes,
+ description:
+ 'If this variant is a fusion (e.g. BCR-ABL1), specify the chromosome name, coordinates, and representative transcript for the 3-prime partner.',
+ },
+ },
+ {
+ key: 'start2',
+ type: 'base-input',
+ validators: {
+ isNumeric: {
+ expression: (c: AbstractControl) =>
+ c.value ? /^\d+$/.test(c.value) : true,
+ message: (_: any, field: FormlyFieldConfig) =>
+ 'Start coordinate must be numeric',
+ },
+ },
+ props: {
+ label: 'Start',
+ description:
+ 'Enter the left/first coordinate of this 3-prime partner fusion variant. Must be ≤ the Stop coordinate. Coordinate must be compatible with the selected reference build.',
+ },
+ },
+ {
+ key: 'stop2',
+ type: 'base-input',
+ validators: {
+ isNumeric: {
+ expression: (c: AbstractControl) =>
+ c.value ? /^\d+$/.test(c.value) : true,
+ message: (_: any, field: FormlyFieldConfig) =>
+ 'Stop coordinate must be numeric',
+ },
+ },
+ props: {
+ label: 'Stop',
+ description:
+ 'Provide the right/second coordinate of this 3-prime partner fusion variant. Must be ≥ the Start coordinate. Coordinate must be compatible with the selected reference build.',
+ },
+ },
+ {
+ key: 'representativeTranscript2',
+ type: 'base-input',
+ props: {
+ label: 'Representative Transcript',
+ description:
+ 'Specify a transcript ID, including version number (e.g. ENST00000348159.4, the canonical transcript defined by Ensembl).',
+ },
+ },
+ ],
+ },
+ ],
+ },
+ ],
+ },
+ ],
+ },
+ {
+ wrappers: ['form-row'],
+ props: {
+ formRowOptions: {
+ spanIndexed: [24, 12, 12],
+ },
+ },
+ fieldGroup: [
+ {
+ key: 'comment',
+ type: 'base-textarea',
+ props: {
+ label: 'Comment',
+ placeholder: 'Please enter a comment describing your revisions.',
+ required: true,
+ minLength: 10,
+ },
+ },
+ {
+ type: 'cvc-cancel-button',
+ },
+ {
+ key: 'organizationId',
+ type: 'org-submit-button',
+ props: {
+ submitLabel: 'Submit Variant Revisions',
+ align: 'right',
+ },
+ },
+ ],
+ },
+ ],
+ },
+]
+export const geneVariantReviseFields: FormlyFieldConfig[] =
+ assignFieldConfigDefaultValues(
+ formFieldConfig,
+ geneVariantReviseFormInitialModel
+ )
diff --git a/client/src/app/forms/config/gene-variant-revise/gene-variant-revise.form.html b/client/src/app/forms/config/gene-variant-revise/gene-variant-revise.form.html
new file mode 100644
index 000000000..4cba0f61e
--- /dev/null
+++ b/client/src/app/forms/config/gene-variant-revise/gene-variant-revise.form.html
@@ -0,0 +1,32 @@
+
+
+ Revision(s) submitted! You will be redirected to the Revisions page or can view them here.
+
+
+ Loading Variant...
+
+
diff --git a/client/src/app/forms/config/gene-variant-revise/gene-variant-revise.form.module.ts b/client/src/app/forms/config/gene-variant-revise/gene-variant-revise.form.module.ts
new file mode 100644
index 000000000..01a239377
--- /dev/null
+++ b/client/src/app/forms/config/gene-variant-revise/gene-variant-revise.form.module.ts
@@ -0,0 +1,26 @@
+import { NgModule } from '@angular/core'
+import { CommonModule } from '@angular/common'
+import { NzFormModule } from 'ng-zorro-antd/form'
+import { NzButtonModule } from 'ng-zorro-antd/button'
+import { CvcForms2Module } from '@app/forms/forms.module'
+import { NgxJsonViewerModule } from 'ngx-json-viewer'
+import { LetDirective, PushPipe } from '@ngrx/component'
+import { CvcFormSubmissionStatusDisplayModule } from '@app/forms/components/form-submission-status-display/form-submission-status-display.module'
+import { CvcGeneVariantReviseForm } from './gene-variant-revise.form'
+
+@NgModule({
+ declarations: [CvcGeneVariantReviseForm],
+ imports: [
+ CommonModule,
+ LetDirective,
+ PushPipe,
+ NzFormModule,
+ NzButtonModule,
+ CvcForms2Module,
+ CvcFormSubmissionStatusDisplayModule,
+
+ NgxJsonViewerModule, // debug
+ ],
+ exports: [CvcGeneVariantReviseForm],
+})
+export class CvcGeneVariantReviseFormModule {}
diff --git a/client/src/app/forms/config/gene-variant-revise/gene-variant-revise.form.ts b/client/src/app/forms/config/gene-variant-revise/gene-variant-revise.form.ts
new file mode 100644
index 000000000..57943ed72
--- /dev/null
+++ b/client/src/app/forms/config/gene-variant-revise/gene-variant-revise.form.ts
@@ -0,0 +1,100 @@
+import {
+ AfterViewInit,
+ ChangeDetectionStrategy,
+ ChangeDetectorRef,
+ Component,
+ Input,
+ OnInit,
+} from '@angular/core'
+import { UntypedFormGroup } from '@angular/forms'
+import {
+ GeneVariantRevisableFieldsGQL,
+ SuggestGeneVariantRevisionGQL,
+ SuggestGeneVariantRevisionMutation,
+ SuggestGeneVariantRevisionMutationVariables,
+} from '@app/generated/civic.apollo'
+import { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy'
+import { FormlyFieldConfig } from '@ngx-formly/core'
+import {
+ MutationState,
+ MutatorWithState,
+} from '@app/core/utilities/mutation-state-wrapper'
+import { NetworkErrorsService } from '@app/core/services/network-errors.service'
+import { GeneVariantReviseModel } from '@app/forms/models/gene-variant-revise.model'
+import { geneVariantReviseFields } from './gene-variant-revise.form.config'
+import {
+ geneVariantFormModelToReviseInput,
+ geneVariantToModelFields,
+} from '@app/forms/utilities/gene-variant-to-model-fields'
+
+@UntilDestroy()
+@Component({
+ selector: 'cvc-gene-variant-revise-form',
+ templateUrl: './gene-variant-revise.form.html',
+ changeDetection: ChangeDetectionStrategy.OnPush,
+})
+export class CvcGeneVariantReviseForm implements OnInit, AfterViewInit {
+ @Input() variantId!: number
+ model?: GeneVariantReviseModel
+ form: UntypedFormGroup
+ fields: FormlyFieldConfig[]
+
+ reviseVariantMutator: MutatorWithState<
+ SuggestGeneVariantRevisionGQL,
+ SuggestGeneVariantRevisionMutation,
+ SuggestGeneVariantRevisionMutationVariables
+ >
+
+ mutationState?: MutationState
+ url?: string
+
+ constructor(
+ private revisableFieldsGQL: GeneVariantRevisableFieldsGQL,
+ private submitRevisionsGQL: SuggestGeneVariantRevisionGQL,
+ private networkErrorService: NetworkErrorsService,
+ private cdr: ChangeDetectorRef
+ ) {
+ this.form = new UntypedFormGroup({})
+ this.fields = geneVariantReviseFields
+ this.reviseVariantMutator = new MutatorWithState(networkErrorService)
+ }
+
+ ngOnInit() {
+ this.url = `/variants/${this.variantId}/revisions`
+ }
+
+ ngAfterViewInit(): void {
+ this.revisableFieldsGQL
+ .fetch({ variantId: this.variantId })
+ .pipe(untilDestroyed(this))
+ .subscribe({
+ next: ({ data: { variant } }) => {
+ if (variant && variant.__typename == 'GeneVariant') {
+ this.model = {
+ id: variant.id,
+ fields: geneVariantToModelFields(variant),
+ }
+ this.cdr.detectChanges()
+ }
+ },
+ error: (error) => {
+ console.error('Error retrieving Variant.')
+ console.error(error)
+ },
+ complete: () => {},
+ })
+ }
+
+ onSubmit(model: GeneVariantReviseModel) {
+ if (!this.variantId) {
+ return
+ }
+ let input = geneVariantFormModelToReviseInput(this.variantId, model)
+ if (input) {
+ this.mutationState = this.reviseVariantMutator.mutate(
+ this.submitRevisionsGQL,
+ { input: input }
+ )
+ }
+ }
+}
diff --git a/client/src/app/forms/config/variant-revise/variant-revise.query.gql b/client/src/app/forms/config/gene-variant-revise/gene-variant-revise.query.gql
similarity index 65%
rename from client/src/app/forms/config/variant-revise/variant-revise.query.gql
rename to client/src/app/forms/config/gene-variant-revise/gene-variant-revise.query.gql
index 2258f00cd..5de1293ca 100644
--- a/client/src/app/forms/config/variant-revise/variant-revise.query.gql
+++ b/client/src/app/forms/config/gene-variant-revise/gene-variant-revise.query.gql
@@ -1,11 +1,13 @@
-query VariantRevisableFields($variantId: Int!) {
+query GeneVariantRevisableFields($variantId: Int!) {
variant(id: $variantId) {
- ...RevisableVariantFields
+ id
+ ... on GeneVariant {
+ ...RevisableGeneVariantFields
+ }
}
}
-fragment RevisableVariantFields on Variant {
- id
+fragment RevisableGeneVariantFields on GeneVariant {
name
feature {
id
@@ -39,8 +41,8 @@ fragment CoordinateFields on Coordinate {
stop
}
-mutation SuggestVariantRevision($input: SuggestVariantRevisionInput!) {
- suggestVariantRevision(input: $input) {
+mutation SuggestGeneVariantRevision($input: SuggestGeneVariantRevisionInput!) {
+ suggestGeneVariantRevision(input: $input) {
clientMutationId
variant {
id
diff --git a/client/src/app/forms/config/gene-variant-revise/variant-revise.form.config.ts b/client/src/app/forms/config/gene-variant-revise/variant-revise.form.config.ts
new file mode 100644
index 000000000..ff35f4cf3
--- /dev/null
+++ b/client/src/app/forms/config/gene-variant-revise/variant-revise.form.config.ts
@@ -0,0 +1,366 @@
+import { AbstractControl } from '@angular/forms'
+import { Chromosomes } from '@app/forms/utilities/input-formatters'
+import { geneVariantReviseFormInitialModel } from '@app/forms/models/gene-variant-revise.model'
+import assignFieldConfigDefaultValues from '@app/forms/utilities/assign-field-default-values'
+import { CvcFormCardWrapperProps } from '@app/forms/wrappers/form-card/form-card.wrapper'
+import { CvcFormLayoutWrapperProps } from '@app/forms/wrappers/form-layout/form-layout.wrapper'
+import { FormlyFieldConfig } from '@ngx-formly/core'
+import { CvcFormRowWrapperProps } from '@app/forms/wrappers/form-row/form-row.wrapper'
+import { CvcOrgSubmitButtonFieldConfig } from '@app/forms/types/org-submit-button/org-submit-button.type'
+
+const formFieldConfig: FormlyFieldConfig[] = [
+ {
+ wrappers: ['form-layout'],
+ props: {
+ showDevPanel: false,
+ },
+ fieldGroup: [
+ {
+ key: 'clientMutationId',
+ props: {
+ hidden: true,
+ },
+ },
+ {
+ key: 'fields',
+ wrappers: ['form-card'],
+ props: {
+ formCardOptions: { title: 'Revise Variant' },
+ },
+ fieldGroup: [
+ {
+ wrappers: ['form-row'],
+ props: {
+ formRowOptions: {
+ responsiveIndexed: [
+ { xs: 24, md: 12, lg: 8 },
+ { xs: 24, md: 12, lg: 8 },
+ { xs: 24, lg: 8 },
+ ],
+ },
+ },
+ fieldGroup: [
+ {
+ key: 'featureId',
+ type: 'feature-select',
+ props: {
+ description: 'Enter an Entrez Gene for this Variant',
+ required: true,
+ },
+ },
+ {
+ key: 'name',
+ type: 'base-input',
+ props: {
+ placeholder: 'Enter a name for this Variant',
+ description:
+ "Enter the name of the Variant according to the Variant Curation SOP",
+ label: 'Name',
+ required: true,
+ rows: 1,
+ },
+ },
+ {
+ key: 'aliases',
+ type: 'tag-multi-input',
+ props: {
+ label: 'Aliases',
+ description:
+ 'List any aliases commonly used to refer to this Variant',
+ placeholder: 'Enter Alias and hit return',
+ },
+ },
+ ],
+ },
+ {
+ wrappers: ['form-row'],
+ props: {
+ formRowOptions: {
+ responsiveIndexed: [
+ { xs: 24, lg: 12, xl: 6, xxl: 8 },
+ { xs: 24, lg: 12, xl: 6, xxl: 8 },
+ { xs: 24, xl: 12, xxl: 8 },
+ ],
+ },
+ },
+ fieldGroup: [
+ {
+ key: 'hgvsDescriptions',
+ type: 'tag-multi-input',
+ props: {
+ label: 'HGVS Descriptions',
+ description:
+ 'Enter any HGVS nomenclature descriptions of this Variant',
+ tooltip:
+ 'Human Genome Variation Society nomenclature descriptions',
+ placeholder: 'Enter HGVS and hit return',
+ },
+ },
+ {
+ key: 'variantTypeIds',
+ type: 'variant-type-multi-select',
+ },
+ {
+ key: 'clinvarIds',
+ type: 'clinvar-multi-input',
+ wrappers: ['form-field'],
+ props: {
+ label: 'ClinVar IDs',
+ },
+ },
+ ],
+ },
+ {
+ wrappers: ['form-row'],
+ props: {
+ formRowOptions: {
+ span: 24,
+ },
+ },
+ fieldGroup: [
+ {
+ wrappers: ['form-card'],
+ props: {
+ formCardOptions: {
+ title: `Primary (5') Coordinates`,
+ size: 'small',
+ },
+ },
+ fieldGroup: [
+ {
+ wrappers: ['form-row'],
+ props: {
+ formRowOptions: {
+ responsive: { xs: 24, md: 12, lg: 8, xxl: 6 },
+ },
+ },
+ fieldGroup: [
+ {
+ key: 'referenceBuild',
+ type: 'reference-build-select',
+ },
+ {
+ key: 'ensemblVersion',
+ type: 'base-input',
+ validators: {
+ nccnVersionNumber: {
+ expression: (c: AbstractControl) =>
+ c.value ? /^\d{2,3}$/.test(c.value) : true,
+ message: (_: any, field: FormlyFieldConfig) =>
+ `"${field.formControl?.value}" does not appear to be an Ensembl version number`,
+ },
+ },
+ props: {
+ label: 'Ensembl Version',
+ description:
+ 'Enter a valid Ensembl database version (e.g. 75)',
+ },
+ },
+ {
+ key: 'referenceBases',
+ type: 'base-input',
+ validators: {
+ nccnVersionNumber: {
+ expression: (c: AbstractControl) =>
+ c.value ? /^[ACTG\\]+$/.test(c.value) : true,
+ message: (_: any, field: FormlyFieldConfig) =>
+ `"${field.formControl?.value}" contains invalid characters.`,
+ },
+ },
+ props: {
+ label: 'Reference Bases',
+ description:
+ 'The nucleotide(s) of the reference genome affected by the variant. Only used for SNVs and Indels (otherwise leave blank)',
+ },
+ },
+ {
+ key: 'variantBases',
+ type: 'base-input',
+ validators: {
+ nccnVersionNumber: {
+ expression: (c: AbstractControl) =>
+ c.value ? /^[ACTG\\]+$/.test(c.value) : true,
+ message: (_: any, field: FormlyFieldConfig) =>
+ `"${field.formControl?.value}" contains invalid characters.`,
+ },
+ },
+ props: {
+ label: 'Variant Bases',
+ description:
+ 'The nucleotide(s) of the variant allele. Only used for SNVs and Indels (otherwise leave blank)',
+ },
+ },
+ {
+ key: 'chromosome',
+ type: 'base-select',
+ props: {
+ label: 'Chromosome',
+ options: Chromosomes,
+ description:
+ 'Specify the chromosome in which this variant occurs (e.g. 17).',
+ },
+ },
+ {
+ key: 'start',
+ type: 'base-input',
+ validators: {
+ isNumeric: {
+ expression: (c: AbstractControl) =>
+ c.value ? /^\d+$/.test(c.value) : true,
+ message: (_: any, field: FormlyFieldConfig) =>
+ 'Start coordinate must be numeric',
+ },
+ },
+ props: {
+ label: 'Start',
+ description:
+ 'Enter the left/first coordinate of this variant. Must be ≤ the Stop coordinate. Coordinate must be compatible with the selected reference build.',
+ },
+ },
+ {
+ key: 'stop',
+ type: 'base-input',
+ validators: {
+ isNumeric: {
+ expression: (c: AbstractControl) =>
+ c.value ? /^\d+$/.test(c.value) : true,
+ message: (_: any, field: FormlyFieldConfig) =>
+ 'Stop coordinate must be numeric',
+ },
+ },
+ props: {
+ label: 'Stop',
+ description:
+ 'Provide the right/second coordinate of this variant. Must be ≥ the Start coordinate. Coordinate must be compatible with the selected reference build.',
+ },
+ },
+ {
+ key: 'representativeTranscript',
+ type: 'base-input',
+ props: {
+ label: 'Representative Transcript',
+ description:
+ 'Specify a transcript ID, including version number (e.g. ENST00000348159.4, the canonical transcript defined by Ensembl).',
+ },
+ },
+ ],
+ },
+ ],
+ },
+ {
+ wrappers: ['form-card'],
+ props: {
+ formCardOptions: {
+ title: `Secondary (3') Coordinates`,
+ size: 'small',
+ },
+ },
+ fieldGroup: [
+ {
+ wrappers: ['form-row'],
+ props: {
+ formRowOptions: {
+ responsive: { xs: 24, md: 12, lg: 8, xxl: 6 },
+ },
+ },
+ fieldGroup: [
+ {
+ key: 'chromosome2',
+ type: 'base-select',
+ props: {
+ label: 'Chromosome',
+ options: Chromosomes,
+ description:
+ 'If this variant is a fusion (e.g. BCR-ABL1), specify the chromosome name, coordinates, and representative transcript for the 3-prime partner.',
+ },
+ },
+ {
+ key: 'start2',
+ type: 'base-input',
+ validators: {
+ isNumeric: {
+ expression: (c: AbstractControl) =>
+ c.value ? /^\d+$/.test(c.value) : true,
+ message: (_: any, field: FormlyFieldConfig) =>
+ 'Start coordinate must be numeric',
+ },
+ },
+ props: {
+ label: 'Start',
+ description:
+ 'Enter the left/first coordinate of this 3-prime partner fusion variant. Must be ≤ the Stop coordinate. Coordinate must be compatible with the selected reference build.',
+ },
+ },
+ {
+ key: 'stop2',
+ type: 'base-input',
+ validators: {
+ isNumeric: {
+ expression: (c: AbstractControl) =>
+ c.value ? /^\d+$/.test(c.value) : true,
+ message: (_: any, field: FormlyFieldConfig) =>
+ 'Stop coordinate must be numeric',
+ },
+ },
+ props: {
+ label: 'Stop',
+ description:
+ 'Provide the right/second coordinate of this 3-prime partner fusion variant. Must be ≥ the Start coordinate. Coordinate must be compatible with the selected reference build.',
+ },
+ },
+ {
+ key: 'representativeTranscript2',
+ type: 'base-input',
+ props: {
+ label: 'Representative Transcript',
+ description:
+ 'Specify a transcript ID, including version number (e.g. ENST00000348159.4, the canonical transcript defined by Ensembl).',
+ },
+ },
+ ],
+ },
+ ],
+ },
+ ],
+ },
+ ],
+ },
+ {
+ wrappers: ['form-row'],
+ props: {
+ formRowOptions: {
+ spanIndexed: [24, 12, 12],
+ },
+ },
+ fieldGroup: [
+ {
+ key: 'comment',
+ type: 'base-textarea',
+ props: {
+ label: 'Comment',
+ placeholder: 'Please enter a comment describing your revisions.',
+ required: true,
+ minLength: 10,
+ },
+ },
+ {
+ type: 'cvc-cancel-button',
+ },
+ {
+ key: 'organizationId',
+ type: 'org-submit-button',
+ props: {
+ submitLabel: 'Submit Variant Revisions',
+ align: 'right',
+ },
+ },
+ ],
+ },
+ ],
+ },
+]
+export const geneVariantReviseFields: FormlyFieldConfig[] =
+ assignFieldConfigDefaultValues(
+ formFieldConfig,
+ geneVariantReviseFormInitialModel
+ )
diff --git a/client/src/app/forms/config/variant-revise/variant-revise.form.module.ts b/client/src/app/forms/config/variant-revise/variant-revise.form.module.ts
deleted file mode 100644
index 544c9ee88..000000000
--- a/client/src/app/forms/config/variant-revise/variant-revise.form.module.ts
+++ /dev/null
@@ -1,29 +0,0 @@
-import { NgModule } from '@angular/core';
-import { CommonModule } from '@angular/common';
-import { NzFormModule } from 'ng-zorro-antd/form';
-import { NzButtonModule } from 'ng-zorro-antd/button';
-import { CvcForms2Module } from '@app/forms/forms.module';
-import { NgxJsonViewerModule } from 'ngx-json-viewer';
-import { LetDirective, PushPipe } from '@ngrx/component';
-import { CvcFormSubmissionStatusDisplayModule } from '@app/forms/components/form-submission-status-display/form-submission-status-display.module';
-import { CvcVariantReviseForm } from './variant-revise.form';
-
-@NgModule({
- declarations: [
- CvcVariantReviseForm
- ],
- imports: [
- CommonModule,
- LetDirective, PushPipe,
- NzFormModule,
- NzButtonModule,
- CvcForms2Module,
- CvcFormSubmissionStatusDisplayModule,
-
- NgxJsonViewerModule, // debug
- ],
- exports: [
- CvcVariantReviseForm
- ]
-})
-export class CvcVariantReviseFormModule { }
diff --git a/client/src/app/forms/config/variant-revise/variant-revise.form.ts b/client/src/app/forms/config/variant-revise/variant-revise.form.ts
deleted file mode 100644
index 2f9943289..000000000
--- a/client/src/app/forms/config/variant-revise/variant-revise.form.ts
+++ /dev/null
@@ -1,84 +0,0 @@
-import {
- AfterViewInit,
- ChangeDetectionStrategy,
- ChangeDetectorRef,
- Component,
- Input,
- OnInit,
-} from '@angular/core'
-import { UntypedFormGroup } from '@angular/forms'
-import { SuggestVariantRevisionGQL, SuggestVariantRevisionMutation, SuggestVariantRevisionMutationVariables, VariantRevisableFieldsGQL } from '@app/generated/civic.apollo'
-import { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy'
-import { FormlyFieldConfig } from '@ngx-formly/core'
-import { MutationState, MutatorWithState } from '@app/core/utilities/mutation-state-wrapper'
-import { NetworkErrorsService } from '@app/core/services/network-errors.service'
-import { VariantReviseModel } from '@app/forms/models/variant-revise.model'
-import { variantReviseFields } from './variant-revise.form.config'
-import { variantFormModelToReviseInput, variantToModelFields } from '@app/forms/utilities/variant-to-model-fields'
-
-@UntilDestroy()
-@Component({
- selector: 'cvc-variant-revise-form',
- templateUrl: './variant-revise.form.html',
- changeDetection: ChangeDetectionStrategy.OnPush,
-})
-export class CvcVariantReviseForm implements OnInit, AfterViewInit {
- @Input() variantId!: number
- model?: VariantReviseModel
- form: UntypedFormGroup
- fields: FormlyFieldConfig[]
-
- reviseVariantMutator: MutatorWithState<
- SuggestVariantRevisionGQL,
- SuggestVariantRevisionMutation,
- SuggestVariantRevisionMutationVariables
- >
-
- mutationState?: MutationState
- url?: string
-
- constructor(
- private revisableFieldsGQL: VariantRevisableFieldsGQL,
- private submitRevisionsGQL: SuggestVariantRevisionGQL,
- private networkErrorService: NetworkErrorsService,
- private cdr: ChangeDetectorRef
- ) {
- this.form = new UntypedFormGroup({})
- this.fields = variantReviseFields
- this.reviseVariantMutator = new MutatorWithState(networkErrorService)
- }
-
- ngOnInit() {
- this.url = `/variants/${this.variantId }/revisions`
- }
-
- ngAfterViewInit(): void {
- this.revisableFieldsGQL
- .fetch({ variantId: this.variantId })
- .pipe(untilDestroyed(this))
- .subscribe({
- next: ({ data: { variant } }) => {
- if (variant) {
- this.model = {
- id: variant.id,
- fields: variantToModelFields(variant),
- }
- this.cdr.detectChanges()
- }
- },
- error: (error) => {
- console.error('Error retrieving Variant.')
- console.error(error)
- },
- complete: () => { },
- })
- }
-
- onSubmit(model: VariantReviseModel) {
- if(!this.variantId) {return}
- let input = variantFormModelToReviseInput(this.variantId, model)
- if (input) {
- this.mutationState = this.reviseVariantMutator.mutate(this.submitRevisionsGQL, { input: input})
- }
- }
-}
diff --git a/client/src/app/forms/models/factor-variant-fields.model.ts b/client/src/app/forms/models/factor-variant-fields.model.ts
new file mode 100644
index 000000000..fb7f6be4b
--- /dev/null
+++ b/client/src/app/forms/models/factor-variant-fields.model.ts
@@ -0,0 +1,7 @@
+export type FactorVariantFields = {
+ name?: string
+ aliases?: string[]
+ variantTypeIds?: number[]
+ featureId?: number
+ ncitId?: string
+}
diff --git a/client/src/app/forms/models/factor-variant-revise.model.ts b/client/src/app/forms/models/factor-variant-revise.model.ts
new file mode 100644
index 000000000..818da9c0c
--- /dev/null
+++ b/client/src/app/forms/models/factor-variant-revise.model.ts
@@ -0,0 +1,22 @@
+import { FormReviseBaseModel } from './form-revise-base.model'
+import { FactorVariantFields } from './factor-variant-fields.model'
+
+export interface FactorVariantReviseModel extends FormReviseBaseModel {
+ fields: FactorVariantFields
+}
+
+export const factorVariantReviseFieldsDefaults: FactorVariantFields = {
+ name: undefined,
+ aliases: undefined,
+ variantTypeIds: undefined,
+ featureId: undefined,
+ ncitId: undefined,
+}
+
+export const factorVariantReviseFormInitialModel: FactorVariantReviseModel = {
+ id: undefined,
+ clientMutationId: undefined,
+ fields: factorVariantReviseFieldsDefaults,
+ comment: undefined,
+ organizationId: undefined,
+}
diff --git a/client/src/app/forms/models/variant-fields.model.ts b/client/src/app/forms/models/gene-variant-fields.model.ts
similarity index 82%
rename from client/src/app/forms/models/variant-fields.model.ts
rename to client/src/app/forms/models/gene-variant-fields.model.ts
index 150e7572f..e4dcbd54a 100644
--- a/client/src/app/forms/models/variant-fields.model.ts
+++ b/client/src/app/forms/models/gene-variant-fields.model.ts
@@ -1,6 +1,6 @@
-import { ReferenceBuild } from "@app/generated/civic.apollo"
+import { ReferenceBuild } from '@app/generated/civic.apollo'
-export type VariantFields = {
+export type GeneVariantFields = {
name?: string
aliases?: string[]
hgvsDescriptions?: string[]
diff --git a/client/src/app/forms/models/variant-revise.model.ts b/client/src/app/forms/models/gene-variant-revise.model.ts
similarity index 59%
rename from client/src/app/forms/models/variant-revise.model.ts
rename to client/src/app/forms/models/gene-variant-revise.model.ts
index 3da747aaa..3a650b383 100644
--- a/client/src/app/forms/models/variant-revise.model.ts
+++ b/client/src/app/forms/models/gene-variant-revise.model.ts
@@ -1,11 +1,11 @@
import { FormReviseBaseModel } from './form-revise-base.model'
-import { VariantFields } from './variant-fields.model'
+import { GeneVariantFields } from './gene-variant-fields.model'
-export interface VariantReviseModel extends FormReviseBaseModel {
- fields: VariantFields
+export interface GeneVariantReviseModel extends FormReviseBaseModel {
+ fields: GeneVariantFields
}
-export const variantReviseFieldsDefaults: VariantFields = {
+export const geneVariantReviseFieldsDefaults: GeneVariantFields = {
name: undefined,
aliases: undefined,
hgvsDescriptions: undefined,
@@ -23,13 +23,13 @@ export const variantReviseFieldsDefaults: VariantFields = {
representativeTranscript2: undefined,
featureId: undefined,
referenceBases: undefined,
- variantBases: undefined
+ variantBases: undefined,
}
-export const variantReviseFormInitialModel: VariantReviseModel = {
+export const geneVariantReviseFormInitialModel: GeneVariantReviseModel = {
id: undefined,
clientMutationId: undefined,
- fields: variantReviseFieldsDefaults,
+ fields: geneVariantReviseFieldsDefaults,
comment: undefined,
- organizationId: undefined
+ organizationId: undefined,
}
diff --git a/client/src/app/forms/test-pages/variant-revise-test/variant-revise-test.module.ts b/client/src/app/forms/test-pages/variant-revise-test/variant-revise-test.module.ts
index 846f5cfec..ee70679dc 100644
--- a/client/src/app/forms/test-pages/variant-revise-test/variant-revise-test.module.ts
+++ b/client/src/app/forms/test-pages/variant-revise-test/variant-revise-test.module.ts
@@ -1,11 +1,10 @@
import { NgModule } from '@angular/core'
import { CommonModule } from '@angular/common'
import { VariantReviseTestPage } from './variant-revise-test.page'
-import { CvcVariantReviseFormModule } from '@app/forms/config/variant-revise/variant-revise.form.module'
+import { CvcGeneVariantReviseFormModule } from '@app/forms/config/gene-variant-revise/gene-variant-revise.form.module'
@NgModule({
declarations: [VariantReviseTestPage],
- imports: [CommonModule, CvcVariantReviseFormModule],
+ imports: [CommonModule, CvcGeneVariantReviseFormModule],
})
export class VariantReviseTestModule {}
-
diff --git a/client/src/app/forms/test-pages/variant-revise-test/variant-revise-test.page.html b/client/src/app/forms/test-pages/variant-revise-test/variant-revise-test.page.html
index 0d5b44a62..c747c5617 100644
--- a/client/src/app/forms/test-pages/variant-revise-test/variant-revise-test.page.html
+++ b/client/src/app/forms/test-pages/variant-revise-test/variant-revise-test.page.html
@@ -1 +1,2 @@
-
\ No newline at end of file
+
+
diff --git a/client/src/app/forms/types/feature-select/feature-select.type.html b/client/src/app/forms/types/feature-select/feature-select.type.html
index 50d8ff65f..5e9caaa09 100644
--- a/client/src/app/forms/types/feature-select/feature-select.type.html
+++ b/client/src/app/forms/types/feature-select/feature-select.type.html
@@ -3,6 +3,7 @@
>
- selectedFeatureType: FeatureInstanceTypes = this.defaultOptions.featureType
+ selectedFeatureType?: FeatureInstanceTypes = this.props.featureType
onFeatureType$?: BehaviorSubject> =
new BehaviorSubject>(undefined)
@@ -105,6 +106,7 @@ export class CvcFeatureSelectField
}
ngAfterViewInit(): void {
+ this.selectedFeatureType = this.props.featureType
this.configureBaseField() // mixin fn
this.configureEntitySelectField({
// mixin fn
diff --git a/client/src/app/forms/types/variant-select/variant-select.query.gql b/client/src/app/forms/types/variant-select/variant-select.query.gql
index 7e3c2fae4..26271c7c0 100644
--- a/client/src/app/forms/types/variant-select/variant-select.query.gql
+++ b/client/src/app/forms/types/variant-select/variant-select.query.gql
@@ -18,7 +18,7 @@ query VariantSelectTag($variantId: Int!) {
}
}
-fragment VariantSelectTypeaheadFields on Variant {
+fragment VariantSelectTypeaheadFields on VariantInterface {
id
name
link
diff --git a/client/src/app/forms/utilities/factor-variant-to-model-fields.ts b/client/src/app/forms/utilities/factor-variant-to-model-fields.ts
new file mode 100644
index 000000000..d964a2e0d
--- /dev/null
+++ b/client/src/app/forms/utilities/factor-variant-to-model-fields.ts
@@ -0,0 +1,43 @@
+import {
+ Maybe,
+ RevisableFactorVariantFieldsFragment,
+ SuggestFactorVariantRevisionInput,
+} from '@app/generated/civic.apollo'
+import * as fmt from '@app/forms/utilities/input-formatters'
+import { FactorVariantReviseModel } from '../models/factor-variant-revise.model'
+import { FactorVariantFields } from '../models/factor-variant-fields.model'
+
+export function factorVariantToModelFields(
+ variant: RevisableFactorVariantFieldsFragment
+): FactorVariantFields {
+ return {
+ name: variant.name,
+ aliases: variant.variantAliases,
+ variantTypeIds: variant.variantTypes.map((vt) => vt.id),
+ featureId: variant.feature.id,
+ ncitId: variant.ncitId,
+ }
+}
+
+export function factorVariantFormModelToReviseInput(
+ vid: number,
+ model: FactorVariantReviseModel
+): Maybe {
+ const fields = model.fields
+ if (!model.comment || !fields.name || !fields.featureId) {
+ return undefined
+ }
+
+ return {
+ id: vid,
+ fields: {
+ name: fields.name,
+ aliases: fields.aliases || [],
+ variantTypeIds: fields.variantTypeIds || [],
+ featureId: fields.featureId,
+ ncitId: fmt.toNullableString(fields.ncitId),
+ },
+ organizationId: model.organizationId,
+ comment: model.comment!,
+ }
+}
diff --git a/client/src/app/forms/utilities/variant-to-model-fields.ts b/client/src/app/forms/utilities/gene-variant-to-model-fields.ts
similarity index 85%
rename from client/src/app/forms/utilities/variant-to-model-fields.ts
rename to client/src/app/forms/utilities/gene-variant-to-model-fields.ts
index c91e9c505..91901b3bf 100644
--- a/client/src/app/forms/utilities/variant-to-model-fields.ts
+++ b/client/src/app/forms/utilities/gene-variant-to-model-fields.ts
@@ -1,16 +1,16 @@
import {
ClinvarInput,
Maybe,
- RevisableVariantFieldsFragment,
- SuggestVariantRevisionInput,
+ RevisableGeneVariantFieldsFragment,
+ SuggestGeneVariantRevisionInput,
} from '@app/generated/civic.apollo'
import * as fmt from '@app/forms/utilities/input-formatters'
-import { VariantReviseModel } from '../models/variant-revise.model'
-import { VariantFields } from '../models/variant-fields.model'
+import { GeneVariantReviseModel } from '../models/gene-variant-revise.model'
+import { GeneVariantFields } from '../models/gene-variant-fields.model'
-export function variantToModelFields(
- variant: RevisableVariantFieldsFragment
-): VariantFields {
+export function geneVariantToModelFields(
+ variant: RevisableGeneVariantFieldsFragment
+): GeneVariantFields {
return {
name: variant.name,
aliases: variant.variantAliases,
@@ -35,10 +35,10 @@ export function variantToModelFields(
}
}
-export function variantFormModelToReviseInput(
+export function geneVariantFormModelToReviseInput(
vid: number,
- model: VariantReviseModel
-): Maybe {
+ model: GeneVariantReviseModel
+): Maybe {
const fields = model.fields
if (!model.comment || !fields.name || !fields.featureId) {
return undefined
diff --git a/client/src/app/generated/civic.apollo-helpers.ts b/client/src/app/generated/civic.apollo-helpers.ts
index 84d7b0d20..457a3aa10 100644
--- a/client/src/app/generated/civic.apollo-helpers.ts
+++ b/client/src/app/generated/civic.apollo-helpers.ts
@@ -39,7 +39,7 @@ export type ActivityInterfaceFieldPolicy = {
user?: FieldPolicy | FieldReadFunction,
verbiage?: FieldPolicy | FieldReadFunction
};
-export type ActivityInterfaceConnectionKeySpecifier = ('activityTypes' | 'edges' | 'nodes' | 'pageCount' | 'pageInfo' | 'participatingOrganizations' | 'totalCount' | 'unfilteredCount' | 'uniqueParticipants' | ActivityInterfaceConnectionKeySpecifier)[];
+export type ActivityInterfaceConnectionKeySpecifier = ('activityTypes' | 'edges' | 'nodes' | 'pageCount' | 'pageInfo' | 'participatingOrganizations' | 'subjectTypes' | 'totalCount' | 'unfilteredCount' | 'uniqueParticipants' | ActivityInterfaceConnectionKeySpecifier)[];
export type ActivityInterfaceConnectionFieldPolicy = {
activityTypes?: FieldPolicy | FieldReadFunction,
edges?: FieldPolicy | FieldReadFunction,
@@ -47,6 +47,7 @@ export type ActivityInterfaceConnectionFieldPolicy = {
pageCount?: FieldPolicy | FieldReadFunction,
pageInfo?: FieldPolicy | FieldReadFunction,
participatingOrganizations?: FieldPolicy | FieldReadFunction,
+ subjectTypes?: FieldPolicy | FieldReadFunction,
totalCount?: FieldPolicy | FieldReadFunction,
unfilteredCount?: FieldPolicy | FieldReadFunction,
uniqueParticipants?: FieldPolicy | FieldReadFunction
@@ -337,9 +338,10 @@ export type BrowseTherapyEdgeFieldPolicy = {
cursor?: FieldPolicy | FieldReadFunction,
node?: FieldPolicy | FieldReadFunction
};
-export type BrowseVariantKeySpecifier = ('aliases' | 'diseases' | 'featureId' | 'featureLink' | 'featureName' | 'id' | 'link' | 'name' | 'therapies' | 'variantTypes' | BrowseVariantKeySpecifier)[];
+export type BrowseVariantKeySpecifier = ('aliases' | 'category' | 'diseases' | 'featureId' | 'featureLink' | 'featureName' | 'id' | 'link' | 'name' | 'therapies' | 'variantTypes' | BrowseVariantKeySpecifier)[];
export type BrowseVariantFieldPolicy = {
aliases?: FieldPolicy | FieldReadFunction,
+ category?: FieldPolicy | FieldReadFunction,
diseases?: FieldPolicy | FieldReadFunction,
featureId?: FieldPolicy | FieldReadFunction,
featureLink?: FieldPolicy | FieldReadFunction,
@@ -846,6 +848,32 @@ export type FactorFieldPolicy = {
sources?: FieldPolicy | FieldReadFunction,
variants?: FieldPolicy | FieldReadFunction
};
+export type FactorVariantKeySpecifier = ('comments' | 'creationActivity' | 'deprecated' | 'deprecationActivity' | 'deprecationReason' | 'events' | 'feature' | 'flagged' | 'flags' | 'id' | 'lastAcceptedRevisionEvent' | 'lastCommentEvent' | 'lastSubmittedRevisionEvent' | 'link' | 'molecularProfiles' | 'name' | 'ncitDetails' | 'ncitId' | 'revisions' | 'singleVariantMolecularProfile' | 'singleVariantMolecularProfileId' | 'variantAliases' | 'variantTypes' | FactorVariantKeySpecifier)[];
+export type FactorVariantFieldPolicy = {
+ comments?: FieldPolicy | FieldReadFunction,
+ creationActivity?: FieldPolicy | FieldReadFunction,
+ deprecated?: FieldPolicy | FieldReadFunction,
+ deprecationActivity?: FieldPolicy | FieldReadFunction,
+ deprecationReason?: FieldPolicy | FieldReadFunction,
+ events?: FieldPolicy | FieldReadFunction,
+ feature?: FieldPolicy | FieldReadFunction,
+ flagged?: FieldPolicy | FieldReadFunction,
+ flags?: FieldPolicy | FieldReadFunction,
+ id?: FieldPolicy | FieldReadFunction,
+ lastAcceptedRevisionEvent?: FieldPolicy | FieldReadFunction,
+ lastCommentEvent?: FieldPolicy | FieldReadFunction,
+ lastSubmittedRevisionEvent?: FieldPolicy | FieldReadFunction,
+ link?: FieldPolicy | FieldReadFunction,
+ molecularProfiles?: FieldPolicy | FieldReadFunction,
+ name?: FieldPolicy | FieldReadFunction,
+ ncitDetails?: FieldPolicy | FieldReadFunction,
+ ncitId?: FieldPolicy | FieldReadFunction,
+ revisions?: FieldPolicy | FieldReadFunction,
+ singleVariantMolecularProfile?: FieldPolicy | FieldReadFunction,
+ singleVariantMolecularProfileId?: FieldPolicy | FieldReadFunction,
+ variantAliases?: FieldPolicy | FieldReadFunction,
+ variantTypes?: FieldPolicy | FieldReadFunction
+};
export type FdaCodeKeySpecifier = ('code' | 'description' | FdaCodeKeySpecifier)[];
export type FdaCodeFieldPolicy = {
code?: FieldPolicy | FieldReadFunction,
@@ -982,6 +1010,42 @@ export type GeneEdgeFieldPolicy = {
cursor?: FieldPolicy | FieldReadFunction,
node?: FieldPolicy | FieldReadFunction
};
+export type GeneVariantKeySpecifier = ('alleleRegistryId' | 'clinvarIds' | 'comments' | 'creationActivity' | 'deprecated' | 'deprecationActivity' | 'deprecationReason' | 'ensemblVersion' | 'events' | 'feature' | 'flagged' | 'flags' | 'hgvsDescriptions' | 'id' | 'lastAcceptedRevisionEvent' | 'lastCommentEvent' | 'lastSubmittedRevisionEvent' | 'link' | 'maneSelectTranscript' | 'molecularProfiles' | 'myVariantInfo' | 'name' | 'openCravatUrl' | 'primaryCoordinates' | 'referenceBases' | 'referenceBuild' | 'revisions' | 'secondaryCoordinates' | 'singleVariantMolecularProfile' | 'singleVariantMolecularProfileId' | 'variantAliases' | 'variantBases' | 'variantTypes' | GeneVariantKeySpecifier)[];
+export type GeneVariantFieldPolicy = {
+ alleleRegistryId?: FieldPolicy | FieldReadFunction,
+ clinvarIds?: FieldPolicy | FieldReadFunction,
+ comments?: FieldPolicy | FieldReadFunction,
+ creationActivity?: FieldPolicy | FieldReadFunction,
+ deprecated?: FieldPolicy | FieldReadFunction,
+ deprecationActivity?: FieldPolicy | FieldReadFunction,
+ deprecationReason?: FieldPolicy | FieldReadFunction,
+ ensemblVersion?: FieldPolicy | FieldReadFunction,
+ events?: FieldPolicy | FieldReadFunction,
+ feature?: FieldPolicy | FieldReadFunction,
+ flagged?: FieldPolicy | FieldReadFunction,
+ flags?: FieldPolicy | FieldReadFunction,
+ hgvsDescriptions?: FieldPolicy | FieldReadFunction,
+ id?: FieldPolicy | FieldReadFunction,
+ lastAcceptedRevisionEvent?: FieldPolicy | FieldReadFunction,
+ lastCommentEvent?: FieldPolicy | FieldReadFunction,
+ lastSubmittedRevisionEvent?: FieldPolicy | FieldReadFunction,
+ link?: FieldPolicy | FieldReadFunction,
+ maneSelectTranscript?: FieldPolicy | FieldReadFunction,
+ molecularProfiles?: FieldPolicy | FieldReadFunction,
+ myVariantInfo?: FieldPolicy | FieldReadFunction,
+ name?: FieldPolicy | FieldReadFunction,
+ openCravatUrl?: FieldPolicy | FieldReadFunction,
+ primaryCoordinates?: FieldPolicy | FieldReadFunction,
+ referenceBases?: FieldPolicy | FieldReadFunction,
+ referenceBuild?: FieldPolicy | FieldReadFunction,
+ revisions?: FieldPolicy | FieldReadFunction,
+ secondaryCoordinates?: FieldPolicy | FieldReadFunction,
+ singleVariantMolecularProfile?: FieldPolicy | FieldReadFunction,
+ singleVariantMolecularProfileId?: FieldPolicy | FieldReadFunction,
+ variantAliases?: FieldPolicy | FieldReadFunction,
+ variantBases?: FieldPolicy | FieldReadFunction,
+ variantTypes?: FieldPolicy | FieldReadFunction
+};
export type LeaderboardOrganizationKeySpecifier = ('actionCount' | 'description' | 'eventCount' | 'events' | 'id' | 'memberCount' | 'members' | 'mostRecentActivityTimestamp' | 'name' | 'orgAndSuborgsStatsHash' | 'orgStatsHash' | 'profileImagePath' | 'rank' | 'ranks' | 'subGroups' | 'url' | LeaderboardOrganizationKeySpecifier)[];
export type LeaderboardOrganizationFieldPolicy = {
actionCount?: FieldPolicy | FieldReadFunction,
@@ -1213,7 +1277,7 @@ export type MolecularProfileTextSegmentKeySpecifier = ('text' | MolecularProfile
export type MolecularProfileTextSegmentFieldPolicy = {
text?: FieldPolicy | FieldReadFunction
};
-export type MutationKeySpecifier = ('acceptRevisions' | 'addComment' | 'addDisease' | 'addRemoteCitation' | 'addTherapy' | 'createFeature' | 'createMolecularProfile' | 'createVariant' | 'deprecateComplexMolecularProfile' | 'deprecateFeature' | 'deprecateVariant' | 'editUser' | 'flagEntity' | 'moderateAssertion' | 'moderateEvidenceItem' | 'rejectRevisions' | 'resolveFlag' | 'submitAssertion' | 'submitEvidence' | 'submitVariantGroup' | 'subscribe' | 'suggestAssertionRevision' | 'suggestEvidenceItemRevision' | 'suggestFactorRevision' | 'suggestGeneRevision' | 'suggestMolecularProfileRevision' | 'suggestSource' | 'suggestVariantGroupRevision' | 'suggestVariantRevision' | 'unsubscribe' | 'updateCoi' | 'updateNotificationStatus' | 'updateSourceSuggestionStatus' | MutationKeySpecifier)[];
+export type MutationKeySpecifier = ('acceptRevisions' | 'addComment' | 'addDisease' | 'addRemoteCitation' | 'addTherapy' | 'createFeature' | 'createMolecularProfile' | 'createVariant' | 'deprecateComplexMolecularProfile' | 'deprecateFeature' | 'deprecateVariant' | 'editUser' | 'flagEntity' | 'moderateAssertion' | 'moderateEvidenceItem' | 'rejectRevisions' | 'resolveFlag' | 'submitAssertion' | 'submitEvidence' | 'submitVariantGroup' | 'subscribe' | 'suggestAssertionRevision' | 'suggestEvidenceItemRevision' | 'suggestFactorRevision' | 'suggestFactorVariantRevision' | 'suggestGeneRevision' | 'suggestGeneVariantRevision' | 'suggestMolecularProfileRevision' | 'suggestSource' | 'suggestVariantGroupRevision' | 'unsubscribe' | 'updateCoi' | 'updateNotificationStatus' | 'updateSourceSuggestionStatus' | MutationKeySpecifier)[];
export type MutationFieldPolicy = {
acceptRevisions?: FieldPolicy | FieldReadFunction,
addComment?: FieldPolicy | FieldReadFunction,
@@ -1239,11 +1303,12 @@ export type MutationFieldPolicy = {
suggestAssertionRevision?: FieldPolicy | FieldReadFunction,
suggestEvidenceItemRevision?: FieldPolicy | FieldReadFunction,
suggestFactorRevision?: FieldPolicy | FieldReadFunction,
+ suggestFactorVariantRevision?: FieldPolicy | FieldReadFunction,
suggestGeneRevision?: FieldPolicy | FieldReadFunction,
+ suggestGeneVariantRevision?: FieldPolicy | FieldReadFunction,
suggestMolecularProfileRevision?: FieldPolicy | FieldReadFunction,
suggestSource?: FieldPolicy | FieldReadFunction,
suggestVariantGroupRevision?: FieldPolicy | FieldReadFunction,
- suggestVariantRevision?: FieldPolicy | FieldReadFunction,
unsubscribe?: FieldPolicy | FieldReadFunction,
updateCoi?: FieldPolicy | FieldReadFunction,
updateNotificationStatus?: FieldPolicy | FieldReadFunction,
@@ -1854,12 +1919,24 @@ export type SuggestFactorRevisionPayloadFieldPolicy = {
factor?: FieldPolicy | FieldReadFunction,
results?: FieldPolicy | FieldReadFunction |