Make the tag result list scrollable so long tags can be read
[ajatus.git] / js / widgets / tags.js
blobffd64ed0a09753a9475cdff81f170e59d3970f98
1 /*
2  * This file is part of
3  *
4  * Ajatus - Distributed CRM
5  * @requires jQuery v1.2.1
6  * 
7  * Copyright (c) 2007 Jerry Jalava <jerry.jalava@gmail.com>
8  * Copyright (c) 2007 Nemein Oy <http://nemein.com>
9  * Website: http://ajatus.info
10  * Licensed under the GPL license
11  * http://www.gnu.org/licenses/gpl.html
12  * 
13  */
15 (function($){
16     $.ajatus = $.ajatus || {};
17     $.ajatus.widgets = $.ajatus.widgets || {};
18     $.ajatus.widgets.core = typeof($.ajatus.widgets.core) == 'undefined' ? {} : $.ajatus.widgets.core;
20     $.ajatus.widgets.core.tags = {
21         name: 'tags',
22         settings: {
23             separator: ' ',
24             context_key: '',
25             value: ''
26         },
27         assign_tags: null,
28         _force_data_change: false,
29         _missed_tag_arr: null,
30         
31         get_create_tpl: function(name, default_value) {
32             if (this.assign_tags == null) {
33                 this.assign_tags = [];
34             }
35             
36             var idx = 0;
37             if (typeof default_value == 'object') {
38                 $.each(default_value, function(i,dv){
39                     if (typeof dv.id != 'undefined') {
40                         var tag = $.ajatus.tags.get(dv.id);
41                         if (tag) {
42                             this.assign_tags[idx] = tag;
43                             idx += 1;
44                         }
45                     }
46                 });
47             }
48             if (typeof $.ajatus.tags.active == 'object') {
49                 this.assign_tags[idx] = $.ajatus.tags.active;
50             }
51             
52             return [
53                 'input', { type: 'hidden', name: 'widget['+name+':name]', value: this.name }, '',
54                 'input', { type: 'hidden', name: 'widget['+name+':config]', value: $.ajatus.converter.toJSON(this.settings) }, '',
55                 'input', { type: 'hidden', name: 'widget['+name+':required]', value: this.required }, '',
56                 'input', { type: 'text', name: name, value: '' }, ''
57             ];
58         },
59         get_edit_tpl: function(name, data) {
60             data.val = this.value_on_edit(data.val);
61             return [
62                 'input', { type: 'hidden', name: 'widget['+name+':name]', value: this.name }, '',
63                 'input', { type: 'hidden', name: 'widget['+name+':config]', value: $.ajatus.converter.toJSON(this.settings) }, '',
64                 'input', { type: 'hidden', name: 'widget['+name+':required]', value: this.required }, '',
65                 'input', { type: 'hidden', name: 'widget['+name+':prev_val]', value: $.ajatus.converter.toJSON(data.val) }, '',
66                 'input', { type: 'text', name: name, value: '' }, ''
67             ];
68         },
69         get_view_tpl: function(name, data) {
70             data.val = this.value_on_view(data.val);
72             return [
73                 'div', { className: data._id+'_element_'+name+'_value' }, [
74                     'ul', { className: 'tag_list' }, data.val,
75                     'br', { className: 'clear_fix' }, ''
76                 ]
77             ];
78         },
79         set_config: function(config) {
80             this.settings = $.extend(this.settings, config);
81         },
82         validate: function(name, value) {            
83             if (value != '') {                
84                 var tag_data = {
85                     title: value
86                 };
87                 this._missed_tag_arr = this._update_system_tags([tag_data], []);
88                 
89                 this._force_data_change = true;
90             }
92             return true;
93         },
94         value_on_save: function(value, prev_val) {
95             var tag_arr = [];
96             var tag_ids = [];
97             
98             var id_inputs = $(':input[name*=__tags_widget_selections]');
99             
100             $.each(id_inputs, function(i,n){                
101                 tag_arr.push($.ajatus.converter.parseJSON(n.value))
102             });
103             
104             if (   typeof prev_val == 'undefined'
105                 || !prev_val)
106             {
107                 var prev_val = [];
108             }
110             $.each(tag_arr, function(i,t){
111                 if (typeof t.id != 'undefined') {
112                     tag_ids.push(t.id);
113                 }
114             });
115             
116             tag_arr = $.grep(tag_arr, function(n,i){
117                 return n != '' && (typeof n.id == 'undefined' || n.id == '');
118             });
119             
120             var saved_tag_ids = this._update_system_tags(tag_arr, prev_val);
121             
122             $.each(saved_tag_ids, function(i,t){
123                 tag_ids.push(t);
124             });
125             
126             if (this._missed_tag_arr != null) {
127                 $.each(this._missed_tag_arr, function(i,t){
128                     tag_ids.push(t);
129                 });
130             }
131             
132             return tag_ids;
133         },
134         has_data_changed: function(value, prev_objects) {            
135             if (this._force_data_change) {
136                 return true;
137             }
138             
139             var prev_value = [];
140             $.each(prev_objects, function(i, n){
141                 prev_value.push(n.id);
142             });
143             
144             var data_changed = false;
145             
146             if (   value.length == 0
147                 && prev_value.length == 0)
148             {
149                 return false;
150             }
151             
152             
153             
154             if (   value.length > 0
155                 && prev_value.length == 0)
156             {
157                 return true;
158             }
159             if (   prev_value.length > 0
160                 && value.length == 0)
161             {
162                 return true;
163             }
164             
165             $.each(value, function(i,n){
166                 var match_key = $.inArray(n, prev_value);
167                 if (match_key == -1) {
168                     data_changed = true;
169                 }
170             });
171             
172             if (data_changed) {
173                 return true;
174             }
175             
176             $.each(prev_value, function(i,n){
177                 var match_key = $.inArray(n, value);
178                 if (match_key == -1) {
179                     data_changed = true;
180                 }
181             });
182             
183             return data_changed;
184         },
185         value_on_edit: function(value) {            
186             var self = this;
187             if (self.assign_tags == null) {
188                 self.assign_tags = [];
189             }
190             $.each(value, function(i,t){                
191                 self.assign_tags[self.assign_tags.length || i] = $.ajatus.tags.get(t);
192             });
193             
194             return self.assign_tags;
195         },
196         value_on_view: function(value, type) {
197             if (typeof type == 'undefined') {
198                 var type = 'item';
199             }
200             
201             var has_missing = false;
202             
203             var tags = [];
204             var tags_str = '';
205             var _self = this;
206             if (value.length > 0) {
207                 $.each(value, function(i,v){
208                     var tag = $.ajatus.tags.get(v);
209                     if (tag == false) {
210                         has_missing = true;
211                         return;
212                     }
213                     var tag_title = $.ajatus.tags.render_title(tag);
214                                         
215                     if (type == 'plain') {
216                         tags_str += tag_title + _self.settings.separator;
217                     } else {
218                         var tpl = _self.style_tag_on_view(tag_title, tag.value.title.widget.config.color, type);
219                         $.each(tpl, function(tidx, tp){
220                             tags.push(tp);
221                         });                        
222                     }
223                 });
224             }
225             
226             if (   has_missing
227                 && type == 'item')
228             {
229                 $.ajatus.elements.messages.create($.ajatus.i10n.get('Missing tags'), $.ajatus.i10n.get('Object has missing tags'));
230             }
231             
232             if (type == 'plain') {
233                 return tags_str;
234             } else {
235                 return tags;
236             }
237         },
238         style_tag_on_view: function(title, color, type) {            
239             if (   typeof color == 'undefined'
240                 || color == '')
241             {
242                 var color = $.ajatus.widgets.core.tag.settings.color;
243             }
244             
245             if (type == 'list') {
246                 return [
247                     'span', { className: 'tag' }, title + ' '
248                 ];
249             }
250             
251             return [
252                 'li', { className: 'tag', style: 'background-color: #'+color+';' }, title
253             ];
254         },
255         loaded: function() {
256             $.ajatus.events.lock_pool.increase();
257             
258             $.ajatus.layout.styles.load($.ajatus.preferences.client.theme_url + 'css/widgets/tags.css');
259             $.ajatus.layout.styles.load($.ajatus.preferences.client.theme_url + 'css/widgets/includes/tags.css');
260             
261             var tags_url = $.ajatus.preferences.client.application_url + 'js/widgets/includes/tags.js';
262             $.ajatus.utils.load_script(tags_url, "$.ajatus.events.lock_pool.decrease", []);
263         },
264         init: function(holder, form_mode) {
265             if (form_mode) {
266                 this.init_form_mode(holder);
267             } else {
268                 this.init_view_mode(holder);                
269             }
270         },
271         init_form_mode: function(holder) {
272             var element = $('input[@type=text]', holder);
273             
274             if (this.assign_tags == null) {
275                 this.assign_tags = [];
276             }
277             
278             if (element) {
279                 element.tags(this.settings.widget);
281                 $.each(this.assign_tags, function(i,tag) {
282                     if (typeof tag == "object") {
283                         element.tags_add_item(tag, true);
284                     } else {
285                         tag = $.ajatus.tags.get(tag);
286                         if (tag) {
287                             element.tags_add_item(tag, true);
288                         }                        
289                     }
290                 });
291             }
292         },
293         init_view_mode: function(holder) {
294         },
295         _update_system_tags: function(new_tags, prev_tags) {
296             var _self = this;
297             var tag_ids = [];
298             
299             if (   !new_tags
300                 || new_tags.length <= 0)
301             {
302                 return tag_ids;
303             }
304             
305             var on_success = function(data) {
306                 if (data.ok) {
307                     var msg = $.ajatus.elements.messages.create(
308                         $.ajatus.i10n.get('New tag created'),
309                         $.ajatus.i10n.get("Created new tag '%s'", [data.id])
310                     );
312                     $.ajatus.debug("saved tag: "+data.id);
313                     tag_ids.push(data.id);
314                 }
315                 
316                 return data;
317             };
318             var dc = $.jqCouch.connection('doc', on_success);
319             
320             $.each(new_tags, function(i,d){                
321                 var title = d.title;
322                 var title_data = $.ajatus.tags.validate_title(title);
323                 
324                 var context_key = '';
325                 var value = '';
326                 if (typeof title_data == 'object') {
327                     title = title_data.title;
328                     context_key = title_data.context;
329                     value = title_data.value;
330                 }
331                 
332                 var data = {
333                     color: (typeof d.color != 'undefined') ? d.color : '8596b6',
334                     context: (typeof d.context != 'undefined') ? d.context : context_key,
335                     value: (typeof d.value != 'undefined') ? d.value : value
336                 };
338                 $.ajatus.tags.create(title, data, dc);
339             });
340             
341             $.ajatus.views.on_change_actions.add('$.ajatus.tags.refresh_cache();');
342             
343             return tag_ids;
344         }
345     };
347 })(jQuery);