diff --git a/README.md b/README.md index 46cc9bc0..b1658571 100644 --- a/README.md +++ b/README.md @@ -44,7 +44,7 @@ GNU Version 2 or Any Later Version ### IMPORTANT: PLEASE UPDATE THE PLUGIN TO AT LEAST VERSION 2.6.7 IMMEDIATELY. VERSION 2.6.7 PATCHES SECURITY PRIVILEGE ESCALATION VULNERABILITY. PLEASE SEE [THIS ARTICLE](https://docs.ultimatemember.com/article/1866-security-incident-update-and-recommended-actions) FOR MORE INFORMATION -[Official Release Version: 2.6.11](https://github.com/ultimatemember/ultimatemember/releases/tag/2.6.11). +[Official Release Version: 2.6.12](https://github.com/ultimatemember/ultimatemember/releases/tag/2.6.12). ## Changelog diff --git a/assets/css/images/ui-icons_444444_256x240.png b/assets/css/images/ui-icons_444444_256x240.png deleted file mode 100644 index c2daae16..00000000 Binary files a/assets/css/images/ui-icons_444444_256x240.png and /dev/null differ diff --git a/assets/css/images/ui-icons_555555_256x240.png b/assets/css/images/ui-icons_555555_256x240.png deleted file mode 100644 index 47849283..00000000 Binary files a/assets/css/images/ui-icons_555555_256x240.png and /dev/null differ diff --git a/assets/css/images/ui-icons_777620_256x240.png b/assets/css/images/ui-icons_777620_256x240.png deleted file mode 100644 index d2f58d25..00000000 Binary files a/assets/css/images/ui-icons_777620_256x240.png and /dev/null differ diff --git a/assets/css/images/ui-icons_777777_256x240.png b/assets/css/images/ui-icons_777777_256x240.png deleted file mode 100644 index 1d532588..00000000 Binary files a/assets/css/images/ui-icons_777777_256x240.png and /dev/null differ diff --git a/assets/css/images/ui-icons_cc0000_256x240.png b/assets/css/images/ui-icons_cc0000_256x240.png deleted file mode 100644 index 2825f200..00000000 Binary files a/assets/css/images/ui-icons_cc0000_256x240.png and /dev/null differ diff --git a/assets/css/images/ui-icons_ffffff_256x240.png b/assets/css/images/ui-icons_ffffff_256x240.png deleted file mode 100644 index 136a4f97..00000000 Binary files a/assets/css/images/ui-icons_ffffff_256x240.png and /dev/null differ diff --git a/assets/js/admin/blocks.js b/assets/js/admin/blocks.js new file mode 100644 index 00000000..2f3ec381 --- /dev/null +++ b/assets/js/admin/blocks.js @@ -0,0 +1,197 @@ +'use strict'; + +var um_components = wp.components, + umSelectControl = um_components.SelectControl, + umTextareaControl = um_components.TextareaControl; + + +function um_admin_blocks_custom_fields( um_condition_fields, props ) { + return wp.hooks.applyFilters( 'um_admin_blocks_custom_fields', [], um_condition_fields, props ); +} + +var um_block_restriction = wp.compose.createHigherOrderComponent( + function( BlockEdit ) { + var um_condition_fields = { + um_who_access: 'um_block_settings_hide', + um_roles_access: 'um_block_settings_hide', + um_message_type: 'um_block_settings_hide', + um_message_content: 'um_block_settings_hide' + }; + + um_condition_fields = wp.hooks.applyFilters( 'um_admin_blocks_condition_fields_default', um_condition_fields ); + + return function( props ) { + let initialIsRestrict = props.attributes.um_is_restrict !== undefined ? props.attributes.um_is_restrict : false; + + if ( props.attributes.um_is_restrict !== true ) { + um_condition_fields['um_who_access'] = 'um_block_settings_hide'; + um_condition_fields['um_roles_access'] = 'um_block_settings_hide'; + um_condition_fields['um_message_type'] = 'um_block_settings_hide'; + um_condition_fields['um_message_content'] = 'um_block_settings_hide'; + } else { + um_condition_fields['um_who_access'] = ''; + + if ( parseInt( props.attributes.um_who_access ) === 0 || typeof props.attributes.um_who_access === 'undefined' ) { + um_condition_fields['um_roles_access'] = 'um_block_settings_hide'; + um_condition_fields['um_message_type'] = 'um_block_settings_hide'; + um_condition_fields['um_message_content'] = 'um_block_settings_hide'; + } else if ( parseInt( props.attributes.um_who_access ) === 1 ) { + um_condition_fields['um_roles_access'] = ''; + um_condition_fields['um_message_type'] = ''; + + if ( parseInt( props.attributes.um_message_type ) === 2 ) { + um_condition_fields['um_message_content'] = ''; + } else { + um_condition_fields['um_message_content'] = 'um_block_settings_hide'; + } + } else { + um_condition_fields['um_message_type'] = ''; + + if ( parseInt( props.attributes.um_message_type ) === 2 ) { + um_condition_fields['um_message_content'] = ''; + } else { + um_condition_fields['um_message_content'] = 'um_block_settings_hide'; + } + } + } + + um_condition_fields = wp.hooks.applyFilters( 'um_admin_blocks_condition_fields', um_condition_fields, props ); + + return wp.element.createElement( + wp.element.Fragment, + {}, + wp.element.createElement( BlockEdit, props ), + wp.element.createElement( + wp.blockEditor.InspectorControls, + {}, + wp.element.createElement( + wp.components.PanelBody, + { + title: wp.i18n.__( 'Ultimate Member: Content Restriction', 'ultimate-member' ), + className: 'um_block_settings' + }, + wp.element.createElement( + wp.components.ToggleControl, + { + label: wp.i18n.__( 'Restrict access?', 'ultimate-member' ), + checked: initialIsRestrict, + onChange: function onChange( value ) { + props.setAttributes( { um_is_restrict: value } ); + if ( value === false ) { + um_condition_fields['um_who_access'] = 'um_block_settings_hide'; + um_condition_fields['um_roles_access'] = 'um_block_settings_hide'; + um_condition_fields['um_message_type'] = 'um_block_settings_hide'; + um_condition_fields['um_message_content'] = 'um_block_settings_hide'; + } else { + um_condition_fields['um_who_access'] = ''; + } + + um_condition_fields = wp.hooks.applyFilters( 'um_admin_blocks_condition_fields_on_change', um_condition_fields, 'um_is_restrict', value ); + } + } + ), + wp.element.createElement( + umSelectControl, + { + type: 'number', + className: um_condition_fields['um_who_access'], + label: wp.i18n.__( 'Who can access this block?', 'ultimate-member' ), + value: props.attributes.um_who_access, + options: [ + { + label: wp.i18n.__( 'Everyone', 'ultimate-member' ), + value: 0 + }, + { + label: wp.i18n.__( 'Logged in users', 'ultimate-member' ), + value: 1 + }, + { + label: wp.i18n.__( 'Logged out users', 'ultimate-member' ), + value: 2 + } + ], + onChange: function onChange( value ) { + props.setAttributes( { um_who_access: value } ); + if ( parseInt( value ) === 0 ) { + um_condition_fields['um_message_type'] = 'um_block_settings_hide'; + um_condition_fields['um_message_content'] = 'um_block_settings_hide'; + um_condition_fields['um_roles_access'] = 'um_block_settings_hide'; + } else if ( parseInt( value ) === 1 ) { + um_condition_fields['um_message_type'] = ''; + um_condition_fields['um_roles_access'] = ''; + } else { + um_condition_fields['um_message_type'] = ''; + um_condition_fields['um_roles_access'] = 'um_block_settings_hide'; + } + + um_condition_fields = wp.hooks.applyFilters( 'um_admin_blocks_condition_fields_on_change', um_condition_fields, 'um_who_access', value ); + } + } + ), + wp.element.createElement( + umSelectControl, + { + multiple: true, + className: um_condition_fields['um_roles_access'], + label: wp.i18n.__( 'What roles can access this block?', 'ultimate-member' ), + value: props.attributes.um_roles_access, + options: um_restrict_roles, + onChange: function onChange( value ) { + props.setAttributes( { um_roles_access: value } ); + } + } + ), + wp.element.createElement( + umSelectControl, + { + type: 'number', + className: um_condition_fields['um_message_type'], + label: wp.i18n.__( 'Restriction action', 'ultimate-member' ), + value: props.attributes.um_message_type, + options: [ + { + label: wp.i18n.__( 'Hide block', 'ultimate-member' ), + value: 0 + }, + { + label: wp.i18n.__( 'Show global default message', 'ultimate-member' ), + value: 1 + }, + { + label: wp.i18n.__( 'Show custom message', 'ultimate-member' ), + value: 2 + } + ], + onChange: function onChange( value ) { + props.setAttributes( { um_message_type: value } ); + if ( parseInt( value ) === 2 ) { + um_condition_fields['um_message_content'] = ''; + } else { + um_condition_fields['um_message_content'] = 'um_block_settings_hide'; + } + } + } + ), + wp.element.createElement( + umTextareaControl, + { + type: 'number', + className: um_condition_fields['um_message_content'], + label: wp.i18n.__( 'Custom restricted access message', 'ultimate-member' ), + value: props.attributes.um_message_content, + onChange: function onChange( value ) { + props.setAttributes( { um_message_content: value } ); + } + } + ), + um_admin_blocks_custom_fields( um_condition_fields, props ) + ) + ) + ); + }; + }, + 'um_block_restriction' +); + +wp.hooks.addFilter( 'editor.BlockEdit', 'um-block/um_block_restriction', um_block_restriction ); diff --git a/assets/js/um-members.js b/assets/js/um-members.js index 9bf7d053..b8c8dd55 100644 --- a/assets/js/um-members.js +++ b/assets/js/um-members.js @@ -637,6 +637,63 @@ function um_run_search( directory ) { } +function um_slider_filter_init( directory ) { + directory.find('.um-slider').each( function() { + var slider = jQuery( this ); + var directory = slider.parents('.um-directory'); + + var filter_name = slider.data('field_name'); + + var min_default_value = um_get_data_for_directory( directory, 'filter_' + filter_name + '_from' ); + var max_default_value = um_get_data_for_directory( directory, 'filter_' + filter_name + '_to' ); + if ( typeof min_default_value == 'undefined' ) { + min_default_value = parseInt( slider.data('min') ); + } + + if ( typeof max_default_value == 'undefined' ) { + max_default_value = parseInt( slider.data('max') ); + } + + var default_value = [ min_default_value, max_default_value ]; + + slider.slider({ + range: true, + min: parseInt( slider.data('min') ), + max: parseInt( slider.data('max') ), + values: default_value, + create: function( event, ui ) { + //console.log( ui ); + }, + step: 1, + slide: function( event, ui ) { + um_set_range_label( jQuery( this ), ui ); + }, + stop: function( event, ui ) { + if ( ! um_is_directory_busy( directory ) ) { + + um_members_show_preloader( directory ); + + um_set_url_from_data( directory, 'filter_' + filter_name + '_from', ui.values[0] ); + um_set_url_from_data( directory, 'filter_' + filter_name + '_to', ui.values[1] ); + + //set 1st page after filtration + directory.data( 'page', 1 ); + um_set_url_from_data( directory, 'page', '' ); + um_ajax_get_members( directory ); + + um_change_tag( directory ); + + directory.data( 'searched', 1 ); + directory.find( '.um-member-directory-sorting-options' ).prop( 'disabled', false ); + directory.find( '.um-member-directory-view-type' ).removeClass( 'um-disabled' ); + } + } + }); + + um_set_range_label( slider ); + }); +} + jQuery(document.body).ready( function() { @@ -1379,60 +1436,7 @@ jQuery(document.body).ready( function() { } //slider filter - directory.find('.um-slider').each( function() { - var slider = jQuery( this ); - var directory = slider.parents('.um-directory'); - - var filter_name = slider.data('field_name'); - - var min_default_value = um_get_data_for_directory( directory, 'filter_' + filter_name + '_from' ); - var max_default_value = um_get_data_for_directory( directory, 'filter_' + filter_name + '_to' ); - if ( typeof min_default_value == 'undefined' ) { - min_default_value = parseInt( slider.data('min') ); - } - - if ( typeof max_default_value == 'undefined' ) { - max_default_value = parseInt( slider.data('max') ); - } - - var default_value = [ min_default_value, max_default_value ]; - - slider.slider({ - range: true, - min: parseInt( slider.data('min') ), - max: parseInt( slider.data('max') ), - values: default_value, - create: function( event, ui ) { - //console.log( ui ); - }, - step: 1, - slide: function( event, ui ) { - um_set_range_label( jQuery( this ), ui ); - }, - stop: function( event, ui ) { - if ( ! um_is_directory_busy( directory ) ) { - - um_members_show_preloader( directory ); - - um_set_url_from_data( directory, 'filter_' + filter_name + '_from', ui.values[0] ); - um_set_url_from_data( directory, 'filter_' + filter_name + '_to', ui.values[1] ); - - //set 1st page after filtration - directory.data( 'page', 1 ); - um_set_url_from_data( directory, 'page', '' ); - um_ajax_get_members( directory ); - - um_change_tag( directory ); - - directory.data( 'searched', 1 ); - directory.find( '.um-member-directory-sorting-options' ).prop( 'disabled', false ); - directory.find( '.um-member-directory-view-type' ).removeClass( 'um-disabled' ); - } - } - }); - - um_set_range_label( slider ); - }); + um_slider_filter_init( directory ); //datepicker filter diff --git a/assets/js/um-members.min.js b/assets/js/um-members.min.js index 8bfc0c26..3afcc174 100644 --- a/assets/js/um-members.min.js +++ b/assets/js/um-members.min.js @@ -1 +1 @@ -var um_members_directory_busy=[],um_member_directories=[],um_member_directory_last_data=[];function um_parse_current_url(){var r={},t=window.location.search.substring(1).split("&");return jQuery.each(t,function(e){e=t[e].split("=");r[e[0]]=e[1]}),r}function um_get_data_for_directory(e,r){var t=um_members_get_hash(e),a={},i=um_parse_current_url();if(jQuery.each(i,function(e){-1!==e.indexOf("_"+t)&&""!==i[e]&&(a[e.replace("_"+t,"")]=i[e])}),r){if(void 0!==a[r])try{a[r]=decodeURIComponent(a[r])}catch(e){console.error(e)}return a[r]}return a}function um_set_url_from_data(e,r,t){var a=um_members_get_hash(e),i=um_get_data_for_directory(e),m={},d=(Array.isArray(t)?(jQuery.each(t,function(e){t[e]=encodeURIComponent(t[e])}),t=t.join("||")):jQuery.isNumeric(t)||(t=t.split("||"),jQuery.each(t,function(e){t[e]=encodeURIComponent(t[e])}),t=t.join("||")),""!==t&&(m[r+"_"+a]=t),jQuery.each(i,function(e){r===e?""!==t&&(m[e+"_"+a]=t):m[e+"_"+a]=i[e]}),jQuery.each(um_member_directories,function(e){var r,t=um_member_directories[e];t!==a&&(r=um_get_data_for_directory(jQuery('.um-directory[data-hash="'+t+'"]')),jQuery.each(r,function(e){m[e+"_"+t]=r[e]}))}),[]),e=(jQuery.each(m,function(e){d.push(e+"="+m[e])}),"?"+(d=wp.hooks.applyFilters("um_member_directory_url_attrs",d)).join("&"));"?"===e&&(e=""),window.history.pushState("string","UM Member Directory",window.location.origin+window.location.pathname+e)}function um_members_get_hash(e){return e.data("hash")}function um_is_directory_busy(e){e=um_members_get_hash(e);return void 0!==um_members_directory_busy[e]&&um_members_directory_busy[e]}function um_members_show_preloader(e){um_members_directory_busy[um_members_get_hash(e)]=!0,e.find(".um-members-overlay").show()}function um_members_hide_preloader(e){um_members_directory_busy[um_members_get_hash(e)]=!1,e.find(".um-members-overlay").hide()}function um_set_range_label(e,r){var t,a="",i=e.siblings(".um-slider-range").data("placeholder-s"),m=e.siblings(".um-slider-range").data("placeholder-p"),r=r?(a=(r.values[0]===r.values[1]?i.replace("{value}",r.values[0]):m.replace("{min_range}",r.values[0]).replace("{max_range}",r.values[1])).replace("{field_label}",e.siblings(".um-slider-range").data("label")),t=r.values[0],r.values[1]):(a=(e.slider("values",0)===e.slider("values",1)?i.replace("{value}",e.slider("values",0)):m.replace("{min_range}",e.slider("values",0)).replace("{max_range}",e.slider("values",1))).replace("{field_label}",e.siblings(".um-slider-range").data("label")),t=e.slider("values",0),e.slider("values",1));e.siblings(".um-slider-range").html(a),e.siblings(".um_range_min").val(t),e.siblings(".um_range_max").val(r)}function um_get_search(e){return e.find(".um-search-line").length?e.find(".um-search-line").val():""}function um_get_sort(e){return e.data("sorting")}function um_get_current_page(e){e=e.data("page");return e=e&&void 0!==e?e:1}function um_time_convert(e,r){var t=Math.floor(e/60),e=e%60;return(t=60<=e&&(e=0,24<=(t+=1))?0:t)+":"+(e=e<10?"0"+e:e)}function um_ajax_get_members(_,e){var r,t,a,i,s,m=um_members_get_hash(_);wp.hooks.applyFilters("um_member_directory_get_members_allow",!0,m,_)?(r=um_get_current_page(_),t=um_get_search(_),a=um_get_sort(_),i=-(new Date).getTimezoneOffset()/60,s={directory_id:m,page:r,search:t,sorting:a,gmt_offset:i,post_refferer:_.data("base-post"),nonce:um_scripts.nonce},_.find(".um-search-filter").length&&_.find(".um-search-filter").each(function(){var e,r,t,a,i,m,d,u=jQuery(this);u.find(".um-slider").length?(m=u.find(".um-slider").data("field_name"),r=um_get_data_for_directory(_,"filter_"+m+"_from"),e=um_get_data_for_directory(_,"filter_"+m+"_to"),void 0===r&&void 0===e||(s[m]=[r,e])):u.find(".um-datepicker-filter").length?(m=u.find(".um-datepicker-filter").data("filter_name"),r=um_get_data_for_directory(_,"filter_"+m+"_from"),e=um_get_data_for_directory(_,"filter_"+m+"_to"),void 0===r&&void 0===e||(s[m]=[r,e])):u.find(".um-timepicker-filter").length?(m=u.find(".um-timepicker-filter").data("filter_name"),r=um_get_data_for_directory(_,"filter_"+m+"_from"),e=um_get_data_for_directory(_,"filter_"+m+"_to"),void 0!==r&&(r=(i=(i=+(r=r.split(":"))[0])<10?"0"+i:i)+":"+(a=(a=+r[1])<10?"0"+a:a)+":00"),void 0!==e&&(a=+(t=e.split(":"))[1],e=(i=(i=+t[0])<10?"0"+i:i)+":"+(a=a<10?"0"+a:a)+":59"),void 0===r&&void 0===e||(s[m]=[r,e])):u.find("select").length?(m=u.find("select").attr("name"),void 0!==(d=um_get_data_for_directory(_,"filter_"+m))&&(d=um_unsanitize_value(d),s[m]=d.split("||"))):u.hasClass("um-text-filter-type")&&u.find('input[type="text"]').length?(m=u.find('input[type="text"]').attr("name"),void 0!==(d=um_get_data_for_directory(_,"filter_"+m))&&(d=um_unsanitize_value(d),s[m]=d)):s=wp.hooks.applyFilters("um_member_directory_custom_filter_handler",s,u,_)}),s=wp.hooks.applyFilters("um_member_directory_filter_request",s),wp.ajax.send("um_get_members",{data:s,success:function(e){um_member_directory_last_data[m]=e,um_build_template(_,e);var r=wp.template("um-members-pagination");_.find(".um-members-pagination-box").html(r(e)),_.data("total_pages",e.pagination.total_pages),e.pagination.total_pages?(_.find(".um-member-directory-sorting-options").prop("disabled",!1),_.find(".um-member-directory-view-type").removeClass("um-disabled")):(_.find(".um-member-directory-sorting-options").prop("disabled",!0),_.find(".um-member-directory-view-type").addClass("um-disabled")),wp.hooks.doAction("um_member_directory_loaded",_,e),um_init_new_dropdown(),um_members_hide_preloader(_)},error:function(e){console.log(e),um_members_hide_preloader(_)}})):setTimeout(um_ajax_get_members,600,_,e)}function um_build_template(e,r){var t=e.data("view_type"),t=wp.template("um-member-"+t+"-"+um_members_get_hash(e)),t=(e.find(".um-members-grid, .um-members-list").remove(),e.find(".um-members-wrapper").prepend(t(r.users)),wp.template("um-members-header")),a=(e.find(".um-members-intro").remove(),wp.hooks.applyFilters("um_member_directory_generate_header",!1,e));(void 0!==r.is_search&&r.is_search||a)&&e.find(".um-members-wrapper").prepend(t(r)),e.addClass("um-loaded"),e.find(".um-members.um-members-grid").length&&UM_Member_Grid(e.find(".um-members.um-members-grid")),jQuery(document).trigger("um_build_template",[e,r]),jQuery(window).trigger("resize"),init_tipsy()}function UM_Member_Grid(r){r.find(".um-member").length&&r.imagesLoaded(function(){var e=wp.hooks.applyFilters("um_member_directory_grid_masonry_attrs",{itemSelector:".um-member",columnWidth:".um-member",gutter:".um-gutter-sizer"},r);r.masonry(e).on("layoutComplete",function(e,r){jQuery(document).trigger("um_grid_initialized",[e,r])})})}function um_get_filters_data(_){var s=[];return _.find(".um-search-filter").each(function(){var d,t,a,i,e,r,m,u=jQuery(this);u.find("input.um-datepicker-filter").length?(d="datepicker",u.find("input.um-datepicker-filter").each(function(){var e,r,t,a,i,m;"to"!==jQuery(this).data("range")&&(e=jQuery(this).data("filter_name"),r=um_get_data_for_directory(_,"filter_"+e+"_from"),t=um_get_data_for_directory(_,"filter_"+e+"_to"),void 0!==r||void 0!==t)&&((a=jQuery(this).val())===(i=_.find('input.um-datepicker-filter[data-range="to"][data-filter_name="'+e+'"]').val())?m=i:""!==a&&""!==i?m=a+" - "+i:""===a?m="before "+i:""===i&&(m="since "+a),s.push({name:e,label:jQuery(this).data("filter-label"),value_label:m,value:[r,t],type:d}))})):u.find("input.um-timepicker-filter").length?(d="timepicker",u.find("input.um-timepicker-filter").each(function(){var e,r,t,a,i,m;"to"!==jQuery(this).data("range")&&(e=jQuery(this).data("filter_name"),r=um_get_data_for_directory(_,"filter_"+e+"_from"),t=um_get_data_for_directory(_,"filter_"+e+"_to"),void 0!==r||void 0!==t)&&((a=jQuery(this).val())===(i=_.find('input.um-timepicker-filter[data-range="to"][data-filter_name="'+e+'"]').val())?m=i:""!==a&&""!==i?m=a+" - "+i:""===a?m="before "+i:""===i&&(m="since "+a),s.push({name:e,label:jQuery(this).data("filter-label"),value_label:m,value:[r,t],type:d}))})):u.find("select").length?(d="select",t=u.find("select").attr("name"),a=u.find("select").data("placeholder"),i=void 0===(i=um_get_data_for_directory(_,"filter_"+t))?[]:(i=um_unsanitize_value(i)).split("||"),jQuery.each(i,function(e){var r=u.find('select option[value="'+i[e]+'"]').data("value_label");s.push({name:t,label:a,value_label:r,value:i[e],type:d})})):u.hasClass("um-text-filter-type")&&u.find('input[type="text"]').length?(d="text",t=u.find('input[type="text"]').attr("name"),a=u.find('input[type="text"]').attr("placeholder"),""!=(i=void 0===(i=um_get_data_for_directory(_,"filter_"+t))?"":i)&&s.push({name:t,label:a,value_label:i,value:i,type:d})):u.find("div.ui-slider").length?(d="slider",t=u.find("div.ui-slider").data("field_name"),e=um_get_data_for_directory(_,"filter_"+t+"_from"),r=um_get_data_for_directory(_,"filter_"+t+"_to"),void 0===e&&void 0===r||(m=(e===r?u.find("div.um-slider-range").data("placeholder-s").replace("{value}",e):u.find("div.um-slider-range").data("placeholder-p").replace("{min_range}",e).replace("{max_range}",r)).replace("{field_label}",u.find("div.um-slider-range").data("label")),a=u.find("div.um-slider-range").data("label"),s.push({name:t,label:a,value_label:m,value:[e,r],type:d}))):s=wp.hooks.applyFilters("um_member_directory_get_filter_data",s,_,u)}),s}function um_change_tag(e){var r,t=um_get_filters_data(e),a=(e.find(".um-members-filter-tag").remove(),e.find(".um-filtered-line"));a.length&&(r=wp.template("um-members-filtered-line"),a.prepend(r({filters:t})),0===e.find(".um-members-filter-remove").length?(e.find(".um-clear-filters").hide(),e.find(".um-clear-filters").parents(".um-member-directory-header-row").addClass("um-header-row-invisible")):(e.find(".um-clear-filters").show(),e.find(".um-clear-filters").parents(".um-member-directory-header-row").removeClass("um-header-row-invisible")))}function um_run_search(e){if(!um_is_directory_busy(e)){um_members_show_preloader(e);var r=um_get_data_for_directory(e,"search"),t=um_sanitize_value(e.find(".um-search-line").val());if(t===r||""===t&&void 0===r)um_members_hide_preloader(e);else{e.data("general_search",t),um_set_url_from_data(e,"search",t),e.data("page",1),um_set_url_from_data(e,"page","");if(!wp.hooks.applyFilters("um_member_directory_ignore_after_search",!1,e)){r=e.data("must-search");if(1===r&&(t=um_get_search(e),0===e.find(".um-members-filter-remove").length)&&!t)return e.data("searched",0),e.find(".um-members-grid, .um-members-list, .um-members-intro").remove(),e.find(".um-member-directory-sorting-options").prop("disabled",!0),e.find(".um-member-directory-view-type").addClass("um-disabled"),wp.hooks.doAction("um_member_directory_clear_not_searched",e),void um_members_hide_preloader(e)}e.data("searched",1),e.find(".um-member-directory-sorting-options").prop("disabled",!1),e.find(".um-member-directory-view-type").removeClass("um-disabled"),um_ajax_get_members(e)}}}jQuery(document.body).ready(function(){jQuery(".um-directory .um-search-filter select").each(function(){1===jQuery(this).find("option:not(:disabled)").length&&jQuery(this).prop("disabled",!0);var e=jQuery(this);e.select2("destroy").select2({dropdownParent:e.parent()})}),jQuery(document.body).on("mouseover",".um-directory .um-member-directory-view-type",function(){var e;jQuery(this).hasClass("um-disabled")||((e=jQuery(this).find(".um-member-directory-view-type-a:visible")).hide(),(e.next().length?e.next():jQuery(this).find(".um-member-directory-view-type-a:first")).show().tipsy("show"))}).on("mouseout",".um-directory .um-member-directory-view-type",function(){jQuery(this).hasClass("um-disabled")||(jQuery(this).find(".um-member-directory-view-type-a").hide().tipsy("hide"),jQuery(this).find('.um-member-directory-view-type-a[data-type="'+jQuery(this).parents(".um-directory").data("view_type")+'"]').show())}),jQuery(document.body).on("click",".um-directory .um-member-directory-view-type-a",function(){var e=jQuery(this).parents(".um-directory");if(um_is_directory_busy(e))return!1;var r,t=jQuery(this),a=t.parents(".um-member-directory-view-type");a.hasClass("um-disabled")||(um_members_show_preloader(e),(r=a.find(".um-member-directory-view-type-a:visible")).hide(),(r.next().length?r.next():a.find(".um-member-directory-view-type-a:first")).show().tipsy("show"),null!==(r=um_member_directory_last_data[um_members_get_hash(e)])&&(um_set_url_from_data(e,"view_type",a=t.data("type")),e.data("view_type",a),um_build_template(e,r),um_init_new_dropdown()),um_members_hide_preloader(e))}),jQuery(document.body).on("click",".um-directory .um-do-search",function(){um_run_search(jQuery(this).parents(".um-directory"))}),jQuery(document.body).on("keypress",".um-directory .um-search-line",function(e){13===e.which&&um_run_search(jQuery(this).parents(".um-directory"))}),jQuery(document.body).on("click",'.um-new-dropdown[data-element=".um-member-directory-sorting-a"] li a',function(){var e,r,t;1===jQuery(this).data("selected")||(e=jQuery(this).data("directory-hash"),um_is_directory_busy(e=jQuery('.um-directory[data-hash="'+e+'"]')))||(um_members_show_preloader(e),r=jQuery(this).html(),t=jQuery(this).data("value"),e.data("sorting",t),um_set_url_from_data(e,"sort",t),um_ajax_get_members(e),e.find('.um-new-dropdown[data-element=".um-member-directory-sorting-a"]').find("a").data("selected",0).prop("data-selected",0).attr("data-selected",0),e.find('.um-new-dropdown[data-element=".um-member-directory-sorting-a"] a[data-value="'+t+'"]').data("selected",1).prop("data-selected",1).attr("data-selected",1),e.find(".um-member-directory-sorting-a").find("> a").html(r))}),jQuery(document.body).on("click",".um-directory .pagi:not(.current)",function(){var e,r;jQuery(this).hasClass("disabled")||um_is_directory_busy(e=jQuery(this).parents(".um-directory"))||(um_members_show_preloader(e),(1===(r="first"===jQuery(this).data("page")?1:"prev"===jQuery(this).data("page")?+e.data("page")-1:"next"===jQuery(this).data("page")?+e.data("page")+1:"last"===jQuery(this).data("page")?parseInt(e.data("total_pages")):parseInt(jQuery(this).data("page")))?(e.find('.pagi[data-page="first"], .pagi[data-page="prev"]').addClass("disabled"),e.find('.pagi[data-page="prev"], .pagi[data-page="last"]')):(r===parseInt(e.data("total_pages"))?e.find('.pagi[data-page="prev"], .pagi[data-page="last"]').addClass("disabled"):e.find('.pagi[data-page="prev"], .pagi[data-page="last"]').removeClass("disabled"),e.find('.pagi[data-page="first"], .pagi[data-page="prev"]'))).removeClass("disabled"),e.find(".pagi").removeClass("current"),e.find('.pagi[data-page="'+r+'"]').addClass("current"),e.data("page",r),um_set_url_from_data(e,"page",1===r?"":r),um_ajax_get_members(e))}),jQuery(document.body).on("change",".um-directory .um-members-pagi-dropdown",function(){var e,r=jQuery(this).parents(".um-directory");um_is_directory_busy(r)||(um_members_show_preloader(r),e=jQuery(this).val(),r.find(".pagi").removeClass("current"),r.find('.pagi[data-page="'+e+'"]').addClass("current"),r.data("page",e),um_set_url_from_data(r,"page",1===e?"":e),um_ajax_get_members(r))}),jQuery(document.body).on("click",".um-directory .um-members.um-members-list .um-member-more a",function(e){e.preventDefault();e=jQuery(this).parents(".um-member");return e.find(".um-member-more").hide(),e.find(".um-member-meta-main").slideDown(),e.find(".um-member-less").fadeIn(),!1}),jQuery(document.body).on("click",".um-directory .um-members.um-members-list .um-member-less a",function(e){e.preventDefault();e=jQuery(this).parents(".um-member");return e.find(".um-member-less").hide(),e.find(".um-member-meta-main").slideUp(),e.find(".um-member-more").fadeIn(),!1}),jQuery(document.body).on("click",".um-directory .um-members.um-members-grid .um-member-more a",function(e){e.preventDefault();var e=jQuery(this).parents(".um-member"),r=jQuery(this).parents(".um-members");return e.find(".um-member-more").hide(),e.find(".um-member-meta").slideDown(function(){UM_Member_Grid(r)}),e.find(".um-member-less").fadeIn(),setTimeout(function(){UM_Member_Grid(r)},100),!1}),jQuery(document.body).on("click",".um-directory .um-members.um-members-grid .um-member-less a",function(e){e.preventDefault();var r=jQuery(this).parents(".um-member"),t=jQuery(this).parents(".um-members");return r.find(".um-member-less").hide(),r.find(".um-member-meta").slideUp(function(){r.find(".um-member-more").fadeIn(),UM_Member_Grid(t)}),!1}),jQuery(".um-member-directory-filters-a").on("click",function(){var e=jQuery(this),r=e.parents(".um-directory").find(".um-search");r.is(":visible")?r.slideUp(250,function(){e.toggleClass("um-member-directory-filters-visible"),r.parents(".um-member-directory-header-row").toggleClass("um-header-row-invisible")}):r.slideDown({duration:250,start:function(){jQuery(this).css({display:"grid"}),e.toggleClass("um-member-directory-filters-visible"),r.parents(".um-member-directory-header-row").toggleClass("um-header-row-invisible")}})}),jQuery(document.body).on("change",".um-directory .um-search-filter select",function(){var e,r,t,a=jQuery(this).val(),i=um_sanitize_value(a);""===i||um_is_directory_busy(e=jQuery(this).parents(".um-directory"))||(um_members_show_preloader(e),t=void 0===(t=um_get_data_for_directory(e,"filter_"+(r=jQuery(this).prop("name"))))?[]:t.split("||"),-1===jQuery.inArray(i,t)&&(t.push(i),um_set_url_from_data(e,"filter_"+r,t=t.join("||")),e.data("page",1),um_set_url_from_data(e,"page","")),jQuery(this).find('option[value="'+a+'"]').prop("disabled",!0).hide(),1===jQuery(this).find("option:not(:disabled)").length&&jQuery(this).prop("disabled",!0),(i=jQuery(this)).select2("destroy").select2({dropdownParent:i.parent()}),i.val("").trigger("change"),um_ajax_get_members(e),um_change_tag(e),e.data("searched",1),e.find(".um-member-directory-sorting-options").prop("disabled",!1),e.find(".um-member-directory-view-type").removeClass("um-disabled"))}),jQuery(document.body).on("blur",'.um-directory .um-search-filter.um-text-filter-type input[type="text"]',function(){var e,r,t,a=jQuery(this).parents(".um-directory");um_is_directory_busy(a)||(e=um_sanitize_value(jQuery(this).val()))!==(t=void 0===(t=um_get_data_for_directory(a,"filter_"+(r=jQuery(this).prop("name"))))?"":t)&&(um_members_show_preloader(a),um_set_url_from_data(a,"filter_"+r,e),a.data("page",1),um_set_url_from_data(a,"page",""),um_ajax_get_members(a),um_change_tag(a),a.data("searched",1),a.find(".um-member-directory-sorting-options").prop("disabled",!1),a.find(".um-member-directory-view-type").removeClass("um-disabled"))}),jQuery(document.body).on("keypress",'.um-directory .um-search-filter.um-text-filter-type input[type="text"]',function(e){var r,t,a;13!==e.which||um_is_directory_busy(e=jQuery(this).parents(".um-directory"))||(r=um_sanitize_value(jQuery(this).val()))!==(a=void 0===(a=um_get_data_for_directory(e,"filter_"+(t=jQuery(this).prop("name"))))?"":a)&&(um_members_show_preloader(e),um_set_url_from_data(e,"filter_"+t,r),e.data("page",1),um_set_url_from_data(e,"page",""),um_ajax_get_members(e),um_change_tag(e),e.data("searched",1),e.find(".um-member-directory-sorting-options").prop("disabled",!1),e.find(".um-member-directory-view-type").removeClass("um-disabled"))}),jQuery(document.body).on("click",".um-directory .um-members-filter-remove",function(){var e=jQuery(this).parents(".um-directory");if(!um_is_directory_busy(e)&&e){um_members_show_preloader(e);var r=jQuery(this).data("value"),t=jQuery(this).data("name"),a=jQuery(this).data("type"),i=("text"===a?(um_set_url_from_data(e,"filter_"+t,""),jQuery('.um-search-filter input[name="'+t+'"]').val("")):"select"===a?(m=void 0===(m=um_get_data_for_directory(e,"filter_"+t))?[]:(m=um_unsanitize_value(m)).split("||"),um_set_url_from_data(e,"filter_"+t,m=(m=-1!==jQuery.inArray(r.toString(),m)?jQuery.grep(m,function(e){return e!==r.toString()}):m).length?m:""),(m=jQuery('.um-search-filter select[name="'+t+'"]')).find('option[value="'+r+'"]').prop("disabled",!1).show(),1a.data("total_pages")&&(t=a.data("total_pages")),a.data("page",t).attr("data-page",t),a.find(".um-member-directory-sorting").length&&(void 0===(t=um_get_data_for_directory(a,"sort"))&&(t=a.find('.um-new-dropdown[data-element=".um-member-directory-sorting-a"]').find('a[data-default="1"]').data("value")),a.data("sorting",t),(e=a.find('.um-new-dropdown[data-element=".um-member-directory-sorting-a"]')).find("a").data("selected",0).prop("data-selected",0).attr("data-selected",0),e.find('a[data-value="'+t+'"]').data("selected",1).prop("data-selected",1).attr("data-selected",1),a.find(".um-member-directory-sorting-a").find("> a").html(e.find('a[data-value="'+t+'"]').html())),a.find(".um-member-directory-view-type").length&&(void 0===(e=um_get_data_for_directory(a,"view_type"))&&(e=a.find('.um-member-directory-view-type-a[data-default="1"]').data("type")),a.data("view_type",e),a.find(".um-member-directory-view-type .um-member-directory-view-type-a").hide(),a.find('.um-member-directory-view-type .um-member-directory-view-type-a[data-type="'+e+'"]').show()),a.find(".um-datepicker-filter").each(function(){var e=jQuery(this),r=e.pickadate("picker"),t=e.data("filter_name"),e=e.data("range"),t=um_get_data_for_directory(a,"filter_"+t+"_"+e);void 0!==t?r.set("select",1e3*t):r.clear()}),a.find(".um-slider").each(function(){var e=jQuery(this),r=e.data("field_name"),t=um_get_data_for_directory(a,"filter_"+r+"_from"),r=um_get_data_for_directory(a,"filter_"+r+"_to");void 0===t&&(t=e.data("min")),t=parseInt(t),void 0===r&&(r=e.data("max")),r=parseInt(r),e.slider("values",[t,r]),um_set_range_label(e)}),a.find(".um-timepicker-filter").each(function(){var e=jQuery(this),r=e.pickatime("picker"),t=e.data("filter_name"),e=e.data("range"),t=um_get_data_for_directory(a,"filter_"+t+"_"+e);void 0!==t?(e=t.split(":"),r.set("select",60*e[0])):r.clear()}),wp.hooks.applyFilters("um_member_directory_ignore_after_search",!1,a));if(!t&&1===a.data("must-search")){var i=um_get_search(a);if(!um_get_filters_data(a).length&&!i)return a.data("searched",0),void um_members_hide_preloader(a);a.data("searched",1)}wp.hooks.applyFilters("um_member_directory_prevent_default_first_loading",!1,a,r)||(um_ajax_get_members(a),um_change_tag(a))})})}); \ No newline at end of file +var um_members_directory_busy=[],um_member_directories=[],um_member_directory_last_data=[];function um_parse_current_url(){var r={},t=window.location.search.substring(1).split("&");return jQuery.each(t,function(e){e=t[e].split("=");r[e[0]]=e[1]}),r}function um_get_data_for_directory(e,r){var t=um_members_get_hash(e),a={},i=um_parse_current_url();if(jQuery.each(i,function(e){-1!==e.indexOf("_"+t)&&""!==i[e]&&(a[e.replace("_"+t,"")]=i[e])}),r){if(void 0!==a[r])try{a[r]=decodeURIComponent(a[r])}catch(e){console.error(e)}return a[r]}return a}function um_set_url_from_data(e,r,t){var a=um_members_get_hash(e),i=um_get_data_for_directory(e),m={},d=(Array.isArray(t)?(jQuery.each(t,function(e){t[e]=encodeURIComponent(t[e])}),t=t.join("||")):jQuery.isNumeric(t)||(t=t.split("||"),jQuery.each(t,function(e){t[e]=encodeURIComponent(t[e])}),t=t.join("||")),""!==t&&(m[r+"_"+a]=t),jQuery.each(i,function(e){r===e?""!==t&&(m[e+"_"+a]=t):m[e+"_"+a]=i[e]}),jQuery.each(um_member_directories,function(e){var r,t=um_member_directories[e];t!==a&&(r=um_get_data_for_directory(jQuery('.um-directory[data-hash="'+t+'"]')),jQuery.each(r,function(e){m[e+"_"+t]=r[e]}))}),[]),e=(jQuery.each(m,function(e){d.push(e+"="+m[e])}),"?"+(d=wp.hooks.applyFilters("um_member_directory_url_attrs",d)).join("&"));"?"===e&&(e=""),window.history.pushState("string","UM Member Directory",window.location.origin+window.location.pathname+e)}function um_members_get_hash(e){return e.data("hash")}function um_is_directory_busy(e){e=um_members_get_hash(e);return void 0!==um_members_directory_busy[e]&&um_members_directory_busy[e]}function um_members_show_preloader(e){um_members_directory_busy[um_members_get_hash(e)]=!0,e.find(".um-members-overlay").show()}function um_members_hide_preloader(e){um_members_directory_busy[um_members_get_hash(e)]=!1,e.find(".um-members-overlay").hide()}function um_set_range_label(e,r){var t,a="",i=e.siblings(".um-slider-range").data("placeholder-s"),m=e.siblings(".um-slider-range").data("placeholder-p"),r=r?(a=(r.values[0]===r.values[1]?i.replace("{value}",r.values[0]):m.replace("{min_range}",r.values[0]).replace("{max_range}",r.values[1])).replace("{field_label}",e.siblings(".um-slider-range").data("label")),t=r.values[0],r.values[1]):(a=(e.slider("values",0)===e.slider("values",1)?i.replace("{value}",e.slider("values",0)):m.replace("{min_range}",e.slider("values",0)).replace("{max_range}",e.slider("values",1))).replace("{field_label}",e.siblings(".um-slider-range").data("label")),t=e.slider("values",0),e.slider("values",1));e.siblings(".um-slider-range").html(a),e.siblings(".um_range_min").val(t),e.siblings(".um_range_max").val(r)}function um_get_search(e){return e.find(".um-search-line").length?e.find(".um-search-line").val():""}function um_get_sort(e){return e.data("sorting")}function um_get_current_page(e){e=e.data("page");return e=e&&void 0!==e?e:1}function um_time_convert(e,r){var t=Math.floor(e/60),e=e%60;return(t=60<=e&&(e=0,24<=(t+=1))?0:t)+":"+(e=e<10?"0"+e:e)}function um_ajax_get_members(_,e){var r,t,a,i,s,m=um_members_get_hash(_);wp.hooks.applyFilters("um_member_directory_get_members_allow",!0,m,_)?(r=um_get_current_page(_),t=um_get_search(_),a=um_get_sort(_),i=-(new Date).getTimezoneOffset()/60,s={directory_id:m,page:r,search:t,sorting:a,gmt_offset:i,post_refferer:_.data("base-post"),nonce:um_scripts.nonce},_.find(".um-search-filter").length&&_.find(".um-search-filter").each(function(){var e,r,t,a,i,m,d,u=jQuery(this);u.find(".um-slider").length?(m=u.find(".um-slider").data("field_name"),r=um_get_data_for_directory(_,"filter_"+m+"_from"),e=um_get_data_for_directory(_,"filter_"+m+"_to"),void 0===r&&void 0===e||(s[m]=[r,e])):u.find(".um-datepicker-filter").length?(m=u.find(".um-datepicker-filter").data("filter_name"),r=um_get_data_for_directory(_,"filter_"+m+"_from"),e=um_get_data_for_directory(_,"filter_"+m+"_to"),void 0===r&&void 0===e||(s[m]=[r,e])):u.find(".um-timepicker-filter").length?(m=u.find(".um-timepicker-filter").data("filter_name"),r=um_get_data_for_directory(_,"filter_"+m+"_from"),e=um_get_data_for_directory(_,"filter_"+m+"_to"),void 0!==r&&(r=(i=(i=+(r=r.split(":"))[0])<10?"0"+i:i)+":"+(a=(a=+r[1])<10?"0"+a:a)+":00"),void 0!==e&&(a=+(t=e.split(":"))[1],e=(i=(i=+t[0])<10?"0"+i:i)+":"+(a=a<10?"0"+a:a)+":59"),void 0===r&&void 0===e||(s[m]=[r,e])):u.find("select").length?(m=u.find("select").attr("name"),void 0!==(d=um_get_data_for_directory(_,"filter_"+m))&&(d=um_unsanitize_value(d),s[m]=d.split("||"))):u.hasClass("um-text-filter-type")&&u.find('input[type="text"]').length?(m=u.find('input[type="text"]').attr("name"),void 0!==(d=um_get_data_for_directory(_,"filter_"+m))&&(d=um_unsanitize_value(d),s[m]=d)):s=wp.hooks.applyFilters("um_member_directory_custom_filter_handler",s,u,_)}),s=wp.hooks.applyFilters("um_member_directory_filter_request",s),wp.ajax.send("um_get_members",{data:s,success:function(e){um_member_directory_last_data[m]=e,um_build_template(_,e);var r=wp.template("um-members-pagination");_.find(".um-members-pagination-box").html(r(e)),_.data("total_pages",e.pagination.total_pages),e.pagination.total_pages?(_.find(".um-member-directory-sorting-options").prop("disabled",!1),_.find(".um-member-directory-view-type").removeClass("um-disabled")):(_.find(".um-member-directory-sorting-options").prop("disabled",!0),_.find(".um-member-directory-view-type").addClass("um-disabled")),wp.hooks.doAction("um_member_directory_loaded",_,e),um_init_new_dropdown(),um_members_hide_preloader(_)},error:function(e){console.log(e),um_members_hide_preloader(_)}})):setTimeout(um_ajax_get_members,600,_,e)}function um_build_template(e,r){var t=e.data("view_type"),t=wp.template("um-member-"+t+"-"+um_members_get_hash(e)),t=(e.find(".um-members-grid, .um-members-list").remove(),e.find(".um-members-wrapper").prepend(t(r.users)),wp.template("um-members-header")),a=(e.find(".um-members-intro").remove(),wp.hooks.applyFilters("um_member_directory_generate_header",!1,e));(void 0!==r.is_search&&r.is_search||a)&&e.find(".um-members-wrapper").prepend(t(r)),e.addClass("um-loaded"),e.find(".um-members.um-members-grid").length&&UM_Member_Grid(e.find(".um-members.um-members-grid")),jQuery(document).trigger("um_build_template",[e,r]),jQuery(window).trigger("resize"),init_tipsy()}function UM_Member_Grid(r){r.find(".um-member").length&&r.imagesLoaded(function(){var e=wp.hooks.applyFilters("um_member_directory_grid_masonry_attrs",{itemSelector:".um-member",columnWidth:".um-member",gutter:".um-gutter-sizer"},r);r.masonry(e).on("layoutComplete",function(e,r){jQuery(document).trigger("um_grid_initialized",[e,r])})})}function um_get_filters_data(_){var s=[];return _.find(".um-search-filter").each(function(){var d,t,a,i,e,r,m,u=jQuery(this);u.find("input.um-datepicker-filter").length?(d="datepicker",u.find("input.um-datepicker-filter").each(function(){var e,r,t,a,i,m;"to"!==jQuery(this).data("range")&&(e=jQuery(this).data("filter_name"),r=um_get_data_for_directory(_,"filter_"+e+"_from"),t=um_get_data_for_directory(_,"filter_"+e+"_to"),void 0!==r||void 0!==t)&&((a=jQuery(this).val())===(i=_.find('input.um-datepicker-filter[data-range="to"][data-filter_name="'+e+'"]').val())?m=i:""!==a&&""!==i?m=a+" - "+i:""===a?m="before "+i:""===i&&(m="since "+a),s.push({name:e,label:jQuery(this).data("filter-label"),value_label:m,value:[r,t],type:d}))})):u.find("input.um-timepicker-filter").length?(d="timepicker",u.find("input.um-timepicker-filter").each(function(){var e,r,t,a,i,m;"to"!==jQuery(this).data("range")&&(e=jQuery(this).data("filter_name"),r=um_get_data_for_directory(_,"filter_"+e+"_from"),t=um_get_data_for_directory(_,"filter_"+e+"_to"),void 0!==r||void 0!==t)&&((a=jQuery(this).val())===(i=_.find('input.um-timepicker-filter[data-range="to"][data-filter_name="'+e+'"]').val())?m=i:""!==a&&""!==i?m=a+" - "+i:""===a?m="before "+i:""===i&&(m="since "+a),s.push({name:e,label:jQuery(this).data("filter-label"),value_label:m,value:[r,t],type:d}))})):u.find("select").length?(d="select",t=u.find("select").attr("name"),a=u.find("select").data("placeholder"),i=void 0===(i=um_get_data_for_directory(_,"filter_"+t))?[]:(i=um_unsanitize_value(i)).split("||"),jQuery.each(i,function(e){var r=u.find('select option[value="'+i[e]+'"]').data("value_label");s.push({name:t,label:a,value_label:r,value:i[e],type:d})})):u.hasClass("um-text-filter-type")&&u.find('input[type="text"]').length?(d="text",t=u.find('input[type="text"]').attr("name"),a=u.find('input[type="text"]').attr("placeholder"),""!=(i=void 0===(i=um_get_data_for_directory(_,"filter_"+t))?"":i)&&s.push({name:t,label:a,value_label:i,value:i,type:d})):u.find("div.ui-slider").length?(d="slider",t=u.find("div.ui-slider").data("field_name"),e=um_get_data_for_directory(_,"filter_"+t+"_from"),r=um_get_data_for_directory(_,"filter_"+t+"_to"),void 0===e&&void 0===r||(m=(e===r?u.find("div.um-slider-range").data("placeholder-s").replace("{value}",e):u.find("div.um-slider-range").data("placeholder-p").replace("{min_range}",e).replace("{max_range}",r)).replace("{field_label}",u.find("div.um-slider-range").data("label")),a=u.find("div.um-slider-range").data("label"),s.push({name:t,label:a,value_label:m,value:[e,r],type:d}))):s=wp.hooks.applyFilters("um_member_directory_get_filter_data",s,_,u)}),s}function um_change_tag(e){var r,t=um_get_filters_data(e),a=(e.find(".um-members-filter-tag").remove(),e.find(".um-filtered-line"));a.length&&(r=wp.template("um-members-filtered-line"),a.prepend(r({filters:t})),0===e.find(".um-members-filter-remove").length?(e.find(".um-clear-filters").hide(),e.find(".um-clear-filters").parents(".um-member-directory-header-row").addClass("um-header-row-invisible")):(e.find(".um-clear-filters").show(),e.find(".um-clear-filters").parents(".um-member-directory-header-row").removeClass("um-header-row-invisible")))}function um_run_search(e){if(!um_is_directory_busy(e)){um_members_show_preloader(e);var r=um_get_data_for_directory(e,"search"),t=um_sanitize_value(e.find(".um-search-line").val());if(t===r||""===t&&void 0===r)um_members_hide_preloader(e);else{e.data("general_search",t),um_set_url_from_data(e,"search",t),e.data("page",1),um_set_url_from_data(e,"page","");if(!wp.hooks.applyFilters("um_member_directory_ignore_after_search",!1,e)){r=e.data("must-search");if(1===r&&(t=um_get_search(e),0===e.find(".um-members-filter-remove").length)&&!t)return e.data("searched",0),e.find(".um-members-grid, .um-members-list, .um-members-intro").remove(),e.find(".um-member-directory-sorting-options").prop("disabled",!0),e.find(".um-member-directory-view-type").addClass("um-disabled"),wp.hooks.doAction("um_member_directory_clear_not_searched",e),void um_members_hide_preloader(e)}e.data("searched",1),e.find(".um-member-directory-sorting-options").prop("disabled",!1),e.find(".um-member-directory-view-type").removeClass("um-disabled"),um_ajax_get_members(e)}}}function um_slider_filter_init(e){e.find(".um-slider").each(function(){var e=jQuery(this),t=e.parents(".um-directory"),a=e.data("field_name"),r=um_get_data_for_directory(t,"filter_"+a+"_from"),i=um_get_data_for_directory(t,"filter_"+a+"_to"),r=[r=void 0===r?parseInt(e.data("min")):r,i=void 0===i?parseInt(e.data("max")):i];e.slider({range:!0,min:parseInt(e.data("min")),max:parseInt(e.data("max")),values:r,create:function(e,r){},step:1,slide:function(e,r){um_set_range_label(jQuery(this),r)},stop:function(e,r){um_is_directory_busy(t)||(um_members_show_preloader(t),um_set_url_from_data(t,"filter_"+a+"_from",r.values[0]),um_set_url_from_data(t,"filter_"+a+"_to",r.values[1]),t.data("page",1),um_set_url_from_data(t,"page",""),um_ajax_get_members(t),um_change_tag(t),t.data("searched",1),t.find(".um-member-directory-sorting-options").prop("disabled",!1),t.find(".um-member-directory-view-type").removeClass("um-disabled"))}}),um_set_range_label(e)})}jQuery(document.body).ready(function(){jQuery(".um-directory .um-search-filter select").each(function(){1===jQuery(this).find("option:not(:disabled)").length&&jQuery(this).prop("disabled",!0);var e=jQuery(this);e.select2("destroy").select2({dropdownParent:e.parent()})}),jQuery(document.body).on("mouseover",".um-directory .um-member-directory-view-type",function(){var e;jQuery(this).hasClass("um-disabled")||((e=jQuery(this).find(".um-member-directory-view-type-a:visible")).hide(),(e.next().length?e.next():jQuery(this).find(".um-member-directory-view-type-a:first")).show().tipsy("show"))}).on("mouseout",".um-directory .um-member-directory-view-type",function(){jQuery(this).hasClass("um-disabled")||(jQuery(this).find(".um-member-directory-view-type-a").hide().tipsy("hide"),jQuery(this).find('.um-member-directory-view-type-a[data-type="'+jQuery(this).parents(".um-directory").data("view_type")+'"]').show())}),jQuery(document.body).on("click",".um-directory .um-member-directory-view-type-a",function(){var e=jQuery(this).parents(".um-directory");if(um_is_directory_busy(e))return!1;var r,t=jQuery(this),a=t.parents(".um-member-directory-view-type");a.hasClass("um-disabled")||(um_members_show_preloader(e),(r=a.find(".um-member-directory-view-type-a:visible")).hide(),(r.next().length?r.next():a.find(".um-member-directory-view-type-a:first")).show().tipsy("show"),null!==(r=um_member_directory_last_data[um_members_get_hash(e)])&&(um_set_url_from_data(e,"view_type",a=t.data("type")),e.data("view_type",a),um_build_template(e,r),um_init_new_dropdown()),um_members_hide_preloader(e))}),jQuery(document.body).on("click",".um-directory .um-do-search",function(){um_run_search(jQuery(this).parents(".um-directory"))}),jQuery(document.body).on("keypress",".um-directory .um-search-line",function(e){13===e.which&&um_run_search(jQuery(this).parents(".um-directory"))}),jQuery(document.body).on("click",'.um-new-dropdown[data-element=".um-member-directory-sorting-a"] li a',function(){var e,r,t;1===jQuery(this).data("selected")||(e=jQuery(this).data("directory-hash"),um_is_directory_busy(e=jQuery('.um-directory[data-hash="'+e+'"]')))||(um_members_show_preloader(e),r=jQuery(this).html(),t=jQuery(this).data("value"),e.data("sorting",t),um_set_url_from_data(e,"sort",t),um_ajax_get_members(e),e.find('.um-new-dropdown[data-element=".um-member-directory-sorting-a"]').find("a").data("selected",0).prop("data-selected",0).attr("data-selected",0),e.find('.um-new-dropdown[data-element=".um-member-directory-sorting-a"] a[data-value="'+t+'"]').data("selected",1).prop("data-selected",1).attr("data-selected",1),e.find(".um-member-directory-sorting-a").find("> a").html(r))}),jQuery(document.body).on("click",".um-directory .pagi:not(.current)",function(){var e,r;jQuery(this).hasClass("disabled")||um_is_directory_busy(e=jQuery(this).parents(".um-directory"))||(um_members_show_preloader(e),(1===(r="first"===jQuery(this).data("page")?1:"prev"===jQuery(this).data("page")?+e.data("page")-1:"next"===jQuery(this).data("page")?+e.data("page")+1:"last"===jQuery(this).data("page")?parseInt(e.data("total_pages")):parseInt(jQuery(this).data("page")))?(e.find('.pagi[data-page="first"], .pagi[data-page="prev"]').addClass("disabled"),e.find('.pagi[data-page="prev"], .pagi[data-page="last"]')):(r===parseInt(e.data("total_pages"))?e.find('.pagi[data-page="prev"], .pagi[data-page="last"]').addClass("disabled"):e.find('.pagi[data-page="prev"], .pagi[data-page="last"]').removeClass("disabled"),e.find('.pagi[data-page="first"], .pagi[data-page="prev"]'))).removeClass("disabled"),e.find(".pagi").removeClass("current"),e.find('.pagi[data-page="'+r+'"]').addClass("current"),e.data("page",r),um_set_url_from_data(e,"page",1===r?"":r),um_ajax_get_members(e))}),jQuery(document.body).on("change",".um-directory .um-members-pagi-dropdown",function(){var e,r=jQuery(this).parents(".um-directory");um_is_directory_busy(r)||(um_members_show_preloader(r),e=jQuery(this).val(),r.find(".pagi").removeClass("current"),r.find('.pagi[data-page="'+e+'"]').addClass("current"),r.data("page",e),um_set_url_from_data(r,"page",1===e?"":e),um_ajax_get_members(r))}),jQuery(document.body).on("click",".um-directory .um-members.um-members-list .um-member-more a",function(e){e.preventDefault();e=jQuery(this).parents(".um-member");return e.find(".um-member-more").hide(),e.find(".um-member-meta-main").slideDown(),e.find(".um-member-less").fadeIn(),!1}),jQuery(document.body).on("click",".um-directory .um-members.um-members-list .um-member-less a",function(e){e.preventDefault();e=jQuery(this).parents(".um-member");return e.find(".um-member-less").hide(),e.find(".um-member-meta-main").slideUp(),e.find(".um-member-more").fadeIn(),!1}),jQuery(document.body).on("click",".um-directory .um-members.um-members-grid .um-member-more a",function(e){e.preventDefault();var e=jQuery(this).parents(".um-member"),r=jQuery(this).parents(".um-members");return e.find(".um-member-more").hide(),e.find(".um-member-meta").slideDown(function(){UM_Member_Grid(r)}),e.find(".um-member-less").fadeIn(),setTimeout(function(){UM_Member_Grid(r)},100),!1}),jQuery(document.body).on("click",".um-directory .um-members.um-members-grid .um-member-less a",function(e){e.preventDefault();var r=jQuery(this).parents(".um-member"),t=jQuery(this).parents(".um-members");return r.find(".um-member-less").hide(),r.find(".um-member-meta").slideUp(function(){r.find(".um-member-more").fadeIn(),UM_Member_Grid(t)}),!1}),jQuery(".um-member-directory-filters-a").on("click",function(){var e=jQuery(this),r=e.parents(".um-directory").find(".um-search");r.is(":visible")?r.slideUp(250,function(){e.toggleClass("um-member-directory-filters-visible"),r.parents(".um-member-directory-header-row").toggleClass("um-header-row-invisible")}):r.slideDown({duration:250,start:function(){jQuery(this).css({display:"grid"}),e.toggleClass("um-member-directory-filters-visible"),r.parents(".um-member-directory-header-row").toggleClass("um-header-row-invisible")}})}),jQuery(document.body).on("change",".um-directory .um-search-filter select",function(){var e,r,t,a=jQuery(this).val(),i=um_sanitize_value(a);""===i||um_is_directory_busy(e=jQuery(this).parents(".um-directory"))||(um_members_show_preloader(e),t=void 0===(t=um_get_data_for_directory(e,"filter_"+(r=jQuery(this).prop("name"))))?[]:t.split("||"),-1===jQuery.inArray(i,t)&&(t.push(i),um_set_url_from_data(e,"filter_"+r,t=t.join("||")),e.data("page",1),um_set_url_from_data(e,"page","")),jQuery(this).find('option[value="'+a+'"]').prop("disabled",!0).hide(),1===jQuery(this).find("option:not(:disabled)").length&&jQuery(this).prop("disabled",!0),(i=jQuery(this)).select2("destroy").select2({dropdownParent:i.parent()}),i.val("").trigger("change"),um_ajax_get_members(e),um_change_tag(e),e.data("searched",1),e.find(".um-member-directory-sorting-options").prop("disabled",!1),e.find(".um-member-directory-view-type").removeClass("um-disabled"))}),jQuery(document.body).on("blur",'.um-directory .um-search-filter.um-text-filter-type input[type="text"]',function(){var e,r,t,a=jQuery(this).parents(".um-directory");um_is_directory_busy(a)||(e=um_sanitize_value(jQuery(this).val()))!==(t=void 0===(t=um_get_data_for_directory(a,"filter_"+(r=jQuery(this).prop("name"))))?"":t)&&(um_members_show_preloader(a),um_set_url_from_data(a,"filter_"+r,e),a.data("page",1),um_set_url_from_data(a,"page",""),um_ajax_get_members(a),um_change_tag(a),a.data("searched",1),a.find(".um-member-directory-sorting-options").prop("disabled",!1),a.find(".um-member-directory-view-type").removeClass("um-disabled"))}),jQuery(document.body).on("keypress",'.um-directory .um-search-filter.um-text-filter-type input[type="text"]',function(e){var r,t,a;13!==e.which||um_is_directory_busy(e=jQuery(this).parents(".um-directory"))||(r=um_sanitize_value(jQuery(this).val()))!==(a=void 0===(a=um_get_data_for_directory(e,"filter_"+(t=jQuery(this).prop("name"))))?"":a)&&(um_members_show_preloader(e),um_set_url_from_data(e,"filter_"+t,r),e.data("page",1),um_set_url_from_data(e,"page",""),um_ajax_get_members(e),um_change_tag(e),e.data("searched",1),e.find(".um-member-directory-sorting-options").prop("disabled",!1),e.find(".um-member-directory-view-type").removeClass("um-disabled"))}),jQuery(document.body).on("click",".um-directory .um-members-filter-remove",function(){var e=jQuery(this).parents(".um-directory");if(!um_is_directory_busy(e)&&e){um_members_show_preloader(e);var r=jQuery(this).data("value"),t=jQuery(this).data("name"),a=jQuery(this).data("type"),i=("text"===a?(um_set_url_from_data(e,"filter_"+t,""),jQuery('.um-search-filter input[name="'+t+'"]').val("")):"select"===a?(m=void 0===(m=um_get_data_for_directory(e,"filter_"+t))?[]:(m=um_unsanitize_value(m)).split("||"),um_set_url_from_data(e,"filter_"+t,m=(m=-1!==jQuery.inArray(r.toString(),m)?jQuery.grep(m,function(e){return e!==r.toString()}):m).length?m:""),(m=jQuery('.um-search-filter select[name="'+t+'"]')).find('option[value="'+r+'"]').prop("disabled",!1).show(),1a.data("total_pages")&&(t=a.data("total_pages")),a.data("page",t).attr("data-page",t),a.find(".um-member-directory-sorting").length&&(void 0===(t=um_get_data_for_directory(a,"sort"))&&(t=a.find('.um-new-dropdown[data-element=".um-member-directory-sorting-a"]').find('a[data-default="1"]').data("value")),a.data("sorting",t),(e=a.find('.um-new-dropdown[data-element=".um-member-directory-sorting-a"]')).find("a").data("selected",0).prop("data-selected",0).attr("data-selected",0),e.find('a[data-value="'+t+'"]').data("selected",1).prop("data-selected",1).attr("data-selected",1),a.find(".um-member-directory-sorting-a").find("> a").html(e.find('a[data-value="'+t+'"]').html())),a.find(".um-member-directory-view-type").length&&(void 0===(e=um_get_data_for_directory(a,"view_type"))&&(e=a.find('.um-member-directory-view-type-a[data-default="1"]').data("type")),a.data("view_type",e),a.find(".um-member-directory-view-type .um-member-directory-view-type-a").hide(),a.find('.um-member-directory-view-type .um-member-directory-view-type-a[data-type="'+e+'"]').show()),a.find(".um-datepicker-filter").each(function(){var e=jQuery(this),r=e.pickadate("picker"),t=e.data("filter_name"),e=e.data("range"),t=um_get_data_for_directory(a,"filter_"+t+"_"+e);void 0!==t?r.set("select",1e3*t):r.clear()}),a.find(".um-slider").each(function(){var e=jQuery(this),r=e.data("field_name"),t=um_get_data_for_directory(a,"filter_"+r+"_from"),r=um_get_data_for_directory(a,"filter_"+r+"_to");void 0===t&&(t=e.data("min")),t=parseInt(t),void 0===r&&(r=e.data("max")),r=parseInt(r),e.slider("values",[t,r]),um_set_range_label(e)}),a.find(".um-timepicker-filter").each(function(){var e=jQuery(this),r=e.pickatime("picker"),t=e.data("filter_name"),e=e.data("range"),t=um_get_data_for_directory(a,"filter_"+t+"_"+e);void 0!==t?(e=t.split(":"),r.set("select",60*e[0])):r.clear()}),wp.hooks.applyFilters("um_member_directory_ignore_after_search",!1,a));if(!t&&1===a.data("must-search")){var i=um_get_search(a);if(!um_get_filters_data(a).length&&!i)return a.data("searched",0),void um_members_hide_preloader(a);a.data("searched",1)}wp.hooks.applyFilters("um_member_directory_prevent_default_first_loading",!1,a,r)||(um_ajax_get_members(a),um_change_tag(a))})})}); \ No newline at end of file diff --git a/assets/css/images/readme.txt b/assets/libs/jquery-ui/images/readme.txt similarity index 100% rename from assets/css/images/readme.txt rename to assets/libs/jquery-ui/images/readme.txt diff --git a/assets/libs/jquery-ui/images/ui-bg_glass_55_fbf9ee_1x400.png b/assets/libs/jquery-ui/images/ui-bg_glass_55_fbf9ee_1x400.png new file mode 100644 index 00000000..f4335d5a Binary files /dev/null and b/assets/libs/jquery-ui/images/ui-bg_glass_55_fbf9ee_1x400.png differ diff --git a/assets/libs/jquery-ui/images/ui-bg_glass_65_ffffff_1x400.png b/assets/libs/jquery-ui/images/ui-bg_glass_65_ffffff_1x400.png new file mode 100644 index 00000000..7b76dd03 Binary files /dev/null and b/assets/libs/jquery-ui/images/ui-bg_glass_65_ffffff_1x400.png differ diff --git a/assets/libs/jquery-ui/images/ui-bg_glass_75_dadada_1x400.png b/assets/libs/jquery-ui/images/ui-bg_glass_75_dadada_1x400.png new file mode 100644 index 00000000..ed24d3d2 Binary files /dev/null and b/assets/libs/jquery-ui/images/ui-bg_glass_75_dadada_1x400.png differ diff --git a/assets/libs/jquery-ui/images/ui-bg_glass_75_e6e6e6_1x400.png b/assets/libs/jquery-ui/images/ui-bg_glass_75_e6e6e6_1x400.png new file mode 100644 index 00000000..b705c3ed Binary files /dev/null and b/assets/libs/jquery-ui/images/ui-bg_glass_75_e6e6e6_1x400.png differ diff --git a/assets/libs/jquery-ui/images/ui-bg_glass_95_fef1ec_1x400.png b/assets/libs/jquery-ui/images/ui-bg_glass_95_fef1ec_1x400.png new file mode 100644 index 00000000..919083bb Binary files /dev/null and b/assets/libs/jquery-ui/images/ui-bg_glass_95_fef1ec_1x400.png differ diff --git a/assets/libs/jquery-ui/images/ui-bg_highlight-soft_75_cccccc_1x100.png b/assets/libs/jquery-ui/images/ui-bg_highlight-soft_75_cccccc_1x100.png new file mode 100644 index 00000000..5ac0a23a Binary files /dev/null and b/assets/libs/jquery-ui/images/ui-bg_highlight-soft_75_cccccc_1x100.png differ diff --git a/assets/libs/jquery-ui/images/ui-icons_222222_256x240.png b/assets/libs/jquery-ui/images/ui-icons_222222_256x240.png new file mode 100644 index 00000000..92410d3d Binary files /dev/null and b/assets/libs/jquery-ui/images/ui-icons_222222_256x240.png differ diff --git a/assets/libs/jquery-ui/images/ui-icons_2e83ff_256x240.png b/assets/libs/jquery-ui/images/ui-icons_2e83ff_256x240.png new file mode 100644 index 00000000..f44b9cee Binary files /dev/null and b/assets/libs/jquery-ui/images/ui-icons_2e83ff_256x240.png differ diff --git a/assets/libs/jquery-ui/images/ui-icons_454545_256x240.png b/assets/libs/jquery-ui/images/ui-icons_454545_256x240.png new file mode 100644 index 00000000..d79f2ef7 Binary files /dev/null and b/assets/libs/jquery-ui/images/ui-icons_454545_256x240.png differ diff --git a/assets/libs/jquery-ui/images/ui-icons_888888_256x240.png b/assets/libs/jquery-ui/images/ui-icons_888888_256x240.png new file mode 100644 index 00000000..cd4a75c6 Binary files /dev/null and b/assets/libs/jquery-ui/images/ui-icons_888888_256x240.png differ diff --git a/assets/libs/jquery-ui/images/ui-icons_cd0a0a_256x240.png b/assets/libs/jquery-ui/images/ui-icons_cd0a0a_256x240.png new file mode 100644 index 00000000..a8e162d3 Binary files /dev/null and b/assets/libs/jquery-ui/images/ui-icons_cd0a0a_256x240.png differ diff --git a/assets/css/jquery-ui.css b/assets/libs/jquery-ui/jquery-ui.css similarity index 91% rename from assets/css/jquery-ui.css rename to assets/libs/jquery-ui/jquery-ui.css index ec02ac15..294452f1 100644 --- a/assets/css/jquery-ui.css +++ b/assets/libs/jquery-ui/jquery-ui.css @@ -1,7 +1,7 @@ /*! jQuery UI - v1.12.1 - 2016-09-14 * http://jqueryui.com * Includes: core.css, accordion.css, autocomplete.css, menu.css, button.css, controlgroup.css, checkboxradio.css, datepicker.css, dialog.css, draggable.css, resizable.css, progressbar.css, selectable.css, selectmenu.css, slider.css, sortable.css, spinner.css, tabs.css, tooltip.css, theme.css -* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Arial%2CHelvetica%2Csans-serif&fsDefault=1em&fwDefault=normal&cornerRadius=3px&bgColorHeader=e9e9e9&bgTextureHeader=flat&borderColorHeader=dddddd&fcHeader=333333&iconColorHeader=444444&bgColorContent=ffffff&bgTextureContent=flat&borderColorContent=dddddd&fcContent=333333&iconColorContent=444444&bgColorDefault=f6f6f6&bgTextureDefault=flat&borderColorDefault=c5c5c5&fcDefault=454545&iconColorDefault=777777&bgColorHover=ededed&bgTextureHover=flat&borderColorHover=cccccc&fcHover=2b2b2b&iconColorHover=555555&bgColorActive=007fff&bgTextureActive=flat&borderColorActive=003eff&fcActive=ffffff&iconColorActive=ffffff&bgColorHighlight=fffa90&bgTextureHighlight=flat&borderColorHighlight=dad55e&fcHighlight=777620&iconColorHighlight=777620&bgColorError=fddfdf&bgTextureError=flat&borderColorError=f1a899&fcError=5f3f3f&iconColorError=cc0000&bgColorOverlay=aaaaaa&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=666666&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=5px&offsetTopShadow=0px&offsetLeftShadow=0px&cornerRadiusShadow=8px +* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Verdana%2CArial%2Csans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=cccccc&bgTextureHeader=highlight_soft&bgImgOpacityHeader=75&borderColorHeader=aaaaaa&fcHeader=222222&iconColorHeader=222222&bgColorContent=ffffff&bgTextureContent=flat&bgImgOpacityContent=75&borderColorContent=aaaaaa&fcContent=222222&iconColorContent=222222&bgColorDefault=e6e6e6&bgTextureDefault=glass&bgImgOpacityDefault=75&borderColorDefault=d3d3d3&fcDefault=555555&iconColorDefault=888888&bgColorHover=dadada&bgTextureHover=glass&bgImgOpacityHover=75&borderColorHover=999999&fcHover=212121&iconColorHover=454545&bgColorActive=ffffff&bgTextureActive=glass&bgImgOpacityActive=65&borderColorActive=aaaaaa&fcActive=212121&iconColorActive=454545&bgColorHighlight=fbf9ee&bgTextureHighlight=glass&bgImgOpacityHighlight=55&borderColorHighlight=fcefa1&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=fef1ec&bgTextureError=glass&bgImgOpacityError=95&borderColorError=cd0a0a&fcError=cd0a0a&iconColorError=cd0a0a&bgColorOverlay=aaaaaa&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px * Copyright jQuery Foundation and other contributors; Licensed MIT */ /* Layout helpers @@ -883,8 +883,8 @@ body .ui-tooltip { /* Component containers ----------------------------------*/ .ui-widget { - font-family: Arial,Helvetica,sans-serif; - font-size: 1em; + font-family: Verdana,Arial,sans-serif; + font-size: 1.1em; } .ui-widget .ui-widget { font-size: 1em; @@ -893,28 +893,28 @@ body .ui-tooltip { .ui-widget select, .ui-widget textarea, .ui-widget button { - font-family: Arial,Helvetica,sans-serif; + font-family: Verdana,Arial,sans-serif; font-size: 1em; } .ui-widget.ui-widget-content { - border: 1px solid #c5c5c5; + border: 1px solid #d3d3d3; } .ui-widget-content { - border: 1px solid #dddddd; + border: 1px solid #aaaaaa; background: #ffffff; - color: #333333; + color: #222222; } .ui-widget-content a { - color: #333333; + color: #222222; } .ui-widget-header { - border: 1px solid #dddddd; - background: #e9e9e9; - color: #333333; + border: 1px solid #aaaaaa; + background: #cccccc url("images/ui-bg_highlight-soft_75_cccccc_1x100.png") 50% 50% repeat-x; + color: #222222; font-weight: bold; } .ui-widget-header a { - color: #333333; + color: #222222; } /* Interaction states @@ -924,14 +924,14 @@ body .ui-tooltip { .ui-widget-header .ui-state-default, .ui-button, - /* We use html here because we need a greater specificity to make sure disabled - works properly when clicked or hovered */ +/* We use html here because we need a greater specificity to make sure disabled +works properly when clicked or hovered */ html .ui-button.ui-state-disabled:hover, html .ui-button.ui-state-disabled:active { - border: 1px solid #c5c5c5; - background: #f6f6f6; + border: 1px solid #d3d3d3; + background: #e6e6e6 url("images/ui-bg_glass_75_e6e6e6_1x400.png") 50% 50% repeat-x; font-weight: normal; - color: #454545; + color: #555555; } .ui-state-default a, .ui-state-default a:link, @@ -940,7 +940,7 @@ a.ui-button, a:link.ui-button, a:visited.ui-button, .ui-button { - color: #454545; + color: #555555; text-decoration: none; } .ui-state-hover, @@ -951,10 +951,10 @@ a:visited.ui-button, .ui-widget-header .ui-state-focus, .ui-button:hover, .ui-button:focus { - border: 1px solid #cccccc; - background: #ededed; + border: 1px solid #999999; + background: #dadada url("images/ui-bg_glass_75_dadada_1x400.png") 50% 50% repeat-x; font-weight: normal; - color: #2b2b2b; + color: #212121; } .ui-state-hover a, .ui-state-hover a:hover, @@ -966,7 +966,7 @@ a:visited.ui-button, .ui-state-focus a:visited, a.ui-button:hover, a.ui-button:focus { - color: #2b2b2b; + color: #212121; text-decoration: none; } @@ -979,20 +979,20 @@ a.ui-button:focus { a.ui-button:active, .ui-button:active, .ui-button.ui-state-active:hover { - border: 1px solid #003eff; - background: #007fff; + border: 1px solid #aaaaaa; + background: #ffffff url("images/ui-bg_glass_65_ffffff_1x400.png") 50% 50% repeat-x; font-weight: normal; - color: #ffffff; + color: #212121; } .ui-icon-background, .ui-state-active .ui-icon-background { - border: #003eff; - background-color: #ffffff; + border: #aaaaaa; + background-color: #212121; } .ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { - color: #ffffff; + color: #212121; text-decoration: none; } @@ -1001,35 +1001,35 @@ a.ui-button:active, .ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight { - border: 1px solid #dad55e; - background: #fffa90; - color: #777620; + border: 1px solid #fcefa1; + background: #fbf9ee url("images/ui-bg_glass_55_fbf9ee_1x400.png") 50% 50% repeat-x; + color: #363636; } .ui-state-checked { - border: 1px solid #dad55e; - background: #fffa90; + border: 1px solid #fcefa1; + background: #fbf9ee; } .ui-state-highlight a, .ui-widget-content .ui-state-highlight a, .ui-widget-header .ui-state-highlight a { - color: #777620; + color: #363636; } .ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error { - border: 1px solid #f1a899; - background: #fddfdf; - color: #5f3f3f; + border: 1px solid #cd0a0a; + background: #fef1ec url("images/ui-bg_glass_95_fef1ec_1x400.png") 50% 50% repeat-x; + color: #cd0a0a; } .ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { - color: #5f3f3f; + color: #cd0a0a; } .ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { - color: #5f3f3f; + color: #cd0a0a; } .ui-priority-primary, .ui-widget-content .ui-priority-primary, @@ -1064,31 +1064,31 @@ a.ui-button:active, } .ui-icon, .ui-widget-content .ui-icon { - background-image: url("images/ui-icons_444444_256x240.png"); + background-image: url("images/ui-icons_222222_256x240.png"); } .ui-widget-header .ui-icon { - background-image: url("images/ui-icons_444444_256x240.png"); + background-image: url("images/ui-icons_222222_256x240.png"); } .ui-state-hover .ui-icon, .ui-state-focus .ui-icon, .ui-button:hover .ui-icon, .ui-button:focus .ui-icon { - background-image: url("images/ui-icons_555555_256x240.png"); + background-image: url("images/ui-icons_454545_256x240.png"); } .ui-state-active .ui-icon, .ui-button:active .ui-icon { - background-image: url("images/ui-icons_ffffff_256x240.png"); + background-image: url("images/ui-icons_454545_256x240.png"); } .ui-state-highlight .ui-icon, .ui-button .ui-state-highlight.ui-icon { - background-image: url("images/ui-icons_777620_256x240.png"); + background-image: url("images/ui-icons_2e83ff_256x240.png"); } .ui-state-error .ui-icon, .ui-state-error-text .ui-icon { - background-image: url("images/ui-icons_cc0000_256x240.png"); + background-image: url("images/ui-icons_cd0a0a_256x240.png"); } .ui-button .ui-icon { - background-image: url("images/ui-icons_777777_256x240.png"); + background-image: url("images/ui-icons_888888_256x240.png"); } /* positioning */ @@ -1278,25 +1278,25 @@ a.ui-button:active, .ui-corner-top, .ui-corner-left, .ui-corner-tl { - border-top-left-radius: 3px; + border-top-left-radius: 4px; } .ui-corner-all, .ui-corner-top, .ui-corner-right, .ui-corner-tr { - border-top-right-radius: 3px; + border-top-right-radius: 4px; } .ui-corner-all, .ui-corner-bottom, .ui-corner-left, .ui-corner-bl { - border-bottom-left-radius: 3px; + border-bottom-left-radius: 4px; } .ui-corner-all, .ui-corner-bottom, .ui-corner-right, .ui-corner-br { - border-bottom-right-radius: 3px; + border-bottom-right-radius: 4px; } /* Overlays */ @@ -1306,6 +1306,6 @@ a.ui-button:active, filter: Alpha(Opacity=30); /* support: IE8 */ } .ui-widget-shadow { - -webkit-box-shadow: 0px 0px 5px #666666; - box-shadow: 0px 0px 5px #666666; + -webkit-box-shadow: -8px -8px 8px #aaaaaa; + box-shadow: -8px -8px 8px #aaaaaa; } diff --git a/assets/libs/jquery-ui/jquery-ui.min.css b/assets/libs/jquery-ui/jquery-ui.min.css new file mode 100644 index 00000000..dbd72353 --- /dev/null +++ b/assets/libs/jquery-ui/jquery-ui.min.css @@ -0,0 +1,7 @@ +/*! jQuery UI - v1.12.1 - 2016-09-14 +* http://jqueryui.com +* Includes: core.css, accordion.css, autocomplete.css, menu.css, button.css, controlgroup.css, checkboxradio.css, datepicker.css, dialog.css, draggable.css, resizable.css, progressbar.css, selectable.css, selectmenu.css, slider.css, sortable.css, spinner.css, tabs.css, tooltip.css, theme.css +* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Verdana%2CArial%2Csans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=cccccc&bgTextureHeader=highlight_soft&bgImgOpacityHeader=75&borderColorHeader=aaaaaa&fcHeader=222222&iconColorHeader=222222&bgColorContent=ffffff&bgTextureContent=flat&bgImgOpacityContent=75&borderColorContent=aaaaaa&fcContent=222222&iconColorContent=222222&bgColorDefault=e6e6e6&bgTextureDefault=glass&bgImgOpacityDefault=75&borderColorDefault=d3d3d3&fcDefault=555555&iconColorDefault=888888&bgColorHover=dadada&bgTextureHover=glass&bgImgOpacityHover=75&borderColorHover=999999&fcHover=212121&iconColorHover=454545&bgColorActive=ffffff&bgTextureActive=glass&bgImgOpacityActive=65&borderColorActive=aaaaaa&fcActive=212121&iconColorActive=454545&bgColorHighlight=fbf9ee&bgTextureHighlight=glass&bgImgOpacityHighlight=55&borderColorHighlight=fcefa1&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=fef1ec&bgTextureError=glass&bgImgOpacityError=95&borderColorError=cd0a0a&fcError=cd0a0a&iconColorError=cd0a0a&bgColorOverlay=aaaaaa&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px +* Copyright jQuery Foundation and other contributors; Licensed MIT */ + +.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important;pointer-events:none}.ui-icon{display:inline-block;vertical-align:middle;margin-top:-.25em;position:relative;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-icon-block{left:50%;margin-left:-8px;display:block}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-accordion .ui-accordion-header{display:block;cursor:pointer;position:relative;margin:2px 0 0 0;padding:.5em .5em .5em .7em;font-size:100%}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;overflow:auto}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-menu{list-style:none;padding:0;margin:0;display:block;outline:0}.ui-menu .ui-menu{position:absolute}.ui-menu .ui-menu-item{margin:0;cursor:pointer;list-style-image:url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7")}.ui-menu .ui-menu-item-wrapper{position:relative;padding:3px 1em 3px .4em}.ui-menu .ui-menu-divider{margin:5px 0;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-state-focus,.ui-menu .ui-state-active{margin:-1px}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item-wrapper{padding-left:2em}.ui-menu .ui-icon{position:absolute;top:0;bottom:0;left:.2em;margin:auto 0}.ui-menu .ui-menu-icon{left:auto;right:0}.ui-button{padding:.4em 1em;display:inline-block;position:relative;line-height:normal;margin-right:.1em;cursor:pointer;vertical-align:middle;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;overflow:visible}.ui-button,.ui-button:link,.ui-button:visited,.ui-button:hover,.ui-button:active{text-decoration:none}.ui-button-icon-only{width:2em;box-sizing:border-box;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-button-icon-only{text-indent:0}.ui-button-icon-only .ui-icon{position:absolute;top:50%;left:50%;margin-top:-8px;margin-left:-8px}.ui-button.ui-icon-notext .ui-icon{padding:0;width:2.1em;height:2.1em;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-icon-notext .ui-icon{width:auto;height:auto;text-indent:0;white-space:normal;padding:.4em 1em}input.ui-button::-moz-focus-inner,button.ui-button::-moz-focus-inner{border:0;padding:0}.ui-controlgroup{vertical-align:middle;display:inline-block}.ui-controlgroup > .ui-controlgroup-item{float:left;margin-left:0;margin-right:0}.ui-controlgroup > .ui-controlgroup-item:focus,.ui-controlgroup > .ui-controlgroup-item.ui-visual-focus{z-index:9999}.ui-controlgroup-vertical > .ui-controlgroup-item{display:block;float:none;width:100%;margin-top:0;margin-bottom:0;text-align:left}.ui-controlgroup-vertical .ui-controlgroup-item{box-sizing:border-box}.ui-controlgroup .ui-controlgroup-label{padding:.4em 1em}.ui-controlgroup .ui-controlgroup-label span{font-size:80%}.ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item{border-left:none}.ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item{border-top:none}.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content{border-right:none}.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content{border-bottom:none}.ui-controlgroup-vertical .ui-spinner-input{width:75%;width:calc( 100% - 2.4em )}.ui-controlgroup-vertical .ui-spinner .ui-spinner-up{border-top-style:solid}.ui-checkboxradio-label .ui-icon-background{box-shadow:inset 1px 1px 1px #ccc;border-radius:.12em;border:none}.ui-checkboxradio-radio-label .ui-icon-background{width:16px;height:16px;border-radius:1em;overflow:visible;border:none}.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon,.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon{background-image:none;width:8px;height:8px;border-width:4px;border-style:solid}.ui-checkboxradio-disabled{pointer-events:none}.ui-datepicker{width:17em;padding:.2em .2em 0;display:none}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-datepicker-next-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-prev span,.ui-datepicker .ui-datepicker-next span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:45%}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:bold;border:0}.ui-datepicker td{border:0;padding:1px}.ui-datepicker td span,.ui-datepicker td a{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em .6em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-datepicker .ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat;left:.5em;top:.3em}.ui-dialog{position:absolute;top:0;left:0;padding:.2em;outline:0}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{float:left;margin:.1em 0;white-space:nowrap;width:90%;overflow:hidden;text-overflow:ellipsis}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:20px;margin:-10px 0 0 0;padding:1px;height:20px}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:none;overflow:auto}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0 0;background-image:none;margin-top:.5em;padding:.3em 1em .5em .4em}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer}.ui-dialog .ui-resizable-n{height:2px;top:0}.ui-dialog .ui-resizable-e{width:2px;right:0}.ui-dialog .ui-resizable-s{height:2px;bottom:0}.ui-dialog .ui-resizable-w{width:2px;left:0}.ui-dialog .ui-resizable-se,.ui-dialog .ui-resizable-sw,.ui-dialog .ui-resizable-ne,.ui-dialog .ui-resizable-nw{width:7px;height:7px}.ui-dialog .ui-resizable-se{right:0;bottom:0}.ui-dialog .ui-resizable-sw{left:0;bottom:0}.ui-dialog .ui-resizable-ne{right:0;top:0}.ui-dialog .ui-resizable-nw{left:0;top:0}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-draggable-handle{-ms-touch-action:none;touch-action:none}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:0.1px;display:block;-ms-touch-action:none;touch-action:none}.ui-resizable-disabled .ui-resizable-handle,.ui-resizable-autohide .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.ui-progressbar .ui-progressbar-overlay{background:url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");height:100%;filter:alpha(opacity=25);opacity:0.25}.ui-progressbar-indeterminate .ui-progressbar-value{background-image:none}.ui-selectable{-ms-touch-action:none;touch-action:none}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted black}.ui-selectmenu-menu{padding:0;margin:0;position:absolute;top:0;left:0;display:none}.ui-selectmenu-menu .ui-menu{overflow:auto;overflow-x:hidden;padding-bottom:1px}.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup{font-size:1em;font-weight:bold;line-height:1.5;padding:2px 0.4em;margin:0.5em 0 0 0;height:auto;border:0}.ui-selectmenu-open{display:block}.ui-selectmenu-text{display:block;margin-right:20px;overflow:hidden;text-overflow:ellipsis}.ui-selectmenu-button.ui-button{text-align:left;white-space:nowrap;width:14em}.ui-selectmenu-icon.ui-icon{float:right;margin-top:0}.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default;-ms-touch-action:none;touch-action:none}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0}.ui-sortable-handle{-ms-touch-action:none;touch-action:none}.ui-spinner{position:relative;display:inline-block;overflow:hidden;padding:0;vertical-align:middle}.ui-spinner-input{border:none;background:none;color:inherit;padding:.222em 0;margin:.2em 0;vertical-align:middle;margin-left:.4em;margin-right:2em}.ui-spinner-button{width:1.6em;height:50%;font-size:.5em;padding:0;margin:0;text-align:center;position:absolute;cursor:default;display:block;overflow:hidden;right:0}.ui-spinner a.ui-spinner-button{border-top-style:none;border-bottom-style:none;border-right-style:none}.ui-spinner-up{top:0}.ui-spinner-down{bottom:0}.ui-tabs{position:relative;padding:.2em}.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:0;margin:1px .2em 0 0;border-bottom-width:0;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav .ui-tabs-anchor{float:left;padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:-1px;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor{cursor:text}.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:none}.ui-tooltip{padding:8px;position:absolute;z-index:9999;max-width:300px}body .ui-tooltip{border-width:2px}.ui-widget{font-family:Verdana,Arial,sans-serif;font-size:1.1em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Verdana,Arial,sans-serif;font-size:1em}.ui-widget.ui-widget-content{border:1px solid #d3d3d3}.ui-widget-content{border:1px solid #aaa;background:#fff;color:#222}.ui-widget-content a{color:#222}.ui-widget-header{border:1px solid #aaa;background:#ccc url("images/ui-bg_highlight-soft_75_cccccc_1x100.png") 50% 50% repeat-x;color:#222;font-weight:bold}.ui-widget-header a{color:#222}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default,.ui-button,html .ui-button.ui-state-disabled:hover,html .ui-button.ui-state-disabled:active{border:1px solid #d3d3d3;background:#e6e6e6 url("images/ui-bg_glass_75_e6e6e6_1x400.png") 50% 50% repeat-x;font-weight:normal;color:#555}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited,a.ui-button,a:link.ui-button,a:visited.ui-button,.ui-button{color:#555;text-decoration:none}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus,.ui-button:hover,.ui-button:focus{border:1px solid #999;background:#dadada url("images/ui-bg_glass_75_dadada_1x400.png") 50% 50% repeat-x;font-weight:normal;color:#212121}.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited,.ui-state-focus a,.ui-state-focus a:hover,.ui-state-focus a:link,.ui-state-focus a:visited,a.ui-button:hover,a.ui-button:focus{color:#212121;text-decoration:none}.ui-visual-focus{box-shadow:0 0 3px 1px rgb(94,158,214)}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active,a.ui-button:active,.ui-button:active,.ui-button.ui-state-active:hover{border:1px solid #aaa;background:#fff url("images/ui-bg_glass_65_ffffff_1x400.png") 50% 50% repeat-x;font-weight:normal;color:#212121}.ui-icon-background,.ui-state-active .ui-icon-background{border:#aaa;background-color:#212121}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#212121;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #fcefa1;background:#fbf9ee url("images/ui-bg_glass_55_fbf9ee_1x400.png") 50% 50% repeat-x;color:#363636}.ui-state-checked{border:1px solid #fcefa1;background:#fbf9ee}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#363636}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #cd0a0a;background:#fef1ec url("images/ui-bg_glass_95_fef1ec_1x400.png") 50% 50% repeat-x;color:#cd0a0a}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#cd0a0a}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#cd0a0a}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:normal}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px}.ui-icon,.ui-widget-content .ui-icon{background-image:url("images/ui-icons_222222_256x240.png")}.ui-widget-header .ui-icon{background-image:url("images/ui-icons_222222_256x240.png")}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon,.ui-button:hover .ui-icon,.ui-button:focus .ui-icon{background-image:url("images/ui-icons_454545_256x240.png")}.ui-state-active .ui-icon,.ui-button:active .ui-icon{background-image:url("images/ui-icons_454545_256x240.png")}.ui-state-highlight .ui-icon,.ui-button .ui-state-highlight.ui-icon{background-image:url("images/ui-icons_2e83ff_256x240.png")}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url("images/ui-icons_cd0a0a_256x240.png")}.ui-button .ui-icon{background-image:url("images/ui-icons_888888_256x240.png")}.ui-icon-blank{background-position:16px 16px}.ui-icon-caret-1-n{background-position:0 0}.ui-icon-caret-1-ne{background-position:-16px 0}.ui-icon-caret-1-e{background-position:-32px 0}.ui-icon-caret-1-se{background-position:-48px 0}.ui-icon-caret-1-s{background-position:-65px 0}.ui-icon-caret-1-sw{background-position:-80px 0}.ui-icon-caret-1-w{background-position:-96px 0}.ui-icon-caret-1-nw{background-position:-112px 0}.ui-icon-caret-2-n-s{background-position:-128px 0}.ui-icon-caret-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-65px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-65px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:1px -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{border-top-left-radius:4px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{border-top-right-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{border-bottom-left-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{border-bottom-right-radius:4px}.ui-widget-overlay{background:#aaa;opacity:.3;filter:Alpha(Opacity=30)}.ui-widget-shadow{-webkit-box-shadow:-8px -8px 8px #aaa;box-shadow:-8px -8px 8px #aaa} \ No newline at end of file diff --git a/assets/font/fontawesome-webfont.eot b/assets/libs/legacy/fonticons/font/fontawesome-webfont.eot similarity index 100% rename from assets/font/fontawesome-webfont.eot rename to assets/libs/legacy/fonticons/font/fontawesome-webfont.eot diff --git a/assets/font/fontawesome-webfont.svg b/assets/libs/legacy/fonticons/font/fontawesome-webfont.svg similarity index 100% rename from assets/font/fontawesome-webfont.svg rename to assets/libs/legacy/fonticons/font/fontawesome-webfont.svg diff --git a/assets/font/fontawesome-webfont.ttf b/assets/libs/legacy/fonticons/font/fontawesome-webfont.ttf similarity index 100% rename from assets/font/fontawesome-webfont.ttf rename to assets/libs/legacy/fonticons/font/fontawesome-webfont.ttf diff --git a/assets/font/fontawesome-webfont.woff b/assets/libs/legacy/fonticons/font/fontawesome-webfont.woff similarity index 100% rename from assets/font/fontawesome-webfont.woff rename to assets/libs/legacy/fonticons/font/fontawesome-webfont.woff diff --git a/assets/font/ionicons.eot b/assets/libs/legacy/fonticons/font/ionicons.eot similarity index 100% rename from assets/font/ionicons.eot rename to assets/libs/legacy/fonticons/font/ionicons.eot diff --git a/assets/font/ionicons.svg b/assets/libs/legacy/fonticons/font/ionicons.svg similarity index 100% rename from assets/font/ionicons.svg rename to assets/libs/legacy/fonticons/font/ionicons.svg diff --git a/assets/font/ionicons.ttf b/assets/libs/legacy/fonticons/font/ionicons.ttf similarity index 100% rename from assets/font/ionicons.ttf rename to assets/libs/legacy/fonticons/font/ionicons.ttf diff --git a/assets/font/ionicons.woff b/assets/libs/legacy/fonticons/font/ionicons.woff similarity index 100% rename from assets/font/ionicons.woff rename to assets/libs/legacy/fonticons/font/ionicons.woff diff --git a/assets/css/um-fonticons-fa.css b/assets/libs/legacy/fonticons/fonticons-fa.css similarity index 98% rename from assets/css/um-fonticons-fa.css rename to assets/libs/legacy/fonticons/fonticons-fa.css index 3b585c0e..786a89de 100644 --- a/assets/css/um-fonticons-fa.css +++ b/assets/libs/legacy/fonticons/fonticons-fa.css @@ -2,11 +2,11 @@ @font-face { font-family: "FontAwesome"; - src:url("../font/fontawesome-webfont.eot?v=4.2.0"); - src:url("../font/fontawesome-webfont.eot?v=4.2.0#iefix") format("embedded-opentype"), - url("../font/fontawesome-webfont.woff?v=4.2.0") format("woff"), - url("../font/fontawesome-webfont.ttf?v=4.2.0") format("truetype"), - url("../font/fontawesome-webfont.svg?v=4.2.0#fontawesomeregular") format("svg"); + src:url("font/fontawesome-webfont.eot?v=4.2.0"); + src:url("font/fontawesome-webfont.eot?v=4.2.0#iefix") format("embedded-opentype"), + url("font/fontawesome-webfont.woff?v=4.2.0") format("woff"), + url("font/fontawesome-webfont.ttf?v=4.2.0") format("truetype"), + url("font/fontawesome-webfont.svg?v=4.2.0#fontawesomeregular") format("svg"); font-display: swap; font-weight: normal; font-style: normal; diff --git a/assets/libs/legacy/fonticons/fonticons-fa.min.css b/assets/libs/legacy/fonticons/fonticons-fa.min.css new file mode 100644 index 00000000..691f060c --- /dev/null +++ b/assets/libs/legacy/fonticons/fonticons-fa.min.css @@ -0,0 +1 @@ +@charset "UTF-8";@font-face{font-family:FontAwesome;src:url(font/fontawesome-webfont.eot?v=4.2.0);src:url(font/fontawesome-webfont.eot?v=4.2.0#iefix) format("embedded-opentype"),url(font/fontawesome-webfont.woff?v=4.2.0) format("woff"),url(font/fontawesome-webfont.ttf?v=4.2.0) format("truetype"),url(font/fontawesome-webfont.svg?v=4.2.0#fontawesomeregular) format("svg");font-display:swap;font-weight:400;font-style:normal}[class*=" um-faicon-"]:before,[class^=um-faicon-]:before{font-family:FontAwesome!important;font-style:normal!important;font-weight:400!important;font-variant:normal!important;text-transform:none!important;speak:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.um-faicon-sticky-note:before{content:"\f249"}.um-faicon-glass:before{content:"\f000"}.um-faicon-music:before{content:"\f001"}.um-faicon-search:before{content:"\f002"}.um-faicon-envelope-o:before{content:"\f003"}.um-faicon-heart:before{content:"\f004"}.um-faicon-star:before{content:"\f005"}.um-faicon-star-o:before{content:"\f006"}.um-faicon-user:before{content:"\f007"}.um-faicon-film:before{content:"\f008"}.um-faicon-th-large:before{content:"\f009"}.um-faicon-th:before{content:"\f00a"}.um-faicon-th-list:before{content:"\f00b"}.um-faicon-check:before{content:"\f00c"}.um-faicon-close:before,.um-faicon-remove:before,.um-faicon-times:before{content:"\f00d"}.um-faicon-search-plus:before{content:"\f00e"}.um-faicon-search-minus:before{content:"\f010"}.um-faicon-power-off:before{content:"\f011"}.um-faicon-signal:before{content:"\f012"}.um-faicon-cog:before,.um-faicon-gear:before{content:"\f013"}.um-faicon-trash-o:before{content:"\f014"}.um-faicon-home:before{content:"\f015"}.um-faicon-file-o:before{content:"\f016"}.um-faicon-clock-o:before{content:"\f017"}.um-faicon-road:before{content:"\f018"}.um-faicon-download:before{content:"\f019"}.um-faicon-arrow-circle-o-down:before{content:"\f01a"}.um-faicon-arrow-circle-o-up:before{content:"\f01b"}.um-faicon-inbox:before{content:"\f01c"}.um-faicon-play-circle-o:before{content:"\f01d"}.um-faicon-repeat:before,.um-faicon-rotate-right:before{content:"\f01e"}.um-faicon-refresh:before{content:"\f021"}.um-faicon-list-alt:before{content:"\f022"}.um-faicon-lock:before{content:"\f023"}.um-faicon-flag:before{content:"\f024"}.um-faicon-headphones:before{content:"\f025"}.um-faicon-volume-off:before{content:"\f026"}.um-faicon-volume-down:before{content:"\f027"}.um-faicon-volume-up:before{content:"\f028"}.um-faicon-qrcode:before{content:"\f029"}.um-faicon-barcode:before{content:"\f02a"}.um-faicon-tag:before{content:"\f02b"}.um-faicon-tags:before{content:"\f02c"}.um-faicon-book:before{content:"\f02d"}.um-faicon-bookmark:before{content:"\f02e"}.um-faicon-print:before{content:"\f02f"}.um-faicon-camera:before{content:"\f030"}.um-faicon-font:before{content:"\f031"}.um-faicon-bold:before{content:"\f032"}.um-faicon-italic:before{content:"\f033"}.um-faicon-text-height:before{content:"\f034"}.um-faicon-text-width:before{content:"\f035"}.um-faicon-align-left:before{content:"\f036"}.um-faicon-align-center:before{content:"\f037"}.um-faicon-align-right:before{content:"\f038"}.um-faicon-align-justify:before{content:"\f039"}.um-faicon-list:before{content:"\f03a"}.um-faicon-dedent:before,.um-faicon-outdent:before{content:"\f03b"}.um-faicon-indent:before{content:"\f03c"}.um-faicon-video-camera:before{content:"\f03d"}.um-faicon-image:before,.um-faicon-photo:before,.um-faicon-picture-o:before{content:"\f03e"}.um-faicon-pencil:before{content:"\f040"}.um-faicon-map-marker:before{content:"\f041"}.um-faicon-adjust:before{content:"\f042"}.um-faicon-tint:before{content:"\f043"}.um-faicon-edit:before,.um-faicon-pencil-square-o:before{content:"\f044"}.um-faicon-share-square-o:before{content:"\f045"}.um-faicon-check-square-o:before{content:"\f046"}.um-faicon-arrows:before{content:"\f047"}.um-faicon-step-backward:before{content:"\f048"}.um-faicon-fast-backward:before{content:"\f049"}.um-faicon-backward:before{content:"\f04a"}.um-faicon-play:before{content:"\f04b"}.um-faicon-pause:before{content:"\f04c"}.um-faicon-stop:before{content:"\f04d"}.um-faicon-forward:before{content:"\f04e"}.um-faicon-fast-forward:before{content:"\f050"}.um-faicon-step-forward:before{content:"\f051"}.um-faicon-eject:before{content:"\f052"}.um-faicon-chevron-left:before{content:"\f053"}.um-faicon-chevron-right:before{content:"\f054"}.um-faicon-plus-circle:before{content:"\f055"}.um-faicon-minus-circle:before{content:"\f056"}.um-faicon-times-circle:before{content:"\f057"}.um-faicon-check-circle:before{content:"\f058"}.um-faicon-question-circle:before{content:"\f059"}.um-faicon-info-circle:before{content:"\f05a"}.um-faicon-crosshairs:before{content:"\f05b"}.um-faicon-times-circle-o:before{content:"\f05c"}.um-faicon-check-circle-o:before{content:"\f05d"}.um-faicon-ban:before{content:"\f05e"}.um-faicon-arrow-left:before{content:"\f060"}.um-faicon-arrow-right:before{content:"\f061"}.um-faicon-arrow-up:before{content:"\f062"}.um-faicon-arrow-down:before{content:"\f063"}.um-faicon-mail-forward:before,.um-faicon-share:before{content:"\f064"}.um-faicon-expand:before{content:"\f065"}.um-faicon-compress:before{content:"\f066"}.um-faicon-plus:before{content:"\f067"}.um-faicon-minus:before{content:"\f068"}.um-faicon-asterisk:before{content:"\f069"}.um-faicon-exclamation-circle:before{content:"\f06a"}.um-faicon-gift:before{content:"\f06b"}.um-faicon-leaf:before{content:"\f06c"}.um-faicon-fire:before{content:"\f06d"}.um-faicon-eye:before{content:"\f06e"}.um-faicon-eye-slash:before{content:"\f070"}.um-faicon-exclamation-triangle:before,.um-faicon-warning:before{content:"\f071"}.um-faicon-plane:before{content:"\f072"}.um-faicon-calendar:before{content:"\f073"}.um-faicon-random:before{content:"\f074"}.um-faicon-comment:before{content:"\f075"}.um-faicon-magnet:before{content:"\f076"}.um-faicon-chevron-up:before{content:"\f077"}.um-faicon-chevron-down:before{content:"\f078"}.um-faicon-retweet:before{content:"\f079"}.um-faicon-shopping-cart:before{content:"\f07a"}.um-faicon-folder:before{content:"\f07b"}.um-faicon-folder-open:before{content:"\f07c"}.um-faicon-arrows-v:before{content:"\f07d"}.um-faicon-arrows-h:before{content:"\f07e"}.um-faicon-bar-chart-o:before,.um-faicon-bar-chart:before{content:"\f080"}.um-faicon-twitter-square:before{content:"\f081"}.um-faicon-facebook-square:before{content:"\f082"}.um-faicon-camera-retro:before{content:"\f083"}.um-faicon-key:before{content:"\f084"}.um-faicon-cogs:before,.um-faicon-gears:before{content:"\f085"}.um-faicon-comments:before{content:"\f086"}.um-faicon-thumbs-o-up:before{content:"\f087"}.um-faicon-thumbs-o-down:before{content:"\f088"}.um-faicon-star-half:before{content:"\f089"}.um-faicon-heart-o:before{content:"\f08a"}.um-faicon-sign-out:before{content:"\f08b"}.um-faicon-linkedin-square:before{content:"\f08c"}.um-faicon-thumb-tack:before{content:"\f08d"}.um-faicon-external-link:before{content:"\f08e"}.um-faicon-sign-in:before{content:"\f090"}.um-faicon-trophy:before{content:"\f091"}.um-faicon-github-square:before{content:"\f092"}.um-faicon-upload:before{content:"\f093"}.um-faicon-lemon-o:before{content:"\f094"}.um-faicon-phone:before{content:"\f095"}.um-faicon-square-o:before{content:"\f096"}.um-faicon-bookmark-o:before{content:"\f097"}.um-faicon-phone-square:before{content:"\f098"}.um-faicon-twitter:before{content:"\f099"}.um-faicon-facebook:before{content:"\f09a"}.um-faicon-github:before{content:"\f09b"}.um-faicon-unlock:before{content:"\f09c"}.um-faicon-credit-card:before{content:"\f09d"}.um-faicon-rss:before{content:"\f09e"}.um-faicon-hdd-o:before{content:"\f0a0"}.um-faicon-bullhorn:before{content:"\f0a1"}.um-faicon-bell:before{content:"\f0f3"}.um-faicon-certificate:before{content:"\f0a3"}.um-faicon-hand-o-right:before{content:"\f0a4"}.um-faicon-hand-o-left:before{content:"\f0a5"}.um-faicon-hand-o-up:before{content:"\f0a6"}.um-faicon-hand-o-down:before{content:"\f0a7"}.um-faicon-arrow-circle-left:before{content:"\f0a8"}.um-faicon-arrow-circle-right:before{content:"\f0a9"}.um-faicon-arrow-circle-up:before{content:"\f0aa"}.um-faicon-arrow-circle-down:before{content:"\f0ab"}.um-faicon-globe:before{content:"\f0ac"}.um-faicon-wrench:before{content:"\f0ad"}.um-faicon-tasks:before{content:"\f0ae"}.um-faicon-filter:before{content:"\f0b0"}.um-faicon-briefcase:before{content:"\f0b1"}.um-faicon-arrows-alt:before{content:"\f0b2"}.um-faicon-group:before,.um-faicon-users:before{content:"\f0c0"}.um-faicon-chain:before,.um-faicon-link:before{content:"\f0c1"}.um-faicon-cloud:before{content:"\f0c2"}.um-faicon-flask:before{content:"\f0c3"}.um-faicon-cut:before,.um-faicon-scissors:before{content:"\f0c4"}.um-faicon-copy:before,.um-faicon-files-o:before{content:"\f0c5"}.um-faicon-paperclip:before{content:"\f0c6"}.um-faicon-floppy-o:before,.um-faicon-save:before{content:"\f0c7"}.um-faicon-square:before{content:"\f0c8"}.um-faicon-bars:before,.um-faicon-navicon:before,.um-faicon-reorder:before{content:"\f0c9"}.um-faicon-list-ul:before{content:"\f0ca"}.um-faicon-list-ol:before{content:"\f0cb"}.um-faicon-strikethrough:before{content:"\f0cc"}.um-faicon-underline:before{content:"\f0cd"}.um-faicon-table:before{content:"\f0ce"}.um-faicon-magic:before{content:"\f0d0"}.um-faicon-truck:before{content:"\f0d1"}.um-faicon-pinterest:before{content:"\f0d2"}.um-faicon-pinterest-square:before{content:"\f0d3"}.um-faicon-google-plus-square:before{content:"\f0d4"}.um-faicon-google-plus:before{content:"\f0d5"}.um-faicon-money:before{content:"\f0d6"}.um-faicon-caret-down:before{content:"\f0d7"}.um-faicon-caret-up:before{content:"\f0d8"}.um-faicon-caret-left:before{content:"\f0d9"}.um-faicon-caret-right:before{content:"\f0da"}.um-faicon-columns:before{content:"\f0db"}.um-faicon-sort:before,.um-faicon-unsorted:before{content:"\f0dc"}.um-faicon-sort-desc:before,.um-faicon-sort-down:before{content:"\f0dd"}.um-faicon-sort-asc:before,.um-faicon-sort-up:before{content:"\f0de"}.um-faicon-envelope:before{content:"\f0e0"}.um-faicon-linkedin:before{content:"\f0e1"}.um-faicon-rotate-left:before,.um-faicon-undo:before{content:"\f0e2"}.um-faicon-gavel:before,.um-faicon-legal:before{content:"\f0e3"}.um-faicon-dashboard:before,.um-faicon-tachometer:before{content:"\f0e4"}.um-faicon-comment-o:before{content:"\f0e5"}.um-faicon-comments-o:before{content:"\f0e6"}.um-faicon-bolt:before,.um-faicon-flash:before{content:"\f0e7"}.um-faicon-sitemap:before{content:"\f0e8"}.um-faicon-umbrella:before{content:"\f0e9"}.um-faicon-clipboard:before,.um-faicon-paste:before{content:"\f0ea"}.um-faicon-lightbulb-o:before{content:"\f0eb"}.um-faicon-exchange:before{content:"\f0ec"}.um-faicon-cloud-download:before{content:"\f0ed"}.um-faicon-cloud-upload:before{content:"\f0ee"}.um-faicon-user-md:before{content:"\f0f0"}.um-faicon-stethoscope:before{content:"\f0f1"}.um-faicon-suitcase:before{content:"\f0f2"}.um-faicon-bell-o:before{content:"\f0a2"}.um-faicon-coffee:before{content:"\f0f4"}.um-faicon-cutlery:before{content:"\f0f5"}.um-faicon-file-text-o:before{content:"\f0f6"}.um-faicon-building-o:before{content:"\f0f7"}.um-faicon-hospital-o:before{content:"\f0f8"}.um-faicon-ambulance:before{content:"\f0f9"}.um-faicon-medkit:before{content:"\f0fa"}.um-faicon-fighter-jet:before{content:"\f0fb"}.um-faicon-beer:before{content:"\f0fc"}.um-faicon-h-square:before{content:"\f0fd"}.um-faicon-plus-square:before{content:"\f0fe"}.um-faicon-angle-double-left:before{content:"\f100"}.um-faicon-angle-double-right:before{content:"\f101"}.um-faicon-angle-double-up:before{content:"\f102"}.um-faicon-angle-double-down:before{content:"\f103"}.um-faicon-angle-left:before{content:"\f104"}.um-faicon-angle-right:before{content:"\f105"}.um-faicon-angle-up:before{content:"\f106"}.um-faicon-angle-down:before{content:"\f107"}.um-faicon-desktop:before{content:"\f108"}.um-faicon-laptop:before{content:"\f109"}.um-faicon-tablet:before{content:"\f10a"}.um-faicon-mobile-phone:before,.um-faicon-mobile:before{content:"\f10b"}.um-faicon-circle-o:before{content:"\f10c"}.um-faicon-quote-left:before{content:"\f10d"}.um-faicon-quote-right:before{content:"\f10e"}.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"}.um-faicon-mail-reply:before,.um-faicon-reply:before{content:"\f112"}.um-faicon-github-alt:before{content:"\f113"}.um-faicon-folder-o:before{content:"\f114"}.um-faicon-folder-open-o:before{content:"\f115"}.um-faicon-smile-o:before{content:"\f118"}.um-faicon-frown-o:before{content:"\f119"}.um-faicon-meh-o:before{content:"\f11a"}.um-faicon-gamepad:before{content:"\f11b"}.um-faicon-keyboard-o:before{content:"\f11c"}.um-faicon-flag-o:before{content:"\f11d"}.um-faicon-flag-checkered:before{content:"\f11e"}.um-faicon-terminal:before{content:"\f120"}.um-faicon-code:before{content:"\f121"}.um-faicon-mail-reply-all:before,.um-faicon-reply-all:before{content:"\f122"}.um-faicon-star-half-empty:before,.um-faicon-star-half-full:before,.um-faicon-star-half-o:before{content:"\f123"}.um-faicon-location-arrow:before{content:"\f124"}.um-faicon-crop:before{content:"\f125"}.um-faicon-code-fork:before{content:"\f126"}.um-faicon-chain-broken:before,.um-faicon-unlink:before{content:"\f127"}.um-faicon-question:before{content:"\f128"}.um-faicon-info:before{content:"\f129"}.um-faicon-exclamation:before{content:"\f12a"}.um-faicon-superscript:before{content:"\f12b"}.um-faicon-subscript:before{content:"\f12c"}.um-faicon-eraser:before{content:"\f12d"}.um-faicon-puzzle-piece:before{content:"\f12e"}.um-faicon-microphone:before{content:"\f130"}.um-faicon-microphone-slash:before{content:"\f131"}.um-faicon-shield:before{content:"\f132"}.um-faicon-calendar-o:before{content:"\f133"}.um-faicon-fire-extinguisher:before{content:"\f134"}.um-faicon-rocket:before{content:"\f135"}.um-faicon-maxcdn:before{content:"\f136"}.um-faicon-chevron-circle-left:before{content:"\f137"}.um-faicon-chevron-circle-right:before{content:"\f138"}.um-faicon-chevron-circle-up:before{content:"\f139"}.um-faicon-chevron-circle-down:before{content:"\f13a"}.um-faicon-html5:before{content:"\f13b"}.um-faicon-css3:before{content:"\f13c"}.um-faicon-anchor:before{content:"\f13d"}.um-faicon-unlock-alt:before{content:"\f13e"}.um-faicon-bullseye:before{content:"\f140"}.um-faicon-ellipsis-h:before{content:"\f141"}.um-faicon-ellipsis-v:before{content:"\f142"}.um-faicon-rss-square:before{content:"\f143"}.um-faicon-play-circle:before{content:"\f144"}.um-faicon-ticket:before{content:"\f145"}.um-faicon-minus-square:before{content:"\f146"}.um-faicon-minus-square-o:before{content:"\f147"}.um-faicon-level-up:before{content:"\f148"}.um-faicon-level-down:before{content:"\f149"}.um-faicon-check-square:before{content:"\f14a"}.um-faicon-pencil-square:before{content:"\f14b"}.um-faicon-external-link-square:before{content:"\f14c"}.um-faicon-share-square:before{content:"\f14d"}.um-faicon-compass:before{content:"\f14e"}.um-faicon-caret-square-o-down:before,.um-faicon-toggle-down:before{content:"\f150"}.um-faicon-caret-square-o-up:before,.um-faicon-toggle-up:before{content:"\f151"}.um-faicon-caret-square-o-right:before,.um-faicon-toggle-right:before{content:"\f152"}.um-faicon-eur:before,.um-faicon-euro:before{content:"\f153"}.um-faicon-gbp:before{content:"\f154"}.um-faicon-dollar:before,.um-faicon-usd:before{content:"\f155"}.um-faicon-inr:before,.um-faicon-rupee:before{content:"\f156"}.um-faicon-cny:before,.um-faicon-jpy:before,.um-faicon-rmb:before,.um-faicon-yen:before{content:"\f157"}.um-faicon-rouble:before,.um-faicon-rub:before,.um-faicon-ruble:before{content:"\f158"}.um-faicon-krw:before,.um-faicon-won:before{content:"\f159"}.um-faicon-bitcoin:before,.um-faicon-btc:before{content:"\f15a"}.um-faicon-file:before{content:"\f15b"}.um-faicon-file-text:before{content:"\f15c"}.um-faicon-sort-alpha-asc:before{content:"\f15d"}.um-faicon-sort-alpha-desc:before{content:"\f15e"}.um-faicon-sort-amount-asc:before{content:"\f160"}.um-faicon-sort-amount-desc:before{content:"\f161"}.um-faicon-sort-numeric-asc:before{content:"\f162"}.um-faicon-sort-numeric-desc:before{content:"\f163"}.um-faicon-thumbs-up:before{content:"\f164"}.um-faicon-thumbs-down:before{content:"\f165"}.um-faicon-youtube-square:before{content:"\f166"}.um-faicon-youtube:before{content:"\f167"}.um-faicon-xing:before{content:"\f168"}.um-faicon-xing-square:before{content:"\f169"}.um-faicon-youtube-play:before{content:"\f16a"}.um-faicon-dropbox:before{content:"\f16b"}.um-faicon-stack-overflow:before{content:"\f16c"}.um-faicon-instagram:before{content:"\f16d"}.um-faicon-flickr:before{content:"\f16e"}.um-faicon-adn:before{content:"\f170"}.um-faicon-bitbucket:before{content:"\f171"}.um-faicon-bitbucket-square:before{content:"\f172"}.um-faicon-tumblr:before{content:"\f173"}.um-faicon-tumblr-square:before{content:"\f174"}.um-faicon-long-arrow-down:before{content:"\f175"}.um-faicon-long-arrow-up:before{content:"\f176"}.um-faicon-long-arrow-left:before{content:"\f177"}.um-faicon-long-arrow-right:before{content:"\f178"}.um-faicon-apple:before{content:"\f179"}.um-faicon-windows:before{content:"\f17a"}.um-faicon-android:before{content:"\f17b"}.um-faicon-linux:before{content:"\f17c"}.um-faicon-dribbble:before{content:"\f17d"}.um-faicon-skype:before{content:"\f17e"}.um-faicon-foursquare:before{content:"\f180"}.um-faicon-trello:before{content:"\f181"}.um-faicon-female:before{content:"\f182"}.um-faicon-male:before{content:"\f183"}.um-faicon-gittip:before{content:"\f184"}.um-faicon-sun-o:before{content:"\f185"}.um-faicon-moon-o:before{content:"\f186"}.um-faicon-archive:before{content:"\f187"}.um-faicon-bug:before{content:"\f188"}.um-faicon-vk:before{content:"\f189"}.um-faicon-weibo:before{content:"\f18a"}.um-faicon-renren:before{content:"\f18b"}.um-faicon-pagelines:before{content:"\f18c"}.um-faicon-stack-exchange:before{content:"\f18d"}.um-faicon-arrow-circle-o-right:before{content:"\f18e"}.um-faicon-arrow-circle-o-left:before{content:"\f190"}.um-faicon-caret-square-o-left:before,.um-faicon-toggle-left:before{content:"\f191"}.um-faicon-dot-circle-o:before{content:"\f192"}.um-faicon-wheelchair:before{content:"\f193"}.um-faicon-vimeo-square:before{content:"\f194"}.um-faicon-try:before,.um-faicon-turkish-lira:before{content:"\f195"}.um-faicon-plus-square-o:before{content:"\f196"}.um-faicon-space-shuttle:before{content:"\f197"}.um-faicon-slack:before{content:"\f198"}.um-faicon-envelope-square:before{content:"\f199"}.um-faicon-wordpress:before{content:"\f19a"}.um-faicon-openid:before{content:"\f19b"}.um-faicon-bank:before,.um-faicon-institution:before,.um-faicon-university:before{content:"\f19c"}.um-faicon-graduation-cap:before,.um-faicon-mortar-board:before{content:"\f19d"}.um-faicon-yahoo:before{content:"\f19e"}.um-faicon-google:before{content:"\f1a0"}.um-faicon-reddit:before{content:"\f1a1"}.um-faicon-reddit-square:before{content:"\f1a2"}.um-faicon-stumbleupon-circle:before{content:"\f1a3"}.um-faicon-stumbleupon:before{content:"\f1a4"}.um-faicon-delicious:before{content:"\f1a5"}.um-faicon-digg:before{content:"\f1a6"}.um-faicon-pied-piper:before{content:"\f1a7"}.um-faicon-pied-piper-alt:before{content:"\f1a8"}.um-faicon-drupal:before{content:"\f1a9"}.um-faicon-joomla:before{content:"\f1aa"}.um-faicon-language:before{content:"\f1ab"}.um-faicon-fax:before{content:"\f1ac"}.um-faicon-building:before{content:"\f1ad"}.um-faicon-child:before{content:"\f1ae"}.um-faicon-paw:before{content:"\f1b0"}.um-faicon-spoon:before{content:"\f1b1"}.um-faicon-cube:before{content:"\f1b2"}.um-faicon-cubes:before{content:"\f1b3"}.um-faicon-behance:before{content:"\f1b4"}.um-faicon-behance-square:before{content:"\f1b5"}.um-faicon-steam:before{content:"\f1b6"}.um-faicon-steam-square:before{content:"\f1b7"}.um-faicon-recycle:before{content:"\f1b8"}.um-faicon-automobile:before,.um-faicon-car:before{content:"\f1b9"}.um-faicon-cab:before,.um-faicon-taxi:before{content:"\f1ba"}.um-faicon-tree:before{content:"\f1bb"}.um-faicon-spotify:before{content:"\f1bc"}.um-faicon-deviantart:before{content:"\f1bd"}.um-faicon-soundcloud:before{content:"\f1be"}.um-faicon-database:before{content:"\f1c0"}.um-faicon-file-pdf-o:before{content:"\f1c1"}.um-faicon-file-word-o:before{content:"\f1c2"}.um-faicon-file-excel-o:before{content:"\f1c3"}.um-faicon-file-powerpoint-o:before{content:"\f1c4"}.um-faicon-file-image-o:before,.um-faicon-file-photo-o:before,.um-faicon-file-picture-o:before{content:"\f1c5"}.um-faicon-file-archive-o:before,.um-faicon-file-zip-o:before{content:"\f1c6"}.um-faicon-file-audio-o:before,.um-faicon-file-sound-o:before{content:"\f1c7"}.um-faicon-file-movie-o:before,.um-faicon-file-video-o:before{content:"\f1c8"}.um-faicon-file-code-o:before{content:"\f1c9"}.um-faicon-vine:before{content:"\f1ca"}.um-faicon-codepen:before{content:"\f1cb"}.um-faicon-jsfiddle:before{content:"\f1cc"}.um-faicon-life-bouy:before,.um-faicon-life-buoy:before,.um-faicon-life-ring:before,.um-faicon-life-saver:before,.um-faicon-support:before{content:"\f1cd"}.um-faicon-circle-o-notch:before{content:"\f1ce"}.um-faicon-ra:before,.um-faicon-rebel:before{content:"\f1d0"}.um-faicon-empire:before,.um-faicon-ge:before{content:"\f1d1"}.um-faicon-git-square:before{content:"\f1d2"}.um-faicon-git:before{content:"\f1d3"}.um-faicon-hacker-news:before{content:"\f1d4"}.um-faicon-tencent-weibo:before{content:"\f1d5"}.um-faicon-qq:before{content:"\f1d6"}.um-faicon-wechat:before,.um-faicon-weixin:before{content:"\f1d7"}.um-faicon-paper-plane:before,.um-faicon-send:before{content:"\f1d8"}.um-faicon-paper-plane-o:before,.um-faicon-send-o:before{content:"\f1d9"}.um-faicon-history:before{content:"\f1da"}.um-faicon-circle-thin:before{content:"\f1db"}.um-faicon-header:before{content:"\f1dc"}.um-faicon-paragraph:before{content:"\f1dd"}.um-faicon-sliders:before{content:"\f1de"}.um-faicon-share-alt:before{content:"\f1e0"}.um-faicon-share-alt-square:before{content:"\f1e1"}.um-faicon-bomb:before{content:"\f1e2"}.um-faicon-futbol-o:before,.um-faicon-soccer-ball-o:before{content:"\f1e3"}.um-faicon-tty:before{content:"\f1e4"}.um-faicon-binoculars:before{content:"\f1e5"}.um-faicon-plug:before{content:"\f1e6"}.um-faicon-slideshare:before{content:"\f1e7"}.um-faicon-twitch:before{content:"\f1e8"}.um-faicon-yelp:before{content:"\f1e9"}.um-faicon-newspaper-o:before{content:"\f1ea"}.um-faicon-wifi:before{content:"\f1eb"}.um-faicon-calculator:before{content:"\f1ec"}.um-faicon-paypal:before{content:"\f1ed"}.um-faicon-google-wallet:before{content:"\f1ee"}.um-faicon-cc-visa:before{content:"\f1f0"}.um-faicon-cc-mastercard:before{content:"\f1f1"}.um-faicon-cc-discover:before{content:"\f1f2"}.um-faicon-cc-amex:before{content:"\f1f3"}.um-faicon-cc-paypal:before{content:"\f1f4"}.um-faicon-cc-stripe:before{content:"\f1f5"}.um-faicon-bell-slash:before{content:"\f1f6"}.um-faicon-bell-slash-o:before{content:"\f1f7"}.um-faicon-trash:before{content:"\f1f8"}.um-faicon-copyright:before{content:"\f1f9"}.um-faicon-at:before{content:"\f1fa"}.um-faicon-eyedropper:before{content:"\f1fb"}.um-faicon-paint-brush:before{content:"\f1fc"}.um-faicon-birthday-cake:before{content:"\f1fd"}.um-faicon-area-chart:before{content:"\f1fe"}.um-faicon-pie-chart:before{content:"\f200"}.um-faicon-line-chart:before{content:"\f201"}.um-faicon-lastfm:before{content:"\f202"}.um-faicon-lastfm-square:before{content:"\f203"}.um-faicon-toggle-off:before{content:"\f204"}.um-faicon-toggle-on:before{content:"\f205"}.um-faicon-bicycle:before{content:"\f206"}.um-faicon-bus:before{content:"\f207"}.um-faicon-ioxhost:before{content:"\f208"}.um-faicon-angellist:before{content:"\f209"}.um-faicon-cc:before{content:"\f20a"}.um-faicon-ils:before,.um-faicon-shekel:before,.um-faicon-sheqel:before{content:"\f20b"}.um-faicon-meanpath:before{content:"\f20c"}@-moz-keyframes um-faicon-spin{0%{-moz-transform:rotate(0)}100%{-moz-transform:rotate(359deg)}}@-webkit-keyframes um-faicon-spin{0%{-webkit-transform:rotate(0)}100%{-webkit-transform:rotate(359deg)}}@-o-keyframes um-faicon-spin{0%{-o-transform:rotate(0)}100%{-o-transform:rotate(359deg)}}@-ms-keyframes um-faicon-spin{0%{-ms-transform:rotate(0)}100%{-ms-transform:rotate(359deg)}}@keyframes um-faicon-spin{0%{transform:rotate(0)}100%{transform:rotate(359deg)}} \ No newline at end of file diff --git a/assets/css/um-fonticons-ii.css b/assets/libs/legacy/fonticons/fonticons-ii.css similarity index 99% rename from assets/css/um-fonticons-ii.css rename to assets/libs/legacy/fonticons/fonticons-ii.css index c8fad3f5..7d418c52 100644 --- a/assets/css/um-fonticons-ii.css +++ b/assets/libs/legacy/fonticons/fonticons-ii.css @@ -2,11 +2,11 @@ @font-face { font-family: "Ionicons"; - src:url("../font/ionicons.eot?v=2.0.0"); - src:url("../font/ionicons.eot?v=2.0.0#iefix") format("embedded-opentype"), - url("../font/ionicons.woff?v=2.0.0") format("woff"), - url("../font/ionicons.ttf?v=2.0.0") format("truetype"), - url("../font/ionicons.svg?v=2.0.0#Ionicons") format("svg"); + src:url("font/ionicons.eot?v=2.0.0"); + src:url("font/ionicons.eot?v=2.0.0#iefix") format("embedded-opentype"), + url("font/ionicons.woff?v=2.0.0") format("woff"), + url("font/ionicons.ttf?v=2.0.0") format("truetype"), + url("font/ionicons.svg?v=2.0.0#Ionicons") format("svg"); font-display: swap; font-weight: normal; font-style: normal; @@ -1489,4 +1489,4 @@ .um-icon-wrench:before { content: "\f2ba"; } -.um-icon-xbox:before { content: "\f30c"; } \ No newline at end of file +.um-icon-xbox:before { content: "\f30c"; } diff --git a/assets/libs/legacy/fonticons/fonticons-ii.min.css b/assets/libs/legacy/fonticons/fonticons-ii.min.css new file mode 100644 index 00000000..fc636b95 --- /dev/null +++ b/assets/libs/legacy/fonticons/fonticons-ii.min.css @@ -0,0 +1 @@ +@charset "UTF-8";@font-face{font-family:Ionicons;src:url(font/ionicons.eot?v=2.0.0);src:url(font/ionicons.eot?v=2.0.0#iefix) format("embedded-opentype"),url(font/ionicons.woff?v=2.0.0) format("woff"),url(font/ionicons.ttf?v=2.0.0) format("truetype"),url(font/ionicons.svg?v=2.0.0#Ionicons) format("svg");font-display:swap;font-weight:400;font-style:normal}[class*=" um-icon-"]:before,[class^=um-icon-]:before{font-family:Ionicons!important;font-style:normal!important;font-weight:400!important;font-variant:normal!important;text-transform:none!important;speak:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.um-icon-alert:before{content:"\f101"}.um-icon-alert-circled:before{content:"\f100"}.um-icon-android-add:before{content:"\f2c7"}.um-icon-android-add-circle:before{content:"\f359"}.um-icon-android-alarm-clock:before{content:"\f35a"}.um-icon-android-alert:before{content:"\f35b"}.um-icon-android-apps:before{content:"\f35c"}.um-icon-android-archive:before{content:"\f2c9"}.um-icon-android-arrow-back:before{content:"\f2ca"}.um-icon-android-arrow-down:before{content:"\f35d"}.um-icon-android-arrow-dropdown:before{content:"\f35f"}.um-icon-android-arrow-dropdown-circle:before{content:"\f35e"}.um-icon-android-arrow-dropleft:before{content:"\f361"}.um-icon-android-arrow-dropleft-circle:before{content:"\f360"}.um-icon-android-arrow-dropright:before{content:"\f363"}.um-icon-android-arrow-dropright-circle:before{content:"\f362"}.um-icon-android-arrow-dropup:before{content:"\f365"}.um-icon-android-arrow-dropup-circle:before{content:"\f364"}.um-icon-android-arrow-forward:before{content:"\f30f"}.um-icon-android-arrow-up:before{content:"\f366"}.um-icon-android-attach:before{content:"\f367"}.um-icon-android-bar:before{content:"\f368"}.um-icon-android-bicycle:before{content:"\f369"}.um-icon-android-boat:before{content:"\f36a"}.um-icon-android-bookmark:before{content:"\f36b"}.um-icon-android-bulb:before{content:"\f36c"}.um-icon-android-bus:before{content:"\f36d"}.um-icon-android-calendar:before{content:"\f2d1"}.um-icon-android-call:before{content:"\f2d2"}.um-icon-android-camera:before{content:"\f2d3"}.um-icon-android-cancel:before{content:"\f36e"}.um-icon-android-car:before{content:"\f36f"}.um-icon-android-cart:before{content:"\f370"}.um-icon-android-chat:before{content:"\f2d4"}.um-icon-android-checkbox:before{content:"\f374"}.um-icon-android-checkbox-blank:before{content:"\f371"}.um-icon-android-checkbox-outline:before{content:"\f373"}.um-icon-android-checkbox-outline-blank:before{content:"\f372"}.um-icon-android-checkmark-circle:before{content:"\f375"}.um-icon-android-clipboard:before{content:"\f376"}.um-icon-android-close:before{content:"\f2d7"}.um-icon-android-cloud:before{content:"\f37a"}.um-icon-android-cloud-circle:before{content:"\f377"}.um-icon-android-cloud-done:before{content:"\f378"}.um-icon-android-cloud-outline:before{content:"\f379"}.um-icon-android-color-palette:before{content:"\f37b"}.um-icon-android-compass:before{content:"\f37c"}.um-icon-android-contact:before{content:"\f2d8"}.um-icon-android-contacts:before{content:"\f2d9"}.um-icon-android-contract:before{content:"\f37d"}.um-icon-android-create:before{content:"\f37e"}.um-icon-android-delete:before{content:"\f37f"}.um-icon-android-desktop:before{content:"\f380"}.um-icon-android-document:before{content:"\f381"}.um-icon-android-done:before{content:"\f383"}.um-icon-android-done-all:before{content:"\f382"}.um-icon-android-download:before{content:"\f2dd"}.um-icon-android-drafts:before{content:"\f384"}.um-icon-android-exit:before{content:"\f385"}.um-icon-android-expand:before{content:"\f386"}.um-icon-android-favorite:before{content:"\f388"}.um-icon-android-favorite-outline:before{content:"\f387"}.um-icon-android-film:before{content:"\f389"}.um-icon-android-folder:before{content:"\f2e0"}.um-icon-android-folder-open:before{content:"\f38a"}.um-icon-android-funnel:before{content:"\f38b"}.um-icon-android-globe:before{content:"\f38c"}.um-icon-android-hand:before{content:"\f2e3"}.um-icon-android-hangout:before{content:"\f38d"}.um-icon-android-happy:before{content:"\f38e"}.um-icon-android-home:before{content:"\f38f"}.um-icon-android-image:before{content:"\f2e4"}.um-icon-android-laptop:before{content:"\f390"}.um-icon-android-list:before{content:"\f391"}.um-icon-android-locate:before{content:"\f2e9"}.um-icon-android-lock:before{content:"\f392"}.um-icon-android-mail:before{content:"\f2eb"}.um-icon-android-map:before{content:"\f393"}.um-icon-android-menu:before{content:"\f394"}.um-icon-android-microphone:before{content:"\f2ec"}.um-icon-android-microphone-off:before{content:"\f395"}.um-icon-android-more-horizontal:before{content:"\f396"}.um-icon-android-more-vertical:before{content:"\f397"}.um-icon-android-navigate:before{content:"\f398"}.um-icon-android-notifications:before{content:"\f39b"}.um-icon-android-notifications-none:before{content:"\f399"}.um-icon-android-notifications-off:before{content:"\f39a"}.um-icon-android-open:before{content:"\f39c"}.um-icon-android-options:before{content:"\f39d"}.um-icon-android-people:before{content:"\f39e"}.um-icon-android-person:before{content:"\f3a0"}.um-icon-android-person-add:before{content:"\f39f"}.um-icon-android-phone-landscape:before{content:"\f3a1"}.um-icon-android-phone-portrait:before{content:"\f3a2"}.um-icon-android-pin:before{content:"\f3a3"}.um-icon-android-plane:before{content:"\f3a4"}.um-icon-android-playstore:before{content:"\f2f0"}.um-icon-android-print:before{content:"\f3a5"}.um-icon-android-radio-button-off:before{content:"\f3a6"}.um-icon-android-radio-button-on:before{content:"\f3a7"}.um-icon-android-refresh:before{content:"\f3a8"}.um-icon-android-remove:before{content:"\f2f4"}.um-icon-android-remove-circle:before{content:"\f3a9"}.um-icon-android-restaurant:before{content:"\f3aa"}.um-icon-android-sad:before{content:"\f3ab"}.um-icon-android-search:before{content:"\f2f5"}.um-icon-android-send:before{content:"\f2f6"}.um-icon-android-settings:before{content:"\f2f7"}.um-icon-android-share:before{content:"\f2f8"}.um-icon-android-share-alt:before{content:"\f3ac"}.um-icon-android-star:before{content:"\f2fc"}.um-icon-android-star-half:before{content:"\f3ad"}.um-icon-android-star-outline:before{content:"\f3ae"}.um-icon-android-stopwatch:before{content:"\f2fd"}.um-icon-android-subway:before{content:"\f3af"}.um-icon-android-sunny:before{content:"\f3b0"}.um-icon-android-sync:before{content:"\f3b1"}.um-icon-android-textsms:before{content:"\f3b2"}.um-icon-android-time:before{content:"\f3b3"}.um-icon-android-train:before{content:"\f3b4"}.um-icon-android-unlock:before{content:"\f3b5"}.um-icon-android-upload:before{content:"\f3b6"}.um-icon-android-volume-down:before{content:"\f3b7"}.um-icon-android-volume-mute:before{content:"\f3b8"}.um-icon-android-volume-off:before{content:"\f3b9"}.um-icon-android-volume-up:before{content:"\f3ba"}.um-icon-android-walk:before{content:"\f3bb"}.um-icon-android-warning:before{content:"\f3bc"}.um-icon-android-watch:before{content:"\f3bd"}.um-icon-android-wifi:before{content:"\f305"}.um-icon-aperture:before{content:"\f313"}.um-icon-archive:before{content:"\f102"}.um-icon-arrow-down-a:before{content:"\f103"}.um-icon-arrow-down-b:before{content:"\f104"}.um-icon-arrow-down-c:before{content:"\f105"}.um-icon-arrow-expand:before{content:"\f25e"}.um-icon-arrow-graph-down-left:before{content:"\f25f"}.um-icon-arrow-graph-down-right:before{content:"\f260"}.um-icon-arrow-graph-up-left:before{content:"\f261"}.um-icon-arrow-graph-up-right:before{content:"\f262"}.um-icon-arrow-left-a:before{content:"\f106"}.um-icon-arrow-left-b:before{content:"\f107"}.um-icon-arrow-left-c:before{content:"\f108"}.um-icon-arrow-move:before{content:"\f263"}.um-icon-arrow-resize:before{content:"\f264"}.um-icon-arrow-return-left:before{content:"\f265"}.um-icon-arrow-return-right:before{content:"\f266"}.um-icon-arrow-right-a:before{content:"\f109"}.um-icon-arrow-right-b:before{content:"\f10a"}.um-icon-arrow-right-c:before{content:"\f10b"}.um-icon-arrow-shrink:before{content:"\f267"}.um-icon-arrow-swap:before{content:"\f268"}.um-icon-arrow-up-a:before{content:"\f10c"}.um-icon-arrow-up-b:before{content:"\f10d"}.um-icon-arrow-up-c:before{content:"\f10e"}.um-icon-asterisk:before{content:"\f314"}.um-icon-at:before{content:"\f10f"}.um-icon-backspace:before{content:"\f3bf"}.um-icon-backspace-outline:before{content:"\f3be"}.um-icon-bag:before{content:"\f110"}.um-icon-battery-charging:before{content:"\f111"}.um-icon-battery-empty:before{content:"\f112"}.um-icon-battery-full:before{content:"\f113"}.um-icon-battery-half:before{content:"\f114"}.um-icon-battery-low:before{content:"\f115"}.um-icon-beaker:before{content:"\f269"}.um-icon-beer:before{content:"\f26a"}.um-icon-bluetooth:before{content:"\f116"}.um-icon-bonfire:before{content:"\f315"}.um-icon-bookmark:before{content:"\f26b"}.um-icon-bowtie:before{content:"\f3c0"}.um-icon-briefcase:before{content:"\f26c"}.um-icon-bug:before{content:"\f2be"}.um-icon-calculator:before{content:"\f26d"}.um-icon-calendar:before{content:"\f117"}.um-icon-camera:before{content:"\f118"}.um-icon-card:before{content:"\f119"}.um-icon-cash:before{content:"\f316"}.um-icon-chatbox:before{content:"\f11b"}.um-icon-chatbox-working:before{content:"\f11a"}.um-icon-chatboxes:before{content:"\f11c"}.um-icon-chatbubble:before{content:"\f11e"}.um-icon-chatbubble-working:before{content:"\f11d"}.um-icon-chatbubbles:before{content:"\f11f"}.um-icon-checkmark:before{content:"\f122"}.um-icon-checkmark-circled:before{content:"\f120"}.um-icon-checkmark-round:before{content:"\f121"}.um-icon-chevron-down:before{content:"\f123"}.um-icon-chevron-left:before{content:"\f124"}.um-icon-chevron-right:before{content:"\f125"}.um-icon-chevron-up:before{content:"\f126"}.um-icon-clipboard:before{content:"\f127"}.um-icon-clock:before{content:"\f26e"}.um-icon-close:before{content:"\f12a"}.um-icon-close-circled:before{content:"\f128"}.um-icon-close-round:before{content:"\f129"}.um-icon-closed-captioning:before{content:"\f317"}.um-icon-cloud:before{content:"\f12b"}.um-icon-code:before{content:"\f271"}.um-icon-code-download:before{content:"\f26f"}.um-icon-code-working:before{content:"\f270"}.um-icon-coffee:before{content:"\f272"}.um-icon-compass:before{content:"\f273"}.um-icon-compose:before{content:"\f12c"}.um-icon-connection-bars:before{content:"\f274"}.um-icon-contrast:before{content:"\f275"}.um-icon-crop:before{content:"\f3c1"}.um-icon-cube:before{content:"\f318"}.um-icon-disc:before{content:"\f12d"}.um-icon-document:before{content:"\f12f"}.um-icon-document-text:before{content:"\f12e"}.um-icon-drag:before{content:"\f130"}.um-icon-earth:before{content:"\f276"}.um-icon-easel:before{content:"\f3c2"}.um-icon-edit:before{content:"\f2bf"}.um-icon-egg:before{content:"\f277"}.um-icon-eject:before{content:"\f131"}.um-icon-email:before{content:"\f132"}.um-icon-email-unread:before{content:"\f3c3"}.um-icon-erlenmeyer-flask:before{content:"\f3c5"}.um-icon-erlenmeyer-flask-bubbles:before{content:"\f3c4"}.um-icon-eye:before{content:"\f133"}.um-icon-eye-disabled:before{content:"\f306"}.um-icon-female:before{content:"\f278"}.um-icon-filing:before{content:"\f134"}.um-icon-film-marker:before{content:"\f135"}.um-icon-fireball:before{content:"\f319"}.um-icon-flag:before{content:"\f279"}.um-icon-flame:before{content:"\f31a"}.um-icon-flash:before{content:"\f137"}.um-icon-flash-off:before{content:"\f136"}.um-icon-folder:before{content:"\f139"}.um-icon-fork:before{content:"\f27a"}.um-icon-fork-repo:before{content:"\f2c0"}.um-icon-forward:before{content:"\f13a"}.um-icon-funnel:before{content:"\f31b"}.um-icon-gear-a:before{content:"\f13d"}.um-icon-gear-b:before{content:"\f13e"}.um-icon-grid:before{content:"\f13f"}.um-icon-hammer:before{content:"\f27b"}.um-icon-happy:before{content:"\f31c"}.um-icon-happy-outline:before{content:"\f3c6"}.um-icon-headphone:before{content:"\f140"}.um-icon-heart:before{content:"\f141"}.um-icon-heart-broken:before{content:"\f31d"}.um-icon-help:before{content:"\f143"}.um-icon-help-buoy:before{content:"\f27c"}.um-icon-help-circled:before{content:"\f142"}.um-icon-home:before{content:"\f144"}.um-icon-icecream:before{content:"\f27d"}.um-icon-image:before{content:"\f147"}.um-icon-images:before{content:"\f148"}.um-icon-information:before{content:"\f14a"}.um-icon-information-circled:before{content:"\f149"}.um-icon-ionic:before{content:"\f14b"}.um-icon-ios-alarm:before{content:"\f3c8"}.um-icon-ios-alarm-outline:before{content:"\f3c7"}.um-icon-ios-albums:before{content:"\f3ca"}.um-icon-ios-albums-outline:before{content:"\f3c9"}.um-icon-ios-americanfootball:before{content:"\f3cc"}.um-icon-ios-americanfootball-outline:before{content:"\f3cb"}.um-icon-ios-analytics:before{content:"\f3ce"}.um-icon-ios-analytics-outline:before{content:"\f3cd"}.um-icon-ios-arrow-back:before{content:"\f3cf"}.um-icon-ios-arrow-down:before{content:"\f3d0"}.um-icon-ios-arrow-forward:before{content:"\f3d1"}.um-icon-ios-arrow-left:before{content:"\f3d2"}.um-icon-ios-arrow-right:before{content:"\f3d3"}.um-icon-ios-arrow-thin-down:before{content:"\f3d4"}.um-icon-ios-arrow-thin-left:before{content:"\f3d5"}.um-icon-ios-arrow-thin-right:before{content:"\f3d6"}.um-icon-ios-arrow-thin-up:before{content:"\f3d7"}.um-icon-ios-arrow-up:before{content:"\f3d8"}.um-icon-ios-at:before{content:"\f3da"}.um-icon-ios-at-outline:before{content:"\f3d9"}.um-icon-ios-barcode:before{content:"\f3dc"}.um-icon-ios-barcode-outline:before{content:"\f3db"}.um-icon-ios-baseball:before{content:"\f3de"}.um-icon-ios-baseball-outline:before{content:"\f3dd"}.um-icon-ios-basketball:before{content:"\f3e0"}.um-icon-ios-basketball-outline:before{content:"\f3df"}.um-icon-ios-bell:before{content:"\f3e2"}.um-icon-ios-bell-outline:before{content:"\f3e1"}.um-icon-ios-body:before{content:"\f3e4"}.um-icon-ios-body-outline:before{content:"\f3e3"}.um-icon-ios-bolt:before{content:"\f3e6"}.um-icon-ios-bolt-outline:before{content:"\f3e5"}.um-icon-ios-book:before{content:"\f3e8"}.um-icon-ios-book-outline:before{content:"\f3e7"}.um-icon-ios-bookmarks:before{content:"\f3ea"}.um-icon-ios-bookmarks-outline:before{content:"\f3e9"}.um-icon-ios-box:before{content:"\f3ec"}.um-icon-ios-box-outline:before{content:"\f3eb"}.um-icon-ios-briefcase:before{content:"\f3ee"}.um-icon-ios-briefcase-outline:before{content:"\f3ed"}.um-icon-ios-browsers:before{content:"\f3f0"}.um-icon-ios-browsers-outline:before{content:"\f3ef"}.um-icon-ios-calculator:before{content:"\f3f2"}.um-icon-ios-calculator-outline:before{content:"\f3f1"}.um-icon-ios-calendar:before{content:"\f3f4"}.um-icon-ios-calendar-outline:before{content:"\f3f3"}.um-icon-ios-camera:before{content:"\f3f6"}.um-icon-ios-camera-outline:before{content:"\f3f5"}.um-icon-ios-cart:before{content:"\f3f8"}.um-icon-ios-cart-outline:before{content:"\f3f7"}.um-icon-ios-chatboxes:before{content:"\f3fa"}.um-icon-ios-chatboxes-outline:before{content:"\f3f9"}.um-icon-ios-chatbubble:before{content:"\f3fc"}.um-icon-ios-chatbubble-outline:before{content:"\f3fb"}.um-icon-ios-checkmark:before{content:"\f3ff"}.um-icon-ios-checkmark-empty:before{content:"\f3fd"}.um-icon-ios-checkmark-outline:before{content:"\f3fe"}.um-icon-ios-circle-filled:before{content:"\f400"}.um-icon-ios-circle-outline:before{content:"\f401"}.um-icon-ios-clock:before{content:"\f403"}.um-icon-ios-clock-outline:before{content:"\f402"}.um-icon-ios-close:before{content:"\f406"}.um-icon-ios-close-empty:before{content:"\f404"}.um-icon-ios-close-outline:before{content:"\f405"}.um-icon-ios-cloud:before{content:"\f40c"}.um-icon-ios-cloud-download:before{content:"\f408"}.um-icon-ios-cloud-download-outline:before{content:"\f407"}.um-icon-ios-cloud-outline:before{content:"\f409"}.um-icon-ios-cloud-upload:before{content:"\f40b"}.um-icon-ios-cloud-upload-outline:before{content:"\f40a"}.um-icon-ios-cloudy:before{content:"\f410"}.um-icon-ios-cloudy-night:before{content:"\f40e"}.um-icon-ios-cloudy-night-outline:before{content:"\f40d"}.um-icon-ios-cloudy-outline:before{content:"\f40f"}.um-icon-ios-cog:before{content:"\f412"}.um-icon-ios-cog-outline:before{content:"\f411"}.um-icon-ios-color-filter:before{content:"\f414"}.um-icon-ios-color-filter-outline:before{content:"\f413"}.um-icon-ios-color-wand:before{content:"\f416"}.um-icon-ios-color-wand-outline:before{content:"\f415"}.um-icon-ios-compose:before{content:"\f418"}.um-icon-ios-compose-outline:before{content:"\f417"}.um-icon-ios-contact:before{content:"\f41a"}.um-icon-ios-contact-outline:before{content:"\f419"}.um-icon-ios-copy:before{content:"\f41c"}.um-icon-ios-copy-outline:before{content:"\f41b"}.um-icon-ios-crop:before{content:"\f41e"}.um-icon-ios-crop-strong:before{content:"\f41d"}.um-icon-ios-download:before{content:"\f420"}.um-icon-ios-download-outline:before{content:"\f41f"}.um-icon-ios-drag:before{content:"\f421"}.um-icon-ios-email:before{content:"\f423"}.um-icon-ios-email-outline:before{content:"\f422"}.um-icon-ios-eye:before{content:"\f425"}.um-icon-ios-eye-outline:before{content:"\f424"}.um-icon-ios-fastforward:before{content:"\f427"}.um-icon-ios-fastforward-outline:before{content:"\f426"}.um-icon-ios-filing:before{content:"\f429"}.um-icon-ios-filing-outline:before{content:"\f428"}.um-icon-ios-film:before{content:"\f42b"}.um-icon-ios-film-outline:before{content:"\f42a"}.um-icon-ios-flag:before{content:"\f42d"}.um-icon-ios-flag-outline:before{content:"\f42c"}.um-icon-ios-flame:before{content:"\f42f"}.um-icon-ios-flame-outline:before{content:"\f42e"}.um-icon-ios-flask:before{content:"\f431"}.um-icon-ios-flask-outline:before{content:"\f430"}.um-icon-ios-flower:before{content:"\f433"}.um-icon-ios-flower-outline:before{content:"\f432"}.um-icon-ios-folder:before{content:"\f435"}.um-icon-ios-folder-outline:before{content:"\f434"}.um-icon-ios-football:before{content:"\f437"}.um-icon-ios-football-outline:before{content:"\f436"}.um-icon-ios-game-controller-a:before{content:"\f439"}.um-icon-ios-game-controller-a-outline:before{content:"\f438"}.um-icon-ios-game-controller-b:before{content:"\f43b"}.um-icon-ios-game-controller-b-outline:before{content:"\f43a"}.um-icon-ios-gear:before{content:"\f43d"}.um-icon-ios-gear-outline:before{content:"\f43c"}.um-icon-ios-glasses:before{content:"\f43f"}.um-icon-ios-glasses-outline:before{content:"\f43e"}.um-icon-ios-grid-view:before{content:"\f441"}.um-icon-ios-grid-view-outline:before{content:"\f440"}.um-icon-ios-heart:before{content:"\f443"}.um-icon-ios-heart-outline:before{content:"\f442"}.um-icon-ios-help:before{content:"\f446"}.um-icon-ios-help-empty:before{content:"\f444"}.um-icon-ios-help-outline:before{content:"\f445"}.um-icon-ios-home:before{content:"\f448"}.um-icon-ios-home-outline:before{content:"\f447"}.um-icon-ios-infinite:before{content:"\f44a"}.um-icon-ios-infinite-outline:before{content:"\f449"}.um-icon-ios-information:before{content:"\f44d"}.um-icon-ios-information-empty:before{content:"\f44b"}.um-icon-ios-information-outline:before{content:"\f44c"}.um-icon-ios-ionic-outline:before{content:"\f44e"}.um-icon-ios-keypad:before{content:"\f450"}.um-icon-ios-keypad-outline:before{content:"\f44f"}.um-icon-ios-lightbulb:before{content:"\f452"}.um-icon-ios-lightbulb-outline:before{content:"\f451"}.um-icon-ios-list:before{content:"\f454"}.um-icon-ios-list-outline:before{content:"\f453"}.um-icon-ios-location:before{content:"\f456"}.um-icon-ios-location-outline:before{content:"\f455"}.um-icon-ios-locked:before{content:"\f458"}.um-icon-ios-locked-outline:before{content:"\f457"}.um-icon-ios-loop:before{content:"\f45a"}.um-icon-ios-loop-strong:before{content:"\f459"}.um-icon-ios-medical:before{content:"\f45c"}.um-icon-ios-medical-outline:before{content:"\f45b"}.um-icon-ios-medkit:before{content:"\f45e"}.um-icon-ios-medkit-outline:before{content:"\f45d"}.um-icon-ios-mic:before{content:"\f461"}.um-icon-ios-mic-off:before{content:"\f45f"}.um-icon-ios-mic-outline:before{content:"\f460"}.um-icon-ios-minus:before{content:"\f464"}.um-icon-ios-minus-empty:before{content:"\f462"}.um-icon-ios-minus-outline:before{content:"\f463"}.um-icon-ios-monitor:before{content:"\f466"}.um-icon-ios-monitor-outline:before{content:"\f465"}.um-icon-ios-moon:before{content:"\f468"}.um-icon-ios-moon-outline:before{content:"\f467"}.um-icon-ios-more:before{content:"\f46a"}.um-icon-ios-more-outline:before{content:"\f469"}.um-icon-ios-musical-note:before{content:"\f46b"}.um-icon-ios-musical-notes:before{content:"\f46c"}.um-icon-ios-navigate:before{content:"\f46e"}.um-icon-ios-navigate-outline:before{content:"\f46d"}.um-icon-ios-nutrition:before{content:"\f470"}.um-icon-ios-nutrition-outline:before{content:"\f46f"}.um-icon-ios-paper:before{content:"\f472"}.um-icon-ios-paper-outline:before{content:"\f471"}.um-icon-ios-paperplane:before{content:"\f474"}.um-icon-ios-paperplane-outline:before{content:"\f473"}.um-icon-ios-partlysunny:before{content:"\f476"}.um-icon-ios-partlysunny-outline:before{content:"\f475"}.um-icon-ios-pause:before{content:"\f478"}.um-icon-ios-pause-outline:before{content:"\f477"}.um-icon-ios-paw:before{content:"\f47a"}.um-icon-ios-paw-outline:before{content:"\f479"}.um-icon-ios-people:before{content:"\f47c"}.um-icon-ios-people-outline:before{content:"\f47b"}.um-icon-ios-person:before{content:"\f47e"}.um-icon-ios-person-outline:before{content:"\f47d"}.um-icon-ios-personadd:before{content:"\f480"}.um-icon-ios-personadd-outline:before{content:"\f47f"}.um-icon-ios-photos:before{content:"\f482"}.um-icon-ios-photos-outline:before{content:"\f481"}.um-icon-ios-pie:before{content:"\f484"}.um-icon-ios-pie-outline:before{content:"\f483"}.um-icon-ios-pint:before{content:"\f486"}.um-icon-ios-pint-outline:before{content:"\f485"}.um-icon-ios-play:before{content:"\f488"}.um-icon-ios-play-outline:before{content:"\f487"}.um-icon-ios-plus:before{content:"\f48b"}.um-icon-ios-plus-empty:before{content:"\f489"}.um-icon-ios-plus-outline:before{content:"\f48a"}.um-icon-ios-pricetag:before{content:"\f48d"}.um-icon-ios-pricetag-outline:before{content:"\f48c"}.um-icon-ios-pricetags:before{content:"\f48f"}.um-icon-ios-pricetags-outline:before{content:"\f48e"}.um-icon-ios-printer:before{content:"\f491"}.um-icon-ios-printer-outline:before{content:"\f490"}.um-icon-ios-pulse:before{content:"\f493"}.um-icon-ios-pulse-strong:before{content:"\f492"}.um-icon-ios-rainy:before{content:"\f495"}.um-icon-ios-rainy-outline:before{content:"\f494"}.um-icon-ios-recording:before{content:"\f497"}.um-icon-ios-recording-outline:before{content:"\f496"}.um-icon-ios-redo:before{content:"\f499"}.um-icon-ios-redo-outline:before{content:"\f498"}.um-icon-ios-refresh:before{content:"\f49c"}.um-icon-ios-refresh-empty:before{content:"\f49a"}.um-icon-ios-refresh-outline:before{content:"\f49b"}.um-icon-ios-reload:before{content:"\f49d"}.um-icon-ios-reverse-camera:before{content:"\f49f"}.um-icon-ios-reverse-camera-outline:before{content:"\f49e"}.um-icon-ios-rewind:before{content:"\f4a1"}.um-icon-ios-rewind-outline:before{content:"\f4a0"}.um-icon-ios-rose:before{content:"\f4a3"}.um-icon-ios-rose-outline:before{content:"\f4a2"}.um-icon-ios-search:before{content:"\f4a5"}.um-icon-ios-search-strong:before{content:"\f4a4"}.um-icon-ios-settings:before{content:"\f4a7"}.um-icon-ios-settings-strong:before{content:"\f4a6"}.um-icon-ios-shuffle:before{content:"\f4a9"}.um-icon-ios-shuffle-strong:before{content:"\f4a8"}.um-icon-ios-skipbackward:before{content:"\f4ab"}.um-icon-ios-skipbackward-outline:before{content:"\f4aa"}.um-icon-ios-skipforward:before{content:"\f4ad"}.um-icon-ios-skipforward-outline:before{content:"\f4ac"}.um-icon-ios-snowy:before{content:"\f4ae"}.um-icon-ios-speedometer:before{content:"\f4b0"}.um-icon-ios-speedometer-outline:before{content:"\f4af"}.um-icon-ios-star:before{content:"\f4b3"}.um-icon-ios-star-half:before{content:"\f4b1"}.um-icon-ios-star-outline:before{content:"\f4b2"}.um-icon-ios-stopwatch:before{content:"\f4b5"}.um-icon-ios-stopwatch-outline:before{content:"\f4b4"}.um-icon-ios-sunny:before{content:"\f4b7"}.um-icon-ios-sunny-outline:before{content:"\f4b6"}.um-icon-ios-telephone:before{content:"\f4b9"}.um-icon-ios-telephone-outline:before{content:"\f4b8"}.um-icon-ios-tennisball:before{content:"\f4bb"}.um-icon-ios-tennisball-outline:before{content:"\f4ba"}.um-icon-ios-thunderstorm:before{content:"\f4bd"}.um-icon-ios-thunderstorm-outline:before{content:"\f4bc"}.um-icon-ios-time:before{content:"\f4bf"}.um-icon-ios-time-outline:before{content:"\f4be"}.um-icon-ios-timer:before{content:"\f4c1"}.um-icon-ios-timer-outline:before{content:"\f4c0"}.um-icon-ios-toggle:before{content:"\f4c3"}.um-icon-ios-toggle-outline:before{content:"\f4c2"}.um-icon-ios-trash:before{content:"\f4c5"}.um-icon-ios-trash-outline:before{content:"\f4c4"}.um-icon-ios-undo:before{content:"\f4c7"}.um-icon-ios-undo-outline:before{content:"\f4c6"}.um-icon-ios-unlocked:before{content:"\f4c9"}.um-icon-ios-unlocked-outline:before{content:"\f4c8"}.um-icon-ios-upload:before{content:"\f4cb"}.um-icon-ios-upload-outline:before{content:"\f4ca"}.um-icon-ios-videocam:before{content:"\f4cd"}.um-icon-ios-videocam-outline:before{content:"\f4cc"}.um-icon-ios-volume-high:before{content:"\f4ce"}.um-icon-ios-volume-low:before{content:"\f4cf"}.um-icon-ios-wineglass:before{content:"\f4d1"}.um-icon-ios-wineglass-outline:before{content:"\f4d0"}.um-icon-ios-world:before{content:"\f4d3"}.um-icon-ios-world-outline:before{content:"\f4d2"}.um-icon-ipad:before{content:"\f1f9"}.um-icon-iphone:before{content:"\f1fa"}.um-icon-ipod:before{content:"\f1fb"}.um-icon-jet:before{content:"\f295"}.um-icon-key:before{content:"\f296"}.um-icon-knife:before{content:"\f297"}.um-icon-laptop:before{content:"\f1fc"}.um-icon-leaf:before{content:"\f1fd"}.um-icon-levels:before{content:"\f298"}.um-icon-lightbulb:before{content:"\f299"}.um-icon-link:before{content:"\f1fe"}.um-icon-load-a:before{content:"\f29a"}.um-icon-load-b:before{content:"\f29b"}.um-icon-load-c:before{content:"\f29c"}.um-icon-load-d:before{content:"\f29d"}.um-icon-location:before{content:"\f1ff"}.um-icon-lock-combination:before{content:"\f4d4"}.um-icon-locked:before{content:"\f200"}.um-icon-log-in:before{content:"\f29e"}.um-icon-log-out:before{content:"\f29f"}.um-icon-loop:before{content:"\f201"}.um-icon-magnet:before{content:"\f2a0"}.um-icon-male:before{content:"\f2a1"}.um-icon-man:before{content:"\f202"}.um-icon-map:before{content:"\f203"}.um-icon-medkit:before{content:"\f2a2"}.um-icon-merge:before{content:"\f33f"}.um-icon-mic-a:before{content:"\f204"}.um-icon-mic-b:before{content:"\f205"}.um-icon-mic-c:before{content:"\f206"}.um-icon-minus:before{content:"\f209"}.um-icon-minus-circled:before{content:"\f207"}.um-icon-minus-round:before{content:"\f208"}.um-icon-model-s:before{content:"\f2c1"}.um-icon-monitor:before{content:"\f20a"}.um-icon-more:before{content:"\f20b"}.um-icon-mouse:before{content:"\f340"}.um-icon-music-note:before{content:"\f20c"}.um-icon-navicon:before{content:"\f20e"}.um-icon-navicon-round:before{content:"\f20d"}.um-icon-navigate:before{content:"\f2a3"}.um-icon-network:before{content:"\f341"}.um-icon-no-smoking:before{content:"\f2c2"}.um-icon-nuclear:before{content:"\f2a4"}.um-icon-outlet:before{content:"\f342"}.um-icon-paintbrush:before{content:"\f4d5"}.um-icon-paintbucket:before{content:"\f4d6"}.um-icon-paper-airplane:before{content:"\f2c3"}.um-icon-paperclip:before{content:"\f20f"}.um-icon-pause:before{content:"\f210"}.um-icon-person:before{content:"\f213"}.um-icon-person-add:before{content:"\f211"}.um-icon-person-stalker:before{content:"\f212"}.um-icon-pie-graph:before{content:"\f2a5"}.um-icon-pin:before{content:"\f2a6"}.um-icon-pinpoint:before{content:"\f2a7"}.um-icon-pizza:before{content:"\f2a8"}.um-icon-plane:before{content:"\f214"}.um-icon-planet:before{content:"\f343"}.um-icon-play:before{content:"\f215"}.um-icon-playstation:before{content:"\f30a"}.um-icon-plus:before{content:"\f218"}.um-icon-plus-circled:before{content:"\f216"}.um-icon-plus-round:before{content:"\f217"}.um-icon-podium:before{content:"\f344"}.um-icon-pound:before{content:"\f219"}.um-icon-power:before{content:"\f2a9"}.um-icon-pricetag:before{content:"\f2aa"}.um-icon-pricetags:before{content:"\f2ab"}.um-icon-printer:before{content:"\f21a"}.um-icon-pull-request:before{content:"\f345"}.um-icon-qr-scanner:before{content:"\f346"}.um-icon-quote:before{content:"\f347"}.um-icon-radio-waves:before{content:"\f2ac"}.um-icon-record:before{content:"\f21b"}.um-icon-refresh:before{content:"\f21c"}.um-icon-reply:before{content:"\f21e"}.um-icon-reply-all:before{content:"\f21d"}.um-icon-ribbon-a:before{content:"\f348"}.um-icon-ribbon-b:before{content:"\f349"}.um-icon-sad:before{content:"\f34a"}.um-icon-sad-outline:before{content:"\f4d7"}.um-icon-scissors:before{content:"\f34b"}.um-icon-search:before{content:"\f21f"}.um-icon-settings:before{content:"\f2ad"}.um-icon-share:before{content:"\f220"}.um-icon-shuffle:before{content:"\f221"}.um-icon-skip-backward:before{content:"\f222"}.um-icon-skip-forward:before{content:"\f223"}.um-icon-social-android:before{content:"\f225"}.um-icon-social-android-outline:before{content:"\f224"}.um-icon-social-angular:before{content:"\f4d9"}.um-icon-social-angular-outline:before{content:"\f4d8"}.um-icon-social-apple:before{content:"\f227"}.um-icon-social-apple-outline:before{content:"\f226"}.um-icon-social-bitcoin:before{content:"\f2af"}.um-icon-social-bitcoin-outline:before{content:"\f2ae"}.um-icon-social-buffer:before{content:"\f229"}.um-icon-social-buffer-outline:before{content:"\f228"}.um-icon-social-chrome:before{content:"\f4db"}.um-icon-social-chrome-outline:before{content:"\f4da"}.um-icon-social-codepen:before{content:"\f4dd"}.um-icon-social-codepen-outline:before{content:"\f4dc"}.um-icon-social-css3:before{content:"\f4df"}.um-icon-social-css3-outline:before{content:"\f4de"}.um-icon-social-designernews:before{content:"\f22b"}.um-icon-social-designernews-outline:before{content:"\f22a"}.um-icon-social-dribbble:before{content:"\f22d"}.um-icon-social-dribbble-outline:before{content:"\f22c"}.um-icon-social-dropbox:before{content:"\f22f"}.um-icon-social-dropbox-outline:before{content:"\f22e"}.um-icon-social-euro:before{content:"\f4e1"}.um-icon-social-euro-outline:before{content:"\f4e0"}.um-icon-social-facebook:before{content:"\f231"}.um-icon-social-facebook-outline:before{content:"\f230"}.um-icon-social-foursquare:before{content:"\f34d"}.um-icon-social-foursquare-outline:before{content:"\f34c"}.um-icon-social-freebsd-devil:before{content:"\f2c4"}.um-icon-social-github:before{content:"\f233"}.um-icon-social-github-outline:before{content:"\f232"}.um-icon-social-google:before{content:"\f34f"}.um-icon-social-google-outline:before{content:"\f34e"}.um-icon-social-googleplus:before{content:"\f235"}.um-icon-social-googleplus-outline:before{content:"\f234"}.um-icon-social-hackernews:before{content:"\f237"}.um-icon-social-hackernews-outline:before{content:"\f236"}.um-icon-social-html5:before{content:"\f4e3"}.um-icon-social-html5-outline:before{content:"\f4e2"}.um-icon-social-instagram:before{content:"\f351"}.um-icon-social-instagram-outline:before{content:"\f350"}.um-icon-social-javascript:before{content:"\f4e5"}.um-icon-social-javascript-outline:before{content:"\f4e4"}.um-icon-social-linkedin:before{content:"\f239"}.um-icon-social-linkedin-outline:before{content:"\f238"}.um-icon-social-markdown:before{content:"\f4e6"}.um-icon-social-nodejs:before{content:"\f4e7"}.um-icon-social-octocat:before{content:"\f4e8"}.um-icon-social-pinterest:before{content:"\f2b1"}.um-icon-social-pinterest-outline:before{content:"\f2b0"}.um-icon-social-python:before{content:"\f4e9"}.um-icon-social-reddit:before{content:"\f23b"}.um-icon-social-reddit-outline:before{content:"\f23a"}.um-icon-social-rss:before{content:"\f23d"}.um-icon-social-rss-outline:before{content:"\f23c"}.um-icon-social-sass:before{content:"\f4ea"}.um-icon-social-skype:before{content:"\f23f"}.um-icon-social-skype-outline:before{content:"\f23e"}.um-icon-social-snapchat:before{content:"\f4ec"}.um-icon-social-snapchat-outline:before{content:"\f4eb"}.um-icon-social-tumblr:before{content:"\f241"}.um-icon-social-tumblr-outline:before{content:"\f240"}.um-icon-social-tux:before{content:"\f2c5"}.um-icon-social-twitch:before{content:"\f4ee"}.um-icon-social-twitch-outline:before{content:"\f4ed"}.um-icon-social-twitter:before{content:"\f243"}.um-icon-social-twitter-outline:before{content:"\f242"}.um-icon-social-usd:before{content:"\f353"}.um-icon-social-usd-outline:before{content:"\f352"}.um-icon-social-vimeo:before{content:"\f245"}.um-icon-social-vimeo-outline:before{content:"\f244"}.um-icon-social-whatsapp:before{content:"\f4f0"}.um-icon-social-whatsapp-outline:before{content:"\f4ef"}.um-icon-social-windows:before{content:"\f247"}.um-icon-social-windows-outline:before{content:"\f246"}.um-icon-social-wordpress:before{content:"\f249"}.um-icon-social-wordpress-outline:before{content:"\f248"}.um-icon-social-yahoo:before{content:"\f24b"}.um-icon-social-yahoo-outline:before{content:"\f24a"}.um-icon-social-yen:before{content:"\f4f2"}.um-icon-social-yen-outline:before{content:"\f4f1"}.um-icon-social-youtube:before{content:"\f24d"}.um-icon-social-youtube-outline:before{content:"\f24c"}.um-icon-soup-can:before{content:"\f4f4"}.um-icon-soup-can-outline:before{content:"\f4f3"}.um-icon-speakerphone:before{content:"\f2b2"}.um-icon-speedometer:before{content:"\f2b3"}.um-icon-spoon:before{content:"\f2b4"}.um-icon-star:before{content:"\f24e"}.um-icon-stats-bars:before{content:"\f2b5"}.um-icon-steam:before{content:"\f30b"}.um-icon-stop:before{content:"\f24f"}.um-icon-thermometer:before{content:"\f2b6"}.um-icon-thumbsdown:before{content:"\f250"}.um-icon-thumbsup:before{content:"\f251"}.um-icon-toggle:before{content:"\f355"}.um-icon-toggle-filled:before{content:"\f354"}.um-icon-transgender:before{content:"\f4f5"}.um-icon-trash-a:before{content:"\f252"}.um-icon-trash-b:before{content:"\f253"}.um-icon-trophy:before{content:"\f356"}.um-icon-tshirt:before{content:"\f4f7"}.um-icon-tshirt-outline:before{content:"\f4f6"}.um-icon-umbrella:before{content:"\f2b7"}.um-icon-university:before{content:"\f357"}.um-icon-unlocked:before{content:"\f254"}.um-icon-upload:before{content:"\f255"}.um-icon-usb:before{content:"\f2b8"}.um-icon-videocamera:before{content:"\f256"}.um-icon-volume-high:before{content:"\f257"}.um-icon-volume-low:before{content:"\f258"}.um-icon-volume-medium:before{content:"\f259"}.um-icon-volume-mute:before{content:"\f25a"}.um-icon-wand:before{content:"\f358"}.um-icon-waterdrop:before{content:"\f25b"}.um-icon-wifi:before{content:"\f25c"}.um-icon-wineglass:before{content:"\f2b9"}.um-icon-woman:before{content:"\f25d"}.um-icon-wrench:before{content:"\f2ba"}.um-icon-xbox:before{content:"\f30c"} \ No newline at end of file diff --git a/assets/font/raty.eot b/assets/libs/raty/font/raty.eot similarity index 100% rename from assets/font/raty.eot rename to assets/libs/raty/font/raty.eot diff --git a/assets/font/raty.svg b/assets/libs/raty/font/raty.svg similarity index 100% rename from assets/font/raty.svg rename to assets/libs/raty/font/raty.svg diff --git a/assets/font/raty.ttf b/assets/libs/raty/font/raty.ttf similarity index 100% rename from assets/font/raty.ttf rename to assets/libs/raty/font/raty.ttf diff --git a/assets/font/raty.woff b/assets/libs/raty/font/raty.woff similarity index 100% rename from assets/font/raty.woff rename to assets/libs/raty/font/raty.woff diff --git a/assets/css/um-raty.css b/assets/libs/raty/um-raty.css similarity index 72% rename from assets/css/um-raty.css rename to assets/libs/raty/um-raty.css index 7545504b..ecaecfa1 100644 --- a/assets/css/um-raty.css +++ b/assets/libs/raty/um-raty.css @@ -2,11 +2,11 @@ font-family: "raty"; font-style: normal; font-weight: normal; - src: url("../font/raty.eot"); - src: url("../font/raty.eot?#iefix") format("embedded-opentype"); - src: url("../font/raty.svg#raty") format("svg"); - src: url("../font/raty.ttf") format("truetype"); - src: url("../font/raty.woff") format("woff"); + src: url("font/raty.eot"); + src: url("font/raty.eot?#iefix") format("embedded-opentype"); + src: url("font/raty.svg#raty") format("svg"); + src: url("font/raty.ttf") format("truetype"); + src: url("font/raty.woff") format("woff"); font-display: swap; } @@ -38,4 +38,4 @@ .cancel-off-png:before {content: "\e601";} .star-on-png:before {content: "\f005";} .star-off-png:before {content: "\f006";} -.star-half-png:before {content: "\f123";} \ No newline at end of file +.star-half-png:before {content: "\f123";} diff --git a/assets/js/um-raty.js b/assets/libs/raty/um-raty.js similarity index 100% rename from assets/js/um-raty.js rename to assets/libs/raty/um-raty.js diff --git a/assets/libs/raty/um-raty.min.css b/assets/libs/raty/um-raty.min.css new file mode 100644 index 00000000..1ff9ab1b --- /dev/null +++ b/assets/libs/raty/um-raty.min.css @@ -0,0 +1 @@ +@font-face{font-family:raty;font-style:normal;font-weight:400;src:url(font/raty.eot);src:url(font/raty.eot?#iefix) format("embedded-opentype");src:url(font/raty.svg#raty) format("svg");src:url(font/raty.ttf) format("truetype");src:url(font/raty.woff) format("woff");font-display:swap}.cancel-off-png,.cancel-on-png,.star-half-png,.star-off-png,.star-on-png{font-family:raty;font-style:normal;font-weight:400;speak:none;display:inline-block;text-decoration:inherit;width:1em;text-align:center;font-variant:normal;text-transform:none;line-height:1em;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;margin-right:.2em;color:#ccc}.star-half-png,.star-on-png{color:#ffbe32}.cancel-on-png:before{content:"\e600"}.cancel-off-png:before{content:"\e601"}.star-on-png:before{content:"\f005"}.star-off-png:before{content:"\f006"}.star-half-png:before{content:"\f123"} \ No newline at end of file diff --git a/assets/js/um-raty.min.js b/assets/libs/raty/um-raty.min.js similarity index 100% rename from assets/js/um-raty.min.js rename to assets/libs/raty/um-raty.min.js diff --git a/assets/js/select2/i18n/af.js b/assets/libs/select2/i18n/af.js similarity index 100% rename from assets/js/select2/i18n/af.js rename to assets/libs/select2/i18n/af.js diff --git a/assets/js/select2/i18n/ar.js b/assets/libs/select2/i18n/ar.js similarity index 100% rename from assets/js/select2/i18n/ar.js rename to assets/libs/select2/i18n/ar.js diff --git a/assets/js/select2/i18n/az.js b/assets/libs/select2/i18n/az.js similarity index 100% rename from assets/js/select2/i18n/az.js rename to assets/libs/select2/i18n/az.js diff --git a/assets/js/select2/i18n/bg.js b/assets/libs/select2/i18n/bg.js similarity index 100% rename from assets/js/select2/i18n/bg.js rename to assets/libs/select2/i18n/bg.js diff --git a/assets/js/select2/i18n/bn.js b/assets/libs/select2/i18n/bn.js similarity index 100% rename from assets/js/select2/i18n/bn.js rename to assets/libs/select2/i18n/bn.js diff --git a/assets/js/select2/i18n/bs.js b/assets/libs/select2/i18n/bs.js similarity index 100% rename from assets/js/select2/i18n/bs.js rename to assets/libs/select2/i18n/bs.js diff --git a/assets/js/select2/i18n/ca.js b/assets/libs/select2/i18n/ca.js similarity index 100% rename from assets/js/select2/i18n/ca.js rename to assets/libs/select2/i18n/ca.js diff --git a/assets/js/select2/i18n/cs.js b/assets/libs/select2/i18n/cs.js similarity index 100% rename from assets/js/select2/i18n/cs.js rename to assets/libs/select2/i18n/cs.js diff --git a/assets/js/select2/i18n/da.js b/assets/libs/select2/i18n/da.js similarity index 100% rename from assets/js/select2/i18n/da.js rename to assets/libs/select2/i18n/da.js diff --git a/assets/js/select2/i18n/de.js b/assets/libs/select2/i18n/de.js similarity index 100% rename from assets/js/select2/i18n/de.js rename to assets/libs/select2/i18n/de.js diff --git a/assets/js/select2/i18n/dsb.js b/assets/libs/select2/i18n/dsb.js similarity index 100% rename from assets/js/select2/i18n/dsb.js rename to assets/libs/select2/i18n/dsb.js diff --git a/assets/js/select2/i18n/el.js b/assets/libs/select2/i18n/el.js similarity index 100% rename from assets/js/select2/i18n/el.js rename to assets/libs/select2/i18n/el.js diff --git a/assets/js/select2/i18n/en.js b/assets/libs/select2/i18n/en.js similarity index 100% rename from assets/js/select2/i18n/en.js rename to assets/libs/select2/i18n/en.js diff --git a/assets/js/select2/i18n/es.js b/assets/libs/select2/i18n/es.js similarity index 100% rename from assets/js/select2/i18n/es.js rename to assets/libs/select2/i18n/es.js diff --git a/assets/js/select2/i18n/et.js b/assets/libs/select2/i18n/et.js similarity index 100% rename from assets/js/select2/i18n/et.js rename to assets/libs/select2/i18n/et.js diff --git a/assets/js/select2/i18n/eu.js b/assets/libs/select2/i18n/eu.js similarity index 100% rename from assets/js/select2/i18n/eu.js rename to assets/libs/select2/i18n/eu.js diff --git a/assets/js/select2/i18n/fa.js b/assets/libs/select2/i18n/fa.js similarity index 100% rename from assets/js/select2/i18n/fa.js rename to assets/libs/select2/i18n/fa.js diff --git a/assets/js/select2/i18n/fi.js b/assets/libs/select2/i18n/fi.js similarity index 100% rename from assets/js/select2/i18n/fi.js rename to assets/libs/select2/i18n/fi.js diff --git a/assets/js/select2/i18n/fr.js b/assets/libs/select2/i18n/fr.js similarity index 100% rename from assets/js/select2/i18n/fr.js rename to assets/libs/select2/i18n/fr.js diff --git a/assets/js/select2/i18n/gl.js b/assets/libs/select2/i18n/gl.js similarity index 100% rename from assets/js/select2/i18n/gl.js rename to assets/libs/select2/i18n/gl.js diff --git a/assets/js/select2/i18n/he.js b/assets/libs/select2/i18n/he.js similarity index 100% rename from assets/js/select2/i18n/he.js rename to assets/libs/select2/i18n/he.js diff --git a/assets/js/select2/i18n/hi.js b/assets/libs/select2/i18n/hi.js similarity index 100% rename from assets/js/select2/i18n/hi.js rename to assets/libs/select2/i18n/hi.js diff --git a/assets/js/select2/i18n/hr.js b/assets/libs/select2/i18n/hr.js similarity index 100% rename from assets/js/select2/i18n/hr.js rename to assets/libs/select2/i18n/hr.js diff --git a/assets/js/select2/i18n/hsb.js b/assets/libs/select2/i18n/hsb.js similarity index 100% rename from assets/js/select2/i18n/hsb.js rename to assets/libs/select2/i18n/hsb.js diff --git a/assets/js/select2/i18n/hu.js b/assets/libs/select2/i18n/hu.js similarity index 100% rename from assets/js/select2/i18n/hu.js rename to assets/libs/select2/i18n/hu.js diff --git a/assets/js/select2/i18n/hy.js b/assets/libs/select2/i18n/hy.js similarity index 100% rename from assets/js/select2/i18n/hy.js rename to assets/libs/select2/i18n/hy.js diff --git a/assets/js/select2/i18n/id.js b/assets/libs/select2/i18n/id.js similarity index 100% rename from assets/js/select2/i18n/id.js rename to assets/libs/select2/i18n/id.js diff --git a/assets/js/select2/i18n/is.js b/assets/libs/select2/i18n/is.js similarity index 100% rename from assets/js/select2/i18n/is.js rename to assets/libs/select2/i18n/is.js diff --git a/assets/js/select2/i18n/it.js b/assets/libs/select2/i18n/it.js similarity index 100% rename from assets/js/select2/i18n/it.js rename to assets/libs/select2/i18n/it.js diff --git a/assets/js/select2/i18n/ja.js b/assets/libs/select2/i18n/ja.js similarity index 100% rename from assets/js/select2/i18n/ja.js rename to assets/libs/select2/i18n/ja.js diff --git a/assets/js/select2/i18n/ka.js b/assets/libs/select2/i18n/ka.js similarity index 100% rename from assets/js/select2/i18n/ka.js rename to assets/libs/select2/i18n/ka.js diff --git a/assets/js/select2/i18n/km.js b/assets/libs/select2/i18n/km.js similarity index 100% rename from assets/js/select2/i18n/km.js rename to assets/libs/select2/i18n/km.js diff --git a/assets/js/select2/i18n/ko.js b/assets/libs/select2/i18n/ko.js similarity index 100% rename from assets/js/select2/i18n/ko.js rename to assets/libs/select2/i18n/ko.js diff --git a/assets/js/select2/i18n/lt.js b/assets/libs/select2/i18n/lt.js similarity index 100% rename from assets/js/select2/i18n/lt.js rename to assets/libs/select2/i18n/lt.js diff --git a/assets/js/select2/i18n/lv.js b/assets/libs/select2/i18n/lv.js similarity index 100% rename from assets/js/select2/i18n/lv.js rename to assets/libs/select2/i18n/lv.js diff --git a/assets/js/select2/i18n/mk.js b/assets/libs/select2/i18n/mk.js similarity index 100% rename from assets/js/select2/i18n/mk.js rename to assets/libs/select2/i18n/mk.js diff --git a/assets/js/select2/i18n/ms.js b/assets/libs/select2/i18n/ms.js similarity index 100% rename from assets/js/select2/i18n/ms.js rename to assets/libs/select2/i18n/ms.js diff --git a/assets/js/select2/i18n/nb.js b/assets/libs/select2/i18n/nb.js similarity index 100% rename from assets/js/select2/i18n/nb.js rename to assets/libs/select2/i18n/nb.js diff --git a/assets/js/select2/i18n/ne.js b/assets/libs/select2/i18n/ne.js similarity index 100% rename from assets/js/select2/i18n/ne.js rename to assets/libs/select2/i18n/ne.js diff --git a/assets/js/select2/i18n/nl.js b/assets/libs/select2/i18n/nl.js similarity index 100% rename from assets/js/select2/i18n/nl.js rename to assets/libs/select2/i18n/nl.js diff --git a/assets/js/select2/i18n/pl.js b/assets/libs/select2/i18n/pl.js similarity index 100% rename from assets/js/select2/i18n/pl.js rename to assets/libs/select2/i18n/pl.js diff --git a/assets/js/select2/i18n/ps.js b/assets/libs/select2/i18n/ps.js similarity index 100% rename from assets/js/select2/i18n/ps.js rename to assets/libs/select2/i18n/ps.js diff --git a/assets/js/select2/i18n/pt-BR.js b/assets/libs/select2/i18n/pt-BR.js similarity index 100% rename from assets/js/select2/i18n/pt-BR.js rename to assets/libs/select2/i18n/pt-BR.js diff --git a/assets/js/select2/i18n/pt.js b/assets/libs/select2/i18n/pt.js similarity index 100% rename from assets/js/select2/i18n/pt.js rename to assets/libs/select2/i18n/pt.js diff --git a/assets/js/select2/i18n/ro.js b/assets/libs/select2/i18n/ro.js similarity index 100% rename from assets/js/select2/i18n/ro.js rename to assets/libs/select2/i18n/ro.js diff --git a/assets/js/select2/i18n/ru.js b/assets/libs/select2/i18n/ru.js similarity index 100% rename from assets/js/select2/i18n/ru.js rename to assets/libs/select2/i18n/ru.js diff --git a/assets/js/select2/i18n/sk.js b/assets/libs/select2/i18n/sk.js similarity index 100% rename from assets/js/select2/i18n/sk.js rename to assets/libs/select2/i18n/sk.js diff --git a/assets/js/select2/i18n/sl.js b/assets/libs/select2/i18n/sl.js similarity index 100% rename from assets/js/select2/i18n/sl.js rename to assets/libs/select2/i18n/sl.js diff --git a/assets/js/select2/i18n/sq.js b/assets/libs/select2/i18n/sq.js similarity index 100% rename from assets/js/select2/i18n/sq.js rename to assets/libs/select2/i18n/sq.js diff --git a/assets/js/select2/i18n/sr-Cyrl.js b/assets/libs/select2/i18n/sr-Cyrl.js similarity index 100% rename from assets/js/select2/i18n/sr-Cyrl.js rename to assets/libs/select2/i18n/sr-Cyrl.js diff --git a/assets/js/select2/i18n/sr.js b/assets/libs/select2/i18n/sr.js similarity index 100% rename from assets/js/select2/i18n/sr.js rename to assets/libs/select2/i18n/sr.js diff --git a/assets/js/select2/i18n/sv.js b/assets/libs/select2/i18n/sv.js similarity index 100% rename from assets/js/select2/i18n/sv.js rename to assets/libs/select2/i18n/sv.js diff --git a/assets/js/select2/i18n/th.js b/assets/libs/select2/i18n/th.js similarity index 100% rename from assets/js/select2/i18n/th.js rename to assets/libs/select2/i18n/th.js diff --git a/assets/js/select2/i18n/tk.js b/assets/libs/select2/i18n/tk.js similarity index 100% rename from assets/js/select2/i18n/tk.js rename to assets/libs/select2/i18n/tk.js diff --git a/assets/js/select2/i18n/tr.js b/assets/libs/select2/i18n/tr.js similarity index 100% rename from assets/js/select2/i18n/tr.js rename to assets/libs/select2/i18n/tr.js diff --git a/assets/js/select2/i18n/uk.js b/assets/libs/select2/i18n/uk.js similarity index 100% rename from assets/js/select2/i18n/uk.js rename to assets/libs/select2/i18n/uk.js diff --git a/assets/js/select2/i18n/vi.js b/assets/libs/select2/i18n/vi.js similarity index 100% rename from assets/js/select2/i18n/vi.js rename to assets/libs/select2/i18n/vi.js diff --git a/assets/js/select2/i18n/zh-CN.js b/assets/libs/select2/i18n/zh-CN.js similarity index 100% rename from assets/js/select2/i18n/zh-CN.js rename to assets/libs/select2/i18n/zh-CN.js diff --git a/assets/js/select2/i18n/zh-TW.js b/assets/libs/select2/i18n/zh-TW.js similarity index 100% rename from assets/js/select2/i18n/zh-TW.js rename to assets/libs/select2/i18n/zh-TW.js diff --git a/assets/css/select2/select2.css b/assets/libs/select2/select2.css similarity index 100% rename from assets/css/select2/select2.css rename to assets/libs/select2/select2.css diff --git a/assets/js/select2/select2.full.js b/assets/libs/select2/select2.full.js similarity index 100% rename from assets/js/select2/select2.full.js rename to assets/libs/select2/select2.full.js diff --git a/assets/js/select2/select2.full.min.js b/assets/libs/select2/select2.full.min.js similarity index 100% rename from assets/js/select2/select2.full.min.js rename to assets/libs/select2/select2.full.min.js diff --git a/assets/css/select2/select2.min.css b/assets/libs/select2/select2.min.css similarity index 100% rename from assets/css/select2/select2.min.css rename to assets/libs/select2/select2.min.css diff --git a/assets/css/um-tipsy.css b/assets/libs/tipsy/tipsy.css similarity index 100% rename from assets/css/um-tipsy.css rename to assets/libs/tipsy/tipsy.css diff --git a/assets/js/um-tipsy.js b/assets/libs/tipsy/tipsy.js similarity index 100% rename from assets/js/um-tipsy.js rename to assets/libs/tipsy/tipsy.js diff --git a/assets/libs/tipsy/tipsy.min.css b/assets/libs/tipsy/tipsy.min.css new file mode 100644 index 00000000..dc8b0b73 --- /dev/null +++ b/assets/libs/tipsy/tipsy.min.css @@ -0,0 +1 @@ +.tipsy{padding:5px;position:absolute;z-index:9999999999!important}.tipsy-inner{font-size:13px!important;line-height:17px!important;background-color:#333!important;color:#fff!important;max-width:250px!important;padding:6px 10px!important;text-align:left!important;word-wrap:break-word!important;-webkit-font-smoothing:antialiased!important;-moz-osx-font-smoothing:grayscale!important}.tipsy-inner{border-radius:3px;-moz-border-radius:3px;-webkit-border-radius:3px}.tipsy-arrow{position:absolute!important;width:0!important;height:0!important;line-height:0!important;border:5px dashed #333}.tipsy-arrow-n{border-bottom-color:#333!important}.tipsy-arrow-s{border-top-color:#333!important}.tipsy-arrow-e{border-left-color:#333!important}.tipsy-arrow-w{border-right-color:#333!important}.tipsy-n .tipsy-arrow{top:0;left:50%;margin-left:-5px;border-bottom-style:solid;border-top:none;border-left-color:transparent;border-right-color:transparent}.tipsy-nw .tipsy-arrow{top:0;left:10px;border-bottom-style:solid;border-top:none;border-left-color:transparent;border-right-color:transparent}.tipsy-ne .tipsy-arrow{top:0;right:10px;border-bottom-style:solid;border-top:none;border-left-color:transparent;border-right-color:transparent}.tipsy-s .tipsy-arrow{bottom:0;left:50%;margin-left:-5px;border-top-style:solid;border-bottom:none;border-left-color:transparent;border-right-color:transparent}.tipsy-sw .tipsy-arrow{bottom:0;left:10px;border-top-style:solid;border-bottom:none;border-left-color:transparent;border-right-color:transparent}.tipsy-se .tipsy-arrow{bottom:0;right:10px;border-top-style:solid;border-bottom:none;border-left-color:transparent;border-right-color:transparent}.tipsy-e .tipsy-arrow{right:0;top:50%;margin-top:-5px;border-left-style:solid;border-right:none;border-top-color:transparent;border-bottom-color:transparent}.tipsy-w .tipsy-arrow{left:0;top:50%;margin-top:-5px;border-right-style:solid;border-left:none;border-top-color:transparent;border-bottom-color:transparent} \ No newline at end of file diff --git a/assets/js/um-tipsy.min.js b/assets/libs/tipsy/tipsy.min.js similarity index 100% rename from assets/js/um-tipsy.min.js rename to assets/libs/tipsy/tipsy.min.js diff --git a/gulpfile.js b/gulpfile.js index d2a90481..b058b6e0 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -5,7 +5,8 @@ var gulp = require('gulp') , uglify = require('gulp-uglify'), sass = require('gulp-sass'), - rename = require("gulp-rename"); + rename = require('gulp-rename'), + cleanCSS = require( 'gulp-clean-css' ); // task gulp.task( 'default', function ( done ) { @@ -18,5 +19,30 @@ gulp.task( 'default', function ( done ) { .pipe( rename({ suffix: '.min' }) ) .pipe( gulp.dest( 'assets/js/' ) ); + gulp.src(['assets/libs/legacy/fonticons/*.css', '!assets/libs/legacy/fonticons/*.min.css',]) + .pipe( cleanCSS() ) + .pipe( rename( { suffix: '.min' } ) ) + .pipe( gulp.dest( 'assets/libs/legacy/fonticons/' ) ); + + // Raty lib + gulp.src(['assets/libs/raty/*.css', '!assets/libs/raty/*.min.css',]) + .pipe( cleanCSS() ) + .pipe( rename( { suffix: '.min' } ) ) + .pipe( gulp.dest( 'assets/libs/raty/' ) ); + gulp.src(['assets/libs/raty/*.js', '!assets/libs/raty/*.min.js',]) + .pipe( uglify() ) + .pipe( rename({ suffix: '.min' }) ) + .pipe( gulp.dest( 'assets/libs/raty/' ) ); + + // Tipsy lib + gulp.src(['assets/libs/tipsy/*.css', '!assets/libs/tipsy/*.min.css',]) + .pipe( cleanCSS() ) + .pipe( rename( { suffix: '.min' } ) ) + .pipe( gulp.dest( 'assets/libs/tipsy/' ) ); + gulp.src(['assets/libs/tipsy/*.js', '!assets/libs/tipsy/*.min.js',]) + .pipe( uglify() ) + .pipe( rename({ suffix: '.min' }) ) + .pipe( gulp.dest( 'assets/libs/tipsy/' ) ); + done(); }); diff --git a/includes/admin/assets/css/um-admin-forms.css b/includes/admin/assets/css/um-admin-forms.css index 6beb8ecf..cb38c6a5 100644 --- a/includes/admin/assets/css/um-admin-forms.css +++ b/includes/admin/assets/css/um-admin-forms.css @@ -410,3 +410,8 @@ textarea.um-forms-field.um-small-field { text-align: left; margin: 0 10px 0 0; } + +.um-form-table span.um-req { + margin: 0 0 0 4px; + color: #a00; +} diff --git a/includes/admin/assets/js/um-admin-forms.js b/includes/admin/assets/js/um-admin-forms.js index 531919f4..196f58ec 100644 --- a/includes/admin/assets/js/um-admin-forms.js +++ b/includes/admin/assets/js/um-admin-forms.js @@ -1,5 +1,5 @@ function um_admin_init_users_select() { - if ( jQuery('.um-user-select-field:visible').length ) { + if ( jQuery('.um-user-select-field:visible:not(.um-select2-inited)').length ) { function avatarformat( data ) { var option; if ( ! data.id ) { @@ -84,13 +84,15 @@ function um_admin_init_users_select() { templateResult: avatarformat }; - jQuery('.um-user-select-field:visible').each( function() { + let selector = jQuery('.um-user-select-field:visible:not(.um-select2-inited)'); + + selector.each( function() { if ( jQuery(this).hasClass('select2-hidden-accessible') ) { - jQuery(this).select2( 'destroy' ); + jQuery(this).removeClass('um-select2-inited').select2( 'destroy' ); } }); - jQuery('.um-user-select-field:visible').select2( select2_atts ); + selector.addClass('um-select2-inited').select2( select2_atts ); } } diff --git a/includes/admin/class-admin.php b/includes/admin/class-admin.php index c2293a52..ebe23f01 100644 --- a/includes/admin/class-admin.php +++ b/includes/admin/class-admin.php @@ -86,8 +86,10 @@ if ( ! class_exists( 'um\admin\Admin' ) ) { } public function includes() { + $this->enqueue(); $this->notices(); $this->secure(); + $this->site_health(); } function init_variables() { @@ -2041,6 +2043,18 @@ if ( ! class_exists( 'um\admin\Admin' ) ) { return $parent_file; } + /** + * @since 2.6.12 + * + * @return Enqueue + */ + public function enqueue() { + if ( empty( UM()->classes['um\admin\enqueue'] ) ) { + UM()->classes['um\admin\enqueue'] = new Enqueue(); + } + return UM()->classes['um\admin\enqueue']; + } + /** * @since 2.0 * @@ -2064,5 +2078,17 @@ if ( ! class_exists( 'um\admin\Admin' ) ) { } return UM()->classes['um\admin\secure']; } + + /** + * @since 2.6.12 + * + * @return Site_Health + */ + public function site_health() { + if ( empty( UM()->classes['um\admin\site_health'] ) ) { + UM()->classes['um\admin\site_health'] = new Site_Health(); + } + return UM()->classes['um\admin\site_health']; + } } } diff --git a/includes/admin/class-enqueue.php b/includes/admin/class-enqueue.php new file mode 100644 index 00000000..e5bc7bb6 --- /dev/null +++ b/includes/admin/class-enqueue.php @@ -0,0 +1,715 @@ +js_url = UM_URL . 'includes/admin/assets/js/'; + $this->css_url = UM_URL . 'includes/admin/assets/css/'; + + $this->front_js_baseurl = UM_URL . 'assets/js/'; + $this->front_css_baseurl = UM_URL . 'assets/css/'; + + $this->um_cpt_form_screen = false; + + add_action( 'admin_head', array( &$this, 'admin_head' ), 9 ); + + add_action( 'admin_enqueue_scripts', array( &$this, 'admin_enqueue_scripts' ) ); + + add_filter( 'enter_title_here', array( &$this, 'enter_title_here' ) ); + + add_action( 'load-user-new.php', array( &$this, 'enqueue_role_wrapper' ) ); + add_action( 'load-user-edit.php', array( &$this, 'enqueue_role_wrapper' ) ); + + add_action( 'load-post-new.php', array( &$this, 'enqueue_cpt_scripts' ) ); + add_action( 'load-post.php', array( &$this, 'enqueue_cpt_scripts' ) ); + + global $wp_version; + if ( version_compare( $wp_version, '5.8', '>=' ) ) { + add_filter( 'block_categories_all', array( &$this, 'blocks_category' ), 10, 2 ); + } else { + add_filter( 'block_categories', array( &$this, 'blocks_category' ), 10, 2 ); + } + add_action( 'enqueue_block_assets', array( &$this, 'block_editor' ), 11 ); + } + + + /** + * Enqueue Gutenberg Block Editor assets + */ + public function block_editor() { + $suffix = self::get_suffix(); + $this->register_jquery_ui(); + wp_register_style( 'um_members', UM_URL . 'assets/css/um-members.css', array( 'um_ui' ), UM_VERSION ); + if ( is_rtl() ) { + wp_register_style( 'um_members_rtl', UM_URL . 'assets/css/um-members-rtl.css', array( 'um_members' ), UM_VERSION ); + } + wp_register_style( 'um_styles', UM_URL . 'assets/css/um-styles.css', array( 'um_ui', 'um_tipsy', 'um_raty', 'um_fonticons_ii', 'um_fonticons_fa', 'select2' ), UM_VERSION ); + wp_register_style( 'um_profile', UM_URL . 'assets/css/um-profile.css', array(), UM_VERSION ); + wp_register_style( 'um_crop', UM_URL . 'assets/css/um-crop.css', array(), UM_VERSION ); + wp_register_style( 'um_responsive', UM_URL . 'assets/css/um-responsive.css', array( 'um_profile', 'um_crop' ), UM_VERSION ); + wp_register_style( 'um_account', UM_URL . 'assets/css/um-account.css', array(), UM_VERSION ); + wp_register_style( 'um_default_css', UM_URL . 'assets/css/um-old-default.css', array(), UM_VERSION ); + + wp_register_script( 'um_admin_blocks_shortcodes', UM_URL . 'assets/js/um-blocks' . $suffix . '.js', array( 'wp-i18n', 'wp-blocks', 'wp-components' ), UM_VERSION, true ); + wp_set_script_translations( 'um_admin_blocks_shortcodes', 'ultimate-member' ); + + if ( ! empty( UM()->account()->get_tab_fields( 'notifications', array() ) ) ) { + $notifications_enabled = 1; + } else { + $notifications_enabled = 0; + } + + $um_account_settings = array( + 'general' => array( + 'label' => __( 'General', 'ultimate-member' ), + 'enabled' => 1, + ), + 'password' => array( + 'label' => __( 'Password', 'ultimate-member' ), + 'enabled' => UM()->options()->get( 'account_tab_password' ), + ), + 'privacy' => array( + 'label' => __( 'Privacy', 'ultimate-member' ), + 'enabled' => UM()->options()->get( 'account_tab_privacy' ), + ), + 'notifications' => array( + 'label' => __( 'Notifications', 'ultimate-member' ), + 'enabled' => $notifications_enabled, + ), + 'delete' => array( + 'label' => __( 'Delete', 'ultimate-member' ), + 'enabled' => UM()->options()->get( 'account_tab_delete' ), + ), + ); + $um_account_settings = apply_filters( 'um_extend_account_settings', $um_account_settings ); + wp_localize_script( 'um_admin_blocks_shortcodes', 'um_account_settings', $um_account_settings ); + + wp_enqueue_script( 'um_admin_blocks_shortcodes' ); + + wp_register_script( 'um_datetime', UM_URL . 'assets/js/pickadate/picker.js', array( 'jquery' ), UM_VERSION, true ); + wp_register_script( 'um_datetime_date', UM_URL . 'assets/js/pickadate/picker.date.js', array( 'jquery', 'um_datetime' ), UM_VERSION, true ); + wp_register_script( 'um_datetime_time', UM_URL . 'assets/js/pickadate/picker.time.js', array( 'jquery', 'um_datetime' ), UM_VERSION, true ); + wp_register_script( 'um_conditional', UM_URL . 'assets/js/um-conditional' . $suffix . '.js', array( 'jquery', 'wp-hooks' ), UM_VERSION, true ); + wp_register_script( 'um_scripts', UM_URL . 'assets/js/um-scripts' . $suffix . '.js', array( 'jquery', 'wp-util', 'um_conditional', 'um_datetime', 'um_datetime_date', 'um_datetime_time', self::$select2_handle ), UM_VERSION, true ); + $max_upload_size = wp_max_upload_size(); + if ( ! $max_upload_size ) { + $max_upload_size = 0; + } + + $localize_data = apply_filters( + 'um_enqueue_localize_data', + array( + 'max_upload_size' => $max_upload_size, + 'nonce' => wp_create_nonce( 'um-frontend-nonce' ), + ) + ); + wp_localize_script( 'um_scripts', 'um_scripts', $localize_data ); + + wp_register_script( 'um_dropdown', UM_URL . 'assets/js/dropdown' . $suffix . '.js', array( 'jquery' ), UM_VERSION, true ); + wp_register_script( 'um_members', UM_URL . 'assets/js/um-members' . $suffix . '.js', array( 'jquery', 'wp-util', 'jquery-ui-slider', 'um_dropdown', 'wp-hooks', 'jquery-masonry', 'um_scripts' ), UM_VERSION, true ); + + wp_register_script( 'um_account', UM_URL . 'assets/js/um-account' . $suffix . '.js', array( 'jquery', 'wp-hooks' ), UM_VERSION, true ); + wp_register_script( 'um_scrollbar', UM_URL . 'assets/js/simplebar' . $suffix . '.js', array( 'jquery' ), UM_VERSION, true ); + wp_register_script( 'um_crop', UM_URL . 'assets/js/um-crop' . $suffix . '.js', array( 'jquery' ), UM_VERSION, true ); + wp_register_script( 'um_functions', UM_URL . 'assets/js/um-functions' . $suffix . '.js', array( 'jquery', 'jquery-masonry', 'wp-util', 'um_scrollbar' ), UM_VERSION, true ); + wp_register_script( 'um_responsive', UM_URL . 'assets/js/um-responsive' . $suffix . '.js', array( 'jquery', 'um_functions', 'um_crop' ), UM_VERSION, true ); + + // render blocks + wp_enqueue_script( 'um_datetime' ); + wp_enqueue_script( 'um_datetime_date' ); + wp_enqueue_script( 'um_datetime_time' ); + wp_enqueue_script( 'um_conditional' ); + wp_enqueue_script( 'um_dropdown' ); + wp_enqueue_script( 'um_members' ); + wp_enqueue_script( 'um_account' ); + wp_enqueue_script( 'um_scrollbar' ); + wp_enqueue_script( 'um_crop' ); + wp_enqueue_script( 'um_functions' ); + wp_enqueue_script( 'um_responsive' ); + + wp_enqueue_style( 'um_default_css' ); + wp_enqueue_style( 'um_members' ); + wp_enqueue_style( 'um_styles' ); + wp_enqueue_style( 'um_profile' ); + wp_enqueue_style( 'um_crop' ); + wp_enqueue_style( 'um_responsive' ); + wp_enqueue_style( 'um_account' ); + + $custom_css = '.um{opacity: 1;}.um_request_name {display: none !important;}'; + + wp_add_inline_style( 'um_styles', $custom_css ); + } + + + public function enqueue_role_wrapper() { + add_action( 'admin_enqueue_scripts', array( &$this, 'load_role_wrapper' ) ); + } + + + /** + * + */ + public function enqueue_cpt_scripts() { + // phpcs:ignore WordPress.Security.NonceVerification + if ( ( isset( $_GET['post_type'] ) && 'um_form' === sanitize_key( $_GET['post_type'] ) ) || ( isset( $_GET['post'] ) && 'um_form' === get_post_type( absint( $_GET['post'] ) ) ) ) { + $this->um_cpt_form_screen = true; + add_action( 'admin_footer', array( $this, 'admin_footer_scripts' ), 20 ); + } + } + + + /** + * + */ + public function enqueue_frontend_preview_assets() { + $suffix = self::get_suffix(); + + //scripts for FRONTEND PREVIEW + wp_register_script( 'um_jquery_form', $this->front_js_baseurl . 'um-jquery-form' . $suffix . '.js', array( 'jquery' ), UM_VERSION, true ); + wp_register_script( 'um_fileupload', $this->front_js_baseurl . 'um-fileupload.js', array( 'jquery' ), UM_VERSION, true ); + wp_register_script( 'um_crop', $this->front_js_baseurl . 'um-crop' . $suffix . '.js', array( 'jquery' ), UM_VERSION, true ); + wp_register_script( 'um_functions', $this->front_js_baseurl . 'um-functions' . $suffix . '.js', array( 'jquery', 'um_tipsy', 'um_scrollbar' ), UM_VERSION, true ); + + wp_register_script( 'um_datetime', $this->front_js_baseurl . 'pickadate/picker.js', array( 'jquery' ), UM_VERSION, true ); + wp_register_script( 'um_datetime_date', $this->front_js_baseurl . 'pickadate/picker.date.js', array( 'jquery', 'um_datetime' ), UM_VERSION, true ); + wp_register_script( 'um_datetime_time', $this->front_js_baseurl . 'pickadate/picker.time.js', array( 'jquery', 'um_datetime' ), UM_VERSION, true ); + //wp_register_script( 'um_datetime_legacy', $this->front_js_baseurl . 'pickadate/legacy.js', array( 'jquery', 'um_datetime' ), UM_VERSION, true ); + // load a localized version for date/time + $locale = get_locale(); + if ( $locale ) { + if ( file_exists( WP_LANG_DIR . '/plugins/ultimate-member/assets/js/pickadate/' . $locale . '.js' ) ) { + wp_register_script( 'um_datetime_locale', content_url() . '/languages/plugins/ultimate-member/assets/js/pickadate/' . $locale . '.js', array( 'jquery', 'um_datetime' ), UM_VERSION, true ); + } elseif ( file_exists( UM_PATH . 'assets/js/pickadate/translations/' . $locale . '.js' ) ) { + wp_register_script( 'um_datetime_locale', UM_URL . 'assets/js/pickadate/translations/' . $locale . '.js', array( 'jquery', 'um_datetime' ), UM_VERSION, true ); + } + } + + wp_register_script( 'um_scripts', $this->front_js_baseurl . 'um-scripts' . $suffix . '.js', array( 'um_functions', 'um_crop', 'um_raty', self::$select2_handle, 'um_jquery_form', 'um_fileupload', 'um_datetime', 'um_datetime_date', 'um_datetime_time'/*, 'um_datetime_legacy'*/ ), UM_VERSION, true ); + wp_register_script( 'um_responsive', $this->front_js_baseurl . 'um-responsive' . $suffix . '.js', array( 'um_scripts' ), UM_VERSION, true ); + wp_register_script( 'um_modal', $this->front_js_baseurl . 'um-modal' . $suffix . '.js', array( 'um_responsive' ), UM_VERSION, true ); + + wp_register_style( 'um_datetime', $this->front_css_baseurl . 'pickadate/default.css', array(), UM_VERSION ); + wp_register_style( 'um_datetime_date', $this->front_css_baseurl . 'pickadate/default.date.css', array( 'um_datetime' ), UM_VERSION ); + wp_register_style( 'um_datetime_time', $this->front_css_baseurl . 'pickadate/default.time.css', array( 'um_datetime' ), ultimatemember_version ); + + wp_register_style( 'um_scrollbar', $this->front_css_baseurl . 'simplebar.css', array(), ultimatemember_version ); + wp_register_style( 'um_crop', $this->front_css_baseurl . 'um-crop.css', array(), ultimatemember_version ); + wp_register_style( 'um_responsive', $this->front_css_baseurl . 'um-responsive.css', array(), ultimatemember_version ); + wp_register_style( 'um_modal', $this->front_css_baseurl . 'um-modal.css', array(), ultimatemember_version ); + wp_register_style( 'um_styles', $this->front_css_baseurl . 'um-styles.css', array( 'um_ui', 'um_tipsy', 'um_raty', 'um_fonticons_ii', 'um_fonticons_fa', 'select2' ), ultimatemember_version ); + wp_register_style( 'um_members', $this->front_css_baseurl . 'um-members.css', array(), ultimatemember_version ); + wp_register_style( 'um_profile', $this->front_css_baseurl . 'um-profile.css', array(), ultimatemember_version ); + wp_register_style( 'um_account', $this->front_css_baseurl . 'um-account.css', array(), ultimatemember_version ); + wp_register_style( 'um_misc', $this->front_css_baseurl . 'um-misc.css', array(), ultimatemember_version ); + wp_register_style( 'um_default_css', $this->front_css_baseurl . 'um-old-default.css', array( 'um_crop', 'um_tipsy', 'um_raty', 'um_responsive', 'um_modal', 'um_styles', 'um_members', 'um_profile', 'um_account', 'um_misc', 'um_datetime_date', 'um_datetime_time', 'um_scrollbar', 'select2' ), UM_VERSION ); + + wp_enqueue_script( 'um_modal' ); + wp_enqueue_style( 'um_default_css' ); + } + + + /** + * Load js for Add/Edit User form + */ + public function load_role_wrapper() { + wp_register_script( 'um_admin_role_wrapper', $this->js_url . 'um-admin-role-wrapper.js', array( 'jquery' ), ultimatemember_version, true ); + $localize_roles_data = get_option( 'um_roles', array() ); + wp_localize_script( 'um_admin_role_wrapper', 'um_roles', (array) $localize_roles_data ); + wp_enqueue_script( 'um_admin_role_wrapper' ); + } + + + /** + * Enter title placeholder + * + * @param $title + * + * @return string + */ + public function enter_title_here( $title ) { + $screen = get_current_screen(); + if ( 'um_directory' === $screen->post_type ) { + $title = __( 'e.g. Member Directory', 'ultimate-member' ); + } elseif ( 'um_form' === $screen->post_type ) { + $title = __( 'e.g. New Registration Form', 'ultimate-member' ); + } + return $title; + } + + + /** + * Runs on admin head + */ + public function admin_head() { + if ( UM()->admin()->is_plugin_post_type() ) { ?> + + css_url . 'um-admin-form.css', array(), ultimatemember_version ); + wp_enqueue_style( 'um_admin_form' ); + + wp_register_script( 'um_admin_form', $this->js_url . 'um-admin-form.js', array( 'jquery' ), ultimatemember_version, true ); + wp_enqueue_script( 'um_admin_form' ); + } + + + /** + * Load Forms + */ + public function load_forms() { + $suffix = self::get_suffix(); + + wp_register_style( 'um_admin_forms', $this->css_url . 'um-admin-forms.css', array( 'wp-color-picker', 'um_ui', 'select2' ), UM_VERSION ); + wp_enqueue_style( 'um_admin_forms' ); + + wp_register_script( 'um_admin_forms', $this->js_url . 'um-admin-forms.js', array( 'jquery', 'wp-i18n', self::$select2_handle ), UM_VERSION, true ); + + wp_localize_script( + 'um_admin_forms', + 'um_forms_data', + array( + 'successfully_redirect' => add_query_arg( + array( + 'page' => 'um_options', + 'tab' => 'misc', + 'msg' => 'updated', + ), + admin_url( 'admin.php' ) + ), + 'md_sorting_data_types' => UM()->member_directory()->sort_data_types, + ) + ); + + wp_enqueue_script( 'um_admin_forms' ); + } + + + /** + * Load dashboard + */ + public function load_dashboard() { + wp_register_style( 'um_admin_dashboard', $this->css_url . 'um-admin-dashboard.css', array(), ultimatemember_version ); + wp_enqueue_style( 'um_admin_dashboard' ); + } + + + /** + * Load settings + */ + public function load_settings() { + wp_register_style( 'um_admin_settings', $this->css_url . 'um-admin-settings.css', array(), ultimatemember_version ); + wp_enqueue_style( 'um_admin_settings' ); + + wp_register_script( 'um_admin_settings', $this->js_url . 'um-admin-settings.js', array( 'jquery', 'wp-i18n' ), ultimatemember_version, true ); + wp_enqueue_script( 'um_admin_settings' ); + } + + + /** + * Load modal + */ + public function load_modal() { + wp_register_style( 'um_admin_modal', $this->css_url . 'um-admin-modal.css', array( 'wp-color-picker' ), ultimatemember_version ); + wp_enqueue_style( 'um_admin_modal' ); + + wp_register_script( 'um_admin_modal', $this->js_url . 'um-admin-modal.js', array( 'jquery', 'editor', 'wp-util', 'wp-color-picker', 'wp-tinymce', 'wp-i18n', 'jquery-ui-tooltip', 'um_admin_scripts' ), ultimatemember_version, true ); + wp_enqueue_script( 'um_admin_modal' ); + } + + + /** + * Field Processing + */ + public function load_field() { + wp_register_script( 'um_admin_field', $this->js_url . 'um-admin-field.js', array( 'jquery', 'wp-util', 'wp-i18n' ), ultimatemember_version, true ); + wp_enqueue_script( 'um_admin_field' ); + } + + + /** + * Load Builder + */ + public function load_builder() { + wp_register_script( 'um_admin_builder', $this->js_url . 'um-admin-builder.js', array( 'jquery', 'wp-util' ), ultimatemember_version, true ); + wp_enqueue_script( 'um_admin_builder' ); + + //hide footer text on add/edit UM Forms + //layouts crashed because we load and hide metaboxes + //and WP calculate page height + $hide_footer = false; + global $pagenow, $post; + // phpcs:ignore WordPress.Security.NonceVerification + if ( ( 'post.php' === $pagenow || 'post-new.php' === $pagenow ) && ( ( isset( $_GET['post_type'] ) && 'um_form' === sanitize_key( $_GET['post_type'] ) ) || ( isset( $post->post_type ) && 'um_form' === $post->post_type ) ) ) { + $hide_footer = true; + } + + $localize_data = array( + 'hide_footer' => $hide_footer, + ); + wp_localize_script( 'um_admin_builder', 'um_admin_builder_data', $localize_data ); + + wp_register_script( 'um_admin_dragdrop', $this->js_url . 'um-admin-dragdrop.js', array( 'jquery', 'wp-util' ), ultimatemember_version, true ); + wp_enqueue_script( 'um_admin_dragdrop' ); + + wp_register_style( 'um_admin_builder', $this->css_url . 'um-admin-builder.css', array(), ultimatemember_version ); + wp_enqueue_style( 'um_admin_builder' ); + } + + + /** + * Load core WP styles/scripts + */ + public function load_core_wp() { + wp_enqueue_script( 'jquery-ui-draggable' ); + wp_enqueue_script( 'jquery-ui-sortable' ); + + wp_enqueue_script( 'jquery-ui-tooltip' ); + } + + + /** + * Load Admin Styles + */ + public function load_css() { + wp_register_style( 'um_admin_menu', $this->css_url . 'um-admin-menu.css', array(), ultimatemember_version ); + wp_enqueue_style( 'um_admin_menu' ); + + wp_register_style( 'um_admin_columns', $this->css_url . 'um-admin-columns.css', array(), ultimatemember_version ); + wp_enqueue_style( 'um_admin_columns' ); + + wp_register_style( 'um_admin_misc', $this->css_url . 'um-admin-misc.css', array(), ultimatemember_version ); + wp_enqueue_style( 'um_admin_misc' ); + } + + + /** + * Load functions js + */ + public function load_functions() { + wp_register_script( 'um_scrollbar', UM_URL . 'assets/js/simplebar.js', array( 'jquery' ), ultimatemember_version, true ); + wp_register_script( 'um_functions', UM_URL . 'assets/js/um-functions.js', array( 'jquery', 'jquery-masonry', 'wp-util', 'um_scrollbar' ), ultimatemember_version, true ); + wp_enqueue_script( 'um_functions' ); + } + + + /** + * Load Fonticons + * + * @depecated 2.6.12 + */ + public function load_fonticons() { + } + + + /** + * Load global css + */ + public function load_global_scripts() { + wp_register_script( 'um_admin_global', $this->js_url . 'um-admin-global.js', array( 'jquery' ), ultimatemember_version, true ); + wp_enqueue_script( 'um_admin_global' ); + + wp_register_style( 'um_admin_global', $this->css_url . 'um-admin-global.css', array( 'um_fonticons_ii', 'um_fonticons_fa' ), ultimatemember_version ); + wp_enqueue_style( 'um_admin_global' ); + } + + + /** + * Load jQuery custom code + */ + public function load_custom_scripts() { + wp_register_script( 'um_datetime', $this->front_js_baseurl . 'pickadate/picker.js', array( 'jquery' ), ultimatemember_version, true ); + wp_register_script( 'um_datetime_date', $this->front_js_baseurl . 'pickadate/picker.date.js', array( 'jquery', 'um_datetime' ), ultimatemember_version, true ); + wp_register_script( 'um_datetime_time', $this->front_js_baseurl . 'pickadate/picker.time.js', array( 'jquery', 'um_datetime' ), ultimatemember_version, true ); + //wp_register_script( 'um_datetime_legacy', $this->front_js_baseurl . 'pickadate/legacy.js', array( 'jquery', 'um_datetime' ), ultimatemember_version, true ); + // load a localized version for date/time + $locale = get_locale(); + if ( $locale ) { + if ( file_exists( WP_LANG_DIR . '/plugins/ultimate-member/assets/js/pickadate/' . $locale . '.js' ) ) { + wp_register_script( 'um_datetime_locale', content_url() . '/languages/plugins/ultimate-member/assets/js/pickadate/' . $locale . '.js', array( 'jquery', 'um_datetime' ), ultimatemember_version, true ); + } elseif ( file_exists( UM_PATH . 'assets/js/pickadate/translations/' . $locale . '.js' ) ) { + wp_register_script( 'um_datetime_locale', UM_URL . 'assets/js/pickadate/translations/' . $locale . '.js', array( 'jquery', 'um_datetime' ), ultimatemember_version, true ); + } + } + + wp_register_style( 'um_datetime', $this->front_css_baseurl . 'pickadate/default.css', array(), ultimatemember_version ); + wp_register_style( 'um_datetime_date', $this->front_css_baseurl . 'pickadate/default.date.css', array( 'um_datetime' ), ultimatemember_version ); + wp_register_style( 'um_datetime_time', $this->front_css_baseurl . 'pickadate/default.time.css', array( 'um_datetime' ), ultimatemember_version ); + + wp_enqueue_style( 'um_datetime_date' ); + wp_enqueue_style( 'um_datetime_time' ); + + wp_register_script( 'um_admin_scripts', $this->js_url . 'um-admin-scripts.js', array( 'jquery', 'wp-util', 'wp-color-picker', 'um_datetime', 'um_datetime_date', 'um_datetime_time'/*, 'um_datetime_legacy'*/ ), ultimatemember_version, true ); + wp_enqueue_script( 'um_admin_scripts' ); + } + + + /** + * Load jQuery custom code + */ + public function load_nav_manus_scripts() { + wp_register_script( 'um_admin_nav_manus', $this->js_url . 'um-admin-nav-menu.js', array( 'jquery', 'wp-util' ), ultimatemember_version, true ); + wp_enqueue_script( 'um_admin_nav_manus' ); + } + + + /** + * Load AJAX + */ + public function load_ajax_js() { + wp_register_script( 'um_admin_ajax', $this->js_url . 'um-admin-ajax.js', array( 'jquery', 'wp-util' ), ultimatemember_version, true ); + wp_enqueue_script( 'um_admin_ajax' ); + } + + + /** + * Load Gutenberg scripts + */ + public function load_gutenberg_js() { + /** This filter is documented in includes/core/class-blocks.php */ + $disable_script = apply_filters( 'um_disable_blocks_script', false ); + if ( $disable_script ) { + return; + } + + $restricted_blocks = UM()->options()->get( 'restricted_blocks' ); + if ( empty( $restricted_blocks ) ) { + return; + } + + wp_register_script( 'um_block_js', $this->js_url . 'um-admin-blocks.js', array( 'wp-i18n', 'wp-blocks', 'wp-components', 'wp-hooks' ), ultimatemember_version, true ); + wp_set_script_translations( 'um_block_js', 'ultimate-member' ); + + $restrict_options = array(); + $roles = UM()->roles()->get_roles( false ); + if ( ! empty( $roles ) ) { + foreach ( $roles as $role_key => $title ) { + $restrict_options[] = array( + 'label' => $title, + 'value' => $role_key, + ); + } + } + wp_localize_script( 'um_block_js', 'um_restrict_roles', $restrict_options ); + + wp_enqueue_script( 'um_block_js' ); + + do_action( 'um_load_gutenberg_js' ); + } + + + /** + * Add Gutenberg category for UM shortcodes + * + * @param array $categories + * @param \WP_Block_Editor_Context $context + * + * @return array + */ + public function blocks_category( $categories, $context ) { + $enable_blocks = UM()->options()->get( 'enable_blocks' ); + if ( empty( $enable_blocks ) ) { + return $categories; + } + + return array_merge( + $categories, + array( + array( + 'slug' => 'um-blocks', + 'title' => __( 'Ultimate Member Blocks', 'ultimate-member' ), + ), + ) + ); + } + + /** + * Load localize scripts + */ + public function load_localize_scripts() { + + /** + * UM hook + * + * @type filter + * @title um_admin_enqueue_localize_data + * @description Extend localize data at wp-admin side + * @input_vars + * [{"var":"$localize_data","type":"array","desc":"Localize Data"}] + * @change_log + * ["Since: 2.0"] + * @usage add_filter( 'um_admin_enqueue_localize_data', 'function_name', 10, 1 ); + * @example + * + */ + $localize_data = apply_filters( 'um_admin_enqueue_localize_data', array( 'nonce' => wp_create_nonce( 'um-admin-nonce' ) ) ); + + wp_localize_script( 'um_admin_global', 'um_admin_scripts', $localize_data ); + } + + + /** + * Enqueue scripts and styles + */ + public function admin_enqueue_scripts() { + if ( UM()->admin()->is_um_screen() ) { + $suffix = self::get_suffix(); + + /*if ( get_post_type() != 'shop_order' ) { + UM()->enqueue()->wp_enqueue_scripts(); + }*/ + + $modal_deps = array( 'um-admin-scripts' ); + if ( $this->um_cpt_form_screen ) { + $this->enqueue_frontend_preview_assets(); + $modal_deps[] = 'um-responsive'; + } + + $this->load_functions(); + $this->load_global_scripts(); + $this->load_form(); + $this->load_forms(); + $this->load_custom_scripts(); + $this->load_modal(); + $this->load_dashboard(); + $this->load_settings(); + $this->load_field(); + $this->load_builder(); + $this->load_css(); + $this->load_core_wp(); + $this->load_ajax_js(); + //$this->load_fonticons(); + $this->load_localize_scripts(); + + //scripts for frontend preview + UM()->frontend()->enqueue()->load_imagecrop(); + UM()->frontend()->enqueue()->load_css(); + // UM()->frontend()->enqueue()->load_tipsy(); + UM()->frontend()->enqueue()->load_modal(); + UM()->frontend()->enqueue()->load_responsive(); + + //wp_register_script( 'um_raty', UM_URL . 'assets/js/um-raty' . $suffix . '.js', array( 'jquery', 'wp-i18n' ), ultimatemember_version, true ); + //wp_register_style( 'um_raty', UM_URL . 'assets/css/um-raty.css', array(), ultimatemember_version ); + + wp_register_style( 'um_default_css', UM_URL . 'assets/css/um-old-default.css', '', ultimatemember_version, 'all' ); + wp_enqueue_style( 'um_default_css' ); + + if ( is_rtl() ) { + wp_register_style( 'um_admin_rtl', $this->css_url . 'um-admin-rtl.css', array(), ultimatemember_version ); + wp_enqueue_style( 'um_admin_rtl' ); + } + } else { + + $this->load_global_scripts(); + $this->load_localize_scripts(); + + } + + global $wp_version, $current_screen; + + if ( version_compare( $wp_version, '5.0', '>=' ) ) { + if ( isset( $current_screen ) && $current_screen->is_block_editor() ) { + $this->load_gutenberg_js(); + } + } + } + + + /** + * Print editor scripts if they are not printed by default + */ + public function admin_footer_scripts() { + /** + * @var $class \_WP_Editors + */ + $class = '\_WP_Editors'; + + if ( did_action( 'print_default_editor_scripts' ) ) { + return; + } + if ( did_action( 'wp_tiny_mce_init' ) ) { + return; + } + if ( has_action( 'admin_print_footer_scripts', array( $class, 'editor_js' ) ) ) { + return; + } + + if ( ! class_exists( $class, false ) ) { + require_once( ABSPATH . WPINC . '/class-wp-editor.php' ); + } + + $class::force_uncompressed_tinymce(); + $class::enqueue_scripts(); + $class::editor_js(); + } + +} diff --git a/includes/admin/class-secure.php b/includes/admin/class-secure.php index 5c35cb43..bb792fc4 100644 --- a/includes/admin/class-secure.php +++ b/includes/admin/class-secure.php @@ -61,7 +61,7 @@ if ( ! class_exists( 'um\admin\Secure' ) ) { } // phpcs:enable WordPress.Security.NonceVerification - wp_register_script( 'um_admin_secure', UM()->admin_enqueue()->js_url . 'um-admin-secure.js', array( 'jquery' ), UM_VERSION, true ); + wp_register_script( 'um_admin_secure', UM()->admin()->enqueue()->js_url . 'um-admin-secure.js', array( 'jquery' ), UM_VERSION, true ); wp_enqueue_script( 'um_admin_secure' ); } diff --git a/includes/admin/class-site-health.php b/includes/admin/class-site-health.php new file mode 100644 index 00000000..a035dfa8 --- /dev/null +++ b/includes/admin/class-site-health.php @@ -0,0 +1,2136 @@ +roles()->get_roles(); + } + + private function get_forms() { + $forms_data = get_posts( + array( + 'post_type' => 'um_form', + 'posts_per_page' => -1, + ) + ); + $forms = array(); + foreach ( $forms_data as $form ) { + $forms[ 'ID#' . $form->ID ] = $form->post_title; + } + return $forms; + } + + private function get_role_meta( $key ) { + return get_option( "um_role_{$key}_meta", false ); + } + + public function array_map( $item ) { + if ( is_array( $item ) ) { + $item = maybe_serialize( $item ); + } + return $item; + } + + private function get_field_data( $info, $key, $field_key, $field ) { + $row = isset( $field['metakey'] ) ? false : true; + $title = $row ? __( 'Row: ', 'ultimate-member' ) . $field['id'] : __( 'Field: ', 'ultimate-member' ) . $field['metakey']; + $field = array_map( array( &$this, 'array_map' ), $field ); + $field_info = array( + 'um-field_' . $field_key => array( + 'label' => $title, + 'value' => $field, + ), + ); + + return $field_info; + } + + private function get_member_directories() { + $query = new \WP_Query(); + $member_directories = $query->query( + array( + 'post_type' => 'um_directory', + 'posts_per_page' => -1, + ) + ); + + $directories = array(); + foreach ( $member_directories as $directory ) { + $directories[ 'ID#' . $directory->ID ] = $directory->post_title; + } + + return $directories; + } + + /** + * Add our data to Site Health information. + * + * @since 2.6.12 + * + * @param array $info The Site Health information. + * + * @return array The updated Site Health information. + */ + public function debug_information( $info ) { + $labels = array( + 'yes' => __( 'Yes', 'ultimate-member' ), + 'no' => __( 'No', 'ultimate-member' ), + 'all' => __( 'All', 'ultimate-member' ), + 'default' => __( 'Default', 'ultimate-member' ), + 'nopages' => __( 'No predefined page', 'ultimate-member' ), + ); + + $info['ultimate-member'] = array( + 'label' => __( 'Ultimate Member', 'ultimate-member' ), + 'description' => __( 'This debug information for your Ultimate Member installation can assist you in getting support.', 'ultimate-member' ), + 'fields' => array(), + ); + + // Pages settings. + $pages = array(); + $predefined_pages = UM()->config()->core_pages; + foreach ( $predefined_pages as $page_s => $page ) { + $page_id = UM()->options()->get_core_page_id( $page_s ); + $page_title = ! empty( $page['title'] ) ? $page['title'] : ''; + if ( empty( $page_title ) ) { + continue; + } + + $predefined_page_id = UM()->options()->get( $page_id ); + + if ( empty( $predefined_page_id ) ) { + $pages[ $page_title ] = $labels['nopages']; + continue; + } + // translators: %1$s is a predefined page title; %2$d is a predefined page ID; %3$s is a predefined page permalink. + $pages[ $page_title ] = sprintf( __( '%1$s (ID#%2$d) | %3$s', 'ultimate-member' ), get_the_title( $predefined_page_id ), $predefined_page_id, get_permalink( $predefined_page_id ) ); + } + + $pages = apply_filters( 'um_debug_information_pages', $pages ); + + $pages_settings = array( + 'um-pages' => array( + 'label' => __( 'Pages', 'ultimate-member' ), + 'value' => $pages, + ), + ); + + // User settings + $permalink_base = UM()->config()->permalink_base_options; + $display_name = UM()->config()->display_name_options; + + $user_settings = array( + 'um-permalink_base' => array( + 'label' => __( 'Profile Permalink Base', 'ultimate-member' ), + 'value' => isset( $permalink_base[ UM()->options()->get( 'permalink_base' ) ] ) ? $permalink_base[ UM()->options()->get( 'permalink_base' ) ] : $labels['no'], + ), + 'um-display_name' => array( + 'label' => __( 'User Display Name', 'ultimate-member' ), + 'value' => isset( $display_name[ UM()->options()->get( 'display_name' ) ] ) ? $display_name[ UM()->options()->get( 'display_name' ) ] : $labels['no'], + ), + 'um-author_redirect' => array( + 'label' => __( 'Automatically redirect author page to their profile?', 'ultimate-member' ), + 'value' => UM()->options()->get( 'author_redirect' ) ? $labels['yes'] : $labels['no'], + ), + 'um-members_page' => array( + 'label' => __( 'Enable Members Directory', 'ultimate-member' ), + 'value' => UM()->options()->get( 'members_page' ) ? $labels['yes'] : $labels['no'], + ), + 'um-toggle_password' => array( + 'label' => __( 'Show/hide password button', 'ultimate-member' ), + 'value' => UM()->options()->get( 'toggle_password' ) ? $labels['yes'] : $labels['no'], + ), + 'um-require_strongpass' => array( + 'label' => __( 'Require Strong Passwords', 'ultimate-member' ), + 'value' => UM()->options()->get( 'require_strongpass' ) ? $labels['yes'] : $labels['no'], + ), + 'um-password_min_chars' => array( + 'label' => __( 'Require Strong Passwords', 'ultimate-member' ), + 'value' => UM()->options()->get( 'password_min_chars' ), + ), + 'um-password_max_chars' => array( + 'label' => __( 'Require Strong Passwords', 'ultimate-member' ), + 'value' => UM()->options()->get( 'password_max_chars' ), + ), + 'um-profile_noindex' => array( + 'label' => __( 'Avoid indexing profile by search engines', 'ultimate-member' ), + 'value' => UM()->options()->get( 'profile_noindex' ) ? $labels['yes'] : $labels['no'], + ), + 'um-activation_link_expiry_time' => array( + 'label' => __( 'Activation link lifetime', 'ultimate-member' ), + 'value' => UM()->options()->get( 'activation_link_expiry_time' ), + ), + 'um-use_gravatars' => array( + 'label' => __( 'Use Gravatars?', 'ultimate-member' ), + 'value' => UM()->options()->get( 'use_gravatars' ) ? $labels['yes'] : $labels['no'], + ), + 'um-delete_comments' => array( + 'label' => __( 'Deleting user comments after deleting a user', 'ultimate-member' ), + 'value' => UM()->options()->get( 'delete_comments' ) ? $labels['yes'] : $labels['no'], + ), + ); + + if ( 'custom_meta' === UM()->options()->get( 'permalink_base' ) ) { + $user_settings = UM()->array_insert_before( + $user_settings, + 'um-display_name', + array( + 'um-permalink_base_custom_meta' => array( + 'label' => __( 'Profile Permalink Base Custom Meta Key', 'ultimate-member' ), + 'value' => UM()->options()->get( 'permalink_base_custom_meta' ), + ), + ) + ); + } + + if ( 'field' === UM()->options()->get( 'display_name' ) ) { + $user_settings = UM()->array_insert_before( + $user_settings, + 'um-author_redirect', + array( + 'um-display_name_field' => array( + 'label' => __( 'Display Name Custom Field(s)', 'ultimate-member' ), + 'value' => UM()->options()->get( 'display_name_field' ), + ), + ) + ); + } + + if ( UM()->options()->get( 'use_gravatars' ) ) { + $gravatar_options = array( + 'default' => __( 'Default', 'ultimate-member' ), + '404' => __( '404 ( File Not Found response )', 'ultimate-member' ), + 'mm' => __( 'Mystery Man', 'ultimate-member' ), + 'identicon' => __( 'Identicon', 'ultimate-member' ), + 'monsterid' => __( 'Monsterid', 'ultimate-member' ), + 'wavatar' => __( 'Wavatar', 'ultimate-member' ), + 'retro' => __( 'Retro', 'ultimate-member' ), + 'blank' => __( 'Blank ( a transparent PNG image )', 'ultimate-member' ), + ); + + $user_settings['um-use_um_gravatar_default_builtin_image'] = array( + 'label' => __( 'Use Gravatar builtin image', 'ultimate-member' ), + 'value' => $gravatar_options[ UM()->options()->get( 'use_um_gravatar_default_builtin_image' ) ], + ); + if ( 'default' === UM()->options()->get( 'use_um_gravatar_default_builtin_image' ) ) { + $user_settings['um-use_um_gravatar_default_image'] = array( + 'label' => __( 'Use Default plugin avatar as Gravatar\'s Default avatar', 'ultimate-member' ), + 'value' => UM()->options()->get( 'use_um_gravatar_default_image' ) ? $labels['yes'] : $labels['no'], + ); + } + } + + // Account settings + $account_settings = array( + 'um-account_tab_password' => array( + 'label' => __( 'Password Account Tab', 'ultimate-member' ), + 'value' => UM()->options()->get( 'account_tab_password' ) ? $labels['yes'] : $labels['no'], + ), + 'um-account_tab_privacy' => array( + 'label' => __( 'Privacy Account Tab', 'ultimate-member' ), + 'value' => UM()->options()->get( 'account_tab_privacy' ) ? $labels['yes'] : $labels['no'], + ), + ); + + if ( false !== UM()->account()->is_notifications_tab_visible() ) { + $account_settings['um-account_tab_notifications'] = array( + 'label' => __( 'Notifications Account Tab', 'ultimate-member' ), + 'value' => UM()->options()->get( 'account_tab_notifications' ) ? $labels['yes'] : $labels['no'], + ); + } + + $account_settings = array_merge( + $account_settings, + array( + 'um-account_tab_delete' => array( + 'label' => __( 'Delete Account Tab', 'ultimate-member' ), + 'value' => UM()->options()->get( 'account_tab_delete' ) ? $labels['yes'] : $labels['no'], + ), + 'um-delete_account_text' => array( + 'label' => __( 'Account Deletion Custom Text', 'ultimate-member' ), + 'value' => UM()->options()->get( 'delete_account_text' ), + ), + 'um-delete_account_no_pass_required_text' => array( + 'label' => __( 'Account Deletion without password Custom Text', 'ultimate-member' ), + 'value' => UM()->options()->get( 'delete_account_no_pass_required_text' ), + ), + 'um-account_name' => array( + 'label' => __( 'Add a First & Last Name fields', 'ultimate-member' ), + 'value' => UM()->options()->get( 'account_name' ) ? $labels['yes'] : $labels['no'], + ), + ) + ); + + if ( UM()->options()->get( 'account_name' ) ) { + $account_settings['um-account_name_disable'] = array( + 'label' => __( 'Disable First & Last name field editing', 'ultimate-member' ), + 'value' => UM()->options()->get( 'account_name_disable' ) ? $labels['yes'] : $labels['no'], + ); + $account_settings['um-account_name_require'] = array( + 'label' => __( 'Require First & Last Name', 'ultimate-member' ), + 'value' => UM()->options()->get( 'account_name_require' ) ? $labels['yes'] : $labels['no'], + ); + } + + $account_settings['um-account_email'] = array( + 'label' => __( 'Allow users to change e-mail', 'ultimate-member' ), + 'value' => UM()->options()->get( 'account_email' ) ? $labels['yes'] : $labels['no'], + ); + + $account_settings['um-account_general_password'] = array( + 'label' => __( 'Password is required?', 'ultimate-member' ), + 'value' => UM()->options()->get( 'account_general_password' ) ? $labels['yes'] : $labels['no'], + ); + + $account_settings['um-account_hide_in_directory'] = array( + 'label' => __( 'Allow users to hide their profiles from directory', 'ultimate-member' ), + 'value' => UM()->options()->get( 'account_hide_in_directory' ) ? $labels['yes'] : $labels['no'], + ); + + if ( UM()->options()->get( 'account_hide_in_directory' ) ) { + $account_settings['um-account_hide_in_directory_default'] = array( + 'label' => __( 'Hide profiles from directory by default', 'ultimate-member' ), + 'value' => UM()->options()->get( 'account_hide_in_directory_default' ), + ); + } + + // Uploads settings + $profile_sizes_list = ''; + $profile_sizes = UM()->options()->get( 'photo_thumb_sizes' ); + if ( ! empty( $profile_sizes ) ) { + foreach ( $profile_sizes as $size ) { + $profile_sizes_list = empty( $profile_sizes_list ) ? $size : $profile_sizes_list . ', ' . $size; + } + } + $cover_sizes_list = ''; + $cover_sizes = UM()->options()->get( 'cover_thumb_sizes' ); + if ( ! empty( $cover_sizes ) ) { + foreach ( $cover_sizes as $size ) { + $cover_sizes_list = empty( $cover_sizes_list ) ? $size : $cover_sizes_list . ', ' . $size; + } + } + $uploads_settings = array( + 'um-profile_photo_max_size' => array( + 'label' => __( 'Profile Photo Maximum File Size (bytes)', 'ultimate-member' ), + 'value' => UM()->options()->get( 'profile_photo_max_size' ), + ), + 'um-cover_photo_max_size' => array( + 'label' => __( 'Cover Photo Maximum File Size (bytes)', 'ultimate-member' ), + 'value' => UM()->options()->get( 'cover_photo_max_size' ), + ), + 'um-photo_thumb_sizes' => array( + 'label' => __( 'Profile Photo Thumbnail Sizes (px)', 'ultimate-member' ), + 'value' => $profile_sizes_list, + ), + 'um-cover_thumb_sizes' => array( + 'label' => __( 'Cover Photo Thumbnail Sizes (px)', 'ultimate-member' ), + 'value' => $cover_sizes_list, + ), + 'um-image_orientation_by_exif' => array( + 'label' => __( 'Change image orientation', 'ultimate-member' ), + 'value' => UM()->options()->get( 'image_orientation_by_exif' ) ? $labels['yes'] : $labels['no'], + ), + 'um-image_compression' => array( + 'label' => __( 'Image Quality', 'ultimate-member' ), + 'value' => UM()->options()->get( 'image_compression' ), + ), + 'um-image_max_width' => array( + 'label' => __( 'Image Upload Maximum Width (px)', 'ultimate-member' ), + 'value' => UM()->options()->get( 'image_max_width' ), + ), + 'um-cover_min_width' => array( + 'label' => __( 'Cover Photo Minimum Width (px)', 'ultimate-member' ), + 'value' => UM()->options()->get( 'cover_min_width' ), + ), + ); + + // Content Restriction settings + $restricted_posts = UM()->options()->get( 'restricted_access_post_metabox' ); + $restricted_posts_list = ''; + if ( ! empty( $restricted_posts ) ) { + foreach ( $restricted_posts as $key => $posts ) { + $restricted_posts_list = empty( $restricted_posts_list ) ? $key : $restricted_posts_list . ', ' . $key; + } + } + $restricted_taxonomy = UM()->options()->get( 'restricted_access_taxonomy_metabox' ); + $restricted_taxonomy_list = ''; + if ( ! empty( $restricted_taxonomy ) ) { + foreach ( $restricted_taxonomy as $key => $posts ) { + $restricted_taxonomy_list = empty( $restricted_taxonomy_list ) ? $key : $restricted_taxonomy_list . ', ' . $key; + } + } + + $accessible = absint( UM()->options()->get( 'accessible' ) ); + + $restrict_settings = array( + 'um-accessible' => array( + 'label' => __( 'Global Site Access', 'ultimate-member' ), + 'value' => 0 === $accessible ? __( 'Site accessible to Everyone', 'ultimate-member' ) : __( 'Site accessible to Logged In Users', 'ultimate-member' ), + ), + ); + + if ( 2 === $accessible ) { + $exclude_uris = UM()->options()->get( 'access_exclude_uris' ); + $exclude_uris_list = ''; + if ( ! empty( $exclude_uris ) ) { + $exclude_uris_list = implode( ', ', $exclude_uris ); + } + $restrict_settings['um-access_redirect'] = array( + 'label' => __( 'Custom Redirect URL', 'ultimate-member' ), + 'value' => UM()->options()->get( 'access_redirect' ), + ); + $restrict_settings['um-access_exclude_uris'] = array( + 'label' => __( 'Exclude the following URLs', 'ultimate-member' ), + 'value' => $exclude_uris_list, + ); + $restrict_settings['um-home_page_accessible'] = array( + 'label' => __( 'Allow Homepage to be accessible', 'ultimate-member' ), + 'value' => UM()->options()->get( 'home_page_accessible' ) ? $labels['yes'] : $labels['no'], + ); + $restrict_settings['um-category_page_accessible'] = array( + 'label' => __( 'Allow Category pages to be accessible', 'ultimate-member' ), + 'value' => UM()->options()->get( 'category_page_accessible' ) ? $labels['yes'] : $labels['no'], + ); + } + + $restrict_settings['um-restricted_post_title_replace'] = array( + 'label' => __( 'Restricted Content Titles', 'ultimate-member' ), + 'value' => UM()->options()->get( 'restricted_post_title_replace' ) ? $labels['yes'] : $labels['no'], + ); + if ( UM()->options()->get( 'restricted_post_title_replace' ) ) { + $restrict_settings['um-restricted_access_post_title'] = array( + 'label' => __( 'Restricted Content Title Text', 'ultimate-member' ), + 'value' => stripslashes( UM()->options()->get( 'restricted_access_post_title' ) ), + ); + } + + $restrict_settings['um-restricted_access_message'] = array( + 'label' => __( 'Restricted Access Message', 'ultimate-member' ), + 'value' => stripslashes( UM()->options()->get( 'restricted_access_message' ) ), + ); + $restrict_settings['um-restricted_blocks'] = array( + 'label' => __( 'Enable the "Content Restriction" settings for the Gutenberg Blocks', 'ultimate-member' ), + 'value' => UM()->options()->get( 'restricted_blocks' ) ? $labels['yes'] : $labels['no'], + ); + if ( UM()->options()->get( 'restricted_blocks' ) ) { + $restrict_settings['um-restricted_block_message'] = array( + 'label' => __( 'Restricted Access Block Message', 'ultimate-member' ), + 'value' => stripslashes( UM()->options()->get( 'restricted_block_message' ) ), + ); + } + $restrict_settings['um-restricted_access_post_metabox'] = array( + 'label' => __( 'Enable the "Content Restriction" settings for post types', 'ultimate-member' ), + 'value' => $restricted_posts_list, + ); + $restrict_settings['um-restricted_access_taxonomy_metabox'] = array( + 'label' => __( 'Enable the "Content Restriction" settings for taxonomies', 'ultimate-member' ), + 'value' => $restricted_taxonomy_list, + ); + + // Access other settings + $blocked_emails = str_replace( '
', ', ', nl2br( UM()->options()->get( 'blocked_emails' ) ) ); + $blocked_words = str_replace( '
', ', ', nl2br( UM()->options()->get( 'blocked_words' ) ) ); + $allowed_callbacks = str_replace( '
', ', ', nl2br( UM()->options()->get( 'allowed_choice_callbacks' ) ) ); + + $access_other_settings = array( + 'um-enable_reset_password_limit' => array( + 'label' => __( 'Enable the Reset Password Limit?', 'ultimate-member' ), + 'value' => UM()->options()->get( 'enable_reset_password_limit' ) ? $labels['yes'] : $labels['no'], + ), + ); + if ( 1 === absint( UM()->options()->get( 'enable_reset_password_limit' ) ) ) { + $access_other_settings['um-reset_password_limit_number'] = array( + 'label' => __( 'Reset Password Limit ', 'ultimate-member' ), + 'value' => UM()->options()->get( 'reset_password_limit_number' ), + ); + } + $access_other_settings['um-change_password_request_limit'] = array( + 'label' => __( 'Change Password request limit ', 'ultimate-member' ), + 'value' => UM()->options()->get( 'change_password_request_limit' ), + ); + $access_other_settings['um-blocked_emails'] = array( + 'label' => __( 'Blocked Email Addresses', 'ultimate-member' ), + 'value' => stripslashes( $blocked_emails ), + ); + $access_other_settings['um-blocked_words'] = array( + 'label' => __( 'Blacklist Words', 'ultimate-member' ), + 'value' => stripslashes( $blocked_words ), + ); + $access_other_settings['um-allowed_choice_callbacks'] = array( + 'label' => __( 'Allowed Choice Callbacks', 'ultimate-member' ), + 'value' => stripslashes( $allowed_callbacks ), + ); + $access_other_settings['um-allow_url_redirect_confirm'] = array( + 'label' => __( 'Allow external link redirect confirm ', 'ultimate-member' ), + 'value' => UM()->options()->get( 'allow_url_redirect_confirm' ) ? $labels['yes'] : $labels['no'], + ); + + // Email settings + $email_settings = array( + 'um-admin_email' => array( + 'label' => __( 'Admin E-mail Address', 'ultimate-member' ), + 'value' => UM()->options()->get( 'admin_email' ), + ), + 'um-mail_from' => array( + 'label' => __( 'Mail appears from', 'ultimate-member' ), + 'value' => UM()->options()->get( 'mail_from' ), + ), + 'um-mail_from_addr' => array( + 'label' => __( 'Mail appears from address', 'ultimate-member' ), + 'value' => UM()->options()->get( 'mail_from_addr' ), + ), + 'um-email_html' => array( + 'label' => __( 'Use HTML for E-mails?', 'ultimate-member' ), + 'value' => UM()->options()->get( 'email_html' ) ? $labels['yes'] : $labels['no'], + ), + ); + + $emails = UM()->config()->email_notifications; + foreach ( $emails as $key => $email ) { + if ( UM()->options()->get( $key . '_on' ) ) { + $email_settings[ 'um-' . $key ] = array( + // translators: %s is email template title. + 'label' => sprintf( __( '"%s" Subject', 'ultimate-member' ), $email['title'] ), + 'value' => UM()->options()->get( $key . '_sub' ), + ); + + $email_settings[ 'um-theme_' . $key ] = array( + // translators: %s is email template title. + 'label' => sprintf( __( 'Template "%s" in theme?', 'ultimate-member' ), $email['title'] ), + 'value' => '' !== locate_template( array( 'ultimate-member/emails/' . $key . '.php' ) ) ? $labels['yes'] : $labels['no'], + ); + } + } + + // Appearance settings. + // > Profile section. + $icons_display_options = array( + 'field' => __( 'Show inside text field', 'ultimate-member' ), + 'label' => __( 'Show with label', 'ultimate-member' ), + 'off' => __( 'Turn off', 'ultimate-member' ), + ); + $profile_header_menu_options = array( + 'bc' => __( 'Bottom of Icon', 'ultimate-member' ), + 'lc' => __( 'Left of Icon (right for RTL)', 'ultimate-member' ), + ); + + $profile_templates = UM()->shortcodes()->get_templates( 'profile' ); + $profile_template_key = UM()->options()->get( 'profile_template' ); + $profile_template_title = array_key_exists( $profile_template_key, $profile_templates ) ? $profile_templates[ $profile_template_key ] : __( 'No template name', 'ultimate-member' ); + $profile_secondary_btn = UM()->options()->get( 'profile_secondary_btn' ); + $profile_cover_enabled = UM()->options()->get( 'profile_cover_enabled' ); + $profile_empty_text = UM()->options()->get( 'profile_empty_text' ); + + $appearance_settings = array( + 'um-profile_template' => array( + 'label' => __( 'Profile Default Template', 'ultimate-member' ), + // translators: %1$s - profile template name, %2$s - profile template filename + 'value' => sprintf( __( '%1$s (filename: %2$s.php)', 'ultimate-member' ), $profile_template_title, $profile_template_key ), + ), + 'um-profile_max_width' => array( + 'label' => __( 'Profile Maximum Width', 'ultimate-member' ), + 'value' => UM()->options()->get( 'profile_max_width' ), + ), + 'um-profile_area_max_width' => array( + 'label' => __( 'Profile Area Maximum Width', 'ultimate-member' ), + 'value' => UM()->options()->get( 'profile_area_max_width' ), + ), + 'um-profile_icons' => array( + 'label' => __( 'Profile Field Icons', 'ultimate-member' ), + 'value' => $icons_display_options[ UM()->options()->get( 'profile_icons' ) ], + ), + 'um-profile_primary_btn_word' => array( + 'label' => __( 'Profile Primary Button Text', 'ultimate-member' ), + 'value' => UM()->options()->get( 'profile_primary_btn_word' ), + ), + 'um-profile_secondary_btn' => array( + 'label' => __( 'Profile Secondary Button', 'ultimate-member' ), + 'value' => $profile_secondary_btn ? $labels['yes'] : $labels['no'], + ), + ); + if ( ! empty( $profile_secondary_btn ) ) { + $appearance_settings['um-profile_secondary_btn_word'] = array( + 'label' => __( 'Profile Secondary Button Text ', 'ultimate-member' ), + 'value' => UM()->options()->get( 'profile_secondary_btn_word' ), + ); + } + + $default_avatar = UM()->options()->get( 'default_avatar' ); + $default_cover = UM()->options()->get( 'default_cover' ); + + $appearance_settings['um-default_avatar'] = array( + 'label' => __( 'Default Profile Photo', 'ultimate-member' ), + 'value' => ! empty( $default_avatar['url'] ) ? $default_avatar['url'] : '', + ); + $appearance_settings['um-default_cover'] = array( + 'label' => __( 'Default Cover Photo', 'ultimate-member' ), + 'value' => ! empty( $default_cover['url'] ) ? $default_cover['url'] : '', + ); + $appearance_settings['um-disable_profile_photo_upload'] = array( + 'label' => __( 'Disable Profile Photo Upload', 'ultimate-member' ), + 'value' => UM()->options()->get( 'disable_profile_photo_upload' ) ? $labels['yes'] : $labels['no'], + ); + $appearance_settings['um-profile_photosize'] = array( + 'label' => __( 'Profile Photo Size', 'ultimate-member' ), + 'value' => UM()->options()->get( 'profile_photosize' ) . 'x' . UM()->options()->get( 'profile_photosize' ) . 'px', + ); + $appearance_settings['um-profile_cover_enabled'] = array( + 'label' => __( 'Profile Cover Photos', 'ultimate-member' ), + 'value' => $profile_cover_enabled ? $labels['yes'] : $labels['no'], + ); + if ( ! empty( $profile_cover_enabled ) ) { + $appearance_settings['um-profile_coversize'] = array( + 'label' => __( 'Profile Cover Size', 'ultimate-member' ), + 'value' => UM()->options()->get( 'profile_coversize' ) . 'px', + ); + $appearance_settings['um-profile_cover_ratio'] = array( + 'label' => __( 'Profile Cover Ratio', 'ultimate-member' ), + 'value' => UM()->options()->get( 'profile_cover_ratio' ), + ); + } + $appearance_settings['um-profile_show_metaicon'] = array( + 'label' => __( 'Profile Header Meta Text Icon', 'ultimate-member' ), + 'value' => UM()->options()->get( 'profile_show_metaicon' ) ? $labels['yes'] : $labels['no'], + ); + $appearance_settings['um-profile_show_name'] = array( + 'label' => __( 'Show display name in profile header', 'ultimate-member' ), + 'value' => UM()->options()->get( 'profile_show_name' ) ? $labels['yes'] : $labels['no'], + ); + $appearance_settings['um-profile_show_social_links'] = array( + 'label' => __( 'Show social links in profile header', 'ultimate-member' ), + 'value' => UM()->options()->get( 'profile_show_social_links' ) ? $labels['yes'] : $labels['no'], + ); + $appearance_settings['um-profile_show_bio'] = array( + 'label' => __( 'Show user description in header', 'ultimate-member' ), + 'value' => UM()->options()->get( 'profile_show_bio' ) ? $labels['yes'] : $labels['no'], + ); + $appearance_settings['um-profile_show_html_bio'] = array( + 'label' => __( 'Enable HTML support for user description', 'ultimate-member' ), + 'value' => UM()->options()->get( 'profile_show_html_bio' ) ? $labels['yes'] : $labels['no'], + ); + $appearance_settings['um-profile_bio_maxchars'] = array( + 'label' => __( 'User description maximum chars', 'ultimate-member' ), + 'value' => UM()->options()->get( 'profile_bio_maxchars' ), + ); + $appearance_settings['um-profile_header_menu'] = array( + 'label' => __( 'Profile Header Menu Position', 'ultimate-member' ), + 'value' => $profile_header_menu_options[ UM()->options()->get( 'profile_header_menu' ) ], + ); + $appearance_settings['um-profile_empty_text'] = array( + 'label' => __( 'Show a custom message if profile is empty', 'ultimate-member' ), + 'value' => $profile_empty_text ? $labels['yes'] : $labels['no'], + ); + if ( ! empty( $profile_empty_text ) ) { + $appearance_settings['um-profile_empty_text_emo'] = array( + 'label' => __( 'Show the emoticon', 'ultimate-member' ), + 'value' => UM()->options()->get( 'profile_empty_text_emo' ) ? $labels['yes'] : $labels['no'], + ); + } + + // > Profile Menu section. + $profile_menu = UM()->options()->get( 'profile_menu' ); + + $appearance_settings['um-profile_menu'] = array( + 'label' => __( 'Enable profile menu', 'ultimate-member' ), + 'value' => $profile_menu ? $labels['yes'] : $labels['no'], + ); + + if ( ! empty( $profile_menu ) ) { + /** + * Filters a privacy list extend. + * + * @since 2.6.13 + * @hook um_profile_tabs_privacy_list + * + * @param {array} $privacy_option Add options for profile tabs' privacy. + * + * @return {array} Options for profile tabs' privacy. + * + * @example Add options for profile tabs' privacy. + * function um_profile_menu_link_attrs( $privacy_option ) { + * // your code here + * return $privacy_option; + * } + * add_filter( 'um_profile_tabs_privacy_list', 'um_profile_tabs_privacy_list', 10, 1 ); + */ + $privacy_option = UM()->profile()->tabs_privacy(); + + $tabs = UM()->profile()->tabs(); + foreach ( $tabs as $id => $tab ) { + if ( ! empty( $tab['hidden'] ) ) { + continue; + } + + $tab_enabled = UM()->options()->get( 'profile_tab_' . $id ); + + $appearance_settings[ 'um-profile_tab_' . $id ] = array( + // translators: %s Profile Tab Title + 'label' => sprintf( __( '%s Tab', 'ultimate-member' ), $tab['name'] ), + 'value' => $tab_enabled ? $labels['yes'] : $labels['no'], + ); + + if ( ! isset( $tab['default_privacy'] ) ) { + if ( ! empty( $tab_enabled ) ) { + $appearance_settings[ 'um-profile_tab_' . $id . '_privacy' ] = array( + // translators: %s Profile Tab Title + 'label' => sprintf( __( 'Who can see %s Tab?', 'ultimate-member' ), $tab['name'] ), + 'value' => $privacy_option[ UM()->options()->get( 'profile_tab_' . $id . '_privacy' ) ], + ); + } + } + } + /** + * Filters appearance settings for Site Health extend. + * + * @since 2.6.13 + * @hook um_profile_tabs_site_health + * + * @param {array} $appearance_settings Appearance settings for Site Health. + * + * @return {array} Appearance settings for Site Health. + * + * @example Add options for appearance settings for Site Health. + * function um_profile_tabs_site_health( $appearance_settings ) { + * // your code here + * return $appearance_settings; + * } + * add_filter( 'um_profile_tabs_site_health', 'um_profile_tabs_site_health', 10, 1 ); + */ + $appearance_settings = apply_filters( 'um_profile_tabs_site_health', $appearance_settings ); + + /** + * Filters extend user profile tabs + * + * @since 2.6.13 + * @hook um_profile_tabs + * + * @param {array} $tabs tabs list. + * + * @return {array} tabs list. + * + * @example Add options for profile tabs' privacy. + * function um_profile_tabs( $tabs ) { + * // your code here + * return $tabs; + * } + * add_filter( 'um_profile_tabs', 'um_profile_tabs', 10, 1 ); + */ + $tabs_options = apply_filters( + 'um_profile_tabs', + array( + 'main' => array( + 'name' => __( 'About', 'ultimate-member' ), + 'icon' => 'um-faicon-user', + ), + 'posts' => array( + 'name' => __( 'Posts', 'ultimate-member' ), + 'icon' => 'um-faicon-pencil', + ), + 'comments' => array( + 'name' => __( 'Comments', 'ultimate-member' ), + 'icon' => 'um-faicon-comment', + ), + ) + ); + + $appearance_settings['um-profile_menu_default_tab'] = array( + 'label' => __( 'Profile menu default tab', 'ultimate-member' ), + 'value' => $tabs_options[ UM()->options()->get( 'profile_menu_default_tab' ) ], + ); + $appearance_settings['um-profile_menu_icons'] = array( + 'label' => __( 'Enable menu icons in desktop view', 'ultimate-member' ), + 'value' => UM()->options()->get( 'profile_menu_icons' ) ? $labels['yes'] : $labels['no'], + ); + } + + // > Registration Form section. + $register_templates = UM()->shortcodes()->get_templates( 'register' ); + $register_template_key = UM()->options()->get( 'register_template' ); + $register_template_title = array_key_exists( $register_template_key, $register_templates ) ? $register_templates[ $register_template_key ] : __( 'No template name', 'ultimate-member' ); + $register_secondary_btn = UM()->options()->get( 'register_secondary_btn' ); + + $form_align_options = array( + 'center' => __( 'Centered', 'ultimate-member' ), + 'left' => __( 'Left aligned', 'ultimate-member' ), + 'right' => __( 'Right aligned', 'ultimate-member' ), + ); + + $appearance_settings['um-register_template'] = array( + 'label' => __( 'Registration Default Template', 'ultimate-member' ), + // translators: %1$s - register template name, %2$s - register template filename + 'value' => sprintf( __( '%1$s (filename: %2$s.php)', 'ultimate-member' ), $register_template_title, $register_template_key ), + ); + $appearance_settings['um-register_max_width'] = array( + 'label' => __( 'Registration Maximum Width', 'ultimate-member' ), + 'value' => UM()->options()->get( 'register_max_width' ), + ); + $appearance_settings['um-register_align'] = array( + 'label' => __( 'Registration Shortcode Alignment', 'ultimate-member' ), + 'value' => $form_align_options[ UM()->options()->get( 'register_align' ) ], + ); + $appearance_settings['um-register_icons'] = array( + 'label' => __( 'Registration Field Icons', 'ultimate-member' ), + 'value' => $icons_display_options[ UM()->options()->get( 'register_icons' ) ], + ); + $appearance_settings['um-register_primary_btn_word'] = array( + 'label' => __( 'Registration Primary Button Text ', 'ultimate-member' ), + 'value' => UM()->options()->get( 'register_primary_btn_word' ), + ); + $appearance_settings['um-register_secondary_btn'] = array( + 'label' => __( 'Registration Secondary Button', 'ultimate-member' ), + 'value' => $register_secondary_btn ? $labels['yes'] : $labels['no'], + ); + if ( ! empty( $register_secondary_btn ) ) { + $appearance_settings['um-register_secondary_btn_word'] = array( + 'label' => __( 'Registration Secondary Button Text', 'ultimate-member' ), + 'value' => UM()->options()->get( 'register_secondary_btn_word' ), + ); + $appearance_settings['um-register_secondary_btn_url'] = array( + 'label' => __( 'Registration Secondary Button URL', 'ultimate-member' ), + 'value' => UM()->options()->get( 'register_secondary_btn_url' ), + ); + } + $appearance_settings['um-register_role'] = array( + 'label' => __( 'Registration Default Role', 'ultimate-member' ), + 'value' => ! empty( UM()->options()->get( 'register_role' ) ) ? UM()->options()->get( 'register_role' ) : __( 'Default', 'ultimate-member' ), + ); + + // > Login Form section. + $login_templates = UM()->shortcodes()->get_templates( 'login' ); + $login_template_key = UM()->options()->get( 'login_template' ); + $login_template_title = array_key_exists( $login_template_key, $login_templates ) ? $login_templates[ $login_template_key ] : __( 'No template name', 'ultimate-member' ); + $login_secondary_btn = UM()->options()->get( 'login_secondary_btn' ); + + $appearance_settings['um-login_template'] = array( + 'label' => __( 'Login Default Template', 'ultimate-member' ), + // translators: %1$s - login template name, %2$s - login template filename + 'value' => sprintf( __( '%1$s (filename: %2$s.php)', 'ultimate-member' ), $login_template_title, $login_template_key ), + ); + $appearance_settings['um-login_max_width'] = array( + 'label' => __( 'Login Maximum Width', 'ultimate-member' ), + 'value' => UM()->options()->get( 'login_max_width' ), + ); + $appearance_settings['um-login_align'] = array( + 'label' => __( 'Login Shortcode Alignment', 'ultimate-member' ), + 'value' => $form_align_options[ UM()->options()->get( 'login_align' ) ], + ); + $appearance_settings['um-login_icons'] = array( + 'label' => __( 'Login Field Icons', 'ultimate-member' ), + 'value' => $icons_display_options[ UM()->options()->get( 'login_icons' ) ], + ); + $appearance_settings['um-login_primary_btn_word'] = array( + 'label' => __( 'Login Primary Button Text', 'ultimate-member' ), + 'value' => UM()->options()->get( 'login_primary_btn_word' ), + ); + $appearance_settings['um-login_secondary_btn'] = array( + 'label' => __( 'Login Secondary Button', 'ultimate-member' ), + 'value' => $login_secondary_btn ? $labels['yes'] : $labels['no'], + ); + if ( ! empty( $login_secondary_btn ) ) { + $appearance_settings['um-login_secondary_btn_word'] = array( + 'label' => __( 'Login Secondary Button Text', 'ultimate-member' ), + 'value' => UM()->options()->get( 'login_secondary_btn_word' ), + ); + $appearance_settings['um-login_secondary_btn_url'] = array( + 'label' => __( 'Login Secondary Button URL', 'ultimate-member' ), + 'value' => UM()->options()->get( 'login_secondary_btn_url' ), + ); + } + $appearance_settings['um-login_forgot_pass_link'] = array( + 'label' => __( 'Login Forgot Password Link', 'ultimate-member' ), + 'value' => UM()->options()->get( 'login_forgot_pass_link' ) ? $labels['yes'] : $labels['no'], + ); + $appearance_settings['um-login_show_rememberme'] = array( + 'label' => __( 'Show "Remember Me"', 'ultimate-member' ), + 'value' => UM()->options()->get( 'login_show_rememberme' ) ? $labels['yes'] : $labels['no'], + ); + + // Misc settings. + $misc_settings = array( + 'um-form_asterisk' => array( + 'label' => __( 'Show an asterisk for required fields', 'ultimate-member' ), + 'value' => UM()->options()->get( 'form_asterisk' ) ? $labels['yes'] : $labels['no'], + ), + 'um-profile_title' => array( + 'label' => __( 'User Profile Title', 'ultimate-member' ), + 'value' => stripslashes( UM()->options()->get( 'profile_title' ) ), + ), + 'um-profile_desc' => array( + 'label' => __( 'User Profile Dynamic Meta Description', 'ultimate-member' ), + 'value' => stripslashes( UM()->options()->get( 'profile_desc' ) ), + ), + 'um-um_profile_object_cache_stop' => array( + 'label' => __( 'Disable Cache User Profile', 'ultimate-member' ), + 'value' => UM()->options()->get( 'um_profile_object_cache_stop' ) ? $labels['yes'] : $labels['no'], + ), + 'um-enable_blocks' => array( + 'label' => __( 'Enable Gutenberg Blocks', 'ultimate-member' ), + 'value' => UM()->options()->get( 'enable_blocks' ) ? $labels['yes'] : $labels['no'], + ), + 'um-rest_api_version' => array( + 'label' => __( 'REST API version', 'ultimate-member' ), + 'value' => UM()->options()->get( 'rest_api_version' ), + ), + 'um-disable_restriction_pre_queries' => array( + 'label' => __( 'Disable pre-queries for restriction content logic (advanced)', 'ultimate-member' ), + 'value' => UM()->options()->get( 'disable_restriction_pre_queries' ) ? $labels['yes'] : $labels['no'], + ), + 'um-member_directory_own_table' => array( + 'label' => __( 'Enable custom table for usermeta', 'ultimate-member' ), + 'value' => UM()->options()->get( 'member_directory_own_table' ) ? $labels['yes'] : $labels['no'], + ), + 'um-uninstall_on_delete' => array( + 'label' => __( 'Remove Data on Uninstall?', 'ultimate-member' ), + 'value' => UM()->options()->get( 'uninstall_on_delete' ) ? $labels['yes'] : $labels['no'], + ), + ); + + // Secure settings + $secure_ban_admins_accounts = UM()->options()->get( 'secure_ban_admins_accounts' ); + + $secure_settings = array( + 'um-banned_capabilities' => array( + 'label' => __( 'Banned Administrative Capabilities', 'ultimate-member' ), + 'value' => implode( ', ', UM()->options()->get( 'banned_capabilities' ) ), + ), + 'um-lock_register_forms' => array( + 'label' => __( 'Lock All Register Forms', 'ultimate-member' ), + 'value' => UM()->options()->get( 'lock_register_forms' ) ? $labels['yes'] : $labels['no'], + ), + 'um-display_login_form_notice' => array( + 'label' => __( 'Display Login form notice to reset passwords', 'ultimate-member' ), + 'value' => UM()->options()->get( 'display_login_form_notice' ) ? $labels['yes'] : $labels['no'], + ), + 'um-secure_ban_admins_accounts' => array( + 'label' => __( 'Enable ban for administrative capabilities', 'ultimate-member' ), + 'value' => $secure_ban_admins_accounts ? $labels['yes'] : $labels['no'], + ), + ); + if ( ! empty( $secure_ban_admins_accounts ) ) { + $secure_notify_admins_banned_accounts = UM()->options()->get( 'secure_notify_admins_banned_accounts' ); + + $secure_settings['um-secure_notify_admins_banned_accounts'] = array( + 'label' => __( 'Notify Administrators', 'ultimate-member' ), + 'value' => $secure_notify_admins_banned_accounts ? $labels['yes'] : $labels['no'], + ); + if ( ! empty( $secure_notify_admins_banned_accounts ) ) { + $secure_notify_admins_banned_accounts_options = array( + 'instant' => __( 'Send Immediately', 'ultimate-member' ), + 'hourly' => __( 'Hourly', 'ultimate-member' ), + 'daily' => __( 'Daily', 'ultimate-member' ), + ); + + $secure_settings['um-secure_notify_admins_banned_accounts__interval'] = array( + 'label' => __( 'Notification Schedule', 'ultimate-member' ), + 'value' => $secure_notify_admins_banned_accounts_options[ UM()->options()->get( 'secure_notify_admins_banned_accounts__interval' ) ], + ); + } + } + + $secure_allowed_redirect_hosts = UM()->options()->get( 'secure_allowed_redirect_hosts' ); + $secure_allowed_redirect_hosts = explode( PHP_EOL, $secure_allowed_redirect_hosts ); + + $secure_settings['um-secure_allowed_redirect_hosts'] = array( + 'label' => __( 'Allowed hosts for safe redirect', 'ultimate-member' ), + 'value' => $secure_allowed_redirect_hosts, + ); + + // Licenses settings. + $license_settings = array( + 'um-licenses' => array( + 'label' => __( 'Licenses', 'ultimate-member' ), + 'value' => array(), + ), + ); + + /** + * Filters licenses settings for Site Health. + * + * @since 2.6.13 + * @hook um_licenses_site_health + * + * @param {array} $license_settings licenses settings for Site Health. + * + * @return {array} licenses settings for Site Health. + * + * @example Extend licenses settings for Site Health. + * function um_licenses_site_health( $license_settings ) { + * // your code here + * return $license_settings; + * } + * add_filter( 'um_licenses_site_health', 'um_licenses_site_health', 10, 1 ); + */ + $license_settings = apply_filters( 'um_licenses_site_health', $license_settings ); + + $info['ultimate-member']['fields'] = array_merge( $info['ultimate-member']['fields'], $pages_settings, $user_settings, $account_settings, $uploads_settings, $restrict_settings, $access_other_settings, $email_settings, $appearance_settings, $misc_settings, $secure_settings, $license_settings ); + + // User roles settings + $roles_array = array(); + foreach ( $this->get_roles() as $key => $role ) { + if ( strpos( $key, 'um_' ) === 0 ) { + $key = substr( $key, 3 ); + } + $rolemeta = $this->get_role_meta( $key ); + if ( false === $rolemeta ) { + continue; + } + $priority = ! empty( $rolemeta['_um_priority'] ) ? $rolemeta['_um_priority'] : 0; + + $k = $priority . '-' . $role; + $roles_array[ $k ] = $role . '(' . $priority . ')'; + } + + krsort( $roles_array, SORT_NUMERIC ); + + $info['ultimate-member-user-roles'] = array( + 'label' => __( 'User roles', 'ultimate-member' ), + 'description' => __( 'This debug information about user roles.', 'ultimate-member' ), + 'fields' => array( + 'um-roles' => array( + 'label' => __( 'User Roles (priority)', 'ultimate-member' ), + 'value' => implode( ', ', $roles_array ), + ), + 'um-register_role' => array( + 'label' => __( 'WordPress Default New User Role', 'ultimate-member' ), + 'value' => get_option( 'default_role' ), + ), + ), + ); + + foreach ( $this->get_roles() as $key => $role ) { + if ( strpos( $key, 'um_' ) === 0 ) { + $key = substr( $key, 3 ); + } + + $rolemeta = $this->get_role_meta( $key ); + if ( false === $rolemeta ) { + continue; + } + + $info[ 'ultimate-member-' . $key ] = array( + 'label' => ' - ' . $role . __( ' role settings', 'ultimate-member' ), + 'description' => __( 'This debug information about user role.', 'ultimate-member' ), + 'fields' => array(), + ); + + if ( array_key_exists( '_um_can_access_wpadmin', $rolemeta ) ) { + $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-' . $key ]['fields'], + array( + 'um-can_access_wpadmin' => array( + 'label' => __( 'Can access wp-admin?', 'ultimate-member' ), + 'value' => $rolemeta['_um_can_access_wpadmin'] ? $labels['yes'] : $labels['no'], + ), + ) + ); + } + + if ( array_key_exists( '_um_can_not_see_adminbar', $rolemeta ) ) { + $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-' . $key ]['fields'], + array( + 'um-can_not_see_adminbar' => array( + 'label' => __( 'Force hiding adminbar in frontend?', 'ultimate-member' ), + 'value' => $rolemeta['_um_can_not_see_adminbar'] ? $labels['yes'] : $labels['no'], + ), + ) + ); + } + + if ( array_key_exists( '_um_can_edit_everyone', $rolemeta ) ) { + $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-' . $key ]['fields'], + array( + 'um-can_edit_everyone' => array( + 'label' => __( 'Can edit other member accounts?', 'ultimate-member' ), + 'value' => $rolemeta['_um_can_edit_everyone'] ? $labels['yes'] : $labels['no'], + ), + ) + ); + } + + if ( array_key_exists( '_um_can_edit_everyone', $rolemeta ) && 1 === absint( $rolemeta['_um_can_edit_everyone'] ) ) { + $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-' . $key ]['fields'], + array( + 'um-can_edit_roles' => array( + 'label' => __( 'Can edit these user roles only', 'ultimate-member' ), + 'value' => ! empty( $rolemeta['_um_can_edit_roles'] ) ? implode( ', ', $rolemeta['_um_can_edit_roles'] ) : $labels['all'], + ), + ) + ); + } + + if ( array_key_exists( '_um_can_delete_everyone', $rolemeta ) ) { + $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-' . $key ]['fields'], + array( + 'um-can_delete_everyone' => array( + 'label' => __( 'Can delete other member accounts?', 'ultimate-member' ), + 'value' => $rolemeta['_um_can_delete_everyone'] ? $labels['yes'] : $labels['no'], + ), + ) + ); + } + + if ( array_key_exists( '_um_can_delete_everyone', $rolemeta ) && 1 === absint( $rolemeta['_um_can_delete_everyone'] ) ) { + $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-' . $key ]['fields'], + array( + 'um-can_delete_roles' => array( + 'label' => __( 'Can delete these user roles only', 'ultimate-member' ), + 'value' => ! empty( $rolemeta['_um_can_delete_roles'] ) ? implode( ', ', $rolemeta['_um_can_delete_roles'] ) : $labels['all'], + ), + ) + ); + } + + if ( array_key_exists( '_um_can_edit_profile', $rolemeta ) ) { + $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-' . $key ]['fields'], + array( + 'um-can_edit_profile' => array( + 'label' => __( 'Can edit their profile?', 'ultimate-member' ), + 'value' => $rolemeta['_um_can_edit_profile'] ? $labels['yes'] : $labels['no'], + ), + ) + ); + } + + if ( array_key_exists( '_um_can_delete_profile', $rolemeta ) ) { + $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-' . $key ]['fields'], + array( + 'um-can_delete_profile' => array( + 'label' => __( 'Can delete their account?', 'ultimate-member' ), + 'value' => $rolemeta['_um_can_delete_profile'] ? $labels['yes'] : $labels['no'], + ), + ) + ); + } + + if ( array_key_exists( '_um_can_view_all', $rolemeta ) ) { + $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-' . $key ]['fields'], + array( + 'um-can_view_all' => array( + 'label' => __( 'Can view other member profiles?', 'ultimate-member' ), + 'value' => $rolemeta['_um_can_view_all'] ? $labels['yes'] : $labels['no'], + ), + ) + ); + } + + if ( array_key_exists( '_um_can_view_all', $rolemeta ) && 1 === absint( $rolemeta['_um_can_view_all'] ) ) { + $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-' . $key ]['fields'], + array( + 'um-can_view_roles' => array( + 'label' => __( 'Can view these user roles only', 'ultimate-member' ), + 'value' => ! empty( $rolemeta['_um_can_view_roles'] ) ? implode( ', ', $rolemeta['_um_can_view_roles'] ) : $labels['all'], + ), + ) + ); + } + + if ( isset( $rolemeta['_um_profile_noindex'] ) && '' !== $rolemeta['_um_profile_noindex'] ) { + $profile_noindex = $rolemeta['_um_profile_noindex'] ? $labels['yes'] : $labels['no']; + } else { + $profile_noindex = __( 'Default', 'ultimate-member' ); + } + if ( isset( $rolemeta['_um_default_homepage'] ) && '' !== $rolemeta['_um_default_homepage'] ) { + $default_homepage = $rolemeta['_um_default_homepage'] ? $labels['yes'] : $labels['no']; + } else { + $default_homepage = __( 'No such option', 'ultimate-member' ); + } + + if ( array_key_exists( '_um_can_make_private_profile', $rolemeta ) ) { + $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-' . $key ]['fields'], + array( + 'um-can_make_private_profile' => array( + 'label' => __( 'Can make their profile private?', 'ultimate-member' ), + 'value' => $rolemeta['_um_can_make_private_profile'] ? $labels['yes'] : $labels['no'], + ), + ) + ); + } + + if ( array_key_exists( '_um_can_access_private_profile', $rolemeta ) ) { + $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-' . $key ]['fields'], + array( + 'um-can_access_private_profile' => array( + 'label' => __( 'Can view/access private profiles?', 'ultimate-member' ), + 'value' => $rolemeta['_um_can_access_private_profile'] ? $labels['yes'] : $labels['no'], + ), + ) + ); + } + + $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-' . $key ]['fields'], + array( + 'um-profile_noindex' => array( + 'label' => __( 'Avoid indexing profile by search engines', 'ultimate-member' ), + 'value' => $profile_noindex, + ), + 'um-default_homepage' => array( + 'label' => __( 'Can view default homepage?', 'ultimate-member' ), + 'value' => $default_homepage, + ), + ) + ); + + if ( isset( $rolemeta['_um_default_homepage'] ) && 0 === absint( $rolemeta['_um_default_homepage'] ) ) { + $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-' . $key ]['fields'], + array( + 'um-redirect_homepage' => array( + 'label' => __( 'Custom Homepage Redirect', 'ultimate-member' ), + 'value' => $rolemeta['_um_redirect_homepage'], + ), + ) + ); + } + + $status_options = array( + 'approved' => __( 'Auto Approve', 'ultimate-member' ), + 'checkmail' => __( 'Require Email Activation', 'ultimate-member' ), + 'pending' => __( 'Require Admin Review', 'ultimate-member' ), + ); + + if ( array_key_exists( '_um_status', $rolemeta ) && isset( $status_options[ $rolemeta['_um_status'] ] ) ) { + $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-' . $key ]['fields'], + array( + 'um-status' => array( + 'label' => __( 'Registration Status', 'ultimate-member' ), + 'value' => $status_options[ $rolemeta['_um_status'] ], + ), + ) + ); + } + + if ( array_key_exists( '_um_status', $rolemeta ) && 'approved' === $rolemeta['_um_status'] ) { + $auto_approve_act = array( + 'redirect_profile' => __( 'Redirect to profile', 'ultimate-member' ), + 'redirect_url' => __( 'Redirect to URL', 'ultimate-member' ), + ); + + if ( isset( $auto_approve_act[ $rolemeta['_um_auto_approve_act'] ] ) ) { + $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-' . $key ]['fields'], + array( + 'um-auto_approve_act' => array( + 'label' => __( 'Custom Homepage Redirect', 'ultimate-member' ), + 'value' => $auto_approve_act[ $rolemeta['_um_auto_approve_act'] ], + ), + ) + ); + } + + if ( 'redirect_url' === $rolemeta['_um_auto_approve_act'] && array_key_exists( '_um_auto_approve_url', $rolemeta ) ) { + $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-' . $key ]['fields'], + array( + 'um-auto_approve_url' => array( + 'label' => __( 'Set Custom Redirect URL', 'ultimate-member' ), + 'value' => $rolemeta['_um_auto_approve_url'], + ), + ) + ); + } + } + + if ( array_key_exists( '_um_status', $rolemeta ) && 'checkmail' === $rolemeta['_um_status'] ) { + $checkmail_action = array( + 'show_message' => __( 'Show custom message', 'ultimate-member' ), + 'redirect_url' => __( 'Redirect to URL', 'ultimate-member' ), + ); + + if ( array_key_exists( '_um_login_email_activate', $rolemeta ) ) { + $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-' . $key ]['fields'], + array( + 'um-login_email_activate' => array( + 'label' => __( 'Login user after validating the activation link?', 'ultimate-member' ), + 'value' => $rolemeta['_um_login_email_activate'] ? $labels['yes'] : $labels['no'], + ), + ) + ); + } + + if ( isset( $checkmail_action[ $rolemeta['_um_checkmail_action'] ] ) ) { + $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-' . $key ]['fields'], + array( + 'um-checkmail_action' => array( + 'label' => __( 'Action to be taken after registration', 'ultimate-member' ), + 'value' => $checkmail_action[ $rolemeta['_um_checkmail_action'] ], + ), + ) + ); + } + + if ( 'show_message' === $rolemeta['_um_checkmail_action'] ) { + if ( array_key_exists( '_um_checkmail_message', $rolemeta ) ) { + $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-' . $key ]['fields'], + array( + 'um-checkmail_message' => array( + 'label' => __( 'Personalize the custom message', 'ultimate-member' ), + 'value' => stripslashes( $rolemeta['_um_checkmail_message'] ), + ), + ) + ); + } + } else { + if ( array_key_exists( '_um_checkmail_url', $rolemeta ) ) { + $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-' . $key ]['fields'], + array( + 'um-checkmail_url' => array( + 'label' => __( 'Set Custom Redirect URL', 'ultimate-member' ), + 'value' => $rolemeta['_um_checkmail_url'], + ), + ) + ); + } + } + + if ( array_key_exists( '_um_url_email_activate', $rolemeta ) ) { + $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-' . $key ]['fields'], + array( + 'um-url_email_activate' => array( + 'label' => __( 'URL redirect after e-mail activation', 'ultimate-member' ), + 'value' => $rolemeta['_um_url_email_activate'], + ), + ) + ); + } + } + + if ( array_key_exists( '_um_status', $rolemeta ) && 'pending' === $rolemeta['_um_status'] ) { + $pending_action = array( + 'show_message' => __( 'Show custom message', 'ultimate-member' ), + 'redirect_url' => __( 'Redirect to URL', 'ultimate-member' ), + ); + + if ( array_key_exists( '_um_pending_action', $rolemeta ) ) { + $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-' . $key ]['fields'], + array( + 'um-pending_action' => array( + 'label' => __( 'Action to be taken after registration', 'ultimate-member' ), + 'value' => $pending_action[ $rolemeta['_um_pending_action'] ], + ), + ) + ); + } + + if ( 'show_message' === $rolemeta['_um_pending_action'] ) { + if ( array_key_exists( '_um_pending_message', $rolemeta ) ) { + $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-' . $key ]['fields'], + array( + 'um-pending_message' => array( + 'label' => __( 'Personalize the custom message', 'ultimate-member' ), + 'value' => stripslashes( $rolemeta['_um_pending_message'] ), + ), + ) + ); + } + } else { + if ( array_key_exists( '_um_pending_url', $rolemeta ) ) { + $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-' . $key ]['fields'], + array( + 'um-pending_url' => array( + 'label' => __( 'Set Custom Redirect URL', 'ultimate-member' ), + 'value' => $rolemeta['_um_pending_url'], + ), + ) + ); + } + } + } + + $after_login_options = array( + 'redirect_profile' => __( 'Redirect to profile', 'ultimate-member' ), + 'redirect_url' => __( 'Redirect to URL', 'ultimate-member' ), + 'refresh' => __( 'Refresh active page', 'ultimate-member' ), + 'redirect_admin' => __( 'Redirect to WordPress Admin', 'ultimate-member' ), + ); + + if ( array_key_exists( '_um_after_login', $rolemeta ) && isset( $after_login_options[ $rolemeta['_um_after_login'] ] ) ) { + $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-' . $key ]['fields'], + array( + 'um-after_login' => array( + 'label' => __( 'Action to be taken after login', 'ultimate-member' ), + 'value' => $after_login_options[ $rolemeta['_um_after_login'] ], + ), + ) + ); + } + + if ( array_key_exists( '_um_login_redirect_url', $rolemeta ) && 'redirect_url' === $rolemeta['_um_login_redirect_url'] ) { + if ( array_key_exists( '_um_pending_url', $rolemeta ) ) { + $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-' . $key ]['fields'], + array( + 'um-login_redirect_url' => array( + 'label' => __( 'Set Custom Redirect URL', 'ultimate-member' ), + 'value' => $rolemeta['_um_login_redirect_url'], + ), + ) + ); + } + } + + $redirect_options = array( + 'redirect_home' => __( 'Go to Homepage', 'ultimate-member' ), + 'redirect_url' => __( 'Go to Custom URL', 'ultimate-member' ), + ); + if ( ! isset( $rolemeta['_um_after_logout'] ) ) { + $rolemeta['_um_after_logout'] = 'redirect_home'; + } + if ( array_key_exists( '_um_after_logout', $rolemeta ) && isset( $redirect_options[ $rolemeta['_um_after_logout'] ] ) ) { + $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-' . $key ]['fields'], + array( + 'um-after_logout' => array( + 'label' => __( 'Action to be taken after logout', 'ultimate-member' ), + 'value' => $redirect_options[ $rolemeta['_um_after_logout'] ], + ), + ) + ); + } + + if ( 'redirect_url' === $rolemeta['_um_after_logout'] ) { + if ( array_key_exists( '_um_logout_redirect_url', $rolemeta ) ) { + $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-' . $key ]['fields'], + array( + 'um-logout_redirect_url' => array( + 'label' => __( 'Set Custom Redirect URL', 'ultimate-member' ), + 'value' => $rolemeta['_um_logout_redirect_url'], + ), + ) + ); + } + } + + if ( ! isset( $rolemeta['_um_after_delete'] ) ) { + $rolemeta['_um_after_delete'] = 'redirect_home'; + } + if ( array_key_exists( '_um_after_delete', $rolemeta ) && isset( $redirect_options[ $rolemeta['_um_after_delete'] ] ) ) { + $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-' . $key ]['fields'], + array( + 'um-after_delete' => array( + 'label' => __( 'Action to be taken after account is deleted', 'ultimate-member' ), + 'value' => $redirect_options[ $rolemeta['_um_after_delete'] ], + ), + ) + ); + } + + if ( 'redirect_url' === $rolemeta['_um_after_delete'] ) { + if ( array_key_exists( '_um_delete_redirect_url', $rolemeta ) ) { + $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-' . $key ]['fields'], + array( + 'um-delete_redirect_url' => array( + 'label' => __( 'Set Custom Redirect URL', 'ultimate-member' ), + 'value' => $rolemeta['_um_delete_redirect_url'], + ), + ) + ); + } + } + + if ( ! empty( $rolemeta['wp_capabilities'] ) ) { + if ( array_key_exists( 'wp_capabilities', $rolemeta ) ) { + $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-' . $key ]['fields'], + array( + 'um-wp_capabilities' => array( + 'label' => __( 'WP Capabilities', 'ultimate-member' ), + 'value' => $rolemeta['wp_capabilities'], + ), + ) + ); + } + } + + $info = apply_filters( 'um_debug_information_user_role', $info, $key ); + } + + // Forms settings + if ( ! empty( $this->get_forms() ) ) { + $info['ultimate-member-forms'] = array( + 'label' => __( 'Ultimate Member Forms', 'ultimate-member' ), + 'description' => __( 'This debug information for your Ultimate Member forms.', 'ultimate-member' ), + 'fields' => array( + 'um-forms' => array( + 'label' => __( 'UM Forms', 'ultimate-member' ), + 'value' => $this->get_forms(), + ), + ), + ); + + foreach ( $this->get_forms() as $key => $form ) { + if ( strpos( $key, 'ID#' ) === 0 ) { + $key = substr( $key, 3 ); + } + + $info[ 'ultimate-member-' . $key ] = array( + 'label' => ' - ' . $form . __( ' form settings', 'ultimate-member' ), + 'description' => __( 'This debug information for your Ultimate Member form.', 'ultimate-member' ), + 'fields' => array( + 'um-form-shortcode' => array( + 'label' => __( 'Shortcode', 'ultimate-member' ), + 'value' => '[ultimatemember form_id="' . $key . '"]', + ), + 'um-mode' => array( + 'label' => __( 'Type', 'ultimate-member' ), + 'value' => get_post_meta( $key, '_um_mode', true ), + ), + ), + ); + + if ( 'register' === get_post_meta( $key, '_um_mode', true ) ) { + $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-' . $key ]['fields'], + array( + 'um-register_role' => array( + 'label' => __( 'User registration role', 'ultimate-member' ), + 'value' => 0 === absint( get_post_meta( $key, '_um_register_role', true ) ) ? $labels['default'] : get_post_meta( $key, '_um_register_role', true ), + ), + 'um-register_template' => array( + 'label' => __( 'Template', 'ultimate-member' ), + 'value' => 0 === absint( get_post_meta( $key, '_um_register_template', true ) ) ? $labels['default'] : get_post_meta( $key, '_um_register_template', true ), + ), + 'um-register_primary_btn_word' => array( + 'label' => __( 'Primary Button Text', 'ultimate-member' ), + 'value' => ! get_post_meta( $key, '_um_register_primary_btn_word', true ) ? $labels['default'] : get_post_meta( $key, '_um_register_primary_btn_word', true ), + ), + 'um-register_use_gdpr' => array( + 'label' => __( 'Enable privacy policy agreement', 'ultimate-member' ), + 'value' => get_post_meta( $key, '_um_register_use_gdpr', true ) ? $labels['yes'] : $labels['no'], + ), + ) + ); + + if ( 1 === absint( get_post_meta( $key, '_um_register_use_gdpr', true ) ) ) { + $gdpr_content_id = get_post_meta( $key, '_um_register_use_gdpr_content_id', true ); + + $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-' . $key ]['fields'], + array( + 'um-register_use_gdpr_content_id' => array( + 'label' => __( 'Privacy policy content', 'ultimate-member' ), + 'value' => $gdpr_content_id ? get_the_title( $gdpr_content_id ) . '(' . $gdpr_content_id . ')' . get_the_permalink( $gdpr_content_id ) : '', + ), + 'um-register_use_gdpr_toggle_show' => array( + 'label' => __( 'Toggle Show text', 'ultimate-member' ), + 'value' => get_post_meta( $key, '_um_register_use_gdpr_toggle_show', true ), + ), + 'um-register_use_gdpr_toggle_hide' => array( + 'label' => __( 'Toggle Hide text', 'ultimate-member' ), + 'value' => get_post_meta( $key, '_um_register_use_gdpr_toggle_hide', true ), + ), + 'um-register_use_gdpr_agreement' => array( + 'label' => __( 'Checkbox agreement description', 'ultimate-member' ), + 'value' => get_post_meta( $key, '_um_register_use_gdpr_agreement', true ), + ), + 'um-register_use_gdpr_error_text' => array( + 'label' => __( 'Error Text', 'ultimate-member' ), + 'value' => get_post_meta( $key, '_um_register_use_gdpr_error_text', true ), + ), + ) + ); + } + + $info = apply_filters( 'um_debug_information_register_form', $info, $key ); + + $fields = get_post_meta( $key, '_um_custom_fields', true ); + if ( ! empty( $fields ) && is_array( $fields ) ) { + foreach ( $fields as $field_key => $field ) { + $field_info = $this->get_field_data( $info, $key, $field_key, $field ); + + $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-' . $key ]['fields'], + $field_info + ); + } + } + } elseif ( 'login' === get_post_meta( $key, '_um_mode', true ) ) { + $login_redirect_options = array( + '0' => __( 'Default', 'ultimate-member' ), + 'redirect_profile' => __( 'Redirect to profile', 'ultimate-member' ), + 'redirect_url' => __( 'Redirect to URL', 'ultimate-member' ), + 'refresh' => __( 'Refresh active page', 'ultimate-member' ), + 'redirect_admin' => __( 'Redirect to WordPress Admin', 'ultimate-member' ), + ); + + $login_after_login = get_post_meta( $key, '_um_login_after_login', true ); + $login_after_login = '' === $login_after_login ? '0' : $login_after_login; + + $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-' . $key ]['fields'], + array( + 'um-login_template' => array( + 'label' => __( 'Template', 'ultimate-member' ), + 'value' => 0 === absint( get_post_meta( $key, '_um_login_template', true ) ) ? $labels['default'] : get_post_meta( $key, '_um_login_template', true ), + ), + 'um-login_primary_btn_word' => array( + 'label' => __( 'Primary Button Text', 'ultimate-member' ), + 'value' => ! get_post_meta( $key, '_um_login_primary_btn_word', true ) ? $labels['default'] : get_post_meta( $key, '_um_login_primary_btn_word', true ), + ), + 'um-login_forgot_pass_link' => array( + 'label' => __( 'Show Forgot Password Link?', 'ultimate-member' ), + 'value' => get_post_meta( $key, '_um_login_forgot_pass_link', true ) ? $labels['yes'] : $labels['no'], + ), + 'um-login_show_rememberme' => array( + 'label' => __( 'Show "Remember Me"?', 'ultimate-member' ), + 'value' => get_post_meta( $key, '_um_login_show_rememberme', true ) ? $labels['yes'] : $labels['no'], + ), + 'um-login_after_login' => array( + 'label' => __( 'Redirection after Login', 'ultimate-member' ), + 'value' => $login_redirect_options[ $login_after_login ], + ), + ) + ); + + if ( 'redirect_url' === get_post_meta( $key, '_um_login_after_login', true ) ) { + $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-' . $key ]['fields'], + array( + 'um-login_redirect_url' => array( + 'label' => __( 'Set Custom Redirect URL', 'ultimate-member' ), + 'value' => get_post_meta( $key, '_um_login_redirect_url', true ), + ), + ) + ); + } + + $info = apply_filters( 'um_debug_information_login_form', $info, $key ); + + $fields = get_post_meta( $key, '_um_custom_fields', true ); + if ( ! empty( $fields ) && is_array( $fields ) ) { + foreach ( $fields as $field_key => $field ) { + $field_info = $this->get_field_data( $info, $key, $field_key, $field ); + + $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-' . $key ]['fields'], + $field_info + ); + } + } + } elseif ( 'profile' === get_post_meta( $key, '_um_mode', true ) ) { + $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-' . $key ]['fields'], + array( + 'um-profile_role' => array( + 'label' => __( 'Make this profile form role-specific', 'ultimate-member' ), + 'value' => ! empty( get_post_meta( $key, '_um_profile_role', true ) ) ? get_post_meta( $key, '_um_profile_role', true ) : $labels['all'], + ), + 'um-profile_template' => array( + 'label' => __( 'Template', 'ultimate-member' ), + 'value' => 0 === absint( get_post_meta( $key, '_um_profile_template', true ) ) ? $labels['default'] : get_post_meta( $key, '_um_profile_template', true ), + ), + 'um-profile_primary_btn_word' => array( + 'label' => __( 'Primary Button Text', 'ultimate-member' ), + 'value' => ! get_post_meta( $key, '_um_profile_primary_btn_word', true ) ? $labels['default'] : get_post_meta( $key, '_um_profile_primary_btn_word', true ), + ), + 'um-profile_cover_enabled' => array( + 'label' => __( 'Enable Cover Photos', 'ultimate-member' ), + 'value' => get_post_meta( $key, '_um_profile_cover_enabled', true ) ? $labels['yes'] : $labels['no'], + ), + 'um-profile_disable_photo_upload' => array( + 'label' => __( 'Disable Profile Photo Upload', 'ultimate-member' ), + 'value' => get_post_meta( $key, '_um_profile_disable_photo_upload', true ) ? $labels['yes'] : $labels['no'], + ), + ) + ); + + if ( 0 === absint( get_post_meta( $key, '_um_profile_disable_photo_upload', true ) ) ) { + $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-' . $key ]['fields'], + array( + 'um-profile_photo_required' => array( + 'label' => __( 'Make Profile Photo Required', 'ultimate-member' ), + 'value' => get_post_meta( $key, '_um_profile_photo_required', true ) ? $labels['yes'] : $labels['no'], + ), + ) + ); + } + + $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-' . $key ]['fields'], + array( + 'um-profile_show_name' => array( + 'label' => __( 'Show display name in profile header?', 'ultimate-member' ), + 'value' => get_post_meta( $key, '_um_profile_show_name', true ) ? $labels['yes'] : $labels['no'], + ), + 'um-profile_show_social_links' => array( + 'label' => __( 'Show social links in profile header?', 'ultimate-member' ), + 'value' => get_post_meta( $key, '_um_profile_show_social_links', true ) ? $labels['yes'] : $labels['no'], + ), + 'um-profile_show_bio' => array( + 'label' => __( 'Show user description in profile header?', 'ultimate-member' ), + 'value' => get_post_meta( $key, '_um_profile_show_bio', true ) ? $labels['yes'] : $labels['no'], + ), + ) + ); + + $fields = get_post_meta( $key, '_um_custom_fields', true ); + if ( ! empty( $fields ) && is_array( $fields ) ) { + foreach ( $fields as $field_key => $field ) { + $field_info = $this->get_field_data( $info, $key, $field_key, $field ); + + $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-' . $key ]['fields'], + $field_info + ); + } + } + + $profile_metafields = get_post_meta( $key, '_um_profile_metafields', true ); + if ( ! empty( $profile_metafields ) && is_array( $profile_metafields ) ) { + foreach ( $profile_metafields as $k => $field ) { + $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-' . $key ]['fields'], + array( + 'um-profile_metafields-' . $k => array( + 'label' => __( 'Field to show in user meta', 'ultimate-member' ), + 'value' => $field, + ), + ) + ); + } + } + } + } + } + + // Members directory + $options = array( + 'country' => __( 'Country', 'ultimate-member' ), + 'gender' => __( 'Gender', 'ultimate-member' ), + 'languages' => __( 'Languages', 'ultimate-member' ), + 'role' => __( 'Roles', 'ultimate-member' ), + 'birth_date' => __( 'Age', 'ultimate-member' ), + 'last_login' => __( 'Last Login', 'ultimate-member' ), + 'user_registered' => __( 'User Registered', 'ultimate-member' ), + 'first_name' => __( 'First Name', 'ultimate-member' ), + 'last_name' => __( 'Last Name', 'ultimate-member' ), + 'nickname' => __( 'Nickname', 'ultimate-member' ), + 'secondary_user_email' => __( 'Secondary E-mail Address', 'ultimate-member' ), + 'description' => __( 'Biography', 'ultimate-member' ), + 'phone_number' => __( 'Phone Number', 'ultimate-member' ), + 'mobile_number' => __( 'Mobile Number', 'ultimate-member' ), + 'role_select' => __( 'Roles (Dropdown)', 'ultimate-member' ), + 'role_radio' => __( 'Roles (Radio)', 'ultimate-member' ), + 'whatsapp' => __( 'WhatsApp number', 'ultimate-member' ), + 'facebook' => __( 'Facebook', 'ultimate-member' ), + 'twitter' => __( 'Twitter', 'ultimate-member' ), + 'viber' => __( 'Viber number', 'ultimate-member' ), + 'skype' => __( 'Skype ID', 'ultimate-member' ), + 'telegram' => __( 'Telegram', 'ultimate-member' ), + 'discord' => __( 'Discord', 'ultimate-member' ), + 'youtube' => __( 'Youtube', 'ultimate-member' ), + 'soundcloud' => __( 'SoundCloud', 'ultimate-member' ), + 'user_registered_desc' => __( 'New users first', 'ultimate-member' ), + 'user_registered_asc' => __( 'Old users first', 'ultimate-member' ), + 'username' => __( 'Username', 'ultimate-member' ), + 'display_name' => __( 'Display name', 'ultimate-member' ), + 'last_first_name' => __( 'Last & First name', 'ultimate-member' ), + 'random' => __( 'Random', 'ultimate-member' ), + 'other' => __( 'Other (Custom Field)', 'ultimate-member' ), + ); + + $info['ultimate-member-directories'] = array( + 'label' => __( 'Ultimate Member Directories', 'ultimate-member' ), + 'description' => __( 'This debug information about Ultimate Member directories.', 'ultimate-member' ), + 'fields' => array( + 'um-directory' => array( + 'label' => __( 'Member directories', 'ultimate-member' ), + 'value' => ! empty( $this->get_member_directories() ) ? $this->get_member_directories() : $labels['no-dir'], + ), + ), + ); + + if ( ! empty( $this->get_member_directories() ) ) { + foreach ( $this->get_member_directories() as $key => $directory ) { + if ( 0 === strpos( $key, 'ID#' ) ) { + $key = substr( $key, 3 ); + } + + $view_type = get_post_meta( $key, '_um_view_type', true ); + + $info[ 'ultimate-member-directory-' . $key ] = array( + 'label' => ' - ' . $directory . __( ' directory settings', 'ultimate-member' ), + 'description' => __( 'This debug information for your Ultimate Member directory.', 'ultimate-member' ), + 'fields' => array( + 'um-directory-shortcode' => array( + 'label' => __( 'Shortcode', 'ultimate-member' ), + 'value' => '[ultimatemember_directory id="' . $key . '"]', + ), + 'um-directory_template' => array( + 'label' => __( 'Template', 'ultimate-member' ), + 'value' => get_post_meta( $key, '_um_directory_template', true ) ? get_post_meta( $key, '_um_directory_template', true ) : $labels['default'], + ), + 'um-directory-view_type' => array( + 'label' => __( 'View type', 'ultimate-member' ), + 'value' => $view_type, + ), + ), + ); + + if ( 'grid' === $view_type ) { + $info[ 'ultimate-member-directory-' . $key ]['fields']['um-directory-grid_columns'] = get_post_meta( $key, '_um_grid_columns', true ); + } + + if ( isset( $options[ get_post_meta( $key, '_um_sortby', true ) ] ) ) { + $sortby_label = $options[ get_post_meta( $key, '_um_sortby', true ) ]; + } else { + $sortby_label = get_post_meta( $key, '_um_sortby', true ); + } + + $info[ 'ultimate-member-directory-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-directory-' . $key ]['fields'], + array( + 'um-directory-roles' => array( + 'label' => __( 'Default view type', 'ultimate-member' ), + 'value' => ! empty( get_post_meta( $key, '_um_roles', true ) ) ? implode( ', ', get_post_meta( $key, '_um_roles', true ) ) : $labels['all'], + ), + 'um-directory-has_profile_photo' => array( + 'label' => __( 'Only show members who have uploaded a profile photo', 'ultimate-member' ), + 'value' => get_post_meta( $key, '_um_has_profile_photo', true ) ? $labels['yes'] : $labels['no'], + ), + 'um-directory-has_cover_photo' => array( + 'label' => __( 'Only show members who have uploaded a profile photo', 'ultimate-member' ), + 'value' => get_post_meta( $key, '_um_has_cover_photo', true ) ? $labels['yes'] : $labels['no'], + ), + 'um-directory-show_these_users' => array( + 'label' => __( 'Only show specific users (Enter one username per line)', 'ultimate-member' ), + 'value' => ! empty( get_post_meta( $key, '_um_show_these_users', true ) ) ? implode( ', ', get_post_meta( $key, '_um_show_these_users', true ) ) : '', + ), + 'um-directory-exclude_these_users' => array( + 'label' => __( 'Exclude specific users (Enter one username per line)', 'ultimate-member' ), + 'value' => ! empty( get_post_meta( $key, '_um_exclude_these_users', true ) ) ? implode( ', ', get_post_meta( $key, '_um_exclude_these_users', true ) ) : '', + ), + ) + ); + + $info = apply_filters( 'um_debug_member_directory_general_extend', $info, $key ); + + $info[ 'ultimate-member-directory-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-directory-' . $key ]['fields'], + array( + 'um-directory-sortby' => array( + 'label' => __( 'Default sort users by', 'ultimate-member' ), + 'value' => $sortby_label, + ), + ) + ); + + if ( 'other' === get_post_meta( $key, '_um_sortby', true ) ) { + $info[ 'ultimate-member-directory-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-directory-' . $key ]['fields'], + array( + 'um-directory-sortby_custom' => array( + 'label' => __( 'Meta key', 'ultimate-member' ), + 'value' => get_post_meta( $key, '_um_sortby_custom', true ), + ), + 'um-directory-sortby_custom_label' => array( + 'label' => __( 'Label of custom sort', 'ultimate-member' ), + 'value' => get_post_meta( $key, '_um_sortby_custom_label', true ), + ), + 'um-directory-enable_sorting' => array( + 'label' => __( 'Enable custom sorting', 'ultimate-member' ), + 'value' => get_post_meta( $key, '_um_enable_sorting', true ) ? $labels['yes'] : $labels['no'], + ), + ) + ); + } + + if ( 1 === absint( get_post_meta( $key, '_um_enable_sorting', true ) ) ) { + $sorting_fields = get_post_meta( $key, '_um_sorting_fields', true ); + if ( ! empty( $sorting_fields ) ) { + foreach ( $sorting_fields as $k => $field ) { + if ( is_array( $field ) ) { + $info[ 'ultimate-member-directory-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-directory-' . $key ]['fields'], + array( + 'um-directory-sorting_fields-' . $k => array( + 'label' => __( 'Field(s) to enable in sorting', 'ultimate-member' ), + 'value' => __( 'Label: ', 'ultimate-member' ) . array_values( $field )[0] . ' | ' . __( 'Meta key: ', 'ultimate-member' ) . stripslashes( array_keys( $field )[0] ), + ), + ) + ); + } else { + if ( isset( $options[ $field ] ) ) { + $sortby_label = $options[ $field ]; + } else { + $sortby_label = $field; + } + $info[ 'ultimate-member-directory-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-directory-' . $key ]['fields'], + array( + 'um-directory-sorting_fields-' . $k => array( + 'label' => __( 'Field to enable in sorting', 'ultimate-member' ), + 'value' => $sortby_label, + ), + ) + ); + } + } + } + } + + $info[ 'ultimate-member-directory-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-directory-' . $key ]['fields'], + array( + 'um-directory-profile_photo' => array( + 'label' => __( 'Enable Profile Photo', 'ultimate-member' ), + 'value' => get_post_meta( $key, '_um_profile_photo', true ) ? $labels['yes'] : $labels['no'], + ), + 'um-directory-cover_photos' => array( + 'label' => __( 'Enable Cover Photo', 'ultimate-member' ), + 'value' => get_post_meta( $key, '_um_cover_photos', true ) ? $labels['yes'] : $labels['no'], + ), + 'um-directory-show_name' => array( + 'label' => __( 'Show display name', 'ultimate-member' ), + 'value' => get_post_meta( $key, '_um_show_name', true ) ? $labels['yes'] : $labels['no'], + ), + ) + ); + + $info = apply_filters( 'um_debug_member_directory_profile_extend', $info, $key ); + + $info[ 'ultimate-member-directory-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-directory-' . $key ]['fields'], + array( + 'um-directory-show_tagline' => array( + 'label' => __( 'Show tagline below profile name', 'ultimate-member' ), + 'value' => get_post_meta( $key, '_um_show_tagline', true ) ? $labels['yes'] : $labels['no'], + ), + ) + ); + + if ( 1 === absint( get_post_meta( $key, '_um_show_tagline', true ) ) ) { + $tagline_fields = get_post_meta( $key, '_um_tagline_fields', true ); + if ( ! empty( $tagline_fields ) && is_array( $tagline_fields ) ) { + foreach ( $tagline_fields as $k => $field ) { + $label = isset( $options[ $field ] ) ? $options[ $field ] : $field; + $info[ 'ultimate-member-directory-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-directory-' . $key ]['fields'], + array( + 'um-directory-tagline_fields-' . $k => array( + 'label' => __( 'Field to display in tagline', 'ultimate-member' ), + 'value' => $label, + ), + ) + ); + } + } + } + + $info[ 'ultimate-member-directory-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-directory-' . $key ]['fields'], + array( + 'um-directory-show_userinfo' => array( + 'label' => __( 'Show extra user information below tagline?', 'ultimate-member' ), + 'value' => get_post_meta( $key, '_um_show_userinfo', true ) ? $labels['yes'] : $labels['no'], + ), + ) + ); + + if ( 1 === absint( get_post_meta( $key, '_um_show_userinfo', true ) ) ) { + $reveal_fields = get_post_meta( $key, '_um_reveal_fields', true ); + if ( ! empty( $reveal_fields ) && is_array( $reveal_fields ) ) { + foreach ( $reveal_fields as $k => $field ) { + $label = isset( $options[ $field ] ) ? $options[ $field ] : $field; + $info[ 'ultimate-member-directory-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-directory-' . $key ]['fields'], + array( + 'um-directory-reveal_fields-' . $k => array( + 'label' => __( 'Field to display in extra user information section', 'ultimate-member' ), + 'value' => $label, + ), + ) + ); + } + } + } + + $info[ 'ultimate-member-directory-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-directory-' . $key ]['fields'], + array( + 'um-directory-show_social' => array( + 'label' => __( 'Show social connect icons in extra user information section', 'ultimate-member' ), + 'value' => get_post_meta( $key, '_um_show_social', true ) ? $labels['yes'] : $labels['no'], + ), + 'um-directory-search' => array( + 'label' => __( 'Enable Search feature', 'ultimate-member' ), + 'value' => get_post_meta( $key, '_um_search', true ) ? $labels['yes'] : $labels['no'], + ), + ) + ); + + if ( 1 === absint( get_post_meta( $key, '_um_search', true ) ) ) { + $info[ 'ultimate-member-directory-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-directory-' . $key ]['fields'], + array( + 'um-directory-roles_can_search' => array( + 'label' => __( 'User Roles that can use search', 'ultimate-member' ), + 'value' => ! empty( get_post_meta( $key, '_um_roles_can_search', true ) ) ? implode( ', ', get_post_meta( $key, '_um_roles_can_search', true ) ) : $labels['all'], + ), + ) + ); + } + + $info[ 'ultimate-member-directory-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-directory-' . $key ]['fields'], + array( + 'um-directory-filters' => array( + 'label' => __( 'Enable Filters feature', 'ultimate-member' ), + 'value' => get_post_meta( $key, '_um_filters', true ) ? $labels['yes'] : $labels['no'], + ), + ) + ); + + if ( 1 === absint( get_post_meta( $key, '_um_filters', true ) ) ) { + $info[ 'ultimate-member-directory-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-directory-' . $key ]['fields'], + array( + 'um-directory-roles_can_filter' => array( + 'label' => __( 'User Roles that can use filters', 'ultimate-member' ), + 'value' => ! empty( get_post_meta( $key, '_um_roles_can_filter', true ) ) ? implode( ', ', get_post_meta( $key, '_um_roles_can_filter', true ) ) : $labels['all'], + ), + ) + ); + + $search_fields = get_post_meta( $key, '_um_search_fields', true ); + if ( ! empty( $search_fields ) && is_array( $search_fields ) ) { + foreach ( $search_fields as $k => $field ) { + $label = isset( $options[ $field ] ) ? $options[ $field ] : $field; + $info[ 'ultimate-member-directory-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-directory-' . $key ]['fields'], + array( + 'um-directory-search_fields-' . $k => array( + 'label' => __( 'Filter meta to enable', 'ultimate-member' ), + 'value' => $label, + ), + ) + ); + } + } + } + + $info[ 'ultimate-member-directory-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-directory-' . $key ]['fields'], + array( + 'um-directory-filters_expanded' => array( + 'label' => __( 'Expand the filter bar by default', 'ultimate-member' ), + 'value' => get_post_meta( $key, '_um_filters_expanded', true ) ? $labels['yes'] : $labels['no'], + ), + ) + ); + + if ( 1 === absint( get_post_meta( $key, '_um_filters_expanded', true ) ) ) { + $info[ 'ultimate-member-directory-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-directory-' . $key ]['fields'], + array( + 'um-directory-filters_is_collapsible' => array( + 'label' => __( 'Can filter bar be collapsed', 'ultimate-member' ), + 'value' => get_post_meta( $key, '_um_filters_is_collapsible', true ) ? $labels['yes'] : $labels['no'], + ), + ) + ); + } + + $search_filters = get_post_meta( $key, '_um_search_filters', true ); + if ( ! empty( $search_filters ) && is_array( $search_filters ) ) { + foreach ( $search_filters as $k => $field ) { + $label = isset( $options[ $k ] ) ? $options[ $k ] : $k; + $value = $field; + if ( is_array( $field ) ) { + $value = __( 'From ', 'ultimate-member' ) . $field[0] . __( ' to ', 'ultimate-member' ) . $field[1]; + } + $info[ 'ultimate-member-directory-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-directory-' . $key ]['fields'], + array( + 'um-directory-search_filters-' . $k => array( + 'label' => __( 'Admin filtering', 'ultimate-member' ), + 'value' => $label . ' - ' . $value, + ), + ) + ); + } + } + + $info[ 'ultimate-member-directory-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-directory-' . $key ]['fields'], + array( + 'um-directory-must_search' => array( + 'label' => __( 'Show results only after search/filtration', 'ultimate-member' ), + 'value' => get_post_meta( $key, '_um_must_search', true ) ? $labels['yes'] : $labels['no'], + ), + 'um-directory-max_users' => array( + 'label' => __( 'Maximum number of profiles', 'ultimate-member' ), + 'value' => get_post_meta( $key, '_um_max_users', true ), + ), + 'um-directory-profiles_per_page' => array( + 'label' => __( 'Number of profiles per page', 'ultimate-member' ), + 'value' => get_post_meta( $key, '_um_profiles_per_page', true ), + ), + 'um-directory-profiles_per_page_mobile' => array( + 'label' => __( 'Maximum number of profiles', 'ultimate-member' ), + 'value' => get_post_meta( $key, '_um_profiles_per_page_mobile', true ), + ), + 'um-directory-directory_header' => array( + 'label' => __( 'Results Text', 'ultimate-member' ), + 'value' => get_post_meta( $key, '_um_directory_header', true ), + ), + 'um-directory-directory_header_single' => array( + 'label' => __( 'Single Result Text', 'ultimate-member' ), + 'value' => get_post_meta( $key, '_um_directory_header_single', true ), + ), + 'um-directory-directory_no_users' => array( + 'label' => __( 'Custom text if no users were found', 'ultimate-member' ), + 'value' => get_post_meta( $key, '_um_directory_no_users', true ), + ), + ) + ); + + $info = apply_filters( 'um_debug_member_directory_extend', $info, $key ); + } + } + + return $info; + } +} diff --git a/includes/admin/core/class-admin-builder.php b/includes/admin/core/class-admin-builder.php index 1ed73dbc..0a9567eb 100644 --- a/includes/admin/core/class-admin-builder.php +++ b/includes/admin/core/class-admin-builder.php @@ -49,6 +49,12 @@ if ( ! class_exists( 'um\admin\core\Admin_Builder' ) ) { return $errors; } + $blacklist_error = UM()->builtin()->blacklist_field_err( $submission_data['post']['_metakey'] ); + if ( ! empty( $blacklist_error ) ) { + $errors['_metakey'] = $blacklist_error; + return $errors; + } + $field_attr = UM()->builtin()->get_core_field_attrs( $submission_data['field_type'] ); if ( ! array_key_exists( 'validate', $field_attr ) ) { return $errors; diff --git a/includes/admin/core/class-admin-enqueue.php b/includes/admin/core/class-admin-enqueue.php deleted file mode 100644 index b540ae27..00000000 --- a/includes/admin/core/class-admin-enqueue.php +++ /dev/null @@ -1,753 +0,0 @@ -js_url = um_url . 'includes/admin/assets/js/'; - $this->css_url = um_url . 'includes/admin/assets/css/'; - - $this->front_js_baseurl = um_url . 'assets/js/'; - $this->front_css_baseurl = um_url . 'assets/css/'; - - $this->suffix = ( defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG || defined( 'UM_SCRIPT_DEBUG' ) ) ? '' : '.min'; - - $this->um_cpt_form_screen = false; - - add_action( 'admin_head', array( &$this, 'admin_head' ), 9 ); - - add_action( 'admin_enqueue_scripts', array( &$this, 'admin_enqueue_scripts' ) ); - - add_filter( 'enter_title_here', array( &$this, 'enter_title_here' ) ); - - add_action( 'load-user-new.php', array( &$this, 'enqueue_role_wrapper' ) ); - add_action( 'load-user-edit.php', array( &$this, 'enqueue_role_wrapper' ) ); - - add_action( 'load-post-new.php', array( &$this, 'enqueue_cpt_scripts' ) ); - add_action( 'load-post.php', array( &$this, 'enqueue_cpt_scripts' ) ); - - global $wp_version; - if ( version_compare( $wp_version, '5.8', '>=' ) ) { - add_filter( 'block_categories_all', array( &$this, 'blocks_category' ), 10, 2 ); - } else { - add_filter( 'block_categories', array( &$this, 'blocks_category' ), 10, 2 ); - } - add_action( 'enqueue_block_assets', array( &$this, 'block_editor' ), 11 ); - } - - - /** - * Enqueue Gutenberg Block Editor assets - */ - public function block_editor() { - wp_register_style( 'um_ui', um_url . 'assets/css/jquery-ui.css', array(), ultimatemember_version ); - wp_register_style( 'um_members', um_url . 'assets/css/um-members.css', array( 'um_ui' ), ultimatemember_version ); - if ( is_rtl() ) { - wp_register_style( 'um_members_rtl', um_url . 'assets/css/um-members-rtl.css', array( 'um_members' ), ultimatemember_version ); - } - wp_register_style( 'um_styles', um_url . 'assets/css/um-styles.css', array(), ultimatemember_version ); - wp_register_style( 'um_profile', um_url . 'assets/css/um-profile.css', array(), ultimatemember_version ); - wp_register_style( 'um_crop', um_url . 'assets/css/um-crop.css', array(), ultimatemember_version ); - wp_register_style( 'um_responsive', um_url . 'assets/css/um-responsive.css', array( 'um_profile', 'um_crop' ), ultimatemember_version ); - wp_register_style( 'um_account', um_url . 'assets/css/um-account.css', array(), ultimatemember_version ); - wp_register_style( 'um_default_css', um_url . 'assets/css/um-old-default.css', array(), ultimatemember_version ); - wp_register_style( 'um_fonticons_fa', um_url . 'assets/css/um-fonticons-fa.css', array(), ultimatemember_version ); - wp_register_style( 'select2', um_url . 'assets/css/select2/select2' . $this->suffix . '.css', array(), ultimatemember_version ); - wp_register_style( 'um_fonticons_ii', um_url . 'assets/css/um-fonticons-ii.css', array(), ultimatemember_version ); - - wp_register_script( 'um_admin_blocks_shortcodes', um_url . 'assets/js/um-blocks' . $this->suffix . '.js', array( 'wp-i18n', 'wp-blocks', 'wp-components' ), ultimatemember_version, true ); - wp_set_script_translations( 'um_admin_blocks_shortcodes', 'ultimate-member' ); - - if ( ! empty( UM()->account()->get_tab_fields( 'notifications', array() ) ) ) { - $notifications_enabled = 1; - } else { - $notifications_enabled = 0; - } - - $um_account_settings = array( - 'general' => array( - 'label' => __( 'General', 'ultimate-member' ), - 'enabled' => 1, - ), - 'password' => array( - 'label' => __( 'Password', 'ultimate-member' ), - 'enabled' => UM()->options()->get( 'account_tab_password' ), - ), - 'privacy' => array( - 'label' => __( 'Privacy', 'ultimate-member' ), - 'enabled' => UM()->options()->get( 'account_tab_privacy' ), - ), - 'notifications' => array( - 'label' => __( 'Notifications', 'ultimate-member' ), - 'enabled' => $notifications_enabled, - ), - 'delete' => array( - 'label' => __( 'Delete', 'ultimate-member' ), - 'enabled' => UM()->options()->get( 'account_tab_delete' ), - ), - ); - $um_account_settings = apply_filters( 'um_extend_account_settings', $um_account_settings ); - wp_localize_script( 'um_admin_blocks_shortcodes', 'um_account_settings', $um_account_settings ); - - wp_enqueue_script( 'um_admin_blocks_shortcodes' ); - - wp_register_script( 'select2', um_url . 'assets/js/select2/select2.full' . $this->suffix . '.js', array( 'jquery', 'jquery-masonry' ), ultimatemember_version, true ); - wp_register_script( 'um_datetime', um_url . 'assets/js/pickadate/picker.js', array( 'jquery' ), ultimatemember_version, true ); - wp_register_script( 'um_datetime_date', um_url . 'assets/js/pickadate/picker.date.js', array( 'jquery', 'um_datetime' ), ultimatemember_version, true ); - wp_register_script( 'um_datetime_time', um_url . 'assets/js/pickadate/picker.time.js', array( 'jquery', 'um_datetime' ), ultimatemember_version, true ); - wp_register_script( 'um_conditional', um_url . 'assets/js/um-conditional' . $this->suffix . '.js', array( 'jquery', 'wp-hooks' ), ultimatemember_version, true ); - wp_register_script( 'um_scripts', um_url . 'assets/js/um-scripts' . $this->suffix . '.js', array( 'jquery', 'wp-util', 'um_conditional', 'um_datetime', 'um_datetime_date', 'um_datetime_time', 'select2' ), ultimatemember_version, true ); - $max_upload_size = wp_max_upload_size(); - if ( ! $max_upload_size ) { - $max_upload_size = 0; - } - - $localize_data = apply_filters( - 'um_enqueue_localize_data', - array( - 'max_upload_size' => $max_upload_size, - 'nonce' => wp_create_nonce( 'um-frontend-nonce' ), - ) - ); - wp_localize_script( 'um_scripts', 'um_scripts', $localize_data ); - - wp_register_script( 'um_dropdown', um_url . 'assets/js/dropdown' . $this->suffix . '.js', array( 'jquery' ), ultimatemember_version, true ); - wp_register_script( 'um_members', um_url . 'assets/js/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_account', um_url . 'assets/js/um-account' . $this->suffix . '.js', array( 'jquery', 'wp-hooks' ), ultimatemember_version, true ); - wp_register_script( 'um_scrollbar', um_url . 'assets/js/simplebar' . $this->suffix . '.js', array( 'jquery' ), ultimatemember_version, true ); - wp_register_script( 'um_crop', um_url . 'assets/js/um-crop' . $this->suffix . '.js', array( 'jquery' ), ultimatemember_version, true ); - wp_register_script( 'um_functions', um_url . 'assets/js/um-functions' . $this->suffix . '.js', array( 'jquery', 'jquery-masonry', 'wp-util', 'um_scrollbar' ), ultimatemember_version, true ); - wp_register_script( 'um_responsive', um_url . 'assets/js/um-responsive' . $this->suffix . '.js', array( 'jquery', 'um_functions', 'um_crop' ), ultimatemember_version, true ); - - // render blocks - wp_enqueue_script( 'um_datetime' ); - wp_enqueue_script( 'um_datetime_date' ); - wp_enqueue_script( 'um_datetime_time' ); - wp_enqueue_script( 'um_conditional' ); - wp_enqueue_script( 'um_dropdown' ); - wp_enqueue_script( 'um_members' ); - wp_enqueue_script( 'um_account' ); - wp_enqueue_script( 'um_scrollbar' ); - wp_enqueue_script( 'um_crop' ); - wp_enqueue_script( 'um_functions' ); - wp_enqueue_script( 'um_responsive' ); - - wp_enqueue_style( 'um_fonticons_ii' ); - wp_enqueue_style( 'select2' ); - wp_enqueue_style( 'um_default_css' ); - wp_enqueue_style( 'um_fonticons_fa' ); - wp_enqueue_style( 'um_members' ); - wp_enqueue_style( 'um_styles' ); - wp_enqueue_style( 'um_profile' ); - wp_enqueue_style( 'um_crop' ); - wp_enqueue_style( 'um_responsive' ); - wp_enqueue_style( 'um_account' ); - - $custom_css = '.um{opacity: 1;}.um_request_name {display: none !important;}'; - - wp_add_inline_style( 'um_styles', $custom_css ); - } - - - public function enqueue_role_wrapper() { - add_action( 'admin_enqueue_scripts', array( &$this, 'load_role_wrapper' ) ); - } - - - /** - * - */ - public function enqueue_cpt_scripts() { - // phpcs:ignore WordPress.Security.NonceVerification - if ( ( isset( $_GET['post_type'] ) && 'um_form' === sanitize_key( $_GET['post_type'] ) ) || ( isset( $_GET['post'] ) && 'um_form' === get_post_type( absint( $_GET['post'] ) ) ) ) { - $this->um_cpt_form_screen = true; - add_action( 'admin_footer', array( $this, 'admin_footer_scripts' ), 20 ); - } - } - - - /** - * - */ - public function enqueue_frontend_preview_assets() { - //scripts for FRONTEND PREVIEW - if ( class_exists( 'WooCommerce' ) ) { - wp_dequeue_style( 'select2' ); - wp_deregister_style( 'select2' ); - - wp_dequeue_script( 'select2' ); - wp_deregister_script( 'select2' ); - } - - wp_register_script( 'select2', $this->front_js_baseurl . 'select2/select2.full' . $this->suffix . '.js', array( 'jquery', 'jquery-masonry' ), '4.0.13', true ); - wp_register_script( 'um_jquery_form', $this->front_js_baseurl . 'um-jquery-form' . $this->suffix . '.js', array( 'jquery' ), ultimatemember_version, true ); - wp_register_script( 'um_fileupload', $this->front_js_baseurl . 'um-fileupload.js', array( 'jquery' ), ultimatemember_version, true ); - wp_register_script( 'um_crop', $this->front_js_baseurl . 'um-crop' . $this->suffix . '.js', array( 'jquery' ), ultimatemember_version, true ); - wp_register_script( 'um_tipsy', $this->front_js_baseurl . 'um-tipsy' . $this->suffix . '.js', array( 'jquery' ), ultimatemember_version, true ); - wp_register_script( 'um_functions', $this->front_js_baseurl . 'um-functions' . $this->suffix . '.js', array( 'jquery', 'um_tipsy', 'um_scrollbar' ), ultimatemember_version, true ); - - wp_register_script( 'um_datetime', $this->front_js_baseurl . 'pickadate/picker.js', array( 'jquery' ), ultimatemember_version, true ); - wp_register_script( 'um_datetime_date', $this->front_js_baseurl . 'pickadate/picker.date.js', array( 'jquery', 'um_datetime' ), ultimatemember_version, true ); - wp_register_script( 'um_datetime_time', $this->front_js_baseurl . 'pickadate/picker.time.js', array( 'jquery', 'um_datetime' ), ultimatemember_version, true ); - //wp_register_script( 'um_datetime_legacy', $this->front_js_baseurl . 'pickadate/legacy.js', array( 'jquery', 'um_datetime' ), ultimatemember_version, true ); - // load a localized version for date/time - $locale = get_locale(); - if ( $locale ) { - if ( file_exists( WP_LANG_DIR . '/plugins/ultimate-member/assets/js/pickadate/' . $locale . '.js' ) ) { - wp_register_script( 'um_datetime_locale', content_url() . '/languages/plugins/ultimate-member/assets/js/pickadate/' . $locale . '.js', array( 'jquery', 'um_datetime' ), ultimatemember_version, true ); - } elseif ( file_exists( um_path . 'assets/js/pickadate/translations/' . $locale . '.js' ) ) { - wp_register_script( 'um_datetime_locale', um_url . 'assets/js/pickadate/translations/' . $locale . '.js', array( 'jquery', 'um_datetime' ), ultimatemember_version, true ); - } - } - - wp_register_script( 'um_scripts', $this->front_js_baseurl . 'um-scripts' . $this->suffix . '.js', array( 'um_functions', 'um_crop', 'um_raty', 'select2', 'um_jquery_form', 'um_fileupload', 'um_datetime', 'um_datetime_date', 'um_datetime_time'/*, 'um_datetime_legacy'*/ ), ultimatemember_version, true ); - wp_register_script( 'um_responsive', $this->front_js_baseurl . 'um-responsive' . $this->suffix . '.js', array( 'um_scripts' ), ultimatemember_version, true ); - wp_register_script( 'um_modal', $this->front_js_baseurl . 'um-modal' . $this->suffix . '.js', array( 'um_responsive' ), ultimatemember_version, true ); - - wp_register_style( 'select2', $this->front_css_baseurl . 'select2/select2' . $this->suffix . '.css', array(), '4.0.13' ); - wp_register_style( 'um_datetime', $this->front_css_baseurl . 'pickadate/default.css', array(), ultimatemember_version ); - wp_register_style( 'um_datetime_date', $this->front_css_baseurl . 'pickadate/default.date.css', array( 'um_datetime' ), ultimatemember_version ); - wp_register_style( 'um_datetime_time', $this->front_css_baseurl . 'pickadate/default.time.css', array( 'um_datetime' ), ultimatemember_version ); - - wp_register_style( 'um_scrollbar', $this->front_css_baseurl . 'simplebar.css', array(), ultimatemember_version ); - wp_register_style( 'um_crop', $this->front_css_baseurl . 'um-crop.css', array(), ultimatemember_version ); - wp_register_style( 'um_tipsy', $this->front_css_baseurl . 'um-tipsy.css', array(), ultimatemember_version ); - wp_register_style( 'um_responsive', $this->front_css_baseurl . 'um-responsive.css', array(), ultimatemember_version ); - wp_register_style( 'um_modal', $this->front_css_baseurl . 'um-modal.css', array(), ultimatemember_version ); - wp_register_style( 'um_styles', $this->front_css_baseurl . 'um-styles.css', array(), ultimatemember_version ); - wp_register_style( 'um_members', $this->front_css_baseurl . 'um-members.css', array(), ultimatemember_version ); - wp_register_style( 'um_profile', $this->front_css_baseurl . 'um-profile.css', array(), ultimatemember_version ); - wp_register_style( 'um_account', $this->front_css_baseurl . 'um-account.css', array(), ultimatemember_version ); - wp_register_style( 'um_misc', $this->front_css_baseurl . 'um-misc.css', array(), ultimatemember_version ); - wp_register_style( 'um_default_css', $this->front_css_baseurl . 'um-old-default.css', array( 'um_crop', 'um_tipsy', 'um_raty', 'um_responsive', 'um_modal', 'um_styles', 'um_members', 'um_profile', 'um_account', 'um_misc', 'um_datetime_date', 'um_datetime_time', 'um_scrollbar', 'select2' ), ultimatemember_version ); - - wp_enqueue_script( 'um_modal' ); - wp_enqueue_style( 'um_default_css' ); - } - - - /** - * Load js for Add/Edit User form - */ - public function load_role_wrapper() { - wp_register_script( 'um_admin_role_wrapper', $this->js_url . 'um-admin-role-wrapper.js', array( 'jquery' ), ultimatemember_version, true ); - $localize_roles_data = get_option( 'um_roles', array() ); - wp_localize_script( 'um_admin_role_wrapper', 'um_roles', (array) $localize_roles_data ); - wp_enqueue_script( 'um_admin_role_wrapper' ); - } - - - /** - * Enter title placeholder - * - * @param $title - * - * @return string - */ - public function enter_title_here( $title ) { - $screen = get_current_screen(); - if ( 'um_directory' === $screen->post_type ) { - $title = __( 'e.g. Member Directory', 'ultimate-member' ); - } elseif ( 'um_form' === $screen->post_type ) { - $title = __( 'e.g. New Registration Form', 'ultimate-member' ); - } - return $title; - } - - - /** - * Runs on admin head - */ - public function admin_head() { - if ( UM()->admin()->is_plugin_post_type() ) { ?> - - css_url . 'um-admin-form.css', array(), ultimatemember_version ); - wp_enqueue_style( 'um_admin_form' ); - - wp_register_script( 'um_admin_form', $this->js_url . 'um-admin-form.js', array( 'jquery' ), ultimatemember_version, true ); - wp_enqueue_script( 'um_admin_form' ); - } - - - /** - * Load Forms - */ - public function load_forms() { - if ( class_exists( 'WooCommerce' ) ) { - wp_dequeue_style( 'select2' ); - wp_deregister_style( 'select2' ); - - wp_dequeue_script( 'select2' ); - wp_deregister_script( 'select2' ); - } - - wp_register_script( 'select2', $this->front_js_baseurl . 'select2/select2.full' . $this->suffix . '.js', array( 'jquery', 'jquery-masonry' ), '4.0.13', true ); - wp_register_style( 'select2', $this->front_css_baseurl . 'select2/select2' . $this->suffix . '.css', array(), '4.0.13' ); - - wp_register_style( 'um_ui', $this->front_css_baseurl . 'jquery-ui.css', array(), ultimatemember_version ); - wp_register_style( 'um_admin_forms', $this->css_url . 'um-admin-forms.css', array( 'wp-color-picker', 'um_ui', 'select2' ), ultimatemember_version ); - wp_enqueue_style( 'um_admin_forms' ); - - wp_register_script( 'um_admin_forms', $this->js_url . 'um-admin-forms.js', array( 'jquery', 'wp-i18n', 'select2' ), ultimatemember_version, true ); - - wp_localize_script( - 'um_admin_forms', - 'um_forms_data', - array( - 'successfully_redirect' => add_query_arg( - array( - 'page' => 'um_options', - 'tab' => 'misc', - 'msg' => 'updated', - ), - admin_url( 'admin.php' ) - ), - 'md_sorting_data_types' => UM()->member_directory()->sort_data_types, - ) - ); - - wp_enqueue_script( 'um_admin_forms' ); - } - - - /** - * Load dashboard - */ - public function load_dashboard() { - wp_register_style( 'um_admin_dashboard', $this->css_url . 'um-admin-dashboard.css', array(), ultimatemember_version ); - wp_enqueue_style( 'um_admin_dashboard' ); - } - - - /** - * Load settings - */ - public function load_settings() { - wp_register_style( 'um_admin_settings', $this->css_url . 'um-admin-settings.css', array(), ultimatemember_version ); - wp_enqueue_style( 'um_admin_settings' ); - - wp_register_script( 'um_admin_settings', $this->js_url . 'um-admin-settings.js', array( 'jquery', 'wp-i18n' ), ultimatemember_version, true ); - wp_enqueue_script( 'um_admin_settings' ); - } - - - /** - * Load modal - */ - public function load_modal() { - wp_register_style( 'um_admin_modal', $this->css_url . 'um-admin-modal.css', array( 'wp-color-picker' ), ultimatemember_version ); - wp_enqueue_style( 'um_admin_modal' ); - - wp_register_script( 'um_admin_modal', $this->js_url . 'um-admin-modal.js', array( 'jquery', 'editor', 'wp-util', 'wp-color-picker', 'wp-tinymce', 'wp-i18n', 'jquery-ui-tooltip', 'um_admin_scripts' ), ultimatemember_version, true ); - wp_enqueue_script( 'um_admin_modal' ); - } - - - /** - * Field Processing - */ - public function load_field() { - wp_register_script( 'um_admin_field', $this->js_url . 'um-admin-field.js', array( 'jquery', 'wp-util', 'wp-i18n' ), ultimatemember_version, true ); - wp_enqueue_script( 'um_admin_field' ); - } - - - /** - * Load Builder - */ - public function load_builder() { - wp_register_script( 'um_admin_builder', $this->js_url . 'um-admin-builder.js', array( 'jquery', 'wp-util' ), ultimatemember_version, true ); - wp_enqueue_script( 'um_admin_builder' ); - - //hide footer text on add/edit UM Forms - //layouts crashed because we load and hide metaboxes - //and WP calculate page height - $hide_footer = false; - global $pagenow, $post; - // phpcs:ignore WordPress.Security.NonceVerification - if ( ( 'post.php' === $pagenow || 'post-new.php' === $pagenow ) && ( ( isset( $_GET['post_type'] ) && 'um_form' === sanitize_key( $_GET['post_type'] ) ) || ( isset( $post->post_type ) && 'um_form' === $post->post_type ) ) ) { - $hide_footer = true; - } - - $localize_data = array( - 'hide_footer' => $hide_footer, - ); - wp_localize_script( 'um_admin_builder', 'um_admin_builder_data', $localize_data ); - - wp_register_script( 'um_admin_dragdrop', $this->js_url . 'um-admin-dragdrop.js', array( 'jquery', 'wp-util' ), ultimatemember_version, true ); - wp_enqueue_script( 'um_admin_dragdrop' ); - - wp_register_style( 'um_admin_builder', $this->css_url . 'um-admin-builder.css', array(), ultimatemember_version ); - wp_enqueue_style( 'um_admin_builder' ); - } - - - /** - * Load core WP styles/scripts - */ - public function load_core_wp() { - wp_enqueue_script( 'jquery-ui-draggable' ); - wp_enqueue_script( 'jquery-ui-sortable' ); - - wp_enqueue_script( 'jquery-ui-tooltip' ); - } - - - /** - * Load Admin Styles - */ - public function load_css() { - wp_register_style( 'um_admin_menu', $this->css_url . 'um-admin-menu.css', array(), ultimatemember_version ); - wp_enqueue_style( 'um_admin_menu' ); - - wp_register_style( 'um_admin_columns', $this->css_url . 'um-admin-columns.css', array(), ultimatemember_version ); - wp_enqueue_style( 'um_admin_columns' ); - - wp_register_style( 'um_admin_misc', $this->css_url . 'um-admin-misc.css', array(), ultimatemember_version ); - wp_enqueue_style( 'um_admin_misc' ); - } - - - /** - * Load functions js - */ - public function load_functions() { - wp_register_script( 'um_scrollbar', um_url . 'assets/js/simplebar.js', array( 'jquery' ), ultimatemember_version, true ); - wp_register_script( 'um_functions', um_url . 'assets/js/um-functions.js', array( 'jquery', 'jquery-masonry', 'wp-util', 'um_scrollbar' ), ultimatemember_version, true ); - wp_enqueue_script( 'um_functions' ); - } - - - /** - * Load Fonticons - */ - public function load_fonticons() { - wp_register_style( 'um_fonticons_ii', um_url . 'assets/css/um-fonticons-ii.css', array(), ultimatemember_version ); - wp_enqueue_style( 'um_fonticons_ii' ); - - wp_register_style( 'um_fonticons_fa', um_url . 'assets/css/um-fonticons-fa.css', array(), ultimatemember_version ); - wp_enqueue_style( 'um_fonticons_fa' ); - } - - - /** - * Load global css - */ - public function load_global_scripts() { - wp_register_script( 'um_admin_global', $this->js_url . 'um-admin-global.js', array( 'jquery' ), ultimatemember_version, true ); - wp_enqueue_script( 'um_admin_global' ); - - wp_register_style( 'um_admin_global', $this->css_url . 'um-admin-global.css', array(), ultimatemember_version ); - wp_enqueue_style( 'um_admin_global' ); - } - - - /** - * Load jQuery custom code - */ - public function load_custom_scripts() { - wp_register_script( 'um_datetime', $this->front_js_baseurl . 'pickadate/picker.js', array( 'jquery' ), ultimatemember_version, true ); - wp_register_script( 'um_datetime_date', $this->front_js_baseurl . 'pickadate/picker.date.js', array( 'jquery', 'um_datetime' ), ultimatemember_version, true ); - wp_register_script( 'um_datetime_time', $this->front_js_baseurl . 'pickadate/picker.time.js', array( 'jquery', 'um_datetime' ), ultimatemember_version, true ); - //wp_register_script( 'um_datetime_legacy', $this->front_js_baseurl . 'pickadate/legacy.js', array( 'jquery', 'um_datetime' ), ultimatemember_version, true ); - // load a localized version for date/time - $locale = get_locale(); - if ( $locale ) { - if ( file_exists( WP_LANG_DIR . '/plugins/ultimate-member/assets/js/pickadate/' . $locale . '.js' ) ) { - wp_register_script( 'um_datetime_locale', content_url() . '/languages/plugins/ultimate-member/assets/js/pickadate/' . $locale . '.js', array( 'jquery', 'um_datetime' ), ultimatemember_version, true ); - } elseif ( file_exists( um_path . 'assets/js/pickadate/translations/' . $locale . '.js' ) ) { - wp_register_script( 'um_datetime_locale', um_url . 'assets/js/pickadate/translations/' . $locale . '.js', array( 'jquery', 'um_datetime' ), ultimatemember_version, true ); - } - } - - wp_register_style( 'um_datetime', $this->front_css_baseurl . 'pickadate/default.css', array(), ultimatemember_version ); - wp_register_style( 'um_datetime_date', $this->front_css_baseurl . 'pickadate/default.date.css', array( 'um_datetime' ), ultimatemember_version ); - wp_register_style( 'um_datetime_time', $this->front_css_baseurl . 'pickadate/default.time.css', array( 'um_datetime' ), ultimatemember_version ); - - wp_enqueue_style( 'um_datetime_date' ); - wp_enqueue_style( 'um_datetime_time' ); - - wp_register_script( 'um_admin_scripts', $this->js_url . 'um-admin-scripts.js', array( 'jquery', 'wp-util', 'wp-color-picker', 'um_datetime', 'um_datetime_date', 'um_datetime_time'/*, 'um_datetime_legacy'*/ ), ultimatemember_version, true ); - wp_enqueue_script( 'um_admin_scripts' ); - } - - - /** - * Load jQuery custom code - */ - public function load_nav_manus_scripts() { - wp_register_script( 'um_admin_nav_manus', $this->js_url . 'um-admin-nav-menu.js', array( 'jquery', 'wp-util' ), ultimatemember_version, true ); - wp_enqueue_script( 'um_admin_nav_manus' ); - } - - - /** - * Load AJAX - */ - public function load_ajax_js() { - wp_register_script( 'um_admin_ajax', $this->js_url . 'um-admin-ajax.js', array( 'jquery', 'wp-util' ), ultimatemember_version, true ); - wp_enqueue_script( 'um_admin_ajax' ); - } - - - /** - * Load Gutenberg scripts - */ - public function load_gutenberg_js() { - /** This filter is documented in includes/core/class-blocks.php */ - $disable_script = apply_filters( 'um_disable_blocks_script', false ); - if ( $disable_script ) { - return; - } - - $restricted_blocks = UM()->options()->get( 'restricted_blocks' ); - if ( empty( $restricted_blocks ) ) { - return; - } - - wp_register_script( 'um_block_js', $this->js_url . 'um-admin-blocks.js', array( 'wp-i18n', 'wp-blocks', 'wp-components', 'wp-hooks' ), ultimatemember_version, true ); - wp_set_script_translations( 'um_block_js', 'ultimate-member' ); - - $restrict_options = array(); - $roles = UM()->roles()->get_roles( false ); - if ( ! empty( $roles ) ) { - foreach ( $roles as $role_key => $title ) { - $restrict_options[] = array( - 'label' => $title, - 'value' => $role_key, - ); - } - } - wp_localize_script( 'um_block_js', 'um_restrict_roles', $restrict_options ); - - wp_enqueue_script( 'um_block_js' ); - - do_action( 'um_load_gutenberg_js' ); - } - - - /** - * Add Gutenberg category for UM shortcodes - * - * @param array $categories - * @param \WP_Block_Editor_Context $context - * - * @return array - */ - public function blocks_category( $categories, $context ) { - $enable_blocks = UM()->options()->get( 'enable_blocks' ); - if ( empty( $enable_blocks ) ) { - return $categories; - } - - return array_merge( - $categories, - array( - array( - 'slug' => 'um-blocks', - 'title' => __( 'Ultimate Member Blocks', 'ultimate-member' ), - ), - ) - ); - } - - /** - * Load localize scripts - */ - public function load_localize_scripts() { - - /** - * UM hook - * - * @type filter - * @title um_admin_enqueue_localize_data - * @description Extend localize data at wp-admin side - * @input_vars - * [{"var":"$localize_data","type":"array","desc":"Localize Data"}] - * @change_log - * ["Since: 2.0"] - * @usage add_filter( 'um_admin_enqueue_localize_data', 'function_name', 10, 1 ); - * @example - * - */ - $localize_data = apply_filters( 'um_admin_enqueue_localize_data', array( 'nonce' => wp_create_nonce( 'um-admin-nonce' ) ) ); - - wp_localize_script( 'um_admin_global', 'um_admin_scripts', $localize_data ); - } - - - /** - * Enqueue scripts and styles - */ - public function admin_enqueue_scripts() { - if ( UM()->admin()->is_um_screen() ) { - - /*if ( get_post_type() != 'shop_order' ) { - UM()->enqueue()->wp_enqueue_scripts(); - }*/ - - $modal_deps = array( 'um-admin-scripts' ); - if ( $this->um_cpt_form_screen ) { - $this->enqueue_frontend_preview_assets(); - $modal_deps[] = 'um-responsive'; - } - - $this->load_functions(); - $this->load_global_scripts(); - $this->load_form(); - $this->load_forms(); - $this->load_custom_scripts(); - $this->load_modal(); - $this->load_dashboard(); - $this->load_settings(); - $this->load_field(); - $this->load_builder(); - $this->load_css(); - $this->load_core_wp(); - $this->load_ajax_js(); - $this->load_fonticons(); - $this->load_localize_scripts(); - - //scripts for frontend preview - UM()->enqueue()->load_imagecrop(); - UM()->enqueue()->load_css(); - UM()->enqueue()->load_tipsy(); - UM()->enqueue()->load_modal(); - UM()->enqueue()->load_responsive(); - - wp_register_script( 'um_raty', um_url . 'assets/js/um-raty' . UM()->enqueue()->suffix . '.js', array( 'jquery', 'wp-i18n' ), ultimatemember_version, true ); - wp_register_style( 'um_raty', um_url . 'assets/css/um-raty.css', array(), ultimatemember_version ); - - wp_register_style( 'um_default_css', um_url . 'assets/css/um-old-default.css', '', ultimatemember_version, 'all' ); - wp_enqueue_style( 'um_default_css' ); - - if ( is_rtl() ) { - wp_register_style( 'um_admin_rtl', $this->css_url . 'um-admin-rtl.css', array(), ultimatemember_version ); - wp_enqueue_style( 'um_admin_rtl' ); - } - } else { - - $this->load_global_scripts(); - $this->load_localize_scripts(); - - } - - global $wp_version, $current_screen; - - if ( version_compare( $wp_version, '5.0', '>=' ) ) { - if ( isset( $current_screen ) && $current_screen->is_block_editor() ) { - $this->load_gutenberg_js(); - } - } - } - - - /** - * Print editor scripts if they are not printed by default - */ - public function admin_footer_scripts() { - /** - * @var $class \_WP_Editors - */ - $class = '\_WP_Editors'; - - if ( did_action( 'print_default_editor_scripts' ) ) { - return; - } - if ( did_action( 'wp_tiny_mce_init' ) ) { - return; - } - if ( has_action( 'admin_print_footer_scripts', array( $class, 'editor_js' ) ) ) { - return; - } - - if ( ! class_exists( $class, false ) ) { - require_once( ABSPATH . WPINC . '/class-wp-editor.php' ); - } - - $class::force_uncompressed_tinymce(); - $class::enqueue_scripts(); - $class::editor_js(); - } - - } -} diff --git a/includes/admin/core/class-admin-forms.php b/includes/admin/core/class-admin-forms.php index 21bb22d9..01cb7b8c 100644 --- a/includes/admin/core/class-admin-forms.php +++ b/includes/admin/core/class-admin-forms.php @@ -644,8 +644,10 @@ if ( ! class_exists( 'um\admin\core\Admin_Forms' ) ) { $hidden = ''; if ( ! empty( $multiple ) ) { $hidden = ""; + } else { + $options = '' . $options; } - $html = "$hidden"; + $html = "$hidden"; return $html; } diff --git a/includes/admin/core/class-admin-gdpr.php b/includes/admin/core/class-admin-gdpr.php index 55e947bd..f7dbcf9d 100644 --- a/includes/admin/core/class-admin-gdpr.php +++ b/includes/admin/core/class-admin-gdpr.php @@ -137,7 +137,7 @@ if ( ! class_exists( 'um\admin\core\Admin_GDPR' ) ) { */ function plugin_add_suggested_privacy_content() { $content = $this->plugin_get_default_privacy_content(); - wp_add_privacy_policy_content( ultimatemember_plugin_name, $content ); + wp_add_privacy_policy_content( UM_PLUGIN_NAME, $content ); } @@ -152,7 +152,7 @@ if ( ! class_exists( 'um\admin\core\Admin_GDPR' ) ) { */ function plugin_register_exporters( $exporters ) { $exporters[] = array( - 'exporter_friendly_name' => ultimatemember_plugin_name, + 'exporter_friendly_name' => UM_PLUGIN_NAME, 'callback' => array( &$this, 'data_exporter' ) ); return $exporters; @@ -222,7 +222,7 @@ if ( ! class_exists( 'um\admin\core\Admin_GDPR' ) ) { // If you define your own group, the first exporter to // include a label will be used as the group label in the // final exported report - $group_label = ultimatemember_plugin_name; + $group_label = UM_PLUGIN_NAME; // Plugins can add as many items in the item data array as they want //$data = array(); @@ -257,7 +257,7 @@ if ( ! class_exists( 'um\admin\core\Admin_GDPR' ) ) { */ function plugin_register_erasers( $erasers = array() ) { $erasers[] = array( - 'eraser_friendly_name' => ultimatemember_plugin_name, + 'eraser_friendly_name' => UM_PLUGIN_NAME, 'callback' => array( &$this, 'data_eraser' ) ); return $erasers; diff --git a/includes/admin/core/class-admin-menu.php b/includes/admin/core/class-admin-menu.php index af82e47f..b90c3698 100644 --- a/includes/admin/core/class-admin-menu.php +++ b/includes/admin/core/class-admin-menu.php @@ -192,9 +192,9 @@ if ( ! class_exists( 'um\admin\core\Admin_Menu' ) ) { */ function um_roles_pages() { if ( empty( $_GET['tab'] ) ) { - include_once um_path . 'includes/admin/core/list-tables/roles-list-table.php'; + include_once UM_PATH . 'includes/admin/core/list-tables/roles-list-table.php'; } elseif ( 'add' === sanitize_key( $_GET['tab'] ) || 'edit' === sanitize_key( $_GET['tab'] ) ) { - include_once um_path . 'includes/admin/templates/role/role-edit.php'; + include_once UM_PATH . 'includes/admin/templates/role/role-edit.php'; } else { um_js_redirect( add_query_arg( array( 'page' => 'um_roles' ), get_admin_url( 'admin.php' ) ) ); } @@ -301,7 +301,7 @@ if ( ! class_exists( 'um\admin\core\Admin_Menu' ) ) {
-

Ultimate Member

+

Ultimate Member

diff --git a/includes/admin/core/class-admin-metabox.php b/includes/admin/core/class-admin-metabox.php index 776e25a8..4eacf967 100644 --- a/includes/admin/core/class-admin-metabox.php +++ b/includes/admin/core/class-admin-metabox.php @@ -1,13 +1,14 @@ $post_id ); // translators: %s: Form id. @@ -1194,17 +1198,19 @@ if ( ! class_exists( 'um\admin\core\Admin_Metabox' ) ) { $form_meta = UM()->admin()->sanitize_form_meta( $_POST['form'] ); foreach ( $form_meta as $k => $v ) { - if ( strstr( $k, '_um_' ) ) { - if ( $k === '_um_is_default' ) { + if ( 0 === strpos( $k, '_um_' ) ) { + if ( '_um_is_default' === $k ) { $mode = UM()->query()->get_attr( 'mode', $post_id ); if ( ! empty( $mode ) ) { - $posts = $wpdb->get_col( $wpdb->prepare( - "SELECT post_id - FROM {$wpdb->postmeta} - WHERE meta_key = '_um_mode' AND - meta_value = %s", - $mode - ) ); + $posts = $wpdb->get_col( + $wpdb->prepare( + "SELECT post_id + FROM {$wpdb->postmeta} + WHERE meta_key = '_um_mode' AND + meta_value = %s", + $mode + ) + ); foreach ( $posts as $p_id ) { delete_post_meta( $p_id, '_um_is_default' ); } @@ -1214,10 +1220,8 @@ if ( ! class_exists( 'um\admin\core\Admin_Metabox' ) ) { update_post_meta( $post_id, $k, $v ); } } - } - /** * Load modal content */ @@ -1225,17 +1229,17 @@ if ( ! class_exists( 'um\admin\core\Admin_Metabox' ) ) { $screen = get_current_screen(); if ( isset( $screen->id ) && strstr( $screen->id, 'um_form' ) ) { - foreach ( glob( um_path . 'includes/admin/templates/modal/forms/*.php' ) as $modal_content ) { + foreach ( glob( UM_PATH . 'includes/admin/templates/modal/forms/*.php' ) as $modal_content ) { include_once $modal_content; } } if ( $this->init_icon ) { - include_once um_path . 'includes/admin/templates/modal/forms/fonticons.php'; + include_once UM_PATH . 'includes/admin/templates/modal/forms/fonticons.php'; } if ( 'users' === $screen->id ) { - include_once um_path . 'includes/admin/templates/modal/dynamic_registration_preview.php'; + include_once UM_PATH . 'includes/admin/templates/modal/dynamic_registration_preview.php'; } // needed on forms only @@ -1254,7 +1258,6 @@ if ( ! class_exists( 'um\admin\core\Admin_Metabox' ) ) { } } - /** * Show field input for edit at modal field * @@ -1262,7 +1265,7 @@ if ( ! class_exists( 'um\admin\core\Admin_Metabox' ) ) { * @param null $form_id * @param array $field_args */ - function field_input( $attribute, $form_id = null, $field_args = array() ) { + public function field_input( $attribute, $form_id = null, $field_args = array() ) { if ( $this->in_edit == true ) { // we're editing a field $real_attr = substr( $attribute, 1 ); @@ -1270,9 +1273,7 @@ if ( ! class_exists( 'um\admin\core\Admin_Metabox' ) ) { } switch ( $attribute ) { - default: - /** * UM hook * @@ -1299,7 +1300,8 @@ if ( ! class_exists( 'um\admin\core\Admin_Metabox' ) ) { case '_visibility': ?> -

+

+ +

+ - +    +

- - - - - - - - -    -

- - - -

- -

- - +

+ +

+ - -

- -

- - +

+ +

+ + ?> -

- -

+

+ +

- @@ -1470,62 +1459,49 @@ if ( ! class_exists( 'um\admin\core\Admin_Metabox' ) ) { break; case '_icon': - - if ( $this->set_field_type == 'row' ) { + if ( 'row' === $this->set_field_type ) { $back = 'UM_edit_row'; - ?> +

+ -

+ edit_mode_value ) ) { ?> - + - edit_mode_value ) { ?> - - - - edit_mode_value ) { ?> + edit_mode_value ) ) { ?> -

- - in_edit ) { $back = 'UM_edit_field'; } else { $back = 'UM_add_field'; } - ?> -
+

+ -

+ - + edit_mode_value ) ) { ?> - edit_mode_value ) { ?> + - - - edit_mode_value ) { ?> + edit_mode_value ) ) { ?> -

-
- edit_mode_value = null; } - } } diff --git a/includes/admin/core/class-admin-navmenu.php b/includes/admin/core/class-admin-navmenu.php index d2eba992..e4204e0e 100644 --- a/includes/admin/core/class-admin-navmenu.php +++ b/includes/admin/core/class-admin-navmenu.php @@ -1,17 +1,18 @@ __( 'Display Mode', 'ultimate-member' ), - 'um_nav_roles' => __( 'By Role', 'ultimate-member' ) + 'um_nav_roles' => __( 'By Role', 'ultimate-member' ), ); - if ( $wp_version < '5.4' ) { - add_action( 'admin_footer-nav-menus.php', array( &$this, '_wp_template' ) ); - add_action( 'load-nav-menus.php', array( &$this, 'enqueue_nav_menus_scripts' ) ); - } else { - add_action( 'load-customize.php', array( &$this, 'enqueue_nav_menus_scripts' ) ); - } + add_action( 'customize_controls_print_footer_scripts', array( &$this, '_wp_template' ) ); + add_action( 'load-customize.php', array( &$this, 'enqueue_nav_menus_scripts' ) ); add_action( 'wp_update_nav_menu_item', array( &$this, '_save' ), 10, 3 ); add_action( 'wp_nav_menu_item_custom_fields', array( $this, 'wp_nav_menu_item_custom_fields' ), 20, 5 ); - //add_action( 'wp_nav_menu_item_custom_fields_customize_template', array( $this, 'wp_nav_menu_item_custom_fields_customize_template' ), 20 ); //waiting wp.org answer } @@ -112,29 +106,6 @@ if ( ! class_exists( 'um\admin\core\Admin_Navmenu' ) ) { } - /** - * - */ - function wp_nav_menu_item_custom_fields_customize_template() { - ?> -
-
-

- - <# console.log( data ); #> - -
-
- admin_enqueue()->load_nav_manus_scripts(); + UM()->admin()->enqueue()->load_nav_manus_scripts(); $menu_restriction_data = array(); diff --git a/includes/admin/core/class-admin-notices.php b/includes/admin/core/class-admin-notices.php index 257db6e7..371448df 100644 --- a/includes/admin/core/class-admin-notices.php +++ b/includes/admin/core/class-admin-notices.php @@ -365,7 +365,7 @@ if ( ! class_exists( 'um\admin\core\Admin_Notices' ) ) { array( 'class' => 'error', // translators: %1$s is a plugin name; %2$s is a plugin version; %3$s is a plugin name; %4$s is a doc link. - 'message' => '

' . sprintf( __( '%1$s %2$s requires 2.0 extensions. You have pre 2.0 extensions installed on your site.
Please update %3$s extensions to latest versions. For more info see this doc.', 'ultimate-member' ), ultimatemember_plugin_name, ultimatemember_version, ultimatemember_plugin_name, 'https://docs.ultimatemember.com/article/201-how-to-update-your-site' ) . '

', + 'message' => '

' . sprintf( __( '%1$s %2$s requires 2.0 extensions. You have pre 2.0 extensions installed on your site.
Please update %3$s extensions to latest versions. For more info see this doc.', 'ultimate-member' ), UM_PLUGIN_NAME, UM_VERSION, UM_PLUGIN_NAME, 'https://docs.ultimatemember.com/article/201-how-to-update-your-site' ) . '

', ), 0 ); @@ -396,7 +396,7 @@ if ( ! class_exists( 'um\admin\core\Admin_Notices' ) ) {

get_allowed_html( 'admin_notice' ) ); + echo wp_kses( sprintf( __( '%s needs to create several pages (User Profiles, Account, Registration, Login, Password Reset, Logout, Member Directory) to function correctly.', 'ultimate-member' ), UM_PLUGIN_NAME ), UM()->get_allowed_html( 'admin_notice' ) ); ?>

@@ -569,7 +569,7 @@ if ( ! class_exists( 'um\admin\core\Admin_Notices' ) ) { function check_wrong_install_folder() { $invalid_folder = false; - $slug_array = explode( '/', um_plugin ); + $slug_array = explode( '/', UM_PLUGIN ); if ( $slug_array[0] != 'ultimate-member' ) { $invalid_folder = true; } @@ -580,7 +580,7 @@ if ( ! class_exists( 'um\admin\core\Admin_Notices' ) ) { array( 'class' => 'error', // translators: %s: Plugin name. - 'message' => '

' . sprintf( __( 'You have installed %s with wrong folder name. Correct folder name is "ultimate-member".', 'ultimate-member' ), ultimatemember_plugin_name ) . '

', + 'message' => '

' . sprintf( __( 'You have installed %s with wrong folder name. Correct folder name is "ultimate-member".', 'ultimate-member' ), UM_PLUGIN_NAME ) . '

', ), 1 ); @@ -615,7 +615,7 @@ if ( ! class_exists( 'um\admin\core\Admin_Notices' ) ) { array( 'class' => 'error', // translators: %1$s is a inactive license number; %2$s is a plugin name; %3$s is a store link. - 'message' => '

' . sprintf( __( 'There are %1$s inactive %2$s license keys for this site. This site is not authorized to get plugin updates. You can active this site on www.ultimatemember.com.', 'ultimate-member' ), count( $arr_inactive_license_keys ), ultimatemember_plugin_name, UM()->store_url ) . '

', + 'message' => '

' . sprintf( __( 'There are %1$s inactive %2$s license keys for this site. This site is not authorized to get plugin updates. You can active this site on www.ultimatemember.com.', 'ultimate-member' ), count( $arr_inactive_license_keys ), UM_PLUGIN_NAME, UM()->store_url ) . '

', ), 3 ); @@ -627,7 +627,7 @@ if ( ! class_exists( 'um\admin\core\Admin_Notices' ) ) { array( 'class' => 'error', // translators: %1$s is a invalid license; %2$s is a plugin name; %3$s is a license link. - 'message' => '

' . sprintf( __( 'You have %1$s invalid or expired license keys for %2$s. Please go to the Licenses page to correct this issue.', 'ultimate-member' ), $invalid_license, ultimatemember_plugin_name, add_query_arg( array( 'page' => 'um_options', 'tab' => 'licenses' ), admin_url( 'admin.php' ) ) ) . '

', + 'message' => '

' . sprintf( __( 'You have %1$s invalid or expired license keys for %2$s. Please go to the Licenses page to correct this issue.', 'ultimate-member' ), $invalid_license, UM_PLUGIN_NAME, add_query_arg( array( 'page' => 'um_options', 'tab' => 'licenses' ), admin_url( 'admin.php' ) ) ) . '

', ), 3 ); @@ -645,7 +645,7 @@ if ( ! class_exists( 'um\admin\core\Admin_Notices' ) ) {

%1$s version %2$s needs to be updated to work correctly.
It is necessary to update the structure of the database and options that are associated with %3$s %4$s.
Please visit "Upgrade" page and run the upgrade process.', 'ultimate-member' ), ultimatemember_plugin_name, ultimatemember_version, ultimatemember_plugin_name, ultimatemember_version, $url ), UM()->get_allowed_html( 'admin_notice' ) ); + echo wp_kses( sprintf( __( '%1$s version %2$s needs to be updated to work correctly.
It is necessary to update the structure of the database and options that are associated with %3$s %4$s.
Please visit "Upgrade" page and run the upgrade process.', 'ultimate-member' ), UM_PLUGIN_NAME, UM_VERSION, UM_PLUGIN_NAME, UM_VERSION, $url ), UM()->get_allowed_html( 'admin_notice' ) ); ?>

@@ -673,7 +673,7 @@ if ( ! class_exists( 'um\admin\core\Admin_Notices' ) ) { array( 'class' => 'updated', // translators: %1$s is a plugin name title; %2$s is a plugin version. - 'message' => '

' . sprintf( __( '%1$s %2$s Successfully Upgraded', 'ultimate-member' ), ultimatemember_plugin_name, ultimatemember_version ) . '

', + 'message' => '

' . sprintf( __( '%1$s %2$s Successfully Upgraded', 'ultimate-member' ), UM_PLUGIN_NAME, UM_VERSION ) . '

', ), 4 ); @@ -704,7 +704,7 @@ if ( ! class_exists( 'um\admin\core\Admin_Notices' ) ) {

get_allowed_html( 'admin_notice' ) ); + echo wp_kses( sprintf( __( 'Hey there! It\'s been one month since you installed %s. How have you found the plugin so far?', 'ultimate-member' ), UM_PLUGIN_NAME ), UM()->get_allowed_html( 'admin_notice' ) ); ?>

@@ -715,7 +715,7 @@ if ( ! class_exists( 'um\admin\core\Admin_Notices' ) ) {

- +

@@ -761,7 +761,7 @@ if ( ! class_exists( 'um\admin\core\Admin_Notices' ) ) {

%1$s future plans! Detailed future list is here', 'ultimate-member' ), ultimatemember_plugin_name, '#' ), UM()->get_allowed_html( 'admin_notice' ) ); + echo wp_kses( sprintf( __( '%1$s future plans! Detailed future list is here', 'ultimate-member' ), UM_PLUGIN_NAME, '#' ), UM()->get_allowed_html( 'admin_notice' ) ); ?>

diff --git a/includes/admin/core/class-admin-settings.php b/includes/admin/core/class-admin-settings.php index 29b62c94..4dcbb88e 100644 --- a/includes/admin/core/class-admin-settings.php +++ b/includes/admin/core/class-admin-settings.php @@ -7,41 +7,34 @@ if ( ! defined( 'ABSPATH' ) ) { if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { - /** * Class Admin_Settings * @package um\admin\core */ class Admin_Settings { - /** * @var array */ public $settings_map; - /** * @var array */ public $settings_structure; - /** * @var */ private $previous_licenses; - /** * @var */ private $need_change_permalinks; - private $gravatar_changed = false; - /** * Admin_Settings constructor. */ @@ -300,7 +293,6 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { ); } - $settings_map[ $page_id ] = array( 'sanitize' => 'absint', ); @@ -668,6 +660,9 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { 'permalink_base' => array( 'sanitize' => 'key', ), + 'permalink_base_custom_meta' => array( + 'sanitize' => 'text', + ), 'display_name' => array( 'sanitize' => 'key', ), @@ -713,9 +708,6 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { 'account_tab_privacy' => array( 'sanitize' => 'bool', ), - 'account_tab_notifications' => array( - 'sanitize' => 'bool', - ), 'account_tab_delete' => array( 'sanitize' => 'bool', ), @@ -971,6 +963,115 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { ) ); + $account_fields = array( + array( + 'id' => 'account_tab_password', + 'type' => 'checkbox', + 'label' => __( 'Password Account Tab', 'ultimate-member' ), + 'tooltip' => __( 'Enable/disable the Password account tab in account page', 'ultimate-member' ), + ), + array( + 'id' => 'account_tab_privacy', + 'type' => 'checkbox', + 'label' => __( 'Privacy Account Tab', 'ultimate-member' ), + 'tooltip' => __( 'Enable/disable the Privacy account tab in account page', 'ultimate-member' ), + ), + ); + + if ( false !== UM()->account()->is_notifications_tab_visible() ) { + $account_fields[] = array( + 'id' => 'account_tab_notifications', + 'type' => 'checkbox', + 'label' => __( 'Notifications Account Tab', 'ultimate-member' ), + 'tooltip' => __( 'Enable/disable the Notifications account tab in account page', 'ultimate-member' ), + ); + + $settings_map['account_tab_notifications'] = array( + 'sanitize' => 'bool', + ); + } + + $account_fields = array_merge( + $account_fields, + array( + array( + 'id' => 'account_tab_delete', + 'type' => 'checkbox', + 'label' => __( 'Delete Account Tab', 'ultimate-member' ), + 'tooltip' => __( 'Enable/disable the Delete account tab in account page', 'ultimate-member' ), + ), + array( + 'id' => 'delete_account_text', + 'type' => 'textarea', // bug with wp 4.4? should be editor + 'label' => __( 'Account Deletion Custom Text', 'ultimate-member' ), + 'tooltip' => __( 'This is custom text that will be displayed to users before they delete their accounts from your site when password is required.', 'ultimate-member' ), + 'args' => array( + 'textarea_rows' => 6, + ), + ), + array( + 'id' => 'delete_account_no_pass_required_text', + 'type' => 'textarea', + 'label' => __( 'Account Deletion without password Custom Text', 'ultimate-member' ), + 'tooltip' => __( 'This is custom text that will be displayed to users before they delete their accounts from your site when password isn\'t required.', 'ultimate-member' ), + 'args' => array( + 'textarea_rows' => 6, + ), + ), + array( + 'id' => 'account_name', + 'type' => 'checkbox', + 'label' => __( 'Add a First & Last Name fields', 'ultimate-member' ), + 'tooltip' => __( 'Whether to enable these fields on the user account page by default or hide them.', 'ultimate-member' ), + ), + array( + 'id' => 'account_name_disable', + 'type' => 'checkbox', + 'label' => __( 'Disable First & Last Name fields', 'ultimate-member' ), + 'tooltip' => __( 'Whether to allow users changing their first and last name in account page.', 'ultimate-member' ), + 'conditional' => array( 'account_name', '=', '1' ), + ), + array( + 'id' => 'account_name_require', + 'type' => 'checkbox', + 'label' => __( 'Require First & Last Name', 'ultimate-member' ), + 'tooltip' => __( 'Require first and last name?', 'ultimate-member' ), + 'conditional' => array( 'account_name', '=', '1' ), + ), + array( + 'id' => 'account_email', + 'type' => 'checkbox', + 'label' => __( 'Allow users to change e-mail', 'ultimate-member' ), + 'tooltip' => __( 'Whether to allow users changing their email in account page.', 'ultimate-member' ), + ), + array( + 'id' => 'account_general_password', + 'type' => 'checkbox', + 'label' => __( 'Password is required?', 'ultimate-member' ), + 'tooltip' => __( 'Password is required to save account data.', 'ultimate-member' ), + ), + array( + 'id' => 'account_hide_in_directory', + 'type' => 'checkbox', + 'label' => __( 'Allow users to hide their profiles from directory', 'ultimate-member' ), + 'tooltip' => __( 'Whether to allow users changing their profile visibility from member directory in account page.', 'ultimate-member' ), + 'conditional' => array( 'account_tab_privacy', '=', '1' ), + ), + array( + 'id' => 'account_hide_in_directory_default', + 'type' => 'select', + 'label' => __( 'Hide profiles from directory by default', 'ultimate-member' ), + 'tooltip' => __( 'Set default value for the "Hide my profile from directory" option', 'ultimate-member' ), + 'options' => array( + 'No' => __( 'No', 'ultimate-member' ), + 'Yes' => __( 'Yes', 'ultimate-member' ), + ), + 'size' => 'small', + 'conditional' => array( 'account_hide_in_directory', '=', '1' ), + ), + ) + ); + $this->settings_map = apply_filters( 'um_settings_map', $settings_map ); /** @@ -1013,32 +1114,24 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { 'label' => __( 'Profile Permalink Base', 'ultimate-member' ), // translators: %s: Profile page URL 'tooltip' => sprintf( __( 'Here you can control the permalink structure of the user profile URL globally e.g. %susername/', 'ultimate-member' ), trailingslashit( um_get_core_page( 'user' ) ) ), - 'options' => array( - 'user_login' => __( 'Username', 'ultimate-member' ), - 'name' => __( 'First and Last Name with \'.\'', 'ultimate-member' ), - 'name_dash' => __( 'First and Last Name with \'-\'', 'ultimate-member' ), - 'name_plus' => __( 'First and Last Name with \'+\'', 'ultimate-member' ), - 'user_id' => __( 'User ID', 'ultimate-member' ), - ), + 'options' => UM()->config()->permalink_base_options, 'placeholder' => __( 'Select...', 'ultimate-member' ), ), + array( + 'id' => 'permalink_base_custom_meta', + 'type' => 'text', + 'label' => __( 'Profile Permalink Base Custom Meta Key', 'ultimate-member' ), + 'tooltip' => __( 'Specify the custom field meta key that you want to use as profile permalink base. Meta value should be unique.', 'ultimate-member' ), + 'conditional' => array( 'permalink_base', '=', 'custom_meta' ), + 'size' => 'medium', + ), array( 'id' => 'display_name', 'type' => 'select', 'size' => 'medium', 'label' => __( 'User Display Name', 'ultimate-member' ), 'tooltip' => __( 'This is the name that will be displayed for users on the front end of your site. Default setting uses first/last name as display name if it exists', 'ultimate-member' ), - 'options' => array( - 'default' => __( 'Default WP Display Name', 'ultimate-member' ), - 'nickname' => __( 'Nickname', 'ultimate-member' ), - 'username' => __( 'Username', 'ultimate-member' ), - 'full_name' => __( 'First name & last name', 'ultimate-member' ), - 'sur_name' => __( 'Last name & first name', 'ultimate-member' ), - 'initial_name' => __( 'First name & first initial of last name', 'ultimate-member' ), - 'initial_name_f' => __( 'First initial of first name & last name', 'ultimate-member' ), - 'first_name' => __( 'First name only', 'ultimate-member' ), - 'field' => __( 'Custom field(s)', 'ultimate-member' ), - ), + 'options' => UM()->config()->display_name_options, 'placeholder' => __( 'Select...', 'ultimate-member' ), ), array( @@ -1047,6 +1140,7 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { 'label' => __( 'Display Name Custom Field(s)', 'ultimate-member' ), 'tooltip' => __( 'Specify the custom field meta key or custom fields seperated by comma that you want to use to display users name on the frontend of your site', 'ultimate-member' ), 'conditional' => array( 'display_name', '=', 'field' ), + 'size' => 'medium', ), array( 'id' => 'author_redirect', @@ -1135,105 +1229,17 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { 'tooltip' => __( 'How long does an activation link live in seconds? Leave empty for endless links.', 'ultimate-member' ), 'size' => 'small', ), + array( + 'id' => 'delete_comments', + 'type' => 'checkbox', + 'label' => __( 'Deleting user comments after deleting a user', 'ultimate-member' ), + 'tooltip' => __( 'Do you want to delete a user\'s comments when that user deletes themself or is removed from the admin dashboard from the site?', 'ultimate-member' ), + ), ), ), 'account' => array( 'title' => __( 'Account', 'ultimate-member' ), - 'fields' => array( - array( - 'id' => 'account_tab_password', - 'type' => 'checkbox', - 'label' => __( 'Password Account Tab', 'ultimate-member' ), - 'tooltip' => __( 'Enable/disable the Password account tab in account page', 'ultimate-member' ), - ), - array( - 'id' => 'account_tab_privacy', - 'type' => 'checkbox', - 'label' => __( 'Privacy Account Tab', 'ultimate-member' ), - 'tooltip' => __( 'Enable/disable the Privacy account tab in account page', 'ultimate-member' ), - ), - array( - 'id' => 'account_tab_notifications', - 'type' => 'checkbox', - 'label' => __( 'Notifications Account Tab', 'ultimate-member' ), - 'tooltip' => __( 'Enable/disable the Notifications account tab in account page', 'ultimate-member' ), - ), - array( - 'id' => 'account_tab_delete', - 'type' => 'checkbox', - 'label' => __( 'Delete Account Tab', 'ultimate-member' ), - 'tooltip' => __( 'Enable/disable the Delete account tab in account page', 'ultimate-member' ), - ), - array( - 'id' => 'delete_account_text', - 'type' => 'textarea', // bug with wp 4.4? should be editor - 'label' => __( 'Account Deletion Custom Text', 'ultimate-member' ), - 'tooltip' => __( 'This is custom text that will be displayed to users before they delete their accounts from your site when password is required.', 'ultimate-member' ), - 'args' => array( - 'textarea_rows' => 6, - ), - ), - array( - 'id' => 'delete_account_no_pass_required_text', - 'type' => 'textarea', - 'label' => __( 'Account Deletion without password Custom Text', 'ultimate-member' ), - 'tooltip' => __( 'This is custom text that will be displayed to users before they delete their accounts from your site when password isn\'t required.', 'ultimate-member' ), - 'args' => array( - 'textarea_rows' => 6, - ), - ), - array( - 'id' => 'account_name', - 'type' => 'checkbox', - 'label' => __( 'Add a First & Last Name fields', 'ultimate-member' ), - 'tooltip' => __( 'Whether to enable these fields on the user account page by default or hide them.', 'ultimate-member' ), - ), - array( - 'id' => 'account_name_disable', - 'type' => 'checkbox', - 'label' => __( 'Disable First & Last Name fields', 'ultimate-member' ), - 'tooltip' => __( 'Whether to allow users changing their first and last name in account page.', 'ultimate-member' ), - 'conditional' => array( 'account_name', '=', '1' ), - ), - array( - 'id' => 'account_name_require', - 'type' => 'checkbox', - 'label' => __( 'Require First & Last Name', 'ultimate-member' ), - 'tooltip' => __( 'Require first and last name?', 'ultimate-member' ), - 'conditional' => array( 'account_name', '=', '1' ), - ), - array( - 'id' => 'account_email', - 'type' => 'checkbox', - 'label' => __( 'Allow users to change e-mail', 'ultimate-member' ), - 'tooltip' => __( 'Whether to allow users changing their email in account page.', 'ultimate-member' ), - ), - array( - 'id' => 'account_general_password', - 'type' => 'checkbox', - 'label' => __( 'Password is required?', 'ultimate-member' ), - 'tooltip' => __( 'Password is required to save account data.', 'ultimate-member' ), - ), - array( - 'id' => 'account_hide_in_directory', - 'type' => 'checkbox', - 'label' => __( 'Allow users to hide their profiles from directory', 'ultimate-member' ), - 'tooltip' => __( 'Whether to allow users changing their profile visibility from member directory in account page.', 'ultimate-member' ), - 'conditional' => array( 'account_tab_privacy', '=', '1' ), - ), - array( - 'id' => 'account_hide_in_directory_default', - 'type' => 'select', - 'label' => __( 'Hide profiles from directory by default', 'ultimate-member' ), - 'tooltip' => __( 'Set default value for the "Hide my profile from directory" option', 'ultimate-member' ), - 'options' => array( - 'No' => __( 'No', 'ultimate-member' ), - 'Yes' => __( 'Yes', 'ultimate-member' ), - ), - 'size' => 'small', - 'conditional' => array( 'account_hide_in_directory', '=', '1' ), - ), - ), + 'fields' => $account_fields, ), 'uploads' => array( 'title' => __( 'Uploads', 'ultimate-member' ), @@ -1467,7 +1473,7 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { 'tooltip' => __( 'You can change the default profile picture globally here. Please make sure that the photo is 300x300px.', 'ultimate-member' ), 'upload_frame_title' => __( 'Select Default Profile Photo', 'ultimate-member' ), 'default' => array( - 'url' => um_url . 'assets/img/default_avatar.jpg', + 'url' => UM_URL . 'assets/img/default_avatar.jpg', ), ), array( @@ -2439,9 +2445,11 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { } elseif ( ! empty( $_POST['um_options']['permalink_base'] ) ) { if ( ! empty( $this->need_change_permalinks ) ) { - $users = get_users( array( - 'fields' => 'ids', - ) ); + $users = get_users( + array( + 'fields' => 'ids', + ) + ); if ( ! empty( $users ) ) { foreach ( $users as $user_id ) { UM()->user()->generate_profile_slug( $user_id ); @@ -2449,7 +2457,6 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { } } - // update for um_member_directory_data metakey if ( isset( $_POST['um_options']['use_gravatars'] ) ) { if ( $this->gravatar_changed ) { @@ -2651,7 +2658,7 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { $emails = UM()->config()->email_notifications; if ( empty( $email_key ) || empty( $emails[ $email_key ] ) ) { - include_once um_path . 'includes/admin/core/list-tables/emails-list-table.php'; + include_once UM_PATH . 'includes/admin/core/list-tables/emails-list-table.php'; } } @@ -3112,7 +3119,7 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) {

scan_template_files( um_path . '/templates/' ); + $scan_files['um'] = $this->scan_template_files( UM_PATH . '/templates/' ); /** * Filters an array of the template files for scanning versions. * @@ -3190,8 +3197,8 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { $core_path = $located['core']; $core_file_path = stristr( $core_path, 'wp-content' ); } else { - $core_path = um_path . '/templates/' . $core_file; - $core_file_path = stristr( um_path . 'templates/' . $core_file, 'wp-content' ); + $core_path = UM_PATH . '/templates/' . $core_file; + $core_file_path = stristr( UM_PATH . 'templates/' . $core_file, 'wp-content' ); } $core_version = $this->get_file_version( $core_path ); $theme_version = $this->get_file_version( $theme_file ); @@ -3303,7 +3310,7 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { global $wpdb; if ( ! class_exists( '\Browser' ) ) - require_once um_path . 'includes/lib/browser.php'; + require_once UM_PATH . 'includes/lib/browser.php'; // Detect browser $browser = new \Browser(); @@ -3701,12 +3708,12 @@ Use Only Cookies: get_packages(); foreach ( $all_packages as $package ) { - if ( version_compare( $um_last_version_upgrade, $package, '<' ) && version_compare( $package, ultimatemember_version, '<=' ) ) { + if ( version_compare( $um_last_version_upgrade, $package, '<' ) && version_compare( $package, UM_VERSION, '<=' ) ) { $diff_packages[] = $package; } } @@ -257,13 +257,13 @@ if ( ! class_exists( 'um\admin\core\Admin_Upgrade' ) ) {

get_allowed_html( 'admin_notice' ) ); + echo wp_kses( sprintf( __( '%s - Upgrade Process', 'ultimate-member' ), UM_PLUGIN_NAME ), UM()->get_allowed_html( 'admin_notice' ) ); ?>

%1$s version. Your latest DB version is %2$s. We recommend creating a backup of your site before running the update process. Do not exit the page before the update process has complete.', 'ultimate-member' ), ultimatemember_version, $um_last_version_upgrade ), UM()->get_allowed_html( 'admin_notice' ) ); + echo wp_kses( sprintf( __( 'You have installed %1$s version. Your latest DB version is %2$s. We recommend creating a backup of your site before running the update process. Do not exit the page before the update process has complete.', 'ultimate-member' ), UM_VERSION, $um_last_version_upgrade ), UM()->get_allowed_html( 'admin_notice' ) ); ?>

"Run" button, the update process will start. All information will be displayed in the "Upgrade Log" field.', 'ultimate-member' ); ?>

diff --git a/includes/admin/core/packages/2.0-beta1/email_templates.php b/includes/admin/core/packages/2.0-beta1/email_templates.php index b8f71e26..e7f3bcc8 100644 --- a/includes/admin/core/packages/2.0-beta1/email_templates.php +++ b/includes/admin/core/packages/2.0-beta1/email_templates.php @@ -50,7 +50,7 @@ function um_upgrade20beta1_get_template_file( $location, $template_name, $html = $template_path = trailingslashit( get_stylesheet_directory() . '/ultimate-member/email' . $blog_id ). $template_name_file . $ext; break; case 'plugin': - $path = ! empty( UM()->mail()->path_by_slug[ $template_name ] ) ? UM()->mail()->path_by_slug[ $template_name ] : um_path . 'templates/email'; + $path = ! empty( UM()->mail()->path_by_slug[ $template_name ] ) ? UM()->mail()->path_by_slug[ $template_name ] : UM_PATH . 'templates/email'; $template_path = trailingslashit( $path ) . $template_name . $ext; break; } @@ -194,4 +194,4 @@ if ( is_multisite() ) { restore_current_blog(); } else { um_upgrade20beta1_email_templates_process(); -} \ No newline at end of file +} diff --git a/includes/admin/templates/extensions.php b/includes/admin/templates/extensions.php index be183050..fb388111 100644 --- a/includes/admin/templates/extensions.php +++ b/includes/admin/templates/extensions.php @@ -1,84 +1,87 @@ - 'https://ultimatemember.com/extensions/bbpress/', + 'url' => 'https://ultimatemember.com/extensions/bbpress/', 'img' => 'bbpress.svg', 'name' => 'bbPress', 'desc' => 'With the bbPress extension you can integrate Ultimate Member with bbPress', ); $premium['profile-completeness'] = array( - 'url' => 'https://ultimatemember.com/extensions/profile-completeness/', + 'url' => 'https://ultimatemember.com/extensions/profile-completeness/', 'img' => 'profile-completeness.svg', 'name' => 'Profile Completeness', 'desc' => 'Encourage or force users to complete their profile on your site', ); $premium['verified-users'] = array( - 'url' => 'https://ultimatemember.com/extensions/verified-users/', + 'url' => 'https://ultimatemember.com/extensions/verified-users/', 'img' => 'verified-users.svg', 'name' => 'Verified Users', 'desc' => 'Add a user verficiation system to your site so user accounts can be verified', ); $premium['friends'] = array( - 'url' => 'https://ultimatemember.com/extensions/friends/', + 'url' => 'https://ultimatemember.com/extensions/friends/', 'img' => 'friends.svg', 'name' => 'Friends', 'desc' => 'Increase user interaction on your site by allowing users to become friends', ); $premium['woocommerce'] = array( - 'url' => 'https://ultimatemember.com/extensions/woocommerce/', + 'url' => 'https://ultimatemember.com/extensions/woocommerce/', 'img' => 'woocommerce.png', 'name' => 'WooCommerce', 'desc' => 'Integrates the popular e-commerce plugin WooCommerce with Ultimate Member', ); $premium['notices'] = array( - 'url' => 'https://ultimatemember.com/extensions/notices/', + 'url' => 'https://ultimatemember.com/extensions/notices/', 'img' => 'notices.svg', 'name' => 'Notices', 'desc' => 'Alert users to important information using conditional notices', ); $premium['followers'] = array( - 'url' => 'https://ultimatemember.com/extensions/followers/', + 'url' => 'https://ultimatemember.com/extensions/followers/', 'img' => 'followers.svg', 'name' => 'Followers', 'desc' => 'Increase user interaction on your site by allowing users to follow each other', ); $premium['mycred'] = array( - 'url' => 'https://ultimatemember.com/extensions/mycred/', + 'url' => 'https://ultimatemember.com/extensions/mycred/', 'img' => 'mycred.png', 'name' => 'myCRED', 'desc' => 'With the myCRED extension you can integrate Ultimate Member with myCRED', ); $premium['private-messages'] = array( - 'url' => 'https://ultimatemember.com/extensions/private-messages/', + 'url' => 'https://ultimatemember.com/extensions/private-messages/', 'img' => 'private-messages.svg', 'name' => 'Private Messages', 'desc' => 'Add a private messaging system to your site & allow users to message each other', ); $premium['social-activity'] = array( - 'url' => 'https://ultimatemember.com/extensions/social-activity/', + 'url' => 'https://ultimatemember.com/extensions/social-activity/', 'img' => 'social-activity.svg', 'name' => 'Social Activity', 'desc' => 'Let users create public wall posts & see the activity of other users', ); $premium['social-login'] = array( - 'url' => 'https://ultimatemember.com/extensions/social-login/', + 'url' => 'https://ultimatemember.com/extensions/social-login/', 'img' => 'social-login.svg', 'name' => 'Social Login', 'desc' => 'Let users register & login to your site via Facebook, Twitter, G+, LinkedIn, and more', ); $premium['user-tags'] = array( - 'url' => 'https://ultimatemember.com/extensions/user-tags/', + 'url' => 'https://ultimatemember.com/extensions/user-tags/', 'img' => 'user-tags.svg', 'name' => 'User Tags', 'desc' => 'With this extension you can add a user tag system to your website', @@ -86,7 +89,7 @@ $premium['user-tags'] = array( $premium['mailchimp'] = array( - 'url' => 'https://ultimatemember.com/extensions/mailchimp/', + 'url' => 'https://ultimatemember.com/extensions/mailchimp/', 'img' => 'mailchimp.png', 'name' => 'MailChimp', 'desc' => 'Allow users to subscribe to your mailchimp lists when they signup on your site', @@ -94,105 +97,105 @@ $premium['mailchimp'] = array( $premium['user-reviews'] = array( - 'url' => 'https://ultimatemember.com/extensions/user-reviews/', + 'url' => 'https://ultimatemember.com/extensions/user-reviews/', 'img' => 'user-reviews.svg', 'name' => 'User Reviews', 'desc' => 'Allow users to rate & review each other using a 5 star rate/review system', ); $premium['real-time-notifications'] = array( - 'url' => 'https://ultimatemember.com/extensions/real-time-notifications/', + 'url' => 'https://ultimatemember.com/extensions/real-time-notifications/', 'img' => 'real-time-notifications.svg', 'name' => 'Real-time Notifications', 'desc' => 'Add a notifications system to your site so users can receive real-time notifications', ); $premium['private-content'] = array( - 'url' => 'https://ultimatemember.com/extensions/private-content/', + 'url' => 'https://ultimatemember.com/extensions/private-content/', 'img' => 'private-content.svg', 'name' => 'Private Content', 'desc' => 'Display private content to logged in users that only they can access', ); $premium['groups'] = array( - 'url' => 'https://ultimatemember.com/extensions/groups/', + 'url' => 'https://ultimatemember.com/extensions/groups/', 'img' => 'groups.svg', 'name' => 'Groups', 'desc' => 'Allow users to create and join groups around shared topics, interests etc.', ); $premium['user-photos'] = array( - 'url' => 'https://ultimatemember.com/extensions/user-photos/', + 'url' => 'https://ultimatemember.com/extensions/user-photos/', 'name' => 'User Photos', 'img' => 'user-photos.svg', 'desc' => 'Allow users to upload photos to their profile', ); $premium['user-bookmarks'] = array( - 'url' => 'https://ultimatemember.com/extensions/user-bookmarks/', + 'url' => 'https://ultimatemember.com/extensions/user-bookmarks/', 'img' => 'user-bookmarks.svg', 'name' => 'User Bookmarks', 'desc' => 'Allow users to bookmark content from your website', ); $premium['unsplash'] = array( - 'url' => 'https://ultimatemember.com/extensions/unsplash/', + 'url' => 'https://ultimatemember.com/extensions/unsplash/', 'img' => 'unsplash.png', 'name' => 'Unsplash', 'desc' => 'Allow users to select a profile cover photo from Unsplash from their profile', ); $premium['user-locations'] = array( - 'url' => 'https://ultimatemember.com/extensions/user-locations/', + 'url' => 'https://ultimatemember.com/extensions/user-locations/', 'img' => 'user-locations.svg', 'name' => 'User Locations', 'desc' => 'Using the Google Maps API, display users on a map on the member directory page and allow users to add their location via their profile', ); $premium['user-notes'] = array( - 'url' => 'https://ultimatemember.com/extensions/user-notes/', + 'url' => 'https://ultimatemember.com/extensions/user-notes/', 'img' => 'user-notes.svg', 'name' => 'User Notes', 'desc' => 'Allow users to create public and private notes from their profile', ); $premium['profile-tabs'] = array( - 'url' => 'https://ultimatemember.com/extensions/profile-tabs/', + 'url' => 'https://ultimatemember.com/extensions/profile-tabs/', 'img' => 'profile-tabs.svg', 'name' => 'Profile Tabs', 'desc' => 'Add custom tabs to profiles', ); -$premium['stripe'] = array( - 'url' => 'https://ultimatemember.com/extensions/stripe/', - 'img' => 'stripe.png', - 'name' => 'Stripe', - 'desc' => 'Sell paid memberships to access your website via Stripe subscriptions', -); +//$premium['stripe'] = array( +// 'url' => 'https://ultimatemember.com/extensions/stripe/', +// 'img' => 'stripe.png', +// 'name' => 'Stripe', +// 'desc' => 'Sell paid memberships to access your website via Stripe subscriptions', +//); $free['jobboardwp'] = array( - 'url' => 'https://wordpress.org/plugins/um-jobboardwp', + 'url' => 'https://wordpress.org/plugins/um-jobboardwp', 'img' => 'jobboardwp.png', 'name' => 'JobBoardWP', 'desc' => 'Integrates Ultimate Member with the job board plugin JobBoardWP', ); $free['forumwp'] = array( - 'url' => 'https://ultimatemember.com/extensions/forumwp/', + 'url' => 'https://ultimatemember.com/extensions/forumwp/', 'img' => 'forumwp.png', 'name' => 'ForumWP', 'desc' => 'Integrates Ultimate Member with the forum plugin ForumWP', ); $free['online-users'] = array( - 'url' => 'https://ultimatemember.com/extensions/online-users/', + 'url' => 'https://ultimatemember.com/extensions/online-users/', 'img' => 'online-users.svg', 'name' => 'Online Users', - 'desc' => 'Display online users on your site so users can see who is online' + 'desc' => 'Display online users on your site so users can see who is online', ); $free['google-recaptcha'] = array( - 'url' => 'https://ultimatemember.com/extensions/google-recaptcha/', + 'url' => 'https://ultimatemember.com/extensions/google-recaptcha/', 'img' => 'google-recaptcha.png', 'name' => 'Google reCAPTCHA', 'desc' => 'Stop bots on your registration & login forms with Google reCAPTCHA', @@ -203,7 +206,23 @@ $free['terms-conditions'] = array( 'img' => 'terms-conditions.svg', 'name' => 'Terms & Conditions', 'desc' => 'Add terms & conditions to your registration form', -); ?> +); + +$classes = array( + 'free' => '', + 'premium' => '', +); +$loop = $premium; +// phpcs:disable WordPress.Security.NonceVerification -- Don't need nonce for the filter. +if ( ! isset( $_REQUEST['filter'] ) || 'premium' === sanitize_key( $_REQUEST['filter'] ) ) { + $loop = $premium; + $classes['premium'] = 'current'; +} elseif ( 'free' === sanitize_key( $_REQUEST['filter'] ) ) { + $loop = $free; + $classes['free'] = 'current'; +} +// phpcs:enable WordPress.Security.NonceVerification -- Don't need nonce for the filter. +?>
@@ -212,13 +231,13 @@ $free['terms-conditions'] = array(
@@ -226,64 +245,36 @@ $free['terms-conditions'] = array(
- $info ) { ?> + $info ) { ?> +
+
+ + + <?php echo esc_attr( $info['name'] ); ?> + +
+
+

-
-
- - <?php echo esc_attr( $info['name'] ) ?> - -
-
-

- -
- get_allowed_html( 'admin_notice' ) ); ?> -
-
- - - $info ) { ?> - -
-
- - <?php echo esc_attr( $info['name'] ) ?> - -
-
-

- -
- get_allowed_html( 'admin_notice' ) ); ?> -
-
- + - - - +
+
diff --git a/includes/admin/templates/gdpr.php b/includes/admin/templates/gdpr.php index eadd8331..b37d159d 100644 --- a/includes/admin/templates/gdpr.php +++ b/includes/admin/templates/gdpr.php @@ -9,7 +9,7 @@

get_allowed_html( 'admin_notice' ) ); + echo wp_kses( sprintf( __( '%s provides you with forms for user registration, login and profiles.', 'ultimate-member' ), UM_PLUGIN_NAME ), UM()->get_allowed_html( 'admin_notice' ) ); ?>

@@ -38,7 +38,7 @@

get_allowed_html( 'admin_notice' ) ); + echo wp_kses( sprintf( __( '%s does not send any user data outside of your site by default.', 'ultimate-member' ), UM_PLUGIN_NAME ), UM()->get_allowed_html( 'admin_notice' ) ); ?>

diff --git a/includes/blocks/um-member-directories/build/index.asset.php b/includes/blocks/um-member-directories/build/index.asset.php index 8e85d2c6..cee9d9ef 100644 --- a/includes/blocks/um-member-directories/build/index.asset.php +++ b/includes/blocks/um-member-directories/build/index.asset.php @@ -1 +1 @@ - array('wp-block-editor', 'wp-blocks', 'wp-components', 'wp-data', 'wp-element', 'wp-server-side-render'), 'version' => '57ea4f619de4d752a4bb'); + array('wp-block-editor', 'wp-blocks', 'wp-components', 'wp-data', 'wp-element', 'wp-server-side-render'), 'version' => 'fdd5ad1f74de4e2e94db'); diff --git a/includes/blocks/um-member-directories/build/index.js b/includes/blocks/um-member-directories/build/index.js index 05bc85e3..b3f3a882 100644 --- a/includes/blocks/um-member-directories/build/index.js +++ b/includes/blocks/um-member-directories/build/index.js @@ -1 +1 @@ -(()=>{"use strict";var e={n:t=>{var r=t&&t.__esModule?()=>t.default:()=>t;return e.d(r,{a:r}),r},d:(t,r)=>{for(var n in r)e.o(r,n)&&!e.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:r[n]})},o:(e,t)=>Object.prototype.hasOwnProperty.call(e,t)};const t=window.wp.element,r=window.wp.data,n=window.wp.components,i=window.wp.blockEditor,o=window.wp.serverSideRender;var l=e.n(o);(0,window.wp.blocks.registerBlockType)("um-block/um-member-directories",{edit:function(e){let{member_id:o,setAttributes:a}=e.attributes;const c=(0,i.useBlockProps)(),u=(0,r.useSelect)((e=>e("core").getEntityRecords("postType","um_directory",{per_page:-1,_fields:["id","title"]})));if(!u)return(0,t.createElement)("p",null,(0,t.createElement)(n.Spinner,null),wp.i18n.__("Loading...","ultimate-member"));if(0===u.length)return"No posts found.";let d=[{id:"",title:""}].concat(u).map((e=>({label:e.title.rendered,value:e.id})));return(0,t.createElement)("div",c,(0,t.createElement)(l(),{block:"um-block/um-member-directories",attributes:e.attributes}),(0,t.createElement)(i.InspectorControls,null,(0,t.createElement)(n.PanelBody,{title:wp.i18n.__("Select Directories","ultimate-member")},(0,t.createElement)(n.SelectControl,{label:wp.i18n.__("Select Directories","ultimate-member"),className:"um_select_directory",value:o,options:d,style:{height:"35px",lineHeight:"20px",padding:"0 7px"},onChange:t=>{e.setAttributes({member_id:t})}}))))},save:function(e){return null}}),jQuery(window).on("load",(function(e){new MutationObserver((function(e){e.forEach((function(e){jQuery(e.addedNodes).find(".um.um-directory").each((function(){var e=jQuery(this);um_ajax_get_members(e)}))}))})).observe(document,{attributes:!1,childList:!0,characterData:!1,subtree:!0})}))})(); \ No newline at end of file +!function(){"use strict";var e={n:function(t){var r=t&&t.__esModule?function(){return t.default}:function(){return t};return e.d(r,{a:r}),r},d:function(t,r){for(var n in r)e.o(r,n)&&!e.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:r[n]})},o:function(e,t){return Object.prototype.hasOwnProperty.call(e,t)}},t=window.wp.element,r=window.wp.data,n=window.wp.components,i=window.wp.blockEditor,o=window.wp.serverSideRender,l=e.n(o);(0,window.wp.blocks.registerBlockType)("um-block/um-member-directories",{edit:function(e){let{member_id:o,setAttributes:u}=e.attributes;const c=(0,i.useBlockProps)(),a=(0,r.useSelect)((e=>e("core").getEntityRecords("postType","um_directory",{per_page:-1,_fields:["id","title"]})));if(!a)return(0,t.createElement)("p",null,(0,t.createElement)(n.Spinner,null),wp.i18n.__("Loading...","ultimate-member"));if(0===a.length)return"No posts found.";let d=[{id:"",title:""}].concat(a).map((e=>({label:e.title.rendered,value:e.id})));return(0,t.createElement)("div",{...c},(0,t.createElement)(l(),{block:"um-block/um-member-directories",attributes:e.attributes}),(0,t.createElement)(i.InspectorControls,null,(0,t.createElement)(n.PanelBody,{title:wp.i18n.__("Select Directories","ultimate-member")},(0,t.createElement)(n.SelectControl,{label:wp.i18n.__("Select Directories","ultimate-member"),className:"um_select_directory",value:o,options:d,style:{height:"35px",lineHeight:"20px",padding:"0 7px"},onChange:t=>{e.setAttributes({member_id:t})}}))))},save:function(e){return null}}),jQuery(window).on("load",(function(e){new MutationObserver((function(e){e.forEach((function(e){jQuery(e.addedNodes).find(".um.um-directory").each((function(){var e=jQuery(this);um_ajax_get_members(e),um_slider_filter_init(e)}))}))})).observe(document,{attributes:!1,childList:!0,characterData:!1,subtree:!0})}))}(); \ No newline at end of file diff --git a/includes/blocks/um-member-directories/src/index.js b/includes/blocks/um-member-directories/src/index.js index 12ac4b6a..3bf822f7 100644 --- a/includes/blocks/um-member-directories/src/index.js +++ b/includes/blocks/um-member-directories/src/index.js @@ -97,6 +97,7 @@ jQuery(window).on( 'load', function($) { jQuery(mutation.addedNodes).find('.um.um-directory').each(function() { var directory = jQuery(this); um_ajax_get_members( directory ); + um_slider_filter_init( directory ); }); }); }); diff --git a/includes/class-config.php b/includes/class-config.php index ffeb704a..2b570c3b 100644 --- a/includes/class-config.php +++ b/includes/class-config.php @@ -81,6 +81,10 @@ if ( ! class_exists( 'um\Config' ) ) { */ public $default_roles_metadata = array(); + public $permalink_base_options = array(); + + public $display_name_options = array(); + /** * Config constructor. */ @@ -511,6 +515,7 @@ if ( ! class_exists( 'um\Config' ) ) { 'disable_restriction_pre_queries' => 0, 'uninstall_on_delete' => 0, 'permalink_base' => 'user_login', + 'permalink_base_custom_meta' => '', 'display_name' => 'full_name', 'display_name_field' => '', 'author_redirect' => 1, @@ -591,6 +596,7 @@ if ( ! class_exists( 'um\Config' ) ) { 'secure_notify_admins_banned_accounts' => false, 'secure_notify_admins_banned_accounts__interval' => 'instant', 'secure_allowed_redirect_hosts' => '', + 'delete_comments' => 0, ); add_filter( 'um_get_tabs_from_config', '__return_true' ); @@ -774,6 +780,29 @@ if ( ! class_exists( 'um\Config' ) ) { '_um_auto_approve_act' => 'redirect_profile', ), ); + + $this->permalink_base_options = array( + 'user_login' => __( 'Username', 'ultimate-member' ), + 'name' => __( 'First and Last Name with \'.\'', 'ultimate-member' ), + 'name_dash' => __( 'First and Last Name with \'-\'', 'ultimate-member' ), + 'name_plus' => __( 'First and Last Name with \'+\'', 'ultimate-member' ), + 'user_id' => __( 'User ID', 'ultimate-member' ), + 'hash' => __( 'Unique hash string', 'ultimate-member' ), + 'custom_meta' => __( 'Custom usermeta', 'ultimate-member' ), + ); + $this->permalink_base_options = apply_filters( 'um_config_permalink_base_options', $this->permalink_base_options ); + + $this->display_name_options = array( + 'default' => __( 'Default WP Display Name', 'ultimate-member' ), + 'nickname' => __( 'Nickname', 'ultimate-member' ), + 'username' => __( 'Username', 'ultimate-member' ), + 'full_name' => __( 'First name & last name', 'ultimate-member' ), + 'sur_name' => __( 'Last name & first name', 'ultimate-member' ), + 'initial_name' => __( 'First name & first initial of last name', 'ultimate-member' ), + 'initial_name_f' => __( 'First initial of first name & last name', 'ultimate-member' ), + 'first_name' => __( 'First name only', 'ultimate-member' ), + 'field' => __( 'Custom field(s)', 'ultimate-member' ), + ); } diff --git a/includes/class-dependencies.php b/includes/class-dependencies.php index 1bc977e0..898fb426 100644 --- a/includes/class-dependencies.php +++ b/includes/class-dependencies.php @@ -32,33 +32,33 @@ if ( ! class_exists( 'um\Dependencies' ) ) { public $ext_required_version = array( 'bbpress' => '2.0.7', 'followers' => '2.1.6', - 'forumwp' => '2.0.4', + 'forumwp' => '2.1.5', 'friends' => '2.1.4', - 'groups' => '2.1.7', - 'jobboardwp' => '1.0.0', + 'groups' => '2.4.2', + 'jobboardwp' => '1.0.7', 'mailchimp' => '2.2.0', 'messaging' => '2.2.5', - 'mycred' => '2.1.6', + 'mycred' => '2.2.4', 'notices' => '2.0.5', 'notifications' => '2.1.3', 'online' => '2.1.1', 'private-content' => '2.0.5', - 'profile-completeness' => '2.1.2', + 'profile-completeness' => '2.2.7', 'profile-tabs' => '1.0.0', - 'recaptcha' => '2.1.2', + 'recaptcha' => '2.3.4', 'reviews' => '2.1.5', 'social-activity' => '2.2.0', 'social-login' => '2.2.0', 'stripe' => '1.0.0', - 'terms-conditions' => '2.1.1', + 'terms-conditions' => '2.1.6', 'unsplash' => '2.0.2', - 'user-bookmarks' => '2.0.2', + 'user-bookmarks' => '2.1.4', 'user-locations' => '1.0.0', - 'user-notes' => '1.0.0', + 'user-notes' => '1.1.0', 'user-photos' => '2.0.4', - 'user-tags' => '2.1.0', + 'user-tags' => '2.2.6', 'verified-users' => '2.0.5', - 'woocommerce' => '2.1.9', + 'woocommerce' => '2.3.7', /*????*/ 'restrict-content' => '2.0', @@ -187,21 +187,21 @@ if ( ! class_exists( 'um\Dependencies' ) ) { */ public function compare_versions( $um_required_ver, $ext_ver, $ext_key, $ext_title ) { - if ( version_compare( ultimatemember_version, $um_required_ver, '<' ) + if ( version_compare( UM_VERSION, $um_required_ver, '<' ) || empty( $this->ext_required_version[$ext_key] ) || version_compare( $this->ext_required_version[$ext_key], $ext_ver, '>' ) ) { $message = ''; - if ( version_compare( ultimatemember_version, $um_required_ver, '<' ) ) { + if ( version_compare( UM_VERSION, $um_required_ver, '<' ) ) { // translators: %1$s is a extension name; %2$s is a plugin name; %3$s is a required version. - $message = sprintf( __( 'This version of "%1$s" requires the core %2$s plugin to be %3$s or higher.', 'ultimate-member' ), $ext_title, ultimatemember_plugin_name, $um_required_ver ) . + $message = sprintf( __( 'This version of "%1$s" requires the core %2$s plugin to be %3$s or higher.', 'ultimate-member' ), $ext_title, UM_PLUGIN_NAME, $um_required_ver ) . '
' . // translators: %s: plugin name. - sprintf( __( 'Please update %s to the latest version.', 'ultimate-member' ), ultimatemember_plugin_name ); + sprintf( __( 'Please update %s to the latest version.', 'ultimate-member' ), UM_PLUGIN_NAME ); } elseif ( empty( $this->ext_required_version[ $ext_key ] ) || version_compare( $this->ext_required_version[ $ext_key ], $ext_ver, '>' ) ) { // translators: %1$s is a plugin name; %2$s is a extension name; %3$s is a extension version. - $message = sprintf( __( 'Sorry, but this version of %1$s does not work with extension "%2$s" %3$s version.', 'ultimate-member' ), ultimatemember_plugin_name, $ext_title, $ext_ver ) . - '
' . + $message = sprintf( __( 'Sorry, but this version of %1$s does not work with extension "%2$s" %3$s version.', 'ultimate-member' ), UM_PLUGIN_NAME, $ext_title, $ext_ver ) . + '
' . // translators: %s: extension name. sprintf( __( 'Please update extension "%s" to the latest version.', 'ultimate-member' ), $ext_title ); } diff --git a/includes/class-functions.php b/includes/class-functions.php index dabefd4e..391e272c 100644 --- a/includes/class-functions.php +++ b/includes/class-functions.php @@ -302,7 +302,7 @@ if ( ! class_exists( 'UM_Functions' ) ) { if ( $path ) { $template = trailingslashit( trailingslashit( WP_PLUGIN_DIR ) . $path ); } else { - $template = trailingslashit( um_path ); + $template = trailingslashit( UM_PATH ); } $template .= 'templates' . DIRECTORY_SEPARATOR . $template_name; } diff --git a/includes/class-init.php b/includes/class-init.php index 2cf9fdf6..d03a5a30 100644 --- a/includes/class-init.php +++ b/includes/class-init.php @@ -1,5 +1,7 @@ -options()->update( 'rest_api_version', '1.0' ); } - if ( $version != ultimatemember_version ) { - update_option( 'um_version', ultimatemember_version ); + if ( $version != UM_VERSION ) { + update_option( 'um_version', UM_VERSION ); } //run setup @@ -574,7 +576,6 @@ if ( ! class_exists( 'UM' ) ) { $this->admin_upgrade(); $this->admin_settings(); $this->columns(); - $this->admin_enqueue(); $this->metabox(); $this->users(); $this->dragdrop(); @@ -584,7 +585,6 @@ if ( ! class_exists( 'UM' ) ) { $this->theme_updater(); } elseif ( $this->is_request( 'frontend' ) ) { $this->frontend()->includes(); - $this->enqueue(); $this->account(); $this->password(); $this->login(); @@ -780,7 +780,6 @@ if ( ! class_exists( 'UM' ) ) { return $this->classes['theme_updater']; } - /** * @since 2.0 */ @@ -922,14 +921,13 @@ if ( ! class_exists( 'UM' ) ) { /** * @since 2.0 + * @depecated 2.6.12 * - * @return um\admin\core\Admin_Enqueue() + * @return um\admin\Enqueue */ - function admin_enqueue() { - if ( empty( $this->classes['admin_enqueue'] ) ) { - $this->classes['admin_enqueue'] = new um\admin\core\Admin_Enqueue(); - } - return $this->classes['admin_enqueue']; + public function admin_enqueue() { + _deprecated_function( __METHOD__, '2.6.12', 'UM()->admin()->enqueue()' ); + return $this->admin()->enqueue(); } @@ -1147,21 +1145,17 @@ if ( ! class_exists( 'UM' ) ) { return $this->classes['register']; } - /** * @since 2.0 + * @todo Make it deprecated and review extensions. * - * @return um\core\Enqueue + * @return um\frontend\Enqueue */ - function enqueue() { - if ( empty( $this->classes['enqueue'] ) ) { - $this->classes['enqueue'] = new um\core\Enqueue(); - } - - return $this->classes['enqueue']; + public function enqueue() { + _deprecated_function( __METHOD__, '2.6.12', 'UM()->frontend()->enqueue()' ); + return $this->frontend()->enqueue(); } - /** * @since 2.0 * diff --git a/includes/common/class-enqueue.php b/includes/common/class-enqueue.php new file mode 100644 index 00000000..319ad997 --- /dev/null +++ b/includes/common/class-enqueue.php @@ -0,0 +1,144 @@ + UM_URL . 'assets/js/', + 'css' => UM_URL . 'assets/css/', + 'libs' => UM_URL . 'assets/libs/', + ); + + /** + * @var string scripts' Standard or Minified versions. + * + * @since 2.6.12 + */ + public static $select2_handle = 'select2'; + + /** + * Enqueue constructor. + * + * @since 2.6.12 + */ + public function __construct() { + add_action( 'admin_enqueue_scripts', array( &$this, 'common_libs' ), 9 ); + add_action( 'wp_enqueue_scripts', array( &$this, 'common_libs' ), 9 ); + add_action( 'enqueue_block_assets', array( &$this, 'common_libs' ), 9 ); + } + + public static function get_url( $type ) { + if ( ! in_array( $type, array( 'js', 'css', 'libs' ), true ) ) { + return ''; + } + + return self::$urls[ $type ]; + } + + public static function get_suffix() { + if ( empty( self::$suffix ) ) { + self::$suffix = ( ( defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ) || ( defined( 'UM_SCRIPT_DEBUG' ) && UM_SCRIPT_DEBUG ) ) ? '' : '.min'; + } + return self::$suffix; + } + + /** + * Register jQuery-UI styles. + * + * @since 2.6.12 + */ + protected function register_jquery_ui() { + wp_register_style( 'um_ui', self::get_url( 'libs' ) . 'jquery-ui/jquery-ui' . self::get_suffix() . '.css', array(), '1.12.1' ); + } + + /** + * Register common JS/CSS libraries. + * + * @since 2.6.12 + */ + public function common_libs() { + $this->register_jquery_ui(); + + $suffix = self::get_suffix(); + + wp_register_script( 'um_tipsy', self::get_url( 'libs' ) . 'tipsy/tipsy' . $suffix . '.js', array( 'jquery' ), '1.0.0a', true ); + wp_register_style( 'um_tipsy', self::get_url( 'libs' ) . 'tipsy/tipsy' . $suffix . '.css', array(), '1.0.0a' ); + + // Raty JS for rating field-type. + wp_register_script( 'um_raty', self::get_url( 'libs' ) . 'raty/um-raty' . $suffix . '.js', array( 'jquery', 'wp-i18n' ), '2.6.0', true ); + wp_register_style( 'um_raty', self::get_url( 'libs' ) . 'raty/um-raty' . $suffix . '.css', array(), '2.6.0' ); + + // Legacy FontIcons. + wp_register_style( 'um_fonticons_ii', self::get_url( 'libs' ) . 'legacy/fonticons/fonticons-ii' . $suffix . '.css', array(), UM_VERSION ); // Ionicons + wp_register_style( 'um_fonticons_fa', self::get_url( 'libs' ) . 'legacy/fonticons/fonticons-fa' . $suffix . '.css', array(), UM_VERSION ); // FontAwesome + +// wp_register_script( 'um-helptip', $this->urls['libs'] . 'helptip/helptip' . $this->suffix . '.js', array( 'jquery', 'jquery-ui-tooltip' ), '1.0.0', true ); +// wp_register_style( 'um-helptip', $this->urls['libs'] . 'helptip/helptip' . $this->suffix . '.css', array( 'dashicons', 'um_ui' ), '1.0.0' ); + + // Select2 JS. + $dequeue_select2 = apply_filters( 'um_dequeue_select2_scripts', false ); + if ( class_exists( 'WooCommerce' ) || $dequeue_select2 ) { + wp_dequeue_style( self::$select2_handle ); + wp_deregister_style( self::$select2_handle ); + + wp_dequeue_script( self::$select2_handle ); + wp_deregister_script( self::$select2_handle ); + } + wp_register_script( self::$select2_handle, self::get_url( 'libs' ) . 'select2/select2.full' . $suffix . '.js', array( 'jquery' ), '4.0.13', true ); + // Load a localized version for Select2. + $locale = get_locale(); + $base_locale = get_locale(); + if ( $locale ) { + if ( ! file_exists( UM_PATH . 'assets/libs/select2/i18n/' . $locale . '.js' ) ) { + $locale = explode( '_', $base_locale ); + $locale = $locale[0]; + + if ( ! file_exists( UM_PATH . 'assets/libs/select2/i18n/' . $locale . '.js' ) ) { + $locale = explode( '_', $base_locale ); + $locale = implode( '-', $locale ); + } + } + + if ( file_exists( UM_PATH . 'assets/libs/select2/i18n/' . $locale . '.js' ) ) { + wp_register_script( 'um_select2_locale', self::get_url( 'libs' ) . 'select2/i18n/' . $locale . '.js', array( 'jquery', self::$select2_handle ), '4.0.13', true ); + self::$select2_handle = 'um_select2_locale'; + } + } + + wp_register_style( 'select2', self::get_url( 'libs' ) . 'select2/select2' . $suffix . '.css', array(), '4.0.13' ); +// +// // Modal +// wp_register_script( 'um-modal', $this->urls['libs'] . 'modal/um-modal' . $this->suffix . '.js', array( 'jquery', 'wp-i18n', 'wp-hooks' ), UM_VERSION, true ); +// wp_register_style( 'um-modal', $this->urls['libs'] . 'modal/um-modal' . $this->suffix . '.css', array(), UM_VERSION ); +// +// // Common JS scripts for wp-admin and frontend both +// wp_register_script( 'um-common', $this->urls['js'] . 'common' . $this->suffix . '.js', array( 'jquery' ), UM_VERSION, true ); +// +// $um_common_variables = array( +// 'locale' => get_locale(), +// ); +// $um_common_variables = apply_filters( 'um_common_js_variables', $um_common_variables ); +// wp_localize_script( 'um-common', 'um_common_variables', $um_common_variables ); +// wp_enqueue_script( 'um-common' ); + } +} diff --git a/includes/core/class-account.php b/includes/core/class-account.php index d48e08d1..1128a08e 100644 --- a/includes/core/class-account.php +++ b/includes/core/class-account.php @@ -49,80 +49,75 @@ if ( ! class_exists( 'um\core\Account' ) ) { } /** - * Init AllTabs for user account + * Init AllTabs for user account. * - * @param $args + * @param array $args * * @throws \Exception */ - function init_tabs( $args ) { - + public function init_tabs( $args ) { $this->tabs = $this->get_tabs(); ksort( $this->tabs ); - $tabs_structed = array(); + $tabs_structured = array(); foreach ( $this->tabs as $k => $arr ) { - foreach ( $arr as $id => $info ) { - - if ( ! empty( $args['tab'] ) && $id != $args['tab'] ) { + if ( ! empty( $args['tab'] ) && $id !== $args['tab'] ) { continue; } $output = $this->get_tab_fields( $id, $args ); if ( ! empty( $output ) ) { - $tabs_structed[ $id ] = $info; + $tabs_structured[ $id ] = $info; } - } - } - $this->tabs = $tabs_structed; + $this->tabs = $tabs_structured; } - /** - * Get all Account tabs + * Get all Account tabs. * * @return array */ - function get_tabs() { - $tabs = array(); + public function get_tabs() { + $tabs = array(); $tabs[100]['general'] = array( - 'icon' => 'um-faicon-user', - 'title' => __( 'Account', 'ultimate-member' ), - 'submit_title' => __( 'Update Account', 'ultimate-member' ), + 'icon' => 'um-faicon-user', + 'title' => __( 'Account', 'ultimate-member' ), + 'submit_title' => __( 'Update Account', 'ultimate-member' ), ); $tabs[200]['password'] = array( - 'icon' => 'um-faicon-asterisk', - 'title' => __( 'Change Password', 'ultimate-member' ), - 'submit_title' => __( 'Update Password', 'ultimate-member' ), + 'icon' => 'um-faicon-asterisk', + 'title' => __( 'Change Password', 'ultimate-member' ), + 'submit_title' => __( 'Update Password', 'ultimate-member' ), ); $tabs[300]['privacy'] = array( - 'icon' => 'um-faicon-lock', - 'title' => __( 'Privacy', 'ultimate-member' ), - 'submit_title' => __( 'Update Privacy', 'ultimate-member' ), + 'icon' => 'um-faicon-lock', + 'title' => __( 'Privacy', 'ultimate-member' ), + 'submit_title' => __( 'Update Privacy', 'ultimate-member' ), ); + // Init here, but default account tab content is empty, so it's hidden. + // Init required here for the using inside the extensions where is possible to disable email notification. + // Default Ultimate Member core notifications cannot be disabled on the user's side. $tabs[400]['notifications'] = array( - 'icon' => 'um-faicon-envelope', - 'title' => __( 'Notifications', 'ultimate-member' ), - 'submit_title' => __( 'Update Notifications', 'ultimate-member' ), + 'icon' => 'um-faicon-envelope', + 'title' => __( 'Notifications', 'ultimate-member' ), + 'submit_title' => __( 'Update Notifications', 'ultimate-member' ), ); - //if user cannot delete profile hide delete tab + // If user cannot delete profile hide delete tab. if ( um_user( 'can_delete_profile' ) || um_user( 'can_delete_everyone' ) ) { - $tabs[99999]['delete'] = array( - 'icon' => 'um-faicon-trash-o', - 'title' => __( 'Delete Account', 'ultimate-member' ), - 'submit_title' => __( 'Delete Account', 'ultimate-member' ), + 'icon' => 'um-faicon-trash-o', + 'title' => __( 'Delete Account', 'ultimate-member' ), + 'submit_title' => __( 'Delete Account', 'ultimate-member' ), ); - } /** @@ -317,30 +312,31 @@ if ( ! class_exists( 'um\core\Account' ) ) { /** * Restrict access to Account page */ - function account_page_restrict() { - + public function account_page_restrict() { if ( um_is_core_page( 'account' ) ) { - //redirect to login for not logged in users + // Redirect to the login page for not logged-in users. if ( ! is_user_logged_in() ) { $redirect_to = add_query_arg( 'redirect_to', - urlencode_deep( um_get_core_page( 'account' ) ) , + urlencode_deep( um_get_core_page( 'account' ) ), um_get_core_page( 'login' ) ); - exit( wp_redirect( $redirect_to ) ); + wp_safe_redirect( $redirect_to ); + exit; } - - //set data for fields - UM()->fields()->set_mode = 'account'; - UM()->fields()->editing = true; + // Set data for fields. + UM()->fields()->set_mode = 'account'; + UM()->fields()->editing = true; + UM()->fields()->global_args = array( + 'mode' => 'account', + ); if ( get_query_var( 'um_tab' ) ) { $this->current_tab = get_query_var( 'um_tab' ); } - } } @@ -567,9 +563,9 @@ if ( ! class_exists( 'um\core\Account' ) ) { function get_tab_fields( $id, $shortcode_args ) { $output = null; - UM()->fields()->set_id = absint( $id ); + UM()->fields()->set_id = absint( $id ); UM()->fields()->set_mode = 'account'; - UM()->fields()->editing = true; + UM()->fields()->editing = true; if ( ! empty( $this->tab_output[ $id ]['content'] ) && ! empty( $this->tab_output[ $id ]['hash'] ) && $this->tab_output[ $id ]['hash'] == md5( json_encode( $shortcode_args ) ) ) { @@ -784,7 +780,6 @@ if ( ! class_exists( 'um\core\Account' ) ) { */ $output = apply_filters( "um_account_content_hook_{$id}", $output, $shortcode_args ); break; - } $this->tab_output[ $id ] = array( 'content' => $output, 'hash' => md5( json_encode( $shortcode_args ) ) ); @@ -940,15 +935,14 @@ if ( ! class_exists( 'um\core\Account' ) ) { return $classes; } - /** - * Checks account actions require current password + * Checks account actions require current password. * - * @param $tab_key + * @param string $tab_key * * @return bool */ - function current_password_is_required( $tab_key ) { + public function current_password_is_required( $tab_key ) { $is_required = true; switch ( $tab_key ) { @@ -956,17 +950,22 @@ if ( ! class_exists( 'um\core\Account' ) ) { $is_required = UM()->options()->get( 'account_general_password' ); break; case 'delete': - break; case 'password': - break; case 'privacy_erase_data': case 'privacy_download_data': break; } - $is_required = apply_filters( "um_account_{$tab_key}_require_current", $is_required ); + return apply_filters( "um_account_{$tab_key}_require_current", $is_required ); + } - return $is_required; + /** + * Check the conditional hook for getting notifications tab data. + * + * @return bool + */ + public function is_notifications_tab_visible() { + return apply_filters( 'um_account_notifications_tab_enabled', false ); } } } diff --git a/includes/core/class-blocks.php b/includes/core/class-blocks.php index ce3ed1cb..8e76e467 100644 --- a/includes/core/class-blocks.php +++ b/includes/core/class-blocks.php @@ -131,7 +131,7 @@ if ( ! class_exists( 'um\core\Blocks' ) ) { foreach ( $blocks as $k => $block_data ) { $block_type = str_replace( 'um-block/', '', $k ); - register_block_type_from_metadata( um_path . 'includes/blocks/' . $block_type, $block_data ); + register_block_type_from_metadata( UM_PATH . 'includes/blocks/' . $block_type, $block_data ); } } diff --git a/includes/core/class-builtin.php b/includes/core/class-builtin.php index d296ac55..424a5ebc 100644 --- a/includes/core/class-builtin.php +++ b/includes/core/class-builtin.php @@ -33,6 +33,11 @@ if ( ! class_exists( 'um\core\Builtin' ) ) { */ public $saved_fields = array(); + /** + * @var array + */ + public $blacklist_fields = array(); + /** * @var array */ @@ -50,6 +55,7 @@ if ( ! class_exists( 'um\core\Builtin' ) ) { add_action( 'init', array( &$this, 'set_core_fields' ), 1 ); add_action( 'init', array( &$this, 'set_predefined_fields' ), 1 ); add_action( 'init', array( &$this, 'set_custom_fields' ), 1 ); + add_action( 'init', array( &$this, 'set_blacklist_fields' ), 1 ); $this->saved_fields = get_option( 'um_fields', array() ); } @@ -149,7 +155,7 @@ if ( ! class_exists( 'um\core\Builtin' ) ) { * * @return int|string */ - function unique_field_err( $key ) { + public function unique_field_err( $key ) { if ( empty( $key ) ) { return __( 'Please provide a meta key', 'ultimate-member' ); } @@ -169,6 +175,20 @@ if ( ! class_exists( 'um\core\Builtin' ) ) { return 0; } + /** + * Checks for a blacklist field error. + * + * @param string $key Custom field metakey. + * + * @return int|string Empty or error string. + */ + public function blacklist_field_err( $key ) { + if ( in_array( strtolower( $key ), $this->blacklist_fields, true ) ) { + return __( 'Your meta key can not be used', 'ultimate-member' ); + } + + return 0; + } /** * Check date range errors (start date) @@ -453,29 +473,29 @@ if ( ! class_exists( 'um\core\Builtin' ) ) { ), 'date' => array( - 'name' => 'Date Picker', - 'col1' => array( '_title', '_metakey', '_help', '_default', '_range', '_years', '_years_x', '_range_start', '_range_end', '_visibility' ), - 'col2' => array( '_label', '_placeholder', '_public', '_roles', '_format', '_format_custom', '_pretty_format', '_disabled_weekdays' ), - 'col3' => array( '_required', '_editable', '_icon' ), - 'validate' => array( - '_title' => array( + 'name' => 'Date Picker', + 'col1' => array( '_title', '_metakey', '_help', '_default', '_range', '_years', '_years_x', '_range_start', '_range_end', '_visibility' ), + 'col2' => array( '_label', '_placeholder', '_public', '_roles', '_format', '_format_custom', '_pretty_format', '_disabled_weekdays' ), + 'col3' => array( '_required', '_editable', '_icon' ), + 'validate' => array( + '_title' => array( 'mode' => 'required', - 'error' => __( 'You must provide a title', 'ultimate-member' ) + 'error' => __( 'You must provide a title', 'ultimate-member' ), ), - '_metakey' => array( - 'mode' => 'unique', + '_metakey' => array( + 'mode' => 'unique', ), - '_years' => array( + '_years' => array( 'mode' => 'numeric', - 'error' => __( 'Number of years is not valid', 'ultimate-member' ) + 'error' => __( 'Number of years is not valid', 'ultimate-member' ), ), - '_range_start' => array( - 'mode' => 'range-start', + '_range_start' => array( + 'mode' => 'range-start', ), - '_range_end' => array( - 'mode' => 'range-end', + '_range_end' => array( + 'mode' => 'range-end', ), - ) + ), ), 'time' => array( @@ -645,6 +665,21 @@ if ( ! class_exists( 'um\core\Builtin' ) ) { ), ), ), + 'oembed' => array( + 'name' => __( 'oEmbed', 'ultimate-member' ), + 'col1' => array( '_title', '_metakey', '_help', '_default', '_visibility' ), + 'col2' => array( '_label', '_placeholder', '_public', '_roles', '_validate', '_custom_validate' ), + 'col3' => array( '_required', '_editable', '_icon' ), + 'validate' => array( + '_title' => array( + 'mode' => 'required', + 'error' => __( 'You must provide a title', 'ultimate-member' ), + ), + '_metakey' => array( + 'mode' => 'unique', + ), + ), + ), /*'group' => array( 'name' => 'Field Group', @@ -1354,6 +1389,33 @@ if ( ! class_exists( 'um\core\Builtin' ) ) { $this->predefined_fields = apply_filters( 'um_predefined_fields_hook', $this->predefined_fields ); } + /** + * Set `blacklist_fields` to avoid creating the custom fields with these keys. + */ + public function set_blacklist_fields() { + $this->blacklist_fields = array( + 'id', + ); + + /** + * Filters change metakeys in the blacklist. + * + * @since 2.6.12 + * @hook um_blacklist_fields_hook + * + * @param {array} $blacklist_fields Blacklisted usermeta keys. + * + * @return {array} Blacklisted usermeta keys. + * + * @example Change array of metakeys in the blacklist. Adding 'user_email' metakey. + * function my_um_blacklist_fields_hook( $blacklist_fields ) { + * $blacklist_fields[] = 'user_email'; + * return $blacklist_fields; + * } + * add_filter( 'um_blacklist_fields_hook', 'my_um_blacklist_fields_hook' ); + */ + $this->blacklist_fields = apply_filters( 'um_blacklist_fields_hook', $this->blacklist_fields ); + } /** * Custom Fields @@ -1503,6 +1565,7 @@ if ( ! class_exists( 'um\core\Builtin' ) ) { $array['unique_username_or_email'] = __('Unique Username/E-mail','ultimate-member'); $array['url'] = __('Website URL','ultimate-member'); $array['youtube_url'] = __('YouTube Profile','ultimate-member'); + $array['youtube_video'] = __('YouTube Video','ultimate-member'); $array['spotify_url'] = __('Spotify URL','ultimate-member'); $array['telegram_url'] = __('Telegram URL','ultimate-member'); $array['discord'] = __('Discord ID','ultimate-member'); diff --git a/includes/core/class-enqueue.php b/includes/core/class-enqueue.php deleted file mode 100644 index 07aeb973..00000000 --- a/includes/core/class-enqueue.php +++ /dev/null @@ -1,442 +0,0 @@ -suffix = ( defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG || defined( 'UM_SCRIPT_DEBUG' ) ) ? '' : '.min'; - - $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 - * - * @type filter - * @title um_core_enqueue_priority - * @description Change Enqueue scripts priority - * @input_vars - * [{"var":"$priority","type":"int","desc":"Priority"}] - * @change_log - * ["Since: 2.0"] - * @usage add_filter( 'um_core_enqueue_priority', 'function_name', 10, 1 ); - * @example - * - */ - return apply_filters( 'um_core_enqueue_priority', 100 ); - } - - - /** - * - */ - function register_scripts() { - $dequeue_select2 = apply_filters( 'um_dequeue_select2_scripts', false ); - if ( class_exists( 'WooCommerce' ) || $dequeue_select2 ) { - wp_dequeue_style( 'select2' ); - wp_deregister_style( 'select2' ); - - wp_dequeue_script( 'select2'); - wp_deregister_script('select2'); - } - wp_register_script( 'select2', $this->js_baseurl . 'select2/select2.full' . $this->suffix . '.js', array( 'jquery' ), '4.0.13', true ); - - wp_register_script( 'um_scrollbar', $this->js_baseurl . 'simplebar' . $this->suffix . '.js', array( 'jquery' ), ultimatemember_version, true ); - - wp_register_script( 'um_jquery_form', $this->js_baseurl . 'um-jquery-form' . $this->suffix . '.js', array( 'jquery' ), ultimatemember_version, true ); - wp_register_script( 'um_fileupload', $this->js_baseurl . 'um-fileupload.js', array( 'jquery', 'um_jquery_form' ), ultimatemember_version, true ); - - - wp_register_script( 'um_datetime', $this->js_baseurl . 'pickadate/picker.js', array( 'jquery' ), ultimatemember_version, true ); - wp_register_script( 'um_datetime_date', $this->js_baseurl . 'pickadate/picker.date.js', array( 'jquery', 'um_datetime' ), ultimatemember_version, true ); - wp_register_script( 'um_datetime_time', $this->js_baseurl . 'pickadate/picker.time.js', array( 'jquery', 'um_datetime' ), ultimatemember_version, true ); -// wp_register_script( 'um_datetime_legacy', $this->js_baseurl . 'pickadate/legacy.js', array( 'jquery', 'um_datetime' ), ultimatemember_version, true ); - // load a localized version for date/time - $locale = get_locale(); - if ( $locale ) { - if ( file_exists( WP_LANG_DIR . '/plugins/ultimate-member/assets/js/pickadate/' . $locale . '.js' ) ) { - wp_register_script('um_datetime_locale', content_url() . '/languages/plugins/ultimate-member/assets/js/pickadate/' . $locale . '.js', array( 'jquery', 'um_datetime' ), ultimatemember_version, true ); - } elseif ( file_exists( um_path . 'assets/js/pickadate/translations/' . $locale . '.js' ) ) { - wp_register_script('um_datetime_locale', um_url . 'assets/js/pickadate/translations/' . $locale . '.js', array( 'jquery', 'um_datetime' ), ultimatemember_version, true ); - } - } - - wp_register_script( 'um_tipsy', $this->js_baseurl . 'um-tipsy' . $this->suffix . '.js', array( 'jquery' ), ultimatemember_version, true ); - wp_register_script( 'um_raty', $this->js_baseurl . 'um-raty' . $this->suffix . '.js', array( 'jquery', 'wp-i18n' ), ultimatemember_version, true ); - wp_register_script( 'um_crop', $this->js_baseurl . 'um-crop' . $this->suffix . '.js', array( 'jquery' ), ultimatemember_version, true ); - - wp_register_script( 'um_modal', $this->js_baseurl . 'um-modal' . $this->suffix . '.js', array( 'jquery', 'wp-util', 'um_crop' ), ultimatemember_version, true ); - - wp_register_script('um_functions', $this->js_baseurl . 'um-functions' . $this->suffix . '.js', array( 'jquery', 'jquery-masonry', 'wp-util', 'um_scrollbar' ), ultimatemember_version, true ); - wp_register_script( 'um_responsive', $this->js_baseurl . 'um-responsive' . $this->suffix . '.js', array( 'jquery', 'um_functions', 'um_crop' ), ultimatemember_version, true ); - - wp_register_script( 'um-gdpr', $this->js_baseurl . 'um-gdpr' . $this->suffix . '.js', array( 'jquery' ), ultimatemember_version, false ); - wp_register_script('um_conditional', $this->js_baseurl . 'um-conditional' . $this->suffix . '.js', array( 'jquery', 'wp-hooks' ), ultimatemember_version, true ); - wp_register_script('um_scripts', $this->js_baseurl . 'um-scripts' . $this->suffix . '.js', array( 'jquery', 'wp-util', 'um_conditional', 'um_datetime', 'um_datetime_date', 'um_datetime_time', /*'um_datetime_legacy',*/ 'select2' ), ultimatemember_version, true ); - /** - * UM hook - * - * @type filter - * @title um_enqueue_localize_data - * @description Extend UM localized data - * @input_vars - * [{"var":"$data","type":"array","desc":"Localize Array"}] - * @change_log - * ["Since: 2.0"] - * @usage add_filter( 'um_enqueue_localize_data', 'function_name', 10, 1 ); - * @example - * - */ - - - $max_upload_size = wp_max_upload_size(); - if ( ! $max_upload_size ) { - $max_upload_size = 0; - } - - $localize_data = apply_filters( 'um_enqueue_localize_data', array( - 'max_upload_size' => $max_upload_size, - 'nonce' => wp_create_nonce( "um-frontend-nonce" ), - ) ); - wp_localize_script( 'um_scripts', 'um_scripts', $localize_data ); - - 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', '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 ); - - $account_deps = apply_filters( 'um_account_scripts_dependencies', array( 'jquery', 'wp-hooks' ) ); - wp_register_script('um_account', $this->js_baseurl . 'um-account' . $this->suffix . '.js', $account_deps, ultimatemember_version, true ); - - wp_register_script( 'um_gchart', 'https://www.google.com/jsapi', array(), ultimatemember_version, true ); - } - - - /** - * Register styles - */ - function register_styles() { - - //FontAwesome and FontIcons styles - wp_register_style( 'um_fonticons_ii', $this->css_baseurl . 'um-fonticons-ii.css', array(), ultimatemember_version ); - wp_register_style( 'um_fonticons_fa', $this->css_baseurl . 'um-fonticons-fa.css', array(), ultimatemember_version ); - wp_register_style( 'um_crop', $this->css_baseurl . 'um-crop.css', array(), ultimatemember_version ); - wp_register_style( 'um_tipsy', $this->css_baseurl . 'um-tipsy.css', array(), ultimatemember_version ); - wp_register_style( 'um_raty', $this->css_baseurl . 'um-raty.css', array(), ultimatemember_version ); - wp_register_style( 'select2', $this->css_baseurl . 'select2/select2.min.css', array(), '4.0.13' ); - wp_register_style( 'um_fileupload', $this->css_baseurl . 'um-fileupload.css', array(), ultimatemember_version ); - wp_register_style( 'um_datetime', $this->css_baseurl . 'pickadate/default.css', array(), ultimatemember_version ); - wp_register_style( 'um_datetime_date', $this->css_baseurl . 'pickadate/default.date.css', array( 'um_datetime' ), ultimatemember_version ); - wp_register_style( 'um_datetime_time', $this->css_baseurl . 'pickadate/default.time.css', array( 'um_datetime' ), ultimatemember_version ); - wp_register_style( 'um_scrollbar', $this->css_baseurl . 'simplebar.css', array(), ultimatemember_version ); - - wp_register_style( 'um_rtl', $this->css_baseurl . 'um.rtl.css', array(), ultimatemember_version ); - wp_register_style( 'um_default_css', $this->css_baseurl . 'um-old-default.css', array(), ultimatemember_version ); - wp_register_style( 'um_modal', $this->css_baseurl . 'um-modal.css', array( 'um_crop' ), ultimatemember_version ); - wp_register_style( 'um_responsive', $this->css_baseurl . 'um-responsive.css', array( 'um_profile', 'um_crop' ), ultimatemember_version ); - - wp_register_style( 'um_styles', $this->css_baseurl . 'um-styles.css', array(), ultimatemember_version ); - - wp_register_style( 'um_ui', $this->css_baseurl . 'jquery-ui.css', array(), ultimatemember_version ); - - wp_register_style( 'um_members', $this->css_baseurl . 'um-members.css', array( 'um_ui' ), ultimatemember_version ); - if ( is_rtl() ) { - wp_register_style( 'um_members_rtl', $this->css_baseurl . 'um-members-rtl.css', array( 'um_members' ), ultimatemember_version ); - } - - wp_register_style( 'um_profile', $this->css_baseurl . 'um-profile.css', array(), ultimatemember_version ); - wp_register_style( 'um_account', $this->css_baseurl . 'um-account.css', array(), ultimatemember_version ); - wp_register_style( 'um_misc', $this->css_baseurl . 'um-misc.css', array(), ultimatemember_version ); - - } - - - /** - * Enqueue scripts and styles - */ - function wp_enqueue_scripts() { - - $this->register_scripts(); - $this->register_styles(); - - $this->load_original(); - - // rtl style - if ( is_rtl() ) { - wp_enqueue_style( 'um_rtl' ); - } - - global $post; - if ( is_object( $post ) && has_shortcode( $post->post_content,'ultimatemember' ) ) { - wp_dequeue_script( 'jquery-form' ); - } - - //old settings before UM 2.0 CSS - wp_enqueue_style( 'um_default_css' ); - - $this->old_css_settings(); - } - - - /** - * - */ - function old_css_settings() { - $uploads = wp_upload_dir(); - $upload_dir = $uploads['basedir'] . DIRECTORY_SEPARATOR . 'ultimatemember' . DIRECTORY_SEPARATOR; - if ( file_exists( $upload_dir . 'um_old_settings.css' ) ) { - wp_register_style( 'um_old_css', um_url . '../../uploads/ultimatemember/um_old_settings.css' ); - wp_enqueue_style( 'um_old_css' ); - } - } - - - /** - * This will load original files (not minified) - */ - function load_original() { - - //maybe deprecated - //$this->load_google_charts(); - - $this->load_fonticons(); - - $this->load_selectjs(); - - $this->load_modal(); - - $this->load_css(); - - $this->load_fileupload(); - - $this->load_datetimepicker(); - - $this->load_raty(); - - //$this->load_scrollto(); - - $this->load_scrollbar(); - - $this->load_imagecrop(); - - $this->load_tipsy(); - - $this->load_functions(); - - $this->load_responsive(); - - $this->load_customjs(); - - } - - - /** - * Include Google charts - */ - function load_google_charts() { - wp_enqueue_script( 'um_gchart' ); - } - - - /** - * Load plugin css - */ - function load_css() { - wp_enqueue_style( 'um_styles' ); - /*if ( is_rtl() ) { - wp_enqueue_style( 'um_members_rtl' ); - } else { - wp_enqueue_style( 'um_members' ); - }*/ - - wp_enqueue_style( 'um_profile' ); - wp_enqueue_style( 'um_account' ); - wp_enqueue_style( 'um_misc' ); - } - - - /** - * Load select-dropdowns JS - */ - function load_selectjs() { - wp_enqueue_script( 'select2' ); - wp_enqueue_style( 'select2' ); - } - - - /** - * Load Fonticons - */ - function load_fonticons() { - wp_enqueue_style( 'um_fonticons_ii' ); - wp_enqueue_style( 'um_fonticons_fa' ); - } - - - /** - * Load fileupload JS - */ - function load_fileupload() { - wp_enqueue_script( 'um_fileupload' ); - wp_enqueue_style( 'um_fileupload' ); - } - - - /** - * Load JS functions - */ - function load_functions() { - wp_enqueue_script('um_functions' ); - wp_enqueue_script( 'um-gdpr' ); - } - - - /** - * Load custom JS - */ - function load_customjs() { - wp_enqueue_script('um_conditional'); - wp_enqueue_script('um_scripts'); - //wp_enqueue_script('um_members'); - wp_enqueue_script('um_profile'); - wp_enqueue_script('um_account'); - } - - - /** - * Load date & time picker - */ - function load_datetimepicker() { - wp_enqueue_script( 'um_datetime' ); - wp_enqueue_script( 'um_datetime_date' ); - wp_enqueue_script( 'um_datetime_time' ); - //wp_enqueue_script( 'um_datetime_legacy' ); - - // load a localized version for date/time - $locale = get_locale(); - if ( $locale && ( file_exists( WP_LANG_DIR . '/plugins/ultimate-member/assets/js/pickadate/' . $locale . '.js' ) || file_exists( um_path . 'assets/js/pickadate/translations/' . $locale . '.js' ) ) ) { - wp_enqueue_script('um_datetime_locale' ); - } - - wp_enqueue_style( 'um_datetime' ); - wp_enqueue_style( 'um_datetime_date' ); - wp_enqueue_style( 'um_datetime_time' ); - } - - - /** - * Load scrollbar - */ - function load_scrollbar(){ - wp_enqueue_style('um_scrollbar'); - } - - - /** - * Load rating - */ - function load_raty() { - wp_enqueue_script('um_raty'); - wp_enqueue_style('um_raty'); - } - - - /** - * Load crop script - */ - function load_imagecrop() { - wp_enqueue_script( 'um_crop' ); - wp_enqueue_style( 'um_crop' ); - } - - - /** - * Load tipsy - */ - function load_tipsy() { - wp_enqueue_script( 'um_tipsy' ); - wp_enqueue_style( 'um_tipsy' ); - } - - - /** - * Load modal - */ - function load_modal() { - wp_enqueue_script( 'um_modal' ); - wp_enqueue_style( 'um_modal' ); - } - - - /** - * Load responsive styles - */ - function load_responsive() { - wp_enqueue_script( 'um_responsive' ); - wp_enqueue_style( 'um_responsive' ); - } - - } -} diff --git a/includes/core/class-external-integrations.php b/includes/core/class-external-integrations.php index aa100f34..905ae007 100644 --- a/includes/core/class-external-integrations.php +++ b/includes/core/class-external-integrations.php @@ -455,7 +455,7 @@ if ( ! class_exists( 'um\core\External_Integrations' ) ) { //if there isn't template at theme folder get template file from plugin dir if ( ! $template ) { - $path = ! empty( UM()->mail()->path_by_slug[ $template_name ] ) ? UM()->mail()->path_by_slug[ $template_name ] : um_path . 'templates/email'; + $path = ! empty( UM()->mail()->path_by_slug[ $template_name ] ) ? UM()->mail()->path_by_slug[ $template_name ] : UM_PATH . 'templates/email'; $template = trailingslashit( $path ) . $template_name . '.php'; } diff --git a/includes/core/class-fields.php b/includes/core/class-fields.php index 026f6322..17483027 100644 --- a/includes/core/class-fields.php +++ b/includes/core/class-fields.php @@ -111,32 +111,32 @@ if ( ! class_exists( 'um\core\Fields' ) ) { builtin()->get_all_user_fields(); foreach ( $fields as $field => $args ) { - if ( isset( $args['advanced'] ) && $args['advanced'] == 'social' ) { + if ( array_key_exists( 'advanced', $args ) && 'social' === $args['advanced'] ) { $social[ $field ] = $args; } } foreach ( $social as $k => $arr ) { if ( um_profile( $k ) ) { - if ( array_key_exists( 'match' , $arr ) ) { + if ( array_key_exists( 'match', $arr ) ) { $match = is_array( $arr['match'] ) ? $arr['match'][0] : $arr['match']; } else { $match = null; } + $arr['url_target'] = isset( $arr['url_target'] ) ? $arr['url_target'] : '_blank'; ?> + style="background: ;" target="" class="um-tip-n" + title=""> ' . wp_kses( $text, UM()->get_allowed_html( 'templates' ) ) . '

'; + $output = '
' . wp_kses( $text, UM()->get_allowed_html( 'templates' ) ) . '
'; return $output; } if ( isset( $this->set_id ) && UM()->form()->processing === $this->set_id ) { - $output = '
' . wp_kses( $text, UM()->get_allowed_html( 'templates' ) ) . '
'; + $output = '
' . wp_kses( $text, UM()->get_allowed_html( 'templates' ) ) . '
'; } else { $output = ''; } if ( ! UM()->form()->processing ) { - $output = '
' . wp_kses( $text, UM()->get_allowed_html( 'templates' ) ) . '
'; + $output = '
' . wp_kses( $text, UM()->get_allowed_html( 'templates' ) ) . '
'; } return $output; } - /** - * Print field notice + * Print field notice. + * + * @since 2.6.12 Added $input_id attribute. * * @param string $text + * @param string $input_id * @param bool $force_show * * @return string */ - public function field_notice( $text, $force_show = false ) { - + public function field_notice( $text, $input_id, $force_show = false ) { if ( empty( $text ) ) { return ''; } + $notice_id = 'um-notice-for-' . $input_id; + if ( $force_show ) { - $output = '
' . wp_kses( $text, UM()->get_allowed_html( 'templates' ) ) . '
'; + $output = '
' . wp_kses( $text, UM()->get_allowed_html( 'templates' ) ) . '
'; return $output; } if ( isset( $this->set_id ) && UM()->form()->processing === $this->set_id ) { - $output = '
' . wp_kses( $text, UM()->get_allowed_html( 'templates' ) ) . '
'; + $output = '
' . wp_kses( $text, UM()->get_allowed_html( 'templates' ) ) . '
'; } else { $output = ''; } if ( ! UM()->form()->processing ) { - $output = '
' . wp_kses( $text, UM()->get_allowed_html( 'templates' ) ) . '
'; + $output = '
' . wp_kses( $text, UM()->get_allowed_html( 'templates' ) ) . '
'; } return $output; } - /** * Checks if field has a server-side error * @@ -1684,6 +1711,12 @@ if ( ! class_exists( 'um\core\Fields' ) ) { break; + case 'oembed': + + $array['input'] = 'url'; + + break; + case 'date': $array['input'] = 'text'; @@ -2068,16 +2101,34 @@ if ( ! class_exists( 'um\core\Fields' ) ) { /** * Getting the fields that need to be disabled in edit mode (profile) * - * @param bool $_um_profile_id + * @param bool|int $_um_profile_id * * @return array */ - function get_restricted_fields_for_edit( $_um_profile_id = false ) { + public function get_restricted_fields_for_edit( $_um_profile_id = false ) { // fields that need to be disabled in edit mode (profile) $arr_restricted_fields = array( 'user_email', 'username', 'user_login', 'user_password', '_um_last_login', 'user_registered' ); - $arr_restricted_fields = apply_filters( 'um_user_profile_restricted_edit_fields', $arr_restricted_fields, $_um_profile_id ); - - return $arr_restricted_fields; + /** + * Filters the form fields that need to be disabled in edit mode (profile). + * + * @param {array} $fields Form fields. + * @param {int} $_um_profile_id User Profile ID. + * + * @return {array} Form fields. + * + * @since 2.0 + * @hook um_user_profile_restricted_edit_fields + * + * @example Make user email field editable on the Profile Page. + * function my_make_email_editable( $fields, $_um_profile_id ) { + * $fields = array_flip( $fields ); + * unset( $fields['user_email'] ); + * $fields = array_keys( $fields ); + * return $fields; + * } + * add_filter( 'um_user_profile_restricted_edit_fields', 'my_make_email_editable', 10, 2 ); + */ + return apply_filters( 'um_user_profile_restricted_edit_fields', $arr_restricted_fields, $_um_profile_id ); } /** @@ -2335,7 +2386,7 @@ if ( ! class_exists( 'um\core\Fields' ) ) { $field_name = $key . $form_suffix; $field_value = $this->field_value( $key, $default, $data ); - $output .= ' + $output .= 'aria_valid_attributes( $this->is_error( $key ), $field_name ) . '/>
'; @@ -2344,9 +2395,9 @@ if ( ! class_exists( 'um\core\Fields' ) ) { } if ( $this->is_error( $key ) ) { - $output .= $this->field_error( $this->show_error( $key ) ); + $output .= $this->field_error( $this->show_error( $key ), $field_name ); } elseif ( $this->is_notice( $key ) ) { - $output .= $this->field_notice( $this->show_notice( $key ) ); + $output .= $this->field_notice( $this->show_notice( $key ), $field_name ); } $output .= '
'; @@ -2369,7 +2420,7 @@ if ( ! class_exists( 'um\core\Fields' ) ) { $field_name = $key . $form_suffix; $field_value = $this->field_value( $key, $default, $data ); - $output .= ' + $output .= 'aria_valid_attributes( $this->is_error( $key ), $field_name ) . '/>
'; @@ -2378,9 +2429,9 @@ if ( ! class_exists( 'um\core\Fields' ) ) { } if ( $this->is_error( $key ) ) { - $output .= $this->field_error( $this->show_error( $key ) ); + $output .= $this->field_error( $this->show_error( $key ), $field_name ); } elseif ( $this->is_notice( $key ) ) { - $output .= $this->field_notice( $this->show_notice( $key ) ); + $output .= $this->field_notice( $this->show_notice( $key ), $field_name ); } $output .= '
'; @@ -2410,14 +2461,14 @@ if ( ! class_exists( 'um\core\Fields' ) ) { $field_name = $key . $form_suffix; $field_value = $this->field_value( $key, $default, $data ); - $output .= ' + $output .= 'aria_valid_attributes( $this->is_error( $key ), $field_name ) . '/> '; if ( $this->is_error( $key ) ) { - $output .= $this->field_error( $this->show_error( $key ) ); + $output .= $this->field_error( $this->show_error( $key ), $field_name ); } elseif ( $this->is_notice( $key ) ) { - $output .= $this->field_notice( $this->show_notice( $key ) ); + $output .= $this->field_notice( $this->show_notice( $key ), $field_name ); } $output .= ''; @@ -2446,20 +2497,20 @@ if ( ! class_exists( 'um\core\Fields' ) ) { if ( UM()->options()->get( 'toggle_password' ) ) { $output .= '
- + aria_valid_attributes( $this->is_error( $key ), $field_name ) . '/>
'; } else { - $output .= ' + $output .= 'aria_valid_attributes( $this->is_error( $key ), $field_name ) . '/> '; } if ( $this->is_error( $key ) ) { - $output .= $this->field_error( $this->show_error( $key ) ); + $output .= $this->field_error( $this->show_error( $key ), $field_name ); } elseif ( $this->is_notice( $key ) ) { - $output .= $this->field_notice( $this->show_notice( $key ) ); + $output .= $this->field_notice( $this->show_notice( $key ), $field_name ); } $output .= ''; @@ -2484,20 +2535,20 @@ if ( ! class_exists( 'um\core\Fields' ) ) { if ( UM()->options()->get( 'toggle_password' ) ) { $output .= '
- + aria_valid_attributes( $this->is_error( $key ), $field_name ) . '/>
'; } else { - $output .= ' + $output .= 'aria_valid_attributes( $this->is_error( $key ), $field_name ) . '/> '; } if ( $this->is_error( $key ) ) { - $output .= $this->field_error( $this->show_error( $key ) ); + $output .= $this->field_error( $this->show_error( $key ), $field_name ); } elseif ( $this->is_notice( $key ) ) { - $output .= $this->field_notice( $this->show_notice( $key ) ); + $output .= $this->field_notice( $this->show_notice( $key ), $field_name ); } $output .= ''; @@ -2532,20 +2583,20 @@ if ( ! class_exists( 'um\core\Fields' ) ) { $field_value = $this->field_value( $key, $default, $data ); if ( UM()->options()->get( 'toggle_password' ) ) { $output .= '
- + aria_valid_attributes( $this->is_error( $key ), $name ) . '/>
'; } else { - $output .= ' + $output .= 'aria_valid_attributes( $this->is_error( $key ), $name ) . '/> '; } if ( $this->is_error( $key ) ) { - $output .= $this->field_error( $this->show_error( $key ) ); + $output .= $this->field_error( $this->show_error( $key ), $name ); } elseif ( $this->is_notice( $key ) ) { - $output .= $this->field_notice( $this->show_notice( $key ) ); + $output .= $this->field_notice( $this->show_notice( $key ), $name ); } $output .= ''; @@ -2586,17 +2637,17 @@ if ( ! class_exists( 'um\core\Fields' ) ) { } if ( UM()->options()->get( 'toggle_password' ) ) { - $output .= '
'; + $output .= '
aria_valid_attributes( $this->is_error( $key ), $name ) . '/>
'; } else { - $output .= ''; + $output .= 'aria_valid_attributes( $this->is_error( $key ), $name ) . '/>'; } $output .= ''; if ( $this->is_error( $key ) ) { - $output .= $this->field_error( $this->show_error( $key ) ); + $output .= $this->field_error( $this->show_error( $key ), $name ); } elseif ( $this->is_notice( $key ) ) { - $output .= $this->field_notice( $this->show_notice( $key ) ); + $output .= $this->field_notice( $this->show_notice( $key ), $name ); } $output .= ''; @@ -2604,6 +2655,7 @@ if ( ! class_exists( 'um\core\Fields' ) ) { } break; /* URL */ + case 'oembed': case 'url': $output .= '
get_atts( $key, $classes, $conditional, $data ) . '>'; @@ -2620,14 +2672,14 @@ if ( ! class_exists( 'um\core\Fields' ) ) { $field_name = $key . $form_suffix; $field_value = $this->field_value( $key, $default, $data ); - $output .= ' + $output .= 'aria_valid_attributes( $this->is_error( $key ), $field_name ) . '/>
'; if ( $this->is_error( $key ) ) { - $output .= $this->field_error( $this->show_error( $key ) ); + $output .= $this->field_error( $this->show_error( $key ), $field_name ); } elseif ( $this->is_notice( $key ) ) { - $output .= $this->field_notice( $this->show_notice( $key ) ); + $output .= $this->field_notice( $this->show_notice( $key ), $field_name ); } $output .= ''; @@ -2666,14 +2718,14 @@ if ( ! class_exists( 'um\core\Fields' ) ) { $disabled_weekdays = '[' . implode( ',', $data['disabled_weekdays'] ) . ']'; } - $output .= ' + $output .= 'aria_valid_attributes( $this->is_error( $key ), $field_name ) . '/> '; if ( $this->is_error( $key ) ) { - $output .= $this->field_error( $this->show_error( $key ) ); + $output .= $this->field_error( $this->show_error( $key ), $field_name ); } elseif ( $this->is_notice( $key ) ) { - $output .= $this->field_notice( $this->show_notice( $key ) ); + $output .= $this->field_notice( $this->show_notice( $key ), $field_name ); } $output .= ''; @@ -2695,14 +2747,14 @@ if ( ! class_exists( 'um\core\Fields' ) ) { $field_name = $key . $form_suffix; $field_value = $this->field_value( $key, $default, $data ); - $output .= ' + $output .= 'aria_valid_attributes( $this->is_error( $key ), $field_name ) . '/> '; if ( $this->is_error( $key ) ) { - $output .= $this->field_error( $this->show_error( $key ) ); + $output .= $this->field_error( $this->show_error( $key ), $field_name ); } elseif ( $this->is_notice( $key ) ) { - $output .= $this->field_notice( $this->show_notice( $key ) ); + $output .= $this->field_notice( $this->show_notice( $key ), $field_name ); } $output .= ''; @@ -2779,7 +2831,7 @@ if ( ! class_exists( 'um\core\Fields' ) ) { $show_bio = false; $bio_html = false; $global_setting = UM()->options()->get( 'profile_show_html_bio' ); - if ( 'profile' === $this->global_args['mode'] ) { + if ( isset( $this->global_args['mode'] ) && 'profile' === $this->global_args['mode'] ) { if ( ! empty( $this->global_args['use_custom_settings'] ) ) { if ( ! empty( $this->global_args['show_bio'] ) ) { $show_bio = true; @@ -2808,7 +2860,7 @@ if ( ! class_exists( 'um\core\Fields' ) ) { } } } - $output .= ''; + $output .= ''; } $output .= ''; @@ -2818,9 +2870,9 @@ if ( ! class_exists( 'um\core\Fields' ) ) { } if ( $this->is_error( $key ) ) { - $output .= $this->field_error( $this->show_error( $key ) ); + $output .= $this->field_error( $this->show_error( $key ), $field_name ); } elseif ( $this->is_notice( $key ) ) { - $output .= $this->field_notice( $this->show_notice( $key ) ); + $output .= $this->field_notice( $this->show_notice( $key ), $field_name ); } $output .= ''; @@ -2835,13 +2887,13 @@ if ( ! class_exists( 'um\core\Fields' ) ) { $output .= '
'; - $output .= '
'; + $output .= '
aria_valid_attributes( $this->is_error( $key ), $key ) . '>
'; $output .= '
'; if ( $this->is_error( $key ) ) { - $output .= $this->field_error( $this->show_error( $key ) ); + $output .= $this->field_error( $this->show_error( $key ), $key ); } elseif ( $this->is_notice( $key ) ) { - $output .= $this->field_notice( $this->show_notice( $key ) ); + $output .= $this->field_notice( $this->show_notice( $key ), $key ); } $output .= ''; @@ -2888,7 +2940,7 @@ if ( ! class_exists( 'um\core\Fields' ) ) { $field_name = $key . $form_suffix; - $output .= ''; + $output .= 'aria_valid_attributes( $this->is_error( $key ), $field_name ) . '/>'; if ( isset( $data['label'] ) ) { $output .= $this->field_label( $data['label'], $key, $data ); } @@ -2973,9 +3025,9 @@ if ( ! class_exists( 'um\core\Fields' ) ) { } /* end */ if ( $this->is_error( $key ) ) { - $output .= $this->field_error( $this->show_error( $key ) ); + $output .= $this->field_error( $this->show_error( $key ), $field_name ); } elseif ( $this->is_notice( $key ) ) { - $output .= $this->field_notice( $this->show_notice( $key ) ); + $output .= $this->field_notice( $this->show_notice( $key ), $field_name ); } $output .= ''; @@ -2987,7 +3039,7 @@ if ( ! class_exists( 'um\core\Fields' ) ) { $field_name = $key . $form_suffix; $file_field_value = $this->field_value( $key, $default, $data ); - $output .= ''; + $output .= 'aria_valid_attributes( $this->is_error( $key ), $field_name ) . '/>'; if ( isset( $data['label'] ) ) { $output .= $this->field_label( $data['label'], $key, $data ); } @@ -3098,9 +3150,9 @@ if ( ! class_exists( 'um\core\Fields' ) ) { } /* end */ if ( $this->is_error( $key ) ) { - $output .= $this->field_error( $this->show_error( $key ) ); + $output .= $this->field_error( $this->show_error( $key ), $field_name ); } elseif ( $this->is_notice( $key ) ) { - $output .= $this->field_notice( $this->show_notice( $key ) ); + $output .= $this->field_notice( $this->show_notice( $key ), $field_name ); } $output .= ''; @@ -3317,7 +3369,7 @@ if ( ! class_exists( 'um\core\Fields' ) ) { $field_value = ''; - $output .= 'aria_valid_attributes( $this->is_error( $form_key ), $form_key ) . '>'; $output .= ''; // add options @@ -3362,9 +3414,9 @@ if ( ! class_exists( 'um\core\Fields' ) ) { $output .= ''; if ( $this->is_error( $form_key ) ) { - $output .= $this->field_error( $this->show_error( $form_key ) ); + $output .= $this->field_error( $this->show_error( $form_key ), $form_key ); } elseif ( $this->is_notice( $form_key ) ) { - $output .= $this->field_notice( $this->show_notice( $form_key ) ); + $output .= $this->field_notice( $this->show_notice( $form_key ), $form_key ); } $output .= ''; @@ -3399,7 +3451,7 @@ if ( ! class_exists( 'um\core\Fields' ) ) { $output .= '
'; } - $output .= 'aria_valid_attributes( $this->is_error( $key ), $field_name ) . '>'; if ( isset( $options ) && 'builtin' === $options ) { $options = UM()->builtin()->get( $data['filter'] ); @@ -3518,9 +3570,9 @@ if ( ! class_exists( 'um\core\Fields' ) ) { $output .= ''; if ( $this->is_error( $key ) ) { - $output .= $this->field_error( $this->show_error( $key ) ); + $output .= $this->field_error( $this->show_error( $key ), $field_name ); } elseif ( $this->is_notice( $key ) ) { - $output .= $this->field_notice( $this->show_notice( $key ) ); + $output .= $this->field_notice( $this->show_notice( $key ), $field_name ); } $output .= ''; @@ -3573,7 +3625,7 @@ if ( ! class_exists( 'um\core\Fields' ) ) { $options = apply_filters( "um_radio_field_options_{$key}", $options ); $options = $this->get_available_roles( $form_key, $options ); - $output .= '
get_atts( $key, $classes, $conditional, $data ) . '>'; + $output .= '
get_atts( $key, $classes, $conditional, $data ) . ' ' . $this->aria_valid_attributes( $this->is_error( $key ), $form_key ) . '>'; if ( isset( $data['label'] ) ) { $output .= $this->field_label( $data['label'], $key, $data ); @@ -3675,9 +3727,9 @@ if ( ! class_exists( 'um\core\Fields' ) ) { $output .= '
'; if ( $this->is_error( $key ) ) { - $output .= $this->field_error( $this->show_error( $key ) ); + $output .= $this->field_error( $this->show_error( $key ), $form_key ); } elseif ( $this->is_notice( $key ) ) { - $output .= $this->field_notice( $this->show_notice( $key ) ); + $output .= $this->field_notice( $this->show_notice( $key ), $form_key ); } $output .= '
'; @@ -3727,7 +3779,7 @@ if ( ! class_exists( 'um\core\Fields' ) ) { */ $options = apply_filters( "um_checkbox_field_options_{$key}", $options ); - $output .= '
get_atts( $key, $classes, $conditional, $data ) . '>'; + $output .= '
get_atts( $key, $classes, $conditional, $data ) . ' ' . $this->aria_valid_attributes( $this->is_error( $key ), $key ) . '>'; if ( isset( $data['label'] ) ) { $output .= $this->field_label( $data['label'], $key, $data ); @@ -3816,9 +3868,9 @@ if ( ! class_exists( 'um\core\Fields' ) ) { $output .= '
'; if ( $this->is_error( $key ) ) { - $output .= $this->field_error( $this->show_error( $key ) ); + $output .= $this->field_error( $this->show_error( $key ), $key ); } elseif ( $this->is_notice( $key ) ) { - $output .= $this->field_notice( $this->show_notice( $key ) ); + $output .= $this->field_notice( $this->show_notice( $key ), $key ); } $output .= '
'; @@ -4302,7 +4354,7 @@ if ( ! class_exists( 'um\core\Fields' ) ) { $show_bio = false; $bio_html = false; $global_setting = UM()->options()->get( 'profile_show_html_bio' ); - if ( 'profile' === $this->global_args['mode'] ) { + if ( isset( $this->global_args['mode'] ) && 'profile' === $this->global_args['mode'] ) { if ( ! empty( $this->global_args['use_custom_settings'] ) ) { if ( ! empty( $this->global_args['show_bio'] ) ) { $show_bio = true; @@ -4392,6 +4444,21 @@ if ( ! class_exists( 'um\core\Fields' ) ) { } } + break; + /* oEmbed */ + case 'oembed': + $output .= '
get_atts( $key, $classes, $conditional, $data ) . '>'; + + if ( isset( $data['label'] ) || ! empty( $data['icon'] ) ) { + $output .= $this->field_label( $data['label'], $key, $data ); + } + $response = wp_oembed_get( $_field_value ); + if ( empty( $response ) ) { + $response = $_field_value; + } + $output .= '
'; + $output .= '
' . $response . '
'; + $output .= '
'; break; /* HTML */ case 'block': diff --git a/includes/core/class-fonticons.php b/includes/core/class-fonticons.php index 9d7abd74..d17953cb 100644 --- a/includes/core/class-fonticons.php +++ b/includes/core/class-fonticons.php @@ -27,8 +27,8 @@ if ( ! class_exists( 'um\core\FontIcons' ) ) { $cached_option = get_option( 'um_cache_fonticons', array() ); if ( empty( $cached_option ) ) { - $files['ii'] = um_path . 'assets/css/um-fonticons-ii.css'; - $files['fa'] = um_path . 'assets/css/um-fonticons-fa.css'; + $files['ii'] = UM_PATH . 'assets/libs/legacy/fonticons/fonticons-ii.css'; + $files['fa'] = UM_PATH . 'assets/libs/legacy/fonticons/fonticons-fa.css'; $array = array(); foreach ( $files as $c => $file ) { diff --git a/includes/core/class-form.php b/includes/core/class-form.php index 6a3b74d4..d1dbf837 100644 --- a/includes/core/class-form.php +++ b/includes/core/class-form.php @@ -41,7 +41,7 @@ if ( ! class_exists( 'um\core\Form' ) ) { public $nonce = null; /** - * @var null + * @var null|array */ public $errors = null; @@ -775,6 +775,7 @@ if ( ! class_exists( 'um\core\Form' ) ) { $form[ $k ] = sanitize_textarea_field( $form[ $k ] ); } break; + case 'oembed': case 'url': $f = UM()->builtin()->get_a_field( $k ); diff --git a/includes/core/class-gdpr.php b/includes/core/class-gdpr.php index 21397af4..ca035563 100644 --- a/includes/core/class-gdpr.php +++ b/includes/core/class-gdpr.php @@ -36,7 +36,7 @@ if ( ! class_exists( 'um\core\GDPR' ) ) { if ( file_exists( $template_path ) ) { require $template_path; } else { - require um_path . 'templates/gdpr-register.php'; + require UM_PATH . 'templates/gdpr-register.php'; } } } diff --git a/includes/core/class-mail.php b/includes/core/class-mail.php index b46854ea..8bd1acd7 100644 --- a/includes/core/class-mail.php +++ b/includes/core/class-mail.php @@ -69,35 +69,32 @@ if ( ! class_exists( 'um\core\Mail' ) ) { } /** - * Init paths for email notifications + * Init paths for email notifications. */ public function init_paths() { /** - * UM hook + * Filters extend email templates path. * - * @type filter - * @title um_email_templates_path_by_slug - * @description Extend email templates path - * @input_vars - * [{"var":"$paths","type":"array","desc":"Email slug -> Template Path"}] - * @change_log - * ["Since: 2.0"] - * @usage - * - * @example - * Extends email templates path. * function my_email_templates_path_by_slug( $paths ) { * // your code here + * $paths['{template_name}'] = '{template_path}'; * return $paths; * } - * ?> + * add_filter( 'um_email_templates_path_by_slug', 'my_email_templates_path_by_slug' ); */ $this->path_by_slug = apply_filters( 'um_email_templates_path_by_slug', $this->path_by_slug ); } /** - * Check blog ID on multisite, return '' if single site + * Check blog ID on multisite, return '' if single site. * * @return string */ @@ -137,34 +134,28 @@ if ( ! class_exists( 'um\core\Mail' ) ) { ); } - // If there isn't template at theme folder, get template file from plugin dir + // If there isn't template at theme folder, get template file from plugin dir. if ( ! $template ) { - $path = ! empty( $this->path_by_slug[ $template_name ] ) ? $this->path_by_slug[ $template_name ] : um_path . 'templates/email'; + $path = ! empty( $this->path_by_slug[ $template_name ] ) ? $this->path_by_slug[ $template_name ] : UM_PATH . 'templates/email'; $template = trailingslashit( $path ) . $template_name . '.php'; } - - // Return what we found. /** - * UM hook + * Filters email notification template path. * - * @type filter - * @title um_locate_email_template - * @description Change email notification template path - * @input_vars - * [{"var":"$template","type":"string","desc":"Template Path"}, - * {"var":"$template_name","type":"string","desc":"Template Name"}] - * @change_log - * ["Since: 2.0"] - * @usage - * - * @example - * Change email notification template path. + * function my_locate_email_template( $template, $template_name ) { * // your code here * return $template; * } - * ?> + * add_filter( 'um_locate_email_template', 'my_locate_email_template', 10, 2 ); */ return apply_filters( 'um_locate_email_template', $template, $template_name ); } @@ -178,27 +169,23 @@ if ( ! class_exists( 'um\core\Mail' ) ) { $located = $this->locate_template( $slug ); /** - * UM hook + * Filters email template location. * - * @type filter - * @title um_email_template_path - * @description Change email template location - * @input_vars - * [{"var":"$located","type":"string","desc":"Template Location"}, - * {"var":"$slug","type":"string","desc":"Template Key"}, - * {"var":"$args","type":"array","desc":"Template settings"}] - * @change_log - * ["Since: 2.0"] - * @usage - * - * @example - * Change email template location. + * function my_email_template_path( $located, $slug, $args ) { * // your code here * return $located; * } - * ?> + * add_filter( 'um_email_template_path', 'my_email_template_path', 10, 3 ); */ $located = apply_filters( 'um_email_template_path', $located, $slug, $args ); @@ -209,193 +196,165 @@ if ( ! class_exists( 'um\core\Mail' ) ) { ob_start(); /** - * UM hook + * Fires before email template loading. * - * @type action - * @title um_before_email_template_part - * @description Action before email template loading - * @input_vars - * [{"var":"$slug","type":"string","desc":"Email template slug"}, - * {"var":"$located","type":"string","desc":"Email template location"}, - * {"var":"$args","type":"array","desc":"Email template arguments"}] - * @change_log - * ["Since: 2.0"] - * @usage add_action( 'um_before_email_template_part', 'function_name', 10, 3 ); - * @example - * Action before email template loading. * function my_before_email_template_part( $slug, $located, $args ) { * // your code here * } - * ?> + * add_action( 'um_before_email_template_part', 'my_before_email_template_part', 10, 3 ); */ do_action( 'um_before_email_template_part', $slug, $located, $args ); - include( $located ); + include $located; + /** - * UM hook + * Fires after email template loading. * - * @type action - * @title um_after_email_template_part - * @description Action after email template loading - * @input_vars - * [{"var":"$slug","type":"string","desc":"Email template slug"}, - * {"var":"$located","type":"string","desc":"Email template location"}, - * {"var":"$args","type":"array","desc":"Email template arguments"}] - * @change_log - * ["Since: 2.0"] - * @usage add_action( 'um_after_email_template_part', 'function_name', 10, 3 ); - * @example - * Action after email template loading. * function my_after_email_template_part( $slug, $located, $args ) { * // your code here * } - * ?> + * add_action( 'um_after_email_template_part', 'my_after_email_template_part', 10, 3 ); */ do_action( 'um_after_email_template_part', $slug, $located, $args ); return ob_get_clean(); } - /** - * Prepare email template to send + * Prepare email template to send. * - * @param $slug - * @param $args + * @param string $slug + * @param array $args * @return mixed|string */ - function prepare_template( $slug, $args = array() ) { + public function prepare_template( $slug, $args = array() ) { ob_start(); if ( UM()->options()->get( 'email_html' ) ) { /** - * UM hook + * Filters email notification template header. * - * @type filter - * @title um_email_template_html_formatting - * @description Change email notification template header - * @input_vars - * [{"var":"$header","type":"string","desc":"Email notification header. '' by default"}, - * {"var":"$slug","type":"string","desc":"Template Key"}, - * {"var":"$args","type":"array","desc":"Template settings"}] - * @change_log - * ["Since: 2.0"] - * @usage - * - * @example - * ` by default. + * @param {string} $slug Email template slug. + * @param {array} $args Email template settings. + * + * @return {string} Email notification header. + * + * @since 2.0 + * @hook um_email_template_html_formatting + * + * @example Change email notification template header. * function my_email_template_html_formatting( $header, $slug, $args ) { * // your code here * return $header; * } - * ?> + * add_filter( 'um_email_template_html_formatting', 'my_email_template_html_formatting', 10, 3 ); */ echo apply_filters( 'um_email_template_html_formatting', '', $slug, $args ); /** - * UM hook + * Fires before email template body display. * - * @type action - * @title um_before_email_template_body - * @description Action before email template body display - * @input_vars - * [{"var":"$slug","type":"string","desc":"Email template slug"}, - * {"var":"$args","type":"array","desc":"Email template arguments"}] - * @change_log - * ["Since: 2.0"] - * @usage add_action( 'um_before_email_template_body', 'function_name', 10, 2 ); - * @example - * Action before email template body display. * function my_before_email_template_body( $slug, $args ) { * // your code here * } - * ?> + * add_action( 'um_before_email_template_body', 'my_before_email_template_body', 10, 2 ); */ do_action( 'um_before_email_template_body', $slug, $args ); /** - * UM hook + * Filters email notification template body additional attributes. * - * @type filter - * @title um_email_template_body_attrs - * @description Change email notification template body additional attributes - * @input_vars - * [{"var":"$body_atts","type":"string","desc":"Email notification body attributes"}, - * {"var":"$slug","type":"string","desc":"Template Key"}, - * {"var":"$args","type":"array","desc":"Template settings"}] - * @change_log - * ["Since: 2.0"] - * @usage - * - * @example - * Change email notification template body additional attributes. + * function my_email_template_body_attrs( $body_attrs, $slug, $args ) { * // your code here - * return $body_atts; + * return $body_attrs; * } - * ?> + * add_filter( 'um_email_template_body_attrs', 'my_email_template_body_attrs', 10, 3 ); */ $body_attrs = apply_filters( 'um_email_template_body_attrs', 'style="background: #f2f2f2;-webkit-font-smoothing: antialiased;-moz-osx-font-smoothing: grayscale;"', $slug, $args ); ?> - - > + > get_email_template( $slug, $args ); ?> - get_email_template( $slug, $args ); - $plain_email_template = strip_tags( $raw_email_template ); - if( $plain_email_template !== $raw_email_template ){ - $plain_email_template = preg_replace( array('/ /mi', '/^\s+/mi'), array(' ', ''), $plain_email_template ); + // Strip tags in plain text email + // Important don't use HTML in plain text emails! + $raw_email_template = $this->get_email_template( $slug, $args ); + $plain_email_template = wp_strip_all_tags( $raw_email_template ); + if ( $plain_email_template !== $raw_email_template ) { + $plain_email_template = preg_replace( array( '/ /mi', '/^\s+/mi' ), array( ' ', '' ), $plain_email_template ); } echo $plain_email_template; } $message = ob_get_clean(); - /** - * UM hook + * Filters email notification message content. * - * @type filter - * @title um_email_send_message_content - * @description Change email notification message content - * @input_vars - * [{"var":"$message","type":"string","desc":"Message Content"}, - * {"var":"$template","type":"string","desc":"Template Key"}, - * {"var":"$args","type":"string","desc":"Notification Arguments"}] - * @change_log - * ["Since: 2.0"] - * @usage - * - * @example - * Change email notification message content. + * function my_email_send_message_content( $message, $slug, $args ) { * // your code here * return $message; * } - * ?> + * add_filter( 'um_email_send_message_content', 'my_email_send_message_content', 10, 3 ); */ $message = apply_filters( 'um_email_send_message_content', $message, $slug, $args ); - add_filter( 'um_template_tags_patterns_hook', array( &$this, 'add_placeholder' ), 10, 1 ); - add_filter( 'um_template_tags_replaces_hook', array( &$this, 'add_replace_placeholder' ), 10, 1 ); + add_filter( 'um_template_tags_patterns_hook', array( &$this, 'add_placeholder' ) ); + add_filter( 'um_template_tags_replaces_hook', array( &$this, 'add_replace_placeholder' ) ); - // Convert tags in email template + // Convert tags in email template. return um_convert_tags( $message, $args ); } @@ -415,10 +374,7 @@ if ( ! class_exists( 'um\core\Mail' ) ) { return; } /** - * Filters for disabling email notifications programmatically. - * - * @since 2.6.1 - * @hook um_disable_email_notification_sending + * Filters disabling email notifications programmatically. * * @param {bool} $disabled Does an email is disabled programmatically. By default it is false. * @param {string} $email Email address for sending. @@ -426,12 +382,38 @@ if ( ! class_exists( 'um\core\Mail' ) ) { * @param {array} $args Arguments for sending email. * * @return {bool} `true` if email is disabled programmatically. + * + * @since 2.6.1 + * @hook um_disable_email_notification_sending + * + * @example Disabling email notifications programmatically. + * function my_disable_email_notification_sending( $disabled, $email, $template, $args ) { + * // your code here + * return $disabled; + * } + * add_filter( 'um_disable_email_notification_sending', 'my_disable_email_notification_sending', 10, 4 ); */ $hook_disabled = apply_filters( 'um_disable_email_notification_sending', false, $email, $template, $args ); if ( false !== $hook_disabled ) { return; } + /** + * Fires before email notification sending. + * + * @param {string} $email Email template slug. + * @param {string} $template Email template settings. + * @param {array} $args Arguments for sending email. + * + * @since 2.0 + * @hook um_before_email_notification_sending + * + * @example Action before email notification sending. + * function my_before_email_notification_sending( $email, $template, $args ) { + * // your code here + * } + * add_action( 'um_before_email_notification_sending', 'my_before_email_notification_sending', 10, 3 ); + */ do_action( 'um_before_email_notification_sending', $email, $template, $args ); $this->attachments = array(); @@ -439,30 +421,26 @@ if ( ! class_exists( 'um\core\Mail' ) ) { $mail_from_addr = UM()->options()->get( 'mail_from_addr' ) ? UM()->options()->get( 'mail_from_addr' ) : get_bloginfo( 'admin_email' ); $this->headers = 'From: ' . stripslashes( $mail_from ) . ' <' . $mail_from_addr . '>' . "\r\n"; - add_filter( 'um_template_tags_patterns_hook', array( UM()->mail(), 'add_placeholder' ), 10, 1 ); - add_filter( 'um_template_tags_replaces_hook', array( UM()->mail(), 'add_replace_placeholder' ), 10, 1 ); + add_filter( 'um_template_tags_patterns_hook', array( UM()->mail(), 'add_placeholder' ) ); + add_filter( 'um_template_tags_replaces_hook', array( UM()->mail(), 'add_replace_placeholder' ) ); /** - * UM hook + * Filters email notification subject. * - * @type filter - * @title um_email_send_subject - * @description Change email notification subject - * @input_vars - * [{"var":"$subject","type":"string","desc":"Subject"}, - * {"var":"$key","type":"string","desc":"Template Key"}] - * @change_log - * ["Since: 2.0"] - * @usage - * - * @example - * Change email notification subject. * function my_email_send_subject( $subject, $key ) { * // your code here - * return $paths; + * return $subject; * } - * ?> + * add_filter( 'um_email_send_subject', 'my_email_send_subject', 10, 2 ); */ $subject = apply_filters( 'um_email_send_subject', UM()->options()->get( $template . '_sub' ), $template ); $subject = wp_unslash( um_convert_tags( $subject, $args ) ); @@ -477,9 +455,25 @@ if ( ! class_exists( 'um\core\Mail' ) ) { $this->headers .= "Content-Type: text/plain\r\n"; } - // Send mail + // Send mail. wp_mail( $email, $this->subject, $this->message, $this->headers, $this->attachments ); + /** + * Fires after email notification sending. + * + * @param {string} $email Email template slug. + * @param {string} $template Email template settings. + * @param {array} $args Arguments for sending email. + * + * @since 2.0 + * @hook um_after_email_notification_sending + * + * @example Action after email notification sending. + * function my_after_email_notification_sending( $email, $template, $args ) { + * // your code here + * } + * add_action( 'um_after_email_notification_sending', 'my_after_email_notification_sending', 10, 3 ); + */ do_action( 'um_after_email_notification_sending', $email, $template, $args ); } @@ -490,25 +484,21 @@ if ( ! class_exists( 'um\core\Mail' ) ) { */ public function get_template_filename( $template_name ) { /** - * UM hook + * Filters email notification template name. * - * @type filter - * @title um_change_email_template_file - * @description Change email notification template path - * @input_vars - * [{"var":"$template_name","type":"string","desc":"Template Name"}] - * @change_log - * ["Since: 2.0"] - * @usage - * - * @example - * Change email notification template path. + * function my_change_email_template_file( $template_name ) { * // your code here - * return $template; + * return $template_name; * } - * ?> + * add_filter( 'um_change_email_template_file', 'my_change_email_template_file' ); */ return apply_filters( 'um_change_email_template_file', $template_name ); } @@ -535,9 +525,9 @@ if ( ! class_exists( 'um\core\Mail' ) ) { // Return what we found. if ( get_template_directory() === get_stylesheet_directory() ) { return ! $template ? false : true; - } else { - return strstr( $template, get_stylesheet_directory() ); } + + return strstr( $template, get_stylesheet_directory() ); } /** @@ -562,28 +552,35 @@ if ( ! class_exists( 'um\core\Mail' ) ) { $template_path = trailingslashit( get_stylesheet_directory() . '/ultimate-member/email' . $blog_id ) . $template_name_file . '.php'; break; case 'plugin': - $path = ! empty( $this->path_by_slug[ $template_name ] ) ? $this->path_by_slug[ $template_name ] : um_path . 'templates/email'; + $path = ! empty( $this->path_by_slug[ $template_name ] ) ? $this->path_by_slug[ $template_name ] : UM_PATH . 'templates/email'; $template_path = trailingslashit( $path ) . $template_name . '.php'; break; } /** - * Filters an expected path for email template in theme or plugin. - * - * @since 2.6.1 - * @hook um_email_get_template_file_path + * Filters expected path for email template in theme or plugin. * * @param {string} $template_path Expected template path. * @param {string} $location Where to search 'theme||plugin'. * @param {string} $template_name_file Expected filename. * - * @return {string} Expected template path. + * @return {string} Email template path. + * + * @since 2.6.1 + * @hook um_email_get_template_file_path + * + * @example Change expected path for email template in theme or plugin. + * function my_email_get_template_file_path( $template_path, $location, $template_name_file ) { + * // your code here + * return $template_path; + * } + * add_filter( 'um_email_get_template_file_path', 'my_email_get_template_file_path' ); */ return apply_filters( 'um_email_get_template_file_path', $template_path, $location, $template_name_file ); } /** - * Copy template to the theme + * Copy template to the theme. * * @param string $template * @return bool @@ -606,15 +603,15 @@ if ( ! class_exists( 'um\core\Mail' ) ) { if ( file_exists( $plugin_template_path ) && copy( $plugin_template_path, $theme_template_path ) ) { return true; - } else { - return false; } + + return false; } /** - * UM Placeholders for site url, admin email, submit registration + * UM Placeholders for site url, admin email, submit registration. * - * @param $placeholders + * @param array $placeholders * * @return array */ @@ -630,9 +627,9 @@ if ( ! class_exists( 'um\core\Mail' ) ) { } /** - * UM Replace Placeholders for site url, admin email, submit registration + * UM Replace Placeholders for site url, admin email, submit registration. * - * @param $replace_placeholders + * @param array $replace_placeholders * * @return array */ diff --git a/includes/core/class-member-directory-meta.php b/includes/core/class-member-directory-meta.php index 75378531..7de32645 100644 --- a/includes/core/class-member-directory-meta.php +++ b/includes/core/class-member-directory-meta.php @@ -587,24 +587,25 @@ if ( ! class_exists( 'um\core\Member_Directory_Meta' ) ) { } if ( ! empty( $_POST['search'] ) ) { - $search_line = trim( stripslashes( sanitize_text_field( $_POST['search'] ) ) ); + $search_line = $this->prepare_search( $_POST['search'] ); + if ( ! empty( $search_line ) ) { + $searches = array(); + foreach ( $this->core_search_fields as $field ) { + $searches[] = $wpdb->prepare( "u.{$field} LIKE %s", '%' . $search_line . '%' ); + } - $searches = array(); - foreach ( $this->core_search_fields as $field ) { - $searches[] = $wpdb->prepare( "u.{$field} LIKE %s", '%' . $search_line . '%' ); + $core_search = implode( ' OR ', $searches ); + + $this->joins[] = "LEFT JOIN {$wpdb->prefix}um_metadata umm_search ON umm_search.user_id = u.ID"; + + $additional_search = apply_filters( 'um_member_directory_meta_general_search_meta_query', '',$search_line ); + + $search_like_string = apply_filters( 'um_member_directory_meta_search_like_type', '%' . $search_line . '%', $search_line ); + + $this->where_clauses[] = $wpdb->prepare( "( umm_search.um_value = %s OR umm_search.um_value LIKE %s OR umm_search.um_value LIKE %s OR {$core_search}{$additional_search})", $search_line, $search_like_string, '%' . serialize( (string) $search_line ) . '%' ); + + $this->is_search = true; } - - $core_search = implode( ' OR ', $searches ); - - $this->joins[] = "LEFT JOIN {$wpdb->prefix}um_metadata umm_search ON umm_search.user_id = u.ID"; - - $additional_search = apply_filters( 'um_member_directory_meta_general_search_meta_query', '', stripslashes( sanitize_text_field( $_POST['search'] ) ) ); - - $search_like_string = apply_filters( 'um_member_directory_meta_search_like_type', '%' . $search_line . '%', $search_line ); - - $this->where_clauses[] = $wpdb->prepare( "( umm_search.um_value = %s OR umm_search.um_value LIKE %s OR umm_search.um_value LIKE %s OR {$core_search}{$additional_search})", $search_line, $search_like_string, '%' . serialize( (string) $search_line ) . '%' ); - - $this->is_search = true; } //filters diff --git a/includes/core/class-member-directory.php b/includes/core/class-member-directory.php index dc37cee8..3ceeb1e3 100644 --- a/includes/core/class-member-directory.php +++ b/includes/core/class-member-directory.php @@ -1614,43 +1614,72 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) { return $query; } + /** + * Prepare the search line. Avoid the using mySQL statement. + * + * @param string $search + * + * @return string + */ + protected function prepare_search( $search ) { + // unslash, sanitize, trim - necessary prepare. + $search = trim( sanitize_text_field( wp_unslash( $search ) ) ); + if ( empty( $search ) ) { + return ''; + } + // Make the search line empty if it contains the mySQL query statements. + $regexp_map = array( + '/select(.*?)from/im', + '/update(.*?)set/im', + '/delete(.*?)from/im', + ); + + foreach ( $regexp_map as $regexp ) { + preg_match( $regexp, $search, $matches ); + if ( ! empty( $matches ) ) { + $search = ''; + break; + } + } + + return $search; + } /** * Handle general search line request */ - function general_search() { + public function general_search() { //general search if ( ! empty( $_POST['search'] ) ) { // complex using with change_meta_sql function + $search = $this->prepare_search( $_POST['search'] ); + if ( ! empty( $search ) ) { + $meta_query = array( + 'relation' => 'OR', + array( + 'value' => $search, + 'compare' => '=', + ), + array( + 'value' => $search, + 'compare' => 'LIKE', + ), + array( + 'value' => serialize( (string) $search ), + 'compare' => 'LIKE', + ), + ); - $search = trim( sanitize_text_field( wp_unslash( $_POST['search'] ) ) ); + $meta_query = apply_filters( 'um_member_directory_general_search_meta_query', $meta_query, $search ); - $meta_query = array( - 'relation' => 'OR', - array( - 'value' => $search, - 'compare' => '=', - ), - array( - 'value' => $search, - 'compare' => 'LIKE', - ), - array( - 'value' => serialize( (string) $search ), - 'compare' => 'LIKE', - ), - ); + $this->query_args['meta_query'][] = $meta_query; - $meta_query = apply_filters( 'um_member_directory_general_search_meta_query', $meta_query, $search ); - - $this->query_args['meta_query'][] = $meta_query; - - $this->is_search = true; + $this->is_search = true; + } } } - /** * Change mySQL meta query join attribute * for search only by UM user meta fields and WP core fields in WP Users table @@ -1662,17 +1691,16 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) { * @param $primary_id_column * @param \WP_User_Query $context * - * @return mixed + * @return array */ - function change_meta_sql( $sql, $queries, $type, $primary_table, $primary_id_column, $context ) { + public function change_meta_sql( $sql, $queries, $type, $primary_table, $primary_id_column, $context ) { if ( ! empty( $_POST['search'] ) ) { - global $wpdb; - - $search = trim( sanitize_text_field( wp_unslash( $_POST['search'] ) ) ); + $search = $this->prepare_search( $_POST['search'] ); if ( ! empty( $search ) ) { + global $wpdb; - $meta_value = '%' . $wpdb->esc_like( $search ) . '%'; - $search_meta = $wpdb->prepare( '%s', $meta_value ); + $meta_value = '%' . $wpdb->esc_like( $search ) . '%'; + $search_meta = $wpdb->prepare( '%s', $meta_value ); preg_match( '~(?<=\{)(.*?)(?=\})~', $search_meta, $matches, PREG_OFFSET_CAPTURE, 0 ); @@ -1740,7 +1768,6 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) { return $sql; } - /** * Handle filters request */ diff --git a/includes/core/class-modal.php b/includes/core/class-modal.php index 8a0df650..19c76e33 100644 --- a/includes/core/class-modal.php +++ b/includes/core/class-modal.php @@ -39,7 +39,7 @@ if ( ! class_exists( 'um\core\Modal' ) ) { function load_modal_content() { if ( ! is_admin() ) { - $modal_templates = glob( um_path . 'templates/modal/*.php' ); + $modal_templates = glob( UM_PATH . 'templates/modal/*.php' ); if ( ! empty( $modal_templates ) ) { foreach ( $modal_templates as $modal_content ) { @@ -51,4 +51,4 @@ if ( ! class_exists( 'um\core\Modal' ) ) { } } -} \ No newline at end of file +} diff --git a/includes/core/class-permalinks.php b/includes/core/class-permalinks.php index 0bbb47bf..6fef7102 100644 --- a/includes/core/class-permalinks.php +++ b/includes/core/class-permalinks.php @@ -249,26 +249,42 @@ if ( ! class_exists( 'um\core\Permalinks' ) ) { } /** - * @param $slug + * @param string $slug * - * @return int|null|string + * @return int|bool */ public function slug_exists_user_id( $slug ) { global $wpdb; $permalink_base = UM()->options()->get( 'permalink_base' ); + if ( 'custom_meta' === $permalink_base ) { + $custom_meta = UM()->options()->get( 'permalink_base_custom_meta' ); + if ( empty( $custom_meta ) ) { + // Set default permalink base if custom meta is empty. + $permalink_base = 'user_login'; + $meta_key = 'um_user_profile_url_slug_' . $permalink_base; + } else { + $meta_key = $custom_meta; + } + } else { + $meta_key = 'um_user_profile_url_slug_' . $permalink_base; + } $user_id = $wpdb->get_var( - "SELECT user_id - FROM {$wpdb->usermeta} - WHERE meta_key = 'um_user_profile_url_slug_{$permalink_base}' AND - meta_value = '{$slug}' - ORDER BY umeta_id ASC - LIMIT 1" + $wpdb->prepare( + "SELECT user_id + FROM {$wpdb->usermeta} + WHERE meta_key = %s AND + meta_value = %s + ORDER BY umeta_id ASC + LIMIT 1", + $meta_key, + $slug + ) ); if ( ! empty( $user_id ) ) { - return $user_id; + return absint( $user_id ); } return false; @@ -374,9 +390,7 @@ if ( ! class_exists( 'um\core\Permalinks' ) ) { $user_in_url = ''; - $full_name = str_replace( "'", "", $full_name ); - $full_name = str_replace( "&", "", $full_name ); - $full_name = str_replace( "/", "", $full_name ); + $full_name = str_replace( array( "'", '&', '/' ), '', $full_name ); switch ( $permalink_base ) { case 'name': // dotted diff --git a/includes/core/class-rewrite.php b/includes/core/class-rewrite.php index 3cca8331..5f68e751 100644 --- a/includes/core/class-rewrite.php +++ b/includes/core/class-rewrite.php @@ -1,65 +1,59 @@ config()->permalinks['user'] ) ) { $user_page_id = UM()->config()->permalinks['user']; - $user = get_post( $user_page_id ); + $user = get_post( $user_page_id ); if ( isset( $user->post_name ) ) { - - $user_slug = $user->post_name; + $user_slug = $user->post_name; $newrules[ $user_slug . '/([^/]+)/?$' ] = 'index.php?page_id=' . $user_page_id . '&um_user=$matches[1]'; } @@ -104,12 +96,11 @@ if ( ! class_exists( 'um\core\Rewrite' ) ) { $active_languages = $sitepress->get_active_languages(); foreach ( $active_languages as $language_code => $language ) { - - $lang_post_id = wpml_object_id_filter( $user_page_id, 'post', false, $language_code ); + $lang_post_id = wpml_object_id_filter( $user_page_id, 'post', false, $language_code ); $lang_post_obj = get_post( $lang_post_id ); - if ( isset( $lang_post_obj->post_name ) && $lang_post_obj->post_name != $user->post_name ) { - $user_slug = $lang_post_obj->post_name; + if ( isset( $lang_post_obj->post_name ) && $lang_post_obj->post_name !== $user->post_name ) { + $user_slug = $lang_post_obj->post_name; $newrules[ $user_slug . '/([^/]+)/?$' ] = 'index.php?page_id=' . $lang_post_id . '&um_user=$matches[1]&lang=' . $language_code; } } @@ -117,13 +108,11 @@ if ( ! class_exists( 'um\core\Rewrite' ) ) { } if ( isset( UM()->config()->permalinks['account'] ) ) { - $account_page_id = UM()->config()->permalinks['account']; - $account = get_post( $account_page_id ); + $account = get_post( $account_page_id ); if ( isset( $account->post_name ) ) { - - $account_slug = $account->post_name; + $account_slug = $account->post_name; $newrules[ $account_slug . '/([^/]+)?$' ] = 'index.php?page_id=' . $account_page_id . '&um_tab=$matches[1]'; } @@ -133,12 +122,11 @@ if ( ! class_exists( 'um\core\Rewrite' ) ) { $active_languages = $sitepress->get_active_languages(); foreach ( $active_languages as $language_code => $language ) { - - $lang_post_id = wpml_object_id_filter( $account_page_id, 'post', false, $language_code ); + $lang_post_id = wpml_object_id_filter( $account_page_id, 'post', false, $language_code ); $lang_post_obj = get_post( $lang_post_id ); - if ( isset( $lang_post_obj->post_name ) && $lang_post_obj->post_name != $account->post_name ) { - $account_slug = $lang_post_obj->post_name; + if ( isset( $lang_post_obj->post_name ) && $lang_post_obj->post_name !== $account->post_name ) { + $account_slug = $lang_post_obj->post_name; $newrules[ $account_slug . '/([^/]+)/?$' ] = 'index.php?page_id=' . $lang_post_id . '&um_user=$matches[1]&lang=' . $language_code; } } @@ -148,119 +136,141 @@ if ( ! class_exists( 'um\core\Rewrite' ) ) { return $newrules + $rules; } - /** - * Author page to user profile redirect + * Author page to user profile redirect. */ - function redirect_author_page() { - if ( UM()->options()->get( 'author_redirect' ) && is_author() ) { + public function redirect_author_page() { + if ( is_author() && UM()->options()->get( 'author_redirect' ) ) { $id = get_query_var( 'author' ); um_fetch_user( $id ); - exit( wp_redirect( um_user_profile_url() ) ); + wp_safe_redirect( um_user_profile_url() ); + exit; } } - /** - * Locate/display a profile + * Getting the user_id based on the User Profile slug like when Base Permalink setting equals 'user_login'. + * + * @since 2.6.12 + * + * @return bool|int|mixed */ - function locate_user_profile() { - if ( um_queried_user() && um_is_core_page( 'user' ) ) { + private function get_user_id_by_user_login_slug() { + $permalink_base = UM()->options()->get( 'permalink_base' ); + if ( 'custom_meta' === $permalink_base ) { + $custom_meta = UM()->options()->get( 'permalink_base_custom_meta' ); + if ( empty( $custom_meta ) ) { + // Set default permalink base if custom meta is empty. + $permalink_base = 'user_login'; + } + } - if ( UM()->options()->get( 'permalink_base' ) == 'user_login' ) { + $user_id = username_exists( um_queried_user() ); + //Try + if ( ! $user_id ) { + // Search by Profile Slug + $args = array( + 'fields' => 'ids', + 'meta_query' => array( + array( + 'key' => 'um_user_profile_url_slug_' . $permalink_base, + 'value' => strtolower( um_queried_user() ), + 'compare' => '=', + ), + ), + 'number' => 1, + ); - $user_id = username_exists( um_queried_user() ); - - //Try - if ( ! $user_id ) { - $permalink_base = UM()->options()->get( 'permalink_base' ); - - // Search by Profile Slug - $args = array( - "fields" => 'ids', - 'meta_query' => array( - array( - 'key' => 'um_user_profile_url_slug_' . $permalink_base, - 'value' => strtolower( um_queried_user() ), - 'compare' => '=' - ) - ), - 'number' => 1 - ); - - - $ids = new \WP_User_Query( $args ); - if ( $ids->total_users > 0 ) { - $user_id = current( $ids->get_results() ); - } - } - - // Try nice name - if ( ! $user_id ) { - $slug = um_queried_user(); - $slug = str_replace( '.', '-', $slug ); - $the_user = get_user_by( 'slug', $slug ); - if ( isset( $the_user->ID ) ){ - $user_id = $the_user->ID; - } - - if ( ! $user_id ) { - $user_id = UM()->user()->user_exists_by_email_as_username( um_queried_user() ); - } - - if ( ! $user_id ) { - $user_id = UM()->user()->user_exists_by_email_as_username( $slug ); - } - - } + $ids = new \WP_User_Query( $args ); + if ( $ids->total_users > 0 ) { + $user_id = current( $ids->get_results() ); + } + } + // Try nice name + if ( ! $user_id ) { + $slug = um_queried_user(); + $slug = str_replace( '.', '-', $slug ); + $the_user = get_user_by( 'slug', $slug ); + if ( isset( $the_user->ID ) ) { + $user_id = $the_user->ID; } - if ( UM()->options()->get( 'permalink_base' ) == 'user_id' ) { + if ( ! $user_id ) { + $user_id = UM()->user()->user_exists_by_email_as_username( um_queried_user() ); + } + + if ( ! $user_id ) { + $user_id = UM()->user()->user_exists_by_email_as_username( $slug ); + } + } + + return $user_id; + } + + /** + * Locate/display a profile. + */ + public function locate_user_profile() { + $permalink_base = UM()->options()->get( 'permalink_base' ); + if ( 'custom_meta' === $permalink_base ) { + $custom_meta = UM()->options()->get( 'permalink_base_custom_meta' ); + if ( empty( $custom_meta ) ) { + // Set default permalink base if custom meta is empty. + $permalink_base = 'user_login'; + } + } + + if ( um_queried_user() && um_is_core_page( 'user' ) ) { + if ( 'user_login' === $permalink_base ) { + $user_id = $this->get_user_id_by_user_login_slug(); + } + + if ( 'user_id' === $permalink_base ) { $user_id = UM()->user()->user_exists_by_id( um_queried_user() ); } - if ( in_array( UM()->options()->get( 'permalink_base' ), array( 'name', 'name_dash', 'name_dot', 'name_plus' ) ) ) { + if ( 'hash' === $permalink_base ) { + $user_id = UM()->user()->user_exists_by_hash( um_queried_user() ); + } + + if ( 'custom_meta' === $permalink_base ) { + $user_id = UM()->user()->user_exists_by_custom_meta( um_queried_user() ); + if ( ! $user_id ) { + // Try user_login by default. + $user_id = $this->get_user_id_by_user_login_slug(); + } + } + + if ( in_array( $permalink_base, array( 'name', 'name_dash', 'name_dot', 'name_plus' ), true ) ) { $user_id = UM()->user()->user_exists_by_name( um_queried_user() ); } /** USER EXISTS SET USER AND CONTINUE **/ - if ( $user_id ) { - + if ( ! empty( $user_id ) ) { um_set_requested_user( $user_id ); - /** - * UM hook + * Fires after setting requested user. * - * @type action - * @title um_access_profile - * @description Action on user access profile - * @input_vars - * [{"var":"$user_id","type":"int","desc":"User ID"}] - * @change_log - * ["Since: 2.0"] - * @usage add_action( 'um_access_profile', 'function_name', 10, 1 ); - * @example - * Some action on user access profile and requested user isset. * add_action( 'um_access_profile', 'my_access_profile', 10, 1 ); * function my_access_profile( $user_id ) { * // your code here * } - * ?> */ do_action( 'um_access_profile', $user_id ); - } else { - - exit( wp_redirect( um_get_core_page( 'user' ) ) ); - + wp_safe_redirect( um_get_core_page( 'user' ) ); + exit; } - } elseif ( um_is_core_page( 'user' ) ) { - if ( is_user_logged_in() ) { // just redirect to their profile - $query = UM()->permalinks()->get_query_array(); $url = um_user_profile_url( um_user( 'ID' ) ); @@ -270,41 +280,33 @@ if ( ! class_exists( 'um\core\Rewrite' ) ) { $url = add_query_arg( $key, $val, $url ); } } - - exit( wp_redirect( $url ) ); - } else { - - /** - * UM hook - * - * @type filter - * @title um_locate_user_profile_not_loggedin__redirect - * @description Change redirect URL from user profile for not logged in user - * @input_vars - * [{"var":"$url","type":"string","desc":"Redirect URL"}] - * @change_log - * ["Since: 2.0"] - * @usage - * - * @example - * - */ - $redirect_to = apply_filters( 'um_locate_user_profile_not_loggedin__redirect', home_url() ); - if ( ! empty( $redirect_to ) ) { - exit( wp_redirect( $redirect_to ) ); - } - + wp_safe_redirect( $url ); + exit; } + /** + * Filters the redirect URL from user profile for not logged-in user. + * + * @param {string} $url Redirect URL. By default, it's a home page. + * + * @return {string} Redirect URL. + * + * @since 1.3.x + * @hook um_locate_user_profile_not_loggedin__redirect + * + * @example Change redirect URL from user profile for not logged-in user to WordPress native login. + * function my_user_profile_not_loggedin__redirect( $url ) { + * // your code here + * $url = wp_login_url(); + * return $url; + * } + * add_filter( 'um_locate_user_profile_not_loggedin__redirect', 'my_user_profile_not_loggedin__redirect' ); + */ + $redirect_to = apply_filters( 'um_locate_user_profile_not_loggedin__redirect', home_url() ); + if ( ! empty( $redirect_to ) ) { + um_safe_redirect( $redirect_to ); + } } - } - } -} \ No newline at end of file +} diff --git a/includes/core/class-shortcodes.php b/includes/core/class-shortcodes.php index 063a09ee..b9b50c22 100644 --- a/includes/core/class-shortcodes.php +++ b/includes/core/class-shortcodes.php @@ -328,7 +328,7 @@ if ( ! class_exists( 'um\core\Shortcodes' ) ) { // Avoid Directory Traversal vulnerability by the checking the realpath. // Templates can be situated only in the get_stylesheet_directory() or plugindir templates. $real_file = wp_normalize_path( realpath( $file ) ); - if ( 0 === strpos( $real_file, wp_normalize_path( um_path . "templates" . DIRECTORY_SEPARATOR ) ) || 0 === strpos( $real_file, wp_normalize_path( get_stylesheet_directory() . DIRECTORY_SEPARATOR . 'ultimate-member' . DIRECTORY_SEPARATOR . 'templates' . DIRECTORY_SEPARATOR ) ) ) { + if ( 0 === strpos( $real_file, wp_normalize_path( UM_PATH . "templates" . DIRECTORY_SEPARATOR ) ) || 0 === strpos( $real_file, wp_normalize_path( get_stylesheet_directory() . DIRECTORY_SEPARATOR . 'ultimate-member' . DIRECTORY_SEPARATOR . 'templates' . DIRECTORY_SEPARATOR ) ) ) { include $file; } } @@ -1003,7 +1003,7 @@ if ( ! class_exists( 'um\core\Shortcodes' ) ) { */ function template_exists($template) { - $file = um_path . 'templates/' . $template . '.php'; + $file = UM_PATH . 'templates/' . $template . '.php'; $theme_file = get_stylesheet_directory() . '/ultimate-member/templates/' . $template . '.php'; if (file_exists($theme_file) || file_exists($file)) { @@ -1041,7 +1041,7 @@ if ( ! class_exists( 'um\core\Shortcodes' ) ) { $array[ $excluded ] = __( 'Default Template', 'ultimate-member' ); } - $paths[] = glob( um_path . 'templates/' . '*.php' ); + $paths[] = glob( UM_PATH . 'templates/' . '*.php' ); if ( file_exists( get_stylesheet_directory() . '/ultimate-member/templates/' ) ) { $paths[] = glob( get_stylesheet_directory() . '/ultimate-member/templates/' . '*.php' ); diff --git a/includes/core/class-templates.php b/includes/core/class-templates.php index b92c3510..f4d6e8e7 100644 --- a/includes/core/class-templates.php +++ b/includes/core/class-templates.php @@ -28,7 +28,7 @@ if ( ! class_exists( 'Templates' ) ) { * @return string */ function get_template( $slug ) { - $file_list = um_path . "templates/{$slug}.php"; + $file_list = UM_PATH . "templates/{$slug}.php"; $theme_file = get_stylesheet_directory() . "/ultimate-member/templates/{$slug}.php"; if ( file_exists( $theme_file ) ) { @@ -38,4 +38,4 @@ if ( ! class_exists( 'Templates' ) ) { return $file_list; } } -} \ No newline at end of file +} diff --git a/includes/core/class-uploader.php b/includes/core/class-uploader.php index 892ff986..0706002e 100644 --- a/includes/core/class-uploader.php +++ b/includes/core/class-uploader.php @@ -1280,7 +1280,7 @@ if ( ! class_exists( 'um\core\Uploader' ) ) { //move temporary file from temp directory to the correct user directory $temp_file_path = UM()->uploader()->get_core_temp_dir() . DIRECTORY_SEPARATOR . $filename; if ( file_exists( $temp_file_path ) ) { - $extra_hash = hash( 'crc32b', current_time('timestamp') ); + $extra_hash = hash( 'crc32b', current_time( 'timestamp' ) ); if ( strpos( $filename , 'stream_photo_' ) !== false ) { $new_filename = str_replace("stream_photo_","stream_photo_{$extra_hash}_", $filename ); diff --git a/includes/core/class-user.php b/includes/core/class-user.php index 21276e42..4935e463 100644 --- a/includes/core/class-user.php +++ b/includes/core/class-user.php @@ -440,11 +440,11 @@ if ( ! class_exists( 'um\core\User' ) ) { $md_data = get_user_meta( $object_id, 'um_member_directory_data', true ); if ( empty( $md_data ) ) { $md_data = array( - 'account_status' => 'approved', - 'hide_in_members' => UM()->member_directory()->get_hide_in_members_default(), - 'profile_photo' => false, - 'cover_photo' => false, - 'verified' => false, + 'account_status' => 'approved', + 'hide_in_members' => UM()->member_directory()->get_hide_in_members_default(), + 'profile_photo' => false, + 'cover_photo' => false, + 'verified' => false, ); } @@ -457,7 +457,7 @@ if ( ! class_exists( 'um\core\User' ) ) { break; case 'synced_gravatar_hashed_id': if ( UM()->options()->get( 'use_gravatars' ) ) { - $profile_photo = get_user_meta( $object_id, 'profile_photo', true ); + $profile_photo = get_user_meta( $object_id, 'profile_photo', true ); $synced_profile_photo = get_user_meta( $object_id, 'synced_profile_photo', true ); $md_data['profile_photo'] = ! empty( $profile_photo ) || ! empty( $synced_profile_photo ); @@ -514,11 +514,11 @@ if ( ! class_exists( 'um\core\User' ) ) { $md_data = get_user_meta( $object_id, 'um_member_directory_data', true ); if ( empty( $md_data ) ) { $md_data = array( - 'account_status' => 'approved', - 'hide_in_members' => UM()->member_directory()->get_hide_in_members_default(), - 'profile_photo' => false, - 'cover_photo' => false, - 'verified' => false, + 'account_status' => 'approved', + 'hide_in_members' => UM()->member_directory()->get_hide_in_members_default(), + 'profile_photo' => false, + 'cover_photo' => false, + 'verified' => false, ); } @@ -527,7 +527,6 @@ if ( ! class_exists( 'um\core\User' ) ) { $md_data['account_status'] = $_meta_value; break; case 'hide_in_members': - $hide_in_members = UM()->member_directory()->get_hide_in_members_default(); if ( ! empty( $_meta_value ) ) { if ( $_meta_value == 'Yes' || $_meta_value == __( 'Yes', 'ultimate-member' ) || @@ -570,7 +569,7 @@ if ( ! class_exists( 'um\core\User' ) ) { /** * @param $user_id */ - function delete_user_handler( $user_id ) { + public function delete_user_handler( $user_id ) { um_fetch_user( $user_id ); $this->deleted_user_id = $user_id; @@ -614,6 +613,16 @@ if ( ! class_exists( 'um\core\User' ) ) { */ do_action( 'um_delete_user', um_user( 'ID' ) ); + // remove user's comments + if ( UM()->options()->get( 'delete_comments' ) ) { + $user = get_user_by( 'id', um_user( 'ID' ) ); + + $comments = array_merge( get_comments( 'author_email=' . $user->user_email ), get_comments( 'user_id=' . um_user( 'ID' ) ) ); + foreach ( $comments as $comment ) { + wp_delete_comment( $comment->comment_ID, true ); + } + } + // send email notifications if ( $this->send_mail_on_delete ) { UM()->mail()->send( um_user( 'user_email' ), 'deletion_email' ); @@ -700,18 +709,35 @@ if ( ! class_exists( 'um\core\User' ) ) { /** - * @param $user_id + * @param int $user_id + * @param bool $raw * * @return bool|mixed */ - function get_profile_slug( $user_id ) { + public function get_profile_slug( $user_id, $raw = false ) { // Permalink base $permalink_base = UM()->options()->get( 'permalink_base' ); - $profile_slug = get_user_meta( $user_id, "um_user_profile_url_slug_{$permalink_base}", true ); + if ( 'custom_meta' === $permalink_base ) { + $custom_meta = UM()->options()->get( 'permalink_base_custom_meta' ); + if ( empty( $custom_meta ) ) { + // Set default permalink base if custom meta is empty. + $permalink_base = 'user_login'; + $meta_key = 'um_user_profile_url_slug_' . $permalink_base; + } else { + $meta_key = $custom_meta; + } + } else { + $meta_key = 'um_user_profile_url_slug_' . $permalink_base; + } + $profile_slug = get_user_meta( $user_id, $meta_key, true ); + + if ( $raw ) { + return $profile_slug; + } //get default username permalink if it's empty then return false if ( empty( $profile_slug ) ) { - if ( $permalink_base != 'user_login' ) { + if ( 'user_login' !== $permalink_base ) { $profile_slug = get_user_meta( $user_id, 'um_user_profile_url_slug_user_login', true ); } @@ -723,7 +749,6 @@ if ( ! class_exists( 'um\core\User' ) ) { return $profile_slug; } - /** * @param $user_id * @@ -739,6 +764,20 @@ if ( ! class_exists( 'um\core\User' ) ) { return UM()->permalinks()->profile_permalink( $profile_slug ); } + public function generate_user_hash( $user_id ) { + $user_id = absint( $user_id ); + $append = 0; + + while ( 1 ) { + $user_in_url = '~' . substr( strrev( md5( uniqid( 'um_user_hash' . $append, true ) . $user_id ) ), 0, 18 ); + $slug_exists_user_id = UM()->permalinks()->slug_exists_user_id( $user_in_url ); + if ( empty( $slug_exists_user_id ) || $user_id === $slug_exists_user_id ) { + break; + } + $append++; + } + return $user_in_url; + } /** * Generate User Profile Slug and save to meta @@ -746,7 +785,7 @@ if ( ! class_exists( 'um\core\User' ) ) { * @param int $user_id * @param bool $force */ - function generate_profile_slug( $user_id, $force = false ) { + public function generate_profile_slug( $user_id, $force = false ) { $userdata = get_userdata( $user_id ); if ( empty( $userdata ) ) { @@ -755,18 +794,78 @@ if ( ! class_exists( 'um\core\User' ) ) { delete_option( "um_cache_userdata_{$user_id}" ); - $current_profile_slug = $this->get_profile_slug( $user_id ); + $current_profile_slug = $this->get_profile_slug( $user_id, true ); - $user_in_url = ''; + $user_in_url = ''; $permalink_base = UM()->options()->get( 'permalink_base' ); // User ID - if ( $permalink_base == 'user_id' ) { + if ( 'user_id' === $permalink_base ) { $user_in_url = $user_id; } + if ( 'hash' === $permalink_base ) { + if ( empty( $current_profile_slug ) ) { + $user_in_url = $this->generate_user_hash( $user_id ); + } else { + $user_in_url = $current_profile_slug; + } + } + + if ( 'custom_meta' === $permalink_base ) { + $custom_meta = UM()->options()->get( 'permalink_base_custom_meta' ); + if ( empty( $custom_meta ) ) { + // Set default permalink base if custom meta is empty. + $permalink_base = 'user_login'; + } else { + $user_in_url = rawurlencode( get_user_meta( $user_id, $custom_meta, true ) ); + /** + * Filters the user profile slug when custom meta is set. + * + * @param {string} $slug User profile slug. + * @param {int} $user_id User ID. + * @param {string} $metakey Meta key. + * + * @return {string} User profile slug. + * + * @since 2.6.12 + * @hook um_custom_meta_permalink_base_generate_user_slug + * + * @example Use base64encode value as user slug. + * function my_custom_meta_permalink_base_generate_user_slug( $slug, $user_id, $metakey ) { + * // your code here + * $slug = base64encode( $user_id ); + * update_user_meta( $user_id, $metakey, $slug ); + * $slug = rawurlencode( $slug ); + * return $slug; + * } + * add_filter( 'um_custom_meta_permalink_base_generate_user_slug', 'my_custom_meta_permalink_base_generate_user_slug', 10, 3 ); + */ + $user_in_url = apply_filters( 'um_custom_meta_permalink_base_generate_user_slug', $user_in_url, $user_id, $custom_meta ); + + if ( empty( $user_in_url ) ) { + $user_in_url = $userdata->user_login; + if ( is_email( $user_in_url ) ) { + + $user_email = $user_in_url; + $user_in_url = str_replace( '@', '', $user_in_url ); + + if ( ( $pos = strrpos( $user_in_url, '.' ) ) !== false ) { + $search_length = strlen( '.' ); + $user_in_url = substr_replace( $user_in_url, '-', $pos, $search_length ); + } + update_user_meta( $user_id, "um_email_as_username_{$user_in_url}", $user_email ); + + } else { + $user_in_url = urlencode( $user_in_url ); + } + update_user_meta( $user_id, "um_user_profile_url_slug_user_login", $user_in_url ); + } + } + } + // Username - if ( $permalink_base == 'user_login' ) { + if ( 'user_login' === $permalink_base ) { $user_in_url = $userdata->user_login; @@ -782,29 +881,31 @@ if ( ! class_exists( 'um\core\User' ) ) { update_user_meta( $user_id, "um_email_as_username_{$user_in_url}", $user_email ); } else { - $user_in_url = urlencode( $user_in_url ); - } } // Fisrt and Last name $full_name_permalinks = array( 'name', 'name_dash', 'name_plus' ); - if ( in_array( $permalink_base, $full_name_permalinks ) ) { - $separated = array( 'name' => '.', 'name_dash' => '-', 'name_plus' => '+' ); - $separate = $separated[ $permalink_base ]; - $first_name = $userdata->first_name; - $last_name = $userdata->last_name; - $full_name = trim( sprintf( '%s %s', $first_name, $last_name ) ); - $full_name = preg_replace( '/\s+/', ' ', $full_name ); // Remove double spaces + if ( in_array( $permalink_base, $full_name_permalinks, true ) ) { + $separated = array( + 'name' => '.', + 'name_dash' => '-', + 'name_plus' => '+', + ); + $separate = $separated[ $permalink_base ]; + $first_name = $userdata->first_name; + $last_name = $userdata->last_name; + $full_name = trim( sprintf( '%s %s', $first_name, $last_name ) ); + $full_name = preg_replace( '/\s+/', ' ', $full_name ); // Remove double spaces $profile_slug = UM()->permalinks()->profile_slug( $full_name, $first_name, $last_name ); - $append = 0; - $username = $full_name; - $_username = $full_name; + $append = 0; + $username = $full_name; + $_username = $full_name; while ( 1 ) { - $username = $_username . ( empty( $append ) ? '' : " $append" ); + $username = $_username . ( empty( $append ) ? '' : " $append" ); $slug_exists_user_id = UM()->permalinks()->slug_exists_user_id( $profile_slug . ( empty( $append ) ? '' : "{$separate}{$append}" ) ); if ( empty( $slug_exists_user_id ) || $user_id == $slug_exists_user_id ) { break; @@ -828,9 +929,7 @@ if ( ! class_exists( 'um\core\User' ) ) { update_user_meta( $user_id, "um_email_as_username_{$user_in_url}", $user_email ); } else { - $user_in_url = sanitize_title( $user_in_url ); - } } @@ -839,12 +938,11 @@ if ( ! class_exists( 'um\core\User' ) ) { $user_in_url = apply_filters( 'um_change_user_profile_slug', $user_in_url, $user_id ); - if ( $force || empty( $current_profile_slug ) || $current_profile_slug != $user_in_url ) { + if ( $force || empty( $current_profile_slug ) || $current_profile_slug !== $user_in_url ) { update_user_meta( $user_id, "um_user_profile_url_slug_{$permalink_base}", $user_in_url ); } } - /** * Backend user creation * @@ -961,7 +1059,8 @@ if ( ! class_exists( 'um\core\User' ) ) { if ( $userdata !== 'add-new-user' && $userdata !== 'add-existing-user' ) { ?>

- roles ) && count( $userdata->roles ) == 1 ) { $style = 'style="display:none;"'; } - } $class = ( $userdata == 'add-existing-user' ) ? 'um_role_existing_selector_wrapper' : 'um_role_selector_wrapper'; - ob_start(); ?> + ob_start(); + ?> -
> +
>
- id = $user_id; + $this->id = $user_id; $this->usermeta = get_user_meta( $user_id ); - $this->data = get_userdata( $this->id ); + $this->data = get_userdata( $this->id ); } elseif ( is_user_logged_in() && $clean == false ) { - $this->id = get_current_user_id(); - $this->usermeta = get_user_meta($this->id); - $this->data = get_userdata($this->id); + $this->id = get_current_user_id(); + $this->usermeta = get_user_meta( $this->id ); + $this->data = get_userdata( $this->id ); } else { - $this->id = 0; + $this->id = 0; $this->usermeta = null; - $this->data = null; + $this->data = null; } @@ -1203,54 +1303,54 @@ if ( ! class_exists( 'um\core\User' ) ) { // add user data $this->data = $this->toArray( $this->data ); - foreach ( $this->data as $k=>$v ) { - if ( $k == 'roles') { - $this->profile['wp_roles'] = implode(',',$v); - } else if ( is_array( $v ) ) { - foreach($v as $k2 => $v2){ - $this->profile[$k2] = $v2; + foreach ( $this->data as $k => $v ) { + if ( $k == 'roles' ) { + $this->profile['wp_roles'] = implode( ',', $v ); + } elseif ( is_array( $v ) ) { + foreach ( $v as $k2 => $v2 ) { + $this->profile[ $k2 ] = $v2; } } else { - $this->profile[$k] = $v; + $this->profile[ $k ] = $v; } } // add account status - if ( !isset( $this->usermeta['account_status'][0] ) ) { + if ( ! isset( $this->usermeta['account_status'][0] ) ) { $this->usermeta['account_status'][0] = 'approved'; } if ( $this->usermeta['account_status'][0] == 'approved' ) { - $this->usermeta['account_status_name'][0] = __('Approved','ultimate-member'); + $this->usermeta['account_status_name'][0] = __( 'Approved', 'ultimate-member' ); } if ( $this->usermeta['account_status'][0] == 'awaiting_email_confirmation' ) { - $this->usermeta['account_status_name'][0] = __('Awaiting E-mail Confirmation','ultimate-member'); + $this->usermeta['account_status_name'][0] = __( 'Awaiting E-mail Confirmation', 'ultimate-member' ); } if ( $this->usermeta['account_status'][0] == 'awaiting_admin_review' ) { - $this->usermeta['account_status_name'][0] = __('Pending Review','ultimate-member'); + $this->usermeta['account_status_name'][0] = __( 'Pending Review', 'ultimate-member' ); } if ( $this->usermeta['account_status'][0] == 'rejected' ) { - $this->usermeta['account_status_name'][0] = __('Membership Rejected','ultimate-member'); + $this->usermeta['account_status_name'][0] = __( 'Membership Rejected', 'ultimate-member' ); } if ( $this->usermeta['account_status'][0] == 'inactive' ) { - $this->usermeta['account_status_name'][0] = __('Membership Inactive','ultimate-member'); + $this->usermeta['account_status_name'][0] = __( 'Membership Inactive', 'ultimate-member' ); } // add user meta foreach ( $this->usermeta as $k => $v ) { - if ( $k == 'display_name') { + if ( $k == 'display_name' ) { continue; } $this->profile[ $k ] = $v[0]; } // add permissions - $user_role = UM()->roles()->get_priority_user_role( $this->id ); - $this->profile['role'] = $user_role; + $user_role = UM()->roles()->get_priority_user_role( $this->id ); + $this->profile['role'] = $user_role; $this->profile['roles'] = UM()->roles()->get_all_user_roles( $this->id ); $role_meta = UM()->roles()->role_data( $user_role ); @@ -1285,7 +1385,7 @@ if ( ! class_exists( 'um\core\User' ) ) { return array( $key => $item ); }, array_keys( $role_meta ), $role_meta );*/ - $this->profile = array_merge( $this->profile, (array)$role_meta ); + $this->profile = array_merge( $this->profile, (array) $role_meta ); $this->profile['super_admin'] = ( is_super_admin( $this->id ) ) ? 1 : 0; @@ -1296,7 +1396,6 @@ if ( ! class_exists( 'um\core\User' ) ) { $this->setup_cache( $this->id, $this->profile ); } - } } @@ -1307,8 +1406,8 @@ if ( ! class_exists( 'um\core\User' ) ) { * * @param bool $clean */ - function reset( $clean = false ){ - $this->set(0, $clean); + function reset( $clean = false ) { + $this->set( 0, $clean ); } /** @@ -1454,7 +1553,6 @@ if ( ! class_exists( 'um\core\User' ) ) { update_user_meta( $this->id, '_um_last_login', current_time( 'timestamp' ) ); } - /** * Set user's account status * @@ -1645,7 +1743,7 @@ if ( ! class_exists( 'um\core\User' ) ) { * */ function approve( $repeat = true ) { - $user_id = um_user('ID'); + $user_id = um_user( 'ID' ); if ( ! $repeat ) { $status = get_user_meta( $user_id, 'account_status', true ); @@ -1828,7 +1926,7 @@ if ( ! class_exists( 'um\core\User' ) ) { if ( is_multisite() ) { if ( ! function_exists( 'wpmu_delete_user' ) ) { - require_once( ABSPATH . 'wp-admin/includes/ms.php' ); + require_once ABSPATH . 'wp-admin/includes/ms.php'; } wpmu_delete_user( $this->id ); @@ -1836,7 +1934,7 @@ if ( ! class_exists( 'um\core\User' ) ) { } else { if ( ! function_exists( 'wp_delete_user' ) ) { - require_once( ABSPATH . 'wp-admin/includes/user.php' ); + require_once ABSPATH . 'wp-admin/includes/user.php'; } wp_delete_user( $this->id ); @@ -1951,10 +2049,15 @@ if ( ! class_exists( 'um\core\User' ) ) { } foreach ( $actions as $id => $arr ) { - $url = add_query_arg( array( 'um_action' => $id, 'uid' => um_profile_id() ) ); + $url = add_query_arg( + array( + 'um_action' => $id, + 'uid' => um_profile_id(), + ) + ); /*$url = add_query_arg( 'um_action', $id ); $url = add_query_arg( 'uid', um_profile_id(), $url );*/ - $items[] = '' . esc_html( $arr['label'] ) . ''; + $items[] = '' . esc_html( $arr['label'] ) . ''; } return $items; } @@ -2202,19 +2305,25 @@ if ( ! class_exists( 'um\core\User' ) ) { $value = UM()->validation()->safe_name_in_url( $value ); - $ids = get_users( array( 'fields' => 'ID', 'meta_key' => $key, 'meta_value' => $value, 'meta_compare' => '=' ) ); + $ids = get_users( + array( + 'fields' => 'ID', + 'meta_key' => $key, + 'meta_value' => $value, + 'meta_compare' => '=', + ) + ); if ( ! isset( $ids ) || empty( $ids ) ) { return false; } foreach ( $ids as $k => $id ) { - if ( $id == um_user('ID') ) { + if ( $id == um_user( 'ID' ) ) { unset( $ids[ $k ] ); } else { $duplicates[] = $id; } - } if ( ! empty( $duplicates ) ) { @@ -2231,29 +2340,28 @@ if ( ! class_exists( 'um\core\User' ) ) { * * @return bool */ - function user_exists_by_name( $value ) { + public function user_exists_by_name( $value ) { // Permalink base $permalink_base = UM()->options()->get( 'permalink_base' ); $raw_value = $value; - $value = UM()->validation()->safe_name_in_url( $value ); - $value = um_clean_user_basename( $value ); + $value = UM()->validation()->safe_name_in_url( $value ); + $value = um_clean_user_basename( $value ); // Search by Profile Slug $args = array( - 'fields' => array( 'ID' ), + 'fields' => array( 'ID' ), 'meta_query' => array( 'relation' => 'OR', array( - 'key' => 'um_user_profile_url_slug_' . $permalink_base, - 'value' => strtolower( $raw_value ), - 'compare' => '=', + 'key' => 'um_user_profile_url_slug_' . $permalink_base, + 'value' => strtolower( $raw_value ), + 'compare' => '=', ), ), ); - $ids = new \WP_User_Query( $args ); if ( $ids->total_users > 0 ) { @@ -2263,9 +2371,9 @@ if ( ! class_exists( 'um\core\User' ) ) { // Search by Display Name or ID $args = array( - 'fields' => array( 'ID' ), - 'search' => $value, - 'search_columns' => array( 'display_name', 'ID' ), + 'fields' => array( 'ID' ), + 'search' => $value, + 'search_columns' => array( 'display_name', 'ID' ), ); $ids = new \WP_User_Query( $args ); @@ -2275,17 +2383,15 @@ if ( ! class_exists( 'um\core\User' ) ) { return $um_user_query->ID; } - // Search By User Login - $value = str_replace( ".", "_", $value ); - $value = str_replace( " ", "", $value ); + $value = str_replace( array( '.', ' ' ), array( '_', '' ), $value ); $args = array( - 'fields' => array( 'ID' ), - 'search' => $value, - 'search_columns' => array( + 'fields' => array( 'ID' ), + 'search' => $value, + 'search_columns' => array( 'user_login', - ) + ), ); $ids = new \WP_User_Query( $args ); @@ -2321,7 +2427,7 @@ if ( ! class_exists( 'um\core\User' ) ) { * */ - function user_exists_by_id( $user_id ) { + public function user_exists_by_id( $user_id ) { $aux = get_userdata( absint( $user_id ) ); if ( $aux == false ) { return false; @@ -2330,6 +2436,84 @@ if ( ! class_exists( 'um\core\User' ) ) { } } + /** + * @param string $hash + * + * @return bool|int + */ + public function user_exists_by_hash( $hash ) { + // Permalink base + $permalink_base = UM()->options()->get( 'permalink_base' ); + $raw_value = $hash; + + // Search by Profile Slug + $args = array( + 'fields' => array( 'ID' ), + 'meta_query' => array( + 'relation' => 'OR', + array( + 'key' => 'um_user_profile_url_slug_' . $permalink_base, + 'value' => strtolower( $raw_value ), + 'compare' => '=', + ), + ), + ); + + $ids = new \WP_User_Query( $args ); + + if ( $ids->total_users > 0 ) { + $um_user_query = current( $ids->get_results() ); + return $um_user_query->ID; + } + + return false; + } + + /** + * @param string $slug + * + * @return bool|int + */ + public function user_exists_by_custom_meta( $slug ) { + $permalink_base = UM()->options()->get( 'permalink_base' ); + $custom_meta = UM()->options()->get( 'permalink_base_custom_meta' ); + if ( empty( $custom_meta ) ) { + // Set default permalink base if custom meta is empty. + $permalink_base = 'user_login'; + $meta_key = 'um_user_profile_url_slug_' . $permalink_base; + } else { + $meta_key = $custom_meta; + } + + $raw_value = $slug; + + // Search by Profile Slug + $args = array( + 'fields' => array( 'ID' ), + 'meta_query' => array( + 'relation' => 'OR', + array( + 'key' => $meta_key, + 'value' => strtolower( $raw_value ), + 'compare' => '=', + ), + array( + 'key' => 'um_user_profile_url_slug_' . $permalink_base, + 'value' => strtolower( $raw_value ), + 'compare' => '=', + ), + ), + ); + + $ids = new \WP_User_Query( $args ); + + if ( $ids->total_users > 0 ) { + $um_user_query = current( $ids->get_results() ); + return $um_user_query->ID; + } + + return false; + } /** * This method checks if a user exists or not in your site based on the user email as username @@ -2355,7 +2539,12 @@ if ( ! class_exists( 'um\core\User' ) ) { $user_id = false; - $ids = get_users( array( 'fields' => 'ID', 'meta_key' => 'um_email_as_username_' . $slug ) ); + $ids = get_users( + array( + 'fields' => 'ID', + 'meta_key' => 'um_email_as_username_' . $slug, + ) + ); if ( ! empty( $ids[0] ) ) { $user_id = $ids[0]; } @@ -2373,11 +2562,11 @@ if ( ! class_exists( 'um\core\User' ) ) { function set_gravatar( $user_id ) { um_fetch_user( $user_id ); - $email_address = um_user( 'user_email' ); + $email_address = um_user( 'user_email' ); $hash_email_address = ''; if ( $email_address ) { - $hash_email_address = md5( $email_address ); + $hash_email_address = md5( $email_address ); $this->profile['synced_gravatar_hashed_id'] = $hash_email_address; $this->update_usermeta_info( 'synced_gravatar_hashed_id' ); } diff --git a/includes/core/rest/class-api.php b/includes/core/rest/class-api.php index ba12fb9c..289aa67b 100644 --- a/includes/core/rest/class-api.php +++ b/includes/core/rest/class-api.php @@ -538,7 +538,7 @@ if ( ! class_exists( 'um\core\rest\API' ) ) { case 'xml' : - require_once um_path . 'includes/lib/array2xml.php'; + require_once UM_PATH . 'includes/lib/array2xml.php'; $xml = \Array2XML::createXML( 'um', $this->data ); echo $xml->saveXML(); diff --git a/includes/core/um-actions-account.php b/includes/core/um-actions-account.php index 9d4c4e02..41e520dc 100644 --- a/includes/core/um-actions-account.php +++ b/includes/core/um-actions-account.php @@ -511,9 +511,8 @@ function um_before_account_delete() { } add_action( 'um_before_account_delete', 'um_before_account_delete' ); - /** - * Before notifications account tab content + * Before notifications account tab content. * * @param array $args * @@ -521,15 +520,14 @@ add_action( 'um_before_account_delete', 'um_before_account_delete' ); */ function um_before_account_notifications( $args = array() ) { $output = UM()->account()->get_tab_fields( 'notifications', $args ); - if ( substr_count( $output, '_enable_new_' ) ) { ?> - -

- - +

+ validation()->is_url( $submitted_data[ $key ], 'youtube.com/watch?v=' ) && ! UM()->validation()->is_url( $submitted_data[ $key ], 'youtu.be' ) && ! UM()->validation()->is_url( $submitted_data[ $key ], 'youtube.com/shorts/' ) ) { + // translators: %s: label. + UM()->form()->add_error( $key, sprintf( __( 'Please enter a valid %s URL', 'ultimate-member' ), $array['label'] ) ); + } + break; + case 'spotify_url': if ( ! UM()->validation()->is_url( $submitted_data[ $key ], 'open.spotify.com' ) ) { // translators: %s: label. diff --git a/includes/core/um-actions-profile.php b/includes/core/um-actions-profile.php index 50851661..fca61a37 100644 --- a/includes/core/um-actions-profile.php +++ b/includes/core/um-actions-profile.php @@ -1021,7 +1021,7 @@ function um_profile_header( $args ) { */ do_action( 'um_pre_header_editprofile', $args ); ?> -
- fields()->is_error( 'profile_photo' ) ) { - echo UM()->fields()->field_error( UM()->fields()->show_error( 'profile_photo' ), 'force_show' ); + fields()->is_error( 'profile_photo' ) ) { + echo wp_kses( UM()->fields()->field_error( UM()->fields()->show_error( 'profile_photo' ), 'profile_photo', true ), UM()->get_allowed_html( 'templates' ) ); } /** diff --git a/includes/core/um-filters-fields.php b/includes/core/um-filters-fields.php index 1727b234..fcfa3679 100644 --- a/includes/core/um-filters-fields.php +++ b/includes/core/um-filters-fields.php @@ -22,6 +22,30 @@ function um_edit_label_all_fields( $label, $data ) { add_filter( 'um_edit_label_all_fields', 'um_edit_label_all_fields', 10, 2 ); +/** + * Outputs a oEmbed field + * + * @param string $value + * @param array $data + * + * @return string + */ +function um_profile_field_filter_hook__oembed( $value, $data ) { + if ( empty( $value ) ) { + return ''; + } + $responce = wp_oembed_get( $value ); + if ( empty( $responce ) ) { + $value = '
' . esc_html( $value ) . ''; + } else { + $value = $responce; + } + + return $value; +} +add_filter( 'um_profile_field_filter_hook__oembed', 'um_profile_field_filter_hook__oembed', 99, 2 ); + + /** * Outputs a SoundCloud track * @@ -31,12 +55,14 @@ add_filter( 'um_edit_label_all_fields', 'um_edit_label_all_fields', 10, 2 ); * @return string */ function um_profile_field_filter_hook__soundcloud_track( $value, $data ) { - + if ( empty( $value ) ) { + return ''; + } if ( ! is_numeric( $value ) ) { # if we're passed a track url: if ( preg_match( '/https:\/\/soundcloud.com\/.*/', $value ) ) { $value = '
- +
'; return $value; } else { @@ -436,49 +462,76 @@ function um_profile_field_filter_hook__( $value, $data, $type = '' ) { } if ( isset( $data['type'] ) && 'text' === $data['type'] && isset( $data['validate'] ) && 'skype' === $data['validate'] ) { - $alt = ! empty( $data['url_text'] ) ? $data['url_text'] : $value; - $url_rel = ( isset( $data['url_rel'] ) && $data['url_rel'] == 'nofollow' ) ? 'rel="nofollow"' : ''; + $alt = ! empty( $data['url_text'] ) ? $data['url_text'] : $value; + $url_rel = ( isset( $data['url_rel'] ) && 'nofollow' === $data['url_rel'] ) ? 'rel="nofollow"' : ''; $data['url_target'] = ( isset( $data['url_target'] ) ) ? $data['url_target'] : '_blank'; if ( false === strstr( $value, 'join.skype.com' ) ) { $value = 'skype:' . $value . '?chat'; } - $value = '' . esc_html( $alt ) . ''; + $value = '' . esc_html( $alt ) . ''; } else { - if ( ( isset( $data['validate'] ) && $data['validate'] !== '' && $data['type'] !== 'spotify' && strstr( $data['validate'], 'url' ) ) || ( isset( $data['type'] ) && $data['type'] == 'url' ) ) { - $alt = ( isset( $data['url_text'] ) && !empty( $data['url_text'] ) ) ? $data['url_text'] : $value; - $url_rel = ( isset( $data['url_rel'] ) && $data['url_rel'] == 'nofollow' ) ? 'rel="nofollow"' : ''; + // check $value is oEmbed + if ( 'oembed' === $data['type'] ) { + return $value; + } + + if ( ( isset( $data['validate'] ) && '' !== $data['validate'] && 'spotify' !== $data['type'] && strstr( $data['validate'], 'url' ) ) || ( isset( $data['type'] ) && 'url' === $data['type'] && 'oembed' !== $data['type'] ) ) { + $alt = ( isset( $data['url_text'] ) && ! empty( $data['url_text'] ) ) ? $data['url_text'] : $value; + $url_rel = ( isset( $data['url_rel'] ) && 'nofollow' === $data['url_rel'] ) ? 'rel="nofollow"' : ''; if ( ! strstr( $value, 'http' ) - && !strstr( $value, '://' ) - && !strstr( $value, 'www.' ) - && !strstr( $value, '.com' ) - && !strstr( $value, '.net' ) - && !strstr( $value, '.org' ) - && !strstr( $value, '.me' ) + && ! strstr( $value, '://' ) + && ! strstr( $value, 'www.' ) + && ! strstr( $value, '.com' ) + && ! strstr( $value, '.net' ) + && ! strstr( $value, '.org' ) + && ! strstr( $value, '.me' ) ) { - if ( $data['validate'] == 'soundcloud_url' ) $value = 'https://soundcloud.com/' . $value; - if ( $data['validate'] == 'youtube_url' ) $value = 'https://youtube.com/user/' . $value; - if ( $data['validate'] == 'telegram_url' ) $value = 'https://t.me/' . $value; - if ( $data['validate'] == 'facebook_url' ) $value = 'https://facebook.com/' . $value; - if ( $data['validate'] == 'twitter_url' ) $value = 'https://twitter.com/' . $value; - if ( $data['validate'] == 'linkedin_url' ) $value = 'https://linkedin.com/' . $value; - if ( $data['validate'] == 'instagram_url' ) $value = 'https://instagram.com/' . $value; - if ( $data['validate'] == 'tiktok_url' ) $value = 'https://tiktok.com/' . $value; - if ( $data['validate'] == 'twitch_url' ) $value = 'https://twitch.tv/' . $value; - if ( $data['validate'] == 'reddit_url' ) $value = 'https://www.reddit.com/user/' . $value; - if ( $data['validate'] == 'spotify_url' ) $value = 'https://open.spotify.com/' . $value; + if ( 'soundcloud_url' === $data['validate'] ) { + $value = 'https://soundcloud.com/' . $value; + } + if ( 'youtube_url' === $data['validate'] ) { + $value = 'https://youtube.com/user/' . $value; + } + if ( 'telegram_url' === $data['validate'] ) { + $value = 'https://t.me/' . $value; + } + if ( 'facebook_url' === $data['validate'] ) { + $value = 'https://facebook.com/' . $value; + } + if ( 'twitter_url' === $data['validate'] ) { + $value = 'https://twitter.com/' . $value; + } + if ( 'linkedin_url' === $data['validate'] ) { + $value = 'https://linkedin.com/' . $value; + } + if ( 'instagram_url' === $data['validate'] ) { + $value = 'https://instagram.com/' . $value; + } + if ( 'tiktok_url' === $data['validate'] ) { + $value = 'https://tiktok.com/' . $value; + } + if ( 'twitch_url' === $data['validate'] ) { + $value = 'https://twitch.tv/' . $value; + } + if ( 'reddit_url' === $data['validate'] ) { + $value = 'https://www.reddit.com/user/' . $value; + } + if ( 'spotify_url' === $data['validate'] ) { + $value = 'https://open.spotify.com/' . $value; + } } if ( strpos( $value, 'http://' ) !== 0 ) { $value = 'http://' . $value; } - $value = str_replace('https://https://','https://',$value); - $value = str_replace('http://https://','https://',$value); + $value = str_replace( 'https://https://', 'https://', $value ); + $value = str_replace( 'http://https://', 'https://', $value ); $onclick_alert = ''; - if ( UM()->options()->get( 'allow_url_redirect_confirm' ) && $value !== wp_validate_redirect( $value ) ) { + if ( UM()->options()->get( 'allow_url_redirect_confirm' ) && wp_validate_redirect( $value ) !== $value ) { $onclick_alert = sprintf( ' onclick="' . esc_attr( 'return confirm( "%s" );' ) . '"', // translators: %s: link. @@ -487,20 +540,20 @@ function um_profile_field_filter_hook__( $value, $data, $type = '' ) { } $data['url_target'] = ( isset( $data['url_target'] ) ) ? $data['url_target'] : '_blank'; - $value = '' . esc_html( $alt ) . ''; + $value = '' . esc_html( $alt ) . ''; } } if ( ! is_array( $value ) ) { if ( is_email( $value ) ) { - $value = ''.$value.''; + $value = '' . $value . ''; } } else { $value = implode( ', ', $value ); } - $value = str_replace('https://https://','https://',$value); - $value = str_replace('http://https://','https://',$value); + $value = str_replace( 'https://https://', 'https://', $value ); + $value = str_replace( 'http://https://', 'https://', $value ); //$value = UM()->shortcodes()->emotize( $value ); return $value; diff --git a/includes/core/um-filters-user.php b/includes/core/um-filters-user.php index 6d8bfe8a..455651ca 100644 --- a/includes/core/um-filters-user.php +++ b/includes/core/um-filters-user.php @@ -1,47 +1,49 @@ -roles()->get_priority_user_role( get_current_user_id() ) ); - $can_edit_users = current_user_can( 'edit_users' ) && $role->has_cap( 'edit_users' ); + $can_edit_users = null !== $role && current_user_can( 'edit_users' ) && $role->has_cap( 'edit_users' ); if ( $can_edit_users ) { + $account_status = um_user( 'account_status' ); - if ( um_user( 'account_status' ) == 'awaiting_admin_review' ) { + if ( 'awaiting_admin_review' === $account_status ) { $actions['um_approve_membership'] = array( 'label' => __( 'Approve Membership', 'ultimate-member' ) ); - $actions['um_reject_membership'] = array( 'label' => __( 'Reject Membership', 'ultimate-member' ) ); + $actions['um_reject_membership'] = array( 'label' => __( 'Reject Membership', 'ultimate-member' ) ); } - if ( um_user( 'account_status' ) == 'rejected' ) { + if ( 'rejected' === $account_status ) { $actions['um_approve_membership'] = array( 'label' => __( 'Approve Membership', 'ultimate-member' ) ); } - if ( um_user( 'account_status' ) == 'approved' ) { + if ( 'approved' === $account_status ) { $actions['um_put_as_pending'] = array( 'label' => __( 'Put as Pending Review', 'ultimate-member' ) ); } - if ( um_user( 'account_status' ) == 'awaiting_email_confirmation' ) { + if ( 'awaiting_email_confirmation' === $account_status ) { $actions['um_resend_activation'] = array( 'label' => __( 'Resend Activation E-mail', 'ultimate-member' ) ); } - if ( um_user( 'account_status' ) != 'inactive' ) { + if ( 'inactive' !== $account_status ) { $actions['um_deactivate'] = array( 'label' => __( 'Deactivate this account', 'ultimate-member' ) ); } - if ( um_user( 'account_status' ) == 'inactive' ) { + if ( 'inactive' === $account_status ) { $actions['um_reenable'] = array( 'label' => __( 'Reactivate this account', 'ultimate-member' ) ); } - } if ( UM()->roles()->um_current_user_can( 'delete', $user_id ) ) { @@ -56,226 +58,150 @@ function um_admin_user_actions_hook( $actions, $user_id ) { } add_filter( 'um_admin_user_actions_hook', 'um_admin_user_actions_hook', 10, 2 ); - /** - * Filter user basename + * Filter user basename. + * * @param string $value + * * @return string - * @hook_filter: um_clean_user_basename_filter */ -function um_clean_user_basename_filter( $value, $raw ){ +function um_clean_user_basename_filter( $value, $raw ) { $permalink_base = UM()->options()->get( 'permalink_base' ); $user_query = new WP_User_Query( array( - 'meta_query' => array( - 'relation' => 'AND', + 'meta_query' => array( + 'relation' => 'AND', array( - 'key' => 'um_user_profile_url_slug_'.$permalink_base, + 'key' => 'um_user_profile_url_slug_' . $permalink_base, 'value' => $raw, - 'compare' => '=' - ) + 'compare' => '=', + ), ), - 'fields' => array('ID') + 'fields' => array( 'ID' ), ) - ); - if( $user_query->total_users > 0 ){ - + if ( $user_query->total_users > 0 ) { $result = current( $user_query->get_results() ); - $slugname = ''; - - if( isset( $result->ID ) ){ - $slugname = get_user_meta( $result->ID, 'um_user_profile_url_slug_'.$permalink_base, true ); - $value = $slugname; + if ( isset( $result->ID ) ) { + $value = get_user_meta( $result->ID, 'um_user_profile_url_slug_' . $permalink_base, true ); } } /** - * UM hook + * Filters the base user permalink value before cleaning. * - * @type filter - * @title um_permalink_base_before_filter - * @description Base permalink before - * @input_vars - * [{"var":"$permalink","type":"string","desc":"User Permalink"}] - * @change_log - * ["Since: 2.0"] - * @usage - * - * @example - * Change base permalink before cleaning. * function my_permalink_base_before( $permalink ) { * // your code here * return $permalink; * } - * ?> + * add_filter( 'um_permalink_base_before_filter', 'my_permalink_base_before' ); */ - $value = apply_filters( "um_permalink_base_before_filter", $value ); - $raw_value = $value; + $value = apply_filters( 'um_permalink_base_before_filter', $value ); + $raw_value = $value; + $filter_slug = ''; - switch( $permalink_base ) { + switch ( $permalink_base ) { case 'name': - - - if( ! empty( $value ) && strrpos( $value ,"_") > -1 ){ + if ( ! empty( $value ) && strrpos( $value, '_' ) > -1 ) { $value = str_replace( '_', '. ', $value ); } - if( ! empty( $value ) && strrpos( $value ,"_") > -1 ){ + if ( ! empty( $value ) && strrpos( $value, '_' ) > -1 ) { $value = str_replace( '_', '-', $value ); } - if( ! empty( $value ) && strrpos( $value ,".") > -1 && strrpos( $raw_value ,"_" ) <= -1 ){ + if ( ! empty( $value ) && strrpos( $value, '.' ) > -1 && strrpos( $raw_value, '_' ) <= -1 ) { $value = str_replace( '.', ' ', $value ); } - /** - * UM hook - * - * @type filter - * @title um_permalink_base_after_filter_name - * @description Base permalink after if permalink is username - * @input_vars - * [{"var":"$permalink","type":"string","desc":"User Permalink"}, - * {"var":"$raw_permalink","type":"string","desc":"RAW User Permalink"}] - * @change_log - * ["Since: 2.0"] - * @usage - * - * @example - * - */ - $value = apply_filters("um_permalink_base_after_filter_name", $value, $raw_value ); - + $filter_slug = '_' . $permalink_base; break; - case 'name_dash': - - if( ! empty( $value ) && strrpos( $value ,"-") > -1 ){ + if ( ! empty( $value ) && strrpos( $value, '-' ) > -1 ) { $value = str_replace( '-', ' ', $value ); } - if( ! empty( $value ) && strrpos( $value ,"_") > -1 ){ + if ( ! empty( $value ) && strrpos( $value, '_' ) > -1 ) { $value = str_replace( '_', '-', $value ); } // Checks if last name has a dash - if( ! empty( $value ) && strrpos( $value ,"_") > -1 ){ + if ( ! empty( $value ) && strrpos( $value, '_' ) > -1 ) { $value = str_replace( '_', '-', $value ); } - /** - * UM hook - * - * @type filter - * @title um_permalink_base_after_filter_name_dash - * @description Base permalink after if permalink is first name - last name - * @input_vars - * [{"var":"$permalink","type":"string","desc":"User Permalink"}, - * {"var":"$raw_permalink","type":"string","desc":"RAW User Permalink"}] - * @change_log - * ["Since: 2.0"] - * @usage - * - * @example - * - */ - $value = apply_filters("um_permalink_base_after_filter_name_dash", $value, $raw_value ); - + $filter_slug = '_' . $permalink_base; break; - - case 'name_plus': - - if( ! empty( $value ) && strrpos( $value ,"+") > -1 ){ + if ( ! empty( $value ) && strrpos( $value, '+' ) > -1 ) { $value = str_replace( '+', ' ', $value ); } - if( ! empty( $value ) && strrpos( $value ,"_") > -1 ){ + if ( ! empty( $value ) && strrpos( $value, '_' ) > -1 ) { $value = str_replace( '_', '+', $value ); } - /** - * UM hook - * - * @type filter - * @title um_permalink_base_after_filter_name_plus - * @description Base permalink after if permalink is first name + last name - * @input_vars - * [{"var":"$permalink","type":"string","desc":"User Permalink"}, - * {"var":"$raw_permalink","type":"string","desc":"RAW User Permalink"}] - * @change_log - * ["Since: 2.0"] - * @usage - * - * @example - * - */ - $value = apply_filters("um_permalink_base_after_filter_name_plus", $value, $raw_value ); - + $filter_slug = '_' . $permalink_base; break; - default: - // Checks if last name has a dash - if( ! empty( $value ) && strrpos( $value ,"_") > -1 && substr( $value , "_") == 1 ){ + if ( ! empty( $value ) && strrpos( $value, '_' ) > -1 ) { $value = str_replace( '_', '-', $value ); } - - /** - * UM hook - * - * @type filter - * @title um_permalink_base_after_filter - * @description Base permalink after for default permalink - * @input_vars - * [{"var":"$permalink","type":"string","desc":"User Permalink"}, - * {"var":"$raw_permalink","type":"string","desc":"RAW User Permalink"}] - * @change_log - * ["Since: 2.0"] - * @usage - * - * @example - * - */ - $value = apply_filters("um_permalink_base_after_filter", $value, $raw_value ); - break; } - return $value; - + /** + * Filters the base user permalink value after cleaning. + * $filter_slug - can be empty '' or equals 'name', 'name_dash', 'name_plus' + * + * @param {string} $permalink User Profile permalink. + * @param {string} $raw_value The base user permalink value before cleaning. + * + * @return {string} User Profile permalink. + * + * @since 1.3.x + * @hook um_permalink_base_after_filter{$filter_slug} + * + * @example Change base permalink after cleaning if permalink settings isn't connected with user first or last name. + * function my_permalink_base_after_filter( $permalink, $raw_permalink ) { + * // your code here + * return $permalink; + * } + * add_filter( 'um_permalink_base_after_filter', 'my_permalink_base_after_filter', 10, 2 ); + * @example Change base permalink after cleaning if permalink settings is a full name. + * function my_permalink_base_after_filter_name( $permalink, $raw_permalink ) { + * // your code here + * return $permalink; + * } + * add_filter( 'um_permalink_base_after_filter_name', 'my_permalink_base_after_filter_name', 10, 2 ); + * @example Change base permalink after cleaning if permalink settings is a full name connected by dash. + * function my_permalink_base_after_filter_name_dash( $permalink, $raw_permalink ) { + * // your code here + * return $permalink; + * } + * add_filter( 'um_permalink_base_after_filter_name_dash', 'my_permalink_base_after_filter_name_dash', 10, 2 ); + * @example Change base permalink after cleaning if permalink settings is a full name connected by plus. + * function my_permalink_base_after_filter_name_plus( $permalink, $raw_permalink ) { + * // your code here + * return $permalink; + * } + * add_filter( 'um_permalink_base_after_filter_name_plus', 'my_permalink_base_after_filter_name_plus', 10, 2 ); + */ + return apply_filters( "um_permalink_base_after_filter{$filter_slug}", $value, $raw_value ); } add_filter( 'um_clean_user_basename_filter', 'um_clean_user_basename_filter', 2, 10 ); - /** * Filter before update profile to force utf8 strings * @@ -296,4 +222,4 @@ function um_before_update_profile( $changes, $user_id ) { return $changes; } -add_filter( 'um_before_update_profile','um_before_update_profile', 10, 2 ); +add_filter( 'um_before_update_profile', 'um_before_update_profile', 10, 2 ); diff --git a/includes/frontend/class-enqueue.php b/includes/frontend/class-enqueue.php new file mode 100644 index 00000000..0152cd3c --- /dev/null +++ b/includes/frontend/class-enqueue.php @@ -0,0 +1,412 @@ +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 + * + * @type filter + * @title um_core_enqueue_priority + * @description Change Enqueue scripts priority + * @input_vars + * [{"var":"$priority","type":"int","desc":"Priority"}] + * @change_log + * ["Since: 2.0"] + * @usage add_filter( 'um_core_enqueue_priority', 'function_name', 10, 1 ); + * @example + * + */ + return apply_filters( 'um_core_enqueue_priority', 100 ); + } + + + /** + * + */ + function register_scripts() { + $suffix = self::get_suffix(); + + wp_register_script( 'um_scrollbar', $this->js_baseurl . 'simplebar' . $suffix . '.js', array( 'jquery' ), UM_VERSION, true ); + + wp_register_script( 'um_jquery_form', $this->js_baseurl . 'um-jquery-form' . $suffix . '.js', array( 'jquery' ), UM_VERSION, true ); + wp_register_script( 'um_fileupload', $this->js_baseurl . 'um-fileupload.js', array( 'jquery', 'um_jquery_form' ), UM_VERSION, true ); + + wp_register_script( 'um_datetime', $this->js_baseurl . 'pickadate/picker.js', array( 'jquery' ), UM_VERSION, true ); + wp_register_script( 'um_datetime_date', $this->js_baseurl . 'pickadate/picker.date.js', array( 'jquery', 'um_datetime' ), UM_VERSION, true ); + wp_register_script( 'um_datetime_time', $this->js_baseurl . 'pickadate/picker.time.js', array( 'jquery', 'um_datetime' ), UM_VERSION, true ); +// wp_register_script( 'um_datetime_legacy', $this->js_baseurl . 'pickadate/legacy.js', array( 'jquery', 'um_datetime' ), UM_VERSION, true ); + // load a localized version for date/time + $locale = get_locale(); + if ( $locale ) { + if ( file_exists( WP_LANG_DIR . '/plugins/ultimate-member/assets/js/pickadate/' . $locale . '.js' ) ) { + wp_register_script('um_datetime_locale', content_url() . '/languages/plugins/ultimate-member/assets/js/pickadate/' . $locale . '.js', array( 'jquery', 'um_datetime' ), UM_VERSION, true ); + } elseif ( file_exists( UM_PATH . 'assets/js/pickadate/translations/' . $locale . '.js' ) ) { + wp_register_script('um_datetime_locale', UM_URL . 'assets/js/pickadate/translations/' . $locale . '.js', array( 'jquery', 'um_datetime' ), UM_VERSION, true ); + } + } + + //wp_register_script( 'um_tipsy', $this->js_baseurl . 'um-tipsy' . $suffix . '.js', array( 'jquery' ), UM_VERSION, true ); + // wp_register_script( 'um_raty', $this->js_baseurl . 'um-raty' . $suffix . '.js', array( 'jquery', 'wp-i18n' ), UM_VERSION, true ); + wp_register_script( 'um_crop', $this->js_baseurl . 'um-crop' . $suffix . '.js', array( 'jquery' ), UM_VERSION, true ); + + wp_register_script( 'um_modal', $this->js_baseurl . 'um-modal' . $suffix . '.js', array( 'jquery', 'wp-util', 'um_crop' ), UM_VERSION, true ); + + wp_register_script('um_functions', $this->js_baseurl . 'um-functions' . $suffix . '.js', array( 'jquery', 'jquery-masonry', 'wp-util', 'um_scrollbar' ), UM_VERSION, true ); + wp_register_script( 'um_responsive', $this->js_baseurl . 'um-responsive' . $suffix . '.js', array( 'jquery', 'um_functions', 'um_crop' ), UM_VERSION, true ); + + wp_register_script( 'um-gdpr', $this->js_baseurl . 'um-gdpr' . $suffix . '.js', array( 'jquery' ), UM_VERSION, false ); + wp_register_script('um_conditional', $this->js_baseurl . 'um-conditional' . $suffix . '.js', array( 'jquery', 'wp-hooks' ), UM_VERSION, true ); + wp_register_script('um_scripts', $this->js_baseurl . 'um-scripts' . $suffix . '.js', array( 'jquery', 'wp-util', 'um_conditional', 'um_datetime', 'um_datetime_date', 'um_datetime_time', /*'um_datetime_legacy',*/ self::$select2_handle, 'um_tipsy', 'um_raty' ), UM_VERSION, true ); + /** + * UM hook + * + * @type filter + * @title um_enqueue_localize_data + * @description Extend UM localized data + * @input_vars + * [{"var":"$data","type":"array","desc":"Localize Array"}] + * @change_log + * ["Since: 2.0"] + * @usage add_filter( 'um_enqueue_localize_data', 'function_name', 10, 1 ); + * @example + * + */ + + $max_upload_size = wp_max_upload_size(); + if ( ! $max_upload_size ) { + $max_upload_size = 0; + } + + $localize_data = apply_filters( 'um_enqueue_localize_data', array( + 'max_upload_size' => $max_upload_size, + 'nonce' => wp_create_nonce( "um-frontend-nonce" ), + ) ); + wp_localize_script( 'um_scripts', 'um_scripts', $localize_data ); + + wp_register_script('um_dropdown', $this->js_baseurl . 'dropdown' . $suffix . '.js', array( 'jquery' ), UM_VERSION, true ); + + wp_register_script('um_members', $this->js_baseurl . 'um-members' . $suffix . '.js', array( 'jquery', 'wp-util', 'jquery-ui-slider', 'um_dropdown', 'wp-hooks', 'jquery-masonry', 'um_scripts' ), UM_VERSION, true ); + wp_register_script('um_profile', $this->js_baseurl . 'um-profile' . $suffix . '.js', array( 'jquery', 'wp-util', 'wp-i18n' ), UM_VERSION, true ); + + $account_deps = apply_filters( 'um_account_scripts_dependencies', array( 'jquery', 'wp-hooks' ) ); + wp_register_script('um_account', $this->js_baseurl . 'um-account' . $suffix . '.js', $account_deps, UM_VERSION, true ); + + wp_register_script( 'um_gchart', 'https://www.google.com/jsapi', array(), UM_VERSION, true ); + } + + + /** + * Register styles + */ + public function register_styles() { + //FontAwesome and FontIcons styles + wp_register_style( 'um_crop', $this->css_baseurl . 'um-crop.css', array(), UM_VERSION ); + wp_register_style( 'um_fileupload', $this->css_baseurl . 'um-fileupload.css', array(), UM_VERSION ); + wp_register_style( 'um_datetime', $this->css_baseurl . 'pickadate/default.css', array(), UM_VERSION ); + wp_register_style( 'um_datetime_date', $this->css_baseurl . 'pickadate/default.date.css', array( 'um_datetime' ), UM_VERSION ); + wp_register_style( 'um_datetime_time', $this->css_baseurl . 'pickadate/default.time.css', array( 'um_datetime' ), UM_VERSION ); + wp_register_style( 'um_scrollbar', $this->css_baseurl . 'simplebar.css', array(), UM_VERSION ); + + wp_register_style( 'um_rtl', $this->css_baseurl . 'um.rtl.css', array(), UM_VERSION ); + wp_register_style( 'um_default_css', $this->css_baseurl . 'um-old-default.css', array(), UM_VERSION ); + wp_register_style( 'um_modal', $this->css_baseurl . 'um-modal.css', array( 'um_crop' ), UM_VERSION ); + wp_register_style( 'um_responsive', $this->css_baseurl . 'um-responsive.css', array( 'um_profile', 'um_crop' ), UM_VERSION ); + + wp_register_style( 'um_styles', $this->css_baseurl . 'um-styles.css', array( 'um_ui', 'um_tipsy', 'um_raty', 'um_fonticons_ii', 'um_fonticons_fa', 'select2' ), UM_VERSION ); + + wp_register_style( 'um_members', $this->css_baseurl . 'um-members.css', array( 'um_styles' ), UM_VERSION ); + if ( is_rtl() ) { + wp_register_style( 'um_members_rtl', $this->css_baseurl . 'um-members-rtl.css', array( 'um_members' ), UM_VERSION ); + } + + wp_register_style( 'um_profile', $this->css_baseurl . 'um-profile.css', array( 'um_styles' ), UM_VERSION ); + wp_register_style( 'um_account', $this->css_baseurl . 'um-account.css', array( 'um_styles' ), UM_VERSION ); + wp_register_style( 'um_misc', $this->css_baseurl . 'um-misc.css', array( 'um_styles' ), UM_VERSION ); + } + + + /** + * Enqueue scripts and styles + */ + function wp_enqueue_scripts() { + + $this->register_scripts(); + $this->register_styles(); + + $this->load_original(); + + // rtl style + if ( is_rtl() ) { + wp_enqueue_style( 'um_rtl' ); + } + + global $post; + if ( is_object( $post ) && has_shortcode( $post->post_content,'ultimatemember' ) ) { + wp_dequeue_script( 'jquery-form' ); + } + + //old settings before UM 2.0 CSS + wp_enqueue_style( 'um_default_css' ); + + $this->old_css_settings(); + } + + + /** + * + */ + function old_css_settings() { + $uploads = wp_upload_dir(); + $upload_dir = $uploads['basedir'] . DIRECTORY_SEPARATOR . 'ultimatemember' . DIRECTORY_SEPARATOR; + if ( file_exists( $upload_dir . 'um_old_settings.css' ) ) { + wp_register_style( 'um_old_css', UM_URL . '../../uploads/ultimatemember/um_old_settings.css' ); + wp_enqueue_style( 'um_old_css' ); + } + } + + + /** + * This will load original files (not minified) + */ + function load_original() { + + //maybe deprecated + //$this->load_google_charts(); + + //$this->load_fonticons(); + + // $this->load_selectjs(); + + $this->load_modal(); + + $this->load_css(); + + $this->load_fileupload(); + + $this->load_datetimepicker(); + + //$this->load_raty(); + + //$this->load_scrollto(); + + $this->load_scrollbar(); + + $this->load_imagecrop(); + + //$this->load_tipsy(); + + $this->load_functions(); + + $this->load_responsive(); + + $this->load_customjs(); + + } + + + /** + * Include Google charts + */ + function load_google_charts() { + wp_enqueue_script( 'um_gchart' ); + } + + + /** + * Load plugin css + */ + function load_css() { + wp_enqueue_style( 'um_styles' ); + /*if ( is_rtl() ) { + wp_enqueue_style( 'um_members_rtl' ); + } else { + wp_enqueue_style( 'um_members' ); + }*/ + + wp_enqueue_style( 'um_profile' ); + wp_enqueue_style( 'um_account' ); + wp_enqueue_style( 'um_misc' ); + } + + + /** + * Load select-dropdowns JS + * @depecated 2.6.12 + */ + function load_selectjs() { + } + + + /** + * Load Fonticons + * + * @depecated 2.6.12 + */ + function load_fonticons() { + } + + + /** + * Load fileupload JS + */ + function load_fileupload() { + wp_enqueue_script( 'um_fileupload' ); + wp_enqueue_style( 'um_fileupload' ); + } + + + /** + * Load JS functions + */ + function load_functions() { + wp_enqueue_script('um_functions' ); + wp_enqueue_script( 'um-gdpr' ); + } + + + /** + * Load custom JS + */ + function load_customjs() { + wp_enqueue_script('um_conditional'); + wp_enqueue_script('um_scripts'); + //wp_enqueue_script('um_members'); + wp_enqueue_script('um_profile'); + wp_enqueue_script('um_account'); + } + + + /** + * Load date & time picker + */ + function load_datetimepicker() { + wp_enqueue_script( 'um_datetime' ); + wp_enqueue_script( 'um_datetime_date' ); + wp_enqueue_script( 'um_datetime_time' ); + //wp_enqueue_script( 'um_datetime_legacy' ); + + // load a localized version for date/time + $locale = get_locale(); + if ( $locale && ( file_exists( WP_LANG_DIR . '/plugins/ultimate-member/assets/js/pickadate/' . $locale . '.js' ) || file_exists( UM_PATH . 'assets/js/pickadate/translations/' . $locale . '.js' ) ) ) { + wp_enqueue_script('um_datetime_locale' ); + } + + wp_enqueue_style( 'um_datetime' ); + wp_enqueue_style( 'um_datetime_date' ); + wp_enqueue_style( 'um_datetime_time' ); + } + + + /** + * Load scrollbar + */ + function load_scrollbar(){ + wp_enqueue_style('um_scrollbar'); + } + + /** + * Load crop script + */ + function load_imagecrop() { + wp_enqueue_script( 'um_crop' ); + wp_enqueue_style( 'um_crop' ); + } + + + /** + * Load tipsy + * + * @depecated 2.6.12 + */ + function load_tipsy() { + wp_enqueue_script( 'um_tipsy' ); + wp_enqueue_style( 'um_tipsy' ); + } + + /** + * Load rating + * + * @depecated 2.6.12 + */ + function load_raty() { + wp_enqueue_script('um_raty'); + wp_enqueue_style('um_raty'); + } + + + /** + * Load modal + */ + function load_modal() { + wp_enqueue_script( 'um_modal' ); + wp_enqueue_style( 'um_modal' ); + } + + + /** + * Load responsive styles + */ + function load_responsive() { + wp_enqueue_script( 'um_responsive' ); + wp_enqueue_style( 'um_responsive' ); + } +} diff --git a/includes/frontend/class-init.php b/includes/frontend/class-init.php index 21eff21a..d3de783e 100644 --- a/includes/frontend/class-init.php +++ b/includes/frontend/class-init.php @@ -20,9 +20,23 @@ if ( ! class_exists( 'um\frontend\Init' ) ) { * @used-by \UM::includes() */ public function includes() { + $this->enqueue(); $this->secure(); } + /** + * @since 2.6.12 + * + * @return Enqueue + */ + public function enqueue() { + if ( empty( UM()->classes['um\frontend\enqueue'] ) ) { + UM()->classes['um\frontend\enqueue'] = new Enqueue(); + } + + return UM()->classes['um\frontend\enqueue']; + } + /** * @since 2.6.8 * diff --git a/includes/um-short-functions.php b/includes/um-short-functions.php index 8fedfccd..0e92a89a 100644 --- a/includes/um-short-functions.php +++ b/includes/um-short-functions.php @@ -838,7 +838,7 @@ function um_user_submited_display( $k, $title, $data = array(), $style = true ) $v = um_user( $k ); } - if ( strstr( $k, 'user_pass' ) || in_array( $k, array( 'g-recaptcha-response', 'request', '_wpnonce', '_wp_http_referer' ) ) ) { + if ( strstr( $k, 'user_pass' ) || in_array( $k, array( 'g-recaptcha-response', 'request', '_wpnonce', '_wp_http_referer' ), true ) ) { return ''; } @@ -1906,15 +1906,17 @@ function um_profile( $key ) { return $value; } - /** - * Get youtube video ID from url + * Get YouTube video ID from URL. * - * @param $url + * @param string $url * - * @return bool + * @return bool|string */ function um_youtube_id_from_url( $url ) { + $url = preg_replace( '/&ab_channel=.*/', '', $url ); // ADBlock argument. + $url = preg_replace( '/\?si=.*/', '', $url ); // referral attribute. + $pattern = '%^# Match any youtube URL (?:https?://)? # Optional scheme. Either http or https @@ -1926,10 +1928,12 @@ function um_youtube_id_from_url( $url ) { /embed/ # Either /embed/ | /v/ # or /v/ | /watch\?v= # or /watch\?v= + | /shorts/ # or /shorts/ for short videos ) # End path alternatives. ) # End host alternatives. ([\w-]{10,12}) # Allow 10-12 for 11 char youtube id. $%x'; + $result = preg_match( $pattern, $url, $matches ); if ( false !== $result && isset( $matches[1] ) ) { return $matches[1]; @@ -1938,7 +1942,6 @@ function um_youtube_id_from_url( $url ) { return false; } - /** * Find closest number in an array * @@ -2131,7 +2134,7 @@ function um_get_default_avatar_uri() { $uri = UM()->options()->get( 'default_avatar' ); $uri = !empty( $uri['url'] ) ? $uri['url'] : ''; if ( ! $uri ) { - $uri = um_url . 'assets/img/default_avatar.jpg'; + $uri = UM_URL . 'assets/img/default_avatar.jpg'; } return set_url_scheme( $uri ); diff --git a/readme.txt b/readme.txt index d611a68a..4fefbc27 100644 --- a/readme.txt +++ b/readme.txt @@ -7,7 +7,7 @@ Tags: community, member, membership, user-profile, user-registration Requires PHP: 5.6 Requires at least: 5.5 Tested up to: 6.3 -Stable tag: 2.6.11 +Stable tag: 2.6.12 License: GNU Version 2 or Any Later Version License URI: http://www.gnu.org/licenses/gpl-3.0.txt @@ -166,6 +166,49 @@ No specific extensions are needed. But we highly recommended keep active these P IMPORTANT: PLEASE UPDATE THE PLUGIN TO AT LEAST VERSION 2.6.7 IMMEDIATELY. VERSION 2.6.7 PATCHES SECURITY PRIVILEGE ESCALATION VULNERABILITY. PLEASE SEE [THIS ARTICLE](https://docs.ultimatemember.com/article/1866-security-incident-update-and-recommended-actions) FOR MORE INFORMATION += 2.6.12: October 09, 2023 = + +* Enhancements: + + - Added: Site Health sections + - Added: oEmbed field type + - Added: YouTube field type supports YouTube Shorts links + - Added: Profile permalink base options: Unique hash, Custom usermeta + - Added: UM Form meta `um_form_version` for legacy support in the future + - Added: Setting "Deleting user comments after deleting a user" for WordPress native logic workaround + - Added: `aria-invalid` and `aria-errormessage` attributes to the fields on UM Forms + - Updated: Structure for enqueue assets PHP classes + - Updated: [Hooks Documentation v2](https://ultimatemember.github.io/ultimatemember/hooks/) + +* Bugfixes: + + - Fixed: Member directory search query escaping process + - Fixed: Added 'ID' metakey to the blacklist. It's not possible to create field with 'ID' metakey to avoid the conflict + - Fixed: Add/Edit Field metabox and "Field Icon", "Conditional logic" fields + - Fixed: Init `jquery-slider-ui` script/style on the block editor page + - Fixed: Displaying "Notifications Account Tab" setting + - Fixed: Displaying Post Date on the User Profile > Posts tab based on this [article](https://make.wordpress.org/core/2019/09/23/date-time-improvements-wp-5-3/) + - Fixed: Small PHP warning, notices and typos + +* Deprecated: + + - `UM()->enqueue()` use `UM()->frontend()->enqueue()` method + - `UM()->admin_enqueue()` use `UM()->admin()->enqueue()` method + - `UM()->admin_enqueue()->suffix` property use `UM()->frontend()->enqueue()::get_suffix()` + - `UM()->admin()->enqueue()->suffix` property use `UM()->frontend()->enqueue()::get_suffix()` + - Changed directories for the fonts (fonticons + raty), and JS/CSS files related to libs `jquery-ui`, `raty`, `select2`, `tipsy`, `fonticons (FontAwesome + Ionicons)` + +* Templates required update: + + - account.php + - login.php + - password-change.php + - password-reset.php + - register.php + - profile/posts-single.php + +* Cached and optimized/minified assets(JS/CSS) must be flushed/re-generated after upgrade + = 2.6.11: September 06, 2023 = * Bugfixes: diff --git a/templates/account.php b/templates/account.php index bfc3c8e6..2e3a75de 100644 --- a/templates/account.php +++ b/templates/account.php @@ -6,7 +6,7 @@ * * Page: "Account" * - * @version 2.6.1 + * @version 2.6.12 * * @var string $mode * @var int $form_id @@ -14,7 +14,8 @@ */ if ( ! defined( 'ABSPATH' ) ) { exit; -} ?> +} +?>
@@ -42,7 +43,8 @@ if ( ! defined( 'ABSPATH' ) ) { * } * ?> */ - do_action( 'um_account_page_hidden_fields', $args ); ?> + do_action( 'um_account_page_hidden_fields', $args ); + ?> @@ -97,7 +99,7 @@ if ( ! defined( 'ABSPATH' ) ) {
@@ -105,9 +107,11 @@ if ( ! defined( 'ABSPATH' ) ) {
    - account()->tabs as $id => $info ) { - if ( isset( $info['custom'] ) || UM()->options()->get( "account_tab_{$id}" ) == 1 || $id == 'general' ) { ?> - + account()->tabs as $id => $info ) { + $tab_enabled = UM()->options()->get( 'account_tab_' . $id ); + if ( isset( $info['custom'] ) || ! empty( $tab_enabled ) || 'general' === $id ) { + ?>
  • - - +
@@ -203,8 +190,7 @@ if ( ! defined( 'ABSPATH' ) ) { * } * ?> */ - do_action( 'um_after_account_page_load' ); ?> - + do_action( 'um_after_account_page_load' ); + ?> - diff --git a/templates/login.php b/templates/login.php index 8423ee92..8ca04fb8 100644 --- a/templates/login.php +++ b/templates/login.php @@ -6,7 +6,7 @@ * * Page: "Login" * - * @version 2.6.1 + * @version 2.6.12 * * @var string $mode * @var int $form_id @@ -14,143 +14,26 @@ */ if ( ! defined( 'ABSPATH' ) ) { exit; -} ?> +} +?>
-
-
- - */ + /** This action is documented in includes/core/um-actions-profile.php */ do_action( 'um_before_form', $args ); - - /** - * UM hook - * - * @type action - * @title um_before_{$mode}_fields - * @description Some actions before login form fields - * @input_vars - * [{"var":"$args","type":"array","desc":"Login form shortcode arguments"}] - * @change_log - * ["Since: 2.0"] - * @usage add_action( 'um_before_{$mode}_fields', 'function_name', 10, 1 ); - * @example - * - */ + /** This action is documented in includes/core/um-actions-profile.php */ do_action( "um_before_{$mode}_fields", $args ); - - /** - * UM hook - * - * @type action - * @title um_main_{$mode}_fields - * @description Some actions before login form fields - * @input_vars - * [{"var":"$args","type":"array","desc":"Login form shortcode arguments"}] - * @change_log - * ["Since: 2.0"] - * @usage add_action( 'um_before_{$mode}_fields', 'function_name', 10, 1 ); - * @example - * - */ + /** This action is documented in includes/core/um-actions-profile.php */ do_action( "um_main_{$mode}_fields", $args ); - - /** - * UM hook - * - * @type action - * @title um_after_form_fields - * @description Some actions after login form fields - * @input_vars - * [{"var":"$args","type":"array","desc":"Login form shortcode arguments"}] - * @change_log - * ["Since: 2.0"] - * @usage add_action( 'um_after_form_fields', 'function_name', 10, 1 ); - * @example - * - */ + /** This action is documented in includes/core/um-actions-profile.php */ do_action( 'um_after_form_fields', $args ); - - /** - * UM hook - * - * @type action - * @title um_after_{$mode}_fields - * @description Some actions after login form fields - * @input_vars - * [{"var":"$args","type":"array","desc":"Login form shortcode arguments"}] - * @change_log - * ["Since: 2.0"] - * @usage add_action( 'um_after_{$mode}_fields', 'function_name', 10, 1 ); - * @example - * - */ + /** This action is documented in includes/core/um-actions-profile.php */ do_action( "um_after_{$mode}_fields", $args ); - - /** - * UM hook - * - * @type action - * @title um_after_form - * @description Some actions after login form fields - * @input_vars - * [{"var":"$args","type":"array","desc":"Login form shortcode arguments"}] - * @change_log - * ["Since: 2.0"] - * @usage add_action( 'um_after_form', 'function_name', 10, 1 ); - * @example - * - */ - do_action( 'um_after_form', $args ); ?> - + /** This action is documented in includes/core/um-actions-profile.php */ + do_action( 'um_after_form', $args ); + ?>
-
-
diff --git a/templates/password-change.php b/templates/password-change.php index 0ecc4f03..89d4e361 100644 --- a/templates/password-change.php +++ b/templates/password-change.php @@ -6,7 +6,7 @@ * * Call: function ultimatemember_password() * - * @version 2.6.1 + * @version 2.6.12 * * @var string $mode * @var string $rp_key @@ -15,7 +15,8 @@ */ if ( ! defined( 'ABSPATH' ) ) { exit; -} ?> +} +?>
@@ -90,27 +91,9 @@ if ( ! defined( 'ABSPATH' ) ) { * ?> */ do_action( 'um_change_password_form', $args ); - - /** - * UM hook - * - * @type action - * @title um_after_form_fields - * @description Password change after form content - * @input_vars - * [{"var":"$args","type":"array","desc":"Password change shortcode arguments"}] - * @change_log - * ["Since: 2.0"] - * @usage add_action( 'um_after_form_fields', 'function_name', 10, 1 ); - * @example - * - */ - do_action( 'um_after_form_fields', $args ); ?> + /** This action is documented in includes/core/um-actions-profile.php */ + do_action( 'um_after_form_fields', $args ); + ?>
diff --git a/templates/password-reset.php b/templates/password-reset.php index e9ec2251..d0d0bcc9 100644 --- a/templates/password-reset.php +++ b/templates/password-reset.php @@ -6,7 +6,7 @@ * * Call: function ultimatemember_password() * - * @version 2.6.1 + * @version 2.6.12 * * @var string $mode * @var int $form_id @@ -14,7 +14,8 @@ */ if ( ! defined( 'ABSPATH' ) ) { exit; -} ?> +} +?>
@@ -143,28 +144,10 @@ if ( ! defined( 'ABSPATH' ) ) { * ?> */ do_action( 'um_reset_password_form', $args ); - - /** - * UM hook - * - * @type action - * @title um_after_form_fields - * @description Password reset after display form - * @input_vars - * [{"var":"$args","type":"array","desc":"Password reset shortcode arguments"}] - * @change_log - * ["Since: 2.0"] - * @usage add_action( 'um_after_form_fields', 'function_name', 10, 1 ); - * @example - * - */ + /** This action is documented in includes/core/um-actions-profile.php */ do_action( 'um_after_form_fields', $args ); - } ?> + } + ?>
diff --git a/templates/profile/posts-single.php b/templates/profile/posts-single.php index 37dc2d1b..4b597df6 100644 --- a/templates/profile/posts-single.php +++ b/templates/profile/posts-single.php @@ -6,7 +6,7 @@ * * Page: "Profile" * - * @version 2.6.1 + * @version 2.6.12 * * @var object $post */ @@ -17,44 +17,49 @@ if ( ! defined( 'ABSPATH' ) ) {
- ID ) ) { - $image_id = get_post_thumbnail_id( $post->ID ); - $image_url = wp_get_attachment_image_src( $image_id, 'full', true ); ?> - + ID ) ) { + $image_id = get_post_thumbnail_id( $post->ID ); + $image_url = wp_get_attachment_image_src( $image_id, 'full', true ); + ?> + + $unix_published_date = get_post_datetime( $post, 'date', 'gmt' ); + ?>
ID ), current_time( 'timestamp' ) ) ); + // translators: %s: human time diff. + echo esc_html( sprintf( __( '%s ago', 'ultimate-member' ), human_time_diff( $unix_published_date->getTimestamp() ) ) ); ?> - : ID ); ?> + ID ) ), UM()->get_allowed_html( 'templates' ) ); + ?> - ID ); - - if ( $num_comments == 0 ) { - $comments = __( 'no comments', 'ultimate-member' ); - } elseif ( $num_comments > 1 ) { - // translators: %s: coments number. - $comments = sprintf( __( '%s comments', 'ultimate-member' ), $num_comments ); + - - + // translators: %s: comments number. + $comments_html = sprintf( _n( '%s comment', '%s comments', $num_comments, 'ultimate-member' ), $num_comments ); + } + ?> +
diff --git a/templates/register.php b/templates/register.php index 255b8a1a..d2b1fc72 100644 --- a/templates/register.php +++ b/templates/register.php @@ -6,7 +6,7 @@ * * Page: "Register" * - * @version 2.6.1 + * @version 2.6.12 * * @var string $mode * @var int $form_id @@ -18,143 +18,26 @@ if ( ! defined( 'ABSPATH' ) ) { if ( ! is_user_logged_in() ) { um_reset_user(); -} ?> +} +?>
- -
- +
- - */ - do_action( "um_before_form", $args ); - - /** - * UM hook - * - * @type action - * @title um_before_{$mode}_fields - * @description Some actions before register form fields - * @input_vars - * [{"var":"$args","type":"array","desc":"Register form shortcode arguments"}] - * @change_log - * ["Since: 2.0"] - * @usage add_action( 'um_before_{$mode}_fields', 'function_name', 10, 1 ); - * @example - * - */ + /** This action is documented in includes/core/um-actions-profile.php */ + do_action( 'um_before_form', $args ); + /** This action is documented in includes/core/um-actions-profile.php */ do_action( "um_before_{$mode}_fields", $args ); - - /** - * UM hook - * - * @type action - * @title um_before_{$mode}_fields - * @description Some actions before register form fields - * @input_vars - * [{"var":"$args","type":"array","desc":"Register form shortcode arguments"}] - * @change_log - * ["Since: 2.0"] - * @usage add_action( 'um_before_{$mode}_fields', 'function_name', 10, 1 ); - * @example - * - */ + /** This action is documented in includes/core/um-actions-profile.php */ do_action( "um_main_{$mode}_fields", $args ); - - /** - * UM hook - * - * @type action - * @title um_after_form_fields - * @description Some actions after register form fields - * @input_vars - * [{"var":"$args","type":"array","desc":"Register form shortcode arguments"}] - * @change_log - * ["Since: 2.0"] - * @usage add_action( 'um_after_form_fields', 'function_name', 10, 1 ); - * @example - * - */ + /** This action is documented in includes/core/um-actions-profile.php */ do_action( 'um_after_form_fields', $args ); - - /** - * UM hook - * - * @type action - * @title um_after_{$mode}_fields - * @description Some actions after register form fields - * @input_vars - * [{"var":"$args","type":"array","desc":"Register form shortcode arguments"}] - * @change_log - * ["Since: 2.0"] - * @usage add_action( 'um_after_{$mode}_fields', 'function_name', 10, 1 ); - * @example - * - */ + /** This action is documented in includes/core/um-actions-profile.php */ do_action( "um_after_{$mode}_fields", $args ); - - /** - * UM hook - * - * @type action - * @title um_after_form - * @description Some actions after register form fields - * @input_vars - * [{"var":"$args","type":"array","desc":"Register form shortcode arguments"}] - * @change_log - * ["Since: 2.0"] - * @usage add_action( 'um_after_form', 'function_name', 10, 1 ); - * @example - * - */ - do_action( 'um_after_form', $args ); ?> - + /** This action is documented in includes/core/um-actions-profile.php */ + do_action( 'um_after_form', $args ); + ?>
-
-
diff --git a/ultimate-member.php b/ultimate-member.php index 5e8517cd..412b65df 100644 --- a/ultimate-member.php +++ b/ultimate-member.php @@ -3,7 +3,7 @@ * Plugin Name: Ultimate Member * Plugin URI: http://ultimatemember.com/ * Description: The easiest way to create powerful online communities and beautiful user profiles with WordPress - * Version: 2.6.11 + * Version: 2.6.12 * Author: Ultimate Member * Author URI: http://ultimatemember.com/ * Text Domain: ultimate-member diff --git a/uninstall.php b/uninstall.php index 63e24f8b..2ff2924e 100644 --- a/uninstall.php +++ b/uninstall.php @@ -9,16 +9,16 @@ if ( ! defined( 'WP_UNINSTALL_PLUGIN' ) ) { exit; } -if ( ! defined( 'um_path' ) ) { - define( 'um_path', plugin_dir_path( __FILE__ ) ); +if ( ! defined( 'UM_PATH' ) ) { + define( 'UM_PATH', plugin_dir_path( __FILE__ ) ); } -if ( ! defined( 'um_url' ) ) { - define( 'um_url', plugin_dir_url( __FILE__ ) ); +if ( ! defined( 'UM_URL' ) ) { + define( 'UM_URL', plugin_dir_url( __FILE__ ) ); } -if ( ! defined( 'um_plugin' ) ) { - define( 'um_plugin', plugin_basename( __FILE__ ) ); +if ( ! defined( 'UM_PLUGIN' ) ) { + define( 'UM_PLUGIN', plugin_basename( __FILE__ ) ); } //for delete Email options only for Core email notifications @@ -87,14 +87,14 @@ if ( ! empty( $delete_options ) ) { update_option( $wp_roles->role_key, $wp_roles->roles ); } - + //remove user role meta $role_keys = get_option( 'um_roles', array() ); if ( $role_keys ) { foreach ( $role_keys as $role_key ) { delete_option( 'um_role_' . $role_key . '_meta' ); } - + $um_custom_role_users = get_users( array( 'role__in' => $role_keys, @@ -135,37 +135,37 @@ if ( ! empty( $delete_options ) ) { global $wpdb; $wpdb->query( - "DELETE - FROM {$wpdb->usermeta} - WHERE meta_key LIKE '_um%' OR - meta_key LIKE 'um%' OR - meta_key LIKE 'reviews%' OR - meta_key = 'submitted' OR - meta_key = 'account_status' OR - meta_key = 'password_rst_attempts' OR - meta_key = 'profile_photo' OR - meta_key = '_enable_new_follow' OR - meta_key = '_enable_new_friend' OR - meta_key = '_mylists' OR - meta_key = '_enable_new_pm' OR - meta_key = '_hidden_conversations' OR - meta_key = '_pm_blocked' OR - meta_key = '_notifications_prefs' OR - meta_key = '_profile_progress' OR - meta_key = '_completed' OR - meta_key = '_cannot_add_review' OR - meta_key = 'synced_profile_photo' OR + "DELETE + FROM {$wpdb->usermeta} + WHERE meta_key LIKE '_um%' OR + meta_key LIKE 'um%' OR + meta_key LIKE 'reviews%' OR + meta_key = 'submitted' OR + meta_key = 'account_status' OR + meta_key = 'password_rst_attempts' OR + meta_key = 'profile_photo' OR + meta_key = '_enable_new_follow' OR + meta_key = '_enable_new_friend' OR + meta_key = '_mylists' OR + meta_key = '_enable_new_pm' OR + meta_key = '_hidden_conversations' OR + meta_key = '_pm_blocked' OR + meta_key = '_notifications_prefs' OR + meta_key = '_profile_progress' OR + meta_key = '_completed' OR + meta_key = '_cannot_add_review' OR + meta_key = 'synced_profile_photo' OR meta_key = 'full_name' OR - meta_key = '_reviews' OR - meta_key = '_reviews_compound' OR - meta_key = '_reviews_total' OR + meta_key = '_reviews' OR + meta_key = '_reviews_compound' OR + meta_key = '_reviews_total' OR meta_key = '_reviews_avg'" ); $wpdb->query( - "DELETE - FROM {$wpdb->postmeta} - WHERE meta_key LIKE '_um%' OR + "DELETE + FROM {$wpdb->postmeta} + WHERE meta_key LIKE '_um%' OR meta_key LIKE 'um%'" );