From 90fb3ebcb9faa480ceb237134cc6c4dbc2998855 Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Mon, 4 Apr 2016 16:56:35 +0530 Subject: [PATCH] [enhancement] added image_field so image will appear in the sidebar --- frappe/core/doctype/doctype/doctype.json | 84 ++++++++++++------- frappe/core/doctype/doctype/doctype.py | 12 +++ frappe/core/doctype/user/user.json | 59 ++++++------- frappe/core/page/data_import_tool/importer.py | 3 + .../customize_form/customize_form.json | 76 ++++++++++++++++- .../doctype/customize_form/customize_form.py | 1 + frappe/data/Framework.sql | 1 + frappe/patches.txt | 2 +- frappe/public/build.json | 1 + frappe/public/css/avatar.css | 1 + frappe/public/css/sidebar.css | 16 ++++ .../public/js/frappe/form/form_sidebar.html | 2 +- frappe/public/js/frappe/form/sidebar.js | 45 +--------- frappe/public/js/frappe/form/user_image.js | 49 +++++++++++ frappe/public/js/frappe/misc/common.js | 3 +- frappe/public/js/legacy/form.js | 1 + frappe/public/less/avatar.less | 1 + frappe/public/less/sidebar.less | 17 ++++ frappe/utils/__init__.py | 6 ++ 19 files changed, 274 insertions(+), 106 deletions(-) create mode 100644 frappe/public/js/frappe/form/user_image.js diff --git a/frappe/core/doctype/doctype/doctype.json b/frappe/core/doctype/doctype/doctype.json index 5e4dabfc96..289d7c2cd3 100644 --- a/frappe/core/doctype/doctype/doctype.json +++ b/frappe/core/doctype/doctype/doctype.json @@ -444,33 +444,6 @@ "set_only_once": 0, "unique": 0 }, - { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "depends_on": "eval:!doc.istable", - "description": "Comments and Communications will be associated with this linked document", - "fieldname": "timeline_field", - "fieldtype": "Data", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Timeline Field", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, { "allow_on_submit": 0, "bold": 0, @@ -498,6 +471,32 @@ "set_only_once": 0, "unique": 0 }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "description": "Must be of type \"Attach Image\"", + "fieldname": "image_field", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Image Field", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, { "allow_on_submit": 0, "bold": 0, @@ -552,6 +551,33 @@ "set_only_once": 0, "unique": 0 }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "depends_on": "eval:!doc.istable", + "description": "Comments and Communications will be associated with this linked document", + "fieldname": "timeline_field", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Timeline Field", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, { "allow_on_submit": 0, "bold": 0, @@ -1013,14 +1039,14 @@ "hide_heading": 0, "hide_toolbar": 0, "icon": "icon-bolt", - "idx": 1, + "idx": 6, "in_create": 0, "in_dialog": 0, "is_submittable": 0, "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2016-03-30 01:36:35.902766", + "modified": "2016-04-04 06:38:29.598545", "modified_by": "Administrator", "module": "Core", "name": "DocType", diff --git a/frappe/core/doctype/doctype/doctype.py b/frappe/core/doctype/doctype/doctype.py index a4e047b699..16ae945635 100644 --- a/frappe/core/doctype/doctype/doctype.py +++ b/frappe/core/doctype/doctype/doctype.py @@ -402,6 +402,18 @@ def validate_fields(meta): _validate_title_field_pattern(df.options) _validate_title_field_pattern(df.default) + def check_image_field(meta): + '''check image_field exists and is of type "Attach Image"''' + if not meta.image_field: + return + + df = meta.get("fields", {"fieldname": meta.image_field}) + if not df: + frappe.throw(_("Image field must be a valid fieldname"), InvalidFieldNameError) + if df[0].fieldtype != 'Attach Image': + frappe.throw(_("Image field must be of type Attach Image"), InvalidFieldNameError) + + def check_timeline_field(meta): if not meta.timeline_field: return diff --git a/frappe/core/doctype/user/user.json b/frappe/core/doctype/user/user.json index 6373ba9c99..a751c88919 100644 --- a/frappe/core/doctype/user/user.json +++ b/frappe/core/doctype/user/user.json @@ -215,31 +215,6 @@ "set_only_once": 0, "unique": 0 }, - { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "fieldname": "username", - "fieldtype": "Data", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Username", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 1 - }, { "allow_on_submit": 0, "bold": 0, @@ -317,6 +292,31 @@ "unique": 0, "width": "50%" }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "username", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Username", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 1 + }, { "allow_on_submit": 0, "bold": 0, @@ -375,7 +375,7 @@ "description": "Get your globally recognized avatar from Gravatar.com", "fieldname": "user_image", "fieldtype": "Attach Image", - "hidden": 0, + "hidden": 1, "ignore_user_permissions": 0, "ignore_xss_filter": 0, "in_filter": 0, @@ -384,7 +384,7 @@ "length": 0, "no_copy": 1, "permlevel": 0, - "print_hide": 0, + "print_hide": 1, "print_hide_if_no_value": 0, "read_only": 0, "report_hide": 0, @@ -1508,7 +1508,8 @@ "hide_heading": 0, "hide_toolbar": 0, "icon": "icon-user", - "idx": 403, + "idx": 413, + "image_field": "user_image", "in_create": 0, "in_dialog": 0, "is_submittable": 0, @@ -1516,7 +1517,7 @@ "istable": 0, "max_attachments": 5, "menu_index": 0, - "modified": "2016-04-01 07:23:20.806153", + "modified": "2016-04-04 06:45:42.330517", "modified_by": "Administrator", "module": "Core", "name": "User", diff --git a/frappe/core/page/data_import_tool/importer.py b/frappe/core/page/data_import_tool/importer.py index ea0292644d..8d63103591 100644 --- a/frappe/core/page/data_import_tool/importer.py +++ b/frappe/core/page/data_import_tool/importer.py @@ -21,6 +21,8 @@ def upload(rows = None, submit_after_import=None, ignore_encoding_errors=False, ignore_links=False, pre_process=None, via_console=False): """upload data""" frappe.flags.mute_emails = True + frappe.flags.in_upload = True + # extra input params params = json.loads(frappe.form_dict.get("params") or '{}') @@ -275,6 +277,7 @@ def upload(rows = None, submit_after_import=None, ignore_encoding_errors=False, frappe.db.commit() frappe.flags.mute_emails = False + frappe.flags.in_upload = False return {"messages": ret, "error": error} diff --git a/frappe/custom/doctype/customize_form/customize_form.json b/frappe/custom/doctype/customize_form/customize_form.json index 435ba4c948..c7e97ab7dc 100644 --- a/frappe/custom/doctype/customize_form/customize_form.json +++ b/frappe/custom/doctype/customize_form/customize_form.json @@ -7,6 +7,7 @@ "custom": 0, "docstatus": 0, "doctype": "DocType", + "document_type": "Document", "fields": [ { "allow_on_submit": 0, @@ -16,13 +17,16 @@ "fieldtype": "Link", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 1, "label": "Enter Form Type", + "length": 0, "no_copy": 0, "options": "DocType", "permlevel": 0, "print_hide": 0, + "print_hide_if_no_value": 0, "read_only": 0, "report_hide": 0, "reqd": 0, @@ -39,12 +43,15 @@ "fieldtype": "Section Break", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "", + "length": 0, "no_copy": 0, "permlevel": 0, "print_hide": 0, + "print_hide_if_no_value": 0, "read_only": 0, "report_hide": 0, "reqd": 0, @@ -60,13 +67,16 @@ "fieldtype": "Link", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 1, "label": "Default Print Format", + "length": 0, "no_copy": 0, "options": "Print Format", "permlevel": 0, "print_hide": 0, + "print_hide_if_no_value": 0, "read_only": 0, "report_hide": 0, "reqd": 0, @@ -83,12 +93,15 @@ "fieldtype": "Int", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "Max Attachments", + "length": 0, "no_copy": 0, "permlevel": 0, "print_hide": 0, + "print_hide_if_no_value": 0, "read_only": 0, "report_hide": 0, "reqd": 0, @@ -104,12 +117,15 @@ "fieldtype": "Check", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "Hide Copy", + "length": 0, "no_copy": 0, "permlevel": 0, "print_hide": 0, + "print_hide_if_no_value": 0, "read_only": 0, "report_hide": 0, "reqd": 0, @@ -125,12 +141,15 @@ "fieldtype": "Column Break", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, + "length": 0, "no_copy": 0, "permlevel": 0, "precision": "", "print_hide": 0, + "print_hide_if_no_value": 0, "read_only": 0, "report_hide": 0, "reqd": 0, @@ -147,13 +166,42 @@ "fieldtype": "Data", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "Title Field", + "length": 0, "no_copy": 0, "permlevel": 0, "precision": "", "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "description": "Must be of type \"Attach Image\"", + "fieldname": "image_field", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Image Field", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, "read_only": 0, "report_hide": 0, "reqd": 0, @@ -170,12 +218,15 @@ "fieldtype": "Data", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 1, "label": "Search Fields", + "length": 0, "no_copy": 0, "permlevel": 0, "print_hide": 0, + "print_hide_if_no_value": 0, "read_only": 0, "report_hide": 0, "reqd": 0, @@ -192,12 +243,15 @@ "fieldtype": "Section Break", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, + "length": 0, "no_copy": 0, "permlevel": 0, "precision": "", "print_hide": 0, + "print_hide_if_no_value": 0, "read_only": 0, "report_hide": 0, "reqd": 0, @@ -213,12 +267,15 @@ "fieldtype": "Select", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "Sort Field", + "length": 0, "no_copy": 0, "permlevel": 0, "print_hide": 0, + "print_hide_if_no_value": 0, "read_only": 0, "report_hide": 0, "reqd": 0, @@ -234,12 +291,15 @@ "fieldtype": "Column Break", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, + "length": 0, "no_copy": 0, "permlevel": 0, "precision": "", "print_hide": 0, + "print_hide_if_no_value": 0, "read_only": 0, "report_hide": 0, "reqd": 0, @@ -255,13 +315,16 @@ "fieldtype": "Select", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "Sort Order", + "length": 0, "no_copy": 0, "options": "ASC\nDESC", "permlevel": 0, "print_hide": 0, + "print_hide_if_no_value": 0, "read_only": 0, "report_hide": 0, "reqd": 0, @@ -279,12 +342,15 @@ "fieldtype": "Section Break", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "Fields", + "length": 0, "no_copy": 0, "permlevel": 0, "print_hide": 0, + "print_hide_if_no_value": 0, "read_only": 0, "report_hide": 0, "reqd": 0, @@ -300,13 +366,16 @@ "fieldtype": "Table", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "Fields", + "length": 0, "no_copy": 0, "options": "Customize Form Field", "permlevel": 0, "print_hide": 0, + "print_hide_if_no_value": 0, "read_only": 0, "report_hide": 0, "reqd": 0, @@ -324,7 +393,8 @@ "is_submittable": 0, "issingle": 1, "istable": 0, - "modified": "2015-10-21 08:11:19.151364", + "max_attachments": 0, + "modified": "2016-04-04 06:39:02.555760", "modified_by": "Administrator", "module": "Custom", "name": "Customize Form", @@ -353,5 +423,7 @@ ], "read_only": 0, "read_only_onload": 0, - "search_fields": "doc_type" + "search_fields": "doc_type", + "sort_order": "DESC", + "track_seen": 0 } \ No newline at end of file diff --git a/frappe/custom/doctype/customize_form/customize_form.py b/frappe/custom/doctype/customize_form/customize_form.py index aa59a3f586..b94501148e 100644 --- a/frappe/custom/doctype/customize_form/customize_form.py +++ b/frappe/custom/doctype/customize_form/customize_form.py @@ -16,6 +16,7 @@ from frappe.core.doctype.doctype.doctype import validate_fields_for_doctype doctype_properties = { 'search_fields': 'Data', 'title_field': 'Data', + 'image_field': 'Data', 'sort_field': 'Data', 'sort_order': 'Data', 'default_print_format': 'Data', diff --git a/frappe/data/Framework.sql b/frappe/data/Framework.sql index 3e541bcd43..a1b8908981 100644 --- a/frappe/data/Framework.sql +++ b/frappe/data/Framework.sql @@ -117,6 +117,7 @@ CREATE TABLE `tabDocType` ( `autoname` varchar(255) DEFAULT NULL, `name_case` varchar(255) DEFAULT NULL, `title_field` varchar(255) DEFAULT NULL, + `image_field` varchar(255) DEFAULT NULL, `timeline_field` varchar(255) DEFAULT NULL, `sort_field` varchar(255) DEFAULT NULL, `sort_order` varchar(255) DEFAULT NULL, diff --git a/frappe/patches.txt b/frappe/patches.txt index bc05c9a14d..b9eeac2589 100644 --- a/frappe/patches.txt +++ b/frappe/patches.txt @@ -1,7 +1,7 @@ execute:frappe.db.sql("""update `tabPatch Log` set patch=replace(patch, '.4_0.', '.v4_0.')""") #2014-05-12 frappe.patches.v5_0.convert_to_barracuda_and_utf8mb4 frappe.patches.v6_1.rename_file_data -execute:frappe.reload_doc('core', 'doctype', 'doctype', force=True) #2016-03-25 +execute:frappe.reload_doc('core', 'doctype', 'doctype', force=True) #2016-04-04 execute:frappe.reload_doc('core', 'doctype', 'docfield', force=True) #2016-02-26 execute:frappe.reload_doc('core', 'doctype', 'docperm') #2014-06-24 execute:frappe.reload_doc('custom', 'doctype', 'custom_field') #2015-10-19 diff --git a/frappe/public/build.json b/frappe/public/build.json index af9856e5a8..9bebb78e4d 100644 --- a/frappe/public/build.json +++ b/frappe/public/build.json @@ -159,6 +159,7 @@ "public/js/frappe/form/print_layout.html", "public/js/frappe/form/print.js", "public/js/frappe/form/sidebar.js", + "public/js/frappe/form/user_image.js", "public/js/frappe/form/users_in_sidebar.html", "public/js/frappe/form/share.js", "public/js/frappe/form/set_sharing.html", diff --git a/frappe/public/css/avatar.css b/frappe/public/css/avatar.css index 75ed09db4e..b745ddca68 100644 --- a/frappe/public/css/avatar.css +++ b/frappe/public/css/avatar.css @@ -56,6 +56,7 @@ padding-bottom: 100%; } .avatar-frame { + display: inline-block; width: 100%; height: 0; padding: 50% 0px; diff --git a/frappe/public/css/sidebar.css b/frappe/public/css/sidebar.css index 8f09aee8da..8f9da9e459 100644 --- a/frappe/public/css/sidebar.css +++ b/frappe/public/css/sidebar.css @@ -168,6 +168,7 @@ body[data-route^="Module"] .main-menu .form-sidebar { .form-sidebar .sidebar-image-section { margin-top: 15px; margin-bottom: 0px; + cursor: pointer; } .form-sidebar .sidebar-image-section .sidebar-image { width: 100%; @@ -182,6 +183,21 @@ body[data-route^="Module"] .main-menu .form-sidebar { font-size: 72px; border-radius: 6px; } +.form-sidebar .sidebar-image-section .sidebar-image-wrapper:after { + content: '\A'; + position: absolute; + width: 100%; + height: 100%; + top: 0; + left: 0; + background: #fff; + opacity: 0; + transition: all 0.5s; + -webkit-transition: all 0.6s; +} +.form-sidebar .sidebar-image-section .sidebar-image-wrapper:hover:after { + opacity: 0.5; +} .form-sidebar .form-shared .share-doc-btn:hover, .form-sidebar .form-shared .share-doc-btn:focus, .form-sidebar .form-shared .share-doc-btn:active { diff --git a/frappe/public/js/frappe/form/form_sidebar.html b/frappe/public/js/frappe/form/form_sidebar.html index 230a0c18e4..a5ff0e16b2 100644 --- a/frappe/public/js/frappe/form/form_sidebar.html +++ b/frappe/public/js/frappe/form/form_sidebar.html @@ -1,6 +1,6 @@