diff --git a/frappe/config/website.py b/frappe/config/website.py index 438e2a66cc..68c55bc7d4 100644 --- a/frappe/config/website.py +++ b/frappe/config/website.py @@ -72,6 +72,11 @@ def get_data(): "name": "Contact Us Settings", "description": _("Settings for Contact Us Page."), }, + { + "type": "doctype", + "name": "Website Theme", + "description": _("List of themes for Website."), + }, { "type": "doctype", "name": "Social Login Keys", diff --git a/frappe/core/doctype/docfield/docfield.json b/frappe/core/doctype/docfield/docfield.json index 2c1705039a..b575dfe471 100644 --- a/frappe/core/doctype/docfield/docfield.json +++ b/frappe/core/doctype/docfield/docfield.json @@ -1,324 +1,324 @@ { - "allow_copy": 0, - "autoname": "hash", - "creation": "2013-02-22 01:27:33", - "docstatus": 0, - "doctype": "DocType", + "allow_copy": 0, + "autoname": "hash", + "creation": "2013-02-22 01:27:33", + "docstatus": 0, + "doctype": "DocType", "fields": [ { - "fieldname": "label_and_type", - "fieldtype": "Section Break", - "label": "", + "fieldname": "label_and_type", + "fieldtype": "Section Break", + "label": "", "permlevel": 0 - }, + }, { - "fieldname": "label", - "fieldtype": "Data", - "hidden": 0, - "in_list_view": 1, - "label": "Label", - "oldfieldname": "label", - "oldfieldtype": "Data", - "permlevel": 0, - "print_width": "163", - "reqd": 0, - "search_index": 1, + "fieldname": "label", + "fieldtype": "Data", + "hidden": 0, + "in_list_view": 1, + "label": "Label", + "oldfieldname": "label", + "oldfieldtype": "Data", + "permlevel": 0, + "print_width": "163", + "reqd": 0, + "search_index": 1, "width": "163" - }, + }, { - "default": "Data", - "fieldname": "fieldtype", - "fieldtype": "Select", - "hidden": 0, - "in_list_view": 1, - "label": "Type", - "oldfieldname": "fieldtype", - "oldfieldtype": "Select", - "options": "Attach\nButton\nCheck\nCode\nColumn Break\nCurrency\nData\nDate\nDatetime\nDynamic Link\nFloat\nFold\nHeading\nHTML\nImage\nInt\nLink\nLong Text\nPassword\nPercent\nRead Only\nSection Break\nSelect\nSmall Text\nTable\nText\nText Editor\nTime", - "permlevel": 0, - "reqd": 1, + "default": "Data", + "fieldname": "fieldtype", + "fieldtype": "Select", + "hidden": 0, + "in_list_view": 1, + "label": "Type", + "oldfieldname": "fieldtype", + "oldfieldtype": "Select", + "options": "Attach\nAttach Image\nButton\nCheck\nCode\nColumn Break\nCurrency\nData\nDate\nDatetime\nDynamic Link\nFloat\nFold\nHeading\nHTML\nImage\nInt\nLink\nLong Text\nPassword\nPercent\nRead Only\nSection Break\nSelect\nSmall Text\nTable\nText\nText Editor\nTime", + "permlevel": 0, + "reqd": 1, "search_index": 1 - }, + }, { - "fieldname": "fieldname", - "fieldtype": "Data", - "hidden": 0, - "in_list_view": 1, - "label": "Name", - "oldfieldname": "fieldname", - "oldfieldtype": "Data", - "permlevel": 0, - "reqd": 0, + "fieldname": "fieldname", + "fieldtype": "Data", + "hidden": 0, + "in_list_view": 1, + "label": "Name", + "oldfieldname": "fieldname", + "oldfieldtype": "Data", + "permlevel": 0, + "reqd": 0, "search_index": 1 - }, + }, { - "fieldname": "reqd", - "fieldtype": "Check", - "hidden": 0, - "in_list_view": 1, - "label": "Mandatory", - "oldfieldname": "reqd", - "oldfieldtype": "Check", - "permlevel": 0, - "print_width": "50px", - "reqd": 0, - "search_index": 0, + "fieldname": "reqd", + "fieldtype": "Check", + "hidden": 0, + "in_list_view": 1, + "label": "Mandatory", + "oldfieldname": "reqd", + "oldfieldtype": "Check", + "permlevel": 0, + "print_width": "50px", + "reqd": 0, + "search_index": 0, "width": "50px" - }, + }, { - "fieldname": "search_index", - "fieldtype": "Check", - "hidden": 0, - "label": "Index", - "oldfieldname": "search_index", - "oldfieldtype": "Check", - "permlevel": 0, - "print_width": "50px", - "reqd": 0, - "search_index": 0, + "fieldname": "search_index", + "fieldtype": "Check", + "hidden": 0, + "label": "Index", + "oldfieldname": "search_index", + "oldfieldtype": "Check", + "permlevel": 0, + "print_width": "50px", + "reqd": 0, + "search_index": 0, "width": "50px" - }, + }, { - "fieldname": "in_list_view", - "fieldtype": "Check", - "label": "In List View", - "permlevel": 0, - "print_width": "70px", + "fieldname": "in_list_view", + "fieldtype": "Check", + "label": "In List View", + "permlevel": 0, + "print_width": "70px", "width": "70px" - }, + }, { - "fieldname": "column_break_6", - "fieldtype": "Column Break", + "fieldname": "column_break_6", + "fieldtype": "Column Break", "permlevel": 0 - }, + }, { - "depends_on": "eval:in_list([\"Float\", \"Currency\", \"Percent\"], doc.fieldtype)", - "description": "Set non-standard precision for a Float or Currency field", - "fieldname": "precision", - "fieldtype": "Select", - "label": "Precision", - "options": "\n1\n2\n3\n4\n5\n6\n7\n8\n9", - "permlevel": 0, + "depends_on": "eval:in_list([\"Float\", \"Currency\", \"Percent\"], doc.fieldtype)", + "description": "Set non-standard precision for a Float or Currency field", + "fieldname": "precision", + "fieldtype": "Select", + "label": "Precision", + "options": "\n1\n2\n3\n4\n5\n6\n7\n8\n9", + "permlevel": 0, "print_hide": 1 - }, + }, { - "description": "For Links, enter the DocType as range\nFor Select, enter list of Options separated by comma", - "fieldname": "options", - "fieldtype": "Text", - "hidden": 0, - "in_list_view": 1, - "label": "Options", - "oldfieldname": "options", - "oldfieldtype": "Text", - "permlevel": 0, - "reqd": 0, + "description": "For Links, enter the DocType as range\nFor Select, enter list of Options separated by comma", + "fieldname": "options", + "fieldtype": "Text", + "hidden": 0, + "in_list_view": 1, + "label": "Options", + "oldfieldname": "options", + "oldfieldtype": "Text", + "permlevel": 0, + "reqd": 0, "search_index": 0 - }, + }, { - "fieldname": "permissions", - "fieldtype": "Section Break", - "label": "Permissions", + "fieldname": "permissions", + "fieldtype": "Section Break", + "label": "Permissions", "permlevel": 0 - }, + }, { - "fieldname": "depends_on", - "fieldtype": "Data", - "label": "Depends On", - "oldfieldname": "depends_on", - "oldfieldtype": "Data", + "fieldname": "depends_on", + "fieldtype": "Data", + "label": "Depends On", + "oldfieldname": "depends_on", + "oldfieldtype": "Data", "permlevel": 0 - }, + }, { - "default": "0", - "fieldname": "permlevel", - "fieldtype": "Int", - "hidden": 0, - "label": "Perm Level", - "oldfieldname": "permlevel", - "oldfieldtype": "Int", - "permlevel": 0, - "print_width": "50px", - "reqd": 0, - "search_index": 0, + "default": "0", + "fieldname": "permlevel", + "fieldtype": "Int", + "hidden": 0, + "label": "Perm Level", + "oldfieldname": "permlevel", + "oldfieldtype": "Int", + "permlevel": 0, + "print_width": "50px", + "reqd": 0, + "search_index": 0, "width": "50px" - }, + }, { - "fieldname": "hidden", - "fieldtype": "Check", - "hidden": 0, - "label": "Hidden", - "oldfieldname": "hidden", - "oldfieldtype": "Check", - "permlevel": 0, - "print_width": "50px", - "reqd": 0, - "search_index": 0, + "fieldname": "hidden", + "fieldtype": "Check", + "hidden": 0, + "label": "Hidden", + "oldfieldname": "hidden", + "oldfieldtype": "Check", + "permlevel": 0, + "print_width": "50px", + "reqd": 0, + "search_index": 0, "width": "50px" - }, + }, { - "fieldname": "read_only", - "fieldtype": "Check", - "label": "Read Only", - "permlevel": 0, - "print_width": "50px", + "fieldname": "read_only", + "fieldtype": "Check", + "label": "Read Only", + "permlevel": 0, + "print_width": "50px", "width": "50px" - }, + }, { - "description": "Do not allow user to change after set the first time", - "fieldname": "set_only_once", - "fieldtype": "Check", - "label": "Set Only Once", + "description": "Do not allow user to change after set the first time", + "fieldname": "set_only_once", + "fieldtype": "Check", + "label": "Set Only Once", "permlevel": 0 - }, + }, { - "fieldname": "column_break_13", - "fieldtype": "Column Break", + "fieldname": "column_break_13", + "fieldtype": "Column Break", "permlevel": 0 - }, + }, { - "description": "User permissions should not apply for this Link", - "fieldname": "ignore_user_permissions", - "fieldtype": "Check", - "label": "Ignore User Permissions", + "description": "User permissions should not apply for this Link", + "fieldname": "ignore_user_permissions", + "fieldtype": "Check", + "label": "Ignore User Permissions", "permlevel": 0 - }, + }, { - "fieldname": "allow_on_submit", - "fieldtype": "Check", - "label": "Allow on Submit", - "oldfieldname": "allow_on_submit", - "oldfieldtype": "Check", - "permlevel": 0, - "print_width": "50px", + "fieldname": "allow_on_submit", + "fieldtype": "Check", + "label": "Allow on Submit", + "oldfieldname": "allow_on_submit", + "oldfieldtype": "Check", + "permlevel": 0, + "print_width": "50px", "width": "50px" - }, + }, { - "fieldname": "report_hide", - "fieldtype": "Check", - "label": "Report Hide", - "oldfieldname": "report_hide", - "oldfieldtype": "Check", - "permlevel": 0, - "print_width": "50px", + "fieldname": "report_hide", + "fieldtype": "Check", + "label": "Report Hide", + "oldfieldname": "report_hide", + "oldfieldtype": "Check", + "permlevel": 0, + "print_width": "50px", "width": "50px" - }, + }, { - "fieldname": "display", - "fieldtype": "Section Break", - "label": "Display", + "fieldname": "display", + "fieldtype": "Section Break", + "label": "Display", "permlevel": 0 - }, + }, { - "fieldname": "default", - "fieldtype": "Text", - "hidden": 0, - "label": "Default", - "oldfieldname": "default", - "oldfieldtype": "Text", - "permlevel": 0, - "reqd": 0, + "fieldname": "default", + "fieldtype": "Text", + "hidden": 0, + "label": "Default", + "oldfieldname": "default", + "oldfieldtype": "Text", + "permlevel": 0, + "reqd": 0, "search_index": 0 - }, + }, { - "fieldname": "in_filter", - "fieldtype": "Check", - "label": "In Filter", - "oldfieldname": "in_filter", - "oldfieldtype": "Check", - "permlevel": 0, - "print_width": "50px", + "fieldname": "in_filter", + "fieldtype": "Check", + "label": "In Filter", + "oldfieldname": "in_filter", + "oldfieldtype": "Check", + "permlevel": 0, + "print_width": "50px", "width": "50px" - }, + }, { - "fieldname": "no_copy", - "fieldtype": "Check", - "label": "No Copy", - "oldfieldname": "no_copy", - "oldfieldtype": "Check", - "permlevel": 0, - "print_width": "50px", + "fieldname": "no_copy", + "fieldtype": "Check", + "label": "No Copy", + "oldfieldname": "no_copy", + "oldfieldtype": "Check", + "permlevel": 0, + "print_width": "50px", "width": "50px" - }, + }, { - "fieldname": "column_break_22", - "fieldtype": "Column Break", + "fieldname": "column_break_22", + "fieldtype": "Column Break", "permlevel": 0 - }, + }, { - "fieldname": "description", - "fieldtype": "Text", - "in_list_view": 1, - "label": "Description", - "oldfieldname": "description", - "oldfieldtype": "Text", - "permlevel": 0, - "print_width": "300px", + "fieldname": "description", + "fieldtype": "Text", + "in_list_view": 1, + "label": "Description", + "oldfieldname": "description", + "oldfieldtype": "Text", + "permlevel": 0, + "print_width": "300px", "width": "300px" - }, + }, { - "fieldname": "print_hide", - "fieldtype": "Check", - "hidden": 0, - "label": "Print Hide", - "oldfieldname": "print_hide", - "oldfieldtype": "Check", - "permlevel": 0, - "print_width": "50px", - "reqd": 0, - "search_index": 0, + "fieldname": "print_hide", + "fieldtype": "Check", + "hidden": 0, + "label": "Print Hide", + "oldfieldname": "print_hide", + "oldfieldtype": "Check", + "permlevel": 0, + "print_width": "50px", + "reqd": 0, + "search_index": 0, "width": "50px" - }, + }, { - "fieldname": "print_width", - "fieldtype": "Data", - "label": "Print Width", + "fieldname": "print_width", + "fieldtype": "Data", + "label": "Print Width", "permlevel": 0 - }, + }, { - "fieldname": "width", - "fieldtype": "Data", - "hidden": 0, - "label": "Width", - "oldfieldname": "width", - "oldfieldtype": "Data", - "permlevel": 0, - "print_width": "50px", - "reqd": 0, - "search_index": 0, + "fieldname": "width", + "fieldtype": "Data", + "hidden": 0, + "label": "Width", + "oldfieldname": "width", + "oldfieldtype": "Data", + "permlevel": 0, + "print_width": "50px", + "reqd": 0, + "search_index": 0, "width": "50px" - }, + }, { - "fieldname": "oldfieldname", - "fieldtype": "Data", - "hidden": 1, - "oldfieldname": "oldfieldname", - "oldfieldtype": "Data", - "permlevel": 0, - "reqd": 0, + "fieldname": "oldfieldname", + "fieldtype": "Data", + "hidden": 1, + "oldfieldname": "oldfieldname", + "oldfieldtype": "Data", + "permlevel": 0, + "reqd": 0, "search_index": 0 - }, + }, { - "fieldname": "oldfieldtype", - "fieldtype": "Data", - "hidden": 1, - "oldfieldname": "oldfieldtype", - "oldfieldtype": "Data", - "permlevel": 0, - "reqd": 0, + "fieldname": "oldfieldtype", + "fieldtype": "Data", + "hidden": 1, + "oldfieldname": "oldfieldtype", + "oldfieldtype": "Data", + "permlevel": 0, + "reqd": 0, "search_index": 0 } - ], - "hide_heading": 0, - "hide_toolbar": 0, - "idx": 1, - "in_dialog": 1, - "issingle": 0, - "istable": 1, - "modified": "2015-02-22 11:31:07.467882", - "modified_by": "Administrator", - "module": "Core", - "name": "DocField", - "owner": "Administrator", - "permissions": [], + ], + "hide_heading": 0, + "hide_toolbar": 0, + "idx": 1, + "in_dialog": 1, + "issingle": 0, + "istable": 1, + "modified": "2015-02-23 02:06:59.836515", + "modified_by": "Administrator", + "module": "Core", + "name": "DocField", + "owner": "Administrator", + "permissions": [], "read_only": 0 -} \ No newline at end of file +} diff --git a/frappe/core/doctype/doctype/boilerplate/controller.py b/frappe/core/doctype/doctype/boilerplate/controller.py index 1d5ae0895d..eceb16520c 100644 --- a/frappe/core/doctype/doctype/boilerplate/controller.py +++ b/frappe/core/doctype/doctype/boilerplate/controller.py @@ -1,4 +1,4 @@ -# Copyright (c) 2013, {app_publisher} and contributors +# Copyright (c) 2015, {app_publisher} and contributors # For license information, please see license.txt from __future__ import unicode_literals diff --git a/frappe/core/doctype/doctype/boilerplate/test_controller.py b/frappe/core/doctype/doctype/boilerplate/test_controller.py index e65094275f..5df1216da3 100644 --- a/frappe/core/doctype/doctype/boilerplate/test_controller.py +++ b/frappe/core/doctype/doctype/boilerplate/test_controller.py @@ -1,4 +1,4 @@ -# Copyright (c) 2013, {app_publisher} and Contributors +# Copyright (c) 2015, {app_publisher} and Contributors # See license.txt import frappe diff --git a/frappe/desk/search.py b/frappe/desk/search.py index 09ed577e26..1436ba925d 100644 --- a/frappe/desk/search.py +++ b/frappe/desk/search.py @@ -91,7 +91,8 @@ def search_widget(doctype, txt, query=None, searchfield=None, start=0, def get_std_fields_list(meta, key): # get additional search fields sflist = meta.search_fields and meta.search_fields.split(",") or [] - sflist = ['name'] + sflist + title_field = [meta.title_field] if (meta.title_field and meta.title_field not in sflist) else [] + sflist = ['name'] + sflist + title_field if not key in sflist: sflist = sflist + [key] diff --git a/frappe/hooks.py b/frappe/hooks.py index e5385b4481..469bc6c7ac 100644 --- a/frappe/hooks.py +++ b/frappe/hooks.py @@ -24,9 +24,10 @@ web_include_js = [ "website_script.js" ] +bootstrap = "assets/frappe/css/bootstrap.css" web_include_css = [ "assets/css/frappe-web.css", - "style_settings.css" + "website_theme.css" ] write_file_keys = ["file_url", "file_name"] diff --git a/frappe/model/sync.py b/frappe/model/sync.py index 24deeed32b..16ca6e74f7 100644 --- a/frappe/model/sync.py +++ b/frappe/model/sync.py @@ -54,7 +54,7 @@ def sync_for(app_name, force=0, sync_everything = False, verbose=False): def get_doc_files(files, start_path, force=0, sync_everything = False, verbose=False): """walk and sync all doctypes and pages""" - document_type = ['doctype', 'page', 'report', 'print_format'] + document_type = ['doctype', 'page', 'report', 'print_format', 'website_theme'] for doctype in document_type: doctype_path = os.path.join(start_path, doctype) if os.path.exists(doctype_path): diff --git a/frappe/modules/__init__.py b/frappe/modules/__init__.py index 62ba347091..1b971266ff 100644 --- a/frappe/modules/__init__.py +++ b/frappe/modules/__init__.py @@ -10,7 +10,8 @@ import frappe.utils from frappe import _ lower_case_files_for = ['DocType', 'Page', 'Report', - "Workflow", 'Module Def', 'Desktop Item', 'Workflow State', 'Workflow Action', 'Print Format'] + "Workflow", 'Module Def', 'Desktop Item', 'Workflow State', 'Workflow Action', 'Print Format', + "Website Theme"] def scrub(txt): return frappe.scrub(txt) diff --git a/frappe/patches.txt b/frappe/patches.txt index ee37e358cb..7da4e55d19 100644 --- a/frappe/patches.txt +++ b/frappe/patches.txt @@ -64,3 +64,4 @@ execute:frappe.db.sql("""update tabComment set comment = substr(comment, 6, loca frappe.patches.v5_0.fix_feed frappe.patches.v5_0.update_shared frappe.patches.v5_0.bookmarks_to_stars +frappe.patches.v5_0.style_settings_to_website_theme diff --git a/frappe/patches/v5_0/style_settings_to_website_theme.py b/frappe/patches/v5_0/style_settings_to_website_theme.py new file mode 100644 index 0000000000..0325079032 --- /dev/null +++ b/frappe/patches/v5_0/style_settings_to_website_theme.py @@ -0,0 +1,56 @@ +from __future__ import unicode_literals +import frappe +from frappe import _ + +def execute(): + frappe.reload_doc("website", "doctype", "website_theme") + frappe.reload_doc("website", "website_theme", "standard") + migrate_style_settings() + frappe.delete_doc("website", "doctype", "style_settings") + +def migrate_style_settings(): + style_settings = frappe.get_doc("Style Settings", "Style Settings") + standard_website_theme = frappe.get_doc("Website Theme", "Standard") + + website_theme = frappe.copy_doc(standard_website_theme) + website_theme.custom = 1 + website_theme.theme = _("Custom") + + map_color_fields(style_settings, website_theme) + map_other_fields(style_settings, website_theme) + + website_theme.save() + website_theme.use_theme() + +def map_color_fields(style_settings, website_theme): + color_fields_map = { + "page_text": "text_color", + "page_links": "link_color", + "top_bar_background": "top_bar_color", + "top_bar_foreground": "top_bar_text_color", + "page_header_background": "page_header_color", + "page_header_color": "page_header_text_color", + "footer_background": "footer_color", + "footer_color": "footer_text_color", + } + + for from_fieldname, to_fieldname in color_fields_map.items(): + from_value = style_settings.get(from_fieldname) + + if from_value: + website_theme.set(to_fieldname, "#{0}".format(from_value)) + +def map_other_fields(style_settings, website_theme): + other_fields_map = { + "heading_text_as": "heading_style", + "google_web_font_for_heading": "heading_webfont", + "google_web_font_for_text": "text_webfont", + "add_css": "css" + } + + for from_fieldname, to_fieldname in other_fields_map.items(): + website_theme.set(to_fieldname, style_settings.get(from_fieldname)) + + for fieldname in ("apply_style", "background_image", "background_color", + "font_size"): + website_theme.set(fieldname, style_settings.get(fieldname)) diff --git a/frappe/print/doctype/print_format/print_format.py b/frappe/print/doctype/print_format/print_format.py index 551d8f6688..fef85001e2 100644 --- a/frappe/print/doctype/print_format/print_format.py +++ b/frappe/print/doctype/print_format/print_format.py @@ -10,7 +10,10 @@ from frappe.model.document import Document class PrintFormat(Document): def validate(self): - if self.standard=="Yes" and frappe.session.user != "Administrator": + if (self.standard=="Yes" + and not frappe.local.conf.get("developer_mode") + and not (frappe.flags.in_import or frappe.flags.in_test)): + frappe.throw(frappe._("Standard Print Format cannot be updated")) # old_doc_type is required for clearing item cache diff --git a/frappe/public/build.json b/frappe/public/build.json index 5ff2fb3784..0d69b8ee74 100644 --- a/frappe/public/build.json +++ b/frappe/public/build.json @@ -1,6 +1,5 @@ { "css/frappe-web.css": [ - "public/css/bootstrap.css", "public/css/font-awesome.css", "public/css/nprogress.css", "public/css/website.css" diff --git a/frappe/public/css/form.css b/frappe/public/css/form.css index acad3f3aa8..c8abfdd6fa 100644 --- a/frappe/public/css/form.css +++ b/frappe/public/css/form.css @@ -14,6 +14,7 @@ .form-inner-toolbar { padding: 10px 15px; background-color: #fafbfc; + border-bottom: 1px dashed #d1d8dd; text-align: right; } .form-clickable-section { @@ -139,3 +140,9 @@ .attach-image-display { cursor: pointer; } +@media (min-width: 768px) { + .form-column.col-sm-12 > form > .input-max-width { + max-width: 50%; + padding-right: 15px; + } +} diff --git a/frappe/public/css/page.css b/frappe/public/css/page.css index 6cf8045aa9..652b02be6a 100644 --- a/frappe/public/css/page.css +++ b/frappe/public/css/page.css @@ -10,7 +10,7 @@ top: 41px; margin: auto; background-color: #fff; - z-index: 2; + z-index: 101; } .sub-heading { display: inline-block; diff --git a/frappe/public/css/website.css b/frappe/public/css/website.css index bc40d56a18..7b317f9d96 100644 --- a/frappe/public/css/website.css +++ b/frappe/public/css/website.css @@ -41,6 +41,11 @@ img { .navbar-bg { background-color: #f5f7fa; } +.navbar { + box-shadow: none; + border-radius: 0px; + margin-bottom: 0px; +} .social-icons i { font-size: 120%; } @@ -54,7 +59,6 @@ img { margin-left: 5px; } .web-footer { - border-top: 1px solid #d1d8dd; padding: 20px 0px; min-height: 140px; } @@ -157,28 +161,6 @@ img { .border-bottom { border-bottom: 1px solid #d1d8dd; } -.navbar { - box-shadow: none; - border-radius: 0px; - margin-bottom: 0px; - padding-top: 15px; - padding-bottom: 15px; - border-bottom: 1px solid #d1d8dd; -} -.navbar-brand { - padding-right: 30px; - max-width: 80%; - min-height: 20px; - height: auto; -} -.navbar a.active { - font-weight: bold; -} -@media (min-width: 768px) { - .navbar-brand { - max-width: 300px; - } -} .panel-container { margin-top: 35px; } @@ -258,13 +240,8 @@ body { /* The html and body elements cannot have any padding or margin. */ } .page-footer { - margin: 20px 0px 0px; padding: 15px 0px; - border-top: 1px solid #eee; -} -/* website group */ -.view-selector { - margin-bottom: 15px; + border-top: 1px solid #d1d8dd; } /* post and post list */ .web-list-item { @@ -273,9 +250,6 @@ body { margin-right: -30px; padding-right: 30px; } -.web-list-item:last-child { - border-bottom: none; -} .web-list-item h3 { margin: 0 0 5px 0; } @@ -283,6 +257,9 @@ body { color: inherit !important; text-decoration: none; } +.web-list-item:last-child { + border-bottom: none; +} textarea { resize: vertical; } @@ -298,9 +275,6 @@ textarea { display: inline-block !important; } } -.nav-tabs > li > a { - padding: 7px 10px; -} .btn-more { margin-top: 15px; } diff --git a/frappe/public/js/frappe/form/control.js b/frappe/public/js/frappe/form/control.js index 4cecb4b3bb..5acf82706e 100644 --- a/frappe/public/js/frappe/form/control.js +++ b/frappe/public/js/frappe/form/control.js @@ -128,21 +128,16 @@ frappe.ui.form.ControlImage = frappe.ui.form.Control.extend({ make: function() { this._super(); var me = this; - this.$wrapper = $("
") - .appendTo(this.parent) - .css({"max-width": "600px", "margin": "0px"}); + this.$wrapper.css({"margin": "0px"}); this.$body = $("
").appendTo(this.$wrapper) - .css({"margin-bottom": "10px", "max-width": "100%"}) - + .css({"margin-bottom": "10px"}) this.$wrapper.on("refresh", function() { var doc = null; me.$body.empty(); - if(me.docname) { - var doc = frappe.model.get_doc(me.doctype, me.docname); - } + var doc = me.get_doc(); if(doc && me.df.options && doc[me.df.options]) { - me.$img = $("") + me.$img = $("") .appendTo(me.$body); } else { me.$buffer = $("
") @@ -155,7 +150,7 @@ frappe.ui.form.ControlImage = frappe.ui.form.Control.extend({ }); frappe.ui.form.ControlInput = frappe.ui.form.Control.extend({ - // horizontal: true, + horizontal: true, make: function() { // parent element this._super(); @@ -194,7 +189,7 @@ frappe.ui.form.ControlInput = frappe.ui.form.Control.extend({ }, set_max_width: function() { if(this.horizontal) { - this.$wrapper.css({"max-width": "600px"}); + this.$wrapper.addClass("input-max-width"); } }, diff --git a/frappe/public/js/frappe/form/formatters.js b/frappe/public/js/frappe/form/formatters.js index 2a1d1af1bb..f2dcdc49c2 100644 --- a/frappe/public/js/frappe/form/formatters.js +++ b/frappe/public/js/frappe/form/formatters.js @@ -94,7 +94,7 @@ frappe.form.formatters = { } if(!match) { - return replace_newlines(value); + value = replace_newlines(value); } } @@ -139,7 +139,7 @@ frappe.form.formatters = { return frappe.form.formatters.Text(value); }, TextEditor: function(value) { - return frappe.form.formatters.Text(frappe.utils.remove_script_and_style(value)); + return frappe.form.formatters.Text(value); }, Code: function(value) { return "
" + (value==null ? "" : $("
").text(value).html()) + "
" @@ -179,7 +179,12 @@ frappe.format = function(value, df, options, doc) { formatter = df.formatter || frappe.form.get_formatter(fieldtype); - return formatter(value, df, options, doc); + var formatted = formatter(value, df, options, doc); + + if (typeof formatted == "string") + formatted = frappe.utils.remove_script_and_style(formatted); + + return formatted; } frappe.get_format_helper = function(doc) { diff --git a/frappe/public/js/frappe/form/script_manager.js b/frappe/public/js/frappe/form/script_manager.js index f92efc4734..cd5f34a912 100644 --- a/frappe/public/js/frappe/form/script_manager.js +++ b/frappe/public/js/frappe/form/script_manager.js @@ -31,23 +31,21 @@ frappe.ui.form.ScriptManager = Class.extend({ handlers = this.get_handlers(event_name, doctype, name, callback); if(callback) handlers.push(callback); - $.each(handlers, function(i, fn) { - fn(); - }) + return $.when.apply($, $.map(handlers, function(fn) { return fn(); })); }, get_handlers: function(event_name, doctype, name, callback) { var handlers = []; var me = this; if(frappe.ui.form.handlers[doctype] && frappe.ui.form.handlers[doctype][event_name]) { $.each(frappe.ui.form.handlers[doctype][event_name], function(i, fn) { - handlers.push(function() { fn(me.frm, doctype, name) }); + handlers.push(function() { return fn(me.frm, doctype, name) }); }); } if(this.frm.cscript[event_name]) { - handlers.push(function() { me.frm.cscript[event_name](me.frm.doc, doctype, name); }); + handlers.push(function() { return me.frm.cscript[event_name](me.frm.doc, doctype, name); }); } if(this.frm.cscript["custom_" + event_name]) { - handlers.push(function() { me.frm.cscript["custom_" + event_name](me.frm.doc, doctype, name); }); + handlers.push(function() { return me.frm.cscript["custom_" + event_name](me.frm.doc, doctype, name); }); } return handlers; }, diff --git a/frappe/public/js/legacy/clientscriptAPI.js b/frappe/public/js/legacy/clientscriptAPI.js index 1038e15834..402193ac55 100644 --- a/frappe/public/js/legacy/clientscriptAPI.js +++ b/frappe/public/js/legacy/clientscriptAPI.js @@ -289,7 +289,7 @@ _f.Frm.prototype.new_doc = function(doctype, field, opts) { _f.Frm.prototype.set_read_only = function() { var perm = []; var docperms = frappe.perm.get_perm(cur_frm.doc.doctype); - for (var i=0, l=docperms.lenght; i 0)) { + return; + } + e.stopPropagation(); e.preventDefault(); + if(me.doc.__islocal) { msgprint(__("Please save before attaching.")); - return false; throw "attach error"; } + if(me.attachments.max_reached()) { msgprint(__("Maximum Attachment Limit for this record reached.")); throw "attach error"; } - var dataTransfer = e.originalEvent.dataTransfer; - if (dataTransfer && dataTransfer.files && dataTransfer.files.length > 0) { - frappe.upload.upload_file(dataTransfer.files[0], me.attachments.get_args(), { - callback: function(attachment, r) { - me.attachments.attachment_uploaded(attachment, r); - } - }); - } + frappe.upload.upload_file(dataTransfer.files[0], me.attachments.get_args(), { + callback: function(attachment, r) { + me.attachments.attachment_uploaded(attachment, r); + } + }); }); } @@ -570,19 +573,6 @@ _f.Frm.prototype._save = function(save_action, callback, btn, on_error) { if((!this.meta.in_dialog || this.in_form) && !this.meta.istable) scroll(0, 0); - if(save_action != "Update") { - // validate - validated = true; - this.script_manager.trigger("validate"); - this.script_manager.trigger("before_save"); - - if(!validated) { - if(on_error) - on_error(); - return; - } - } - var after_save = function(r) { if(!r.exc) { me.script_manager.trigger("after_save"); @@ -603,7 +593,25 @@ _f.Frm.prototype._save = function(save_action, callback, btn, on_error) { } } - frappe.ui.form.save(me, save_action, after_save, btn); + if(save_action != "Update") { + // validate + validated = true; + $.when(this.script_manager.trigger("validate"), this.script_manager.trigger("before_save")) + .done(function() { + // done is called after all ajaxes in validate & before_save are completed :) + + if(!validated) { + if(on_error) + on_error(); + return; + } + + frappe.ui.form.save(me, save_action, after_save, btn); + }); + + } else { + frappe.ui.form.save(me, save_action, after_save, btn); + } } @@ -612,19 +620,20 @@ _f.Frm.prototype.savesubmit = function(btn, callback, on_error) { this.validate_form_action("Submit"); frappe.confirm(__("Permanently Submit {0}?", [this.docname]), function() { validated = true; - me.script_manager.trigger("before_submit"); - if(!validated) { - if(on_error) - on_error(); - return; - } - - me.save('Submit', function(r) { - if(!r.exc) { - callback && callback(); - me.script_manager.trigger("on_submit"); + me.script_manager.trigger("before_submit").done(function() { + if(!validated) { + if(on_error) + on_error(); + return; } - }, btn, on_error); + + me.save('Submit', function(r) { + if(!r.exc) { + callback && callback(); + me.script_manager.trigger("on_submit"); + } + }, btn, on_error); + }); }); }; @@ -633,23 +642,24 @@ _f.Frm.prototype.savecancel = function(btn, callback, on_error) { this.validate_form_action('Cancel'); frappe.confirm(__("Permanently Cancel {0}?", [this.docname]), function() { validated = true; - me.script_manager.trigger("before_cancel"); - if(!validated) { - if(on_error) - on_error(); - return; - } + me.script_manager.trigger("before_cancel").done(function() { + if(!validated) { + if(on_error) + on_error(); + return; + } - var after_cancel = function(r) { - if(!r.exc) { - me.refresh(); - callback && callback(); - me.script_manager.trigger("after_cancel"); - } else { - on_error(); + var after_cancel = function(r) { + if(!r.exc) { + me.refresh(); + callback && callback(); + me.script_manager.trigger("after_cancel"); + } else { + on_error(); + } } - } - frappe.ui.form.save(me, "cancel", after_cancel, btn); + frappe.ui.form.save(me, "cancel", after_cancel, btn); + }); }); } diff --git a/frappe/public/less/form.less b/frappe/public/less/form.less index 0ca2347fe3..9402db33c5 100644 --- a/frappe/public/less/form.less +++ b/frappe/public/less/form.less @@ -19,7 +19,7 @@ .form-inner-toolbar { padding: 10px 15px; background-color: @light-bg; - //border-bottom: 1px solid @border-color; + border-bottom: 1px dashed @border-color; text-align: right; } @@ -179,3 +179,10 @@ .attach-image-display { cursor: pointer; } + +@media (min-width: 768px) { + .form-column.col-sm-12 > form > .input-max-width { + max-width: 50%; + padding-right: 15px; + } +} diff --git a/frappe/public/less/page.less b/frappe/public/less/page.less index 8790ef68af..8ce4268973 100644 --- a/frappe/public/less/page.less +++ b/frappe/public/less/page.less @@ -14,7 +14,7 @@ top: 41px; margin: auto; background-color: #fff; - z-index: 2; + z-index: 101; } .sub-heading { diff --git a/frappe/public/less/website.less b/frappe/public/less/website.less index 2f7b51119e..c1082faed5 100644 --- a/frappe/public/less/website.less +++ b/frappe/public/less/website.less @@ -13,6 +13,7 @@ a { cursor: pointer; } + a, a:hover, a:active, a:focus { outline: 0; } @@ -54,6 +55,12 @@ img { background-color: @navbar-bg; } +.navbar { + box-shadow: none; + border-radius: 0px; + margin-bottom: 0px; +} + .social-icons i { font-size: 120%; } @@ -69,7 +76,6 @@ img { } .web-footer { - border-top: 1px solid @border-color; padding: 20px 0px; min-height: 140px; } @@ -184,32 +190,6 @@ img { border-bottom: 1px solid @border-color; } -.navbar { - box-shadow: none; - border-radius: 0px; - margin-bottom: 0px; - padding-top: 15px; - padding-bottom: 15px; - border-bottom: 1px solid @border-color; -} - -.navbar-brand { - padding-right: 30px; - max-width: 80%; - min-height: 20px; - height: auto; -} - -.navbar a.active { - font-weight: bold; -} - -@media (min-width: 768px) { - .navbar-brand { - max-width: 300px; - } -} - .panel-container { margin-top: 35px; } @@ -257,9 +237,11 @@ fieldset { .page-content { padding-bottom: 30px; } + div[data-html-block="content"] { padding-right: 15px; } + .page-content hr { margin-left: -15px; margin-right: -30px; @@ -272,6 +254,7 @@ div[data-html-block="content"] { border-left: 1px solid @border-color; padding-left: 15px; } + .sidebar-item { margin: 0px; padding: 5px 0px; @@ -279,6 +262,7 @@ div[data-html-block="content"] { color: @text-muted; font-size: 12px; } + .sidebar-item:first-child { padding-top: 10px; } @@ -302,17 +286,11 @@ body { } .page-footer { - margin: 20px 0px 0px; padding: 15px 0px; - border-top: 1px solid #eee; + border-top: 1px solid @border-color; } -/* website group */ -.view-selector { - margin-bottom: 15px; -} - /* post and post list */ .web-list-item { @@ -320,17 +298,20 @@ body { border-bottom: 1px solid @border-color; margin-right: -30px; padding-right: 30px; + + h3 { + margin: 0 0 5px 0; + + a { + color: inherit !important; + text-decoration: none; + } + } } + .web-list-item:last-child { border-bottom: none; } -.web-list-item h3 { - margin: 0 0 5px 0; -} -.web-list-item h3 a { - color: inherit !important; - text-decoration: none; -} textarea { resize: vertical; @@ -351,10 +332,6 @@ textarea { } } -.nav-tabs > li > a { - padding: 7px 10px; -} - .btn-more { margin-top: 15px; } @@ -457,3 +434,4 @@ a.text-extra-muted:focus { color: inherit; border-bottom: 1px solid @text-muted; } + diff --git a/frappe/templates/base.html b/frappe/templates/base.html index 775805a3f8..ec57b23203 100644 --- a/frappe/templates/base.html +++ b/frappe/templates/base.html @@ -23,6 +23,8 @@ Built on Frappe.io. Free and Open Source Framework for the Web. https://frappe.i {{ meta_block }} {% endif %} + + {%- for link in web_include_css %} {%- endfor -%} @@ -59,7 +61,6 @@ Built on Frappe.io. Free and Open Source Framework for the Web. https://frappe.i {%- block sidebar -%} {%- if sidebar is defined -%} {{ sidebar }} - {{ private_pages or "" }} {%- endif -%} {%- endblock -%} diff --git a/frappe/templates/generators/web_page.html b/frappe/templates/generators/web_page.html index 7775e64af6..c81eb21ff4 100644 --- a/frappe/templates/generators/web_page.html +++ b/frappe/templates/generators/web_page.html @@ -1,7 +1,11 @@ +{% if header -%} + {%- block header -%} {{ header }} {%- endblock -%} +{%- endif %} + {% block content %}
{% include "templates/includes/slideshow.html" %} -
+
{{ main_section or "" }}
{% if enable_comments -%} diff --git a/frappe/templates/generators/website_group.html b/frappe/templates/generators/website_group.html deleted file mode 100644 index 3158b3b581..0000000000 --- a/frappe/templates/generators/website_group.html +++ /dev/null @@ -1,36 +0,0 @@ -{% block header %}{{ group.group_title }}{% endblock %} - -{% block content %} -{%- if group.group_description -%} -

{{ group.group_description }}

-{%- endif -%} - - - - - -{% include view.template_path %} - - - -{% endblock %} diff --git a/frappe/templates/includes/navbar.html b/frappe/templates/includes/navbar.html index 7abaa8f383..b21d031e8f 100644 --- a/frappe/templates/includes/navbar.html +++ b/frappe/templates/includes/navbar.html @@ -1,5 +1,5 @@
-