diff --git a/frappe/desk/doctype/list_view_setting/__init__.py b/frappe/desk/doctype/list_view_setting/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/frappe/desk/doctype/list_view_setting/list_view_setting.js b/frappe/desk/doctype/list_view_setting/list_view_setting.js new file mode 100644 index 0000000000..2c70ddf82d --- /dev/null +++ b/frappe/desk/doctype/list_view_setting/list_view_setting.js @@ -0,0 +1,8 @@ +// Copyright (c) 2019, Frappe Technologies and contributors +// For license information, please see license.txt + +frappe.ui.form.on('List View Setting', { + // refresh: function(frm) { + + // } +}); diff --git a/frappe/desk/doctype/list_view_setting/list_view_setting.json b/frappe/desk/doctype/list_view_setting/list_view_setting.json new file mode 100644 index 0000000000..cd18d3f766 --- /dev/null +++ b/frappe/desk/doctype/list_view_setting/list_view_setting.json @@ -0,0 +1,160 @@ +{ + "allow_copy": 0, + "allow_events_in_timeline": 0, + "allow_guest_to_view": 0, + "allow_import": 0, + "allow_rename": 0, + "autoname": "Prompt", + "beta": 0, + "creation": "2019-03-06 13:29:21.101860", + "custom": 0, + "docstatus": 0, + "doctype": "DocType", + "document_type": "", + "editable_grid": 1, + "engine": "InnoDB", + "fields": [ + { + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "disable_count", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Disable Count", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "disable_sidebar_stats", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Disable Sidebar Stats", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "disable_auto_refresh", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Disable Auto Refresh", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + } + ], + "has_web_view": 0, + "hide_heading": 0, + "hide_toolbar": 0, + "idx": 0, + "image_view": 0, + "in_create": 0, + "is_submittable": 0, + "issingle": 0, + "istable": 0, + "max_attachments": 0, + "modified": "2019-03-06 13:40:59.533586", + "modified_by": "Administrator", + "module": "Desk", + "name": "List View Setting", + "name_case": "", + "owner": "Administrator", + "permissions": [ + { + "amend": 0, + "cancel": 0, + "create": 1, + "delete": 1, + "email": 1, + "export": 0, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 0, + "role": "System Manager", + "set_user_permissions": 0, + "share": 1, + "submit": 0, + "write": 1 + } + ], + "quick_entry": 0, + "read_only": 0, + "read_only_onload": 0, + "show_name_in_global_search": 0, + "sort_field": "modified", + "sort_order": "DESC", + "track_changes": 1, + "track_seen": 0, + "track_views": 0 +} \ No newline at end of file diff --git a/frappe/desk/doctype/list_view_setting/list_view_setting.py b/frappe/desk/doctype/list_view_setting/list_view_setting.py new file mode 100644 index 0000000000..b66dc29a43 --- /dev/null +++ b/frappe/desk/doctype/list_view_setting/list_view_setting.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2019, Frappe Technologies and contributors +# For license information, please see license.txt + +from __future__ import unicode_literals +# import frappe +from frappe.model.document import Document + +class ListViewSetting(Document): + pass diff --git a/frappe/desk/doctype/list_view_setting/test_list_view_setting.py b/frappe/desk/doctype/list_view_setting/test_list_view_setting.py new file mode 100644 index 0000000000..143fc4cce7 --- /dev/null +++ b/frappe/desk/doctype/list_view_setting/test_list_view_setting.py @@ -0,0 +1,9 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2019, Frappe Technologies and Contributors +# See license.txt +from __future__ import unicode_literals + +import unittest + +class TestListViewSetting(unittest.TestCase): + pass diff --git a/frappe/desk/listview.py b/frappe/desk/listview.py new file mode 100644 index 0000000000..8d439f228a --- /dev/null +++ b/frappe/desk/listview.py @@ -0,0 +1,26 @@ +# Copyright (c) 2019, Frappe Technologies Pvt. Ltd. and Contributors +# MIT License. See license.txt +from __future__ import unicode_literals + +import frappe +import json + + +@frappe.whitelist() +def get_list_settings(doctype): + try: + return frappe.get_cached_doc("List View Setting", doctype) + except frappe.DoesNotExistError: + frappe.clear_messages() + + +@frappe.whitelist() +def set_list_settings(doctype, values): + try: + doc = frappe.get_doc("List View Setting", doctype) + except frappe.DoesNotExistError: + doc = frappe.new_doc("List View Setting") + doc.name = doctype + frappe.clear_messages() + doc.update(json.loads(values)) + doc.save() diff --git a/frappe/public/js/frappe/list/list_sidebar.js b/frappe/public/js/frappe/list/list_sidebar.js index 1735bae13d..74ea628e82 100644 --- a/frappe/public/js/frappe/list/list_sidebar.js +++ b/frappe/public/js/frappe/list/list_sidebar.js @@ -258,6 +258,9 @@ frappe.views.ListSidebar = class ListSidebar { get_stats() { var me = this; + if (this.list_view.list_view_settings.disable_sidebar_stats) { + return; + } frappe.call({ method: 'frappe.desk.reportview.get_sidebar_stats', type: 'GET', diff --git a/frappe/public/js/frappe/list/list_view.js b/frappe/public/js/frappe/list/list_view.js index 6addbc0c2b..d4c411fce3 100644 --- a/frappe/public/js/frappe/list/list_view.js +++ b/frappe/public/js/frappe/list/list_view.js @@ -87,6 +87,11 @@ frappe.views.ListView = class ListView extends frappe.views.BaseList { } this.patch_refresh_and_load_lib(); + return this.get_list_view_settings(); + } + + get_list_view_settings() { + return frappe.call("frappe.desk.listview.get_list_settings", {doctype: this.doctype}).then(doc => this.list_view_settings = doc.message || {}); } on_sort_change(sort_by, sort_order) { @@ -289,7 +294,9 @@ frappe.views.ListView = class ListView extends frappe.views.BaseList { } freeze() { - this.$result.find('.list-count').html(`${__('Refreshing')}...`); + if (!this.list_view_settings.disable_count) { + this.$result.find('.list-count').html(`${__('Refreshing')}...`); + } } get_args() { @@ -375,10 +382,11 @@ frappe.views.ListView = class ListView extends frappe.views.BaseList { } render_count() { - this.get_count_str() - .then(str => { + if (!this.list_view_settings.disable_count) { + this.get_count_str().then(str => { this.$result.find('.list-count').html(`${str}`); }); + } } render_tags() { @@ -824,6 +832,9 @@ frappe.views.ListView = class ListView extends frappe.views.BaseList { } setup_realtime_updates() { + if (this.list_view_settings.disable_auto_refresh) { + return; + } frappe.realtime.on('list_update', data => { if (this.filter_area.is_being_edited()) { return; @@ -1026,9 +1037,33 @@ frappe.views.ListView = class ListView extends frappe.views.BaseList { }); } + if (frappe.user.has_role('System Manager')) { + items.push({ + label: __('Settings'), + action: () => this.show_list_settings(), + standard: true + }); + } return items; } + show_list_settings() { + frappe.model.with_doctype("List View Setting", () => { + let d = new frappe.ui.Dialog({ + title: __("Settings"), + fields: frappe.get_meta("List View Setting").fields + }); + d.set_values(this.list_view_settings); + d.show(); + d.set_primary_action(__('Save'), () => { + let values = d.get_values(); + frappe.call("frappe.desk.listview.set_list_settings", {doctype: this.doctype, values: values}); + Object.assign(this.list_view_settings, values); + d.hide(); + }); + }); + } + get_actions_menu_items() { const doctype = this.doctype; const actions_menu_items = []; diff --git a/frappe/tests/test_listview.py b/frappe/tests/test_listview.py new file mode 100644 index 0000000000..5c0657e9ee --- /dev/null +++ b/frappe/tests/test_listview.py @@ -0,0 +1,53 @@ +# Copyright (c) 2019, Frappe Technologies Pvt. Ltd. and Contributors +# MIT License. See license.txt +from __future__ import unicode_literals + +import unittest +import frappe +import json + +from frappe.desk.listview import get_list_settings, set_list_settings + +class TestListView(unittest.TestCase): + def setUp(self): + if frappe.db.exists("List View Setting", "DocType"): + frappe.delete_doc("List View Setting", "DocType") + + def test_get_list_settings_without_settings(self): + self.assertIsNone(get_list_settings("DocType"), None) + + def test_get_list_settings_with_default_settings(self): + frappe.get_doc({"doctype": "List View Setting", "name": "DocType"}).insert() + settings = get_list_settings("DocType") + self.assertIsNotNone(settings) + + self.assertEqual(settings.disable_auto_refresh, 0) + self.assertEqual(settings.disable_count, 0) + self.assertEqual(settings.disable_sidebar_stats, 0) + + def test_get_list_settings_with_non_default_settings(self): + frappe.get_doc({"doctype": "List View Setting", "name": "DocType", "disable_count": 1}).insert() + settings = get_list_settings("DocType") + self.assertIsNotNone(settings) + + self.assertEqual(settings.disable_auto_refresh, 0) + self.assertEqual(settings.disable_count, 1) + self.assertEqual(settings.disable_sidebar_stats, 0) + + def test_set_list_settings_without_settings(self): + set_list_settings("DocType", json.dumps({})) + settings = frappe.get_doc("List View Setting","DocType") + + self.assertEqual(settings.disable_auto_refresh, 0) + self.assertEqual(settings.disable_count, 0) + self.assertEqual(settings.disable_sidebar_stats, 0) + + def test_set_list_settings_with_existing_settings(self): + frappe.get_doc({"doctype": "List View Setting", "name": "DocType", "disable_count": 1}).insert() + set_list_settings("DocType", json.dumps({"disable_count": 0, "disable_auto_refresh": 1})) + settings = frappe.get_doc("List View Setting","DocType") + + self.assertEqual(settings.disable_auto_refresh, 1) + self.assertEqual(settings.disable_count, 0) + self.assertEqual(settings.disable_sidebar_stats, 0) +