* first cut * Code refactoring, styling * Added Sorting * Revert query_report to use slickgrid * cleanup * Edit cell working * Add regrid, remove datatable * Add clusterize * Update lib, fix get_checked_items * New ReportView * wip * Enable editing, fix styles * update lib * wip * fix refresh rows and editable cells * Refresh list_view every 3s, decouple refreshing logic * Report editing fixes * Cleanup loading fields, add column then refresh list * [wip] New List View * [working] Render results * ListView is now BaseList, add new ListView and GanttView * Create new page for each ListView * GanttView working * CalendarView working * KanbanView working * Cache list_view based on page_name * Gantt view buttons on mobile * Add ReportView * Refresh datatable on render * Setup like * [start][filters] clean up FilterList * [filters] refactor FilterList * [filters] minor fix * [filters] fix remove filter * filter utils * more utils, remove apply * rewrite as class, remove 'me' references * [filter] implement on_change to decouple parent functions * Integrate new filters with new BaseList * Setup freeze area for ListView * Set breadcrumbs on setup_page * Trigger list update from events * Setup footnote area * Fix Kanban Board filters * Add filters to standard filters, then filter_list * Remove old files * Fix ImageView * Some more fixes for BaseList.init * Fix order_by on load * Report View: remember columns * Fix for hidden filters * Fix for delete items * InboxView * Shift select checkboxes * Fix ESLint errors * More refactoring - Move ListMenu to Listview - New FileView - Ability to add custom breadcrumbs * FileManager working * Tags, set filters from route options * Custom Reports Working * List Sidebar reports * Report Name as title * Fix ESLint errors * Fix UI tests * Fix Kanban test * Format ID column * [fix] Kanban cards title * Checkbox fix * Fix Activity Page * Update rows in Report in place * Child Table columns in Report View
205 lines
5.2 KiB
JavaScript
205 lines
5.2 KiB
JavaScript
// Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
|
|
// MIT License. See license.txt
|
|
|
|
frappe.provide("frappe.ui.form");
|
|
|
|
frappe.ui.form.AssignTo = Class.extend({
|
|
init: function(opts) {
|
|
var me = this;
|
|
|
|
$.extend(this, opts);
|
|
this.btn = this.parent.find(".add-assignment").on("click", function() { me.add(); });
|
|
this.btn_wrapper = this.btn.parent();
|
|
|
|
this.refresh();
|
|
},
|
|
refresh: function() {
|
|
if(this.frm.doc.__islocal) {
|
|
this.parent.toggle(false);
|
|
return;
|
|
}
|
|
this.parent.toggle(true);
|
|
this.render(this.frm.get_docinfo().assignments);
|
|
},
|
|
render: function(d) {
|
|
var me = this;
|
|
this.frm.get_docinfo().assignments = d;
|
|
this.parent.find(".assignment-row").remove();
|
|
|
|
if(me.primary_action) {
|
|
me.primary_action.remove();
|
|
me.primary_action = null;
|
|
}
|
|
|
|
if(this.dialog) {
|
|
this.dialog.hide();
|
|
}
|
|
|
|
if(d && d.length) {
|
|
for(var i=0; i<d.length; i++) {
|
|
var info = frappe.user_info(d[i].owner);
|
|
info.assign_to_name = d[i].name
|
|
info.owner = d[i].owner;
|
|
info.avatar = frappe.avatar(d[i].owner);
|
|
info.description = d[i].description || "";
|
|
|
|
info._fullname = info.fullname;
|
|
if(info.fullname.length > 10) {
|
|
info._fullname = info.fullname.substr(0, 10) + '...';
|
|
}
|
|
|
|
$(repl('<li class="assignment-row">\
|
|
<a class="close" data-owner="%(owner)s">×</a>\
|
|
%(avatar)s\
|
|
<span><a href="#Form/ToDo/%(assign_to_name)s">%(_fullname)s</a></span>\
|
|
</li>', info))
|
|
.insertBefore(this.parent.find('.add-assignment'));
|
|
|
|
if(d[i].owner===frappe.session.user) {
|
|
me.primary_action = this.frm.page.add_menu_item(__("Assignment Complete"), function() {
|
|
me.remove(frappe.session.user);
|
|
}, "fa fa-check", "btn-success")
|
|
}
|
|
|
|
if(!(d[i].owner === frappe.session.user || me.frm.perm[0].write)) {
|
|
me.parent.find('a.close').remove();
|
|
}
|
|
}
|
|
|
|
// set remove
|
|
this.parent.find('a.close').click(function() {
|
|
me.remove($(this).attr('data-owner'));
|
|
return false;
|
|
});
|
|
|
|
//this.btn_wrapper.addClass("hide");
|
|
} else {
|
|
//this.btn_wrapper.removeClass("hide");
|
|
}
|
|
},
|
|
add: function() {
|
|
var me = this;
|
|
|
|
if(this.frm.is_new()) {
|
|
frappe.throw(__("Please save the document before assignment"));
|
|
return;
|
|
}
|
|
|
|
if(!me.dialog) {
|
|
me.dialog = new frappe.ui.form.AssignToDialog({
|
|
obj: me,
|
|
method: 'frappe.desk.form.assign_to.add',
|
|
doctype: me.frm.doctype,
|
|
docname: me.frm.docname,
|
|
callback: function(r) {
|
|
me.render(r.message);
|
|
}
|
|
});
|
|
}
|
|
me.dialog.clear();
|
|
|
|
if(me.frm.meta.title_field) {
|
|
me.dialog.set_value("description", me.frm.doc[me.frm.meta.title_field])
|
|
}
|
|
|
|
me.dialog.show();
|
|
},
|
|
remove: function(owner) {
|
|
var me = this;
|
|
|
|
if(this.frm.is_new()) {
|
|
frappe.throw(__("Please save the document before removing assignment"));
|
|
return;
|
|
}
|
|
|
|
frappe.call({
|
|
method:'frappe.desk.form.assign_to.remove',
|
|
args: {
|
|
doctype: me.frm.doctype,
|
|
name: me.frm.docname,
|
|
assign_to: owner
|
|
},
|
|
callback:function(r,rt) {
|
|
me.render(r.message);
|
|
}
|
|
});
|
|
}
|
|
});
|
|
|
|
|
|
frappe.ui.form.AssignToDialog = Class.extend({
|
|
init: function(opts){
|
|
var me = this
|
|
$.extend(me, new frappe.ui.Dialog({
|
|
title: __('Add to To Do'),
|
|
fields: [
|
|
{fieldtype: 'Link', fieldname:'assign_to', options:'User',
|
|
label:__("Assign To"), reqd:true, filters: {'user_type': 'System User'}},
|
|
{fieldtype:'Check', fieldname:'myself', label:__("Assign to me"), "default":0},
|
|
{fieldtype:'Small Text', fieldname:'description', label:__("Comment")},
|
|
{fieldtype: 'Section Break'},
|
|
{fieldtype: 'Column Break'},
|
|
{fieldtype:'Date', fieldname:'date', label: __("Complete By")},
|
|
{fieldtype:'Check', fieldname:'notify',
|
|
label:__("Notify by Email")},
|
|
{fieldtype: 'Column Break'},
|
|
{fieldtype:'Select', fieldname:'priority', label: __("Priority"),
|
|
options:[
|
|
{value:'Low', label:__('Low')},
|
|
{value:'Medium', label:__('Medium')},
|
|
{value:'High', label:__('High')}],
|
|
'default':'Medium'},
|
|
],
|
|
primary_action: function() { frappe.ui.add_assignment(opts, me) },
|
|
primary_action_label: __("Add")
|
|
}));
|
|
|
|
me.fields_dict.assign_to.get_query = "frappe.core.doctype.user.user.user_query";
|
|
|
|
var myself = me.get_input("myself").on("click", function() {
|
|
me.toggle_myself(this);
|
|
});
|
|
me.toggle_myself(myself);
|
|
},
|
|
toggle_myself: function(myself) {
|
|
var me = this;
|
|
if($(myself).prop("checked")) {
|
|
me.set_value("assign_to", frappe.session.user);
|
|
me.set_value("notify", 0);
|
|
me.get_field("notify").$wrapper.toggle(false);
|
|
me.get_field("assign_to").$wrapper.toggle(false);
|
|
} else {
|
|
me.set_value("assign_to", "");
|
|
me.set_value("notify", 1);
|
|
me.get_field("notify").$wrapper.toggle(true);
|
|
me.get_field("assign_to").$wrapper.toggle(true);
|
|
}
|
|
},
|
|
|
|
});
|
|
|
|
frappe.ui.add_assignment = function(opts, dialog) {
|
|
var assign_to = dialog.fields_dict.assign_to.get_value();
|
|
var args = dialog.get_values();
|
|
if(args && assign_to) {
|
|
return frappe.call({
|
|
method: opts.method,
|
|
args: $.extend(args, {
|
|
doctype: opts.doctype,
|
|
name: opts.docname,
|
|
assign_to: assign_to,
|
|
bulk_assign: opts.bulk_assign || false,
|
|
re_assign: opts.re_assign || false
|
|
}),
|
|
callback: function(r,rt) {
|
|
if(!r.exc) {
|
|
if(opts.callback){
|
|
opts.callback(r);
|
|
}
|
|
dialog && dialog.hide();
|
|
}
|
|
},
|
|
btn: this
|
|
});
|
|
}
|
|
}
|