4 * Ajatus - Distributed CRM
5 * @requires jQuery v1.2.1
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
16 $.ajatus = $.ajatus || {};
17 $.ajatus.views = $.ajatus.views || {};
19 $.ajatus.views.system = {
21 'frontpage', 'edit', 'create', 'item', 'tags', 'trash'
24 $.ajatus.views.system.frontpage = {
28 max_items_before_pool: 3
31 history_support: true,
43 $.ajatus.tabs.on_click(e);
44 $.ajatus.views.system.frontpage.render();
50 $.ajatus.application_content_area.html('');
51 $.ajatus.layout.body.set_class('frontpage');
52 $.ajatus.views.on_change("#view.frontpage");
54 $.each($.ajatus.preferences.client.content_types, function(key,type){
55 if ( !type.views['list']
56 || type.on_frontpage == false) {
60 var on_success = function(data) {
61 if (data.total_rows == 0) {
65 var pool_settings = $.ajatus.views.system.frontpage.pool_settings;
66 if (data.total_rows >= $.ajatus.views.system.frontpage.options.max_items_before_pool) {
67 pool_settings.enabled = true;
70 var renderer = new $.ajatus.renderer.list(
71 $.ajatus.application_content_area,
74 id: type.name + '_list_holder',
80 $.each(data.rows, function(i,doc){
81 var doc = new $.ajatus.document(doc);
82 renderer.render_item(doc, i);
88 if ( $.ajatus.tags.active != ''
89 && typeof type.views['list_at'] != 'undefined')
91 $.jqCouch.connection('view', on_success).temp($.ajatus.preferences.client.content_database, type.views['list_at'], {
92 count: $.ajatus.views.system.frontpage.options.group_item_count,
96 $.jqCouch.connection('view', on_success).get($.ajatus.preferences.client.content_database, type.name+'/list', {
97 count: $.ajatus.views.system.frontpage.options.group_item_count,
104 $.ajatus.views.system.tags = {
109 application_tab: true,
110 history_support: true,
114 on_click: function(e) {
115 $.ajatus.tabs.on_click(e);
116 $.ajatus.views.system.tags.render();
121 $.ajatus.application_content_area.html('');
122 $.ajatus.layout.body.set_class('tags');
123 $.ajatus.views.on_change("#view.tags");
125 $.ajatus.toolbar.init();
126 $.ajatus.toolbar.show();
128 $.ajatus.views.system.tags.get_items();
131 render_results: function(tags, items) {
132 var type = $.ajatus.preferences.client.content_types['tag'];
134 var renderer = new $.ajatus.renderer.list(
135 $.ajatus.application_content_area,
138 id: 'tags_list_holder',
140 'title', 'context', 'value', 'created', 'creator', 'used'
149 $.each(tags, function(i,doc){
150 var doc = new $.ajatus.document(doc);
151 doc.value['used'] = {
152 val: (typeof items[doc._id] != 'undefined' ? items[doc._id].length : 0)
154 renderer.render_item(doc, x);
158 renderer.enable_sorting();
160 $.ajatus.views.system.tags.get_duplicates(items);
163 render_duplicates: function(rows, items) {
164 var type = $.ajatus.preferences.client.content_types['tag'];
166 var renderer = new $.ajatus.renderer.list(
167 $.ajatus.application_content_area,
170 id: 'tag_dups_list_holder',
171 title: $.ajatus.i10n.get("Duplicate"),
173 'title', 'context', 'value', 'created', 'creator', 'used'
179 item_id_suffix: '_duplicate',
181 className: 'list_holder duplicates_list'
186 var duplicate_ids = [];
193 $.each (rows, function(i,doc){
194 var doc = new $.ajatus.document(doc);
195 // console.log(doc._id);
196 // console.log(doc.key);
197 // console.log(doc.value.context.val);
198 // console.log(doc.value.value.val);
200 // if (typeof tags[doc.key] == 'undefined') {
202 // contexts: [doc.value.context.val],
203 // values: [doc.value.value.val],
207 // tags[doc.key].contexts.push(doc.value.context.val);
208 // tags[doc.key].values.push(doc.value.value.val);
209 // tags[doc.key].docs.push(doc);
212 var tag_hash = $.ajatus.utils.md5.encode(doc.value.context.val + ':' + doc.key + '=' + doc.value.value.val);
213 hashes.push(tag_hash);
220 var chashes = hashes;
221 var duplicates_with = {};
223 for (var i=0; i<hashes.length;i++) {
226 var matched = $.inArray(key, chashes);
228 if (typeof duplicates_with[ids[i]] == 'undefined') {
229 duplicates_with[ids[i]] = [ids[matched]];
231 duplicates_with[ids[i]].push(ids[matched]);
233 duplicates_with[ids[i]]
234 duplicate_ids.push(ids[i]);
239 // console.log("match_count: "+match_count);
240 // console.log("duplicate_ids: ");
241 // console.log(duplicate_ids);
242 // console.log("duplicates_with: ");
243 // console.log(duplicates_with);
246 $.each(tags, function(i,d){
247 if ($.inArray(i, duplicate_ids) != -1) {
249 val: (typeof items[d._id] != 'undefined' ? items[d._id].length : 0)
251 renderer.render_item(d, x);
255 var merger = new $.ajatus.tags.merger();
257 $.each(duplicate_ids, function(i,dub){
258 var row = $('#object_'+dub+'_duplicate');
259 row.bind('click', function(){
260 merger.toggle_selection($(this), dub, duplicates_with[dub]);
264 renderer.enable_sorting();
267 get_items: function(on_success) {
268 var conn_on_success = function(data) {
269 if (data.total_rows == 0) {
270 var key = $.ajatus.i10n.plural($.ajatus.i10n.get('tag'));
271 var msg = $.ajatus.elements.messages.static($.ajatus.i10n.get('Empty results'), $.ajatus.i10n.get('No %s found', [key]));
278 $.each(data.rows, function(i,n){
282 if (typeof items[n.key[0]] == 'undefined') {
283 items[n.key[0]] = [];
285 items[n.key[0]].push(n);
289 if (typeof on_success == 'undefined') {
290 on_success = $.ajatus.views.system.tags.render_results;
293 on_success(tags, items);
298 $.jqCouch.connection('view', conn_on_success).get($.ajatus.preferences.client.content_database, 'tag/list_with_docs', {
299 // startkey: ["ED862081B2FBF46FB0CDBBE848ED6856", 0],
300 // endkey: ["ED862081B2FBF46FB0CDBBE848ED6856", 1]
304 get_duplicates: function(items) {
305 var conn_on_success = function(data) {
306 if (data.total_rows == 0) {
307 var key = $.ajatus.i10n.plural($.ajatus.i10n.get('dublicate'));
308 var msg = $.ajatus.elements.messages.static($.ajatus.i10n.get('Empty results'), $.ajatus.i10n.get('No %s found', [key]));
312 if (typeof on_success == 'undefined') {
313 on_success = $.ajatus.views.system.tags.render_duplicates;
316 on_success(data.rows, items);
321 $.jqCouch.connection('view', conn_on_success).get($.ajatus.preferences.client.content_database, 'tag/list_by_title', {
326 $.ajatus.views.system.trash = {
332 application_tab: true,
333 history_support: true,
337 on_click: function(e)
339 $.ajatus.tabs.on_click(e);
340 $.ajatus.views.system.trash.render();
344 get_items: function(on_success) {
345 var trash_view = 'if (doc.value.metadata.deleted.val == true) {';
346 trash_view += 'map( doc.value.metadata.revised, {"_type": doc.value._type,';
347 trash_view += '"title": doc.value.title,';
349 $.each($.ajatus.preferences.client.content_types, function(key,type){
350 if (type['title_item']) {
351 $.each(type['title_item'], function(i,part){
352 if (type.schema[part]) {
353 trash_view += '"'+part+'": doc.value.'+part+',';
359 trash_view += '"revised": doc.value.metadata.revised,"by": doc.value.metadata.revisor,"tags": doc.value.tags})}';
361 var conn_on_success = function(data) {
362 if (data.total_rows == 0) {
363 var key = $.ajatus.i10n.plural($.ajatus.i10n.get('deleted item'));
364 var msg = $.ajatus.elements.messages.static($.ajatus.i10n.get('Empty results'), $.ajatus.i10n.get('No %s found', [key]));
368 if (typeof on_success == 'undefined') {
369 on_success = $.ajatus.views.system.trash.render_results;
372 on_success(data.rows);
376 $.jqCouch.connection('view', conn_on_success).temp($.ajatus.preferences.client.content_database, "$.ajatus.views.generate('"+trash_view+"')", {
377 count: $.ajatus.views.system.trash.options.group_item_count,
384 $.ajatus.application_content_area.html('');
385 $.ajatus.layout.body.set_class('trash');
386 $.ajatus.views.on_change("#view.trash");
388 $.ajatus.toolbar.init();
389 $.ajatus.toolbar.show();
391 $.ajatus.views.system.trash.get_items();
394 render_results: function(rows)
396 var result_count = {};
397 var show_empty_trash = false;
399 $.each($.ajatus.preferences.client.content_types, function(key,type){
400 if (!type.views['list']) {
404 result_count[type.name] = 0;
406 $.each(rows, function(i,doc){
407 if (doc.value._type == type.name) {
408 result_count[type.name] += 1;
412 if (result_count[type.name] == 0) {
416 show_empty_trash = true;
418 var renderer = new $.ajatus.renderer.list(
419 $.ajatus.application_content_area,
422 id: type.name + '_list_holder',
426 'title', 'revised', 'by'
436 $.each(rows, function(i,doc){
437 if (doc.value._type == type.name) {
438 var doc = new $.ajatus.document(doc);
440 renderer.set_actions(
444 title: $.ajatus.i10n.get('View'),
446 click_action: '$.ajatus.views.system.item.render(doc);'
450 title: $.ajatus.i10n.get('Undelete'),
452 click_action: '$.ajatus.document.actions.execute("undelete", doc);'
455 name: 'delete_final',
456 title: $.ajatus.i10n.get('Delete'),
458 click_action: '$.ajatus.document.actions.execute("delete_final", doc);'
462 renderer.render_item(doc, i);
466 renderer.enable_sorting();
469 if (show_empty_trash) {
470 $.ajatus.toolbar.add_item($.ajatus.i10n.get('Empty trash'), 'trash.png', function(){
471 $.ajatus.views.system.trash.empty();
476 var answer = confirm($.ajatus.i10n.get("Deleting all items in trash. Are you sure?"));
478 $.ajatus.views.system.trash.get_items($.ajatus.views.system.trash.execute_empty);
481 execute_empty: function(rows) {
482 $.each(rows, function(i,doc){
483 doc = new $.ajatus.document(doc);
484 $.ajatus.document.actions.execute("delete_final", doc);
488 $.ajatus.views.system.edit = {
493 dynamic_history: true
495 $.extend($.ajatus.views.system.edit, {
496 render: function(type, doc, use_given_doc)
498 if (typeof use_given_doc == 'undefined') {
499 use_given_doc = false;
502 var content_type = type;
504 if (! use_given_doc) {
505 var doc = new $.ajatus.document.loader(doc._id, doc._rev);
509 content_type = $.ajatus.preferences.client.content_types[doc.value._type];
512 if (typeof(type) == 'string') {
513 content_type = $.ajatus.preferences.client.content_types[type];
516 $.ajatus.layout.body.set_class('edit '+content_type.name);
518 var view_hash = '#edit.'+doc.value._type+'.'+doc._id+'.'+doc._rev;
519 $.ajatus.history.update(view_hash);
520 $.ajatus.views.on_change(view_hash);
522 var latest_rev = $.ajatus.document.revisions.get(doc).active.rev;
524 if ( content_type.custom_renderer
525 && typeof(content_type.custom_renderer['edit']) == 'function')
527 var renderer = content_type.custom_renderer.edit(doc, latest_rev);
529 var renderer = new $.ajatus.renderer.form(content_type, doc, false, latest_rev);
530 $.ajatus.application_content_area.html(renderer.form);
531 $.ajatus.forms.register.normal(renderer.form);
534 history_register: function() {
535 $.ajatus.history.add_dynamic_map(['edit'], 3, '$.ajatus.views.system.edit.history_render');
537 history_render: function() {
538 var type = arguments[0];
539 var id = arguments[1];
542 if ( typeof arguments[2] != 'undefined'
543 && arguments[2] != '')
548 var doc = new $.ajatus.document.loader(id, rev);
549 $.ajatus.views.system.edit.render(type, doc);
553 $.ajatus.views.system.create = {
558 dynamic_history: true
560 $.extend($.ajatus.views.system.create, {
561 render: function(type, doc)
563 var content_type = type;
565 if (typeof(type) == 'string') {
566 content_type = $.ajatus.preferences.client.content_types[type];
569 $.ajatus.layout.body.set_class('create '+content_type.name);
571 var view_hash = '#create.'+content_type.name;
573 $.ajatus.history.update(view_hash);
575 $.ajatus.views.on_change(view_hash);
577 if ( content_type.custom_renderer
578 && typeof(content_type.custom_renderer['create']) == 'function')
580 var renderer = content_type.custom_renderer.create();
582 var renderer = new $.ajatus.renderer.form(content_type, doc, true);
583 $.ajatus.application_content_area.html(renderer.form);
584 $.ajatus.forms.register.normal(renderer.form);
587 history_register: function() {
588 $.ajatus.history.add_dynamic_map(['create'], 2, '$.ajatus.views.system.create.history_render');
590 history_render: function() {
591 var type = arguments[0];
593 $.ajatus.views.system.create.render(type);
597 $.ajatus.views.system.item = {
602 dynamic_history: true
604 $.extend($.ajatus.views.system.item, {
605 render: function(doc)
607 if (typeof doc._rev != 'undefined') {
608 var doc = new $.ajatus.document.loader(doc._id, doc._rev);
610 var doc = new $.ajatus.document.loader(doc._id);
613 var content_type = $.ajatus.preferences.client.content_types[doc.value._type];
615 $.ajatus.layout.body.set_class('view '+doc.value._type);
617 var view_hash = '#view.'+doc.value._type+'.'+doc._id+'.'+doc._rev;
618 $.ajatus.history.update(view_hash);
619 $.ajatus.views.on_change(view_hash);
621 $.ajatus.toolbar.add_item($.ajatus.i10n.get('Edit'), {
624 $.ajatus.views.system.edit.render(content_type, doc);
629 if (doc.value.metadata.archived.val) {
630 var unarch_id = $.ajatus.toolbar.add_item($.ajatus.i10n.get('Restore'), 'undo.png', function(item, doc){
632 $.ajatus.document.actions.execute("unarchive", doc);
634 $.ajatus.toolbar.hide_item(item.id);
635 $.ajatus.toolbar.add_item($.ajatus.i10n.get('Archive'), 'archive.png', function(item, doc, unarch_item_id){
637 $.ajatus.document.actions.execute("archive", doc);
639 $.ajatus.toolbar.hide_item(item.id);
640 $.ajatus.toolbar.show_item(unarch_item_id);
641 }, [doc, unarch_id], unarch_id);
644 var arch_id = $.ajatus.toolbar.add_item($.ajatus.i10n.get('Archive'), 'archive.png', function(item, doc){
646 $.ajatus.document.actions.execute("archive", doc);
648 $.ajatus.toolbar.hide_item(item.id);
649 $.ajatus.toolbar.add_item($.ajatus.i10n.get('Restore'), 'undo.png', function(item, doc, arch_item_id){
651 $.ajatus.document.actions.execute("unarchive", doc);
653 $.ajatus.toolbar.hide_item(item.id);
654 $.ajatus.toolbar.show_item(arch_item_id);
655 }, [doc, arch_id], arch_id);
659 if (doc.value.metadata.deleted.val) {
660 var undel_id = $.ajatus.toolbar.add_item($.ajatus.i10n.get('Undelete'), 'undo.png', function(item, doc){
662 $.ajatus.document.actions.execute("undelete", doc);
665 $.ajatus.toolbar.hide_item(item.id);
666 $.ajatus.toolbar.add_item($.ajatus.i10n.get('Delete'), 'trash.png', function(item, doc, undel_item_id){
668 $.ajatus.document.actions.execute("delete", doc);
670 $.ajatus.toolbar.hide_item(item.id);
671 $.ajatus.toolbar.show_item(undel_item_id);
672 }, [d, undel_id], undel_id);
675 var del_id = $.ajatus.toolbar.add_item($.ajatus.i10n.get('Delete'), 'trash.png', function(item, doc){
677 $.ajatus.document.actions.execute("delete", doc);
680 $.ajatus.toolbar.hide_item(item.id);
681 $.ajatus.toolbar.add_item($.ajatus.i10n.get('Undelete'), 'undo.png', function(item, doc, del_item_id){
683 $.ajatus.document.actions.execute("undelete", doc);
685 $.ajatus.toolbar.hide_item(item.id);
686 $.ajatus.toolbar.show_item(del_item_id);
687 }, [d, del_id], del_id);
691 $.ajatus.toolbar.show();
693 var metadata_sb = new $.ajatus.renderer.blocks.sub('metadata_for_'+doc._id);
694 metadata_sb.set_title($.ajatus.i10n.get('Metadata'));
695 $.ajatus.views.on_change_actions.add('$.ajatus.renderer.blocks.clear_sub("'+metadata_sb.id+'");');
697 var md_renderer = new $.ajatus.renderer.metadata(doc, metadata_sb.element);
699 if (typeof doc.value.tags != 'undefined') {
700 var rel_docs = $.ajatus.tags.related(doc.value.tags.val, [doc._id]);
702 var related_sb = new $.ajatus.renderer.blocks.sub('related_objects');
703 related_sb.set_title($.ajatus.i10n.get('Related Objects'));
704 $.ajatus.views.on_change_actions.add('$.ajatus.renderer.blocks.clear_sub("'+related_sb.id+'");');
706 var tinylist = new $.ajatus.renderer.tinylist(related_sb.element);
707 tinylist.render_items(rel_docs);
710 if ( content_type.custom_renderer
711 && typeof(content_type.custom_renderer['item']) == 'function')
713 var renderer = content_type.custom_renderer.item();
715 var renderer = new $.ajatus.renderer.item(doc);
718 history_register: function() {
719 $.ajatus.history.add_dynamic_map(['view'], 3, '$.ajatus.views.system.item.history_render');
721 history_render: function() {
722 var type = arguments[0];
723 var id = arguments[1];
726 if ( typeof arguments[2] != 'undefined'
727 && arguments[2] != '')
749 if (typeof data['toSource'] != 'undefined') {
750 data = data.toSource();
753 setTimeout("$.ajatus.views.system.item.render("+data+");", 200);