featureClick()

in client/client/app/components/ngbTracksView/ngbTrack/ngbTrack.events.js [28:261]


    featureClick(trackInstance, data, track, event) {
        const isGeneTrack = track.format.toLowerCase() === 'gene';
        const blastSettings = this.projectContext.getTrackDefaultSettings('blast_settings');
        const maxQueryLengthProperty = 'query_max_length';
        const maxSequenceLength = blastSettings &&
        blastSettings.hasOwnProperty(maxQueryLengthProperty) &&
        !Number.isNaN(Number(blastSettings[maxQueryLengthProperty]))
            ? Number(blastSettings[maxQueryLengthProperty])
            : Infinity;
        if (data.feature) {
            const featureSize = Math.abs((data.feature.startIndex || 0) - (data.feature.endIndex || 0));
            (async () => {
                let geneTracks = [];
                if (!isGeneTrack) {
                    geneTracks = this._getGeneTracks();
                } else {
                    geneTracks.push({
                        chromosomeId: trackInstance.config.chromosomeId,
                        id: track.id,
                        name: track.name,
                        projectId: track.project ? track.project.id : undefined,
                        referenceId: track.referenceId
                    });
                }
                const menuData = [];
                const featureAttributes = data.feature.attributes;
                if (!data.feature.grouping) {
                    const getChrName = (id) => {
                        const chrIndex =  this.projectContext.chromosomes.findIndex(chr => chr.id === id);
                        return chrIndex > -1 &&
                            this.projectContext.chromosomes[chrIndex] &&
                            this.projectContext.chromosomes[chrIndex].name;
                    };
                    menuData.push({
                        events: [{
                            data: {
                                chromosomeId: trackInstance.config.chromosomeId,
                                seqName: data.feature.seqName || getChrName(trackInstance.config.chromosomeId),
                                endIndex: data.feature.endIndex,
                                name: data.feature.name,
                                properties: data.info,
                                projectId: track.project ? track.project.id : undefined,
                                referenceId: track.referenceId,
                                startIndex: data.feature.startIndex,
                                geneId: (featureAttributes && featureAttributes.gene_id) || null,
                                title: 'FEATURE',
                                fileId: track.id,
                                uuid: isGeneTrack ? data.feature.uid : undefined
                            },
                            name: 'feature:info:select'
                        }],
                        title: 'Show Info'
                    });
                }
                if (/^(gene|transcript|mrna|cds)$/i.test(data.feature.feature)) {
                    let featureType = data.feature.feature;
                    if (/^(transcript)$/i.test(featureType)) {
                        featureType = 'mRNA';
                    }
                    const blastSearchParams = {
                        geneId: (data.feature.attributes && data.feature.attributes.gene_id)
                            ? data.feature.attributes.gene_id
                            : null,
                        id: track.id,
                        chromosomeId: trackInstance.config.chromosomeId,
                        referenceId: track.referenceId,
                        index: track.openByUrl ? track.indexPath : null,
                        startIndex: data.feature.startIndex,
                        endIndex: data.feature.endIndex,
                        name: data.feature.name,
                        file: track.openByUrl ? track.id : null,
                        openByUrl: track.openByUrl,
                        feature: featureType
                    };
                    menuData.push({
                        events: [{
                            data: {
                                ...blastSearchParams,
                                tool: 'blastn',
                                source: 'gene'
                            },
                            name: 'read:show:blast'
                        }],
                        disabled: maxSequenceLength < featureSize,
                        warning: maxSequenceLength < featureSize
                            ? `Query maximum length (${maxSequenceLength}bp) exceeded`
                            : undefined,
                        title: 'BLASTn search',
                    });
                    menuData.push({
                        events: [{
                            data: {
                                ...blastSearchParams,
                                tool: 'blastp',
                                aminoAcid: true,
                                source: 'gene'
                            },
                            name: 'read:show:blast'
                        }],
                        disabled: !blastSearchParams.name,
                        warning: !blastSearchParams.name
                            ? 'Feature name is missing'
                            : undefined,
                        title: 'BLASTp search',
                    });
                } else if (
                    !data.feature.grouping &&
                    data.feature.startIndex &&
                    data.feature.endIndex
                ) {
                    const blastSearchParams = {
                        id: track.id,
                        chromosomeId: trackInstance.config.chromosomeId,
                        referenceId: track.referenceId,
                        index: track.openByUrl ? track.indexPath : null,
                        startIndex: data.feature.startIndex,
                        endIndex: data.feature.endIndex,
                        name: data.feature.name,
                        file: track.openByUrl ? track.id : null,
                        openByUrl: track.openByUrl,
                        feature: data.feature.feature
                    };
                    menuData.push({
                        title: 'BLASTn search',
                        disabled: maxSequenceLength < featureSize,
                        warning: maxSequenceLength < featureSize
                            ? `Query maximum length (${maxSequenceLength}bp) exceeded`
                            : undefined,
                        events: [{
                            data: {
                                ...blastSearchParams,
                                tool: 'blastn',
                                source: track.format
                            },
                            name: 'read:show:blast',
                        }]
                    });
                }
                if (geneTracks.length > 0) {
                    if (data.feature.attributes && data.feature.attributes.gene_id) {
                        const layoutChange = this.appLayout.Panels.molecularViewer;
                        layoutChange.displayed = true;
                        menuData.push({
                            events: [
                                {
                                    name: 'miew:clear:structure'
                                },
                                {
                                    data: {layoutChange},
                                    name: 'layout:item:change'
                                },
                                {
                                    data: new EventGeneInfo({
                                        endIndex: data.feature.endIndex,
                                        geneId: data.feature.attributes.gene_id,
                                        geneName: data.feature.attributes.gene_name,
                                        geneTracks,
                                        highlight: false,
                                        startIndex: data.feature.startIndex,
                                        transcriptId: data.feature.attributes.transcript_id
                                    }),
                                    name: 'miew:show:structure'
                                }],
                            title: 'Show 3D structure'
                        });
                    }
                }
                if (data.feature.feature
                    && data.feature.feature.toLowerCase() === 'gene'
                    && data.feature.name) {
                    const layoutChange = this.appLayout.Panels.homologs;
                    layoutChange.displayed = true;
                    menuData.push({
                        events: [
                            {
                                data: {layoutChange},
                                name: 'layout:item:change'
                            },
                            {
                                data: {
                                    search: data.feature.name,
                                    featureId: data.feature.groupId
                                },
                                name: 'read:show:homologs'
                            }],
                        title: 'Show similar genes',
                        disabled: (data.feature.feature || '').toLowerCase() !== 'gene' || !data.feature.name,
                        warning: (data.feature.feature || '').toLowerCase() !== 'gene' || !data.feature.name
                            ? 'Feature type is not Gene or Name is missing'
                            : undefined,
                    });
                }
                if (data.feature.feature && data.feature.name) {
                    const layoutChange = this.appLayout.Panels.pathways;
                    layoutChange.displayed = true;
                    const [reference] = this.projectContext.references.filter(ref => ref.id === track.referenceId);
                    const speciesList = reference && reference.species
                        ? [reference.species.taxId]
                        : null;
                    menuData.push({
                        events: [
                            {
                                data: {layoutChange},
                                name: 'layout:item:change'
                            },
                            {
                                data: {
                                    speciesList,
                                    search: data.feature.name,
                                    rewriteSpecies: true
                                },
                                name: 'read:show:pathways'
                            }],
                        title: 'Show pathways',
                        disabled: !data.feature.name,
                        warning: !data.feature.name
                            ? 'Feature type is not Gene or Name is missing'
                            : undefined,
                    });
                }
                if (menuData.length > 0) {
                    const childScope = this.$scope.$new(false);
                    childScope.menuData = menuData;
                    const html = this.$compile('<ngb-track-menu menu-data="menuData"></ngb-track-menu>')(childScope);
                    trackInstance.menuElement.show(
                        event.position, html
                    );
                    childScope.$apply();
                    ngbTrackEvents.configureCopyToClipboardElements();
                    html.find('#hiddenMenuButton').triggerHandler('click');
                }
            })();
        }
    }