From cc8591e73ad15399ac6f4ae1e2066f37c2eccc82 Mon Sep 17 00:00:00 2001 From: shariquerik Date: Tue, 15 Jun 2021 11:55:24 +0530 Subject: [PATCH 01/27] fix: Report View single vertical scrollbar --- frappe/public/scss/desk/report.scss | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/frappe/public/scss/desk/report.scss b/frappe/public/scss/desk/report.scss index ea09bd8046..3e26081d62 100644 --- a/frappe/public/scss/desk/report.scss +++ b/frappe/public/scss/desk/report.scss @@ -89,9 +89,19 @@ } .report-view { - .dt-row:last-child:not(.dt-row-filter) { - .dt-cell { - border-bottom: 1px solid var(--border-color); + margin-bottom: calc(var(--page-bottom-margin) * -1); + + .result { + min-height: calc(100vh - 320px) !important; + + .dt-row:last-child:not(.dt-row-filter) { + .dt-cell { + border-bottom: 1px solid var(--border-color); + } + } + + .dt-scrollable { + height: 30vw; } } } From b6c71251a3cb73622ed91897b7d9c31610471123 Mon Sep 17 00:00:00 2001 From: shariquerik Date: Sat, 10 Jul 2021 21:58:57 +0530 Subject: [PATCH 02/27] feat: Icon Picker --- frappe/core/doctype/docfield/docfield.json | 4 +- .../doctype/custom_field/custom_field.json | 4 +- .../customize_form_field.json | 4 +- frappe/database/mariadb/database.py | 3 +- frappe/database/postgres/database.py | 3 +- frappe/model/__init__.py | 3 +- .../public/js/frappe/form/controls/control.js | 1 + frappe/public/js/frappe/form/controls/icon.js | 93 +++++++++++++++++++ frappe/public/js/frappe/form/formatters.js | 6 ++ .../js/frappe/icon_picker/icon_picker.js | 86 +++++++++++++++++ frappe/public/scss/common/controls.scss | 1 + frappe/public/scss/common/icon_picker.scss | 85 +++++++++++++++++ 12 files changed, 284 insertions(+), 9 deletions(-) create mode 100644 frappe/public/js/frappe/form/controls/icon.js create mode 100644 frappe/public/js/frappe/icon_picker/icon_picker.js create mode 100644 frappe/public/scss/common/icon_picker.scss diff --git a/frappe/core/doctype/docfield/docfield.json b/frappe/core/doctype/docfield/docfield.json index ca134665b8..ce62adc8be 100644 --- a/frappe/core/doctype/docfield/docfield.json +++ b/frappe/core/doctype/docfield/docfield.json @@ -90,7 +90,7 @@ "label": "Type", "oldfieldname": "fieldtype", "oldfieldtype": "Select", - "options": "Attach\nAttach Image\nBarcode\nButton\nCheck\nCode\nColor\nColumn Break\nCurrency\nData\nDate\nDatetime\nDuration\nDynamic Link\nFloat\nFold\nGeolocation\nHeading\nHTML\nHTML Editor\nImage\nInt\nLink\nLong Text\nMarkdown Editor\nPassword\nPercent\nRead Only\nRating\nSection Break\nSelect\nSmall Text\nTable\nTable MultiSelect\nText\nText Editor\nTime\nSignature", + "options": "Attach\nAttach Image\nBarcode\nButton\nCheck\nCode\nColor\nColumn Break\nCurrency\nData\nDate\nDatetime\nDuration\nDynamic Link\nFloat\nFold\nGeolocation\nHeading\nHTML\nHTML Editor\nIcon\nImage\nInt\nLink\nLong Text\nMarkdown Editor\nPassword\nPercent\nRead Only\nRating\nSection Break\nSelect\nSmall Text\nTable\nTable MultiSelect\nText\nText Editor\nTime\nSignature", "reqd": 1, "search_index": 1 }, @@ -487,7 +487,7 @@ "index_web_pages_for_search": 1, "istable": 1, "links": [], - "modified": "2020-10-29 06:09:26.454990", + "modified": "2021-07-10 21:56:04.167745", "modified_by": "Administrator", "module": "Core", "name": "DocField", diff --git a/frappe/custom/doctype/custom_field/custom_field.json b/frappe/custom/doctype/custom_field/custom_field.json index 2f0819ab68..442dbd61d6 100644 --- a/frappe/custom/doctype/custom_field/custom_field.json +++ b/frappe/custom/doctype/custom_field/custom_field.json @@ -120,7 +120,7 @@ "label": "Field Type", "oldfieldname": "fieldtype", "oldfieldtype": "Select", - "options": "Attach\nAttach Image\nBarcode\nButton\nCheck\nCode\nColor\nColumn Break\nCurrency\nData\nDate\nDatetime\nDuration\nDynamic Link\nFloat\nGeolocation\nHTML\nImage\nInt\nLink\nLong Text\nMarkdown Editor\nPassword\nPercent\nRating\nRead Only\nSection Break\nSelect\nSmall Text\nTable\nTable MultiSelect\nText\nText Editor\nTime\nSignature", + "options": "Attach\nAttach Image\nBarcode\nButton\nCheck\nCode\nColor\nColumn Break\nCurrency\nData\nDate\nDatetime\nDuration\nDynamic Link\nFloat\nGeolocation\nHTML\nIcon\nImage\nInt\nLink\nLong Text\nMarkdown Editor\nPassword\nPercent\nRating\nRead Only\nSection Break\nSelect\nSmall Text\nTable\nTable MultiSelect\nText\nText Editor\nTime\nSignature", "reqd": 1 }, { @@ -417,7 +417,7 @@ "idx": 1, "index_web_pages_for_search": 1, "links": [], - "modified": "2020-10-29 06:14:43.073329", + "modified": "2021-07-10 21:56:40.655396", "modified_by": "Administrator", "module": "Custom", "name": "Custom Field", diff --git a/frappe/custom/doctype/customize_form_field/customize_form_field.json b/frappe/custom/doctype/customize_form_field/customize_form_field.json index 227114137c..0a456b1026 100644 --- a/frappe/custom/doctype/customize_form_field/customize_form_field.json +++ b/frappe/custom/doctype/customize_form_field/customize_form_field.json @@ -82,7 +82,7 @@ "label": "Type", "oldfieldname": "fieldtype", "oldfieldtype": "Select", - "options": "Attach\nAttach Image\nBarcode\nButton\nCheck\nCode\nColor\nColumn Break\nCurrency\nData\nDate\nDatetime\nDuration\nDynamic Link\nFloat\nFold\nGeolocation\nHeading\nHTML\nHTML Editor\nImage\nInt\nLink\nLong Text\nMarkdown Editor\nPassword\nPercent\nRating\nRead Only\nSection Break\nSelect\nSignature\nSmall Text\nTable\nTable MultiSelect\nText\nText Editor\nTime", + "options": "Attach\nAttach Image\nBarcode\nButton\nCheck\nCode\nColor\nColumn Break\nCurrency\nData\nDate\nDatetime\nDuration\nDynamic Link\nFloat\nFold\nGeolocation\nHeading\nHTML\nHTML Editor\nIcon\nImage\nInt\nLink\nLong Text\nMarkdown Editor\nPassword\nPercent\nRating\nRead Only\nSection Break\nSelect\nSignature\nSmall Text\nTable\nTable MultiSelect\nText\nText Editor\nTime", "reqd": 1, "search_index": 1 }, @@ -428,7 +428,7 @@ "index_web_pages_for_search": 1, "istable": 1, "links": [], - "modified": "2020-10-29 06:11:57.661039", + "modified": "2021-07-10 21:57:24.479749", "modified_by": "Administrator", "module": "Custom", "name": "Customize Form Field", diff --git a/frappe/database/mariadb/database.py b/frappe/database/mariadb/database.py index 879c8394d7..e86edaa96f 100644 --- a/frappe/database/mariadb/database.py +++ b/frappe/database/mariadb/database.py @@ -49,7 +49,8 @@ class MariaDBDatabase(Database): 'Color': ('varchar', self.VARCHAR_LEN), 'Barcode': ('longtext', ''), 'Geolocation': ('longtext', ''), - 'Duration': ('decimal', '18,6') + 'Duration': ('decimal', '18,6'), + 'Icon': ('varchar', self.VARCHAR_LEN) } def get_connection(self): diff --git a/frappe/database/postgres/database.py b/frappe/database/postgres/database.py index 8235277e30..9265d701bf 100644 --- a/frappe/database/postgres/database.py +++ b/frappe/database/postgres/database.py @@ -58,7 +58,8 @@ class PostgresDatabase(Database): 'Color': ('varchar', self.VARCHAR_LEN), 'Barcode': ('text', ''), 'Geolocation': ('text', ''), - 'Duration': ('decimal', '18,6') + 'Duration': ('decimal', '18,6'), + 'Icon': ('varchar', self.VARCHAR_LEN) } def get_connection(self): diff --git a/frappe/model/__init__.py b/frappe/model/__init__.py index 75122f5aba..f63c76d2da 100644 --- a/frappe/model/__init__.py +++ b/frappe/model/__init__.py @@ -34,7 +34,8 @@ data_fieldtypes = ( 'Color', 'Barcode', 'Geolocation', - 'Duration' + 'Duration', + 'Icon' ) no_value_fields = ( diff --git a/frappe/public/js/frappe/form/controls/control.js b/frappe/public/js/frappe/form/controls/control.js index 168da2717c..bd04938e35 100644 --- a/frappe/public/js/frappe/form/controls/control.js +++ b/frappe/public/js/frappe/form/controls/control.js @@ -39,6 +39,7 @@ import './multiselect_pills'; import './multiselect_list'; import './rating'; import './duration'; +import './icon'; frappe.ui.form.make_control = function (opts) { var control_class_name = "Control" + opts.df.fieldtype.replace(/ /g, ""); diff --git a/frappe/public/js/frappe/form/controls/icon.js b/frappe/public/js/frappe/form/controls/icon.js new file mode 100644 index 0000000000..4692d6a3eb --- /dev/null +++ b/frappe/public/js/frappe/form/controls/icon.js @@ -0,0 +1,93 @@ +import Picker from '../../icon_picker/icon_picker'; + +frappe.ui.form.ControlIcon = class ControlIcon extends frappe.ui.form.ControlData { + make_input() { + this.df.placeholder = this.df.placeholder || __('Choose an icon'); + super.make_input(); + this.get_all_icons(); + this.make_icon_input(); + } + + get_all_icons() { + frappe.symbols = []; + $("#all-symbols > symbol[id]").each(function() { + frappe.symbols.push(this.id.replace('icon-','')); + }); + } + + make_icon_input() { + let picker_wrapper = $('
'); + this.picker = new Picker({ + parent: picker_wrapper, + icon: this.get_icon(), + icons: frappe.symbols + }); + + this.$wrapper.popover({ + trigger: 'manual', + offset: `${-this.$wrapper.width() / 4}, 5`, + boundary: 'viewport', + placement: 'bottom', + template: ` +
+
+
+
+ `, + content: () => picker_wrapper, + html: true + }).on('show.bs.popover', () => { + setTimeout(() => { + this.picker.refresh(); + }, 10); + }).on('hidden.bs.popover', () => { + $('body').off('click.icon-popover'); + $(window).off('hashchange.icon-popover'); + }); + + this.picker.on_change = (icon) => { + this.set_value(icon); + }; + + if (!this.selected_icon) { + this.selected_icon = $(`
${frappe.utils.icon("folder-normal", "md")}
`); + this.selected_icon.insertAfter(this.$input); + } + + this.$wrapper.find('.selected-icon').parent().on('click', (e) => { + this.$wrapper.popover('toggle'); + if (!this.get_icon()) { + this.$input.val(''); + } + e.stopPropagation(); + $('body').on('click.icon-popover', (ev) => { + if (!$(ev.target).parents().is('.popover')) { + this.$wrapper.popover('hide'); + } + }); + $(window).on('hashchange.icon-popover', () => { + this.$wrapper.popover('hide'); + }); + }); + } + + refresh() { + super.refresh(); + let icon = this.get_icon(); + if (this.picker && this.picker.icon !== icon) { + this.picker.icon = icon; + this.picker.refresh(); + } + } + + set_formatted_input(value) { + super.set_formatted_input(value); + this.$input.val(value); + this.selected_icon.find("use").attr("href", "#icon-"+(value || "folder-normal")); + this.selected_icon.toggleClass('no-value', !value); + } + + get_icon() { + return this.get_value() || 'folder-normal'; + } +}; diff --git a/frappe/public/js/frappe/form/formatters.js b/frappe/public/js/frappe/form/formatters.js index b9a838688d..bb46c82b21 100644 --- a/frappe/public/js/frappe/form/formatters.js +++ b/frappe/public/js/frappe/form/formatters.js @@ -303,6 +303,12 @@ frappe.form.formatters = {
${value}
` : ''; + }, + Icon: (value) => { + return value ? `
+
${frappe.utils.icon(value , "md")}
+ ${value} +
` : ''; } }; diff --git a/frappe/public/js/frappe/icon_picker/icon_picker.js b/frappe/public/js/frappe/icon_picker/icon_picker.js new file mode 100644 index 0000000000..21805f963b --- /dev/null +++ b/frappe/public/js/frappe/icon_picker/icon_picker.js @@ -0,0 +1,86 @@ +class Picker { + constructor(opts) { + this.parent = opts.parent; + this.width = opts.width; + this.height = opts.height; + this.set_icon(opts.icon); + this.icons = opts.icons; + this.setup_picker(); + } + + refresh() { + this.update_icon_selected(true); + } + + setup_picker() { + this.icon_picker_wrapper = $(` +
+
+ + ${frappe.utils.icon('search', "sm")} +
+
+
+
+
+ `); + this.parent.append(this.icon_picker_wrapper); + this.icon_wrapper = this.icon_picker_wrapper.find('.icons'); + this.search_input = this.icon_picker_wrapper.find('.search-icons > input'); + this.refresh(); + this.setup_icons(); + } + + setup_icons() { + this.icons.forEach(icon => { + let $icon = $(`
${frappe.utils.icon(icon, "md")}
`); + this.icon_wrapper.append($icon); + const set_values = () => { + this.set_icon(icon); + this.update_icon_selected(); + }; + $icon.on('click', () => { + set_values(); + }); + $icon.keydown((e) => { + const key_code = e.keyCode; + if ([13, 32].includes(key_code)) { + e.preventDefault(); + set_values(); + } + }); + this.search_input.keyup((e) => { + e.preventDefault(); + this.filter_icons(); + }); + + this.search_input.on('search', () => { + this.filter_icons(); + }); + }); + } + + filter_icons() { + let value = this.search_input.val(); + if (!value) { + this.icon_wrapper.find(".icon-wrapper").removeClass('hidden'); + } else { + this.icon_wrapper.find(".icon-wrapper").addClass('hidden'); + this.icon_wrapper.find(`.icon-wrapper[id*='${value}']`).removeClass('hidden'); + } + } + + update_icon_selected(silent) { + !silent && this.on_change && this.on_change(this.get_icon()); + } + + set_icon(icon) { + this.icon = icon || ''; + } + + get_icon() { + return this.icon || ''; + } +} + +export default Picker; \ No newline at end of file diff --git a/frappe/public/scss/common/controls.scss b/frappe/public/scss/common/controls.scss index c939c6de39..4d66797bba 100644 --- a/frappe/public/scss/common/controls.scss +++ b/frappe/public/scss/common/controls.scss @@ -1,5 +1,6 @@ @import "grid"; @import "color_picker"; +@import "icon_picker"; @import "datepicker"; // password diff --git a/frappe/public/scss/common/icon_picker.scss b/frappe/public/scss/common/icon_picker.scss new file mode 100644 index 0000000000..d352c5c670 --- /dev/null +++ b/frappe/public/scss/common/icon_picker.scss @@ -0,0 +1,85 @@ +.icon-picker { + font-size: var(--text-xs); + color: var(--text-muted); + --icon-picker-width: 240px; + width: var(--icon-picker-width); + .icons { + margin-top: 10px; + display: flex; + flex-wrap: wrap; + overflow-y: scroll; + max-height: 210px; + cursor: pointer; + + .icon-wrapper { + display: flex; + width: 30px; + height: 30px; + text-align: center; + align-items: center; + } + } + + .search-icons { + position: relative; + + input[type='search'] { + height: inherit; + padding-left: 30px; + } + + .search-icon { + position: absolute; + top: 7px; + left: 7px; + } + } + + /* Hide scrollbar for Chrome, Safari and Opera */ + .icons::-webkit-scrollbar { + display: none; + } + + /* Hide scrollbar for IE, Edge and Firefox */ + .icons { + -ms-overflow-style: none; /* IE and Edge */ + scrollbar-width: none; /* Firefox */ + } +} +.icon-picker-popover { + .picker-arrow { + left: 15px !important; + } +} + +.frappe-control[data-fieldtype='Icon'] { + input { + padding-left: 40px; + } + .selected-icon { + cursor: pointer; + width: 22px; + height: 22px; + border-radius: 5px; + position: absolute; + top: calc(50% + 1px); + left: 8px; + content: ' '; + } + .like-disabled-input { + .icon-value { + padding-left: 25px; + } + .selected-icon { + top: 20%; + cursor: default; + } + } +} + +.data-row.row { + .selected-icon { + top: calc(50% - 11px); + z-index: 2; + } +} \ No newline at end of file From 6386414e1e298e7ead36e2522b047baaf66cbb91 Mon Sep 17 00:00:00 2001 From: shariquerik Date: Mon, 12 Jul 2021 11:08:24 +0530 Subject: [PATCH 03/27] fix: popover position --- frappe/public/icons/timeless/symbol-defs.svg | 2 +- frappe/public/js/frappe/form/controls/icon.js | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/frappe/public/icons/timeless/symbol-defs.svg b/frappe/public/icons/timeless/symbol-defs.svg index 5e52336bfa..7845811627 100644 --- a/frappe/public/icons/timeless/symbol-defs.svg +++ b/frappe/public/icons/timeless/symbol-defs.svg @@ -1,4 +1,4 @@ -
-
${frappe.utils.icon(value , "md")}
+
${frappe.utils.icon(value, "md")}
${value}
` : ''; } diff --git a/frappe/public/scss/common/icon_picker.scss b/frappe/public/scss/common/icon_picker.scss index d352c5c670..dbb4c00b65 100644 --- a/frappe/public/scss/common/icon_picker.scss +++ b/frappe/public/scss/common/icon_picker.scss @@ -11,6 +11,15 @@ max-height: 210px; cursor: pointer; + /* Hide scrollbar for IE, Edge and Firefox */ + -ms-overflow-style: none; /* IE and Edge */ + scrollbar-width: none; /* Firefox */ + + /* Hide scrollbar for Chrome, Safari and Opera */ + &::-webkit-scrollbar { + display: none; + } + .icon-wrapper { display: flex; width: 30px; @@ -34,17 +43,6 @@ left: 7px; } } - - /* Hide scrollbar for Chrome, Safari and Opera */ - .icons::-webkit-scrollbar { - display: none; - } - - /* Hide scrollbar for IE, Edge and Firefox */ - .icons { - -ms-overflow-style: none; /* IE and Edge */ - scrollbar-width: none; /* Firefox */ - } } .icon-picker-popover { .picker-arrow { @@ -82,4 +80,16 @@ top: calc(50% - 11px); z-index: 2; } +} + +.dt-cell__content { + .selected-icon { + display: contents; + } +} + +.dt-cell__edit, .filter-field { + .selected-icon { + top: 5px !important; + } } \ No newline at end of file From 3709992dc1d7c9517e0efa2717c281069bd095d8 Mon Sep 17 00:00:00 2001 From: shariquerik Date: Mon, 12 Jul 2021 21:27:38 +0530 Subject: [PATCH 05/27] fix: query_report & report_view single vertical scrollbar --- .../js/frappe/views/reports/query_report.js | 3 ++ .../js/frappe/views/reports/report_view.js | 2 ++ frappe/public/scss/desk/report.scss | 28 +++++++++++++++---- 3 files changed, 27 insertions(+), 6 deletions(-) diff --git a/frappe/public/js/frappe/views/reports/query_report.js b/frappe/public/js/frappe/views/reports/query_report.js index 208d5b2f67..2027311bfe 100644 --- a/frappe/public/js/frappe/views/reports/query_report.js +++ b/frappe/public/js/frappe/views/reports/query_report.js @@ -518,6 +518,9 @@ frappe.views.QueryReport = class QueryReport extends frappe.views.BaseList { } else { this.page.show_form(); } + + this.page.body[0].style.setProperty('--report-filter-height', this.page.page_form.css('height')); + this.page.body.parent().css('margin-bottom', 'unset'); } set_filters(filters) { diff --git a/frappe/public/js/frappe/views/reports/report_view.js b/frappe/public/js/frappe/views/reports/report_view.js index 6a324f6034..2547dd6407 100644 --- a/frappe/public/js/frappe/views/reports/report_view.js +++ b/frappe/public/js/frappe/views/reports/report_view.js @@ -49,6 +49,8 @@ frappe.views.ReportView = class ReportView extends frappe.views.ListView { this.setup_columns(); super.setup_new_doc_event(); this.page.main.addClass('report-view'); + this.page.body[0].style.setProperty('--report-filter-height', this.page.page_form.css('height')); + this.page.body.parent().css('margin-bottom', 'unset'); } toggle_side_bar() { diff --git a/frappe/public/scss/desk/report.scss b/frappe/public/scss/desk/report.scss index 3e26081d62..b849f42b36 100644 --- a/frappe/public/scss/desk/report.scss +++ b/frappe/public/scss/desk/report.scss @@ -84,28 +84,44 @@ margin-bottom: 10px; } +.layout-main-section .frappe-card { + --report-filter-height: 0px; +} + .report-wrapper { overflow: auto; + + .datatable { + height: calc(100vh - var(--report-filter-height) - 205px); + + .dt-scrollable { + height: calc(100vh - var(--report-filter-height) - 275px); + } + } } .report-view { - margin-bottom: calc(var(--page-bottom-margin) * -1); - .result { - min-height: calc(100vh - 320px) !important; - .dt-row:last-child:not(.dt-row-filter) { .dt-cell { border-bottom: 1px solid var(--border-color); } } - .dt-scrollable { - height: 30vw; + .datatable { + height: calc(100vh - var(--report-filter-height) - 225px); + + .dt-scrollable { + height: calc(100vh - var(--report-filter-height) - 295px); + } } } } +// .frappe-card { +// height: calc(100vh - 165px); +// } + .group-by-button { margin: 5px; max-width: 125px; From 0967316c77f45772c099f781047b170b8c4f709c Mon Sep 17 00:00:00 2001 From: shariquerik Date: Mon, 12 Jul 2021 21:44:21 +0530 Subject: [PATCH 06/27] chore: remove commented code --- frappe/public/scss/desk/report.scss | 3 --- 1 file changed, 3 deletions(-) diff --git a/frappe/public/scss/desk/report.scss b/frappe/public/scss/desk/report.scss index b849f42b36..061fdef776 100644 --- a/frappe/public/scss/desk/report.scss +++ b/frappe/public/scss/desk/report.scss @@ -118,9 +118,6 @@ } } -// .frappe-card { -// height: calc(100vh - 165px); -// } .group-by-button { margin: 5px; From 792319444970d67d7414fb7ab14dfe44409e6a77 Mon Sep 17 00:00:00 2001 From: shariquerik Date: Tue, 13 Jul 2021 10:29:53 +0530 Subject: [PATCH 07/27] fix: min-height for report view --- frappe/public/scss/desk/report.scss | 1 + 1 file changed, 1 insertion(+) diff --git a/frappe/public/scss/desk/report.scss b/frappe/public/scss/desk/report.scss index 061fdef776..564b813ab2 100644 --- a/frappe/public/scss/desk/report.scss +++ b/frappe/public/scss/desk/report.scss @@ -102,6 +102,7 @@ .report-view { .result { + min-height: calc(100vh - 320px); .dt-row:last-child:not(.dt-row-filter) { .dt-cell { border-bottom: 1px solid var(--border-color); From f5c77f547ffd3db384feff6dc6cc554a8ec6347b Mon Sep 17 00:00:00 2001 From: shariquerik Date: Tue, 13 Jul 2021 10:41:25 +0530 Subject: [PATCH 08/27] fix: minor fix --- frappe/public/scss/desk/report.scss | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/frappe/public/scss/desk/report.scss b/frappe/public/scss/desk/report.scss index 564b813ab2..e2aae431aa 100644 --- a/frappe/public/scss/desk/report.scss +++ b/frappe/public/scss/desk/report.scss @@ -102,7 +102,7 @@ .report-view { .result { - min-height: calc(100vh - 320px); + min-height: 50vh !important; .dt-row:last-child:not(.dt-row-filter) { .dt-cell { border-bottom: 1px solid var(--border-color); @@ -119,7 +119,6 @@ } } - .group-by-button { margin: 5px; max-width: 125px; From 0fa9abde4c5a92e09e5ee7c50e93ce83338f8c7f Mon Sep 17 00:00:00 2001 From: Saqib Ansari Date: Tue, 13 Jul 2021 14:35:16 +0530 Subject: [PATCH 09/27] feat: add put request to integration utils --- frappe/integrations/utils.py | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/frappe/integrations/utils.py b/frappe/integrations/utils.py index 09c20568b5..565bbbad4a 100644 --- a/frappe/integrations/utils.py +++ b/frappe/integrations/utils.py @@ -47,6 +47,27 @@ def make_post_request(url, auth=None, headers=None, data=None): frappe.log_error() raise exc +def make_put_request(url, auth=None, headers=None, data=None): + if not auth: + auth = '' + if not data: + data = {} + if not headers: + headers = {} + + try: + s = get_request_session() + frappe.flags.integration_request = s.put(url, data=data, auth=auth, headers=headers) + frappe.flags.integration_request.raise_for_status() + + if frappe.flags.integration_request.headers.get("content-type") == "text/plain; charset=utf-8": + return parse_qs(frappe.flags.integration_request.text) + + return frappe.flags.integration_request.json() + except Exception as exc: + frappe.log_error() + raise exc + def create_request_log(data, integration_type, service_name, name=None, error=None): if isinstance(data, str): data = json.loads(data) From eff9f10f5d46663c01f14b8f67cc3e1d52ab3b65 Mon Sep 17 00:00:00 2001 From: Faris Ansari Date: Fri, 23 Jul 2021 01:48:39 +0530 Subject: [PATCH 10/27] fix: UX for Fetch From --- frappe/core/doctype/doctype/doctype.js | 88 +++++++++++++++++++ .../public/js/frappe/form/controls/select.js | 2 + 2 files changed, 90 insertions(+) diff --git a/frappe/core/doctype/doctype/doctype.js b/frappe/core/doctype/doctype/doctype.js index b4d3fb9a89..4039bf12a4 100644 --- a/frappe/core/doctype/doctype/doctype.js +++ b/frappe/core/doctype/doctype/doctype.js @@ -67,3 +67,91 @@ frappe.ui.form.on('DocType', { frm.set_df_property('fields', 'reqd', frm.doc.autoname !== 'Prompt'); } }) + +frappe.ui.form.on("DocField", { + form_render(frm, doctype, docname) { + // Render two select fields for Fetch From instead of Small Text for better UX + let field = frm.cur_grid.grid_form.fields_dict.fetch_from; + $(field.input_area).hide(); + + let $doctype_select = $(``); + let $wrapper = $('
'); + $wrapper.append($doctype_select, $field_select); + field.$input_wrapper.append($wrapper); + $doctype_select.wrap('
'); + $field_select.wrap('
'); + + let row = frappe.get_doc(doctype, docname); + let curr_value = { doctype: null, fieldname: null }; + if (row.fetch_from) { + let [doctype, fieldname] = row.fetch_from.split("."); + curr_value.doctype = doctype; + curr_value.fieldname = fieldname; + } + let curr_df_link_doctype = row.fieldtype == "Link" ? row.options : null; + + let doctypes = frm.doc.fields + .filter(df => df.fieldtype == "Link") + .filter(df => df.options && df.options != curr_df_link_doctype) + .map(df => ({ + label: `${df.options} (${df.fieldname})`, + value: df.fieldname + })); + $doctype_select.add_options([ + { label: __("Select DocType"), value: "", selected: true }, + ...doctypes + ]); + + $doctype_select.on("change", () => { + row.fetch_from = ""; + frm.dirty(); + update_fieldname_options(); + }); + + function update_fieldname_options() { + $field_select.find("option").remove(); + + let link_fieldname = $doctype_select.val(); + if (!link_fieldname) return; + let link_field = frm.doc.fields.find( + df => df.fieldname === link_fieldname + ); + let link_doctype = link_field.options; + frappe.model.with_doctype(link_doctype, () => { + let fields = frappe.meta + .get_docfields(link_doctype, null, { + fieldtype: ["not in", frappe.model.no_value_type] + }) + .map(df => ({ + label: `${df.label} (${df.fieldtype})`, + value: df.fieldname + })); + $field_select.add_options([ + { + label: __("Select Field"), + value: "", + selected: true, + disabled: true + }, + ...fields + ]); + + if (curr_value.fieldname) { + $field_select.val(curr_value.fieldname); + } + }); + } + + $field_select.on("change", e => { + let fetch_from = `${$doctype_select.val()}.${$field_select.val()}`; + row.fetch_from = fetch_from; + frm.dirty(); + }); + + if (curr_value.doctype) { + $doctype_select.val(curr_value.doctype); + update_fieldname_options(); + } + } +}); diff --git a/frappe/public/js/frappe/form/controls/select.js b/frappe/public/js/frappe/form/controls/select.js index 042d86814d..7df2bbfbaa 100644 --- a/frappe/public/js/frappe/form/controls/select.js +++ b/frappe/public/js/frappe/form/controls/select.js @@ -113,6 +113,7 @@ frappe.ui.form.ControlSelect = class ControlSelect extends frappe.ui.form.Contro var is_value_null = is_null(v.value); var is_label_null = is_null(v.label); var is_disabled = Boolean(v.disabled); + var is_selected = Boolean(v.selected); if (is_value_null && is_label_null) { value = v; @@ -126,6 +127,7 @@ frappe.ui.form.ControlSelect = class ControlSelect extends frappe.ui.form.Contro $('