From b19402ba99c9322a174b2289163f37a8da37e28f Mon Sep 17 00:00:00 2001 From: Maximilian Grundke Date: Tue, 18 Sep 2018 15:14:17 +0200 Subject: [PATCH] Implement client-side querying of stackoverflow --- .../javascripts/editor/evaluation.js.erb | 2 - .../editor/participantsupport.js.erb | 96 +++++++++++++++---- 2 files changed, 78 insertions(+), 20 deletions(-) diff --git a/app/assets/javascripts/editor/evaluation.js.erb b/app/assets/javascripts/editor/evaluation.js.erb index 19f57ce3..806e3a91 100644 --- a/app/assets/javascripts/editor/evaluation.js.erb +++ b/app/assets/javascripts/editor/evaluation.js.erb @@ -164,12 +164,10 @@ CodeOceanEditorEvaluation = { } else if (output.stderr) { element.addClass('text-warning').append(output.stderr); //element.addClass('text-warning').text(element.text() + output.stderr); - this.flowrOutputBuffer += output.stderr; this.QaApiOutputBuffer.stderr += output.stderr; } else if (output.stdout) { element.addClass('text-success').append(output.stdout); //element.addClass('text-success').text(element.text() + output.stdout); - this.flowrOutputBuffer += output.stdout; this.QaApiOutputBuffer.stdout += output.stdout; } else { element.addClass('text-muted').text($('#output').data('message-no-output')); diff --git a/app/assets/javascripts/editor/participantsupport.js.erb b/app/assets/javascripts/editor/participantsupport.js.erb index a826cbf0..5e6fd4a4 100644 --- a/app/assets/javascripts/editor/participantsupport.js.erb +++ b/app/assets/javascripts/editor/participantsupport.js.erb @@ -1,36 +1,96 @@ CodeOceanEditorFlowr = { - isFlowrEnabled: true, - flowrResultHtml: '
', + isFlowrEnabled: <%= CodeOcean::Config.new(:code_ocean).read[:flowr][:enabled] %>, + flowrResultHtml: + '
' + + '' + + '
' + + '
' + + '
' + + '
', + getInsights: function () { + <% self.class.include Rails.application.routes.url_helpers %> + var flowrUrl = '<%= insights_path %>'; + var stackOverflowUrl = 'http://api.stackexchange.com/2.2/search/advanced'; + + return jQuery.ajax({ + dataType: "json", + url: flowrUrl, + data: {} + }).then(function (queries) { + var stackoverflowRequests = _.map(queries, function (index, query) { + var queryParams = { + accepted: true, + pagesize: 5, + order: 'desc', + sort: 'relevance', + site: 'stackoverflow', + answers: 1, + filter: '!23qca9v**HCO.ESF)dHfT', + q: query + } + + return jQuery.ajax({ + dataType: "json", + url: stackOverflowUrl, + data: queryParams + }).promise(); + }); + return jQuery.when.apply(jQuery, stackoverflowRequests); + }); + }, + collectResults: function(response) { + var results = []; + var addToResultsIfSuccessful = function (data, textStatus, jqXHR) { + if (jqXHR && jqXHR.status === 200) { + _.each(data.items, function (item) { + if (!_.contains(results, item)) { + results.push(item); + } + }); + } + } + + if (_.isArray(response[0])) { + // multiple queries + _.each(response, function (args) { + addToResultsIfSuccessful.apply(this, args) + }); + } else { + // single query + addToResultsIfSuccessful.apply(this, response); + } + return results; + }, handleStderrOutputForFlowr: function () { - if (!this.isFlowrEnabled) return; + if (! this.isFlowrEnabled) return; - var flowrUrl = $('#flowrHint').data('url'); var flowrHintBody = $('#flowrHint .panel-body'); - var queryParameters = { - query: this.flowrOutputBuffer - }; - flowrHintBody.empty(); + var self = this; - jQuery.getJSON(flowrUrl, queryParameters, function (data) { - jQuery.each(data.queryResults, function (index, question) { - var collapsibleTileHtml = this.flowrResultHtml.replace(/{{collapseId}}/g, 'collapse-' + question).replace(/{{headingId}}/g, 'heading-' + question); + this.getInsights().then(function () { + var results = self.collectResults(arguments); + _.each(results, function (result, index) { + var collapsibleTileHtml = self.flowrResultHtml.replace(/{{collapseId}}/g, 'collapse-' + index).replace(/{{headingId}}/g, 'heading-' + index); var resultTile = $(collapsibleTileHtml); - resultTile.find('h4 > a').text(question.title + ' | Found via ' + question.source); - resultTile.find('.panel-body').html(question.body); - resultTile.find('.panel-body').append('Open this question'); + resultTile.find('h4 > a').text(result.title); + resultTile.find('.panel-body').html(result.body); + resultTile.find('.panel-body').append('Open this question'); flowrHintBody.append(resultTile); }); - if (data.queryResults.length !== 0) { + if (results.length > 0) { $('#flowrHint').fadeIn(); } }); - - this.flowrOutputBuffer = ''; } }; @@ -93,4 +153,4 @@ CodeOceanEditorRequestForComments = { //var button = $('#requestComments'); //button.prop('disabled', true); }, -}; \ No newline at end of file +};