diff --git a/wordpress-dev/wordpress/wp-content/plugins/hvac-community-events/assets/css/hvac-dashboard-enhanced.css b/wordpress-dev/wordpress/wp-content/plugins/hvac-community-events/assets/css/hvac-dashboard-enhanced.css index 609c05e2..4d00447b 100644 --- a/wordpress-dev/wordpress/wp-content/plugins/hvac-community-events/assets/css/hvac-dashboard-enhanced.css +++ b/wordpress-dev/wordpress/wp-content/plugins/hvac-community-events/assets/css/hvac-dashboard-enhanced.css @@ -1,451 +1,358 @@ /** - * HVAC Dashboard - Enhanced Styling + * HVAC Dashboard Enhanced Styles * - * Updated dashboard styles using the harmonized framework - * to integrate seamlessly with the Astra theme. - * - * @version 3.0.0 + * Styles for the enhanced dashboard with filters, search, and pagination */ -/* Dashboard page wrapper */ -.hvac-dashboard-page { - background-color: var(--hvac-theme-background); - min-height: 70vh; - padding: var(--hvac-spacing-6) 0; -} - -/* Main dashboard container */ -.hvac-dashboard { - max-width: 1200px; - margin: 0 auto; - padding: 0 var(--hvac-spacing-4); -} - -/* Dashboard header */ -.hvac-dashboard-header { - background: linear-gradient(135deg, var(--hvac-primary) 0%, var(--hvac-primary-dark) 100%); - color: white; - padding: var(--hvac-spacing-8) var(--hvac-spacing-6); - border-radius: var(--hvac-radius-xl); - margin-bottom: var(--hvac-spacing-8); - box-shadow: var(--hvac-shadow-lg); - position: relative; - overflow: hidden; -} - -.hvac-dashboard-header::before { - content: ''; - position: absolute; - top: 0; - right: 0; - width: 100px; - height: 100px; - background: rgba(255, 255, 255, 0.1); - border-radius: 50%; - transform: translate(30px, -30px); -} - -.hvac-dashboard-header h1 { - font-size: var(--hvac-font-size-3xl); - font-weight: var(--hvac-font-weight-bold); - margin: 0 0 var(--hvac-spacing-2) 0; - color: white; -} - -.hvac-dashboard-header p { - font-size: var(--hvac-font-size-lg); - margin: 0; - opacity: 0.9; - color: white; -} - -/* Navigation */ -.hvac-dashboard-nav { +/* Table Controls Container */ +.hvac-table-controls { display: flex; - gap: var(--hvac-spacing-3); flex-wrap: wrap; - margin-top: var(--hvac-spacing-6); + gap: 20px; + align-items: center; + margin: 20px 0; + padding: 15px; + background: #f8f9fa; + border: 1px solid #e9ecef; + border-radius: 8px; } -.hvac-dashboard-nav .hvac-btn { - background-color: rgba(255, 255, 255, 0.15); - border-color: rgba(255, 255, 255, 0.3); - color: white; - backdrop-filter: blur(10px); +/* Search Box */ +.hvac-search-box { + flex: 1; + min-width: 250px; } -.hvac-dashboard-nav .hvac-btn:hover { - background-color: rgba(255, 255, 255, 0.25); - transform: translateY(-2px); +.hvac-search-box input[type="search"] { + width: 100%; + padding: 8px 12px; + border: 1px solid #ddd; + border-radius: 4px; + font-size: 14px; } -/* Stats grid */ -.hvac-dashboard-stats { - margin-bottom: var(--hvac-spacing-8); +.hvac-search-box input[type="search"]:focus { + outline: none; + border-color: #E9AF28; + box-shadow: 0 0 0 2px rgba(233, 175, 40, 0.2); } -.hvac-dashboard-stats h2 { - color: var(--hvac-theme-text-dark); - margin-bottom: var(--hvac-spacing-6); - text-align: center; -} - -.hvac-stats-grid { - display: grid; - grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); - gap: var(--hvac-spacing-6); -} - -.hvac-stat-card { - background: linear-gradient(135deg, var(--hvac-background-white) 0%, var(--hvac-primary-subtle) 100%); - border: 1px solid var(--hvac-border); - border-radius: var(--hvac-radius-xl); - padding: var(--hvac-spacing-6); - text-align: center; - box-shadow: var(--hvac-shadow-md); - transition: all var(--hvac-transition-normal); - position: relative; - overflow: hidden; -} - -.hvac-stat-card:hover { - transform: translateY(-4px); - box-shadow: var(--hvac-shadow-xl); -} - -.hvac-stat-card::before { - content: ''; - position: absolute; - top: 0; - left: 0; - right: 0; - height: 4px; - background: linear-gradient(90deg, var(--hvac-primary), var(--hvac-accent)); -} - -.hvac-stat-number { - font-size: var(--hvac-font-size-4xl); - font-weight: var(--hvac-font-weight-bold); - color: var(--hvac-primary); - margin-bottom: var(--hvac-spacing-2); - line-height: 1; -} - -.hvac-stat-label { - font-size: var(--hvac-font-size-md); - color: var(--hvac-theme-text); - font-weight: var(--hvac-font-weight-medium); - margin: 0; -} - -/* Events section */ -.hvac-dashboard-events { - margin-bottom: var(--hvac-spacing-8); -} - -.hvac-dashboard-events h2 { - color: var(--hvac-theme-text-dark); - margin-bottom: var(--hvac-spacing-6); +/* Date Filters */ +.hvac-date-filters { display: flex; align-items: center; - justify-content: space-between; - flex-wrap: wrap; - gap: var(--hvac-spacing-4); + gap: 10px; } -.hvac-events-header-actions { +.hvac-date-filters label { + font-weight: 600; + color: #333; +} + +.hvac-date-input { + padding: 6px 10px; + border: 1px solid #ddd; + border-radius: 4px; + font-size: 14px; +} + +.hvac-date-input:focus { + outline: none; + border-color: #E9AF28; +} + +/* Per Page Selector */ +.hvac-per-page { display: flex; - gap: var(--hvac-spacing-3); align-items: center; + gap: 8px; } -/* Events table container */ -.hvac-events-table-container { - background-color: var(--hvac-background-white); - border-radius: var(--hvac-radius-xl); - box-shadow: var(--hvac-shadow-lg); - overflow: hidden; - border: 1px solid var(--hvac-border); +.hvac-per-page label { + font-weight: 600; + color: #333; } -.hvac-events-table { +.hvac-per-page-select { + padding: 6px 10px; + border: 1px solid #ddd; + border-radius: 4px; + font-size: 14px; + background: white; +} + +.hvac-per-page-select:focus { + outline: none; + border-color: #E9AF28; +} + +/* Event Filters (Status Tabs) */ +.hvac-event-filters { + margin: 20px 0; + display: flex; + gap: 10px; + align-items: center; + padding: 10px 0; + border-bottom: 2px solid #e9ecef; +} + +.hvac-event-filters span { + font-weight: 600; + color: #333; +} + +.hvac-filter { + padding: 6px 16px; + border: 1px solid #ddd; + border-radius: 4px; + text-decoration: none; + color: #333; + transition: all 0.3s ease; + background: white; +} + +.hvac-filter:hover { + background-color: #f8f9fa; + border-color: #E9AF28; +} + +.hvac-filter-active, +.hvac-filter.ast-button-primary { + background-color: #E9AF28 !important; + color: #000 !important; + border-color: #E9AF28 !important; +} + +/* Events Table Wrapper */ +.hvac-events-table-wrapper { + position: relative; + overflow-x: auto; + margin-top: 20px; +} + +.hvac-events-table-wrapper.loading { + opacity: 0.6; +} + +.hvac-loading { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + background: rgba(255, 255, 255, 0.95); + padding: 20px 40px; + border-radius: 8px; + box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1); + z-index: 10; +} + +/* Enhanced Table Styles */ +.hvac-events-table, +.wp-list-table { width: 100%; border-collapse: collapse; - margin: 0; + margin-top: 20px; +} + +.hvac-events-table th, +.hvac-events-table td { + padding: 12px; + text-align: left; + border-bottom: 1px solid #ddd; } .hvac-events-table th { - background: linear-gradient(135deg, var(--hvac-secondary-light) 0%, var(--hvac-background-gray) 100%); - color: var(--hvac-theme-text-dark); - font-weight: var(--hvac-font-weight-semibold); - text-align: left; - padding: var(--hvac-spacing-4) var(--hvac-spacing-5); - border-bottom: 2px solid var(--hvac-border); - font-size: var(--hvac-font-size-sm); - text-transform: uppercase; - letter-spacing: 0.05em; + background-color: #f8f9fa; + font-weight: 600; + color: #333; } -.hvac-events-table td { - padding: var(--hvac-spacing-4) var(--hvac-spacing-5); - border-bottom: 1px solid var(--hvac-border-light); - vertical-align: middle; - font-size: var(--hvac-font-size-sm); +/* Sortable Column Headers */ +.hvac-events-table th.sortable { + cursor: pointer; } -.hvac-events-table tbody tr { - transition: background-color var(--hvac-transition-fast); +.hvac-events-table th.sortable a { + color: #333; + text-decoration: none; + display: flex; + align-items: center; + justify-content: space-between; } +.hvac-events-table th.sortable:hover { + background-color: #e9ecef; +} + +/* Sorting Indicators */ +.sorting-indicators { + display: inline-flex; + flex-direction: column; + margin-left: 5px; +} + +.sorting-indicator { + width: 0; + height: 0; + border-style: solid; + margin: 1px 0; +} + +.sorting-indicator.asc { + border-width: 0 4px 6px 4px; + border-color: transparent transparent #ccc transparent; +} + +.sorting-indicator.desc { + border-width: 6px 4px 0 4px; + border-color: #ccc transparent transparent transparent; +} + +.sorted.asc .sorting-indicator.asc, +.sorted.desc .sorting-indicator.desc { + border-bottom-color: #E9AF28; + border-top-color: #E9AF28; +} + +/* Table Rows */ .hvac-events-table tbody tr:hover { - background-color: var(--hvac-primary-subtle); + background-color: #f8f9fa; } -.hvac-events-table tbody tr:last-child td { - border-bottom: none; +.hvac-events-table tbody tr:nth-child(even) { + background-color: #fafafa; } -/* Event status badges */ -.hvac-event-status { - display: inline-flex; - align-items: center; - padding: var(--hvac-spacing-1) var(--hvac-spacing-3); - border-radius: var(--hvac-radius-lg); - font-size: var(--hvac-font-size-xs); - font-weight: var(--hvac-font-weight-medium); - text-transform: uppercase; - letter-spacing: 0.05em; +/* Column Specific Styles */ +.column-status { + width: 80px; } -.hvac-event-status--published { - background-color: var(--hvac-success-light); - color: var(--hvac-success); - border: 1px solid var(--hvac-success); +.column-title { + min-width: 200px; } -.hvac-event-status--draft { - background-color: var(--hvac-warning-light); - color: var(--hvac-warning); - border: 1px solid var(--hvac-warning); +.column-date { + width: 150px; } -.hvac-event-status--upcoming { - background-color: var(--hvac-info-light); - color: var(--hvac-accent); - border: 1px solid var(--hvac-accent); -} - -/* Event actions */ -.hvac-event-actions { - display: flex; - gap: var(--hvac-spacing-2); - align-items: center; -} - -.hvac-event-actions .hvac-btn { - padding: var(--hvac-spacing-1) var(--hvac-spacing-3); - font-size: var(--hvac-font-size-xs); - min-height: 32px; -} - -/* Empty state */ -.hvac-empty-state { +.column-capacity, +.column-sold { + width: 80px; text-align: center; - padding: var(--hvac-spacing-12) var(--hvac-spacing-6); - background-color: var(--hvac-background-white); - border-radius: var(--hvac-radius-xl); - border: 2px dashed var(--hvac-border); - margin: var(--hvac-spacing-6) 0; } -.hvac-empty-state-icon { - font-size: 4rem; - color: var(--hvac-border-dark); - margin-bottom: var(--hvac-spacing-4); +.column-revenue { + width: 100px; + text-align: right; } -.hvac-empty-state h3 { - color: var(--hvac-theme-text); - margin-bottom: var(--hvac-spacing-3); +.column-actions { + width: 150px; } -.hvac-empty-state p { - color: var(--hvac-theme-text-light); - margin-bottom: var(--hvac-spacing-6); - max-width: 400px; - margin-left: auto; - margin-right: auto; +/* Pagination */ +.tablenav { + margin: 20px 0; + display: flex; + justify-content: space-between; + align-items: center; } -/* Quick actions panel */ -.hvac-quick-actions { - background: linear-gradient(135deg, var(--hvac-background-white) 0%, var(--hvac-accent-light) 100%); - border: 1px solid var(--hvac-border); - border-radius: var(--hvac-radius-xl); - padding: var(--hvac-spacing-6); - box-shadow: var(--hvac-shadow-md); -} - -.hvac-quick-actions h3 { - margin-top: 0; - margin-bottom: var(--hvac-spacing-4); - color: var(--hvac-theme-text-dark); -} - -.hvac-quick-actions-grid { - display: grid; - grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); - gap: var(--hvac-spacing-4); -} - -.hvac-quick-action-item { +.tablenav-pages { display: flex; align-items: center; - padding: var(--hvac-spacing-4); - background-color: var(--hvac-background-white); - border: 1px solid var(--hvac-border); - border-radius: var(--hvac-radius-lg); - text-decoration: none; - color: var(--hvac-theme-text); - transition: all var(--hvac-transition-fast); + gap: 10px; } -.hvac-quick-action-item:hover { - transform: translateY(-2px); - box-shadow: var(--hvac-shadow-md); - text-decoration: none; - color: var(--hvac-primary); +.displaying-num { + color: #666; + font-size: 13px; } -.hvac-quick-action-icon { - margin-right: var(--hvac-spacing-3); - font-size: var(--hvac-font-size-xl); - color: var(--hvac-primary); -} - -.hvac-quick-action-text { - font-weight: var(--hvac-font-weight-medium); -} - -/* Responsive design */ -@media (max-width: 768px) { - .hvac-dashboard { - padding: 0 var(--hvac-spacing-3); - } - - .hvac-dashboard-header { - padding: var(--hvac-spacing-6) var(--hvac-spacing-4); - text-align: center; - } - - .hvac-dashboard-header h1 { - font-size: var(--hvac-font-size-2xl); - } - - .hvac-dashboard-nav { - justify-content: center; - } - - .hvac-stats-grid { - grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); - gap: var(--hvac-spacing-4); - } - - .hvac-stat-card { - padding: var(--hvac-spacing-4); - } - - .hvac-stat-number { - font-size: var(--hvac-font-size-3xl); - } - - .hvac-events-table-container { - overflow-x: auto; - } - - .hvac-events-table th, - .hvac-events-table td { - padding: var(--hvac-spacing-2) var(--hvac-spacing-3); - font-size: var(--hvac-font-size-xs); - } - - .hvac-quick-actions-grid { - grid-template-columns: 1fr; - } -} - -@media (max-width: 480px) { - .hvac-dashboard-header { - padding: var(--hvac-spacing-4); - } - - .hvac-dashboard-header h1 { - font-size: var(--hvac-font-size-xl); - } - - .hvac-dashboard-nav .hvac-btn { - width: 100%; - margin-bottom: var(--hvac-spacing-2); - } - - .hvac-stats-grid { - grid-template-columns: 1fr; - } - - .hvac-events-table th, - .hvac-events-table td { - padding: var(--hvac-spacing-1) var(--hvac-spacing-2); - } - - .hvac-event-actions { - flex-direction: column; - gap: var(--hvac-spacing-1); - } - - .hvac-event-actions .hvac-btn { - width: 100%; - padding: var(--hvac-spacing-2); - font-size: var(--hvac-font-size-xs); - } -} - -/* Loading states */ -.hvac-loading { - display: inline-flex; +.pagination-links { + display: flex; align-items: center; - gap: var(--hvac-spacing-2); + gap: 5px; } -.hvac-loading-spinner { - width: 16px; - height: 16px; - border: 2px solid var(--hvac-border); - border-top: 2px solid var(--hvac-primary); - border-radius: 50%; - animation: hvac-spin 1s linear infinite; +.pagination-links .button { + padding: 4px 8px; + border: 1px solid #ddd; + background: white; + color: #333; + text-decoration: none; + border-radius: 3px; + min-width: 30px; + text-align: center; + cursor: pointer; } -@keyframes hvac-spin { - 0% { transform: rotate(0deg); } - 100% { transform: rotate(360deg); } +.pagination-links .button:hover:not(.disabled) { + background: #f8f9fa; + border-color: #E9AF28; } -/* Focus styles for better accessibility */ -.hvac-events-table tbody tr:focus-within { - outline: 2px solid var(--hvac-primary); - outline-offset: -2px; +.pagination-links .button.disabled { + opacity: 0.5; + cursor: default; } -/* Dark mode support (if theme supports it) */ -@media (prefers-color-scheme: dark) { - .hvac-dashboard-page { - background-color: #1a202c; +.paging-input { + display: flex; + align-items: center; + gap: 5px; +} + +.current-page { + width: 50px; + padding: 4px; + text-align: center; + border: 1px solid #ddd; + border-radius: 3px; +} + +/* Error Messages */ +.hvac-error { + background: #fee; + border: 1px solid #fcc; + color: #c00; + padding: 15px; + margin: 20px 0; + border-radius: 4px; +} + +/* Responsive Design */ +@media (max-width: 768px) { + .hvac-table-controls { + flex-direction: column; + align-items: stretch; } - .hvac-stat-card, - .hvac-events-table-container, - .hvac-quick-actions { - background-color: #2d3748; - border-color: #4a5568; + .hvac-search-box { + min-width: 100%; + } + + .hvac-date-filters { + flex-wrap: wrap; + } + + .hvac-events-table { + font-size: 14px; + } + + .hvac-events-table th, + .hvac-events-table td { + padding: 8px 5px; + } + + .column-organizer, + .column-capacity { + display: none; + } + + .tablenav { + flex-direction: column; + gap: 15px; } } \ No newline at end of file diff --git a/wordpress-dev/wordpress/wp-content/plugins/hvac-community-events/assets/js/hvac-dashboard-enhanced.js b/wordpress-dev/wordpress/wp-content/plugins/hvac-community-events/assets/js/hvac-dashboard-enhanced.js new file mode 100644 index 00000000..ba1da608 --- /dev/null +++ b/wordpress-dev/wordpress/wp-content/plugins/hvac-community-events/assets/js/hvac-dashboard-enhanced.js @@ -0,0 +1,259 @@ +/** + * HVAC Trainer Dashboard Enhanced JavaScript + * + * Handles dynamic filtering, sorting, pagination, and search for the events table. + */ +(function($) { + 'use strict'; + + // Store current state + let currentState = { + status: 'all', + search: '', + orderby: 'date', + order: 'DESC', + page: 1, + per_page: 10, + date_from: '', + date_to: '' + }; + + // Debounce timer for search + let searchTimer = null; + + // Initialize the dashboard when DOM is ready + $(document).ready(function() { + initializeEnhancedDashboard(); + }); + + /** + * Initialize all enhanced dashboard features + */ + function initializeEnhancedDashboard() { + // Initialize state from URL params + initializeStateFromURL(); + + // Set up event handlers + initEventFilters(); + initSearchBox(); + initDateFilters(); + initPerPageSelector(); + initSortableColumns(); + initPagination(); + } + + /** + * Initialize state from URL parameters + */ + function initializeStateFromURL() { + const urlParams = new URLSearchParams(window.location.search); + + currentState.status = urlParams.get('event_status') || 'all'; + currentState.search = urlParams.get('search') || ''; + currentState.orderby = urlParams.get('orderby') || 'date'; + currentState.order = urlParams.get('order') || 'DESC'; + currentState.page = parseInt(urlParams.get('paged')) || 1; + currentState.per_page = parseInt(urlParams.get('per_page')) || 10; + currentState.date_from = urlParams.get('date_from') || ''; + currentState.date_to = urlParams.get('date_to') || ''; + + // Update UI elements to match state + $('#hvac-event-search').val(currentState.search); + $('#hvac-date-from').val(currentState.date_from); + $('#hvac-date-to').val(currentState.date_to); + $('#hvac-per-page').val(currentState.per_page); + } + + /** + * Initialize status filter tabs + */ + function initEventFilters() { + $('.hvac-event-filters a').on('click', function(e) { + e.preventDefault(); + + const status = $(this).data('status'); + currentState.status = status; + currentState.page = 1; // Reset to first page when filtering + + // Update active class + $('.hvac-event-filters a').removeClass('hvac-filter-active ast-button-primary').addClass('ast-button-secondary'); + $(this).addClass('hvac-filter-active ast-button-primary').removeClass('ast-button-secondary'); + + // Refresh table + refreshEventsTable(); + }); + } + + /** + * Initialize search box + */ + function initSearchBox() { + $('#hvac-event-search').on('keyup', function() { + const searchTerm = $(this).val(); + + // Clear existing timer + if (searchTimer) { + clearTimeout(searchTimer); + } + + // Set new timer to debounce search + searchTimer = setTimeout(function() { + currentState.search = searchTerm; + currentState.page = 1; // Reset to first page when searching + refreshEventsTable(); + }, 500); // 500ms delay + }); + } + + /** + * Initialize date filters + */ + function initDateFilters() { + $('#hvac-date-from, #hvac-date-to').on('change', function() { + currentState.date_from = $('#hvac-date-from').val(); + currentState.date_to = $('#hvac-date-to').val(); + currentState.page = 1; // Reset to first page when filtering + refreshEventsTable(); + }); + } + + /** + * Initialize per page selector + */ + function initPerPageSelector() { + $('#hvac-per-page').on('change', function() { + currentState.per_page = parseInt($(this).val()); + currentState.page = 1; // Reset to first page when changing per page + refreshEventsTable(); + }); + } + + /** + * Initialize sortable column headers + */ + function initSortableColumns() { + $(document).on('click', '.hvac-events-table-wrapper th.sortable a', function(e) { + e.preventDefault(); + + const orderby = $(this).data('orderby'); + const order = $(this).data('order'); + + currentState.orderby = orderby; + currentState.order = order; + currentState.page = 1; // Reset to first page when sorting + + refreshEventsTable(); + }); + } + + /** + * Initialize pagination controls + */ + function initPagination() { + // Pagination links + $(document).on('click', '.pagination-links a:not(.disabled)', function(e) { + e.preventDefault(); + + const page = parseInt($(this).data('page')); + if (page) { + currentState.page = page; + refreshEventsTable(); + } + }); + + // Page input field + $(document).on('keypress', '.current-page', function(e) { + if (e.which === 13) { // Enter key + e.preventDefault(); + const page = parseInt($(this).val()); + const totalPages = parseInt($('.total-pages').text()); + + if (page >= 1 && page <= totalPages) { + currentState.page = page; + refreshEventsTable(); + } + } + }); + } + + /** + * Refresh the events table via AJAX + */ + function refreshEventsTable() { + const $eventsTableWrapper = $('.hvac-events-table-wrapper'); + + // Show loading indicator + $eventsTableWrapper.addClass('loading').append('
' + message + '
| Status | -Event Name | -Date | -Organizer | -Capacity | -Sold | -Revenue | -Actions | -|||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| + + Status + + + + + + | ++ + Event Name + + + + + + | ++ + Date + + + + + + | +Organizer | ++ + Capacity + + + + + + | ++ + Sold + + + + + + | ++ + Revenue + + + + + + | +Actions | +|||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| - | + | + | - | - | + | - | - | - | $ | -+ | + | + | $ | +Edit | - Summary + Summary | + View |
No events found.
+ +