Fixed bug with create template
[ajatus.git] / js / widgets / tags.js
blobb4804608590fd58a3cec0cb35d6cb7109a58bb82
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             widget: {}
26         },
27         assign_tags: null,
28         
29         get_create_tpl: function(name, default_value)
30         {
31             if (this.assign_tags == null) {
32                 this.assign_tags = [];
33             }
34             
35             var idx = 0;
36             if (typeof default_value == 'object') {
37                 $.each(default_value, function(i,dv){
38                     if (typeof dv.id != 'undefined') {
39                         var tag = $.ajatus.tags.get(dv.id);
40                         if (tag) {
41                             this.assign_tags[idx] = tag;
42                             idx += 1;
43                         }
44                     }
45                 });
46             }
47             if (typeof $.ajatus.tags.active == 'object') {
48                 this.assign_tags[idx] = $.ajatus.tags.active;
49             }
50             
51             return [
52                 'input', { type: 'hidden', name: 'widget['+name+':name]', value: this.name }, '',
53                 'input', { type: 'hidden', name: 'widget['+name+':config]', value: $.ajatus.converter.toJSON(this.settings) }, '',
54                 'input', { type: 'hidden', name: 'widget['+name+':required]', value: this.required }, '',
55                 'input', { type: 'text', name: name, value: '' }, ''
56             ];
57         },
58         get_edit_tpl: function(name, data)
59         {
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         {
71             data.val = this.value_on_view(data.val);
73             return [
74                 'div', { className: data._id+'_element_'+name+'_value' }, [
75                     'ul', { className: 'tag_list' }, data.val,
76                     'br', { className: 'clear_fix' }, ''
77                 ]
78             ];
79         },
80         set_config: function(config)
81         {
82             this.settings = $.extend(this.settings, config);
83         },
84         value_on_save: function(value, prev_val)
85         {
86             var tag_arr = [];
87             var tag_ids = [];
88             
89             var id_inputs = $(':input[name*=__tags_widget_selections]');
90             
91             $.each(id_inputs, function(i,n){                
92                 tag_arr.push($.ajatus.converter.parseJSON(n.value))
93             });
94             
95             if (   typeof prev_val == 'undefined'
96                 || !prev_val)
97             {
98                 var prev_val = [];
99             }
101             $.each(tag_arr, function(i,t){
102                 if (typeof t.id != 'undefined') {
103                     tag_ids.push(t.id);
104                 }
105             });
106             
107             tag_arr = $.grep(tag_arr, function(n,i){
108                 return n != '' && (typeof n.id == 'undefined' || n.id == '');
109             });
110             
111             var saved_tag_ids = this._update_system_tags(tag_arr, prev_val);
112             
113             $.each(saved_tag_ids, function(i,t){
114                 tag_ids.push(t);
115             });
116             
117             return tag_ids;
118         },
119         has_data_changed: function(value, prev_value) {            
120             var data_changed = false;
121             
122             if (   value.length == 0
123                 && prev_value.length == 0)
124             {
125                 return false;
126             }
128             if (   value.length > 0
129                 && prev_value.length == 0)
130             {
131                 return true;
132             }
133             if (   prev_value.length > 0
134                 && value.length == 0)
135             {
136                 return true;
137             }
138             
139             $.each(value, function(i,n){
140                 if ($.inArray(n, prev_value) != -1) {
141                     data_changed = true;
142                 }
143             });
144             
145             if (data_changed) {
146                 return true;
147             }
148             
149             $.each(prev_value, function(i,n){
150                 if ($.inArray(n, value) != -1) {
151                     data_changed = true;
152                 }
153             });
154             
155             return data_changed;
156         },
157         value_on_edit: function(value)
158         {            
159             var self = this;
160             if (self.assign_tags == null) {
161                 self.assign_tags = [];
162             }
163             $.each(value, function(i,t){                
164                 self.assign_tags[self.assign_tags.length || i] = $.ajatus.tags.get(t);
165             });
166             
167             return self.assign_tags;
168         },
169         // Type = list / item
170         value_on_view: function(value, type)
171         {
172             if (typeof type == 'undefined') {
173                 var type = 'item';
174             }
175             
176             var tags = [];
177             var tags_str = '';
178             var _self = this;
179             if (value.length > 0) {
180                 $.each(value, function(i,v){
181                     var tag = $.ajatus.tags.get(v);
182                     var tag_title = '';
183                     if (   typeof(tag.value.title.widget.config['context']) != 'undefined'
184                         && tag.value.title.widget.config['context'] != '')
185                     {
186                         tag_title += tag.value.title.widget.config.context + ':';
187                     }
188                     tag_title += tag.value.title.val;
189                     
190                     if (type == 'plain') {
191                         tags_str += tag_title + _self.settings.separator;
192                     } else {
193                         var tpl = _self.style_tag_on_view(tag_title, tag.value.title.widget.config.color, type);
194                         $.each(tpl, function(tidx, tp){
195                             tags.push(tp);
196                         });                        
197                     }
198                 });
199             }
200             
201             if (type == 'plain') {
202                 return tags_str;
203             } else {
204                 return tags;
205             }
206         },
207         style_tag_on_view: function(title, color, type) {            
208             if (   typeof color == 'undefined'
209                 || color == '')
210             {
211                 var color = $.ajatus.widgets.core.tag.settings.color;
212             }
213             
214             if (type == 'list') {
215                 return [
216                     'span', { className: 'tag' }, title
217                 ];
218             }
219             
220             return [
221                 'li', { className: 'tag', style: 'background-color: #'+color+';' }, title
222             ];
223         },
224         loaded: function()
225         {
226             $.ajatus.events.lock_pool.increase();
227             
228             $.ajatus.layout.styles.load($.ajatus.preferences.client.theme_url + 'css/widgets/tags.css');
229             $.ajatus.layout.styles.load($.ajatus.preferences.client.theme_url + 'css/widgets/includes/tags.css');
230             
231             var tags_url = $.ajatus.preferences.client.application_url + 'js/widgets/includes/tags.js';
232             $.ajatus.utils.load_script(tags_url, "$.ajatus.events.lock_pool.decrease", []);
233         },
234         init: function(holder, form_mode)
235         {
236             if (form_mode) {
237                 this.init_form_mode(holder);
238             } else {
239                 this.init_view_mode(holder);                
240             }
241         },
242         init_form_mode: function(holder)
243         {
244             var element = $('input[@type=text]', holder);
245             
246             if (this.assign_tags == null) {
247                 this.assign_tags = [];
248             }
249             
250             if (element) {
251                 element.tags(this.settings.widget);
253                 $.each(this.assign_tags, function(i,tag) {
254                     if (typeof tag == "object") {
255                         element.tags_add_item(tag, true);
256                     } else {
257                         tag = $.ajatus.tags.get(tag);
258                         if (tag) {
259                             element.tags_add_item(tag, true);
260                         }                        
261                     }
262                 });
263             }
264         },
265         init_view_mode: function(holder)
266         {
267         },
268         _update_system_tags: function(new_tags, prev_tags)
269         {
270             var _self = this;
271             var tag_ids = [];
272             
273             if (   !new_tags
274                 || new_tags.length <= 0)
275             {
276                 return tag_ids;
277             }
278             
279             var on_success = function(data) {
280                 if (data.ok) {
281                     var msg = $.ajatus.elements.messages.create(
282                         $.ajatus.i10n.get('New tag created'),
283                         $.ajatus.i10n.get("Created new tag '%s'", [data.id])
284                     );
286                     $.ajatus.debug("saved tag: "+data.id);
287                     tag_ids.push(data.id);
288                 }
289                 
290                 return data;
291             };
292             var dc = $.jqCouch.connection('doc', on_success);
293             
294             $.each(new_tags, function(i,d){                
295                 var t = d.title;
296                 
297                 var context_key = '';
298                 if (t.match(/:/)) {
299                     var tag_parts = t.split(':');
300                     context_key = tag_parts[0];
301                     t = tag_parts[1];
302                 }
303                 
304                 var pd = {
305                     color: (typeof d.color != 'undefined') ? d.color : '',
306                     context: (typeof d.context != 'undefined') ? d.context : context_key,
307                     value: (typeof d.value != 'undefined') ? d.value : ''
308                 }
309                 
310                 var data = {
311                     color: pd.color,
312                     context: pd.context,
313                     value: pd.value
314                 };
315                 $.ajatus.tags.create(t, data, dc);
316             });
317             
318             $.ajatus.views.on_change_actions.add('$.ajatus.tags.refresh_cache();');
319             
320             return tag_ids;
321         }
322     };
324 })(jQuery);