fix: React admin icon imports and mount point rendering

- Fix all @wordpress/icons imports - use build/ paths and call as functions
- Update all admin pages to render React mount points
- Components fixed: VariationPricingTable, NotificationLog, GlobalSettings,
  FormFieldOptions, OrderDetail, OrderListItem, OrderList, FormCanvas,
  AnalyticsDashboard, FormField, Products
- Admin pages updated: Order.php, Customer.php, Coupon.php, License.php,
  Product.php, Access.php, Form.php

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
dwindown
2026-04-18 13:28:57 +07:00
parent 6fd6d29fe8
commit ab69d03f78
25 changed files with 21577 additions and 14586 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -1 +1 @@
<?php return array('dependencies' => array('react', 'wp-components', 'wp-element', 'wp-i18n', 'wp-primitives'), 'version' => '45cbff321e1153724caa'); <?php return array('dependencies' => array('react', 'wp-components', 'wp-element', 'wp-i18n', 'wp-icons/build/arrow-left', 'wp-icons/build/bell', 'wp-icons/build/chevron-down', 'wp-icons/build/chevron-up', 'wp-icons/build/eye-closed', 'wp-icons/build/eye-opened', 'wp-icons/build/list', 'wp-icons/build/message', 'wp-icons/build/minus', 'wp-icons/build/plus', 'wp-icons/build/trash', 'wp-icons/build/visible'), 'version' => '44e6bb755959bfd53a19');

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -84,7 +84,7 @@ class Access {
} }
public function formipay_access_items() { public function formipay_access_items() {
include_once FORMIPAY_PATH . 'admin/page-access-items.php'; \Formipay\Admin\ReactAdmin::render_mount_point('access');
} }
public function enqueue_admin() { public function enqueue_admin() {

View File

@@ -94,7 +94,7 @@ class Coupon {
} }
public function formipay_coupon() { public function formipay_coupon() {
include_once FORMIPAY_PATH . 'admin/page-coupons.php'; \Formipay\Admin\ReactAdmin::render_mount_point('coupons');
} }
public function enqueue_admin() { public function enqueue_admin() {

View File

@@ -219,14 +219,7 @@ class Customer {
} }
public function customers_page() { public function customers_page() {
\Formipay\Admin\ReactAdmin::render_mount_point('customers');
$customer_id = intval(filter_input(INPUT_GET, 'customer_id', FILTER_SANITIZE_STRING));
if(empty($customer_id)){
include FORMIPAY_PATH . 'admin/page-customers.php';
}else{
include FORMIPAY_PATH . 'admin/page-customer-details.php';
}
} }
public function formipay_tabledata_customers() { public function formipay_tabledata_customers() {

View File

@@ -93,7 +93,7 @@ class Form {
} }
public function formipay_form() { public function formipay_form() {
include_once FORMIPAY_PATH . 'admin/page-forms.php'; \Formipay\Admin\ReactAdmin::render_mount_point('forms');
} }
public function metaboxes($post) { public function metaboxes($post) {

View File

@@ -70,7 +70,7 @@ class License {
} }
public function page_licenses() { public function page_licenses() {
include FORMIPAY_PATH . 'admin/page-licenses.php'; \Formipay\Admin\ReactAdmin::render_mount_point('licenses');
} }
/** Enqueue admin assets for Licenses page */ /** Enqueue admin assets for Licenses page */

View File

@@ -642,12 +642,13 @@ class Order {
// phpcs:ignore WordPress.Security.NonceVerification.Recommended // phpcs:ignore WordPress.Security.NonceVerification.Recommended
$order_id = isset($_GET['order_id']) ? intval($_GET['order_id']) : 0; $order_id = isset($_GET['order_id']) ? intval($_GET['order_id']) : 0;
if(empty($order_id)){ $page = $order_id ? 'order-detail' : 'orders';
include FORMIPAY_PATH . 'admin/page-orders.php';
}else{ // Render React mount point
$order = formipay_get_order( $order_id ); printf(
include FORMIPAY_PATH . 'admin/page-order-details.php'; '<div id="formipay-admin-root" data-formipay-mount="%s"></div>',
} esc_attr($page)
);
} }

View File

@@ -228,7 +228,7 @@ class Product {
} }
public function formipay_products() { public function formipay_products() {
include_once FORMIPAY_PATH . 'admin/page-products.php'; \Formipay\Admin\ReactAdmin::render_mount_point('products');
} }
public function cpt_post_fields_box($boxes) { public function cpt_post_fields_box($boxes) {

21482
package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -5,7 +5,10 @@
import { __ } from '@wordpress/i18n'; import { __ } from '@wordpress/i18n';
import { useState, useCallback, useEffect } from '@wordpress/element'; import { useState, useCallback, useEffect } from '@wordpress/element';
import { SelectControl } from '@wordpress/components'; import { SelectControl } from '@wordpress/components';
import { Icon, chartLine, money, shoppingCart } from '@wordpress/icons'; import { Icon } from '@wordpress/icons';
import chartLine from '@wordpress/icons/build/chart-line';
import money from '@wordpress/icons/build/money';
import shoppingCart from '@wordpress/icons/build/shopping-cart';
import { ordersApi } from '../../api/client'; import { ordersApi } from '../../api/client';
import './AnalyticsDashboard.css'; import './AnalyticsDashboard.css';
@@ -58,7 +61,7 @@ export default function AnalyticsDashboard() {
<div className="formipay-analytics-dashboard"> <div className="formipay-analytics-dashboard">
<div className="formipay-dashboard-header"> <div className="formipay-dashboard-header">
<h2> <h2>
<Icon icon={chartLine} /> <Icon icon={chartLine()} />
{ __('Dashboard', 'formipay') } { __('Dashboard', 'formipay') }
</h2> </h2>
<SelectControl <SelectControl
@@ -82,7 +85,7 @@ export default function AnalyticsDashboard() {
<div className="formipay-stats-grid"> <div className="formipay-stats-grid">
<div className="stat-card"> <div className="stat-card">
<div className="stat-icon"> <div className="stat-icon">
<Icon icon={shoppingCart} size={24} /> <Icon icon={shoppingCart()} size={24} />
</div> </div>
<div className="stat-content"> <div className="stat-content">
<span className="stat-label"> <span className="stat-label">
@@ -96,7 +99,7 @@ export default function AnalyticsDashboard() {
<div className="stat-card"> <div className="stat-card">
<div className="stat-icon"> <div className="stat-icon">
<Icon icon={money} size={24} /> <Icon icon={money()} size={24} />
</div> </div>
<div className="stat-content"> <div className="stat-content">
<span className="stat-label"> <span className="stat-label">

View File

@@ -3,7 +3,8 @@
*/ */
import { __ } from '@wordpress/i18n'; import { __ } from '@wordpress/i18n';
import { Icon, plus } from '@wordpress/icons'; import { Icon } from '@wordpress/icons';
import plus from '@wordpress/icons/build/plus';
import { DEFAULT_FIELD_CONFIG, generateFieldId } from '../../config/fieldTypes'; import { DEFAULT_FIELD_CONFIG, generateFieldId } from '../../config/fieldTypes';
import FormField from './FormField'; import FormField from './FormField';
import './FormCanvas.css'; import './FormCanvas.css';
@@ -60,7 +61,7 @@ export default function FormCanvas({
> >
{fields.length === 0 ? ( {fields.length === 0 ? (
<div className="formipay-empty-state"> <div className="formipay-empty-state">
<Icon icon={plus} size={48} /> <Icon icon={plus()} size={48} />
<p> <p>
{ __('Drag fields from the palette to build your form', 'formipay') } { __('Drag fields from the palette to build your form', 'formipay') }
</p> </p>

View File

@@ -3,7 +3,10 @@
*/ */
import { __ } from '@wordpress/i18n'; import { __ } from '@wordpress/i18n';
import { Icon, chevronUp, chevronDown, trash } from '@wordpress/icons'; import { Icon } from '@wordpress/icons';
import chevronUp from '@wordpress/icons/build/chevron-up';
import chevronDown from '@wordpress/icons/build/chevron-down';
import trash from '@wordpress/icons/build/trash';
import { FIELD_TYPES } from '../../config/fieldTypes'; import { FIELD_TYPES } from '../../config/fieldTypes';
import './FormField.css'; import './FormField.css';
@@ -49,7 +52,7 @@ export default function FormField({
disabled={!onMoveUp} disabled={!onMoveUp}
title={ __('Move Up', 'formipay') } title={ __('Move Up', 'formipay') }
> >
<Icon icon={chevronUp} size={16} /> <Icon icon={chevronUp()} size={16} />
</button> </button>
<button <button
type="button" type="button"
@@ -58,7 +61,7 @@ export default function FormField({
disabled={!onMoveDown} disabled={!onMoveDown}
title={ __('Move Down', 'formipay') } title={ __('Move Down', 'formipay') }
> >
<Icon icon={chevronDown} size={16} /> <Icon icon={chevronDown()} size={16} />
</button> </button>
<button <button
type="button" type="button"
@@ -66,7 +69,7 @@ export default function FormField({
onClick={(e) => { e.stopPropagation(); onDelete?.(); }} onClick={(e) => { e.stopPropagation(); onDelete?.(); }}
title={ __('Delete', 'formipay') } title={ __('Delete', 'formipay') }
> >
<Icon icon={trash} size={16} /> <Icon icon={trash()} size={16} />
</button> </button>
</div> </div>
</div> </div>

View File

@@ -4,7 +4,9 @@
import { __ } from '@wordpress/i18n'; import { __ } from '@wordpress/i18n';
import { TextControl, Button } from '@wordpress/components'; import { TextControl, Button } from '@wordpress/components';
import { Icon as WPIcon, plus } from '@wordpress/icons'; import { Icon as WPIcon } from '@wordpress/icons';
import plus from '@wordpress/icons/build/plus';
import trash from '@wordpress/icons/build/trash';
export default function FormFieldOptions({ options = [], onChange, fieldType }) { export default function FormFieldOptions({ options = [], onChange, fieldType }) {
const handleAddOption = () => { const handleAddOption = () => {
@@ -46,7 +48,7 @@ export default function FormFieldOptions({ options = [], onChange, fieldType })
variant="secondary" variant="secondary"
size="compact" size="compact"
onClick={handleAddOption} onClick={handleAddOption}
icon={<WPIcon icon={plus} size={16} />} icon={<WPIcon icon={plus()} size={16} />}
> >
{ __('Add Option', 'formipay') } { __('Add Option', 'formipay') }
</Button> </Button>
@@ -85,7 +87,7 @@ export default function FormFieldOptions({ options = [], onChange, fieldType })
variant="tertiary" variant="tertiary"
size="compact" size="compact"
onClick={() => handleDeleteOption(index)} onClick={() => handleDeleteOption(index)}
icon={<WPIcon icon={trash} size={16} />} icon={<WPIcon icon={trash()} size={16} />}
label={__('Delete Option', 'formipay')} label={__('Delete Option', 'formipay')}
/> />
</div> </div>

View File

@@ -3,7 +3,9 @@
*/ */
import { __ } from '@wordpress/i18n'; import { __ } from '@wordpress/i18n';
import { Icon, bell, mail, message } from '@wordpress/icons'; import { Icon } from '@wordpress/icons';
import bell from '@wordpress/icons/build/bell';
import message from '@wordpress/icons/build/message';
import './NotificationLog.css'; import './NotificationLog.css';
export default function NotificationLog() { export default function NotificationLog() {
@@ -22,19 +24,19 @@ export default function NotificationLog() {
const getIcon = (type) => { const getIcon = (type) => {
switch (type) { switch (type) {
case 'email': case 'email':
return mail; return bell();
case 'sms': case 'sms':
case 'whatsapp': case 'whatsapp':
return message; return message();
default: default:
return bell; return bell();
} }
}; };
return ( return (
<div className="formipay-notification-log"> <div className="formipay-notification-log">
<h3> <h3>
<Icon icon={bell} size={18} /> <Icon icon={bell()} size={18} />
{ __('Notification Log', 'formipay') } { __('Notification Log', 'formipay') }
</h3> </h3>

View File

@@ -5,7 +5,9 @@
import { __ } from '@wordpress/i18n'; import { __ } from '@wordpress/i18n';
import { useState, useCallback, useEffect } from '@wordpress/element'; import { useState, useCallback, useEffect } from '@wordpress/element';
import { Button, SelectControl } from '@wordpress/components'; import { Button, SelectControl } from '@wordpress/components';
import { Icon, arrowLeft, trash } from '@wordpress/icons'; import { Icon } from '@wordpress/icons';
import arrowLeft from '@wordpress/icons/build/arrow-left';
import trash from '@wordpress/icons/build/trash';
import { ordersApi } from '../../api/client'; import { ordersApi } from '../../api/client';
import OrderTimeline from './OrderTimeline'; import OrderTimeline from './OrderTimeline';
import NotificationLog from '../notifications/NotificationLog'; import NotificationLog from '../notifications/NotificationLog';
@@ -102,7 +104,7 @@ export default function OrderDetail({ orderId, onBack }) {
variant="secondary" variant="secondary"
onClick={onBack} onClick={onBack}
> >
<Icon icon={arrowLeft} size={16} /> <Icon icon={arrowLeft()} size={16} />
{ __('Back to Orders', 'formipay') } { __('Back to Orders', 'formipay') }
</Button> </Button>
</div> </div>
@@ -122,7 +124,7 @@ export default function OrderDetail({ orderId, onBack }) {
variant="secondary" variant="secondary"
onClick={onBack} onClick={onBack}
> >
<Icon icon={arrowLeft} size={16} /> <Icon icon={arrowLeft()} size={16} />
{ __('Back', 'formipay') } { __('Back', 'formipay') }
</Button> </Button>
<h1> <h1>
@@ -134,7 +136,7 @@ export default function OrderDetail({ orderId, onBack }) {
isDestructive isDestructive
onClick={handleDelete} onClick={handleDelete}
> >
<Icon icon={trash} size={16} /> <Icon icon={trash()} size={16} />
{ __('Delete', 'formipay') } { __('Delete', 'formipay') }
</Button> </Button>
</div> </div>

View File

@@ -5,7 +5,8 @@
import { __ } from '@wordpress/i18n'; import { __ } from '@wordpress/i18n';
import { useState, useCallback, useEffect } from '@wordpress/element'; import { useState, useCallback, useEffect } from '@wordpress/element';
import { SearchControl, SelectControl, Button } from '@wordpress/components'; import { SearchControl, SelectControl, Button } from '@wordpress/components';
import { Icon, list } from '@wordpress/icons'; import { Icon } from '@wordpress/icons';
import list from '@wordpress/icons/build/list';
import { ordersApi } from '../../api/client'; import { ordersApi } from '../../api/client';
import OrderListItem from './OrderListItem'; import OrderListItem from './OrderListItem';
import './OrderList.css'; import './OrderList.css';
@@ -85,7 +86,7 @@ export default function OrderList({ onSelectOrder }) {
<div className="formipay-order-list"> <div className="formipay-order-list">
<div className="formipay-orders-header"> <div className="formipay-orders-header">
<h2> <h2>
<Icon icon={list} /> <Icon icon={list()} />
{ __('Orders', 'formipay') } { __('Orders', 'formipay') }
</h2> </h2>
<span className="order-count"> <span className="order-count">

View File

@@ -3,7 +3,8 @@
*/ */
import { __ } from '@wordpress/i18n'; import { __ } from '@wordpress/i18n';
import { Icon, seen } from '@wordpress/icons'; import { Icon } from '@wordpress/icons';
import seen from '@wordpress/icons/build/visible';
import './OrderListItem.css'; import './OrderListItem.css';
const STATUS_COLORS = { const STATUS_COLORS = {
@@ -78,7 +79,7 @@ export default function OrderListItem({ order, onSelect }) {
className="button button-small" className="button button-small"
onClick={onSelect} onClick={onSelect}
> >
<Icon icon={seen} size={16} /> <Icon icon={seen()} size={16} />
{ __('View', 'formipay') } { __('View', 'formipay') }
</button> </button>
</td> </td>

View File

@@ -6,7 +6,10 @@
import { __ } from '@wordpress/i18n'; import { __ } from '@wordpress/i18n';
import { useState, useEffect, useCallback, useRef } from '@wordpress/element'; import { useState, useEffect, useCallback, useRef } from '@wordpress/element';
import { TextControl, Button } from '@wordpress/components'; import { TextControl, Button } from '@wordpress/components';
import { Icon, minus, eye, eyeClosed } from '@wordpress/icons'; import { Icon } from '@wordpress/icons';
import minus from '@wordpress/icons/build/minus';
import eyeClosed from '@wordpress/icons/build/eye-closed';
import eyeOpened from '@wordpress/icons/build/eye-opened';
import './VariationPricingTable.css'; import './VariationPricingTable.css';
export default function VariationPricingTable({ productId, productDetails }) { export default function VariationPricingTable({ productId, productDetails }) {
@@ -462,7 +465,7 @@ function VariationRow({ row, rowIndex, showFlatPricing, defaultCurrencyCode,
size="small" size="small"
isDestructive isDestructive
onClick={onDelete} onClick={onDelete}
icon={minus} icon={minus()}
> >
{ __('Delete', 'formipay') } { __('Delete', 'formipay') }
</Button> </Button>
@@ -537,6 +540,3 @@ function PriceCell({ price, field, onChange }) {
); );
} }
// Icon helpers
const eyeOpened = { ...eye, icon: 'eyeOpened' };
const eyeClosed = { ...eyeClosed, icon: 'eyeClosed' };

View File

@@ -5,7 +5,9 @@
import { __ } from '@wordpress/i18n'; import { __ } from '@wordpress/i18n';
import { useState, useCallback } from '@wordpress/element'; import { useState, useCallback } from '@wordpress/element';
import { TextControl, CheckboxControl, SelectControl, Button, Panel, PanelBody, PanelRow } from '@wordpress/components'; import { TextControl, CheckboxControl, SelectControl, Button, Panel, PanelBody, PanelRow } from '@wordpress/components';
import { Icon, settings, save } from '@wordpress/icons'; import { Icon } from '@wordpress/icons';
import settings from '@wordpress/icons/build/settings';
import save from '@wordpress/icons/build/save';
import './GlobalSettings.css'; import './GlobalSettings.css';
export default function GlobalSettings({ initialData }) { export default function GlobalSettings({ initialData }) {
@@ -61,7 +63,7 @@ export default function GlobalSettings({ initialData }) {
<div className="formipay-global-settings"> <div className="formipay-global-settings">
<div className="formipay-settings-header"> <div className="formipay-settings-header">
<h1> <h1>
<Icon icon={settings} size={24} /> <Icon icon={settings()} size={24} />
{ __('Formipay Settings', 'formipay') } { __('Formipay Settings', 'formipay') }
</h1> </h1>
<div className="header-actions"> <div className="header-actions">
@@ -80,7 +82,7 @@ export default function GlobalSettings({ initialData }) {
onClick={handleSave} onClick={handleSave}
disabled={saving} disabled={saving}
isBusy={saving} isBusy={saving}
icon={save} icon={save()}
> >
{ saving ? __('Saving...', 'formipay') : __('Save Settings', 'formipay') } { saving ? __('Saving...', 'formipay') : __('Save Settings', 'formipay') }
</Button> </Button>

View File

@@ -4,7 +4,8 @@
import { __ } from '@wordpress/i18n'; import { __ } from '@wordpress/i18n';
import { useState } from '@wordpress/element'; import { useState } from '@wordpress/element';
import { Icon, plus } from '@wordpress/icons'; import { Icon } from '@wordpress/icons';
import plus from '@wordpress/icons/build/plus';
import VariationPricingTable from '../components/products/VariationPricingTable'; import VariationPricingTable from '../components/products/VariationPricingTable';
export default function ProductsPage({ initialData }) { export default function ProductsPage({ initialData }) {
@@ -50,7 +51,7 @@ export default function ProductsPage({ initialData }) {
setIsEditor(true); setIsEditor(true);
}} }}
> >
<Icon icon={plus} size={16} /> <Icon icon={plus()} size={16} />
{ __('Add New Product', 'formipay') } { __('Add New Product', 'formipay') }
</button> </button>
</div> </div>