From 06cdd050a45f92eccb993f2dc65560cc8bdc074a Mon Sep 17 00:00:00 2001 From: Jan-Hendrik Willms Date: Fri, 20 Jun 2025 16:32:37 +0200 Subject: fix slot properties --- resources/assets/javascripts/bootstrap/vue.js | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/resources/assets/javascripts/bootstrap/vue.js b/resources/assets/javascripts/bootstrap/vue.js index a1a4a90..43cae60 100644 --- a/resources/assets/javascripts/bootstrap/vue.js +++ b/resources/assets/javascripts/bootstrap/vue.js @@ -1,3 +1,5 @@ +import {defineComponent} from "vue"; + STUDIP.ready(async () => { const vueAppNodes = document.querySelectorAll('[data-vue-app]:not([data-vue-app-created])'); for (const node of vueAppNodes) { @@ -5,6 +7,13 @@ STUDIP.ready(async () => { } }); +function sanitizeSlotProps(props) { + const reserved = new Set(['key', 'ref', 'is', 'slot', 'style', 'class']); + return Object.fromEntries( + Object.entries(props).filter(([k]) => !reserved.has(k)) + ); +} + async function mountVueApp(node) { node.dataset.vueAppCreated = 'true'; @@ -23,7 +32,23 @@ async function mountVueApp(node) { config.props, Object.fromEntries( Object.entries(config.slots).map(([slot, template]) => { - return [slot, () => h({ template })]; + return [ + slot, + (slotProps) => { + try { + return h( + defineComponent({ + template, + props: Object.keys(sanitizeSlotProps(slotProps)), + }), + {...slotProps} + ); + } catch (e) { + console.error(`Fehler im Slot "${slot}":`, e); + return h('div', {}, `Fehler im Slot "${slot}"`); + } + } + ]; }), ), ), -- cgit v1.0