fix: Expose getSchemaProperty, disable upload widget, handle bracket notation arrays

Multiple fixes for array-of-objects and form processing:

1. Expose getSchemaProperty to window (plugins_manager.js):
   - getSchemaProperty was defined inside IIFE but needed by global functions
   - Added window.getSchemaProperty = getSchemaProperty before IIFE closes
   - Updated window.addArrayObjectItem to use window.getSchemaProperty
   - Fixes ReferenceError when dynamically adding array items

2. Disable upload widget for custom feeds (plugin_config.html):
   - File input and Upload button were still active but should be disabled
   - Removed onchange/onclick handlers, added disabled and aria-disabled
   - Added visible disabled styling and tooltip
   - Existing logos continue to display but uploads are prevented
   - Matches PR objectives to disable upload until fully implemented

3. Handle bracket notation array fields (api_v3.py):
   - checkbox-group uses name="field_name[]" which sends multiple values
   - request.form.to_dict() collapses duplicate keys (only keeps last value)
   - Added handling to detect fields ending with "[]" before to_dict()
   - Use request.form.getlist() to get all values, combine as comma-separated
   - Processed before existing array index field handling
   - Fixes checkbox-group losing all but last selected value
This commit is contained in:
Chuck
2026-01-08 13:45:23 -05:00
parent 8c2e3500bf
commit deef9a1e1e
3 changed files with 36 additions and 6 deletions

View File

@@ -3335,7 +3335,33 @@ def save_plugin_config():
# Form fields can use dot notation for nested values (e.g., "transition.type")
form_data = request.form.to_dict()
# First pass: detect and combine array index fields (e.g., "text_color.0", "text_color.1" -> "text_color" as array)
# First pass: handle bracket notation array fields (e.g., "field_name[]" from checkbox-group)
# These fields use getlist() to preserve all values, then replace in form_data
bracket_array_fields = {} # Maps base field path to list of values
for key in request.form.keys():
# Check if key ends with "[]" (bracket notation for array fields)
if key.endswith('[]'):
base_path = key[:-2] # Remove "[]" suffix
values = request.form.getlist(key)
if values:
bracket_array_fields[base_path] = values
# Remove the bracket notation key from form_data if present
if key in form_data:
del form_data[key]
# Process bracket notation fields and add to form_data as comma-separated strings
for base_path, values in bracket_array_fields.items():
# Get schema property to verify it's an array
base_prop = _get_schema_property(schema, base_path)
if base_prop and base_prop.get('type') == 'array':
# Combine values into comma-separated string for consistent parsing
combined_value = ', '.join(str(v) for v in values if v)
form_data[base_path] = combined_value
import logging
logger = logging.getLogger(__name__)
logger.debug(f"Processed bracket notation array field {base_path}: {values} -> {combined_value}")
# Second pass: detect and combine array index fields (e.g., "text_color.0", "text_color.1" -> "text_color" as array)
# This handles cases where forms send array fields as indexed inputs
array_fields = {} # Maps base field path to list of (index, value) tuples
processed_keys = set()

View File

@@ -6467,8 +6467,9 @@ window.updateImageScheduleDay = function(fieldId, imageId, imageIdx, day) {
window.updateImageList(fieldId, currentImages);
}
// Expose renderArrayObjectItem to window for use by window.addArrayObjectItem
// Expose renderArrayObjectItem and getSchemaProperty to window for use by global functions
window.renderArrayObjectItem = renderArrayObjectItem;
window.getSchemaProperty = getSchemaProperty;
})(); // End IIFE
@@ -6491,7 +6492,7 @@ if (typeof window !== 'undefined') {
if (!schema) return;
// Use getSchemaProperty to properly handle nested schemas (e.g., news.custom_feeds)
const arraySchema = getSchemaProperty(schema, fullKey);
const arraySchema = window.getSchemaProperty(schema, fullKey);
if (!arraySchema || arraySchema.type !== 'array' || !arraySchema.items) {
return;
}

View File

@@ -232,10 +232,13 @@
id="{{ field_id }}_logo_{{ item_index }}"
accept="image/png,image/jpeg,image/bmp,image/gif"
style="display: none;"
onchange="handleCustomFeedLogoUpload(event, '{{ field_id }}', {{ item_index }}, '{{ plugin_id }}', '{{ full_key }}')">
disabled
aria-disabled="true">
<button type="button"
onclick="document.getElementById('{{ field_id }}_logo_{{ item_index }}').click()"
class="px-2 py-1 text-xs bg-gray-200 hover:bg-gray-300 rounded">
disabled
aria-disabled="true"
class="px-2 py-1 text-xs bg-gray-200 text-gray-400 rounded cursor-not-allowed opacity-50"
title="Logo upload for custom feeds is not yet implemented">
<i class="fas fa-upload mr-1"></i> Upload
</button>
{% if logo_path %}