Summary:
@@ -211,8 +211,8 @@Summary:
@@ -277,7 +277,7 @@ 📖 Documentation @@ -305,7 +305,7 @@ accessToken: null, authScopes: [], filters: { - actor: '', selectedServices: [], search: '', operation: '', result: '', start: '', end: '', limit: 100, includeTags: '', excludeTags: '', + actor: '', selectedServices: [], search: '', operation: '', result: '', start: '', end: '', limit: 25, includeTags: '', excludeTags: '', }, options: { actors: [], services: [], operations: [], results: [] }, savedSearches: [], @@ -396,6 +396,9 @@ if (featRes.ok) { const featBody = await featRes.json(); this.aiFeaturesEnabled = featBody.ai_features_enabled !== false; + if (featBody.default_page_size) { + this.filters.limit = featBody.default_page_size; + } } else { this.aiFeaturesEnabled = true; } @@ -661,7 +664,27 @@ clearFilters() { const noisy = ['Exchange', 'SharePoint', 'Teams']; - this.filters = { actor: '', selectedServices: this.options.services.filter((s) => !noisy.includes(s)), search: '', operation: '', result: '', start: '', end: '', limit: 100, includeTags: '', excludeTags: '' }; + this.filters = { actor: '', selectedServices: this.options.services.filter((s) => !noisy.includes(s)), search: '', operation: '', result: '', start: '', end: '', limit: 25, includeTags: '', excludeTags: '' }; + this.saveFilters(); + this.resetPagination(); + this.loadEvents(); + }, + + filterByService(service) { + if (!service) return; + if (!this.filters.selectedServices.includes(service)) { + this.filters.selectedServices = [service]; + } else { + this.filters.selectedServices = this.filters.selectedServices.filter((s) => s !== service); + } + this.saveFilters(); + this.resetPagination(); + this.loadEvents(); + }, + + filterByResult(result) { + if (!result) return; + this.filters.result = this.filters.result === result ? '' : result; this.saveFilters(); this.resetPagination(); this.loadEvents(); diff --git a/backend/frontend/style.css b/backend/frontend/style.css index 892aec0..ebb07b1 100644 --- a/backend/frontend/style.css +++ b/backend/frontend/style.css @@ -355,6 +355,27 @@ input { border-color: rgba(239, 68, 68, 0.5); } +.pill--clickable { + cursor: pointer; + transition: transform 0.1s ease, box-shadow 0.15s ease, background 0.15s ease; +} + +.pill--clickable:hover { + transform: translateY(-1px); + box-shadow: 0 2px 8px rgba(125, 211, 252, 0.2); + background: rgba(125, 211, 252, 0.2); +} + +.pill--clickable.pill--ok:hover { + box-shadow: 0 2px 8px rgba(34, 197, 94, 0.2); + background: rgba(34, 197, 94, 0.25); +} + +.pill--clickable.pill--warn:hover { + box-shadow: 0 2px 8px rgba(249, 115, 22, 0.2); + background: rgba(249, 115, 22, 0.25); +} + .event h3 { margin: 0 0 6px; font-size: 17px; diff --git a/backend/routes/config.py b/backend/routes/config.py index d868a1e..ce00d83 100644 --- a/backend/routes/config.py +++ b/backend/routes/config.py @@ -4,6 +4,7 @@ from config import ( AUTH_ENABLED, AUTH_SCOPE, AUTH_TENANT_ID, + DEFAULT_PAGE_SIZE, ) from fastapi import APIRouter @@ -25,4 +26,5 @@ def auth_config(): def features_config(): return { "ai_features_enabled": AI_FEATURES_ENABLED, + "default_page_size": DEFAULT_PAGE_SIZE, }