Updated Ajatus to use the new jqCouch library
[ajatus.git] / js / ajatus.tags.js
blob4d3a3f7016dbaf9a1cdde3fe8e21dc8e39e0b4cc
1 /*
2 * This file is part of
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
15 (function($){
16 $.ajatus = $.ajatus || {};
18 /**
19 * Holds all tag methods
20 * @accessor {String} cache Holds all cached tag names
21 * @accessor {String} active Currently active tag name
22 * @constructor
24 $.ajatus.tags = {
25 cache: [],
26 used_contexts: [],
27 active: ''
29 $.extend($.ajatus.tags, {
31 /**
32 * Initializes the tags
33 * @see ajatus.core.init
34 * @see ajatus.tags.load
35 * @see ajatus.tags.update_tag_list
37 init: function() {
38 $.ajatus.events.lock_pool.increase();
39 $.ajatus.tags.load();
40 $.ajatus.events.lock_pool.decrease();
41 $.ajatus.tags.update_app_tag_list();
43 load: function() {
44 $.ajatus.tags.used_contexts = [];
45 $.ajatus.tags.cache = [];
47 var on_success = function(data) {
48 if (data.total_rows <= 0) {
49 return false;
52 $.each(data.rows, function(i,n){
53 if ( typeof(n.value.title.widget.config['context']) != 'undefined'
54 && n.value.title.widget.config['context'] != '')
56 var found = $.inArray(n.value.title.widget.config['context'], $.ajatus.tags.used_contexts);
57 if (found == -1) {
58 $.ajatus.tags.used_contexts.push(n.value.title.widget.config['context']);
61 $.ajatus.tags.cache.push(n);
62 });
64 return data;
67 $.jqCouch.connection('view', on_success).temp($.ajatus.preferences.client.tags_database, function(doc){
68 if ( doc.value.metadata.archived.val == ""
69 && doc.value.metadata.deleted.val != 1)
71 map(doc._id, doc.value);
73 });
75 refresh_cache: function() {
76 $.ajatus.tags.load();
77 $.ajatus.tags.update_cache();
79 update_cache: function() {
80 $.ajatus.tags.update_app_tag_list();
81 if ($.ajatus.tags.active != '') {
82 $.ajatus.tags.set_active($.ajatus.tags.active);
85 set_active: function(tag) {
86 var select = $('#application-tags select');
87 $('option', select).each(function(i,o){
88 if (o.value == tag) {
89 o.selected = 'selected';
91 });
92 $.ajatus.tags.active = tag;
94 update_app_tag_list: function() {
95 var select = $('#application-tags select');
96 select.html('');
98 var opt_groups = {};
99 var def_opt_grp = $('<optgroup label="' + $.ajatus.i10n.get('No context') + '" />');
100 def_opt_grp.appendTo(select);
102 $.each($.ajatus.tags.used_contexts, function(i){
103 var opt_grp = $('<optgroup label="' + this + '" />');
104 opt_grp.prependTo(select);
105 opt_groups[this] = opt_grp;
108 $.each($.ajatus.tags.cache, function(i){
109 var opt = $('<option>'+this.value.title.val+'</option>').attr({
110 value: this.id
113 if ( typeof(this.value.title.widget.config['context']) != 'undefined'
114 && this.value.title.widget.config['context'] != '')
116 var context = this.value.title.widget.config.context;
117 opt.appendTo(opt_groups[context]);
118 } else {
119 opt.appendTo(def_opt_grp);
123 var def = $('<option />').attr({
124 value: '',
125 selected: 'selected'
126 }).html($.ajatus.i10n.get('Global Tag') + '&nbsp;');
127 def.prependTo(select);
128 select.bind('change', function(e){
129 $.ajatus.tags.set_active(e.currentTarget.value);
132 search: function(query, context, max_res) {
133 // console.log("Search tags with: "+query);
135 var results = [];
136 var context_key = false;
138 if (typeof max_res != 'number') {
139 max_res = 20;
142 query = $.ajatus.tags._prepare_query(query);
144 var on_success = function(data) {
145 if (data.total_rows == 0) {
146 return [];
149 $.each(data.rows, function(i,n){
150 var doc = new $.ajatus.document(n);
151 results.push(doc);
154 return data;
157 var rel_view = 'if (doc.value.title.val.match(/\\\\b'+query+'(.*?)\\\\b/) ';
158 if ( typeof context != 'undefined'
159 && context != '')
161 rel_view += '&& typeof(doc.value.title.widget.config["context"]) != "undefined" ';
162 rel_view += '&& doc.value.title.widget.config.context == "+context+" ';
164 rel_view += '&& doc.value.metadata.archived.val == "" && doc.value.metadata.deleted.val != 1){';
165 rel_view += 'map( doc._id, doc.value );}';
167 $.jqCouch.connection('view', on_success).temp($.ajatus.preferences.client.tags_database,
168 "$.ajatus.views.generate('"+rel_view+"')", {
169 count: max_res
173 return results;
175 search_cache: function(query, context, max_res) {
176 // console.log("Search tags cache with: "+query);
178 var results = [];
179 query = $.ajatus.tags._prepare_query(query);
180 var re = new RegExp("\\b"+query+"(.*?)\\b");
182 $.each($.ajatus.tags.cache, function(i, tag){
183 if (tag.id.toString().match(re)) {
184 if ( typeof context != 'undefined'
185 && context != '')
187 if ( typeof(tag.value.title.widget.config['context']) != 'undefined'
188 && tag.value.title.widget.config['context'] == context)
190 results.push(tag);
192 } else {
193 results.push(tag);
198 return results;
200 _prepare_query: function(query) {
201 query = query.replace(/[\(|\)|\.|\?|\;|\/]/, '');
202 query = query.replace('\\', '');
203 query = query.replace('*', '(.*?)');
205 return query;
207 get: function(tag, rev, skip_cache, callback) {
208 var result = false;
209 if (typeof skip_cache == 'undefined') {
210 var skip_cache = false;
213 if ( typeof rev == 'undefined'
214 && !skip_cache)
216 $.each($.ajatus.tags.cache, function(i,t){
217 if (t.id == tag) {
218 result = t;
222 if (result) {
223 return result;
227 var on_success = function(data) {
228 var doc = new $.ajatus.document(data);
229 result = doc;
231 if (typeof callback == 'function') {
232 var fn = eval('('+callback+')');
233 fn.apply(fn, [result]);
236 return data;
239 var args = {};
240 if (typeof rev != 'undefined') {
241 args['_rev'] = rev;
244 $.jqCouch.connection('doc', on_success).get($.ajatus.preferences.client.tags_database + '/' + tag, args);
246 return result;
248 exists: function(tag) {
249 var tag_ids = [];
250 $.each($.ajatus.tags.cache, function(i,t){
251 tag_ids.push(t.id);
253 var found = $.inArray(tag, tag_ids);
254 if (found != -1) {
255 return true;
257 return false;
259 create: function(name, context, dc) {
261 if ($.ajatus.tags.exists(name)) {
262 return false;
265 if (typeof dc == 'undefined') {
266 var on_success = function(data) {
267 if (data.ok) {
268 var msg = $.ajatus.elements.messages.create(
269 'New tag created',
270 'Created new tag "'+data.id+'".'
273 $.ajatus.debug("saved tag: "+data.id);
275 var tag = $.ajatus.tags.get(data.id, data.rev, true);
276 $.ajatus.tags.cache.push(tag);
279 return data;
282 var dc = $.jqCouch.connection('doc', on_success);
283 $.ajatus.views.on_change_actions.add('$.ajatus.tags.update_cache();');
286 var tag = {
287 _id: name,
288 value: {
289 _type: 'tag',
290 title: {
291 val: name,
292 widget: {
293 name: 'tag',
294 config: {
295 color: '8596b6',
296 context: (context || '')
302 tag = new $.ajatus.document(tag);
304 var now = $.ajatus.formatter.date.js_to_iso8601(new Date());
305 var new_metadata = {
306 created: now,
307 creator: $.ajatus.preferences.local.user.email,
308 revised: now,
309 revisor: $.ajatus.preferences.local.user.email
311 tag = $.ajatus.document.modify_metadata(tag, new_metadata);
312 dc.save($.ajatus.preferences.client.tags_database, tag);
314 return true;
316 remove: function(tag, dc) {
317 if (typeof dc == 'undefined') {
318 var on_success = function(data) {
319 var msg = $.ajatus.elements.messages.create(
320 $.ajatus.i10n.get('Object deleted'),
321 $.ajatus.i10n.get('Tag %s removed from Ajatus.', [tag])
324 var dc = $.jqCouch.connection('doc', on_success);
327 dc.del($.ajatus.preferences.client.tags_database + '/' + tag);
329 related: function(tags, skip_docs) {
330 var related = [];
332 if (typeof skip_docs != 'object') {
333 var skip_docs = [];
336 var on_success = function(data) {
337 if (data.total_rows == 0) {
338 return;
341 $.each(data.rows, function(i,n){
342 if ($.ajatus.utils.array.has_match(tags, n.value.tags.val)) {
343 if (skip_docs.length > 0) {
344 if ($.inArray(n.id, skip_docs) == -1) {
345 var doc = new $.ajatus.document(n);
346 related.push(doc);
348 } else {
349 var doc = new $.ajatus.document(n);
350 related.push(doc);
355 return data;
358 var rel_view = 'if (typeof(doc.value.tags) != "undefined" && doc.value.tags.val.length > 0 ';
359 rel_view += '&& doc.value.metadata.archived.val == "" && doc.value.metadata.deleted.val != 1){';
360 rel_view += 'map( doc.value._type, {"_id": doc._id, "_rev": doc._rev, "_type": doc.value._type,';
361 rel_view += '"title": doc.value.title,';
363 $.each($.ajatus.preferences.client.content_types, function(key,type){
364 if (type['title_item']) {
365 $.each(type['title_item'], function(i,part){
366 if (type.schema[part]) {
367 rel_view += '"'+part+'": doc.value.'+part+',';
373 rel_view += '"tags": doc.value.tags })}';
375 $.jqCouch.connection('view', on_success).temp($.ajatus.preferences.client.content_database, "$.ajatus.views.generate('"+rel_view+"')");
377 return related;
381 })(jQuery);