[ title, menu title, screen id ]. * * @return array */ public static function screens() { $screens = array( 'dango-cod' => array( __( 'COD Order Form', 'dango-cod-order-form' ), __( 'Dashboard', 'dango-cod-order-form' ), 'dashboard', 10 ), 'dango-cod-builder' => array( __( 'Form builder', 'dango-cod-order-form' ), __( 'Form builder', 'dango-cod-order-form' ), 'builder', 20 ), 'dango-cod-settings' => array( __( 'Settings', 'dango-cod-order-form' ), __( 'Settings', 'dango-cod-order-form' ), 'settings', 30 ), 'dango-cod-protection' => array( __( 'Fake-order protection', 'dango-cod-order-form' ), __( 'Protection', 'dango-cod-order-form' ), 'protection', 40 ), ); if ( ! self::$plugin->is_pro() ) { $screens['dango-cod-addons'] = array( __( 'Add-ons', 'dango-cod-order-form' ), __( 'Add-ons', 'dango-cod-order-form' ), 'addons', 90 ); } /** * Admin screens. Pro adds Offers, Leads, Analytics, Integrations, Licence. * * @param array $screens slug => array( page title, menu title, screen id, position ). */ $screens = (array) apply_filters( 'dango_cof_admin_screens', $screens ); uasort( $screens, static function ( $a, $b ) { return ( isset( $a[3] ) ? $a[3] : 50 ) <=> ( isset( $b[3] ) ? $b[3] : 50 ); } ); return $screens; } /** * Register menu pages. */ public static function menu() { $icon = 'data:image/svg+xml;base64,' . base64_encode( '' ); // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions.obfuscation_base64_encode -- menu icon data URI. self::$hooks[] = add_menu_page( __( 'COD Order Form', 'dango-cod-order-form' ), __( 'COD Form', 'dango-cod-order-form' ), self::CAP, 'dango-cod', array( __CLASS__, 'render' ), $icon, 56 ); foreach ( self::screens() as $slug => $s ) { self::$hooks[] = add_submenu_page( 'dango-cod', $s[0], $s[1], self::CAP, $slug, array( __CLASS__, 'render' ) ); } } /** * Is this one of our pages? * * @return string Screen id or ''. */ public static function current_screen() { $page = isset( $_GET['page'] ) ? sanitize_key( wp_unslash( $_GET['page'] ) ) : ''; // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- routing only. $all = self::screens(); return isset( $all[ $page ] ) ? $all[ $page ][2] : ''; } /** * Page body. */ public static function render() { $screen = self::current_screen(); echo '
'; } /** * Admin body class for our pages. * * @param string $classes Classes. * @return string */ public static function body_class( $classes ) { return self::current_screen() ? $classes . ' dcof-admin-page' : $classes; } /** * Enqueue the admin app on our pages. * * @param string $hook Hook suffix. */ public static function assets( $hook ) { $screen = self::current_screen(); if ( '' === $screen ) { return; } $ver = DANGO_COF_VERSION; wp_enqueue_style( 'dango-cof-admin', DANGO_COF_URL . 'assets/admin/admin.css', array( 'dashicons' ), $ver ); wp_enqueue_style( 'dango-cof', DANGO_COF_URL . 'assets/css/dcof-front.css', array(), $ver ); // The shopper form script powers the live preview (preview = production). wp_enqueue_script( 'dango-cof-form', DANGO_COF_URL . 'assets/js/dcof-form.js', array(), $ver, true ); wp_add_inline_script( 'dango-cof-form', 'window.dcofConfig=' . wp_json_encode( self::preview_config() ) . ';', 'before' ); wp_enqueue_script( 'dango-cof-admin', DANGO_COF_URL . 'assets/admin/admin.js', array( 'wp-i18n', 'dango-cof-form' ), $ver, true ); wp_enqueue_script( 'dango-cof-builder', DANGO_COF_URL . 'assets/admin/builder.js', array( 'dango-cof-admin' ), $ver, true ); wp_set_script_translations( 'dango-cof-admin', 'dango-cod-order-form' ); wp_set_script_translations( 'dango-cof-builder', 'dango-cod-order-form' ); wp_add_inline_script( 'dango-cof-admin', 'window.dcofAdmin=' . wp_json_encode( self::bootstrap( $screen ) ) . ';', 'before' ); wp_enqueue_media(); /** * Enqueue Pro admin assets. * * @param string $screen Screen id. */ do_action( 'dango_cof_admin_assets', $screen ); } /** * dcofConfig for the builder preview. * * @return array */ private static function preview_config() { $countries = array(); foreach ( Dango_COF_Markets::store_countries() as $c ) { $countries[] = Dango_COF_Markets::country_payload( $c ); } $primary = self::$plugin->settings->get( 'general', 'country', 'PK' ); $config = array( 'rest' => esc_url_raw( rest_url( Dango_COF_Rest::NS . '/' ) ), 'version' => DANGO_COF_VERSION, 'formJs' => '', 'modules' => array(), 'rtl' => is_rtl(), 'currency' => array( 'symbol' => html_entity_decode( get_woocommerce_currency_symbol(), ENT_QUOTES, 'UTF-8' ), 'code' => get_woocommerce_currency(), 'position' => get_option( 'woocommerce_currency_pos', 'left' ), 'decimals' => wc_get_price_decimals(), 'dsep' => wc_get_price_decimal_separator(), 'tsep' => wc_get_price_thousand_separator(), ), 'countries' => $countries, 'forms' => array(), 'products' => array(), 'previewCities' => array_slice( Dango_COF_Markets::cities( $primary ), 0, 40 ), 'options' => array( 'addressHints' => true, 'captureUtm' => false, 'honeypot' => false, 'turnstile' => '', 'testMode' => false, ), ); /** * Preview config (Pro registers its block scripts for the preview). * * @param array $config Config. */ return (array) apply_filters( 'dango_cof_preview_config', $config ); } /** * Data the admin app starts with. * * @param string $screen Screen id. * @return array */ public static function bootstrap( $screen ) { $menu = array(); foreach ( self::screens() as $slug => $s ) { $menu[] = array( 'slug' => $slug, 'title' => $s[1], 'screen' => $s[2], 'url' => admin_url( 'admin.php?page=' . $slug ), ); } $cats = array(); foreach ( get_terms( array( 'taxonomy' => 'product_cat', 'hide_empty' => false, 'number' => 500, ) ) as $term ) { if ( $term instanceof WP_Term ) { $cats[] = array( 'id' => $term->term_id, 'name' => html_entity_decode( $term->name ), ); } } $text_labels = array( 'title' => __( 'Form title', 'dango-cod-order-form' ), 'subtitle' => __( 'Subtitle', 'dango-cod-order-form' ), 'open_button' => __( 'Product page button', 'dango-cod-order-form' ), 'open_sub' => __( 'Button small text', 'dango-cod-order-form' ), 'sticky_button' => __( 'Mobile sticky bar button', 'dango-cod-order-form' ), 'success_title' => __( 'Thank-you title ({name})', 'dango-cod-order-form' ), 'success_text' => __( 'Thank-you message ({order}, {phone}, {total})', 'dango-cod-order-form' ), 'tracking_text' => __( 'Tracking note', 'dango-cod-order-form' ), 'whatsapp_button' => __( 'WhatsApp button', 'dango-cod-order-form' ), 'whatsapp_message' => __( 'WhatsApp message to you ({name} {order} {total})', 'dango-cod-order-form' ), 'blocked' => __( 'Message when an order is blocked', 'dango-cod-order-form' ), 'error_generic' => __( 'General error', 'dango-cod-order-form' ), 'required' => __( 'Required-field message', 'dango-cod-order-form' ), 'invalid_phone' => __( 'Wrong phone message ({example})', 'dango-cod-order-form' ), 'invalid_email' => __( 'Wrong email message', 'dango-cod-order-form' ), 'address_hint' => __( 'Address tip', 'dango-cod-order-form' ), 'other_city' => __( '"Use this city" option ({city})', 'dango-cod-order-form' ), 'no_city' => __( 'No city found', 'dango-cod-order-form' ), 'select_option' => __( 'Choose-option placeholder', 'dango-cod-order-form' ), 'out_of_stock' => __( 'Out of stock', 'dango-cod-order-form' ), 'qty' => __( 'Quantity', 'dango-cod-order-form' ), 'subtotal' => __( 'Subtotal', 'dango-cod-order-form' ), 'delivery' => __( 'Delivery', 'dango-cod-order-form' ), 'delivery_free' => __( 'Free delivery', 'dango-cod-order-form' ), 'delivery_pending' => __( 'Delivery before a city is chosen', 'dango-cod-order-form' ), 'discount' => __( 'Discount', 'dango-cod-order-form' ), 'total' => __( 'Total', 'dango-cod-order-form' ), 'you_save' => __( 'Savings badge ({amount})', 'dango-cod-order-form' ), 'tax_incl' => __( 'Tax included note ({amount}, {tax})', 'dango-cod-order-form' ), 'delivery_eta' => __( 'Estimated delivery line ({eta})', 'dango-cod-order-form' ), 'terms_agree' => __( 'Terms box ({terms} = link)', 'dango-cod-order-form' ), 'terms_notice' => __( 'Terms line ({terms} = link)', 'dango-cod-order-form' ), 'terms_link' => __( 'Terms link text', 'dango-cod-order-form' ), 'terms_required' => __( 'Terms not accepted', 'dango-cod-order-form' ), 'apply' => __( 'Apply button', 'dango-cod-order-form' ), 'remove' => __( 'Remove link', 'dango-cod-order-form' ), 'coupon_placeholder' => __( 'Code placeholder', 'dango-cod-order-form' ), 'placing' => __( 'While placing the order', 'dango-cod-order-form' ), 'close' => __( 'Close', 'dango-cod-order-form' ), 'advance_pay' => __( 'Pay-now button (advance payment)', 'dango-cod-order-form' ), 'not_you' => __( '"Not you?" link', 'dango-cod-order-form' ), 'duplicate' => __( 'Repeat-order message ({order})', 'dango-cod-order-form' ), 'limit' => __( 'Daily-limit message', 'dango-cod-order-form' ), 'expired' => __( 'Expired-page message', 'dango-cod-order-form' ), 'captcha' => __( 'Bot-check message', 'dango-cod-order-form' ), ); $presets = array(); foreach ( array_keys( Dango_COF_Templates::languages() ) as $lang ) { $presets[ $lang ] = Dango_COF_Templates::preset( $lang ); } $wc_countries = WC()->countries->get_countries(); $data = array( 'rest' => esc_url_raw( rest_url( Dango_COF_Rest::NS . '/admin/' ) ), 'nonce' => wp_create_nonce( 'wp_rest' ), 'screen' => $screen, 'menu' => $menu, 'version' => DANGO_COF_VERSION, 'isPro' => self::$plugin->is_pro(), 'setupDone' => (bool) get_option( Dango_COF_Installer::WIZARD_OPTION ), 'settings' => self::$plugin->settings->for_admin(), 'defaultFormId' => Dango_COF_Forms::default_id(), 'forms' => Dango_COF_Forms::all(), 'blockTypes' => Dango_COF_Blocks::types(), 'blockGroups' => Dango_COF_Blocks::groups(), 'templates' => Dango_COF_Templates::designs(), 'languages' => Dango_COF_Templates::languages(), 'presets' => $presets, 'textLabels' => (array) apply_filters( 'dango_cof_text_labels', $text_labels ), 'textDefaults' => array_merge( Dango_COF_Templates::default_texts(), (array) apply_filters( 'dango_cof_text_defaults', array() ) ), 'categories' => $cats, 'countries' => array_map( 'html_entity_decode', $wc_countries ), 'phoneCountries' => array_keys( Dango_COF_Markets::phone_rules() ), 'cityCountries' => Dango_COF_Markets::countries_with_cities(), 'statuses' => array( 'processing' => __( 'Processing', 'dango-cod-order-form' ), 'on-hold' => __( 'On hold', 'dango-cod-order-form' ), 'pending' => __( 'Pending payment', 'dango-cod-order-form' ), ), 'currency' => html_entity_decode( get_woocommerce_currency_symbol(), ENT_QUOTES, 'UTF-8' ), 'canPrepay' => Dango_COF_Module_Advance::can_prepay(), 'holdStock' => (int) get_option( 'woocommerce_hold_stock_minutes', 0 ), 'integrations' => array( 'trackkaro' => Dango_COF_TrackKaro::active(), 'trackkaroCities' => Dango_COF_TrackKaro::saved_cities() ? count( Dango_COF_TrackKaro::saved_cities() ) : 0, 'whatsapp' => Dango_COF_TrackKaro::whatsapp_active(), 'systemUtilities' => Dango_COF_System_Utilities::active(), 'suTurnstile' => (bool) Dango_COF_System_Utilities::turnstile_keys(), 'safeship' => Dango_COF_Compat::safeship_active(), ), 'links' => array( 'orders' => admin_url( 'admin.php?page=wc-orders' ), 'products' => admin_url( 'edit.php?post_type=product' ), 'shipping' => admin_url( 'admin.php?page=wc-settings&tab=shipping' ), 'payments' => admin_url( 'admin.php?page=wc-settings&tab=checkout§ion=cod' ), 'pro' => 'https://solutions.dango.pk/software/dango-cod-order-form/', 'docs' => 'https://solutions.dango.pk/software/dango-cod-order-form/', 'support' => 'https://wordpress.org/support/plugin/dango-cod-order-form/', 'trackkaro' => 'https://trackkaro.pk', 'shop' => get_permalink( wc_get_page_id( 'shop' ) ), 'logs' => admin_url( 'admin.php?page=wc-status&tab=logs&source=dango-cod-order-form' ), 'pages' => admin_url( 'admin.php?page=wc-settings&tab=advanced' ), ), 'termsPage' => Dango_COF_Terms::page() ? array( 'title' => get_the_title( Dango_COF_Terms::page() ), 'url' => get_permalink( Dango_COF_Terms::page() ), ) : null, 'reasonLabels' => array( 'bot' => Dango_COF_Blocklist::reason_label( 'bot' ), 'too_fast' => Dango_COF_Blocklist::reason_label( 'too_fast' ), 'token' => Dango_COF_Blocklist::reason_label( 'token' ), 'blocklist' => Dango_COF_Blocklist::reason_label( 'blocklist' ), 'limit' => Dango_COF_Blocklist::reason_label( 'limit' ), 'duplicate' => Dango_COF_Blocklist::reason_label( 'duplicate' ), 'captcha' => Dango_COF_Blocklist::reason_label( 'captcha' ), 'otp' => Dango_COF_Blocklist::reason_label( 'otp' ), 'rule' => Dango_COF_Blocklist::reason_label( 'rule' ), 'area' => Dango_COF_Blocklist::reason_label( 'area' ), ), ); /** * Admin app bootstrap data (Pro adds licence state, offers, etc.). * * @param array $data Data. * @param string $screen Screen id. */ return (array) apply_filters( 'dango_cof_admin_bootstrap', $data, $screen ); } /** * First activation: go to the setup wizard. */ public static function activation_redirect() { if ( ! get_transient( 'dango_cof_activation_redirect' ) ) { return; } delete_transient( 'dango_cof_activation_redirect' ); if ( wp_doing_ajax() || is_network_admin() || isset( $_GET['activate-multi'] ) || ! current_user_can( self::CAP ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- core flag. return; } wp_safe_redirect( admin_url( 'admin.php?page=dango-cod#/welcome' ) ); exit; } /** * Docs and support links under the plugin's description. * * @param array $meta Row meta links. * @param string $file Plugin file. * @return array */ public static function row_meta( $meta, $file ) { if ( DANGO_COF_BASENAME === $file ) { $meta[] = '' . esc_html__( 'Docs', 'dango-cod-order-form' ) . ''; $meta[] = '' . esc_html__( 'Support', 'dango-cod-order-form' ) . ''; } return $meta; } /** * Plugin list action links. * * @param array $links Links. * @return array */ public static function action_links( $links ) { array_unshift( $links, '' . esc_html__( 'Form builder', 'dango-cod-order-form' ) . '', '' . esc_html__( 'Settings', 'dango-cod-order-form' ) . '' ); return $links; } }