unfold: better management of static files thanks to finders for plugins and third...
[myslice.git] / plugins / quickfilter / static / js / quickfilter.js
1 /**
2  * Description: editing search filters
3  * Copyright (c) 2012 UPMC Sorbonne Universite - INRIA
4  * License: GPLv3
5  */
6 // global metadata from js/metadata.js
7 ( function($){
8
9     var debug=false;
10     //debug=true;
11
12     $.fn.QuickFilter = function( method ) {
13         /* Method calling logic */
14         if ( methods[method] ) {
15             return methods[ method ].apply( this, Array.prototype.slice.call( arguments, 1 ));
16         } else if ( typeof method === 'object' || ! method ) {
17             return methods.init.apply( this, arguments );
18         } else {
19             $.error( 'Method ' +  method + ' does not exist on $.QuickFilter' );
20         }    
21     };
22
23
24     var methods = {
25
26         init : function( options ) {
27             return this.each(function(){
28                 
29                 var $this = $(this),
30                 data = $this.data('QuickFilter'), QuickFilter = $('<div />', {text : $this.attr('title')});
31                 
32                 if ( ! data ) {
33                     
34                     data = $(this).data();
35
36                     /* Subscribe to selection updates published by the resource display plugins */
37                     //$.subscribe('selected', {instance: $this}, resource_selected);
38                     $.subscribe('/query/' + options.query_uuid + '/changed', {instance: $this}, query_changed);
39
40
41                     /* End of plugin initialization */
42
43                     $(this).data('QuickFilter', {
44                         plugin_uuid: options.plugin_uuid,
45                         query_uuid: options.query_uuid,
46                         target : $this,
47                         QuickFilter : QuickFilter
48                     });
49
50                     $(this).data('current_query', null);
51
52                     initialize_plugin($(this).data());
53                     
54                     function update_options(e, rows){
55                         var d = data;
56                         var availableTags={};
57                         $.each (rows, function(index, obj) {
58                             $.each(obj,function(key,value){                       
59                                 value = unfold.get_value(value);
60                                 if(!availableTags.hasOwnProperty(key)){availableTags[key]=new Array();}
61                                 //availableTags[key].push(value);
62                                 var currentArray=availableTags[key];
63                                 if(value!=null){
64                                     if($.inArray(value,currentArray)==-1){availableTags[key].push(value);}
65                                 }
66                             });                    
67                         });                
68                         $.each(availableTags, function(key, value){
69                             value.sort();
70                             if($("#"+options.plugin_uuid+"-select_"+key).length>0){
71                                 $.each(value, function(k, optValue){
72                                     $("#"+options.plugin_uuid+"-select_"+key).append('<option>'+optValue+'</option>');
73                                 });
74                             }                    
75                             if($("#QuickFilter-string-"+key).length>0){
76                                 $("#QuickFilter-string-"+key).autocomplete({
77                                     source: value,
78                                     minLength: 0, // allows to browse items with no value typed in
79                                     select: function(event, ui) {
80                                         //var key=getKeySplitId(this.id,"-");
81                                         var op='=';
82                                         var val=ui.item.value;
83
84                                         query=d.current_query;
85                                         query.update_filter(key,op,val);
86                                         // Publish the query changed, the other plugins with subscribe will get the changes
87                                         $.publish('/query/' + query.query_uuid + '/changed', query);
88                                         //add_ActiveFilter("#QuickFilter-string-"+key,ui.item.value,d);
89                                     }
90                                 });
91                             }
92                         });   
93                         
94                         
95                     }     
96                     
97                     /* Subscribe to results in order to redraw the table when updates arrive */
98                     $.subscribe('/results/' + options.query_uuid + '/changed', {instance: $this}, update_options);
99                 }
100
101             });
102         },
103         destroy : function( ) {
104
105             return this.each(function(){
106                 var $this = $(this), data = $this.data('QuickFilter');
107                 $(window).unbind('QuickFilter');
108                 data.QuickFilter.remove();
109                 $this.removeData('QuickFilter');
110             })
111
112                 },
113         update : function( content ) { 
114         },
115     };
116
117     /* Private methods */
118
119     function query_changed(e, query) {
120         //panos: this takes a lot of time!
121         data = e.data.instance.data();
122         var plugin_uuid=data.QuickFilter.plugin_uuid;
123         
124         /* Compare current and advertised query to get added and removed fields */
125         var previous_query=data.current_query;
126         /* Save the query as the current query */
127         data.current_query=query;
128         
129         // XXX can we modify data directly ?
130         //$(data.QuickFilter.target).data('current_query', query);
131
132         if(previous_query!=null){
133             // If query has changed in another plugin
134             // set the value on each filter that exists in QuickFilter plugin          
135             if (typeof(previous_query) != 'undefined') {
136                 var tmp=previous_query.diff_filter(query);
137                 // Remove first to clean up select boxes
138                 var removed_filters = tmp.removed;
139                 $.each(removed_filters, function(i,filter){
140                     messages.debug(filter[0]);
141                     allowedValues=metadata.property('resource', filter[0], 'allowed_values');
142                     if (allowedValues!='' && allowedValues!="N/A") {
143                         //if(MANIFOLD_METADATA[filter[0]]['allowed_values']!=''){
144                         $('#QuickFilter_select_field').val("#");
145                         $('#QuickFilter_select_value').children().remove().end();
146                         $('#QuickFilter_select_value_container').hide();
147                     }
148                     if($('#'+plugin_uuid+'-select_'+filter[0]).length>0 && filter[1]=="="){
149                         $('#'+plugin_uuid+'-select_'+filter[0]).val(null);
150                     }
151                     if($("#QuickFilter-string-"+filter[0]).length>0 && filter[1]=="="){
152                         $("#QuickFilter-string-"+filter[0]).val(null); 
153                     }
154                 });
155                 // Then Add filters
156                 var added_filters = tmp.added;
157                 $.each(added_filters, function(i,filter){
158                     if($('#'+plugin_uuid+'-select_'+filter[0]).length>0 && filter[1]=="="){
159                         $('#'+plugin_uuid+'-select_'+filter[0]).val(filter[2]);
160                     }
161                     if($("#QuickFilter-string-"+filter[0]).length>0 && filter[1]=="="){
162                         $("#QuickFilter-string-"+filter[0]).val(filter[2]); 
163                     }
164                 });
165             }
166             $.publish('debug', "Quick Filter received fields: " + query.fields+" - filter = "+query.filter);
167         }
168     }
169     
170     function initialize_plugin(data) {
171
172         $('#QuickFilter_select_value_div').hide();
173         $('#QuickFilter_string_value_div').hide();
174         $('#QuickFilter_int_value_div').hide();
175
176         $('#QuickFilter_only_visible').click( function () {
177
178             var only_visible = this.checked;
179             // Clear all options in the select box, Then add None option
180             $('#QuickFilter_select_field').children().remove().end().append("<option value='#'>None</option>");
181             
182             // Get the current query (ONLY AFTER THE PLUGIN HAS BEEN INITIALIZED)
183             var query = data.current_query;
184             // iterate to remove each active filter
185             if (only_visible) {
186                 if (typeof(query.fields) != 'undefined') {
187                     $.each (query.fields, function(index, value) {
188                         $('#QuickFilter_select_field').append("<option>"+value+"</option>");  
189                     });            
190                 }
191             }else{
192                 headers=metadata.fields('resource');
193                 $.each (headers, function (key, value) {
194                     $('#QuickFilter_select_field').append("<option>"+value['column']+"</option>");
195                 });
196             }
197         });
198
199         $('#QuickFilter_select_field').change( function () {
200             var field = $(this).val();
201             messages.debug(field);
202             $('input[id^="QuickFilter-string-"]').hide();
203             $('#QuickFilter_int_value_div').hide();
204             if(field=="#"){
205                 $('#QuickFilter_select_value_container').hide();
206             }else{
207                 $('#QuickFilter_select_value_container').show();
208                 $.publish('debug','field selected = '+field);
209                 valType=metadata.property('resource', field, 'value_type');
210                 if (valType == 'string' || valType=="N/A") {
211                     // If this key has predefined values, build a select with each allowed values as options
212                     allowedValues=metadata.property('resource', field, 'allowed_values');
213                     if (allowedValues!='' && allowedValues!="N/A") {
214                         $('#QuickFilter_string_value_div').hide();
215                         $('#QuickFilter_int_value_div').hide();
216                         $('#QuickFilter_select_value_div').show();
217                         $('#QuickFilter_select_value').show();
218                         $('#QuickFilter_select_value').children().remove().end().append("<option value=''>all</option>");
219                         // @TODO: define seperator as ;
220                         allowed_values = allowedValues.split(",");
221                         $.each (allowed_values, function (key, value) {
222                             $('#QuickFilter_select_value').append("<option>"+value+"</option>");
223                         });
224                         // Else build an autocomplete based on the values of result query
225                     }else{
226                         $('#QuickFilter_select_value_div').hide();
227                         $('#QuickFilter_string_value_div').show();
228                         $('.QuickFilter-filter-value').hide();
229                         $('#QuickFilter-string-'+field).show();
230                         $('#QuickFilter_int_value_div').hide();
231                     }
232                 }
233                 else if (valType == 'int') {
234                     $('#QuickFilter_select_value_div').hide();
235                     $('#QuickFilter_string_value_div').hide();
236                     $('#QuickFilter_int_value_div').show();
237                 }
238             }
239         });
240
241         $('.QuickFilter-filter-value').change( function () {
242             var query = data.current_query;
243
244             var filter_value = $(this).val();
245             var filter_field = $('#QuickFilter_select_field').val();
246
247             query.update_filter(filter_field, '=', filter_value);
248             $.publish('/query/' + query.query_uuid + '/changed', query);
249         });
250         
251         $('.QuickFilter_select').change( function() {
252             messages.debug(this.id);
253             var query = data.current_query;
254             var f_value = $(this).val();
255             
256             var key = this.id.split("_");
257
258             // jordan ???
259             /*            
260                           if (f_value == "Network")
261                           f_value = "";
262             */
263             if(typeof(key[1])!="undefined"){
264                 messages.debug(key[1]+'='+f_value);
265                 if(f_value==""){
266                     query.remove_filter(key[1],"","");
267                 }else{
268                     query.update_filter(key[1], '=', f_value);
269                 }
270             }
271             $.publish('/query/' + query.query_uuid + '/changed', query);
272         });
273
274     }
275
276 })( jQuery );