UNPKG

@ued_fpi/data-visual

Version:

<br /> <br /> <div style="text-align:center"> <b style="font-size:30px">@ued_fpi/data-visual</b> <p>基于Vite4+TypeScript的Vue3大屏组件库开发框架</p> <img style="display:inline" src="https://img.shields.io/npm/v/@ued_fpi/data-visual" />

121 lines (118 loc) 4.51 kB
import { defineComponent, computed, watch, onBeforeUnmount, openBlock, createElementBlock, normalizeStyle, Fragment, renderList, createBlock, resolveDynamicComponent, mergeProps, toDisplayString } from 'vue'; import { getWgmsComponentById } from '../registry/index.mjs'; import { adaptStandardProps } from './adapter.mjs'; const _hoisted_1 = { key: 1, class: "dv-wgms-screen-renderer-missing" }; const _sfc_main = /* @__PURE__ */ defineComponent({ __name: "ScreenRenderer", props: { schema: { default: () => ({ widgets: [] }) } }, setup(__props, { expose: __expose }) { const props = __props; const componentRefs = /* @__PURE__ */ new Map(); const timerMap = /* @__PURE__ */ new Map(); const setWidgetRef = (id, instance) => { if (!instance) { componentRefs.delete(id); return; } componentRefs.set(id, instance); }; const clearTimers = () => { timerMap.forEach((timer) => clearInterval(timer)); timerMap.clear(); }; const invokeReload = (widget) => { const refInstance = componentRefs.get(widget.id); const entry = getWgmsComponentById(widget.componentId); const methodName = entry?.meta.adapter?.reloadMethod || "reload"; const method = refInstance?.[methodName]; if (typeof method === "function") method(); }; const toCssValue = (value) => { if (value === void 0) return void 0; return typeof value === "number" ? `${value}px` : value; }; const normalizedWidgets = computed(() => { return (props.schema.widgets || []).map((widget) => { const entry = getWgmsComponentById(widget.componentId); const layoutStyle = { ...widget.layout?.style || {} }; if (widget.layout) { if (widget.layout.x !== void 0) layoutStyle.left = toCssValue(widget.layout.x) || ""; if (widget.layout.y !== void 0) layoutStyle.top = toCssValue(widget.layout.y) || ""; if (widget.layout.w !== void 0) layoutStyle.width = toCssValue(widget.layout.w) || ""; if (widget.layout.h !== void 0) layoutStyle.height = toCssValue(widget.layout.h) || ""; } if ("left" in layoutStyle || "top" in layoutStyle) layoutStyle.position = "absolute"; return { id: widget.id, componentId: widget.componentId, component: entry?.component, componentProps: entry ? adaptStandardProps(entry.meta, widget.props) : widget.props?.componentProps || {}, refreshInterval: widget.props?.refreshInterval, layoutStyle }; }); }); const containerStyle = computed(() => { return { position: "relative", width: "100%", height: "100%", ...props.schema.style || {} }; }); watch(normalizedWidgets, (widgets) => { clearTimers(); widgets.forEach((widget) => { if (!widget.refreshInterval || widget.refreshInterval <= 0) return; const timer = setInterval(() => { const rawWidget = props.schema.widgets.find((item) => item.id === widget.id); rawWidget && invokeReload(rawWidget); }, widget.refreshInterval); timerMap.set(widget.id, timer); }); }, { immediate: true, deep: true }); onBeforeUnmount(() => { clearTimers(); }); __expose({ reload: () => { props.schema.widgets.forEach(invokeReload); } }); return (_ctx, _cache) => { return openBlock(), createElementBlock("div", { class: "dv-wgms-screen-renderer", style: normalizeStyle(containerStyle.value) }, [ (openBlock(true), createElementBlock(Fragment, null, renderList(normalizedWidgets.value, (widget) => { return openBlock(), createElementBlock("div", { key: widget.id, class: "dv-wgms-screen-renderer-item", style: normalizeStyle(widget.layoutStyle) }, [ widget.component ? (openBlock(), createBlock(resolveDynamicComponent(widget.component), mergeProps({ key: 0 }, widget.componentProps, { ref_for: true, ref: (el) => setWidgetRef(widget.id, el) }), null, 16)) : (openBlock(), createElementBlock("div", _hoisted_1, " Missing component: " + toDisplayString(widget.componentId), 1)) ], 4); }), 128)) ], 4); }; } }); export { _sfc_main as default };