From 67277507f041e9905cadb991bc3754ee4cf4ca70 Mon Sep 17 00:00:00 2001 From: Faris Ansari Date: Fri, 28 Jul 2017 14:30:18 +0530 Subject: [PATCH 1/7] [hotfix] Linked with and List item click (#3803) * [hotfix] Linked with and List item click * Run a single test using Test Runner * Add test for Linked With * [minor] List view fixes --- .../core/doctype/test_runner/test_runner.js | 3 ++- .../core/doctype/test_runner/test_runner.py | 5 +++-- frappe/public/js/frappe/list/list_renderer.js | 7 ++++++- frappe/public/js/frappe/ui/filters/filters.js | 1 + frappe/tests/ui/test_linked_with.js | 19 +++++++++++++++++++ frappe/tests/ui/tests.txt | 3 ++- 6 files changed, 33 insertions(+), 5 deletions(-) create mode 100644 frappe/tests/ui/test_linked_with.js diff --git a/frappe/core/doctype/test_runner/test_runner.js b/frappe/core/doctype/test_runner/test_runner.js index d5cac7f8a5..87ea09fab7 100644 --- a/frappe/core/doctype/test_runner/test_runner.js +++ b/frappe/core/doctype/test_runner/test_runner.js @@ -11,7 +11,8 @@ frappe.ui.form.on('Test Runner', { // all tests frappe.call({ - method: 'frappe.core.doctype.test_runner.test_runner.get_test_js' + method: 'frappe.core.doctype.test_runner.test_runner.get_test_js', + args: { test_path: frm.doc.module_path } }).always((data) => { $("
").appendTo(wrapper.empty()); frm.events.run_tests(frm, data.message); diff --git a/frappe/core/doctype/test_runner/test_runner.py b/frappe/core/doctype/test_runner/test_runner.py index c09d75ae4f..2961e9f38b 100644 --- a/frappe/core/doctype/test_runner/test_runner.py +++ b/frappe/core/doctype/test_runner/test_runner.py @@ -10,9 +10,10 @@ class TestRunner(Document): pass @frappe.whitelist() -def get_test_js(): +def get_test_js(test_path=None): '''Get test + data for app, example: app/tests/ui/test_name.js''' - test_path = frappe.db.get_single_value('Test Runner', 'module_path') + if not test_path: + test_path = frappe.db.get_single_value('Test Runner', 'module_path') test_js = [] # split diff --git a/frappe/public/js/frappe/list/list_renderer.js b/frappe/public/js/frappe/list/list_renderer.js index 02940e1bec..65f52c910c 100644 --- a/frappe/public/js/frappe/list/list_renderer.js +++ b/frappe/public/js/frappe/list/list_renderer.js @@ -271,7 +271,10 @@ frappe.views.ListRenderer = Class.extend({ setup_filterable: function () { var me = this; + + this.list_view.wrapper && this.list_view.wrapper.on('click', '.result-list .filterable', function (e) { + e.stopPropagation(); var filters = $(this).attr('data-filter').split('|'); var added = false; @@ -294,7 +297,9 @@ frappe.views.ListRenderer = Class.extend({ me.list_view.refresh(true); } }); - this.wrapper.on('click', '.list-item', function (e) { + + this.list_view.wrapper && + this.list_view.wrapper.on('click', '.list-item', function (e) { // don't open in case of checkbox, like, filterable if ($(e.target).hasClass('filterable') || $(e.target).hasClass('octicon-heart') diff --git a/frappe/public/js/frappe/ui/filters/filters.js b/frappe/public/js/frappe/ui/filters/filters.js index b338d23f3d..0d74e61b84 100644 --- a/frappe/public/js/frappe/ui/filters/filters.js +++ b/frappe/public/js/frappe/ui/filters/filters.js @@ -87,6 +87,7 @@ frappe.ui.FilterList = Class.extend({ } var filter = this.push_new_filter(doctype, fieldname, condition, value); + if (!filter) return; if(this.wrapper.find('.clear-filters').hasClass("hide")) { this.wrapper.find('.clear-filters').removeClass("hide"); diff --git a/frappe/tests/ui/test_linked_with.js b/frappe/tests/ui/test_linked_with.js new file mode 100644 index 0000000000..aeaced2d19 --- /dev/null +++ b/frappe/tests/ui/test_linked_with.js @@ -0,0 +1,19 @@ +QUnit.module('form'); + +QUnit.test("Test Linked With", function(assert) { + assert.expect(2); + const done = assert.async(); + + frappe.run_serially([ + () => frappe.set_route('Form', 'Module Def', 'Contacts'), + () => frappe.tests.click_page_head_item('Menu'), + () => frappe.tests.click_dropdown_item('Links'), + () => frappe.timeout(4), + () => { + assert.equal(cur_dialog.title, 'Linked With', 'Linked with dialog is opened'); + const link_tables_count = cur_dialog.$wrapper.find('.list-item-table').length; + assert.equal(link_tables_count, 2, 'Two DocTypes are linked with Contacts'); + }, + done + ]); +}); \ No newline at end of file diff --git a/frappe/tests/ui/tests.txt b/frappe/tests/ui/tests.txt index de7d34fddb..b94f64aa63 100644 --- a/frappe/tests/ui/tests.txt +++ b/frappe/tests/ui/tests.txt @@ -2,4 +2,5 @@ frappe/tests/ui/test_number_format.js frappe/tests/ui/test_list/test_list_filter.js frappe/tests/ui/test_list/test_list_paging.js frappe/tests/ui/test_module_view.js -frappe/tests/ui/test_calendar_view.js \ No newline at end of file +frappe/tests/ui/test_calendar_view.js +frappe/tests/ui/test_linked_with.js \ No newline at end of file From 04aa13fc9bac1679474f0cf15db37cbb963afc58 Mon Sep 17 00:00:00 2001 From: mbauskar Date: Fri, 28 Jul 2017 16:34:43 +0600 Subject: [PATCH 2/7] bumped to version 8.6.3 --- frappe/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/__init__.py b/frappe/__init__.py index 28fca585a7..cd5c0cd7f4 100644 --- a/frappe/__init__.py +++ b/frappe/__init__.py @@ -14,7 +14,7 @@ import os, sys, importlib, inspect, json from .exceptions import * from .utils.jinja import get_jenv, get_template, render_template, get_email_from_template -__version__ = '8.6.2' +__version__ = '8.6.3' __title__ = "Frappe Framework" local = Local() From 4396cbd0cc9bfcfc4ed7d3b0b356286297419b36 Mon Sep 17 00:00:00 2001 From: rohitwaghchaure Date: Mon, 31 Jul 2017 10:15:06 +0530 Subject: [PATCH 3/7] [Fix] Getting an error datetime.datetime is not iterable during importing purchase invoice data (#3818) --- frappe/core/page/data_import_tool/importer.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/frappe/core/page/data_import_tool/importer.py b/frappe/core/page/data_import_tool/importer.py index 3514c1b877..dd4a872111 100644 --- a/frappe/core/page/data_import_tool/importer.py +++ b/frappe/core/page/data_import_tool/importer.py @@ -118,7 +118,8 @@ def upload(rows = None, submit_after_import=None, ignore_encoding_errors=False, elif fieldtype in ("Float", "Currency", "Percent"): d[fieldname] = flt(d[fieldname]) elif fieldtype == "Date": - d[fieldname] = getdate(parse_date(d[fieldname])) if d[fieldname] else None + if d[fieldname] and isinstance(d[fieldname], basestring): + d[fieldname] = getdate(parse_date(d[fieldname])) elif fieldtype == "Datetime": if d[fieldname]: if " " in d[fieldname]: From c4292ac6a45ebd0cd8f49faf8e938a73f0db15b0 Mon Sep 17 00:00:00 2001 From: ci2014 Date: Mon, 31 Jul 2017 06:57:00 +0200 Subject: [PATCH 4/7] Update quick_entry.js (#3815) Fix typo --- frappe/public/js/frappe/form/quick_entry.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/public/js/frappe/form/quick_entry.js b/frappe/public/js/frappe/form/quick_entry.js index 299f14176d..ffce4dceff 100644 --- a/frappe/public/js/frappe/form/quick_entry.js +++ b/frappe/public/js/frappe/form/quick_entry.js @@ -141,7 +141,7 @@ frappe.ui.form.QuickEntryForm = Class.extend({ frappe.ui.form.update_calling_link(me.dialog.doc); } else { if(me.after_insert) { - me.after_insert(me.dialig.doc); + me.after_insert(me.dialog.doc); } else { me.open_from_if_not_list(); } From 99317b2f65045612602aed5c967efecdebd3c5ff Mon Sep 17 00:00:00 2001 From: mbauskar Date: Mon, 31 Jul 2017 12:50:09 +0600 Subject: [PATCH 5/7] bumped to version 8.6.4 --- frappe/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/__init__.py b/frappe/__init__.py index cd5c0cd7f4..3b99b44b9e 100644 --- a/frappe/__init__.py +++ b/frappe/__init__.py @@ -14,7 +14,7 @@ import os, sys, importlib, inspect, json from .exceptions import * from .utils.jinja import get_jenv, get_template, render_template, get_email_from_template -__version__ = '8.6.3' +__version__ = '8.6.4' __title__ = "Frappe Framework" local = Local() From eb2c725dba85c2a3a977cf3c13a8bb0c6bcf80bf Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Wed, 2 Aug 2017 17:53:28 +0530 Subject: [PATCH 6/7] [fix] stop action if trigger fails for validate and before_, fixes frappe/erpnext#10200 (#3842) * [fix] stop action if trigger fails for validate and before_, fixes frappe/erpnext#10200 * [fix] stop action if trigger fails for validate and before_, fixes frappe/erpnext#10200 * [fix] codacy * [fix] add test to tests.txt --- .../customize_form/test_customize_form.js | 31 +++++++++++++++++++ frappe/public/js/frappe/form/grid_row.js | 25 +++++++++------ frappe/public/js/legacy/form.js | 16 ++++++---- frappe/tests/ui/tests.txt | 3 +- 4 files changed, 59 insertions(+), 16 deletions(-) create mode 100644 frappe/custom/doctype/customize_form/test_customize_form.js diff --git a/frappe/custom/doctype/customize_form/test_customize_form.js b/frappe/custom/doctype/customize_form/test_customize_form.js new file mode 100644 index 0000000000..144d11a9ae --- /dev/null +++ b/frappe/custom/doctype/customize_form/test_customize_form.js @@ -0,0 +1,31 @@ +// try and delete a standard row, it should fail + +QUnit.module('Customize Form'); + +QUnit.test("test customize form", function(assert) { + assert.expect(2); + let done = assert.async(); + frappe.run_serially([ + () => frappe.set_route('Form', 'Customize Form'), + () => cur_frm.set_value('doc_type', 'ToDo'), + + () => frappe.timeout(2), + + () => assert.equal(cur_frm.doc.fields[1].fieldname, 'status'), + + // open "status" row + () => cur_frm.fields_dict.fields.grid.grid_rows[1].toggle_view(), + () => frappe.timeout(0.5), + + // try deleting it + () => $('.grid-delete-row:visible').click(), + + () => frappe.timeout(0.5), + () => frappe.hide_msgprint(), + () => frappe.timeout(0.5), + + // status still exists + () => assert.equal(cur_frm.doc.fields[1].fieldname, 'status'), + () => done() + ]); +}); diff --git a/frappe/public/js/frappe/form/grid_row.js b/frappe/public/js/frappe/form/grid_row.js index 3ff9f85198..9326c03da7 100644 --- a/frappe/public/js/frappe/form/grid_row.js +++ b/frappe/public/js/frappe/form/grid_row.js @@ -68,15 +68,22 @@ frappe.ui.form.GridRow = Class.extend({ this.hide_form(); } - this.frm.script_manager.trigger("before_" + this.grid.df.fieldname + "_remove", - this.doc.doctype, this.doc.name); - - //this.wrapper.toggle(false); - frappe.model.clear_doc(this.doc.doctype, this.doc.name); - - this.frm.script_manager.trigger(this.grid.df.fieldname + "_remove", - this.doc.doctype, this.doc.name); - this.frm.dirty(); + frappe.run_serially([ + () => { + return this.frm.script_manager.trigger("before_" + this.grid.df.fieldname + "_remove", + this.doc.doctype, this.doc.name); + }, + () => { + frappe.model.clear_doc(this.doc.doctype, this.doc.name); + + this.frm.script_manager.trigger(this.grid.df.fieldname + "_remove", + this.doc.doctype, this.doc.name); + this.frm.dirty(); + } + ]).catch((e) => { + // aborted + console.trace(e); // eslint-disable-line + }); } else { this.grid.df.data = this.grid.df.data.filter(function(d) { return d.name !== me.doc.name; diff --git a/frappe/public/js/legacy/form.js b/frappe/public/js/legacy/form.js index b9f0d1538d..b431446fd3 100644 --- a/frappe/public/js/legacy/form.js +++ b/frappe/public/js/legacy/form.js @@ -720,6 +720,14 @@ _f.Frm.prototype._save = function(save_action, callback, btn, on_error, resolve) resolve(); }; + var fail = () => { + btn && $(btn).prop("disabled", false); + if(on_error) { + on_error(); + } + resolve(); + }; + if(save_action != "Update") { // validate frappe.validated = true; @@ -728,17 +736,13 @@ _f.Frm.prototype._save = function(save_action, callback, btn, on_error, resolve) () => this.script_manager.trigger("before_save"), () => { if(!frappe.validated) { - btn && $(btn).prop("disabled", false); - if(on_error) { - on_error(); - } - resolve(); + fail(); return; } frappe.ui.form.save(me, save_action, after_save, btn); } - ]); + ]).catch(fail); } else { frappe.ui.form.save(me, save_action, after_save, btn); } diff --git a/frappe/tests/ui/tests.txt b/frappe/tests/ui/tests.txt index b94f64aa63..7c3c630da6 100644 --- a/frappe/tests/ui/tests.txt +++ b/frappe/tests/ui/tests.txt @@ -3,4 +3,5 @@ frappe/tests/ui/test_list/test_list_filter.js frappe/tests/ui/test_list/test_list_paging.js frappe/tests/ui/test_module_view.js frappe/tests/ui/test_calendar_view.js -frappe/tests/ui/test_linked_with.js \ No newline at end of file +frappe/tests/ui/test_linked_with.js +frappe/custom/doctype/customize_form/test_customize_form.js \ No newline at end of file From 3f854301e4c69e087b1370ca3b7c834a55a651ea Mon Sep 17 00:00:00 2001 From: mbauskar Date: Wed, 2 Aug 2017 18:38:03 +0600 Subject: [PATCH 7/7] bumped to version 8.6.5 --- frappe/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/__init__.py b/frappe/__init__.py index 3b99b44b9e..70d9b692a7 100644 --- a/frappe/__init__.py +++ b/frappe/__init__.py @@ -14,7 +14,7 @@ import os, sys, importlib, inspect, json from .exceptions import * from .utils.jinja import get_jenv, get_template, render_template, get_email_from_template -__version__ = '8.6.4' +__version__ = '8.6.5' __title__ = "Frappe Framework" local = Local()