@@ -95,6 +95,7 @@ import ItemForm from '@/components/item/item-form.vue'
9595
9696import DirtyMixin from ' ../dirty-mixin'
9797import ItemMixin from ' @/components/item/item-mixin'
98+ import { name } from ' jssip'
9899
99100export 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 ()
0 commit comments