11<script setup lang="ts">
2- import DropdownChecklist from ' @/components/DropdownChecklist.vue' ;
32import LogRecord from ' @/components/LogRecord.vue' ;
43import PerformanceDetails from ' @/components/PerformanceDetails.vue' ;
5- import type Checklist from ' @/models/Checklist' ;
6- import Arrays from ' @/services/Arrays' ;
74import {filter } from ' @/services/Objects' ;
85import {nullify } from ' @/services/Optional' ;
96import {useLogRecordStore } from ' @/stores/log_records' ;
7+ import {useSearchStore } from ' @/stores/search' ;
108import {onMounted , ref } from ' vue' ;
119import {useRoute , useRouter } from ' vue-router' ;
1210
1311const router = useRouter ();
1412const route = useRoute ();
1513const logRecordStore = useLogRecordStore ();
14+ const searchStore = useSearchStore ();
1615
16+ const searchRef = ref <HTMLInputElement >();
1717const file = ref (' ' );
18- const query = ref (' ' );
19- const levels = ref <Checklist >({choices: {}, selected: []});
20- const channels = ref <Checklist >({choices: {}, selected: []});
21- const perPage = ref (' 50' );
22- const sort = ref (' desc' );
2318const offset = ref (0 );
2419const badRequest = ref (false );
2520
2621const navigate = () => {
27- const fileOffset = offset .value > 0 && logRecordStore .records .paginator ?.direction !== sort . value ? 0 : offset .value ;
22+ const fileOffset = offset .value > 0 && logRecordStore .records .paginator ?.direction !== searchStore . sort ? 0 : offset .value ;
2823 router .push ({
2924 query: filter ({
3025 file: file .value ,
31- query: nullify (query .value , ' ' ),
32- perPage: nullify (perPage .value , ' 50' ),
33- sort: nullify (sort .value , ' desc' ),
34- levels: nullify (levels .value .selected .join (' ,' ), Object .keys (logRecordStore .records .levels .choices ).join (' ,' )),
35- channels: nullify (channels .value .selected .join (' ,' ), Object .keys (logRecordStore .records .channels .choices ).join (' ,' )),
26+ query: nullify (searchStore .query , ' ' ),
27+ perPage: nullify (searchStore .perPage , ' 50' ),
28+ sort: nullify (searchStore .sort , ' desc' ),
3629 offset: nullify (fileOffset , 0 )
3730 })
3831 });
@@ -41,53 +34,47 @@ const navigate = () => {
4134const load = () => {
4235 badRequest .value = false ;
4336 logRecordStore
44- .fetch (file .value , levels .value .selected , channels .value .selected , sort .value , perPage .value , query .value , offset .value )
45- .then (() => {
46- levels .value = logRecordStore .records .levels ;
47- channels .value = logRecordStore .records .channels ;
48- })
37+ .fetch (file .value , searchStore .sort , searchStore .perPage , searchStore .query , offset .value )
4938 .catch ((error : Error ) => {
5039 if (error .message === ' bad-request' ) {
5140 badRequest .value = true ;
5241 return ;
5342 }
54-
5543 router .push ({name: error .message });
44+ })
45+ .finally (() => {
46+ searchRef .value ?.focus ();
5647 });
5748}
5849
5950onMounted (() => {
60- file .value = String (route .query .file );
61- query .value = String ((route .query .query ?? ' ' ));
62- perPage .value = String ((route .query .perPage ?? ' 50' ));
63- sort .value = String ((route .query .sort ?? ' desc' ));
64- levels .value .selected = Arrays .split (String (route .query .levels ?? ' ' ), ' ,' );
65- channels .value .selected = Arrays .split (String (route .query .channels ?? ' ' ), ' ,' );
66- offset .value = parseInt (String (route .query .offset ?? ' 0' ));
51+ file .value = String (route .query .file );
52+ searchStore .query = String ((route .query .query ?? ' ' ));
53+ searchStore .perPage = String ((route .query .perPage ?? ' 50' ));
54+ searchStore .sort = String ((route .query .sort ?? ' desc' ));
55+ offset .value = parseInt (String (route .query .offset ?? ' 0' ));
6756 load ();
6857});
6958 </script >
7059
7160<template >
72- <div class =" slv-content h-100 overflow-hidden slv-loadable " v-bind:class = " { 'slv-loading': logRecordStore.loading } " >
61+ <div class =" slv-content h-100 overflow-hidden" >
7362 <div class =" d-flex align-items-stretch pt-1" >
74- <dropdown-checklist label =" Levels" v-model =" levels" class =" pe-1" ></dropdown-checklist >
75- <dropdown-checklist label =" Channels" v-model =" channels" class =" pe-1" ></dropdown-checklist >
76-
7763 <div class =" flex-grow-1 input-group" >
7864 <input type =" text"
7965 class =" form-control"
8066 :class =" {'is-invalid': badRequest}"
81- placeholder =" Search log entries"
82- aria-label =" Search log entries"
67+ ref =" searchRef"
68+ placeholder =" Search log entries, Use severity:, channel:, before:, after:, or exclude: to fine-tune the search."
69+ aria-label =" Search log entries, Use severity:, channel:, before:, after:, or exclude: to fine-tune the search."
8370 aria-describedby =" button-search"
8471 @change =" navigate"
85- v-model =" query" >
72+ v-model =" searchStore. query" >
8673
8774 <select class =" slv-menu-sort-direction form-control"
8875 aria-label =" Sort direction"
8976 title =" Sort direction"
90- v-model =" sort"
77+ v-model =" searchStore. sort"
9178 @change =" navigate" >
9279 <option value =" desc" >Newest First</option >
9380 <option value =" asc" >Oldest First</option >
@@ -96,7 +83,7 @@ onMounted(() => {
9683 <select class =" slv-menu-page-size form-control"
9784 aria-label =" Entries per page"
9885 title =" Entries per page"
99- v-model =" perPage"
86+ v-model =" searchStore. perPage"
10087 @change =" navigate" >
10188 <option value =" 50" >50</option >
10289 <option value =" 100" >100</option >
@@ -112,17 +99,15 @@ onMounted(() => {
11299 <button class =" btn btn-dark ms-1 me-1" type =" button" aria-label =" Refresh" title =" Refresh" @click =" load" >
113100 <i class =" bi bi-arrow-clockwise" ></i >
114101 </button >
115-
116- <div ></div >
117102 </div >
118103
119- <main class =" overflow-auto d-none d-md-block" >
104+ <main class =" overflow-auto d-none d-md-block slv-loadable " v-bind:class = " { 'slv-loading': logRecordStore.loading } " >
120105 <div class =" slv-entries list-group pt-1 pe-1 pb-3" >
121106 <log-record :logRecord =" record" v-for =" (record, index) in logRecordStore.records.logs ?? []" v-bind:key =" index" ></log-record >
122107 </div >
123108 </main >
124109
125- <footer class =" pt-1 pb-1 d-flex" >
110+ <footer class =" pt-1 pb-1 d-flex" v-show = " !logRecordStore.loading " >
126111 <button class =" btn btn-sm btn-outline-secondary"
127112 @click =" offset = 0; navigate()"
128113 v-bind:disabled =" logRecordStore.records.paginator?.first !== false" >
@@ -131,7 +116,7 @@ onMounted(() => {
131116 <button class =" ms-2 btn btn-sm btn-outline-secondary"
132117 @click =" offset = logRecordStore.records.paginator?.offset ?? 0; navigate()"
133118 v-bind:disabled =" logRecordStore.records.paginator?.more !== true" >
134- Next {{ perPage }}
119+ Next {{ searchStore. perPage }}
135120 </button >
136121
137122 <div class =" flex-grow-1" ></div >
0 commit comments