Your IP : 13.59.51.100


Current Path : /home/ephorei/www/wp-includes/images/media/q2m9hb/
Upload File :
Current File : /home/ephorei/www/wp-includes/images/media/q2m9hb/bsf-analytics.tar

class-bsf-analytics.php000064400000037573150062046670011144 0ustar00<?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.php000064400000005443150062046670014045 0ustar00<?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.php000064400000011167150062046670011533 0ustar00<?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.php000064400000025132150062046670023232 0ustar00<?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.js000064400000006162150062046670017016 0ustar00(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.js000064400000015237150062046670016237 0ustar00( 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.css000064400000011663150062046670017350 0ustar00.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.css000064400000025017150062046670017363 0ustar00/* 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.css000064400000013111150062046670016554 0ustar00/* 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.css000064400000023571150062046670020150 0ustar00.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.json000064400000000050150062046670007125 0ustar00{
    "bsf-analytics-ver": "1.1.12"
}
  class-bsf-analytics-loader.php000064400000004601150062046670012372 0ustar00<?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.php000064400000015312150062046670012263 0ustar00<?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.txt000064400000000140150062046670007235 0ustar00v1.1.12 - 24-March-2025
- Improvement: Added `suremails` and `latepoint` slugs to UTM analytics.assets/css/minified/style-rtl.min.css000064400000000460150062046670013663 0ustar00[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.css000064400000000460150062046670013064 0ustar00[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.css000064400000000561150062046670012647 0ustar00[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.css000064400000000561150062046670013446 0ustar00[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;
}