From bce95096f68027749885b685baf69a158546122e Mon Sep 17 00:00:00 2001 From: Shariq Ansari Date: Tue, 7 Nov 2023 19:28:00 +0530 Subject: [PATCH 01/24] chore: show fields table in customize form --- frappe/custom/doctype/customize_form/customize_form.json | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/frappe/custom/doctype/customize_form/customize_form.json b/frappe/custom/doctype/customize_form/customize_form.json index 32fd3302ec..d345698f2d 100644 --- a/frappe/custom/doctype/customize_form/customize_form.json +++ b/frappe/custom/doctype/customize_form/customize_form.json @@ -30,10 +30,10 @@ "links", "document_states_section", "states", - "form_tab", - "form_builder", "fields_section_break", "fields", + "form_tab", + "form_builder", "settings_tab", "form_settings_section", "image_field", @@ -180,7 +180,6 @@ "depends_on": "doc_type", "fieldname": "fields_section_break", "fieldtype": "Section Break", - "hidden": 1, "label": "Fields" }, { @@ -394,7 +393,7 @@ "index_web_pages_for_search": 1, "issingle": 1, "links": [], - "modified": "2023-10-31 02:04:25.955931", + "modified": "2023-11-07 19:25:32.656641", "modified_by": "Administrator", "module": "Custom", "name": "Customize Form", From aa55ccf88f8b870166a022fd9f34deef76992503 Mon Sep 17 00:00:00 2001 From: Shariq Ansari Date: Tue, 7 Nov 2023 19:32:15 +0530 Subject: [PATCH 02/24] fix: always show section header --- frappe/public/js/form_builder/components/Section.vue | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/frappe/public/js/form_builder/components/Section.vue b/frappe/public/js/form_builder/components/Section.vue index 9266d5c8d3..a2f8cc831a 100644 --- a/frappe/public/js/form_builder/components/Section.vue +++ b/frappe/public/js/form_builder/components/Section.vue @@ -221,12 +221,8 @@ function move_sections_to_tab() { border-color: var(--primary); } - &.selected .section-header { - display: flex; - } - .section-header { - display: none; + display: flex; justify-content: space-between; align-items: center; padding-bottom: 0.75rem; From ec4bc971c5090e9744afc0ec9e31c57c786eda5f Mon Sep 17 00:00:00 2001 From: David Arnold Date: Tue, 7 Nov 2023 16:43:13 +0100 Subject: [PATCH 03/24] fix(integration): preserver data json formatting on update --- .../doctype/integration_request/integration_request.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frappe/integrations/doctype/integration_request/integration_request.py b/frappe/integrations/doctype/integration_request/integration_request.py index c3cd8d061c..a81e702dfc 100644 --- a/frappe/integrations/doctype/integration_request/integration_request.py +++ b/frappe/integrations/doctype/integration_request/integration_request.py @@ -4,7 +4,7 @@ import json import frappe -from frappe.integrations.utils import json_handler +from frappe.integrations.utils import get_json, json_handler from frappe.model.document import Document @@ -45,7 +45,7 @@ class IntegrationRequest(Document): data = json.loads(self.data) data.update(params) - self.data = json.dumps(data) + self.data = get_json(data) self.status = status self.save(ignore_permissions=True) frappe.db.commit() From 5e660437df6b3017e7e55504fe8fe32a93492c5e Mon Sep 17 00:00:00 2001 From: barredterra <14891507+barredterra@users.noreply.github.com> Date: Tue, 7 Nov 2023 17:08:20 +0100 Subject: [PATCH 04/24] fix: ignore case of filetype --- frappe/public/js/frappe/file_uploader/FileUploader.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/public/js/frappe/file_uploader/FileUploader.vue b/frappe/public/js/frappe/file_uploader/FileUploader.vue index 7f8f1cedcb..91a4654bb9 100644 --- a/frappe/public/js/frappe/file_uploader/FileUploader.vue +++ b/frappe/public/js/frappe/file_uploader/FileUploader.vue @@ -337,7 +337,7 @@ function check_restrictions(file) { // otherwise this is likely an extension if (type[0] === '.') { - return file.name.endsWith(type); + return file.name.toLowerCase().endsWith(type.toLowerCase()); } return false; }); From 268c851f858a8aec020c4454dbf654d402242298 Mon Sep 17 00:00:00 2001 From: "avazquez@ctgalega.com" Date: Wed, 8 Nov 2023 00:29:46 +0100 Subject: [PATCH 05/24] fix: description for columns property in docfield --- frappe/core/doctype/docfield/docfield.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/core/doctype/docfield/docfield.json b/frappe/core/doctype/docfield/docfield.json index 6b8469bd48..065e00c6aa 100644 --- a/frappe/core/doctype/docfield/docfield.json +++ b/frappe/core/doctype/docfield/docfield.json @@ -416,7 +416,7 @@ "width": "50px" }, { - "description": "Number of columns for a field in a List View or a Grid (Total Columns should be less than 11)", + "description": "Number of columns for a field in a Grid (Total Columns should be less than 11)", "fieldname": "columns", "fieldtype": "Int", "label": "Columns" From 9baf5e6de481e24fbbf0ad93c76d61e59ea93317 Mon Sep 17 00:00:00 2001 From: "avazquez@ctgalega.com" Date: Wed, 8 Nov 2023 00:38:16 +0100 Subject: [PATCH 06/24] fix: typo accuracy --- frappe/core/doctype/docfield/docfield.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/core/doctype/docfield/docfield.json b/frappe/core/doctype/docfield/docfield.json index 065e00c6aa..42e8d21e34 100644 --- a/frappe/core/doctype/docfield/docfield.json +++ b/frappe/core/doctype/docfield/docfield.json @@ -416,7 +416,7 @@ "width": "50px" }, { - "description": "Number of columns for a field in a Grid (Total Columns should be less than 11)", + "description": "Number of columns for a field in a grid (total columns should be less than 11)", "fieldname": "columns", "fieldtype": "Int", "label": "Columns" From 88113b6c089d99a2f4547615614fe0c869fd81ef Mon Sep 17 00:00:00 2001 From: Shariq Ansari Date: Wed, 8 Nov 2023 11:54:35 +0530 Subject: [PATCH 07/24] fix: added Dropdown component --- .../js/form_builder/components/Dropdown.vue | 129 ++++++++++++++++++ 1 file changed, 129 insertions(+) create mode 100644 frappe/public/js/form_builder/components/Dropdown.vue diff --git a/frappe/public/js/form_builder/components/Dropdown.vue b/frappe/public/js/form_builder/components/Dropdown.vue new file mode 100644 index 0000000000..23e1a0443d --- /dev/null +++ b/frappe/public/js/form_builder/components/Dropdown.vue @@ -0,0 +1,129 @@ + + + + + From 3efbc302223693f5b1c134e07190d9f512e1d505 Mon Sep 17 00:00:00 2001 From: Shariq Ansari Date: Wed, 8 Nov 2023 11:55:38 +0530 Subject: [PATCH 08/24] fix: added all options to add/remove section/column in section header --- .../js/form_builder/components/Section.vue | 317 ++++++++++++------ 1 file changed, 214 insertions(+), 103 deletions(-) diff --git a/frappe/public/js/form_builder/components/Section.vue b/frappe/public/js/form_builder/components/Section.vue index a2f8cc831a..06eb7cb595 100644 --- a/frappe/public/js/form_builder/components/Section.vue +++ b/frappe/public/js/form_builder/components/Section.vue @@ -1,10 +1,87 @@ + + - +// column +function add_column() { + props.section.columns.push({ + fields: [], + df: store.get_df("Column Break"), + }); +} + +function remove_column() { + if (store.is_customize_form && column.value.df.is_custom_field == 0) { + frappe.msgprint(__("Cannot delete standard field. You can hide it if you want")); + throw "cannot delete standard field"; + } else if (column.value.fields.length == 0 || store.has_standard_field(column.value)) { + delete_column(); + } else { + confirm_dialog( + __("Delete Column", null, "Title of confirmation dialog"), + __( + "Are you sure you want to delete the column? All the fields in the column will be moved to the previous column.", + null, + "Confirmation dialog message" + ), + () => delete_column(), + __("Delete column", null, "Button text"), + () => delete_column(true), + __("Delete entire column with fields", null, "Button text") + ); + } +} + +function delete_column(with_children) { + // move all fields to previous column + let columns = props.section.columns; + let index = columns.length - 1; + + if (with_children && index == 0 && columns.length == 1) { + if (column.value.fields.length == 0) { + frappe.msgprint(__("Section must have at least one column")); + throw "section must have at least one column"; + } + + columns.unshift({ + df: store.get_df("Column Break"), + fields: [], + is_first: true, + }); + index++; + } + + if (!with_children) { + if (index > 0) { + let prev_column = columns[index - 1]; + prev_column.fields = [...prev_column.fields, ...column.value.fields]; + } else { + if (column.value.fields.length == 0) { + // set next column as first column + let next_column = columns[index + 1]; + if (next_column) { + next_column.is_first = true; + } else { + frappe.msgprint(__("Section must have at least one column")); + throw "section must have at least one column"; + } + } else { + // create a new column if current column has fields and push fields to it + columns.unshift({ + df: store.get_df("Column Break"), + fields: column.value.fields, + is_first: true, + }); + index++; + } + } + } + + // remove column + columns.splice(index, 1); + store.form.selected_field = null; +} + +const options = computed(() => { + let groups = [ + { + group: "Section", + items: [ + { label: "Add section above", onClick: add_section_above }, + { label: "Remove section", onClick: remove_section }, + ], + }, + { + group: "Column", + items: [{ label: "Add column", onClick: add_column }], + }, + ]; + + // add remove column option if there are more than one columns + if (props.section.columns.length > 1) { + groups[1].items.push({ + label: "Remove column", + tooltip: "Remove last column", + onClick: remove_column, + }); + } else if (props.section.columns[0].fields.length) { + // add remove all fields option if there is only one column and it has fields + groups[1].items.push({ + label: "Empty column", + tooltip: "Remove all fields in the column", + onClick: () => delete_column(true), + }); + } + + // add move to tab option if the current section is not the first section + if (props.tab.sections.indexOf(props.section) > 0) { + groups[0].items.push({ + label: "Move sections to new tab", + tooltip: "Move current and all subsequent sections to a new tab", + onClick: move_sections_to_tab, + }); + } + + return groups; +}); + diff --git a/frappe/public/js/form_builder/components/controls/CheckControl.vue b/frappe/public/js/form_builder/components/controls/CheckControl.vue index fbdb76396d..e8ec928763 100644 --- a/frappe/public/js/form_builder/components/controls/CheckControl.vue +++ b/frappe/public/js/form_builder/components/controls/CheckControl.vue @@ -20,7 +20,7 @@ let slots = useSlots(); type="checkbox" :checked="value" :disabled="read_only" - @change="event => $emit('update:modelValue', event.target.checked)" + @change="(event) => $emit('update:modelValue', event.target.checked)" /> {{ df.label }} @@ -31,7 +31,8 @@ let slots = useSlots();