fix: Add full BACS bank account repeater support + gitignore references

1. Added references/ to .gitignore 

   Folder contains WooCommerce gateway examples:
   - bacs/class-wc-gateway-bacs.php
   - cheque/class-wc-gateway-cheque.php
   - cod/class-wc-gateway-cod.php
   - paypal/ (15 files)
   - currencies.json
   - flags.json

   Purpose: Development reference only, not for production

2. Fixed BACS Bank Account Repeater 

   Problem: Field type was 'account_details' not 'account'
   Solution: Added support for both field types

   Backend changes:
   - PaymentGatewaysProvider.php:
     * Exclude 'account_details' from API fields
     * Load accounts from 'woocommerce_bacs_accounts' option
     * Save accounts to separate option (WC standard)
     * Add default title/description for account_details

   Frontend changes:
   - GenericGatewayForm.tsx:
     * Support both 'account' and 'account_details' types
     * Handle case fallthrough for both types

   Data flow:
   GET: woocommerce_bacs_accounts → account_details.value
   POST: account_details → woocommerce_bacs_accounts

3. How BACS Works in WooCommerce 

   Field structure:
   {
     id: 'account_details',
     type: 'account_details',
     title: 'Account Details',
     description: '...',
     value: [
       {
         account_name: 'Business Account',
         account_number: '12345678',
         bank_name: 'Bank Central Asia',
         sort_code: '001',
         iban: '',
         bic: ''
       }
     ]
   }

   Storage:
   - Settings: woocommerce_bacs_settings (title, description, etc.)
   - Accounts: woocommerce_bacs_accounts (separate option)

   Why separate? WooCommerce uses custom save logic for accounts

4. Now Working 

   When you open BACS settings modal:
    Account Details section appears
    Shows existing bank accounts
    Add/remove accounts with repeater UI
    Save updates woocommerce_bacs_accounts
    Data persists correctly

   UI features:
   - 6 fields per account (3 required, 3 optional)
   - 2-column responsive grid
   - Add/remove buttons
   - Compact card layout

Files Modified:
- .gitignore: Added references/
- PaymentGatewaysProvider.php: BACS special handling
- GenericGatewayForm.tsx: account_details support

Result:
🎉 Bank account repeater now fully functional for BACS!
This commit is contained in:
dwindown
2025-11-06 13:28:42 +07:00
parent b221fe8b59
commit da241397a5
5 changed files with 32 additions and 1107 deletions

3
.gitignore vendored
View File

@@ -33,3 +33,6 @@ yarn-error.log*
# OS files
Thumbs.db
# References (WooCommerce gateway examples for development)
references/

View File

@@ -51,8 +51,8 @@ interface GenericGatewayFormProps {
}
// Supported field types (outside component to avoid re-renders)
// Note: WooCommerce BACS uses 'account' type for bank account repeater
const SUPPORTED_FIELD_TYPES = ['text', 'password', 'checkbox', 'select', 'textarea', 'number', 'email', 'url', 'account', 'title', 'multiselect'];
// Note: WooCommerce BACS uses 'account_details' type for bank account repeater
const SUPPORTED_FIELD_TYPES = ['text', 'password', 'checkbox', 'select', 'textarea', 'number', 'email', 'url', 'account', 'account_details', 'title', 'multiselect'];
// Bank account interface
interface BankAccount {
@@ -243,7 +243,8 @@ export function GenericGatewayForm({ gateway, onSave, onCancel, hideFooter = fal
);
case 'account':
// Bank account repeater field
case 'account_details':
// Bank account repeater field (BACS uses 'account_details')
// Parse value if it's a string (serialized PHP or JSON)
let accounts: BankAccount[] = [];
if (typeof value === 'string' && value) {

File diff suppressed because one or more lines are too long

1099
flags.json

File diff suppressed because it is too large Load Diff

View File

@@ -225,6 +225,11 @@ class PaymentGatewaysProvider {
$api_fields = [];
foreach ($form_fields as $key => $field) {
// Skip account_details - it's a special BACS field, not an API field
if ($key === 'account_details') {
continue;
}
foreach ($api_patterns as $pattern) {
if (stripos($key, $pattern) !== false) {
$api_fields[$key] = self::normalize_field($key, $field, $current_settings);
@@ -297,14 +302,20 @@ class PaymentGatewaysProvider {
* @return array Normalized field
*/
private static function normalize_field(string $key, array $field, array $current_settings): array {
// Special handling for BACS account_details
if ($key === 'account_details') {
$accounts = get_option('woocommerce_bacs_accounts', []);
$current_value = $accounts;
} else {
// Use current value if available, otherwise use default
$current_value = $current_settings[$key] ?? $field['default'] ?? '';
}
return [
'id' => $key,
'type' => $field['type'] ?? 'text',
'title' => $field['title'] ?? '',
'description' => $field['description'] ?? '',
'title' => $field['title'] ?? 'Account Details',
'description' => $field['description'] ?? 'Bank account details that will be displayed on the thank you page and in emails.',
'default' => $field['default'] ?? '',
'value' => $current_value, // Add current value!
'placeholder' => $field['placeholder'] ?? '',
@@ -368,6 +379,16 @@ class PaymentGatewaysProvider {
// Get current settings and merge with new ones
$gateway->init_settings();
$current_settings = $gateway->settings;
// Special handling for BACS account_details
if ($gateway_id === 'bacs' && isset($settings['account_details'])) {
$accounts = $settings['account_details'];
// Save to separate option like WooCommerce does
update_option('woocommerce_bacs_accounts', $accounts);
// Remove from settings array as it's not stored there
unset($settings['account_details']);
}
$new_settings = array_merge($current_settings, $settings);
// Debug logging