mirror of
https://gitlab.com/wgp/dougal/software.git
synced 2025-12-06 09:07:09 +00:00
Adapt Log component to Vuex use for fetching data
This commit is contained in:
@@ -93,7 +93,21 @@
|
|||||||
append-icon="mdi-magnify"
|
append-icon="mdi-magnify"
|
||||||
label="Filter"
|
label="Filter"
|
||||||
single-line
|
single-line
|
||||||
hide-details></v-text-field>
|
clearable
|
||||||
|
hide-details>
|
||||||
|
<template v-slot:prepend-inner>
|
||||||
|
<v-chip v-if="labelSearch"
|
||||||
|
class="mr-1"
|
||||||
|
small
|
||||||
|
close
|
||||||
|
@click:close="labelSearch=null"
|
||||||
|
:color="labels[labelSearch] && labels[labelSearch].view.colour"
|
||||||
|
:title="labels[labelSearch] && labels[labelSearch].view.description"
|
||||||
|
:dark="labels[labelSearch] && labels[labelSearch].view.dark"
|
||||||
|
:light="labels[labelSearch] && labels[labelSearch].view.light"
|
||||||
|
>{{labelSearch}}</v-chip>
|
||||||
|
</template>
|
||||||
|
</v-text-field>
|
||||||
</v-toolbar>
|
</v-toolbar>
|
||||||
</v-card-title>
|
</v-card-title>
|
||||||
<v-card-text>
|
<v-card-text>
|
||||||
@@ -215,13 +229,14 @@
|
|||||||
:headers="headers"
|
:headers="headers"
|
||||||
:items="rows"
|
:items="rows"
|
||||||
:items-per-page.sync="itemsPerPage"
|
:items-per-page.sync="itemsPerPage"
|
||||||
|
:server-items-length="eventCount"
|
||||||
item-key="key"
|
item-key="key"
|
||||||
:item-class="itemClass"
|
:item-class="itemClass"
|
||||||
sort-by="tstamp"
|
sort-by="tstamp"
|
||||||
:sort-desc="true"
|
:sort-desc="true"
|
||||||
:search="filter"
|
:search="filter"
|
||||||
:custom-filter="searchTable"
|
:loading="eventsLoading"
|
||||||
:loading="loading"
|
:options.sync="options"
|
||||||
fixed-header
|
fixed-header
|
||||||
:footer-props='{itemsPerPageOptions: [ 10, 25, 50, 100, 500, -1 ], showFirstLastPage: true}'
|
:footer-props='{itemsPerPageOptions: [ 10, 25, 50, 100, 500, -1 ], showFirstLastPage: true}'
|
||||||
@click:row="setActiveItem"
|
@click:row="setActiveItem"
|
||||||
@@ -249,12 +264,12 @@
|
|||||||
:dark="labels[label] && labels[label].view.dark"
|
:dark="labels[label] && labels[label].view.dark"
|
||||||
:light="labels[label] && labels[label].view.light"
|
:light="labels[label] && labels[label].view.light"
|
||||||
:key="label"
|
:key="label"
|
||||||
:href="$route.path+'?label='+encodeURIComponent(label)"
|
@click="labelSearch=label"
|
||||||
>{{label}}</v-chip>
|
>{{label}}</v-chip>
|
||||||
</span>
|
</span>
|
||||||
<dougal-event-edit-history v-if="entry.has_edits && writeaccess"
|
<dougal-event-edit-history v-if="entry.has_edits && writeaccess"
|
||||||
:id="entry.id"
|
:id="entry.id"
|
||||||
:disabled="loading"
|
:disabled="eventsLoading"
|
||||||
:labels="labels"
|
:labels="labels"
|
||||||
></dougal-event-edit-history>
|
></dougal-event-edit-history>
|
||||||
<span v-if="entry.meta.readonly"
|
<span v-if="entry.meta.readonly"
|
||||||
@@ -385,7 +400,6 @@ export default {
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
items: [],
|
items: [],
|
||||||
labels: {},
|
|
||||||
options: {},
|
options: {},
|
||||||
filter: "",
|
filter: "",
|
||||||
filterableLabels: [ "QC", "QCAccepted" ],
|
filterableLabels: [ "QC", "QCAccepted" ],
|
||||||
@@ -394,7 +408,6 @@ export default {
|
|||||||
eventDialog: false,
|
eventDialog: false,
|
||||||
eventLabelsDialog: false,
|
eventLabelsDialog: false,
|
||||||
defaultEventTimestamp: null,
|
defaultEventTimestamp: null,
|
||||||
presetRemarks: null,
|
|
||||||
remarksMenu: null,
|
remarksMenu: null,
|
||||||
remarksMenuItem: null,
|
remarksMenuItem: null,
|
||||||
editedEvent: {},
|
editedEvent: {},
|
||||||
@@ -444,17 +457,6 @@ export default {
|
|||||||
return Object.values(rows);
|
return Object.values(rows);
|
||||||
},
|
},
|
||||||
|
|
||||||
userLabels () {
|
|
||||||
const filtered = {};
|
|
||||||
for (const key in this.labels) {
|
|
||||||
if (this.labels[key].model.user) {
|
|
||||||
filtered[key] = this.labels[key];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return filtered;
|
|
||||||
|
|
||||||
},
|
|
||||||
|
|
||||||
popularLabels () {
|
popularLabels () {
|
||||||
const tuples = this.items.flatMap( i => i.labels )
|
const tuples = this.items.flatMap( i => i.labels )
|
||||||
.filter( l => (this.labels[l]??{})?.model?.user )
|
.filter( l => (this.labels[l]??{})?.model?.user )
|
||||||
@@ -466,6 +468,10 @@ export default {
|
|||||||
.sort( (a, b) => b[1]-a[1] );
|
.sort( (a, b) => b[1]-a[1] );
|
||||||
},
|
},
|
||||||
|
|
||||||
|
presetRemarks () {
|
||||||
|
return this.projectConfiguration?.events?.presetRemarks ?? [];
|
||||||
|
},
|
||||||
|
|
||||||
defaultSequence () {
|
defaultSequence () {
|
||||||
if (this.$route.params.sequence) {
|
if (this.$route.params.sequence) {
|
||||||
return Number(this.$route.params.sequence.split(";").pop());
|
return Number(this.$route.params.sequence.split(";").pop());
|
||||||
@@ -474,19 +480,24 @@ export default {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
...mapGetters(['user', 'writeaccess', 'loading', 'online', 'sequence', 'line', 'point', 'position', 'timestamp', 'lineName', 'serverEvent']),
|
...mapGetters(['user', 'writeaccess', 'eventsLoading', 'online', 'sequence', 'line', 'point', 'position', 'timestamp', 'lineName', 'serverEvent', 'events', 'labels', 'userLabels']),
|
||||||
...mapState({projectSchema: state => state.project.projectSchema})
|
...mapState({projectSchema: state => state.project.projectSchema})
|
||||||
|
|
||||||
},
|
},
|
||||||
|
|
||||||
watch: {
|
watch: {
|
||||||
options: {
|
options: {
|
||||||
handler () {
|
async handler () {
|
||||||
//this.getEvents();
|
await this.fetchEvents();
|
||||||
},
|
},
|
||||||
deep: true
|
deep: true
|
||||||
},
|
},
|
||||||
|
|
||||||
|
async events () {
|
||||||
|
console.log("Events changed");
|
||||||
|
await this.fetchEvents();
|
||||||
|
},
|
||||||
|
|
||||||
eventDialog (val) {
|
eventDialog (val) {
|
||||||
if (val) {
|
if (val) {
|
||||||
// If not online
|
// If not online
|
||||||
@@ -494,30 +505,14 @@ export default {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
async serverEvent (event) {
|
filter (newVal, oldVal) {
|
||||||
if (event.channel == "event" && event.payload.schema == this.projectSchema) {
|
if (newVal?.toLowerCase() != oldVal?.toLowerCase()) {
|
||||||
if (!this.loading && !this.queuedReload) {
|
this.fetchEvents();
|
||||||
// Do not force a non-cached response if refreshing as a result
|
|
||||||
// of an event notification. We will assume that the server has
|
|
||||||
// already had time to update the cache by the time our request
|
|
||||||
// gets back to it.
|
|
||||||
this.getEvents();
|
|
||||||
} else {
|
|
||||||
this.queuedReload = true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
queuedReload (newVal, oldVal) {
|
labelSearch () {
|
||||||
if (newVal && !oldVal && !this.loading) {
|
this.fetchEvents();
|
||||||
this.getEvents();
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
loading (newVal, oldVal) {
|
|
||||||
if (!newVal && oldVal && this.queuedReload) {
|
|
||||||
this.getEvents();
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
|
|
||||||
itemsPerPage (newVal, oldVal) {
|
itemsPerPage (newVal, oldVal) {
|
||||||
@@ -574,50 +569,15 @@ export default {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
async getEventCount () {
|
async fetchEvents (opts = {}) {
|
||||||
//this.eventCount = await this.api([`/project/${this.$route.params.project}/event/?count`]);
|
const options = {
|
||||||
this.eventCount = null;
|
text: this.filter,
|
||||||
},
|
label: this.labelSearch,
|
||||||
|
...this.options
|
||||||
async getEvents (opts = {}) {
|
};
|
||||||
|
const res = await this.getEvents([this.$route.params.project, options]);
|
||||||
const query = new URLSearchParams(this.options);
|
this.items = res.events;
|
||||||
if (this.options.itemsPerPage < 0) {
|
this.eventCount = res.count;
|
||||||
query.delete("itemsPerPage");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this.$route.params.sequence) {
|
|
||||||
query.set("sequence", this.$route.params.sequence);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this.$route.params.date0) {
|
|
||||||
query.set("date0", this.$route.params.date0);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this.$route.params.date1) {
|
|
||||||
query.set("date1", this.$route.params.date1);
|
|
||||||
}
|
|
||||||
|
|
||||||
const url = `/project/${this.$route.params.project}/event?${query.toString()}`;
|
|
||||||
|
|
||||||
this.queuedReload = false;
|
|
||||||
this.items = await this.api([url, opts]) || [];
|
|
||||||
|
|
||||||
},
|
|
||||||
|
|
||||||
async getLabelDefinitions () {
|
|
||||||
const url = `/project/${this.$route.params.project}/label`;
|
|
||||||
|
|
||||||
//const labelSet = {};
|
|
||||||
this.labels = await this.api([url]) ?? {};
|
|
||||||
//labels.forEach( l => labelSet[l.name] = l.data );
|
|
||||||
//this.labels = labelSet;
|
|
||||||
},
|
|
||||||
|
|
||||||
async getPresetRemarks () {
|
|
||||||
const url = `/project/${this.$route.params.project}/configuration`;
|
|
||||||
|
|
||||||
this.presetRemarks = (await this.api([url]))?.events?.presetRemarks ?? {};
|
|
||||||
},
|
},
|
||||||
|
|
||||||
newItem (from = {}) {
|
newItem (from = {}) {
|
||||||
@@ -691,7 +651,7 @@ export default {
|
|||||||
if (!err && res.ok) {
|
if (!err && res.ok) {
|
||||||
this.showSnack(["Event saved", "success"]);
|
this.showSnack(["Event saved", "success"]);
|
||||||
this.queuedReload = true;
|
this.queuedReload = true;
|
||||||
this.getEvents({cache: "reload"});
|
this.fetchEvents({cache: "reload"});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -709,7 +669,7 @@ export default {
|
|||||||
if (!err && res.ok) {
|
if (!err && res.ok) {
|
||||||
this.showSnack(["Event saved", "success"]);
|
this.showSnack(["Event saved", "success"]);
|
||||||
this.queuedReload = true;
|
this.queuedReload = true;
|
||||||
this.getEvents({cache: "reload"});
|
this.fetchEvents({cache: "reload"});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -756,7 +716,7 @@ export default {
|
|||||||
if (!err && res.ok) {
|
if (!err && res.ok) {
|
||||||
this.showSnack([`${ids.length} events deleted`, "red"]);
|
this.showSnack([`${ids.length} events deleted`, "red"]);
|
||||||
this.queuedReload = true;
|
this.queuedReload = true;
|
||||||
this.getEvents({cache: "reload"});
|
this.fetchEvents({cache: "reload"});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -772,7 +732,7 @@ export default {
|
|||||||
if (!err && res.ok) {
|
if (!err && res.ok) {
|
||||||
this.showSnack(["Event deleted", "red"]);
|
this.showSnack(["Event deleted", "red"]);
|
||||||
this.queuedReload = true;
|
this.queuedReload = true;
|
||||||
this.getEvents({cache: "reload"});
|
this.fetchEvents({cache: "reload"});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -806,19 +766,6 @@ export default {
|
|||||||
|
|
||||||
},
|
},
|
||||||
|
|
||||||
searchTable (value, search, item) {
|
|
||||||
if (!value && !search) return true;
|
|
||||||
const s = search.toLowerCase();
|
|
||||||
if (typeof value === 'string') {
|
|
||||||
return value.toLowerCase().includes(s);
|
|
||||||
} else if (typeof value === 'number') {
|
|
||||||
return value == search;
|
|
||||||
} else {
|
|
||||||
return item.items.some( i => i.remarks.toLowerCase().includes(s) ) ||
|
|
||||||
item.items.some( i => i.labels.some( l => l.toLowerCase().includes(s) ));
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
viewOnMap(item) {
|
viewOnMap(item) {
|
||||||
if (item?.meta && item.meta?.geometry?.type == "Point") {
|
if (item?.meta && item.meta?.geometry?.type == "Point") {
|
||||||
const [ lon, lat ] = item.meta.geometry.coordinates;
|
const [ lon, lat ] = item.meta.geometry.coordinates;
|
||||||
@@ -857,14 +804,11 @@ export default {
|
|||||||
*/
|
*/
|
||||||
},
|
},
|
||||||
|
|
||||||
...mapActions(["api", "showSnack"])
|
...mapActions(["api", "showSnack", "refreshEvents", "getEvents"])
|
||||||
},
|
},
|
||||||
|
|
||||||
async mounted () {
|
async mounted () {
|
||||||
await this.getLabelDefinitions();
|
this.fetchEvents();
|
||||||
this.getEventCount();
|
|
||||||
this.getEvents();
|
|
||||||
this.getPresetRemarks();
|
|
||||||
|
|
||||||
window.addEventListener('keyup', this.handleKeyboardEvent);
|
window.addEventListener('keyup', this.handleKeyboardEvent);
|
||||||
},
|
},
|
||||||
|
|||||||
Reference in New Issue
Block a user