Add structured values support to <dougal-event-edit/>

This commit is contained in:
D. Berge
2023-10-28 20:02:13 +02:00
parent 83c3f9b401
commit a369f2dd7b

View File

@@ -123,29 +123,11 @@
<v-row dense>
<v-col cols="12">
<v-combobox
ref="remarks"
v-model="entryRemarks"
:disabled="loading"
:search-input.sync="entryRemarksInput"
:items="remarksAvailable"
:filter="searchRemarks"
item-text="text"
return-object
label="Remarks"
hint="Placeholders: @DMS@, @DEG@, @EN@, @WD@, @BSP@, @CMG@, …"
prepend-icon="mdi-text-box-outline"
append-outer-icon="mdi-magnify"
@click:append-outer="(e) => remarksMenu = e"
></v-combobox>
<dougal-context-menu
:value="remarksMenu"
@input="handleRemarksMenu"
:items="presetRemarks"
absolute
></dougal-context-menu>
<dougal-event-select
v-bind.sync="entryRemarks"
:preset-remarks="presetRemarks"
@update:labels="(v) => this.entryLabels = v"
></dougal-event-select>
</v-col>
</v-row>
@@ -290,6 +272,7 @@
<script>
import { mapActions } from 'vuex';
import DougalContextMenu from '@/components/context-menu';
import DougalEventSelect from '@/components/event-select';
function stringSort (a, b) {
return a == b
@@ -308,6 +291,7 @@ function flattenRemarks(items, keywords=[], labels=[]) {
if (!item.items) {
result.push({
text: item.text,
properties: item.properties,
labels: labels.concat(item.labels??[]),
keywords
})
@@ -342,7 +326,8 @@ export default {
name: 'DougalEventEdit',
components: {
DougalContextMenu
DougalContextMenu,
DougalEventSelect
},
props: {
@@ -354,6 +339,7 @@ export default {
sequence: { type: Number },
point: { type: Number },
remarks: { type: String },
meta: { type: Object },
labels: { type: Array, default: () => [] },
latitude: { type: Number },
longitude: { type: Number },
@@ -371,18 +357,11 @@ export default {
entrySequence: null,
entryPoint: null,
entryRemarks: null,
entryRemarksInput: null,
entryLatitude: null,
entryLongitude: null
}),
computed: {
remarksAvailable () {
return this.entryRemarksInput == this.entryRemarks?.text ||
this.entryRemarksInput == this.entryRemarks
? []
: flattenRemarks(this.presetRemarks);
},
allSelected () {
return this.entryLabels.length === this.items.length
@@ -394,11 +373,6 @@ export default {
return true;
}
// The user is editing the remarks
if (this.entryRemarksText != this.entryRemarksInput) {
return true;
}
// Selected label set distinct from input labels
if (distinctSets(this.selectedLabels, this.entryLabels, (i) => i.text)) {
return true;
@@ -502,11 +476,8 @@ export default {
this.entrySequence = this.sequence;
this.entryPoint = this.point;
this.entryRemarks = this.remarks;
this.entryLabels = [...(this.labels??[])];
// Focus remarks field
this.$nextTick(() => this.$refs.remarks.focus());
this.makeEntryRemarks();
}
},
@@ -577,22 +548,13 @@ export default {
};
},
searchRemarks (item, queryText, itemText) {
const needle = queryText.toLowerCase();
const text = item.text.toLowerCase();
const keywords = item.keywords.map(i => i.toLowerCase());
const labels = item.labels.map(i => i.toLowerCase());
return text.includes(needle) ||
keywords.some(i => i.includes(needle)) ||
labels.some(i => i.includes(needle));
},
handleRemarksMenu (event) {
if (typeof event == 'boolean') {
this.remarksMenu = event;
} else {
this.entryRemarks = event;
this.remarksMenu = false;
makeEntryRemarks () {
this.entryRemarks = {
template: null,
schema: {},
values: [],
...this.meta?.structured_values,
text: this.remarks
}
},
@@ -657,14 +619,24 @@ export default {
save () {
// In case the focus goes directly from the remarks field
// to the Save button.
if (this.entryRemarksInput != this.entryRemarksText) {
this.entryRemarks = this.entryRemarksInput;
let meta;
if (this.entryRemarks.values?.length) {
meta = {
structured_values: {
template: this.entryRemarks.template,
schema: this.entryRemarks.schema,
values: this.entryRemarks.values
}
};
}
const data = {
id: this.id,
remarks: this.entryRemarksText,
labels: this.entryLabels
labels: this.entryLabels,
meta
};
/* NOTE This is the purist way.