1+ <script setup>
2+ import { ref , computed } from " vue" ;
3+ import LocalVueUiMolecule from ' ../src/components/vue-ui-molecule.vue' ;
4+ import LocalVueDataUi from ' ../src/components/vue-data-ui.vue' ;
5+ import Box from " ./Box.vue" ;
6+ import convertArrayToObject from " ./convertModel" ;
7+
8+ const dataset = ref ([
9+ {
10+ name: " Root" ,
11+ details: " This is the root node" ,
12+ nodes: [
13+ {
14+ name: ' node1' ,
15+ details: ' Lorem ipsum' ,
16+ nodes: [
17+ {
18+ name: ' node1.1' , details: ' Lorem ipsum' , nodes: [
19+ { name: ' node1.1' },
20+ { name: ' node1.2' },
21+ { name: ' node1.3' },
22+ ]
23+ },
24+ {
25+ name: ' node1.2' , nodes: [
26+ { name: ' node1.2.1' },
27+ { name: ' node1.2.2' },
28+ { name: ' node1.2.3' },
29+ { name: ' node1.2.4' },
30+ ]
31+ },
32+ {
33+ name: ' node1.3' , nodes: [
34+ { name: ' node1.3.1' },
35+ { name: ' node1.3.2' },
36+ ]
37+ },
38+ {
39+ name: ' node1.4' , nodes: [
40+ { name: ' node1.4.1' },
41+ { name: ' node1.4.2' },
42+ { name: ' node1.4.3' },
43+ { name: ' node1.4.4' },
44+ { name: ' node1.4.5' },
45+ { name: ' node1.4.6' },
46+ ]
47+ },
48+ {
49+ name: ' node1.5' , nodes: [
50+ { name: ' node1.5.1' },
51+ { name: ' node1.5.2' },
52+ { name: ' node1.5.3' },
53+ { name: ' node1.5.4' },
54+ { name: ' node1.5.5' },
55+ { name: ' node1.5.6' },
56+ ]
57+ },
58+ {
59+ name: ' node1.6' , nodes: [
60+ { name: ' node1.6.1' },
61+ { name: ' node1.6.2' },
62+ { name: ' node1.6.3' },
63+ { name: ' node1.6.4' },
64+ { name: ' node1.6.5' },
65+ { name: ' node1.6.6' },
66+ ]
67+ },
68+ ]
69+ },
70+ {
71+ name: ' node2' ,
72+ nodes: [
73+ {
74+ name: ' node2.1' , nodes: [
75+ { name: ' node2.1.1' },
76+ { name: ' node2.1.2' },
77+ { name: ' node2.1.3' },
78+ { name: ' node2.1.4' },
79+ { name: ' node2.1.5' },
80+ {
81+ name: ' node2.1.6' , nodes: [
82+ { name: ' node2.1.6.1' },
83+ { name: ' node2.1.6.2' },
84+ { name: ' node2.1.6.3' },
85+ { name: ' node2.1.6.4' },
86+ { name: ' node2.1.6.5' },
87+ {
88+ name: ' node2.1.6.6' , nodes: [
89+ { name: ' node2.1.6.6.1' },
90+ { name: ' node2.1.6.6.2' },
91+ { name: ' node2.1.6.6.3' },
92+ { name: ' node2.1.6.6.4' },
93+ { name: ' node2.1.6.6.5' },
94+ {
95+ name: ' node2.1.6.6.6' , nodes: [
96+ { name: ' node2.1.6.6.6.1' },
97+ { name: ' node2.1.6.6.6.2' },
98+ { name: ' node2.1.6.6.6.3' , nodes: [
99+ { name: ' node2.1.6.6.6.3.1' },
100+ { name: ' node2.1.6.6.6.3.2' , nodes: [
101+ { name: ' node2.1.6.6.6.3.2.1' },
102+ { name: ' node2.1.6.6.6.3.2.2' },
103+ { name: ' node2.1.6.6.6.3.2.3' },
104+ ] },
105+ { name: ' node2.1.6.6.6.3.3' },
106+ { name: ' node2.1.6.6.6.3.4' },
107+ { name: ' node2.1.6.6.6.3.5' },
108+ { name: ' node2.1.6.6.6.3.6' },
109+ ]},
110+ { name: ' node2.1.6.6.6.4' },
111+ { name: ' node2.1.6.6.6.5' },
112+ { name: ' node2.1.6.6.6.6' },
113+ ]
114+ },
115+ ]
116+ },
117+ ]
118+ },
119+ ]
120+ },
121+ ]
122+ },
123+ {
124+ name: ' node3' ,
125+ nodes: [
126+ { name: ' node3.1' },
127+ { name: ' node3.2' },
128+ { name: ' node3.3' },
129+ ]
130+ },
131+ {
132+ name: ' node4' ,
133+ nodes: [
134+ { name: ' node4.1' },
135+ { name: ' node4.2' , nodes: [
136+ { name: ' node4.2.1' },
137+ { name: ' node4.2.2' },
138+ { name: ' node4.2.3' },
139+ ] },
140+ { name: ' node4.3' },
141+ { name: ' node4.4' , nodes: [
142+ { name: ' node4.4.1' },
143+ { name: ' node4.4.2' },
144+ { name: ' node4.4.3' },
145+ { name: ' node4.4.4' },
146+ { name: ' node4.4.5' },
147+ ] },
148+ ]
149+ },
150+ {
151+ name: ' node5' ,
152+ nodes: [
153+ { name: ' node4.1' },
154+ { name: ' node4.2' },
155+ { name: ' node4.3' },
156+ { name: ' node4.4' },
157+ { name: ' node4.5' },
158+ ]
159+ },
160+ {
161+ name: ' node6' ,
162+ nodes: [
163+ { name: ' node4.1' },
164+ { name: ' node4.2' },
165+ { name: ' node4.3' },
166+ { name: ' node4.4' },
167+ ]
168+ },
169+ ]
170+ }
171+ ])
172+
173+ const model = ref ([
174+ { key: ' style.fontFamily' , def: ' inherit' , type: ' text' },
175+ { key: ' style.chart.backgroundColor' , def: ' #FFFFFF' , type: ' color' },
176+ { key: ' style.chart.color' , def: ' #1A1A1A' , type: ' color' },
177+ { key: ' style.chart.nodes.stroke' , def: ' #FFFFFF' , type: ' color' },
178+ { key: ' style.chart.nodes.strokeHovered' , def: ' #1A1A1A' , type: ' color' },
179+ { key: ' style.chart.links.stroke' , def: ' #DDDDDD' , type: ' color' },
180+ { key: ' style.chart.title.text' , def: ' Lorem ipsum dolor sit amet' , type: ' text' },
181+ { key: ' style.chart.title.color' , def: ' #1A1A1A' , type: ' color' },
182+ { key: ' style.chart.title.fontSize' , def: 20 , type: ' number' , min: 8 , max: 48 },
183+ { key: ' style.chart.title.bold' , def: true , type: ' checkbox' },
184+ { key: ' style.chart.title.subtitle.color' , def: ' #CCCCCC' , type: ' color' },
185+ { key: ' style.chart.title.subtitle.text' , def: ' Lorem ipsum dolor sot amet' , type: ' text' },
186+ { key: ' style.chart.title.subtitle.fontSize' , def: 16 , type: ' number' , min: 8 , max: 48 },
187+ { key: ' style.chart.title.subtitle.bold' , def: false , type: ' checkbox' },
188+ { key: ' style.chart.tooltip.show' , def: true , type: ' checkbox' },
189+ { key: ' style.chart.tooltip.color' , def: ' #1A1A1A' , type: ' color' },
190+ { key: ' style.chart.tooltip.backgroundColor' , def: ' #FFFFFF' , type: ' color' },
191+ { key: ' style.chart.tooltip.fontSize' , def: 14 , type: ' number' , min: 8 , max: 24 },
192+ { key: ' style.chart.zoom.speed' , def: 1 , type: ' number' , min: 0 , max: 2 , step: 0.01 },
193+ { key: ' userOptions.show' , def: true , type: ' checkbox' },
194+ { key: ' table.show' , def: false , type: ' checkbox' },
195+ { key: ' table.responsiveBreakpoint' , def: 400 , type: ' number' , min: 300 , max: 800 },
196+ { key: ' table.th.backgroundColor' , def: ' #FFFFFF' , type: ' color' },
197+ { key: ' table.th.color' , def: ' #1A1A1A' , type: ' color' },
198+ { key: ' table.th.outline' , def: ' none' , type: ' text' },
199+ { key: ' table.td.backgroundColor' , def: ' #FFFFFF' , type: ' color' },
200+ { key: ' table.td.color' , def: ' #1A1A1A' , type: ' color' },
201+ { key: ' table.td.outline' , def: ' none' , type: ' text' },
202+ { key: ' table.translations.nodeName' , def: ' Node name' , type: ' text' },
203+ { key: ' table.translations.details' , def: ' Details' , type: ' text' },
204+ { key: ' table.translations.parentNode' , def: ' Parent node' , type: ' text' },
205+ ])
206+
207+ const testCustomTooltip = ref (false );
208+
209+ const config = computed (() => {
210+ const c = convertArrayToObject (model .value );
211+ if (testCustomTooltip .value ) {
212+ return {
213+ ... c,
214+ style: {
215+ ... c .style ,
216+ chart: {
217+ ... c .style .chart ,
218+ tooltip: {
219+ ... c .style .chart .tooltip ,
220+ customFormat : (data ) => {
221+ console .log (' MOLECULE CUSTOM TOOLTIP' , data);
222+ return ' CUSTOM TOOLTIP'
223+ }
224+ }
225+ }
226+ }
227+ }
228+ } else {
229+ return c
230+ }
231+ })
232+
233+ const step = ref (0 );
234+
235+ </script >
236+
237+ <template >
238+ <div style =" margin : 12px 0 " >
239+ <input type =" checkbox" v-model =" testCustomTooltip" id =" custom-tooltip" />
240+ <label for =" custom-tooltip" style =" color :#CCCCCC " >Test custom tooltip</label >
241+ </div >
242+ <Box >
243+ <template #title ></template >
244+
245+ <template #local >
246+ <LocalVueUiMolecule :dataset =" dataset" :config =" config" :key =" `local_${step}`" >
247+ <template #svg =" { svg } " >
248+ <circle :cx =" 30" :cy =" 30" :r =" 30" fill =" #42d392" />
249+ <text :x =" 30" :y =" 30" text-anchor =" middle" >#SVG</text >
250+ </template >
251+ <template #tooltip-before =" { datapoint , seriesIndex , series , config , bars , lines , plots } " >
252+ #BEFORE {{ series.name }}
253+ </template >
254+ <template #tooltip-after =" { datapoint , seriesIndex , series , config , bars , lines , plots } " >
255+ #AFTER {{ series.name }}
256+ </template >
257+ </LocalVueUiMolecule >
258+ </template >
259+
260+ <template #VDUI-local >
261+ <LocalVueDataUi component =" VueUiMolecule" :dataset =" dataset" :config =" config" :key =" `vdui_local_${step}`" >
262+ <template #svg =" { svg } " >
263+ <circle :cx =" 30" :cy =" 30" :r =" 30" fill =" #42d392" />
264+ <text :x =" 30" :y =" 30" text-anchor =" middle" >#SVG</text >
265+ </template >
266+ <template #tooltip-before =" { datapoint , seriesIndex , series , config , bars , lines , plots } " >
267+ #BEFORE {{ series.name }}
268+ </template >
269+ <template #tooltip-after =" { datapoint , seriesIndex , series , config , bars , lines , plots } " >
270+ #AFTER {{ series.name }}
271+ </template >
272+ </LocalVueDataUi >
273+ </template >
274+
275+ <template #build >
276+ <VueUiMolecule :dataset =" dataset" :config =" config" :key =" `build_${step}`" >
277+ <template #svg =" { svg } " >
278+ <circle :cx =" 30" :cy =" 30" :r =" 30" fill =" #42d392" />
279+ <text :x =" 30" :y =" 30" text-anchor =" middle" >#SVG</text >
280+ </template >
281+ <template #tooltip-before =" { datapoint , seriesIndex , series , config , bars , lines , plots } " >
282+ #BEFORE {{ series.name }}
283+ </template >
284+ <template #tooltip-after =" { datapoint , seriesIndex , series , config , bars , lines , plots } " >
285+ #AFTER {{ series.name }}
286+ </template >
287+ </VueUiMolecule >
288+ </template >
289+
290+ <template #VDUI-build >
291+ <VueDataUi component =" VueUiMolecule" :dataset =" dataset" :config =" config" :key =" `vdui_build_${step}`" >
292+ <template #svg =" { svg } " >
293+ <circle :cx =" 30" :cy =" 30" :r =" 30" fill =" #42d392" />
294+ <text :x =" 30" :y =" 30" text-anchor =" middle" >#SVG</text >
295+ </template >
296+ <template #tooltip-before =" { datapoint , seriesIndex , series , config , bars , lines , plots } " >
297+ #BEFORE {{ series.name }}
298+ </template >
299+ <template #tooltip-after =" { datapoint , seriesIndex , series , config , bars , lines , plots } " >
300+ #AFTER {{ series.name }}
301+ </template >
302+ </VueDataUi >
303+ </template >
304+
305+ <template #knobs >
306+ <div
307+ style =" display : flex ; flex-direction : row ; flex-wrap :wrap ; align-items :center ; width : 100% ; color : #CCCCCC ; gap :24px ;" >
308+ <div v-for =" knob in model" >
309+ <label style =" font-size : 10px " >{{ knob.key }}</label >
310+ <div
311+ style =" display :flex ; flex-direction :row ; flex-wrap : wrap ; align-items :center ; gap :6px ; height : 40px " >
312+ <input v-if =" !['none', 'select'].includes(knob.type)" :step =" knob.step" :type =" knob.type"
313+ :min =" knob.min ?? 0" :max =" knob.max ?? 0" v-model =" knob.def" @change =" step += 1" >
314+ <select v-if =" knob.type === 'select'" v-model =" knob.def" @change =" step += 1" >
315+ <option v-for =" opt in knob.options" >{{ opt }}</option >
316+ </select >
317+ </div >
318+ </div >
319+ </div >
320+ </template >
321+
322+ <template #config >
323+ {{ config }}
324+ </template >
325+ </Box >
326+ </template >
0 commit comments