Skip to content

Commit

Permalink
Merge pull request #18430 from dannon/fix-chargs-24.0
Browse files Browse the repository at this point in the history
[24.0] Fix mounting utility usage of pinia (fixes charts form components)
  • Loading branch information
mvdbeek authored Jun 24, 2024
2 parents 6f5aeeb + 98690d9 commit 2257c22
Showing 1 changed file with 21 additions and 7 deletions.
28 changes: 21 additions & 7 deletions client/src/utils/mountVueComponent.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,12 @@

import BootstrapVue from "bootstrap-vue";
import { iconPlugin, localizationPlugin, vueRxShortcutPlugin } from "components/plugins";
import { createPinia, getActivePinia, PiniaVuePlugin } from "pinia";
import Vue from "vue";

// Load Pinia
Vue.use(PiniaVuePlugin);

// Bootstrap components
Vue.use(BootstrapVue);

Expand All @@ -18,15 +22,25 @@ Vue.use(vueRxShortcutPlugin);
// font-awesome svg icon registration/loading
Vue.use(iconPlugin);

export const mountVueComponent = (ComponentDefinition) => {
function getOrCreatePinia() {
// We sometimes use this utility mounting function in a context where there
// is no existing vue application or pinia store (e.g. individual charts
// displayed in an iframe).
// To support both use cases, we will create a new pinia store and attach it
// to the vue application that is created for the component if missing.
return getActivePinia() || createPinia();
}

export function mountVueComponent(ComponentDefinition) {
const component = Vue.extend(ComponentDefinition);
return (propsData, el) => new component({ propsData, el });
};
return function (propsData, el) {
return new component({ propsData, el, pinia: getOrCreatePinia() });
};
}

export const replaceChildrenWithComponent = (el, ComponentDefinition, propsData = {}) => {
export function replaceChildrenWithComponent(el, ComponentDefinition, propsData = {}) {
const container = document.createElement("div");
el.replaceChildren(container);
const component = Vue.extend(ComponentDefinition);
const mountFn = (propsData, el) => new component({ propsData, el });
const mountFn = mountVueComponent(ComponentDefinition);
return mountFn(propsData, container);
};
}

0 comments on commit 2257c22

Please sign in to comment.