1
0
mirror of https://github.com/lana-k/sqliteviz.git synced 2026-08-05 07:19:17 +08:00

selection view wip

This commit is contained in:
lana-k
2026-05-25 17:50:57 +02:00
parent f3a75346fd
commit 4bb6676648
2 changed files with 60 additions and 26 deletions

View File

@@ -1,13 +1,18 @@
<template> <template>
<div ref="chartContainer" class="chart-container"> <div class="chart-container">
<div v-show="!dataSources" class="warning data-view-warning"> <div v-show="!dataSources" class="warning data-view-warning">
There is no data to build a chart. Run your SQL query and make sure the There is no data to build a chart. Run your SQL query and make sure the
result is not empty. result is not empty.
</div> </div>
<div <splitpanes
:before="{ size: 70, max: 100 }"
:after="{ size: 30, max: 50, hidden: !showValueViewer }"
:default="{ before: 70, after: 30 }"
class="chart" class="chart"
:style="{ height: !dataSources ? 'calc(100% - 40px)' : '100%' }" :style="{ height: !dataSources ? 'calc(100% - 40px)' : '100%' }"
> >
<template #left-pane>
<div ref="chartContainer" :style="{ height: '100%' }">
<PlotlyEditor <PlotlyEditor
ref="plotlyEditor" ref="plotlyEditor"
:data="state.data" :data="state.data"
@@ -25,23 +30,38 @@
@render="onRender" @render="onRender"
/> />
</div> </div>
</template>
<template v-if="showValueViewer" #right-pane>
<value-viewer
:empty="!selectedItem"
emptyMessage="No points selected to view"
:value="JSON.stringify(selectedItem)"
defaultFormat="json"
/>
</template>
</splitpanes>
</div> </div>
</template> </template>
<script> <script>
import { applyPureReactInVue } from 'veaury' import { applyPureReactInVue } from 'veaury'
import plotly from 'plotly.js' import plotly from 'plotly.js/dist/plotly'
import 'react-chart-editor/lib/react-chart-editor.css' import 'react-chart-editor/lib/react-chart-editor.css'
import ReactPlotlyEditorWithPlotRef from '@/lib/ReactPlotlyEditorWithPlotRef.jsx' import ReactPlotlyEditorWithPlotRef from '@/lib/ReactPlotlyEditorWithPlotRef.jsx'
import chartHelper from '@/lib/chartHelper' import chartHelper from '@/lib/chartHelper'
import * as dereference from 'react-chart-editor/lib/lib/dereference' import * as dereference from 'react-chart-editor/lib/lib/dereference'
import fIo from '@/lib/utils/fileIo' import fIo from '@/lib/utils/fileIo'
import events from '@/lib/utils/events' import events from '@/lib/utils/events'
import Splitpanes from '@/components/Common/Splitpanes'
import ValueViewer from '@/components/ValueViewer.vue'
import { nextTick } from 'vue'
export default { export default {
name: 'Chart', name: 'Chart',
components: { components: {
PlotlyEditor: applyPureReactInVue(ReactPlotlyEditorWithPlotRef) PlotlyEditor: applyPureReactInVue(ReactPlotlyEditorWithPlotRef),
Splitpanes,
ValueViewer
}, },
props: { props: {
dataSources: Object, dataSources: Object,
@@ -49,7 +69,8 @@ export default {
exportToPngEnabled: Boolean, exportToPngEnabled: Boolean,
exportToSvgEnabled: Boolean, exportToSvgEnabled: Boolean,
forPivot: Boolean, forPivot: Boolean,
showViewSettings: Boolean showViewSettings: Boolean,
showValueViewer: Boolean
}, },
emits: [ emits: [
'update:exportToSvgEnabled', 'update:exportToSvgEnabled',
@@ -71,7 +92,8 @@ export default {
modeBarButtonsToRemove: ['toImage'] modeBarButtonsToRemove: ['toImage']
}, },
resizeObserver: null, resizeObserver: null,
useResizeHandler: this.$store.state.isWorkspaceVisible useResizeHandler: this.$store.state.isWorkspaceVisible,
selectedItem: null
} }
}, },
computed: { computed: {
@@ -115,13 +137,25 @@ export default {
this.$emit('update:exportToSvgEnabled', true) this.$emit('update:exportToSvgEnabled', true)
this.$emit('update:exportToHtmlEnabled', true) this.$emit('update:exportToHtmlEnabled', true)
}, },
mounted() { async mounted() {
this.resizeObserver = new ResizeObserver(this.handleResize) this.resizeObserver = new ResizeObserver(this.handleResize)
this.resizeObserver.observe(this.$refs.chartContainer) this.resizeObserver.observe(this.$refs.chartContainer)
if (this.dataSources) { if (this.dataSources) {
dereference.default(this.state.data, this.dataSources) dereference.default(this.state.data, this.dataSources)
} }
this.handleResize() this.handleResize()
await nextTick()
const plotlyDiv =
this.$refs.plotlyEditor.$el.querySelector('.js-plotly-plot')
plotlyDiv?.on('plotly_selected', selectionEvent => {
if (selectionEvent) {
console.log(this.dataSources)
this.selectedItem = 1
}
})
plotlyDiv?.on('plotly_deselect', () => {
this.selectedItem = null
})
}, },
activated() { activated() {
this.useResizeHandler = true this.useResizeHandler = true

View File

@@ -58,9 +58,9 @@
</icon-button> </icon-button>
<icon-button <icon-button
v-if="mode === 'graph'" v-if="mode !== 'pivot'"
ref="viewNodeOrEdgeBtn" ref="viewNodeOrEdgeBtn"
tooltip="View node or edge details" tooltip="View details"
tooltipPosition="top-left" tooltipPosition="top-left"
:active="viewValuePanelVisible" :active="viewValuePanelVisible"
@click="viewValuePanelVisible = !viewValuePanelVisible" @click="viewValuePanelVisible = !viewValuePanelVisible"