|
|
|
|
@@ -4,7 +4,7 @@
|
|
|
|
|
<meta charset="UTF-8" />
|
|
|
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
|
|
|
<title>Admin Operations Center</title>
|
|
|
|
|
<link rel="stylesheet" href="/style.css?v=9" />
|
|
|
|
|
<link rel="stylesheet" href="/style.css?v=10" />
|
|
|
|
|
<script defer src="https://cdn.jsdelivr.net/npm/alpinejs@3.x.x/dist/cdn.min.js"></script>
|
|
|
|
|
<script src="https://alcdn.msauth.net/browser/2.37.0/js/msal-browser.min.js" crossorigin="anonymous"></script>
|
|
|
|
|
</head>
|
|
|
|
|
@@ -184,8 +184,8 @@
|
|
|
|
|
<template x-for="(evt, idx) in askEvents" :key="evt.id || idx">
|
|
|
|
|
<article class="event event--compact">
|
|
|
|
|
<div class="event__meta">
|
|
|
|
|
<span class="pill" x-text="evt.display_category || evt.service || '—'"></span>
|
|
|
|
|
<span class="pill" :class="['success','succeeded','ok','passed','true'].includes((evt.result || '').toLowerCase()) ? 'pill--ok' : 'pill--warn'" x-text="evt.result || '—'"></span>
|
|
|
|
|
<span class="pill pill--clickable" x-text="evt.display_category || evt.service || '—'" @click="filterByService(evt.service || evt.display_category)" title="Filter by this service"></span>
|
|
|
|
|
<span class="pill pill--clickable" :class="['success','succeeded','ok','passed','true'].includes((evt.result || '').toLowerCase()) ? 'pill--ok' : 'pill--warn'" x-text="evt.result || '—'" @click="filterByResult(evt.result)" title="Filter by this result"></span>
|
|
|
|
|
</div>
|
|
|
|
|
<h3 x-text="evt.operation || '—'"></h3>
|
|
|
|
|
<p class="event__detail" x-show="evt.display_summary"><strong>Summary:</strong> <span x-text="evt.display_summary"></span></p>
|
|
|
|
|
@@ -211,8 +211,8 @@
|
|
|
|
|
<template x-for="(evt, idx) in events" :key="evt._id || evt.id || idx">
|
|
|
|
|
<article class="event">
|
|
|
|
|
<div class="event__meta">
|
|
|
|
|
<span class="pill" x-text="evt.display_category || evt.service || '—'"></span>
|
|
|
|
|
<span class="pill" :class="['success','succeeded','ok','passed','true'].includes((evt.result || '').toLowerCase()) ? 'pill--ok' : 'pill--warn'" x-text="evt.result || '—'"></span>
|
|
|
|
|
<span class="pill pill--clickable" x-text="evt.display_category || evt.service || '—'" @click="filterByService(evt.service || evt.display_category)" title="Filter by this service"></span>
|
|
|
|
|
<span class="pill pill--clickable" :class="['success','succeeded','ok','passed','true'].includes((evt.result || '').toLowerCase()) ? 'pill--ok' : 'pill--warn'" x-text="evt.result || '—'" @click="filterByResult(evt.result)" title="Filter by this result"></span>
|
|
|
|
|
</div>
|
|
|
|
|
<h3 x-text="evt.operation || '—'"></h3>
|
|
|
|
|
<p class="event__detail" x-show="evt.display_summary"><strong>Summary:</strong> <span x-text="evt.display_summary"></span></p>
|
|
|
|
|
@@ -277,7 +277,7 @@
|
|
|
|
|
<a :href="docsUrl" target="_blank" rel="noopener">📖 Documentation</a>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="footer__right">
|
|
|
|
|
<span>Built with ❤️ by CQRE</span>
|
|
|
|
|
<span>Built with ❤️ by CQRE.NET</span>
|
|
|
|
|
</div>
|
|
|
|
|
</footer>
|
|
|
|
|
</div>
|
|
|
|
|
@@ -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();
|
|
|
|
|
|