From bd3ee0d4c02f90a1022473c23d907486ee57f433 Mon Sep 17 00:00:00 2001 From: Shariq Ansari Date: Fri, 20 Jan 2023 22:03:21 +0530 Subject: [PATCH 1/4] fix: Password Strength Progress Bar --- .../js/frappe/form/controls/password.js | 63 ++++++++++++++----- frappe/public/scss/common/controls.scss | 42 +++++++++---- 2 files changed, 78 insertions(+), 27 deletions(-) diff --git a/frappe/public/js/frappe/form/controls/password.js b/frappe/public/js/frappe/form/controls/password.js index f7e5165472..dbc0fe0b81 100644 --- a/frappe/public/js/frappe/form/controls/password.js +++ b/frappe/public/js/frappe/form/controls/password.js @@ -7,22 +7,29 @@ frappe.ui.form.ControlPassword = class ControlPassword extends frappe.ui.form.Co make_input() { var me = this; super.make_input(); - this.$input - .parent() - .append($('')); - this.$wrapper - .find(".control-input-wrapper") - .append($('')); - this.indicator = this.$wrapper.find(".password-strength-indicator"); + this.indicator = $( + `` + ).insertAfter(this.$input); + + this.progress_text = this.indicator.find(".progress-text"); + this.progress_bar = this.indicator.find(".progress-bar"); this.message = this.$wrapper.find(".help-box"); - this.$input.on("keyup", () => { - clearTimeout(this.check_password_timeout); - this.check_password_timeout = setTimeout(() => { + this.$input.on( + "keyup", + frappe.utils.debounce(() => { me.get_password_strength(me.$input.val()); - }, 500); - }); + }, 500) + ); } disable_password_checks() { @@ -33,6 +40,13 @@ frappe.ui.form.ControlPassword = class ControlPassword extends frappe.ui.form.Co if (!this.enable_password_checks) { return; } + + if (!value) { + this.indicator.addClass("hidden"); + this.message.addClass("hidden"); + return; + } + var me = this; frappe.call({ type: "POST", @@ -43,15 +57,34 @@ frappe.ui.form.ControlPassword = class ControlPassword extends frappe.ui.form.Co callback: function (r) { if (r.message) { let score = r.message.score; - var indicators = ["red", "red", "orange", "yellow", "green"]; + var indicators = ["red", "red", "orange", "blue", "green"]; me.set_strength_indicator(indicators[score]); } }, }); } set_strength_indicator(color) { - var message = __("Include symbols, numbers and capital letters in the password"); - this.indicator.removeClass().addClass("password-strength-indicator indicator " + color); + let strength = { + red: [__("Weak"), "danger", 25], + orange: [__("Average"), "warning", 50], + blue: [__("Strong"), "info", 75], + green: [__("Excellent"), "success", 100], + }; + let progress_text = strength[color][0]; + let progress_percent = strength[color][2]; + let progress_color = strength[color][1]; + + this.indicator.removeClass("hidden"); + + this.progress_text.html(progress_text).css("color", `var(--${color}-500)`); + + this.progress_bar + .css("width", progress_percent + "%") + .attr("aria-valuenow", progress_percent) + .removeClass() + .addClass("progress-bar progress-bar-" + progress_color); + + let message = __("Include symbols, numbers and capital letters in the password"); this.message.html(message).toggleClass("hidden", color == "green"); } }; diff --git a/frappe/public/scss/common/controls.scss b/frappe/public/scss/common/controls.scss index 0f42f6af9d..c663d67eac 100644 --- a/frappe/public/scss/common/controls.scss +++ b/frappe/public/scss/common/controls.scss @@ -5,20 +5,34 @@ @import "phone_picker"; // password -.form-control[data-fieldtype="Password"] { - position: inherit; -} +.frappe-control[data-fieldtype="Password"] { + .control-input-wrapper { + position: relative; -.password-strength-indicator { - // TODO: Review - float: right; - padding: 15px; - margin-top: -41px; - margin-right: -7px; -} + .form-control[data-fieldtype="Password"] { + position: inherit; + } -.password-strength-message { - margin-top: -10px; + .password-strength-indicator { + display: flex; + align-items: center; + position: absolute; + gap: 5px; + top: -20px; + right: 0px; + + .progress-text { + font-size: var(--text-xs); + font-weight: 600; + } + + .progress { + background-color: var(--bg-light-gray); + width: 100px; + height: 5px; + } + } + } } // select @@ -232,6 +246,10 @@ a.progress-small { background-color: var(--red-500); } +.progress-bar-info { + background-color: var(--blue-500); +} + .progress-bar-warning { background-color: var(--orange-500); } From 6c1624d41e1bec74b279b172ff783f847ec03848 Mon Sep 17 00:00:00 2001 From: Shariq Ansari Date: Mon, 23 Jan 2023 16:23:44 +0530 Subject: [PATCH 2/4] feat: toggle password icon --- .../js/frappe/form/controls/password.js | 22 ++++++++++++++++++- frappe/public/scss/common/controls.scss | 9 ++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/frappe/public/js/frappe/form/controls/password.js b/frappe/public/js/frappe/form/controls/password.js index dbc0fe0b81..2e575e3e19 100644 --- a/frappe/public/js/frappe/form/controls/password.js +++ b/frappe/public/js/frappe/form/controls/password.js @@ -27,9 +27,29 @@ frappe.ui.form.ControlPassword = class ControlPassword extends frappe.ui.form.Co this.$input.on( "keyup", frappe.utils.debounce(() => { + let hide_icon = me.$input.val() && !me.$input.val().includes("*"); + me.toggle_password.toggleClass("hidden", !hide_icon); me.get_password_strength(me.$input.val()); }, 500) ); + + this.toggle_password = $(` + + `).insertAfter(this.$input); + + this.toggle_password.on("click", () => { + if (this.$input.attr("type") === "password") { + this.$input.attr("type", "text"); + this.toggle_password.html(frappe.utils.icon("hide", "sm")); + } else { + this.$input.attr("type", "password"); + this.toggle_password.html(frappe.utils.icon("unhide", "sm")); + } + }); + + !this.value && this.toggle_password.removeClass("hidden"); } disable_password_checks() { @@ -71,8 +91,8 @@ frappe.ui.form.ControlPassword = class ControlPassword extends frappe.ui.form.Co green: [__("Excellent"), "success", 100], }; let progress_text = strength[color][0]; - let progress_percent = strength[color][2]; let progress_color = strength[color][1]; + let progress_percent = strength[color][2]; this.indicator.removeClass("hidden"); diff --git a/frappe/public/scss/common/controls.scss b/frappe/public/scss/common/controls.scss index c663d67eac..08debbbde9 100644 --- a/frappe/public/scss/common/controls.scss +++ b/frappe/public/scss/common/controls.scss @@ -32,6 +32,15 @@ height: 5px; } } + + .toggle-password { + position: absolute; + top: 4px; + right: 8px; + padding: 3px; + z-index: 3; + cursor: pointer; + } } } From 229ca404ae1e4345b9724b4f6c6cf4afa62dffcd Mon Sep 17 00:00:00 2001 From: Shariq Ansari Date: Tue, 24 Jan 2023 11:22:05 +0530 Subject: [PATCH 3/4] fix: LDAP - default user role mandatory logic broken --- frappe/integrations/doctype/ldap_settings/ldap_settings.json | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/frappe/integrations/doctype/ldap_settings/ldap_settings.json b/frappe/integrations/doctype/ldap_settings/ldap_settings.json index b8f73cebed..0b3bf06239 100644 --- a/frappe/integrations/doctype/ldap_settings/ldap_settings.json +++ b/frappe/integrations/doctype/ldap_settings/ldap_settings.json @@ -88,8 +88,7 @@ "fieldtype": "Link", "label": "Default User Role", "mandatory_depends_on": "eval: doc.default_user_type == \"System User\"", - "options": "Role", - "reqd": 1 + "options": "Role" }, { "description": "Must be enclosed in '()' and include '{0}', which is a placeholder for the user/login name. i.e. (&(objectclass=user)(uid={0}))", @@ -302,7 +301,7 @@ "in_create": 1, "issingle": 1, "links": [], - "modified": "2022-12-05 21:52:31.146035", + "modified": "2023-01-24 11:20:06.049708", "modified_by": "Administrator", "module": "Integrations", "name": "LDAP Settings", From 788d512a69639f3eeb826f897babed0ca6d8d537 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 24 Jan 2023 11:33:00 +0530 Subject: [PATCH 4/4] chore(deps): bump cookiejar from 2.1.2 to 2.1.4 (#19737) Bumps [cookiejar](https://github.com/bmeck/node-cookiejar) from 2.1.2 to 2.1.4. - [Release notes](https://github.com/bmeck/node-cookiejar/releases) - [Commits](https://github.com/bmeck/node-cookiejar/commits) --- updated-dependencies: - dependency-name: cookiejar dependency-type: indirect ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 550ccbbded..d2ee8e62a5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -742,9 +742,9 @@ cookie@^0.4.0, cookie@~0.4.1: integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== cookiejar@^2.1.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.1.2.tgz#dd8a235530752f988f9a0844f3fc589e3111125c" - integrity sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA== + version "2.1.4" + resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.1.4.tgz#ee669c1fea2cf42dc31585469d193fef0d65771b" + integrity sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw== copy-anything@^2.0.1: version "2.0.3"