Initial commit

This commit is contained in:
zhongjin
2020-06-15 10:58:47 +08:00
commit 4f1dfe7564
8590 changed files with 1516878 additions and 0 deletions
@@ -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);