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 -%}
-
-
- {%- for t in views -%}
- {% set url = (pathname if t.default else "{}?view={}".format(pathname, t.name)) %}
- -
-
- {{ t.label }}
-
- {%- endfor -%}
-
-
-
-
-{% 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 @@