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