Skip to content

Commit 66cde35

Browse files
committed
Adding date range
1 parent 131e986 commit 66cde35

File tree

6 files changed

+89
-6
lines changed

6 files changed

+89
-6
lines changed

src/Frontend/package-lock.json

Lines changed: 26 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/Frontend/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
"@tinyhttp/content-disposition": "^2.2.2",
2525
"@vue-flow/controls": "^1.1.2",
2626
"@vue-flow/core": "^1.42.5",
27+
"@vuepic/vue-datepicker": "^11.0.2",
2728
"bootstrap": "^5.3.5",
2829
"bootstrap-icons": "^1.11.3",
2930
"codemirror": "^6.0.1",

src/Frontend/src/components/audit/AuditList.vue

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,12 @@ import ResultsCount from "@/components/ResultsCount.vue";
1010
import DropDown from "@/components/DropDown.vue";
1111
import { computed, ref, watch } from "vue";
1212
import { dotNetTimespanToMilliseconds, formatDotNetTimespan, formatTypeName } from "@/composables/formatUtils.ts";
13-
import EndpointSelector from "@/components/audit/EndpointSelector.vue";
13+
import ListFilterSelector from "@/components/audit/ListFilterSelector.vue";
14+
import "@vuepic/vue-datepicker/dist/main.css";
15+
import DatePickerRange from "@/components/audit/DatePickerRange.vue";
1416
1517
const store = useAuditStore();
16-
const { messages, sortBy, totalCount, messageFilterString, selectedEndpointName, endpoints, itemsPerPage } = storeToRefs(store);
18+
const { messages, sortBy, totalCount, messageFilterString, selectedEndpointName, endpoints, itemsPerPage, dateRange } = storeToRefs(store);
1719
const route = useRoute();
1820
1921
const endpointNames = computed(() => {
@@ -102,10 +104,13 @@ function hasWarning(message: Message) {
102104
<FilterInput v-model="messageFilterString" placeholder="Search messages..." aria-label="Search messages" />
103105
</div>
104106
<div>
105-
<EndpointSelector :items="numberOfItemsPerPage" instructions="Select how many result to display" v-model="selectedItemsPerPage" item-name="result" label="Show" default-empty-text="Any" :show-clear="false" :show-filter="false" />
107+
<ListFilterSelector :items="numberOfItemsPerPage" instructions="Select how many result to display" v-model="selectedItemsPerPage" item-name="result" label="Show" default-empty-text="Any" :show-clear="false" :show-filter="false" />
106108
</div>
107109
<div>
108-
<EndpointSelector :items="endpointNames" instructions="Select an endpoint" v-model="selectedEndpointName" item-name="endpoint" label="Endpoint" default-empty-text="Any" :show-clear="true" :show-filter="true" />
110+
<ListFilterSelector :items="endpointNames" instructions="Select an endpoint" v-model="selectedEndpointName" item-name="endpoint" label="Endpoint" default-empty-text="Any" :show-clear="true" :show-filter="true" />
111+
</div>
112+
<div>
113+
<DatePickerRange v-model="dateRange" />
109114
</div>
110115
<div>
111116
<DropDown label="Sort by" :callback="setSortBy" :select-item="selectedSortByItem" :items="sortByItems" />
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
<script setup lang="ts">
2+
import VueDatePicker from "@vuepic/vue-datepicker";
3+
import { ref, watch } from "vue";
4+
5+
const model = defineModel<Date[]>({ required: true });
6+
const internalModel = ref<Date[]>([]);
7+
const displayDataRange = ref<string>("No dates");
8+
9+
watch(internalModel, () => {
10+
model.value = internalModel.value;
11+
if (internalModel.value.length === 2) {
12+
const from = internalModel.value[0];
13+
const to = internalModel.value[1];
14+
displayDataRange.value = `${from.toLocaleDateString()} ${from.toLocaleTimeString()} - ${to.toLocaleDateString()} ${to.toLocaleTimeString()}`;
15+
}
16+
});
17+
</script>
18+
19+
<template>
20+
<div class="date-picker-range">
21+
<label>Dates:</label>
22+
<VueDatePicker v-model="internalModel" :range="{ partialRange: false }" :enable-seconds="true" :max-date="new Date()">
23+
<template #trigger>
24+
<a class="triggerLink">{{ displayDataRange }}</a>
25+
</template>
26+
</VueDatePicker>
27+
</div>
28+
</template>
29+
30+
<style scoped>
31+
.triggerLink {
32+
margin-left: 0.3em;
33+
cursor: pointer;
34+
}
35+
.date-picker-range {
36+
display: flex;
37+
align-items: center;
38+
margin-left: 1em;
39+
}
40+
</style>

src/Frontend/src/components/audit/EndpointSelector.vue renamed to src/Frontend/src/components/audit/ListFilterSelector.vue

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
<script setup lang="ts">
22
import FilterInput from "@/components/FilterInput.vue";
33
import { ref, watch } from "vue";
4+
45
const selected = defineModel<string>({ required: true });
56
const props = defineProps<{ items: string[]; instructions: string; itemName: string; label: string; defaultEmptyText: string; showClear: boolean; showFilter: boolean }>();
67
const filter = ref("");

src/Frontend/src/stores/AuditStore.ts

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ export const useAuditStore = defineStore("AuditStore", () => {
1212
isAscending: false,
1313
});
1414

15+
const dateRange = ref<Date[]>([]);
1516
const messageFilterString = ref("");
1617
const itemsPerPage = ref(100);
1718
const totalCount = ref(0);
@@ -36,8 +37,16 @@ export const useAuditStore = defineStore("AuditStore", () => {
3637
const dataRetriever = useAutoRefresh(
3738
async () => {
3839
try {
40+
let from = "",
41+
to = "";
42+
if (dateRange.value.length === 2) {
43+
console.log(dateRange.value);
44+
from = dateRange.value[0].toISOString();
45+
to = dateRange.value[1].toISOString();
46+
}
47+
3948
const [response, data] = await useTypedFetchFromServiceControl<Message[]>(
40-
`messages2/?endpoint_name=${selectedEndpointName.value}&q=${messageFilterString.value}&page_size=${itemsPerPage.value}&sort=${sortByInstances.value.property}&direction=${sortByInstances.value.isAscending ? "asc" : "desc"}`
49+
`messages2/?endpoint_name=${selectedEndpointName.value}&from=${from}&to=${to}&q=${messageFilterString.value}&page_size=${itemsPerPage.value}&sort=${sortByInstances.value.property}&direction=${sortByInstances.value.isAscending ? "asc" : "desc"}`
4150
);
4251
totalCount.value = parseInt(response.headers.get("total-count") ?? "0");
4352
messages.value = data;
@@ -51,7 +60,7 @@ export const useAuditStore = defineStore("AuditStore", () => {
5160
);
5261

5362
const refresh = dataRetriever.executeAndResetTimer;
54-
watch([itemsPerPage, sortByInstances, messageFilterString, selectedEndpointName], () => refresh());
63+
watch([itemsPerPage, sortByInstances, messageFilterString, selectedEndpointName, dateRange], () => refresh());
5564

5665
return {
5766
refresh,
@@ -62,6 +71,7 @@ export const useAuditStore = defineStore("AuditStore", () => {
6271
itemsPerPage,
6372
totalCount,
6473
endpoints,
74+
dateRange,
6575
};
6676
});
6777

0 commit comments

Comments
 (0)