mirror of
https://github.com/processwire/processwire.git
synced 2025-08-22 14:23:05 +02:00
Update ProcessProfile to use a dialog window prompt (via vex) when saving changes to a field requires current password.
This commit is contained in:
@@ -351,11 +351,26 @@
|
|||||||
top: -1.1em;
|
top: -1.1em;
|
||||||
bottom: auto; }
|
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;
|
-moz-box-shadow: inset 0 0 0 2px #86d7c1;
|
||||||
-webkit-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; }
|
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 {
|
.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 */
|
|
||||||
|
@@ -130,6 +130,7 @@ $reno-green: #3eb998 // RJC
|
|||||||
top: -1.1em
|
top: -1.1em
|
||||||
bottom: auto
|
bottom: auto
|
||||||
|
|
||||||
|
.AdminThemeUikit,
|
||||||
.AdminThemeReno
|
.AdminThemeReno
|
||||||
.vex.vex-theme-default
|
.vex.vex-theme-default
|
||||||
.vex-dialog-form
|
.vex-dialog-form
|
||||||
@@ -141,4 +142,5 @@ $reno-green: #3eb998 // RJC
|
|||||||
.vex-dialog-button
|
.vex-dialog-button
|
||||||
&.vex-dialog-button-primary
|
&.vex-dialog-button-primary
|
||||||
background: $reno-green // RJC
|
background: $reno-green // RJC
|
||||||
|
font-weight: normal // RJC
|
||||||
|
|
||||||
|
@@ -12,10 +12,29 @@ $(document).ready(function() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
$("form#ProcessProfile").submit(function() {
|
$("form#ProcessProfile").submit(function() {
|
||||||
|
var $form = $(this);
|
||||||
var $inputfields = $(".InputfieldStateChanged.InputfieldPassRequired");
|
var $inputfields = $(".InputfieldStateChanged.InputfieldPassRequired");
|
||||||
if(!$inputfields.length) return;
|
if(!$inputfields.length) return;
|
||||||
var $pass = $('#_old_pass');
|
var $pass = $('#_old_pass');
|
||||||
if($pass.val().length) return;
|
if($pass.val().length) return;
|
||||||
|
|
||||||
|
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: "<input type='password' placeholder='" + $pass.attr('placeholder') + "' id='_old_pass_confirm' />",
|
||||||
|
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');
|
var $passWrap = $pass.closest('.InputfieldPassword');
|
||||||
if($passWrap.hasClass('InputfieldStateCollapsed')) {
|
if($passWrap.hasClass('InputfieldStateCollapsed')) {
|
||||||
setTimeout(function() {
|
setTimeout(function() {
|
||||||
@@ -23,6 +42,7 @@ $(document).ready(function() {
|
|||||||
}, 200);
|
}, 200);
|
||||||
}
|
}
|
||||||
setTimeout(function() { $pass.focus(); }, 400);
|
setTimeout(function() { $pass.focus(); }, 400);
|
||||||
|
}
|
||||||
return false;
|
return false;
|
||||||
});
|
});
|
||||||
});
|
});
|
@@ -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})});
|
$(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:"<input type='password' placeholder='"+a.attr("placeholder")+"' id='_old_pass_confirm' />",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})});
|
@@ -18,7 +18,7 @@ class ProcessProfile extends Process implements ConfigurableModule, WirePageEdit
|
|||||||
return array(
|
return array(
|
||||||
'title' => __('User Profile', __FILE__), // getModuleInfo title
|
'title' => __('User Profile', __FILE__), // getModuleInfo title
|
||||||
'summary' => __('Enables user to change their password, email address and other settings that you define.', __FILE__), // getModuleInfo summary
|
'summary' => __('Enables user to change their password, email address and other settings that you define.', __FILE__), // getModuleInfo summary
|
||||||
'version' => 103,
|
'version' => 104,
|
||||||
'permanent' => true,
|
'permanent' => true,
|
||||||
'permission' => 'profile-edit',
|
'permission' => 'profile-edit',
|
||||||
);
|
);
|
||||||
@@ -118,7 +118,10 @@ class ProcessProfile extends Process implements ConfigurableModule, WirePageEdit
|
|||||||
$passRequired = false;
|
$passRequired = false;
|
||||||
// Inputfields where password is required to change
|
// Inputfields where password is required to change
|
||||||
$passRequiredInputfields = array();
|
$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)) {
|
if(in_array('name', $this->profileFields) && empty($fieldName)) {
|
||||||
/** @var InputfieldText $f */
|
/** @var InputfieldText $f */
|
||||||
@@ -194,7 +197,7 @@ class ProcessProfile extends Process implements ConfigurableModule, WirePageEdit
|
|||||||
foreach($passRequiredInputfields as $f) {
|
foreach($passRequiredInputfields as $f) {
|
||||||
$f->addClass('InputfieldPassRequired', 'wrapClass');
|
$f->addClass('InputfieldPassRequired', 'wrapClass');
|
||||||
$this->passRequiredNames[$f->name] = $f->name;
|
$this->passRequiredNames[$f->name] = $f->name;
|
||||||
$f->notes = ($f->notes ? "$f->notes\n" : "") . $passRequiredNote;
|
// $f->notes = ($f->notes ? "$f->notes\n" : "") . $passRequiredNote;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -10,9 +10,9 @@ class SystemUpdate12 extends SystemUpdate {
|
|||||||
|
|
||||||
$query = $this->wire('database')->prepare("SHOW columns FROM `pages` LIKE 'published'");
|
$query = $this->wire('database')->prepare("SHOW columns FROM `pages` LIKE 'published'");
|
||||||
$query->execute();
|
$query->execute();
|
||||||
|
$result = true;
|
||||||
|
|
||||||
if($query->rowCount() == 0) {
|
if($query->rowCount() == 0) {
|
||||||
$result = true;
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
$this->wire('database')->exec('ALTER TABLE pages ADD published datetime DEFAULT NULL AFTER `created_users_id`');
|
$this->wire('database')->exec('ALTER TABLE pages ADD published datetime DEFAULT NULL AFTER `created_users_id`');
|
||||||
|
Reference in New Issue
Block a user