diff --git a/backend/common/models/dataset.js b/backend/common/models/dataset.js index 6e3328862..61ba0e6d6 100644 --- a/backend/common/models/dataset.js +++ b/backend/common/models/dataset.js @@ -240,12 +240,16 @@ module.exports = function(Dataset) { if (feature.end !== undefined) { value.push(feature.end); } - array_features.push({ + let f = { name: feature.name, value, value_0: feature.val, blockId: blocks_by_name[feature.block] - }); + }; + if (feature.values) { + f.values = feature.values; + } + array_features.push(f); }); // create new features return models.Feature.create(array_features); diff --git a/frontend/app/components/panel/upload/blast-results-view.js b/frontend/app/components/panel/upload/blast-results-view.js index 625a0d528..2d7b00810 100644 --- a/frontend/app/components/panel/upload/blast-results-view.js +++ b/frontend/app/components/panel/upload/blast-results-view.js @@ -24,7 +24,20 @@ const tableHeight = 500; // pixels * This also aligns with createTable() : colHeaders below. */ const columnsKeyString = [ - 'name', 'chr', 'pcIdentity', 'lengthOfHspHit', 'numMismatches', 'numGaps', 'queryStart', 'queryEnd', 'pos', 'end' + 'name', // query ID + 'chr', // subject ID + 'pcIdentity', // % identity + 'lengthOfHspHit', // length of HSP (hit) + 'numMismatches', // # mismatches + 'numGaps', // # gaps + 'queryStart', // query start + 'queryEnd', // query end + 'pos', // subject start + 'end', // subject end + 'eValue', // e-value + 'score', // score + 'queryLength', // query length + 'subjectLength', // subject length ]; /** Identify the columns of dataFeatures and dataMatrix. */ @@ -43,11 +56,6 @@ const t_view = 0; */ export default Component.extend({ - /** Similar comment to data-csv.js applies re. store (user could select server via GUI). - * store is used by upload-table.js : getDatasetId() and submitFile() - */ - store : alias('apiServers.primaryServer.store'), - auth: service('auth'), transient : service('data/transient'), /*--------------------------------------------------------------------------*/ @@ -61,12 +69,18 @@ export default Component.extend({ didReceiveAttrs() { this._super(...arguments); + let promise = this.get('search.promise'); if (promise) { promise.catch(() => { this.set('statusMessage', 'The search did not complete'); }); } + + /** not clear yet where addDataset functionality will end up, so wire this up for now. */ + this.registerDataPipe({ + validateData: () => this.validateData() + }); }, /*--------------------------------------------------------------------------*/ @@ -121,6 +135,21 @@ export default Component.extend({ if (row[c_end] !== undefined) { feature.end = Number(row[c_end]); } + // place the remainder of the columns into feature.values + feature.values = row.reduce((v, c, i) => { + switch (i) { + case c_name: + case c_chr: + case c_pos: + case c_end: + break; + default: + v[columnsKeyString[i]] = c; + break; + } + return v; + }, {}); + return feature; }); dLog('dataFeatures', features.length, features[0]); diff --git a/frontend/app/components/panel/upload/blast-results.js b/frontend/app/components/panel/upload/blast-results.js index a8f01d7df..c33e42b16 100644 --- a/frontend/app/components/panel/upload/blast-results.js +++ b/frontend/app/components/panel/upload/blast-results.js @@ -18,6 +18,17 @@ const dLog = console.debug; * /Feature/dnaSequenceSearch */ export default Component.extend({ + /*--------------------------------------------------------------------------*/ + // support for upload-table + + /** Similar comment to data-csv.js applies re. store (user could select server via GUI). + * store is used by upload-table.js : getDatasetId() and submitFile() + */ + store : alias('apiServers.primaryServer.store'), + auth: service('auth'), // used by upload-table.js : submitFile() + + /*--------------------------------------------------------------------------*/ + apiServers: service(), blockService : service('data/block'), queryParams: service('query-params'), @@ -150,7 +161,7 @@ export default Component.extend({ */ unviewDataset(datasetName) { let - store = this.get('apiServers').get('primaryServer').get('store'), + store = this.get('store'), replacedDataset = store.peekRecord('dataset', datasetName); if (replacedDataset) { let diff --git a/frontend/app/templates/components/panel/upload/blast-results.hbs b/frontend/app/templates/components/panel/upload/blast-results.hbs index e7b7c3a73..f7685af70 100644 --- a/frontend/app/templates/components/panel/upload/blast-results.hbs +++ b/frontend/app/templates/components/panel/upload/blast-results.hbs @@ -49,6 +49,7 @@ {{panel/upload/blast-results-view viewDataset=viewDataset search=search data=data active=active tableVisible=tableVisible tableModal=tableModal + registerDataPipe=(action (mut this.dataPipe)) }} {{/ember-wormhole}} diff --git a/frontend/app/utils/panel/upload-table.js b/frontend/app/utils/panel/upload-table.js index 1f23d13f3..7ff7bfaae 100644 --- a/frontend/app/utils/panel/upload-table.js +++ b/frontend/app/utils/panel/upload-table.js @@ -99,7 +99,9 @@ export default { that.set('nameWarning', null); var table = that.get('table'); // 1. Check data and get cleaned copy - that.validateData() + let validateData = (that.validateData && (() => that.validateData())) || + (that.dataPipe.validateData && (() => that.dataPipe.validateData())); + validateData() .then((features) => { if (features.length > 0) { // 2. Get new or selected dataset name