diff --git a/CHANGELOG b/CHANGELOG index 8afa070c8833176aa5ef92e45ad85f067d93396f..e4cc527cca16dcba3f406e8211c8b1941cd9cf74 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -10,6 +10,8 @@ minerva (14.0.0~alpha.1) unstable; urgency=low * Bug fix: problem with unloading plugin is properly handled (#884) * Bug fix: upload of invalid plugin doesn't add it to plugin tab and list of loaded plugins (#885) + * Bug fix: link to molart was brokwn (#886) + * Bug fix: context menu visualization fixed -- Piotr Gawron <piotr.gawron@uni.lu> Mon, 12 Aug 2019 10:00:00 +0200 diff --git a/frontend-js/src/main/js/gui/ContextMenu.js b/frontend-js/src/main/js/gui/ContextMenu.js index d00fcdc656f77cbe22ecf75d54357a78dc070bd7..2589284633d4c7aedbdc1178fc987554c7b36f18 100644 --- a/frontend-js/src/main/js/gui/ContextMenu.js +++ b/frontend-js/src/main/js/gui/ContextMenu.js @@ -43,7 +43,7 @@ function ContextMenu(params) { self._documentClickListener = function (e) { var className = e.target.className; if (typeof className === 'string' || className instanceof String) { - if (className.indexOf("dropdown-link") === -1) { + if (className.indexOf("dropdown-item") === -1) { self.hide(new Date().getTime() - self.MIN_SHOW_TIME); } } else { @@ -83,13 +83,12 @@ ContextMenu.prototype.addOption = function (name, handler, disabled) { }); var link = Functions.createElement({ type: "a", - className: "dropdown-link", + className: "dropdown-item", + href: "#", content: name }); - if (!disabled) { - link.href = "#"; - } else { - link.className = 'disabled-link'; + if (disabled) { + link.className = 'dropdown-item disabled'; } $(link).data("handler", handler); option.appendChild(link); diff --git a/frontend-js/src/main/js/gui/SubMenu.js b/frontend-js/src/main/js/gui/SubMenu.js index 1c2838ff293cbfbf40ec9748fc0e40d14b2619a4..16636750720a59b2d2939048e9d3fb5599390bf7 100644 --- a/frontend-js/src/main/js/gui/SubMenu.js +++ b/frontend-js/src/main/js/gui/SubMenu.js @@ -30,7 +30,7 @@ SubMenu.prototype._createGui = function (params) { var link = Functions.createElement({ type: "a", href: "#", - className: "dropdown-link", + className: "dropdown-item", content: params.name }); link.tabIndex = -1; @@ -55,7 +55,7 @@ SubMenu.prototype.addOption = function (name, handler) { var link = Functions.createElement({ type: "a", href: "#", - className: "dropdown-link", + className: "dropdown-item", content: name }); $(link).data("handler", handler); diff --git a/frontend-js/src/main/js/map/AbstractCustomMap.js b/frontend-js/src/main/js/map/AbstractCustomMap.js index af8664e30dcdac538e08e585fa099971f70c4b03..1ceef72193d908c7fb5ee6679b08bd3e3f77d3e6 100644 --- a/frontend-js/src/main/js/map/AbstractCustomMap.js +++ b/frontend-js/src/main/js/map/AbstractCustomMap.js @@ -285,7 +285,7 @@ function activateMolArtLink(coordinates, map) { for (var i = 0; i < element.references.length; i++) { var ref = element.references[i]; if (ref.constructor.name === 'Annotation' && ref.getType() === 'UNIPROT') { - var uniprotId = ref.getResource() + var uniprotId = ref.getResource(); if (uniprotIds.indexOf(uniprotId) < 0) { uniprotIds.push(ref.getResource()); } diff --git a/frontend-js/src/main/js/map/structure/MolArt.js b/frontend-js/src/main/js/map/structure/MolArt.js index c7f5634b79bd7340127a7f799cdb7fa822ac6b8a..afd4d9269c003097c418e34a29be74031a063e61 100644 --- a/frontend-js/src/main/js/map/structure/MolArt.js +++ b/frontend-js/src/main/js/map/structure/MolArt.js @@ -2,6 +2,7 @@ var Functions = require('../../Functions'); var SubMenu = require('../../gui/SubMenu'); var Variant = require('./MolArtVariant'); var getUniprotSequence = require('./UniprotQuery'); +var $ = require('jquery'); /** * @@ -48,7 +49,7 @@ function removeFromContextMenu(menu) { /** * - * @returns {@link Alias} MINERVA element to which the instance of molart is bound + * @returns {Alias} MINERVA element to which the instance of molart is bound */ MolArt.prototype.getAlias = function () { return this._alias; @@ -56,16 +57,16 @@ MolArt.prototype.getAlias = function () { /** * - * @param {@link Alias} MINERVA element to which the instance of molart is bound + * @param {Alias} alias MINERVA element to which the instance of molart is bound */ -MolArt.prototype.setAlias = function(alias) { +MolArt.prototype.setAlias = function (alias) { this._alias = alias; -} +}; /** * * @param {string[]} uniprotIds - * @param {@link Alias} minervaElement + * @param {Alias} alias */ MolArt.prototype.activateInContextMenu = function (uniprotIds, alias) { @@ -147,11 +148,11 @@ MolArt.prototype._activate = function (uniprotId) { var sequence; - getUniprotSequence(uniprotId).then(function(_sequence){ + return getUniprotSequence(uniprotId).then(function (_sequence) { sequence = _sequence; return Promise.resolve(); - }).then(function(){ - retrieveVariants(self._customMap, self.getAlias().getId()).then(function(variants){ + }).then(function () { + retrieveVariants(self._customMap, self.getAlias().getId()).then(function (variants) { if (variants) { var customDataSources = []; @@ -173,40 +174,39 @@ MolArt.prototype._activate = function (uniprotId) { uniprotId: uniprotId, containerId: container.id }); - }; - + } + container.style.display = 'block'; }); - }); -} + }); +}; -var constructVariantsData = function(sequence, variants) { +var constructVariantsData = function (sequence, variants) { return { sequence: sequence, features: variants.map(v => { - return { - type: "VARIANT", - category: "VARIATION", - description: v.description, - begin: v.posFrom, - end: v.posTo ? v.posTo : v.posFrom, - wildType: v.aaFrom, - alternativeSequence: v.aaTo ? v.aaTo : 'd', - consequence: v.varType, - } - }) - } -} + return { + type: "VARIANT", + category: "VARIATION", + description: v.description, + begin: v.posFrom, + end: v.posTo ? v.posTo : v.posFrom, + wildType: v.aaFrom, + alternativeSequence: v.aaTo ? v.aaTo : 'd', + consequence: v.varType, + } + })} +}; -var retrieveVariants = function(customMap, elementId) { +var retrieveVariants = function (customMap, elementId) { var overlays; - return customMap.getTopMap().getVisibleDataOverlays().then(function(dataOverlays){ + return customMap.getTopMap().getVisibleDataOverlays().then(function (dataOverlays) { overlays = dataOverlays; var promises = []; - for (var i=0; i < dataOverlays.length; i++) { + for (var i = 0; i < dataOverlays.length; i++) { promises.push(dataOverlays[i].getFullAliasById(elementId)); } @@ -217,20 +217,20 @@ var retrieveVariants = function(customMap, elementId) { var variants = []; - for (var i=0; i < aliasOverlayData.length; i++) { + for (var i = 0; i < aliasOverlayData.length; i++) { if (!aliasOverlayData[i]) continue; var overlayVariants = []; var geneVariants = aliasOverlayData[i].getGeneVariants(); - for (let i = 0; i < geneVariants.length; i++){ - var variant = geneVariants[i]; + for (let i = 0; i < geneVariants.length; i++) { + var variant = geneVariants[i]; if (variant.getAminoAcidChange() !== null) { // not all variants need to have an aminoacid change associated overlayVariants = overlayVariants.concat(processGeneVariant(variant)); } - + } - if (overlayVariants.length > 0){ + if (overlayVariants.length > 0) { variants.push({ overlayName: overlays[i].getName(), variants: overlayVariants @@ -242,7 +242,7 @@ var retrieveVariants = function(customMap, elementId) { }); } -var processGeneVariant = function(minervaVariant) { +var processGeneVariant = function (minervaVariant) { // synonymous_SNV LRRK2:NM_198578:exon1:c.T45C:p.T15T // synonymous_SNV C20orf96:NM_080571:exon10:c.G1020A:p.R340R,C20orf96:NM_153269:exon10:c.G1023A:p.R341R @@ -253,7 +253,7 @@ var processGeneVariant = function(minervaVariant) { // frameshift insertion: LRRK2:NM_198578:exon1:c.151_152insCCTCCAAGTTATTTCAAGGCAAAAATATCCATGTGCCTCT:p.A51fs // frameshift insertion: p.A51fsins // frameshift insertion: NCOA3:NM_001174087:exon22:c.4171_4172insG:p.M1391fs,NCOA3:NM_001174088:exon22:c.4147_4148insG:p.M1383fs,NCOA3:NM_006534:exon22:c.4162_4163insG:p.M1388fs,NCOA3:NM_181659:exon22:c.4174_4175insG:p.M1392fs - + // nonframeshift_insertion LRRK2:NM_198578:exon27:c.3777_3778insATTCCTCCT:p.E1259delinsEIPP // nonframeshift_insertion p.E1259delinsEIPP // nonframeshift_insertion SYNJ1:NM_001160306:exon28:c.3957_3958insAATACT:p.L1320delinsNTL,SYNJ1:NM_003895:exon32:c.4215_4216insAATACT:p.L1406delinsNTL @@ -265,58 +265,57 @@ var processGeneVariant = function(minervaVariant) { // nonframeshift_deletion LRRK2:NM_198578:exon9:c.1099_1101del:p.367_367del // nonframeshift_deletion p.367_367del // nonframeshift_deletion RRBP1:NM_004587:exon15:c.2022_2024del:p.674_675del,RRBP1:NM_001042576:exon16:c.2022_2024del:p.674_675del - - + + var vars = []; var change = minervaVariant.getAminoAcidChange(); var sChange = change.split(','); - for (var i =0; i < sChange.length; i++) { + for (var i = 0; i < sChange.length; i++) { try { var aaChange = sChange[i].split('.').slice(-1)[0]; // LRRK2:NM_198578:exon1:c.T45C:p.T15T var variant = new Variant(); - if (aaChange.endsWith('del') > 0) { - - var m = aaChange.match( /(\d+)_(\d+)/ ); + if (aaChange.endsWith('del') > 0) { + + var m = aaChange.match(/(\d+)_(\d+)/); [, variant.posFrom, variant.posTo] = m; - variant.varType = 'Nonframeshift deletion' - - }else if (aaChange.indexOf('delins') >=0) { - var m = aaChange.match( /([A-Z])(\d+)delins([A-Z]+)/ ); - [ ,variant.aaFrom, variant.posFrom, variant.aaTo] = m; + variant.varType = 'Nonframeshift deletion' + + } else if (aaChange.indexOf('delins') >= 0) { + var m = aaChange.match(/([A-Z])(\d+)delins([A-Z]+)/); + [, variant.aaFrom, variant.posFrom, variant.aaTo] = m; variant.aaTo = 'delins: ' + variant.aaTo; //This is because ProtVista can't handle insertions so we need to prefix it by 'd' which will place the variant into the 'd' line - variant.varType = 'Nonframeshift insertion'; - } - else if (aaChange.endsWith('fs')) { - - var m = aaChange.match( /([A-Z])(\d+)/ ); - [ ,variant.aaFrom, variant.posFrom] = m; - if (change.indexOf('del') >= 0) variant.varType = 'Frameshift deletion'; - else variant.varType = 'Frameshift insertion'; - + variant.varType = 'Nonframeshift insertion'; + } else if (aaChange.endsWith('fs')) { + + var m = aaChange.match(/([A-Z])(\d+)/); + [, variant.aaFrom, variant.posFrom] = m; + if (change.indexOf('del') >= 0) variant.varType = 'Frameshift deletion'; + else variant.varType = 'Frameshift insertion'; + } else { - var m = aaChange.match( /([a-zA-Z]+)(\d+)([a-zA-Z])+/ ); - + var m = aaChange.match(/([a-zA-Z]+)(\d+)([a-zA-Z])+/); + if (!m || m.length != 4) continue; - [ ,variant.aaFrom, variant.posFrom, variant.aaTo] = m; - variant.varType = variant.aaFrom == variant.aaTo ? 'Synonymous SNV' : 'Nonsynonymous SNV'; + [, variant.aaFrom, variant.posFrom, variant.aaTo] = m; + variant.varType = variant.aaFrom == variant.aaTo ? 'Synonymous SNV' : 'Nonsynonymous SNV'; } - + vars.push(variant); } catch (err) { console.error("Problem with parsing variant " + minervaVariant.getAminoAcidChange(), err); } - } - + } + return vars; -} +}; module.exports = MolArt; diff --git a/frontend-js/src/main/js/map/structure/UniprotQuery.js b/frontend-js/src/main/js/map/structure/UniprotQuery.js index 57a26c4bee09cc5fbd126ed9096a0ba55fd03696..0deb96c996a1bdfb4ab088daff760f58139fcdf4 100644 --- a/frontend-js/src/main/js/map/structure/UniprotQuery.js +++ b/frontend-js/src/main/js/map/structure/UniprotQuery.js @@ -1,16 +1,23 @@ +var $ = require('jquery'); + function ajaxQuery(url, type) { - if (type === undefined) type = "GET"; - - return $.ajax({ - type: type, - url: url - }); - } - - var getUniprotSequence = function(accession) { - return ajaxQuery('https://www.uniprot.org/uniprot/?query=accession%3A'+accession+'&columns=sequence&format=tab').then(function(data){ - return data.split(/\r?\n/)[1]; - }) - } + if (type === undefined) type = "GET"; + + return $.ajax({ + type: type, + url: url + }); +} + +/** + * + * @param accession + * @return {Promise} + */ +var getUniprotSequence = function (accession) { + return ajaxQuery('https://www.uniprot.org/uniprot/?query=accession%3A' + accession + '&columns=sequence&format=tab').then(function (data) { + return data.split(/\r?\n/)[1]; + }) +}; - module.exports = getUniprotSequence; \ No newline at end of file +module.exports = getUniprotSequence; \ No newline at end of file