diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2023-02-20 16:49:51 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2023-02-20 16:49:51 +0300 |
commit | 71786ddc8e28fbd3cb3fcc4b3ff15e5962a1c82e (patch) | |
tree | 6a2d93ef3fb2d353bb7739e4b57e6541f51cdd71 /app/assets/javascripts/helpers/init_simple_app_helper.js | |
parent | a7253423e3403b8c08f8a161e5937e1488f5f407 (diff) |
Add latest changes from gitlab-org/gitlab@15-9-stable-eev15.9.0-rc42
Diffstat (limited to 'app/assets/javascripts/helpers/init_simple_app_helper.js')
-rw-r--r-- | app/assets/javascripts/helpers/init_simple_app_helper.js | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/app/assets/javascripts/helpers/init_simple_app_helper.js b/app/assets/javascripts/helpers/init_simple_app_helper.js new file mode 100644 index 00000000000..695fc455f13 --- /dev/null +++ b/app/assets/javascripts/helpers/init_simple_app_helper.js @@ -0,0 +1,39 @@ +import Vue from 'vue'; + +/** + * Initializes a component as a simple vue app, passing the necessary props. If the element + * has a data attribute named `data-view-model`, the content of that attributed will be + * converted from json and passed on to the component as a prop. The root component is then + * responsible for setting up it's children, injections, and other desired features. + * + * @param {string} selector css selector for where to build + * @param {Vue.component} component The Vue compoment to be built as the root of the app + * + * @example + * ```html + * <div id='#mount-here' data-view-model="{'some': 'object'}" /> + * ``` + * + * ```javascript + * initSimpleApp('#mount-here', MyApp) + * ``` + * + * This will mount MyApp as root on '#mount-here'. It will receive {'some': 'object'} as it's + * view model prop. + */ +export const initSimpleApp = (selector, component) => { + const element = document.querySelector(selector); + + if (!element) { + return null; + } + + const props = element.dataset.viewModel ? JSON.parse(element.dataset.viewModel) : {}; + + return new Vue({ + el: element, + render(h) { + return h(component, { props }); + }, + }); +}; |