fix: Modal initial values + sticky footer + HTML descriptions

 Issue 1: Modal Not Showing Current Values (FIXED!)
Problem: Opening modal showed defaults, not current saved values
Root Cause: Backend only sent field.default, not current value
Solution:
- Backend: Added field.value with current saved value
- normalize_field() now includes: value: $current_settings[$key]
- Frontend: Use field.value ?? field.default for initial data
- GenericGatewayForm initializes with current values

Result:  Modal now shows "BNI Virtual Account 2" not "BNI Virtual Account"

 Issue 2: Sticky Modal Footer (FIXED!)
Problem: Footer scrolls away with long forms
Solution:
- Restructured modal: header + scrollable body + sticky footer
- DialogContent: flex flex-col with overflow on body only
- Footer: sticky bottom-0 with border-t
- Save button triggers form.requestSubmit()

Result:  Cancel, View in WooCommerce, Save always visible

 Issue 3: HTML in Descriptions (FIXED!)
Problem: TriPay icon shows as raw HTML string
Solution:
- Changed: {field.description}
- To: dangerouslySetInnerHTML={{ __html: field.description }}
- Respects vendor creativity (images, formatting, links)

Result:  TriPay icon image renders properly

📋 Technical Details:

Backend Changes (PaymentGatewaysProvider.php):
- get_gateway_settings() passes $current_settings to extractors
- normalize_field() adds 'value' => $current_settings[$key]
- All fields now have both default and current value

Frontend Changes:
- GatewayField interface: Added value?: string | boolean
- GenericGatewayForm: Initialize with field.value
- Modal structure: Header + Body (scroll) + Footer (sticky)
- Descriptions: Render as HTML with dangerouslySetInnerHTML

Files Modified:
- PaymentGatewaysProvider.php: Add current values to fields
- Payments.tsx: Restructure modal layout + add value to interface
- GenericGatewayForm.tsx: Use field.value + sticky footer + HTML descriptions

🎯 Result:
 Modal shows current saved values
 Footer always visible (no scrolling)
 Vendor HTML/images render properly
This commit is contained in:
dwindown
2025-11-05 23:52:57 +07:00
parent b578dfaeb0
commit 96f0482cfb
3 changed files with 84 additions and 43 deletions

View File

@@ -194,11 +194,12 @@ class PaymentGatewaysProvider {
*/
private static function get_gateway_settings(WC_Payment_Gateway $gateway): array {
$form_fields = $gateway->get_form_fields();
$current_settings = $gateway->settings; // Get current saved values
return [
'basic' => self::extract_basic_fields($form_fields),
'api' => self::extract_api_fields($form_fields),
'advanced' => self::extract_advanced_fields($form_fields),
'basic' => self::extract_basic_fields($form_fields, $current_settings),
'api' => self::extract_api_fields($form_fields, $current_settings),
'advanced' => self::extract_advanced_fields($form_fields, $current_settings),
];
}
@@ -208,9 +209,9 @@ class PaymentGatewaysProvider {
* @param array $form_fields All form fields
* @return array Basic fields
*/
private static function extract_basic_fields(array $form_fields): array {
private static function extract_basic_fields(array $form_fields, array $current_settings): array {
$basic_keys = ['enabled', 'title', 'description', 'instructions'];
return self::filter_fields($form_fields, $basic_keys);
return self::filter_fields($form_fields, $basic_keys, $current_settings);
}
/**
@@ -219,14 +220,14 @@ class PaymentGatewaysProvider {
* @param array $form_fields All form fields
* @return array API fields
*/
private static function extract_api_fields(array $form_fields): array {
private static function extract_api_fields(array $form_fields, array $current_settings): array {
$api_patterns = ['key', 'secret', 'token', 'api', 'client', 'merchant', 'account'];
$api_fields = [];
foreach ($form_fields as $key => $field) {
foreach ($api_patterns as $pattern) {
if (stripos($key, $pattern) !== false) {
$api_fields[$key] = self::normalize_field($key, $field);
$api_fields[$key] = self::normalize_field($key, $field, $current_settings);
break;
}
}
@@ -241,7 +242,7 @@ class PaymentGatewaysProvider {
* @param array $form_fields All form fields
* @return array Advanced fields
*/
private static function extract_advanced_fields(array $form_fields): array {
private static function extract_advanced_fields(array $form_fields, array $current_settings): array {
$basic_keys = ['enabled', 'title', 'description', 'instructions'];
$advanced_fields = [];
@@ -262,7 +263,7 @@ class PaymentGatewaysProvider {
}
if (!$is_api) {
$advanced_fields[$key] = self::normalize_field($key, $field);
$advanced_fields[$key] = self::normalize_field($key, $field, $current_settings);
}
}
@@ -276,12 +277,12 @@ class PaymentGatewaysProvider {
* @param array $keys Keys to extract
* @return array Filtered fields
*/
private static function filter_fields(array $form_fields, array $keys): array {
private static function filter_fields(array $form_fields, array $keys, array $current_settings): array {
$filtered = [];
foreach ($keys as $key) {
if (isset($form_fields[$key])) {
$filtered[$key] = self::normalize_field($key, $form_fields[$key]);
$filtered[$key] = self::normalize_field($key, $form_fields[$key], $current_settings);
}
}
@@ -295,13 +296,17 @@ class PaymentGatewaysProvider {
* @param array $field Field data
* @return array Normalized field
*/
private static function normalize_field(string $key, array $field): array {
private static function normalize_field(string $key, array $field, array $current_settings): array {
// 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'] ?? '',
'default' => $field['default'] ?? '',
'value' => $current_value, // Add current value!
'placeholder' => $field['placeholder'] ?? '',
'required' => !empty($field['required']),
'options' => $field['options'] ?? null,