seitime-frappe/js/wn/pages/doclistview.js
Rushabh Mehta 6dbd1a28b0 cleanups
2012-01-30 14:03:13 +05:30

301 lines
No EOL
7 KiB
JavaScript

wn.provide('wn.body');
wn.provide('wn.list_views');
wn.body.ListPage = function(doctype) {
wn.require('lib/css/body/list.css');
wn.require('lib/js/wn/body/tags.js');
wn.require('lib/js/wn/utils/datetime.js');
var me = this;
$.extend(this, {
make: function() {
// page
me.label = 'List/' + doctype;
wn.require('lib/js/wn/body/page.js');
me.page = new wn.body.Page(me.label, 1);
me.page.update_history = function() {
window.location.hash = 'List/' + encodeURIComponent(doctype);
}
var $w = $(me.page.wrapper);
$w.append("<div></div><div></div>")
me.page_head =
new wn.body.PageHead($w.find('> div:eq(0)').get(0),
wn.model.label_of(doctype) + ' List');
me.list =
new wn.body.List(me, $w.find('> div:eq(1)').get(0), doctype);
me.make_sidebar();
},
make_sidebar: function() {
me.page.sidebar.style.marginTop = '13px';
if(wn.profile.can_read.indexOf(doctype)!=-1) {
new wn.ui.Button({
parent: me.page.sidebar,
css_class: 'blue-pill',
label: '+ New ' + wn.model.label_of(doctype),
style: {fontSize:'11px', margin: '13px', marginTop:'0px'},
onclick: function() {
wn.open('Form', doctype);
}
})
}
// sidebar
wn.require('lib/js/wn/body/page_sidebar.js')
me.sidebar = new wn.body.page_sidebar.Sidebar(me.page.sidebar, {
sections: [
{
title: 'Top Tags',
render: function(body) {
new wn.body.tags.TagCloud(body, doctype, function(tag) {
me.set_tag_filter(tag) });
}
}
]
});
},
// add a filter when a tag is clicked
set_tag_filter: function(tag) {
me.list.flist.set_filter_display();
var l = tag.label;
if(tag.fieldname=='_user_tags') l = '%' + tag.label
me.list.flist.add_filter(tag.fieldname, 'like', l);
me.list.refresh();
}
});
me.make();
}
// args (list name)
wn.body.List = function(list_page, parent, doctype) {
var me = this;
me.start = 0;
me.page_len = 20;
$.extend(this, {
setup: function() {
wn.require('lib/js/wn/model/list.js');
// doctype for rendering
var dt = wn.model.get_doctype(doctype);
me.preloaded = wn.list.has(doctype);
// get the list
var res = wn.list.get(doctype, null, me.start, me.page_len, 1);
me.list = res.message || [];
if(res.list_view_js) {
eval('me.list_view_obj=' + res.list_view_js);
}
},
make: function() {
// body
me.make_body();
me.make_filters();
me.setup();
me.render(me.list);
if(me.preloaded)
me.reload();
},
make_body: function() {
// new / refresh area
me.toolbar_area = wn.dom.add(parent, 'div');
// list area
me.list_area = wn.dom.add(parent, 'div');
// more btn
me.more_btn_area = wn.dom.add(parent, 'div', 'more_btn_area');
me.nothing_more = wn.dom.add(parent, 'div', 'nothing_more round');
},
make_filters: function() {
me.filter_area = wn.dom.add(me.toolbar_area, 'div');
wn.require('lib/js/wn/body/filter.js');
me.flist = new wn.body.FilterList(me, me.filter_area, doctype);
},
reload: function() {
list_page.page_head.set_status('Checking for updates...');
wn.list.diff(doctype, (me.list.length ? me.list[0].modified : null),
me.render_reload);
},
render_reload: function(res) {
me.list = res.new_list;
me.list_area.innerHTML = ''
if(res.list_view_js) {
eval('me.list_view_obj=' + res.list_view_js);
}
me.render(me.list);
// update heading
list_page.page_head.set_status('');
},
refresh: function() {
// get the list
me.start = 0;
me.list = wn.list.get(doctype,
me.flist.get_filters(),
me.start, me.page_len);
me.render(me.list);
},
extend: function() {
me.start += me.page_len
var add = wn.list.get(doctype, me.flist.get_filters(), me.start, me.page_len);
me.list = me.list.concat(add);
me.render(add);
},
// render the list
render: function(list) {
if(me.start==0)
me.list_area.innerHTML = '';
$.each(list, function(i, d) {
d.doctype = doctype;
if(!d.__deleted)
new wn.body.ListItem(me, me.list_area, d);
});
// show filters, they may be hidden later
wn.dom.show(me.filter_area);
if(list.length >= me.page_len) {
me.show_more_btn();
} else {
me.hide_more_btn();
}
},
show_more_btn: function() {
if(!me.more_btn) {
me.more_btn = new wn.ui.Button({
parent: me.more_btn_area,
label: 'Show more results',
onclick: function() {
me.extend();
},
style: {
width: '200px',
fontSize:'14px'
}
})
}
wn.dom.show(me.more_btn_area);
wn.dom.hide(me.nothing_more);
},
hide_more_btn: function() {
wn.dom.hide(me.more_btn_area);
wn.dom.show(me.nothing_more);
if(me.list.length) {
me.nothing_more.innerHTML = 'Thats it';
} else {
me.nothing_more.innerHTML = 'No matches :( Try again.';
if(!me.flist.get_filters().length) {
wn.dom.hide(me.filter_area);
// new link
if(wn.profile.can_create.indexOf(doctype)!=-1) {
$(me.nothing_more).html('<div class="new_link">\
<span class="link_type" onclick="wn.open(\'Form\', \'%(doctype)s\')">\
Click here to create your first %(doctype_label)s\
</span>\
</div>'.repl({
doctype:doctype,
doctype_label: wn.model.label_of(doctype)
}));
}
}
}
}
});
me.make();
}
// title (link), owner, last update, delete / archive, tags
wn.body.ListItem = function(list, parent, args) {
var me = this;
$.extend(this, {
make: function() {
me.wrapper = wn.dom.add(parent, 'div', 'list_item');
me.wrapper.innerHTML = '<div>\
<span class="pre_subject"></span>\
<span class="link_type subject">%(label)s</span>\
<span class="post_subject"></span>\
<span class="wn-icon ic-round_minus delete_btn"></span>\
<span class="user_info">%(owner)s %(timestamp)s</span>\
</div>\
<div class="list_view"></div>'.repl({
label: args.label || args.name,
owner: args.owner,
timestamp: wn.utils.datetime.when(args.modified)
});
$w = $(me.wrapper);
// hide delete if no perms
if(!(wn.model.get_doctype(args.doctype).get_perm()[0] || {}).cancel) {
$w.find('.delete_btn').css('display','none');
} else {
$w.find('.delete_btn').click(function() {
wn.require('lib/js/wn/ui/confirm.js');
if(wn.ui.confirm('You sure you want to delete?', function() {
wn.http.post({
args: {
cmd:'webnotes.widgets.menus.delete_doc',
doctype:args.doctype,
name:args.name
}
});
$w.slideUp();
}));
})
}
// open
$w.find('.subject')
.bind('click', function() {
wn.open('Form', args.doctype, args.name);
});
// render body
me.render_body($w);
},
render_body: function($w) {
var lv = list.list_view_obj
if(lv) {
if(lv.subject) {
$w.find('.subject').html(lv.subject.repl(args));
}
if(lv.render) {
lv.render($w, args);
}
}
},
render_tag: function() {
}
});
me.make();
}