Dashboard final version, TODO: update main sidebar menu

This commit is contained in:
Simon Pocrnjič
2025-11-23 21:33:01 +01:00
parent c3de189e9d
commit c1ac92efbf
67 changed files with 5195 additions and 844 deletions
@@ -0,0 +1,38 @@
import { createApp, h } from 'vue'
// Simple cache map to avoid re-rendering identical payloads.
const _cache = new Map()
function serializeKey(obj) {
try {
return JSON.stringify(obj, Object.keys(obj).sort())
} catch (e) {
return Math.random().toString(36)
}
}
// Factory returning template function for Unovis Crosshair.
// config: chart series configuration
// Component: Vue component to render
// extraProps: static props (e.g. labelKey, labelFormatter)
export function componentToString(config, Component, extraProps = {}) {
return function (_data, x) {
const row = _data && _data.data ? _data.data : _data
// Build series-only payload (exclude non-config fields like date/dateLabel)
const seriesPayload = {}
Object.keys(config).forEach(k => {
if (row && row[k] !== undefined) seriesPayload[k] = row[k]
})
const cacheKeyBase = { ...seriesPayload, __x: x }
const key = serializeKey(cacheKeyBase)
if (_cache.has(key)) return _cache.get(key)
const el = document.createElement('div')
const app = createApp(Component, { ...extraProps, payload: seriesPayload, config, x: row?.date ?? x })
app.mount(el)
const html = el.innerHTML
app.unmount()
_cache.set(key, html)
return html
}
}