|
@@ -0,0 +1,98 @@
|
|
|
+<script setup lang="ts">
|
|
|
+import VueJsonPretty from 'vue-json-pretty'
|
|
|
+import 'vue-json-pretty/lib/styles.css'
|
|
|
+import { propTypes } from '@/utils/propTypes'
|
|
|
+import { computed } from 'vue'
|
|
|
+
|
|
|
+const emits = defineEmits([
|
|
|
+ 'update:modelValue',
|
|
|
+ 'node-click',
|
|
|
+ 'brackets-click',
|
|
|
+ 'icon-click',
|
|
|
+ 'selected-value'
|
|
|
+])
|
|
|
+
|
|
|
+const props = defineProps({
|
|
|
+ modelValue: {
|
|
|
+ type: Object,
|
|
|
+ default: () => ({})
|
|
|
+ },
|
|
|
+ deep: propTypes.number.def(1),
|
|
|
+ showLength: propTypes.bool.def(true),
|
|
|
+ showLineNumbers: propTypes.bool.def(true),
|
|
|
+ showLineNumber: propTypes.bool.def(true),
|
|
|
+ showIcon: propTypes.bool.def(true),
|
|
|
+ showDoubleQuotes: propTypes.bool.def(true),
|
|
|
+ virtual: propTypes.bool.def(false),
|
|
|
+ height: propTypes.number.def(400),
|
|
|
+ itemHeight: propTypes.number.def(20),
|
|
|
+ rootPath: propTypes.string.def('root'),
|
|
|
+ nodeSelectable: propTypes.func.def(),
|
|
|
+ selectableType: propTypes.oneOf<'multiple' | 'single'>(['multiple', 'single']).def(),
|
|
|
+ showSelectController: propTypes.bool.def(false),
|
|
|
+ selectOnClickNode: propTypes.bool.def(true),
|
|
|
+ highlightSelectedNode: propTypes.bool.def(true),
|
|
|
+ collapsedOnClickBrackets: propTypes.bool.def(true),
|
|
|
+ renderNodeKey: propTypes.func.def(),
|
|
|
+ renderNodeValue: propTypes.func.def(),
|
|
|
+ editable: propTypes.bool.def(true),
|
|
|
+ editableTrigger: propTypes.oneOf<'click' | 'dblclick'>(['click', 'dblclick']).def('click')
|
|
|
+})
|
|
|
+
|
|
|
+const data = computed(() => props.modelValue)
|
|
|
+
|
|
|
+const localModelValue = computed({
|
|
|
+ get: () => data.value,
|
|
|
+ set: (val) => {
|
|
|
+ console.log(val)
|
|
|
+ emits('update:modelValue', val)
|
|
|
+ }
|
|
|
+})
|
|
|
+
|
|
|
+const nodeClick = (node: any) => {
|
|
|
+ emits('node-click', node)
|
|
|
+}
|
|
|
+
|
|
|
+const bracketsClick = (collapsed: boolean) => {
|
|
|
+ emits('brackets-click', collapsed)
|
|
|
+}
|
|
|
+
|
|
|
+const iconClick = (collapsed: boolean) => {
|
|
|
+ emits('icon-click', collapsed)
|
|
|
+}
|
|
|
+
|
|
|
+const selectedChange = (newVal: any, oldVal: any) => {
|
|
|
+ console.log(newVal, oldVal)
|
|
|
+ emits('selected-value', newVal, oldVal)
|
|
|
+}
|
|
|
+</script>
|
|
|
+
|
|
|
+<template>
|
|
|
+ <VueJsonPretty
|
|
|
+ v-model:data="localModelValue"
|
|
|
+ :deep="deep"
|
|
|
+ :show-length="showLength"
|
|
|
+ :show-line-numbers="showLineNumbers"
|
|
|
+ :show-line-number="showLineNumber"
|
|
|
+ :show-icon="showIcon"
|
|
|
+ :show-double-quotes="showDoubleQuotes"
|
|
|
+ :virtual="virtual"
|
|
|
+ :height="height"
|
|
|
+ :item-height="itemHeight"
|
|
|
+ :root-path="rootPath"
|
|
|
+ :node-selectable="nodeSelectable"
|
|
|
+ :selectable-type="selectableType"
|
|
|
+ :show-select-controller="showSelectController"
|
|
|
+ :select-on-click-node="selectOnClickNode"
|
|
|
+ :highlight-selected-node="highlightSelectedNode"
|
|
|
+ :collapsed-on-click-brackets="collapsedOnClickBrackets"
|
|
|
+ :render-node-key="renderNodeKey"
|
|
|
+ :render-node-value="renderNodeValue"
|
|
|
+ :editable="editable"
|
|
|
+ :editable-trigger="editableTrigger"
|
|
|
+ @node-click="nodeClick"
|
|
|
+ @brackets-click="bracketsClick"
|
|
|
+ @icon-click="iconClick"
|
|
|
+ @selected-change="selectedChange"
|
|
|
+ />
|
|
|
+</template>
|