refs #2871
[arvados.git] / apps / workbench / app / assets / javascripts / selection.js
1 //= require jquery
2 //= require jquery_ujs
3
4 /** Javascript for local persistent selection. */
5
6 get_selection_list = null;
7 form_selection_sources = {};
8
9 jQuery(function($){
10     var storage = localStorage; // sessionStorage
11
12     get_selection_list = function() {
13         if (!storage.persistentSelection) {
14             storage.persistentSelection = JSON.stringify([]);
15         }
16         return JSON.parse(storage.persistentSelection);
17     }
18
19     var put_storage = function(lst) {
20         storage.persistentSelection = JSON.stringify(lst);
21     }
22
23     var add_selection = function(uuid, name, href, type) {
24         var lst = get_selection_list();
25         lst.push({"uuid": uuid, "name": name, "href": href, "type": type});
26         put_storage(lst);
27         update_count();
28     };
29
30     var remove_selection = function(uuid) {
31         var lst = get_selection_list();
32         for (var i = 0; i < lst.length; i++) {
33             if (lst[i].uuid == uuid) {
34                 lst.splice(i, 1);
35                 i--;
36             }
37         }
38         put_storage(lst);
39         update_count();
40     };
41
42     var remove_selection_click = function(e) {
43         remove_selection($(this).val());
44     };
45
46     var clear_selections = function() {
47         put_storage([]);
48         update_count();
49     }
50
51     var update_count = function(e) {
52         var html;
53         var this_object_uuid = $('#selection-form-content').
54             closest('form').
55             find('input[name=uuid]').val();
56         var lst = get_selection_list();
57         $("#persistent-selection-count").text(lst.length);
58         if (lst.length > 0) {
59             html = '<li><a href="#" class="btn btn-xs btn-info" id="clear_selections_button"><i class="fa fa-fw fa-ban"></i> Clear selections</a></li>';
60             if (this_object_uuid.match('-j7d0g-'))
61                 html += '<li><button class="btn btn-xs btn-info" type="submit" name="copy_selections_into_folder" id="copy_selections_into_folder"><i class="fa fa-fw fa-folder-open"></i> Copy selections into this folder</button></li>';
62             html += '<li><button class="btn btn-xs btn-info" type="submit" name="combine_selected_files_into_collection" '
63                 + ' id="combine_selected_files_into_collection">'
64                 + '<i class="fa fa-fw fa-archive"></i> Combine selected collections and files into a new collection</button></li>'
65                 + '<li class="notification"><table style="width: 100%"></table></li>';
66             $('#selection-form-content').html(html);
67
68             for (var i = 0; i < lst.length; i++) {
69                 $('#selection-form-content > li > table').append("<tr>"
70                                                        + "<td>"
71                                                        + "<input class='remove-selection' name='selection[]' type='checkbox' value='" + lst[i].uuid + "' checked='true' data-stoppropagation='true' />"
72                                                        + "</td>"
73
74                                                        + "<td>"
75                                                        + "<div style='padding-left: 1em'><a href=\"" + lst[i].href + "\">" + lst[i].name + "</a></div>"
76                                                        + "</td>"
77
78                                                        + "<td style=\"vertical-align: top\">"
79                                                        + "<span style=\"padding-right: 1em\">" + lst[i].type + "</span>"
80                                                        + "</td>"
81
82                                                        + "</tr>");
83             }
84         } else {
85             $('#selection-form-content').html("<li class='notification empty'>No selections.</li>");
86         }
87
88         var checkboxes = $('.persistent-selection:checkbox');
89         for (i = 0; i < checkboxes.length; i++) {
90             for (var j = 0; j < lst.length; j++) {
91                 if (lst[j].uuid == $(checkboxes[i]).val()) {
92                     checkboxes[i].checked = true;
93                     break;
94                 }
95             }
96             if (j == lst.length) {
97                 checkboxes[i].checked = false;
98             }
99         }
100
101         $('.remove-selection').on('click', remove_selection_click);
102         $('#clear_selections_button').on('click', clear_selections);
103     };
104
105     $(document).
106         on('change', '.persistent-selection:checkbox', function(e) {
107             //console.log($(this));
108             //console.log($(this).val());
109
110             var inc = 0;
111             if ($(this).is(":checked")) {
112                 add_selection($(this).val(), $(this).attr('friendly_name'), $(this).attr('href'), $(this).attr('friendly_type'));
113             }
114             else {
115                 remove_selection($(this).val());
116             }
117         });
118
119
120     $(window).on('load storage', update_count);
121
122     $('#selection-form-content').on("click", function(e) {
123         e.stopPropagation();
124     });
125 });
126
127 add_form_selection_sources = null;
128 select_form_sources = null;
129
130 (function() {
131     var form_selection_sources = {};
132     add_form_selection_sources = function (src) {
133         for (var i = 0; i < src.length; i++) {
134             var t = form_selection_sources[src[i].type];
135             if (!t) {
136                 t = form_selection_sources[src[i].type] = {};
137             }
138             if (!t[src[i].uuid]) {
139                 t[src[i].uuid] = src[i];
140             }
141         }
142     };
143
144     select_form_sources = function(type) {
145         var ret = [];
146
147         if (get_selection_list) {
148             var lst = get_selection_list();
149             if (lst.length > 0) {
150                 var text = "&horbar; Selections &horbar;";
151                 var span = document.createElement('span');
152                 span.innerHTML = text;
153                 ret.push({text: span.innerHTML, value: "***invalid***"});
154
155                 for (var i = 0; i < lst.length; i++) {
156                     if (lst[i].type == type) {
157                         var n = lst[i].name;
158                         n = n.replace(/<span[^>]*>/i, "[");
159                         n = n.replace(/<\/span>/i, "]");
160                         ret.push({text: n, value: lst[i].uuid})
161                     }
162                 }
163             }
164         }
165
166         var text = "&horbar; Recent &horbar;";
167         var span = document.createElement('span');
168         span.innerHTML = text;
169         ret.push({text: span.innerHTML, value: "***invalid***"});
170
171         var t = form_selection_sources[type];
172         for (var key in t) {
173             if (t.hasOwnProperty(key)) {
174                 var obj = t[key];
175                 ret.push({text: obj.name, value: obj.uuid})
176             }
177         }
178         return ret;
179     };
180 })();