Skip to content

Commit b8b8a91

Browse files
committed
support editing item metadata through code
Signed-off-by: Jimmy Tanagra <[email protected]>
1 parent ed922e7 commit b8b8a91

File tree

3 files changed

+59
-9
lines changed

3 files changed

+59
-9
lines changed

bundles/org.openhab.ui/web/src/components/item/item-mixin.js

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ export default {
8484
value: unit,
8585
config: {}
8686
}
87-
return this.saveMetaData(item, 'unit', metadata)
87+
return this.saveMetadata(item, 'unit', metadata)
8888
} else {
8989
return Promise.resolve()
9090
}
@@ -98,13 +98,16 @@ export default {
9898
pattern: stateDescriptionPattern
9999
}
100100
}
101-
return this.saveMetaData(item, 'stateDescription', metadata)
101+
return this.saveMetadata(item, 'stateDescription', metadata)
102102
} else {
103103
return Promise.resolve()
104104
}
105105
},
106-
saveMetaData (item, value, metadata) {
107-
return this.$oh.api.put('/rest/items/' + item.name + '/metadata/' + value, metadata)
106+
saveMetadata (item, namespace, metadata) {
107+
return this.$oh.api.put('/rest/items/' + item.name + '/metadata/' + namespace, metadata)
108+
},
109+
deleteMetadata (item, namespace) {
110+
return this.$oh.api.delete('/rest/items/' + item.name + '/metadata/' + namespace)
108111
}
109112
}
110113
}

bundles/org.openhab.ui/web/src/pages/settings/items/item-edit.vue

Lines changed: 48 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@ import ItemForm from '@/components/item/item-form.vue'
9595
9696
import DirtyMixin from '../dirty-mixin'
9797
import ItemMixin from '@/components/item/item-mixin'
98+
import { name } from 'jssip'
9899
99100
export default {
100101
mixins: [DirtyMixin, ItemMixin],
@@ -285,7 +286,9 @@ export default {
285286
}).open()
286287
}
287288
288-
this.itemDirty = this.codeDirty = false
289+
this.doSaveMetadata()
290+
291+
this.dirty = this.itemDirty = this.codeDirty = false
289292
if (this.createMode) {
290293
this.f7router.navigate('/settings/items/' + this.item.name)
291294
} else {
@@ -299,6 +302,49 @@ export default {
299302
}).open()
300303
})
301304
},
305+
doSaveMetadata () {
306+
console.log('Saving metadata...')
307+
const newNamespaces = new Set(Object.keys(this.item.metadata || {}))
308+
309+
// remove deleted metadata
310+
const deletionPromises = Object.entries(this.savedItem.metadata || {})
311+
.filter(([namespace, savedMetadata]) => savedMetadata.editable && !newNamespaces.has(namespace))
312+
.map(([namespace, _]) => this.deleteMetadata(this.item, namespace))
313+
314+
// create/update new/changed metadata
315+
const updatePromises = Object.entries(this.item.metadata || {})
316+
.filter(([namespace, metadata]) => {
317+
const savedMetadata = this.savedItem.metadata?.[namespace] || {}
318+
if (savedMetadata.editable === false) return false // don't touch non-editable metadata
319+
320+
// remove editable flag from comparison, because the generated code doesn't have it
321+
delete savedMetadata.editable
322+
323+
metadata = metadata || {}
324+
const newMetadata = { ...metadata }
325+
// the editable flag may exist in the original loaded item (not from generated code)
326+
delete newMetadata.editable
327+
328+
return !fastDeepEqual(newMetadata, savedMetadata)
329+
})
330+
.map(([namespace, metadata]) => {
331+
return this.saveMetadata(this.item, namespace, metadata)
332+
})
333+
334+
Promise.all([...deletionPromises, ...updatePromises]).then(() => {
335+
f7.toast.create({
336+
text: 'Metadata updated successfully',
337+
destroyOnClose: true,
338+
closeTimeout: 2000
339+
}).open()
340+
}).catch((err) => {
341+
f7.toast.create({
342+
text: 'Error while saving metadata: ' + err,
343+
destroyOnClose: true,
344+
closeTimeout: 2000
345+
}).open()
346+
})
347+
},
302348
updateItem (updatedItem) {
303349
if (!this.editable) return false
304350
try {
@@ -312,7 +358,7 @@ export default {
312358
this.item.groupType = updatedItem.groupType
313359
this.item.function = updatedItem.function
314360
this.item.tags = updatedItem.tags
315-
// this.item.metadata = updatedItem.metadata
361+
this.item.metadata = updatedItem.metadata
316362
return true
317363
} catch (e) {
318364
f7.dialog.alert(e).open()

bundles/org.openhab.ui/web/src/pages/settings/items/metadata/item-metadata-edit.vue

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -95,9 +95,10 @@ import ItemMetadataMatter from '@/components/item/metadata/item-metadata-matter.
9595
import ItemMetadataGa from '@/components/item/metadata/item-metadata-ga.vue'
9696
import ItemMetadataLinktomore from '@/components/item/metadata/item-metadata-linktomore.vue'
9797
import DirtyMixin from '../../dirty-mixin'
98+
import ItemMixin from '@/components/item/item-mixin.js'
9899
99100
export default {
100-
mixins: [DirtyMixin],
101+
mixins: [DirtyMixin, ItemMixin],
101102
props: {
102103
itemName: String,
103104
namespace: String,
@@ -210,7 +211,7 @@ export default {
210211
211212
if (this.currentTab === 'code' && !this.fromYaml()) return
212213
if (!this.metadata.value) this.metadata.value = ' '
213-
this.$oh.api.put(`/rest/items/${this.itemName}/metadata/${this.namespace}`, this.metadata).then((data) => {
214+
this.saveMetadata(this.item, this.namespace, this.metadata).then((data) => {
214215
if (this.creationMode) {
215216
f7.toast.create({
216217
text: 'Metadata created',
@@ -241,7 +242,7 @@ export default {
241242
`Are you sure you want to remove all metadata for "${nslabel}"?`,
242243
'Remove metadata',
243244
() => {
244-
this.$oh.api.delete(`/rest/items/${this.itemName}/metadata/${this.namespace}`).then(() => {
245+
this.deleteMetadata(this.item, this.namespace).then(() => {
245246
f7.toast.create({
246247
text: 'Metadata deleted',
247248
destroyOnClose: true,

0 commit comments

Comments
 (0)