From 886d4187058e6280f50a06485dc5b69674c191fb Mon Sep 17 00:00:00 2001 From: Mykyta Synelnikov Date: Tue, 25 Jul 2023 13:22:22 +0300 Subject: [PATCH] - reviewed #1212 and manually merged it into development/2.6.9; --- assets/css/um-styles.css | 79 ++++++++++----- assets/js/um-scripts.js | 12 +++ assets/js/um-scripts.min.js | 2 +- includes/core/class-fields.php | 39 ++++++-- includes/core/um-actions-account.php | 138 +++++++++++++++++---------- 5 files changed, 185 insertions(+), 85 deletions(-) diff --git a/assets/css/um-styles.css b/assets/css/um-styles.css index 4db8e5e5..d107dea4 100644 --- a/assets/css/um-styles.css +++ b/assets/css/um-styles.css @@ -383,6 +383,32 @@ p.um-notice.warning a { word-wrap: break-word; } +.um-field-area-password { + position: relative; +} + +.um-toggle-password { + cursor: pointer; + display: block; + position: absolute; + right: 0; + top: 0; + height: 100%; + width: 40px; + text-align: center; + box-sizing: border-box; + font-size: 20px; + line-height: 2; +} + +.um-toggle-password i { + transition: all .2s linear; +} + +.um-toggle-password:hover i { + color: #44b0ec; +} + .um-field-value p { margin: 0 0 6px 0 !important; padding: 0; @@ -432,11 +458,11 @@ p.um-notice.warning a { line-height: 1.7em; } -.um-form input[type=text], -.um-form input[type=search], -.um-form input[type=tel], -.um-form input[type=number], -.um-form input[type=password] { +.um-form input[type="text"], +.um-form input[type="search"], +.um-form input[type="tel"], +.um-form input[type="number"], +.um-form input[type="password"] { padding: 0 12px !important; width: 100%; display: block !important; @@ -451,32 +477,35 @@ p.um-notice.warning a { box-shadow: none !important; margin: 0 !important; position: static; - outline: none !important; } -.um-form input[type=number] { +.um-form .um-field-area-password input[type="password"] { + padding-right: 40px !important; +} + +.um-form input[type="number"] { width: auto; padding: 0 0 0 5px !important; height: 30px !important; } -.um-form input[type=text]:focus, -.um-form input[type=search]:focus, -.um-form input[type=tel]:focus, -.um-form input[type=number]:focus, -.um-form input[type=password]:focus, +.um-form input[type="text"]:focus, +.um-form input[type="search"]:focus, +.um-form input[type="tel"]:focus, +.um-form input[type="number"]:focus, +.um-form input[type="password"]:focus, .um-form textarea:focus { box-shadow: none !important; outline: none !important; } -.um-form input[type=text].um-iconed, -.um-form input[type=tel].um-iconed, -.um-form input[type=password].um-iconed { padding-left: 44px !important } +.um-form input[type="text"].um-iconed, +.um-form input[type="tel"].um-iconed, +.um-form input[type="password"].um-iconed { padding-left: 44px !important } -.um-form input[type=text].um-error, -.um-form input[type=tel].um-error, -.um-form input[type=password].um-error { border-color: #C74A4A !important } +.um-form input[type="text"].um-error, +.um-form input[type="tel"].um-error, +.um-form input[type="password"].um-error { border-color: #C74A4A !important } .um-form textarea { width: 100%; @@ -633,15 +662,15 @@ p.um-notice.warning a { .um div.disabled, .um-disabled, -.um input[type=submit]:disabled, -.um input[type=text]:disabled, -.um input[type=number]:disabled { +.um input[type="submit"]:disabled, +.um input[type="text"]:disabled, +.um input[type="number"]:disabled { opacity: 0.6 !important; cursor: no-drop !important; } -input[type=submit].um-button, -input[type=submit].um-button:focus { +input[type="submit"].um-button, +input[type="submit"].um-button:focus { vertical-align: middle !important; height: auto !important; font-size: 15px; @@ -656,7 +685,7 @@ input[type=submit].um-button:focus { -webkit-appearance: none; } -input[type=submit].um-button:hover { +input[type="submit"].um-button:hover { opacity: 1; } @@ -1098,4 +1127,4 @@ small.um-max-filesize span{ .um-field-area .wp-switch-editor{ float: none; height: auto; -} \ No newline at end of file +} diff --git a/assets/js/um-scripts.js b/assets/js/um-scripts.js index 08cb66dd..51174c84 100644 --- a/assets/js/um-scripts.js +++ b/assets/js/um-scripts.js @@ -713,4 +713,16 @@ jQuery(document).ready(function() { } } + jQuery( document.body ).on('click', '.um-toggle-password', function (){ + let parent = jQuery(this).closest('.um-field-area-password'); + let passwordField = parent.find('input'); + let type = passwordField.attr('type'); + if ( 'text' === type ) { + passwordField.attr('type', 'password'); + parent.find('i').toggleClass('um-icon-eye um-icon-eye-disabled'); + } else { + passwordField.attr('type', 'text'); + parent.find('i').toggleClass('um-icon-eye um-icon-eye-disabled'); + } + }); }); diff --git a/assets/js/um-scripts.min.js b/assets/js/um-scripts.min.js index b215de80..f1753abd 100644 --- a/assets/js/um-scripts.min.js +++ b/assets/js/um-scripts.min.js @@ -1 +1 @@ -function um_sanitize_value(e,t){var a=document.createElement("div"),e=(a.innerText=e,a.innerHTML);return t&&jQuery(t).val(e),e}function um_unsanitize_value(e){var t=document.createElement("textarea");return t.innerHTML=e,0===t.childNodes.length?"":t.childNodes[0].nodeValue}function um_init_datetimepicker(){jQuery(".um-datepicker:not(.picker__input)").each(function(){var e=jQuery(this),t=!1,a=(void 0!==e.attr("data-disabled_weekdays")&&""!==e.attr("data-disabled_weekdays")&&(t=JSON.parse(e.attr("data-disabled_weekdays"))),null),i=(void 0!==e.attr("data-years")&&(a=e.attr("data-years")),e.attr("data-date_min")),n=e.attr("data-date_max"),r=[],u=[],i=(void 0!==i&&(r=i.split(",")),void 0!==n&&(u=n.split(",")),r.length?new Date(r):null),n=r.length?new Date(u):null,u=(i&&"Invalid Date"==i.toString()&&3==r.length&&(r=r[1]+"/"+r[2]+"/"+r[0],i=new Date(Date.parse(r))),n&&"Invalid Date"==n.toString()&&3==u.length&&(r=u[1]+"/"+u[2]+"/"+u[0],n=new Date(Date.parse(r))),{disable:t,format:e.attr("data-format"),formatSubmit:"yyyy/mm/dd",hiddenName:!0,onOpen:function(){e.blur()},onClose:function(){e.blur()}});null!==a&&(u.selectYears=a),null!==i&&(u.min=i),null!==n&&(u.max=n),e.pickadate(u)}),jQuery(".um-timepicker:not(.picker__input)").each(function(){var e=jQuery(this);e.pickatime({format:e.attr("data-format"),interval:parseInt(e.attr("data-intervals")),formatSubmit:"HH:i",hiddenName:!0,onOpen:function(){e.blur()},onClose:function(){e.blur()}})})}function init_tipsy(){"function"==typeof jQuery.fn.tipsy&&(jQuery(".um-tip-n").tipsy({gravity:"n",opacity:1,live:"a.live",offset:3}),jQuery(".um-tip-w").tipsy({gravity:"w",opacity:1,live:"a.live",offset:3}),jQuery(".um-tip-e").tipsy({gravity:"e",opacity:1,live:"a.live",offset:3}),jQuery(".um-tip-s").tipsy({gravity:"s",opacity:1,live:"a.live",offset:3}))}jQuery(document).ready(function(){function i(e){var a=jQuery(e.currentTarget),e=a.find(":selected");1field_value( $key, $default, $data ); - $output .= ' + if ( UM()->options()->get( 'toggle_password' ) ) { + $output .= '
+ + +
+ '; + } else { + $output .= ' '; + } if ( $this->is_error( $key ) ) { $output .= $this->field_error( $this->show_error( $key ) ); @@ -2467,9 +2475,17 @@ if ( ! class_exists( 'um\core\Fields' ) ) { $field_name = $key . $form_suffix; $field_value = $this->field_value( $key, $default, $data ); - $output .= ' + if ( UM()->options()->get( 'toggle_password' ) ) { + $output .= '
+ + +
+ '; + } else { + $output .= ' '; + } if ( $this->is_error( $key ) ) { $output .= $this->field_error( $this->show_error( $key ) ); @@ -2507,10 +2523,17 @@ if ( ! class_exists( 'um\core\Fields' ) ) { } $field_value = $this->field_value( $key, $default, $data ); + if ( UM()->options()->get( 'toggle_password' ) ) { + $output .= '
+ + +
+ '; + } else { + $output .= ' - $output .= ' - - '; + '; + } if ( $this->is_error( $key ) ) { $output .= $this->field_error( $this->show_error( $key ) ); @@ -2555,7 +2578,11 @@ if ( ! class_exists( 'um\core\Fields' ) ) { $placeholder = sprintf( __( 'Confirm %s', 'ultimate-member' ), $data['label'] ); } - $output .= ''; + if ( UM()->options()->get( 'toggle_password' ) ) { + $output .= '
'; + } else { + $output .= ''; + } $output .= ''; diff --git a/includes/core/um-actions-account.php b/includes/core/um-actions-account.php index 1a10a6ca..9d4c4e02 100644 --- a/includes/core/um-actions-account.php +++ b/includes/core/um-actions-account.php @@ -1,8 +1,8 @@ - - +
- get_row( - "SELECT ID - FROM $wpdb->posts - WHERE post_author = $user_id AND - post_type = 'user_request' AND - post_name = 'export_personal_data' AND - post_status = 'request-completed' - ORDER BY ID DESC - LIMIT 1", - ARRAY_A ); + get_row( + $wpdb->prepare( + "SELECT ID + FROM $wpdb->posts + WHERE post_author = %d AND + post_type = 'user_request' AND + post_name = 'export_personal_data' AND + post_status = 'request-completed' + ORDER BY ID DESC + LIMIT 1", + $user_id + ), + ARRAY_A + ); if ( ! empty( $completed ) ) { $exports_url = wp_privacy_exports_url(); echo '

' . esc_html__( 'You could download your previous data:', 'ultimate-member' ) . '

'; - echo '' . esc_html__( 'Download Personal Data', 'ultimate-member' ) . ''; + echo '' . esc_html__( 'Download Personal Data', 'ultimate-member' ) . ''; echo '

' . esc_html__( 'You could send a new request for an export of personal your data.', 'ultimate-member' ) . '

'; } $pending = $wpdb->get_row( - "SELECT ID, post_status - FROM $wpdb->posts - WHERE post_author = $user_id AND - post_type = 'user_request' AND - post_name = 'export_personal_data' AND - post_status != 'request-completed' - ORDER BY ID DESC - LIMIT 1", - ARRAY_A ); + $wpdb->prepare( + "SELECT ID, post_status + FROM $wpdb->posts + WHERE post_author = %d AND + post_type = 'user_request' AND + post_name = 'export_personal_data' AND + post_status != 'request-completed' + ORDER BY ID DESC + LIMIT 1", + $user_id + ), + ARRAY_A + ); - if ( ! empty( $pending ) && $pending['post_status'] == 'request-pending' ) { + if ( ! empty( $pending ) && 'request-pending' === $pending['post_status'] ) { echo '

' . esc_html__( 'A confirmation email has been sent to your email. Click the link within the email to confirm your export request.', 'ultimate-member' ) . '

'; - } elseif ( ! empty( $pending ) && $pending['post_status'] == 'request-confirmed' ) { + } elseif ( ! empty( $pending ) && 'request-confirmed' === $pending['post_status'] ) { echo '

' . esc_html__( 'The administrator has not yet approved downloading the data. Please expect an email with a link to your data.', 'ultimate-member' ) . '

'; } else { - if ( UM()->account()->current_password_is_required( 'privacy_download_data' ) ) { ?> - + if ( UM()->account()->current_password_is_required( 'privacy_download_data' ) ) { + ?>
- + options()->get( 'toggle_password' ) ) { ?> +
+ + +
+ + +
@@ -664,22 +680,27 @@ function um_after_account_privacy( $args ) { - +
- get_row( - "SELECT ID - FROM $wpdb->posts - WHERE post_author = $user_id AND - post_type = 'user_request' AND - post_name = 'remove_personal_data' AND - post_status = 'request-completed' - ORDER BY ID DESC - LIMIT 1", - ARRAY_A ); + get_row( + $wpdb->prepare( + "SELECT ID + FROM $wpdb->posts + WHERE post_author = %d AND + post_type = 'user_request' AND + post_name = 'remove_personal_data' AND + post_status = 'request-completed' + ORDER BY ID DESC + LIMIT 1", + $user_id + ), + ARRAY_A + ); if ( ! empty( $completed ) ) { @@ -689,26 +710,37 @@ function um_after_account_privacy( $args ) { } $pending = $wpdb->get_row( - "SELECT ID, post_status - FROM $wpdb->posts - WHERE post_author = $user_id AND - post_type = 'user_request' AND - post_name = 'remove_personal_data' AND - post_status != 'request-completed' - ORDER BY ID DESC - LIMIT 1", - ARRAY_A ); + $wpdb->prepare( + "SELECT ID, post_status + FROM $wpdb->posts + WHERE post_author = %d AND + post_type = 'user_request' AND + post_name = 'remove_personal_data' AND + post_status != 'request-completed' + ORDER BY ID DESC + LIMIT 1", + $user_id + ), + ARRAY_A + ); - if ( ! empty( $pending ) && $pending['post_status'] == 'request-pending' ) { + if ( ! empty( $pending ) && 'request-pending' === $pending['post_status'] ) { echo '

' . esc_html__( 'A confirmation email has been sent to your email. Click the link within the email to confirm your deletion request.', 'ultimate-member' ) . '

'; - } elseif ( ! empty( $pending ) && $pending['post_status'] == 'request-confirmed' ) { + } elseif ( ! empty( $pending ) && 'request-confirmed' === $pending['post_status'] ) { echo '

' . esc_html__( 'The administrator has not yet approved deleting your data. Please expect an email with a link to your data.', 'ultimate-member' ) . '

'; } else { - if ( UM()->account()->current_password_is_required( 'privacy_erase_data' ) ) { ?> - + if ( UM()->account()->current_password_is_required( 'privacy_erase_data' ) ) { + ?>