From 25d92ac9b2af2ce0dce8be938fb132ec1ba47d7c Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Sun, 19 Apr 2020 15:02:22 +0530 Subject: [PATCH 1/6] fix(Web View): renamed Web View Item to Web View Components, made Web Views embeddable, introduced full width, introduced Color --- frappe/public/scss/website.scss | 11 +++ frappe/templates/web.html | 10 ++- .../{web_view_item => color}/__init__.py | 0 frappe/website/doctype/color/color.js | 8 ++ frappe/website/doctype/color/color.json | 44 +++++++++++ .../web_view_item.py => color/color.py} | 2 +- frappe/website/doctype/color/test_color.py | 10 +++ frappe/website/doctype/web_page/web_page.json | 11 ++- frappe/website/doctype/web_page/web_page.py | 1 + .../web_view/templates/web_view_content.html | 22 ++++-- .../website/doctype/web_view/test_web_view.py | 26 ++++++- frappe/website/doctype/web_view/web_view.json | 61 ++++++++++++--- frappe/website/doctype/web_view/web_view.py | 77 ++++++++++++------- .../doctype/web_view_component/__init__.py | 0 .../web_view_component.json} | 39 ++++++++-- .../web_view_component/web_view_component.py | 10 +++ .../doctype/website_theme/website_theme.json | 61 ++++++++++----- .../website_theme/website_theme_template.scss | 6 +- .../website_theme/standard/standard.json | 42 +++++----- 19 files changed, 331 insertions(+), 110 deletions(-) rename frappe/website/doctype/{web_view_item => color}/__init__.py (100%) create mode 100644 frappe/website/doctype/color/color.js create mode 100644 frappe/website/doctype/color/color.json rename frappe/website/doctype/{web_view_item/web_view_item.py => color/color.py} (89%) create mode 100644 frappe/website/doctype/color/test_color.py create mode 100644 frappe/website/doctype/web_view_component/__init__.py rename frappe/website/doctype/{web_view_item/web_view_item.json => web_view_component/web_view_component.json} (70%) create mode 100644 frappe/website/doctype/web_view_component/web_view_component.py diff --git a/frappe/public/scss/website.scss b/frappe/public/scss/website.scss index 6f82e25ee0..546110bd5c 100644 --- a/frappe/public/scss/website.scss +++ b/frappe/public/scss/website.scss @@ -23,6 +23,17 @@ footer { flex-shrink: 0; } +// make navbar padding consistent with the page +.navbar { + padding-left: 0; + padding-right: 0; + + .container { + padding-left: 15px; + padding-right: 15px; + } +} + .navbar.bg-dark { .dropdown-menu { font-size: .75rem; diff --git a/frappe/templates/web.html b/frappe/templates/web.html index d2d38a6320..2fdfc9564a 100644 --- a/frappe/templates/web.html +++ b/frappe/templates/web.html @@ -13,7 +13,7 @@ {% block page_container %} -
+
{% endmacro %} -{% macro container_attributes() %} -id="page-{{ name or route | e }}" data-path="{{ pathname | e }}" {%- if page_or_generator=="Generator" %}source-type="Generator" data-doctype="{{ doctype }}"{% endif %} -{% endmacro %} +{% macro container_attributes() -%} +id="page-{{ name or route | e }}" data-path="{{ pathname | e }}" + {%- if page_or_generator=="Generator" %}source-type="Generator" data-doctype="{{ doctype }}"{%- endif %} + {%- if source_content_type %}source-content-type="{{ source_content_type }}"{%- endif %} +{%- endmacro %} {% if show_sidebar %}
diff --git a/frappe/website/doctype/web_view_item/__init__.py b/frappe/website/doctype/color/__init__.py similarity index 100% rename from frappe/website/doctype/web_view_item/__init__.py rename to frappe/website/doctype/color/__init__.py diff --git a/frappe/website/doctype/color/color.js b/frappe/website/doctype/color/color.js new file mode 100644 index 0000000000..78b3f773d1 --- /dev/null +++ b/frappe/website/doctype/color/color.js @@ -0,0 +1,8 @@ +// Copyright (c) 2020, Frappe Technologies and contributors +// For license information, please see license.txt + +frappe.ui.form.on('Color', { + // refresh: function(frm) { + + // } +}); diff --git a/frappe/website/doctype/color/color.json b/frappe/website/doctype/color/color.json new file mode 100644 index 0000000000..f42898da12 --- /dev/null +++ b/frappe/website/doctype/color/color.json @@ -0,0 +1,44 @@ +{ + "actions": [], + "autoname": "Prompt", + "creation": "2020-04-19 02:25:37.010180", + "doctype": "DocType", + "editable_grid": 1, + "engine": "InnoDB", + "field_order": [ + "color" + ], + "fields": [ + { + "fieldname": "color", + "fieldtype": "Color", + "in_list_view": 1, + "label": "Color", + "reqd": 1 + } + ], + "links": [], + "modified": "2020-04-19 02:25:47.417772", + "modified_by": "Administrator", + "module": "Website", + "name": "Color", + "owner": "Administrator", + "permissions": [ + { + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "print": 1, + "read": 1, + "report": 1, + "role": "Website Manager", + "share": 1, + "write": 1 + } + ], + "quick_entry": 1, + "sort_field": "modified", + "sort_order": "DESC", + "track_changes": 1 +} \ No newline at end of file diff --git a/frappe/website/doctype/web_view_item/web_view_item.py b/frappe/website/doctype/color/color.py similarity index 89% rename from frappe/website/doctype/web_view_item/web_view_item.py rename to frappe/website/doctype/color/color.py index cc440305c0..245b9e9165 100644 --- a/frappe/website/doctype/web_view_item/web_view_item.py +++ b/frappe/website/doctype/color/color.py @@ -6,5 +6,5 @@ from __future__ import unicode_literals # import frappe from frappe.model.document import Document -class WebViewItem(Document): +class Color(Document): pass diff --git a/frappe/website/doctype/color/test_color.py b/frappe/website/doctype/color/test_color.py new file mode 100644 index 0000000000..2f2be331ad --- /dev/null +++ b/frappe/website/doctype/color/test_color.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2020, Frappe Technologies and Contributors +# See license.txt +from __future__ import unicode_literals + +# import frappe +import unittest + +class TestColor(unittest.TestCase): + pass diff --git a/frappe/website/doctype/web_page/web_page.json b/frappe/website/doctype/web_page/web_page.json index 645d83e155..5f90f3adbf 100644 --- a/frappe/website/doctype/web_page/web_page.json +++ b/frappe/website/doctype/web_page/web_page.json @@ -1,4 +1,5 @@ { + "actions": [], "allow_guest_to_view": 1, "allow_import": 1, "creation": "2013-03-28 10:35:30", @@ -13,6 +14,7 @@ "slideshow", "cb1", "published", + "full_width", "show_title", "start_date", "end_date", @@ -242,14 +244,21 @@ "fieldname": "dynamic_template", "fieldtype": "Check", "label": "Dynamic Template" + }, + { + "default": "0", + "fieldname": "full_width", + "fieldtype": "Check", + "label": "Full Width" } ], "has_web_view": 1, "icon": "fa fa-file-alt", "idx": 1, "is_published_field": "published", + "links": [], "max_attachments": 20, - "modified": "2019-10-02 13:58:50.825481", + "modified": "2020-04-19 01:55:48.363008", "modified_by": "Administrator", "module": "Website", "name": "Web Page", diff --git a/frappe/website/doctype/web_page/web_page.py b/frappe/website/doctype/web_page/web_page.py index ffa836e3c5..98065e4cce 100644 --- a/frappe/website/doctype/web_page/web_page.py +++ b/frappe/website/doctype/web_page/web_page.py @@ -36,6 +36,7 @@ class WebPage(WebsiteGenerator): def get_context(self, context): context.main_section = get_html_content_based_on_type(self, 'main_section', self.content_type) + context.source_content_type = self.content_type self.render_dynamic(context) # if static page, get static content diff --git a/frappe/website/doctype/web_view/templates/web_view_content.html b/frappe/website/doctype/web_view/templates/web_view_content.html index f2e750a472..a1ac143639 100644 --- a/frappe/website/doctype/web_view/templates/web_view_content.html +++ b/frappe/website/doctype/web_view/templates/web_view_content.html @@ -9,7 +9,7 @@ {%- endif -%} {%- macro render_element(element) -%} - {%- if element.element_type=='Content' -%} + {%- if element.element_type in ('Content', 'Web View') -%}
{{ element.web_content_html }}
@@ -25,17 +25,16 @@ {%- endmacro -%} {%- macro element_style(element) -%} - {%- if element.element_style -%} - style = "{{ element.element_style }}" + {%- if element.element_style or element.background_color -%} + style = "{{ element.element_style or '' }} {%if element.background_color %}background-color: {{ element.background_color }};{% endif %}" {%- endif -%} {%- endmacro -%} - +{%- macro render_sections(sections) -%} {%- for section in sections -%} -
-
+
+
{%- if section.section_intro -%} -
{{ section.section_intro }}
{%- endif -%} @@ -74,4 +73,11 @@ {%- endif -%}
-{%- endfor -%} \ No newline at end of file +{%- endfor -%} +{%- endmacro -%} + +{% if content_type == 'HTML' -%} +{{ content_html }} +{%- else -%} +{{ render_sections(sections) }} +{%- endif -%} \ No newline at end of file diff --git a/frappe/website/doctype/web_view/test_web_view.py b/frappe/website/doctype/web_view/test_web_view.py index 67b353844d..3dc072a6dd 100644 --- a/frappe/website/doctype/web_view/test_web_view.py +++ b/frappe/website/doctype/web_view/test_web_view.py @@ -14,6 +14,7 @@ class TestWebView(unittest.TestCase): @classmethod def setUpClass(cls): frappe.delete_doc_if_exists('Web View', 'test-web-view') + frappe.delete_doc_if_exists('Web View', 'html-web-view') frappe.delete_doc_if_exists('CSS Class', 'test-css-class') frappe.get_doc(dict( @@ -22,12 +23,25 @@ class TestWebView(unittest.TestCase): css = '.test-class { color: red; }' )).insert() + # simple html webview + frappe.get_doc(dict( + doctype = 'Web View', + title = 'HTML Web View', + route = 'html-web-view', + published = 1, + content_type = 'HTML', + content_html = '

Hello HTML

' + )).insert() + + # simple web view with components + frappe.get_doc(dict( doctype = 'Web View', title = 'Test Web View', route = 'test-web-view', published = 1, - items = [ + content_type = 'Components', + components = [ dict( element_type = 'Section', section_type = 'List' @@ -57,19 +71,27 @@ class TestWebView(unittest.TestCase): web_content_type = 'Markdown', web_content_markdown = 'Column 2' ), + dict( + element_type = 'Web View', + web_view = 'html-web-view', + ), ] )).insert() def test_web_view(self): html = get_page_content('test-web-view') - #print(html) self.assert_web_view_in_html(html) + def test_html_web_view(self): + html = get_page_content('html-web-view') + self.assertTrue('Hello HTML' in html) + def assert_web_view_in_html(self, html): self.assertTrue('

Heading

' in html) self.assertTrue('
Here is some HTML
' in html) self.assertTrue('Column 1' in html) self.assertTrue('Column 2' in html) + self.assertTrue('Hello HTML' in html) self.assertTrue('.test-class { color: red; }' in html) def test_web_view_in_footer(self): diff --git a/frappe/website/doctype/web_view/web_view.json b/frappe/website/doctype/web_view/web_view.json index 6d957fd0d9..c804d31de3 100644 --- a/frappe/website/doctype/web_view/web_view.json +++ b/frappe/website/doctype/web_view/web_view.json @@ -12,18 +12,17 @@ "field_order": [ "title", "route", + "column_break_4", + "full_width", "published", - "items", + "section_break_6", + "content_type", + "content_html", + "components", + "style_section", "css" ], "fields": [ - { - "fieldname": "items", - "fieldtype": "Table", - "label": "Items", - "options": "Web View Item", - "reqd": 1 - }, { "fieldname": "title", "fieldtype": "Data", @@ -36,8 +35,7 @@ "fieldname": "route", "fieldtype": "Data", "in_list_view": 1, - "label": "Route", - "reqd": 1 + "label": "Route" }, { "default": "0", @@ -49,12 +47,53 @@ "fieldname": "css", "fieldtype": "Code", "label": "CSS" + }, + { + "fieldname": "column_break_4", + "fieldtype": "Column Break" + }, + { + "default": "0", + "fieldname": "full_width", + "fieldtype": "Check", + "label": "Full Width" + }, + { + "fieldname": "section_break_6", + "fieldtype": "Section Break", + "label": "Content" + }, + { + "default": "Components", + "fieldname": "content_type", + "fieldtype": "Select", + "label": "Content Type", + "options": "Components\nHTML", + "reqd": 1 + }, + { + "depends_on": "eval:doc.content_type==='Components'", + "fieldname": "components", + "fieldtype": "Table", + "label": "Components", + "options": "Web View Component" + }, + { + "depends_on": "eval:doc.content_type===\"HTML\"", + "fieldname": "content_html", + "fieldtype": "HTML Editor", + "label": "Content HTML" + }, + { + "fieldname": "style_section", + "fieldtype": "Section Break", + "label": "Style" } ], "has_web_view": 1, "is_published_field": "published", "links": [], - "modified": "2020-04-15 23:58:12.208049", + "modified": "2020-04-19 05:05:43.620000", "modified_by": "Administrator", "module": "Website", "name": "Web View", diff --git a/frappe/website/doctype/web_view/web_view.py b/frappe/website/doctype/web_view/web_view.py index 6828057fe1..eeebb169dc 100644 --- a/frappe/website/doctype/web_view/web_view.py +++ b/frappe/website/doctype/web_view/web_view.py @@ -10,49 +10,70 @@ import frappe class WebView(WebsiteGenerator): def get_context(self, context): - # group items into sections - context.sections = [] - context.css_rules = [] - for item in self.items: - if not context.sections and item.element_type!='Section': - self.add_default_section(context) - - if item.element_type=='Section': - self.add_section(context, item) - else: - self.add_item(context, item) - - self.add_css_class(context, item) + # group components into sections + if self.content_type=='Components': + self.build_components(context) return context - def add_section(self, context, item): - item.elements = [] - context.sections.append(item) + def build_components(self, context): + context.sections = [] + context.css_rules = [] + for component in self.components: + if not context.sections and component.element_type!='Section': + self.add_default_section(context) - if item.section_intro: - item.section_intro = markdown(item.section_intro) + if component.element_type=='Section': + self.add_section(context, component) + else: + self.add_component(context, component) - def add_item(self, context, item): - if item.hide: + self.add_css_class(context, component) + self.add_color(component) + self.add_missing_semi(component) + + return context + + def add_section(self, context, component): + component.elements = [] + context.sections.append(component) + + if component.section_intro: + component.section_intro = markdown(component.section_intro) + + def add_component(self, context, component): + if component.hide: return - if item.web_content_type == 'Markdown': - item.web_content_html = markdown(item.web_content_markdown) + if component.element_type == 'Web View' and component.web_view: + component.web_content_html = frappe.get_doc('Web View', component.web_view).render_content() - if item.title: - item.element_id = frappe.scrub(item.title) + elif component.web_content_type == 'Markdown': + component.web_content_html = markdown(component.web_content_markdown) - context.sections[-1].elements.append(item) + if component.title: + component.element_id = frappe.scrub(component.title) - def add_css_class(self, context, item): + context.sections[-1].elements.append(component) + + def add_css_class(self, context, component): # add css class definitions selected by the user - if item.element_class and not item.hide: - css, is_dynamic = frappe.db.get_value('CSS Class', item.element_class, ['css', 'is_dynamic']) + if component.element_class and not component.hide: + css, is_dynamic = frappe.db.get_value('CSS Class', component.element_class, ['css', 'is_dynamic']) if is_dynamic: css = frappe.render_template(css, self.get_theme()) context.css_rules.append(css) + def add_color(self, component): + # convert to css color + if component.background_color and not component.hide: + component.background_color = frappe.db.get_value('Color', + component.background_color, 'color', cache=True) + + def add_missing_semi(self, component): + if component.element_style and not component.element_style.strip().endswith(';'): + component.element_style = component.element_style.strip() + ';' + def render_content(self): # webview can be rendered as an object (see footer) return frappe.render_template("frappe/website/doctype/web_view/templates/web_view_content.html", self.get_context(self.as_dict())) diff --git a/frappe/website/doctype/web_view_component/__init__.py b/frappe/website/doctype/web_view_component/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/frappe/website/doctype/web_view_item/web_view_item.json b/frappe/website/doctype/web_view_component/web_view_component.json similarity index 70% rename from frappe/website/doctype/web_view_item/web_view_item.json rename to frappe/website/doctype/web_view_component/web_view_component.json index 0d33cbb8ce..15dd761c81 100644 --- a/frappe/website/doctype/web_view_item/web_view_item.json +++ b/frappe/website/doctype/web_view_component/web_view_component.json @@ -8,11 +8,14 @@ "element_type", "title", "hide", + "contain_section_width", "column_break_3", "columns", + "background_color", "element_class", "element_style", "section_break_5", + "web_view", "section_type", "web_content_type", "web_content_html", @@ -26,33 +29,35 @@ "fieldtype": "Select", "in_list_view": 1, "label": "Element Type", - "options": "Section\nContent\nParagraph\nWeb List\nWeb Form", + "options": "Section\nContent\nImage\nWeb View", "reqd": 1 }, { + "default": "List", "depends_on": "eval:doc.element_type==='Section'", "fieldname": "section_type", "fieldtype": "Select", "in_list_view": 1, "label": "Section Type", - "options": "\nList\nTabbed\nGrid" + "options": "List\nTabbed\nGrid" }, { + "default": "Markdown", "depends_on": "eval:doc.element_type==='Content'", "fieldname": "web_content_type", "fieldtype": "Select", "in_list_view": 1, "label": "Web Content Type", - "options": "\nHTML\nMarkdown" + "options": "Markdown\nHTML" }, { - "depends_on": "eval:doc.web_content_type==='HTML'", + "depends_on": "eval:doc.element_type === 'Content' && doc.web_content_type === 'HTML'", "fieldname": "web_content_html", "fieldtype": "HTML Editor", "label": "Web Content HTML" }, { - "depends_on": "eval:doc.web_content_type==='Markdown'", + "depends_on": "eval:doc.element_type === 'Content' && doc.web_content_type === 'Markdown'", "fieldname": "web_content_markdown", "fieldtype": "Markdown Editor", "label": "Web Content Markdown" @@ -104,14 +109,34 @@ "fieldname": "element_style", "fieldtype": "Small Text", "label": "Element Style" + }, + { + "default": "0", + "depends_on": "eval:doc.element_type==='Section'", + "fieldname": "contain_section_width", + "fieldtype": "Check", + "label": "Contain Section Width" + }, + { + "fieldname": "background_color", + "fieldtype": "Link", + "label": "Background Color", + "options": "Color" + }, + { + "depends_on": "eval:doc.element_type==='Web View'", + "fieldname": "web_view", + "fieldtype": "Link", + "label": "Web View", + "options": "Web View" } ], "istable": 1, "links": [], - "modified": "2020-03-28 14:21:50.014823", + "modified": "2020-04-19 03:02:53.233036", "modified_by": "Administrator", "module": "Website", - "name": "Web View Item", + "name": "Web View Component", "owner": "Administrator", "permissions": [], "quick_entry": 1, diff --git a/frappe/website/doctype/web_view_component/web_view_component.py b/frappe/website/doctype/web_view_component/web_view_component.py new file mode 100644 index 0000000000..dcf1726c4a --- /dev/null +++ b/frappe/website/doctype/web_view_component/web_view_component.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2020, 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 WebViewComponent(Document): + pass diff --git a/frappe/website/doctype/website_theme/website_theme.json b/frappe/website/doctype/website_theme/website_theme.json index f7c6a9a1f2..78a845fadc 100644 --- a/frappe/website/doctype/website_theme/website_theme.json +++ b/frappe/website/doctype/website_theme/website_theme.json @@ -14,8 +14,10 @@ "google_font", "font_size", "font_properties", - "use_full_width", - "column_break_7", + "button_rounded_corners", + "button_shadows", + "button_gradients", + "column_break_11", "primary_color", "text_color", "light_color", @@ -99,29 +101,29 @@ "fieldtype": "Data", "label": "Font Size" }, - { - "fieldname": "column_break_7", - "fieldtype": "Column Break" - }, { "fieldname": "primary_color", - "fieldtype": "Color", - "label": "Primary Color" + "fieldtype": "Link", + "label": "Primary Color", + "options": "Color" }, { "fieldname": "text_color", - "fieldtype": "Color", - "label": "Text Color" + "fieldtype": "Link", + "label": "Text Color", + "options": "Color" }, { "fieldname": "dark_color", - "fieldtype": "Color", - "label": "Dark Color" + "fieldtype": "Link", + "label": "Dark Color", + "options": "Color" }, { "fieldname": "background_color", - "fieldtype": "Color", - "label": "Background Color" + "fieldtype": "Link", + "label": "Background Color", + "options": "Color" }, { "fieldname": "stylesheet_section", @@ -135,8 +137,9 @@ }, { "fieldname": "light_color", - "fieldtype": "Color", - "label": "Light Color" + "fieldtype": "Link", + "label": "Light Color", + "options": "Color" }, { "default": "300,600", @@ -145,14 +148,30 @@ "label": "Font Properties" }, { - "description": "Content will not be inside a \"container\" class, you will have to add your own containers for different sections.", - "fieldname": "use_full_width", - "fieldtype": "Data", - "label": "Use Full Width" + "default": "1", + "fieldname": "button_rounded_corners", + "fieldtype": "Check", + "label": "Button Rounded Corners" + }, + { + "default": "0", + "fieldname": "button_shadows", + "fieldtype": "Check", + "label": "Button Shadows" + }, + { + "default": "0", + "fieldname": "button_gradients", + "fieldtype": "Check", + "label": "Button Gradients" + }, + { + "fieldname": "column_break_11", + "fieldtype": "Column Break" } ], "links": [], - "modified": "2020-03-19 09:46:48.750150", + "modified": "2020-04-19 05:18:49.820803", "modified_by": "Administrator", "module": "Website", "name": "Website Theme", diff --git a/frappe/website/doctype/website_theme/website_theme_template.scss b/frappe/website/doctype/website_theme/website_theme_template.scss index e1728eee36..7b0bc043d7 100644 --- a/frappe/website/doctype/website_theme/website_theme_template.scss +++ b/frappe/website/doctype/website_theme/website_theme_template.scss @@ -8,9 +8,9 @@ $font-family-sans-serif: "{{ google_font }}", -apple-system, BlinkMacSystemFont, {% if text_color %}$body-color: {{ text_color }};{% endif %} {% if background_color %}$body-bg: {{ background_color }};{% endif %} -$enable-shadows: {{ enable_shadows and "true" or "false" }}; -$enable-gradients: {{ enable_gradients and "true" or "false" }}; -$enable-rounded: {{ enable_rounded and "true" or "false" }}; +$enable-shadows: {{ button_shadows and "true" or "false" }}; +$enable-gradients: {{ button_gradients and "true" or "false" }}; +$enable-rounded: {{ button_rounded_corners and "true" or "false" }}; @import "frappe/public/scss/website"; diff --git a/frappe/website/website_theme/standard/standard.json b/frappe/website/website_theme/standard/standard.json index e610d82582..331f4ab7e5 100644 --- a/frappe/website/website_theme/standard/standard.json +++ b/frappe/website/website_theme/standard/standard.json @@ -1,26 +1,20 @@ { - "apply_style": 0, - "apply_text_styles": 0, - "creation": "2015-02-19 13:37:33.925909", - "css": ".navbar-header {\n display: none;\n}", - "custom": 0, - "docstatus": 0, - "doctype": "Website Theme", - "font_size": "14px", - "footer_color": "", - "footer_text_color": "", - "heading_style": "", - "heading_webfont": "", - "idx": 26, - "link_color": "", - "modified": "2016-12-29 05:40:17.289226", - "modified_by": "Administrator", - "module": "Website", - "name": "Standard", - "owner": "Administrator", - "text_color": "", - "text_webfont": "", - "theme": "Standard", - "top_bar_color": "", - "top_bar_text_color": "" + "button_gradients": 0, + "button_rounded_corners": 1, + "button_shadows": 0, + "creation": "2015-02-19 13:37:33.925909", + "custom": 0, + "docstatus": 0, + "doctype": "Website Theme", + "font_properties": "300,600", + "idx": 27, + "modified": "2020-04-19 05:00:20.668017", + "modified_by": "Administrator", + "module": "Website", + "name": "Standard", + "owner": "Administrator", + "primary_color": "#7575ff", + "theme": "Standard", + "theme_scss": "\n\n$primary: #7575ff;\n\n\n\n\n$enable-shadows: false;\n$enable-gradients: false;\n$enable-rounded: true;\n\n@import \"frappe/public/scss/website\";\n\nbody {\n \n}", + "theme_url": "/assets/css/standard_55b00b4f.css" } \ No newline at end of file From 54e765cfc04b88a72cfac3c73aa1d27186bdafae Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Sun, 19 Apr 2020 15:05:28 +0530 Subject: [PATCH 2/6] fix(minor): fix color in Website Theme --- .../doctype/website_theme/website_theme_template.scss | 8 ++++---- frappe/website/website_theme/standard/standard.json | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/frappe/website/doctype/website_theme/website_theme_template.scss b/frappe/website/doctype/website_theme/website_theme_template.scss index 7b0bc043d7..caad55810a 100644 --- a/frappe/website/doctype/website_theme/website_theme_template.scss +++ b/frappe/website/doctype/website_theme/website_theme_template.scss @@ -3,10 +3,10 @@ $font-family-sans-serif: "{{ google_font }}", -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; {% endif %} -{% if primary_color %}$primary: {{ primary_color }};{% endif %} -{% if dark_color %}$dark: {{ dark_color }};{% endif %} -{% if text_color %}$body-color: {{ text_color }};{% endif %} -{% if background_color %}$body-bg: {{ background_color }};{% endif %} +{% if primary_color %}$primary: {{ frappe.db.get_value('Color', primary_color, 'color') }};{% endif %} +{% if dark_color %}$dark: {{ frappe.db.get_value('Color', dark_color, 'color') }};{% endif %} +{% if text_color %}$body-color: {{ frappe.db.get_value('Color', text_color, 'color') }};{% endif %} +{% if background_color %}$body-bg: {{ frappe.db.get_value('Color', background_color, 'color') }};{% endif %} $enable-shadows: {{ button_shadows and "true" or "false" }}; $enable-gradients: {{ button_gradients and "true" or "false" }}; diff --git a/frappe/website/website_theme/standard/standard.json b/frappe/website/website_theme/standard/standard.json index 331f4ab7e5..2393b684ca 100644 --- a/frappe/website/website_theme/standard/standard.json +++ b/frappe/website/website_theme/standard/standard.json @@ -8,13 +8,13 @@ "doctype": "Website Theme", "font_properties": "300,600", "idx": 27, - "modified": "2020-04-19 05:00:20.668017", + "modified": "2020-04-19 05:34:56.086984", "modified_by": "Administrator", "module": "Website", "name": "Standard", "owner": "Administrator", - "primary_color": "#7575ff", + "primary_color": "Blue", "theme": "Standard", - "theme_scss": "\n\n$primary: #7575ff;\n\n\n\n\n$enable-shadows: false;\n$enable-gradients: false;\n$enable-rounded: true;\n\n@import \"frappe/public/scss/website\";\n\nbody {\n \n}", - "theme_url": "/assets/css/standard_55b00b4f.css" + "theme_scss": "\n\n$primary: #5e3aa8;\n\n\n\n\n$enable-shadows: false;\n$enable-gradients: false;\n$enable-rounded: true;\n\n@import \"frappe/public/scss/website\";\n\nbody {\n \n}", + "theme_url": "/assets/css/standard_999ef15b.css" } \ No newline at end of file From 9f26548b3101853884d9bb63690a6e90617ddaaa Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Sun, 19 Apr 2020 18:01:06 +0530 Subject: [PATCH 3/6] fix(minor): update web page test and allow dashboards for custom doctype --- .../doctype/data_import/test_exporter_new.py | 2 +- frappe/desk/form/meta.py | 2 - frappe/model/meta.py | 18 +- frappe/website/doctype/blogger/blogger.json | 348 +++++------------- 4 files changed, 102 insertions(+), 268 deletions(-) diff --git a/frappe/core/doctype/data_import/test_exporter_new.py b/frappe/core/doctype/data_import/test_exporter_new.py index 7464d6edc5..06d7879a09 100644 --- a/frappe/core/doctype/data_import/test_exporter_new.py +++ b/frappe/core/doctype/data_import/test_exporter_new.py @@ -20,7 +20,7 @@ class TestExporter(unittest.TestCase): e = Exporter('Web Page', export_fields='All') csv_array = e.get_csv_array() header = csv_array[0] - self.assertEqual(len(header), 24) + self.assertEqual(len(header), 25) def test_exports_selected_fields(self): diff --git a/frappe/desk/form/meta.py b/frappe/desk/form/meta.py index 26fc6037fd..ba0e5c2216 100644 --- a/frappe/desk/form/meta.py +++ b/frappe/desk/form/meta.py @@ -196,8 +196,6 @@ class FormMeta(Meta): self.get("__messages").update(messages, as_value=True) def load_dashboard(self): - if self.custom: - return self.set('__dashboard', self.get_dashboard_data()) def load_kanban_meta(self): diff --git a/frappe/model/meta.py b/frappe/model/meta.py index 9c71f8c0b1..2321e0c22a 100644 --- a/frappe/model/meta.py +++ b/frappe/model/meta.py @@ -425,17 +425,19 @@ class Meta(Document): implemented in other Frappe applications via hooks. ''' data = frappe._dict() - try: - module = load_doctype_module(self.name, suffix='_dashboard') - if hasattr(module, 'get_data'): - data = frappe._dict(module.get_data()) - except ImportError: - pass + if not self.custom: + try: + module = load_doctype_module(self.name, suffix='_dashboard') + if hasattr(module, 'get_data'): + data = frappe._dict(module.get_data()) + except ImportError: + pass self.add_doctype_links(data) - for hook in frappe.get_hooks("override_doctype_dashboards", {}).get(self.name, []): - data = frappe.get_attr(hook)(data=data) + if not self.custom: + for hook in frappe.get_hooks("override_doctype_dashboards", {}).get(self.name, []): + data = frappe.get_attr(hook)(data=data) return data diff --git a/frappe/website/doctype/blogger/blogger.json b/frappe/website/doctype/blogger/blogger.json index be4eb6399e..b8165a5908 100644 --- a/frappe/website/doctype/blogger/blogger.json +++ b/frappe/website/doctype/blogger/blogger.json @@ -1,274 +1,108 @@ { - "allow_copy": 0, - "allow_import": 1, - "allow_rename": 0, - "autoname": "field:short_name", - "beta": 0, - "creation": "2013-03-25 16:00:51", - "custom": 0, - "description": "User ID of a Blogger", - "docstatus": 0, - "doctype": "DocType", - "document_type": "Setup", - "editable_grid": 0, + "actions": [], + "allow_import": 1, + "autoname": "field:short_name", + "creation": "2013-03-25 16:00:51", + "description": "User ID of a Blogger", + "doctype": "DocType", + "document_type": "Setup", + "engine": "InnoDB", + "field_order": [ + "disabled", + "short_name", + "full_name", + "user", + "bio", + "avatar", + "posts" + ], "fields": [ { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "disabled", - "fieldtype": "Check", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Disabled", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "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, - "unique": 0 - }, + "default": "0", + "fieldname": "disabled", + "fieldtype": "Check", + "label": "Disabled" + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "description": "Will be used in url (usually first name).", - "fieldname": "short_name", - "fieldtype": "Data", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Short Name", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, + "description": "Will be used in url (usually first name).", + "fieldname": "short_name", + "fieldtype": "Data", + "label": "Short Name", + "reqd": 1, + "unique": 1 + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "full_name", - "fieldtype": "Data", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Full Name", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, + "fieldname": "full_name", + "fieldtype": "Data", + "in_list_view": 1, + "label": "Full Name", + "reqd": 1 + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "user", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "User", - "length": 0, - "no_copy": 0, - "options": "User", - "permlevel": 0, - "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, - "unique": 0 - }, + "fieldname": "user", + "fieldtype": "Link", + "label": "User", + "options": "User" + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "bio", - "fieldtype": "Small Text", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Bio", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "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, - "unique": 0 - }, + "fieldname": "bio", + "fieldtype": "Small Text", + "label": "Bio" + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "avatar", - "fieldtype": "Attach", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Avatar", - "length": 0, - "no_copy": 0, - "options": "", - "permlevel": 0, - "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, - "unique": 0 - }, + "fieldname": "avatar", + "fieldtype": "Attach", + "label": "Avatar" + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "posts", - "fieldtype": "Int", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Posts", - "length": 0, - "no_copy": 1, - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0 + "fieldname": "posts", + "fieldtype": "Int", + "in_list_view": 1, + "label": "Posts", + "no_copy": 1, + "read_only": 1 } - ], - "hide_heading": 0, - "hide_toolbar": 0, - "icon": "fa fa-user", - "idx": 1, - "image_view": 0, - "in_create": 0, - - "is_submittable": 0, - "issingle": 0, - "istable": 0, - "max_attachments": 1, - "modified": "2018-10-10 14:40:40.407657", - "modified_by": "Administrator", - "module": "Website", - "name": "Blogger", - "owner": "Administrator", + ], + "icon": "fa fa-user", + "idx": 1, + "links": [ + { + "link_doctype": "Blog Post", + "link_fieldname": "blogger" + } + ], + "max_attachments": 1, + "modified": "2020-04-19 08:21:09.684300", + "modified_by": "Administrator", + "module": "Website", + "name": "Blogger", + "owner": "Administrator", "permissions": [ { - "amend": 0, - "apply_user_permissions": 0, - "cancel": 0, - "create": 1, - "delete": 1, - "email": 1, - "export": 1, - "if_owner": 0, - "import": 1, - "is_custom": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "Website Manager", - "set_user_permissions": 1, - "share": 1, - "submit": 0, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "import": 1, + "print": 1, + "read": 1, + "report": 1, + "role": "Website Manager", + "set_user_permissions": 1, + "share": 1, "write": 1 - }, + }, { - "amend": 0, - "apply_user_permissions": 0, - "cancel": 0, - "create": 0, - "delete": 0, - "email": 1, - "export": 0, - "if_owner": 0, - "import": 0, - "is_custom": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 0, - "role": "Blogger", - "set_user_permissions": 0, - "share": 1, - "submit": 0, + "email": 1, + "print": 1, + "read": 1, + "role": "Blogger", + "share": 1, "write": 1 } - ], - "quick_entry": 0, - "read_only": 0, - "read_only_onload": 0, - "title_field": "full_name", - "track_changes": 1, - "track_seen": 0 + ], + "sort_field": "modified", + "sort_order": "DESC", + "title_field": "full_name", + "track_changes": 1 } \ No newline at end of file From 982600fab04d05084071189adbc533c221d53ae5 Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Sun, 19 Apr 2020 22:02:03 +0530 Subject: [PATCH 4/6] fix(metatags): Better Meta Tags for Web Page and Web View --- frappe/website/context.py | 25 ++++++--------- frappe/website/doctype/web_page/web_page.json | 31 +++++++++++++++++-- frappe/website/doctype/web_page/web_page.py | 8 ++--- frappe/website/doctype/web_view/web_view.json | 28 +++++++++++++++-- frappe/website/doctype/web_view/web_view.py | 9 ++++++ 5 files changed, 76 insertions(+), 25 deletions(-) diff --git a/frappe/website/context.py b/frappe/website/context.py index dcef22af43..dc3af34de9 100644 --- a/frappe/website/context.py +++ b/frappe/website/context.py @@ -221,24 +221,24 @@ def add_metatags(context): tags = frappe._dict(context.get("metatags") or {}) if tags: - if not "twitter:card" in tags: - tags["twitter:card"] = "summary_large_image" - if not "og:type" in tags: tags["og:type"] = "article" - if tags.get("name"): - tags["og:title"] = tags["twitter:title"] = tags["name"] + name = tags.get('name') or tags.get('title') + if name: + tags["og:title"] = tags["twitter:title"] = name - if tags.get("title"): - tags["og:title"] = tags["twitter:title"] = tags["title"] - - if tags.get("description"): - tags["og:description"] = tags["twitter:description"] = tags["description"] + description = tags.get("description") or context.description + if description: + tags['description'] = tags["og:description"] = tags["twitter:description"] = description image = tags.get('image', context.image or None) if image: tags["og:image"] = tags["twitter:image:src"] = tags["image"] = frappe.utils.get_url(image) + tags['twitter:card'] = "summary_large_image" + + if context.author or tags.get('author'): + tags['author'] = context.author or tags.get('author') if context.path: tags['og:url'] = tags['url'] = frappe.utils.get_url(context.path) @@ -246,11 +246,6 @@ def add_metatags(context): if context.published_on: tags['datePublished'] = context.published_on - if context.author: - tags['author'] = context.author - - if context.description: - tags['description'] = context.description tags['language'] = frappe.local.lang or 'en' diff --git a/frappe/website/doctype/web_page/web_page.json b/frappe/website/doctype/web_page/web_page.json index 5f90f3adbf..9e348d2412 100644 --- a/frappe/website/doctype/web_page/web_page.json +++ b/frappe/website/doctype/web_page/web_page.json @@ -41,6 +41,10 @@ "sb2", "header", "breadcrumbs", + "metatags_section", + "meta_title", + "meta_description", + "meta_image", "set_meta_tags" ], "fields": [ @@ -219,7 +223,7 @@ "depends_on": "eval:!doc.__islocal", "fieldname": "sb2", "fieldtype": "Section Break", - "label": "Header, Breadcrumbs and Meta Tags" + "label": "Header and Breadcrumbs" }, { "description": "HTML for header section. Optional", @@ -237,7 +241,7 @@ { "fieldname": "set_meta_tags", "fieldtype": "Button", - "label": "Set Meta Tags" + "label": "Add Custom Tags" }, { "default": "0", @@ -250,6 +254,27 @@ "fieldname": "full_width", "fieldtype": "Check", "label": "Full Width" + }, + { + "collapsible": 1, + "fieldname": "metatags_section", + "fieldtype": "Section Break", + "label": "Meta Tags" + }, + { + "fieldname": "meta_title", + "fieldtype": "Data", + "label": "Title" + }, + { + "fieldname": "meta_description", + "fieldtype": "Small Text", + "label": "Description" + }, + { + "fieldname": "meta_image", + "fieldtype": "Attach Image", + "label": "Image" } ], "has_web_view": 1, @@ -258,7 +283,7 @@ "is_published_field": "published", "links": [], "max_attachments": 20, - "modified": "2020-04-19 01:55:48.363008", + "modified": "2020-04-19 12:26:21.546908", "modified_by": "Administrator", "module": "Website", "name": "Web Page", diff --git a/frappe/website/doctype/web_page/web_page.py b/frappe/website/doctype/web_page/web_page.py index 98065e4cce..da4bf31f46 100644 --- a/frappe/website/doctype/web_page/web_page.py +++ b/frappe/website/doctype/web_page/web_page.py @@ -128,13 +128,11 @@ class WebPage(WebsiteGenerator): def set_metatags(self, context): context.metatags = { - "name": context.title + "name": self.meta_title or self.title, + "description": self.meta_description, + "image": self.meta_image or find_first_image(context.main_section or "") } - image = find_first_image(context.main_section or "") - if image: - context.metatags["image"] = image - def validate_dates(self): if self.end_date: if self.start_date and get_datetime(self.end_date) < get_datetime(self.start_date): diff --git a/frappe/website/doctype/web_view/web_view.json b/frappe/website/doctype/web_view/web_view.json index c804d31de3..8c42f51421 100644 --- a/frappe/website/doctype/web_view/web_view.json +++ b/frappe/website/doctype/web_view/web_view.json @@ -20,7 +20,11 @@ "content_html", "components", "style_section", - "css" + "css", + "metatags_section", + "meta_title", + "meta_description", + "meta_image" ], "fields": [ { @@ -88,12 +92,32 @@ "fieldname": "style_section", "fieldtype": "Section Break", "label": "Style" + }, + { + "fieldname": "metatags_section", + "fieldtype": "Section Break", + "label": "Meta Tags" + }, + { + "fieldname": "meta_title", + "fieldtype": "Data", + "label": "Title" + }, + { + "fieldname": "meta_description", + "fieldtype": "Small Text", + "label": "Description" + }, + { + "fieldname": "meta_image", + "fieldtype": "Attach Image", + "label": "Image" } ], "has_web_view": 1, "is_published_field": "published", "links": [], - "modified": "2020-04-19 05:05:43.620000", + "modified": "2020-04-19 12:25:48.014935", "modified_by": "Administrator", "module": "Website", "name": "Web View", diff --git a/frappe/website/doctype/web_view/web_view.py b/frappe/website/doctype/web_view/web_view.py index eeebb169dc..8b441579b6 100644 --- a/frappe/website/doctype/web_view/web_view.py +++ b/frappe/website/doctype/web_view/web_view.py @@ -14,6 +14,7 @@ class WebView(WebsiteGenerator): if self.content_type=='Components': self.build_components(context) + self.set_metatags(context) return context def build_components(self, context): @@ -93,3 +94,11 @@ class WebView(WebsiteGenerator): title='Default Section', elements=[] )) + + def set_metatags(self, context): + context.metatags = { + "name": self.meta_title or context.title, + "description": self.meta_description, + "image": self.meta_image + } + From fb4338b78035d20e6520f425a1ac852b2d878cfe Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Sun, 19 Apr 2020 22:18:24 +0530 Subject: [PATCH 5/6] fix(test): Exporter test, uses Web Page --- frappe/core/doctype/data_import/test_exporter_new.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/core/doctype/data_import/test_exporter_new.py b/frappe/core/doctype/data_import/test_exporter_new.py index 06d7879a09..eabf371b07 100644 --- a/frappe/core/doctype/data_import/test_exporter_new.py +++ b/frappe/core/doctype/data_import/test_exporter_new.py @@ -20,7 +20,7 @@ class TestExporter(unittest.TestCase): e = Exporter('Web Page', export_fields='All') csv_array = e.get_csv_array() header = csv_array[0] - self.assertEqual(len(header), 25) + self.assertEqual(len(header), 28) def test_exports_selected_fields(self): From a4f309a40fa208e64eefa4b7592be4fd208484dd Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Mon, 20 Apr 2020 10:19:37 +0530 Subject: [PATCH 6/6] chore(formatting): some fixes for theme.scss --- .../website_theme/website_theme_template.scss | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/frappe/website/doctype/website_theme/website_theme_template.scss b/frappe/website/doctype/website_theme/website_theme_template.scss index caad55810a..1bb4685b98 100644 --- a/frappe/website/doctype/website_theme/website_theme_template.scss +++ b/frappe/website/doctype/website_theme/website_theme_template.scss @@ -1,12 +1,14 @@ {% if google_font %} @import url('https://fonts.googleapis.com/css?family={{ google_font.replace(' ', '+') }}:{{ font_properties }}&display=swap'); -$font-family-sans-serif: "{{ google_font }}", -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; -{% endif %} -{% if primary_color %}$primary: {{ frappe.db.get_value('Color', primary_color, 'color') }};{% endif %} -{% if dark_color %}$dark: {{ frappe.db.get_value('Color', dark_color, 'color') }};{% endif %} -{% if text_color %}$body-color: {{ frappe.db.get_value('Color', text_color, 'color') }};{% endif %} -{% if background_color %}$body-bg: {{ frappe.db.get_value('Color', background_color, 'color') }};{% endif %} +$font-family-sans-serif: "{{ google_font }}", -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + +{% endif -%} + +{% if primary_color %}$primary: {{ frappe.db.get_value('Color', primary_color, 'color') }};{% endif -%} +{% if dark_color %}$dark: {{ frappe.db.get_value('Color', dark_color, 'color') }};{% endif -%} +{% if text_color %}$body-color: {{ frappe.db.get_value('Color', text_color, 'color') }};{% endif -%} +{% if background_color %}$body-bg: {{ frappe.db.get_value('Color', background_color, 'color') }};{% endif -%} $enable-shadows: {{ button_shadows and "true" or "false" }}; $enable-gradients: {{ button_gradients and "true" or "false" }}; @@ -14,8 +16,8 @@ $enable-rounded: {{ button_rounded_corners and "true" or "false" }}; @import "frappe/public/scss/website"; +{% if font_size -%} body { - {% if font_size %} font-size: {{ font_size }}; - {% endif %} } +{%- endif %}