Merge pull request #27345 from rmehta/extend-quick-entry

fix(minor): Quick Entry now subclasses from Dialog
This commit is contained in:
Rushabh Mehta 2024-08-09 11:10:45 +05:30 committed by GitHub
commit b25ff5ba71
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 84 additions and 34 deletions

View file

@ -25,13 +25,15 @@ frappe.ui.form.make_quick_entry = (doctype, after_insert, init_callback, doc, fo
return frappe.quick_entry.setup();
};
frappe.ui.form.QuickEntryForm = class QuickEntryForm {
frappe.ui.form.QuickEntryForm = class QuickEntryForm extends frappe.ui.Dialog {
constructor(doctype, after_insert, init_callback, doc, force) {
super({ auto_make: false });
this.doctype = doctype;
this.after_insert = after_insert;
this.init_callback = init_callback;
this.doc = doc;
this.force = force ? force : false;
this.dialog = this; // for backward compatibility
}
setup() {
@ -132,29 +134,39 @@ frappe.ui.form.QuickEntryForm = class QuickEntryForm {
this.script_manager.setup();
}
get mandatory() {
// Backwards compatibility
console.warn("QuickEntryForm: .mandatory is deprecated, use .docfields instead");
return this.docfields;
}
set mandatory(value) {
// Backwards compatibility
console.warn("QuickEntryForm: .mandatory is deprecated, use .docfields instead");
this.docfields = value;
}
render_dialog() {
var me = this;
this.dialog = new frappe.ui.Dialog({
title: this.get_title(),
fields: this.docfields,
doc: this.doc,
});
this.fields = this.docfields;
this.title = this.get_title();
super.make();
this.register_primary_action();
this.render_edit_in_full_page_link();
this.setup_cmd_enter_for_save();
this.dialog.onhide = () => (frappe.quick_entry = null);
this.dialog.show();
this.onhide = () => (frappe.quick_entry = null);
this.show();
this.dialog.refresh_dependency();
this.refresh_dependency();
this.set_defaults();
this.script_manager.trigger("refresh");
if (this.init_callback) {
this.init_callback(this.dialog);
this.init_callback(this);
}
}
@ -170,7 +182,7 @@ frappe.ui.form.QuickEntryForm = class QuickEntryForm {
register_primary_action() {
var me = this;
this.dialog.set_primary_action(__("Save"), function () {
this.set_primary_action(__("Save"), function () {
if (me.dialog.working) {
return;
}
@ -247,14 +259,14 @@ frappe.ui.form.QuickEntryForm = class QuickEntryForm {
process_after_insert(r) {
// delete the old doc
frappe.model.clear_doc(this.dialog.doc.doctype, this.dialog.doc.name);
this.dialog.doc = r.message;
frappe.model.clear_doc(this.doc.doctype, this.doc.name);
this.doc = r.message;
if (this.script_manager.has_handler("after_save")) {
return this.script_manager.trigger("after_save");
} else if (frappe._from_link) {
frappe.ui.form.update_calling_link(this.dialog.doc);
frappe.ui.form.update_calling_link(this.doc);
} else if (this.after_insert) {
this.after_insert(this.dialog.doc);
this.after_insert(this.doc);
} else {
this.open_form_if_not_list();
}
@ -263,7 +275,7 @@ frappe.ui.form.QuickEntryForm = class QuickEntryForm {
setup_cmd_enter_for_save() {
var me = this;
// ctrl+enter to save
this.dialog.wrapper.keydown(function (e) {
this.wrapper.keydown(function (e) {
if ((e.ctrlKey || e.metaKey) && e.which == 13) {
if (!frappe.request.ajax_count) {
// not already working -- double entry
@ -278,7 +290,7 @@ frappe.ui.form.QuickEntryForm = class QuickEntryForm {
open_form_if_not_list() {
if (this.meta.issingle) return;
let route = frappe.get_route();
let doc = this.dialog.doc;
let doc = this.doc;
if (route && !(route[0] === "List" && route[1] === doc.doctype)) {
frappe.run_serially([() => frappe.set_route("Form", doc.doctype, doc.name)]);
}
@ -286,17 +298,17 @@ frappe.ui.form.QuickEntryForm = class QuickEntryForm {
update_doc() {
var me = this;
var data = this.dialog.get_values(true);
var data = this.get_values(true);
$.each(data, function (key, value) {
if (!is_null(value)) {
me.dialog.doc[key] = value;
}
});
return this.dialog.doc;
return this.doc;
}
open_doc(set_hooks) {
this.dialog.hide();
this.hide();
this.update_doc();
if (set_hooks && this.after_insert) {
frappe.route_options = frappe.route_options || {};
@ -309,13 +321,13 @@ frappe.ui.form.QuickEntryForm = class QuickEntryForm {
render_edit_in_full_page_link() {
if (this.force || this.hide_full_form_button) return;
this.dialog.add_custom_action(__("Edit Full Form"), () => this.open_doc(true));
this.add_custom_action(__("Edit Full Form"), () => this.open_doc(true));
}
set_defaults() {
var me = this;
// set defaults
$.each(this.dialog.fields_dict, function (fieldname, field) {
$.each(this.fields_dict, function (fieldname, field) {
field.doctype = me.doc.doctype;
field.docname = me.doc.name;

View file

@ -245,6 +245,7 @@ frappe.ui.form.ScriptManager = class ScriptManager {
this.trigger("setup");
}
log_error(caller, e) {
frappe.show_alert({ message: __("Error in Client Script."), indicator: "error" });
console.group && console.group();

View file

@ -13,8 +13,10 @@ frappe.ui.Dialog = class Dialog extends frappe.ui.FieldGroup {
this.display = false;
this.is_dialog = true;
$.extend(this, { animate: true, size: null }, opts);
this.make();
$.extend(this, { animate: true, size: null, auto_make: true }, opts);
if (this.auto_make) {
this.make();
}
}
make() {
@ -127,10 +129,6 @@ frappe.ui.Dialog = class Dialog extends frappe.ui.FieldGroup {
});
}
get $backdrop() {
return $(this.$wrapper.data("bs.modal")?._backdrop);
}
set_modal_size() {
if (!this.fields) {
this.size = "";
@ -259,7 +257,7 @@ frappe.ui.Dialog = class Dialog extends frappe.ui.FieldGroup {
this.$wrapper.removeClass("modal-minimize");
if (this.minimizable && this.is_minimized) {
this.$backdrop.show();
$(".modal-backdrop").toggle();
this.is_minimized = false;
}
@ -272,10 +270,6 @@ frappe.ui.Dialog = class Dialog extends frappe.ui.FieldGroup {
}
hide() {
if (this.animate && this.animation_speed === "slow") {
this.$wrapper.addClass("slow");
this.$backdrop.addClass("slow");
}
this.$wrapper.modal("hide");
this.is_visible = false;
}
@ -297,7 +291,7 @@ frappe.ui.Dialog = class Dialog extends frappe.ui.FieldGroup {
}
toggle_minimize() {
this.$backdrop.toggle();
$(".modal-backdrop").toggle();
let modal = this.$wrapper.closest(".modal").toggleClass("modal-minimize");
modal.attr("tabindex") ? modal.removeAttr("tabindex") : modal.attr("tabindex", -1);
this.is_minimized = !this.is_minimized;
@ -323,6 +317,8 @@ frappe.ui.Dialog = class Dialog extends frappe.ui.FieldGroup {
action && action_button.click(action);
}
add_custom_button() {}
};
frappe.ui.hide_open_dialog = () => {

View file

@ -6,6 +6,8 @@ frappe.ui.FieldGroup = class FieldGroup extends frappe.ui.form.Layout {
constructor(opts) {
super(opts);
this.dirty = false;
this.fetch_dict = {};
$.each(this.fields || [], function (i, f) {
if (!f.fieldname && f.label) {
f.fieldname = f.label.replace(/ /g, "_").toLowerCase();
@ -197,4 +199,43 @@ frappe.ui.FieldGroup = class FieldGroup extends frappe.ui.form.Layout {
field.df[prop] = value;
field.refresh();
}
set_query(fieldname, opt1, opt2) {
if (opt2) {
// on child table
// set_query(fieldname, parent fieldname, query)
if (this.fields_dict[opt1])
this.fields_dict[opt1].grid.get_field(fieldname).get_query = opt2;
} else {
// on parent table
// set_query(fieldname, query)
if (this.fields_dict[fieldname]) {
this.fields_dict[fieldname].get_query = opt1;
}
}
}
// UTILITIES
add_fetch(link_field, source_field, target_field, target_doctype) {
/*
Example fetch dict to get sender_email from email_id field in sender:
{
"Notification": {
"sender": {
"sender_email": "email_id"
}
}
}
*/
if (!target_doctype) target_doctype = "*";
// Target field kept as key because source field could be non-unique
this.fetch_dict.setDefault(target_doctype, {}).setDefault(link_field, {})[target_field] =
source_field;
}
is_new() {
return this.doc.__islocal;
}
};