Файловый менеджер - Редактировать - /home/ephorei/www/wp-includes/images/media/q2m9hb/bsf-analytics.tar
Назад
class-bsf-analytics.php 0000644 00000037573 15006204667 0011144 0 ustar 00 <?php /** * BSF analytics class file. * * @version 1.0.0 * * @package bsf-analytics */ if ( ! defined( 'ABSPATH' ) ) { exit; // Exit if accessed directly. } if ( ! class_exists( 'BSF_Analytics' ) ) { /** * BSF analytics */ class BSF_Analytics { /** * Member Variable * * @var array Entities data. */ private $entities; /** * Member Variable * * @var string Usage tracking document URL */ public $usage_doc_link = 'https://store.brainstormforce.com/usage-tracking/?utm_source=wp_dashboard&utm_medium=general_settings&utm_campaign=usage_tracking'; /** * Setup actions, load files. * * @param array $args entity data for analytics. * @param string $analytics_path directory path to analytics library. * @param float $analytics_version analytics library version. * @since 1.0.0 */ public function __construct( $args, $analytics_path, $analytics_version ) { // Bail when no analytics entities are registered. if ( empty( $args ) ) { return; } $this->entities = $args; define( 'BSF_ANALYTICS_VERSION', $analytics_version ); define( 'BSF_ANALYTICS_URI', $this->get_analytics_url( $analytics_path ) ); add_action( 'admin_init', array( $this, 'handle_optin_optout' ) ); add_action( 'admin_init', array( $this, 'option_notice' ) ); add_action( 'init', array( $this, 'maybe_track_analytics' ), 99 ); $this->set_actions(); add_action( 'admin_init', array( $this, 'register_usage_tracking_setting' ) ); $this->includes(); $this->load_deactivation_survey_actions(); } /** * Function to load the deactivation survey form actions. * * @since 1.1.6 * @return void */ public function load_deactivation_survey_actions() { // If not in a admin area then return it. if ( ! is_admin() ) { return; } add_filter( 'uds_survey_vars', array( $this, 'add_slugs_to_uds_vars' ) ); add_action( 'admin_footer', array( $this, 'load_deactivation_survey_form' ) ); } /** * Setup actions for admin notice style and analytics cron event. * * @since 1.0.4 */ public function set_actions() { foreach ( $this->entities as $key => $data ) { add_action( 'astra_notice_before_markup_' . $key . '-optin-notice', array( $this, 'enqueue_assets' ) ); add_action( 'update_option_' . $key . '_analytics_optin', array( $this, 'update_analytics_option_callback' ), 10, 3 ); add_action( 'add_option_' . $key . '_analytics_optin', array( $this, 'add_analytics_option_callback' ), 10, 2 ); } } /** * BSF Analytics URL * * @param string $analytics_path directory path to analytics library. * @return String URL of bsf-analytics directory. * @since 1.0.0 */ public function get_analytics_url( $analytics_path ) { $content_dir_path = wp_normalize_path( WP_CONTENT_DIR ); $analytics_path = wp_normalize_path( $analytics_path ); return str_replace( $content_dir_path, content_url(), $analytics_path ); } /** * Enqueue Scripts. * * @since 1.0.0 * @return void */ public function enqueue_assets() { /** * Load unminified if SCRIPT_DEBUG is true. * * Directory and Extensions. */ $dir_name = ( SCRIPT_DEBUG ) ? 'unminified' : 'minified'; $file_rtl = ( is_rtl() ) ? '-rtl' : ''; $css_ext = ( SCRIPT_DEBUG ) ? '.css' : '.min.css'; $css_uri = BSF_ANALYTICS_URI . '/assets/css/' . $dir_name . '/style' . $file_rtl . $css_ext; wp_enqueue_style( 'bsf-analytics-admin-style', $css_uri, false, BSF_ANALYTICS_VERSION, 'all' ); } /** * Send analytics API call. * * @since 1.0.0 */ public function send() { $api_url = BSF_Analytics_Helper::get_api_url(); wp_remote_post( $api_url . 'api/analytics/', array( 'body' => BSF_Analytics_Stats::instance()->get_stats(), 'timeout' => 5, 'blocking' => false, ) ); } /** * Check if usage tracking is enabled. * * @return bool * @since 1.0.0 */ public function is_tracking_enabled() { foreach ( $this->entities as $key => $data ) { $is_enabled = get_site_option( $key . '_analytics_optin' ) === 'yes' ? true : false; $is_enabled = $this->is_white_label_enabled( $key ) ? false : $is_enabled; if ( apply_filters( $key . '_tracking_enabled', $is_enabled ) ) { return true; } } return false; } /** * Check if WHITE label is enabled for BSF products. * * @param string $source source of analytics. * @return bool * @since 1.0.0 */ public function is_white_label_enabled( $source ) { $options = apply_filters( $source . '_white_label_options', array() ); $is_enabled = false; if ( is_array( $options ) ) { foreach ( $options as $option ) { if ( true === $option ) { $is_enabled = true; break; } } } return $is_enabled; } /** * Display admin notice for usage tracking. * * @since 1.0.0 */ public function option_notice() { if ( ! current_user_can( 'manage_options' ) ) { return; } foreach ( $this->entities as $key => $data ) { $time_to_display = isset( $data['time_to_display'] ) ? $data['time_to_display'] : '+24 hours'; $usage_doc_link = isset( $data['usage_doc_link'] ) ? $data['usage_doc_link'] : $this->usage_doc_link; // Don't display the notice if tracking is disabled or White Label is enabled for any of our plugins. if ( false !== get_site_option( $key . '_analytics_optin', false ) || $this->is_white_label_enabled( $key ) ) { continue; } // Show tracker consent notice after 24 hours from installed time. if ( strtotime( $time_to_display, $this->get_analytics_install_time( $key ) ) > time() ) { continue; } /* translators: %s product name */ $notice_string = sprintf( __( 'Want to help make %1s even more awesome? Allow us to collect non-sensitive diagnostic data and usage information. ' ), '<strong>' . esc_html( $data['product_name'] ) . '</strong>' ); if ( is_multisite() ) { $notice_string .= __( 'This will be applicable for all sites from the network.' ); } $language_dir = is_rtl() ? 'rtl' : 'ltr'; Astra_Notices::add_notice( array( 'id' => $key . '-optin-notice', 'type' => '', 'message' => sprintf( '<div class="notice-content"> <div class="notice-heading"> %1$s </div> <div class="astra-notices-container"> <a href="%2$s" class="astra-notices button-primary"> %3$s </a> <a href="%4$s" data-repeat-notice-after="%5$s" class="astra-notices button-secondary"> %6$s </a> </div> </div>', /* translators: %s usage doc link */ sprintf( $notice_string . '<span dir="%1s"><a href="%2s" target="_blank" rel="noreferrer noopener">%3s</a><span>', $language_dir, esc_url( $usage_doc_link ), __( ' Know More.' ) ), esc_url( add_query_arg( array( $key . '_analytics_optin' => 'yes', $key . '_analytics_nonce' => wp_create_nonce( $key . '_analytics_optin' ), 'bsf_analytics_source' => $key, ) ) ), __( 'Yes! Allow it' ), esc_url( add_query_arg( array( $key . '_analytics_optin' => 'no', $key . '_analytics_nonce' => wp_create_nonce( $key . '_analytics_optin' ), 'bsf_analytics_source' => $key, ) ) ), MONTH_IN_SECONDS, __( 'No Thanks' ) ), 'show_if' => true, 'repeat-notice-after' => false, 'priority' => 18, 'display-with-other-notices' => true, ) ); } } /** * Process usage tracking opt out. * * @since 1.0.0 */ public function handle_optin_optout() { if ( ! current_user_can( 'manage_options' ) ) { return; } $source = isset( $_GET['bsf_analytics_source'] ) ? sanitize_text_field( wp_unslash( $_GET['bsf_analytics_source'] ) ) : ''; if ( ! isset( $_GET[ $source . '_analytics_nonce' ] ) ) { return; } if ( ! wp_verify_nonce( sanitize_text_field( wp_unslash( $_GET[ $source . '_analytics_nonce' ] ) ), $source . '_analytics_optin' ) ) { return; } $optin_status = isset( $_GET[ $source . '_analytics_optin' ] ) ? sanitize_text_field( wp_unslash( $_GET[ $source . '_analytics_optin' ] ) ) : ''; if ( 'yes' === $optin_status ) { $this->optin( $source ); } elseif ( 'no' === $optin_status ) { $this->optout( $source ); } wp_safe_redirect( esc_url_raw( remove_query_arg( array( $source . '_analytics_optin', $source . '_analytics_nonce', 'bsf_analytics_source', ) ) ) ); } /** * Opt in to usage tracking. * * @param string $source source of analytics. * @since 1.0.0 */ private function optin( $source ) { update_site_option( $source . '_analytics_optin', 'yes' ); } /** * Opt out to usage tracking. * * @param string $source source of analytics. * @since 1.0.0 */ private function optout( $source ) { update_site_option( $source . '_analytics_optin', 'no' ); } /** * Load analytics stat class. * * @since 1.0.0 */ private function includes() { require_once __DIR__ . '/classes/class-bsf-analytics-helper.php'; require_once __DIR__ . '/class-bsf-analytics-stats.php'; // Loads all the modules. require_once __DIR__ . '/modules/deactivation-survey/classes/class-deactivation-survey-feedback.php'; require_once __DIR__ . '/modules/utm-analytics.php'; } /** * Register usage tracking option in General settings page. * * @since 1.0.0 */ public function register_usage_tracking_setting() { foreach ( $this->entities as $key => $data ) { if ( ! apply_filters( $key . '_tracking_enabled', true ) || $this->is_white_label_enabled( $key ) ) { return; } $usage_doc_link = isset( $data['usage_doc_link'] ) ? $data['usage_doc_link'] : $this->usage_doc_link; $author = isset( $data['author'] ) ? $data['author'] : 'Brainstorm Force'; register_setting( 'general', // Options group. $key . '_analytics_optin', // Option name/database. array( 'sanitize_callback' => array( $this, 'sanitize_option' ) ) // sanitize callback function. ); add_settings_field( $key . '-analytics-optin', // Field ID. __( 'Usage Tracking' ), // Field title. array( $this, 'render_settings_field_html' ), // Field callback function. 'general', 'default', // Settings page slug. array( 'type' => 'checkbox', 'title' => $author, 'name' => $key . '_analytics_optin', 'label_for' => $key . '-analytics-optin', 'id' => $key . '-analytics-optin', 'usage_doc_link' => $usage_doc_link, ) ); } } /** * Sanitize Callback Function * * @param bool $input Option value. * @since 1.0.0 */ public function sanitize_option( $input ) { if ( ! $input || 'no' === $input ) { return 'no'; } return 'yes'; } /** * Print settings field HTML. * * @param array $args arguments to field. * @since 1.0.0 */ public function render_settings_field_html( $args ) { ?> <fieldset> <label for="<?php echo esc_attr( $args['label_for'] ); ?>"> <input id="<?php echo esc_attr( $args['id'] ); ?>" type="checkbox" value="1" name="<?php echo esc_attr( $args['name'] ); ?>" <?php checked( get_site_option( $args['name'], 'no' ), 'yes' ); ?>> <?php /* translators: %s Product title */ echo esc_html( sprintf( __( 'Allow %s products to track non-sensitive usage tracking data.' ), $args['title'] ) );// phpcs:ignore WordPress.WP.I18n.NonSingularStringLiteralText if ( is_multisite() ) { esc_html_e( ' This will be applicable for all sites from the network.' ); } ?> </label> <?php echo wp_kses_post( sprintf( '<a href="%1s" target="_blank" rel="noreferrer noopener">%2s</a>', esc_url( $args['usage_doc_link'] ), __( 'Learn More.' ) ) ); ?> </fieldset> <?php } /** * Set analytics installed time in option. * * @param string $source source of analytics. * @return string $time analytics installed time. * @since 1.0.0 */ private function get_analytics_install_time( $source ) { $time = get_site_option( $source . '_analytics_installed_time' ); if ( ! $time ) { $time = time(); update_site_option( $source . '_analytics_installed_time', time() ); } return $time; } /** * Schedule/unschedule cron event on updation of option. * * @param string $old_value old value of option. * @param string $value value of option. * @param string $option Option name. * @since 1.0.0 */ public function update_analytics_option_callback( $old_value, $value, $option ) { if ( is_multisite() ) { $this->add_option_to_network( $option, $value ); } } /** * Analytics option add callback. * * @param string $option Option name. * @param string $value value of option. * @since 1.0.0 */ public function add_analytics_option_callback( $option, $value ) { if ( is_multisite() ) { $this->add_option_to_network( $option, $value ); } } /** * Send analaytics track event if tracking is enabled. * * @since 1.0.0 */ public function maybe_track_analytics() { if ( ! $this->is_tracking_enabled() ) { return; } $analytics_track = get_site_transient( 'bsf_analytics_track' ); // If the last data sent is 2 days old i.e. transient is expired. if ( ! $analytics_track ) { $this->send(); set_site_transient( 'bsf_analytics_track', true, 2 * DAY_IN_SECONDS ); } } /** * Save analytics option to network. * * @param string $option name of option. * @param string $value value of option. * @since 1.0.0 */ public function add_option_to_network( $option, $value ) { // If action coming from general settings page. if ( isset( $_POST['option_page'] ) && 'general' === $_POST['option_page'] ) { // phpcs:ignore WordPress.Security.NonceVerification.Missing if ( get_site_option( $option ) ) { update_site_option( $option, $value ); } else { add_site_option( $option, $value ); } } } /** * Function to load the deactivation survey form on the admin footer. * * This function checks if the Deactivation_Survey_Feedback class exists and if so, it loads the deactivation survey form. * The form is configured with specific settings for plugin. Example: For CartFlows, including the source, logo, plugin slug, title, support URL, description, and the screen on which to show the form. * * @since 1.1.6 * @return void */ public function load_deactivation_survey_form() { if ( class_exists( 'Deactivation_Survey_Feedback' ) ) { foreach ( $this->entities as $key => $data ) { // If the deactibation_survery info in available then only add the form. if ( ! empty( $data['deactivation_survey'] ) && is_array( $data['deactivation_survey'] ) ) { foreach ( $data['deactivation_survey'] as $key => $survey_args ) { Deactivation_Survey_Feedback::show_feedback_form( $survey_args ); } } } } } /** * Function to add plugin slugs to Deactivation Survey vars for JS operations. * * @param array $vars UDS vars array. * @return array Modified UDS vars array with plugin slugs. * @since 1.1.6 */ public function add_slugs_to_uds_vars( $vars ) { foreach ( $this->entities as $key => $data ) { if ( ! empty( $data['deactivation_survey'] ) && is_array( $data['deactivation_survey'] ) ) { foreach ( $data['deactivation_survey'] as $key => $survey_args ) { $vars['_plugin_slug'] = isset( $vars['_plugin_slug'] ) ? array_merge( $vars['_plugin_slug'], array( $survey_args['plugin_slug'] ) ) : array( $survey_args['plugin_slug'] ); } } } return $vars; } } } classes/class-bsf-analytics-helper.php 0000644 00000005443 15006204667 0014045 0 ustar 00 <?php /** * BSF analytics Helper Class File. * * @package bsf-analytics */ if ( ! defined( 'ABSPATH' ) ) { exit; // Exit if accessed directly. } if ( ! class_exists( 'BSF_Analytics_Helper' ) ) { /** * BSF analytics stat class. */ class BSF_Analytics_Helper { /** * Check is error in the received response. * * @param object $response Received API Response. * @return array $result Error result. */ public static function is_api_error( $response ) { $result = array( 'error' => false, 'error_message' => __( 'Oops! Something went wrong. Please refresh the page and try again.' ), 'error_code' => 0, ); if ( is_wp_error( $response ) ) { $result['error'] = true; $result['error_message'] = $response->get_error_message(); $result['error_code'] = $response->get_error_code(); } elseif ( ! empty( wp_remote_retrieve_response_code( $response ) ) && ! in_array( wp_remote_retrieve_response_code( $response ), array( 200, 201, 204 ), true ) ) { $result['error'] = true; $result['error_message'] = wp_remote_retrieve_response_message( $response ); $result['error_code'] = wp_remote_retrieve_response_code( $response ); } return $result; } /** * Get API headers * * @since 1.1.6 * @return array<string, string> */ public static function get_api_headers() { return array( 'Content-Type' => 'application/json', 'Accept' => 'application/json', ); } /** * Get API URL for sending analytics. * * @return string API URL. * @since 1.0.0 */ public static function get_api_url() { return defined( 'BSF_ANALYTICS_API_BASE_URL' ) ? BSF_ANALYTICS_API_BASE_URL : 'https://analytics.brainstormforce.com/'; } /** * Check if the current screen is allowed for the survey. * * This function checks if the current screen is one of the allowed screens for displaying the survey. * It uses the `get_current_screen` function to get the current screen information and compares it with the list of allowed screens. * * @since 1.1.6 * @return bool True if the current screen is allowed, false otherwise. */ public static function is_allowed_screen() { // This filter allows to dynamically modify the list of allowed screens for the survey. $allowed_screens = apply_filters( 'uds_survey_allowed_screens', array( 'plugins' ) ); $current_screen = get_current_screen(); // Check if $current_screen is a valid object before accessing its properties. if ( ! is_object( $current_screen ) ) { return false; // Return false if current screen is not valid. } $screen_id = $current_screen->id; if ( ! empty( $screen_id ) && in_array( $screen_id, $allowed_screens, true ) ) { return true; } return false; } } } modules/utm-analytics.php 0000644 00000011167 15006204667 0011533 0 ustar 00 <?php /** * UTM Analytics class * * @package bsf-analytics */ if ( ! defined( 'ABSPATH' ) ) { exit; // Exit if accessed directly. } if ( ! class_exists( 'BSF_UTM_Analytics' ) ) { if ( ! defined( 'BSF_UTM_ANALYTICS_REFERER' ) ) { define( 'BSF_UTM_ANALYTICS_REFERER', 'bsf_product_referers' ); } /** * UTM Analytics class * * @since 1.1.10 */ class BSF_UTM_Analytics { /** * List of slugs of all the bsf products that will be referer, referring another product. * * @var array<string> * @since 1.1.10 */ private static $bsf_product_slugs = [ 'all-in-one-schemaorg-rich-snippets', 'astra', 'astra-portfolio', 'astra-sites', 'bb-ultimate-addon', 'cartflows', 'checkout-paypal-woo', 'checkout-plugins-stripe-woo', 'convertpro', 'header-footer-elementor', 'latepoint', 'presto-player', 'surecart', 'sureforms', 'suremails', 'suretriggers', 'ultimate-addons-for-beaver-builder-lite', 'ultimate-addons-for-gutenberg', 'ultimate-elementor', 'variation-swatches-woo', 'woo-cart-abandonment-recovery', 'wp-schema-pro', 'zipwp', ]; /** * This function will help to determine if provided slug is a valid bsf product or not, * This way we will maintain consistency through out all our products. * * @param string $slug unique slug of the product which can be used for referer, product. * @since 1.1.10 * @return boolean */ public static function is_valid_bsf_product_slug( $slug ) { if ( empty( $slug ) || ! is_string( $slug ) ) { return false; } return in_array( $slug, self::$bsf_product_slugs, true ); } /** * This function updates value of referer and product in option * bsf_product_referer in form of key value pair as 'product' => 'referer' * * @param string $referer slug of the product which is refering another product. * @param string $product slug of the product which is refered. * @since 1.1.10 * @return void */ public static function update_referer( $referer, $product ) { $slugs = [ 'referer' => $referer, 'product' => $product, ]; $error_count = 0; foreach ( $slugs as $type => $slug ) { if ( ! self::is_valid_bsf_product_slug( $slug ) ) { error_log( sprintf( 'Invalid %1$s slug provided "%2$s", does not match bsf_product_slugs', $type, $slug ) ); // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_error_log -- adding logs in case of failure will help in debugging. $error_count++; } } if ( $error_count > 0 ) { return; } $slugs = array_map( 'sanitize_text_field', $slugs ); $bsf_product_referers = get_option( BSF_UTM_ANALYTICS_REFERER, [] ); if ( ! is_array( $bsf_product_referers ) ) { $bsf_product_referers = []; } $bsf_product_referers[ $slugs['product'] ] = $slugs['referer']; update_option( BSF_UTM_ANALYTICS_REFERER, $bsf_product_referers ); } /** * This function will add utm_args to pro link or purchase link * added utm_source by default additional utm_args such as utm_medium etc can be provided to generate location specific links * * @param string $link Ideally this should be product site link where utm_params can be tracked. * @param string $product Product slug whose utm_link need to be created. * @param mixed $utm_args additional args to be passed ex: [ 'utm_medium' => 'dashboard']. * @since 1.1.10 * @return string */ public static function get_utm_ready_link( $link, $product, $utm_args = [] ) { if ( false === wp_http_validate_url( $link ) ) { error_log( 'Invalid url passed to get_utm_ready_link function' ); // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_error_log -- adding logs in case of failure will help in debugging. return $link; } if ( empty( $product ) || ! is_string( $product ) || ! self::is_valid_bsf_product_slug( $product ) ) { error_log( sprintf( 'Invalid product slug provided "%1$s", does not match bsf_product_slugs', $product ) ); // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_error_log -- adding logs in case of failure will help in debugging. return $link; } $bsf_product_referers = get_option( BSF_UTM_ANALYTICS_REFERER, [] ); if ( ! is_array( $bsf_product_referers ) || empty( $bsf_product_referers[ $product ] ) ) { return $link; } if ( ! self::is_valid_bsf_product_slug( $bsf_product_referers[ $product ] ) ) { return $link; } if ( ! is_array( $utm_args ) ) { $utm_args = []; } $utm_args['utm_source'] = $bsf_product_referers[ $product ]; $link = add_query_arg( $utm_args, $link ); return $link; } } } modules/deactivation-survey/classes/class-deactivation-survey-feedback.php 0000644 00000025132 15006204667 0023232 0 ustar 00 <?php /** * Deactivation Survey Feedback. * * @package bsf-analytics */ // Exit if accessed directly. if ( ! defined( 'ABSPATH' ) ) { exit; } if ( ! class_exists( 'Deactivation_Survey_Feedback' ) ) { /** * Class Deactivation_Survey_Feedback. */ class Deactivation_Survey_Feedback { /** * Feedback URL. * * @var string */ private static $feedback_api_endpoint = 'api/plugin-deactivate'; /** * Instance * * @access private * @var object Class object. * @since 1.1.6 */ private static $instance; /** * Initiator * * @since 1.1.6 * @return object initialized object of class. */ public static function get_instance() { if ( ! isset( self::$instance ) ) { self::$instance = new self(); } return self::$instance; } /** * Constructor */ public function __construct() { add_action( 'admin_enqueue_scripts', array( $this, 'load_form_styles' ) ); add_action( 'wp_ajax_uds_plugin_deactivate_feedback', array( $this, 'send_plugin_deactivate_feedback' ) ); } /** * Render feedback HTML on plugins.php admin page only. * * This function renders the feedback form HTML on the plugins.php admin page. * It takes an optional string parameter $id for the form wrapper ID and an optional array parameter $args for customizing the form. * * @since 1.1.6 * @param array $args Optional. Custom arguments for the form. Defaults to an empty array. * @return void */ public static function show_feedback_form( array $args = array() ) { // Return if not in admin. if ( ! is_admin() ) { return; } // Set default arguments for the feedback form. $defaults = array( 'source' => 'User Deactivation Survey', 'popup_logo' => '', 'plugin_slug' => 'user-deactivation-survey', 'plugin_version' => '', 'popup_title' => __( 'Quick Feedback' ), 'support_url' => 'https://brainstormforce.com/contact/', 'popup_reasons' => self::get_default_reasons(), 'popup_description' => __( 'If you have a moment, please share why you are deactivating the plugin.' ), 'show_on_screens' => array( 'plugins' ), ); // Parse the arguments with defaults. $args = wp_parse_args( $args, $defaults ); $id = ''; // Set a default ID if none is provided. if ( empty( $args['id'] ) ) { $id = 'uds-feedback-form--wrapper'; } $id = sanitize_text_field( $args['id'] ); // Return if not on the allowed screen. if ( ! BSF_Analytics_Helper::is_allowed_screen() ) { return; } ?> <div id="<?php echo esc_attr( $id ); ?>" class="uds-feedback-form--wrapper" style="display: none"> <div class="uds-feedback-form--container"> <div class="uds-form-header--wrapper"> <div class="uds-form-title--icon-wrapper"> <?php if ( ! empty( $args['popup_logo'] ) ) { ?> <img class="uds-icon" src="<?php echo esc_url( $args['popup_logo'] ); ?>" title="<?php echo esc_attr( $args['plugin_slug'] ); ?> <?php echo esc_attr( __( 'Icon' ) ); ?>" /> <?php } ?> <h2 class="uds-title"><?php echo esc_html( $args['popup_title'] ); ?></h2> </div> <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="uds-close"> <path stroke-linecap="round" stroke-linejoin="round" d="M6 18 18 6M6 6l12 12" /> </svg> </div> <div class="uds-form-body--content"> <?php if ( ! empty( $args['popup_description'] ) ) { ?> <p class="uds-form-description"><?php echo esc_html( $args['popup_description'] ); ?></p> <?php } ?> <form class="uds-feedback-form" id="uds-feedback-form" method="post"> <?php foreach ( $args['popup_reasons'] as $key => $value ) { ?> <fieldset> <div class="reason"> <input type="radio" class="uds-reason-input" name="uds_reason_input" id="uds_reason_input_<?php echo esc_attr( $key ); ?>" value="<?php echo esc_attr( $key ); ?>" data-placeholder="<?php echo esc_attr( $value['placeholder'] ); ?>" data-show_cta="<?php echo esc_attr( $value['show_cta'] ); ?>" data-accept_feedback="<?php echo esc_attr( $value['accept_feedback'] ); ?>"> <label class="uds-reason-label" for="uds_reason_input_<?php echo esc_attr( $key ); ?>"><?php echo esc_html( $value['label'] ); ?></label> </div> </fieldset> <?php } ?> <fieldset> <textarea class="uds-options-feedback hide" id="uds-options-feedback" rows="3" name="uds_options_feedback" placeholder="<?php echo esc_attr( __( 'Please tell us more details.' ) ); ?>"></textarea> <?php if ( ! empty( $args['support_url'] ) ) { ?> <p class="uds-option-feedback-cta hide"> <?php echo wp_kses_post( sprintf( /* translators: %1$s: link html start, %2$s: link html end*/ __( 'Need help from our experts? %1$sClick here to contact us.%2$s' ), '<a href="' . esc_url( $args['support_url'] ) . '" target="_blank">', '</a>' ) ); ?> </p> <?php } ?> </fieldset> <div class="uds-feedback-form-sumbit--actions"> <button class="button button-primary uds-feedback-submit" data-action="submit"><?php esc_html_e( 'Submit & Deactivate' ); ?></button> <button class="button button-secondary uds-feedback-skip" data-action="skip"><?php esc_html_e( 'Skip & Deactivate' ); ?></button> <input type="hidden" name="referer" value="<?php echo esc_url( get_site_url() ); ?>"> <input type="hidden" name="version" value="<?php echo esc_attr( $args['plugin_version'] ); ?>"> <input type="hidden" name="source" value="<?php echo esc_attr( $args['plugin_slug'] ); ?>"> </div> </form> </div> </div> </div> <?php } /** * Load form styles. * * This function loads the necessary styles for the feedback form. * * @since 1.1.6 * @return void */ public static function load_form_styles() { if ( ! BSF_Analytics_Helper::is_allowed_screen() ) { return; } $dir_path = BSF_ANALYTICS_URI . '/modules/deactivation-survey/'; $file_ext = ! SCRIPT_DEBUG ? '.min' : ''; wp_enqueue_script( 'uds-feedback-script', $dir_path . 'assets/js/feedback' . $file_ext . '.js', array( 'jquery' ), BSF_ANALYTICS_VERSION, true ); $data = apply_filters( 'uds_survey_vars', array( 'ajaxurl' => esc_url( admin_url( 'admin-ajax.php' ) ), '_ajax_nonce' => wp_create_nonce( 'uds_plugin_deactivate_feedback' ), '_current_theme' => function_exists( 'wp_get_theme' ) ? wp_get_theme()->get_template() : '', '_plugin_slug' => array(), ) ); // Add localize JS. wp_localize_script( 'uds-feedback-script', 'udsVars', $data ); wp_enqueue_style( 'uds-feedback-style', $dir_path . 'assets/css/feedback' . $file_ext . '.css', array(), BSF_ANALYTICS_VERSION ); wp_style_add_data( 'uds-feedback-style', 'rtl', 'replace' ); } /** * Sends plugin deactivation feedback to the server. * * This function checks the user's permission and verifies the nonce for the request. * If the checks pass, it sends the feedback data to the server for processing. * * @return void */ public function send_plugin_deactivate_feedback() { $response_data = array( 'message' => __( 'Sorry, you are not allowed to do this operation.' ) ); /** * Check permission */ if ( ! current_user_can( 'manage_options' ) ) { wp_send_json_error( $response_data ); } /** * Nonce verification */ if ( ! check_ajax_referer( 'uds_plugin_deactivate_feedback', 'security', false ) ) { $response_data = array( 'message' => __( 'Nonce validation failed' ) ); wp_send_json_error( $response_data ); } $feedback_data = array( 'reason' => isset( $_POST['reason'] ) ? sanitize_text_field( wp_unslash( $_POST['reason'] ) ) : '', 'feedback' => isset( $_POST['feedback'] ) ? sanitize_text_field( wp_unslash( $_POST['feedback'] ) ) : '', 'domain_name' => isset( $_POST['referer'] ) ? sanitize_text_field( wp_unslash( $_POST['referer'] ) ) : '', 'version' => isset( $_POST['version'] ) ? sanitize_text_field( wp_unslash( $_POST['version'] ) ) : '', 'plugin' => isset( $_POST['source'] ) ? sanitize_text_field( wp_unslash( $_POST['source'] ) ) : '', ); $api_args = array( 'body' => wp_json_encode( $feedback_data ), 'headers' => BSF_Analytics_Helper::get_api_headers(), 'timeout' => 90, //phpcs:ignore WordPressVIPMinimum.Performance.RemoteRequestTimeout.timeout_timeout ); $target_url = BSF_Analytics_Helper::get_api_url() . self::$feedback_api_endpoint; $response = wp_safe_remote_post( $target_url, $api_args ); $has_errors = BSF_Analytics_Helper::is_api_error( $response ); if ( $has_errors['error'] ) { wp_send_json_error( array( 'success' => false, 'message' => $has_errors['error_message'], ) ); } wp_send_json_success(); } /** * Get the array of default reasons. * * @return array Default reasons. */ public static function get_default_reasons() { return apply_filters( 'uds_default_deactivation_reasons', array( 'temporary_deactivation' => array( 'label' => esc_html__( 'This is a temporary deactivation for testing.' ), 'placeholder' => esc_html__( 'How can we assist you?' ), 'show_cta' => 'false', 'accept_feedback' => 'false', ), 'plugin_not_working' => array( 'label' => esc_html__( 'The plugin isn\'t working properly.' ), 'placeholder' => esc_html__( 'Please tell us more about what went wrong?' ), 'show_cta' => 'true', 'accept_feedback' => 'true', ), 'found_better_plugin' => array( 'label' => esc_html__( 'I found a better alternative plugin.' ), 'placeholder' => esc_html__( 'Could you please specify which plugin?' ), 'show_cta' => 'false', 'accept_feedback' => 'true', ), 'missing_a_feature' => array( 'label' => esc_html__( 'It\'s missing a specific feature.' ), 'placeholder' => esc_html__( 'Please tell us more about the feature.' ), 'show_cta' => 'false', 'accept_feedback' => 'true', ), 'other' => array( 'label' => esc_html__( 'Other' ), 'placeholder' => esc_html__( 'Please tell us more details.' ), 'show_cta' => 'false', 'accept_feedback' => 'true', ), ) ); } } Deactivation_Survey_Feedback::get_instance(); } modules/deactivation-survey/assets/js/feedback.min.js 0000644 00000006162 15006204667 0017016 0 ustar 00 (i=>{let t={slug:"",skipButton:"",formWrapper:"",radioButton:"",closeButton:"",buttonAction:"",feedbackForm:"",feedbackInput:"",deactivateUrl:"",buttonTrigger:"",deactivateButton:"",submitDeactivate:"",_cacheElements(){this.slug=udsVars?._plugin_slug||"",this.skipButton=i(".uds-feedback-skip"),this.submitDeactivate=i(".uds-feedback-submit"),this.deactivateButton=i("#the-list").find(".row-actions span.deactivate a"),this.feedbackForm=i(".uds-feedback-form"),this.feedbackInput=i(".uds-options-feedback"),this.formWrapper=i(".uds-feedback-form--wrapper"),this.closeButton=i(".uds-feedback-form--wrapper .uds-close"),this.radioButton=i(".uds-reason-input")},_showPopup(t){i("#deactivation-survey-"+t).addClass("show_popup")},_hidePopup(){this.formWrapper.removeClass("show_popup")},_redirectOrReload(){this.deactivateUrl?window.location.href=this.deactivateUrl:location.reload()},_hideShowFeedbackAndCTA(t){var e="true"===i(t.target).attr("data-accept_feedback"),a="true"===i(t.target).attr("data-show_cta");i(t.target).closest(this.formWrapper).find(".uds-options-feedback").removeClass("hide").addClass(e?"show":"hide"),i(t.target).closest(this.formWrapper).find(".uds-option-feedback-cta").removeClass("hide").addClass(a?"show":"hide")},_changePlaceholderText(t){var e=t.target.getAttribute("data-placeholder");i(t.target).closest(this.formWrapper).find(this.feedbackInput).attr("placeholder",e||""),this._hideShowFeedbackAndCTA(t)},_submitFeedback(t,s){t.preventDefault();var t=i(t.target),e=t.closest(this.feedbackForm),e={action:"uds_plugin_deactivate_feedback",security:udsVars?._ajax_nonce||"",reason:e.find(this.radioButton.filter(":checked")).val()||"",source:e.find('input[name="source"]').val()||"",referer:e.find('input[name="referer"]').val()||"",version:e.find('input[name="version"]').val()||"",feedback:e.find(this.feedbackInput).val()||""};t.find(".uds-feedback-"+this.buttonAction).text("Deactivating.").addClass("processing"),i.ajax({url:udsVars?.ajaxurl,type:"POST",data:e,success(t){t.success&&s._redirectOrReload(),s._hidePopup()},error(t,e,a){s._redirectOrReload()}})},_handleClick(t){t.target.classList.contains("show_popup")&&t.target.closest(".uds-feedback-form--wrapper")?this._hidePopup():t.target.classList.contains("activate")&&(this.deactivateUrl=t.target.href,-1===this.deactivateUrl.indexOf(`stylesheet=${udsVars?._current_theme}-child`))&&(t.preventDefault(),this._showPopup(udsVars?._current_theme))},_init(){this._cacheElements(),this._bind()},_bind(){let a=this;this.deactivateButton.on("click",function(t){var e=i(t.target).closest("tr").data("slug");a.slug.includes(e)&&(t.preventDefault(),a.deactivateUrl=i(t.target).attr("href"),a._showPopup(e))}),this.closeButton.on("click",function(t){t.preventDefault(),a._hidePopup()}),this.radioButton.on("click",function(t){a._changePlaceholderText(t)}),this.submitDeactivate.add(this.skipButton).on("click",function(t){t.preventDefault(),a.buttonAction=i(t.target).attr("data-action"),i(t.target).closest(a.feedbackForm).submit()}),this.feedbackForm.on("submit",function(t){a._submitFeedback(t,a)}),document.addEventListener("click",function(t){a._handleClick(t)})}};i(function(){t._init()})})(jQuery); modules/deactivation-survey/assets/js/feedback.js 0000644 00000015237 15006204667 0016237 0 ustar 00 ( function ( $ ) { const UserDeactivationPopup = { slug: '', skipButton: '', formWrapper: '', radioButton: '', closeButton: '', buttonAction: '', feedbackForm: '', feedbackInput: '', deactivateUrl: '', buttonTrigger: '', deactivateButton: '', submitDeactivate: '', /** * Caches elements for later use. */ _cacheElements() { this.slug = udsVars?._plugin_slug || ''; this.skipButton = $( '.uds-feedback-skip' ); this.submitDeactivate = $( '.uds-feedback-submit' ); this.deactivateButton = $( '#the-list' ).find( `.row-actions span.deactivate a` ); this.feedbackForm = $( '.uds-feedback-form' ); // Feedback Form. this.feedbackInput = $( '.uds-options-feedback' ); // Feedback Textarea. this.formWrapper = $( '.uds-feedback-form--wrapper' ); this.closeButton = $( '.uds-feedback-form--wrapper .uds-close' ); this.radioButton = $( '.uds-reason-input' ); }, /** * Shows the feedback popup by adding the 'show' class to the form wrapper. * * @param {string} slug - The slug of the plugin. */ _showPopup( slug ) { $( `#deactivation-survey-${ slug }` ).addClass( 'show_popup' ); }, /** * Hides the feedback popup by removing the 'show' class from the form wrapper. */ _hidePopup() { this.formWrapper.removeClass( 'show_popup' ); }, /** * Redirects to the deactivate URL if it exists, otherwise reloads the current page. */ _redirectOrReload() { if ( this.deactivateUrl ) { window.location.href = this.deactivateUrl; } else { location.reload(); } }, /** * Toggles the visibility of the feedback form and CTA based on the event target's attributes. * * @param {Event} event - The event that triggered this function. */ _hideShowFeedbackAndCTA( event ) { const acceptFeedback = $( event.target ).attr( 'data-accept_feedback' ) === 'true'; const showCta = $( event.target ).attr( 'data-show_cta' ) === 'true'; $( event.target ) .closest( this.formWrapper ) .find( '.uds-options-feedback' ) .removeClass( 'hide' ) .addClass( acceptFeedback ? 'show' : 'hide' ); $( event.target ) .closest( this.formWrapper ) .find( '.uds-option-feedback-cta' ) .removeClass( 'hide' ) .addClass( showCta ? 'show' : 'hide' ); }, /** * Changes the placeholder text of the feedback input based on the event target's attribute. * * @param {Event} event - The event that triggered this function. */ _changePlaceholderText( event ) { const radioButtonPlaceholder = event.target.getAttribute( 'data-placeholder' ); $( event.target ) .closest( this.formWrapper ) .find( this.feedbackInput ) .attr( 'placeholder', radioButtonPlaceholder || '' ); this._hideShowFeedbackAndCTA( event ); }, /** * Submits the feedback form and handles the response. * * @param {Event} event - The event that triggered this function. * @param {Object} self - A reference to the current object. */ _submitFeedback( event, self ) { event.preventDefault(); const currentForm = $( event.target ); const closestForm = currentForm.closest( this.feedbackForm ); // Cache the closest form // Gather form data. const formData = { action: 'uds_plugin_deactivate_feedback', security: udsVars?._ajax_nonce || '', reason: closestForm .find( this.radioButton.filter( ':checked' ) ) .val() || '', // Get the selected radio button value from the current form. source: closestForm.find( 'input[name="source"]' ).val() || '', referer: closestForm.find( 'input[name="referer"]' ).val() || '', version: closestForm.find( 'input[name="version"]' ).val() || '', feedback: closestForm.find( this.feedbackInput ).val() || '', // Get the feedback input value from the current form. }; currentForm .find( '.uds-feedback-' + this.buttonAction ) .text( 'Deactivating.' ) .addClass( 'processing' ); // Prepare AJAX call. $.ajax( { url: udsVars?.ajaxurl, // URL to send the request to. type: 'POST', // HTTP method. data: formData, // Data to be sent. success( response ) { if ( response.success ) { self._redirectOrReload(); } self._hidePopup(); }, /* eslint-disable */ error( xhr, status, error ) { /* eslint-disable */ self._redirectOrReload(); }, } ); }, _handleClick( e ) { // Close feedback form or show/hide popup if clicked outside and add a click on a Activate button of Theme. if ( e.target.classList.contains( 'show_popup' ) && e.target.closest( '.uds-feedback-form--wrapper' ) ) { this._hidePopup(); } else if ( e.target.classList.contains( 'activate' ) ) { this.deactivateUrl = e.target.href; // Don't show for Child Themes. if ( -1 !== this.deactivateUrl.indexOf( `stylesheet=${ udsVars?._current_theme }-child` ) ) { return; } e.preventDefault(); this._showPopup( udsVars?._current_theme ); } }, /** * Initializes the feedback popup by caching elements and binding events. */ _init() { this._cacheElements(); this._bind(); }, /** * Binds event listeners to various elements to handle user interactions. */ _bind() { const self = this; // Store reference to the current object. // Open the popup when clicked on the deactivate button. this.deactivateButton.on( 'click', function ( event ) { let closestTr = $( event.target ).closest( 'tr' ); let slug = closestTr.data( 'slug' ); if ( self.slug.includes( slug ) ) { event.preventDefault(); // Set the deactivation URL. self.deactivateUrl = $( event.target ).attr( 'href' ); self._showPopup( slug ); } } ); // Close the popup on a click of Close button. this.closeButton.on( 'click', function ( event ) { event.preventDefault(); self._hidePopup(); // Use self to refer to the UserDeactivationPopup instance. } ); // Click event on radio button to change the placeholder of textarea. this.radioButton.on( 'click', function ( event ) { self._changePlaceholderText( event ); } ); // Combined submit and skip button actions. this.submitDeactivate .add( this.skipButton ) .on( 'click', function ( event ) { event.preventDefault(); // Prevent default button action. self.buttonAction = $( event.target ).attr( 'data-action' ); $( event.target ).closest( self.feedbackForm ).submit(); } ); this.feedbackForm.on( 'submit', function ( event ) { self._submitFeedback( event, self ); } ); document.addEventListener( 'click', function ( e ) { self._handleClick( e ); } ); }, }; $( function () { UserDeactivationPopup._init(); } ); } )( jQuery ); modules/deactivation-survey/assets/css/feedback.min.css 0000644 00000011663 15006204667 0017350 0 ustar 00 .uds-feedback-form--wrapper h2,.uds-feedback-form--wrapper input[type=radio],.uds-feedback-form--wrapper p{margin:0;padding:0}.uds-feedback-form--wrapper .show{display:block}.uds-feedback-form--wrapper .hide{display:none}.uds-feedback-form--wrapper{align-items:center;background-color:rgba(0,0,0,.75);bottom:0;display:none;justify-content:center;left:0;position:fixed;right:0;top:0;user-select:none;z-index:-9999}.uds-feedback-form--wrapper.show_popup{display:flex!important;z-index:99999}.uds-feedback-form--wrapper .uds-feedback-form--container{background-color:#fff;border-radius:8px;box-shadow:4px 4px 24px rgba(0,0,0,.25);max-width:90%;width:540px}.uds-feedback-form--container .uds-form-header--wrapper{align-items:center;display:flex;justify-content:space-between;padding:16px 20px 0}.uds-feedback-form--container .uds-form-title--icon-wrapper{display:flex;align-items:center;gap:12px}.uds-feedback-form--container .uds-form-header--wrapper .uds-close,.uds-feedback-form--container .uds-form-title--icon-wrapper .uds-icon{width:20px;height:20px}.uds-feedback-form--container .uds-form-title--icon-wrapper .uds-title{color:#1f2937;font-size:16px;font-weight:600;line-height:24px;text-align:left}.uds-feedback-form--container .uds-form-header--wrapper .uds-close{color:#9ca3af;cursor:pointer}.uds-feedback-form--container .uds-form-header--wrapper .uds-close:hover{color:#4b5563}.uds-feedback-form--container .uds-form-body--content{padding:20px 20px 0 20px;display:flex;flex-direction:column;gap:20px}.uds-feedback-form--container .uds-form-body--content .uds-form-description{color:#1f2937;font-size:16px;font-weight:500;line-height:24px;text-align:left}.uds-feedback-form--container .uds-form-body--content #uds-feedback-form .reason{display:flex;align-items:center;gap:12px;margin-bottom:12px}.uds-feedback-form--container .uds-form-body--content #uds-feedback-form .uds-options-feedback{color:#6b7280;font-size:14px;font-weight:400;line-height:20px;text-align:left;width:100%;padding:9px 13px;border-radius:6px;border-width:1px;border-style:solid;border-color:#e5e7eb;box-shadow:0 1px 2px 0 #0000000d;background:#fff}.uds-feedback-form--container .uds-form-body--content #uds-feedback-form .uds-options-feedback:active,.uds-feedback-form--container .uds-form-body--content #uds-feedback-form .uds-options-feedback:focus,.uds-feedback-form--container .uds-form-body--content #uds-feedback-form .uds-options-feedback:hover{border-color:#d1d5db}.uds-feedback-form--container .uds-form-body--content #uds-feedback-form .uds-option-feedback-cta{color:#4b5563;margin-top:10px;font-size:13px;font-weight:400;line-height:20px;text-align:left}.uds-feedback-form--container .uds-form-body--content #uds-feedback-form .uds-option-feedback-cta a{text-decoration:none;color:#006ba1}.uds-feedback-form--container .uds-form-body--content #uds-feedback-form .uds-options-feedback::placeholder{font-size:14px;font-weight:400;line-height:20px;text-align:left;color:#6b7280;opacity:1}.uds-feedback-form--container .uds-form-body--content .uds-feedback-form-sumbit--actions{display:flex;align-items:center;justify-content:space-between;padding:16px 20px;background-color:#f6f7f7;border-top:1px solid #e1e1e1;margin:40px -20px 0;border-bottom-left-radius:8px;border-bottom-right-radius:8px}.uds-feedback-form--container .uds-form-body--content .uds-feedback-form-sumbit--actions .button{padding:7px 13px;border-radius:3px;border-width:1px;font-size:14px;font-weight:400;line-height:20px;text-align:left;border-style:solid;display:flex;gap:8px;align-items:center}.uds-feedback-form--container .uds-form-body--content .uds-feedback-form-sumbit--actions .button:focus{outline:0;box-shadow:none}.uds-feedback-form--container .uds-form-body--content .uds-feedback-form-sumbit--actions .button.processing{pointer-events:none;opacity:.8}.uds-feedback-form--container .uds-form-body--content .uds-feedback-form-sumbit--actions .button.processing::before{content:"\f463";animation:spin 2s linear infinite;font-family:dashicons,sans-serif;font-weight:400;font-size:18px;cursor:pointer}.uds-feedback-form--container .uds-form-body--content #uds-feedback-form .uds-reason-label{font-size:14px;font-weight:400;line-height:20px;text-align:left}.uds-feedback-form--container .uds-form-body--content #uds-feedback-form input[type=radio]{display:flex;justify-content:center;height:18px;width:18px;cursor:pointer;margin:0;border:1px solid #d1d5db;border-radius:50%;line-height:0;box-shadow:inset 0 1px 2px rgb(0 0 0 / 10%);transition:50ms border-color ease-in-out;-webkit-appearance:none;padding:0}.uds-feedback-form--container .uds-form-body--content #uds-feedback-form input[type=radio]:checked{vertical-align:middle;background-color:#006ba1}.uds-feedback-form--container .uds-form-body--content #uds-feedback-form input[type=radio]:checked::before{background-color:#fff!important;border-radius:50px;content:"\2022";font-size:24px;height:6px;line-height:13px;margin:5px;text-indent:-9999px;width:6px}@keyframes spin{0%{transform:rotate(0)}100%{transform:rotate(360deg)}} modules/deactivation-survey/assets/css/feedback-rtl.css 0000644 00000025017 15006204667 0017363 0 ustar 00 /* Base CSS to normalize the default. */ .uds-feedback-form--wrapper h2, .uds-feedback-form--wrapper p, .uds-feedback-form--wrapper input[type="radio"] { margin: 0; padding: 0; } .uds-feedback-form--wrapper .show { display: block; } .uds-feedback-form--wrapper .hide { display: none; } .uds-feedback-form--wrapper { align-items: center; background-color: rgba( 0, 0, 0, 0.75 ); bottom: 0; display: none; justify-content: center; right: 0; position: fixed; left: 0; top: 0; user-select: none; z-index: -9999; } .uds-feedback-form--wrapper.show_popup { display: flex !important; z-index: 99999; } .uds-feedback-form--wrapper .uds-feedback-form--container { background-color: #fff; border-radius: 8px; box-shadow: -4px 4px 24px rgba( 0, 0, 0, 0.25 ); max-width: 90%; width: 540px; } .uds-feedback-form--container .uds-form-header--wrapper { align-items: center; display: flex; justify-content: space-between; padding: 16px 20px 0; } .uds-feedback-form--container .uds-form-title--icon-wrapper { display: flex; align-items: center; gap: 12px; } .uds-feedback-form--container .uds-form-title--icon-wrapper .uds-icon, .uds-feedback-form--container .uds-form-header--wrapper .uds-close { width: 20px; height: 20px; } .uds-feedback-form--container .uds-form-title--icon-wrapper .uds-title { color: #1f2937; font-size: 16px; font-weight: 600; line-height: 24px; text-align: right; } .uds-feedback-form--container .uds-form-header--wrapper .uds-close { color: #9ca3af; cursor: pointer; } .uds-feedback-form--container .uds-form-header--wrapper .uds-close:hover { color: #4b5563; } .uds-feedback-form--container .uds-form-body--content { padding: 20px 20px 0 20px; display: flex; flex-direction: column; gap: 20px; } .uds-feedback-form--container .uds-form-body--content .uds-form-description { color: #1f2937; font-size: 16px; font-weight: 500; line-height: 24px; text-align: right; } .uds-feedback-form--container .uds-form-body--content #uds-feedback-form .reason { display: flex; align-items: center; gap: 12px; margin-bottom: 12px; } .uds-feedback-form--container .uds-form-body--content #uds-feedback-form .uds-options-feedback { color: #6b7280; font-size: 14px; font-weight: 400; line-height: 20px; text-align: right; width: 100%; padding: 9px 13px; border-radius: 6px; border-width: 1px; border-style: solid; border-color: #e5e7eb; box-shadow: 0 1px 2px 0 #0000000d; background: #fff; } .uds-feedback-form--container .uds-form-body--content #uds-feedback-form .uds-options-feedback:hover, .uds-feedback-form--container .uds-form-body--content #uds-feedback-form .uds-options-feedback:focus, .uds-feedback-form--container .uds-form-body--content #uds-feedback-form .uds-options-feedback:active { border-color: #d1d5db; } .uds-feedback-form--container .uds-form-body--content #uds-feedback-form .uds-option-feedback-cta { color: #4b5563; margin-top: 10px; font-size: 13px; font-weight: 400; line-height: 20px; text-align: right; } .uds-feedback-form--container .uds-form-body--content #uds-feedback-form .uds-option-feedback-cta a { text-decoration: none; color: #006ba1; } .uds-feedback-form--container .uds-form-body--content #uds-feedback-form .uds-options-feedback::placeholder { font-size: 14px; font-weight: 400; line-height: 20px; text-align: right; color: #6b7280; opacity: 1; } .uds-feedback-form--container .uds-form-body--content .uds-feedback-form-sumbit--actions { display: flex; align-items: center; justify-content: space-between; padding: 16px 20px; background-color: #f6f7f7; border-top: 1px solid #e1e1e1; margin: 40px -20px 0; border-bottom-right-radius: 8px; border-bottom-left-radius: 8px; } .uds-feedback-form--container .uds-form-body--content .uds-feedback-form-sumbit--actions .button { padding: 7px 13px; border-radius: 3px; border-width: 1px; font-size: 14px; font-weight: 400; line-height: 20px; text-align: right; border-style: solid; display: flex; gap: 8px; align-items: center; } .uds-feedback-form--container .uds-form-body--content .uds-feedback-form-sumbit--actions .button:focus { outline: none; box-shadow: none; } .uds-feedback-form--container .uds-form-body--content .uds-feedback-form-sumbit--actions .button.processing { pointer-events: none; opacity: 0.8; } .uds-feedback-form--container .uds-form-body--content .uds-feedback-form-sumbit--actions .button.processing::before { content: "\f463"; animation: spin 2s linear infinite; font-family: dashicons, sans-serif; font-weight: 400; font-size: 18px; cursor: pointer; } .uds-feedback-form--container .uds-form-body--content #uds-feedback-form .uds-reason-label { font-size: 14px; font-weight: 400; line-height: 20px; text-align: right; } .uds-feedback-form--container .uds-form-body--content #uds-feedback-form input[type="radio"] { display: flex; justify-content: center; height: 18px; width: 18px; cursor: pointer; margin: 0; border: 1px solid #d1d5db; border-radius: 50%; line-height: 0; box-shadow: inset 0 1px 2px rgb( 0 0 0 / 10% ); transition: 0.05s border-color ease-in-out; -webkit-appearance: none; padding: 0; } .uds-feedback-form--container .uds-form-body--content #uds-feedback-form input[type="radio"]:checked { vertical-align: middle; background-color: #006ba1; } .uds-feedback-form--container .uds-form-body--content #uds-feedback-form input[type="radio"]:checked::before { background-color: #fff !important; border-radius: 50px; content: "\2022"; font-size: 24px; height: 6px; line-height: 13px; margin: 5px; text-indent: -9999px; width: 6px; } @keyframes spin { 0% { transform: rotate( 0deg ); } 100% { transform: rotate( -360deg ); } } ,.uds-feedback-form--wrapper h2,.uds-feedback-form--wrapper input[type=radio],.uds-feedback-form--wrapper p{margin:0;padding:0}.uds-feedback-form--wrapper .show{display:block}.uds-feedback-form--wrapper .hide{display:none}.uds-feedback-form--wrapper{align-items:center;background-color:rgba(0,0,0,.75);bottom:0;display:none;justify-content:center;right:0;position:fixed;left:0;top:0;user-select:none;z-index:-9999}.uds-feedback-form--wrapper.show_popup{display:flex!important;z-index:99999}.uds-feedback-form--wrapper .uds-feedback-form--container{background-color:#fff;border-radius:8px;box-shadow:-4px 4px 24px rgba(0,0,0,.25);max-width:90%;width:540px}.uds-feedback-form--container .uds-form-header--wrapper{align-items:center;display:flex;justify-content:space-between;padding:16px 20px 0}.uds-feedback-form--container .uds-form-title--icon-wrapper{display:flex;align-items:center;gap:12px}.uds-feedback-form--container .uds-form-header--wrapper .uds-close,.uds-feedback-form--container .uds-form-title--icon-wrapper .uds-icon{width:20px;height:20px}.uds-feedback-form--container .uds-form-title--icon-wrapper .uds-title{color:#1f2937;font-size:16px;font-weight:600;line-height:24px;text-align:right}.uds-feedback-form--container .uds-form-header--wrapper .uds-close{color:#9ca3af;cursor:pointer}.uds-feedback-form--container .uds-form-header--wrapper .uds-close:hover{color:#4b5563}.uds-feedback-form--container .uds-form-body--content{padding:20px 20px 0 20px;display:flex;flex-direction:column;gap:20px}.uds-feedback-form--container .uds-form-body--content .uds-form-description{color:#1f2937;font-size:16px;font-weight:500;line-height:24px;text-align:right}.uds-feedback-form--container .uds-form-body--content #uds-feedback-form .reason{display:flex;align-items:center;gap:12px;margin-bottom:12px}.uds-feedback-form--container .uds-form-body--content #uds-feedback-form .uds-options-feedback{color:#6b7280;font-size:14px;font-weight:400;line-height:20px;text-align:right;width:100%;padding:9px 13px;border-radius:6px;border-width:1px;border-style:solid;border-color:#e5e7eb;box-shadow:0 1px 2px 0 #0000000d;background:#fff}.uds-feedback-form--container .uds-form-body--content #uds-feedback-form .uds-options-feedback:active,.uds-feedback-form--container .uds-form-body--content #uds-feedback-form .uds-options-feedback:focus,.uds-feedback-form--container .uds-form-body--content #uds-feedback-form .uds-options-feedback:hover{border-color:#d1d5db}.uds-feedback-form--container .uds-form-body--content #uds-feedback-form .uds-option-feedback-cta{color:#4b5563;margin-top:10px;font-size:13px;font-weight:400;line-height:20px;text-align:right}.uds-feedback-form--container .uds-form-body--content #uds-feedback-form .uds-option-feedback-cta a{text-decoration:none;color:#006ba1}.uds-feedback-form--container .uds-form-body--content #uds-feedback-form .uds-options-feedback::placeholder{font-size:14px;font-weight:400;line-height:20px;text-align:right;color:#6b7280;opacity:1}.uds-feedback-form--container .uds-form-body--content .uds-feedback-form-sumbit--actions{display:flex;align-items:center;justify-content:space-between;padding:16px 20px;background-color:#f6f7f7;border-top:1px solid #e1e1e1;margin:40px -20px 0;border-bottom-right-radius:8px;border-bottom-left-radius:8px}.uds-feedback-form--container .uds-form-body--content .uds-feedback-form-sumbit--actions .button{padding:7px 13px;border-radius:3px;border-width:1px;font-size:14px;font-weight:400;line-height:20px;text-align:right;border-style:solid;display:flex;gap:8px;align-items:center}.uds-feedback-form--container .uds-form-body--content .uds-feedback-form-sumbit--actions .button:focus{outline:0;box-shadow:none}.uds-feedback-form--container .uds-form-body--content .uds-feedback-form-sumbit--actions .button.processing{pointer-events:none;opacity:.8}.uds-feedback-form--container .uds-form-body--content .uds-feedback-form-sumbit--actions .button.processing::before{content:"\f463";animation:spin 2s linear infinite;font-family:dashicons,sans-serif;font-weight:400;font-size:18px;cursor:pointer}.uds-feedback-form--container .uds-form-body--content #uds-feedback-form .uds-reason-label{font-size:14px;font-weight:400;line-height:20px;text-align:right}.uds-feedback-form--container .uds-form-body--content #uds-feedback-form input[type=radio]{display:flex;justify-content:center;height:18px;width:18px;cursor:pointer;margin:0;border:1px solid #d1d5db;border-radius:50%;line-height:0;box-shadow:inset 0 1px 2px rgb(0 0 0 / 10%);transition:50ms border-color ease-in-out;-webkit-appearance:none;padding:0}.uds-feedback-form--container .uds-form-body--content #uds-feedback-form input[type=radio]:checked{vertical-align:middle;background-color:#006ba1}.uds-feedback-form--container .uds-form-body--content #uds-feedback-form input[type=radio]:checked::before{background-color:#fff!important;border-radius:50px;content:"\2022";font-size:24px;height:6px;line-height:13px;margin:5px;text-indent:-9999px;width:6px}@keyframes spin{0%{transform:rotate(0)}100%{transform:rotate(-360deg)}} modules/deactivation-survey/assets/css/feedback.css 0000644 00000013111 15006204667 0016554 0 ustar 00 /* Base CSS to normalize the default. */ .uds-feedback-form--wrapper h2, .uds-feedback-form--wrapper p, .uds-feedback-form--wrapper input[type="radio"] { margin: 0; padding: 0; } .uds-feedback-form--wrapper .show { display: block; } .uds-feedback-form--wrapper .hide { display: none; } .uds-feedback-form--wrapper { align-items: center; background-color: rgba( 0, 0, 0, 0.75 ); bottom: 0; display: none; justify-content: center; left: 0; position: fixed; right: 0; top: 0; user-select: none; z-index: -9999; } .uds-feedback-form--wrapper.show_popup { display: flex !important; z-index: 99999; } .uds-feedback-form--wrapper .uds-feedback-form--container { background-color: #fff; border-radius: 8px; box-shadow: 4px 4px 24px rgba( 0, 0, 0, 0.25 ); max-width: 90%; width: 540px; } .uds-feedback-form--container .uds-form-header--wrapper { align-items: center; display: flex; justify-content: space-between; padding: 16px 20px 0; } .uds-feedback-form--container .uds-form-title--icon-wrapper { display: flex; align-items: center; gap: 12px; } .uds-feedback-form--container .uds-form-title--icon-wrapper .uds-icon, .uds-feedback-form--container .uds-form-header--wrapper .uds-close { width: 20px; height: 20px; } .uds-feedback-form--container .uds-form-title--icon-wrapper .uds-title { color: #1f2937; font-size: 16px; font-weight: 600; line-height: 24px; text-align: left; } .uds-feedback-form--container .uds-form-header--wrapper .uds-close { color: #9ca3af; cursor: pointer; } .uds-feedback-form--container .uds-form-header--wrapper .uds-close:hover { color: #4b5563; } .uds-feedback-form--container .uds-form-body--content { padding: 20px 20px 0 20px; display: flex; flex-direction: column; gap: 20px; } .uds-feedback-form--container .uds-form-body--content .uds-form-description { color: #1f2937; font-size: 16px; font-weight: 500; line-height: 24px; text-align: left; } .uds-feedback-form--container .uds-form-body--content #uds-feedback-form .reason { display: flex; align-items: center; gap: 12px; margin-bottom: 12px; } .uds-feedback-form--container .uds-form-body--content #uds-feedback-form .uds-options-feedback { color: #6b7280; font-size: 14px; font-weight: 400; line-height: 20px; text-align: left; width: 100%; padding: 9px 13px; border-radius: 6px; border-width: 1px; border-style: solid; border-color: #e5e7eb; box-shadow: 0 1px 2px 0 #0000000d; background: #fff; } .uds-feedback-form--container .uds-form-body--content #uds-feedback-form .uds-options-feedback:hover, .uds-feedback-form--container .uds-form-body--content #uds-feedback-form .uds-options-feedback:focus, .uds-feedback-form--container .uds-form-body--content #uds-feedback-form .uds-options-feedback:active { border-color: #d1d5db; } .uds-feedback-form--container .uds-form-body--content #uds-feedback-form .uds-option-feedback-cta { color: #4b5563; margin-top: 10px; font-size: 13px; font-weight: 400; line-height: 20px; text-align: left; } .uds-feedback-form--container .uds-form-body--content #uds-feedback-form .uds-option-feedback-cta a { text-decoration: none; color: #006ba1; } .uds-feedback-form--container .uds-form-body--content #uds-feedback-form .uds-options-feedback::placeholder { font-size: 14px; font-weight: 400; line-height: 20px; text-align: left; color: #6b7280; opacity: 1; } .uds-feedback-form--container .uds-form-body--content .uds-feedback-form-sumbit--actions { display: flex; align-items: center; justify-content: space-between; padding: 16px 20px; background-color: #f6f7f7; border-top: 1px solid #e1e1e1; margin: 40px -20px 0; border-bottom-left-radius: 8px; border-bottom-right-radius: 8px; } .uds-feedback-form--container .uds-form-body--content .uds-feedback-form-sumbit--actions .button { padding: 7px 13px; border-radius: 3px; border-width: 1px; font-size: 14px; font-weight: 400; line-height: 20px; text-align: left; border-style: solid; display: flex; gap: 8px; align-items: center; } .uds-feedback-form--container .uds-form-body--content .uds-feedback-form-sumbit--actions .button:focus { outline: none; box-shadow: none; } .uds-feedback-form--container .uds-form-body--content .uds-feedback-form-sumbit--actions .button.processing { pointer-events: none; opacity: 0.8; } .uds-feedback-form--container .uds-form-body--content .uds-feedback-form-sumbit--actions .button.processing::before { content: "\f463"; animation: spin 2s linear infinite; font-family: dashicons, sans-serif; font-weight: 400; font-size: 18px; cursor: pointer; } .uds-feedback-form--container .uds-form-body--content #uds-feedback-form .uds-reason-label { font-size: 14px; font-weight: 400; line-height: 20px; text-align: left; } .uds-feedback-form--container .uds-form-body--content #uds-feedback-form input[type="radio"] { display: flex; justify-content: center; height: 18px; width: 18px; cursor: pointer; margin: 0; border: 1px solid #d1d5db; border-radius: 50%; line-height: 0; box-shadow: inset 0 1px 2px rgb( 0 0 0 / 10% ); transition: 0.05s border-color ease-in-out; -webkit-appearance: none; padding: 0; } .uds-feedback-form--container .uds-form-body--content #uds-feedback-form input[type="radio"]:checked { vertical-align: middle; background-color: #006ba1; } .uds-feedback-form--container .uds-form-body--content #uds-feedback-form input[type="radio"]:checked::before { background-color: #fff !important; border-radius: 50px; content: "\2022"; font-size: 24px; height: 6px; line-height: 13px; margin: 5px; text-indent: -9999px; width: 6px; } @keyframes spin { 0% { transform: rotate( 0deg ); } 100% { transform: rotate( 360deg ); } } modules/deactivation-survey/assets/css/feedback-rtl.min.css 0000644 00000023571 15006204667 0020150 0 ustar 00 .uds-feedback-form--wrapper h2,.uds-feedback-form--wrapper input[type=radio],.uds-feedback-form--wrapper p{margin:0;padding:0}.uds-feedback-form--wrapper .show{display:block}.uds-feedback-form--wrapper .hide{display:none}.uds-feedback-form--wrapper{align-items:center;background-color:rgba(0,0,0,.75);bottom:0;display:none;justify-content:center;right:0;position:fixed;left:0;top:0;user-select:none;z-index:-9999}.uds-feedback-form--wrapper.show_popup{display:flex!important;z-index:99999}.uds-feedback-form--wrapper .uds-feedback-form--container{background-color:#fff;border-radius:8px;box-shadow:-4px 4px 24px rgba(0,0,0,.25);max-width:90%;width:540px}.uds-feedback-form--container .uds-form-header--wrapper{align-items:center;display:flex;justify-content:space-between;padding:16px 20px 0}.uds-feedback-form--container .uds-form-title--icon-wrapper{display:flex;align-items:center;gap:12px}.uds-feedback-form--container .uds-form-header--wrapper .uds-close,.uds-feedback-form--container .uds-form-title--icon-wrapper .uds-icon{width:20px;height:20px}.uds-feedback-form--container .uds-form-title--icon-wrapper .uds-title{color:#1f2937;font-size:16px;font-weight:600;line-height:24px;text-align:right}.uds-feedback-form--container .uds-form-header--wrapper .uds-close{color:#9ca3af;cursor:pointer}.uds-feedback-form--container .uds-form-header--wrapper .uds-close:hover{color:#4b5563}.uds-feedback-form--container .uds-form-body--content{padding:20px 20px 0 20px;display:flex;flex-direction:column;gap:20px}.uds-feedback-form--container .uds-form-body--content .uds-form-description{color:#1f2937;font-size:16px;font-weight:500;line-height:24px;text-align:right}.uds-feedback-form--container .uds-form-body--content #uds-feedback-form .reason{display:flex;align-items:center;gap:12px;margin-bottom:12px}.uds-feedback-form--container .uds-form-body--content #uds-feedback-form .uds-options-feedback{color:#6b7280;font-size:14px;font-weight:400;line-height:20px;text-align:right;width:100%;padding:9px 13px;border-radius:6px;border-width:1px;border-style:solid;border-color:#e5e7eb;box-shadow:0 1px 2px 0 #0000000d;background:#fff}.uds-feedback-form--container .uds-form-body--content #uds-feedback-form .uds-options-feedback:active,.uds-feedback-form--container .uds-form-body--content #uds-feedback-form .uds-options-feedback:focus,.uds-feedback-form--container .uds-form-body--content #uds-feedback-form .uds-options-feedback:hover{border-color:#d1d5db}.uds-feedback-form--container .uds-form-body--content #uds-feedback-form .uds-option-feedback-cta{color:#4b5563;margin-top:10px;font-size:13px;font-weight:400;line-height:20px;text-align:right}.uds-feedback-form--container .uds-form-body--content #uds-feedback-form .uds-option-feedback-cta a{text-decoration:none;color:#006ba1}.uds-feedback-form--container .uds-form-body--content #uds-feedback-form .uds-options-feedback::placeholder{font-size:14px;font-weight:400;line-height:20px;text-align:right;color:#6b7280;opacity:1}.uds-feedback-form--container .uds-form-body--content .uds-feedback-form-sumbit--actions{display:flex;align-items:center;justify-content:space-between;padding:16px 20px;background-color:#f6f7f7;border-top:1px solid #e1e1e1;margin:40px -20px 0;border-bottom-right-radius:8px;border-bottom-left-radius:8px}.uds-feedback-form--container .uds-form-body--content .uds-feedback-form-sumbit--actions .button{padding:7px 13px;border-radius:3px;border-width:1px;font-size:14px;font-weight:400;line-height:20px;text-align:right;border-style:solid;display:flex;gap:8px;align-items:center}.uds-feedback-form--container .uds-form-body--content .uds-feedback-form-sumbit--actions .button:focus{outline:0;box-shadow:none}.uds-feedback-form--container .uds-form-body--content .uds-feedback-form-sumbit--actions .button.processing{pointer-events:none;opacity:.8}.uds-feedback-form--container .uds-form-body--content .uds-feedback-form-sumbit--actions .button.processing::before{content:"\f463";animation:spin 2s linear infinite;font-family:dashicons,sans-serif;font-weight:400;font-size:18px;cursor:pointer}.uds-feedback-form--container .uds-form-body--content #uds-feedback-form .uds-reason-label{font-size:14px;font-weight:400;line-height:20px;text-align:right}.uds-feedback-form--container .uds-form-body--content #uds-feedback-form input[type=radio]{display:flex;justify-content:center;height:18px;width:18px;cursor:pointer;margin:0;border:1px solid #d1d5db;border-radius:50%;line-height:0;box-shadow:inset 0 1px 2px rgb(0 0 0 / 10%);transition:50ms border-color ease-in-out;-webkit-appearance:none;padding:0}.uds-feedback-form--container .uds-form-body--content #uds-feedback-form input[type=radio]:checked{vertical-align:middle;background-color:#006ba1}.uds-feedback-form--container .uds-form-body--content #uds-feedback-form input[type=radio]:checked::before{background-color:#fff!important;border-radius:50px;content:"\2022";font-size:24px;height:6px;line-height:13px;margin:5px;text-indent:-9999px;width:6px}@keyframes spin{0%{transform:rotate(0)}100%{transform:rotate(-360deg)}},.uds-feedback-form--wrapper h2,.uds-feedback-form--wrapper input[type=radio],.uds-feedback-form--wrapper p{margin:0;padding:0}.uds-feedback-form--wrapper .show{display:block}.uds-feedback-form--wrapper .hide{display:none}.uds-feedback-form--wrapper{align-items:center;background-color:rgba(0,0,0,.75);bottom:0;display:none;justify-content:center;right:0;position:fixed;left:0;top:0;user-select:none;z-index:-9999}.uds-feedback-form--wrapper.show_popup{display:flex!important;z-index:99999}.uds-feedback-form--wrapper .uds-feedback-form--container{background-color:#fff;border-radius:8px;box-shadow:-4px 4px 24px rgba(0,0,0,.25);max-width:90%;width:540px}.uds-feedback-form--container .uds-form-header--wrapper{align-items:center;display:flex;justify-content:space-between;padding:16px 20px 0}.uds-feedback-form--container .uds-form-title--icon-wrapper{display:flex;align-items:center;gap:12px}.uds-feedback-form--container .uds-form-header--wrapper .uds-close,.uds-feedback-form--container .uds-form-title--icon-wrapper .uds-icon{width:20px;height:20px}.uds-feedback-form--container .uds-form-title--icon-wrapper .uds-title{color:#1f2937;font-size:16px;font-weight:600;line-height:24px;text-align:right}.uds-feedback-form--container .uds-form-header--wrapper .uds-close{color:#9ca3af;cursor:pointer}.uds-feedback-form--container .uds-form-header--wrapper .uds-close:hover{color:#4b5563}.uds-feedback-form--container .uds-form-body--content{padding:20px 20px 0 20px;display:flex;flex-direction:column;gap:20px}.uds-feedback-form--container .uds-form-body--content .uds-form-description{color:#1f2937;font-size:16px;font-weight:500;line-height:24px;text-align:right}.uds-feedback-form--container .uds-form-body--content #uds-feedback-form .reason{display:flex;align-items:center;gap:12px;margin-bottom:12px}.uds-feedback-form--container .uds-form-body--content #uds-feedback-form .uds-options-feedback{color:#6b7280;font-size:14px;font-weight:400;line-height:20px;text-align:right;width:100%;padding:9px 13px;border-radius:6px;border-width:1px;border-style:solid;border-color:#e5e7eb;box-shadow:0 1px 2px 0 #0000000d;background:#fff}.uds-feedback-form--container .uds-form-body--content #uds-feedback-form .uds-options-feedback:active,.uds-feedback-form--container .uds-form-body--content #uds-feedback-form .uds-options-feedback:focus,.uds-feedback-form--container .uds-form-body--content #uds-feedback-form .uds-options-feedback:hover{border-color:#d1d5db}.uds-feedback-form--container .uds-form-body--content #uds-feedback-form .uds-option-feedback-cta{color:#4b5563;margin-top:10px;font-size:13px;font-weight:400;line-height:20px;text-align:right}.uds-feedback-form--container .uds-form-body--content #uds-feedback-form .uds-option-feedback-cta a{text-decoration:none;color:#006ba1}.uds-feedback-form--container .uds-form-body--content #uds-feedback-form .uds-options-feedback::placeholder{font-size:14px;font-weight:400;line-height:20px;text-align:right;color:#6b7280;opacity:1}.uds-feedback-form--container .uds-form-body--content .uds-feedback-form-sumbit--actions{display:flex;align-items:center;justify-content:space-between;padding:16px 20px;background-color:#f6f7f7;border-top:1px solid #e1e1e1;margin:40px -20px 0;border-bottom-right-radius:8px;border-bottom-left-radius:8px}.uds-feedback-form--container .uds-form-body--content .uds-feedback-form-sumbit--actions .button{padding:7px 13px;border-radius:3px;border-width:1px;font-size:14px;font-weight:400;line-height:20px;text-align:right;border-style:solid;display:flex;gap:8px;align-items:center}.uds-feedback-form--container .uds-form-body--content .uds-feedback-form-sumbit--actions .button:focus{outline:0;box-shadow:none}.uds-feedback-form--container .uds-form-body--content .uds-feedback-form-sumbit--actions .button.processing{pointer-events:none;opacity:.8}.uds-feedback-form--container .uds-form-body--content .uds-feedback-form-sumbit--actions .button.processing::before{content:"\f463";animation:spin 2s linear infinite;font-family:dashicons,sans-serif;font-weight:400;font-size:18px;cursor:pointer}.uds-feedback-form--container .uds-form-body--content #uds-feedback-form .uds-reason-label{font-size:14px;font-weight:400;line-height:20px;text-align:right}.uds-feedback-form--container .uds-form-body--content #uds-feedback-form input[type=radio]{display:flex;justify-content:center;height:18px;width:18px;cursor:pointer;margin:0;border:1px solid #d1d5db;border-radius:50%;line-height:0;box-shadow:inset 0 1px 2px rgb(0 0 0 / 10%);transition:50ms border-color ease-in-out;-webkit-appearance:none;padding:0}.uds-feedback-form--container .uds-form-body--content #uds-feedback-form input[type=radio]:checked{vertical-align:middle;background-color:#006ba1}.uds-feedback-form--container .uds-form-body--content #uds-feedback-form input[type=radio]:checked::before{background-color:#fff!important;border-radius:50px;content:"\2022";font-size:24px;height:6px;line-height:13px;margin:5px;text-indent:-9999px;width:6px}@keyframes spin{0%{transform:rotate(0)}100%{transform:rotate(-360deg)}} version.json 0000644 00000000050 15006204667 0007125 0 ustar 00 { "bsf-analytics-ver": "1.1.12" } class-bsf-analytics-loader.php 0000644 00000004601 15006204667 0012372 0 ustar 00 <?php /** * BSF analytics loader file. * * @version 1.0.0 * * @package bsf-analytics */ if ( ! defined( 'ABSPATH' ) ) { exit(); } /** * Class BSF_Analytics_Loader. */ class BSF_Analytics_Loader { /** * Analytics Entities. * * @access private * @var array Entities array. */ private $entities = array(); /** * Analytics Version. * * @access private * @var float analytics version. */ private $analytics_version = ''; /** * Analytics path. * * @access private * @var string path array. */ private $analytics_path = ''; /** * Instance * * @access private * @var object Class object. */ private static $instance = null; /** * Get instace of class. * * @return object */ public static function get_instance() { if ( null === self::$instance ) { self::$instance = new self(); } return self::$instance; } /** * Constructor */ public function __construct() { add_action( 'init', array( $this, 'load_analytics' ) ); } /** * Set entity for analytics. * * @param string $data Entity attributes data. * @return void */ public function set_entity( $data ) { array_push( $this->entities, $data ); } /** * Load Analytics library. * * @return void */ public function load_analytics() { $unique_entities = array(); if ( ! empty( $this->entities ) ) { foreach ( $this->entities as $entity ) { foreach ( $entity as $key => $data ) { if ( isset( $data['path'] ) ) { if ( file_exists( $data['path'] . '/version.json' ) ) { $file_contents = file_get_contents( $data['path'] . '/version.json' ); // phpcs:ignore WordPress.WP.AlternativeFunctions.file_get_contents_file_get_contents $analytics_version = json_decode( $file_contents, 1 ); $analytics_version = $analytics_version['bsf-analytics-ver']; if ( version_compare( $analytics_version, $this->analytics_version, '>' ) ) { $this->analytics_version = $analytics_version; $this->analytics_path = $data['path']; } } } if ( ! isset( $unique_entities[ $key ] ) ) { $unique_entities[ $key ] = $data; } } } if ( file_exists( $this->analytics_path ) && ! class_exists( 'BSF_Analytics' ) ) { require_once $this->analytics_path . '/class-bsf-analytics.php'; new BSF_Analytics( $unique_entities, $this->analytics_path, $this->analytics_version ); } } } } class-bsf-analytics-stats.php 0000644 00000015312 15006204667 0012263 0 ustar 00 <?php /** * BSF analytics stat class file. * * @package bsf-analytics */ if ( ! defined( 'ABSPATH' ) ) { exit; // Exit if accessed directly. } if ( ! class_exists( 'BSF_Analytics_Stats' ) ) { /** * BSF analytics stat class. */ class BSF_Analytics_Stats { /** * Active plugins. * * Holds the sites active plugins list. * * @var array */ private $plugins; /** * Instance of BSF_Analytics_Stats. * * Holds only the first object of class. * * @var object */ private static $instance = null; /** * Create only once instance of a class. * * @return object * @since 1.0.0 */ public static function instance() { if ( null === self::$instance ) { self::$instance = new self(); } return self::$instance; } /** * Get stats. * * @return array stats data. * @since 1.0.0 */ public function get_stats() { return apply_filters( 'bsf_core_stats', $this->get_default_stats() ); } /** * Retrieve stats for site. * * @return array stats data. * @since 1.0.0 */ private function get_default_stats() { return array( 'graupi_version' => defined( 'BSF_UPDATER_VERSION' ) ? BSF_UPDATER_VERSION : false, 'domain_name' => get_site_url(), 'php_os' => PHP_OS, 'server_software' => isset( $_SERVER['SERVER_SOFTWARE'] ) ? wp_kses( wp_unslash( $_SERVER['SERVER_SOFTWARE'] ), [] ) : '', 'mysql_version' => $this->get_mysql_version(), 'php_version' => $this->get_php_version(), 'php_max_input_vars' => ini_get( 'max_input_vars' ), // phpcs:ignore:PHPCompatibility.IniDirectives.NewIniDirectives.max_input_varsFound 'php_post_max_size' => ini_get( 'post_max_size' ), 'php_max_execution_time' => ini_get( 'max_execution_time' ), 'php_memory_limit' => ini_get( 'memory_limit' ), 'zip_installed' => extension_loaded( 'zip' ), 'imagick_availabile' => extension_loaded( 'imagick' ), 'xmlreader_exists' => class_exists( 'XMLReader' ), 'gd_available' => extension_loaded( 'gd' ), 'curl_version' => $this->get_curl_version(), 'curl_ssl_version' => $this->get_curl_ssl_version(), 'is_writable' => $this->is_content_writable(), 'wp_version' => get_bloginfo( 'version' ), 'user_count' => $this->get_user_count(), 'posts_count' => wp_count_posts()->publish, 'page_count' => wp_count_posts( 'page' )->publish, 'site_language' => get_locale(), 'timezone' => wp_timezone_string(), 'is_ssl' => is_ssl(), 'is_multisite' => is_multisite(), 'network_url' => network_site_url(), 'external_object_cache' => (bool) wp_using_ext_object_cache(), 'wp_debug' => WP_DEBUG, 'wp_debug_display' => WP_DEBUG_DISPLAY, 'script_debug' => SCRIPT_DEBUG, 'active_plugins' => $this->get_active_plugins(), 'active_theme' => get_template(), 'active_stylesheet' => get_stylesheet(), ); } /** * Get installed PHP version. * * @return float PHP version. * @since 1.0.0 */ private function get_php_version() { if ( defined( 'PHP_MAJOR_VERSION' ) && defined( 'PHP_MINOR_VERSION' ) && defined( 'PHP_RELEASE_VERSION' ) ) { // phpcs:ignore return PHP_MAJOR_VERSION . '.' . PHP_MINOR_VERSION . '.' . PHP_RELEASE_VERSION; } return phpversion(); } /** * User count on site. * * @return int User count. * @since 1.0.0 */ private function get_user_count() { if ( is_multisite() ) { $user_count = get_user_count(); } else { $count = count_users(); $user_count = $count['total_users']; } return $user_count; } /** * Get active plugin's data. * * @return array active plugin's list. * @since 1.0.0 */ private function get_active_plugins() { if ( ! $this->plugins ) { // Ensure get_plugin_data function is loaded. if ( ! function_exists( 'get_plugin_data' ) ) { require_once ABSPATH . 'wp-admin/includes/plugin.php'; } $plugins = wp_get_active_and_valid_plugins(); $plugins = array_map( 'get_plugin_data', $plugins ); $this->plugins = array_map( array( $this, 'format_plugin' ), $plugins ); } return $this->plugins; } /** * Format plugin data. * * @param string $plugin plugin. * @return array formatted plugin data. * @since 1.0.0 */ public function format_plugin( $plugin ) { return array( 'name' => html_entity_decode( $plugin['Name'], ENT_COMPAT, 'UTF-8' ), 'url' => $plugin['PluginURI'], 'version' => $plugin['Version'], 'slug' => $plugin['TextDomain'], 'author_name' => html_entity_decode( wp_strip_all_tags( $plugin['Author'] ), ENT_COMPAT, 'UTF-8' ), 'author_url' => $plugin['AuthorURI'], ); } /** * Curl SSL version. * * @return float SSL version. * @since 1.0.0 */ private function get_curl_ssl_version() { $curl = array(); if ( function_exists( 'curl_version' ) ) { $curl = curl_version(); // phpcs:ignore WordPress.WP.AlternativeFunctions.curl_curl_version } return isset( $curl['ssl_version'] ) ? $curl['ssl_version'] : false; } /** * Get cURL version. * * @return float cURL version. * @since 1.0.0 */ private function get_curl_version() { if ( function_exists( 'curl_version' ) ) { $curl = curl_version(); // phpcs:ignore WordPress.WP.AlternativeFunctions.curl_curl_version } return isset( $curl['version'] ) ? $curl['version'] : false; } /** * Get MySQL version. * * @return float MySQL version. * @since 1.0.0 */ private function get_mysql_version() { global $wpdb; return $wpdb->db_version(); } /** * Check if content directory is writable. * * @return bool * @since 1.0.0 */ private function is_content_writable() { $upload_dir = wp_upload_dir(); return wp_is_writable( $upload_dir['basedir'] ); } } } /** * Polyfill for sites using WP version less than 5.3 */ if ( ! function_exists( 'wp_timezone_string' ) ) { /** * Get timezone string. * * @return string timezone string. * @since 1.0.0 */ function wp_timezone_string() { $timezone_string = get_option( 'timezone_string' ); if ( $timezone_string ) { return $timezone_string; } $offset = (float) get_option( 'gmt_offset' ); $hours = (int) $offset; $minutes = ( $offset - $hours ); $sign = ( $offset < 0 ) ? '-' : '+'; $abs_hour = abs( $hours ); $abs_mins = abs( $minutes * 60 ); $tz_offset = sprintf( '%s%02d:%02d', $sign, $abs_hour, $abs_mins ); return $tz_offset; } } changelog.txt 0000644 00000000140 15006204667 0007235 0 ustar 00 v1.1.12 - 24-March-2025 - Improvement: Added `suremails` and `latepoint` slugs to UTM analytics. assets/css/minified/style-rtl.min.css 0000644 00000000460 15006204667 0013663 0 ustar 00 [ID*="-optin-notice"]{padding:1px 12px;border-right-color:#007cba}[ID*="-optin-notice"] .notice-container{padding-top:10px;padding-bottom:12px}[ID*="-optin-notice"] .notice-content{margin:0}[ID*="-optin-notice"] .notice-heading{padding:0 0 12px 20px}[ID*="-optin-notice"] .button-primary{margin-left:5px} assets/css/minified/style.min.css 0000644 00000000460 15006204667 0013064 0 ustar 00 [ID*="-optin-notice"]{padding:1px 12px;border-left-color:#007cba}[ID*="-optin-notice"] .notice-container{padding-top:10px;padding-bottom:12px}[ID*="-optin-notice"] .notice-content{margin:0}[ID*="-optin-notice"] .notice-heading{padding:0 20px 12px 0}[ID*="-optin-notice"] .button-primary{margin-right:5px} assets/css/unminified/style.css 0000644 00000000561 15006204667 0012647 0 ustar 00 [ID*="-optin-notice"] { padding: 1px 12px; border-left-color: #007cba; } [ID*="-optin-notice"] .notice-container { padding-top: 10px; padding-bottom: 12px; } [ID*="-optin-notice"] .notice-content { margin: 0; } [ID*="-optin-notice"] .notice-heading { padding: 0 20px 12px 0; } [ID*="-optin-notice"] .button-primary { margin-right: 5px; } assets/css/unminified/style-rtl.css 0000644 00000000561 15006204667 0013446 0 ustar 00 [ID*="-optin-notice"] { padding: 1px 12px; border-right-color: #007cba; } [ID*="-optin-notice"] .notice-container { padding-top: 10px; padding-bottom: 12px; } [ID*="-optin-notice"] .notice-content { margin: 0; } [ID*="-optin-notice"] .notice-heading { padding: 0 0 12px 20px; } [ID*="-optin-notice"] .button-primary { margin-left: 5px; }
| ver. 1.4 |
Github
|
.
| PHP 8.0.30 | Генерация страницы: 0 |
proxy
|
phpinfo
|
Настройка