diff --git a/lnbits/core/templates/audit/index.html b/lnbits/core/templates/audit/index.html index 4baaacce2..542186f38 100644 --- a/lnbits/core/templates/audit/index.html +++ b/lnbits/core/templates/audit/index.html @@ -12,7 +12,7 @@ </div> <div class="col-lg-3 col-md-6 col-sm-12 text-center"> <q-card class="q-pt-sm"> - <strong>Long Running Endpoints</strong> + <strong>To 5 Long Running Endpoints</strong> <div style="width: 250px; height: 250px" class="q-pa-sm"> <canvas ref="longDurationChart"></canvas> </div> @@ -54,16 +54,18 @@ <q-input v-if="['ip_address', 'user_id', 'path',].includes(col.name)" v-model="searchData[col.name]" - @keydown.enter="searchAuditBy(col.name)" + @keydown.enter="searchAuditBy()" + @update:model-value="searchAuditBy()" dense type="text" filled + clearable :label="col.label" > <template v-slot:append> <q-icon name="search" - @click="searchAuditBy(col.name)" + @click="searchAuditBy()" class="cursor-pointer" /> </template> @@ -72,8 +74,9 @@ v-else-if="['component', 'response_code','request_method'].includes(col.name)" v-model="searchData[col.name]" :options="searchOptions[col.name]" - @update:model-value="searchAuditBy(col.name)" + @update:model-value="searchAuditBy()" :label="col.label" + clearable style="width: 100px" ></q-select> diff --git a/lnbits/static/js/audit.js b/lnbits/static/js/audit.js index f6abbc8ff..da70670d0 100644 --- a/lnbits/static/js/audit.js +++ b/lnbits/static/js/audit.js @@ -175,12 +175,16 @@ window.app = Vue.createApp({ LNbits.utils.notifyApiError(error) } }, - async searchAuditBy(fieldName) { - const fieldValue = this.searchData[fieldName] - this.auditTable.filter = {} - if (fieldValue) { - this.auditTable.filter[fieldName] = fieldValue + async searchAuditBy(fieldName, fieldValue) { + console.group('### searchAuditBy', fieldName, fieldValue) + if (fieldName) { + this.searchData[fieldName] = fieldValue } + // remove empty fields + this.auditTable.filter = Object.entries(this.searchData).reduce( + (a, [k, v]) => (v ? ((a[k] = v), a) : a), + {} + ) await this.fetchAudit() }, @@ -207,7 +211,6 @@ window.app = Vue.createApp({ return `${value.substring(0, 5)}...${value.substring(valueLength - 5, valueLength)}` }, initCharts() { - // Chart.defaults.color = 'secondary' this.responseCodeChart = new Chart( this.$refs.responseCodeChart.getContext('2d'), { @@ -221,8 +224,14 @@ window.app = Vue.createApp({ position: 'bottom' }, title: { - display: true, + display: false, text: 'HTTP Response Codes' + }, + onClick: (_, elements, chart) => { + if (elements[0]) { + const i = elements[0].index + this.searchAuditBy('response_code', chart.data.labels[i]) + } } } }, @@ -257,6 +266,12 @@ window.app = Vue.createApp({ title: { display: false } + }, + onClick: (_, elements, chart) => { + if (elements[0]) { + const i = elements[0].index + this.searchAuditBy('request_method', chart.data.labels[i]) + } } }, data: { @@ -293,13 +308,10 @@ window.app = Vue.createApp({ text: 'Components' } }, - onClick: (event, elements, chart) => { + onClick: (_, elements, chart) => { if (elements[0]) { const i = elements[0].index - console.log( - '#### click', - chart.data.labels[i] + ': ' + chart.data.datasets[0] - ) + this.searchAuditBy('component', chart.data.labels[i]) } } }, @@ -335,27 +347,23 @@ window.app = Vue.createApp({ maintainAspectRatio: false, plugins: { legend: { - position: 'xxx' - }, - title: { - display: true, - text: 'Long Duration' + title: { + display: false, + text: 'Long Duration' + } } }, - onClick: (event, elements, chart) => { + onClick: (_, elements, chart) => { if (elements[0]) { const i = elements[0].index - console.log( - '#### click', - chart.data.labels[i] + ': ' + chart.data.datasets[0] - ) + this.searchAuditBy('path', chart.data.labels[i]) } } }, data: { datasets: [ { - label: 'Components', + label: '', data: [], backgroundColor: [ 'rgb(255, 99, 132)',