diff --git a/assets/css/um-members.css b/assets/css/um-members.css index 771f515b..8ed7073d 100644 --- a/assets/css/um-members.css +++ b/assets/css/um-members.css @@ -161,7 +161,7 @@ body #content .um-directory a { display: flex; flex-direction: row; justify-content: flex-start; - align-items: baseline; + align-items: center; flex-wrap: nowrap; width: 60%; } .um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-search-line label { diff --git a/assets/img/extensions/profile-tabs.png b/assets/img/extensions/profile-tabs.png new file mode 100644 index 00000000..2c45ca7f Binary files /dev/null and b/assets/img/extensions/profile-tabs.png differ diff --git a/assets/js/um-members.js b/assets/js/um-members.js index 9ed04bcc..035d2bd0 100644 --- a/assets/js/um-members.js +++ b/assets/js/um-members.js @@ -559,16 +559,22 @@ function um_run_search( directory ) { directory.data( 'page', 1 ); um_set_url_from_data( directory, 'page', '' ); - var show_after_search = directory.data('must-search'); - if ( show_after_search === 1 ) { - var search = um_get_search( directory ); - if ( directory.find( '.um-members-filter-remove' ).length === 0 && ! search ) { - directory.data( 'searched', 0 ); - directory.find('.um-members-grid, .um-members-list').remove(); - directory.find( '.um-member-directory-sorting-options' ).prop( 'disabled', true ); - directory.find( '.um-member-directory-view-type' ).addClass( 'um-disabled' ); - um_members_hide_preloader( directory ); - return; + + var ignore_after_search = false; + ignore_after_search = wp.hooks.applyFilters( 'um_member_directory_ignore_after_search', ignore_after_search ); + + if ( ! ignore_after_search ) { + var show_after_search = directory.data('must-search'); + if ( show_after_search === 1 ) { + var search = um_get_search( directory ); + if ( directory.find( '.um-members-filter-remove' ).length === 0 && ! search ) { + directory.data( 'searched', 0 ); + directory.find('.um-members-grid, .um-members-list').remove(); + directory.find( '.um-member-directory-sorting-options' ).prop( 'disabled', true ); + directory.find( '.um-member-directory-view-type' ).addClass( 'um-disabled' ); + um_members_hide_preloader( directory ); + return; + } } } @@ -1108,16 +1114,21 @@ jQuery(document.body).ready( function() { directory.find('.um-clear-filters').show(); } - var show_after_search = directory.data('must-search'); - if ( show_after_search === 1 ) { - var search = um_get_search( directory ); - if ( directory.find( '.um-members-filter-remove' ).length === 0 && ! search ) { - directory.data( 'searched', 0 ); - directory.find('.um-members-grid, .um-members-list').remove(); - directory.find( '.um-member-directory-sorting-options' ).prop( 'disabled', true ); - directory.find( '.um-member-directory-view-type' ).addClass( 'um-disabled' ); - um_members_hide_preloader( directory ); - return; + var ignore_after_search = false; + ignore_after_search = wp.hooks.applyFilters( 'um_member_directory_ignore_after_search', ignore_after_search ); + + if ( ! ignore_after_search ) { + var show_after_search = directory.data('must-search'); + if ( show_after_search === 1 ) { + var search = um_get_search( directory ); + if ( directory.find( '.um-members-filter-remove' ).length === 0 && ! search ) { + directory.data( 'searched', 0 ); + directory.find('.um-members-grid, .um-members-list').remove(); + directory.find( '.um-member-directory-sorting-options' ).prop( 'disabled', true ); + directory.find( '.um-member-directory-view-type' ).addClass( 'um-disabled' ); + um_members_hide_preloader( directory ); + return; + } } } @@ -1211,16 +1222,21 @@ jQuery(document.body).ready( function() { directory.find('.um-clear-filters').parents('.um-member-directory-header-row').removeClass( 'um-header-row-invisible' ); } - var show_after_search = directory.data('must-search'); - if ( show_after_search === 1 ) { - var search = um_get_search( directory ); - if ( ! search ) { - directory.data( 'searched', 0 ); - directory.find('.um-members-grid, .um-members-list').remove(); - directory.find( '.um-member-directory-sorting-options' ).prop( 'disabled', true ); - directory.find( '.um-member-directory-view-type' ).addClass( 'um-disabled' ); - um_members_hide_preloader( directory ); - return; + var ignore_after_search = false; + ignore_after_search = wp.hooks.applyFilters( 'um_member_directory_ignore_after_search', ignore_after_search ); + + if ( ! ignore_after_search ) { + var show_after_search = directory.data('must-search'); + if ( show_after_search === 1 ) { + var search = um_get_search( directory ); + if ( ! search ) { + directory.data( 'searched', 0 ); + directory.find('.um-members-grid, .um-members-list').remove(); + directory.find( '.um-member-directory-sorting-options' ).prop( 'disabled', true ); + directory.find( '.um-member-directory-view-type' ).addClass( 'um-disabled' ); + um_members_hide_preloader( directory ); + return; + } } } @@ -1486,12 +1502,17 @@ jQuery(document.body).ready( function() { }); - var show_after_search = directory.data('must-search'); - if ( show_after_search === 1 ) { - var search = um_get_search( directory ); - var filters_data = um_get_filters_data( directory ); - if ( ! filters_data.length && ! search ) { - return; + var ignore_after_search = false; + ignore_after_search = wp.hooks.applyFilters( 'um_member_directory_ignore_after_search', ignore_after_search ); + + if ( ! ignore_after_search ) { + var show_after_search = directory.data('must-search'); + if ( show_after_search === 1 ) { + var search = um_get_search( directory ); + var filters_data = um_get_filters_data( directory ); + if ( ! filters_data.length && ! search ) { + return; + } } } @@ -1611,17 +1632,21 @@ jQuery(document.body).ready( function() { } }); + var ignore_after_search = false; + ignore_after_search = wp.hooks.applyFilters( 'um_member_directory_ignore_after_search', ignore_after_search ); - var show_after_search = directory.data('must-search'); - if ( show_after_search === 1 ) { - var search = um_get_search( directory ); - var filters_data = um_get_filters_data( directory ); - if ( ! filters_data.length && ! search ) { - directory.data( 'searched', 0 ); - um_members_hide_preloader( directory ); - return; - } else { - directory.data( 'searched', 1 ); + if ( ! ignore_after_search ) { + var show_after_search = directory.data('must-search'); + if ( show_after_search === 1 ) { + var search = um_get_search( directory ); + var filters_data = um_get_filters_data( directory ); + if ( ! filters_data.length && ! search ) { + directory.data( 'searched', 0 ); + um_members_hide_preloader( directory ); + return; + } else { + directory.data( 'searched', 1 ); + } } } diff --git a/assets/sass/um-members.sass b/assets/sass/um-members.sass index 63e292e1..780b8b88 100644 --- a/assets/sass/um-members.sass +++ b/assets/sass/um-members.sass @@ -130,7 +130,7 @@ body &.um-member-directory-search-row justify-content: flex-end .um-member-directory-search-line - +flex( row, flex-start, baseline, nowrap ) + +flex( row, flex-start, center, nowrap ) width: 60% label flex: 1 diff --git a/includes/admin/assets/css/um-admin-forms.css b/includes/admin/assets/css/um-admin-forms.css index 28e974b7..4e1dcb28 100644 --- a/includes/admin/assets/css/um-admin-forms.css +++ b/includes/admin/assets/css/um-admin-forms.css @@ -14,6 +14,28 @@ padding: 0 0 15px 0; } +.um-form-table.um-top-label .um-forms-line[data-field_type="icon"] td label { + width: 100%; + display: block; + margin: 0 0 5px 0; +} + +.um_admin_fonticon_wrapper { + display: flex; + flex-direction: row; + flex-wrap: nowrap; + justify-content: flex-start; + align-items: center; +} + +.um-admin-icon-value { + line-height: 1; +} + +.um_admin_fonticon_wrapper .um-admin-icon-value i { + top: 0; +} + input[type=text].um-forms-field.um-long-field, select.um-forms-field.um-long-field, textarea.um-forms-field.um-long-field { diff --git a/includes/admin/assets/js/um-admin-modal.js b/includes/admin/assets/js/um-admin-modal.js index a74eb8bd..cec5ee6c 100644 --- a/includes/admin/assets/js/um-admin-modal.js +++ b/includes/admin/assets/js/um-admin-modal.js @@ -387,13 +387,13 @@ jQuery(document).ready(function() { jQuery(document.body).on('click', '#UM_fonticons a.um-admin-modal-back:not(.um-admin-modal-cancel)', function(){ var v_id = ''; var icon_selected = jQuery(this).attr('data-code'); - if (icon_selected != ''){ + if ( icon_selected != '' ) { if ( jQuery(this).attr('data-modal') ) { v_id = '#' + jQuery(this).attr('data-modal'); } else { v_id = '.postbox'; } - jQuery( v_id ).find('input#_icon,input#_um_icon,input#notice__um_icon').val( icon_selected ); + jQuery( v_id ).find('input#_icon,input#_um_icon,input#notice__um_icon,input#um_profile_tab__icon').val( icon_selected ); jQuery( v_id ).find('span.um-admin-icon-value').html(''); jQuery( v_id ).find('.um-admin-icon-clear').show(); } diff --git a/includes/admin/core/class-admin-forms.php b/includes/admin/core/class-admin-forms.php index 5e60f817..5fdb10d0 100644 --- a/includes/admin/core/class-admin-forms.php +++ b/includes/admin/core/class-admin-forms.php @@ -523,7 +523,7 @@ if ( ! class_exists( 'um\admin\core\Admin_Forms' ) ) { $value = $this->get_field_value( $field_data ); $value_attr = ' value="' . $value . '" '; - $html = '' . __( 'Choose Icon', 'ultimate-member' ) . ' + $html = '' . __( 'Choose Icon', 'ultimate-member' ) . ' '; if ( ! empty( $value ) ) { @@ -540,7 +540,7 @@ if ( ! class_exists( 'um\admin\core\Admin_Forms' ) ) { $html .= ''; } - $html .= ''; + $html .= ''; return $html; } diff --git a/includes/admin/templates/extensions.php b/includes/admin/templates/extensions.php index 420484b9..d54df331 100644 --- a/includes/admin/templates/extensions.php +++ b/includes/admin/templates/extensions.php @@ -128,6 +128,12 @@ $premium['unsplash'] = array( 'desc' => 'Allow users to select a profile cover photo from Unsplash from their profile', ); +$premium['profile-tabs'] = array( + 'url' => 'https://ultimatemember.com/extensions/profile-tabs/', + 'name' => 'Profile Tabs', + 'desc' => 'Allow users to add custom tabs to profiles', +); + $free['forumwp'] = array( 'url' => 'https://ultimatemember.com/extensions/forumwp/', 'name' => 'ForumWP', diff --git a/includes/class-dependencies.php b/includes/class-dependencies.php index 315a3759..a75b4495 100644 --- a/includes/class-dependencies.php +++ b/includes/class-dependencies.php @@ -47,6 +47,7 @@ if ( ! class_exists( 'um\Dependencies' ) ) { 'online' => '2.1.1', 'private-content' => '2.0.5', 'profile-completeness' => '2.1.2', + 'profile-tabs' => '1.0.0', 'recaptcha' => '2.1.2', 'reviews' => '2.1.5', 'social-activity' => '2.2.0', @@ -64,7 +65,7 @@ if ( ! class_exists( 'um\Dependencies' ) ) { /*rc*/ 'user-notes' => '2.0', - 'profile-tabs' => '1.6', + /*beta*/ 'frontend-posting' => '1.0', diff --git a/includes/class-init.php b/includes/class-init.php index 5397c187..e50c75e7 100644 --- a/includes/class-init.php +++ b/includes/class-init.php @@ -37,6 +37,7 @@ if ( ! class_exists( 'UM' ) ) { * @method UM_User_Bookmarks User_Bookmarks() * @method UM_Unsplash Unsplash() * @method UM_ForumWP ForumWP() + * @method UM_Profile_Tabs Profile_Tabs() */ final class UM extends UM_Functions { diff --git a/includes/core/class-enqueue.php b/includes/core/class-enqueue.php index 3a815b8a..dbe487fd 100644 --- a/includes/core/class-enqueue.php +++ b/includes/core/class-enqueue.php @@ -43,6 +43,22 @@ if ( ! class_exists( 'um\core\Enqueue' ) ) { $this->js_baseurl = um_url . 'assets/js/'; $this->css_baseurl = um_url . 'assets/css/'; + add_action( 'init', array( &$this, 'scripts_enqueue_priority' ) ); + } + + + /** + * + */ + function scripts_enqueue_priority() { + add_action( 'wp_enqueue_scripts', array( &$this, 'wp_enqueue_scripts' ), $this->get_priority() ); + } + + + /** + * @return int + */ + function get_priority() { /** * UM hook * @@ -63,8 +79,7 @@ if ( ! class_exists( 'um\core\Enqueue' ) ) { * } * ?> */ - $priority = apply_filters( 'um_core_enqueue_priority', 100 ); - add_action( 'wp_enqueue_scripts', array( &$this, 'wp_enqueue_scripts' ), $priority ); + return apply_filters( 'um_core_enqueue_priority', 100 ); } @@ -80,7 +95,7 @@ if ( ! class_exists( 'um\core\Enqueue' ) ) { wp_dequeue_script( 'select2'); wp_deregister_script('select2'); } - wp_register_script( 'select2', $this->js_baseurl . 'select2/select2.full.min.js', array( 'jquery', 'jquery-masonry' ), ultimatemember_version, true ); + wp_register_script( 'select2', $this->js_baseurl . 'select2/select2.full.min.js', array( 'jquery' ), ultimatemember_version, true ); wp_register_script( 'um_scrollbar', $this->js_baseurl . 'simplebar' . $this->suffix . '.js', array( 'jquery' ), ultimatemember_version, true ); @@ -141,7 +156,7 @@ if ( ! class_exists( 'um\core\Enqueue' ) ) { wp_register_script('um_dropdown', $this->js_baseurl . 'dropdown' . $this->suffix . '.js', array( 'jquery' ), ultimatemember_version, true ); - wp_register_script('um_members', $this->js_baseurl . 'um-members' . $this->suffix . '.js', array( 'jquery', 'wp-util', 'jquery-ui-slider', 'um_dropdown', 'wp-hooks', 'jquery-masonry' ), ultimatemember_version, true ); + wp_register_script('um_members', $this->js_baseurl . 'um-members' . $this->suffix . '.js', array( 'jquery', 'wp-util', 'jquery-ui-slider', 'um_dropdown', 'wp-hooks', 'jquery-masonry', 'um_scripts' ), ultimatemember_version, true ); wp_register_script('um_profile', $this->js_baseurl . 'um-profile' . $this->suffix . '.js', array( 'jquery', 'wp-util', 'wp-i18n' ), ultimatemember_version, true ); wp_register_script('um_account', $this->js_baseurl . 'um-account' . $this->suffix . '.js', array( 'jquery' ), ultimatemember_version, true ); diff --git a/includes/core/class-fields.php b/includes/core/class-fields.php index 9dabd21c..774ea3ef 100644 --- a/includes/core/class-fields.php +++ b/includes/core/class-fields.php @@ -21,6 +21,12 @@ if ( ! class_exists( 'um\core\Fields' ) ) { var $set_mode = ''; + /** + * @var int form_id + */ + public $set_id = null; + + /** * Fields constructor. */ @@ -3869,76 +3875,82 @@ if ( ! class_exists( 'um\core\Fields' ) ) { /* Default */ default: - $output .= '
get_atts( $key, $classes, $conditional, $data ) . '>'; + $_field_value = $this->field_value( $key, $default, $data ); - if ( isset( $data['label'] ) || ! empty( $data['icon'] ) ) { + if ( ! isset( $_field_value ) || $_field_value == '' ) { + $output = ''; + } else { + $output .= '
get_atts( $key, $classes, $conditional, $data ) . '>'; - if ( ! isset( $data['label'] ) ) { - $data['label'] = ''; + if ( isset( $data['label'] ) || ! empty( $data['icon'] ) ) { + + if ( ! isset( $data['label'] ) ) { + $data['label'] = ''; + } + + $output .= $this->field_label( $data['label'], $key, $data ); } - $output .= $this->field_label( $data['label'], $key, $data ); + $res = $this->field_value( $key, $default, $data ); + + if ( ! empty( $res ) ) { + $res = stripslashes( $res ); + } + + $data['is_view_field'] = true; + /** + * UM hook + * + * @type filter + * @title um_view_field + * @description Change field HTML on view mode + * @input_vars + * [{"var":"$output","type":"string","desc":"Field HTML"}, + * {"var":"$data","type":"string","desc":"Field Data"}, + * {"var":"$type","type":"string","desc":"Field Type"}] + * @change_log + * ["Since: 2.0"] + * @usage add_filter( 'um_view_field', 'function_name', 10, 3 ); + * @example + * + */ + $res = apply_filters( 'um_view_field', $res, $data, $type ); + /** + * UM hook + * + * @type filter + * @title um_view_field_value_{$type} + * @description Change field HTML on view mode by field type + * @input_vars + * [{"var":"$output","type":"string","desc":"Field HTML"}, + * {"var":"$data","type":"string","desc":"Field Data"}] + * @change_log + * ["Since: 2.0"] + * @usage add_filter( 'um_view_field_value_{$type}', 'function_name', 10, 2 ); + * @example + * + */ + $res = apply_filters( "um_view_field_value_{$type}", $res, $data ); + + $output .= '
'; + $output .= '
' . $res . '
'; + $output .= '
'; + + $output .= '
'; } - $res = $this->field_value( $key, $default, $data ); - - if ( ! empty( $res ) ) { - $res = stripslashes( $res ); - } - - $data['is_view_field'] = true; - /** - * UM hook - * - * @type filter - * @title um_view_field - * @description Change field HTML on view mode - * @input_vars - * [{"var":"$output","type":"string","desc":"Field HTML"}, - * {"var":"$data","type":"string","desc":"Field Data"}, - * {"var":"$type","type":"string","desc":"Field Type"}] - * @change_log - * ["Since: 2.0"] - * @usage add_filter( 'um_view_field', 'function_name', 10, 3 ); - * @example - * - */ - $res = apply_filters( 'um_view_field', $res, $data, $type ); - /** - * UM hook - * - * @type filter - * @title um_view_field_value_{$type} - * @description Change field HTML on view mode by field type - * @input_vars - * [{"var":"$output","type":"string","desc":"Field HTML"}, - * {"var":"$data","type":"string","desc":"Field Data"}] - * @change_log - * ["Since: 2.0"] - * @usage add_filter( 'um_view_field_value_{$type}', 'function_name', 10, 2 ); - * @example - * - */ - $res = apply_filters( "um_view_field_value_{$type}", $res, $data ); - - $output .= '
'; - $output .= '
' . $res . '
'; - $output .= '
'; - - $output .= '
'; - break; /* HTML */ diff --git a/includes/core/class-member-directory.php b/includes/core/class-member-directory.php index 1167b2c1..1add7b45 100644 --- a/includes/core/class-member-directory.php +++ b/includes/core/class-member-directory.php @@ -490,7 +490,7 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) { $values_array = ( ! empty( $users_roles['avail_roles'] ) && is_array( $users_roles['avail_roles'] ) ) ? array_keys( array_filter( $users_roles['avail_roles'] ) ) : array(); } - if ( ! empty( $values_array ) && in_array( $attrs['type'], array( 'select','multiselect', 'checkbox', 'radio' ) ) ) { + if ( ! empty( $values_array ) && in_array( $attrs['type'], array( 'select', 'multiselect', 'checkbox', 'radio' ) ) ) { $values_array = array_map( 'maybe_unserialize', $values_array ); $temp_values = array(); foreach ( $values_array as $values ) { @@ -546,7 +546,7 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) { } if ( $attrs['metakey'] != 'role_select' && empty( $custom_dropdown ) ) { - $attrs['options'] = array_intersect( $attrs['options'], $values_array ); + $attrs['options'] = array_intersect( array_map( 'stripslashes', $attrs['options'] ), $values_array ); } elseif ( ! empty( $custom_dropdown ) ) { $attrs['options'] = array_intersect_key( $attrs['options'], array_flip( $values_array ) ); } else { @@ -568,7 +568,9 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) { $attrs['label'] = strip_tags( $attrs['label'] ); } - ksort( $attrs['options'] ); ?> + ksort( $attrs['options'] ); + + $attrs['options'] = apply_filters( 'um_member_directory_filter_select_options_sorted', $attrs['options'], $attrs ); ?>