navigateToTracks()

in client/client/app/components/ngbDataSets/ngbDataSets.service.js [335:413]


    navigateToTracks(datasets, forceReference, callback) {
        const {tracks} = this.getSelectedTracks(datasets, forceReference);
        const currentTracks = (this.projectContext.tracks || []).slice();
        this.__lockStatesUpdate = true;
        let [reference] = tracks.filter(t => t.format === 'REFERENCE');
        if (!reference) {
            const [refTrack] = tracks.filter(t => t.reference);
            if (refTrack) {
                reference = refTrack.reference;
                reference.projectId = refTrack.projectId;
                reference.isLocal = refTrack.isLocal;
                tracks.push(reference);
            }
        }
        if (reference) {
            const [currentReference] = currentTracks
                .filter(track => track.format === 'REFERENCE');
            if (!currentReference) {
                currentTracks.push(reference);
            } else if (
                `${currentReference.bioDataItemId || ''}`.toLowerCase() !==
                `${reference.bioDataItemId || ''}`.toLowerCase() ||
                currentReference.projectId !== reference.projectId
            ) {
                currentTracks.splice(currentTracks.indexOf(currentReference), 1, reference);
            }
        }
        if (reference && tracks.filter(t => t.format === 'REFERENCE').length > 0) {
            const tracksState = this.projectContext.tracksState || [];
            if (tracksState.length === 0) {
                tracksState.push({
                    bioDataItemId: reference.name,
                    duplicateId: reference.duplicateId,
                    projectId: reference.projectId,
                    format: 'REFERENCE'
                });
            }
            const getTrackId = track => `[${track.name.toLowerCase()}][${(track.projectId || '').toLowerCase()}]`;
            const getTrackStateId = track => `[${track.bioDataItemId.toLowerCase()}][${(track.projectId || '').toLowerCase()}]`;
            const shouldAddAnnotationTracks = !this.projectContext.reference || this.projectContext.reference.name.toLowerCase() !== reference.name.toLowerCase();
            const tracksIds = tracks.map(getTrackId);
            const tracksStateIds = tracksState.map(getTrackStateId);
            const self = this;
            const mapTrackFn = function (track) {
                const state = self.projectContext.getTrackState(track.name.toLowerCase(), (track.projectId || '').toLowerCase());
                if (state) {
                    const o = Object.assign(state, {index: track.indexPath, name: track.name, format: track.format, isLocal: track.isLocal});
                    o.projectId = o.projectId || '';
                    return o;
                }
                return utilities.mapTrackFn(track);
            };
            const addedTracks = tracks
                .filter(track => tracksStateIds.indexOf(getTrackId(track)) === -1 &&
                    track.format !== 'REFERENCE'
                );
            const addedTrackStates = addedTracks.map(mapTrackFn);
            let existedTracks = tracksState
                .filter(track => tracksIds.indexOf(getTrackStateId(track)) >= 0);
            if (!existedTracks.filter(t => t.bioDataItemId.toString().toLowerCase() === reference.name.toLowerCase()).length) {
                existedTracks = [mapTrackFn(reference), ...existedTracks];
            }
            const newTracksState = [...existedTracks, ...addedTrackStates];
            const newTracks = currentTracks
                .filter(track => track.format === 'REFERENCE' ||
                    tracksIds.indexOf(getTrackId(track)) >= 0
                )
                .concat(addedTracks);
            this.projectContext.changeState({
                reference: reference,
                tracks: newTracks,
                tracksState: newTracksState,
                shouldAddAnnotationTracks
            }, false, callback);
        } else {
            this.projectContext.changeState({reference: null, tracks: null, tracksState: null}, false, callback);
        }
        this.__lockStatesUpdate = false;
    }