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();
127 $.ajatus.views.system.tags.get_items();
130 render_results: function(tags, items) {
131 var type = $.ajatus.preferences.client.content_types['tag'];
133 var renderer = new $.ajatus.renderer.list(
134 $.ajatus.application_content_area,
137 id: 'tags_list_holder',
139 'title', 'context', 'value', 'created', 'creator', 'used'
148 $.each(tags, function(i,doc){
149 var doc = new $.ajatus.document(doc);
150 doc.value['used'] = {
151 val: (typeof items[doc._id] != 'undefined' ? items[doc._id].length : 0)
153 renderer.render_item(doc, x);
157 renderer.enable_sorting();
159 $.ajatus.views.system.tags.get_duplicates(items);
162 render_duplicates: function(rows, items) {
163 var type = $.ajatus.preferences.client.content_types['tag'];
166 var duplicate_ids = [];
171 var real_hashes = [];
172 var false_hashes = {};
173 var broken_hashes = {};
176 var real_hashes_cnt = 0;
177 var false_hashes_cnt = 0;
179 $.each (rows, function(i,doc){
180 var doc = new $.ajatus.document(doc);
181 // console.log(doc._id);
182 // console.log(doc.key);
183 // console.log(doc.value.context.val);
184 // console.log(doc.value.value.val);
186 var tag_hash = $.ajatus.utils.md5.encode(doc.value.context.val + ':' + doc.key + '=' + doc.value.value.val);
188 hashes.push(tag_hash);
191 if (tag_hash == doc._id) {
192 real_hashes.push(tag_hash);
193 real_hashes_cnt += 1;
195 if (typeof false_hashes[tag_hash] == 'undefined') {
196 false_hashes[tag_hash] = [doc._id];
197 false_hashes_cnt += 1;
199 false_hashes[tag_hash].push(doc._id);
200 false_hashes_cnt += 1;
207 // console.log("rows length: "+rows.length);
209 // console.log("real_hashes ("+real_hashes_cnt+"): ");
210 // console.log(real_hashes);
211 // console.log("false_hashes ("+false_hashes_cnt+"): ");
212 // console.log(false_hashes);
214 var duplicates_with = {};
216 var broken_hashes_cnt = 0;
217 var dublicate_cnt = 0;
219 $.each(false_hashes, function(hash,hids){
220 if (typeof duplicates_with[hash] == 'undefined') {
221 duplicates_with[hash] = [];
224 if (hids.length > 1) {
225 if ($.inArray(hash, real_hashes) != -1) {
226 duplicates_with[hash] = hids;
229 broken_hashes[hash] = hids;
230 broken_hashes_cnt += 1;
233 if ($.inArray(hash, real_hashes) != -1) {
234 duplicates_with[hash].push(hids[0]);
237 broken_hashes[hash] = hids;
238 broken_hashes_cnt += 1;
243 // console.log("broken_hashes ("+broken_hashes_cnt+"): ");
244 // console.log(broken_hashes);
246 if (dublicate_cnt > 0) {
247 var drenderer = new $.ajatus.renderer.list(
248 $.ajatus.application_content_area,
251 id: 'tag_dups_list_holder',
252 title: $.ajatus.i10n.get("Duplicate"),
254 'title', 'context', 'value', 'creator', 'used'
257 item_id_suffix: '_duplicate',
259 className: 'list_holder duplicates_list'
265 $.each(duplicates_with, function(hash, dids){
266 for (var i=0; i<dids.length; i++) {
267 if (typeof tags[dids[i]] != 'undefined') {
268 var d = tags[dids[i]];
270 val: (typeof items[d._id] != 'undefined' ? items[d._id].length : 0)
272 d.value['real_hash'] = {
275 drenderer.render_item(d, x);
279 $.ajatus.debug("Couldn't find tag with id: "+dids[i]);
283 drenderer.enable_sorting();
285 var merger = new $.ajatus.tags.merger(dub_tags, duplicates_with, tags);
288 if (broken_hashes_cnt > 0) {
289 var brenderer = new $.ajatus.renderer.list(
290 $.ajatus.application_content_area,
293 id: 'tag_broken_list_holder',
294 title: $.ajatus.i10n.get("Broken"),
297 'title', 'context', 'value', 'curr_hash', 'real_hash', 'used'
301 label: 'Current hash'
308 item_id_suffix: '_broken',
310 className: 'list_holder broken_list'
314 var broken_tags = {};
316 $.each(broken_hashes, function(hash, dids){
317 for (var i=0; i<dids.length; i++) {
318 if (typeof tags[dids[i]] != 'undefined') {
319 var d = tags[dids[i]];
321 val: (typeof items[d._id] != 'undefined' ? items[d._id].length : 0)
323 d.value['curr_hash'] = {
326 d.value['real_hash'] = {
329 brenderer.render_item(d, x);
330 broken_tags[d._id] = d;
333 $.ajatus.debug("Couldn't find tag with id: "+dids[i]);
337 brenderer.enable_sorting();
339 var fixer = new $.ajatus.tags.fixer(broken_tags, broken_hashes, tags);
343 get_items: function(on_success) {
344 var conn_on_success = function(data) {
345 if (data.total_rows == 0) {
346 var key = $.ajatus.i10n.plural($.ajatus.i10n.get('tag'));
347 var msg = $.ajatus.elements.messages.static($.ajatus.i10n.get('Empty results'), $.ajatus.i10n.get('No %s found', [key]));
354 $.each(data.rows, function(i,n){
358 if (typeof items[n.key[0]] == 'undefined') {
359 items[n.key[0]] = [];
361 items[n.key[0]].push(n);
365 if (typeof on_success == 'undefined') {
366 on_success = $.ajatus.views.system.tags.render_results;
369 on_success(tags, items);
374 $.jqCouch.connection('view', conn_on_success).get($.ajatus.preferences.client.content_database, 'tag/list_with_docs', {
375 // startkey: ["ED862081B2FBF46FB0CDBBE848ED6856", 0],
376 // endkey: ["ED862081B2FBF46FB0CDBBE848ED6856", 1]
380 get_duplicates: function(items) {
381 var conn_on_success = function(data) {
382 if (data.total_rows == 0) {
383 var key = $.ajatus.i10n.plural($.ajatus.i10n.get('dublicate'));
384 var msg = $.ajatus.elements.messages.static($.ajatus.i10n.get('Empty results'), $.ajatus.i10n.get('No %s found', [key]));
388 if (typeof on_success == 'undefined') {
389 on_success = $.ajatus.views.system.tags.render_duplicates;
392 on_success(data.rows, items);
397 $.jqCouch.connection('view', conn_on_success).get($.ajatus.preferences.client.content_database, 'tag/list_by_title', {
402 $.ajatus.views.system.trash = {
408 application_tab: true,
409 history_support: true,
413 on_click: function(e)
415 $.ajatus.tabs.on_click(e);
416 $.ajatus.views.system.trash.render();
420 get_items: function(on_success) {
421 var trash_view = 'if (doc.value.metadata.deleted.val == true) {';
422 trash_view += 'map( doc.value.metadata.revised, {"_type": doc.value._type,';
423 trash_view += '"title": doc.value.title,';
425 $.each($.ajatus.preferences.client.content_types, function(key,type){
426 if (type['title_item']) {
427 $.each(type['title_item'], function(i,part){
428 if (type.schema[part]) {
429 trash_view += '"'+part+'": doc.value.'+part+',';
435 trash_view += '"revised": doc.value.metadata.revised,"by": doc.value.metadata.revisor,"tags": doc.value.tags})}';
437 var conn_on_success = function(data) {
438 if (data.total_rows == 0) {
439 var key = $.ajatus.i10n.plural($.ajatus.i10n.get('deleted item'));
440 var msg = $.ajatus.elements.messages.static($.ajatus.i10n.get('Empty results'), $.ajatus.i10n.get('No %s found', [key]));
444 if (typeof on_success == 'undefined') {
445 on_success = $.ajatus.views.system.trash.render_results;
448 on_success(data.rows);
452 $.jqCouch.connection('view', conn_on_success).temp($.ajatus.preferences.client.content_database, "$.ajatus.views.generate('"+trash_view+"')", {
453 count: $.ajatus.views.system.trash.options.group_item_count,
460 $.ajatus.application_content_area.html('');
461 $.ajatus.layout.body.set_class('trash');
462 $.ajatus.views.on_change("#view.trash");
464 $.ajatus.toolbar.init();
465 $.ajatus.toolbar.show();
467 $.ajatus.views.system.trash.get_items();
470 render_results: function(rows)
472 var result_count = {};
473 var show_empty_trash = false;
475 $.each($.ajatus.preferences.client.content_types, function(key,type){
476 if (!type.views['list']) {
480 result_count[type.name] = 0;
482 $.each(rows, function(i,doc){
483 if (doc.value._type == type.name) {
484 result_count[type.name] += 1;
488 if (result_count[type.name] == 0) {
492 show_empty_trash = true;
494 var renderer = new $.ajatus.renderer.list(
495 $.ajatus.application_content_area,
498 id: type.name + '_list_holder',
502 'title', 'revised', 'by'
512 $.each(rows, function(i,doc){
513 if (doc.value._type == type.name) {
514 var doc = new $.ajatus.document(doc);
516 renderer.set_actions(
520 title: $.ajatus.i10n.get('View'),
522 click_action: '$.ajatus.views.system.item.render(doc);'
526 title: $.ajatus.i10n.get('Undelete'),
528 click_action: '$.ajatus.document.actions.execute("undelete", doc);'
531 name: 'delete_final',
532 title: $.ajatus.i10n.get('Delete'),
534 click_action: '$.ajatus.document.actions.execute("delete_final", doc);'
538 renderer.render_item(doc, i);
542 renderer.enable_sorting();
545 if (show_empty_trash) {
546 $.ajatus.toolbar.add_item($.ajatus.i10n.get('Empty trash'), 'trash.png', function(){
547 $.ajatus.views.system.trash.empty();
552 var answer = confirm($.ajatus.i10n.get("Deleting all items in trash. Are you sure?"));
554 $.ajatus.views.system.trash.get_items($.ajatus.views.system.trash.execute_empty);
557 execute_empty: function(rows) {
558 $.each(rows, function(i,doc){
559 doc = new $.ajatus.document(doc);
560 $.ajatus.document.actions.execute("delete_final", doc);
564 $.ajatus.views.system.edit = {
569 dynamic_history: true
571 $.extend($.ajatus.views.system.edit, {
572 render: function(type, doc, use_given_doc)
574 if (typeof use_given_doc == 'undefined') {
575 use_given_doc = false;
578 var content_type = type;
580 if (! use_given_doc) {
581 var doc = new $.ajatus.document.loader(doc._id, doc._rev);
585 content_type = $.ajatus.preferences.client.content_types[doc.value._type];
588 if (typeof(type) == 'string') {
589 content_type = $.ajatus.preferences.client.content_types[type];
592 $.ajatus.layout.body.set_class('edit '+content_type.name);
594 var view_hash = '#edit.'+doc.value._type+'.'+doc._id+'.'+doc._rev;
595 $.ajatus.history.update(view_hash);
596 $.ajatus.views.on_change(view_hash);
598 var latest_rev = $.ajatus.document.revisions.get(doc).active.rev;
600 if ( content_type.custom_renderer
601 && typeof(content_type.custom_renderer['edit']) == 'function')
603 var renderer = content_type.custom_renderer.edit(doc, latest_rev);
605 var renderer = new $.ajatus.renderer.form(content_type, doc, false, latest_rev);
606 $.ajatus.application_content_area.html(renderer.form);
607 $.ajatus.forms.register.normal(renderer.form);
610 history_register: function() {
611 $.ajatus.history.add_dynamic_map(['edit'], 3, '$.ajatus.views.system.edit.history_render');
613 history_render: function() {
614 var type = arguments[0];
615 var id = arguments[1];
618 if ( typeof arguments[2] != 'undefined'
619 && arguments[2] != '')
624 var doc = new $.ajatus.document.loader(id, rev);
625 $.ajatus.views.system.edit.render(type, doc);
629 $.ajatus.views.system.create = {
634 dynamic_history: true
636 $.extend($.ajatus.views.system.create, {
637 render: function(type, doc)
639 var content_type = type;
641 if (typeof(type) == 'string') {
642 content_type = $.ajatus.preferences.client.content_types[type];
645 $.ajatus.layout.body.set_class('create '+content_type.name);
647 var view_hash = '#create.'+content_type.name;
649 $.ajatus.history.update(view_hash);
651 $.ajatus.views.on_change(view_hash);
653 if ( content_type.custom_renderer
654 && typeof(content_type.custom_renderer['create']) == 'function')
656 var renderer = content_type.custom_renderer.create();
658 var renderer = new $.ajatus.renderer.form(content_type, doc, true);
659 $.ajatus.application_content_area.html(renderer.form);
660 $.ajatus.forms.register.normal(renderer.form);
663 history_register: function() {
664 $.ajatus.history.add_dynamic_map(['create'], 2, '$.ajatus.views.system.create.history_render');
666 history_render: function() {
667 var type = arguments[0];
669 $.ajatus.views.system.create.render(type);
673 $.ajatus.views.system.item = {
678 dynamic_history: true
680 $.extend($.ajatus.views.system.item, {
681 render: function(doc)
683 if (typeof doc._rev != 'undefined') {
684 var doc = new $.ajatus.document.loader(doc._id, doc._rev);
686 var doc = new $.ajatus.document.loader(doc._id);
689 var content_type = $.ajatus.preferences.client.content_types[doc.value._type];
691 $.ajatus.layout.body.set_class('view '+doc.value._type);
693 var view_hash = '#view.'+doc.value._type+'.'+doc._id+'.'+doc._rev;
694 $.ajatus.history.update(view_hash);
695 $.ajatus.views.on_change(view_hash);
697 $.ajatus.toolbar.add_item($.ajatus.i10n.get('Edit'), {
700 $.ajatus.views.system.edit.render(content_type, doc);
705 if (doc.value.metadata.archived.val) {
706 var unarch_id = $.ajatus.toolbar.add_item($.ajatus.i10n.get('Restore'), 'undo.png', function(item, doc){
708 $.ajatus.document.actions.execute("unarchive", doc);
710 $.ajatus.toolbar.hide_item(item.id);
711 $.ajatus.toolbar.add_item($.ajatus.i10n.get('Archive'), 'archive.png', function(item, doc, unarch_item_id){
713 $.ajatus.document.actions.execute("archive", doc);
715 $.ajatus.toolbar.hide_item(item.id);
716 $.ajatus.toolbar.show_item(unarch_item_id);
717 }, [doc, unarch_id], unarch_id);
720 var arch_id = $.ajatus.toolbar.add_item($.ajatus.i10n.get('Archive'), 'archive.png', function(item, doc){
722 $.ajatus.document.actions.execute("archive", doc);
724 $.ajatus.toolbar.hide_item(item.id);
725 $.ajatus.toolbar.add_item($.ajatus.i10n.get('Restore'), 'undo.png', function(item, doc, arch_item_id){
727 $.ajatus.document.actions.execute("unarchive", doc);
729 $.ajatus.toolbar.hide_item(item.id);
730 $.ajatus.toolbar.show_item(arch_item_id);
731 }, [doc, arch_id], arch_id);
735 if (doc.value.metadata.deleted.val) {
736 var undel_id = $.ajatus.toolbar.add_item($.ajatus.i10n.get('Undelete'), 'undo.png', function(item, doc){
738 $.ajatus.document.actions.execute("undelete", doc);
741 $.ajatus.toolbar.hide_item(item.id);
742 $.ajatus.toolbar.add_item($.ajatus.i10n.get('Delete'), 'trash.png', function(item, doc, undel_item_id){
744 $.ajatus.document.actions.execute("delete", doc);
746 $.ajatus.toolbar.hide_item(item.id);
747 $.ajatus.toolbar.show_item(undel_item_id);
748 }, [d, undel_id], undel_id);
751 var del_id = $.ajatus.toolbar.add_item($.ajatus.i10n.get('Delete'), 'trash.png', function(item, doc){
753 $.ajatus.document.actions.execute("delete", doc);
756 $.ajatus.toolbar.hide_item(item.id);
757 $.ajatus.toolbar.add_item($.ajatus.i10n.get('Undelete'), 'undo.png', function(item, doc, del_item_id){
759 $.ajatus.document.actions.execute("undelete", doc);
761 $.ajatus.toolbar.hide_item(item.id);
762 $.ajatus.toolbar.show_item(del_item_id);
763 }, [d, del_id], del_id);
767 $.ajatus.toolbar.show();
769 var metadata_sb = new $.ajatus.renderer.blocks.sub('metadata_for_'+doc._id);
770 metadata_sb.set_title($.ajatus.i10n.get('Metadata'));
771 $.ajatus.views.on_change_actions.add('$.ajatus.renderer.blocks.clear_sub("'+metadata_sb.id+'");');
773 var md_renderer = new $.ajatus.renderer.metadata(doc, metadata_sb.element);
775 if (typeof doc.value.tags != 'undefined') {
776 var rel_docs = $.ajatus.tags.related(doc.value.tags.val, [doc._id]);
778 var related_sb = new $.ajatus.renderer.blocks.sub('related_objects');
779 related_sb.set_title($.ajatus.i10n.get('Related Objects'));
780 $.ajatus.views.on_change_actions.add('$.ajatus.renderer.blocks.clear_sub("'+related_sb.id+'");');
782 var tinylist = new $.ajatus.renderer.tinylist(related_sb.element);
783 tinylist.render_items(rel_docs);
786 if ( content_type.custom_renderer
787 && typeof(content_type.custom_renderer['item']) == 'function')
789 var renderer = content_type.custom_renderer.item();
791 var renderer = new $.ajatus.renderer.item(doc);
794 history_register: function() {
795 $.ajatus.history.add_dynamic_map(['view'], 3, '$.ajatus.views.system.item.history_render');
797 history_render: function() {
798 var type = arguments[0];
799 var id = arguments[1];
802 if ( typeof arguments[2] != 'undefined'
803 && arguments[2] != '')
825 if (typeof data['toSource'] != 'undefined') {
826 data = data.toSource();
829 setTimeout("$.ajatus.views.system.item.render("+data+");", 200);