seitime-frappe/frappe/desk/page/form_builder/form_builder.js

211 lines
5.2 KiB
JavaScript

frappe.pages["form-builder"].on_page_load = function (wrapper) {
frappe.ui.make_app_page({
parent: wrapper,
title: __("Form Builder"),
single_column: true,
});
// hot reload in development
if (frappe.boot.developer_mode) {
frappe.hot_update = frappe.hot_update || [];
frappe.hot_update.push(() => load_form_builder(wrapper));
}
};
frappe.pages["form-builder"].on_page_show = function (wrapper) {
load_form_builder(wrapper);
};
function load_form_builder(wrapper) {
let route = frappe.get_route();
route = route.filter((a) => a);
if (route.length > 1 && route[1] === "new-doctype") {
frappe.pages["form-builder"].new_doctype(route[2]);
} else if (route.length > 1) {
let doctype = route[1];
let is_customize_form = route[2] === "customize";
if (frappe.form_builder?.doctype) {
frappe.form_builder.doctype = frappe.form_builder.store.doctype = doctype;
frappe.form_builder.customize = frappe.form_builder.store.is_customize_form =
is_customize_form;
frappe.form_builder.init(true);
frappe.form_builder.store.fetch();
return;
}
let $parent = $(wrapper).find(".layout-main-section");
$parent.empty();
frappe.require("form_builder.bundle.js").then(() => {
frappe.form_builder = new frappe.ui.FormBuilder({
wrapper: $parent,
page: wrapper.page,
doctype: doctype,
customize: is_customize_form,
});
});
} else {
frappe.pages["form-builder"].select_doctype();
}
}
frappe.pages["form-builder"].select_doctype = function () {
let d = new frappe.ui.Dialog({
title: __("Select DocType"),
fields: [
{
label: __("Select DocType"),
fieldname: "doctype",
fieldtype: "Link",
options: "DocType",
only_select: 1,
},
{
label: __("Customize"),
fieldname: "customize",
fieldtype: "Check",
},
],
primary_action_label: __("Edit"),
primary_action({ doctype, customize }) {
if (customize) {
frappe.model.with_doctype(doctype).then(() => {
let meta = frappe.get_meta(doctype);
if (in_list(frappe.model.core_doctypes_list, this.doctype))
frappe.throw(__("Core DocTypes cannot be customized."));
if (meta.issingle) frappe.throw(__("Single DocTypes cannot be customized."));
if (meta.custom)
frappe.throw(
__(
"Only standard DocTypes are allowed to be customized from Customize Form."
)
);
frappe.set_route("form-builder", doctype, "customize");
});
} else {
frappe.set_route("form-builder", doctype);
}
},
secondary_action_label: __("Create New DocType"),
secondary_action() {
let doctype = d.get_value("doctype") || "";
d.hide();
frappe.set_route("form-builder", "new-doctype", doctype);
},
});
d.show();
};
frappe.pages["form-builder"].new_doctype = function (doctype) {
let non_developer = frappe.session.user !== "Administrator" || !frappe.boot.developer_mode;
let new_d = new frappe.ui.Dialog({
title: __("Create New DocType"),
fields: [
{
label: __("DocType Name"),
fieldname: "doctype_name",
fieldtype: "Data",
default: doctype,
reqd: 1,
},
{ fieldtype: "Column Break" },
{
label: __("Module"),
fieldname: "module",
fieldtype: "Link",
options: "Module Def",
reqd: 1,
},
{ fieldtype: "Section Break" },
{
label: __("Is Submittable"),
fieldname: "is_submittable",
fieldtype: "Check",
description: __(
"Once submitted, submittable documents cannot be changed. They can only be Cancelled and Amended."
),
depends_on: "eval:!doc.istable && !doc.issingle",
},
{
label: __("Is Child Table"),
fieldname: "istable",
fieldtype: "Check",
description: __("Child Tables are shown as a Grid in other DocTypes"),
depends_on: "eval:!doc.is_submittable && !doc.issingle",
},
{
label: __("Editable Grid"),
fieldname: "editable_grid",
fieldtype: "Check",
depends_on: "istable",
default: 1,
},
{
label: __("Is Single"),
fieldname: "issingle",
fieldtype: "Check",
description: __(
"Single Types have only one record no tables associated. Values are stored in tabSingles"
),
depends_on: "eval:!doc.istable && !doc.is_submittable",
},
{
label: __("Custom?"),
fieldname: "custom",
fieldtype: "Check",
default: non_developer,
read_only: non_developer,
},
],
primary_action_label: __("Create & Continue"),
primary_action(values) {
if (!values.istable) values.editable_grid = 0;
frappe.db
.insert({
doctype: "DocType",
name: values.doctype_name,
module: values.module,
istable: values.istable,
editable_grid: values.editable_grid,
issingle: values.issingle,
custom: values.custom,
is_submittable: values.is_submittable,
permissions: [
{
create: 1,
delete: 1,
email: 1,
export: 1,
print: 1,
read: 1,
report: 1,
role: "System Manager",
share: 1,
write: 1,
},
],
fields: [
{
label: "Title",
fieldname: "title",
fieldtype: "Data",
},
],
})
.then((doc) => {
frappe.set_route("form-builder", doc.name);
});
},
secondary_action_label: __("Back"),
secondary_action() {
new_d.hide();
window.history.back();
},
});
new_d.show();
};