JezK
Edit File: Assets.php
<?php namespace WeDevs\Dokan; use Automattic\WooCommerce\Internal\Admin\WCAdminAssets; use WeDevs\Dokan\Admin\Dashboard\LegacySwitcher; use WeDevs\Dokan\Admin\Notices\Helper; use WeDevs\Dokan\ProductCategory\Helper as CategoryHelper; use WeDevs\Dokan\ReverseWithdrawal\SettingsHelper; use WeDevs\Dokan\Utilities\OrderUtil; use WeDevs\Dokan\Utilities\ReportUtil; class Assets { /** * The constructor */ public function __construct() { add_action( 'init', [ $this, 'register_all_scripts' ], 10 ); add_filter( 'dokan_localized_args', [ $this, 'conditional_localized_args' ] ); add_filter( 'dokan_react_frontend_localized_args', [ $this, 'add_product_listing_localized_args' ] ); if ( is_admin() ) { add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_admin_scripts' ], 10 ); add_action( 'admin_enqueue_scripts', [ $this, 'load_dokan_admin_notices_scripts' ], 8 ); add_action( 'admin_enqueue_scripts', [ $this, 'load_dokan_global_scripts' ], 5 ); } else { add_action( 'wp_enqueue_scripts', [ $this, 'enqueue_front_scripts' ] ); add_action( 'wp_enqueue_scripts', [ $this, 'load_dokan_global_scripts' ], 5 ); add_action( 'init', [ $this, 'register_wc_admin_scripts' ] ); } } public static function get_wc_handler( $handler ): string { // map legacy handlers to new ones $supported_handlers = [ 'jquery-blockui', 'jquery-tiptip' ]; // Return original handler if not in our supported list if ( ! in_array( $handler, $supported_handlers, true ) ) { return $handler; } // For WC 10.3.0+, use 'wc-' prefix if ( version_compare( WC()->version, '10.3.0', '>=' ) ) { return 'wc-' . $handler; } return $handler; } /** * Load global admin and promo notices scripts * * @since 3.3.6 * * @return void */ public function load_dokan_admin_notices_scripts() { wp_enqueue_script( 'dokan-promo-notice-js' ); wp_enqueue_script( 'dokan-admin-notice-js' ); $vue_localize_script = apply_filters( 'dokan_promo_notice_localize_script', [ 'ajaxurl' => admin_url( 'admin-ajax.php' ), 'rest' => [ 'root' => esc_url_raw( get_rest_url() ), 'nonce' => wp_create_nonce( 'wp_rest' ), 'version' => 'dokan/v1', ], 'urls' => [ 'assetsUrl' => DOKAN_PLUGIN_ASSEST, ], ] ); wp_localize_script( 'dokan-promo-notice-js', 'dokan_promo', $vue_localize_script ); } /** * Enqueue admin scripts */ public function enqueue_admin_scripts( $hook ) { global $post, $wp_version, $typenow; // load vue app inside the parent menu only if ( 'toplevel_page_dokan' === $hook ) { $localize_script = $this->get_admin_localized_scripts(); $vue_admin_localize_script = $this->get_vue_admin_localized_scripts(); // Load common styles and scripts wp_enqueue_script( 'dokan-tinymce' ); wp_enqueue_style( 'dokan-admin-css' ); wp_enqueue_script( 'underscore' ); wp_enqueue_media(); wp_enqueue_script( 'dokan-tooltip' ); wp_enqueue_script( 'dokan-admin' ); // load styles wp_enqueue_style( 'dokan-vue-vendor' ); wp_enqueue_style( 'dokan-vue-admin' ); wp_enqueue_style( 'dokan-tinymce' ); // load vue libraries and bootstrap the app wp_enqueue_script( 'dokan-accounting' ); wp_enqueue_script( 'dokan-chart' ); wp_enqueue_script( 'dokan-vue-vendor' ); wp_localize_script( 'dokan-vue-vendor', 'dokan', $localize_script ); wp_enqueue_script( 'dokan-vue-bootstrap' ); $this->load_gmap_script(); // allow other plugins to load scripts before the main app loads // @codingStandardsIgnoreLine do_action( 'dokan-vue-admin-scripts' ); // fire the admin app wp_enqueue_script( 'dokan-vue-admin' ); wp_localize_script( 'dokan-vue-vendor', 'dokanAdmin', $vue_admin_localize_script ); wp_enqueue_style( 'dokan-fontawesome' ); // load wooCommerce select2 styles wp_enqueue_style( 'woocommerce_select2', WC()->plugin_url() . '/assets/css/select2.css', [], WC_VERSION ); } if ( 'dokan_page_dokan-modules' === $hook ) { wp_enqueue_style( 'dokan-admin-css' ); wp_enqueue_script( 'underscore' ); wp_enqueue_media(); wp_enqueue_script( 'dokan-tooltip' ); wp_enqueue_script( 'dokan-admin' ); } if ( get_post_type( $post ) === 'dokan_slider' ) { wp_enqueue_script( 'media-upload' ); wp_enqueue_script( 'thickbox' ); wp_enqueue_style( 'thickbox' ); } if ( get_post_type( $post ) === 'post' || get_post_type( $post ) === 'page' ) { wp_enqueue_script( 'dokan-tooltip' ); wp_enqueue_script( 'dokan-admin' ); } if ( 'plugins.php' === $hook ) { wp_enqueue_style( 'dokan-plugin-list-css' ); } if ( 'product' === $typenow ) { wp_enqueue_script( 'dokan-admin-product' ); wp_enqueue_style( 'dokan-admin-product' ); wp_localize_script( 'dokan-admin-product', 'dokan_admin_product', $this->admin_product_localize_scripts() ); } do_action( 'dokan_enqueue_admin_scripts', $hook ); } /** * Load admin product localize data. * * @since 3.7.1 * * @return array */ public function admin_product_localize_scripts() { return apply_filters( 'dokan_admin_product_localize_scripts', [ 'ajaxurl' => admin_url( 'admin-ajax.php' ), 'nonce' => wp_create_nonce( 'dokan_admin_product' ), 'i18n' => [ 'error_loading' => esc_html__( 'Could not find any vendor.', 'dokan-lite' ), 'searching' => esc_html__( 'Searching vendors', 'dokan-lite' ), 'input_too_short' => esc_html__( 'Search vendors', 'dokan-lite' ), 'confirm_delete' => esc_html__( 'Are you sure ?', 'dokan-lite' ), ], ] ); } /** * Add product listing data to the dokanFrontend localized object. * * @since 5.0.0 * * @param array $args Existing localized args. * @return array */ public function add_product_listing_localized_args( array $args ): array { if ( ! is_user_logged_in() ) { return $args; } $user_id = dokan_get_current_user_id(); $one_step_product_create = 'on' === dokan_get_option( 'one_step_product_create', 'dokan_selling', 'on' ); $disable_product_popup = $one_step_product_create || 'on' === dokan_get_option( 'disable_product_popup', 'dokan_selling', 'off' ); $args['product_listing'] = array_merge( $args['product_listing'] ?? [], [ 'can_add_product' => dokan_is_seller_enabled( $user_id ) && current_user_can( 'dokan_add_product' ), 'new_product_url' => dokan_edit_product_url( 0, true ), 'is_legacy_editor_preferred' => dokan_get_container()->get( LegacySwitcher::class )->is_product_editor_legacy_preferred( $user_id ), // When "One Page Product Creation" is enabled, the Add-new-product // button opens the lightweight schema-driven quick-create modal. 'is_quick_create_enabled' => ! $disable_product_popup, ] ); return $args; } public function get_localized_price() { return [ 'precision' => wc_get_price_decimals(), 'symbol' => html_entity_decode( get_woocommerce_currency_symbol(), ENT_COMPAT, 'UTF-8' ), 'decimal' => esc_attr( wc_get_price_decimal_separator() ), 'thousand' => esc_attr( wc_get_price_thousand_separator() ), 'position' => esc_attr( get_option( 'woocommerce_currency_pos' ) ), 'format' => esc_attr( str_replace( [ '%1$s', '%2$s' ], [ '%s', '%v' ], get_woocommerce_price_format() ) ), // For accounting JS ]; } /** * SPA Routes * * @return array */ public function get_vue_admin_routes() { $routes = [ [ 'path' => '/', 'name' => 'Dashboard', 'component' => 'Dashboard', ], [ 'path' => '/withdraw', 'name' => 'Withdraw', 'component' => 'Withdraw', ], [ 'path' => '/reverse-withdrawal', 'name' => 'ReverseWithdrawal', 'component' => 'ReverseWithdrawal', ], [ 'path' => '/reverse-withdrawal/store/:store_id', 'name' => 'ReverseWithdrawalTransactions', 'component' => 'ReverseWithdrawalTransactions', ], [ 'path' => '/help', 'name' => 'Help', 'component' => 'Help', ], [ 'path' => '/settings', 'name' => 'Settings', 'component' => 'Settings', ], [ 'path' => '/vendors', 'name' => 'Vendors', 'component' => 'Vendors', ], [ 'path' => '/vendors/:id', 'name' => 'VendorSingle', 'component' => 'VendorSingle', ], [ 'path' => '/dummy-data', 'name' => 'DummyData', 'component' => 'DummyData', ], [ 'path' => '/vendor-capabilities', 'name' => 'VendorCapabilities', 'component' => 'VendorCapabilities', ], [ 'path' => '/changelog', 'name' => 'ChangeLog', 'component' => 'ChangeLog', ], [ 'path' => '/tools', 'name' => 'Tools', 'component' => 'Tools', ], ]; // @codingStandardsIgnoreLine return apply_filters( 'dokan-admin-routes', $routes ); } public function get_vue_frontend_routes() { $routes = []; // @codingStandardsIgnoreLine return apply_filters( 'dokan-frontend-routes', $routes ); } /** * Register all Dokan scripts and styles */ public function register_all_scripts() { $styles = $this->get_styles(); $scripts = $this->get_scripts(); $this->register_styles( $styles ); $this->register_scripts( $scripts ); do_action( 'dokan_register_scripts' ); } /** * Get registered styles * * @return array */ public function get_styles() { $styles = [ 'dokan-style' => [ 'src' => DOKAN_PLUGIN_ASSEST . '/css/style.css', 'version' => filemtime( DOKAN_DIR . '/assets/css/style.css' ), ], 'dokan-tinymce' => [ 'src' => site_url( '/wp-includes/css/editor.css' ), 'deps' => [], 'version' => time(), ], 'jquery-ui' => [ 'src' => DOKAN_PLUGIN_ASSEST . '/vendors/jquery-ui/jquery-ui-1.10.0.custom.css', ], 'dokan-fontawesome' => [ 'src' => DOKAN_PLUGIN_ASSEST . '/vendors/font-awesome/css/font-awesome.min.css', ], 'dokan-modal' => [ 'src' => DOKAN_PLUGIN_ASSEST . '/vendors/izimodal/iziModal.min.css', 'version' => filemtime( DOKAN_DIR . '/assets/vendors/izimodal/iziModal.min.css' ), ], 'dokan-minitoggle' => [ 'src' => DOKAN_PLUGIN_ASSEST . '/vendors/minitoggle/minitoggle.css', ], 'dokan-select2-css' => [ 'src' => DOKAN_PLUGIN_ASSEST . '/vendors/select2/select2.css', ], 'dokan-rtl-style' => [ 'src' => DOKAN_PLUGIN_ASSEST . '/css/rtl.css', ], 'dokan-plugin-list-css' => [ 'src' => DOKAN_PLUGIN_ASSEST . '/css/plugin.css', ], 'dokan-timepicker' => [ 'src' => DOKAN_PLUGIN_ASSEST . '/vendors/jquery-ui/timepicker/timepicker.min.css', ], 'dokan-date-range-picker' => [ 'src' => DOKAN_PLUGIN_ASSEST . '/vendors/date-range-picker/daterangepicker.min.css', ], 'dokan-admin-css' => [ 'src' => DOKAN_PLUGIN_ASSEST . '/css/admin.css', 'version' => filemtime( DOKAN_DIR . '/assets/css/admin.css' ), ], 'dokan-vue-vendor' => [ 'src' => DOKAN_PLUGIN_ASSEST . '/css/dokan-vue-vendor.css', 'version' => filemtime( DOKAN_DIR . '/assets/css/dokan-vue-vendor.css' ), ], 'dokan-vue-bootstrap' => [ 'src' => DOKAN_PLUGIN_ASSEST . '/css/vue-bootstrap.css', 'deps' => [ 'dokan-vue-vendor' ], 'version' => filemtime( DOKAN_DIR . '/assets/css/vue-bootstrap.css' ), ], 'dokan-sf-pro-text' => [ 'src' => DOKAN_PLUGIN_ASSEST . '/font/sf-pro-text/sf-pro-text.css', 'version' => filemtime( DOKAN_DIR . '/assets/font/sf-pro-text/sf-pro-text.css' ), ], 'dokan-vue-admin' => [ 'src' => DOKAN_PLUGIN_ASSEST . '/css/vue-admin.css', 'deps' => [ 'dokan-vue-vendor', 'dokan-vue-bootstrap', 'dokan-react-components' ], 'version' => filemtime( DOKAN_DIR . '/assets/css/vue-admin.css' ), ], 'dokan-global-admin-css' => [ 'src' => DOKAN_PLUGIN_ASSEST . '/css/global-admin.css', 'deps' => [ 'dokan-sf-pro-text' ], 'version' => filemtime( DOKAN_DIR . '/assets/css/global-admin.css' ), ], 'dokan-product-category-ui-css' => [ 'src' => DOKAN_PLUGIN_ASSEST . '/css/dokan-product-category-ui.css', 'version' => filemtime( DOKAN_DIR . '/assets/css/dokan-product-category-ui.css' ), ], 'dokan-reverse-withdrawal' => [ 'src' => DOKAN_PLUGIN_ASSEST . '/css/reverse-withdrawal-style.css', 'version' => filemtime( DOKAN_DIR . '/assets/css/reverse-withdrawal-style.css' ), ], 'dokan-admin-product' => [ 'src' => DOKAN_PLUGIN_ASSEST . '/css/dokan-admin-product-style.css', 'version' => filemtime( DOKAN_DIR . '/assets/css/dokan-admin-product-style.css' ), ], 'dokan-tailwind' => [ 'src' => DOKAN_PLUGIN_ASSEST . '/css/dokan-tailwind.css', 'version' => filemtime( DOKAN_DIR . '/assets/css/dokan-tailwind.css' ), ], 'dokan-react-frontend' => [ 'src' => DOKAN_PLUGIN_ASSEST . '/css/frontend.css', 'deps' => [ 'dokan-react-components' ], 'version' => filemtime( DOKAN_DIR . '/assets/css/frontend.css' ), ], 'dokan-react-components' => [ 'src' => DOKAN_PLUGIN_ASSEST . '/css/components.css', 'deps' => [ 'wp-components', 'dokan-tailwind' ], 'version' => filemtime( DOKAN_DIR . '/assets/css/components.css' ), ], ]; return $styles; } /** * Get all registered scripts * * @return array */ public function get_scripts() { global $wp_version; $jquery_tiptip = self::get_wc_handler( 'jquery-tiptip' ); $jquery_blockui = self::get_wc_handler( 'jquery-blockui' ); $frontend_shipping_asset = require DOKAN_DIR . '/assets/js/frontend.asset.php'; $suffix = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min'; $asset_url = DOKAN_PLUGIN_ASSEST; $asset_path = DOKAN_DIR . '/assets/'; $bootstrap_deps = [ 'dokan-vue-vendor', 'wp-i18n', 'wp-hooks' ]; $scripts = [ // Remove `dokan-i18n-jed` in next release. 'dokan-i18n-jed' => [ 'src' => $asset_url . '/vendors/i18n/jed.js', 'deps' => [ 'jquery', 'wp-i18n' ], ], 'dokan-accounting' => [ 'src' => WC()->plugin_url() . '/assets/js/accounting/accounting.min.js', 'deps' => [ 'jquery' ], ], 'dokan-tinymce' => [ 'src' => site_url( '/wp-includes/js/tinymce/tinymce.min.js' ), 'deps' => [], ], 'dokan-tinymce-plugin' => [ 'src' => DOKAN_PLUGIN_ASSEST . '/vendors/tinymce/code/plugin.min.js', 'deps' => [ 'dokan-tinymce' ], 'version' => time(), ], 'dokan-chart' => [ 'src' => $asset_url . '/vendors/chart/Chart.min.js', 'deps' => [ 'moment', 'jquery' ], ], 'dokan-tabs' => [ 'src' => $asset_url . '/vendors/easytab/jquery.easytabs.min.js', 'deps' => [ 'jquery' ], ], 'dokan-modal' => [ 'src' => $asset_url . '/vendors/izimodal/iziModal.min.js', 'deps' => [ 'jquery' ], ], 'dokan-minitoggle' => [ 'src' => $asset_url . '/vendors/minitoggle/minitoggle.js', 'deps' => [ 'jquery' ], ], 'dokan-tooltip' => [ 'src' => $asset_url . '/vendors/tooltips/tooltips.js', 'deps' => [ 'jquery' ], ], 'dokan-form-validate' => [ 'src' => $asset_url . '/vendors/form-validate/form-validate.js', 'deps' => [ 'jquery' ], ], 'dokan-select2-js' => [ 'src' => $asset_url . '/vendors/select2/select2.full.min.js', 'deps' => [ 'jquery' ], ], 'dokan-timepicker' => [ 'src' => $asset_url . '/vendors/jquery-ui/timepicker/timepicker.min.js', 'deps' => [ 'jquery' ], 'in_footer' => false, ], 'dokan-date-range-picker' => [ 'src' => $asset_url . '/vendors/date-range-picker/daterangepicker.min.js', 'deps' => [ 'jquery', 'moment', 'dokan-util-helper' ], ], // customize scripts 'customize-base' => [ 'src' => site_url( 'wp-includes/js/customize-base.js' ), 'deps' => [ 'jquery', 'json2', 'underscore' ], ], 'customize-model' => [ 'src' => site_url( 'wp-includes/js/customize-models.js' ), 'deps' => [ 'underscore', 'backbone' ], ], // Register core scripts 'dokan-flot-main' => [ 'src' => WC()->plugin_url() . '/assets/js/jquery-flot/jquery.flot' . $suffix . '.js', 'deps' => [ 'jquery' ], ], 'dokan-flot-resize' => [ 'src' => WC()->plugin_url() . '/assets/js/jquery-flot/jquery.flot.resize' . $suffix . '.js', 'deps' => [ 'dokan-flot-main' ], ], 'dokan-flot-time' => [ 'src' => WC()->plugin_url() . '/assets/js/jquery-flot/jquery.flot.time' . $suffix . '.js', 'deps' => [ 'dokan-flot-main' ], ], 'dokan-flot-pie' => [ 'src' => WC()->plugin_url() . '/assets/js/jquery-flot/jquery.flot.pie' . $suffix . '.js', 'deps' => [ 'dokan-flot-main' ], ], 'dokan-flot' => [ 'src' => WC()->plugin_url() . '/assets/js/jquery-flot/jquery.flot.stack' . $suffix . '.js', 'deps' => [ 'dokan-flot-main', 'dokan-flot-pie', 'dokan-flot-time' ], ], 'speaking-url' => [ 'src' => $asset_url . '/vendors/speakingurl/speakingurl.min.js', 'deps' => [ 'jquery' ], ], 'dokan-admin' => [ 'src' => $asset_url . '/js/dokan-admin.js', 'deps' => [ 'jquery', 'wp-i18n' ], 'version' => filemtime( $asset_path . 'js/dokan-admin.js' ), ], 'dokan-vendor-registration' => [ 'src' => $asset_url . '/js/vendor-registration.js', 'deps' => [ 'dokan-form-validate', 'jquery', 'speaking-url', 'wp-i18n' ], 'version' => filemtime( $asset_path . 'js/vendor-registration.js' ), ], 'dokan-script' => [ 'src' => $asset_url . '/js/dokan.js', 'deps' => [ 'imgareaselect', 'customize-base', 'customize-model', 'wp-i18n', $jquery_tiptip, 'moment', 'dokan-date-range-picker', 'dokan-accounting' ], 'version' => filemtime( $asset_path . 'js/dokan.js' ), ], 'dokan-vue-vendor' => [ 'src' => $asset_url . '/js/vue-vendor.js', 'version' => filemtime( $asset_path . 'js/vue-vendor.js' ), 'deps' => [ 'wp-i18n', 'dokan-tinymce-plugin', 'dokan-chart' ], ], 'dokan-vue-bootstrap' => [ 'src' => $asset_url . '/js/vue-bootstrap.js', 'deps' => $bootstrap_deps, 'version' => filemtime( $asset_path . 'js/vue-bootstrap.js' ), ], 'dokan-vue-admin' => [ 'src' => $asset_url . '/js/vue-admin.js', 'deps' => [ 'jquery', 'jquery-ui-datepicker', 'wp-i18n', 'dokan-vue-vendor', 'dokan-vue-bootstrap', 'selectWoo' ], 'version' => filemtime( $asset_path . 'js/vue-admin.js' ), ], 'dokan-vue-frontend' => [ 'src' => $asset_url . '/js/vue-frontend.js', 'deps' => [ 'jquery', 'wp-i18n', 'dokan-vue-vendor', 'dokan-vue-bootstrap' ], 'version' => filemtime( $asset_path . 'js/vue-frontend.js' ), ], 'dokan-login-form-popup' => [ 'src' => $asset_url . '/js/login-form-popup.js', 'deps' => [ 'dokan-modal', 'wp-i18n' ], 'version' => filemtime( $asset_path . 'js/login-form-popup.js' ), ], 'dokan-sweetalert2' => [ 'src' => $asset_url . '/vendors/sweetalert2/sweetalert2.all.min.js', 'deps' => [ 'dokan-modal', 'wp-i18n' ], 'version' => filemtime( $asset_path . 'vendors/sweetalert2/sweetalert2.all.min.js' ), ], 'dokan-util-helper' => [ 'src' => $asset_url . '/js/helper.js', 'deps' => [ 'jquery', 'dokan-sweetalert2', 'moment' ], 'version' => filemtime( $asset_path . 'js/helper.js' ), 'in_footer' => false, ], 'dokan-promo-notice-js' => [ 'src' => $asset_url . '/js/dokan-promo-notice.js', 'deps' => [ 'jquery', 'dokan-vue-vendor' ], 'version' => filemtime( $asset_path . 'js/dokan-promo-notice.js' ), ], 'dokan-admin-notice-js' => [ 'src' => $asset_url . '/js/dokan-admin-notice.js', 'deps' => [ 'jquery', 'dokan-vue-vendor' ], 'version' => filemtime( $asset_path . 'js/dokan-admin-notice.js' ), ], 'dokan-reverse-withdrawal' => [ 'src' => $asset_url . '/js/reverse-withdrawal.js', 'deps' => [ 'jquery', 'dokan-util-helper', 'dokan-vue-vendor', 'dokan-date-range-picker' ], 'version' => filemtime( $asset_path . 'js/reverse-withdrawal.js' ), ], 'product-category-ui' => [ 'src' => $asset_url . '/js/product-category-ui.js', 'deps' => [ 'jquery', 'dokan-vue-vendor' ], 'version' => filemtime( $asset_path . 'js/product-category-ui.js' ), ], 'dokan-vendor-address' => [ 'src' => $asset_url . '/js/vendor-address.js', 'deps' => [ 'jquery', 'wc-address-i18n' ], 'version' => filemtime( $asset_path . 'js/vendor-address.js' ), ], 'dokan-admin-product' => [ 'src' => $asset_url . '/js/dokan-admin-product.js', 'deps' => [ 'jquery', 'dokan-vue-vendor', 'selectWoo' ], 'version' => filemtime( $asset_path . 'js/dokan-admin-product.js' ), 'in_footer' => false, ], 'dokan-frontend' => [ 'src' => $asset_url . '/js/dokan-frontend.js', 'deps' => [ 'jquery' ], 'version' => filemtime( $asset_path . 'js/dokan-frontend.js' ), ], 'dokan-react-frontend' => [ 'src' => $asset_url . '/js/frontend.js', 'deps' => array_merge( $frontend_shipping_asset['dependencies'], [ 'wp-core-data', 'dokan-react-components' ] ), 'version' => $frontend_shipping_asset['version'], ], 'dokan-jquery-tiptip' => [ 'src' => false, 'deps' => [ $jquery_tiptip ], 'version' => DOKAN_PLUGIN_VERSION, ], 'dokan-jquery-blockui' => [ 'src' => false, 'deps' => [ $jquery_blockui ], 'version' => DOKAN_PLUGIN_VERSION, ], ]; $require_dompurify = version_compare( WC()->version, '10.0.2', '>' ); if ( $require_dompurify && ! wp_script_is( 'dompurify', 'registered' ) ) { $scripts['dompurify'] = [ 'src' => WC()->plugin_url() . '/assets/js/dompurify/purify' . $suffix . '.js', 'deps' => [], ]; } if ( ! wp_script_is( $jquery_tiptip, 'registered' ) ) { $scripts[ $jquery_tiptip ] = [ 'src' => WC()->plugin_url() . '/assets/js/jquery-tiptip/jquery.tipTip' . $suffix . '.js', 'deps' => $require_dompurify ? [ 'jquery', 'dompurify' ] : [ 'jquery' ], ]; } if ( ! wp_script_is( $jquery_blockui, 'registered' ) ) { $scripts[ $jquery_blockui ] = [ 'src' => WC()->plugin_url() . '/assets/js/jquery-blockui/jquery.blockUI' . $suffix . '.js', 'deps' => [ 'jquery' ], ]; } $components_asset_file = DOKAN_DIR . '/assets/js/components.asset.php'; if ( file_exists( $components_asset_file ) ) { $components_asset = require $components_asset_file; // Register React components. $scripts['dokan-react-components'] = [ 'version' => $components_asset['version'], 'src' => $asset_url . '/js/components.js', 'deps' => array_merge( $components_asset['dependencies'], [ 'dokan-utilities', 'dokan-hooks' ] ), ]; } $utilities_asset_file = DOKAN_DIR . '/assets/js/utilities.asset.php'; if ( file_exists( $utilities_asset_file ) ) { $utilities_asset = require $utilities_asset_file; // Register React utilities. $scripts['dokan-utilities'] = [ 'version' => $utilities_asset['version'], 'src' => $asset_url . '/js/utilities.js', 'deps' => $utilities_asset['dependencies'], ]; } $hooks_asset_file = DOKAN_DIR . '/assets/js/react-hooks.asset.php'; if ( file_exists( $hooks_asset_file ) ) { $hooks_asset = require $hooks_asset_file; // Register React hooks. $scripts['dokan-hooks'] = [ 'version' => $hooks_asset['version'], 'src' => $asset_url . '/js/react-hooks.js', 'deps' => $hooks_asset['dependencies'], ]; } $core_store_asset_file = DOKAN_DIR . '/assets/js/core-store.asset.php'; if ( file_exists( $core_store_asset_file ) ) { $core_store_asset = require $core_store_asset_file; // Register React components. $scripts['dokan-stores-core'] = [ 'version' => $core_store_asset['version'], 'src' => $asset_url . '/js/core-store.js', 'deps' => $core_store_asset['dependencies'], ]; } $vendors_store_asset_file = DOKAN_DIR . '/assets/js/vendors-store.asset.php'; if ( file_exists( $vendors_store_asset_file ) ) { $vendors_store_asset = require $vendors_store_asset_file; // Register React components. $scripts['dokan-stores-vendors'] = [ 'version' => $vendors_store_asset['version'], 'src' => $asset_url . '/js/vendors-store.js', 'deps' => $vendors_store_asset['dependencies'], ]; } $product_store_asset_file = DOKAN_DIR . '/assets/js/products-store.asset.php'; if ( file_exists( $product_store_asset_file ) ) { $stores_asset = require $product_store_asset_file; // Register Product stores. $scripts['dokan-stores-products'] = [ 'version' => $stores_asset['version'], 'src' => $asset_url . '/js/products-store.js', 'deps' => $stores_asset['dependencies'], ]; } $product_category_asset_file = DOKAN_DIR . '/assets/js/product-categories-store.asset.php'; if ( file_exists( $product_category_asset_file ) ) { $stores_asset = require $product_category_asset_file; // Register Product stores. $scripts['dokan-stores-product-categories'] = [ 'version' => $stores_asset['version'], 'src' => $asset_url . '/js/product-categories-store.js', 'deps' => $stores_asset['dependencies'], ]; } $product_editor_asset_file = DOKAN_DIR . '/assets/js/product-editor-store.asset.php'; if ( file_exists( $product_editor_asset_file ) ) { $stores_asset = require $product_editor_asset_file; // Register Product Editor stores. $scripts['dokan-stores-product-editor'] = [ 'version' => $stores_asset['version'], 'src' => $asset_url . '/js/product-editor-store.js', 'deps' => $stores_asset['dependencies'], ]; } /* * Shared third-party UI bundles. * * These packages are imported by several entries (components, frontend, product editor, * admin dashboard). They are built once into their own bundles and externalised in * webpack-dependency-mapping.js, so each is downloaded and parsed a single time instead * of being inlined into every consuming bundle. */ $shared_ui_bundles = [ 'dokan-plugin-ui' => 'plugin-ui', 'dokan-ui' => 'dokan-ui', ]; foreach ( $shared_ui_bundles as $handle => $bundle ) { $shared_ui_asset_file = DOKAN_DIR . '/assets/js/' . $bundle . '.asset.php'; if ( ! file_exists( $shared_ui_asset_file ) ) { /* * Unlike the other bundles above, these handles are declared as dependencies of the * consuming bundles. A missing artifact therefore does not just drop this script — * WordPress refuses to enqueue every consumer too, taking the React UI down with it. * Log loudly so a broken build is diagnosable instead of failing silently. */ dokan_log( sprintf( 'Missing shared UI asset file %1$s. The "%2$s" script handle will not be registered, so every bundle depending on it will be skipped by WordPress. Run the asset build.', $shared_ui_asset_file, $handle ), 'error' ); continue; } $shared_ui_asset = require $shared_ui_asset_file; $scripts[ $handle ] = [ 'version' => $shared_ui_asset['version'], 'src' => $asset_url . '/js/' . $bundle . '.js', 'deps' => $shared_ui_asset['dependencies'], ]; } $product_editor_utils_file = DOKAN_DIR . '/assets/js/product-editor-utils.asset.php'; if ( file_exists( $product_editor_utils_file ) ) { $utils_asset = require $product_editor_utils_file; // Register shared Product Editor hooks, field-config & layout utilities. $scripts['dokan-product-editor-utils'] = [ 'version' => $utils_asset['version'], 'src' => $asset_url . '/js/product-editor-utils.js', 'deps' => $utils_asset['dependencies'], ]; } return $scripts; } /** * Registers WooCommerce Admin scripts for the React-based Dokan Vendor dashboard. * * This function ensures that the necessary WooCommerce Admin assets are registered * for use in the Dokan Vendor dashboard. It temporarily suppresses "doing it wrong" * warnings during the registration process. * * @return void */ public function register_wc_admin_scripts() { // Register WooCommerce Admin Assets for the React-base Dokan Vendor ler dashboard. if ( ! function_exists( 'get_current_screen' ) ) { require_once ABSPATH . '/wp-admin/includes/screen.php'; } add_filter( 'doing_it_wrong_trigger_error', [ $this, 'desable_doing_it_wrong_error' ] ); $wc_instance = WCAdminAssets::get_instance(); $wc_instance->register_scripts(); remove_filter( 'doing_it_wrong_trigger_error', [ $this, 'desable_doing_it_wrong_error' ] ); } /** * Disable "doing it wrong" error * * @return bool */ public function desable_doing_it_wrong_error() { return false; } /** * Enqueue front-end scripts */ public function enqueue_front_scripts() { if ( ! function_exists( 'WC' ) ) { return; } // load dokan style on every pages. requires for shortcodes in other pages if ( DOKAN_LOAD_STYLE ) { wp_enqueue_style( 'dokan-style' ); wp_enqueue_style( 'dokan-modal' ); if ( 'off' === dokan_get_option( 'disable_dokan_fontawesome', 'dokan_appearance', 'off' ) ) { wp_enqueue_style( 'dokan-fontawesome' ); } if ( is_rtl() ) { wp_enqueue_style( 'dokan-rtl-style' ); } } $vendor = dokan()->vendor->get( dokan_get_current_user_id() ); $commision_settings = $vendor->get_commission_settings(); $default_script = [ 'ajaxurl' => admin_url( 'admin-ajax.php' ), 'nonce' => wp_create_nonce( 'dokan_reviews' ), 'order_nonce' => wp_create_nonce( 'dokan_view_order' ), 'product_edit_nonce' => wp_create_nonce( 'dokan_edit_product_nonce' ), 'ajax_loader' => DOKAN_PLUGIN_ASSEST . '/images/ajax-loader.gif', 'seller' => [ 'available' => __( 'Available', 'dokan-lite' ), 'notAvailable' => __( 'Not Available', 'dokan-lite' ), ], 'delete_confirm' => __( 'Are you sure?', 'dokan-lite' ), 'wrong_message' => __( 'Something went wrong. Please try again.', 'dokan-lite' ), 'vendor_percentage' => $commision_settings->get_percentage(), 'commission_type' => $commision_settings->get_type(), 'rounding_precision' => wc_get_rounding_precision(), 'mon_decimal_point' => wc_get_price_decimal_separator(), 'currency_format_num_decimals' => wc_get_price_decimals(), 'currency_format_symbol' => get_woocommerce_currency_symbol(), 'currency_format_decimal_sep' => esc_attr( wc_get_price_decimal_separator() ), 'currency_format_thousand_sep' => esc_attr( wc_get_price_thousand_separator() ), 'currency_format' => esc_attr( str_replace( [ '%1$s', '%2$s' ], [ '%s', '%v' ], get_woocommerce_price_format() ) ), // For accounting JS 'round_at_subtotal' => get_option( 'woocommerce_tax_round_at_subtotal', 'no' ), 'product_types' => apply_filters( 'dokan_product_types', [ 'simple' ] ), 'loading_img' => DOKAN_PLUGIN_ASSEST . '/images/loading.gif', 'store_product_search_nonce' => wp_create_nonce( 'dokan_store_product_search_nonce' ), 'i18n_download_permission' => __( 'Are you sure you want to revoke access to this download?', 'dokan-lite' ), 'i18n_download_access' => __( 'Could not grant access - the user may already have permission for this file or billing email is not set. Ensure the billing email is set, and the order has been saved.', 'dokan-lite' ), /** * Filter of maximun a vendor can add tags. * * @since 3.3.7 * * @param integer default -1 */ 'maximum_tags_select_length' => apply_filters( 'dokan_product_tags_select_max_length', - 1 ), // Filter of maximun a vendor can add tags 'modal_header_color' => 'var(--dokan-button-background-color, #7047EB)', // Shipment feature flags (used by JS order list to match PHP template behavior) 'allow_shipment' => dokan_get_option( 'enabled', 'dokan_shipping_status_setting', 'off' ), 'wc_shipping_enabled' => get_option( 'woocommerce_calc_shipping' ) === 'yes', 'has_shipment_func' => function_exists( 'dokan_get_order_shipment_current_status' ), ]; $localize_script = apply_filters( 'dokan_localized_args', $default_script ); $vue_localize_script = apply_filters( 'dokan_frontend_localize_script', [ 'rest' => [ 'root' => esc_url_raw( get_rest_url() ), 'nonce' => wp_create_nonce( 'wp_rest' ), 'version' => 'dokan/v1', ], 'api' => null, 'libs' => [], 'routeComponents' => [ 'default' => null ], 'routes' => $this->get_vue_frontend_routes(), 'urls' => [ 'assetsUrl' => DOKAN_PLUGIN_ASSEST, 'dashboardUrl' => dokan_get_navigation_url() . ( ReportUtil::is_analytics_enabled() ? '?path=%2Fanalytics%2FOverview' : '' ), 'storeUrl' => dokan_get_store_url( dokan_get_current_user_id() ), 'ordersUrl' => dokan_get_navigation_url( 'orders' ), 'legacyOrdersUrl' => dokan_add_subpage_to_url( rtrim( get_permalink( (int) dokan_get_option( 'dashboard', 'dokan_pages', 0 ) ), '/' ) . '/', 'orders/' ), ], 'nonces' => [ 'viewOrder' => wp_create_nonce( 'dokan_view_order' ), 'orderExport' => wp_create_nonce( 'dokan_vendor_order_export_action' ), ], 'orderStatuses' => $this->get_order_listing_statuses(), ] ); $localize_data = array_merge( $localize_script, $vue_localize_script ); // Remove `dokan-i18n-jed` in next release. wp_localize_script( 'dokan-i18n-jed', 'dokan', $localize_data ); wp_localize_script( 'dokan-util-helper', 'dokan', $localize_data ); // wp_localize_script( 'dokan-vue-bootstrap', 'dokan', $localize_data ); // wp_localize_script( 'dokan-script', 'dokan', $localize_data ); // localized vendor-registration script wp_localize_script( 'dokan-vendor-registration', 'dokanRegistrationI18n', [ 'defaultRole' => dokan_get_seller_registration_default_role(), ] ); // load only in dokan dashboard and product edit page if ( ( dokan_is_seller_dashboard() || ( get_query_var( 'edit' ) && is_singular( 'product' ) ) ) || apply_filters( 'dokan_forced_load_scripts', false ) ) { $this->dokan_dashboard_scripts(); } // Load category ui css in product add, edit and list page. global $wp; if ( ( dokan_is_seller_dashboard() && isset( $wp->query_vars['products'] ) ) || ( isset( $wp->query_vars['products'], $_GET['product_id'] ) ) || ( dokan_is_seller_dashboard() && isset( $wp->query_vars['new-product'] ) ) ) { // phpcs:ignore CategoryHelper::enqueue_and_localize_dokan_multistep_category(); } // store and my account page if ( dokan_is_store_page() || dokan_is_store_review_page() || is_account_page() || is_product() || dokan_is_store_listing() ) { if ( DOKAN_LOAD_STYLE ) { wp_enqueue_style( 'dokan-select2-css' ); } if ( DOKAN_LOAD_SCRIPTS ) { $this->load_gmap_script(); wp_enqueue_script( 'jquery-ui-sortable' ); wp_enqueue_script( 'jquery-ui-datepicker' ); wp_enqueue_script( 'dokan-tooltip' ); wp_enqueue_script( 'dokan-form-validate' ); wp_enqueue_script( 'speaking-url' ); wp_enqueue_script( 'dokan-script' ); wp_enqueue_script( 'dokan-select2-js' ); } } if ( is_account_page() && ! is_user_logged_in() ) { wp_enqueue_script( 'dokan-vendor-registration' ); wp_enqueue_script( 'dokan-vendor-address' ); } if ( dokan_is_seller_dashboard() && isset( $wp->query_vars['settings'] ) && 'store' === $wp->query_vars['settings'] ) { wp_enqueue_script( 'dokan-vendor-address' ); } // Scripts for contact form captcha (provider managed) if ( dokan_is_store_page() || is_product() ) { dokan_get_container()->get( \WeDevs\Dokan\Captcha\Manager::class )->register_assets(); } // localized form validate script self::load_form_validate_script(); // Enqueue vendor onboarding assets only on the vendor onboarding/registration page. if ( is_page() ) { global $post; if ( $post && has_shortcode( $post->post_content, 'dokan-vendor-onboarding-registration' ) ) { wp_enqueue_style( 'dokan-vendor-onboarding', plugin_dir_url( DOKAN_FILE ) . 'assets/css/vendor-onboarding.css', [], DOKAN_PLUGIN_VERSION ); wp_enqueue_script( 'dokan-vendor-onboarding', plugin_dir_url( DOKAN_FILE ) . 'assets/js/vendor-onboarding-js.js', [ 'jquery' ], DOKAN_PLUGIN_VERSION, true ); } } do_action( 'dokan_enqueue_scripts' ); } /** * Enqueue Dokan Helper Script * * @since 3.2.7 */ public function load_dokan_global_scripts() { // Dokan helper JS file, need to load this file wp_enqueue_script( 'dokan-util-helper' ); $localize_data = apply_filters( 'dokan_helper_localize_script', [ 'i18n_date_format' => wc_date_format(), 'i18n_time_format' => wc_time_format(), 'week_starts_day' => intval( get_option( 'start_of_week', 0 ) ), 'reverse_withdrawal' => [ 'enabled' => SettingsHelper::is_enabled(), ], 'timepicker_locale' => [ 'am' => _x( 'am', 'time constant', 'dokan-lite' ), 'pm' => _x( 'pm', 'time constant', 'dokan-lite' ), 'AM' => _x( 'AM', 'time constant', 'dokan-lite' ), 'PM' => _x( 'PM', 'time constant', 'dokan-lite' ), 'hr' => _x( 'hr', 'time constant', 'dokan-lite' ), 'hrs' => _x( 'hrs', 'time constant', 'dokan-lite' ), 'mins' => _x( 'mins', 'time constant', 'dokan-lite' ), ], 'daterange_picker_local' => [ 'toLabel' => __( 'To', 'dokan-lite' ), 'firstDay' => intval( get_option( 'start_of_week', 0 ) ), 'fromLabel' => __( 'From', 'dokan-lite' ), 'separator' => __( ' - ', 'dokan-lite' ), 'weekLabel' => __( 'W', 'dokan-lite' ), 'applyLabel' => __( 'Apply', 'dokan-lite' ), 'cancelLabel' => __( 'Clear', 'dokan-lite' ), 'customRangeLabel' => __( 'Custom', 'dokan-lite' ), 'daysOfWeek' => [ __( 'Su', 'dokan-lite' ), __( 'Mo', 'dokan-lite' ), __( 'Tu', 'dokan-lite' ), __( 'We', 'dokan-lite' ), __( 'Th', 'dokan-lite' ), __( 'Fr', 'dokan-lite' ), __( 'Sa', 'dokan-lite' ), ], 'monthNames' => [ __( 'January', 'dokan-lite' ), __( 'February', 'dokan-lite' ), __( 'March', 'dokan-lite' ), __( 'April', 'dokan-lite' ), __( 'May', 'dokan-lite' ), __( 'June', 'dokan-lite' ), __( 'July', 'dokan-lite' ), __( 'August', 'dokan-lite' ), __( 'September', 'dokan-lite' ), __( 'October', 'dokan-lite' ), __( 'November', 'dokan-lite' ), __( 'December', 'dokan-lite' ), ], ], 'sweetalert_local' => [ 'cancelButtonText' => __( 'Cancel', 'dokan-lite' ), 'closeButtonText' => __( 'Close', 'dokan-lite' ), 'confirmButtonText' => __( 'OK', 'dokan-lite' ), 'denyButtonText' => __( 'No', 'dokan-lite' ), 'closeButtonAriaLabel' => __( 'Close this dialog', 'dokan-lite' ), ], ] ); wp_localize_script( 'dokan-util-helper', 'dokan_helper', $localize_data ); $dokan_frontend = [ 'currency' => dokan_get_container()->get( 'scripts' )->get_localized_price(), ]; // localize dokan frontend script wp_localize_script( 'dokan-react-frontend', 'dokanFrontend', apply_filters( 'dokan_react_frontend_localized_args', $dokan_frontend ), ); } /** * Load form validate script args * * @since 2.5.3 */ public static function load_form_validate_script() { $form_validate_messages = [ 'required' => __( 'This field is required', 'dokan-lite' ), 'remote' => __( 'Please fix this field.', 'dokan-lite' ), 'email' => __( 'Please enter a valid email address.', 'dokan-lite' ), 'url' => __( 'Please enter a valid URL.', 'dokan-lite' ), 'date' => __( 'Please enter a valid date.', 'dokan-lite' ), 'dateISO' => __( 'Please enter a valid date (ISO).', 'dokan-lite' ), 'number' => __( 'Please enter a valid number.', 'dokan-lite' ), 'digits' => __( 'Please enter only digits.', 'dokan-lite' ), 'creditcard' => __( 'Please enter a valid credit card number.', 'dokan-lite' ), 'equalTo' => __( 'Please enter the same value again.', 'dokan-lite' ), 'maxlength_msg' => __( 'Please enter no more than {0} characters.', 'dokan-lite' ), 'minlength_msg' => __( 'Please enter at least {0} characters.', 'dokan-lite' ), 'rangelength_msg' => __( 'Please enter a value between {0} and {1} characters long.', 'dokan-lite' ), 'range_msg' => __( 'Please enter a value between {0} and {1}.', 'dokan-lite' ), 'max_msg' => __( 'Please enter a value less than or equal to {0}.', 'dokan-lite' ), 'min_msg' => __( 'Please enter a value greater than or equal to {0}.', 'dokan-lite' ), ]; // @codingStandardsIgnoreLine wp_localize_script( 'dokan-form-validate', 'DokanValidateMsg', apply_filters( 'DokanValidateMsg_args', $form_validate_messages ) ); } /** * Load Dokan Dashboard Scripts * * @since 2.5.3 * * @global $wp */ public function dokan_dashboard_scripts() { global $wp; if ( DOKAN_LOAD_STYLE ) { wp_enqueue_style( 'jquery-ui' ); wp_enqueue_style( 'woocommerce-general' ); wp_enqueue_style( 'dokan-select2-css' ); if ( isset( $wp->query_vars['products'] ) || isset( $wp->query_vars['withdraw'] ) || isset( $wp->query_vars['withdraw-requests'] ) || isset( $wp->query_vars['products-search'] ) ) { wp_enqueue_style( 'dokan-modal' ); } if ( isset( $wp->query_vars['products'] ) || isset( $wp->query_vars['orders'] ) || isset( $wp->query_vars['coupons'] ) || isset( $wp->query_vars['reports'] ) || ( isset( $wp->query_vars['settings'] ) && in_array( $wp->query_vars['settings'], [ 'store', 'shipping' ], true ) ) ) { wp_enqueue_style( 'dokan-timepicker' ); wp_enqueue_style( 'dokan-date-range-picker' ); } } if ( DOKAN_LOAD_SCRIPTS ) { self::load_form_validate_script(); $this->load_gmap_script(); wp_enqueue_script( 'jquery' ); wp_enqueue_script( 'jquery-ui' ); wp_enqueue_script( 'jquery-ui-autocomplete' ); wp_enqueue_script( 'jquery-ui-datepicker' ); wp_enqueue_script( 'underscore' ); wp_enqueue_script( 'post' ); wp_enqueue_script( 'dokan-date-range-picker' ); wp_enqueue_script( 'dokan-tooltip' ); wp_enqueue_script( 'dokan-form-validate' ); if ( isset( $wp->query_vars['products'] ) || isset( $wp->query_vars['tools'] ) ) { wp_enqueue_script( 'dokan-tabs' ); } if ( isset( $wp->query_vars['page'] ) || isset( $wp->query_vars['reports'] ) ) { wp_enqueue_script( 'dokan-chart' ); wp_enqueue_script( 'dokan-flot' ); } wp_enqueue_script( 'dokan-select2-js' ); wp_enqueue_media(); wp_enqueue_script( 'dokan-accounting' ); wp_enqueue_script( 'serializejson' ); if ( isset( $wp->query_vars['products'] ) || isset( $wp->query_vars['withdraw'] ) || isset( $wp->query_vars['withdraw-requests'] ) ) { wp_enqueue_style( 'dokan-modal' ); wp_enqueue_script( 'dokan-modal' ); } wp_enqueue_script( 'wc-password-strength-meter' ); wp_enqueue_script( 'dokan-script' ); } if ( isset( $wp->query_vars['settings'] ) && $wp->query_vars['settings'] === 'store' ) { wp_enqueue_script( 'wc-country-select' ); wp_enqueue_script( 'dokan-timepicker' ); } } /** * Load google map script * * @since 2.5.3 */ public function load_gmap_script() { $script_src = null; $source = dokan_get_option( 'map_api_source', 'dokan_appearance', 'google_maps' ); if ( 'google_maps' === $source ) { $api_key = dokan_get_option( 'gmap_api_key', 'dokan_appearance', false ); if ( $api_key ) { $query_args = apply_filters( 'dokan_google_maps_script_query_args', [ 'key' => $api_key, 'callback' => 'Function.prototype', ] ); $script_src = add_query_arg( $query_args, 'https://maps.googleapis.com/maps/api/js' ); wp_enqueue_script( 'dokan-maps', $script_src, [], DOKAN_PLUGIN_VERSION, true ); } } elseif ( 'mapbox' === $source ) { $access_token = dokan_get_option( 'mapbox_access_token', 'dokan_appearance', null ); if ( $access_token ) { wp_enqueue_style( 'dokan-mapbox-gl', 'https://api.mapbox.com/mapbox-gl-js/v1.4.1/mapbox-gl.css', [], DOKAN_PLUGIN_VERSION ); wp_enqueue_style( 'dokan-mapbox-gl-geocoder', 'https://api.mapbox.com/mapbox-gl-js/plugins/mapbox-gl-geocoder/v4.2.0/mapbox-gl-geocoder.css', [ 'dokan-mapbox-gl' ], DOKAN_PLUGIN_VERSION ); wp_enqueue_script( 'dokan-mapbox-gl-geocoder', 'https://api.mapbox.com/mapbox-gl-js/plugins/mapbox-gl-geocoder/v4.2.0/mapbox-gl-geocoder.min.js', [], DOKAN_PLUGIN_VERSION, true ); wp_enqueue_script( 'dokan-maps', 'https://api.mapbox.com/mapbox-gl-js/v1.4.1/mapbox-gl.js', [ 'dokan-mapbox-gl-geocoder' ], DOKAN_PLUGIN_VERSION, true ); } } // Backward compatibility script handler wp_register_script( 'google-maps', DOKAN_PLUGIN_ASSEST . '/js/dokan-maps-compat.js', [ 'dokan-maps' ], DOKAN_PLUGIN_VERSION, true ); } /** * Filter 'dokan' localize script's arguments * * @since 2.5.3 * * @param array $default_args * * @return $default_args */ public function conditional_localized_args( $default_args ) { if ( dokan_is_seller_dashboard() || ( get_query_var( 'edit' ) && is_singular( 'product' ) ) || dokan_is_store_page() || is_account_page() || is_product() || dokan_is_store_listing() || apply_filters( 'dokan_force_load_extra_args', false ) ) { $general_settings = get_option( 'dokan_general', [] ); $decimal = wc_get_price_decimal_separator(); $banner_width = dokan_get_vendor_store_banner_width(); $banner_height = dokan_get_vendor_store_banner_height(); $has_flex_width = ! empty( $general_settings['store_banner_flex_width'] ) ? $general_settings['store_banner_flex_width'] : true; $has_flex_height = ! empty( $general_settings['store_banner_flex_height'] ) ? $general_settings['store_banner_flex_height'] : true; $custom_args = [ 'i18n_choose_featured_img' => __( 'Upload featured image', 'dokan-lite' ), 'i18n_choose_file' => __( 'Choose a file', 'dokan-lite' ), 'i18n_choose_gallery' => __( 'Add Images to Product Gallery', 'dokan-lite' ), 'i18n_choose_featured_img_btn_text' => __( 'Set featured image', 'dokan-lite' ), 'i18n_choose_file_btn_text' => __( 'Insert file URL', 'dokan-lite' ), 'i18n_choose_gallery_btn_text' => __( 'Add to gallery', 'dokan-lite' ), 'duplicates_attribute_messg' => __( 'Sorry, this attribute option already exists, Try a different one.', 'dokan-lite' ), 'variation_unset_warning' => __( 'Warning! This product will not have any variations if this option is not checked.', 'dokan-lite' ), 'new_attribute_prompt' => __( 'Enter a name for the new attribute term:', 'dokan-lite' ), 'remove_attribute' => __( 'Remove this attribute?', 'dokan-lite' ), 'dokan_placeholder_img_src' => wc_placeholder_img_src(), 'add_variation_nonce' => wp_create_nonce( 'add-variation' ), 'link_variation_nonce' => wp_create_nonce( 'link-variations' ), 'delete_variations_nonce' => wp_create_nonce( 'delete-variations' ), 'load_variations_nonce' => wp_create_nonce( 'load-variations' ), 'save_variations_nonce' => wp_create_nonce( 'save-variations' ), 'bulk_edit_variations_nonce' => wp_create_nonce( 'bulk-edit-variations' ), /* translators: %d: max linked variation. */ 'i18n_link_all_variations' => esc_js( sprintf( __( 'Are you sure you want to link all variations? This will create a new variation for each and every possible combination of variation attributes (max %d per run).', 'dokan-lite' ), defined( 'WC_MAX_LINKED_VARIATIONS' ) ? WC_MAX_LINKED_VARIATIONS : 50 ) ), 'i18n_enter_a_value' => esc_js( __( 'Enter a value', 'dokan-lite' ) ), 'i18n_enter_menu_order' => esc_js( __( 'Variation menu order (determines position in the list of variations)', 'dokan-lite' ) ), 'i18n_enter_a_value_fixed_or_percent' => esc_js( __( 'Enter a value (fixed or %)', 'dokan-lite' ) ), 'i18n_delete_all_variations' => esc_js( __( 'Are you sure you want to delete all variations? This cannot be undone.', 'dokan-lite' ) ), 'i18n_last_warning' => esc_js( __( 'Last warning, are you sure?', 'dokan-lite' ) ), 'i18n_choose_image' => esc_js( __( 'Choose an image', 'dokan-lite' ) ), 'i18n_set_image' => esc_js( __( 'Set variation image', 'dokan-lite' ) ), 'i18n_variation_added' => esc_js( __( 'variation added', 'dokan-lite' ) ), 'i18n_variations_added' => esc_js( __( 'variations added', 'dokan-lite' ) ), 'i18n_no_variations_added' => esc_js( __( 'No variations added', 'dokan-lite' ) ), 'i18n_remove_variation' => esc_js( __( 'Are you sure you want to remove this variation?', 'dokan-lite' ) ), 'i18n_scheduled_sale_start' => esc_js( __( 'Sale start date (YYYY-MM-DD format or leave blank)', 'dokan-lite' ) ), 'i18n_scheduled_sale_end' => esc_js( __( 'Sale end date (YYYY-MM-DD format or leave blank)', 'dokan-lite' ) ), 'i18n_edited_variations' => esc_js( __( 'Save changes before changing page?', 'dokan-lite' ) ), 'i18n_variation_count_single' => esc_js( __( '%qty% variation', 'dokan-lite' ) ), 'i18n_variation_count_plural' => esc_js( __( '%qty% variations', 'dokan-lite' ) ), 'i18n_no_result_found' => esc_js( __( 'No Result Found', 'dokan-lite' ) ), 'i18n_sales_price_error' => esc_js( __( 'Please insert value less than the regular price!', 'dokan-lite' ) ), /* translators: %s: decimal */ 'i18n_decimal_error' => sprintf( __( 'Please enter with one decimal point (%s) without thousand separators.', 'dokan-lite' ), $decimal ), /* translators: %s: price decimal separator */ 'i18n_mon_decimal_error' => sprintf( __( 'Please enter with one monetary decimal point (%s) without thousand separators and currency symbols.', 'dokan-lite' ), wc_get_price_decimal_separator() ), 'i18n_country_iso_error' => __( 'Please enter in country code with two capital letters.', 'dokan-lite' ), 'i18n_sale_less_than_regular_error' => __( 'Please enter in a value less than the regular price.', 'dokan-lite' ), 'i18n_delete_product_notice' => __( 'This product has produced sales and may be linked to existing orders. Are you sure you want to delete it?', 'dokan-lite' ), 'i18n_remove_personal_data_notice' => __( 'This action cannot be reversed. Are you sure you wish to erase personal data from the selected orders?', 'dokan-lite' ), 'decimal_point' => $decimal, 'mon_decimal_point' => wc_get_price_decimal_separator(), 'variations_per_page' => absint( apply_filters( 'dokan_product_variations_per_page', 10 ) ), 'store_banner_dimension' => [ 'width' => $banner_width, 'height' => $banner_height, 'flex-width' => $has_flex_width, 'flex-height' => $has_flex_height, ], 'selectAndCrop' => __( 'Select and Crop', 'dokan-lite' ), 'chooseImage' => __( 'Choose Image', 'dokan-lite' ), 'product_title_required' => __( 'Product title is required', 'dokan-lite' ), 'product_category_required' => __( 'Product category is required', 'dokan-lite' ), 'product_created_response' => __( 'Product created successfully', 'dokan-lite' ), 'search_products_nonce' => wp_create_nonce( 'search-products' ), 'search_products_tags_nonce' => wp_create_nonce( 'search-products-tags' ), 'search_products_brands_nonce' => wp_create_nonce( 'search-products-brands' ), 'search_customer_nonce' => wp_create_nonce( 'search-customer' ), 'i18n_matches_1' => __( 'One result is available, press enter to select it.', 'dokan-lite' ), 'i18n_matches_n' => __( '%qty% results are available, use up and down arrow keys to navigate.', 'dokan-lite' ), 'i18n_no_matches' => __( 'No matches found', 'dokan-lite' ), 'i18n_ajax_error' => __( 'Loading failed', 'dokan-lite' ), 'i18n_input_too_short_1' => __( 'Please enter 1 or more characters', 'dokan-lite' ), 'i18n_input_too_short_n' => __( 'Please enter %qty% or more characters', 'dokan-lite' ), 'i18n_input_too_long_1' => __( 'Please delete 1 character', 'dokan-lite' ), 'i18n_input_too_long_n' => __( 'Please delete %qty% characters', 'dokan-lite' ), 'i18n_selection_too_long_1' => __( 'You can only select 1 item', 'dokan-lite' ), 'i18n_selection_too_long_n' => __( 'You can only select %qty% items', 'dokan-lite' ), 'i18n_load_more' => __( 'Loading more results…', 'dokan-lite' ), 'i18n_searching' => __( 'Searching…', 'dokan-lite' ), 'i18n_calculating' => __( 'Calculating', 'dokan-lite' ), 'i18n_ok_text' => __( 'OK', 'dokan-lite' ), 'i18n_cancel_text' => __( 'Cancel', 'dokan-lite' ), 'i18n_attribute_label' => __( 'Attribute Name', 'dokan-lite' ), 'i18n_date_format' => get_option( 'date_format' ), 'dokan_banner_added_alert_msg' => __( 'Are you sure? You have uploaded banner but didn\'t click the Update Settings button!', 'dokan-lite' ), 'update_settings' => __( 'Update Settings', 'dokan-lite' ), 'search_downloadable_products_nonce' => wp_create_nonce( 'search-downloadable-products' ), 'search_downloadable_products_placeholder' => __( 'Please enter 3 or more characters', 'dokan-lite' ), ]; $default_args = array_merge( $default_args, $custom_args ); } return $default_args; } /** * Get file prefix * * @return string */ public function get_prefix() { $prefix = ( defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ) ? '' : '.min'; return $prefix; } /** * Register scripts * * @param array $scripts * * @return void */ public function register_scripts( $scripts ) { foreach ( $scripts as $handle => $script ) { $deps = isset( $script['deps'] ) ? $script['deps'] : false; $in_footer = isset( $script['in_footer'] ) ? $script['in_footer'] : true; $version = isset( $script['version'] ) ? $script['version'] : DOKAN_PLUGIN_VERSION; wp_register_script( $handle, $script['src'], $deps, $version, $in_footer ); // Add this check to avoid translation issues for scripts without a source file. if ( ! empty( $script['src'] ) ) { wp_set_script_translations( $handle, 'dokan-lite', plugin_dir_path( DOKAN_FILE ) . 'languages' ); } } } /** * Register styles * * @param array $styles * * @return void */ public function register_styles( $styles ) { foreach ( $styles as $handle => $style ) { $deps = isset( $style['deps'] ) ? $style['deps'] : false; $version = isset( $style['version'] ) ? $style['version'] : DOKAN_PLUGIN_VERSION; wp_register_style( $handle, $style['src'], $deps, $version ); } } /** * Enqueue the scripts * * @param array $scripts * * @return void */ public function enqueue_scripts( $scripts ) { foreach ( $scripts as $handle => $script ) { wp_enqueue_script( $handle ); } } /** * Enqueue styles * * @param array $styles * * @return void */ public function enqueue_styles( $styles ) { foreach ( $styles as $handle => $script ) { wp_enqueue_style( $handle ); } } /** * Admin localized scripts * * @since 3.0.0 * * @return array */ public function get_admin_localized_scripts() { $general_settings = get_option( 'dokan_general', [] ); $banner_width = dokan_get_option( 'store_banner_width', 'dokan_appearance', 625 ); $banner_height = dokan_get_option( 'store_banner_height', 'dokan_appearance', 300 ); $has_flex_width = ! empty( $general_settings['store_banner_flex_width'] ) ? $general_settings['store_banner_flex_width'] : true; $has_flex_height = ! empty( $general_settings['store_banner_flex_height'] ) ? $general_settings['store_banner_flex_height'] : true; $decimal = wc_get_price_decimal_separator(); return apply_filters( 'dokan_admin_localize_script', [ 'ajaxurl' => admin_url( 'admin-ajax.php' ), 'nonce' => wp_create_nonce( 'dokan_admin' ), 'rest' => [ 'root' => esc_url_raw( get_rest_url() ), 'nonce' => wp_create_nonce( 'wp_rest' ), 'version' => 'dokan/v1', ], 'api' => null, 'libs' => [], 'routeComponents' => [ 'default' => null ], 'routes' => $this->get_vue_admin_routes(), 'currency' => $this->get_localized_price(), 'proNag' => dokan()->is_pro_exists() ? 'hide' : get_option( 'dokan_hide_pro_nag', 'show' ), 'hasPro' => dokan()->is_pro_exists(), 'showPromoBanner' => empty( Helper::dokan_get_promo_notices() ), 'hasNewVersion' => Helper::dokan_has_new_version(), 'proVersion' => dokan()->is_pro_exists() ? dokan_pro()->version : '', 'urls' => [ 'adminRoot' => admin_url(), 'siteUrl' => home_url( '/' ), 'storePrefix' => dokan_get_option( 'custom_store_url', 'dokan_general', 'store' ), 'assetsUrl' => DOKAN_PLUGIN_ASSEST, 'buynowpro' => dokan_pro_buynow_url(), 'upgradeToPro' => 'https://dokan.co/wordpress/upgrade-to-pro/?utm_source=plugin&utm_medium=wp-admin&utm_campaign=dokan-lite', 'dummy_data' => DOKAN_PLUGIN_ASSEST . '/dummy-data/dokan_dummy_data.csv', 'adminOrderListUrl' => OrderUtil::get_admin_order_list_url(), 'adminOrderEditUrl' => OrderUtil::get_admin_order_edit_url(), ], 'states' => WC()->countries->get_allowed_country_states(), 'countries' => WC()->countries->get_allowed_countries(), 'current_time' => current_time( 'mysql' ), 'store_banner_dimension' => [ 'width' => $banner_width, 'height' => $banner_height, 'flex-width' => $has_flex_width, 'flex-height' => $has_flex_height, ], 'ajax_loader' => DOKAN_PLUGIN_ASSEST . '/images/spinner-2x.gif', /* translators: %s: decimal */ 'i18n_decimal_error' => sprintf( __( 'Please enter with one decimal point (%s) without thousand separators.', 'dokan-lite' ), $decimal ), /* translators: %s: price decimal separator */ 'i18n_mon_decimal_error' => sprintf( __( 'Please enter with one monetary decimal point (%s) without thousand separators and currency symbols.', 'dokan-lite' ), wc_get_price_decimal_separator() ), 'i18n_country_iso_error' => __( 'Please enter in country code with two capital letters.', 'dokan-lite' ), 'i18n_sale_less_than_regular_error' => __( 'Please enter in a value less than the regular price.', 'dokan-lite' ), 'i18n_delete_product_notice' => __( 'This product has produced sales and may be linked to existing orders. Are you sure you want to delete it?', 'dokan-lite' ), 'i18n_remove_personal_data_notice' => __( 'This action cannot be reversed. Are you sure you wish to erase personal data from the selected orders?', 'dokan-lite' ), 'decimal_point' => $decimal, 'mon_decimal_point' => wc_get_price_decimal_separator(), 'i18n_date_format' => wc_date_format(), // Shipment feature flags (used by React order list) 'allow_shipment' => dokan_get_option( 'enabled', 'dokan_shipping_status_setting', 'off' ), 'wc_shipping_enabled' => get_option( 'woocommerce_calc_shipping' ) === 'yes', 'has_shipment_func' => function_exists( 'dokan_get_order_shipment_current_status' ), ] ); } /** * Admin vue localized scripts * * @since 3.14.0 * * @return array */ private function get_vue_admin_localized_scripts() { return apply_filters( 'dokan_vue_admin_localize_script', [ 'commission_types' => dokan_commission_types(), 'reserved_slugs' => dokan_get_reserved_url_slugs(), ] ); } /** * Get order listing statuses for the frontend. * * Reuses the same filter logic as dokan_order_listing_status_filter() so that * the React-based order list respects excluded and custom statuses. * * @since 5.0.0 * * @return array<int, array{value: string, label: string}> */ private function get_order_listing_statuses(): array { /** This filter is documented in includes/template-tags.php */ $exclude_statuses = (array) apply_filters( 'dokan_vendor_dashboard_excluded_order_statuses', [ 'wc-checkout-draft' ] ); $exclude_statuses = array_flip( $exclude_statuses ); $wc_order_statuses = function_exists( 'wc_get_order_statuses' ) ? wc_get_order_statuses() : []; $filtered_statuses = array_diff_key( $wc_order_statuses, $exclude_statuses ); $order_statuses = array_merge( [ 'all' => __( 'All', 'dokan-lite' ) ], $filtered_statuses ); /** This filter is documented in includes/template-tags.php */ $order_statuses = apply_filters( 'dokan_vendor_dashboard_order_listing_statuses', $order_statuses ); $result = []; foreach ( $order_statuses as $value => $label ) { $result[] = [ 'value' => $value, 'label' => $label, ]; } return $result; } }