feat: add PlatformSettings for pagination and vendor filter improvements

Platform Settings:
- Add PlatformSettings utility in init-alpine.js with 5-min cache
- Add Display tab in /admin/settings for rows_per_page config
- Integrate PlatformSettings.getRowsPerPage() in all paginated pages
- Standardize default per_page to 20 across all admin pages
- Add documentation at docs/frontend/shared/platform-settings.md

Architecture Rules:
- Add JS-010: enforce PlatformSettings usage for pagination
- Add JS-011: enforce standard pagination structure
- Add JS-012: detect double /api/v1 prefix in apiClient calls
- Implement all rules in validate_architecture.py

Vendor Filter (Tom Select):
- Add vendor filter to marketplace-products, vendor-products,
  customers, inventory, and vendor-themes pages
- Add selectedVendor display panel with clear button
- Add localStorage persistence for vendor selection
- Fix double /api/v1 prefix in vendor-selector.js

Bug Fixes:
- Remove duplicate PlatformSettings from utils.js
- Fix customers.js pagination structure (page_size → per_page)
- Fix code-quality-violations.js pagination structure

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
2025-12-22 22:39:34 +01:00
parent 1274135091
commit 6f8434f200
27 changed files with 1966 additions and 303 deletions

View File

@@ -18,6 +18,7 @@
<!-- Settings Categories Tabs -->
{% call tabs_nav() %}
{{ tab_button('display', 'Display', icon='view-grid') }}
{{ tab_button('logging', 'Logging', icon='document-text') }}
{{ tab_button('shipping', 'Shipping', icon='truck') }}
{{ tab_button('system', 'System', icon='cog') }}
@@ -25,6 +26,66 @@
{{ tab_button('notifications', 'Notifications', icon='bell') }}
{% endcall %}
<!-- Display Settings Tab -->
<div x-show="activeTab === 'display'" x-transition>
<div class="bg-white dark:bg-gray-800 rounded-lg shadow-md p-6">
<h3 class="text-lg font-semibold text-gray-700 dark:text-gray-200 mb-4">
Display Configuration
</h3>
<p class="text-sm text-gray-600 dark:text-gray-400 mb-6">
Configure how data is displayed across the admin interface.
</p>
<!-- Rows Per Page Setting -->
<div class="mb-6">
<label class="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2">
Default Rows Per Page
</label>
<p class="text-sm text-gray-500 dark:text-gray-400 mb-3">
Set the default number of rows shown in tables across the admin interface.
</p>
<div class="flex items-center gap-3">
<template x-for="option in [10, 20, 50, 100]" :key="option">
<button
@click="displaySettings.rows_per_page = option"
class="px-4 py-2 text-sm font-medium rounded-lg border transition-colors"
:class="displaySettings.rows_per_page === option
? 'bg-purple-600 text-white border-purple-600 dark:bg-purple-500 dark:border-purple-500'
: 'text-gray-700 dark:text-gray-300 bg-white dark:bg-gray-700 border-gray-300 dark:border-gray-600 hover:bg-gray-50 dark:hover:bg-gray-600'"
x-text="option"
></button>
</template>
</div>
<p class="mt-2 text-xs text-gray-500 dark:text-gray-400">
This setting applies to: Orders, Products, Customers, Inventory, and other tables.
</p>
</div>
<!-- Info Box -->
<div class="mb-6 p-4 bg-blue-50 dark:bg-blue-900/20 border border-blue-200 dark:border-blue-800 rounded-lg">
<div class="flex items-start">
<span x-html="$icon('information-circle', 'w-5 h-5 text-blue-600 dark:text-blue-400 mt-0.5 mr-3 flex-shrink-0')"></span>
<div class="text-sm text-blue-800 dark:text-blue-200">
<p class="font-medium mb-1">When does this take effect?</p>
<p>Changes to the rows per page setting will apply immediately to all admin tables when refreshed.</p>
</div>
</div>
</div>
<!-- Save Button -->
<div class="flex items-center justify-end pt-4 border-t border-gray-200 dark:border-gray-700">
<button
@click="saveDisplaySettings()"
:disabled="saving"
class="px-6 py-2 text-sm font-medium leading-5 text-white transition-colors duration-150 bg-purple-600 border border-transparent rounded-lg hover:bg-purple-700 focus:outline-none focus:shadow-outline-purple disabled:opacity-50 disabled:cursor-not-allowed"
>
<span x-show="!saving">Save Display Settings</span>
<span x-show="saving">Saving...</span>
</button>
</div>
</div>
</div>
<!-- Logging Settings Tab -->
<div x-show="activeTab === 'logging'" x-transition>
<div class="bg-white dark:bg-gray-800 rounded-lg shadow-md p-6">