2020-03-11 00:15:53 +01:00
|
|
|
<template>
|
2020-03-11 23:12:18 +01:00
|
|
|
<div class="flex flex-column json-level-indent">
|
|
|
|
|
<div class="flex flex-row" @click="expanded_internal = !expanded_internal">
|
|
|
|
|
<div class="item-key-line">
|
|
|
|
|
<template v-if="label">
|
|
|
|
|
<b>
|
|
|
|
|
<span class="item-key">"{{label}}"</span>
|
|
|
|
|
:
|
|
|
|
|
</b>
|
|
|
|
|
</template>
|
|
|
|
|
<span v-if="!expanded_internal"><b> {</b> ... <b>}</b>,</span>
|
2020-03-11 00:15:53 +01:00
|
|
|
<template v-else><b>{</b></template>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
2020-03-11 23:12:18 +01:00
|
|
|
<template v-if="expanded_internal">
|
|
|
|
|
<div v-for="(row, rowKey) of value_internal"
|
|
|
|
|
:key="rowKey"
|
2020-03-11 00:15:53 +01:00
|
|
|
>
|
2020-03-11 23:12:18 +01:00
|
|
|
<JsonArray v-if="Array.isArray(row)"
|
|
|
|
|
:value="row"
|
|
|
|
|
@change="changeItem(rowKey, $event)"
|
|
|
|
|
>
|
|
|
|
|
</JsonArray>
|
|
|
|
|
<JsonObject v-else-if="typeof row === 'object' && row !== null"
|
|
|
|
|
:value="row"
|
|
|
|
|
:label="rowKey"
|
|
|
|
|
@change="changeItem(rowKey, $event)"
|
|
|
|
|
>
|
|
|
|
|
</JsonObject>
|
|
|
|
|
<JsonElement v-else
|
|
|
|
|
:value="row"
|
|
|
|
|
:label="rowKey"
|
|
|
|
|
@change="changeItem(rowKey, $event)"
|
|
|
|
|
>
|
|
|
|
|
</JsonElement>
|
|
|
|
|
|
|
|
|
|
</div>
|
|
|
|
|
<div><b>},</b></div>
|
|
|
|
|
</template>
|
2020-03-11 00:15:53 +01:00
|
|
|
</div>
|
|
|
|
|
</template>
|
|
|
|
|
|
|
|
|
|
<script>
|
|
|
|
|
import JsonArray from './JsonArray';
|
|
|
|
|
import JsonElement from './JsonElement';
|
|
|
|
|
|
|
|
|
|
export default {
|
|
|
|
|
name: 'JsonObject',
|
|
|
|
|
props: [
|
|
|
|
|
'value',
|
2020-03-11 23:12:18 +01:00
|
|
|
'label',
|
2020-03-11 00:15:53 +01:00
|
|
|
'expanded',
|
|
|
|
|
],
|
|
|
|
|
components: {
|
|
|
|
|
JsonArray,
|
|
|
|
|
JsonElement,
|
|
|
|
|
},
|
|
|
|
|
data() {
|
|
|
|
|
return {
|
2020-03-11 23:12:18 +01:00
|
|
|
value_internal: undefined,
|
|
|
|
|
expanded_internal: true,
|
2020-03-11 00:15:53 +01:00
|
|
|
}
|
|
|
|
|
},
|
2020-03-11 23:12:18 +01:00
|
|
|
created() {
|
|
|
|
|
this.value_internal = this.value;
|
|
|
|
|
},
|
2020-03-11 00:15:53 +01:00
|
|
|
watch: {
|
|
|
|
|
value: function(val) {
|
2020-03-11 23:12:18 +01:00
|
|
|
this.value_internal = val;
|
2020-03-11 00:15:53 +01:00
|
|
|
},
|
|
|
|
|
expanded: function(val) {
|
|
|
|
|
if (val !== undefined && val !== null) {
|
2020-03-11 23:12:18 +01:00
|
|
|
this.expanded_internal = !!val;
|
2020-03-11 00:15:53 +01:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
methods: {
|
|
|
|
|
changeItem(key, value) {
|
2020-03-11 23:12:18 +01:00
|
|
|
this.value_internal[key] = value;
|
|
|
|
|
this.$emit('change', this.value_internal);
|
2020-03-11 00:15:53 +01:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2020-03-11 23:12:18 +01:00
|
|
|
</script>
|
|
|
|
|
|
|
|
|
|
<style lang="scss" scoped>
|
|
|
|
|
@import url('./json.scss');
|
|
|
|
|
</style>
|