async readClick()

in client/client/app/components/ngbTracksView/ngbTrack/ngbTrack.events.js [303:509]


    async readClick(trackInstance, data, track, event) {
        const hasPairRead = data.read.pnext !== undefined && data.read.pnext !== null && data.read.pnext !== 0;

        let pairReadParameters = {originalRead: data.read, position: data.read.pnext};

        let goToMateMenuItemEvent = null;
        let chromosomeNotFoundError = null;
        if (hasPairRead) {
            let chr = data.chromosome;
            let chromosomeChanged = false;
            if (data.read.rnext !== '=') {
                chr = this.projectContext.getChromosome({name: data.read.rnext});
                chromosomeChanged = true;
                if (!chr) {
                    chromosomeNotFoundError = `Chromosome ${data.read.rnext} not found`;
                }
            }
            if (!chromosomeNotFoundError) {
                pairReadParameters.endPoint = {
                    chromosome: chr.name,
                    position: data.read.pnext
                };
            } else {
                pairReadParameters = null;
            }

            if (!chromosomeChanged) {
                goToMateMenuItemEvent = {position: data.read.pnext};
            } else if (pairReadParameters) {
                goToMateMenuItemEvent = {
                    chromosome: {name: pairReadParameters.endPoint.chromosome},
                    position: data.read.pnext
                };
            }
        }

        const goToMateMenuItem = pairReadParameters ? {
            state: goToMateMenuItemEvent,
            title: goToMateMenuItemEvent ? 'Go to mate' : 'Chromosome not found'
        } : null;
        const openMateMenuItem = pairReadParameters ? {
            events: [{
                data: new PairReadInfo(pairReadParameters),
                name: 'read:show:mate'
            }],
            title: 'Open mate region in split view'
        } : null;
        const showInfo = {
            events: [
                {
                    data: {
                        chromosomeId: track.instance.config.chromosomeId,
                        endIndex: data.read.endIndex,
                        properties: data.info,
                        read: data.read,
                        referenceId: track.instance.config.referenceId,
                        startIndex: data.read.startIndex,
                        geneId: null,
                        title: 'ALIGNMENT',
                        infoForRead: {
                            id: track.id,
                            projectId: track.project ? track.project.id : undefined,
                            chromosomeId: data.chromosome.id,
                            startIndex: data.read.startIndex,
                            endIndex: data.read.endIndex,
                            name: data.read.name,
                            openByUrl: track.openByUrl,
                            file: track.openByUrl ? track.id : null,
                            index: track.openByUrl ? track.indexPath : null
                        }
                    },
                    name: 'feature:info:select'
                }
            ],
            title: 'Show info'
        };

        const self = this;
        const copyToClipboard = {
            clipboard: 'Loading...',
            title: 'Copy info to clipboard',
            isLoading: true,
            fn: async function (menuItem) {
                const payload = {
                    id: track.id,
                    projectId: track.project ? track.project.id : undefined,
                    chromosomeId: data.chromosome.id,
                    startIndex: data.read.startIndex,
                    endIndex: data.read.endIndex,
                    name: data.read.name,
                    openByUrl: track.openByUrl,
                    file: track.openByUrl ? track.id : null,
                    index: track.openByUrl ? track.indexPath : null
                };
                const read = await self._bamDataService.loadRead(payload);
                const generalInfo = data.info.map(line => line.join(' = ')).join('\r\n');
                const tags = read.tags.map(tag => `${tag.tag} = ${tag.value}`).join('\r\n');

                menuItem.clipboard = `${generalInfo}\r\n\r\n${read.sequence}\r\n\r\n${tags}`;
                menuItem.isLoading = false;
                self.$scope.$apply();
            }
        };

        const copySequenceToClipboard = {
            clipboard: 'Loading...',
            title: 'Copy sequence to clipboard',
            isLoading: true,
            fn: async function (menuItem) {
                const payload = {
                    id: track.id,
                    projectId: track.project ? track.project.id : undefined,
                    chromosomeId: data.chromosome.id,
                    startIndex: data.read.startIndex,
                    endIndex: data.read.endIndex,
                    name: data.read.name,
                    openByUrl: track.openByUrl,
                    file: track.openByUrl ? track.id : null,
                    index: track.openByUrl ? track.indexPath : null
                };
                const read = await self._bamDataService.loadRead(payload);
                menuItem.clipboard = read.sequence;
                menuItem.isLoading = false;
                self.$scope.$apply();
            }
        };
        const readInfo = {
            geneId: null,
            id: track.id,
            referenceId: track.referenceId,
            chromosomeId: data.chromosome.id,
            startIndex: data.read.startIndex,
            endIndex: data.read.endIndex,
            name: data.read.name,
            openByUrl: track.openByUrl,
            file: track.openByUrl ? track.id : null,
            index: track.openByUrl ? track.indexPath : null
        };
        const openBlatSearchMenuItem = {
            title: 'BLAT Search',
            events: [{
                data: {...readInfo},
                name: 'read:show:blat',
            }],
        };
        const openBlastnSearchMenuItem = {
            events: [{
                data: {
                    ...readInfo,
                    tool: 'blastn',
                    source: 'bam'
                },
                name: 'read:show:blast',
            }],
            title: 'BLASTn Search',
        };
        const openMotifsSearchMenuItem = {
            events: [{
                data: {
                    getSequence: async function () {
                        const payload = {
                            id: track.id,
                            projectId: track.projectIdNumber || undefined,
                            chromosomeId: data.chromosome.id,
                            startIndex: data.read.startIndex,
                            endIndex: data.read.endIndex,
                            name: data.read.name,
                            openByUrl: track.openByUrl,
                            file: track.openByUrl ? track.id : null,
                            index: track.openByUrl ? track.indexPath : null
                        };
                        const read = await self._bamDataService.loadRead(payload);
                        return read.sequence || null;
                    }
                },
                name: 'search:motifs:open',
            }],
            title: 'Motifs Search'
        };

        const menuData = [];
        menuData.push(showInfo);
        if (hasPairRead && !chromosomeNotFoundError) {
            menuData.push(goToMateMenuItem);
            menuData.push(openMateMenuItem);
        }
        menuData.push(openMotifsSearchMenuItem);
        menuData.push(openBlatSearchMenuItem);
        menuData.push(openBlastnSearchMenuItem);
        menuData.push(copyToClipboard);
        menuData.push(copySequenceToClipboard);
        if (chromosomeNotFoundError) {
            menuData.push({
                title: chromosomeNotFoundError
            });
        }

        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');
    }