diff --git a/app/templates/admin/code-quality-dashboard.html b/app/templates/admin/code-quality-dashboard.html index af59241c..f15e5ef6 100644 --- a/app/templates/admin/code-quality-dashboard.html +++ b/app/templates/admin/code-quality-dashboard.html @@ -2,6 +2,7 @@ {% extends "admin/base.html" %} {% from 'shared/macros/alerts.html' import loading_state, error_state, alert_dynamic %} {% from 'shared/macros/headers.html' import page_header_flex, refresh_button %} +{% from 'shared/macros/dropdowns.html' import action_dropdown, dropdown_item %} {% block title %}Code Quality Dashboard{% endblock %} @@ -14,44 +15,18 @@ {% block content %} {% call page_header_flex(title='Code Quality Dashboard', subtitle='Unified code quality tracking: architecture, security, and performance') %} {{ refresh_button(variant='secondary') }} - {# Custom dropdown: disabled state + template switching not supported by macro #} -
- -
- - - - -
-
+ {% call action_dropdown( + label='Run Scan', + loading_label='Scanning...', + open_var='scanDropdownOpen', + loading_var='scanning', + icon='search' + ) %} + {{ dropdown_item('Run All Validators', 'runScan("all"); scanDropdownOpen = false') }} + {{ dropdown_item('Architecture Only', 'runScan("architecture"); scanDropdownOpen = false') }} + {{ dropdown_item('Security Only', 'runScan("security"); scanDropdownOpen = false') }} + {{ dropdown_item('Performance Only', 'runScan("performance"); scanDropdownOpen = false') }} + {% endcall %} {% endcall %} {{ loading_state('Loading dashboard...') }} diff --git a/app/templates/admin/components.html b/app/templates/admin/components.html index a45c790a..af8b14c3 100644 --- a/app/templates/admin/components.html +++ b/app/templates/admin/components.html @@ -2136,6 +2136,139 @@ goToPage(n) { if (n !== '...' && n >= 1 && n <= this.totalPages) { this.paginati + + +
diff --git a/app/templates/shared/macros/dropdowns.html b/app/templates/shared/macros/dropdowns.html index 0ef08b22..1b49d6a3 100644 --- a/app/templates/shared/macros/dropdowns.html +++ b/app/templates/shared/macros/dropdowns.html @@ -348,3 +348,81 @@ {% endmacro %} + + +{# + Action Dropdown + =============== + A dropdown with loading/disabled state support for action buttons. + Uses external Alpine.js state from parent component. + + Parameters: + - label: Button label + - loading_label: Label shown when loading (default: 'Loading...') + - open_var: Alpine.js variable for open state + - loading_var: Alpine.js variable for loading/disabled state + - icon: Button icon (default: 'chevron-down') + - position: 'left' | 'right' (default: 'right') + - variant: 'primary' | 'secondary' (default: 'primary') + - width: Dropdown width class (default: 'w-48') + + Usage: + {% call action_dropdown( + label='Run Scan', + loading_label='Scanning...', + open_var='scanDropdownOpen', + loading_var='scanning', + icon='search' + ) %} + {{ dropdown_item('Run All', 'runScan("all")') }} + {{ dropdown_item('Architecture Only', 'runScan("architecture")') }} + {% endcall %} +#} +{% macro action_dropdown(label, loading_label='Loading...', open_var='isDropdownOpen', loading_var='isLoading', icon=none, position='right', variant='primary', width='w-48') %} +{% set variants = { + 'primary': 'text-white bg-purple-600 hover:bg-purple-700 border-transparent focus:shadow-outline-purple', + 'secondary': 'text-gray-700 dark:text-gray-300 bg-white dark:bg-gray-800 hover:bg-gray-50 dark:hover:bg-gray-700 border-gray-300 dark:border-gray-600 focus:shadow-outline-gray' +} %} +{% set positions = { + 'left': 'left-0', + 'right': 'right-0' +} %} +
+ + +
+ {{ caller() }} +
+
+{% endmacro %} diff --git a/static/admin/js/components.js b/static/admin/js/components.js index da959a2a..04c65b41 100644 --- a/static/admin/js/components.js +++ b/static/admin/js/components.js @@ -27,6 +27,7 @@ function adminComponents() { { id: 'tabs', name: 'Tabs', icon: 'view-boards' }, { id: 'forms', name: 'Forms', icon: 'clipboard-list' }, { id: 'buttons', name: 'Buttons', icon: 'cursor-click' }, + { id: 'dropdowns', name: 'Dropdowns', icon: 'chevron-down' }, { id: 'cards', name: 'Cards', icon: 'collection' }, { id: 'badges', name: 'Badges', icon: 'tag' }, { id: 'tables', name: 'Tables', icon: 'table' },