X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/98f0657745f2f38c19047ef9039c52c1b0fe0659..b6e28fbe905737bd0ea5bda5f4fd74fd259c58b1:/apps/workbench/app/assets/javascripts/selection.js diff --git a/apps/workbench/app/assets/javascripts/selection.js b/apps/workbench/app/assets/javascripts/selection.js index 5d0900aa76..a313c8b78e 100644 --- a/apps/workbench/app/assets/javascripts/selection.js +++ b/apps/workbench/app/assets/javascripts/selection.js @@ -3,27 +3,32 @@ /** Javascript for local persistent selection. */ -(function($){ - var get_storage = function() { - if (!sessionStorage.persistentSelection) { - sessionStorage.persistentSelection = JSON.stringify([]); +get_selection_list = null; +form_selection_sources = {}; + +jQuery(function($){ + var storage = localStorage; // sessionStorage + + get_selection_list = function() { + if (!storage.persistentSelection) { + storage.persistentSelection = JSON.stringify([]); } - return JSON.parse(sessionStorage.persistentSelection); + return JSON.parse(storage.persistentSelection); } var put_storage = function(lst) { - sessionStorage.persistentSelection = JSON.stringify(lst); + storage.persistentSelection = JSON.stringify(lst); } var add_selection = function(uuid, name, href, type) { - var lst = get_storage(); + var lst = get_selection_list(); lst.push({"uuid": uuid, "name": name, "href": href, "type": type}); put_storage(lst); update_count(); }; var remove_selection = function(uuid) { - var lst = get_storage(); + var lst = get_selection_list(); for (var i = 0; i < lst.length; i++) { if (lst[i].uuid == uuid) { lst.splice(i, 1); @@ -35,34 +40,51 @@ }; var remove_selection_click = function(e) { - remove_selection($(this).attr('name')); + remove_selection($(this).val()); }; + var clear_selections = function() { + put_storage([]); + update_count(); + } + var update_count = function(e) { - var lst = get_storage(); + var html; + var this_object_uuid = $('#selection-form-content'). + closest('form'). + find('input[name=uuid]').val(); + var lst = get_selection_list(); $("#persistent-selection-count").text(lst.length); - - $('#persistent-selection-list > li > table').empty(); if (lst.length > 0) { + html = '
  • Clear selections
  • '; + if (this_object_uuid.match('-j7d0g-')) { + html += '
  • '; + html += '
  • '; + } + html += '
  • ' + + '
  • '; + $('#selection-form-content').html(html); + for (var i = 0; i < lst.length; i++) { - $('#persistent-selection-list > li > table').append("" - + "" - + "" + lst[i].type + "" + $('#selection-form-content > li > table').append("" + + "" + + "" + "" + "" - + "" + lst[i].name + "" + + "
    " + lst[i].name + "
    " + "" - + "" - + "" - + "" - + "" + + "" + + "" + lst[i].type + "" + "" + + ""); } } else { - $('#persistent-selection-list > li > table').html("No selections."); + $('#selection-form-content').html("
  • No selections.
  • "); } var checkboxes = $('.persistent-selection:checkbox'); @@ -77,15 +99,14 @@ checkboxes[i].checked = false; } } - + $('.remove-selection').on('click', remove_selection_click); + $('#clear_selections_button').on('click', clear_selections); + $(document).trigger('selections-updated', [lst]); }; $(document). on('change', '.persistent-selection:checkbox', function(e) { - //console.log($(this)); - //console.log($(this).val()); - var inc = 0; if ($(this).is(":checked")) { add_selection($(this).val(), $(this).attr('friendly_name'), $(this).attr('href'), $(this).attr('friendly_type')); @@ -95,6 +116,106 @@ } }); - $(window).on('load storage', update_count); -})(jQuery); \ No newline at end of file + + $('#selection-form-content').on("click", function(e) { + e.stopPropagation(); + }); +}); + +add_form_selection_sources = null; +select_form_sources = null; + +(function() { + var form_selection_sources = {}; + add_form_selection_sources = function (src) { + for (var i = 0; i < src.length; i++) { + var t = form_selection_sources[src[i].type]; + if (!t) { + t = form_selection_sources[src[i].type] = {}; + } + if (!t[src[i].uuid]) { + t[src[i].uuid] = src[i]; + } + } + }; + + select_form_sources = function(type) { + var ret = []; + + if (get_selection_list) { + var lst = get_selection_list(); + if (lst.length > 0) { + var text = "― Selections ―"; + var span = document.createElement('span'); + span.innerHTML = text; + ret.push({text: span.innerHTML, value: "***invalid***"}); + + for (var i = 0; i < lst.length; i++) { + if (lst[i].type == type) { + var n = lst[i].name; + n = n.replace(/]*>/i, "["); + n = n.replace(/<\/span>/i, "]"); + ret.push({text: n, value: lst[i].uuid}) + } + } + } + } + + var text = "― Recent ―"; + var span = document.createElement('span'); + span.innerHTML = text; + ret.push({text: span.innerHTML, value: "***invalid***"}); + + var t = form_selection_sources[type]; + for (var key in t) { + if (t.hasOwnProperty(key)) { + var obj = t[key]; + ret.push({text: obj.name, value: obj.uuid}) + } + } + return ret; + }; +})(); + +function dispatch_selection_action() { + // Build a new "href" attribute for this link by starting with the + // "data-href" attribute and appending ?foo[]=bar&foo[]=baz (or + // &foo=... as appropriate) to reflect the current object + // selections. + var data = []; + var param_name = $(this).attr('data-selection-param-name'); + var href = $(this).attr('data-href'); + if ($(this).closest('.disabled').length > 0) { + return false; + } + $('.persistent-selection:checkbox:checked').each(function() { + data.push({name: param_name, value: $(this).val()}); + }); + if (href.indexOf('?') >= 0) + href += '&'; + else + href += '?'; + href += $.param(data, true); + $(this).attr('href', href); + return true; +} + +function enable_disable_selection_actions() { + var $checked = $('.persistent-selection:checkbox:checked'); + $('[data-selection-action]'). + closest('div.btn-group-sm'). + find('ul li'). + toggleClass('disabled', ($checked.length == 0)); + $('[data-selection-action=compare]'). + closest('li'). + toggleClass('disabled', + ($checked.filter('[value*=-d1hrv-]').length < 2) || + ($checked.not('[value*=-d1hrv-]').length > 0)); +} + +$(document). + on('selections-updated ready ajax:complete', function() { + $('[data-selection-action]').click(dispatch_selection_action); + enable_disable_selection_actions(); + });