diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2020-09-19 01:45:44 +0000 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2020-09-19 01:45:44 +0000 |
commit | 85dc423f7090da0a52c73eb66faf22ddb20efff9 (patch) | |
tree | 9160f299afd8c80c038f08e1545be119f5e3f1e1 /app/assets/javascripts/helpers | |
parent | 15c2c8c66dbe422588e5411eee7e68f1fa440bb8 (diff) | |
download | gitlab-ce-85dc423f7090da0a52c73eb66faf22ddb20efff9.tar.gz |
Add latest changes from gitlab-org/gitlab@13-4-stable-ee
Diffstat (limited to 'app/assets/javascripts/helpers')
-rw-r--r-- | app/assets/javascripts/helpers/startup_css_helper.js | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/app/assets/javascripts/helpers/startup_css_helper.js b/app/assets/javascripts/helpers/startup_css_helper.js new file mode 100644 index 00000000000..8e25e1421c0 --- /dev/null +++ b/app/assets/javascripts/helpers/startup_css_helper.js @@ -0,0 +1,46 @@ +const CSS_LOADED_EVENT = 'CSSLoaded'; +const STARTUP_LINK_LOADED_EVENT = 'CSSStartupLinkLoaded'; + +const getAllStartupLinks = (() => { + let links = null; + return () => { + if (!links) { + links = Array.from(document.querySelectorAll('link[data-startupcss]')); + } + return links; + }; +})(); +const isStartupLinkLoaded = ({ dataset }) => dataset.startupcss === 'loaded'; +const allLinksLoaded = () => getAllStartupLinks().every(isStartupLinkLoaded); + +const handleStartupEvents = () => { + if (allLinksLoaded()) { + document.dispatchEvent(new CustomEvent(CSS_LOADED_EVENT)); + document.removeEventListener(STARTUP_LINK_LOADED_EVENT, handleStartupEvents); + } +}; + +/* Wait for.... The methods can be used: + - with a callback (preferred), + waitFor(action) + + - with then (discouraged), + await waitFor().then(action); + + - with await, + await waitFor; + action(); +-*/ +export const waitForCSSLoaded = (action = () => {}) => { + if (!gon.features.startupCss || allLinksLoaded()) { + return new Promise(resolve => { + action(); + resolve(); + }); + } + + return new Promise(resolve => { + document.addEventListener(CSS_LOADED_EVENT, resolve, { once: true }); + document.addEventListener(STARTUP_LINK_LOADED_EVENT, handleStartupEvents); + }).then(action); +}; |