// Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
// MIT License. See license.txt
wn.views.get_listview = function(doctype, parent) {
if(wn.doclistviews[doctype]) {
var listview = new wn.doclistviews[doctype](parent);
} else {
var listview = new wn.views.ListView(parent, doctype);
}
return listview;
}
wn.provide("wn.listview_settings");
wn.views.ListView = Class.extend({
init: function(doclistview, doctype) {
this.doclistview = doclistview;
this.doctype = doctype;
this.settings = wn.listview_settings[this.doctype] || {};
this.set_fields();
this.set_columns();
this.id_list = [];
if(this.settings.group_by)
this.group_by = this.settings.group_by;
var me = this;
this.doclistview.onreset = function() {
me.id_list = [];
}
},
set_fields: function() {
var me = this;
var t = "`tab"+this.doctype+"`.";
this.fields = [];
this.stats = ['_user_tags'];
var add_field = function(fieldname) {
field = t + "`" + fieldname + "`"
if(me.fields.indexOf(field)=== -1)
me.fields.push(field);
}
$.each(['name', 'owner', 'docstatus', '_user_tags', '_comments', 'modified',
'modified_by'], function(i, fieldname) { add_field(fieldname); })
// add title field
var meta = wn.model.get("DocType", this.doctype)[0];
if(meta.title_field) {
this.title_field = meta.title_field;
add_field(meta.title_field);
}
// add workflow field (as priority)
this.workflow_state_fieldname = wn.workflow.get_state_fieldname(this.doctype);
if(this.workflow_state_fieldname) {
add_field(this.workflow_state_fieldname);
this.stats.push(this.workflow_state_fieldname);
}
$.each(wn.model.get("DocField", {"parent":this.doctype, "in_list_view":1}), function(i,d) {
if(wn.perm.has_perm(me.doctype, d.permlevel, "read")) {
if(d.fieldtype=="Image" && d.options) {
add_field(d.options);
} else {
add_field(d.fieldname);
}
if(d.fieldtype=="Select") {
if(me.stats.indexOf(d.fieldname)===-1) me.stats.push(d.fieldname);
}
// currency field for symbol (multi-currency)
if(d.fieldtype=="Currency" && d.options) {
if(d.options.indexOf(":")!=-1) {
add_field(d.options.split(":")[1]);
} else {
add_field(d.options);
};
}
}
});
// additional fields
if(this.settings.add_fields) {
$.each(this.settings.add_fields, function(i, d) {
if(me.fields.indexOf(d)==-1)
me.fields.push(d);
});
}
},
set_columns: function() {
this.columns = [];
this.total_colspans = 0;
var me = this;
if(this.workflow_state_fieldname) {
this.columns.push({
colspan: 3,
content: this.workflow_state_fieldname,
type:"select"
});
}
// overridden
var overridden = $.map(this.settings.add_columns || [], function(d) {
return d.content;
});
var docfields_in_list_view = wn.model.get("DocField", {"parent":this.doctype,
"in_list_view":1}).sort(function(a, b) { return a.idx - b.idx })
$.each(docfields_in_list_view, function(i,d) {
if(in_list(overridden, d.fieldname) || d.fieldname === me.title_field) {
return;
}
// field width
var colspan = "3";
if(in_list(["Int", "Percent", "Select"], d.fieldtype)) {
colspan = "2";
} else if(d.fieldtype=="Check") {
colspan = "1";
} else if(in_list(["name", "subject", "title"], d.fieldname)) { // subjects are longer
colspan = "4";
} else if(d.fieldtype=="Text Editor" || d.fieldtype=="Text") {
colspan = "4";
}
me.total_colspans += parseInt(colspan);
me.columns.push({colspan: colspan, content: d.fieldname,
type:d.fieldtype, df:d, title:wn._(d.label) });
});
// additional columns
if(this.settings.add_columns) {
$.each(this.settings.add_columns, function(i, d) {
me.columns.push(d);
me.total_colspans += parseInt(d.colspan);
});
}
var empty_cols = flt(12 - this.total_colspans);
this.shift_right = cint(empty_cols * 0.6667);
if(this.shift_right < 0) {
this.shift_right = 0;
} else if (this.shift_right > 1) {
// expand each column so that it fills up empty_cols
$.each(this.columns, function(i, c) {
c.colspan = cint(empty_cols / me.columns.length) + cint(c.colspan);
})
}
},
render: function(row, data) {
this.prepare_data(data);
//$(row).removeClass("list-row");
// maintain id_list to avoid duplication incase
// of filtering by child table
if(in_list(this.id_list, data.name)) {
return;
} else {
this.id_list.push(data.name);
}
var left_cols = 4 + this.shift_right, right_cols = 8 - this.shift_right;
var body = $('
').appendTo($(row).css({"position":"relative"})),
colspans = 0,
me = this;
me.render_avatar_and_id(data, body.find(".list-row-id-area"))
// make table
$.each(this.columns, function(i, v) {
var colspan = v.colspan || 3;
colspans = colspans + flt(colspan)
if(colspans <= 12) {
var col = me.make_column(body.find(".list-row-content-area"), colspan);
me.render_column(data, col, v);
}
});
var comments = data._comments ? JSON.parse(data._comments) : [];
var tags = $.map((data._user_tags || "").split(","), function(v) { return v ? v : null; });
var timestamp_and_comment =
$('')
.appendTo(row)
.html(""
+ (tags.length ? (
'
' + tags.join(", ") + ''
): "")
+ (comments.length ?
('
'
+ comments.length + " " + (
comments.length===1 ? wn._("comment") : wn._("comments")) + '')
: "")
+ comment_when(data.modified));
// row #2
var row2 = $('
').appendTo(row);
// modified
body.find(".list-last-modified").html(wn._("Last updated by") + ": " + wn.user_info(data.modified_by).fullname);
if(!me.doclistview.tags_shown) {
row2.addClass("hide");
}
// add tags
var tag_editor = new wn.ui.TagEditor({
parent: row2.find(".list-tag"),
frm: {
doctype: this.doctype,
docname: data.name
},
user_tags: data._user_tags
});
tag_editor.$w.on("click", ".tagit-label", function() {
me.doclistview.set_filter("_user_tags",
$(this).text());
});
},
make_column: function(body, colspan) {
var col = $("
")
.appendTo(body)
.addClass("col-sm-" + cint(colspan))
.css({
"white-space": "nowrap",
"text-overflow": "ellipsis",
"height": "30px",
"padding-top":"3px"
})
return col;
},
render_avatar_and_id: function(data, parent) {
if((wn.model.can_delete(this.doctype) || this.settings.selectable) && !this.no_delete) {
$('
')
.data('name', data.name)
.data('data', data)
.css({"margin-right": "5px"})
.appendTo(parent)
}
var $avatar = $(wn.avatar(data.modified_by, false, wn._("Modified by")+": "
+ wn.user_info(data.modified_by).fullname))
.appendTo(parent)
.css({"max-width": "100%"})
if(wn.model.is_submittable(this.doctype)) {
$(parent).append(repl('
\
', data));
}
var title = data[this.title_field || "name"];
$("
")
.attr("href", "#Form/" + data.doctype + "/" + encodeURIComponent(data.name))
.html(title)
.appendTo(parent.css({"overflow":"hidden"}));
parent.attr("title", title).tooltip();
},
render_column: function(data, parent, opts) {
var me = this;
if(opts.type) opts.type= opts.type.toLowerCase();
// style
if(opts.css) {
$.each(opts.css, function(k, v) { $(parent).css(k, v)});
}
// multiple content
if(opts.content.indexOf && opts.content.indexOf('+')!=-1) {
$.map(opts.content.split('+'), function(v) {
me.render_column(data, parent, {content:v, title: opts.title});
});
return;
}
// content
if(typeof opts.content=='function') {
opts.content(parent, data, me);
}
else if(opts.content=='check') {
}
else if(opts.type=='bar-graph' || opts.type=="percent") {
this.render_bar_graph(parent, data, opts.content, opts.label);
}
else if(opts.template) {
$(parent).append(repl(opts.template, data));
}
else if(opts.type=="date" && data[opts.content]) {
$("")
.html(wn.datetime.str_to_user(data[opts.content]))
.css({"color":"#888"})
.appendTo(parent);
}
else if(opts.type=="image") {
data[opts.content] = data[opts.df.options];
if(data[opts.content])
$("
")
.attr("src", wn.utils.get_file_link(data[opts.content]))
.css({
"max-width": "100%",
"max-height": "30px"
})
.appendTo(parent);
}
else if(opts.type=="select" && data[opts.content]) {
var label_class = "label-default";
var style = wn.utils.guess_style(data[opts.content]);
if(style) label_class = "label-" + style;
$(""
+ data[opts.content] + "")
.css({"cursor":"pointer"})
.addClass("label")
.addClass(label_class)
.attr("data-fieldname", opts.content)
.click(function() {
me.doclistview.set_filter($(this).attr("data-fieldname"),
$(this).text());
})
.appendTo(parent.css({"overflow":"hidden"}));
}
else if(opts.type=="link" && data[opts.content]) {
$("")
.html(wn.format(data[opts.content], opts.df, null, data))
.appendTo(parent.css({"overflow":"hidden"}))
.click(function() {
me.doclistview.set_filter($(this).attr("data-fieldname"),
$(this).attr("data-value"));
return false;
})
.attr("data-fieldname", opts.content)
.attr("data-value", data[opts.content])
.find("a").attr("href", "#");
}
else if(data[opts.content]) {
$("")
.html(wn.format(data[opts.content], opts.df, null, data))
.appendTo(parent.css({"overflow":"hidden"}))
}
// finally
if(!$(parent).html()) {
$("-").css({color:"#ccc"}).appendTo(parent);
}
// title
if(!in_list(["avatar", "_user_tags", "check"], opts.content)) {
if($(parent).attr("title")==undefined) {
$(parent).attr("title", (opts.title || opts.content) + ": "
+ (data[opts.content] || "Not Set"))
}
$(parent).tooltip();
}
},
show_hide_check_column: function() {
if(!this.doclistview.can_delete) {
this.columns = $.map(this.columns, function(v, i) { if(v.content!='check') return v });
}
},
prepare_data: function(data) {
if(data.modified)
this.prepare_when(data, data.modified);
// docstatus
if(data.docstatus==0 || data.docstatus==null) {
data.docstatus_icon = 'icon-check-empty';
data.docstatus_title = wn._('Editable');
} else if(data.docstatus==1) {
data.docstatus_icon = 'icon-lock';
data.docstatus_title = wn._('Submitted');
} else if(data.docstatus==2) {
data.docstatus_icon = 'icon-remove';
data.docstatus_title = wn._('Cancelled');
}
// nulls as strings
for(key in data) {
if(data[key]==null) {
data[key]='';
}
}
// prepare data in settings
if(this.settings.prepare_data)
this.settings.prepare_data(data);
},
prepare_when: function(data, date_str) {
if (!date_str) date_str = data.modified;
// when
data.when = (dateutil.str_to_user(date_str)).split(' ')[0];
var diff = dateutil.get_diff(dateutil.get_today(), date_str.split(' ')[0]);
if(diff==0) {
data.when = dateutil.comment_when(date_str);
}
if(diff == 1) {
data.when = wn._('Yesterday')
}
if(diff == 2) {
data.when = wn._('2 days ago')
}
},
render_bar_graph: function(parent, data, field, label) {
var args = {
percent: data[field],
label: label
}
$(parent).append(repl(' \
\
', args));
},
render_icon: function(parent, icon_class, label) {
var icon_html = "";
$(parent).append(repl(icon_html, {icon_class: icon_class, label: label || ''}));
}
});
// embeddable
wn.provide('wn.views.RecordListView');
wn.views.RecordListView = wn.views.DocListView.extend({
init: function(doctype, wrapper, ListView) {
this.doctype = doctype;
this.wrapper = wrapper;
this.listview = new ListView(this, doctype);
this.listview.parent = this;
this.setup();
},
setup: function() {
var me = this;
me.page_length = 10;
$(me.wrapper).empty();
me.init_list();
},
get_args: function() {
var args = this._super();
$.each((this.default_filters || []), function(i, f) {
args.filters.push(f);
});
args.docstatus = args.docstatus.concat((this.default_docstatus || []));
return args;
},
});