From d41bcd0166879b0eaa85ff9af4b2f2d81ddee474 Mon Sep 17 00:00:00 2001 From: Jaden Diefenbaugh <blakcap@users.noreply.github.com> Date: Wed, 22 Feb 2017 13:44:13 +0100 Subject: [PATCH] add modal for choosing group when adding report from exps page --- .../static/experiments/js/utils.js | 378 +++++++++++++----- 1 file changed, 286 insertions(+), 92 deletions(-) diff --git a/beat/web/experiments/static/experiments/js/utils.js b/beat/web/experiments/static/experiments/js/utils.js index 12b27a8cc..c5e797e45 100644 --- a/beat/web/experiments/static/experiments/js/utils.js +++ b/beat/web/experiments/static/experiments/js/utils.js @@ -1817,6 +1817,281 @@ beat.experiments.utils.modal_add_to_report = function (names, report_list_url) { } }); + // takes the selected report + // returns the form group ready to be added to the dialogue + function selectGroupMenu(reportData){ + /* + * { + * '<group name 1>': { experiments: [], reportItemIds: [] }, + * .... + * '<group name n>': { experiments: [], reportItemIds: [] } + * } + */ + let groups = reportData.content.groups; + + let form_group = $(document.createElement('div')).addClass('form-group'); + let select = $(document.createElement('select')).addClass('form-control'); + select.attr('display', 'block'); + select.chosen({ + search_contains: true, + allow_single_deselect: true, + }); + + Object.entries(groups) + .forEach(([groupName, groupObj]) => { + let opt = $(document.createElement('option')); + let div = $(document.createElement('div')); + let help = $(document.createElement('span')).addClass('experiments'); + + opt.val(groupName); + opt.data('name', groupName); + + div.text(groupName); + + help.text(` (${groupObj.experiments.reduce((s, n) => `${s}${n}`, '')})`); + + div.append(help); + opt.append(div); + select.append(opt); + }); + + form_group.append(select); + console.log(form_group); + + return form_group; + } + + // select a group in the report for the experiment to go in + function addToGroup(reportData, names, selectedVal) { + console.log(reportData); + console.log(names); + console.log(selectedVal); + let reportExpDetailUrl = selectedVal.replace(/add\/$/, 'results_author/'); + console.log(reportExpDetailUrl); + + return $.ajax({ + + type: 'GET', + url: reportExpDetailUrl, + + }).pipe(function(data) { + $.when(...names.map(n => $.ajax({type:'GET', url: `http://localhost:8000/api/v1/experiments/${n}/`}))) + .then((...rawData) => { + console.log(data); + console.log(rawData); + // the spread operator wont put a single array in an array, + // but we always want an arr of arrs + let expData = typeof rawData[0] === 'array' ? rawData : [rawData]; + // the expData is an array of arrays, + // with the first element of the subarray being the exp data + let experiments = expData + // instead of just an arr of exp objs, + // make it: + // { + // <exp name 1>: <exp data>, + // <exp name 2>: <exp data>, + // } + .map((d, i) => { return { [names[i]]: d[0] }; }) + .reduce((o, e) => Object.assign(o, e), {}); + let groups = reportData.content.groups; + + let message = $(document.createElement('div')); + message.append($(document.createElement('p')).text('By clicking Add, the experiment(s) will be added to the selected group in the report (if possible). You can cancel the operation by clicking Cancel.')); + let form_group = $(document.createElement('div')).addClass('form-group'); + message.append(form_group); + let select = $(document.createElement('select')).addClass('form-control'); + form_group.append(select); + let first_option = $(document.createElement('option')); + select.append(first_option); + first_option.val(''); + first_option.attr('disabled', true); + first_option.attr('selected', true); + first_option.text('Select a group...'); + + select.chosen({ + disable_search_threshold: 5, + search_contains: true, + allow_single_deselect: true, + }); + + select.on('chosen:showing_dropdown', function(e, params) { + select.find('option:gt(0)').remove(); + select.find('option:eq(0)').attr('selected', true); + console.log(groups); + console.log(experiments); + Object.entries(groups) + .filter(([groupName, groupData]) => { + // get the analyzer name from the fetched data + const getAnalyzerFromExpName = (expName) => { + let analyzers = experiments[expName].declaration.analyzers; + let analyzer = analyzers[Object.keys(analyzers)[0]]; + return analyzer.algorithm; + }; + + // if the selected experiments dont all have the same analyzer, + // the only group they can all be added to is 'default', + // the default group + let analyzerSet = (new Set(Object.keys(experiments).map(e => getAnalyzerFromExpName(e)))); + console.log(analyzerSet); + if(analyzerSet.size !== 1){ + console.log(`multi analyzers, returning dfeault group only`); + return groupName === 'default'; + } + + // one analyzer, just return groups with that analyzer + return groupData.analyzer === '' + || groupData.analyzer === getAnalyzerFromExpName(Object.keys(experiments)[0]); + }) + .forEach(([groupName, groupData]) => { + let opt = $(document.createElement('option')); + select.append(opt); + opt.val(groupName); + let div = $(document.createElement('div')); + opt.append(div); + opt.data('name', groupName); + div.text(groupName); + if (groupData.experiments) { + let help = $(document.createElement('span')).addClass('help'); + help.text(` (${groupData.experiments.reduce((s, n) => s + n, '')})`); + div.append(help); + } + }); + select.trigger('chosen:updated'); + select.trigger('chosen:open'); + }); + + //fix options when selected + select.on('change', function(e, params) { + let selected = $(this).find('option:selected'); + selected.text(selected.data('name')); + select.trigger('chosen:updated'); + }); + + BootstrapDialog.show({ + title: '<i class="fa fa-file-text-o fa-lg"></i> Select a group', + message: message, + type: BootstrapDialog.TYPE_PRIMARY, + buttons: [ + { + label: 'Cancel', + cssClass: 'btn-default', + action: function(the_dialog) { + the_dialog.close(); + return false; + }, + }, + { + label: 'Add', + cssClass: 'btn-primary', + action: function(the_dialog) { + if (!select.val()) { + BootstrapDialog.alert({ + title: '<i class="fa fa-warning"></i> Error', + message: 'You must select a group to add experiments to', + type: BootstrapDialog.TYPE_WARNING, + }); + return false; + } + the_dialog.close(); + + console.log(`Got group of ${JSON.stringify(select.val())}`); + + var post_info = { + experiments: names, + group: select.val() + }; + console.log(`Sending: ${JSON.stringify(post_info)}`); + + var d = $.ajax({ + type: "POST", + data: JSON.stringify(post_info), + url: selectedVal, + contentType: "application/json; charset=utf-8", + dataType: 'json', + }); + + d.done(function(data, status) { + + var message = $(document.createElement('div')); + message.addClass('report-results'); + + var sent = post_info.experiments.length; + var successful = sent; + + var description = $(document.createElement('h5')); + message.append(description); + + if (data !== undefined) { + // some experiments have failed + + // adds information about failed/incompatible experiments + function _add_list(message, objects, title) { + if (objects === undefined) return; + var length = objects.length; + if (length > 0) { + var _title = $(document.createElement('h5')); + _title.text(title); + message.append(_title); + var ul = $(document.createElement('ul')); + for (var i = 0; i < length; ++i) { + var li = $(document.createElement('li')); + li.text(objects[i]); + ul.append(li); + } + message.append(ul); + } + return length; + } + if (data.inaccessible_experiments !== undefined) + successful -= _add_list(message, data.inaccessible_experiments, + 'These experiments have failed (and cannot be added):'); + if (data.incompatible_experiments !== undefined) + successful -= _add_list(message, data.incompatible_experiments, + 'These experiments have different analyzers (and cannot be added):'); + } + + var size = BootstrapDialog.SIZE_NORMAL; + var type = BootstrapDialog.TYPE_PRIMARY; + var title = '<i class="fa fa-check"></i> Report changes'; + var btn_type = 'btn-primary'; + if (successful == sent) { + description.text('Successfully added ' + sent + ' experiment(s) to report'); + } + else { + description.text('Added ' + successful + ' (out of ' + sent + ' in total) experiment(s) to report'); + size = BootstrapDialog.SIZE_WIDE; + type = BootstrapDialog.TYPE_WARNING; + btn_type = 'btn-warning'; + title = '<i class="fa fa-warning"></i> Report changes'; + } + + BootstrapDialog.show({ + title: title, + message: message, + size: size, + type: type, + buttons: [{ + label: 'OK', + cssClass: btn_type, + action: function(dialog){dialog.close();}, + }] + }); + + return true; + }); + + d.fail(function(data, status) { + process_error(data, status); + }); + + }, + }, + ], + }); + }); + }); + } + //retrieve list of existing reports - if that succeeds, construct modal form function addToReport(names) { return $.ajax({ @@ -1826,13 +2101,13 @@ beat.experiments.utils.modal_add_to_report = function (names, report_list_url) { }).pipe(function(data) { console.log(data); - var message = $(document.createElement('div')); + let message = $(document.createElement('div')); message.append($(document.createElement('p')).text('By clicking Add, the experiment(s) will be added to the selected report (if possible). You can cancel the operation by clicking Cancel.')); - var form_group = $(document.createElement('div')).addClass('form-group'); + let form_group = $(document.createElement('div')).addClass('form-group'); message.append(form_group); - var select = $(document.createElement('select')).addClass('form-control'); + let select = $(document.createElement('select')).addClass('form-control'); form_group.append(select); - var first_option = $(document.createElement('option')); + let first_option = $(document.createElement('option')); select.append(first_option); first_option.val(''); first_option.attr('disabled', true); @@ -1849,15 +2124,15 @@ beat.experiments.utils.modal_add_to_report = function (names, report_list_url) { select.find('option:gt(0)').remove(); select.find('option:eq(0)').attr('selected', true); data.forEach(function(i) { - var opt = $(document.createElement('option')); + let opt = $(document.createElement('option')); select.append(opt); opt.val(i.add_url); - var div = $(document.createElement('div')); + let div = $(document.createElement('div')); opt.append(div); opt.data('name', i.name); div.text(i.name); if (i.short_description) { - var help = $(document.createElement('span')).addClass('help'); + let help = $(document.createElement('span')).addClass('help'); help.text(' (' + i.short_description + ')'); div.append(help); } @@ -1867,8 +2142,9 @@ beat.experiments.utils.modal_add_to_report = function (names, report_list_url) { }); //fix options when selected + let selected; select.on('change', function(e, params) { - var selected = $(this).find('option:selected'); + selected = $(this).find('option:selected'); selected.text(selected.data('name')); select.trigger('chosen:updated'); }); @@ -1900,90 +2176,7 @@ beat.experiments.utils.modal_add_to_report = function (names, report_list_url) { } the_dialog.close(); - var post_info = {experiments:names}; - - var d = $.ajax({ - type: "POST", - data: JSON.stringify(post_info), - url: select.val(), - contentType: "application/json; charset=utf-8", - dataType: 'json', - }); - - d.done(function(data, status) { - - var message = $(document.createElement('div')); - message.addClass('report-results'); - - var sent = post_info.experiments.length; - var successful = sent; - - var description = $(document.createElement('h5')); - message.append(description); - - if (data !== undefined) { - // some experiments have failed - - // adds information about failed/incompatible experiments - function _add_list(message, objects, title) { - if (objects === undefined) return; - var length = objects.length; - if (length > 0) { - var _title = $(document.createElement('h5')); - _title.text(title); - message.append(_title); - var ul = $(document.createElement('ul')); - for (var i = 0; i < length; ++i) { - var li = $(document.createElement('li')); - li.text(objects[i]); - ul.append(li); - } - message.append(ul); - } - return length; - } - if (data.inaccessible_experiments !== undefined) - successful -= _add_list(message, data.inaccessible_experiments, - 'These experiments have failed (and cannot be added):'); - if (data.incompatible_experiments !== undefined) - successful -= _add_list(message, data.incompatible_experiments, - 'These experiments have different analyzers (and cannot be added):'); - } - - var size = BootstrapDialog.SIZE_NORMAL; - var type = BootstrapDialog.TYPE_PRIMARY; - var title = '<i class="fa fa-check"></i> Report changes'; - var btn_type = 'btn-primary'; - if (successful == sent) { - description.text('Successfully added ' + sent + ' experiment(s) to report'); - } - else { - description.text('Added ' + successful + ' (out of ' + sent + ' in total) experiment(s) to report'); - size = BootstrapDialog.SIZE_WIDE; - type = BootstrapDialog.TYPE_WARNING; - btn_type = 'btn-warning'; - title = '<i class="fa fa-warning"></i> Report changes'; - } - - BootstrapDialog.show({ - title: title, - message: message, - size: size, - type: type, - buttons: [{ - label: 'OK', - cssClass: btn_type, - action: function(dialog){dialog.close();}, - }] - }); - - return true; - }); - - d.fail(function(data, status) { - process_error(data, status); - }); - + addToGroup(data[0], names, select.val()); }, }, ], @@ -1991,6 +2184,7 @@ beat.experiments.utils.modal_add_to_report = function (names, report_list_url) { }); } + addToReport(names).fail(function(data, text_status) { process_error(data, text_status); return false; -- GitLab