From 65f62bb52f38ebe2d154b18bed4a668418d03e35 Mon Sep 17 00:00:00 2001 From: Shariq Ansari Date: Mon, 30 Oct 2023 12:23:28 +0530 Subject: [PATCH 01/39] fix: Create doctype through a dialog --- frappe/core/doctype/doctype/doctype_list.js | 107 ++++++++++++++++++++ 1 file changed, 107 insertions(+) create mode 100644 frappe/core/doctype/doctype/doctype_list.js diff --git a/frappe/core/doctype/doctype/doctype_list.js b/frappe/core/doctype/doctype/doctype_list.js new file mode 100644 index 0000000000..5f6ce6c098 --- /dev/null +++ b/frappe/core/doctype/doctype/doctype_list.js @@ -0,0 +1,107 @@ +frappe.listview_settings["DocType"] = { + primary_action: function () { + 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", + 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", + fieldtype: "Data", + }, + ], + }) + .then((doc) => { + frappe.set_route("Form", "DocType", doc.name); + }); + }, + secondary_action_label: __("Cancel"), + secondary_action() { + new_d.hide(); + }, + }); + new_d.show(); + }, +}; From 8b5dffff98522d40d561f6e1906a90be0e11bf36 Mon Sep 17 00:00:00 2001 From: Shariq Ansari Date: Mon, 30 Oct 2023 12:24:08 +0530 Subject: [PATCH 02/39] chore: made form tab as a first tab in doctype form --- frappe/core/doctype/doctype/doctype.json | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/frappe/core/doctype/doctype/doctype.json b/frappe/core/doctype/doctype/doctype.json index 21d5fbfac8..3610d88651 100644 --- a/frappe/core/doctype/doctype/doctype.json +++ b/frappe/core/doctype/doctype/doctype.json @@ -8,6 +8,11 @@ "document_type": "Document", "engine": "InnoDB", "field_order": [ + "form_builder_tab", + "form_builder", + "fields_section", + "fields", + "details_tab", "sb0", "module", "is_submittable", @@ -53,10 +58,6 @@ "advanced", "engine", "migration_hash", - "form_builder_tab", - "form_builder", - "fields_section", - "fields", "settings_tab", "form_settings_section", "image_field", @@ -660,6 +661,11 @@ "fieldtype": "Tab Break", "label": "Connections", "show_dashboard": 1 + }, + { + "fieldname": "details_tab", + "fieldtype": "Tab Break", + "label": "Details" } ], "icon": "fa fa-bolt", @@ -742,7 +748,7 @@ "link_fieldname": "reference_doctype" } ], - "modified": "2023-08-29 12:27:06.587523", + "modified": "2023-10-30 12:19:49.757126", "modified_by": "Administrator", "module": "Core", "name": "DocType", From 3407a9963eb8b1eadb9a99ac71ae82a936440b36 Mon Sep 17 00:00:00 2001 From: Shariq Ansari Date: Mon, 30 Oct 2023 12:29:06 +0530 Subject: [PATCH 03/39] chore: hide fields table --- frappe/core/doctype/doctype/doctype.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/frappe/core/doctype/doctype/doctype.json b/frappe/core/doctype/doctype/doctype.json index 3610d88651..233fcc30cc 100644 --- a/frappe/core/doctype/doctype/doctype.json +++ b/frappe/core/doctype/doctype/doctype.json @@ -654,6 +654,7 @@ "collapsible": 1, "fieldname": "fields_section", "fieldtype": "Section Break", + "hidden": 1, "label": "Fields" }, { @@ -748,7 +749,7 @@ "link_fieldname": "reference_doctype" } ], - "modified": "2023-10-30 12:19:49.757126", + "modified": "2023-10-30 12:27:18.098074", "modified_by": "Administrator", "module": "Core", "name": "DocType", From 0e0f38b60dc325febbf72d59a202bfa4e8b9a844 Mon Sep 17 00:00:00 2001 From: Shariq Ansari Date: Mon, 30 Oct 2023 13:07:25 +0530 Subject: [PATCH 04/39] feat: added on_tab_change event on form to run logic on tab change --- frappe/public/js/frappe/form/form.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/frappe/public/js/frappe/form/form.js b/frappe/public/js/frappe/form/form.js index 32a6ec0d5e..a4f40a97c2 100644 --- a/frappe/public/js/frappe/form/form.js +++ b/frappe/public/js/frappe/form/form.js @@ -2039,6 +2039,8 @@ frappe.ui.form.Form = class FrappeForm { this.active_tab_map = {}; } this.active_tab_map[this.docname] = tab; + + this.script_manager.trigger("on_tab_change"); } get_active_tab() { return this.active_tab_map && this.active_tab_map[this.docname]; From 8ca4501f7e835fa7d646b7fea4e5ed07fed54254 Mon Sep 17 00:00:00 2001 From: Shariq Ansari Date: Mon, 30 Oct 2023 13:27:16 +0530 Subject: [PATCH 05/39] fix: if Form tab is active hide comments & form message --- frappe/core/doctype/doctype/doctype.js | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/frappe/core/doctype/doctype/doctype.js b/frappe/core/doctype/doctype/doctype.js index 929244c977..1dde8e03bd 100644 --- a/frappe/core/doctype/doctype/doctype.js +++ b/frappe/core/doctype/doctype/doctype.js @@ -119,6 +119,20 @@ frappe.ui.form.on("DocType", { setup_default_views: (frm) => { frappe.model.set_default_views_for_doctype(frm.doc.name, frm); }, + + on_tab_change: (frm) => { + let current_tab = frm.get_active_tab().label; + + if (current_tab === "Form") { + frm.footer.wrapper.hide(); + frm.form_wrapper.find(".form-message").hide(); + frm.form_wrapper.addClass("mb-1"); + } else { + frm.footer.wrapper.show(); + frm.form_wrapper.find(".form-message").show(); + frm.form_wrapper.removeClass("mb-1"); + } + }, }); frappe.ui.form.on("DocField", { From 2a04a89be1789466dc60c890e82815fae9578332 Mon Sep 17 00:00:00 2001 From: Shariq Ansari Date: Mon, 30 Oct 2023 13:28:58 +0530 Subject: [PATCH 06/39] fix: changed form builder layout - sidebar is on right Also remove double scrollbar --- frappe/public/js/form_builder/FormBuilder.vue | 16 ++++++++-------- .../form_builder/components/FieldProperties.vue | 2 +- .../js/form_builder/components/FieldTypes.vue | 2 +- .../public/js/form_builder/components/Tabs.vue | 2 +- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/frappe/public/js/form_builder/FormBuilder.vue b/frappe/public/js/form_builder/FormBuilder.vue index 427b93584b..e5db31dda1 100644 --- a/frappe/public/js/form_builder/FormBuilder.vue +++ b/frappe/public/js/form_builder/FormBuilder.vue @@ -30,16 +30,16 @@ onMounted(() => store.fetch()); class="form-builder-container" @click="store.form.selected_field = null" > -
-
- -
-
+
+
+ +
+
@@ -62,7 +62,7 @@ onMounted(() => store.fetch()); } .form-sidebar { - border-right: 1px solid var(--border-color); + border-left: 1px solid var(--border-color); border-bottom-left-radius: var(--border-radius); } @@ -70,7 +70,7 @@ onMounted(() => store.fetch()); border-radius: var(--border-radius); border: 1px solid var(--border-color); background-color: var(--card-bg); - margin: 10px; + margin: 5px; } .form-sidebar, @@ -270,7 +270,7 @@ onMounted(() => store.fetch()); } .form-main > :deep(div:first-child:not(.tab-header)) { - max-height: calc(100vh - 160px); + max-height: calc(100vh - 178px); } } diff --git a/frappe/public/js/form_builder/components/FieldProperties.vue b/frappe/public/js/form_builder/components/FieldProperties.vue index 12a8ce79ef..cc4c9609d9 100644 --- a/frappe/public/js/form_builder/components/FieldProperties.vue +++ b/frappe/public/js/form_builder/components/FieldProperties.vue @@ -89,7 +89,7 @@ let docfield_df = computed(() => { diff --git a/frappe/public/js/form_builder/components/SearchBox.vue b/frappe/public/js/form_builder/components/SearchBox.vue index 46a2c86f67..c8a5d161f5 100644 --- a/frappe/public/js/form_builder/components/SearchBox.vue +++ b/frappe/public/js/form_builder/components/SearchBox.vue @@ -18,7 +18,7 @@ .search-box { display: flex; position: relative; - padding: 0px 9px 9px; + padding: 5px; background-color: var(--fg-color); border-bottom: 1px solid var(--border-color); @@ -28,8 +28,8 @@ .search-icon { position: absolute; - left: 16px; - top: 2px; + left: 12px; + top: 7px; } } diff --git a/frappe/public/js/form_builder/components/Sidebar.vue b/frappe/public/js/form_builder/components/Sidebar.vue index 540fbbbb34..55f178e32d 100644 --- a/frappe/public/js/form_builder/components/Sidebar.vue +++ b/frappe/public/js/form_builder/components/Sidebar.vue @@ -6,8 +6,6 @@ import { useStore } from "../store"; let store = useStore(); -let tab_titles = [__("Field Types"), __("Field Properties")]; -let active_tab = ref(tab_titles[0]); let sidebar_width = ref(272); let sidebar_resizing = ref(false); @@ -33,14 +31,6 @@ function resize(e) { sidebar_width.value = 24 * 16; } } - -watch( - () => store.form.selected_field, - value => { - active_tab.value = value ? tab_titles[1] : tab_titles[0]; - }, - { deep: true } -); @@ -81,7 +56,8 @@ watch( z-index: 4; cursor: col-resize; - &:hover, &.resizing { + &:hover, + &.resizing { opacity: 1; } } From afc3babbf92c51b5d15a86ce6567209d2b6cceab Mon Sep 17 00:00:00 2001 From: Shariq Ansari Date: Mon, 30 Oct 2023 17:43:06 +0530 Subject: [PATCH 10/39] refactor: remove/add tab --- .../components/FieldProperties.vue | 29 +++--- .../js/form_builder/components/SearchBox.vue | 9 +- .../js/form_builder/components/Sidebar.vue | 36 ++++++- .../js/form_builder/components/Tabs.vue | 97 ++++++++++--------- frappe/public/js/form_builder/store.js | 34 ++++++- 5 files changed, 138 insertions(+), 67 deletions(-) diff --git a/frappe/public/js/form_builder/components/FieldProperties.vue b/frappe/public/js/form_builder/components/FieldProperties.vue index 3bd20ff192..af32a53193 100644 --- a/frappe/public/js/form_builder/components/FieldProperties.vue +++ b/frappe/public/js/form_builder/components/FieldProperties.vue @@ -68,7 +68,16 @@ let docfield_df = computed(() => { diff --git a/frappe/public/js/form_builder/components/SearchBox.vue b/frappe/public/js/form_builder/components/SearchBox.vue index c8a5d161f5..bae326058d 100644 --- a/frappe/public/js/form_builder/components/SearchBox.vue +++ b/frappe/public/js/form_builder/components/SearchBox.vue @@ -5,7 +5,7 @@ @@ -18,9 +18,8 @@ .search-box { display: flex; position: relative; - padding: 5px; background-color: var(--fg-color); - border-bottom: 1px solid var(--border-color); + width: 100%; .search-input { padding-left: 30px; @@ -28,8 +27,8 @@ .search-icon { position: absolute; - left: 12px; - top: 7px; + left: 7px; + top: 2px; } } diff --git a/frappe/public/js/form_builder/components/Sidebar.vue b/frappe/public/js/form_builder/components/Sidebar.vue index 55f178e32d..67fd084950 100644 --- a/frappe/public/js/form_builder/components/Sidebar.vue +++ b/frappe/public/js/form_builder/components/Sidebar.vue @@ -39,7 +39,21 @@ function resize(e) { @mousedown="start_resize" /> @@ -61,6 +75,7 @@ function resize(e) { opacity: 1; } } + .tab-header { display: flex; justify-content: space-between; @@ -104,4 +119,23 @@ function resize(e) { display: block; } } + +.default-state { + height: calc(100vh - 196px); + + .actions { + padding: 5px; + display: flex; + justify-content: flex-end; + border-bottom: 1px solid var(--border-color); + } + .empty-state { + display: flex; + justify-content: center; + align-items: center; + height: 100%; + text-align: center; + color: var(--disabled-text-color); + } +} diff --git a/frappe/public/js/form_builder/components/Tabs.vue b/frappe/public/js/form_builder/components/Tabs.vue index 88a159d8e6..ca0b8b9bb6 100644 --- a/frappe/public/js/form_builder/components/Tabs.vue +++ b/frappe/public/js/form_builder/components/Tabs.vue @@ -13,17 +13,7 @@ let has_tabs = computed(() => store.form.layout.tabs.length > 1); store.form.active_tab = store.form.layout.tabs[0].df.name; function activate_tab(tab) { - store.form.active_tab = tab.df.name; - store.form.selected_field = tab.df; - - // scroll to active tab - nextTick(() => { - $(".tabs .tab.active")[0].scrollIntoView({ - behavior: "smooth", - inline: "center", - block: "nearest", - }); - }); + store.activate_tab(tab); } function drag_over(tab) { @@ -34,13 +24,7 @@ function drag_over(tab) { } function add_new_tab() { - let tab = { - df: store.get_df("Tab Break", "", "Tab " + (store.form.layout.tabs.length + 1)), - sections: [section_boilerplate()], - }; - - store.form.layout.tabs.push(tab); - activate_tab(tab); + store.add_new_tab(); } function add_new_section() { @@ -51,8 +35,8 @@ function add_new_section() { function is_current_tab_empty() { // check if sections have columns and it contains fields - return !store.current_tab.sections.some( - section => section.columns.some(column => column.fields.length) + return !store.current_tab.sections.some((section) => + section.columns.some((column) => column.fields.length) ); } @@ -67,7 +51,11 @@ function remove_tab() { } else { confirm_dialog( __("Delete Tab", null, "Title of confirmation dialog"), - __("Are you sure you want to delete the tab? All the sections along with fields in the tab will be moved to the previous tab.", null, "Confirmation dialog message"), + __( + "Are you sure you want to delete the tab? All the sections along with fields in the tab will be moved to the previous tab.", + null, + "Confirmation dialog message" + ), () => delete_tab(), __("Delete tab", null, "Button text"), () => delete_tab(true), @@ -109,7 +97,7 @@ function delete_tab(with_children) {