1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 |
- <script lang="ts" setup>
- import type { SetupContext } from 'vue';
- import type { Recordable } from '@vben/types';
- import type {
- JsonViewerAction,
- JsonViewerProps,
- JsonViewerToggle,
- JsonViewerValue,
- } from './types';
- import { computed, useAttrs } from 'vue';
- // @ts-ignore
- import VueJsonViewer from 'vue-json-viewer';
- import { $t } from '@vben/locales';
- import { isBoolean } from '@vben-core/shared/utils';
- defineOptions({ name: 'JsonViewer' });
- const props = withDefaults(defineProps<JsonViewerProps>(), {
- expandDepth: 1,
- copyable: false,
- sort: false,
- boxed: false,
- theme: 'default-json-theme',
- expanded: false,
- previewMode: false,
- showArrayIndex: true,
- showDoubleQuotes: false,
- });
- const emit = defineEmits<{
- click: [event: MouseEvent];
- copied: [event: JsonViewerAction];
- keyClick: [key: string];
- toggle: [param: JsonViewerToggle];
- valueClick: [value: JsonViewerValue];
- }>();
- const attrs: SetupContext['attrs'] = useAttrs();
- function handleClick(event: MouseEvent) {
- if (
- event.target instanceof HTMLElement &&
- event.target.classList.contains('jv-item')
- ) {
- const pathNode = event.target.closest('.jv-push');
- if (!pathNode || !pathNode.hasAttribute('path')) {
- return;
- }
- const param: JsonViewerValue = {
- path: '',
- value: '',
- depth: 0,
- el: event.target,
- };
- param.path = pathNode.getAttribute('path') || '';
- param.depth = Number(pathNode.getAttribute('depth')) || 0;
- param.value = event.target.textContent || undefined;
- param.value = JSON.parse(param.value);
- emit('valueClick', param);
- }
- emit('click', event);
- }
- const bindProps = computed<Recordable<any>>(() => {
- const copyable = {
- copyText: $t('ui.jsonViewer.copy'),
- copiedText: $t('ui.jsonViewer.copied'),
- timeout: 2000,
- ...(isBoolean(props.copyable) ? {} : props.copyable),
- };
- return {
- ...props,
- ...attrs,
- onCopied: (event: JsonViewerAction) => emit('copied', event),
- onKeyclick: (key: string) => emit('keyClick', key),
- onClick: (event: MouseEvent) => handleClick(event),
- copyable: props.copyable ? copyable : false,
- };
- });
- </script>
- <template>
- <VueJsonViewer v-bind="bindProps">
- <template #copy="slotProps">
- <slot name="copy" v-bind="slotProps"></slot>
- </template>
- </VueJsonViewer>
- </template>
- <style lang="scss">
- @use './style.scss';
- </style>
|