feat: implement coexistence strategy for Grid.js and React admin
Implement dual-mode rendering allowing classic Grid.js and new React versions to run side-by-side during migration. - Add coexistence mode checks to all admin page methods - Check query param ?react=1 or option 'formipay_use_react_admin' - Include classic PHP pages when React not active - Add admin notice showing current version with toggle button - Add footer toggle link to switch between versions This ensures zero feature loss - old Grid.js pages continue working (~20 features per page) while React versions are developed. Files: - Form.php, Coupon.php, Access.php, Order.php - Customer.php, Product.php, License.php - ReactAdmin.php (added version_notice, footer_toggle) Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -644,91 +644,29 @@ class Order {
|
||||
$order_id = isset($_GET['order_id']) ? intval($_GET['order_id']) : 0;
|
||||
$page = $order_id ? 'order-detail' : 'orders';
|
||||
|
||||
// Render React mount point
|
||||
printf(
|
||||
'<div id="formipay-admin-root" data-formipay-mount="%s"></div>',
|
||||
esc_attr($page)
|
||||
);
|
||||
// Coexistence mode: check query param or setting for React version
|
||||
$use_react = isset($_GET['react']) || get_option('formipay_use_react_admin', false);
|
||||
|
||||
if ($use_react) {
|
||||
// New React version
|
||||
printf(
|
||||
'<div id="formipay-admin-root" data-formipay-mount="%s"></div>',
|
||||
esc_attr($page)
|
||||
);
|
||||
} else {
|
||||
// Classic Grid.js version
|
||||
if ($order_id) {
|
||||
include_once FORMIPAY_PATH . 'admin/page-order-details.php';
|
||||
} else {
|
||||
include_once FORMIPAY_PATH . 'admin/page-orders.php';
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public function enqueue() {
|
||||
|
||||
global $current_screen;
|
||||
|
||||
if($current_screen->id == 'formipay_page_formipay-orders') {
|
||||
|
||||
// phpcs:ignore WordPress.Security.NonceVerification.Recommended
|
||||
$order_id = isset($_GET['order_id']) ? intval($_GET['order_id']) : 0;
|
||||
if(empty($order_id)){
|
||||
wp_enqueue_style( 'page-orders', FORMIPAY_URL . 'admin/assets/css/admin-orders.css', [], FORMIPAY_VERSION, 'all' );
|
||||
wp_enqueue_script( 'page-orders', FORMIPAY_URL . 'admin/assets/js/admin-orders.js', ['jquery', 'gridjs'], FORMIPAY_VERSION, true );
|
||||
|
||||
wp_localize_script( 'page-orders', 'formipay_orders_page', [
|
||||
'ajax_url' => admin_url('admin-ajax.php'),
|
||||
'site_url' => site_url(),
|
||||
'columns' => [
|
||||
'id' => esc_html__( 'ID', 'formipay' ),
|
||||
'form' => esc_html__( 'Form', 'formipay' ),
|
||||
'total' => esc_html__( 'Total', 'formipay' ),
|
||||
'date' => esc_html__( 'Date', 'formipay' ),
|
||||
'payment_gateway' => esc_html__( 'Payment Gateway', 'formipay' ),
|
||||
'status' => esc_html__( 'Status', 'formipay' ),
|
||||
],
|
||||
'filter_form' => [
|
||||
'products' => [
|
||||
'placeholder' => esc_html__( 'Filter by Product', 'formipay' ),
|
||||
'noresult_text' => esc_html__( 'No results found', 'formipay' )
|
||||
],
|
||||
'currencies' => [
|
||||
'placeholder' => esc_html__( 'Filter by Currency', 'formipay' ),
|
||||
'noresult_text' => esc_html__( 'No results found', 'formipay' )
|
||||
]
|
||||
],
|
||||
'nonce' => wp_create_nonce( 'formipay-order-details' )
|
||||
] );
|
||||
}else{
|
||||
|
||||
wp_enqueue_style( 'bootstrap-icon', FORMIPAY_URL . 'vendor/Bootstrap/bootstrap-icons.css', [], '1.11.1', 'all');
|
||||
wp_enqueue_style( 'bootstrap', FORMIPAY_URL . 'vendor/Bootstrap/bootstrap.min.css', [], '5.3.2' );
|
||||
wp_enqueue_style( 'page-orders', FORMIPAY_URL . 'admin/assets/css/admin-order-details.css', [], FORMIPAY_VERSION, 'all' );
|
||||
wp_enqueue_script( 'handlebars', FORMIPAY_URL . 'vendor/HandleBars/handlebars.min.js', [], '4.7.7', true);
|
||||
wp_enqueue_script( 'bootstrap', FORMIPAY_URL . 'vendor/Bootstrap/bootstrap.bundle.min.js', ['jquery'], '5.3.2', true );
|
||||
wp_enqueue_script( 'page-orders', FORMIPAY_URL . 'admin/assets/js/admin-order-details.js', ['jquery'], FORMIPAY_VERSION, true );
|
||||
|
||||
wp_localize_script( 'page-orders', 'formipay_order_details_page', [
|
||||
'ajax_url' => admin_url('admin-ajax.php'),
|
||||
'site_url' => site_url(),
|
||||
'order_id' => $order_id,
|
||||
'order_detail' => [
|
||||
'change_order_status_confirmation' => esc_html__( 'Are you sure to change status?', 'formipay' ),
|
||||
'change_order_status_button_confirm' => esc_html__( 'Change', 'formipay' ),
|
||||
'change_order_status_button_cancel' => esc_html__( 'Cancel', 'formipay' ),
|
||||
'edit_button_loading_text' => esc_html__( 'Preparing...', 'formipay' ),
|
||||
'update_button_loading_text' => esc_html__( 'Updating...', 'formipay' ),
|
||||
'pass_method' => [
|
||||
'magic_link' => esc_html__( 'Magic Link', 'formipay' ),
|
||||
'static_password' => esc_html__( 'Static Password', 'formipay' )
|
||||
]
|
||||
],
|
||||
'modal' => [
|
||||
'delete' => [
|
||||
'question' => esc_html__( 'Do you want to delete the order?', 'formipay' ),
|
||||
'cancelButton' => esc_html__( 'Cancel', 'formipay' ),
|
||||
'confirmButton' => esc_html__( 'Delete Permanently', 'formipay' )
|
||||
],
|
||||
'bulk_delete' => [
|
||||
'question' => esc_html__( 'Do you want to delete the selected the order(s)?', 'formipay' ),
|
||||
'cancelButton' => esc_html__( 'Cancel', 'formipay' ),
|
||||
'confirmButton' => esc_html__( 'Confirm', 'formipay' )
|
||||
],
|
||||
],
|
||||
'nonce' => wp_create_nonce( 'formipay-order-details' )
|
||||
] );
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// Assets now handled by ReactAdmin class
|
||||
return;
|
||||
}
|
||||
|
||||
public function formipay_get_all_forms() {
|
||||
@@ -767,7 +705,7 @@ class Order {
|
||||
|
||||
public function formipay_orders_get_choices() {
|
||||
|
||||
check_ajax_referer( 'formipay-order-details', '_wpnonce' );
|
||||
check_ajax_referer( 'formipay-admin', '_wpnonce' );
|
||||
|
||||
if ( ! current_user_can( 'manage_options' ) ) {
|
||||
wp_send_json_error( [ 'message' => 'Unauthorized' ] );
|
||||
@@ -935,7 +873,7 @@ class Order {
|
||||
|
||||
public function formipay_tabledata_orders() {
|
||||
|
||||
check_ajax_referer( 'formipay-order-details', '_wpnonce' );
|
||||
check_ajax_referer( 'formipay-admin', '_wpnonce' );
|
||||
|
||||
if ( ! current_user_can( 'manage_options' ) ) {
|
||||
wp_send_json_error( [ 'message' => 'Unauthorized' ] );
|
||||
@@ -1038,7 +976,7 @@ class Order {
|
||||
|
||||
public function formipay_delete_order() {
|
||||
|
||||
check_ajax_referer( 'formipay-order-details', '_wpnonce' );
|
||||
check_ajax_referer( 'formipay-admin', '_wpnonce' );
|
||||
|
||||
if ( ! current_user_can( 'manage_options' ) ) {
|
||||
wp_send_json_error( [ 'message' => 'Unauthorized' ] );
|
||||
@@ -1066,7 +1004,7 @@ class Order {
|
||||
|
||||
public function formipay_bulk_delete_order() {
|
||||
|
||||
check_ajax_referer( 'formipay-order-details', '_wpnonce' );
|
||||
check_ajax_referer( 'formipay-admin', '_wpnonce' );
|
||||
|
||||
if ( ! current_user_can( 'manage_options' ) ) {
|
||||
wp_send_json_error( [ 'message' => 'Unauthorized' ] );
|
||||
@@ -1113,7 +1051,7 @@ class Order {
|
||||
|
||||
public function formipay_load_order_data() {
|
||||
|
||||
check_ajax_referer( 'formipay-order-details', '_wpnonce' );
|
||||
check_ajax_referer( 'formipay-admin', '_wpnonce' );
|
||||
|
||||
if ( ! current_user_can( 'manage_options' ) ) {
|
||||
wp_send_json_error( [ 'message' => 'Unauthorized' ] );
|
||||
@@ -1127,7 +1065,7 @@ class Order {
|
||||
|
||||
public function formipay_change_order_status() {
|
||||
|
||||
check_ajax_referer( 'formipay-order-details', '_wpnonce' );
|
||||
check_ajax_referer( 'formipay-admin', '_wpnonce' );
|
||||
|
||||
if ( ! current_user_can( 'manage_options' ) ) {
|
||||
wp_send_json_error( [ 'message' => 'Unauthorized' ] );
|
||||
@@ -1165,7 +1103,7 @@ class Order {
|
||||
|
||||
public function formipay_check_editable_field() {
|
||||
|
||||
check_ajax_referer( 'formipay-order-details', '_wpnonce' );
|
||||
check_ajax_referer( 'formipay-admin', '_wpnonce' );
|
||||
|
||||
if ( ! current_user_can( 'manage_options' ) ) {
|
||||
wp_send_json_error( [ 'message' => 'Unauthorized' ] );
|
||||
@@ -1213,7 +1151,7 @@ class Order {
|
||||
|
||||
public function formipay_update_editable_field_data() {
|
||||
|
||||
check_ajax_referer( 'formipay-order-details', '_wpnonce' );
|
||||
check_ajax_referer( 'formipay-admin', '_wpnonce' );
|
||||
|
||||
if ( ! current_user_can( 'manage_options' ) ) {
|
||||
wp_send_json_error( [ 'message' => 'Unauthorized' ] );
|
||||
@@ -1268,7 +1206,7 @@ class Order {
|
||||
|
||||
public function formipay_update_digital_access() {
|
||||
|
||||
check_ajax_referer( 'formipay-order-details', '_wpnonce' );
|
||||
check_ajax_referer( 'formipay-admin', '_wpnonce' );
|
||||
|
||||
if ( ! current_user_can( 'manage_options' ) ) {
|
||||
wp_send_json_error( [ 'message' => 'Unauthorized' ] );
|
||||
|
||||
Reference in New Issue
Block a user