diff --git a/assets/css/um-fonticons-fa.css b/assets/css/um-fonticons-fa.css
index 5e38001b..5577f1a5 100644
--- a/assets/css/um-fonticons-fa.css
+++ b/assets/css/um-fonticons-fa.css
@@ -784,6 +784,10 @@
.um-faicon-spinner:before {
content: "\f110";
}
+.um-faicon-spin {
+ -webkit-animation: um-faicon-spin 2s infinite linear;
+ animation: um-faicon-spin 2s infinite linear;
+}
.um-faicon-circle:before {
content: "\f111";
}
@@ -1532,7 +1536,7 @@
content: "\f20c";
}
-@-moz-keyframes spin {
+@-moz-keyframes um-faicon-spin {
0% {
-moz-transform: rotate(0deg);
}
@@ -1540,7 +1544,7 @@
-moz-transform: rotate(359deg);
}
}
-@-webkit-keyframes spin {
+@-webkit-keyframes um-faicon-spin {
0% {
-webkit-transform: rotate(0deg);
}
@@ -1548,7 +1552,7 @@
-webkit-transform: rotate(359deg);
}
}
-@-o-keyframes spin {
+@-o-keyframes um-faicon-spin {
0% {
-o-transform: rotate(0deg);
}
@@ -1556,7 +1560,7 @@
-o-transform: rotate(359deg);
}
}
-@-ms-keyframes spin {
+@-ms-keyframes um-faicon-spin {
0% {
-ms-transform: rotate(0deg);
}
@@ -1564,11 +1568,11 @@
-ms-transform: rotate(359deg);
}
}
-@keyframes spin {
+@keyframes um-faicon-spin {
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(359deg);
}
-}
\ No newline at end of file
+}
diff --git a/assets/css/um-styles.css b/assets/css/um-styles.css
index 6cbcc5bf..a0826f6b 100644
--- a/assets/css/um-styles.css
+++ b/assets/css/um-styles.css
@@ -753,6 +753,15 @@ small.um-max-filesize span{
}
.um-form .um-field .um-field-area input.um-form-field.um-validate-not-matched,
-.um-form .um-field .um-field-area input.um-form-field.um-validate-not-matched:focus {
+.um-form .um-field .um-field-area input.um-form-field.um-validate-not-matched:focus,
+.um-form .um-field .um-field-area input.um-form-field.um-validate-username-exists,
+.um-form .um-field .um-field-area input.um-form-field.um-validate-username-exists:focus {
border-color: #DB2929 !important;
}
+
+.um-form .um-field .um-field-area input.um-searching-username {
+ background-image: url('../img/loading.gif');
+ background-position: right center;
+ background-repeat: no-repeat;
+ background-size: 24px 24px;
+}
diff --git a/assets/js/um-functions.js b/assets/js/um-functions.js
index e202ea69..8cacab19 100644
--- a/assets/js/um-functions.js
+++ b/assets/js/um-functions.js
@@ -211,11 +211,69 @@ function UM_check_password_matched() {
}
});
}
+
+var xhrValidateUsername = false;
+function UM_check_username() {
+ jQuery(document).on('input[data-key=user_login]').on('keyup', function() {
+ var field = jQuery('input[data-key=user_login]');
+ var value = field.val();
+
+ if(field.parents('.um-field').find('.um-field-error').length) {
+ var error = field.parents('.um-field').find('.um-field-error');
+ } else {
+ var error = jQuery('
Your username is already taken
');
+ }
+
+ // abort previous xhr request
+ if(xhrValidateUsername) {
+ xhrValidateUsername.abort();
+ }
+
+ if(!value) {
+ field.removeClass('um-searching-username');
+
+ return;
+ }
+
+ field.addClass('um-searching-username');
+
+ xhrValidateUsername = jQuery.ajax({
+ url : um_scripts.ajaxurl,
+ type : 'post',
+ data : {
+ action : 'ultimatemember_check_username_exists',
+ username : value
+ },
+ complete: function(){
+ field.removeClass('um-searching-username');
+ },
+ success: function(exists){
+ if(parseInt(exists) > 0) {
+ field.removeClass('um-validate-username-unique').addClass('um-validate-username-exists');
+
+ if(!field.parents('.um-field').find('.um-field-error').length) {
+ field.parents('.um-field').append(error);
+ }
+
+ error.show();
+ } else {
+ field.removeClass('um-validate-username-exists').addClass('um-validate-username-unique');
+ error.hide();
+ }
+ }
+ });
+ });
+}
+
jQuery(document).ready(function(){
if(jQuery('input[data-key=user_password],input[data-key=confirm_user_password]').length == 2) {
UM_check_password_matched();
}
-})
+
+ if(jQuery('input[data-key=user_login]').length) {
+ UM_check_username();
+ }
+});
function UM_hide_menus() {
diff --git a/core/um-actions-ajax.php b/core/um-actions-ajax.php
index 3fe320df..2d9663b5 100644
--- a/core/um-actions-ajax.php
+++ b/core/um-actions-ajax.php
@@ -1,24 +1,24 @@
-
+
-
+
files->delete_file( $src );
}
-
+
/***
*** @remove profile photo silently
***/
@@ -38,13 +38,13 @@
function ultimatemember_delete_profile_photo(){
global $ultimatemember;
extract($_REQUEST);
-
+
if ( !um_current_user_can('edit', $user_id ) ) die( __('You can not edit this user') );
$ultimatemember->files->delete_core_user_photo( $user_id, 'profile_photo' );
}
-
+
/***
*** @remove cover photo silently
***/
@@ -53,13 +53,13 @@
function ultimatemember_delete_cover_photo(){
global $ultimatemember;
extract($_REQUEST);
-
+
if ( !um_current_user_can('edit', $user_id ) ) die( __('You can not edit this user') );
$ultimatemember->files->delete_core_user_photo( $user_id, 'cover_photo' );
}
-
+
/***
*** @resampling/crop images
***/
@@ -68,35 +68,35 @@
function ultimatemember_resize_image(){
global $ultimatemember;
$output = 0;
-
+
extract($_REQUEST);
-
+
if ( !isset($src) || !isset($coord) ) die( __('Invalid parameters') );
-
+
$coord_n = substr_count($coord, ",");
if ( $coord_n != 3 ) die( __('Invalid coordinates') );
-
+
$um_is_temp_image = um_is_temp_image( $src );
if ( !$um_is_temp_image ) die( __('Invalid Image file') );
-
+
$crop = explode(',', $coord );
$crop = array_map('intval', $crop);
-
+
$uri = $ultimatemember->files->resize_image( $um_is_temp_image, $crop );
// If you're updating a user
if ( isset( $user_id ) && $user_id > 0 ) {
$uri = $ultimatemember->files->new_user_upload( $user_id, $um_is_temp_image, $key );
}
-
+
$output = $uri;
-
+
delete_option( "um_cache_userdata_{$user_id}" );
-
+
if(is_array($output)){ print_r($output); }else{ echo $output; } die;
}
-
+
/***
*** @run an ajax action on the fly
***/
@@ -105,9 +105,9 @@
function ultimatemember_muted_action(){
global $ultimatemember;
extract($_REQUEST);
-
+
if ( !um_current_user_can('edit', $user_id ) ) die( __('You can not edit this user') );
-
+
switch( $hook ) {
default:
do_action("um_run_ajax_function__{$hook}", $_REQUEST);
@@ -115,7 +115,7 @@
}
}
-
+
/***
*** @run an ajax pagination on the fly
***/
@@ -124,14 +124,33 @@
function ultimatemember_ajax_paginate(){
global $ultimatemember;
extract($_REQUEST);
-
+
ob_start();
-
+
do_action("um_ajax_load_posts__{$hook}", $args);
-
+
$output = ob_get_contents();
ob_end_clean();
-
+
die($output);
- }
\ No newline at end of file
+ }
+
+ /***
+ *** @run check if username exists
+ ***/
+ add_action('wp_ajax_nopriv_ultimatemember_check_username_exists', 'ultimatemember_check_username_exists');
+ add_action('wp_ajax_ultimatemember_check_username_exists', 'ultimatemember_check_username_exists');
+ function ultimatemember_check_username_exists() {
+ $username = isset($_REQUEST['username']) ? $_REQUEST['username'] : '';
+ $exists = username_exists( $username );
+ $exists = apply_filters( 'um_validate_username_exists', $exists, $username );
+
+ if( $exists ) {
+ echo 1;
+ } else {
+ echo 0;
+ }
+
+ die();
+ }
diff --git a/core/um-fields.php b/core/um-fields.php
index 41b862ea..104dc46e 100644
--- a/core/um-fields.php
+++ b/core/um-fields.php
@@ -934,7 +934,7 @@ class UM_Fields {
}
$type = apply_filters("um_hook_for_field_{$type}", $type );
-
+
/* Begin by field type */
switch( $type ) {
@@ -2109,7 +2109,7 @@ class UM_Fields {
}
$res = stripslashes( $this->field_value( $key, $default, $data ) );
-
+
$res = apply_filters("um_view_field_value_{$type}", $res, $data );
$output .= '';
@@ -2275,7 +2275,7 @@ class UM_Fields {
$output .= $this->view_field( $key, $data );
-
+
}
}
$output .= '
';