From 2f2bb118b02f9d704d8713f44688493bb5d07321 Mon Sep 17 00:00:00 2001 From: Ryan Cramer Date: Fri, 28 Sep 2018 10:31:50 -0400 Subject: [PATCH] Update ProcessProfile to use a dialog window prompt (via vex) when saving changes to a field requires current password. --- .../JqueryUI/vex/styles/vex-theme-default.css | 21 ++++++++++-- .../vex/styles/vex-theme-default.sass | 4 ++- .../Process/ProcessProfile/ProcessProfile.js | 32 +++++++++++++++---- .../ProcessProfile/ProcessProfile.min.js | 2 +- .../ProcessProfile/ProcessProfile.module | 9 ++++-- .../System/SystemUpdater/SystemUpdate12.php | 2 +- 6 files changed, 55 insertions(+), 15 deletions(-) diff --git a/wire/modules/Jquery/JqueryUI/vex/styles/vex-theme-default.css b/wire/modules/Jquery/JqueryUI/vex/styles/vex-theme-default.css index 67ea2b51..c5558f8b 100644 --- a/wire/modules/Jquery/JqueryUI/vex/styles/vex-theme-default.css +++ b/wire/modules/Jquery/JqueryUI/vex/styles/vex-theme-default.css @@ -351,11 +351,26 @@ top: -1.1em; bottom: auto; } -.AdminThemeReno .vex.vex-theme-default .vex-dialog-form .vex-dialog-input textarea:focus, .AdminThemeReno .vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type="date"]:focus, .AdminThemeReno .vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type="datetime"]:focus, .AdminThemeReno .vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type="datetime-local"]:focus, .AdminThemeReno .vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type="email"]:focus, .AdminThemeReno .vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type="month"]:focus, .AdminThemeReno .vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type="number"]:focus, .AdminThemeReno .vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type="password"]:focus, .AdminThemeReno .vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type="search"]:focus, .AdminThemeReno .vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type="tel"]:focus, .AdminThemeReno .vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type="text"]:focus, .AdminThemeReno .vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type="time"]:focus, .AdminThemeReno .vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type="url"]:focus, .AdminThemeReno .vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type="week"]:focus { +.AdminThemeUikit .vex.vex-theme-default .vex-dialog-form .vex-dialog-input textarea:focus, .AdminThemeUikit .vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type="date"]:focus, .AdminThemeUikit .vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type="datetime"]:focus, .AdminThemeUikit .vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type="datetime-local"]:focus, .AdminThemeUikit .vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type="email"]:focus, .AdminThemeUikit .vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type="month"]:focus, .AdminThemeUikit .vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type="number"]:focus, .AdminThemeUikit .vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type="password"]:focus, .AdminThemeUikit .vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type="search"]:focus, .AdminThemeUikit .vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type="tel"]:focus, .AdminThemeUikit .vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type="text"]:focus, .AdminThemeUikit .vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type="time"]:focus, .AdminThemeUikit .vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type="url"]:focus, .AdminThemeUikit .vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type="week"]:focus, +.AdminThemeReno .vex.vex-theme-default .vex-dialog-form .vex-dialog-input textarea:focus, +.AdminThemeReno .vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type="date"]:focus, +.AdminThemeReno .vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type="datetime"]:focus, +.AdminThemeReno .vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type="datetime-local"]:focus, +.AdminThemeReno .vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type="email"]:focus, +.AdminThemeReno .vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type="month"]:focus, +.AdminThemeReno .vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type="number"]:focus, +.AdminThemeReno .vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type="password"]:focus, +.AdminThemeReno .vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type="search"]:focus, +.AdminThemeReno .vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type="tel"]:focus, +.AdminThemeReno .vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type="text"]:focus, +.AdminThemeReno .vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type="time"]:focus, +.AdminThemeReno .vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type="url"]:focus, +.AdminThemeReno .vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type="week"]:focus { -moz-box-shadow: inset 0 0 0 2px #86d7c1; -webkit-box-shadow: inset 0 0 0 2px #86d7c1; box-shadow: inset 0 0 0 2px #86d7c1; } +.AdminThemeUikit .vex.vex-theme-default .vex-dialog-button.vex-dialog-button-primary, .AdminThemeReno .vex.vex-theme-default .vex-dialog-button.vex-dialog-button-primary { - background: #3eb998; } + background: #3eb998; + font-weight: normal; } -/*# sourceMappingURL=vex-theme-default.css.map */ diff --git a/wire/modules/Jquery/JqueryUI/vex/styles/vex-theme-default.sass b/wire/modules/Jquery/JqueryUI/vex/styles/vex-theme-default.sass index 1a45cab7..f54432b2 100755 --- a/wire/modules/Jquery/JqueryUI/vex/styles/vex-theme-default.sass +++ b/wire/modules/Jquery/JqueryUI/vex/styles/vex-theme-default.sass @@ -129,7 +129,8 @@ $reno-green: #3eb998 // RJC border-top-color: #bbb top: -1.1em bottom: auto - + +.AdminThemeUikit, .AdminThemeReno .vex.vex-theme-default .vex-dialog-form @@ -141,4 +142,5 @@ $reno-green: #3eb998 // RJC .vex-dialog-button &.vex-dialog-button-primary background: $reno-green // RJC + font-weight: normal // RJC diff --git a/wire/modules/Process/ProcessProfile/ProcessProfile.js b/wire/modules/Process/ProcessProfile/ProcessProfile.js index 8a5a5115..e3244a5b 100644 --- a/wire/modules/Process/ProcessProfile/ProcessProfile.js +++ b/wire/modules/Process/ProcessProfile/ProcessProfile.js @@ -12,17 +12,37 @@ $(document).ready(function() { } $("form#ProcessProfile").submit(function() { + var $form = $(this); var $inputfields = $(".InputfieldStateChanged.InputfieldPassRequired"); if(!$inputfields.length) return; var $pass = $('#_old_pass'); if($pass.val().length) return; - var $passWrap = $pass.closest('.InputfieldPassword'); - if($passWrap.hasClass('InputfieldStateCollapsed')) { - setTimeout(function() { - $passWrap.find('.InputfieldHeader').click(); - }, 200); + + var pwAlert = ProcessWire.config.ProcessProfile.passRequiredAlert; + if(pwAlert.length && typeof vex != "undefined") { + // use vex to display dialog box where they can enter password + vex.dialog.open({ + message: pwAlert, + input: "", + callback: function(data) { + if(!data) return; + var val = $('#_old_pass_confirm').val(); + if(val.length) { + $pass.val(val); + setTimeout(function() { $('#submit_save_profile').click(); }, 200); + } + } + }); + } else { + // reveal the password field then focus it + var $passWrap = $pass.closest('.InputfieldPassword'); + if($passWrap.hasClass('InputfieldStateCollapsed')) { + setTimeout(function() { + $passWrap.find('.InputfieldHeader').click(); + }, 200); + } + setTimeout(function() { $pass.focus(); }, 400); } - setTimeout(function() { $pass.focus(); }, 400); return false; }); }); \ No newline at end of file diff --git a/wire/modules/Process/ProcessProfile/ProcessProfile.min.js b/wire/modules/Process/ProcessProfile/ProcessProfile.min.js index 2b784526..548eceb2 100644 --- a/wire/modules/Process/ProcessProfile/ProcessProfile.min.js +++ b/wire/modules/Process/ProcessProfile/ProcessProfile.min.js @@ -1 +1 @@ -$(document).ready(function(){if($(".FieldtypePassword[autocomplete='off']").length){setTimeout(function(){$(".FieldtypePassword[autocomplete='off']").attr("value","").closest(".Inputfield").removeClass("InputfieldStateChanged")},1000)}$("form#ProcessProfile").submit(function(){var b=$(".InputfieldStateChanged.InputfieldPassRequired");if(!b.length){return}var a=$("#_old_pass");if(a.val().length){return}var c=a.closest(".InputfieldPassword");if(c.hasClass("InputfieldStateCollapsed")){setTimeout(function(){c.find(".InputfieldHeader").click()},200)}setTimeout(function(){a.focus()},400);return false})}); \ No newline at end of file +$(document).ready(function(){if($(".FieldtypePassword[autocomplete='off']").length){setTimeout(function(){$(".FieldtypePassword[autocomplete='off']").attr("value","").closest(".Inputfield").removeClass("InputfieldStateChanged")},1000)}$("form#ProcessProfile").submit(function(){var b=$(this);var c=$(".InputfieldStateChanged.InputfieldPassRequired");if(!c.length){return}var a=$("#_old_pass");if(a.val().length){return}var d=ProcessWire.config.ProcessProfile.passRequiredAlert;if(d.length&&typeof vex!="undefined"){vex.dialog.open({message:d,input:"",callback:function(f){if(!f){return}var g=$("#_old_pass_confirm").val();if(g.length){a.val(g);setTimeout(function(){$("#submit_save_profile").click()},200)}}})}else{var e=a.closest(".InputfieldPassword");if(e.hasClass("InputfieldStateCollapsed")){setTimeout(function(){e.find(".InputfieldHeader").click()},200)}setTimeout(function(){a.focus()},400)}return false})}); \ No newline at end of file diff --git a/wire/modules/Process/ProcessProfile/ProcessProfile.module b/wire/modules/Process/ProcessProfile/ProcessProfile.module index 5b58bf22..b27f379e 100644 --- a/wire/modules/Process/ProcessProfile/ProcessProfile.module +++ b/wire/modules/Process/ProcessProfile/ProcessProfile.module @@ -18,7 +18,7 @@ class ProcessProfile extends Process implements ConfigurableModule, WirePageEdit return array( 'title' => __('User Profile', __FILE__), // getModuleInfo title 'summary' => __('Enables user to change their password, email address and other settings that you define.', __FILE__), // getModuleInfo summary - 'version' => 103, + 'version' => 104, 'permanent' => true, 'permission' => 'profile-edit', ); @@ -118,7 +118,10 @@ class ProcessProfile extends Process implements ConfigurableModule, WirePageEdit $passRequired = false; // Inputfields where password is required to change $passRequiredInputfields = array(); - $passRequiredNote = $this->_('To change this field, you must also enter your current password in the “Set Password” field.'); + $this->wire('config')->js('ProcessProfile', array( + 'passRequiredAlert' => $this->_('For security, please enter your current password to save these changes:') + )); + $this->wire('modules')->get('JqueryUI')->use('vex'); if(in_array('name', $this->profileFields) && empty($fieldName)) { /** @var InputfieldText $f */ @@ -194,7 +197,7 @@ class ProcessProfile extends Process implements ConfigurableModule, WirePageEdit foreach($passRequiredInputfields as $f) { $f->addClass('InputfieldPassRequired', 'wrapClass'); $this->passRequiredNames[$f->name] = $f->name; - $f->notes = ($f->notes ? "$f->notes\n" : "") . $passRequiredNote; + // $f->notes = ($f->notes ? "$f->notes\n" : "") . $passRequiredNote; } } diff --git a/wire/modules/System/SystemUpdater/SystemUpdate12.php b/wire/modules/System/SystemUpdater/SystemUpdate12.php index 225ded0d..581cc47a 100644 --- a/wire/modules/System/SystemUpdater/SystemUpdate12.php +++ b/wire/modules/System/SystemUpdater/SystemUpdate12.php @@ -10,9 +10,9 @@ class SystemUpdate12 extends SystemUpdate { $query = $this->wire('database')->prepare("SHOW columns FROM `pages` LIKE 'published'"); $query->execute(); + $result = true; if($query->rowCount() == 0) { - $result = true; try { $this->wire('database')->exec('ALTER TABLE pages ADD published datetime DEFAULT NULL AFTER `created_users_id`');