@@ -12,7 +12,10 @@ class DocType: | |||||
if webnotes.conn.sql("""select count(*) from tabComment where comment_doctype=%s | if webnotes.conn.sql("""select count(*) from tabComment where comment_doctype=%s | ||||
and comment_docname=%s""", (self.doc.doctype, self.doc.name))[0][0] >= 50: | and comment_docname=%s""", (self.doc.doctype, self.doc.name))[0][0] >= 50: | ||||
webnotes.msgprint("Max Comments reached!", raise_exception=True) | webnotes.msgprint("Max Comments reached!", raise_exception=True) | ||||
def on_update(self): | |||||
self.update_comment_in_doc() | |||||
def update_comment_in_doc(self): | def update_comment_in_doc(self): | ||||
if self.doc.comment_doctype and self.doc.comment_docname and self.doc.comment: | if self.doc.comment_doctype and self.doc.comment_docname and self.doc.comment: | ||||
try: | try: | ||||
@@ -539,6 +539,13 @@ ul.linked-with-list li { | |||||
display: none; | display: none; | ||||
} | } | ||||
.ui-autocomplete { | |||||
max-height: 200px; | |||||
overflow-y: auto; | |||||
overflow-x: hidden; | |||||
} | |||||
@media (min-width: 768px) { | @media (min-width: 768px) { | ||||
.hidden-xs-inline { | .hidden-xs-inline { | ||||
display: inline; | display: inline; | ||||
@@ -107,18 +107,19 @@ wn.ui.Filter = Class.extend({ | |||||
this.$w = this.flist.$w.find('.list_filter:last-child'); | this.$w = this.flist.$w.find('.list_filter:last-child'); | ||||
}, | }, | ||||
make_select: function() { | make_select: function() { | ||||
this.fieldselect = new wn.ui.FieldSelect(this.$w.find('.fieldname_select_area'), | |||||
this.doctype, this.filter_fields); | |||||
var me = this; | |||||
this.fieldselect = new wn.ui.FieldSelect({ | |||||
parent: this.$w.find('.fieldname_select_area'), | |||||
doctype: this.doctype, | |||||
filter_fields: this.filter_fields, | |||||
select: function(doctype, fieldname) { | |||||
me.set_field(doctype, fieldname); | |||||
} | |||||
}); | |||||
}, | }, | ||||
set_events: function() { | set_events: function() { | ||||
var me = this; | var me = this; | ||||
// render fields | |||||
this.fieldselect.$select.bind('change', function() { | |||||
var $selected = $(this).find("option:selected") | |||||
me.set_field($selected.attr("table"), $selected.attr("fieldname")); | |||||
}); | |||||
this.$w.find('a.close').bind('click', function() { | this.$w.find('a.close').bind('click', function() { | ||||
me.$w.css('display','none'); | me.$w.css('display','none'); | ||||
var value = me.field.get_parsed_value(); | var value = me.field.get_parsed_value(); | ||||
@@ -167,7 +168,7 @@ wn.ui.Filter = Class.extend({ | |||||
if(value!=null) this.field.set_input(value); | if(value!=null) this.field.set_input(value); | ||||
}, | }, | ||||
set_field: function(tablename, fieldname, fieldtype, condition) { | |||||
set_field: function(doctype, fieldname, fieldtype, condition) { | |||||
var me = this; | var me = this; | ||||
// set in fieldname (again) | // set in fieldname (again) | ||||
@@ -177,7 +178,15 @@ wn.ui.Filter = Class.extend({ | |||||
parent: me.field.df.parent, | parent: me.field.df.parent, | ||||
} : {} | } : {} | ||||
var df = copy_dict(me.fieldselect.fields_by_name[tablename][fieldname]); | |||||
var original_docfield = me.fieldselect.fields_by_name[doctype][fieldname]; | |||||
if(!original_docfield) { | |||||
msgprint("Field " + df.label + " is not selectable."); | |||||
return; | |||||
} | |||||
var df = copy_dict(me.fieldselect.fields_by_name[doctype][fieldname]); | |||||
this.set_fieldtype(df, fieldtype); | this.set_fieldtype(df, fieldtype); | ||||
// called when condition is changed, | // called when condition is changed, | ||||
@@ -188,12 +197,8 @@ wn.ui.Filter = Class.extend({ | |||||
} | } | ||||
// clear field area and make field | // clear field area and make field | ||||
me.fieldselect.$select.val(tablename + "." + fieldname); | |||||
if(me.fieldselect.$select.val() != tablename + "." + fieldname) { | |||||
msgprint("Field " + df.label + " is not selectable."); | |||||
return; | |||||
} | |||||
me.fieldselect.selected_doctype = doctype; | |||||
me.fieldselect.selected_fieldname = fieldname; | |||||
// save old text | // save old text | ||||
var old_text = null; | var old_text = null; | ||||
@@ -215,6 +220,7 @@ wn.ui.Filter = Class.extend({ | |||||
if(!condition) this.set_default_condition(df, fieldtype); | if(!condition) this.set_default_condition(df, fieldtype); | ||||
// run on enter | |||||
$(me.field.wrapper).find(':input').keydown(function(ev) { | $(me.field.wrapper).find(':input').keydown(function(ev) { | ||||
if(ev.which==13) { | if(ev.which==13) { | ||||
me.flist.listobj.run(); | me.flist.listobj.run(); | ||||
@@ -275,7 +281,7 @@ wn.ui.Filter = Class.extend({ | |||||
} | } | ||||
} else if(val === '%') val = null; | } else if(val === '%') val = null; | ||||
return [me.fieldselect.$select.find('option:selected').attr('table'), | |||||
return [me.fieldselect.selected_doctype, | |||||
me.field.df.fieldname, me.$w.find('.condition').val(), val]; | me.field.df.fieldname, me.$w.find('.condition').val(), val]; | ||||
} | } | ||||
@@ -283,17 +289,73 @@ wn.ui.Filter = Class.extend({ | |||||
// <select> widget with all fields of a doctype as options | // <select> widget with all fields of a doctype as options | ||||
wn.ui.FieldSelect = Class.extend({ | wn.ui.FieldSelect = Class.extend({ | ||||
init: function(parent, doctype, filter_fields, with_blank) { | |||||
this.doctype = doctype; | |||||
// opts parent, doctype, filter_fields, with_blank, select | |||||
init: function(opts) { | |||||
$.extend(this, opts); | |||||
this.fields_by_name = {}; | this.fields_by_name = {}; | ||||
this.with_blank = with_blank; | |||||
this.$select = $('<select class="form-control">').appendTo(parent); | |||||
if(filter_fields) { | |||||
for(var i in filter_fields) | |||||
this.options = []; | |||||
this.$select = $('<input class="form-control">').appendTo(this.parent); | |||||
var me = this; | |||||
this.$select.autocomplete({ | |||||
source: me.options, | |||||
minLength: 0, | |||||
focus: function(event, ui) { | |||||
me.$select.val(ui.item.label); | |||||
return false; | |||||
}, | |||||
select: function(event, ui) { | |||||
me.selected_doctype = ui.item.doctype; | |||||
me.selected_fieldname = ui.item.fieldname; | |||||
me.$select.val(ui.item.label); | |||||
if(me.select) me.select(ui.item.doctype, ui.item.fieldname); | |||||
return false; | |||||
} | |||||
}); | |||||
if(this.filter_fields) { | |||||
for(var i in this.filter_fields) | |||||
this.add_field_option(this.filter_fields[i]) | this.add_field_option(this.filter_fields[i]) | ||||
} else { | } else { | ||||
this.build_options(); | this.build_options(); | ||||
} | } | ||||
this.set_value(this.doctype, "name"); | |||||
window.last_filter = this; | |||||
}, | |||||
get_value: function() { | |||||
return this.selected_doctype ? this.selected_doctype + "." + this.selected_fieldname : null; | |||||
}, | |||||
val: function(value) { | |||||
if(value===undefined) { | |||||
return this.get_value() | |||||
} else { | |||||
this.set_value(value) | |||||
} | |||||
}, | |||||
clear: function() { | |||||
this.selected_doctype = null; | |||||
this.selected_fieldname = null; | |||||
this.$select.val(""); | |||||
}, | |||||
set_value: function(doctype, fieldname) { | |||||
var me = this; | |||||
this.clear(); | |||||
if(!doctype) return; | |||||
// old style | |||||
if(doctype.indexOf(".")!==-1) { | |||||
parts = doctype.split("."); | |||||
doctype = parts[0]; | |||||
fieldname = parts[1]; | |||||
} | |||||
$.each(this.options, function(i, v) { | |||||
if(v.doctype===doctype && v.fieldname===fieldname) { | |||||
me.selected_doctype = doctype; | |||||
me.selected_fieldname = fieldname; | |||||
me.$select.val(v.label); | |||||
return false; | |||||
} | |||||
}); | |||||
}, | }, | ||||
build_options: function() { | build_options: function() { | ||||
var me = this; | var me = this; | ||||
@@ -317,9 +379,10 @@ wn.ui.FieldSelect = Class.extend({ | |||||
// blank | // blank | ||||
if(this.with_blank) { | if(this.with_blank) { | ||||
this.$select.append($('<option>', { | |||||
value: '' | |||||
}).text('')); | |||||
this.options.push({ | |||||
label:"", | |||||
value:"", | |||||
}) | |||||
} | } | ||||
// main table | // main table | ||||
@@ -353,11 +416,12 @@ wn.ui.FieldSelect = Class.extend({ | |||||
} | } | ||||
if(wn.model.no_value_type.indexOf(df.fieldtype)==-1 && | if(wn.model.no_value_type.indexOf(df.fieldtype)==-1 && | ||||
!(me.fields_by_name[df.parent] && me.fields_by_name[df.parent][df.fieldname])) { | !(me.fields_by_name[df.parent] && me.fields_by_name[df.parent][df.fieldname])) { | ||||
this.$select.append($('<option>', { | |||||
value: table + "." + df.fieldname, | |||||
fieldname: df.fieldname, | |||||
table: df.parent | |||||
}).text(wn._(label))); | |||||
this.options.push({ | |||||
label: wn._(label), | |||||
value: table + "." + df.fieldname, | |||||
fieldname: df.fieldname, | |||||
doctype: df.parent | |||||
}) | |||||
if(!me.fields_by_name[df.parent]) me.fields_by_name[df.parent] = {}; | if(!me.fields_by_name[df.parent]) me.fields_by_name[df.parent] = {}; | ||||
me.fields_by_name[df.parent][df.fieldname] = df; | me.fields_by_name[df.parent][df.fieldname] = df; | ||||
} | } | ||||
@@ -189,13 +189,15 @@ wn.views.ReportView = wn.ui.Listing.extend({ | |||||
return order_by; | return order_by; | ||||
}, | }, | ||||
get_selected_table_and_column: function($select) { | |||||
return this.get_full_column_name([$select.find('option:selected').attr('fieldname'), | |||||
$select.find('option:selected').attr('table')]) | |||||
get_selected_table_and_column: function(select) { | |||||
return select.selected_doctype ? | |||||
this.get_full_column_name([select.selected_fieldname, select.selected_doctype]) : ""; | |||||
}, | }, | ||||
// get table_name.column_name | // get table_name.column_name | ||||
get_full_column_name: function(v) { | get_full_column_name: function(v) { | ||||
if(!v) return; | |||||
return (v[1] ? ('`tab' + v[1] + '`') : this.tab_name) + '.' + v[0]; | return (v[1] ? ('`tab' + v[1] + '`') : this.tab_name) + '.' + v[0]; | ||||
}, | }, | ||||
@@ -415,22 +417,27 @@ wn.views.ReportView = wn.ui.Listing.extend({ | |||||
<div><button class="btn btn-info">'+wn._('Update')+'</div>'); | <div><button class="btn btn-info">'+wn._('Update')+'</div>'); | ||||
// first | // first | ||||
this.sort_by_select = new wn.ui.FieldSelect($(this.sort_dialog.body).find('.sort-column'), | |||||
this.doctype).$select; | |||||
this.sort_by_select.css('width', '60%'); | |||||
this.sort_by_select = new wn.ui.FieldSelect({ | |||||
parent: $(this.sort_dialog.body).find('.sort-column'), | |||||
doctype: this.doctype | |||||
}); | |||||
this.sort_by_select.$select.css('width', '60%'); | |||||
this.sort_order_select = $(this.sort_dialog.body).find('.sort-order'); | this.sort_order_select = $(this.sort_dialog.body).find('.sort-order'); | ||||
// second | // second | ||||
this.sort_by_next_select = new wn.ui.FieldSelect($(this.sort_dialog.body).find('.sort-column-1'), | |||||
this.doctype, null, true).$select; | |||||
this.sort_by_next_select.css('width', '60%'); | |||||
this.sort_by_next_select = new wn.ui.FieldSelect({ | |||||
parent: $(this.sort_dialog.body).find('.sort-column-1'), | |||||
doctype: this.doctype, | |||||
with_blank: true | |||||
}); | |||||
this.sort_by_next_select.$select.css('width', '60%'); | |||||
this.sort_order_next_select = $(this.sort_dialog.body).find('.sort-order-1'); | this.sort_order_next_select = $(this.sort_dialog.body).find('.sort-order-1'); | ||||
// initial values | // initial values | ||||
this.sort_by_select.val(this.doctype + '.modified'); | |||||
this.sort_by_select.set_value(this.doctype, 'modified'); | |||||
this.sort_order_select.val('desc'); | this.sort_order_select.val('desc'); | ||||
this.sort_by_next_select.val(''); | |||||
this.sort_by_next_select.clear(); | |||||
this.sort_order_next_select.val('desc'); | this.sort_order_next_select.val('desc'); | ||||
// button actions | // button actions | ||||
@@ -555,10 +562,18 @@ wn.ui.ColumnPicker = Class.extend({ | |||||
init: function(list) { | init: function(list) { | ||||
this.list = list; | this.list = list; | ||||
this.doctype = list.doctype; | this.doctype = list.doctype; | ||||
this.selects = {}; | |||||
}, | |||||
clear: function() { | |||||
this.columns = []; | |||||
$(this.dialog.body).html('<div class="help">'+wn._("Drag to sort columns")+'</div>\ | |||||
<div class="column-list"></div>\ | |||||
<div><button class="btn btn-default btn-add"><i class="icon-plus"></i>\ | |||||
'+wn._("Add Column")+'</button></div>\ | |||||
<hr>\ | |||||
<div><button class="btn btn-info">'+wn._("Update")+'</div>'); | |||||
}, | }, | ||||
show: function(columns) { | show: function(columns) { | ||||
wn.require('assets/webnotes/js/lib/jquery/jquery.ui.interactions.min.js'); | |||||
var me = this; | var me = this; | ||||
if(!this.dialog) { | if(!this.dialog) { | ||||
this.dialog = new wn.ui.Dialog({ | this.dialog = new wn.ui.Dialog({ | ||||
@@ -566,14 +581,10 @@ wn.ui.ColumnPicker = Class.extend({ | |||||
width: '400' | width: '400' | ||||
}); | }); | ||||
} | } | ||||
$(this.dialog.body).html('<div class="help">'+wn._("Drag to sort columns")+'</div>\ | |||||
<div class="column-list"></div>\ | |||||
<div><button class="btn btn-default btn-add"><i class="icon-plus"></i>\ | |||||
'+wn._("Add Column")+'</button></div>\ | |||||
<hr>\ | |||||
<div><button class="btn btn-info">'+wn._("Update")+'</div>'); | |||||
// show existing | |||||
this.clear(); | |||||
// show existing | |||||
$.each(columns, function(i, c) { | $.each(columns, function(i, c) { | ||||
me.add_column(c); | me.add_column(c); | ||||
}); | }); | ||||
@@ -589,12 +600,10 @@ wn.ui.ColumnPicker = Class.extend({ | |||||
$(this.dialog.body).find('.btn-info').click(function() { | $(this.dialog.body).find('.btn-info').click(function() { | ||||
me.dialog.hide(); | me.dialog.hide(); | ||||
// selected columns as list of [column_name, table_name] | // selected columns as list of [column_name, table_name] | ||||
var columns = []; | |||||
$(me.dialog.body).find('select').each(function() { | |||||
var $selected = $(this).find('option:selected'); | |||||
columns.push([$selected.attr('fieldname'), | |||||
$selected.attr('table')]); | |||||
var columns = $.map(me.columns, function(v) { | |||||
return v ? [[v.selected_fieldname, v.selected_doctype]] : null; | |||||
}); | }); | ||||
wn.defaults.set_default("_list_settings:" + me.doctype, columns); | wn.defaults.set_default("_list_settings:" + me.doctype, columns); | ||||
me.list.columns = columns; | me.list.columns = columns; | ||||
me.list.run(); | me.list.run(); | ||||
@@ -603,6 +612,7 @@ wn.ui.ColumnPicker = Class.extend({ | |||||
this.dialog.show(); | this.dialog.show(); | ||||
}, | }, | ||||
add_column: function(c) { | add_column: function(c) { | ||||
if(!c) return; | |||||
var w = $('<div style="padding: 5px; background-color: #eee; \ | var w = $('<div style="padding: 5px; background-color: #eee; \ | ||||
width: 90%; margin-bottom: 10px; border-radius: 3px; cursor: move;">\ | width: 90%; margin-bottom: 10px; border-radius: 3px; cursor: move;">\ | ||||
<img src="assets/webnotes/images/ui/drag-handle.png" style="margin-right: 10px;">\ | <img src="assets/webnotes/images/ui/drag-handle.png" style="margin-right: 10px;">\ | ||||
@@ -610,15 +620,20 @@ wn.ui.ColumnPicker = Class.extend({ | |||||
</div>') | </div>') | ||||
.appendTo($(this.dialog.body).find('.column-list')); | .appendTo($(this.dialog.body).find('.column-list')); | ||||
var fieldselect = new wn.ui.FieldSelect(w, this.doctype); | |||||
var fieldselect = new wn.ui.FieldSelect({parent:w, doctype:this.doctype}), | |||||
me = this; | |||||
fieldselect.$select.css({"display": "inline"}); | fieldselect.$select.css({"display": "inline"}); | ||||
fieldselect.$select | |||||
.css({width: '70%', 'margin-top':'5px'}) | |||||
.val((c[1] || this.doctype) + "." + c[0]); | |||||
w.find('.close').click(function() { | |||||
fieldselect.$select.css({width: '70%', 'margin-top':'5px'}) | |||||
fieldselect.val((c[1] || this.doctype) + "." + c[0]); | |||||
w.find('.close').data("fieldselect", fieldselect).click(function() { | |||||
console.log(me.columns.indexOf($(this).data('fieldselect'))); | |||||
delete me.columns[me.columns.indexOf($(this).data('fieldselect'))]; | |||||
$(this).parent().remove(); | $(this).parent().remove(); | ||||
}); | }); | ||||
this.columns.push(fieldselect); | |||||
} | } | ||||
}); | }); |