Initial commit
This commit is contained in:
@@ -0,0 +1,63 @@
|
||||
module.exports = {
|
||||
getUrlParams: function (conversion, location) {
|
||||
var urlTokens;
|
||||
|
||||
conversion = conversion || {};
|
||||
location = location || window.location;
|
||||
urlTokens = _getUrlTokens.call(this, location);
|
||||
|
||||
return urlTokens.length
|
||||
? _buildParams.call(this, conversion, urlTokens)
|
||||
: {};
|
||||
},
|
||||
|
||||
getPage: function () {
|
||||
var pathTokens = window.location.pathname.split('/');
|
||||
var lastTokenIndex = pathTokens.length - 1;
|
||||
return pathTokens[lastTokenIndex];
|
||||
},
|
||||
|
||||
getVizID: function (page /* optional */) {
|
||||
var url = window.location.pathname;
|
||||
var vizStr = '/viz/';
|
||||
|
||||
page = page || this.getPage();
|
||||
|
||||
return url.substring(
|
||||
url.indexOf(vizStr) + vizStr.length,
|
||||
url.indexOf('/' + page)
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
function _getUrlTokens (location) {
|
||||
return location.search.slice(1).split('&');
|
||||
}
|
||||
|
||||
function _buildParams (conversion, urlTokens) {
|
||||
var URL_PARAM_TO_DECODE = 0;
|
||||
var NUMBER_OF_PARAM_TOKENS = 2;
|
||||
var params = {};
|
||||
var i = 0;
|
||||
|
||||
for (i; i < urlTokens.length; ++i) {
|
||||
var urlParams = urlTokens[i].split('=');
|
||||
var urlParamToDecode = urlParams[URL_PARAM_TO_DECODE];
|
||||
var callback = conversion[urlParamToDecode] || function defaultValue (value) {
|
||||
return value;
|
||||
};
|
||||
|
||||
if (urlParams.length === NUMBER_OF_PARAM_TOKENS) {
|
||||
params[urlParamToDecode] = _decodeParam(urlParams, callback);
|
||||
}
|
||||
}
|
||||
|
||||
return params;
|
||||
}
|
||||
|
||||
function _decodeParam (urlParams, callback) {
|
||||
var URL_PARAM_URI = 1;
|
||||
var decodedParam = decodeURIComponent(urlParams[URL_PARAM_URI]);
|
||||
|
||||
return callback(decodedParam);
|
||||
}
|
||||
@@ -0,0 +1,82 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title></title>
|
||||
<style>
|
||||
#initial_startup {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
position: fixed;
|
||||
-moz-user-select: none;
|
||||
-webkit-user-select: none;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
display: -webkit-box;
|
||||
display: -webkit-flex;
|
||||
-webkit-align-items: center;
|
||||
-webkit-justify-content: center;
|
||||
flex-direction: column;
|
||||
-webkit-flex-direction: column;
|
||||
}
|
||||
.spinner {
|
||||
position: relative;
|
||||
margin: 0 auto;
|
||||
border-top: 2px solid #ddd;
|
||||
border-right: 2px solid #ddd;
|
||||
border-bottom: 2px solid #ddd;
|
||||
border-left: 2px solid #0090d7;
|
||||
-webkit-animation: load8 1.1s infinite linear;
|
||||
-khtml-animation: load8 1.1s infinite linear;
|
||||
-moz-animation: load8 1.1s infinite linear;
|
||||
-ms-animation: load8 1.1s infinite linear;
|
||||
-o-animation: load8 1.1s infinite linear;
|
||||
animation: load8 1.1s infinite linear;
|
||||
}
|
||||
.spinner,
|
||||
.spinner:after {
|
||||
width: 36px;
|
||||
height: 36px;
|
||||
border-radius: 50%;
|
||||
}
|
||||
#initial_startup.is-hidden,
|
||||
#initial_startup.is-hidden .spinner{
|
||||
display: none;
|
||||
}
|
||||
|
||||
@keyframes load8 {
|
||||
100% { transform: rotate(360deg); }
|
||||
}
|
||||
@-webkit-keyframes load8 {
|
||||
100% { -webkit-transform: rotate(360deg); }
|
||||
}
|
||||
</style>
|
||||
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
|
||||
</head>
|
||||
<body>
|
||||
<div id="header"></div>
|
||||
<div id="app"></div>
|
||||
|
||||
<div id="initial_startup">
|
||||
<div class="spinner"></div>
|
||||
</div>
|
||||
|
||||
<div id="footer">
|
||||
<div class="js-footer"></div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
window.StaticConfig = <%= JSON.stringify(htmlWebpackPlugin.options.config) %>
|
||||
</script>
|
||||
|
||||
<% if (!htmlWebpackPlugin.options.inject) { %>
|
||||
<% htmlWebpackPlugin.files.js.forEach(function(jsFile) { %>
|
||||
<script>
|
||||
<%= compilation.assets[jsFile.substr(htmlWebpackPlugin.files.publicPath.length)].source() %>
|
||||
</script>
|
||||
<% }); %>
|
||||
<% } %>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,188 @@
|
||||
var CartoNode = require('../../../../../vendor/assets/javascripts/carto-node/carto-node.js');
|
||||
var PACKAGE = require('../../../../../package.json');
|
||||
var UrlHelper = require('./helpers/url');
|
||||
var Redirector = require('../helpers/redirector');
|
||||
|
||||
var version = PACKAGE.version;
|
||||
var AssetsVersionHelper = require('../helpers/assets-version');
|
||||
var GOOGLE_MAPS_SCRIPT_SRC = '//maps.googleapis.com/maps/api/js?v=3.32&sensor=false';
|
||||
var VISUALIZATION_ERROR = 'Visualization not viewable';
|
||||
var STATE_LOCKED = 'locked';
|
||||
|
||||
window.StaticConfig = window.StaticConfig || {};
|
||||
window.CartoConfig = window.CartoConfig || {};
|
||||
|
||||
(function (window, document) {
|
||||
var client = new CartoNode.AuthenticatedClient();
|
||||
var assetsUrl;
|
||||
|
||||
var redirectTo = function (url) {
|
||||
window.location = url;
|
||||
};
|
||||
|
||||
var redirectToLogin = function () {
|
||||
window.location = '/login';
|
||||
};
|
||||
|
||||
var redirectToMaintenanceMode = function (baseURL) {
|
||||
window.location = baseURL + '/maintenance_mode';
|
||||
};
|
||||
|
||||
var redirectToLockout = function (baseURL) {
|
||||
window.location = baseURL + '/lockout';
|
||||
};
|
||||
|
||||
var redirectToMultifactorAuthentication = function () {
|
||||
window.location = '/multifactor_authentication';
|
||||
};
|
||||
|
||||
var addSpinner = function () {
|
||||
var spinnerEl = document.querySelector('.spinner');
|
||||
spinnerEl.parentNode.classList.add('is-hidden');
|
||||
};
|
||||
|
||||
var getEntryPointFeatureFlags = function (staticConfig) {
|
||||
var featureFlagsData = staticConfig.feature_flags;
|
||||
|
||||
if (!featureFlagsData) {
|
||||
return [];
|
||||
}
|
||||
|
||||
return Object.keys(featureFlagsData);
|
||||
};
|
||||
|
||||
var getAssetsToLoad = function (userData) {
|
||||
var entryPointFeatureFlags = getEntryPointFeatureFlags(window.StaticConfig);
|
||||
var userFeatureFlags = userData.feature_flags;
|
||||
|
||||
var featureFlagToUse = entryPointFeatureFlags.filter(function (featureFlag) {
|
||||
return userFeatureFlags.indexOf(featureFlag) !== -1;
|
||||
})[0];
|
||||
|
||||
if (featureFlagToUse) {
|
||||
return window.StaticConfig.feature_flags[featureFlagToUse];
|
||||
}
|
||||
|
||||
return {
|
||||
stylesheets: window.StaticConfig.stylesheets,
|
||||
scripts: window.StaticConfig.scripts
|
||||
};
|
||||
};
|
||||
|
||||
var addAssets = function (options) {
|
||||
(function (w, d, a, favicon, stylesheets, scripts, l, h, s, t) {
|
||||
var googleMapsQueryString = w.CartoConfig.vizdata
|
||||
? w.CartoConfig.vizdata.user.google_maps_query_string
|
||||
: null;
|
||||
|
||||
if (googleMapsQueryString) {
|
||||
s = d.createElement('script');
|
||||
t = d.getElementsByTagName('script')[0];
|
||||
s.async = false;
|
||||
s.type = 'text/javascript';
|
||||
s.src = GOOGLE_MAPS_SCRIPT_SRC + '&' + googleMapsQueryString;
|
||||
t.parentNode.insertBefore(s, t);
|
||||
}
|
||||
|
||||
if (window.StaticConfig.vendor && window.StaticConfig.vendor.hubspot_form) {
|
||||
s = d.createElement('script');
|
||||
t = d.getElementsByTagName('script')[0];
|
||||
s.async = false;
|
||||
s.type = 'text/javascript';
|
||||
s.src = '//js.hsforms.net/forms/v2.js';
|
||||
t.parentNode.insertBefore(s, t);
|
||||
}
|
||||
|
||||
l = d.createElement('link');
|
||||
l.rel = 'shortcut icon';
|
||||
l.href = a + favicon;
|
||||
h = d.getElementsByTagName('head')[0];
|
||||
h.appendChild(l);
|
||||
|
||||
stylesheets.forEach(function (src) {
|
||||
l = d.createElement('link');
|
||||
l.rel = 'stylesheet';
|
||||
l.href = a + src;
|
||||
h = d.getElementsByTagName('head')[0];
|
||||
h.appendChild(l);
|
||||
});
|
||||
|
||||
scripts.forEach(function (src) {
|
||||
s = d.createElement('script');
|
||||
t = d.getElementsByTagName('script')[0];
|
||||
s.async = false;
|
||||
s.src = a + src;
|
||||
t.parentNode.insertBefore(s, t);
|
||||
});
|
||||
})(window, document, assetsUrl, '/favicons/favicon.ico', options.stylesheets, options.scripts);
|
||||
};
|
||||
|
||||
var getUserConfig = function (visualizationError) {
|
||||
client.getConfig(function (err, response, data) {
|
||||
if (err) {
|
||||
if (data.responseJSON && data.responseJSON.error === 'maintenance_mode') {
|
||||
var baseURL = Redirector.getBaseUrl(window.location);
|
||||
return redirectToMaintenanceMode(baseURL);
|
||||
} else {
|
||||
return redirectToLogin();
|
||||
}
|
||||
}
|
||||
|
||||
var userData = data.user_data;
|
||||
|
||||
if (!userData && visualizationError !== VISUALIZATION_ERROR) {
|
||||
return redirectToLogin();
|
||||
}
|
||||
|
||||
if (userData && userData.state === STATE_LOCKED) {
|
||||
return redirectToLockout(userData.base_url);
|
||||
}
|
||||
|
||||
if (data.mfa_required === true) {
|
||||
return redirectToMultifactorAuthentication();
|
||||
}
|
||||
|
||||
if (Redirector.needsToChangeBaseURL(userData.base_url)) {
|
||||
return redirectTo(userData.base_url + '/' + window.StaticConfig.page);
|
||||
}
|
||||
|
||||
window.CartoConfig.data = data;
|
||||
assetsUrl = AssetsVersionHelper.getAssetsUrl(version);
|
||||
addSpinner();
|
||||
|
||||
var assets = getAssetsToLoad(userData);
|
||||
addAssets({
|
||||
stylesheets: assets.stylesheets,
|
||||
scripts: assets.scripts
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
var getVisualization = function (params) {
|
||||
var vizID = UrlHelper.getVizID();
|
||||
|
||||
client.getVisualization(vizID, params, function (err, response, data) {
|
||||
if (err) {
|
||||
var error = data.responseJSON;
|
||||
|
||||
if (error && error.visualization) {
|
||||
window.CartoConfig.vizdata = error.visualization;
|
||||
getUserConfig(error.errors);
|
||||
} else if (error.errors !== VISUALIZATION_ERROR) {
|
||||
return redirectToLogin();
|
||||
} else {
|
||||
console.error(error);
|
||||
}
|
||||
} else {
|
||||
window.CartoConfig.vizdata = data;
|
||||
getUserConfig();
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
if (window.StaticConfig.visualization) {
|
||||
getVisualization(window.StaticConfig.visualization.params);
|
||||
} else {
|
||||
getUserConfig();
|
||||
}
|
||||
})(window, document);
|
||||
Reference in New Issue
Block a user