From 614098a84ab3047feb751053b348377e7fa30e4c Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Wed, 8 Mar 2017 22:52:54 +0530 Subject: [PATCH] [fixes] mandatory css in grids, better welcome email --- frappe/core/doctype/user/user.py | 10 ++++++++-- frappe/desk/search.py | 2 +- frappe/public/css/common.css | 3 --- frappe/public/css/desk.css | 4 +--- frappe/public/css/form_grid.css | 11 +++++++++- frappe/public/css/website.css | 3 --- frappe/public/js/frappe/form/control.js | 4 ++-- frappe/public/js/frappe/form/grid.js | 20 ++++++++++++++++++- frappe/public/js/frappe/form/save.js | 20 +++++++++++++++---- .../js/frappe/form/templates/form_links.html | 5 +++-- frappe/public/js/legacy/form.js | 1 + frappe/public/less/common.less | 2 +- frappe/public/less/desk.less | 1 + frappe/public/less/form_grid.less | 14 ++++++++++++- frappe/templates/emails/new_user.html | 11 +++++++--- frappe/utils/user.py | 1 + 16 files changed, 85 insertions(+), 27 deletions(-) diff --git a/frappe/core/doctype/user/user.py b/frappe/core/doctype/user/user.py index 619a324d04..d849b3cdac 100644 --- a/frappe/core/doctype/user/user.py +++ b/frappe/core/doctype/user/user.py @@ -264,8 +264,14 @@ class User(Document): link = self.reset_password() - self.send_login_mail(_("Verify Your Account"), "templates/emails/new_user.html", - {"link": link, "site_url": get_url()}) + app_title = [t for t in frappe.get_hooks('app_title') if t != 'Frappe Framework'] + subject = _("Welcome to {0}").format(app_title[0]) + + self.send_login_mail(subject, "templates/emails/new_user.html", + dict( + link=link, + site_url=get_url(), + )) def send_login_mail(self, subject, template, add_args, now=None): diff --git a/frappe/desk/search.py b/frappe/desk/search.py index 8dad0ba59b..ee88510176 100644 --- a/frappe/desk/search.py +++ b/frappe/desk/search.py @@ -106,7 +106,7 @@ def get_std_fields_list(meta, key): def build_for_autosuggest(res): results = [] for r in res: - out = {"value": r[0], "description": ", ".join(unique(cstr(d) for d in r)[1:])} + out = {"value": r[0], "description": ", ".join(unique(cstr(d) for d in r if d)[1:])} results.append(out) return results diff --git a/frappe/public/css/common.css b/frappe/public/css/common.css index 7a3808c605..e010c95d8e 100644 --- a/frappe/public/css/common.css +++ b/frappe/public/css/common.css @@ -111,9 +111,6 @@ a.badge-hover:focus .badge, a.badge-hover:active .badge { background-color: #D8DFE5; } -.msgprint { - margin: 15px 0px; -} .msgprint pre { text-align: left; } diff --git a/frappe/public/css/desk.css b/frappe/public/css/desk.css index 84ac24c0b0..9412885f3a 100644 --- a/frappe/public/css/desk.css +++ b/frappe/public/css/desk.css @@ -111,9 +111,6 @@ a.badge-hover:focus .badge, a.badge-hover:active .badge { background-color: #D8DFE5; } -.msgprint { - margin: 15px 0px; -} .msgprint pre { text-align: left; } @@ -499,6 +496,7 @@ fieldset[disabled] .form-control { color: #fff; border-radius: 10px; cursor: pointer; + margin-right: 10px; } /* on small screens, show only icons on top */ @media (max-width: 767px) { diff --git a/frappe/public/css/form_grid.css b/frappe/public/css/form_grid.css index b0614d1205..58de6044d3 100644 --- a/frappe/public/css/form_grid.css +++ b/frappe/public/css/form_grid.css @@ -3,6 +3,9 @@ border: 1px solid #d1d8dd; border-radius: 3px; } +.form-grid.error { + border-color: #ff5858; +} .grid-heading-row { border-bottom: 1px solid #d1d8dd; background-color: #F7FAFC; @@ -52,7 +55,13 @@ padding: 10px 15px; max-height: 200px; border-right: 1px solid #d1d8dd; - margin-bottom: -1px; +} +.grid-static-col.bold { + font-weight: bold; + background-color: #fffdf4; +} +.validated-form .grid-static-col.error { + background-color: #FFDCDC; } .grid-static-col input[type="checkbox"] { margin-left: -16px !important; diff --git a/frappe/public/css/website.css b/frappe/public/css/website.css index e0b4e05115..5d40ad163b 100644 --- a/frappe/public/css/website.css +++ b/frappe/public/css/website.css @@ -111,9 +111,6 @@ a.badge-hover:focus .badge, a.badge-hover:active .badge { background-color: #D8DFE5; } -.msgprint { - margin: 15px 0px; -} .msgprint pre { text-align: left; } diff --git a/frappe/public/js/frappe/form/control.js b/frappe/public/js/frappe/form/control.js index 0a7e8c647f..ca41feb0d6 100644 --- a/frappe/public/js/frappe/form/control.js +++ b/frappe/public/js/frappe/form/control.js @@ -391,10 +391,10 @@ frappe.ui.form.ControlInput = frappe.ui.form.Control.extend({ }, set_bold: function() { if(this.$input) { - this.$input.toggleClass("bold", !!this.df.bold); + this.$input.toggleClass("bold", !!(this.df.bold || this.df.reqd)); } if(this.disp_area) { - $(this.disp_area).toggleClass("bold", !!this.df.bold); + $(this.disp_area).toggleClass("bold", !!(this.df.bold || this.df.reqd)); } } }); diff --git a/frappe/public/js/frappe/form/grid.js b/frappe/public/js/frappe/form/grid.js index 58e122bf62..503b3b7b6c 100644 --- a/frappe/public/js/frappe/form/grid.js +++ b/frappe/public/js/frappe/form/grid.js @@ -50,6 +50,8 @@ frappe.ui.form.Grid = Class.extend({ .appendTo(this.parent) .attr("data-fieldname", this.df.fieldname); + this.form_grid = this.wrapper.find('.form-grid'); + this.wrapper.find(".grid-add-row").click(function() { me.add_new_row(null, null, true); me.set_focus_on_row(); @@ -178,6 +180,9 @@ frappe.ui.form.Grid = Class.extend({ frappe.utils.scroll_to(_scroll_y); } + // red if mandatory + this.form_grid.toggleClass('error', !!(this.df.reqd && !(data && data.length))); + this.refresh_remove_rows_button(); }, setup_toolbar: function() { @@ -783,6 +788,15 @@ frappe.ui.form.GridRow = Class.extend({ this.refresh_field(df.fieldname, txt); } + // background color for cellz + if(this.doc) { + if(df.reqd && !txt) { + column.addClass('error'); + } + if (df.reqd || df.bold) { + column.addClass('bold'); + } + } } }, @@ -1028,8 +1042,9 @@ frappe.ui.form.GridRow = Class.extend({ } }, refresh_field: function(fieldname, txt) { + var df = this.grid.get_docfield(fieldname); if(txt===undefined) { - var txt = frappe.format(this.doc[fieldname], this.grid.get_docfield(fieldname), + var txt = frappe.format(this.doc[fieldname], df, null, this.frm.doc); } @@ -1037,6 +1052,9 @@ frappe.ui.form.GridRow = Class.extend({ var column = this.columns[fieldname]; if(column) { column.static_area.html(txt || ""); + if(df.reqd) { + column.toggleClass('error', !!(txt===null || txt==='')); + } } // reset field value diff --git a/frappe/public/js/frappe/form/save.js b/frappe/public/js/frappe/form/save.js index 65e708067a..5be3ffbc4e 100644 --- a/frappe/public/js/frappe/form/save.js +++ b/frappe/public/js/frappe/form/save.js @@ -19,6 +19,7 @@ frappe.ui.form.save = function(frm, action, callback, btn) { var save = function() { check_name(function() { + $(frm.wrapper).addClass('validated-form'); if(check_mandatory()) { _call({ method: "frappe.desk.form.save.savedocs", @@ -132,10 +133,21 @@ frappe.ui.form.save = function(frm, action, callback, btn) { } }); - if(error_fields.length) - msgprint(__('Mandatory fields required in {0}', [(doc.parenttype - ? (__(frappe.meta.docfield_map[doc.parenttype][doc.parentfield].label) + ' ('+ __("Table") + ')') - : __(doc.doctype))]) + '
"); + if(error_fields.length) { + if(doc.parenttype) { + var message = __('Mandatory fields required in table {0}, Row {1}', + [__(frappe.meta.docfield_map[doc.parenttype][doc.parentfield].label).bold(), doc.idx]); + } else { + var message = __('Mandatory fields required in {0}', [__(doc.doctype)]); + + } + message = message + '

"; + msgprint({ + message: message, + indicator: 'red', + title: __('Missing Fields') + }); + } }); return !has_errors; diff --git a/frappe/public/js/frappe/form/templates/form_links.html b/frappe/public/js/frappe/form/templates/form_links.html index afb4a87b2b..708fc3d485 100644 --- a/frappe/public/js/frappe/form/templates/form_links.html +++ b/frappe/public/js/frappe/form/templates/form_links.html @@ -13,8 +13,9 @@ {% if !internal_links[doctype] %} - + {% endif %} {% } %} diff --git a/frappe/public/js/legacy/form.js b/frappe/public/js/legacy/form.js index b0ccd54637..75b268a090 100644 --- a/frappe/public/js/legacy/form.js +++ b/frappe/public/js/legacy/form.js @@ -455,6 +455,7 @@ _f.Frm.prototype.refresh = function(docname) { } if(is_a_different_doc) { + $(this.wrapper).removeClass('validated-form') if(this.show_print_first && this.doc.docstatus===1) { // show print view this.print_doc(); diff --git a/frappe/public/less/common.less b/frappe/public/less/common.less index c5418e0f0b..d7856e1791 100644 --- a/frappe/public/less/common.less +++ b/frappe/public/less/common.less @@ -134,7 +134,7 @@ a.badge-hover& { } .msgprint { - margin: 15px 0px; + // margin: 15px 0px; // text-align: center; pre { diff --git a/frappe/public/less/desk.less b/frappe/public/less/desk.less index 8159650617..a855a7abe6 100644 --- a/frappe/public/less/desk.less +++ b/frappe/public/less/desk.less @@ -327,6 +327,7 @@ textarea.form-control { color:#fff; border-radius:10px; cursor: pointer; + margin-right: 10px; } /* on small screens, show only icons on top */ diff --git a/frappe/public/less/form_grid.less b/frappe/public/less/form_grid.less index b1a55dd948..15fcbab14d 100644 --- a/frappe/public/less/form_grid.less +++ b/frappe/public/less/form_grid.less @@ -6,6 +6,10 @@ border-radius: 3px; } +.form-grid.error { + border-color: @indicator-red; +} + .grid-heading-row { border-bottom: 1px solid @border-color; background-color: @panel-bg; @@ -64,7 +68,15 @@ padding: 10px 15px; max-height: 200px; border-right: 1px solid @border-color; - margin-bottom: -1px; +} + +.grid-static-col.bold { + font-weight: bold; + background-color: @extra-light-yellow; +} + +.validated-form .grid-static-col.error { + background-color: @label-danger-bg; } .grid-static-col { diff --git a/frappe/templates/emails/new_user.html b/frappe/templates/emails/new_user.html index 9eae7c5ee1..9386a24b5d 100644 --- a/frappe/templates/emails/new_user.html +++ b/frappe/templates/emails/new_user.html @@ -1,12 +1,17 @@ -

{{ title }}

+{% if title %}

{{ title }}

{% endif %}

{{_("Dear")}} {{ first_name }}{% if last_name %} {{ last_name}}{% endif %},

{{_("A new account has been created for you at {0}").format(site_url)}}.

{{_("Your login id is")}}: {{ user }}

{{_("Click on the link below to complete your registration and set a new password")}}.

-

{{_("Complete Registration")}}

+ +

+ {{ _("Complete Registration") }} +

+ +{% if user_fullname != "Administrator" %}

{{_("Thank you")}},
{{ user_fullname }}

- +{% endif %}

{{_("You can also copy-paste this link in your browser")}} {{ link }}

diff --git a/frappe/utils/user.py b/frappe/utils/user.py index 87426f5e9c..3e4b6515d7 100755 --- a/frappe/utils/user.py +++ b/frappe/utils/user.py @@ -265,6 +265,7 @@ def add_system_manager(email, first_name=None, last_name=None, send_welcome_emai "user_type": "System User", "send_welcome_email": 1 if send_welcome_email else 0 }) + user.insert() # add roles