[ 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;
}
}