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_view: 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 $.ajatus.toolbar.add_item($.ajatus.i10n.get('New %s', [type.name]), {
134 icon: type.name+'-new.png',
136 $.ajatus.views.system.create.render(type);
140 $.ajatus.toolbar.show();
142 var renderer = new $.ajatus.renderer.list(
143 $.ajatus.application_content_area,
146 id: 'tags_list_holder',
148 'title', 'context', 'value', 'created', 'creator', 'used'
157 $.each(tags, function(i,doc){
158 var doc = new $.ajatus.document(doc);
159 doc.value['used'] = {
160 val: (typeof items[doc._id] != 'undefined' ? items[doc._id].length : 0)
162 renderer.render_item(doc, x);
166 renderer.enable_sorting();
168 $.ajatus.views.system.tags.get_duplicates(items);
171 render_duplicates: function(rows, items) {
172 var type = $.ajatus.preferences.client.content_types['tag'];
175 var duplicate_ids = [];
180 var real_hashes = [];
181 var false_hashes = {};
182 var broken_hashes = {};
185 var real_hashes_cnt = 0;
186 var false_hashes_cnt = 0;
188 $.each (rows, function(i,doc){
189 var doc = new $.ajatus.document(doc);
191 var tag_hash = $.ajatus.utils.md5.encode(doc.value.context.val + ':' + doc.key + '=' + doc.value.value.val);
193 hashes.push(tag_hash);
196 if (tag_hash == doc._id) {
197 real_hashes.push(tag_hash);
198 real_hashes_cnt += 1;
200 if (typeof false_hashes[tag_hash] == 'undefined') {
201 false_hashes[tag_hash] = [doc._id];
202 false_hashes_cnt += 1;
204 false_hashes[tag_hash].push(doc._id);
205 false_hashes_cnt += 1;
212 var duplicates_with = {};
213 var broken_hashes_cnt = 0;
214 var dublicate_cnt = 0;
216 $.each(false_hashes, function(hash,hids){
217 if (typeof duplicates_with[hash] == 'undefined') {
218 duplicates_with[hash] = [];
221 if (hids.length > 1) {
222 if ($.inArray(hash, real_hashes) != -1) {
223 duplicates_with[hash] = hids;
226 broken_hashes[hash] = hids;
227 broken_hashes_cnt += 1;
230 if ($.inArray(hash, real_hashes) != -1) {
231 duplicates_with[hash].push(hids[0]);
234 broken_hashes[hash] = hids;
235 broken_hashes_cnt += 1;
240 if (dublicate_cnt > 0) {
241 var drenderer = new $.ajatus.renderer.list(
242 $.ajatus.application_content_area,
245 id: 'tag_dups_list_holder',
246 title: $.ajatus.i10n.get("Duplicate"),
248 'title', 'context', 'value', 'creator', 'used'
251 item_id_suffix: '_duplicate',
253 className: 'list_holder duplicates_list'
259 $.each(duplicates_with, function(hash, dids){
260 for (var i=0; i<dids.length; i++) {
261 if (typeof tags[dids[i]] != 'undefined') {
262 var d = tags[dids[i]];
264 val: (typeof items[d._id] != 'undefined' ? items[d._id].length : 0)
266 d.value['real_hash'] = {
269 drenderer.render_item(d, x);
273 $.ajatus.debug("Couldn't find tag with id: "+dids[i]);
277 drenderer.enable_sorting();
279 var merger = new $.ajatus.tags.merger(dub_tags, duplicates_with, tags);
282 if (broken_hashes_cnt > 0) {
283 var brenderer = new $.ajatus.renderer.list(
284 $.ajatus.application_content_area,
287 id: 'tag_broken_list_holder',
288 title: $.ajatus.i10n.get("Broken"),
291 'title', 'context', 'value', 'curr_hash', 'real_hash', 'used'
295 label: 'Current hash'
302 item_id_suffix: '_broken',
304 className: 'list_holder broken_list'
308 var broken_tags = {};
310 $.each(broken_hashes, function(hash, dids){
311 for (var i=0; i<dids.length; i++) {
312 if (typeof tags[dids[i]] != 'undefined') {
313 var d = tags[dids[i]];
315 val: (typeof items[d._id] != 'undefined' ? items[d._id].length : 0)
317 d.value['curr_hash'] = {
320 d.value['real_hash'] = {
323 brenderer.render_item(d, x);
324 broken_tags[d._id] = d;
327 $.ajatus.debug("Couldn't find tag with id: "+dids[i]);
331 brenderer.enable_sorting();
333 var fixer = new $.ajatus.tags.fixer(broken_tags, broken_hashes, tags, {
335 refresh_on_finish: true
340 get_items: function(on_success) {
341 var conn_on_success = function(data) {
342 if (data.total_rows == 0) {
343 var key = $.ajatus.i10n.plural($.ajatus.i10n.get('tag'));
344 var msg = $.ajatus.elements.messages.static($.ajatus.i10n.get('Empty results'), $.ajatus.i10n.get('No %s found', [key]));
351 $.each(data.rows, function(i,n){
355 if (typeof items[n.key[0]] == 'undefined') {
356 items[n.key[0]] = [];
358 items[n.key[0]].push(n);
362 if (typeof on_success == 'undefined') {
363 on_success = $.ajatus.views.system.tags.render_results;
366 on_success(tags, items);
371 $.jqCouch.connection('view', conn_on_success).get($.ajatus.preferences.client.content_database, 'tag/list_with_docs', {
372 // startkey: ["ED862081B2FBF46FB0CDBBE848ED6856", 0],
373 // endkey: ["ED862081B2FBF46FB0CDBBE848ED6856", 1]
377 get_duplicates: function(items) {
378 var conn_on_success = function(data) {
379 if (data.total_rows == 0) {
380 var key = $.ajatus.i10n.plural($.ajatus.i10n.get('dublicate'));
381 var msg = $.ajatus.elements.messages.static($.ajatus.i10n.get('Empty results'), $.ajatus.i10n.get('No %s found', [key]));
385 if (typeof on_success == 'undefined') {
386 on_success = $.ajatus.views.system.tags.render_duplicates;
389 on_success(data.rows, items);
394 $.jqCouch.connection('view', conn_on_success).get($.ajatus.preferences.client.content_database, 'tag/list_by_title', {
399 $.ajatus.views.system.trash = {
405 application_view: true,
406 history_support: true,
410 on_click: function(e)
412 $.ajatus.tabs.on_click(e);
413 $.ajatus.views.system.trash.render();
417 get_items: function(on_success, limit) {
418 var trash_view = 'if (doc.value.metadata.deleted.val == true) {';
419 trash_view += 'map( doc.value.metadata.revised, {"_type": doc.value._type,';
420 trash_view += '"title": doc.value.title,';
422 if (typeof limit == 'undefined') {
426 $.each($.ajatus.preferences.client.content_types, function(key,type){
427 if (type['title_item']) {
428 $.each(type['title_item'], function(i,part){
429 if (type.schema[part]) {
430 trash_view += '"'+part+'": doc.value.'+part+',';
436 trash_view += '"revised": doc.value.metadata.revised,"by": doc.value.metadata.revisor,"tags": doc.value.tags})}';
438 var conn_on_success = function(data) {
439 if (data.total_rows == 0) {
440 var key = $.ajatus.i10n.plural($.ajatus.i10n.get('deleted item'));
441 var msg = $.ajatus.elements.messages.static($.ajatus.i10n.get('Empty results'), $.ajatus.i10n.get('No %s found', [key]));
445 if (typeof on_success == 'undefined') {
446 on_success = $.ajatus.views.system.trash.render_results;
449 on_success(data.rows);
454 $.jqCouch.connection('view', conn_on_success).temp($.ajatus.preferences.client.content_database, "$.ajatus.views.generate('"+trash_view+"')", {
455 count: $.ajatus.views.system.trash.options.group_item_count,
459 $.jqCouch.connection('view', conn_on_success).temp($.ajatus.preferences.client.content_database, "$.ajatus.views.generate('"+trash_view+"')", {
467 $.ajatus.application_content_area.html('');
468 $.ajatus.layout.body.set_class('trash');
469 $.ajatus.views.on_change("#view.trash");
471 $.ajatus.toolbar.init();
472 $.ajatus.toolbar.show();
474 $.ajatus.views.system.trash.get_items();
477 render_results: function(rows)
479 var result_count = {};
480 var show_empty_trash = false;
482 $.each($.ajatus.preferences.client.content_types, function(key,type){
483 if (!type.views['list']) {
487 var trash_type_count_view = 'if (doc.value.metadata.deleted.val == true && doc.value._type == "'+type.name+'") {';
488 trash_type_count_view += 'map( doc._id, {"_type": doc.value._type});}';
490 total_trashed_count = $.jqCouch.connection('view').temp($.ajatus.preferences.client.content_database, "$.ajatus.views.generate('"+trash_type_count_view+"')", {
494 result_count[type.name] = 0;
496 $.each(rows, function(i,doc){
497 if (doc.value._type == type.name) {
498 result_count[type.name] += 1;
502 if (result_count[type.name] == 0) {
506 show_empty_trash = true;
508 var renderer = new $.ajatus.renderer.list(
509 $.ajatus.application_content_area,
512 id: type.name + '_list_holder',
515 title_suffix: '('+total_trashed_count+')',
517 'title', 'revised', 'by'
527 $.each(rows, function(i,doc){
528 if (doc.value._type == type.name) {
529 var doc = new $.ajatus.document(doc);
531 renderer.set_actions(
535 title: $.ajatus.i10n.get('View'),
537 click_action: '$.ajatus.views.system.item.render(doc);'
541 title: $.ajatus.i10n.get('Undelete'),
543 click_action: '$.ajatus.document.actions.execute("undelete", doc);'
546 name: 'delete_final',
547 title: $.ajatus.i10n.get('Delete'),
549 click_action: '$.ajatus.document.actions.execute("delete_final", doc);'
553 renderer.render_item(doc, i);
557 renderer.enable_sorting();
560 if (show_empty_trash) {
561 $.ajatus.toolbar.add_item($.ajatus.i10n.get('Empty trash'), 'trash.png', function(){
562 $.ajatus.views.system.trash.empty();
567 var answer = confirm($.ajatus.i10n.get("Deleting all items in trash. Are you sure?"));
569 $.ajatus.views.system.trash.get_items($.ajatus.views.system.trash.execute_empty, false);
572 execute_empty: function(rows) {
573 $.each(rows, function(i,doc){
574 doc = new $.ajatus.document(doc);
575 $.ajatus.document.actions.execute("delete_final", doc);
579 $.ajatus.views.system.edit = {
584 dynamic_history: true
586 $.extend($.ajatus.views.system.edit, {
587 render: function(type, doc, use_given_doc)
589 if (typeof use_given_doc == 'undefined') {
590 use_given_doc = false;
593 var content_type = type;
595 if (! use_given_doc) {
596 var doc = new $.ajatus.document.loader(doc._id, doc._rev);
600 content_type = $.ajatus.preferences.client.content_types[doc.value._type];
603 if (typeof(type) == 'string') {
604 content_type = $.ajatus.preferences.client.content_types[type];
607 $.ajatus.layout.body.set_class('edit '+content_type.name);
609 var view_hash = '#edit.'+doc.value._type+'.'+doc._id+'.'+doc._rev;
610 $.ajatus.history.update(view_hash);
611 $.ajatus.views.on_change(view_hash);
613 var latest_rev = $.ajatus.document.revisions.get(doc).active.rev;
615 if ( content_type.custom_renderer
616 && typeof(content_type.custom_renderer['edit']) == 'function')
618 var renderer = content_type.custom_renderer.edit(doc, latest_rev);
620 var renderer = new $.ajatus.renderer.form(content_type, doc, false, latest_rev);
621 $.ajatus.application_content_area.html(renderer.form);
622 $.ajatus.forms.register.normal(renderer.form, 'edit');
625 history_register: function() {
626 $.ajatus.history.add_dynamic_map(['edit'], 3, '$.ajatus.views.system.edit.history_render');
628 history_render: function() {
629 var type = arguments[0];
630 var id = arguments[1];
633 if ( typeof arguments[2] != 'undefined'
634 && arguments[2] != '')
639 var doc = new $.ajatus.document.loader(id, rev);
640 $.ajatus.views.system.edit.render(type, doc);
644 $.ajatus.views.system.create = {
649 dynamic_history: true
651 $.extend($.ajatus.views.system.create, {
652 render: function(type, doc)
654 var content_type = type;
656 if (typeof(type) == 'string') {
657 content_type = $.ajatus.preferences.client.content_types[type];
660 $.ajatus.layout.body.set_class('create '+content_type.name);
662 var view_hash = '#create.'+content_type.name;
664 $.ajatus.history.update(view_hash);
666 $.ajatus.views.on_change(view_hash);
668 if ( content_type.custom_renderer
669 && typeof(content_type.custom_renderer['create']) == 'function')
671 var renderer = content_type.custom_renderer.create();
673 var renderer = new $.ajatus.renderer.form(content_type, doc, true);
674 $.ajatus.application_content_area.html(renderer.form);
675 $.ajatus.forms.register.normal(renderer.form, 'create');
678 history_register: function() {
679 $.ajatus.history.add_dynamic_map(['create'], 2, '$.ajatus.views.system.create.history_render');
681 history_render: function() {
682 var type = arguments[0];
684 $.ajatus.views.system.create.render(type);
688 $.ajatus.views.system.item = {
693 dynamic_history: true
695 $.extend($.ajatus.views.system.item, {
696 render: function(doc)
698 if (typeof doc._rev != 'undefined') {
699 var doc = new $.ajatus.document.loader(doc._id, doc._rev);
701 var doc = new $.ajatus.document.loader(doc._id);
704 var content_type = $.ajatus.preferences.client.content_types[doc.value._type];
706 $.ajatus.layout.body.set_class('view '+doc.value._type);
708 var view_hash = '#view.'+doc.value._type+'.'+doc._id+'.'+doc._rev;
709 $.ajatus.history.update(view_hash);
710 $.ajatus.views.on_change(view_hash);
712 $.ajatus.toolbar.add_item($.ajatus.i10n.get('Edit'), {
715 $.ajatus.views.system.edit.render(content_type, doc);
720 if (doc.value.metadata.archived.val) {
721 var unarch_id = $.ajatus.toolbar.add_item($.ajatus.i10n.get('Restore'), 'undo.png', function(item, doc){
723 $.ajatus.document.actions.execute("unarchive", doc);
725 $.ajatus.toolbar.hide_item(item.id);
726 $.ajatus.toolbar.add_item($.ajatus.i10n.get('Archive'), 'archive.png', function(item, doc, unarch_item_id){
728 $.ajatus.document.actions.execute("archive", doc);
730 $.ajatus.toolbar.hide_item(item.id);
731 $.ajatus.toolbar.show_item(unarch_item_id);
732 }, [doc, unarch_id], unarch_id);
735 var arch_id = $.ajatus.toolbar.add_item($.ajatus.i10n.get('Archive'), 'archive.png', function(item, doc){
737 $.ajatus.document.actions.execute("archive", doc);
739 $.ajatus.toolbar.hide_item(item.id);
740 $.ajatus.toolbar.add_item($.ajatus.i10n.get('Restore'), 'undo.png', function(item, doc, arch_item_id){
742 $.ajatus.document.actions.execute("unarchive", doc);
744 $.ajatus.toolbar.hide_item(item.id);
745 $.ajatus.toolbar.show_item(arch_item_id);
746 }, [doc, arch_id], arch_id);
750 if (doc.value.metadata.deleted.val) {
751 var undel_id = $.ajatus.toolbar.add_item($.ajatus.i10n.get('Undelete'), 'undo.png', function(item, doc){
753 $.ajatus.document.actions.execute("undelete", doc);
756 $.ajatus.toolbar.hide_item(item.id);
757 $.ajatus.toolbar.add_item($.ajatus.i10n.get('Delete'), 'trash.png', function(item, doc, undel_item_id){
759 $.ajatus.document.actions.execute("delete", doc);
761 $.ajatus.toolbar.hide_item(item.id);
762 $.ajatus.toolbar.show_item(undel_item_id);
763 }, [d, undel_id], undel_id);
766 var del_id = $.ajatus.toolbar.add_item($.ajatus.i10n.get('Delete'), 'trash.png', function(item, doc){
768 $.ajatus.document.actions.execute("delete", doc);
771 $.ajatus.toolbar.hide_item(item.id);
772 $.ajatus.toolbar.add_item($.ajatus.i10n.get('Undelete'), 'undo.png', function(item, doc, del_item_id){
774 $.ajatus.document.actions.execute("undelete", doc);
776 $.ajatus.toolbar.hide_item(item.id);
777 $.ajatus.toolbar.show_item(del_item_id);
778 }, [d, del_id], del_id);
782 $.ajatus.toolbar.show();
784 var metadata_sb = new $.ajatus.renderer.blocks.sub('metadata_for_'+doc._id);
785 metadata_sb.set_title($.ajatus.i10n.get('Metadata'));
786 $.ajatus.views.on_change_actions.add('$.ajatus.renderer.blocks.clear_sub("'+metadata_sb.id+'");');
788 var md_renderer = new $.ajatus.renderer.metadata(doc, metadata_sb.element);
790 if (typeof doc.value.tags != 'undefined') {
791 var rel_docs = $.ajatus.tags.related(doc.value.tags.val, [doc._id]);
793 var related_sb = new $.ajatus.renderer.blocks.sub('related_objects');
794 related_sb.set_title($.ajatus.i10n.get('Related Objects'));
795 $.ajatus.views.on_change_actions.add('$.ajatus.renderer.blocks.clear_sub("'+related_sb.id+'");');
797 var tinylist = new $.ajatus.renderer.tinylist(related_sb.element);
798 tinylist.render_items(rel_docs);
801 if ( content_type.custom_renderer
802 && typeof(content_type.custom_renderer['item']) == 'function')
804 var renderer = content_type.custom_renderer.item();
806 var renderer = new $.ajatus.renderer.item(doc);
809 history_register: function() {
810 $.ajatus.history.add_dynamic_map(['view'], 3, '$.ajatus.views.system.item.history_render');
812 history_render: function() {
813 var type = arguments[0];
814 var id = arguments[1];
817 if ( typeof arguments[2] != 'undefined'
818 && arguments[2] != '')
840 if (typeof data['toSource'] != 'undefined') {
841 data = data.toSource();
844 setTimeout("$.ajatus.views.system.item.render("+data+");", 200);